9|P^; ; Editing this file: ; The semi-colon denotes the beginning of a comment. Comments ; extend to the end of the line. Hexidecimal values must be suffixed ; with an 'h', otherwise the value is decimal. ; ; A loadable request is defined by a collection of tokens and ; values. The token ':RequestCode:' signals the start of a new ; definition. ; ; :RequestCode: ; :RequestName: ; :Version: ; :LclSvcCode: or ; :ServiceExch: or ; :sCntInfo: ; :nReqPbCb: ; :nRespPbcb: ; :Params: , ,... ; :NetRouting: or ; :SrpRouting: or ; ; where ; ; Local Service Code tokens are: ; Dummy :the local service code '0AD31h' is used. Requests ; with dummy local service codes will be replaced by ; real requests if files containing identical non-dummy ; requests are merged. ; ; Exchange tokens are: ; ExchInstalledLocal :the exchange is set to 0. ; ExchInstalledMastr :the exchange is set to 0 on Master ; and StandAlone OS's, set to the cluster ; agent on cluster OS's. ; ; Parameter tokens are: ; none :no arguments on the stack ; w(o) :next stack word goes at offset 'o' of the request block ; b(o) :next byte goes at offset 'o' of the request block ; p(o) :next two words go at offset 'o' of the request block ; c(v,o) :the value 'v' is placed at offset 'o' of the request ; block ; pbcb0 :is equivalent to p(18), w(22) ; pbcb1 :is equivalent to p(24), w(28) ; pbcb2 :is equivalent to p(30), w(34) ; pbcb3 :is equivalent to p(36), w(40) ; lfa :is equivalent to w(16), w(14) ; ; ; Net Routing tokens are: ; NoRouting ; RW ; specPw ; rFh ; devSpec ; dirSpec ; FileSpec ; FileSpec2 ; FileSpecP2S2 ; OpenFh ; CloseFh ; CloseAtTermination ; ; ; SRP Routing tokens are: ; rLocal ; rRemote ; rMasterFP ; rHandle ; rFileID ; rMasterCP ; rLineNumber ; rDevice ; rDistribute ; ; ; Termination, WsAbort, ChangeUserNum, and Swapping requests may be added ; using the following tokens: ; ; ; :WsAbortRq: ; :TerminationRq: ; :SwappingRq: ; :ChgUserNumRq: ; : ; MERGING RULES: ; ; The following rules take effect when mergeing two or more loadable ; request files which contain the same request code(s). ; ; 1. requests are identical in every way - delete one of them ; 2. versions are different - delete earlier version ; 3. one request has dummy local service code - delete it ; 4. identical except for exch where one exch is zero - delete request ; with zero exchange (assume old style SRP request). ; 5. different field values for the same request code - abort merge ; ; ; ; ; EXAMPLE: ; ; The request definitions below create two requests. The first request ; (0C000h) has the same procedural interface as CTOS OpenFile, the second ; is both a termination and abort request. Both requests are to be served at ; the master. ; :WsAbortRq: 0C001h :TerminationRq: 0C001h :RequestCode: 0C000h :RequestName: NewOpenFile :Version: 1 :LclSvcCode: 0001h :ServiceExch: exchInstalledMastr :sCntInfo: 6 :nReqPbCb: 2 :nRespPbcb: 1 :Params: p(30), c(2,34), pbcb0, pbcb1, w(14) :NetRouting: noRouting :SrpRouting: rLocal :RequestCode: 0C001h :RequestName: TerminationAndWsAbortRq :Version: 1 :LclSvcCode: 0002h :ServiceExch: exchInstalledMastr :sCntInfo: 6 :nReqPbCb: 0 :nRespPbcb: 0 :Params: none :NetRouting: noRouting :SrpRouting: rLocal ;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: Nls.asm *; ;* *; ;* MACHINE: NGen/SGen LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION: *; ;* *; ;* Native Language Support module. Contains tables which are loaded at *; ;* system initialization time. *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* 09/02/93 123E/04 S. Ahn / Change the sample linker command form to *; ;* be consistent with the current command. *; ;* 02/02/93 123C/16 M. Edgar / Added table 26 for line drawing characters*; ;* 01/06/93 123C/15 T. Tran / Removed Diacritical Macro Table to fix *; ;* Action-Cut and Paste's attempt to replace *; ;* numeric 2 with Shift-NextPage-1 keystrokes*; ;* 10/27/92 123A/14 S. Ahn / Added attribute information *; ;* 04/07/92 122G/13 T. Tran / Added more comments regarding how to *; ;* enable the character priority table. *; ;* 11/26/91 130E/12 D. Gilson / Remove Macros because of problem with *; ;* comments and macro's. See warning in *; ;* Sysgen.asm. *; ;* 11/26/91 130E/11 R. Ramesh / Brought back FsUlCmpbTable. For history *; ;* sake, the comment by PCampbell is left. *; ;* 10/23/91 130D/10 P. Campbell / Remove FsUlCmpbTable *; ;* 04/22/91 121J/09 W. Chiu / Note that table 25 is reservice for XVT *; ;* 03/30/91 121A/08 S. Carvalho / Replaced DateTime Templates 16H to 1A that*; ;* seem to have been accidently deleted *; ;* 11/27/90 121E/07 T. Tran / Support both Code-' and \ as literal char *; ;* 10/25/90 121D/06 T. Tran / Fix garbage in VideoBsStrings (Table #3) *; ;* 10/01/90 121D/05 P. Deuter / More Gengo stuff *; ;* 09/20/90 121C/04 M. Emmerich / Merge P. Deuter's Gengo date format stuff *; ;* 09/05/90 121A/03 I. Morimoto / Addedd the Japanese words as well as *; ;* Yes/No in the YesNoStrings. *; ;* 05/09/90 121A/02 I. Morimoto / Changed SpecialCharacters from *; ;* Code Quote to '\'. *; ;* Changed VideoBsString Messages. *; ;* 03/29/89 120A/01 P. Campbell / Fixes to tables 16 and 23 *; ;* *; ;* *; ;* Attributes exhibited by this software: (See SSAttributes.doc) *; ;* Use attribute levels 0, E, A, S, F, I and 1...9 as decribed. *; ;* *; ;* VID:~ 0 *; ;* FIL:~ 0 *; ;* KBD:~ 0 *; ;* CLS:~ 0 *; ;* KNL:~ 0 *; ;* MEM:~ 0 *; ;* COM:~ 0 *; ;* TIM:~ 0 *; ;* PFM:~ 0 *; ;* HDW:~ 0 *; ;* DSK:~ 0 *; ;* DEV:~ 0 *; ;* NLS:~ 0 *; ;* *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1993 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ;############################################################################ ; ; NATIVE LANGUAGE SUPPORT TABLE DEFINITIONS ; ; NLS tables are a collection of tables loaded at CTOS initialization ; which provide native language configurability for CTOS. ; Convergent Technologies, Inc. reserves the ID range 0 through 7FFFh. The ; range 8000h thru 0FFFFh are available for customer use. ; ; To change an NLS table, edit this file, assemble it, link it ; as follows, copy Nls.sys to [Sys], and reboot the workstation. ; %'Link %'Object modules Nls.obj %'Run file Nls.sys %'[Map file] %'[Publics?] %'[Line numbers?] %'[Stack size] 0 %'[Max memory array size] %'[Min memory array size] %'[Run file mode] %'[Version] %'[Libraries] None %'[DS allocation?] %'[Symbol file] %'[Copyright notice?] %'[File to append] %'[Linker config file] ; ; ;############################################################################ %'########################################################################### %' %' NLS TABLE MACRO DEFINITION - %' %' %DefTableData (TableName, ID, %(data)) %' %DefTableString (TableName, ID, %(string)) %' %' For example: %' %' %DefTableData(UserData, 8002h, %( DW 4 %' DB 41h, 42h, 43h %' DB 0AH)) %' %DefTableString(UserStringName, 8000h, %(StringInSingleQuotes)) %' %'########################################################################### ;############################################################################ ; ; ACCESSING NLS TABLES - ; ; The pointer to the NLS table directory is returned by calling the ; CTOS routine "GetpStructure" with a case of 25, for example: ; ; CheckErc (GetpStructure (25, 0, ads pNLSDirectory)); ; ; The NLS table directory has the following format: ; ; wSignature WordType /*value is 'NT'*/ ; cbTable WordType /*count of bytes contained in the ; directory and tables*/ ; cTables WordType /*count of tables*/ ; oRgId OffsetType /*offset from pNlsDirectory of the ; array of table ID's*/ ; oRgoTable OffsetType /*offset from pNlsDirectory of the ; array of offsets to tables ; ;############################################################################ $INCLUDE([Sys]nls.mdf) %TableInit attrControl EQU 000h + 000h + 000h ;no shift lock, no repeat attrAlpha EQU 080h + 060h + 010h ;shift lock, repeats attrRepeat EQU 000h + 060h + 010h ;repeats attrRepeatFast EQU 000h + 040h + 018h ;repeats, faster attrShiftDia EQU 01h; diacritcal key when shifted attrUnShiftDia EQU 02h; diacritcal key when unshifted attrBothDia EQU 03h; diacritcal key when shifted or unshifted %DefTableData (KbdEncodingTable, 0, %(%' DW 'KE' ; signature DB 0, 0C0h, attrControl ; 000 help DB 01h, 0C1h, attrRepeatFast ; 001 up-arrow DB 02h, 0C2h, attrControl ; 002 mark DB 0Dh, 0C3h, attrControl ; 003 bound DB 04h, 0C4h, attrControl ; 004 finish DB 05h, 0C5h, attrControl ; 005 prev page DB 06h, 10h, attrRepeat ; 006 1/2-1/4 DB 07h, 0C7h, attrControl ; 007 cancel DB 08h, 08h, attrRepeat ; 008 backspace DB 09h, 09h, attrControl ; 009 tab DB 0Ah, 0Ah, attrRepeat ; 00A return DB 0Bh, 0CBh, attrRepeatFast ; 00B down-arrow DB 0Ch, 0CCh, attrControl ; 00C next page DB 0Ah, 0Ah, attrRepeat ; 00D next DB 0Eh, 0CEh, attrRepeatFast ; 00E left-arrow DB 12h, 0D2h, attrRepeatFast ; 00F right-arrow DB 80h, 81h, attrControl ; 010 SH-L DB 11h, 0D1h, attrRepeat ; 011 scroll-up DB 0Fh, 0CFh, attrControl ; 012 move DB 13h, 0D3h, attrRepeat ; 013 scroll-down DB 14h, 0D4h, attrControl ; 014 copy DB 15h, 0D5h, attrControl ; 015 f1 DB 16h, 0D6h, attrControl ; 016 f2 DB 17h, 0D7h, attrControl ; 017 f3 DB 18h, 0D8h, attrControl ; 018 f4 DB 19h, 0D9h, attrControl ; 019 f5 DB 1Ah, 0DAh, attrControl ; 01A f6 DB 1Bh, 0C9h, attrControl ; 01B GO DB 1Ch, 0DCh, attrControl ; 01C f7 DB 1Dh, 0CDh, attrControl ; 01D f8 DB 1Eh, 0CAh, attrControl ; 01E f9 DB 1Fh, 0DFh, attrControl ; 01F f10 DB 20h, 20h, attrRepeat ; 020 space DB 39h, 39h, attrRepeat ; 021 9 9 DB 82h, 83h, attrControl ; 022 SH-R DB 84h, 85h, attrControl ; 023 0 DB 86h, 87h, attrControl ; 024 NEXT DB 0, 0, 0 ; 025 DB 0FEh,0FEh, attrControl ; 026 COL Key on k2 - K6 Keyboards DB 27h, 22h, attrRepeat ; 027 ' " DB 0FBh,0FBh, attrControl ; 028 PAGE Key on k2 - K6 Keyboards DB 0E0h,0E0h, attrControl ; 029 PARA Key on k2 - K6 Keyboards DB 0BFh,0BFh, attrControl ; 02A SENT Key on k2 - K6 Keyboards DB 3Dh, 2Bh, attrRepeat ; 02B + = DB 2Ch, 2Ch, attrRepeat ; 02C , , DB 2Dh, 5Fh, attrRepeat ; 02D - _ DB 2Eh, 2Eh, attrRepeat ; 02E . . DB 2Fh, 3Fh, attrRepeat ; 02F / ? ;Warning: ; Do not change the comments for the following characters to add the ; actual characters. If you do, you will get errors from the Assembler. DB 30h, 29h, attrRepeat ; 030 0 right parens DB 31h, 21h, attrRepeat ; 031 1 ! DB 32h, 40h, attrRepeat ; 032 2 @ DB 33h, 23h, attrRepeat ; 033 3 # DB 34h, 24h, attrRepeat ; 034 4 $ DB 35h, 25h, attrRepeat ; 035 5 percent DB 36h, 03h, attrRepeat ; 036 6 cent DB 37h, 26h, attrRepeat ; 037 7 & DB 38h, 2Ah, attrRepeat ; 038 8 * DB 39h, 28h, attrRepeat ; 039 9 left parens DB 0, 0, 0 ; 03A DB 3Bh, 3Ah, attrRepeat ; 03B semicolon colon DB 0BEh,0BEh, attrControl ; 03C WORD Key on k2 - K6 Keyboards DB 0FDh,0FDh, attrControl ; 03D LINE Key on k2 - K6 Keyboards DB 0, 0, 0 ; 03E DB 0, 0, 0 ; 03F 3F = iKeyInvalid DB 0, 0, 0 ; 040 40 = iKeyNoKeys DB 36h, 36h, attrRepeat ; 041 6 6 DB 2Dh, 2Dh, attrRepeat ; 042 - - DB 0, 0, 0 ; 043 reset DB 0D0h,0D0h, attrControl ; 044 overtype DB 0, 0, attrControl ; 045 lock DB 32h, 32h, attrRepeat ; 046 2 2 DB 33h, 33h, attrRepeat ; 047 3 3 DB 0, 0, 0 ; 048 shift DB 0, 0, 0 ; 049 shift DB 30h, 30h, attrRepeat ; 04A 0 0 DB 2Eh, 2Eh, attrRepeat ; 04B . . DB 0, 0, 0 ; 04C code DB 0, 0, 0 ; 04D code DB 0, 0, 0 ; 04E DB 0, 0, 0 ; 04F DB 0, 0, 0 ; 050 DB 0, 0, 0 ; 051 DB 0, 0, 0 ; 052 DB 0, 0, 0 ; 053 DB 0, 0, 0 ; 054 DB 0, 0, 0 ; 055 DB 0, 0, 0 ; 056 DB 0, 0, 0 ; 057 DB 0, 0, 0 ; 058 DB 0, 0, 0 ; 059 DB 0, 0, 0 ; 05A DB 5Bh, 3Ch, attrRepeat ; 05B [ < DB 37h, 7Ch, attrRepeat ; 05C 7 | DB 5Dh, 3Eh, attrRepeat ; 05D ] > DB 5Eh, 7Eh, attrRepeat ; 05E ^ ~ DB 0, 0, 0 ; 05F DB 31h, 60h, attrRepeat ; 060 1 ` DB 61h, 41h, attrAlpha ; 061 a A DB 62h, 42h, attrAlpha ; 062 b B DB 63h, 43h, attrAlpha ; 063 c C DB 64h, 44h, attrAlpha ; 064 d D DB 65h, 45h, attrAlpha ; 065 e E DB 66h, 46h, attrAlpha ; 066 f F DB 67h, 47h, attrAlpha ; 067 g G DB 68h, 48h, attrAlpha ; 068 h H DB 69h, 49h, attrAlpha ; 069 i I DB 6Ah, 4Ah, attrAlpha ; 06A j J DB 6Bh, 4Bh, attrAlpha ; 06B k K DB 6Ch, 4Ch, attrAlpha ; 06C l L DB 6Dh, 4Dh, attrAlpha ; 06D m M DB 6Eh, 4Eh, attrAlpha ; 06E n N DB 6Fh, 4Fh, attrAlpha ; 06F o O DB 70h, 50h, attrAlpha ; 070 p P DB 71h, 51h, attrAlpha ; 071 q Q DB 72h, 52h, attrAlpha ; 072 r R DB 73h, 53h, attrAlpha ; 073 s S DB 74h, 54h, attrAlpha ; 074 t T DB 75h, 55h, attrAlpha ; 075 u U DB 76h, 56h, attrAlpha ; 076 v V DB 77h, 57h, attrAlpha ; 077 w W DB 78h, 58h, attrAlpha ; 078 x X DB 79h, 59h, attrAlpha ; 079 y Y DB 7Ah, 5Ah, attrAlpha ; 07A z Z DB 34h, 7Bh, attrRepeat ; 07B 4 { DB 38h, 5Ch, attrRepeat ; 07C 8 backslash DB 35h, 7Dh, attrRepeat ; 07D 5 } DB 0, 0, 0 ; 07E DB 7Fh, 0C8h, attrRepeat ; 07F del %' THE FOLLOWING MACROS HANDLE DIACRITICALS %' These macros allow the user to define pairs of keys which may be typed %' one after the other, but which produce a single character value. %' For example, a user may want to produce an "e accent-grave" by typing %' first an "accent-grave" and then an "e", the result being the code for %' the font character "e accent grave". %' The macros have the following structures: %' %' InitDiaCriticalTables - no parameters. It appears once. %' %' DiaCriticalSet(FirstKey,SecondKey,FontCode) - One instance for each pair %' of diacritical keys you wish to define - Explained below. %' %' EndDiaCriticalTables - no parameters. It appears once. %' %' NOTE: Each key that you wish to be the first key in the diacritical %' pair must be given the proper atttribute in the above %' keyboard encoding table. %' %' FirstKey and SecondKey are hexadecimal codes produced by the desired %' key. To find these codes, look in the above Keyboard Encoding Table. %' The right-hand column are the keycaps for each key. The two entries %' following the DB in the same row are the unshifted and shifted codes %' that the key produces. Enter the code as the value of FirstKey then %' repeat the process for SecondKey. For each key you choose as FirstKey, %' you must change the attribute to AttrShiftDia if you wish to have the %' diacriticalness happen only when the key is shifted; AttrUnShiftDia if %' you wish the diacriticalness to happen only when the key is not shifted; %' or AttrBothDia if you wish it to be diacritical shifted and unshifted. %' %' FontCode is a hexidecimal code %' which will produce the desired character. If you are using the standard %' US font, then refer to Appendix B-2 of the CTOS Reference Manual. If %' you are using a non-standard US font, then refer to the documentation %' which accompanied it. You can change the font characters using the %' Font Designer. %' Note that for most diacritics, the standard font will not suffice. Take %' circumflex i and tilde n, for instance. You would have to build a new %' font with those characters replacing some other positions. %' The is in the standard released font (position 0ACh). %' %' In the following example, key 5E would have attrBothDia because on the %' keyboard circumflex (carat) and tilde are the same key (shifted and %' unshifted): %' DB 5Eh, 7Eh, attrBothDia ; 05E ^ ~ %' If you had a French keyboard, the carat is where the  key %' is (to the right of the "p"), so in that case key 6 would be: %' DB 06h, 10h, attrShiftDia ; 006 1/2-1/4 %' and the macro would be %DiaCriticalSet(6,69h,chI-Circumflex) %' %' EXAMPLE: Define the following three diacritical pairs: %' "e accent-grave", "i circumflex", and "n tilde". %' The macros would look as follows: %' %' %InitDiaCriticalTables %' %' %DiaCriticalSet(chAccentGrave,65h,0ACh) %' The code for the silent key "accent grave" followed by the code for "e" %' (Refer to the above Keyboard Encoding Table) followed by 0ACh, which is %' the hexadecimal code for the resultant font character (Refer to Appendix %' B-2 in the CTOS Reference Manual) %' %' %DiaCriticalSet(5E,69h,chI-Circumflex) %' The code for "circumflex" followed by the code for "i" followed by %' chI-Circumflex %' %' %DiaCriticalSet(7Eh,6Eh,chN-Tilde) %' The code for "tilde" followed by the code for "n" followed by %' chN-Tilde %' %' %EndDiaCriticalTables %' The following example on GERMAN KEYBOARDS produces a diacritical pair. %' %' REMINDER: for non-German keyboards: the character "" is on the upper left %' key in combination with SHIFT (the ~ on US keyboards) %' The keyboard encoding table entry for 5E is as follows: %' DB 0B4h, 0B2h, attrShiftDia ; 05E %' %' %InitDiaCriticalTables %' %DiaCriticalSet(0B2h,61h,0A1h) %' %EndDiaCriticalTables %' %' 0B2h, 61h ;the diacritical pair, (keys 5E & 61 in the kbd table) %' ;here the "" and the "a" shall be combined to "" %' 0A1h ;the resultant character of the diacritical pair %' %' %'THE DIACRITICAL MACROS START HERE: ; m15... ;%InitDiaCriticalTables ;%DiaCriticalSet(0CCh,31h,32h) ;shift-NEXTPAGE 1 displays "2" ;%EndDiaCriticalTables ; ...m15 )) ; ...m11 ;WARNING: The FsUlCmpbTable below is used by the file system for determining ; file spec equivalence - CHANGES TO THIS TABLE WILL CAUSE ; FILES ON AN EXISTING FILE SYSTEM TO BECOME INACCESSABLE. ; ; This table is commented out in order to make password encryption ; transparent regarding the presence/absence of Nls.sys. ; ; To add this table, remove the "if 0 then" line, remove the ; semicolons, and the "fi" line. ; ; If you currently use password encryption but don't use Nls.sys, ; then the addition of the Nls.sys created from this file will not ; cause any difference in the behavior of your system. ; ; If you currently use password encryption and are using an Nls.sys ; provided with a release of Standard Software before 13.0, then ; the addition of Nls.sys version 13.0 will make it impossible ; to access your protected files. In order to make them accessable, ; remove the volume password by executing the Change Volume Name ; executive command (place a null string ('')in the password field.) ; Remove the passwords from all directories using the Set Directory ; Protection command. Remove the passwords from all files using the ; Set Protection command. Place this version of Nls.sys in the ; [Sys] directory and reboot. Add volume, directory, and file ; passwords using the above commands. ; ...m11 ; ; m12 ; %DefTableData (FsUlCmpbTable, 1, %(%' FsULCMPBSignature DW 'FS' DB 00h,01h,02h,03h,04h,05h,06h,07h DB 08h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh DB 10h,11h,12h,13h,14h,15h,16h,17h DB 18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh DB 20h,21h,22h,23h,24h,25h,26h,27h DB 28h,29h,2Ah,2Bh,2Ch,2Dh,2Eh,2Fh DB 30h,31h,32h,33h,34h,35h,36h,37h DB 38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh DB 40h,41h,42h,43h,44h,45h,46h,47h DB 48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh DB 50h,51h,52h,53h,54h,55h,56h,57h DB 58h,59h,5Ah,5Bh,5Ch,5Dh,5Eh,5Fh DB 60h,41h,42h,43h,44h,45h,46h,47h DB 48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh DB 50h,51h,52h,53h,54h,55h,56h,57h DB 58h,59h,5Ah,7Bh,7Ch,7Dh,7Eh,7Fh DB 80h,81h,82h,83h,84h,85h,86h,87h DB 88h,89h,8Ah,8Bh,8Ch,8Dh,8Eh,8Fh DB 90h,91h,92h,93h,94h,95h,96h,97h DB 98h,99h,9Ah,9Bh,9Ch,9Dh,9Eh,9Fh DB 0A0h,0A0h,0A2h,0A2h,0A4h,0A4h,0A6h,0A6h DB 0A8h,0A8h,0AAh,0ABh,0ACh,0ADh,0AEh,0AEh DB 0B0h,0B1h,0B2h,0B3h,0B4h,0B5h,0B6h,0B7h DB 0B8h,0B9h,0BAh,0BBh,0BCh,0BDh,0BEh,0BFh DB 0C0h,0C1h,0C2h,0C3h,0C4h,0C5h,0C6h,0C7h DB 0C8h,0C9h,0CAh,0CBh,0CCh,0CDh,0CEh,0CFh DB 0D0h,0D1h,0D2h,0D3h,0D4h,0D5h,0D6h,0D7h DB 0D8h,0D9h,0DAh,0DBh,0DCh,0DDh,0DEh,0DFh DB 0E0h,0E1h,0E2h,0E3h,0E4h,0E5h,0E6h,0E7h DB 0E8h,0E9h,0EAh,0EBh,0ECh,0EDh,0EEh,0EFh DB 0F0h,0F1h,0F2h,0F3h,0F4h,0F5h,0F6h,0F7h DB 0F8h,0F9h,0FAh,0FBh,0FCh,0FDh,0FEh,0FFh )) %DefTableData (UserUlCmpbTable, 2, %(%' ULCMPBSignature DW 'XT' DB 00h,01h,02h,03h,04h,05h,06h,07h DB 08h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh DB 10h,11h,12h,13h,14h,15h,16h,17h DB 18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh DB 20h,21h,22h,23h,24h,25h,26h,27h DB 28h,29h,2Ah,2Bh,2Ch,2Dh,2Eh,2Fh DB 30h,31h,32h,33h,34h,35h,36h,37h DB 38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh DB 40h,41h,42h,43h,44h,45h,46h,47h DB 48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh DB 50h,51h,52h,53h,54h,55h,56h,57h DB 58h,59h,5Ah,5Bh,5Ch,5Dh,5Eh,5Fh DB 60h,41h,42h,43h,44h,45h,46h,47h DB 48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh DB 50h,51h,52h,53h,54h,55h,56h,57h DB 58h,59h,5Ah,7Bh,7Ch,7Dh,7Eh,7Fh DB 80h,81h,82h,83h,84h,85h,86h,87h DB 88h,89h,8Ah,8Bh,8Ch,8Dh,8Eh,8Fh DB 90h,91h,92h,93h,94h,95h,96h,97h DB 98h,99h,9Ah,9Bh,9Ch,9Dh,9Eh,9Fh DB 0A0h,0A0h,0A2h,0A2h,0A4h,0A4h,0A6h,0A6h DB 0A8h,0A8h,0AAh,0ABh,0ACh,0ADh,0AEh,0AEh DB 0B0h,0B1h,0B2h,0B3h,0B4h,0B5h,0B6h,0B7h DB 0B8h,0B9h,0BAh,0BBh,0BCh,0BDh,0BEh,0BFh DB 0C0h,0C1h,0C2h,0C3h,0C4h,0C5h,0C6h,0C7h DB 0C8h,0C9h,0CAh,0CBh,0CCh,0CDh,0CEh,0CFh DB 0D0h,0D1h,0D2h,0D3h,0D4h,0D5h,0D6h,0D7h DB 0D8h,0D9h,0DAh,0DBh,0DCh,0DDh,0DEh,0DFh DB 0E0h,0E1h,0E2h,0E3h,0E4h,0E5h,0E6h,0E7h DB 0E8h,0E9h,0EAh,0EBh,0ECh,0EDh,0EEh,0EFh DB 0F0h,0F1h,0F2h,0F3h,0F4h,0F5h,0F6h,0F7h DB 0F8h,0F9h,0FAh,0FBh,0FCh,0FDh,0FEh,0FFh )) %DefTableData (VideoBsStrings, 3, %(%' VidBSSignature DW 'VS' cStrings DW 2 %sbString ('Press Next Page or Scroll Up To Continue') %sbString ('Press Next Page To Continue') )) %DefTableData (UpperToLowerTable, 4, %(%' UpperToLowerSignature DW 'LW' DB 00h,01h,02h,03h,04h,05h,06h,07h DB 08h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh DB 10h,11h,12h,13h,14h,15h,16h,17h DB 18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh DB 20h,21h,22h,23h,24h,25h,26h,27h DB 28h,29h,2Ah,2Bh,2Ch,2Dh,2Eh,2Fh DB 30h,31h,32h,33h,34h,35h,36h,37h DB 38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh DB 40h,61h,62h,63h,64h,65h,66h,67h DB 68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh DB 70h,71h,72h,73h,74h,75h,76h,77h DB 78h,79h,7Ah,5Bh,5Ch,5Dh,5Eh,5Fh DB 60h,61h,62h,63h,64h,65h,66h,67h DB 68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh DB 70h,71h,72h,73h,74h,75h,76h,77h DB 78h,79h,7Ah,7Bh,7Ch,7Dh,7Eh,7Fh DB 80h,81h,82h,83h,84h,85h,86h,87h DB 88h,89h,8Ah,8Bh,8Ch,8Dh,8Eh,8Fh DB 90h,91h,92h,93h,94h,95h,96h,97h DB 98h,99h,9Ah,9Bh,9Ch,9Dh,9Eh,9Fh DB 0A1h,0A1h,0A3h,0A3h,0A5h,0A5h,0A7h,0A7h DB 0A9h,0A9h,0AAh,0ABh,0ACh,0ADh,0AFh,0AFh DB 0B0h,0B1h,0B2h,0B3h,0B4h,0B5h,0B6h,0B7h DB 0B8h,0B9h,0BAh,0BBh,0BCh,0BDh,0BEh,0BFh DB 0C0h,0C1h,0C2h,0C3h,0C4h,0C5h,0C6h,0C7h DB 0C8h,0C9h,0CAh,0CBh,0CCh,0CDh,0CEh,0CFh DB 0D0h,0D1h,0D2h,0D3h,0D4h,0D5h,0D6h,0D7h DB 0D8h,0D9h,0DAh,0DBh,0DCh,0DDh,0DEh,0DFh DB 0E0h,0E1h,0E2h,0E3h,0E4h,0E5h,0E6h,0E7h DB 0E8h,0E9h,0EAh,0EBh,0ECh,0EDh,0EEh,0EFh DB 0F0h,0F1h,0F2h,0F3h,0F4h,0F5h,0F6h,0F7h DB 0F8h,0F9h,0FAh,0FBh,0FCh,0FDh,0FEh,0FFh )) %DefTableData (KeyCapText, 5, %( %StartKeycapDefines ; THE FOLLOWING TABLE IS ORDERED ACCORDING TO THE ORDER ; SPECIFIED BY THE CTOS LIBRARY PROCEDURE "GETNLSKEYCAPTEXT". ; DO NOT CHANGE THE ORDER OF THE ENTRIES. ; ; Each macro invocation has two parameters; the first is used ; for mnemonic purposes, the parameter consists of the English ; keycap name followed by the unencoded hexadecimal keycode (see ; table C-1, CTOS operating system manual). The second ; parameter is an ASCII string defining the keycap name. %DefineKeyCapEntry(Action_43, "ACTION") %DefineKeyCapEntry(Backspace_08, "BACK SPACE") %DefineKeyCapEntry(Bound_03, "BOUND") %DefineKeyCapEntry(Cancl_07, "CANCEL") %DefineKeyCapEntry(Code_80, "CODE") %DefineKeyCapEntry(Copy_14, "COPY") %DefineKeyCapEntry(Delete_7F, "DELETE") %DefineKeyCapEntry(Finish_04, "FINISH") %DefineKeyCapEntry(Go_1B, "GO") %DefineKeyCapEntry(Help_00, "HELP") %DefineKeyCapEntry(Lock_45, "LOCK") %DefineKeyCapEntry(Mark_02, "MARK") %DefineKeyCapEntry(Move_12, "MOVE") %DefineKeyCapEntry(Next_0D, "NEXT") %DefineKeyCapEntry(NextPage_0C, "NEXT PAGE") %DefineKeyCapEntry(OverType_44, "OVER TYPE") %DefineKeyCapEntry(PrevPage_05, "PREV PAGE") %DefineKeyCapEntry(Return_0A, "RETURN") %DefineKeyCapEntry(ScrlDown_13, "SCROLL DOWN") %DefineKeyCapEntry(ScrlUp_11, "SCROLL UP") %DefineKeyCapEntry(Shift_48, "SHIFT") %DefineKeyCapEntry(Tab_09, "TAB") %EndKeycapDefines )) %DefTableData (DateTemplateTable, 6, %( %StartDateDefines ; Below is listed the characters for use as escape characters (attributes) ; in the templates. Each entry is of the form: ; ; DateEscapeDefine('b', 'B') ; ; This enters the escape character of 'b' into the table, and indicates ; an upper case equivelent of 'B' ; ; The following definitions are in a specific order, and that order must be ; maintained ; ; AM, PM, Noon or Midnight, string %DateEscapeDefine(Meridian, 'a', 'A') ; Day of month, numeric %DateEscapeDefine(DayOfMonthNum, 'd', 'D') ; Hour, 12 hour system, numeric %DateEscapeDefine(Hour, 'h', 'H') ; Minute, numeric %DateEscapeDefine(Minute, 'm', 'M') ; Month, string %DateEscapeDefine(MonthStr, 'n', 'N') ; Month, numeric %DateEscapeDefine(MonthNum, 'o', 'O') ; Second, numeric %DateEscapeDefine(Second, 's', 'S') ; Hour, 24 hour system, numeric %DateEscapeDefine(Hour24, 't', 'T') ; Day of Week, string %DateEscapeDefine(WeekDay, 'w', 'W') ; Year, numeric %DateEscapeDefine(Year, 'y', 'Y') ; Year, gengo %DateEscapeDefine(Year, 'g', 'G') ; Below are listed the definitions for each of the templates available ; through the NlsStdFormatDateTime routine. Any of the entries may be ; changed, by renaming the template and/or changing the template string. ; ; Each entry is of the form: ; ; DefineTemplateEntry(TemplateName, "TemplateString") ; ; Each entry has a comment preceding it, describing the result of the ; template, and its template number. If any templates are removed, or ; the order is changed, these commented index numbers will not reflect ; the template's true index number. The numbering starts at zero and ; proceeds, being incremented by one, in the order that the definitions ; appear in this file, thus the first defined is index number zero, the ; next is index one and so on. ; ; 00h 7/18/85 9:03AM ; 10/08/05 11:13PM %DefineTemplateEntry(ColNumDateTime, "!oo!/!0d!/!0y! !hh!:!0m!!2AA!") ; 01h 7/18/85 9:03AM ; 10/08/05 11:13PM %DefineTemplateEntry(NumDateTime, "!*o!/!0d!/!0y! !*h!:!0m!!2*A!") ; 02h Jul 1, 1985 9:03 AM ; Jul 18, 1985 11:13 PM %DefineTemplateEntry(ColDateTime, "!Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!") ; 03h Jul 1, 1985 9:03 AM ; Jul 18, 1985 11:13 PM %DefineTemplateEntry(DateTime, "!Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!") ; 04h Mon Jul 1, 1985 9:03 AM ; Mon Jul 18, 1985 11:13 PM %DefineTemplateEntry(ColDayDateTime, "!Www! !Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!") ; 05h Mon Jul 1, 1985 9:03 AM ; Mon Jul 18, 1985 11:13 PM %DefineTemplateEntry(DayDateTime, "!Www! !Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!") ; 06h 07:00 %DefineTemplateEntry(ColTime24, "!0t!:!0m!") ; 07h 13:05 %DefineTemplateEntry(Time24, "!*t!:!0m!") ; 08h 9:03 AM ; 11:13 PM %DefineTemplateEntry(ColTime, "!hh!:!0m! !2AA!") ; 09h 9:03 AM ; 11:13 PM %DefineTemplateEntry(Time, "!*h!:!0m! !2*A!") ; 0Ah 07/18/85 ; 10/08/05 %DefineTemplateEntry(ColNumDate, "!0o!/!0d!/!0y!") ; 0Bh 7/8/05 ; 10/18/85 %DefineTemplateEntry(NumDate, "!*o!/!*d!/!0y!") ; 0Ch 09:03:05 %DefineTemplateEntry(FullTime, "!0h!:!0m!:!0s!") ; 0Dh 09:03:05.tmp ; 23:13:57.tmp %DefineTemplateEntry(TempFileName, "!0t!:!0m!:!0s!.tmp") ; 0Eh Monday June 3, 1985 %DefineTemplateEntry(LongDayDate, "!W*w! !N*n! !*d!, !*y!") ; 0Fh June 3, 1985 %DefineTemplateEntry(LongDate, "!N*n! !*d!, !*y!") ; 10h 01/01/01-07:09:05AM %DefineTemplateEntry(FileColDateTime, "!0o!/!0d!/!0y!-!0h!:!0m!:!0s!!2*A!") ; 11h Abbreviated Date %DefineTemplateEntry(AbrDate, "!Nnn! !*d!, !yyyy!") ; 12h Day, Date 24 Hour ; Mon Jul 1, 1985 9:03 ; Mon Jul 18, 1985 23:13 %DefineTemplateEntry(DayDate24Hour, "!Www! !Nnn! !*d!, !yyyy! !*t!:!0m!") ; 13h Columnar Day Date 24 Hour ; Mon Jul 1 1985 9:03 ; Mon Jul 18 1985 23:13 %DefineTemplateEntry(ColDayDate24Hour, "!Www! !Nnn! !dd! !yyyy! !0t!:!0m!") ; 14h Day, numeric date and time in MM/DD/YY format ; Tue 07/17/82 9:03 AM ; Tue 07/17/82 11:13 PM %DefineTemplateEntry(DayNumDateTimeMM/DD/YY, "!Www! !0o!/!0d!/!0y! !*h!:!0m! !2*A!") ; 15h Columnar Day, Numeric Date and time in MM/DD/YY format ; Tue 07/17/82 09:03 ; Tue 07/17/82 23:13 %DefineTemplateEntry(ColDayNumDateTimeMM/DD/YY, "!Www! !0o!/!0d!/!0y! !0t!:!0m!") ; 16h Day, numeric date and time in DD/MM/YY format ; Tue 17/07/82 9:03 AM ; Tue 17/07/82 11:13 PM %DefineTemplateEntry(DayNumDateTimeDD/MM/YY, "!Www! !0d!/!0o!/!0y! !*h!:!0m! !2*A!") ; 17h Columnar Day, Numeric Date and time in DD/MM/YY format ; Tue 17/07/82 09:03 ; Tue 17/07/82 23:13 %DefineTemplateEntry(ColDayNumDateTimeDD/MM/YY, "!Www! !0d!/!0o!/!0y! !0t!:!0m!") ; 18h Day, numeric date and time in YY/MM/DD format ; Tue 82/07/17 9:03 AM ; Tue 82/07/17 11:13 PM %DefineTemplateEntry(DayNumDateTimeYY/MM/DD, "!Www! !0y!/!0o!/!0d! !*h!:!0m! !2*A!") ; 19h Columnar Day, Numeric Date and time in YY/MM/DD format ; Tue 82/07/17 09:03 ; Tue 82/07/17 23:13 %DefineTemplateEntry(ColDayNumDateTimeYY/MM/DD, "!Www! !0y!/!0o!/!0d! !0t!:!0m!") ; 1Ah Invalid Template Index %DefineTemplateEntry(InvalidITemp, "Invalid Template Index") %EndStdDateDefines ; ; THIS IS THE END OF THE STANDARD DATE TEMPLATES. NO OEM DATE TEMPLATES ; SHOULD BE DEFINED ABOVE THIS POINT. ALL TEMPLATES SHOULD BE ADDED BELOW. ; ANY NEW TEMPLATES ADDED WILL BE INDEXED STARTING WITH TEMPLATE NUMBER 8000h ; ; EXAMPLE: ; ; 8000h DD/MM/YY ; ; DefineTemplateEntry(ColDayMonthYear, "!0d!/!0o!/!0y!") ; ; ; END OF USER DEFINABLE TEXT AREA, NO EDITING SHOULD OCCUR BELOW THIS POINT %EndOemDateDefines )) false EQU 0 true EQU 0FFh %DefTableData (NumberAndCurrencyTable, 7, %(%' NumberAndCurrencySignature DW 'NC' DB 2Eh ; Decimal character. Indicates which single ASCII character ; will be used to indicate the decimal point in numbers. ; Either 2Ch (,) or 2Eh (.) may be selected. DB 2Ch ; Triad character. Indicates which single ASCII character ; will be used to indicate the separation of numbers into ; triads (i.e. thousands, millions, etc.). ; Either 2Ch (,) or 2Eh (.) or 20h (space) may be selected. ; Note that the use of space is not fully supported at this ; time and thus its use may be ignored by some programs or ; cause substitution of one of the other characters. DB true ; First triad flag. Controls the rules for placing the triad ; character in the thousands position. If true, the triad ; separator in the thousands position is always to appear when ; the number contains four or more digits to the left of the ; decimal. If false, the thousands triad separator is ; suppressed when no more than one additional digit appears to ; the left. DB 2Ch ; List separator character. Indicates which single ASCII ; character will be used to indicate the separation of ; numbers within a list. Either 2Ch (,) or 3Bh (;) may be ; selected. Note that this specification is used only by ; programs that would otherwise have a conflict with the use ; of 2Ch (,) as the decimal point character. DB 0 ; Currency position. Controls the position of the currency ; symbol. A value of 0 indicates leading currency symbol, ; while 1 indicates trailing currency symbol. Other values ; are reserved for future expansion. Note that embedded ; currency symbols are not currently supported. DB 1 ; Currency symbol string. This string defines the currency DB 24h ; symbol. The first byte is the length of the string. The DB 00h ; remaining four bytes define the contents of the string. DB 00h ; All four bytes must be defined, even when a shorter string DB 00h ; is being defined. )) %DefTableData (DateNameTable, 8, %( %StartNameDefines ; Below are listed the definitions for each of the names available ; through the GetNlsDateName routine. Any of the entries may be ; changed, by renaming the Name and/or changing the Name String. ; THEIR ORDER IS RELIED UPON BY ROUTINES THAT USE THIS INFORMATION. ; DO NOT CHANGE THEIR ORDER OR THEIR MEANING. ; ; Each entry is of the form: ; ; DefineNameEntry(NameString, "String") ; ; Each entry has a comment preceding it, describing the expected contents ; of the string, and its string number. If any strings are removed, or ; the order is changed, these commented index numbers will not reflect ; the string's true index number. The numbering starts at zero and ; proceeds, being incremented by one, in the order that the definitions ; appear in this file, thus the first defined is index number zero, the ; next is index one and so on. ; ; IT IS IMPORTANT TO NOTE THAT ANY CAPITALIZATION HERE WILL BE MANDATORY ; IN ANY STRINGS RETURNED BY GetNlsDateName. ; %StartNameTable ; USER EDITABLE TEXT FOLLOWS ; ; T A B L E N U M B E R O N E ; ; The first entry in this table, Date/time entry mode setting, is used by ; ParseTime and NlsParseTime to control the parsing of date/time. Be ; sure to modify the "00" to match your language. Following this ; is the names of all the days of the week, months of the year, etc. ; ; ; first byte is ; ; 0 ... entry of date as MM/DD/YY. ; 1 ... entry of date as DD/MM/YY. ; 2 ... entry of date as YY/MM/DD. ; ; second byte is ; ; 0 ... entry of hour in either AM/PM or Military mode (4:00PM or 16:00) ; 1 ... entry of hour in 24 hour mode only (16:00) %DefineNameEntry(EntryModeSetting, "00"); ; First Day of the Week: Sunday %DefineNameEntry(FirstWeekDay, "sunday") ; Second Day of the Week: Monday %DefineNameEntry(SecondWeekDay, "monday") ; Third Day of the Week: Tuesday %DefineNameEntry(ThirdWeekDay, "tuesday") ; Fourth Day of the Week: Wednesday %DefineNameEntry(FourthWeekDay, "wednesday") ; Fifth Day of the Week: Thursday %DefineNameEntry(FifthWeekDay, "thursday") ; Sixth Day of the Week: Friday %DefineNameEntry(SixthWeekDay, "friday") ; Seventh Day of the Week: Saturday %DefineNameEntry(SeventhWeekDay, "saturday") ; First Month: January %DefineNameEntry(FirstMonth, "january") ; Second Month: February %DefineNameEntry(SecondMonth, "february") ; Third Month: March %DefineNameEntry(ThirdMonth, "march") ; Fourth Month: April %DefineNameEntry(FourthMonth, "april") ; Fifth Month: May %DefineNameEntry(FifthMonth, "may") ; Sixth Month: June %DefineNameEntry(SixthMonth, "june") ; Seventh Month: July %DefineNameEntry(SeventhMonth, "july") ; Eighth Month: August %DefineNameEntry(EighthMonth, "august") ; Ninth Month: September %DefineNameEntry(NinthMonth, "september") ; Tenth Month: October %DefineNameEntry(TenthMonth, "october") ; Eleventh Month: November %DefineNameEntry(EleventhMonth, "november") ; Twelfth Month: December %DefineNameEntry(TwelfthMonth, "december") ; First Meridian: AM %DefineNameEntry(FirstMeridian, "am") ; Second Meridian: PM %DefineNameEntry(SecondMeridian, "pm") ; Third Meridian: Noon %DefineNameEntry(ThirdMeridian, "noon") ; Forth Meridian: Midnight %DefineNameEntry(ForthMeridian, "midnight") ; Default Output Template Number (see table 6) ; Must be a two digit decimal number %DefineNameEntry(DefaultOutputTemplate, "05") ; USER EDITABLE TEXT ENDS %EndNameTable %StartNameTable ; ; T A B L E N U M B E R T W O ; ; USER EDITABLE TEXT FOLLOWS ; Error Name %DefineNameEntry(ErrorName, "invalid name"); ; First Day of the Week: Sunday %DefineNameEntry(FirstWeekDay, "sun") ; Second Day of the Week: Monday %DefineNameEntry(SecondWeekDay, "mon") ; Third Day of the Week: Tuesday %DefineNameEntry(ThirdWeekDay, "tue") ; Fourth Day of the Week: Wednesday %DefineNameEntry(FourthWeekDay, "wed") ; Fifth Day of the Week: Thursday %DefineNameEntry(FifthWeekDay, "thu") ; Sixth Day of the Week: Friday %DefineNameEntry(SixthWeekDay, "fri") ; Seventh Day of the Week: Saturday %DefineNameEntry(SeventhWeekDay, "sat") ; First Month: January %DefineNameEntry(FirstMonth, "jan") ; Second Month: February %DefineNameEntry(SecondMonth, "feb") ; Third Month: March %DefineNameEntry(ThirdMonth, "mar") ; Fourth Month: April %DefineNameEntry(FourthMonth, "apr") ; Fifth Month: May %DefineNameEntry(FifthMonth, "may") ; Sixth Month: June %DefineNameEntry(SixthMonth, "jun") ; Seventh Month: July %DefineNameEntry(SeventhMonth, "jul") ; Eighth Month: August %DefineNameEntry(EighthMonth, "aug") ; Ninth Month: September %DefineNameEntry(NinthMonth, "sep") ; Tenth Month: October %DefineNameEntry(TenthMonth, "oct") ; Eleventh Month: November %DefineNameEntry(EleventhMonth, "nov") ; Twelfth Month: December %DefineNameEntry(TwelfthMonth, "dec") ; First Meridian: AM %DefineNameEntry(FirstMeridian, "am") ; Second Meridian: PM %DefineNameEntry(SecondMeridian, "pm") ; Third Meridian: Noon %DefineNameEntry(ThirdMeridian, "n") ; Forth Meridian: Midnight %DefineNameEntry(ForthMeridian, "m") ; Default Output Template Number (see table 6) ; Must be a two digit decimal number %DefineNameEntry(DefaultOutputTemplate, "05") ; USER EDITABLE TEXT ENDS %EndNameTable ; ; If additional tables are required, they must be of the form of the two ; tables that are above. Any new tables must begin with a BeginTable call, ; be followed with exactly the same number of NameEntries, and the table ; must be closed with an EndTable call. ; ; Any new tables should be added here, the next table being number 3 ; ; ADD NEW TABLE(S) HERE ; All tables must be defined above %EndNameDefines )) %DefTableData (CollationTable, 9, %(%' CCT LABEL BYTE CTSignature DW 'CT' CCTI LABEL BYTE %' %' Character Collation Table - %' This table defines the sort order of all the characters in the character %' set. The table consists of one mandatory table followed by several words %' and bytes which define the length and offset from the beginning of the %' table of three optional tables. The 1st table is the primary character %' collation table. The optional tables are the character priority table, %' the 2 for 1 character substitution table and the 1 for 2 %' character substitution table. %' %' NOTE: The character priority table as well as the %' 2 for 1 and 1 for 2 substitution tables are not used in the default (CTOS) %' case and therefore they have been commented out. They would however be %' useful as a starting place or template for defining a more complete %' character collation structure than the one used by CTOS. Therefore, it is %' requested that these 300 lines of comments be left in this file for future %' reference. %' %' The current example includes the A-circle, A-umlaut, O-slashed, and %' U-umlaut characters, using a German collating sequence. This example is %' not intended to be a comprehensive German collating table, but is useful %' as a first step towards one. %' %' %' Priority ASCII Code Character %' ======== ========== ========= %' DB 00h ; 00h DB 01h ; 01h DB 02h ; 02h DB 03h ; 03h DB 04h ; 04h DB 05h ; 05h DB 06h ; 06h DB 07h ; 07h DB 08h ; 08h DB 09h ; 09h DB 0Ah ; 0Ah New Line DB 0Bh ; 0Bh DB 0Ch ; 0Ch Form Feed DB 0Dh ; 0Dh DB 0Eh ; 0Eh DB 0Fh ; 0Fh DB 010h ; 010h DB 011h ; 011h DB 012h ; 012h DB 013h ; 013h DB 020h ; 014h Non-Blank Space (make appear as space) DB 015h ; 015h DB 016h ; 016h DB 017h ; 017h DB 018h ; 018h DB 019h ; 019h DB 01Ah ; 01Ah DB 01Bh ; 01Bh DB 01Ch ; 01Ch DB 01Dh ; 01Dh DB 01Eh ; 01Eh DB 01Fh ; 01Fh DB 020h ; 020h DB 021h ; 021h ! DB 022h ; 022h " DB 023h ; 023h # DB 024h ; 024h $ DB 025h ; 025H Percent Sign DB 026h ; 026h & DB 027h ; 027h ' DB 028h ; 028h ( DB 029h ; 029h ) DB 02Ah ; 02Ah * DB 02Bh ; 02Bh + DB 02Ch ; 02Ch , DB 02Dh ; 02Dh - DB 02Eh ; 02Eh . DB 02Fh ; 02Fh / ; ; DIGITS ; DB 030h ; 030h 0 DB 031h ; 031h 1 DB 032h ; 032h 2 DB 033h ; 033h 3 DB 034h ; 034h 4 DB 035h ; 035h 5 DB 036h ; 036h 6 DB 037h ; 037h 7 DB 038h ; 038h 8 DB 039h ; 039h 9 ; DB 03Ah ; 03Ah : DB 03Bh ; 03Bh ; DB 03Ch ; 03Ch < DB 03Dh ; 03Dh = DB 03Eh ; 03Eh > DB 03Fh ; 03Fh ? DB 040h ; 040h @ ; ; Roman Letters A thru Z ; DB 041h ; 041h A DB 042h ; 042h B DB 043h ; 043h C DB 044h ; 044h D DB 045h ; 045h E DB 046h ; 046h F DB 047h ; 047h G DB 048h ; 048H H DB 049h ; 049h I DB 04Ah ; 04Ah J DB 04Bh ; 04Bh K DB 04Ch ; 04Ch L DB 04Dh ; 04Dh M DB 04Eh ; 04Eh N DB 04Fh ; 04Fh O DB 050h ; 050h P DB 051h ; 051h Q DB 052h ; 052h R DB 053h ; 053h S DB 054h ; 054h T DB 055h ; 055h U DB 056h ; 056h V DB 057h ; 057h W DB 058h ; 058h X DB 059h ; 059h Y DB 05Ah ; 05Ah Z ; DB 05Bh ; 05Bh [ DB 05Ch ; 05Ch \ DB 05Dh ; 05Dh ] DB 05Eh ; 05Eh ^ DB 05Fh ; 05Fh _ DB 060h ; 060h ` %' %' NOTE: In this the primary collation table, Priorities of the characters a-z %' are the same as those of A-Z. %' DB 041h ; 061h a DB 042h ; 062h b DB 043h ; 063h c DB 044h ; 064h d DB 045h ; 065h e DB 046h ; 066h f DB 047h ; 067h g DB 048h ; 068h h DB 049h ; 069h i DB 04Ah ; 06Ah j DB 04Bh ; 06Bh k DB 04Ch ; 06Ch l DB 04Dh ; 06Dh m DB 04Eh ; 06Eh n DB 04Fh ; 06Fh o DB 050h ; 070h p DB 051h ; 071h q DB 052h ; 072h r DB 053h ; 073h s DB 054h ; 074h t DB 055h ; 075h u DB 056h ; 076h v DB 057h ; 077h w DB 058h ; 078h x DB 059h ; 079h y DB 05Ah ; 07Ah z ; DB 07Bh ; 07Bh { DB 07Ch ; 07Ch | DB 07Dh ; 07Dh } DB 07Eh ; 07Eh ~ DB 07Fh ; 07Fh DB 080h ; 080h Delete DB 081h ; 081h DB 082h ; 082h DB 083h ; 083h DB 084h ; 084h DB 085h ; 085h DB 086h ; 086h DB 087h ; 087h DB 088h ; 088h DB 089h ; 089h DB 08Ah ; 08Ah DB 08Bh ; 08Bh DB 08Ch ; 08Ch DB 08Dh ; 08Dh DB 08Eh ; 08Eh DB 08Fh ; 08Fh DB 090h ; 090h DB 091h ; 091h DB 092h ; 092h DB 093h ; 093h DB 094h ; 094h DB 095h ; 095h DB 096h ; 096h DB 097h ; 097h DB 098h ; 098h DB 099h ; 099h DB 09Ah ; 09Ah DB 09Bh ; 09Bh DB 09Ch ; 09Ch DB 09Dh ; 09Dh DB 09Eh ; 09Eh DB 09Fh ; 09Fh %' %' NOTE: The lower-case umlauted, struck-through, and AE ligature characters %' have the same priority as their upper-case equivalents. %' DB 0A0h ; 0A0h A-circle DB 0A0h ; 0A1h a-circle (make appear as A-circle) DB 0A2h ; 0A2h A-umlaut DB 0A2h ; 0A3h a-umlaut (make appear as A-umlaut) DB 0A4h ; 0A4h O-slashed DB 0A4h ; 0A5h o-slashed (make appear as O-slashed) DB 0A6h ; 0A6h U-umlaut DB 0A6h ; 0A7h u-umlaut (make appear as U-umlaut) DB 0A8h ; 0A8h DB 0A8h ; 0A9h DB 0AAh ; 0AAh DB 0ABh ; 0ABh DB 0ACh ; 0ACh DB 0ADh ; 0ADh DB 0AEh ; 0AEh AE ligature DB 0AEh ; 0AFh ae ligature (make appear as AE ligature) DB 0B0h ; 0B0h DB 0B1h ; 0B1h DB 0B2h ; 0B2h DB 0B3h ; 0B3h DB 0B4h ; 0B4h DB 0B5h ; 0B5h DB 0B6h ; 0B6h DB 0B7h ; 0B7h DB 0B8h ; 0B8h DB 0B9h ; 0B9h DB 0BAh ; 0BAh DB 0BBh ; 0BBh DB 0BCh ; 0BCh DB 0BDh ; 0BDh DB 0BEh ; 0BEh DB 0BFh ; 0BFh DB 0C0h ; 0C0h DB 0C1h ; 0C1h DB 0C2h ; 0C2h DB 0C3h ; 0C3h DB 0C4h ; 0C4h DB 0C5h ; 0C5h DB 0C6h ; 0C6h DB 0C7h ; 0C7h DB 0C8h ; 0C8h DB 0C9h ; 0C9h DB 0CAh ; 0CAh DB 0CBh ; 0CBh DB 0CCh ; 0CCh DB 0CDh ; 0CDh DB 0CEh ; 0CEh DB 0CFh ; 0CFh DB 0D0h ; 0D0h DB 0D1h ; 0D1h DB 0D2h ; 0D2h DB 0D3h ; 0D3h DB 0D4h ; 0D4h DB 0D5h ; 0D5h DB 0D6h ; 0D6h DB 0D7h ; 0D7h DB 0D8h ; 0D8h DB 0D9h ; 0D9h DB 0DAh ; 0DAh DB 0DBh ; 0DBh DB 0DCh ; 0DCh DB 0DDh ; 0DDh DB 0DEh ; 0DEh DB 0DFh ; 0DFh DB 0E0h ; 0E0h DB 0E1h ; 0E1h DB 0E2h ; 0E2h DB 0E3h ; 0E3h DB 0E4h ; 0E4h DB 0E5h ; 0E5h DB 0E6h ; 0E6h DB 0E7h ; 0E7h DB 0E8h ; 0E8h DB 0E9h ; 0E9h DB 0EAh ; 0EAh DB 0EBh ; 0EBh DB 0ECh ; 0ECh DB 0EDh ; 0EDh DB 0EEh ; 0EEh DB 0EFh ; 0EFh DB 0F0h ; 0F0h DB 0F1h ; 0F1h DB 0F2h ; 0F2h DB 0F3h ; 0F3h DB 0F4h ; 0F4h DB 0F5h ; 0F5h DB 0F6h ; 0F6h DB 0F7h ; 0F7h DB 0F8h ; 0F8h DB 0F9h ; 0F9h DB 0FAh ; 0FAh DB 0FBh ; 0FBh DB 0FCh ; 0FCh DB 0FDh ; 0FDh DB 0FEh ; 0FEh DB 0FFh ; 0FFh %' %' Character Priority Table - %' %' This table defines the sort order of the characters in the character %' set. It is used by NLSCollate when two strings collate as equal using %' the character collation table above. %' %' To enable the character priority table, simply uncomment the 256 entries %' starting from the CCT2 label to rgb2For1Chrs label. Also, you must %' switch the semi-colon on the first DW pair only, i.e., %' %' ; DW CCT2 - CCTI %' DW 0 %' becomes: %' %' DW CCT2 - CCTI %' ; DW 0 %' %' To enable the 1-to-2 and 2-to-1 example tables, uncomment all the lines %' beginning with DB and DW from the "CCT2 LABEL BYTE" line through the %' rgb2For2Flags table. You must switch the semi-colon on all of the %' nine DW and DB pairs. e.g., %' %' ; DW CCT2 - CCTI %' DW 0 %' becomes: %' %' DW CCT2 - CCTI %' ; DW 0 %' %' and %' %' ; DW rgw2For1Subs - rgb2For1Chrs %' DW 0 %' becomes: %' %' DW rgw2For1Subs - rgb2For1Chrs %' ; DW 0 %' %' %' so on... %' o2ndCCT LABEL BYTE ; DW CCT2 - CCTI DW 0 ; DB rgw2For1Subs - rgb2For1Chrs DB 0 ; DB (rgb1For2Flags - rgw1For2Subs) / 2 DB 0 ; DW rgb2For1Chrs - CCT DW 0 ; DW rgw2For1Subs - CCT DW 0 ; DW rgw2For1Priorities - CCT DW 0 ; DW rgw1For2Wrds - CCT DW 0 ; DW rgw1For2Subs - CCT DW 0 ; DW rgb1For2Flags - CCT DW 0 CCT2 LABEL BYTE %' Priority ASCII Code Character %' ======== ========== ========= %' DB 00h ; 00h %' DB 01h ; 01h %' DB 02h ; 02h %' DB 03h ; 03h %' DB 04h ; 04h %' DB 05h ; 05h %' DB 06h ; 06h %' DB 07h ; 07h %' DB 08h ; 08h %' DB 09h ; 09h %' DB 0Ah ; 0Ah New Line. %' DB 0Bh ; 0Bh %' DB 0Ch ; 0Ch Form Feed. %' DB 0Dh ; 0Dh %' DB 0Eh ; 0Eh %' DB 0Fh ; 0Fh %' DB 010h ; 010h %' DB 011h ; 011h %' DB 012h ; 012h %' DB 013h ; 013h %' DB 014h ; 014h Non-Blank Space (make appear as space) %' DB 015h ; 015h %' DB 016h ; 016h %' DB 017h ; 017h %' DB 018h ; 018h %' DB 019h ; 019h %' DB 01Ah ; 01Ah %' DB 01Bh ; 01Bh %' DB 01Ch ; 01Ch %' DB 01Dh ; 01Dh %' DB 01Eh ; 01Eh %' DB 01Fh ; 01Fh %' DB 020h ; 020h %' DB 021h ; 021h ! %' DB 022h ; 022h " %' DB 023h ; 023h # %' DB 024h ; 024h $ %' DB 025h ; 025H Percent Sign %' DB 026h ; 026h & %' DB 027h ; 027h ' %' DB 028h ; 028h ( %' DB 029h ; 029h ) %' DB 02Ah ; 02Ah * %' DB 02Bh ; 02Bh + %' DB 02Ch ; 02Ch , %' DB 02Dh ; 02Dh - %' DB 02Eh ; 02Eh . %' DB 02Fh ; 02Fh / %' %' DIGITS %' %' DB 030h ; 030h 0 %' DB 031h ; 031h 1 %' DB 032h ; 032h 2 %' DB 033h ; 033h 3 %' DB 034h ; 034h 4 %' DB 035h ; 035h 5 %' DB 036h ; 036h 6 %' DB 037h ; 037h 7 %' DB 038h ; 038h 8 %' DB 039h ; 039h 9 %' %' DB 03Ah ; 03Ah : %' DB 03Bh ; 03Bh ; %' DB 03Ch ; 03Ch < %' DB 03Dh ; 03Dh = %' DB 03Eh ; 03Eh > %' DB 03Fh ; 03Fh ? %' DB 040h ; 040h @ %' %' NOTE: In this the character priority table, the characters a thru z and %' A thru Z are arranged in the following order. A,a,B,b...,Z,z %' %' DB 041h ; 061h A %' DB 043h ; 062h B %' DB 045h ; 063h C %' DB 047h ; 064h D %' DB 049h ; 065h E %' DB 04Bh ; 066h F %' DB 04Dh ; 067h G %' DB 04Fh ; 068h H %' DB 051h ; 069h I %' DB 053h ; 06Ah J %' DB 055h ; 06Bh K %' DB 057h ; 06Ch L %' DB 059h ; 06Dh M %' DB 05Bh ; 06Eh N %' DB 05Dh ; 06Fh O %' DB 05Fh ; 070h P %' DB 061h ; 071h Q %' DB 063h ; 072h R %' DB 065h ; 073h S %' DB 067h ; 074h T %' DB 069h ; 075h U %' DB 06Bh ; 076h V %' DB 06Dh ; 077h W %' DB 06Fh ; 078h X %' DB 071h ; 079h Y %' DB 073h ; 07Ah Z %' %' DB 075h ; 05Bh [ %' DB 076h ; 05Ch \ %' DB 077h ; 05Dh ] %' DB 078h ; 05Eh ^ %' DB 079h ; 05Fh _ %' DB 07Ah ; 060h ` %' %' NOTE: In this the character priority table, the characters a thru z and %' A thru Z are arranged in the following order. A,a,B,b...,Z,z %' %' DB 042h ; 041h a %' DB 044h ; 042h b %' DB 046h ; 043h c %' DB 048h ; 044h d %' DB 04Ah ; 045h e %' DB 04Ch ; 046h f %' DB 04Eh ; 047h g %' DB 050h ; 048H h %' DB 052h ; 049h i %' DB 054h ; 04Ah j %' DB 056h ; 04Bh k %' DB 058h ; 04Ch l %' DB 05Ah ; 04Dh m %' DB 05Ch ; 04Eh n %' DB 05Eh ; 04Fh o %' DB 060h ; 050h p %' DB 062h ; 051h q %' DB 064h ; 052h r %' DB 066h ; 053h s %' DB 068h ; 054h t %' DB 06Ah ; 055h u %' DB 06Ch ; 056h v %' DB 06Eh ; 057h w %' DB 070h ; 058h x %' DB 072h ; 059h y %' DB 074h ; 05Ah z %' %' DB 07Bh ; 07Bh { %' DB 07Ch ; 07Ch | %' DB 07Dh ; 07Dh } %' DB 07Eh ; 07Eh ^ %' DB 07Fh ; 07Fh %' DB 080h ; 080h Delete %' DB 081h ; 081h %' DB 082h ; 082h %' DB 083h ; 083h %' DB 084h ; 084h %' DB 085h ; 085h %' DB 086h ; 086h %' DB 087h ; 087h %' DB 088h ; 088h %' DB 089h ; 089h %' DB 08Ah ; 08Ah %' DB 08Bh ; 08Bh %' DB 08Ch ; 08Ch %' DB 08Dh ; 08Dh %' DB 08Eh ; 08Eh %' DB 08Fh ; 08Fh %' DB 090h ; 090h %' DB 091h ; 091h %' DB 092h ; 092h %' DB 093h ; 093h %' DB 094h ; 094h %' DB 095h ; 095h %' DB 096h ; 096h %' DB 097h ; 097h %' DB 098h ; 098h %' DB 099h ; 099h %' DB 09Ah ; 09Ah %' DB 09Bh ; 09Bh %' DB 09Ch ; 09Ch %' DB 09Dh ; 09Dh %' DB 09Eh ; 09Eh %' DB 09Fh ; 09Fh %' DB 0A0h ; 0A0h A-circle %' DB 0A1h ; 0A1h a-circle %' DB 0A2h ; 0A2h A-umlaut %' DB 0A3h ; 0A3h a-umlaut %' DB 0A4h ; 0A4h O-slashed %' DB 0A5h ; 0A5h o-slashed %' DB 0A6h ; 0A6h U-umlaut %' DB 0A7h ; 0A7h u-umlaut %' DB 0A8h ; 0A8h %' DB 0A9h ; 0A9h %' DB 0AAh ; 0AAh %' DB 0ABh ; 0ABh %' DB 0ACh ; 0ACh %' DB 0ADh ; 0ADh %' DB 0AEh ; 0AEh AE ligature %' DB 0AEh ; 0AFh ae ligature %' DB 0B0h ; 0B0h %' DB 0B1h ; 0B1h %' DB 0B2h ; 0B2h %' DB 0B3h ; 0B3h %' DB 0B4h ; 0B4h %' DB 0B5h ; 0B5h %' DB 0B6h ; 0B6h %' DB 0B7h ; 0B7h %' DB 0B8h ; 0B8h %' DB 0B9h ; 0B9h %' DB 0BAh ; 0BAh %' DB 0BBh ; 0BBh %' DB 0BCh ; 0BCh %' DB 0BDh ; 0BDh %' DB 0BEh ; 0BEh %' DB 0BFh ; 0BFh %' DB 0C0h ; 0C0h %' DB 0C1h ; 0C1h %' DB 0C2h ; 0C2h %' DB 0C3h ; 0C3h %' DB 0C4h ; 0C4h %' DB 0C5h ; 0C5h %' DB 0C6h ; 0C6h %' DB 0C7h ; 0C7h %' DB 0C8h ; 0C8h %' DB 0C9h ; 0C9h %' DB 0CAh ; 0CAh %' DB 0CBh ; 0CBh %' DB 0CCh ; 0CCh %' DB 0CDh ; 0CDh %' DB 0CEh ; 0CEh %' DB 0CFh ; 0CFh %' DB 0D0h ; 0D0h %' DB 0D1h ; 0D1h %' DB 0D2h ; 0D2h %' DB 0D3h ; 0D3h %' DB 0D4h ; 0D4h %' DB 0D5h ; 0D5h %' DB 0D6h ; 0D6h %' DB 0D7h ; 0D7h %' DB 0D8h ; 0D8h %' DB 0D9h ; 0D9h %' DB 0DAh ; 0DAh %' DB 0DBh ; 0DBh %' DB 0DCh ; 0DCh %' DB 0DDh ; 0DDh %' DB 0DEh ; 0DEh %' DB 0DFh ; 0DFh %' DB 0E0h ; 0E0h %' DB 0E1h ; 0E1h %' DB 0E2h ; 0E2h %' DB 0E3h ; 0E3h %' DB 0E4h ; 0E4h %' DB 0E5h ; 0E5h %' DB 0E6h ; 0E6h %' DB 0E7h ; 0E7h %' DB 0E8h ; 0E8h %' DB 0E9h ; 0E9h %' DB 0EAh ; 0EAh %' DB 0EBh ; 0EBh %' DB 0ECh ; 0ECh %' DB 0EDh ; 0EDh %' DB 0EEh ; 0EEh %' DB 0EFh ; 0EFh %' DB 0F0h ; 0F0h %' DB 0F1h ; 0F1h %' DB 0F2h ; 0F2h %' DB 0F3h ; 0F3h %' DB 0F4h ; 0F4h %' DB 0F5h ; 0F5h %' DB 0F6h ; 0F6h %' DB 0F7h ; 0F7h %' DB 0F8h ; 0F8h %' DB 0F9h ; 0F9h %' DB 0FAh ; 0FAh %' DB 0FBh ; 0FBh %' DB 0FCh ; 0FCh %' DB 0FDh ; 0FDh %' DB 0FEh ; 0FEh %' DB 0FFh ; 0FFh %' %' rgb2For1Chrs - %' This table defines those characters which have 2 for 1 substitutions. %' rgb2For1Chrs LABEL BYTE %' DB 0A0h ; 0A0h A-circle %' DB 0A1h ; 0A1h a-circle %' DB 0A2h ; 0A2h A umlaut %' DB 0A3h ; 0A3h a umlaut %' DB 0A4h ; 0A4h O umlaut %' DB 0A5h ; 0A5h o umlaut %' DB 0A6h ; 0A6h O-slash %' DB 0A7h ; 0A7h o-slash %' DB 0A8h ; 0A8h U umlaut %' DB 0A9h ; 0A9h u umlaut %' DB 0AEh ; 0AEh AE ligature %' DB 0AFh ; 0AFh ae ligature %' DB 0B0h ; 0B0h (ettset) %' %' rgw2For1Subs - %' This table MUST parallel rgb2For1Chrs. It defines the two characters %' which are to be substituted for the characters in rgb2For1Chrs. %' rgw2For1Subs LABEL BYTE ; DB 'A', 'o' ; A-circle expands to 'A', 'o' ; DB 'a', 'o' ; a-circle expands to 'a', 'o' ; DB 'A', 'u' ; A-umlaut expands to 'A', 'u' ; DB 'a', 'u' ; a-umlaut expands to 'a', 'u' ; DB 'O', 'u' ; O-umlaut expands to 'O', 'u' ; DB 'o', 'u' ; o-umlaut expands to 'o', 'u' ; DB 'O', '/' ; O-slash expands to 'O', '/' ; DB 'o', '/' ; o-slash expands to 'o', '/' ; DB 'U', 'u' ; U-umlaut expands to 'U', 'u' ; DB 'u', 'u' ; u-umlaut expands to 'u', 'u' ; DB 'A', 'e' ; AE ligature expands to 'A', 'e' ; DB 'a', 'e' ; ae ligature expands to 'a', 'e' ; DB 's', 's' ; ettset expands to 's', 's' %' %' rgw2For1Priorities - %' This table MUST parallel rgb2For1Chrs & rgw2For1Subs. It defines the %' offset in priority of the second of the two characters in rgw2For1Subs %' which are to be substituted for the corresponding characters defined in %' rgb2For1Chrs. For the first example shown A-umlaut, the -1 indicates %' that the "Au" substitution should sort immediately before a real "Au". %' 0 (zero) would indicate that the "Au" substituted for A-umlaut should be %' sorted exactly equal to a normal "Au", and finally a 1 would indicate %' that the "Au" substitution should sort immediately after a real "Au". %' NOTE: This table is NOT used in conjunction with the first character %' collation table. When the first character collation table is being used %' the characters substituted as a result of 2 for 1 substitutions will be %' collated equal to their normal values, just as if the entry in this array %' had been defined as 0. %' rgw2For1Priorities LABEL BYTE ; DW -1 ; A-circle expands to 'A', 'o' & sorts before 'Ao' ; DW -1 ; a-circle expands to 'a', 'o' & sorts before 'ao' ; DW -1 ; A-umlaut expands to 'A', 'u' & sorts before 'au' ; DW -1 ; a-umlaut expands to 'a', 'u' & sorts before 'au' ; DW -1 ; O-umlaut expands to 'O', 'u' & sorts before 'Ou' ; DW -1 ; o-umlaut expands to 'o', 'u' & sorts before 'ou' ; DW -1 ; O-slash expands to 'O', '/' & sorts before 'O/' ; DW -1 ; o-slash expands to 'o', '/' & sorts before 'o/' ; DW -1 ; U-umlaut expands to 'U', 'u' & sorts before 'Uu' ; DW -1 ; u-umlaut expands to 'u', 'u' & sorts before 'uu' ; DW -1 ; AE ligature expands to 'A', 'e' & sorts before 'Ae' ; DW -1 ; ae ligature expands to 'a', 'e' & sorts before 'ae' ; DW -1 ; esset expands to 's', 's' & sorts before 'ss' %' %' This table defines those pairs of characters which have special priorities %' rgw1For2Wrds LABEL BYTE ; DB 'M', 'c' ; DB 'C', 'h' ; DB 'c', 'h' %' %' This table MUST parallel rgw1For2Wrds. It defines the priorites of the %' sets of two special characters defined in rgw1For2Wrds. Note that the %' priority of a single character is the value defined in the COLLATION %' table(s) above times 256. So in this example, the priority of M is %' 4D00; The priority of Mc is 4CFF. This means that the Mc gets collated %' IMMEDIATELY before M (since no number exists between 4CFF and 4D00.) %' Also, ch gets collated immediately after c (4300 for c followed by 4301 %' for ch); similarly for Ch and C. %' rgw1For2Subs LABEL BYTE %' DW 4CFFh %' DW 4301h %' DW 4301h %' %' This table MUST parallel rgw1For2Wrds. It defines whether the 1 for 2 %' substitution defined in rgw1For2Wrds and rgw1For2Subs should always be %' made or if it should only be made when the two characters defined in %' rgw1For2Wrds are at the beginning of a string. 1 means beginning only, %' 0 means anywhere in the string. %' rgb1For2Flags LABEL BYTE %' DB 01h %' DB 00h %' DB 00h )) ; The following table indicates the class of the each of the 256 characters. ; The five possible values are defined below. numer EQU 0 ; Numeric (Whole numbers) alpha EQU 1 ; Alphabetic (Letters of the alphabet) specl EQU 2 ; Special (Non-alphanumeric, but commonly displayed) graph EQU 3 ; Graphic (Line drawing and other special graphics) blind EQU 4 ; Blind (Not generally intended for display purposes) %DefTableData (CharacterClassTable, 10, %(%' CharacterClassSignature DW 'CC' ; 0 / 8 1 / 9 2 / A 3 / B 4 / C 5 / D 6 / E 7 / F ; ----- ----- ----- ----- ----- ----- ----- ----- DB blind, blind, blind, specl, blind, blind, specl, blind ; 00h-07h DB blind, blind, blind, blind, blind, blind, blind, blind ; 08h-0Fh DB specl, blind, blind, blind, blind, blind, blind, blind ; 10h-17h DB blind, blind, blind, blind, blind, blind, blind, blind ; 18h-1Fh DB specl, specl, specl, specl, specl, specl, specl, specl ; 20h-27h DB specl, specl, specl, specl, specl, specl, specl, specl ; 28h-2Fh DB numer, numer, numer, numer, numer, numer, numer, numer ; 30h-37h DB numer, numer, specl, specl, specl, specl, specl, specl ; 38h-3Fh DB specl, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 40h-47h DB alpha, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 48h-4Fh DB alpha, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 50h-57h DB alpha, alpha, alpha, specl, specl, specl, specl, specl ; 58h-5Fh DB specl, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 60h-67h DB alpha, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 68h-6Fh DB alpha, alpha, alpha, alpha, alpha, alpha, alpha, alpha ; 70h-77h DB alpha, alpha, alpha, specl, specl, specl, specl, blind ; 78h-7Fh DB graph, graph, graph, graph, graph, graph, graph, graph ; 80h-87h DB graph, graph, graph, graph, graph, graph, graph, graph ; 88h-8Fh DB graph, graph, graph, graph, graph, graph, graph, graph ; 90h-97h DB graph, graph, graph, graph, graph, graph, graph, graph ; 98h-9Fh DB blind, blind, blind, blind, blind, blind, blind, blind ; A0h-A7h DB blind, blind, blind, blind, blind, blind, blind, blind ; A8h-AFh DB blind, blind, blind, blind, blind, blind, graph, graph ; B0h-B7h DB graph, graph, graph, graph, graph, graph, graph, graph ; B8h-BFh DB graph, graph, graph, graph, graph, graph, graph, graph ; C0h-C7h DB graph, graph, graph, graph, graph, graph, graph, graph ; C8h-CFh DB graph, graph, graph, graph, graph, graph, graph, graph ; D0h-D7h DB graph, graph, graph, graph, graph, graph, graph, graph ; D8h-DFh DB graph, graph, graph, graph, graph, graph, graph, graph ; E0h-E7h DB graph, graph, graph, graph, graph, graph, graph, graph ; E8h-EFh DB graph, graph, graph, graph, graph, graph, graph, graph ; F0h-F7h DB graph, graph, graph, graph, graph, graph, graph, graph ; F8h-FFh )) ; The Yes/No strings are space delimited words meaning Yes or No. ; It is recommended that Yes and No remain as part of their respective strings ; for compatibility with submit files. ; If you wish to have multiple answers for yes or no, modify the table as ; follows: ('Yes Oui'). That is, separate words by a space, but do ; not put a space after the last entry. ; Note: For some programs, such as the Cmd File Editor, if you have more than ; one word matching yes or no, only the first one will be displayed. %DefTableData (YesNoStrings, 11, %(%' YesNoSignature DW 'YN' %sbString ('Yes x ͂ nC ʲ') ; could be ('Yes Oui') %sbString ('No mn CCG ') ; could be ('Nyet NoWay ForgetIt') )) ; The Special Characters table contains characters that are subject ; to special interpretation by programs like the Executive. The table ; includes entries used by Convergent as well as customer reserved entries. ; Convergent characters follow the nEntriesCT field, while customer entries ; follow the nEntriesUser field. To change the characters used by ; Convergent programs, simply change values in the CT portion of the ; table. For example, to change the literal insert or escape character ; from CODE-' to backslash, change the first entry from 0A7h to 5Ch. ; ; If you add entries, be sure you add the entries after the nEntriesUser ; field, and increment nEntriesUser. ; ; NOTE: DO NOT ALTER THE ORDER OF THE ENTRIES. ; %DefTableData (SpecialCharacters, 13, %(%' SpecialCharacters DW 'SC' nEntriesCt DB 2 DB 0A7h ; Literal insert character, Code Quote DB 05Ch ; Literal insert character, '\' (Jpn) nEntriesUser DB 0 ;customer entries start here )) ; ; The KbdChords table defines the unencoded keystrokes for the code, shift ; and action key chords. ; ; The table is also used by the Remote Console. ; %DefTableData (KbdChords, 14, %(%' KbdChordsSig DW 'KC' cIkey DW 14 ;number of iKeys described below iKeyDbgrA DW 61h ;(action-a) - enter debugger in single process mode iKeyDbgrB DW 62h ;(action-b) - enter debugger in multi process mode iKeyDelete DW 7Fh ;(action-delete) - discard kbd type ahead iKeyOverType DW 44h ;(action-overtype) - turn off video refresh iKeyCode0 DW 4Ch ;left code key iKeyCode1 DW 4Dh ;right code key iKeyFinish DW 04h ;finish key iKeyAction DW 43h ;action key iKeyShiftLock DW 45h ;shift LOCK key iKeyShift0 DW 48h ;left shift key iKeyShift1 DW 49h ;right shift key rsvd1 DW 0FFFFh rsvd2 DW 0FFFFh rsvd3 DW 0FFFFh )) ; ; TABLE 15 RESERVED - DO NOT USE ; ; ; The table below, MultiByteEscapeKeys, defines keyboard keys which when ; depressed result in multiple keystrokes being returned to keyboard clients. ; ; All entries in the table are unencoded keystrokes. Any key on the keyboard ; may be defined as a MultiByteEscapeKey. Also, different results may be ; defined depending on the shift and code key state. See the CTOS Reference ; manual Appendix C-1 for unencoded value of keyboard keys. ; ; The resulting key sequences must include downstrokes as well as upstrokes ; as well as any shift state required to produce the keyboard characters ; desired. An upstroke is the key value OR'ed with 80h. ; ; The two examples below are 'commented out' by the notation %' ; preceding each macro. ; ; In the first example below, the key '0' on the numeric pad (unencoded ; value 4Ah) is defined to produce 6 keyboard events - ; downstroke 'a' (61h) ; upstroke 'a' (0E1h) ; downstroke 'b' (62h) ; upstroke 'b' (0E2h) ; downstroke 'c' (63h) ; upstroke 'c' (0E3h) ; These 6 keyboard events would produce the 3 keyboard characters 'abc'. ; ; In the second example the key '0' on the numeric pad is depressed when the ; shift or shift lock keys are active would produce the keyboard characters ; '[Sys]'. Note that the first keystrokes in this list are shift ; upstroke (0C8h,0C9h) which turns off the shift state caused by the ; invoking key, shift-'0'. We don't know which shift key was pressed, so ; issue upstrokes for both left and right. ; %DefTableData (MultiByteEscapeKeys, 16, %(%' EscapeKeySig DW 'MB' Unshifted EQU 0 Shifted EQU 3 Coded EQU 0Ch ShiftCoded EQU 0Fh ShiftLock EQU 10h %InitEscapeKeys %'%DefEscapeKey(4Ah, Unshifted) (61h,0E1h,62h,0E2h,63h,0E3h) %'%DefEscapeKey(4Ah, Shifted) (0C8h,0C9h,5Bh,0DBh,48h,73h,0F3h,0C8h,79h,0F9h,73h,0F3h,5Dh,0DDh,48h,5Bh,0DBh,73h,0C8h,79h,0F9h,73h,0F3h,48h,5Dh,0DDh,0C8h) %EndEscapeKeys )) ; ; The CtosLib strings table defines those strings used by Ctos.lib routines. ; ; NOTE: DO NOT ALTER THE ORDER OF THE ENTRIES. ; %DefTableData (CtosLib, 17, %(%' CtosLibSig DW 'CL' cString DW 2 %sbString ('.user') %' .user suffix %sbString ('-old') %' -old suffix )) ;**WARNING***WARNING************************************** ;********************************************************* ; TABLES 18,19,20 AND 21 ARE FOR CLUSTERSHARE APPLICATIONS ; These tables have been commented out to save memory for ; non clustershare environments. If you are going to use ; clustershare, please uncomment the next 4 tables by ; removing the %' (percent quote) characters from the ; beginning of each line. ;********************************************************* ;**END*WARNING******************************************** ; ; TABLE 18 CTDOS.lib keyboard table %'; %'; %'%DefTableData (CtDos_KbdTable, 18, %(%' %'; %'CtDos_KbdTableSignature DW 4431h ;D1 %'; %'; FIRST TABLE: SIMPLE PC TO CT CHARACTER MAPPING %'; This table maps single PC characters to the equivalent %'; character in the CT character set. %'; %' %'; CT Char code ;PC |CTOS |CTOS %'; ;Char |visual |keystrokes %'; ;code |symbol | %' %' db 0FFh ;00(Ctrl-2) nul CODE-HELP %' db 0E1h ;01 see Table B-2 CODE-a %' %' db 0E2h ;02 see Table B-2 CODE-b %'; db 0FFh ;0002 (Alt-down arrow) %' %' db 0E3h ;03 see Table B-2 CODE-c %' %' db 0E4h ;04 see Table B-2 CODE-d %'; db 0FFh ;0004 (Alt-left arrow) %' %' db 0E5h ;05 see Table B-2 CODE-e %' %' db 0E6h ;06 see Table B-2 CODE-f %'; db 0FFh ;0006 (Alt-right arrow) %' %' db 0E7h ;07 see Table B-2 CODE-g %' %' db 008h ;0E08 backspace BACKSPACE %'; db 0E8h ;2308 see Table B-2 CODE-h %'; db 0FFh ;0008 (Alt-up arrow) %' %' db 009h ;09 tab TAB %'; db 0E9h ;09 see Table B-2 CODE-i %' %' db 0EAh ;0A see Table B-2 CODE-j %'; db 00Ah ;0A/Alt-Enter SC=1C SHIFT-RET %' %' db 0EBh ;0B see Table B-2 CODE-k %' db 0ECh ;0C see Table B-2 CODE-l %' %' db 00Ah ;0D new line RETURN %'; db 0EDh ;0D see Table B-2 CODE-m %' %' db 0EEh ;0E see Table B-2 CODE-n %' db 0EFh ;0F see Table B-2 CODE-o %' db 0F0h ;10 see Table B-2 CODE-p %' db 0F1h ;11 see Table B-2 CODE-q %' db 0F2h ;12 see Table B-2 CODE-r %' db 0F3h ;13 see Table B-2 CODE-s %' db 0F4h ;14 see Table B-2 CODE-t %' db 017h ;15 (needed for German and French) %'; db 0F5h ;15 see Table B-2 CODE-u %' db 0F6h ;16 see Table B-2 CODE-v %' db 0F7h ;17 see Table B-2 CODE-w %' db 0F8h ;18 see Table B-2 CODE-y %' db 0F9h ;19 see Table B-2 CODE-x %' db 0FAh ;1A see Table B-2 CODE-z %' %' db 007h ;1B bell CANCEL %'; db 0DBh ;1B see Table B-2 SHIFT-[ %' %' db 0FFh ;1C c cedilla CODE-SHIFT-8 %' db 0DDh ;1D see Table B-2 CODE-] %' db 0FFh ;1E  CODE-6 %' db 0ADh ;1F e acute CODE-- %' db 020h ;20 space space %' db 021h ;21 ! SHIFT-1 %' db 022h ;22 " SHIFT-' %' db 023h ;23 # SHIFT-3 %' db 024h ;24 $ SHIFT-4 %' db 025h ;25 percent sign SHIFT-5 %' db 026h ;26 & SHIFT-7 %' db 027h ;27 quote quote %' db 028h ;28 right paren SHIFT-9 %' db 029h ;29 left paren SHIFT-0 %' %' db 02Ah ;2A raised dot BOUND %'; db 02Ah ;2A * SHIFT-8 %' %' db 02Bh ;2B filled circle GO %'; db 02Bh ;2B + SHIFT-= %' %' db 02Ch ;2C , (comma) , %' %' db 02Dh ;2D SC=4A MARK %'; db 02Dh ;2D - (hyphen) - %' %' db 02Eh ;2E . (period) . %' db 02Fh ;2F / / %' db 030h ;30 0 0 %' db 031h ;31 1 1 %' db 032h ;32 2 2 %' db 033h ;33 3 3 %' db 034h ;34 4 4 %' db 035h ;35 5 5 %' db 036h ;36 6 6 %' db 037h ;37 7 7 %' db 038h ;38 8 8 %' db 039h ;39 9 9 %' db 03Ah ;3A : SHIFT-; %' db 03Bh ;3B ; ; %' db 03Ch ;3C < SHIFT-[ %' db 03Dh ;3D = = %' db 03Eh ;3E > SHIFT-] %' db 03Fh ;3F ? SHIFT-/ %' db 040h ;40 @ SHIFT-2 %' db 041h ;41 A SHIFT-a %' db 042h ;42 B SHIFT-b %' db 043h ;43 C SHIFT-c %' db 044h ;44 D SHIFT-d %' db 045h ;45 E SHIFT-e %' db 046h ;46 F SHIFT-f %' db 047h ;47 G SHIFT-g %' db 048h ;48 H SHIFT-h %' db 049h ;49 I SHIFT-i %' db 04Ah ;4A J SHIFT-j %' db 04Bh ;4B K SHIFT-k %' db 04Ch ;4C L SHIFT-l %' db 04Dh ;4D M SHIFT-m %' db 04Eh ;4E N SHIFT-n %' db 04Fh ;4F O SHIFT-o %' db 050h ;50 P SHIFT-p %' db 051h ;51 Q SHIFT-q %' db 052h ;52 R SHIFT-r %' db 053h ;53 S SHIFT-s %' db 054h ;54 T SHIFT-t %' db 055h ;55 U SHIFT-u %' db 056h ;56 V SHIFT-v %' db 057h ;57 W SHIFT-w %' db 058h ;58 X SHIFT-x %' db 059h ;59 Y SHIFT-y %' db 05Ah ;5A Z SHIFT-z %' db 05Bh ;5B [ [ %' db 05Ch ;5C \ (backslash) SHIFT-num 8 %' db 05Dh ;5D ] ] %' db 05Eh ;5E ^ (caret) ^ %' db 05Fh ;5F _ (underline) SHIFT-- %' db 060h ;60 reverse accent SHIFT-num 1 %' db 061h ;61 a a %' db 062h ;62 b b %' db 063h ;63 c c %' db 064h ;64 d d %' db 065h ;65 e e %' db 066h ;66 f f %' db 067h ;67 g g %' db 068h ;68 h h %' db 069h ;69 i i %' db 06Ah ;6A j j %' db 06Bh ;6B k k %' db 06Ch ;6C l l %' db 06Dh ;6D m m %' db 06Eh ;6E n n %' db 06Fh ;6F o o %' db 070h ;70 p p %' db 071h ;71 q q %' db 072h ;72 r r %' db 073h ;73 s s %' db 074h ;74 t t %' db 075h ;75 u u %' db 076h ;76 v v %' db 077h ;77 w w %' db 078h ;78 x x %' db 079h ;79 y y %' db 07Ah ;7A z z %' db 07Bh ;7B { SHIFT-num 4 %' db 07Ch ;7C broken ver bar SHIFT-num 7 %' db 07Dh ;7D } SHIFT-num 5 %' db 07Eh ;7E ~ (tilde) SHIFT-^ %' db 088h ;7F |6 CODE-BACKSPACE %' db 080h ;80 null CODE-HELP %' db 0A9h ;81 intl char %' db 0ACh ;82 intl char %' db 0FFh ;83 %' db 0A3h ;84 intl char %' db 0FFh ;85 %' db 0A1h ;86 intl char %' db 0AAh ;87 intl char %' db 0ABh ;88 intl char %' db 0FFh ;89 %' db 0ADh ;8A intl char %' db 0FFh ;8B %' db 0FFh ;8C %' db 0FFh ;8D %' db 0A2h ;8E intl char %' db 0A0h ;8F intl char %' db 0FFh ;90 %' db 0AFh ;91 intl char %' db 0AEh ;92 intl char %' db 0FFh ;93 %' db 0A5h ;94 intl char %' db 0FFh ;95 %' db 0FFh ;96 %' db 0FFh ;97 %' db 0FFh ;98 %' db 0A4h ;99 intl char %' db 0A8h ;9A intl char %' db 003h ;9B (cents sign) SHIFT-6 %' db 0B1h ;9C %' db 0FFh ;9D %' db 0FFh ;9E %' db 0FFh ;9F %' db 0FFh ;A0 %' db 0FFh ;A1 %' db 0FFh ;A2 %' db 0FFh ;A3 %' db 0FFh ;A4 %' db 0FFh ;A5 %' db 0FFh ;A6 %' db 0FFh ;A7 %' db 0FFh ;A8 %' db 0FFh ;A9 %' db 0FFh ;AA %' db 006h ;AB 1/2 1/2 %' db 010h ;AC 1/4 SHIFT-1/2 %' db 084h ;AD reserved timer mgt %' db 0FFh ;AE %' db 0FFh ;AF %' db 0FFh ;B0 %' db 0FFh ;B1 %' db 0FFh ;B2 %' db 0FFh ;B3 %' db 0FFh ;B4 %' db 0FFh ;B5 %' db 0FFh ;B6 %' db 0FFh ;B7 %' db 0FFh ;B8 %' db 0FFh ;B9 %' db 0FFh ;BA %' db 0FFh ;BB %' db 0FFh ;BC %' db 0FFh ;BD %' db 0FFh ;BE %' db 0FFh ;BF %' db 0FFh ;C0 %' db 0FFh ;C1 %' db 0FFh ;C2 %' db 0FFh ;C3 %' db 0FFh ;C4 %' db 0FFh ;C5 %' db 0FFh ;C6 %' db 0FFh ;C7 %' db 0FFh ;C8 %' db 0FFh ;C9 %' db 0FFh ;CA %' db 0FFh ;CB %' db 0FFh ;CC %' db 0FFh ;CD %' db 0FFh ;CE %' db 0FFh ;CF %' db 0FFh ;D0 %' db 0FFh ;D1 %' db 0FFh ;D2 %' db 0FFh ;D3 %' db 0FFh ;D4 %' db 0FFh ;D5 %' db 0FFh ;D6 %' db 0FFh ;D7 %' db 0FFh ;D8 %' db 0FFh ;D9 %' db 0FFh ;DA %' db 0FFh ;DB %' db 0FFh ;DC %' db 0FFh ;DD %' db 0FFh ;DE %' db 0FFh ;DF %' db 0FFh ;E0 %' db 0B0h ;E1 %' db 0FFh ;E2 %' db 0FFh ;E3 %' db 0FFh ;E4 %' db 0FFh ;E5 %' db 0FFh ;E6 %' db 0FFh ;E7 %' db 0FFh ;E8 %' db 0FFh ;E9 %' db 0FFh ;EA %' db 0FFh ;EB %' db 0FFh ;EC %' db 0FFh ;ED %' db 0FFh ;EE %' db 0FFh ;EF %' db 0FFh ;F0 %' db 0FFh ;F1 %' db 0FFh ;F2 %' db 0FFh ;F3 %' db 0FFh ;F4 %' db 0FFh ;F5 %' db 0FFh ;F6 %' db 0FFh ;F7 %' db 0B2h ;F8 %' db 0FFh ;F9 %' db 0FFh ;FA %' db 0FFh ;FB mail-reserved %' db 0FFh ;FC mail-reserved %' db 0FFh ;FD %' db 0FFh ;FE %' db 0FFh ;FF %')) %' %'; %'; TABLE 19 CTDOS.lib keyboard extended codes table %'; %'; SECOND CTDOS TABLE: MAP PC CODE KEYS TO THE CT CHARACTER SET %'; This table maps a PC key which has been pressed in combination with %'; the code key to the equivalent character in the CT character set. %'; %'%DefTableData (CtDos_KbdExtTable, 19, %(%' %' %'CtDos_KbdExtTableSignature DW 4432h ;D2 %' %'; CTOS Char code ;index/Second Code in ah (al = 0) %' db 0FFh ;00/ %' db 0FFh ;01/ %' db 0FFh ;02/ %' db 0FFh ;03/Nul Character %' db 0FFh ;04/ %' db 0FFh ;05/ %' db 0FFh ;06/ %' db 0FFh ;07/ %' db 0FFh ;08/ %' db 0FFh ;09/ %' db 0FFh ;0A/ %' db 0FFh ;0B/ %' db 0FFh ;0C/ %' db 0FFh ;0D/ %' db 0FFh ;0E/ %' db 089h ;0F/Back-Tab(Code Tab) %' db 0FFh ;10/Alt Q %' db 0FFh ;11/Alt W %' db 0FFh ;12/Alt E %' db 0FFh ;13/Alt R %' db 0FFh ;14/Alt T %' db 0FFh ;15/Alt Y %' db 0FFh ;16/Alt U %' db 0FFh ;17/Alt I %' db 0FFh ;18/Alt O %' db 0FFh ;19/Alt P %' db 0FFh ;1A %' db 0FFh ;1B %' db 0FFh ;1C %' db 0FFh ;1D %' db 0FFh ;1E/Alt A %' db 0FFh ;1F/Alt S %' db 0FFh ;20/Alt D %' db 0FFh ;21/Alt F %' db 0FFh ;22/Alt G %' db 0FFh ;23/Alt H %' db 0FFh ;24/Alt J %' db 0FFh ;25/Alt K %' db 0FFh ;26/Alt L %' db 0FFh ;27 %' db 0FFh ;28 %' db 0FFh ;29 %' db 0FFh ;2A %' db 0FFh ;2B %' db 0FFh ;2C/Alt Z %' db 0FFh ;2D/Alt X %' db 0FFh ;2E/Alt C %' db 0FFh ;2F/Alt V %' db 0FFh ;30/Alt B %' db 0FFh ;31/Alt N %' db 0FFh ;32/Alt M %' db 0FFh ;33 %' db 0FFh ;34 %' db 0FFh ;35 %' db 0FFh ;36 %' db 0FFh ;37 %' db 0FFh ;38 %' db 0FFh ;39 %' db 0FFh ;3A %' db 015h ;3B Alt(divide by sign) f1 %' db 016h ;3C | (vertical bar) f2 %' db 017h ;3D legal section f3 %' db 018h ;3E (not equal sign)=/ f4 %' db 019h ;3F similarity f5 %' db 01Ah ;40 (paragraph sign) f6 %' db 01Ch ;41 not f7 %' db 01Dh ;42 less than or equal f8 %' db 01Eh ;43 not equal straight line f9 %' db 01Fh ;44 greater or equal f10 %' db 0FFh ;45 %' db 0FFh ;46 %' db 013h ;47/Home-> SCROLL-DOWN %' db 001h ;48/Cursor Up-> up arrow up arrow %' db 005h ;49/Page Up-> formfeed PREV PAGE %' db 0FFh ;4A %' db 00Eh ;4B/Cursor Left->left arrow left arrow %' db 0FFh ;4C %' db 012h ;4D/Cursor Right->right arrow right arrow %' db 0FFh ;4E %' db 011h ;4F/End-> (triangle) SCROLL-UP %' db 00Bh ;50/Cursor Down->down arrow down arrow %' db 00Ch ;51/Page Down-> empty square NEXT PAGE %' db 0D0h ;52/Ins-> OverType %' db 07Fh ;53/Del->filled rectangle DELETE %' db 0D5h ;54/F11(Shift-F1) see Table B-2 SHIFT-f1 %' db 0D6h ;55/F12(Shift-F2) see Table B-2 SHIFT-f2 %' db 0D7h ;56/F13(Shift-F3) see Table B-2 SHIFT-f3 %' db 0D8h ;57/F14(Shift-F4) see Table B-2 SHIFT-f4 %' db 0D9h ;58/F15(Shift-F5) see Table B-2 SHIFT-f5 %' db 0DAh ;59/F16(Shift-F6) see Table B-2 SHIFT-f6 %' db 0DCh ;5A/F17(Shift-F7) see Table B-2 SHIFT-f7 %' db 0CDh ;5B/F18(Shift-F8) see Table B-2 SHIFT-f8 %' db 0CAh ;5C/F19(Shift-F9) see Table B-2 SHIFT-f9 %' db 0DFh ;5D/F20(Shift-F10) see Table B-2 SHIFT-f10 %' db 095h ;5E/F21(Ctrl-F1) 9(superscript) CODE-f1 %' db 096h ;5F/F22(Ctrl-F2) 0(subscript) CODE-f2 %' db 097h ;60/F23(Ctrl-F3) 1(subscript) CODE-f3 %' db 098h ;61/F24(Ctrl-F4) 2(subscript) CODE-f4 %' db 099h ;62/F25(Ctrl-F5) 3(subscript) CODE-f5 %' db 09Ah ;63/F26(Ctrl-F6) 4(subscript) CODE-f6 %' db 09Ch ;64/F27(Ctrl-F7) 6(subscript) CODE-f7 %' db 09Dh ;65/F28(Ctrl-F7) (subscript) CODE-f8 %' db 09Eh ;66/F29(Ctrl-F7) (subscript) CODE-f9 %' db 09Fh ;67/F30(Ctrl-F7) (subscript) CODE-f10 %' db 000h ;68/F31(Alt-F1) null HELP %' db 0FFh ;69/F32(Alt-F2) %' db 00Fh ;6A/F33(Alt-F3) MOVE %' db 0FFh ;6B/F34(Alt-F4) %' db 082h ;6C/F35(Alt-F5) (unmark) CODE-MARK %' db 0FCh ;6D/F36(Alt-F6) Next (PC-Mail) %' db 0FFh ;6E/F37(Alt-F7) %' db 0BFh ;6F/F38(Alt-F8) Code-Quote %' db 014h ;70/F39(Alt-F9) COPY %' db 004h ;71/F40(Alt-F10) filled square FINISH %' db 0FFh ;72/Ctrl PrtSc-> %' db 08Eh ;73/Ctrl<- 2 (superscript) CODE-left arrow %' db 092h ;74/Ctrl-> 6 (superscript) CODE-right arrow %' db 08Bh ;75/Ctrl End 1(superscript) CODE-down arrow %' db 091h ;76/Ctrl PgDn-> CODE-SCROLL UP %' db 081h ;77/Ctrl Home CODE-up arrow %' db 0B1h ;78/Alt 1 CODE-1 %' db 0B2h ;79/Alt 2 CODE-2 %' db 0B3h ;7A/Alt 3 CODE-3 %' db 0B4h ;7B/Alt 4 CODE-4 %' db 0B5h ;7C/Alt 5 CODE-5 %' db 0B6h ;7D/Alt 6 CODE-6(see also 1E in kcod) %' db 0B7h ;7E/Alt 7 CODE-7 %' db 0B8h ;7F/Alt 8 CODE-8 %' db 0B9h ;80/Alt 9 CODE-9 %' db 0BAh ;81/Alt 0 CODE-0 %' db 0FFh ;82/Alt - (not numeric pad) %' db 08Ch ;83/Alt = CODE-NEXT-PAGE %' db 093h ;84/Ctrl PgUp-> CODE SCROLL DN %' db 0FFh ;85 Unused %' db 0FFh ;86 Unused %' db 0FFh ;87 Unused %' db 0FFh ;88 Unused %' db 0FFh ;89 Unused %' db 0FFh ;8A Unused %' db 0FFh ;8B Unused %' db 0FFh ;8C Unused %' db 0FFh ;8D Unused %' db 0FFh ;8E Unused %' db 0FFh ;8F Unused %' db 0FFh ;90 Unused %' db 0FFh ;91 Unused %' db 0FFh ;92 Unused %' db 0FFh ;93 Unused %' db 0FFh ;94 Unused %' db 0FFh ;95 Unused %' db 0FFh ;96 Unused %' db 0FFh ;97 Unused %' db 0FFh ;98 Unused %' db 0FFh ;99 Unused %' db 0FFh ;9A Unused %' db 0FFh ;9B Unused %' db 0FFh ;9C Unused %' db 0FFh ;9D Unused %' db 0FFh ;9E Unused %' db 0FFh ;9F Unused %' db 0FFh ;A0 Unused %' db 0FFh ;A1 Unused %' db 0FFh ;A2 Unused %' db 0FFh ;A3 Unused %' db 0FFh ;A4 Unused %' db 0FFh ;A5 Unused %' db 0FFh ;A6 Unused %' db 0FFh ;A7 Unused %' db 0FFh ;A8 Unused %' db 0FFh ;A9 Unused %' db 0FFh ;AA Unused %' db 0FFh ;AB Unused %' db 0FFh ;AC Unused %' db 0FFh ;AD Unused %' db 0FFh ;AE Unused %' db 0FFh ;AF Unused %' db 0FFh ;B0 Unused %' db 0FFh ;B1 Unused %' db 0FFh ;B2 Unused %' db 0FFh ;B3 Unused %' db 0FFh ;B4 Unused %' db 0FFh ;B5 Unused %' db 0FFh ;B6 Unused %' db 0FFh ;B7 Unused %' db 0FFh ;B8 Unused %' db 0FFh ;B9 Unused %' db 0FFh ;BA Unused %' db 0FFh ;BB Unused %' db 0FFh ;BC Unused %' db 0FFh ;BD Unused %' db 0FFh ;BE Unused %' db 0FFh ;BF Unused %' db 0FFh ;C0 Unused %' db 0FFh ;C1 Unused %' db 0FFh ;C2 Unused %' db 0FFh ;C3 Unused %' db 0FFh ;C4 Unused %' db 0FFh ;C5 Unused %' db 0FFh ;C6 Unused %' db 0FFh ;C7 Unused %' db 0FFh ;C8 Unused %' db 0FFh ;C9 Unused %' db 0FFh ;CA Unused %' db 0FFh ;CB Unused %' db 0FFh ;CC Unused %' db 0FFh ;CD Unused %' db 0FFh ;CE Unused %' db 0FFh ;CF Unused %' db 0FFh ;D0 Unused %' db 0FFh ;D1 Unused %' db 0FFh ;D2 Unused %' db 0FFh ;D3 Unused %' db 0FFh ;D4 Unused %' db 0FFh ;D5 Unused %' db 0FFh ;D6 Unused %' db 0FFh ;D7 Unused %' db 0FFh ;D8 Unused %' db 0FFh ;D9 Unused %' db 0FFh ;DA Unused %' db 0FFh ;DB Unused %' db 0FFh ;DC Unused %' db 0FFh ;DD Unused %' db 0FFh ;DE Unused %' db 0FFh ;DF Unused %' db 0FFh ;E0 Unused %' db 0FFh ;E1 Unused %' db 0FFh ;E2 Unused %' db 0FFh ;E3 Unused %' db 0FFh ;E4 Unused %' db 0FFh ;E5 Unused %' db 0FFh ;E6 Unused %' db 0FFh ;E7 Unused %' db 0FFh ;E8 Unused %' db 0FFh ;E9 Unused %' db 0FFh ;EA Unused %' db 0FFh ;EB Unused %' db 0FFh ;EC Unused %' db 0FFh ;ED Unused %' db 0FFh ;EE Unused %' db 0FFh ;EF Unused %' db 0FFh ;F0 Unused %' db 0FFh ;F1 Unused %' db 0FFh ;F2 Unused %' db 0FFh ;F3 Unused %' db 0FFh ;F4 Unused %' db 0FFh ;F5 Unused %' db 0FFh ;F6 Unused %' db 0FFh ;F7 Unused %' db 0FFh ;F8 Unused %' db 0FFh ;F9 Unused %' db 0FFh ;FA Unused %' db 0FFh ;FB Unused %' db 0FFh ;FC Unused %' db 0FFh ;FD Unused %' db 0FFh ;FE Unused %' db 0FFh ;FF Unused %' %')) %'; END SECOND TABLE %' %'; TABLE 20 CTDOS.lib video translation table %'; %'; THIRD CTDOS TABLE; MAP CT CHARACTERS TO THEIR PC EQUIVALENT %'; %'%DefTableData (CtDos_VidTable, 20, %(%' %' %'CtDos_VidTableSignature DW 4433h ;D3 %' %'; %'; (chPC) (keytop) %' db 000h ;0 HELP %' db 001h ;1 UpArrow %' db 002h ;2 MARK %' db 09Bh ;3 Shift-6 () %' db 004h ;4 FINISH %' db 005h ;5 PREV PAGE %' db 0ABh ;6 1/2 %' db 007h ;7 CANCEL %' db 008h ;8 BACKSPACE %' db 009h ;9 TAB %' db 00Ah ;A RETURN %' db 00Bh ;B DownArrow %' db 00Ch ;C NEXT PAGE %' db 00Dh ;D BOUND %' db 00Eh ;E LeftArrow %' db 00Fh ;F MOVE %' db 0ACh ;10 Shift-1/2(1/4) %' db 011h ;11 SCROLL UP %' db 012h ;12 RightArrow %' db 013h ;13 SCROLL DN %' db 014h ;14 COPY %' db 0F6h ;15 F1 () %' db 016h ;16 F2 %' db 017h ;17 F3 %' db 018h ;18 F4 %' db 019h ;19 F5 %' db 01Ah ;1A F6 %' db 01Bh ;1B GO %' db 01Ch ;1C F7 %' db 01Dh ;1D F8 %' db 01Eh ;1E F9 %' db 01Fh ;1F F10 %' db 020h ;20 Space %' db 021h ;21 Shift-1 (!) %' db 022h ;22 Shift-quote Double quote %' db 023h ;23 Shift-3 (#) %' db 024h ;24 Shift-4 ($) %' db 025h ;25 Shift-5 percent %' db 026h ;26 Shift-7 (&) %' db 027h ;27 ' %' db 028h ;28 Shift-9 "(" %' db 029h ;29 Shift-0 ")" %' db 02Ah ;2A Shift-8 (*) %' db 02Bh ;2B Shift-= (+) %' db 02Ch ;2C , %' db 02Dh ;2D - %' db 02Eh ;2E . %' db 02Fh ;2F / %' db 030h ;30 0 %' db 031h ;31 1 %' db 032h ;32 2 %' db 033h ;33 3 %' db 034h ;34 4 %' db 035h ;35 5 %' db 036h ;36 6 %' db 037h ;37 7 %' db 038h ;38 8 %' db 039h ;39 9 %' db 03Ah ;3A Shift-; (:) %' db 03Bh ;3B ; %' db 03Ch ;3C Shift-[ "<" %' db 03Dh ;3D = %' db 03Eh ;3E Shift-] ">" %' db 03Fh ;3F Shift-/ (?) %' db 040h ;40 Shift-2 (@) %' db 041h ;41 Shift-A %' db 042h ;42 Shift-B %' db 043h ;43 Shift-C %' db 044h ;44 Shift-D %' db 045h ;45 Shift-E %' db 046h ;46 Shift-F %' db 047h ;47 Shift-G %' db 048h ;48 Shift-H %' db 049h ;49 Shift-I %' db 04Ah ;4A Shift-J %' db 04Bh ;4B Shift-K %' db 04Ch ;4C Shift-L %' db 04Dh ;4D Shift-M %' db 04Eh ;4E Shift-N %' db 04Fh ;4F Shift-O %' db 050h ;50 Shift-P %' db 051h ;51 Shift-Q %' db 052h ;52 Shift-R %' db 053h ;53 Shift-S %' db 054h ;54 Shift-T %' db 055h ;55 Shift-U %' db 056h ;56 Shift-V %' db 057h ;57 Shift-W %' db 058h ;58 Shift-X %' db 059h ;59 Shift-Y %' db 05Ah ;5A Shift-Z %' db 05Bh ;5B [ %' db 05Ch ;5C Shift-num 8 %' db 05Dh ;5D ] %' db 05Eh ;5E ^ %' db 05Fh ;5F Shift-- "_" %' db 060h ;60 Shift-num 1 %' db 061h ;61 A %' db 062h ;62 B %' db 063h ;63 C %' db 064h ;64 D %' db 065h ;65 E %' db 066h ;66 F %' db 067h ;67 G %' db 068h ;68 H %' db 069h ;69 I %' db 06Ah ;6A J %' db 06Bh ;6B K %' db 06Ch ;6C L %' db 06Dh ;6D M %' db 06Eh ;6E N %' db 06Fh ;6F O %' db 070h ;70 P %' db 071h ;71 Q %' db 072h ;72 R %' db 073h ;73 S %' db 074h ;74 T %' db 075h ;75 U %' db 076h ;76 V %' db 077h ;77 W %' db 078h ;78 X %' db 079h ;79 Y %' db 07Ah ;7A Z %' db 07Bh ;7B Shift-num 4 ({) %' db 07Ch ;7C Shift-num 7 (|) %' db 07DH ;7D Shift-num 5 (}) %' db 07Eh ;7E Shift-^ (~) %' db 07Fh ;7F DELETE %' db 080h ;80 Code-Help %' db 081h ;81 Code-UpArrow %' db 082h ;82 Code-Mark %' db 083h ;83 Code-Shift-6 %' db 084h ;84 Code-Finish %' db 085h ;85 Code-PrevPage %' db 086h ;86 Code-1/2 %' db 087h ;87 Code-Cancel %' db 088h ;88 Code-Backspace %' db 089h ;89 Code-Tab %' db 08Ah ;8A Code-Return %' db 08Bh ;8B Code-DownArrow %' db 08Ch ;8C Code-NextPage %' db 08Dh ;8D Code-Bound %' db 08Eh ;8E Code-LeftArrow %' db 08Fh ;8F Code-Move %' db 090h ;90 Code-Shift-1/2 %' db 091h ;91 Code-ScrollUp %' db 092h ;92 Code-RightArrow %' db 093h ;93 Code-ScrollDown %' db 094h ;94 Code-Copy %' db 095h ;95 Code-F1 %' db 096h ;96 Code-F2 %' db 097h ;97 Code-F3 %' db 098h ;98 Code-F4 %' db 099h ;99 Code-F5 %' db 09Ah ;9A Code-F6 %' db 09Bh ;9B Code-GO %' db 09Ch ;9C Code-F7 %' db 09Dh ;9D Code-F8 %' db 09Eh ;9E Code-F9 %' db 09Fh ;9F Code-F10 %' db 08Fh ;A0 Code-Space %' db 086h ;A1 Code-Shift-1 %' db 08Eh ;A2 Code-Shift-' %' db 084h ;A3 Code-Shift-3 %' db 099h ;A4 Code-Shift-4 %' db 094h ;A5 Code-Shift-5 %' db 0A6h ;A6 Code-Shift-7 %' db 0A7h ;A7 Code-' %' db 09Ah ;A8 Code-Shift-9 %' db 081h ;A9 Code-Shift-0 %' db 087h ;AA Code-Shift-8 %' db 088h ;AB Code-Shift-= %' db 082h ;AC Code-, %' db 08Ah ;AD Code-- %' db 092h ;AE Code-. %' db 091h ;AF Code-/ %' db 0E1h ;B0 Code-0 %' db 09Ch ;B1 Code-1 %' db 0F8h ;B2 Code-2 %' db 0B3h ;B3 Code-3 %' db 0B4h ;B4 Code-4 %' db 0B5h ;B5 Code-5 %' db 0B6h ;B6 Code-6 %' db 0B7h ;B7 Code-7 %' db 0B8h ;B8 Code-8 %' db 0B9h ;B9 Code-9 %' db 0BAh ;BA Code-Shift- %' db 0BBh ;BB Code-; %' db 0BCh ;BC Code-Shift-[ %' db 0BDh ;BD Code-= %' db 0BEh ;BE Code-Shift-] %' db 0BFh ;BF Code-Shift-/ %' db 0C0h ;C0 Shift-Help %' db 0C1h ;C1 Shift-UpArrow %' db 0C2h ;C2 Shift-Mark %' db 0C3h ;C3 Shift-Bound %' db 0C4h ;C4 Shift-Finish %' db 0C5h ;C5 Shift-PrevPage %' db 0C6h ;C6 Code-Shift-F %' db 0C7h ;C7 Shift-Cancel %' db 0C8h ;C8 Shift-Delete %' db 0C9h ;C9 Shift-GO %' db 0CAh ;CA Shift-F9 %' db 0CBh ;CB Shift-DownArrow %' db 0CCh ;CC Shift-NextPage %' db 0CDh ;CD Shift-F8 %' db 0CEh ;CE Shift-LeftArrow %' db 0CFh ;CF Shift-Move %' db 0D0h ;D0 OverType %' db 0D1h ;D1 Shift-ScrollUp %' db 0D2h ;D2 Shift-RightArrow %' db 0D3h ;D3 Shift-ScrollDown %' db 0D4h ;D4 Shift-Copy %' db 0D5h ;D5 Shift-F1 %' db 0D6h ;D6 Shift-F2 %' db 0D7h ;D7 Shift-F3 %' db 0D8h ;D8 Shift-F4 %' db 0D9h ;D9 Shift-F5 %' db 0C4h ;DA Shift-F6 %' db 0DBh ;DB Code-[ %' db 0DCh ;DC Shift-F7 %' db 0DDh ;DD Code-] %' db 0DEh ;DE Code-^ %' db 0DFh ;DF Shift-F10 %' db 0E0h ;E0 Code-Shift-Num1 %' db 0E1h ;E1 Code-A %' db 0E2h ;E2 Code-B %' db 0E3h ;E3 Code-C %' db 0E4h ;E4 Code-D %' db 0E5h ;E5 Code-E %' db 0E6h ;E6 Code-F %' db 0E7h ;E7 Code-G %' db 0E8h ;E8 Code-H %' db 0E9h ;E9 Code-I %' db 0EAh ;EA Code-J %' db 0EBh ;EB Code-K %' db 0ECh ;EC Code-L %' db 0EDh ;ED Code-M %' db 0EEh ;EE Code-N %' db 0DAh ;EF Code-O %' db 0F0h ;F0 Code-P %' db 0F1h ;F1 Code-Q %' db 0F2h ;F2 Code-R %' db 0F3h ;F3 Code-S %' db 0F4h ;F4 Code-T %' db 0F5h ;F5 Code-U %' db 0F6h ;F6 Code-V %' db 0F7h ;F7 Code-W %' db 0F8h ;F8 Code-X %' db 0F9h ;F9 Code-Y %' db 0FAh ;FA Code-Z %' db 0FBh ;FB Code-Shift-C %' db 0FCh ;FC NEXT %' db 0FDh ;FD Code-Shift-Num5 %' db 0FEh ;FE Code-Shift-^ %' db 0FFh ;FF Code-Delete %'; END THIRD TABLE %')) %' %'; %'; TABLE 21 CTDOS.lib keyboard scan codes table %'; %'; FOURTH CTDOS TABLE; MAP SPECIAL PC SCAN-CODE/CHAR COMBINATIONS TO %'; THEIR CT CHARACTER EQUIVALENT. %'; %'; There a number of PC chars which do map to a single CT char. %'; These chars have different meanings depending upon which key was %'; pressed. For example, the hyphen char (-) can mean hyphen or MARK, %'; depending on which PC key was pressed. The only means to distinguish %'; between these keys is to examine the scan-code associated with the %'; key. For these non-unique char mappings we have two parallel arrays %'; preceded by a word which is the length of the arrays. %'; The first array contains words which are the scan-code(hi byte)/char(lo byte) %'; combinations which are to be specially mapped; the second array contains %'; bytes which are the corresponding CT char to be returned when the %'; scan-code/char combination is encountered. %'; %' %'%DefTableData (CtDos_ScanTable, 21, %(%' %' %'CtDos_ScanTableSignature DW 4434h ;D4 %' %'%InitScanCodeTables %' %'%ScanCodeSet(23h,08h,0E8h) %'%ScanCodeSet(00h,08h,0FFh) %'%ScanCodeSet(00h,06h,0FFh) %'%ScanCodeSet(00h,04h,0FFh) %'%ScanCodeSet(00h,02h,0FFh) %'%ScanCodeSet(17h,09h,0E9h) %'%ScanCodeSet(32h,0Dh,0EDh) %'%ScanCodeSet(37h,2Ah, 0Dh) %'%ScanCodeSet(4Ah,2Dh, 02h) %'%ScanCodeSet(4Eh,2Bh,01Bh) %'%ScanCodeSet(16h,15h,0F5h) %' %'%EndScanCodeTables %')) ;**WARNING***WARNING************************************** ;********************************************************* ; TABLE 22 IS FOR SOLUTION DESIGNER ; This table has been commented out to save memory for ; non Solution Designer environments. ; If you are going to use Solution Designer, then you ; must either have the SdNls.sys file present on your ; local disk or you must provide the table in this NLS ; file by uncommenting the following table. To uncomment ; the following table by removing the %' (percent quote) ; characters from the beginning of each line. ; ;********************************************************* ;**END*WARNING******************************************** %'; %'; TABLE 22 %'; This table is used for conversion between the local CTOS character set and %'; the Lotus International Character Set (LICS). Solution Designer worksheets %'; are written using LICS, so that they will be compatible between different %'; local versions of Solution Designer, and with Lotus 1-2-3 (if written with %'; the /File Xtract command). %'; See Appendix 2 of the Lotus 1-2-3 (Version 2.0) Reference Manual for further %'; information on the Lotus International Character Set. %' %'%DefTableData (rgbLotusCharSetXlat, 22, %(%' %' %' ; First half of table converts CTOS to LICS %' ; characters not present in LICS are converted to 99h %' %' DB 0h ; 0h -- DO NOT CHANGE, MUST CONVERT TO 0 %' DB 099h ; 1h %' DB 099h ; 2h %' DB 0A2h ; 3h cent %' DB 099h ; 4h %' DB 099h ; 5h %' DB 0BDh ; 6h one-half %' DB 099h ; 7h %' DB 099h ; 8h %' DB 099h ; 9h %' DB 099h ; 0Ah %' DB 099h ; 0Bh %' DB 099h ; 0Ch %' DB 099h ; 0Dh %' DB 099h ; 0Eh %' DB 099h ; 0Fh %' DB 0BCh ; 10h one-quarter %' DB 099h ; 11h %' DB 099h ; 12h %' DB 099h ; 13h %' DB 09Ah ; 14h %' DB 0AFh ; 15h division %' DB 099h ; 16h %' DB 0A7h ; 17h section %' DB 099h ; 18h %' DB 099h ; 19h %' DB 0B6h ; 1Ah paragraph %' DB 0B7h ; 1Bh filled circle %' DB 099h ; 1Ch %' DB 0BEh ; 1Dh less or equal %' DB 0B1h ; 1Eh plus or minus %' DB 0AEh ; 1Fh greater or equal %' DB 020h ; 20h space %' DB 021h ; 21h ! %' DB 022h ; 22h " %' DB 023h ; 23h # %' DB 024h ; 24h $ %' DB 025h ; 25h percent %' DB 026h ; 26h & %' DB 027h ; 27h ' %' DB 028h ; 28h ( %' DB 029h ; 29h ) %' DB 02Ah ; 2Ah * %' DB 02Bh ; 2Bh + %' DB 02Ch ; 2Ch , %' DB 02Dh ; 2Dh - %' DB 02Eh ; 2Eh . %' DB 02Fh ; 2Fh / %' DB 030h ; 30h 0 %' DB 031h ; 31h 1 %' DB 032h ; 32h 2 %' DB 033h ; 33h 3 %' DB 034h ; 34h 4 %' DB 035h ; 35h 5 %' DB 036h ; 36h 6 %' DB 037h ; 37h 7 %' DB 038h ; 38h 8 %' DB 039h ; 39h 9 %' DB 03Ah ; 3Ah : %' DB 03Bh ; 3Bh ; %' DB 03Ch ; 3Ch < %' DB 03Dh ; 3Dh = %' DB 03Eh ; 3Eh > %' DB 03Fh ; 3Fh ? %' DB 040h ; 40h @ %' DB 041h ; 41h A %' DB 042h ; 42h B %' DB 043h ; 43h C %' DB 044h ; 44h D %' DB 045h ; 45h E %' DB 046h ; 46h F %' DB 047h ; 47h G %' DB 048h ; 48h H %' DB 049h ; 49h I %' DB 04Ah ; 4Ah J %' DB 04Bh ; 4Bh K %' DB 04Ch ; 4Ch L %' DB 04Dh ; 4Dh M %' DB 04Eh ; 4Eh N %' DB 04Fh ; 4Fh O %' DB 050h ; 50h P %' DB 051h ; 51h Q %' DB 052h ; 52h R %' DB 053h ; 53h S %' DB 054h ; 54h T %' DB 055h ; 55h U %' DB 056h ; 56h V %' DB 057h ; 57h W %' DB 058h ; 58h X %' DB 059h ; 59h Y %' DB 05Ah ; 5Ah Z %' DB 05Bh ; 5Bh [ %' DB 05Ch ; 5Ch \ %' DB 05Dh ; 5Dh ] %' DB 05Eh ; 5Eh ^ %' DB 05Fh ; 5Fh _ %' DB 060h ; 60h ` %' DB 061h ; 61h a %' DB 062h ; 62h b %' DB 063h ; 63h c %' DB 064h ; 64h d %' DB 065h ; 65h e %' DB 066h ; 66h f %' DB 067h ; 67h g %' DB 068h ; 68h h %' DB 069h ; 69h i %' DB 06Ah ; 6Ah j %' DB 06Bh ; 6Bh k %' DB 06Ch ; 6Ch l %' DB 06Dh ; 6Dh m %' DB 06Eh ; 6Eh n %' DB 06Fh ; 6Fh o %' DB 070h ; 70h p %' DB 071h ; 71h q %' DB 072h ; 72h r %' DB 073h ; 73h s %' DB 074h ; 74h t %' DB 075h ; 75h u %' DB 076h ; 76h v %' DB 077h ; 77h w %' DB 078h ; 78h x %' DB 079h ; 79h y %' DB 07Ah ; 7Ah z %' DB 07Bh ; 7Bh { %' DB 07Ch ; 7Ch | %' DB 07Dh ; 7Dh } %' DB 07Eh ; 7Eh ~ %' DB 07Fh ; 7Fh filled rectangle %' DB 099h ; 80h %' DB 099h ; 81h %' DB 099h ; 82h %' DB 099h ; 83h %' DB 099h ; 84h %' DB 099h ; 85h %' DB 099h ; 86h %' DB 099h ; 87h %' DB 099h ; 88h %' DB 099h ; 89h %' DB 099h ; 8Ah %' DB 099h ; 8Bh %' DB 099h ; 8Ch superscript 0 %' DB 0B9h ; 8Dh superscript 1 %' DB 0B2h ; 8Eh superscript 2 %' DB 0B3h ; 8Fh superscript 3 %' DB 099h ; 90h superscript 4 %' DB 099h ; 91h superscript 5 %' DB 099h ; 92h superscript 6 %' DB 099h ; 93h superscript 7 %' DB 099h ; 94h superscript 8 %' DB 099h ; 95h superscript 9 %' DB 099h ; 96h subscript 0 %' DB 099h ; 97h subscript 1 %' DB 099h ; 98h subscript 2 %' DB 099h ; 99h subscript 3 %' DB 099h ; 9Ah subscript 4 %' DB 099h ; 9Bh subscript 5 %' DB 099h ; 9Ch subscript 6 %' DB 099h ; 9Dh subscript 7 %' DB 099h ; 9Eh subscript 8 %' DB 099h ; 9Fh subscript 9 %' DB 0C5h ; 0A0h A-circle %' DB 0E5h ; 0A1h a-circle %' DB 0C4h ; 0A2h A-umlaut %' DB 0E4h ; 0A3h a-umlaut %' DB 0D6h ; 0A4h O-umlaut %' DB 0F6h ; 0A5h o-umlaut %' DB 0D8h ; 0A6h O-slash %' DB 0F8h ; 0A7h o-slash %' DB 0DCh ; 0A8h U-umlaut %' DB 0FCh ; 0A9h u-umlaut %' DB 0E7h ; 0AAh c-cedilla %' DB 0EAh ; 0ABh e-circumflex %' DB 0E8h ; 0ACh e-grave %' DB 0E9h ; 0ADh e-acute %' DB 0C6h ; 0AEh AE ligature %' DB 0E6h ; 0AFh ae ligature %' DB 0DFh ; 0B0h lowercase German sharp s %' DB 0A3h ; 0B1h pound %' DB 0B0h ; 0B2h degree %' DB 0A9h ; 0B3h copyright %' DB 099h ; 0B4h registered %' DB 0B8h ; 0B5h trademark %' DB 099h ; 0B6h %' DB 099h ; 0B7h %' DB 099h ; 0B8h %' DB 099h ; 0B9h %' DB 099h ; 0BAh %' DB 099h ; 0BBh %' DB 099h ; 0BCh %' DB 099h ; 0BDh %' DB 099h ; 0BEh %' DB 099h ; 0BFh %' DB 099h ; 0C0h %' DB 099h ; 0C1h %' DB 099h ; 0C2h %' DB 099h ; 0C3h %' DB 099h ; 0C4h %' DB 099h ; 0C5h %' DB 099h ; 0C6h %' DB 099h ; 0C7h %' DB 099h ; 0C8h %' DB 099h ; 0C9h %' DB 099h ; 0CAh %' DB 099h ; 0CBh %' DB 099h ; 0CCh %' DB 099h ; 0CDh %' DB 099h ; 0CEh %' DB 099h ; 0CFh %' DB 099h ; 0D0h %' DB 099h ; 0D1h %' DB 099h ; 0D2h %' DB 099h ; 0D3h %' DB 099h ; 0D4h %' DB 099h ; 0D5h %' DB 099h ; 0D6h %' DB 099h ; 0D7h %' DB 099h ; 0D8h %' DB 099h ; 0D9h %' DB 099h ; 0DAh %' DB 099h ; 0DBh %' DB 099h ; 0DCh %' DB 099h ; 0DDh %' DB 099h ; 0DEh %' DB 099h ; 0DFh %' DB 099h ; 0E0h %' DB 099h ; 0E1h %' DB 099h ; 0E2h %' DB 099h ; 0E3h %' DB 099h ; 0E4h %' DB 099h ; 0E5h %' DB 099h ; 0E6h %' DB 099h ; 0E7h %' DB 099h ; 0E8h %' DB 099h ; 0E9h %' DB 099h ; 0EAh %' DB 099h ; 0EBh %' DB 099h ; 0ECh %' DB 099h ; 0EDh %' DB 099h ; 0EEh %' DB 099h ; 0EFh %' DB 099h ; 0F0h %' DB 099h ; 0F1h %' DB 099h ; 0F2h %' DB 099h ; 0F3h %' DB 099h ; 0F4h %' DB 099h ; 0F5h %' DB 099h ; 0F6h %' DB 099h ; 0F7h %' DB 099h ; 0F8h %' DB 099h ; 0F9h %' DB 099h ; 0FAh %' DB 099h ; 0FBh %' DB 099h ; 0FCh %' DB 099h ; 0FDh %' DB 099h ; 0FEh %' DB 099h ; 0FFh %' %' ; Second half of table converts LICS to CTOS %' ; characters not present in CTOS are converted to 20h %' %' DB 0h ; 0h -- DO NOT CHANGE, MUST CONVERT TO 0 %' DB 020h ; 1h %' DB 020h ; 2h %' DB 020h ; 3h %' DB 020h ; 4h %' DB 020h ; 5h %' DB 020h ; 6h %' DB 020h ; 7h %' DB 020h ; 8h %' DB 020h ; 9h %' DB 020h ; 0Ah %' DB 020h ; 0Bh %' DB 020h ; 0Ch %' DB 020h ; 0Dh %' DB 020h ; 0Eh %' DB 020h ; 0Fh %' DB 020h ; 10h %' DB 020h ; 11h %' DB 020h ; 12h %' DB 020h ; 13h %' DB 020h ; 14h %' DB 020h ; 15h %' DB 020h ; 16h %' DB 020h ; 17h %' DB 020h ; 18h %' DB 020h ; 19h %' DB 020h ; 1Ah %' DB 020h ; 1Bh %' DB 020h ; 1Ch %' DB 020h ; 1Dh %' DB 020h ; 1Eh %' DB 020h ; 1Fh %' DB 020h ; 20h space %' DB 021h ; 21h ! %' DB 022h ; 22h " %' DB 023h ; 23h # %' DB 024h ; 24h $ %' DB 025h ; 25h percent %' DB 026h ; 26h & %' DB 027h ; 27h ' %' DB 028h ; 28h ( %' DB 029h ; 29h ) %' DB 02Ah ; 2Ah * %' DB 02Bh ; 2Bh + %' DB 02Ch ; 2Ch , %' DB 02Dh ; 2Dh - %' DB 02Eh ; 2Eh . %' DB 02Fh ; 2Fh / %' DB 030h ; 30h 0 %' DB 031h ; 31h 1 %' DB 032h ; 32h 2 %' DB 033h ; 33h 3 %' DB 034h ; 34h 4 %' DB 035h ; 35h 5 %' DB 036h ; 36h 6 %' DB 037h ; 37h 7 %' DB 038h ; 38h 8 %' DB 039h ; 39h 9 %' DB 03Ah ; 3Ah : %' DB 03Bh ; 3Bh ; %' DB 03Ch ; 3Ch < %' DB 03Dh ; 3Dh = %' DB 03Eh ; 3Eh > %' DB 03Fh ; 3Fh ? %' DB 040h ; 40h @ %' DB 041h ; 41h A %' DB 042h ; 42h B %' DB 043h ; 43h C %' DB 044h ; 44h D %' DB 045h ; 45h E %' DB 046h ; 46h F %' DB 047h ; 47h G %' DB 048h ; 48h H %' DB 049h ; 49h I %' DB 04Ah ; 4Ah J %' DB 04Bh ; 4Bh K %' DB 04Ch ; 4Ch L %' DB 04Dh ; 4Dh M %' DB 04Eh ; 4Eh N %' DB 04Fh ; 4Fh O %' DB 050h ; 50h P %' DB 051h ; 51h Q %' DB 052h ; 52h R %' DB 053h ; 53h S %' DB 054h ; 54h T %' DB 055h ; 55h U %' DB 056h ; 56h V %' DB 057h ; 57h W %' DB 058h ; 58h X %' DB 059h ; 59h Y %' DB 05Ah ; 5Ah Z %' DB 05Bh ; 5Bh [ %' DB 05Ch ; 5Ch \ %' DB 05Dh ; 5Dh ] %' DB 05Eh ; 5Eh ^ %' DB 05Fh ; 5Fh _ %' DB 060h ; 60h ` %' DB 061h ; 61h a %' DB 062h ; 62h b %' DB 063h ; 63h c %' DB 064h ; 64h d %' DB 065h ; 65h e %' DB 066h ; 66h f %' DB 067h ; 67h g %' DB 068h ; 68h h %' DB 069h ; 69h i %' DB 06Ah ; 6Ah j %' DB 06Bh ; 6Bh k %' DB 06Ch ; 6Ch l %' DB 06Dh ; 6Dh m %' DB 06Eh ; 6Eh n %' DB 06Fh ; 6Fh o %' DB 070h ; 70h p %' DB 071h ; 71h q %' DB 072h ; 72h r %' DB 073h ; 73h s %' DB 074h ; 74h t %' DB 075h ; 75h u %' DB 076h ; 76h v %' DB 077h ; 77h w %' DB 078h ; 78h x %' DB 079h ; 79h y %' DB 07Ah ; 7Ah z %' DB 07Bh ; 7Bh { %' DB 07Ch ; 7Ch | %' DB 07Dh ; 7Dh } %' DB 07Eh ; 7Eh ~ %' DB 07Fh ; 7Fh %' DB 020h ; 80h uppercase grave %' DB 020h ; 81h uppercase acute %' DB 020h ; 82h uppercase circumflex %' DB 020h ; 83h uppercase umlaut %' DB 020h ; 84h uppercase tilde %' DB 020h ; 85h %' DB 020h ; 86h %' DB 020h ; 87h %' DB 020h ; 88h %' DB 020h ; 89h %' DB 020h ; 8Ah %' DB 020h ; 8Bh %' DB 020h ; 8Ch %' DB 020h ; 8Dh %' DB 020h ; 8Eh %' DB 020h ; 8Fh %' DB 020h ; 90h lowercase grave %' DB 020h ; 91h lowercase acute %' DB 020h ; 92h lowercase circumflex %' DB 020h ; 93h lowercase umlaut %' DB 020h ; 94h lowercase tilde %' DB 020h ; 95h lowercase i without dot %' DB 020h ; 96h ordinal indicator %' DB 020h ; 97h %' DB 020h ; 98h %' DB 004h ; 99h filled square %' DB 014h ; 9Ah hard space %' DB 020h ; 9Bh %' DB 020h ; 9Ch %' DB 020h ; 9Dh %' DB 020h ; 9Eh %' DB 020h ; 9Fh %' DB 020h ; 0A0h Dutch guilder %' DB 020h ; 0A1h inverted exclamation %' DB 003h ; 0A2h cent %' DB 0B1h ; 0A3h pound %' DB 020h ; 0A4h %' DB 020h ; 0A5h yen %' DB 020h ; 0A6h pesetas %' DB 017h ; 0A7h section %' DB 020h ; 0A8h %' DB 0B3h ; 0A9h copyright %' DB 020h ; 0AAh %' DB 020h ; 0ABh %' DB 020h ; 0ACh delta %' DB 020h ; 0ADh pi %' DB 01Fh ; 0AEh greater or equal %' DB 015h ; 0AFh division %' DB 0B2h ; 0B0h degree %' DB 01Eh ; 0B1h plus or minus %' DB 08Eh ; 0B2h superscript 2 %' DB 08Fh ; 0B3h superscript 3 %' DB 020h ; 0B4h %' DB 020h ; 0B5h %' DB 01Ah ; 0B6h paragraph %' DB 01Bh ; 0B7h middle dot %' DB 0B5h ; 0B8h trademark %' DB 08Dh ; 0B9h superscript 1 %' DB 020h ; 0BAh %' DB 020h ; 0BBh %' DB 010h ; 0BCh one-quarter %' DB 006h ; 0BDh one-half %' DB 01Dh ; 0BEh less or equal %' DB 020h ; 0BFh inverted question %' DB 020h ; 0C0h A-grave %' DB 020h ; 0C1h A-acute %' DB 020h ; 0C2h A-circumflex %' DB 020h ; 0C3h A-tilde %' DB 0A2h ; 0C4h A-umlaut %' DB 0A0h ; 0C5h A-circle %' DB 0AEh ; 0C6h AE ligature %' DB 020h ; 0C7h C-cedilla %' DB 020h ; 0C8h E-grave %' DB 020h ; 0C9h E-acute %' DB 020h ; 0CAh E-circumflex %' DB 020h ; 0CBh E-umlaut %' DB 020h ; 0CCh I-grave %' DB 020h ; 0CDh I-acute %' DB 020h ; 0CEh I-circumflex %' DB 020h ; 0CFh I-umlaut %' DB 020h ; 0D0h uppercase Icelandic eth %' DB 020h ; 0D1h N-tilde %' DB 020h ; 0D2h O-grave %' DB 020h ; 0D3h O-acute %' DB 020h ; 0D4h O-circumflex %' DB 020h ; 0D5h O-tilde %' DB 0A4h ; 0D6h O-umlaut %' DB 020h ; 0D7h OE diphthong %' DB 0A6h ; 0D8h O-slash %' DB 020h ; 0D9h U-grave %' DB 020h ; 0DAh U-acute %' DB 020h ; 0DBh U-circumflex %' DB 0A8h ; 0DCh U-umlaut %' DB 020h ; 0DDh Y-umlaut %' DB 020h ; 0DEh uppercase Icelandic thorn %' DB 0B0h ; 0DFh lowercase German sharp s %' DB 020h ; 0E0h a-grave %' DB 020h ; 0E1h a-acute %' DB 020h ; 0E2h a-circumflex %' DB 020h ; 0E3h a-tilde %' DB 0A3h ; 0E4h a-umlaut %' DB 0A1h ; 0E5h a-circle %' DB 0AFh ; 0E6h ae ligature %' DB 0AAh ; 0E7h c-cedilla %' DB 0ACh ; 0E8h e-grave %' DB 0ADh ; 0E9h e-acute %' DB 0ABh ; 0EAh e-circumflex %' DB 020h ; 0EBh e-umlaut %' DB 020h ; 0ECh i-grave %' DB 020h ; 0EDh i-acute %' DB 020h ; 0EEh i-circumflex %' DB 020h ; 0EFh i-umlaut %' DB 020h ; 0F0h lowercase Icelandic eth %' DB 020h ; 0F1h n-tilde %' DB 020h ; 0F2h o-grave %' DB 020h ; 0F3h o-acute %' DB 020h ; 0F4h o-circumflex %' DB 020h ; 0F5h o-tilde %' DB 0A5h ; 0F6h o-umlaut %' DB 020h ; 0F7h oe diphthong %' DB 0A7h ; 0F8h o-slash %' DB 020h ; 0F9h u-grave %' DB 020h ; 0FAh u-acute %' DB 020h ; 0FBh u-circumflex %' DB 0A9h ; 0FCh u-umlaut %' DB 020h ; 0FDh y-umlaut %' DB 020h ; 0FEh lowercase Icelandic thorn %' DB 020h ; 0FFh %')) ; END OF TABLE 22 ;**WARNING***WARNING************************************** ;********************************************************* ; TABLE 23 IS FOR CONTEXT MANAGER VM ; This table has been commented out to save memory for ; non Context Manager VM environments. ; If you are going to use the Cut and Paste feature of ; Context Manager VM, then you ; must either have the CmNls.sys file present on your ; local disk or you must provide the table in this NLS ; file by uncommenting the following table. To uncomment ; the following table by removing the %' (percent quote) ; characters from the beginning of each line. ; ;********************************************************* ;**END*WARNING******************************************** ; ; TABLE 23 ; This table is used for converting characters to their ; unencoded mode key equivalents. ; %DefTableData (UnencodedKeysTable, 23, %(%' UnencodedKeysSignature DW 'UK' %InitUnencodedKeys %SetUnencodedKey(00h) (20h,0A0h) %' 000 help %SetUnencodedKey(01h) (20h,0A0h) %' 001 up-arrow %SetUnencodedKey(02h) (20h,0A0h) %' 002 mark %SetUnencodedKey(03h) (48h,36h,0B6h,0C8h) %' 003 cent sign %SetUnencodedKey(04h) (20h,0A0h) %' 004 finish %SetUnencodedKey(05h) (20h,0A0h) %' 005 prev page %SetUnencodedKey(06h) (06h,086h) %' 006 1/2-1/4 %SetUnencodedKey(07h) (20h,0A0h) %' 007 cancel %SetUnencodedKey(08h) (08h,88h) %' 008 backspace %SetUnencodedKey(09h) (09h,89h) %' 009 tab %SetUnencodedKey(0Ah) (048h,0Ah,8Ah,0C8h) %' 00A return %SetUnencodedKey(0Bh) (0Ah,8Ah) %' 00B down-arrow/ 0C8hed return in unencoded %SetUnencodedKey(0Ch) (0Ch,8Ch) %' 00C next page %SetUnencodedKey(0Dh) (0Dh,8Dh) %' 00D next %SetUnencodedKey(0Eh) (0Eh,8Eh) %' 00E left-arrow %SetUnencodedKey(0Fh) (20h,0A0h) %' 00F move ; %SetUnencodedKey(10h) (048h,06h,86h,0C8h) %' 010 (SH-one half) %SetUnencodedKey(11h) (20h,0A0h) %' 011 scroll-up %SetUnencodedKey(12h) (0Fh,8Fh) %' 012 right-arrow %SetUnencodedKey(13h) (20h,0A0h) %' 013 scroll-down %SetUnencodedKey(14h) (20h,0A0h) %' 014 copy %SetUnencodedKey(15h) (20h,0A0h) %' 015 divide sign %SetUnencodedKey(16h) (048h,5Ch,0DCh,0C8h) %' 016 | %SetUnencodedKey(17h) (20h,0A0h) %' 017 f3 %SetUnencodedKey(18h) (20h,0A0h) %' 018 f4 %SetUnencodedKey(19h) (20h,0A0h) %' 019 f5 %SetUnencodedKey(1Ah) (20h,0A0h) %' 01A f6 %SetUnencodedKey(1Bh) (20h,0A0h) %' 01B GO %SetUnencodedKey(1Ch) (20h,0A0h) %' 01C f7 %SetUnencodedKey(1Dh) (20h,0A0h) %' 01D f8 %SetUnencodedKey(1Eh) (20h,0A0h) %' 01E f9 %SetUnencodedKey(1Fh) (20h,0A0h) %' 01F f10 ; %SetUnencodedKey(20h) (20h,0A0h) %' 020 space %SetUnencodedKey(21h) (048h,31h,0B1h,0C8h) %' 021 ! %SetUnencodedKey(22h) (048h,27h,0A7h,0C8h) %' 022 " %SetUnencodedKey(23h) (048h,33h,0B3h,0C8h) %' 023 # %SetUnencodedKey(24h) (048h,34h,0B4h,0C8h) %' 024 $ %SetUnencodedKey(25h) (048h,35h,0B5h,0C8h) %' 025 percent %SetUnencodedKey(26h) (048h,37h,0B7h,0C8h) %' 026 & %SetUnencodedKey(27h) (27h,0A7h) %' 027 ' %SetUnencodedKey(28h) (048h,39h,0B9h,0C8h) %' 028 ( %SetUnencodedKey(29h) (048h,30h,0B0h,0C8h) %' 029 ) %SetUnencodedKey(2Ah) (048h,38h,0B8h,0C8h) %' 02A * %SetUnencodedKey(2Bh) (048h,2Bh,0ABh,0C8h) %' 02B + %SetUnencodedKey(2Ch) (2Ch,0ACh) %' 02C , %SetUnencodedKey(2Dh) (2Dh,0ADh) %' 02D - %SetUnencodedKey(2Eh) (2Eh,0AEh) %' 02E . %SetUnencodedKey(2Fh) (2Fh,0AFh) %' 02F / ; %SetUnencodedKey(30h) (30h,0B0h) %' 030 0 %SetUnencodedKey(31h) (31h,0B1h) %' 031 1 %SetUnencodedKey(32h) (32h,0B2h) %' 032 2 %SetUnencodedKey(33h) (33h,0B3h) %' 033 3 %SetUnencodedKey(34h) (34h,0B4h) %' 034 4 %SetUnencodedKey(35h) (35h,0B5h) %' 035 5 %SetUnencodedKey(36h) (36h,0B6h) %' 036 6 %SetUnencodedKey(37h) (37h,0B7h) %' 037 7 %SetUnencodedKey(38h) (38h,0B8h) %' 038 8 %SetUnencodedKey(39h) (39h,0B9h) %' 039 9 %SetUnencodedKey(3Ah) (048h,3Bh,0BBh,0C8h) %' 03A : %SetUnencodedKey(3Bh) (3Bh,0BBh) %' 03B %SetUnencodedKey(3Ch) (048h,5Bh,0DBh,0C8h) %' 03C < %SetUnencodedKey(3Dh) (2Bh,0ABh) %' 03D = %SetUnencodedKey(3Eh) (048h,5Dh,0DDh,0C8h) %' 03E > %SetUnencodedKey(3Fh) (048h,2Fh,0AFh,0C8h) %' 03F ? ; %SetUnencodedKey(40h) (048h,32h,0B2h,0C8h) %' 040 @ %SetUnencodedKey(41h) (048h,61h,0E1h,0C8h) %' 041 A %SetUnencodedKey(42h) (048h,62h,0E2h,0C8h) %' 042 B %SetUnencodedKey(43h) (048h,63h,0E3h,0C8h) %' 043 C %SetUnencodedKey(44h) (048h,64h,0E4h,0C8h) %' 044 D %SetUnencodedKey(45h) (048h,65h,0E5h,0C8h) %' 045 E %SetUnencodedKey(46h) (048h,66h,0E6h,0C8h) %' 046 F %SetUnencodedKey(47h) (048h,67h,0E7h,0C8h) %' 047 G %SetUnencodedKey(48h) (048h,68h,0E8h,0C8h) %' 048 H %SetUnencodedKey(49h) (048h,69h,0E9h,0C8h) %' 049 I %SetUnencodedKey(4Ah) (048h,6Ah,0EAh,0C8h) %' 04A J %SetUnencodedKey(4Bh) (048h,6Bh,0EBh,0C8h) %' 04B K %SetUnencodedKey(4Ch) (048h,6Ch,0ECh,0C8h) %' 04C L %SetUnencodedKey(4Dh) (048h,6Dh,0EDh,0C8h) %' 04D M %SetUnencodedKey(4Eh) (048h,6Eh,0EEh,0C8h) %' 04E N %SetUnencodedKey(4Fh) (048h,6Fh,0EFh,0C8h) %' 04F O ; %SetUnencodedKey(50h) (048h,70h,0F0h,0C8h) %' 050 P %SetUnencodedKey(51h) (048h,71h,0F1h,0C8h) %' 051 Q %SetUnencodedKey(52h) (048h,72h,0F2h,0C8h) %' 052 R %SetUnencodedKey(53h) (048h,73h,0F3h,0C8h) %' 053 S %SetUnencodedKey(54h) (048h,74h,0F4h,0C8h) %' 054 T %SetUnencodedKey(55h) (048h,75h,0F5h,0C8h) %' 055 U %SetUnencodedKey(56h) (048h,76h,0F6h,0C8h) %' 056 V %SetUnencodedKey(57h) (048h,77h,0F7h,0C8h) %' 057 W %SetUnencodedKey(58h) (048h,78h,0F8h,0C8h) %' 058 X %SetUnencodedKey(59h) (048h,79h,0F9h,0C8h) %' 059 Y %SetUnencodedKey(5Ah) (048h,7Ah,0FAh,0C8h) %' 05A Z %SetUnencodedKey(5Bh) (5Bh,0DBh) %' 05B [ %SetUnencodedKey(5Ch) (048h,7Ch,0FCh,0C8h) %' 05C \ %SetUnencodedKey(5Dh) (5Dh,0DDh) %' 05D ] %SetUnencodedKey(5Eh) (5Eh,0DEh) %' 05E ^ %SetUnencodedKey(5Fh) (048h,2Dh,0ADh,0C8h) %' 05F _ ; %SetUnencodedKey(60h) (048h,60h,0E0h,0C8h) %' 060 ` %SetUnencodedKey(61h) (61h,0E1h) %' 061 a %SetUnencodedKey(62h) (62h,0E2h) %' 062 b %SetUnencodedKey(63h) (63h,0E3h) %' 063 c %SetUnencodedKey(64h) (64h,0E4h) %' 064 d %SetUnencodedKey(65h) (65h,0E5h) %' 065 e %SetUnencodedKey(66h) (66h,0E6h) %' 066 f %SetUnencodedKey(67h) (67h,0E7h) %' 067 g %SetUnencodedKey(68h) (68h,0E8h) %' 068 h %SetUnencodedKey(69h) (69h,0E9h) %' 069 i %SetUnencodedKey(6Ah) (6Ah,0EAh) %' 06A j %SetUnencodedKey(6Bh) (6Bh,0EBh) %' 06B k %SetUnencodedKey(6Ch) (6Ch,0ECh) %' 06C l %SetUnencodedKey(6Dh) (6Dh,0EDh) %' 06D m %SetUnencodedKey(6Eh) (6Eh,0EEh) %' 06E n %SetUnencodedKey(6Fh) (6Fh,0EFh) %' 06F o ; %SetUnencodedKey(70h) (70h,0F0h) %' 070 p %SetUnencodedKey(71h) (71h,0F1h) %' 071 q %SetUnencodedKey(72h) (72h,0F2h) %' 072 r %SetUnencodedKey(73h) (73h,0F3h) %' 073 s %SetUnencodedKey(74h) (74h,0F4h) %' 074 t %SetUnencodedKey(75h) (75h,0F5h) %' 075 u %SetUnencodedKey(76h) (76h,0F6h) %' 076 v %SetUnencodedKey(77h) (77h,0F7h) %' 077 w %SetUnencodedKey(78h) (78h,0F8h) %' 078 x %SetUnencodedKey(79h) (79h,0F9h) %' 079 y %SetUnencodedKey(7Ah) (7Ah,0FAh) %' 07A z %SetUnencodedKey(7Bh) (048h,7Bh,0FBh,0C8h) %' 07B { %SetUnencodedKey(7Ch) (048h,5Ch,0DCh,0C8h) %' 07C | %SetUnencodedKey(7Dh) (048h,7Dh,0FDh,0C8h) %' 07D } %SetUnencodedKey(7Eh) (048h,5Eh,0DEh,0C8h) %' 07E ~ %SetUnencodedKey(7Fh) (20h,0A0h) %' 07F ; %SetUnencodedKey(80h) (20h,0A0h) %' 080 help %SetUnencodedKey(81h) (20h,0A0h) %' 081 up-arrow %SetUnencodedKey(82h) (20h,0A0h) %' 082 mark %SetUnencodedKey(83h) (20h,0A0h) %' 083 048h-6 %SetUnencodedKey(84h) (20h,0A0h) %' 084 finish %SetUnencodedKey(85h) (20h,0A0h) %' 085 prev page %SetUnencodedKey(86h) (20h,0A0h) %' 086 1/2-1/4 %SetUnencodedKey(87h) (20h,0A0h) %' 087 cancel %SetUnencodedKey(88h) (08h,88h) %' 088 backspace %SetUnencodedKey(89h) (09h,89h) %' 089 tab %SetUnencodedKey(8Ah) (048h,0Ah,8Ah,0C8h) %' 08A return %SetUnencodedKey(8Bh) (0Ah,8Ah) %' 08B down-arrow/ 0C8hed return in unencoded %SetUnencodedKey(8Ch) (0Ch,8Ch) %' 08C next page %SetUnencodedKey(8Dh) (0Dh,8Dh) %' 08D next %SetUnencodedKey(8Eh) (0Eh,8Eh) %' 08E left-arrow %SetUnencodedKey(8Fh) (20h,0A0h) %' 08F move %SetUnencodedKey(90h) (048h,06h,0C8h,86h) %' 090 (SH-one half) ; %SetUnencodedKey(91h) (20h,0A0h) %' 091 scroll-up %SetUnencodedKey(92h) (0Fh,8Fh) %' 092 right-arrow %SetUnencodedKey(93h) (20h,0A0h) %' 093 scroll-down %SetUnencodedKey(94h) (20h,0A0h) %' 094 copy %SetUnencodedKey(95h) (20h,0A0h) %' 095 divide sign %SetUnencodedKey(96h) (048h,5Ch,0DCh,0C8h) %' 096 | %SetUnencodedKey(97h) (20h,0A0h) %' 097 f3 %SetUnencodedKey(98h) (20h,0A0h) %' 098 f4 %SetUnencodedKey(99h) (20h,0A0h) %' 099 f5 %SetUnencodedKey(9Ah) (20h,0A0h) %' 09A f6 %SetUnencodedKey(9Bh) (20h,0A0h) %' 09B GO %SetUnencodedKey(9Ch) (20h,0A0h) %' 09C f7 %SetUnencodedKey(9Dh) (20h,0A0h) %' 09D f8 %SetUnencodedKey(9Eh) (20h,0A0h) %' 09E f9 %SetUnencodedKey(9Fh) (20h,0A0h) %' 09F f10 ; %SetUnencodedKey(0A0h) (20h,0A0h) %' 0A0 space %SetUnencodedKey(0A1h) (048h,31h,0B1h,0C8h) %' 0A1 ! %SetUnencodedKey(0A2h) (048h,27h,0A7h,0C8h) %' 0A2 " %SetUnencodedKey(0A3h) (048h,33h,0B3h,0C8h) %' 0A3 # %SetUnencodedKey(0A4h) (048h,34h,0B4h,0C8h) %' 0A4 $ %SetUnencodedKey(0A5h) (048h,35h,0B5h,0C8h) %' 0A5 percent %SetUnencodedKey(0A6h) (048h,37h,0B7h,0C8h) %' 0A6 & %SetUnencodedKey(0A7h) (27h,0A7h) %' 0A7 ' %SetUnencodedKey(0A8h) (048h,39h,0B9h,0C8h) %' 0A8 ( %SetUnencodedKey(0A9h) (048h,30h,0B0h,0C8h) %' 0A9 ) %SetUnencodedKey(0AAh) (048h,38h,0B8h,0C8h) %' 0AA * %SetUnencodedKey(0ABh) (048h,2Bh,0ABh,0C8h) %' 0AB + %SetUnencodedKey(0ACh) (2Ch,0ACh) %' 0AC , %SetUnencodedKey(0ADh) (2Dh,0ADh) %' 0AD - %SetUnencodedKey(0AEh) (2Eh,0AEh) %' 0AE . %SetUnencodedKey(0AFh) (2Fh,0AFh) %' 0AF / ; %SetUnencodedKey(0B0h) (30h,0B0h) %' 0B0 0 %SetUnencodedKey(0B1h) (31h,0B1h) %' 0B1 1 %SetUnencodedKey(0B2h) (32h,0B2h) %' 0B2 2 %SetUnencodedKey(0B3h) (33h,0B3h) %' 0B3 3 %SetUnencodedKey(0B4h) (34h,0B4h) %' 0B4 4 %SetUnencodedKey(0B5h) (35h,0B5h) %' 0B5 5 %SetUnencodedKey(0B6h) (36h,0B6h) %' 0B6 6 %SetUnencodedKey(0B7h) (37h,0B7h) %' 0B7 7 %SetUnencodedKey(0B8h) (38h,0B8h) %' 0B8 8 %SetUnencodedKey(0B9h) (39h,0B9h) %' 0B9 9 %SetUnencodedKey(0BAh) (048h,3Bh,0BBh,0C8h) %' 0BA : %SetUnencodedKey(0BBh) (3Bh,0BBh) %' 0BB %' %SetUnencodedKey(0BCh) (048h,5Bh,0DBh,0C8h) %' 0BC < %SetUnencodedKey(0BDh) (2Bh,0ABh) %' 0BD = %SetUnencodedKey(0BEh) (048h,5Dh,0DDh,0C8h) %' 0BE > %SetUnencodedKey(0BFh) (048h,2Fh,0AFh,0C8h) %' 0BF ? ; %SetUnencodedKey(0C0h) (048h,32h,0B2h,0C8h) %' 0C0 @ %SetUnencodedKey(0C1h) (048h,61h,0E1h,0C8h) %' 0C1 A %SetUnencodedKey(0C2h) (048h,62h,0E2h,0C8h) %' 0C2 B %SetUnencodedKey(0C3h) (048h,63h,0E3h,0C8h) %' 0C3 C %SetUnencodedKey(0C4h) (048h,64h,0E4h,0C8h) %' 0C4 D %SetUnencodedKey(0C5h) (048h,65h,0E5h,0C8h) %' 0C5 E %SetUnencodedKey(0C6h) (048h,66h,0E6h,0C8h) %' 0C6 F %SetUnencodedKey(0C7h) (048h,67h,0E7h,0C8h) %' 0C7 G %SetUnencodedKey(0C8h) (048h,68h,0E8h,0C8h) %' 0C8 H %SetUnencodedKey(0C9h) (048h,69h,0E9h,0C8h) %' 0C9 I %SetUnencodedKey(0CAh) (048h,6Ah,0EAh,0C8h) %' 0CA J %SetUnencodedKey(0CBh) (048h,6Bh,0EBh,0C8h) %' 0CB K %SetUnencodedKey(0CCh) (048h,6Ch,0ECh,0C8h) %' 0CC L %SetUnencodedKey(0CDh) (048h,6Dh,0EDh,0C8h) %' 0CD M %SetUnencodedKey(0CEh) (048h,6Eh,0EEh,0C8h) %' 0CE N %SetUnencodedKey(0CFh) (048h,6Fh,0EFh,0C8h) %' 0CF O ; %SetUnencodedKey(0D0h) (048h,70h,0F0h,0C8h) %' 0D0 P %SetUnencodedKey(0D1h) (048h,71h,0F1h,0C8h) %' 0D1 Q %SetUnencodedKey(0D2h) (048h,72h,0F2h,0C8h) %' 0D2 R %SetUnencodedKey(0D3h) (048h,73h,0F3h,0C8h) %' 0D3 S %SetUnencodedKey(0D4h) (048h,74h,0F4h,0C8h) %' 0D4 T %SetUnencodedKey(0D5h) (048h,75h,0F5h,0C8h) %' 0D5 U %SetUnencodedKey(0D6h) (048h,76h,0F6h,0C8h) %' 0D6 V %SetUnencodedKey(0D7h) (048h,77h,0F7h,0C8h) %' 0D7 W %SetUnencodedKey(0D8h) (048h,78h,0F8h,0C8h) %' 0D8 X %SetUnencodedKey(0D9h) (048h,79h,0F9h,0C8h) %' 0D9 Y %SetUnencodedKey(0DAh) (048h,7Ah,0FAh,0C8h) %' 0DA Z %SetUnencodedKey(0DBh) (5Bh,0DBh) %' 0DB [ %SetUnencodedKey(0DCh) (048h,7Ch,0FCh,0C8h) %' 0DC \ %SetUnencodedKey(0DDh) (5Dh,0DDh) %' 0DD ] %SetUnencodedKey(0DEh) (5Eh,0Deh) %' 0DE ^ %SetUnencodedKey(0DFh) (048h,2Dh,0ADh,0C8h) %' 0DF _ ; %SetUnencodedKey(0E0h) (048h,60h,0E0h,0C8h) %' 0E0 ` %SetUnencodedKey(0E1h) (61h,0E1h) %' 0E1 a %SetUnencodedKey(0E2h) (62h,0E2h) %' 0E2 b %SetUnencodedKey(0E3h) (63h,0E3h) %' 0E3 c %SetUnencodedKey(0E4h) (64h,0E4h) %' 0E4 d %SetUnencodedKey(0E5h) (65h,0E5h) %' 0E5 e %SetUnencodedKey(0E6h) (66h,0E6h) %' 0E6 f %SetUnencodedKey(0E7h) (67h,0E7h) %' 0E7 g %SetUnencodedKey(0E8h) (68h,0E8h) %' 0E8 h %SetUnencodedKey(0E9h) (69h,0E9h) %' 0E9 i %SetUnencodedKey(0EAh) (6Ah,0EAh) %' 0EA j %SetUnencodedKey(0EBh) (6Bh,0EBh) %' 0EB k %SetUnencodedKey(0ECh) (6Ch,0ECh) %' 0EC l %SetUnencodedKey(0EDh) (6Dh,0EDh) %' 0ED m %SetUnencodedKey(0EEh) (6Eh,0EEh) %' 0EE n %SetUnencodedKey(0EFh) (6Fh,0EFh) %' 0EF o ; %SetUnencodedKey(0F0h) (70h,0F0h) %' 0F0 p %SetUnencodedKey(0F1h) (71h,0F1h) %' 0F1 q %SetUnencodedKey(0F2h) (72h,0F2h) %' 0F2 r %SetUnencodedKey(0F3h) (73h,0F3h) %' 0F3 s %SetUnencodedKey(0F4h) (74h,0F4h) %' 0F4 t %SetUnencodedKey(0F5h) (75h,0F5h) %' 0F5 u %SetUnencodedKey(0F6h) (76h,0F6h) %' 0F6 v %SetUnencodedKey(0F7h) (77h,0F7h) %' 0F7 w %SetUnencodedKey(0F8h) (78h,0F8h) %' 0F8 x %SetUnencodedKey(0F9h) (79h,0F9h) %' 0F9 y %SetUnencodedKey(0FAh) (7Ah,0FAh) %' 0FA z %SetUnencodedKey(0FBh) (048h,7Bh,0FBh,0C8h) %' 0FB { %SetUnencodedKey(0FCh) (048h,5Ch,0DCh,0C8h) %' 0FC | %SetUnencodedKey(0FDh) (048h,7Dh,0FDh,0C8h) %' 0FD } %SetUnencodedKey(0FEh) (048h,5Eh,0DEh,0C8h) %' 0FE ~ %SetUnencodedKey(0FFh) (20h,0A0h) %' 0FF %' %EndUnencodedKeys )) ; END OF TABLE 23 ;********************************************************* ; TABLE 24 IS FOR ASIAN GENGO DATE/TIME SUPPORT ; If you use the "g" escape for date/time templates then ; you must configure the Gengo year information below. ; Gengo format is used by Asian countries that wish to ; list the year starting from a different date than ANNO DOMINI. ; For example, in Japan, the year is often displayed according ; to the beginning of the emperors reign. The current era in ; Japan is the HEISEI era, which started in 1989. The year ; 1990 AD is equivalent to HEISEI 2. ; The tables below allow the setting of: ; 1. the ERA string ; 2. the ERA abbreviation string (short form) ; 3. date of the first day of the ERA ; 4. the string to be substituted for year one (if any) ; ; Please supply these 4 pieces of information for each ERA below. ; You may configure up to 5 ERAs only. ; ;********************************************************* ; ; TABLE 24 ; %DefTableData (GengoYear, 24, %(%' GengoYearSignature DW 'GY' %InitEra ;SetEra(era string) (era abbreviation) (day, month, year) (year 1 string) %SetEra(HEISEI) (H) (8,1,1989) (GAN) ;HEISEI era, start date= Jan 8, 1989 %SetEra(SHOWA) (S) (1,1,1926) (GAN) ;SHOWA era, start date=Jan 1, 1926 %EndEra )) ; END OF TABLE 24 ;Table Number 25 is reserved for XVT. ; m16 ... ;********************************************************* ; m01 ; ;TABLE 26 ; ; Table 26 defines the extended ASCII portion of the CT character set (ie. ; 80h - FFh). The purpose of this table is to provide a single place ; where the line drawing characters used in a program can be obtained. ; The reason for this need is for such languages such as Greek where the ; number of line drawing characters has been not only reduced but also ; the character code values have been changed. ; %*Define(Quad(q)) ( DW %q DW 0 ) %DefTableData (LineDrawingCharacters, 26, %(%' LineDrawingCharactersSignature DW 'ND' CharacterWidth DB 1 %Quad(080h) %Quad(081h) %Quad(082h) %Quad(083h) %Quad(084h) %Quad(085h) %Quad(086h) %Quad(087h) %Quad(088h) %Quad(089h) %Quad(08Ah) %Quad(08Bh) %Quad(08Ch) %Quad(08Dh) %Quad(08Eh) %Quad(08Fh) %Quad(090h) %Quad(091h) %Quad(092h) %Quad(093h) %Quad(094h) %Quad(095h) %Quad(096h) %Quad(097h) %Quad(098h) %Quad(099h) %Quad(09Ah) %Quad(09Bh) %Quad(09Ch) %Quad(09Dh) %Quad(09Eh) %Quad(09Fh) %Quad(0A0h) %Quad(0A1h) %Quad(0A2h) %Quad(0A3h) %Quad(0A4h) %Quad(0A5h) %Quad(0A6h) %Quad(0A7h) %Quad(0A8h) %Quad(0A9h) %Quad(0AAh) %Quad(0ABh) %Quad(0ACh) %Quad(0ADh) %Quad(0AEh) %Quad(0AFh) %Quad(0B0h) %Quad(0B1h) %Quad(0B2h) %Quad(0B3h) %Quad(0B4h) %Quad(0B5h) %Quad(0B6h) %Quad(0B7h) %Quad(0B8h) %Quad(0B9h) %Quad(0BAh) %Quad(0BBh) %Quad(0BCh) %Quad(0BDh) %Quad(0BEh) %Quad(0BFh) %Quad(0C0h) %Quad(0C1h) %Quad(0C2h) %Quad(0C3h) %Quad(0C4h) %Quad(0C5h) %Quad(0C6h) %Quad(0C7h) %Quad(0C8h) %Quad(0C9h) %Quad(0CAh) %Quad(0CBh) %Quad(0CCh) %Quad(0CDh) %Quad(0CEh) %Quad(0CFh) %Quad(0D0h) %Quad(0D1h) %Quad(0D2h) %Quad(0D3h) %Quad(0D4h) %Quad(0D5h) %Quad(0D6h) %Quad(0D7h) %Quad(0D8h) %Quad(0D9h) %Quad(0DAh) %Quad(0DBh) %Quad(0DCh) %Quad(0DDh) %Quad(0DEh) %Quad(0DFh) %Quad(0E0h) %Quad(0E1h) %Quad(0E2h) %Quad(0E3h) %Quad(0E4h) %Quad(0E5h) %Quad(0E6h) %Quad(0E7h) %Quad(0E8h) %Quad(0E9h) %Quad(0EAh) %Quad(0EBh) %Quad(0ECh) %Quad(0EDh) %Quad(0EEh) %Quad(0EFh) %Quad(0F0h) %Quad(0F1h) %Quad(0F2h) %Quad(0F3h) %Quad(0F4h) %Quad(0F5h) %Quad(0F6h) %Quad(0F7h) %Quad(0F8h) %Quad(0F9h) %Quad(0FAh) %Quad(0FBh) %Quad(0FCh) %Quad(0FDh) %Quad(0FEh) %Quad(0FFh) )) ; END OF TABLE 26 ; ... m16 ; Table numbers 28672 thru 32767 reserved %TableEnd END . InitMediator InitMediatorCtosLibbsVidbsVidCtosLibbsKbdbsKbdCtosLib BuildFileSpec BuildFileSpecCtosLib*BuildFullSpecFromPartial'BuildFullSpecFromPartialCtosLibBuildSpecFromDirBuildSpecFromDirCtosLibcBuildSpecFromFile BuildSpecFromFileCtosLibƊBuildSpecFromNode BuildSpecFromNodeCtosLib̊BuildSpecFromPassword$BuildSpecFromPasswordCtosLibBuildSpecFromVolBuildSpecFromVolCtosLibu CheckErcCheckErcCtosLib CheckInsSam CheckInsSamCtosLibT CheckPointBs CheckPointBsCtosLibʊ CheckpointBsC CheckpointBsCCtosLib/CheckPointBsADCheckPointBsADCtosLibSCheckPointBsGPCheckPointBsGPCtosLibeCheckPointBsSysOut!CheckPointBsSysOutCtosLibMCheckPointBs_8251 CheckPointBs_8251CtosLibCheckReadAsyncCheckReadAsyncCtosLibCheckWriteAsyncCheckWriteAsyncCtosLib ChkptNopChkptNopCtosLibL CloseAllFiles CloseAllFilesCtosLib1CloseBytestreamCloseBytestreamCtosLibICmCurrentVersionCmCurrentVersionCtosLibCompactDateTimeCompactDateTimeCtosLib CParamsCParamsCtosLibʊ CSubparams CSubparamsCtosLibCurrentOsVersionCurrentOsVersionCtosLibDeleteByFilespecDeleteByFilespecCtosLibnDeleteBytestreamDeleteBytestreamCtosLib DeleteBsAsync DeleteBsAsyncCtosLib5ErrorExitStringErrorExitStringCtosLibNExpandDateTimeExpandDateTimeCtosLib FatalError FatalErrorCtosLib FillBufferAD FillBufferADCtosLibFillBufferAsyncCFillBufferAsyncCCtosLibW FillBufferC FillBufferCCtosLibO FillBufferCD FillBufferCDCtosLib FillBufferK FillBufferKCtosLibW FillBufferN FillBufferNCtosLibZFillBufferSysInFillBufferSysInCtosLib FillBuffer_8251FillBuffer_8251CtosLibCFillBufIllegalFillBufIllegalCtosLib FlushBufferAD FlushBufferADCtosLib FlushBufferC FlushBufferCCtosLib̊FlushBufferDbgFlushBufferDbgCtosLib FlushBufferGP FlushBufferGPCtosLib" FlushBufferN FlushBufferNCtosLib׊FlushBufferSysOut FlushBufferSysOutCtosLib FlushBufferVidFlushBufferVidCtosLibFlushBuffer_8251FlushBuffer_8251CtosLibFlushBufIllegalFlushBufIllegalCtosLib  FOpenBswa FOpenBswaCtosLib FormatTime FormatTimeCtosLib! FormatTimeDt FormatTimeDtCtosLib݊ FormatTimeTm FormatTimeTmCtosLib FValidPbCb FValidPbCbCtosLib GetBsLfaGetBsLfaCtosLib  GetBsLfaAsync GetBsLfaAsyncCtosLibGetCanonicalNodeAndVol%GetCanonicalNodeAndVolCtosLib GetKbdIDGetKbdIDCtosLibGetNlsDateNameGetNlsDateNameCtosLib} GetpNlsTable GetpNlsTableCtosLibҊGetSegmentLengthGetSegmentLengthCtosLibGetStandardErcMsg GetStandardErcMsgCtosLibɊGetUserFileEntryGetUserFileEntryCtosLibIn_AcquireBytestreamC$In_AcquireBytestreamCCtosLibIn_CheckForOperatorRestartC*In_CheckForOperatorRestartCCtosLibڊIn_CheckpointBsAsyncC$In_CheckpointBsAsyncCCtosLibSIn_CheckpointBsCIn_CheckpointBsCCtosLibKIn_CheckpointBsLpt!In_CheckpointBsLptCtosLib<In_DiscardInputBsC!In_DiscardInputBsCCtosLibIn_DiscardOutputBsC"In_DiscardOutputBsCCtosLibIn_FillBufferLptIn_FillBufferLptCtosLib\In_FillBufferAsyncC"In_FillBufferAsyncCCtosLibsIn_FlushBufferAsyncC#In_FlushBufferAsyncCCtosLibIn_FlushBufferCIn_FlushBufferCCtosLibIn_FlushBufferLpt In_FlushBufferLptCtosLibيIn_OpenBytestreamLpt#In_OpenBytestreamLptCtosLib5In_OpenBytestreamSpecialC(In_OpenBytestreamSpecialCCtosLibIn_ReadBytestreamParameterC*In_ReadBytestreamParameterCCtosLibIn_ReadBytestreamParameterLpt,In_ReadBytestreamParameterLptCtosLibҊIn_ReadStatusCIn_ReadStatusCCtosLibIn_ReleaseBytestreamC$In_ReleaseBytestreamCCtosLibyIn_ReleaseBytestreamLpt&In_ReleaseBytestreamLptCtosLibj In_SendBreakC In_SendBreakCCtosLibIn_SetImageModeCIn_SetImageModeCCtosLib"In_SetImageModeLpt!In_SetImageModeLptCtosLibIn_WriteBytestreamParameterC+In_WriteBytestreamParameterCCtosLibr In_WriteBytestreamParameterLpt-In_WriteBytestreamParameterLptCtosLibcIn_WriteStatusCIn_WriteStatusCCtosLib LookupField LookupFieldCtosLib LookupNumber LookupNumberCtosLib LookupReset LookupResetCtosLib LookupString LookupStringCtosLib NlsCaseNlsCaseCtosLib̊ NlsClassNlsClassCtosLibH NlsCollate NlsCollateCtosLibNlsFormatDateTime NlsFormatDateTimeCtosLibڊNlsNumberAndCurrency#NlsNumberAndCurrencyCtosLib1 NlsParseTime NlsParseTimeCtosLibNlsSpecialCharacters#NlsSpecialCharactersCtosLib+NlsStdFormatDateTime#NlsStdFormatDateTimeCtosLib  NlsULCMPB NlsULCMPBCtosLibNlsVerifySignatures"NlsVerifySignaturesCtosLibNlsYesNoOrBlankNlsYesNoOrBlankCtosLib NlsYesOrNo NlsYesOrNoCtosLibOpenByteStreamOpenByteStreamCtosLibÊOpenByteStreamADOpenByteStreamADCtosLibLOpenByteStreamCOpenByteStreamCCtosLibOpenByteStreamDbg OpenByteStreamDbgCtosLib֊OpenByteStreamGpOpenByteStreamGpCtosLib~OpenByteStreamKOpenByteStreamKCtosLibOpenByteStreamNOpenByteStreamNCtosLibOpenByteStreamPtr OpenByteStreamPtrCtosLibOpenBytestreamSpecialC%OpenBytestreamSpecialCCtosLibOpenByteStreamSpl OpenByteStreamSplCtosLibOpenByteStreamSysIn"OpenByteStreamSysInCtosLibÊOpenByteStreamSysOut#OpenByteStreamSysOutCtosLibFOpenByteStreamVid OpenByteStreamVidCtosLibOpenByteStream_8251"OpenByteStream_8251CtosLib OpenUserFile OpenUserFileCtosLibފ ParseFileSpec ParseFileSpecCtosLib5ParseSpecForDirParseSpecForDirCtosLibParseSpecForFileParseSpecForFileCtosLibbParseSpecForNodeParseSpecForNodeCtosLibhParseSpecForPassword#ParseSpecForPasswordCtosLib=ParseSpecForVolParseSpecForVolCtosLibProgramColorMapper!ProgramColorMapperCtosLibu PutBackByte PutBackByteCtosLibi QueryNodeName QueryNodeNameCtosLibL QueryVideoBs QueryVideoBsCtosLib ReadBsRecord ReadBsRecordCtosLibReadByteNotMMDReadByteNotMMDCtosLibP ReadByteReadByteCtosLib5 ReadBytes ReadBytesCtosLibReadBytesNotMMDReadBytesNotMMDCtosLibŊReleaseByteStreamAD"ReleaseByteStreamADCtosLibReleaseByteStreamC!ReleaseByteStreamCCtosLib=ReleaseByteStreamCD"ReleaseByteStreamCDCtosLibReleaseByteStreamGp"ReleaseByteStreamGpCtosLibReleaseByteStreamSpl#ReleaseByteStreamSplCtosLib-ReleaseByteStream_8251%ReleaseByteStream_8251CtosLib1 ReleaseEasy ReleaseEasyCtosLib~ RenameBsAsync RenameBsAsyncCtosLib: RgParamRgParamCtosLib͊ RgParamInit RgParamInitCtosLibiRgParamSetEltNext RgParamSetEltNextCtosLibъRgParamSetListStart"RgParamSetListStartCtosLibRgParamSetSimpleRgParamSetSimpleCtosLibuRsrcEndSetAccessRsrcEndSetAccessCtosLibdRsrcGetDataBlkRsrcGetDataBlkCtosLib~RsrcInitSetAccess RsrcInitSetAccessCtosLibRsrcSessionEndRsrcSessionEndCtosLibƊRsrcSessionInitRsrcSessionInitCtosLibE SetBsLfaSetBsLfaCtosLib SetBsLfaAsync SetBsLfaAsyncCtosLib!SetImageModeBrnSetImageModeBrnCtosLibSetImageModeGPSetImageModeGPCtosLib\SetImageModeIllegal"SetImageModeIllegalCtosLibSetImageModeSplSetImageModeSplCtosLib SetMsgRet SetMsgRetCtosLibSetUserFileEntrySetUserFileEntryCtosLib WildcardCheck WildcardCheckCtosLib7 WildcardClose WildcardCloseCtosLibO WildcardInit WildcardInitCtosLib WildcardMatch WildcardMatchCtosLibF WildcardNext WildcardNextCtosLib WriteBsRecord WriteBsRecordCtosLibNWriteBsRecordNotMMD"WriteBsRecordNotMMDCtosLibi WriteByte WriteByteCtosLibƊWriteByteNotMMDWriteByteNotMMDCtosLibNweDZ$o0: FormatTimeDtCheckReadAsyncHNlsSpecialCharactersBuildSpecFromFileFlushBufferSysOutRgParamSetSimplefIn_AcquireBytestreamCWriteBsRecordNotMMDCheckPointBs_8251D InitMediator! RgParamInit!YReleaseByteStreamCD!: CheckInsSam!,NlsSpecialCharacters!FlushBufferGP! FlushBufferN!In_SetImageModeC!_ FormatTimeTm!In_ReleaseBytestreamLpt!VBuildFileSpec! CurrentOsVersion!i7hWJ/p)@$`|GetUserFileEntry LookupResetCParamscChkptNopP ReleaseEasy!NFlushBufferDbg!GetUserFileEntry!BuildSpecFromPassword! RsrcSessionEnd!v WildcardNext! FillBufferCD!SetImageModeIllegal!)9gJ3T^"sNlsCaseRsrcInitSetAccessr CheckInsSam,In_CheckpointBsC SetMsgRetIn_WriteBytestreamParameterLptmCloseBytestream!WIn_WriteStatusC!sGetBsLfaAsync!In_DiscardOutputBsC!3:Cf^vm"LW, FOpenBswaCloseBytestreamWRsrcEndSetAccessj FillBufferC PutBackByteFlushBufferVidFillBufIllegalProgramColorMapper FillBufferN GetBsLfaAsync FillBufferKCheckPointBsGP!<OpenByteStream_8251!bsKbd! FillBufferN!NlsNumberAndCurrency!CheckPointBs_8251!D/W_Q~ht8Hl%In_FlushBufferC/OpenByteStreamKOpenByteStreamSplOpenByteStreamNIn_WriteBytestreamParameterCgCompactDateTime_GetBsLfa WildcardNextOpenByteStreamCbsKbd LookupNumber{CmCurrentVersion[SetImageModeIllegalOpenBytestreamSpecialC!ReleaseByteStreamGp!?In_SendBreakC![ParseSpecForFile!FlushBufferAD!CompactDateTime!_RsrcSessionInit!zOpenByteStream! PutBackByte!ReadByteNotMMD!# GetKbdID!RgParam!VJ9g)^T2"vC InitMediator FatalError NlsCollateIn_ReadStatusCM CSubparamsfFlushBuffer_8251! NlsYesOrNo!ParseSpecForNode!SetImageModeBrn!FlushBufferVid!In_OpenBytestreamSpecialC!<ReleaseByteStreamSpl!DSetImageModeSpl!HOh& />5Ybs ReleaseEasyN NlsULCMPBCheckErc)CheckWriteAsyncLGetKbdIDReadBytesNotMMD-BuildSpecFromNode NlsULCMPB!OpenByteStreamGp!ExpandDateTime!} SetBsLfa!~BuildSpecFromNode!Cn'^VLf91xFlushBuffer_8251In_FlushBufferLpt3ParseSpecForNode FormatTimeTmNlsFormatDateTimeSetImageModeGPBuildSpecFromVol% FormatTimeDt! LookupReset! GetpNlsTable!RgParamSetSimple!fe@IS6%lZ-xOpenByteStreamAD WriteBsRecord ParseFileSpecOpenByteStreamOpenByteStreamDbgWriteByteNotMMDCurrentOsVersioni FOpenBswa!In_FlushBufferLpt!3 FatalError!ReleaseByteStreamAD!1 FillBufferK!`rIAl6gQ-$W{In_WriteStatusCs In_SendBreakC[FillBufferSysInSetImageModeBrnIn_DiscardInputBsC BuildFileSpec QueryVideoBs! NlsClass!DeleteBsAsync!u FormatTime!bsVid! GetBsLfa!WildcardClose! CSubparams!f7qT^Hf#@, WriteByteParseSpecForFileRsrcGetDataBlknIn_CheckpointBsLptCheckPointBsAD8 GetpNlsTableIn_CheckpointBsAsyncC GetSegmentLength! WildcardInit!GetStandardErcMsg!In_CheckForOperatorRestartC!OpenByteStreamC!RgParamSetEltNext!](?Gx[7doP1GetSegmentLengthReleaseByteStreamC6ExpandDateTime}SetBsLfa~ ReadBsRecord NlsParseTimeRsrcGetDataBlk!nOpenByteStreamDbg!WildcardCheck!FlushBufferSysOut!SetBsLfaAsync!BuildSpecFromVol!%lc=$M4D[~u QueryVideoBsParseSpecForDirIn_ReadBytestreamParameterLptGGetNlsDateName NlsYesOrNoReadByteNotMMD#In_OpenBytestreamSpecialC< OpenUserFileWildcardMatch!CheckReadAsync!HCheckpointBsC!4 FlushBufferC!GetCanonicalNodeAndVol!OpenByteStreamSpl!CheckWriteAsync!L ReadBsRecord!In_DiscardInputBsC!FillBufferAsyncC!7X'CNdv1p~ WildcardMatchNlsStdFormatDateTimeDeleteByFilespecm ReadBytes*In_FlushBufferAsyncC*OpenByteStream_8251FillBufferAsyncCIn_ReleaseBytestreamCQParseSpecForPassword ReadByte!' NlsParseTime!ReadBytesNotMMD!-|DPX7%kar/OpenByteStreamGp FlushBufferADOpenByteStreamVid WildcardCloseIn_ReleaseBytestreamLptVNlsNumberAndCurrency FillBufferADWriteBsRecord!In_FillBufferLpt!! WriteByte!DeleteByFilespec!mQueryNodeName!FillBufferSysIn!CheckPointBsAD!8In_FillBufferAsyncC!%WriteBsRecordNotMMD!DeleteBytestream!q ChkptNop!PParseSpecForPassword!Ah]F&Rx06 CheckPointBs0NlsVerifySignaturesSetUserFileEntryReadByte'ReleaseByteStreamCD:RgParamVReleaseByteStreamSplDCheckPointBsSysOut@ReleaseByteStreamC!6In_WriteBytestreamParameterC!gBuildSpecFromDir!CmCurrentVersion![In_ReleaseBytestreamC!QPeF*=Z5n!zNlsClass FlushBufferGPCheckPointBsGP<In_FillBufferAsyncC% FillBufferCDSetImageModeSplRgParamSetEltNext]In_FlushBufferC!/In_SetImageModeLpt!cGetNlsDateName!NlsStdFormatDateTime!CloseAllFiles!S FillBufferC! NlsCollate!OpenByteStreamVid!In_CheckpointBsAsyncC!  SetMsgRet! FValidPbCb!'7;Wbv/OD|lIn_SetImageModeLptcFillBuffer_8251 LookupString CloseAllFilesSbsVidRsrcSessionEndvOpenByteStreamSysIn SetBsLfaAsyncReleaseByteStreamAD1OpenByteStreamAD!ParseSpecForDir! CheckErc!)NlsVerifySignatures!ReleaseByteStream_8251!IBuildFullSpecFromPartial!In_CheckpointBsLpt!In_OpenBytestreamLpt!7g+IwT]~3=FlushBufferDbgIn_ReadBytestreamParameterCA QueryNodeNameGetStandardErcMsgOpenByteStreamSysOutRgParamSetListStartaErrorExitStringyOpenByteStreamK!In_ReadBytestreamParameterC!A ReadBytes!*OpenByteStreamPtr!FillBufIllegal!In_FlushBufferAsyncC!*ProgramColorMapper!BuildSpecFromFile!SetImageModeGP!lY6.>x&GcQReleaseByteStreamGp? RenameBsAsyncR CheckpointBsC4 FlushBufferC WildcardInitNlsYesNoOrBlankOpenByteStreamPtr FlushBufferNIn_SetImageModeC_ParseSpecForVol In_OpenBytestreamLpt7 CheckPointBs!0FillBuffer_8251!SetUserFileEntry!RsrcEndSetAccess!jRgParamSetListStart!aIn_ReadStatusC!MCheckPointBsSysOut!@ FillBufferAD!Vxa".P6mE DeleteBsAsyncu RgParamInitYBuildSpecFromPassword WildcardCheckIn_CheckForOperatorRestartCIn_DiscardOutputBsCNlsCase!RsrcInitSetAccess!rOpenByteStreamSysOut!NlsFormatDateTime!ErrorExitString!yG~1Qtc*:ZIn_FillBufferLpt!OpenBytestreamSpecialC FormatTimeFlushBufIllegalReleaseByteStream_8251IBuildSpecFromDirRsrcSessionInitzParseFileSpec!In_ReadBytestreamParameterLpt!GOpenByteStreamN! LookupField!wWriteByteNotMMD!CParams!cOpenByteStreamSysIn! OpenUserFile!In_CheckpointBsC!O ak?uF'W5GetCanonicalNodeAndVol LookupFieldwBuildFullSpecFromPartialDeleteBytestreamq FValidPbCbRenameBsAsync!R LookupString!FlushBufIllegal!NlsYesNoOrBlank!ParseSpecForVol! In_AcquireBytestreamC! LookupNumber!{In_WriteBytestreamParameterLpt!m COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: CtosLibImp.lib VERSION: R12.3.1 (friday november 12, 1993, 17:24) ;****************************** INCLUDE HEADER (.MDF) ************************; ;* *; ;* INCLUDE FILE: Nls.mdf *; ;* *; ;* MACHINE: B20 LANGUAGE: ASSEMBLER OS: BTOS *; ;* *; ;* DESCRIPTION: *; ;* *; ;* Macro definitions used in assembling Nls.asm. *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* 10/01/90 121D/03 P. Deuter / Macros for table 24 (GENGO) *; ;* 04/07/89 120A/02 P. Deuter / Optimize SetUnencodedKey for symbol table *; ;* 03/29/89 120A/01 P. Campbell / InitUnencodedKeys, SetUnencodedKey, *; ;* EndUnencodedKeys. *; ;* *; ;* *; ;* TITLE: BTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* *; ;* COPYRIGHT (C) 1980, 1989 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1989 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; %*DEFINE (InitDiacriticalTables) ( %SET(cEntries,0) %DEFINE (String1) () %DEFINE (String2) () ) %*DEFINE (DiacriticalSet(bDiacriticalKey,bFollowingKey,bResultantKey)) ( %DEFINE (tmpString) (%String1) %DEFINE (String1) (%tmpString DB %bDiacriticalKey,%bFollowingKey) %DEFINE (tmpString) (%String2) %DEFINE (String2) (%tmpString DB %bResultantKey) %SET(cEntries, %cEntries+1) ) %*DEFINE (EndDiacriticalTables) ( cDiacriticalPairs DW %cEntries %String1 %String2 ) %*DEFINE (InitScanCodeTables) ( %SET(cEntries,0) %DEFINE (String1) () %DEFINE (String2) () ) %*DEFINE (ScanCodeSet(bScanCode,bCharCode,bResultantCharCode)) ( %DEFINE (tmpString) (%String1) %DEFINE (String1) (%tmpString DB %bCharCode,%bScanCode) %DEFINE (tmpString) (%String2) %DEFINE (String2) (%tmpString DB %bResultantCharCode) %SET(cEntries, %cEntries+1) ) %*DEFINE (EndScanCodeTables) ( cScanCodes DW %cEntries %String1 %String2 ) %Set(cbTable,0) %Set(cTable,0) STACK segment word stack 'STACK' STACK ends HdrSeg SEGMENT PUBLIC 'const' wSignature DB 'T', 'N' cbFile DW 0 cStruct DW 0 orgID DW 0 orgOStruct DW 0 fill DW 0,0,0 HdrSeg ENDS sHdrSeq EQU 10h IdSeg SEGMENT WORD PUBLIC 'const' rgId LABEL WORD IdSeg ENDS oStructSeg SEGMENT WORD PUBLIC 'const' rgoStruct LABEL WORD oStructSeg ENDS rgbStructSeg SEGMENT WORD PUBLIC 'const' rgbStruct LABEL BYTE rgbStructSeg ENDS TGroup GROUP HdrSeg, IdSeg, oStructSeg, rgbStructSeg, endNlsTable %*DEFINE (DefTableString(name, id, string)) LOCAL rgbStart ( %x1Out(%name (%id) ... ) %DEFINE (arg) (%string) IdSeg SEGMENT DW %id IdSeg ENDS rgbStructSeg SEGMENT %rgbStart LABEL BYTE %WHILE (%LEN(%arg) GT 0) (%MATCH (head, arg) (%arg) DB %head ) rgbStructSeg ENDS oStructSeg SEGMENT DW OFFSET TGroup:%rgbStart oStructSeg ENDS %Set(cTable, %cTable+1) %Set(cbTable, %cbTable+%len(%string)) %x1Out(done.%nl) ) %*DEFINE (DefTablesbString(name, id, sbString)) LOCAL tmp0 tmp1 ( %x1Out(%name (%id) ... ) IdSeg SEGMENT DW %id IdSeg ENDS rgbStructSeg SEGMENT %tmp0 LABEL BYTE DB 0 %IF(%NES(%sbString,''))THEN( DB %sbString)FI %tmp1 LABEL BYTE ORG OFFSET %tmp0 DB %tmp1-%tmp0-1 rgbStructSeg ENDS oStructSeg SEGMENT DW OFFSET TGroup:%tmp0 oStructSeg ENDS %Set(cTable, %cTable+1) %Set(cbTable, %cbTable+%len(%sbString)+1) %x1Out(done.%nl) ) %*DEFINE (SbString(Str)) LOCAL tmp0 tmp1 ( rgbStructSeg SEGMENT %tmp0 LABEL BYTE DB 0 %IF(%NES(%str,''))THEN( DB %str)FI %tmp1 LABEL BYTE ORG OFFSET %tmp0 DB %tmp1-%tmp0-1 ORG OFFSET %tmp1 rgbStructSeg ENDS ) %*DEFINE (DefTableData(name, id, data)) LOCAL rgb0 rgb1 ( %x1Out(%name (%id) ... ) %DEFINE (arg) (%data) IdSeg SEGMENT DW %id IdSeg ENDS rgbStructSeg SEGMENT %rgb0 LABEL BYTE %data %rgb1 LABEL BYTE rgbStructSeg ENDS oStructSeg SEGMENT DW OFFSET TGroup:%rgb0 oStructSeg ENDS %Set(cTable, %cTable+1) %Set(cbTable, %cbTable+(%rgb1-%rgb0)) %x1Out(done.%nl) ) %*DEFINE (TableEnd)( %DefTableData (LastTableEntry, 0FFFFh, %( DW 'FF' )) EndNlsTable segment public 'const' TheEnd label byte EndNlsTable ends HdrSeg SEGMENT PUBLIC 'const' ORG OFFSET cbFile DW offset TGroup:TheEnd ORG OFFSET cStruct DW %cTable ORG OFFSET orgId DW OFFSET TGRoup:rgId ORG OFFSET orgoStruct DW OFFSET TGRoup:rgoStruct HdrSeg ENDS ) %*DEFINE (TableInit)( %' '%x1Out(Creating NLS tables:%nl)%' ) %*DEFINE(xOut(str))(%IF (%PASS1 EQ -1) THEN (%out(%str)) FI) %*DEFINE(x2Out(str))(%IF (%PASS2 EQ -1) THEN (%out(%str)) FI) %*DEFINE(x1Out(str))(%out(%str)) %DEFINE(nl)( ) ;StartKeycapDefines Macro ;Set up the data space for the Keycap Template arrays. The ;pointer array of these templates is called rgsbTemplates %*DEFINE (StartKeycapDefines)( ; rgKeycap is an array of offsets which describe the beginning ; of each of the structures in the Nls Keycap section of the NLS ; tables. public rgKeyCap rgKeyCap LABEL BYTE wKeyCapSig DW 'KC' %' Name table signature wRevLevel DW 0 %' Revision level cKeyCaps DW 0 %' Number of keycaps orgosbKeyCap DW 0 %' offset to keycap list %SET(NoKeyCaps, 1) sbKeyCaps label byte ) ; KeycapEntry Macro ; Create a table entry for the template form provided. Takes a ; name and string value: ; DefineKeycapEntry(Help_00, "HELP") ; This creates an entry called sbHelp_00 with the provided ; String, and adds it sequentially to the data structures. %*DEFINE (DefineKeyCapEntry(NameKeyCap, "String"))( sb%NoKeyCaps LABEL BYTE %' SB starts here DB %len(%String) %' String length DB '%String' %' String text DB 0 %' Null terminator for C etc %SET(NoKeyCaps, %NoKeyCaps+1) ) ;EndKeycapDefines Macro ;Wraps up the data space for the Keycap String arrays and ;other structures. %*DEFINE (EndKeycapDefines)( ; Describe the available tables by rgTables offset %SET (iKeyCap, 1) rgosbKeyCap LABEL BYTE %WHILE (%iKeyCap LT %NoKeyCaps) ( DW (OFFSET sb%iKeyCap) - (OFFSET rgKeyCap) %SET (iKeyCap, %iKeyCap + 1) ) EndKeyCapData label byte ORG OFFSET cKeyCaps DW %NoKeyCaps - 1 ORG OFFSET orgosbKeyCap DW (OFFSET rgosbKeyCap) - (OFFSET rgKeyCap) ORG OFFSET EndKeyCapData ) ; ; StartNameDefines Macro - - Set up the data space for the Date Time ; Template arrays. The pointer array of ; These templates is called rgsbTemplates ; %*DEFINE (StartNameDefines)( public NameStruct %SET(TableNo, 1) %SET(Started, 0) %SET(StringMax, 0FFH) %' %' %' %' %' N L S N A M E S T R U C T U R E %' %' NameStruct is a structure of offsets and counts which describe the %' structures in the Nls Name section of the NLS tables. %' %' %' NameStruct label byte qNameSignature DW 'NT' wNameRevLevel DW 0 cTables DW 0 orgoTables DW 0 ) ; ; NameEntry Macro - - Create a table entry for the template form ; provided. Takes a name and string value: ; ; DefineNameEntry(FirstMonth, "january") ; ; This creates an entry called FirstMonth with the provided String, and ; adds it sequentially to the data structures. ; ; Define the string %*DEFINE (DefineNameEntry(NameString, "String"))( %IF ((%StringNo LT %StringMax) AND (%Started EQ 1)) THEN ( sb%StringNo%TableNo label byte db %len(%String) db '%String' db 0 %SET (StringNo, %StringNo+1) ) ELSE ( %IF (%StringNo EQ %StringMax) THEN ( %OUT (DateString: %StringNo; Table: %TableNo; Too many strings in table, first table contained %StringMax strings. ) ) ELSE ( %OUT(Table number %TableNo must Begin before name strings can be defined ) ) FI ) FI ) ; ; Start Table Macro - - Begin a new list of date names ; %*DEFINE (StartNameTable)( %' %' remember the start of this list of string offsets %' %IF (%Started EQ 1) THEN ( %OUT(Table number %TableNo must End before another can begin ) ) ELSE ( %SET (StringNo, 1) %' %' Set the "We are in a table" flag, and warn user if last table not closed %SET(Started, 1) ) FI ) ; ; End Name Table Macro - - Close up a list of strings ; %*DEFINE (EndNameTable)( %' %' %' %' Warn user that we are closing a tabel that was not opened up %IF (%Started EQ 0) THEN ( %OUT(Table number %TableNo must Begin before it can end ) ) ELSE ( %IF (%StringMax EQ 0FFH) THEN ( %SET (StringMax, %StringNo) ) FI %IF (%StringNo LT %StringMax) THEN ( %OUT (Table: %TableNo; Table must contain %StringMax strings, this table contains only %StringNo strings ) ) ELSE ( %SET(TableNo, %TableNo+1) %SET(Started, 0) ) FI ) FI ) ; ; EndNameDefines Macro - - Wraps up the data space for the Name ; String arrays and other structures. ; %*DEFINE (EndNameDefines)( %' %IF (%Started EQ 1) THEN ( %OUT(Table number %TableNo must End before name definitions can End ) ) ELSE ( %SET (iTable, 1) %' %WHILE (%iTable LT %TableNo) ( Table%iTable label byte %Set (iName, 1) %WHILE (%iName LT %StringMax) ( DW (OFFSET sb%iName%iTable) - (OFFSET NameStruct) %SET (iName, %iName+1) ) %SET (iTable, %iTable+1) %SET (iName, 1) ) %' %SET (iTable, 1) rgoTables label byte %WHILE (%iTable LT %TableNo) ( DW %StringMax-1 DW (OFFSET Table%iTable) - (OFFSET NameStruct) %SET (iTable, %iTable + 1) ) EndNameData Label byte %' %' %' %' %' Describe the available tables by rgTables offset %' ORG OFFSET cTables DW %TableNo-1 ORG OFFSET orgoTables DW (OFFSET rgoTables) - (OFFSET NameStruct) ORG OFFSET EndNameData %' %' ) FI ) ; ; StartDateDefines Macro - - Set up the data space for the Date Time ; Template arrays. The pointer array of ; These templates is called rgsbTemplates ; %*DEFINE (StartDateDefines)( %' public DateStruct %' %' %' N L S D A T E S T R U C T U R E %' DateStruct is an structure of offsets and counts which describe the %' structures in the Nls Date section of the NLS tables. %' %' DateStruct label byte qDateSignature dw 'DT' wDateRevLevel dw 0 cCtTemplates dw 0 cOemTemplates dw 0 orgoTemplates dw 0 %' cEscs dw 0 orgCmds dw 0 %' %' %SET(NumSbs, 0) %SET(NumCtTemps, 0) %SET(NumOemTemps, 0) %' %SET(NumEscs, 0) %' %SET(BuildPhase, 1) %' %' rgCmds label byte %' ) ; ; DateEscapeDefine Macro - - Defines the character to be used for each ; of the escape sequences (attributes) in the ; NLS Date templates. ; %*DEFINE (DateEscapeDefine(CommandName, 'bLower', 'bUpper'))( %' %IF (%BuildPhase EQ 1) THEN ( db '%bLower' db '%bUpper' %' %SET(NumEscs, %NumEscs+1) %' ) ELSE ( %OUT(Command: %CommandName; Command characters must be defined before other NLS Date information. ) ) FI ) ; ; TemplateEntry Macro - - Create a table entry for the template form ; provided. Takes a name and string value: ; ; DefineTemplateEntry(LongDayDate, "!W*w! !N*n! !*d!, !*y!") ; ; This creates an entry called LongDayDate of the provided format, and ; adds it sequentially to the data structures. ; %*DEFINE (DefineTemplateEntry(TemplateName, "TemplateString"))( %' %'Transitioning from command char definition, disallow further command defines %IF (%BuildPhase EQ 1) THEN ( %SET (BuildPhase, 2) ) FI %' %IF ((%BuildPhase EQ 2) OR (%BuildPhase EQ 3)) THEN ( sbTemplate%NumSbs label byte db %len(%TemplateString) db '%TemplateString' db 0 %' %SET(NumSbs, %NumSbs+1) %' %IF (%BuildPhase EQ 2) THEN ( %SET(NumCtTemps, %NumCtTemps+1) ) ELSE ( %SET(NumOemTemps, %NumOemTemps+1) ) FI %' ) ELSE ( %OUT(Template: %TemplateName; Templates must be defined immediately after command characters ) ) FI %' ) ; ; EndStdDateDefines Macro - - Wraps up the data space for the Date Time ; Template arrays and other structures. The ; number of templates is put in in cTemplates, ; which is referenced by its offset, as is the ; array of escapes. ; %*DEFINE (EndStdDateDefines)( %IF (%BuildPhase EQ 2) THEN ( %SET (BuildPhase, 3) ) ELSE ( %OUT (Command characters and Standard templates must be defined before OEM templates ) ) FI ) ; ; EndOemDateDefines Macro - - Wraps up the data space for the Date Time ; Template arrays and other structures. The ; number of templates is put in in cTemplates, ; which is referenced by its offset, as is the ; array of escapes. ; %' %*DEFINE (EndOemDateDefines)( %' %IF (%BuildPhase EQ 3) THEN ( %' %' Disallow any further definitions %SET (BuildPhase, 4) %' rgosbTemplates LABEL BYTE %' %SET (iosb, 0) %' %WHILE (%iosb LT %NumSbs) ( DW (OFFSET sbTemplate%iosb) - (OFFSET DateStruct) %SET (iosb, %iosb+1) ) %' EndDateData label byte ORG OFFSET cCtTemplates DW %NumCtTemps ORG OFFSET cOemTemplates DW %NumOemTemps ORG OFFSET orgoTemplates DW (OFFSET rgosbTemplates) - (OFFSET DateStruct) ORG OFFSET cEscs DW %NumEscs ORG OFFSET orgCmds DW (OFFSET rgCmds) - (OFFSET DateStruct) ORG OFFSET EndDateData ) ELSE ( %OUT (Error; Command character, Default template, and OEM template definition areas must be present ) ) FI ) ; ;The macro definitions below are used to build a structure describing system ;multi-byte escape keys. ; %*DEFINE (InitEscapeKeys) ( %SET(cKeys,0) %DEFINE (LookupSeg) () %DEFINE (ExpansionSeg) () ) %*DEFINE (DefEscapeKey(bEsc,bAttr) (rgbIkeys)) LOCAL tmp0 tmp1 ( %DEFINE (tmpExpansion) (%ExpansionSeg) %DEFINE (ExpansionSeg) (%tmpExpansion %tmp0 LABEL BYTE %IF(%NES(%rgbIkeys,''))THEN( DB %rgbIKeys )FI%' %tmp1 LABEL BYTE ) %DEFINE (tmpLookup) (%LookupSeg) %DEFINE (LookupSeg) (%tmpLookup DB %bEsc,%bAttr DW %tmp1-%tmp0 DW OFFSET TGROUP:%tmp0 ) %SET(cKeys, %cKeys+1) ) %*DEFINE (EndEscapeKeys) ( cEscKeys DW %cKeys %LookupSeg %ExpansionSeg ) %*DEFINE (InitUnencodedKeys) ( rgbStructSeg SEGMENT WORD PUBLIC 'const' %SET(cbKeys,0) %SET(nKeys,0) cbUnencodedKeysTable LABEL BYTE DW 0 rgosbKeys LABEL BYTE DW 256 DUP(0) rgsbKeys LABEL BYTE ) %*DEFINE (SetUnencodedKey(bChar) (rgbIkeys)) ( %'build rgsbKeys structure %IF(%NES(%rgbIkeys,''))THEN( sbKeys%nKeys DB 0, %rgbIKeys ) ELSE ( sbKeys%nKeys DB 0 )FI%' %SET (cbKeys, %cbKeys + (length sbKeys%nKeys)) %SET(nKeys, %nKeys+1) ) %*DEFINE (EndUnencodedKeys) ( ORG OFFSET TGROUP:cbUnencodedKeysTable DW %cbKeys %'build rgosbKeys structure %SET (iKey, 0) %SET (cbKeys, 0) %WHILE (%iKey LT %nKeys) ( DW %cbKeys %SET (cbKeys, %cbKeys + (length sbKeys%iKey)) %SET (iKey, %iKey + 1) ) %'build rgsbKeys structure %SET (iKey, 0) %WHILE (%iKey LT %nKeys) ( ORG OFFSET TGROUP:sbKeys%iKey DB length sbKeys%iKey - 1 %SET (iKey, %iKey + 1) ) ORG OFFSET TGROUP:rgsbKeys+%cbKeys rgbStructSeg ENDS ) %'This macro creates a data structure to allow "Emperor Date/Time formatting" %' %' This data structure will look like this: %' %' cEras WORD - count of era structures %' rgEra (5) EraType - array of Eras (10 bytes each, 5 Eras max) %' EraType (10 bytes) %' iDay BYTE - beginning day of the month of era %' iMonth BYTE - beginning month of era %' iYear WORD - beginning year of era %' osbEraLong WORD - offset to long era string %' osbEraShort WORD - offset to short era string %' osbFirstYear WORD - offset to first year string %' rgbStrings (*) BYTE - Era strings and abbreviations %' %' %*DEFINE (InitEra) ( rgbStructSeg SEGMENT WORD PUBLIC 'const' %SET(cEras,0) %SET(cbStrings,0) cEraTable LABEL BYTE DW 0 rgEra LABEL BYTE DW (5*10/2) DUP(0) ;enough room for 5 eras max rgbStrings LABEL BYTE ) %*DEFINE (SetEra(rgbLongEra) (rgbShortEra) (bDay, bMonth, wYear) (rgbYear1))( %'set start date ORG OFFSET TGROUP:rgEra + (%cEras*10) db %bDay db %bMonth dw %wYear %'do long form ORG OFFSET TGROUP:rgEra + ((%cEras*10) + 4) DW %cbStrings ORG OFFSET TGROUP:rgbStrings + %cbStrings cbLongForm equ %len(%rgbLongEra) DB %len(%rgbLongEra) ;String length DB '%rgbLongEra' ;String text %SET(cbStrings, %cbStrings+cbLongForm+1) %'do short form ORG OFFSET TGROUP:rgEra + ((%cEras*10) + 6) DW %cbStrings ORG OFFSET TGROUP:rgbStrings + %cbStrings cbShortForm equ %len(%rgbShortEra) DB cbShortForm ; String length DB '%rgbShortEra' ; String text %SET(cbStrings, %cbStrings+cbShortForm+1) %'do year 1 string ORG OFFSET TGROUP:rgEra + ((%cEras*10) + 8) DW %cbStrings ORG OFFSET TGROUP:rgbStrings + %cbStrings cbYear1 equ %len(%rgbYear1) DB cbYear1 ; String length DB '%rgbYear1' ; String text %SET(cbStrings, %cbStrings+cbYear1+1) %SET(cEras, %cEras+1) %IF(%cEras GT 5) THEN (%OUT(Too many eras in table 24.))FI%' ) %*DEFINE (EndEra) ( ORG OFFSET TGROUP:cEraTable DW %cEras ORG OFFSET TGROUP:rgbStrings+%cbStrings rgbStructSeg ENDS ) %*DEFINE (OsSubLab ( n, "pName" )) (SS%EVAL(%N/8) SEGMENT AT (0FFFFh-(16*(%N/8))) ORG (230h+(100h*(%N/8))+2*%N-10h*(%N/8)) PUBLIC %Prefix%(%pName) %Prefix%(%pName) EQU THIS BYTE SS%EVAL(%N/8) ENDS ) %*DEFINE (Same( "original" , "copy" ))( PUBLIC %Prefix%(%copy) %Prefix%(%copy) EQU %Prefix%(%original) ) %IF (not(%*Isdef(%Prefix))) THEN (%' %DEFINE(Prefix)()%' No prefix, names are as-is )FI ; ; COPYRIGHT 1980,1981,1982,1983,1984 CONVERGENT TECHNOLOGIES, INC. ; ALL RIGHTS RESERVED ; ; THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE ; OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE, AND MAY NOT BE ; COPIED OR OTHERWISE USED WITHOUT THE PRIOR WRITTEN CONSENT OF CONVERGENT ; TECHNOLOGIES, INC. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS ; SOURCE CODE, SHALL AT ALL TIMES REMAIN IN CONVERGENT TECHNOLOGIES. ; STACK SEGMENT STACK 'STACK' ; default stack so programs won't crash ! DB 512 DUP (?) STACK ENDS %Out( Start Pass: ) %*define(MakeLabel)( seg%rqCS segment at %rqCS org %rqIP %rcName label byte PUBLIC %rcName seg%rqCS ends %Out(.)) %*DEFINE(NewRqName)(%' new CS:IP format %IF ((%level AND 1) EQ 1) THEN (%Error) ELSE (%' %set(rqCS, (%rcode AND 0FF8h) OR %level SHR 1)%' %if (%rqCS GT 21h) THEN (%set(rqCs, %rqCS OR 0F000h))FI%' %set(rqIP, 210h + ((%rcode AND 7) SHL 1) - (%rqCS SHL 4))%' %MakeLabel)FI) %*Define(Error)(%Out( No Procedural Interface for level %level, rq %rcode, name "%rcname" ) ERROR; No Procedural Interface for level %level, rq %rcode, name "%rcname" ) %' Must make names with macro arguments so substitution works left to right. %*Define(MakeName( First, Second ))(%define(rcName)(%First%Second)) %*Define(RqName( rq, "name" ))(%' %set(rqBased,%rq+%base)%' Alt rqs start 800h higher %set(level, %rq SHR 12)%' No level shifts allowed when apply base %set(rcode,(%rqBased AND 0FFFh))%' %define(rcName)(%Prefix%(%name))%' %IF (%level EQ 0 OR %eval(%rq) GE 0FFE0h) THEN (%' %set(tmp,(%rqBased AND 0FFF8h))%' %set(rqCS,(-%tmp) AND 0FFFFh)%' %set(rqIP,(210h + (%tmp*10h) + ((%rqBased*2) AND 0Fh)) AND 0FFFFh)%' %MakeLabel%' ) ELSE (%NewRqName)FI) %*DEFINE (Same( "original" , "copy" ))( %define(rcName)(%Prefix%(%copy))%' PUBLIC %rcName %rcName EQU %Prefix%(%original) ) %IF (not(%*Isdef(%base))) THEN (%' %SET(base,0)%' No base, rq codes are as-is )FI %IF (not(%*Isdef(%Prefix))) THEN (%' %DEFINE(Prefix)()%' No prefix, names are as-is )FI ;******************************* INCLUDE HEADER ******************************; ;* *; ;* INCLUDE FILE: Samgen.mdf VII120A M02 === 02/28/89 *; ;* *; ;* MACHINE: B20 LANGUAGE: ASSEMBLER OS: BTOS *; ;* *; ;* DESCRIPTION: Decides what byte streams are setup. *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first)*; ;* *; ;* ??/??/?? ????/09 ?. ???? / Add NTag_TagDbg *; ;* 6/29/93 K. Fernandez I copied his mdf file from PM's {Sui} *; ;* so our mediated CtosLib.dll would build. *; ;* 01/21/93 123C/08 R. Auradkar / Made ReadStatusLp=ReadStatusLpt; *; ;* Consistent with other definitions. *AA*; ;* 11/18/92 123B/07 T. Tran / Add bi-dir parallel support (CTOS III 1.1*; ;* and above only). New call is ReadStatusP *; ;* 10/29/90 121D/06 W. Chiu / Add checkdef for tagCDRead *; ;* 10/29/90 121C/05 N. Shaffer / Add CDROM bytestream *; ;* 04/30/90 121A/04 K. Yajima(NUL)/ Change bsVid for ENLS. *; ;* 01/22/90 120F/03 V. Muppidi / Padded vsbid upto 130bytes *; ;* 02/28/89 II120A/02 V. Muppidi / Folded changes from Sanjose's 12.0 *; ;* 08/31/88 II021B/01 R. Tratner / Updated Header for 2.1.B *; ;* 08/25/88 II020H/00 R. Tratner / Updated to CT's 12.0 baseline, no uva. *; ;* Addes ability to decide what is linked *; ;* into run files to reduce their sizes. *; ;* *; ;* TITLE: BTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* *; ;* COPYRIGHT (C) 1980 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1989 UNISYS CORPORATION *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; ; 11.1 SamGen.mdf uses new fixed tag logic ; Compatible with 11.1 Ctos.lib and CTOS/VM 2.1 ; ;Modified: JJK/DMO 7/12/84 Add Gpam. Make semi-readable. ; PKD/DMO 12/18/84 Add PUBLIC pProcRoutine. ; DC 03/06/85 Make SetImageMode generic. ; DR 03/06/85 Add fSameLooks to BsVid ; AM 01/22/87 Introduce new tags management ; AM 04/06/87 A new variable is used, LinkWithSam, if set ; to 0FFh SAM Comm and printer not linked with ; application. ; 10/17/87 JM use tagProcs for sysin,sysout instead of tagProc. ; -- 12.0 -- ; 07/22/88 TAB added x.25 tags ; 08/02/88 TAB added SamHat branching, 8251 StubOuts ; 08/09/88 TAB added SamgenVersion support ; 01/04/89 TAB added SamCInit and SamCFinal so users can ; have just device-dependent programs. NTag_tagDiskRead equ 0 NTag_tagDiskWrite equ 1 NTag_tagDiskModify equ 2 NTag_tagKbdRead equ 3 NTag_tagVideoWrite equ 4 NTag_tagLptWrite equ 5 NTag_tagPtrWrite equ 6 NTag_tagNul equ 7 NTag_tagCommRead equ 8 NTag_tagCommWrite equ 9 NTag_tagCommModify equ 10 NTag_tagSplWrite equ 11 NTag_tagSysIn equ 12 NTag_tagSysOut equ 13 NTag_tagGpamWrite equ 14 NTag_tagCardC equ 15 NTag_tagCardI equ 16 NTag_tag8251Read equ 17 NTag_tag8251Write equ 18 NTag_tag8251Modify equ 19 NTag_tagPtr8251Write equ 20 NTag_tagQicRead equ 21 NTag_tagQicWrite equ 22 NTag_tagTapeRead equ 23 NTag_tagTapeWrite equ 24 NTag_tagLptRead equ 25 NTag_tagLptModify equ 26 NTag_tagX25Write equ 27 NTag_tagX25Read equ 28 NTag_tagX25Modify equ 29 NTag_tagCDRead equ 30 NTag_tagDbg equ 31 NTag_taglast equ 0ffh EXTRN CheckInsSam:FAR ; SamgenVersion_x is changed whenever the tables Samgen creates are ; incompatible with previous versions. The SamgenVersion.asm module in ; Ctos.lib resolves this extrn. Whenever an incompatibility is created, ; increment the version number in the label here and in SamgenVersion.asm. ; If an application's samgen and the Ctos.lib used are incompatible, this ; name will be an unresolved external in the link map. EXTRN SamgenVersion_1:BYTE %*DEFINE (Init) ( PUBLIC OpenTable,sTagProcs,tagTable,tagLast,deviceLast PUBLIC fDiskBsDef,DiskBsOpen,fSplBsDef,SplBsOpen,fGpamBsDef,GpamBsOpen DGROUP GROUP DATA %SET(DevNum,0) %SET(tag,0) %SET(segFlag,0) %SET(DiskFlag,0) %SET(SplFlag,0) %SET(GpamFlag,0) %SET(Flag8251,0) %SET(LptFlag,0) %SET(CommFlag,0) %SET(DevDepFlag,0) %SET(tagVideoWriteVal,0FFH) %SET(tagKbdReadVal,0FFH) %DEFINE (OpenProcDisk) (0) %DEFINE (OpenProcSpl) (0) %DEFINE (OpenProcGpam) (0) DATA SEGMENT PUBLIC 'DATA' xDisk LABEL BYTE ySpl LABEL BYTE zGpam LABEL BYTE ) ;*M02 BEGIN %*DEFINE (SamCInit) ( %SET(tag,0) DGROUP GROUP DATA ) ;*M02 END %*DEFINE (DeviceOpen(DeviceName,OpenProc)) ( %IF (NOT(%ISDEF(%OpenProc)) AND NOT(%EQS(%OpenProc,OpenByteStreamLpt))) THEN ( ??SEG SEGMENT EXTRN %OpenProc:FAR ??SEG ENDS ) FI %DEFINE(DevName_Gpam)(z%SUBSTR(%DeviceName,2,%LEN(%DeviceName)-2)) %DEFINE(DevName_Disk)(x%SUBSTR(%DeviceName,2,%LEN(%DeviceName)-2)) %DEFINE(DevName_Spl) (y%SUBSTR(%DeviceName,2,%LEN(%DeviceName)-2)) %IF (NOT(%ISDEF(%DevName_Disk))) THEN ( %IF (NOT(%ISDEF(%DevName_Spl))) THEN ( %IF (NOT(%ISDEF(%DevName_Gpam))) THEN ( %IF (%DevNum EQ 0) THEN (OpenTable LABEL BYTE) FI %IF (%EQS(%DeviceName,[Lpt])) THEN (%SET(LptFlag,0FFh)) FI %IF (%EQS(%DeviceName,[Ptr])) THEN (%SET(CommFlag,0FFh)) FI %IF (%EQS(%DeviceName,[Comm])) THEN (%SET(CommFlag,0FFh)) FI %IF (%EQS(%DeviceName,[8251])) THEN ( %SET(CommFlag,0FFh) %SET(Flag8251,0FFh) ) FI %SET(DevNum, %DevNum+1) DB %LEN(%DeviceName) DB '%DeviceName' DD %OpenProc ) ELSE ( %DEFINE (OpenProcGpam) (%OpenProc) %SET(GpamFlag,0FFh) ) FI ) ELSE ( %DEFINE (OpenProcSpl) (%OpenProc) %SET(SplFlag,0FFH) ) FI ) ELSE ( %DEFINE (OpenProcDisk) (%OpenProc) %SET(DiskFlag,0FFH) ) FI ) %' "tagProcs" - used only with 10.0 and later SamGens. %' Earlier SamGens used "tagProc", which does not include SetImageMode. %' %*DEFINE (tagProcs(tagName,FillProc,FlushProc,CheckPointProc,ReleaseProc,SetImageModeProc)) ( %IF (%tag EQ 0) THEN ( %DeviceOpen([SysIn],OpenByteStreamSysIn) %DeviceOpen([SysOut],OpenByteStreamSysOut) %IF (%LptFlag EQ 0FFh) THEN ( %SamHatProc (OpenBytestreamLpt,24,541) %SamHatProc (FlushBufferLpt,14,543) %SamHatProc (CheckPointBsLpt,6,545) %SamHatProc (ReleaseByteStreamLpt,4,547) %SamHatProc (SetImageModeLpt,6,549) %SamHatProc (ReadByteStreamParameterLpt,10,553) %SamHatProc (WriteByteStreamParameterLpt,8,554) %SamHatProc (FillBufferLpt,14,567) %SamHatProc (ReadStatusLpt,10,568) ) FI %IF (%CommFlag EQ 0FFh) THEN ( %SamHatProc (OpenBytestreamSpecialC,26,542) %SamHatProc (AcquireBytestreamC,32,563) %SamHatProc (FlushBufferC,14,544) %SamHatProc (CheckpointBsAsyncC,14,546) %SamHatProc (ReleaseByteStreamC,4,548) %SamHatProc (SetImageModeC,6,550) %SamHatProc (FlushBufferAsyncC,24,555) %SamHatProc (ReadByteStreamParameterC,10,556) %SamHatProc (WriteByteStreamParameterC,8,557) %SamHatProc (CheckForOperatorRestartC,8,558) %SamHatProc (DiscardOutputBsC,4,559) %SamHatProc (FillBufferAsyncC,24,560) %SamHatProc (DiscardInputBsc,8,561) %SamHatProc (ReadStatusC,10,562) %SamHatProc (WriteStatusC,8,564) %SamHatProc (SendBreakC,4,565) %SamHatProc (CheckpointBsc,6,566) ) FI sTagProcs DW 21 tagTable LABEL DWORD) FI PUBLIC %tagName %tagName DB NTag_%tagName ;NTag; %IF (%EQS(%tagName,tagVideoWrite)) THEN( %SET(tagVideoWriteVal,NTag_%tagName)) FI %IF (%EQS(%tagName,tagKbdRead)) THEN( %SET(tagKbdReadVal,NTag_%tagName)) FI %SET(tag, %tag+1) %IF (NOT(%ISDEF(%FillProc))) THEN( ??SEG SEGMENT EXTRN %FillProc:FAR ??SEG ENDS) FI DD %FillProc %IF (NOT(%ISDEF(%FlushProc))) THEN( ??SEG SEGMENT EXTRN %FlushProc:FAR ??SEG ENDS) FI DD %FlushProc %IF (NOT(%ISDEF(%CheckPointProc))) THEN( ??SEG SEGMENT EXTRN %CheckPointProc:FAR ??SEG ENDS) FI DD %CheckPointProc %IF (NOT(%ISDEF(%ReleaseProc))) THEN( ??SEG SEGMENT EXTRN %ReleaseProc:FAR ??SEG ENDS) FI DD %ReleaseProc %IF (NOT(%ISDEF(%SetImageModeProc))) THEN( ??SEG SEGMENT EXTRN %SetImageModeProc:FAR ??SEG ENDS) FI DD %SetImageModeProc) %' "tagProc" - used only with prior-to-10.0 format Samgens. %' (Included so such Samgens can still be compiled and used with 10.0 %' CTOS.) %' 10.0 and later SamGens use "tagProcs", a "tagProc" replacement which %' includes SetImageMode. %' %*DEFINE (tagProc(tagName,FillProc,FlushProc,CheckPointProc,ReleaseProc)) ( %IF (%tag EQ 0) THEN ( %DeviceOpen([SysIn],OpenByteStreamSysIn) %DeviceOpen([SysOut],OpenByteStreamSysOut) sTagProcs DW 17 tagTable LABEL DWORD) FI PUBLIC %tagName %tagName DB NTag_%tagName ;NTag; %IF (%EQS(%tagName,tagVideoWrite)) THEN( %SET(tagVideoWriteVal,NTag_%tagName)) FI %IF (%EQS(%tagName,tagKbdRead)) THEN( %SET(tagKbdReadVal,NTag_%tagName)) FI %SET(tag, %tag+1) %IF (NOT(%ISDEF(%FillProc))) THEN( ??SEG SEGMENT EXTRN %FillProc:FAR ??SEG ENDS) FI DD %FillProc %IF (NOT(%ISDEF(%FlushProc))) THEN( ??SEG SEGMENT EXTRN %FlushProc:FAR ??SEG ENDS) FI DD %FlushProc %IF (NOT(%ISDEF(%CheckPointProc))) THEN( ??SEG SEGMENT EXTRN %CheckPointProc:FAR ??SEG ENDS) FI DD %CheckPointProc %IF (NOT(%ISDEF(%ReleaseProc))) THEN( ??SEG SEGMENT EXTRN %ReleaseProc:FAR ??SEG ENDS) FI DD %ReleaseProc) %*DEFINE (DevDepProc(ProcName,ProcRoutine)) ( %IF (%DevDepFlag EQ 0) THEN ( %tagProcs(tagSysIn,FillBufferSysIn,FlushBufIllegal,ChkptNop,ReleaseEasy,SetImageModeIllegal) %tagProcs(tagSysOut,FillBufIllegal,FlushBufferSysOut,CheckPointBsSysOut,ReleaseEasy,SetImageModeIllegal) tagLast DB NTag_tagLast ;NTag; DATA ENDS SAMGEN SEGMENT PUBLIC 'CODE' xQueryVidBs LABEL FAR yQueryBsVid LABEL FAR SAMGEN ENDS %SET(DevDepFlag,1)) FI PUBLIC p%ProcRoutine DATA SEGMENT PUBLIC 'DATA' p%ProcRoutine DD %ProcRoutine DATA ENDS SAMGEN SEGMENT PUBLIC 'CODE' ASSUME CS:SAMGEN ASSUME DS:DGROUP %IF (%ISDEF(x%ProcName)) THEN ( QueryBsVid LABEL FAR PUBLIC QueryBsVid) FI %IF (%ISDEF(y%ProcName)) THEN ( QueryVidBs LABEL FAR PUBLIC QueryVidBs) FI ??SEG SEGMENT EXTRN %ProcRoutine:FAR ??SEG ENDS PUBLIC %ProcName %ProcName PROC FAR PUSH BP MOV BP,SP POP BP JMP DWORD PTR p%ProcRoutine RET %ProcName ENDP SAMGEN ENDS) %*DEFINE (CheckDef(tagCT)) ( %IF (NOT(%ISDEF(%tagCT))) THEN( %tagCT DB Ntag_%tagCT ;NTAG; PUBLIC %tagCT %IF (%EQS(%tagCT,tagVideoWrite)) THEN( %SET(tagVideoWriteVal,%tag)) FI %IF (%EQS(%tagCT,tagKbdRead)) THEN( %SET(tagKbdReadVal,%tag)) FI %SET(tag,%tag+1)) FI) %*DEFINE (SamHatProc(ProcName,sParms,iOsLab)) ( PUBLIC pIn%ProcName, pSc%ProcName DATA SEGMENT PUBLIC 'DATA' pIn%ProcName DD In_%ProcName pSc%ProcName DD Sc_%ProcName DATA ENDS SAMGEN SEGMENT PUBLIC 'CODE' ASSUME CS:SAMGEN ASSUME DS:DGROUP ??SEG SEGMENT EXTRN In_%ProcName:FAR, Sc_%ProcName:FAR ??SEG ENDS PUBLIC %ProcName %ProcName PROC FAR PUSH BP MOV BP,SP LES BX,DWORD PTR [BP+%EVAL(%sParms+2)] PUSH ES PUSH BX MOV AX,%iOsLab PUSH AX CALL CheckInsSam OR AX,AX JNE in%ProcName POP BP JMP DWORD PTR pSc%ProcName in%ProcName: MOV AL,BYTE PTR [FLink] RCR AL,1 JAE no%ProcName POP BP JMP DWORD PTR pIn%ProcName no%ProcName: MOV AX,7 POP BP RET %EVAL(%sParms) %ProcName ENDP SAMGEN ENDS) %*DEFINE (StubOut(ProcName,sParms)) ( SAMGEN SEGMENT PUBLIC 'CODE' ASSUME CS:SAMGEN ASSUME DS:DGROUP %ProcName PROC FAR PUSH BP MOV BP,SP MOV AX,7 POP BP RET %EVAL(%sParms) %ProcName ENDP PUBLIC %ProcName SAMGEN ENDS ) %*DEFINE (Final) ( %IF (%DevDepFlag NE 0) THEN ( DATA SEGMENT PUBLIC 'DATA') ELSE (%tagProcs(tagSysIn,FillBufferSysIn,FlushBufIllegal,ChkptNop,ReleaseEasy,SetImageModeIllegal) %tagProcs(tagSysOut,FillBufIllegal,FlushBufferSysOut,CheckPointBsSysOut,ReleaseEasy,SetImageModeIllegal) tagLast DB NTag_tagLast ;NTag;) FI %SET(tag,%tag+1) deviceLast DB %DevNum fDiskBsDef DB %DiskFlag DiskBsOpen DD %OpenProcDisk fSplBsDef DB %SplFlag SplBsOpen DD %OpenProcSpl fGpamBsDef DB %GpamFlag GpamBsOpen DD %OpenProcGpam %CheckDef(tagDiskRead) %CheckDef(tagDiskWrite) %CheckDef(tagDiskModify) %CheckDef(tagKbdRead) %CheckDef(tagVideoWrite) %CheckDef(tagLptWrite) %CheckDef(tagPtrWrite) %CheckDef(tagNul) %CheckDef(tagCommRead) %CheckDef(tagCommWrite) %CheckDef(tagCommModify) %CheckDef(tag8251Read) %CheckDef(tag8251Write) %CheckDef(tag8251Modify) %CheckDef(tagPtr8251Write) %CheckDef(tagSplWrite) %CheckDef(tagGpamWrite) %CheckDef(tagLptRead) %CheckDef(tagLptModify) %CheckDef(tagX25Write) %CheckDef(tagX25Read) %CheckDef(tagX25Modify) %CheckDef(tagCDRead) %CheckDef(tagDbg) %CheckDef(tagTapeRead) %CheckDef(tagTapeWrite) PUBLIC bsVid EVEN bsVid LABEL DWORD DD 0 ;pBuffer DW 0 ;sBuffer DW 0 ;ibRead DW 0 ;ibWrite DB 0 ;fOkToPutBack DB 0 ;fPutBack DB 0 ;bPutBack DB %tagVideoWriteVal ;tag DB 0 ;iframe DB 0 ;fEscape DB 0 ;rgbEscape (6) DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 ;ibEscape DB 0 ;fLiteral DB 0 ;fLiteralEsc DB 0 ;looks DB 0 ;fBsVidOpen DB 0 ;fSameLooks DB 0 ;bSrpVideoExists DB 0 ;rgbChar (4) (ENLS) /*m04*/ DB 0 DB 0 DB 0 DB 0 ;ibChar (ENLS) /*m04*/ DB 0 ;chWidth (ENLS) /*m04*/ DB 0 ;cIgnore (ENLS) /*m04*/ DB 0 ;fLastChar (ENLS) /*m04*/ DB 0 ;bLastAttr (ENLS) /*m04*/ DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 DD 0 PUBLIC bsKbd EVEN bsKbd LABEL DWORD DD 0 DW 0 DW 0 DW 0 DB 0FFH DB 0 DB 0 DB %tagKbdReadVal DB 0 DB 0 DB 0 PUBLIC pPrepWriteMMD PUBLIC pPrepReadMMD pPrepWriteMMD DD ? pPrepReadMMD DD ? %*DEFINE (OsSubLab ( n, "pName" )) (SS%EVAL(%N/8) SEGMENT AT (0FFFFh-(16*(%N/8))) ORG (230h+(100h*(%N/8))+2*%N-10h*(%N/8)) PUBLIC %pName %pName EQU THIS BYTE SS%EVAL(%N/8) ENDS ) %*DEFINE (Same( "original" , "copy" ))( PUBLIC %copy %copy EQU %original ) PUBLIC FLink %IF (%*ISDEF(%LinkWithSam)) THEN ( Flink DB 0 %OsSubLab(541, "IN_OpenByteStreamLpt") ;541 %OsSubLab(542, "IN_OpenByteStreamSpecialC") ;542 %OsSubLab(543, "IN_FlushBufferLpt") ;543 %OsSubLab(544, "IN_FlushBufferC") ;544 %OsSubLab(545, "IN_CheckPointBsLpt") ;545 %OsSubLab(546, "IN_CheckpointBsAsyncC") ;546 %OsSubLab(547, "IN_ReleaseByteStreamLpt") ;547 %OsSubLab(548, "IN_ReleaseByteStreamC") ;548 %OsSubLab(549, "IN_SetImageModeLpt") ;549 %OsSubLab(550, "IN_SetImageModeC") ;550 %OsSubLab(551, "IN_CheckPointPhy") ;551 %OsSubLab(552, "IN_QueryPrtStatus") ;552 %OsSubLab(553, "IN_ReadByteStreamParameterLpt") ;553 %OsSubLab(554, "IN_WriteByteStreamParameterLpt") ;554 %OsSubLab(555, "IN_FlushbufferAsyncC") ;555 %OsSubLab(556, "IN_ReadByteStreamParameterC") ;556 %OsSubLab(557, "IN_WriteByteStreamParameterC") ;557 %OsSubLab(558, "IN_CheckForOperatorRestartC") ;558 %OsSubLab(559, "IN_DiscardOutputBsc") ;559 %OsSubLab(560, "IN_FillBufferAsyncC") ;560 %OsSubLab(561, "IN_DiscardinputBsc") ;561 %OsSubLab(562, "IN_ReadStatusc") ;562 %OsSubLab(563, "IN_AcquireByteStreamC") ;563 %OsSubLab(564, "IN_WriteStatusc") ;564 %OsSubLab(565, "IN_SendBreakC") ;565 %OsSubLab(566, "IN_CheckPointBsc") ;566 %OsSubLab(567, "IN_FillBufferLpt") ;567 ) ELSE ( Flink DB 0FFh ) FI DATA ENDS %IF ((%CommFlag EQ 0FFh) AND (%Flag8251 EQ 0)) THEN ( %StubOut(CheckPointBs_8251,4) %StubOut(FillBuffer_8251,14) %StubOut(FlushBuffer_8251,14) %StubOut(OpenByteStreamPtr_8251,24) %StubOut(OpenByteStream_8251,24) %StubOut(ReadStatusC_8251,10) %StubOut(ReleaseByteStream_8251,4) %StubOut(WriteByteStreamParameterC_8251,8) %StubOut(WriteStatusC_8251,8) %StubOut(ResetTransmitQueueProc,4) %StubOut(CheckForAutoRestartProc,8) ) FI END) ;M02 BEGIN %*DEFINE (SamCFinal) ( DATA SEGMENT PUBLIC 'DATA' %*DEFINE (MakeTag(tagName)) ( PUBLIC %tagName %tagName DB NTag_%tagName ;NTag; ) %MakeTag(tagPtrWrite) %MakeTag(tagCommRead) %MakeTag(tagCommWrite) %MakeTag(tagCommModify) %MakeTag(tag8251Read) %MakeTag(tag8251Write) %MakeTag(tag8251Modify) %MakeTag(tagPtr8251Write) PUBLIC FLink Flink DB 0FFh DATA ENDS END) ;M02 END ; ; FILE UserRqLabel.asm -- ; ;* COPYRIGHT (C) 1980, 1989 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED ;* COPYRIGHT (C) 1980, 1989 UNISYS CORPORATION. ALL RIGHTS RESERVED ; ; ;There are two ways for an application program to access a service. ; ; 1. It can issue the Request primitive and then issue either a ; the Check primitive or the Wait primitive. ; This method requires that the application allocate space for ; a request block, fill in the fields, and know ; the request code of the service. If this is the way you wish ; to access your service, then you do not need to use this file. ; ; 2. If the request code starts with an even hexadecimal digit ; (e.g. 0CxxxH or 0ExxxH) it can use the procedural interface. ; In this method, the application simply makes a procedure call. ; The OS allocates space on the user's stack for a ; request block, determines the proper request code, ; fills in the fields using the parameters supplied by the user ; along with derived information, calls Request, then calls Wait. ; Note that unlike method 1, this method does not allow the ; application program to run while the service is processing the ; request. This is referred to as a "synchronous" interface. ; ; ;Method 1 is completely sufficient for accessing a service. Method 2 is ;nothing more than a more convienient way to obtain the same services. Most ;user-written services do not use method 2. If, however, you have a service ;for which you would like to provide a procedural interface, this module is ;provided to make that job easier. But note that only request codes which ;start with an even hexadecimal digit can be made to have a procedural ;interface and thus make use of this file. ; ; ;The steps in creating a procedural interface to a service are as follows: ; ; 1. Decide on procedure names for the requests which will be served ; by your new service. ; For this example, we'll call them MyFunction1 and ; MyFunction2. Moreover, assume the parameters are of the form: ; ; MyFunction1(pointer, word, returned pointer, word) ; MyFunction2(pointer, word) ; ; 2. Choose a request code(s) within the range available for ; customer use. There are two ranges: ; ; The first range (0C000h-0FFE0h) is available to ; all users. This means that if you pick ; request codes in this range, there is no guarantee that other ; users will not choose the same request code. Two such ; services could obviously never run on the same machine. So, ; if you expect to run your service along with services written ; by other customers, you can avoid conficts by getting your ; request codes out of the second range. ; ; The second range (06000h-07FFFh) are registered by ; Convergent. CT Technical Support maintains the ; registry by assigning codes in this range only upon request. ; So in order to use codes in this range, you must contact ; CT Technical Support to arrange to have codes reserved for ; your exclusive use. The codes given to you will ; be given out to no one else, thus preventing any conflict. ; ; There are two ways to receive such codes. If you are ; connected to the CT-Mail network, send a Mail message to ; REQUEST/TS2 specifying your name, address, and how many codes ; you require. Codes will be registered in your company's name ; and you will receive an EMail response to inform you of which ; codes were assigned to you. Alternatively, you may call CT ; Technical support at (800) 858-8255 and explain that you wish ; to register a CTOS request code. In a return call, you will ; be informed of the codes which have been registered in your ; name. Remember to specify whether you want a request code ; beginning with an even or odd hexadecimal digit. ; ; 3. Use RequestTemplate.txt to create a new file Request.?.txt ; which will associate the chosen request codes with the parameter ; lists. ; ; :RequestCode:0C000h ; :RequestName:MyFunction1 ; :Version:1 ; :LclSvcCode:0000h ; :ServiceExch:exchInstalledLocal ; :sCntInfo:0 ; :nReqPbCb:1 ; :nRespPbcb:1 ; :Params:p(12),w(16),p(18),w(22) ; :NetRouting:NoRouting ; :SrpRouting:NoRouting ; ; :RequestCode:0C001h ; :RequestName:MyFunction2 ; :Version:1 ; :LclSvcCode:0000h ; :ServiceExch:exchInstalledLocal ; :sCntInfo:0 ; :nReqPbCb:1 ; :nRespPbcb:0 ; :Params:p(12),w(16) ; :NetRouting:NoRouting ; :SrpRouting:NoRouting ; ; 4. Write the code which will implement MyFunction1 and MyFunction2. ; This code should have an initialization section which is ; responsible for installing. This code should make the following ; call for each request code: ; ; erc = ServeRq(XXXX, exch) ; ; This notifies CTOS of the location of the code which will ; implement the XXXXth request code. The initialization ; code should then call ConvertToSys and wait on an exchange set up ; for deinstallation. ; ; 5. Create a command called InstallMyService to install the service. ; ;For an application program to actually make use of this new service via a ;procedural interface, the following steps should be taken: ; ; 1. In the source of the application, call MyFunction1 and ; MyFunction2, both declared EXTERNAL. ; ; 2. Edit this file by adding a macro call of the following form: ; %' %RqName(XXXXXX, "MyFunction1") %' %RqName(XXXXXX, "MyFunction2") ; ^ ; / \ ; | ; | ; Start in column 1 ; ; These macro calls cause ABSOLUTE PUBLIC symbols of MyFunction1 ; and MyFunction2 to be created. ; Their values will be resolved at load time to the correct ; addresses of the procedural interface for MyFunction1 and ; MyFunction2. ; ; ; 3. Link the application program modules with the module created by ; assembling this module. ; ; 4. Run InstallMyService ; ; 5. Run your application program. ; ; ; ; The syntax of the macro is: ; %' %RqName(Request code, "routine name") ; ; $INCLUDE([Sys]RqLabl.mdf) ;*************************************************************** ; EXAMPLE * ; * %' %RqName(815Fh, "ReScheduleMarkedQueueEntry") * ;*************************************************************** ; ; **** Put "RqName" macros below this line ; ; The following are for backwards compatability with object ; modules compiled using old names for CTOS procedures. The ; syntax is: ; %' %Same("RqName", "Alias") ; ; You will not need to worry about this unless you are replacing ; an existing request code which was known by two names. ; ;*************************************************************** ; EXAMPLE * ; * %' %Same("ReScheduleMarkedQueueEntry", "PauseSpooler") * ; * ; * ;*************************************************************** ; ; **** Put "Same" macros below this line END ;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: UserSysCommonLabel.asm *; ;* *; ;* MACHINE: NGen/SGen LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION: *; ;* *; ;* This module is to be used by users who are creating Installable System *; ;* Common procedures using the SystemCommonInstall procedure. The steps in *; ;* creating an installable system common are as follows: *; ;* *; ;* 1. Decide on a procedure name for your new system common. For *; ;* this example, we'll call it MySysComm. Moreover, assume the *; ;* parameters are of the form: (pointer, returned pointer, word). *; ;* *; ;* 2. Decide whether you want to use an unrestricted or registered *; ;* system common. If your system common will be on a system with *; ;* other non-Unisys software, you may want to request a number *; ;* from the registry; otherwise you can use a number from the *; ;* unrestricted range. Numbers in the range of 6000h - 7FFFh are *; ;* available for unrestricted customer use. *; ;* To request a number from the registry, sumit a UCF or contact *; ;* the product CTOS-Registry and request the number of system *; ;* commons you require. *; ;* *; ;* For this example, we'll use 6000h. *; ;* *; ;* 3. Write the code which will implement MySysComm. This code *; ;* should have an initialization section which is responsible for *; ;* installing. This code should make the following call: *; ;* *; ;* call InstallSystemCommon(6000h, @MySysComm, @('pqw'), 3, ...) *; ;* *; ;* where @MySysComm is the address of the public procedure which *; ;* implements the system common call, @('pqw') is a pointer to *; ;* the parameter string, and 3 is the length of the parameter *; ;* string. For further information, see the CTOS Reference Manual.*; ;* *; ;* This notifies CTOS of the location of the code which will *; ;* implement the 1808th system common procedure. *; ;* The initialization code should then call ConvertToSys and wait *; ;* on an exchange set up for deinstallation. *; ;* *; ;* 4. Create a command called InstallMySysComm to install the *; ;* "service". *; ;* *; ;* For an application program to actually make use of this new installed *; ;* system common procedure, the following steps should be taken: *; ;* *; ;* 1. In the source of the application make a call to MySysComm, *; ;* which should be declared EXTERNAL. *; ;* *; ;* 2. Edit this file by adding a macro call of the following form: *; ;* *; %' %OsSubLab(6000, "MySysComm") ;* ^ *; ;* / \ *; ;* | *; ;* | *; ;* Start in column 1 *; ;* *; ;* This macro call will cause an ABSOLUTE PUBLIC symbol of *; ;* MySysComm to be created. Its value will be resolved at load *; ;* time to the correct address of MySysComm. *; ;* *; ;* 3. Link the application program modules with the module created by*; ;* assembling this module. *; ;* *; ;* 4. Run InstallMySysComm *; ;* *; ;* 5. Run your application program. *; ;* *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1993 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; STACK SEGMENT STACK 'STACK' ; default stack so programs won't crash ! DB 512 DUP (?) STACK ENDS $include([Sys]ossub.mdf) ;*************************************************************** ; EXAMPLE * ; * %' %OsSubLab(262, "SystemCommonCheck") * ; * ; * ;*************************************************************** ; ; ***** Put OsSubLab macros below this line ; The following macro is for backwards compatability with object ; modules compiled using old names for CTOS procedures. The ; syntax is: ; %' %Same("SysCommonName", "Alias") ; ; You will not need to worry about this unless you are replacing ; an existing system common procedure which was known by two ; names. ; ;*************************************************************** ; EXAMPLE * ; * %' %Same("SystemCommonCheck", "GetUserNum") * ; * ; * ;*************************************************************** ; ; **** Put "Same" macros below this line END "asyncCTAsm x12.3.0/FTB-Io)??SEG??SEGdatadataasynccodeDGroup(hhBh^Z nCcbActiveMaxCZAsyncRequestDirect AsyncRequestBuildAsyncRequestDirectbBuildAsyncRequestlCheckContextStack CreateContext HeapAllocHeapFree@HeapInit InitContext ResumeContextSwapContextUserTerminateAllOtherContextsTerminateContextTerminateContextUserT TerminateUsergTestForStackOverflow2 StackOverflowGpCcb& heapFreeHead^nResumeContextErrornBytesHeapFreeprocBuildAsyncRequest* ccbActiveHeadoCcb&"procBuildAsyncRequestDirect. prgPrcLookup25 nCcbActiveq heapFreeTail minStackFreeprgRcMax:_ ccbActiveTailnStackOverflow minHeapFree nBytesHeap oHeapFirst exchTarget$`nCreateContextError% AsyncStatsprgPrcLookupBase6pRqFComparePointer LogRespondWaitLoopercAsyncRespond GetpStructure LogRequestRequestexchServ GetUserNumberFatalServerErrorfDebug RequestDirect&F??FJlb֜)(U*T,T.T0Tf^Y_XWQVUPWWU~WW u)-u&g~GGGg]5AGVVVV(V*V-V /V AWVYVsb^_X$WV$UNv3$:&; s"2&&6&A&ڎN]&7&2C+-\u+&7RU2QS23F F[XFC5&:r Pt 26C 26CCNN&C&:sC2&CC~&GG_ $tQWWWW#u]Z22C]_^VW&3҈WWWˊa -6DZĝ ģV V $V&V)V+V4V6V9V ;V BVDV]a57\à7|5UA&FJtH]֜ ۠Ut>F t;&U t/Su;G u;WuG Gtw&FP&P??uR@;~&>F>G &E GGGGFG 3GGG]ZY_^ދQR]L !FVHVO[`d]fTjptx}āąČô9zUF  %O+rtrOu㸵>GGFJG)>?t >&; s ~&&]3 ]c!)BFMY]bO@U>^ ;w-;r)FJuO ts5t;r tFE;uM;u,DE:;uDGS"[ 3 ]  ,2ć8UF ^-GGGFJ>3]!)>>uUP3P2P2&G < r< wA<tP3P2P uBP3P6P u*P3P:P uP u>]øH3&> I&&t&48<&>>.uD&>?;u;&A:&>E.u,&>Fĝu#&H2&>V.u&>Wu &Y63넸넚eVV/BFVHVX\V^VnrVtV}āV ȃV ċįijķϴʠ6tc>At;wuSVwwP[WW u8Gu2G>WW u&GG-p 'V)V2=TZvĈČēVȕVĘVȚVġ]ȣTĴĸĿVVVVδVVǠUv%PSPf]U3PvTPU]pBU&w;tP@u"wS@[u t]˫]T%]'T.8V:VxTUvvTP]gU@ut;&tF uC;G uF&EFGt93&M&Mt*3& &}t&}t &G@됃GSWW u-[m38@t!&g&>g:]I jUovčVȏVĒVȔVĢĨĮVȰVĴĻĿY02-+&r ;w3ø>uUPҜ  (V *V ވ9 t debugtrapCTAsm x12.3.0/FTB-Io+??SEG??SEGdatadataDbgTrapcodeDGrouphhhZ debugtrap AGàt initallocCTAsm R12.3.0_??SEG??SEG initalloccoedArrayArrayConstConstStackStackDataDataMemoryMemoryDGroupyh@M˘hH H h ΘH  7ArrayLow% cbArrayFree ArrayHighӐ,cbFree raNextFree pToDeallocateAllocMemoryInitQPCurrentOsVersion ExpandAreaSL AllocMemorySLDeallocMemorySL QueryMemAvailGG?UQQQ u urP P u > rPP tPPP++£ 3؍£FPi=tF ;FvF %F ȡ t+sF t] t&+r +!ډV  v FP=uF+^&&_]3PP tأ+£ 3F =w%F ȡ t+sF tJ t+r +"ډV  v FP=uF^&&_]6A!&V(V0:DIVKVUaVcVgk{ĀąċĘҴ۴)V+VZ_VaVmquzŃņŜťūžʴʹҴ޴VVF UQQ^S=u(PFP=uF+^&;s&]ۜ V VV V}t logasyncPLM86 V2.308/27/93 17:30:3Ζ3STACKMEMORYCODEDATACONST LOGASYNC_CODEDGROUPVh@NHHVTD K1RGLOGPLOGLILOGPERCSTOPRRQSTOPT5LOGMSGIN LOGRESPOND( LOGREQUESTOLOGMSGdPRQEXCHSERV D,U&G;uPPSd]{ "\+(UP^Sd^&G t;Ru]K \OU츻P^Sd] \+bdU>PuP1PP؍LNF FGGF^&G ;Tu] "&*Ut logasyncdmyPLM86 V2.308/27/93 17:30:3Ζ3STACKMEMORYCODEDATACONST LOGASYNC_CODEDGROUPVh@HH TD K5LOGMSGIN LOGRESPOND LOGREQUEST LOGMSG D U]b U]X  U]Q U]HtB:H$3*PcbFree oCcb StackOverflow ArrayHigh AllocMemoryInit minHeapFree ResumeContextprgRcMax logasyncdmy!P`9H3X#{,oh pToDeallocate TerminateUserSwapContextUser cbArrayFree HeapInitprocBuildAsyncRequestDirect minStackFree ccbActiveHead prgPrcLookup ccbActiveTail nCcbActiveprocBuildAsyncRequest debugtrap! async!R,G;B"M3]nBytesHeapFreeArrayLow prgPrcLookupBase InitContext CreateContext exchTargetERCSTOP HeapFreeRQSTOP AsyncRequestDirect9Vc%/3C]NjPLOG TerminateAllOtherContextsTerminateContextILOG debugtrap BuildAsyncRequestnResumeContextError heapFreeTail AsyncStats logasync! initalloc! 2F>&ohb|NW*TestForStackOverflow raNextFree pCcb nCcbActiveMaxTerminateContextUser AsyncRequest heapFreeHeadnStackOverflownCreateContextError HeapAlloc nBytesHeapBuildAsyncRequestDirect oHeapFirstRGLOG CheckContextStack COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: async.lib VERSION: R12.3.1 (friday november 12, 1993, 16:20)  pstatsreqCTAsm x12.3.0/FTB-Io'??SEG??SEGSTACKSTACKseg1Hseg9Hht B ŐOpenPSLogSession psReadLogQ>psOpenLogSessionDeInstPSServer psOpenStatSession  ReadPsLogqpsDeInstServer psResetCounters psGetCountersResetPSCountersClosePSSession OpenPSStatSessionpsCloseSession  GetPSCountersIt5&?,HpsResetCountersOpenPSLogSession psReadLogResetPSCounterspsOpenStatSessionClosePSSession.GP=X4$_ psGetCounterspsCloseSessionpsOpenLogSession ReadPsLogDeInstPSServerOpenPSStatSessionpsDeInstServer GetPSCounters pstatsreq! COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: psuser.lib VERSION: R12.3.1 (friday november 12, 1993, 16:33) ;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: samgenall.asm *; ;* *; ;* MACHINE: NGen/SGen LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION: *; ;* *; ;* The file "SamGen.Mdf" contains all of the macro definitions for the *; ;* macros which are contained in this file, "SamGenAll.Asm". *; ;* The Sequential Access Method (SAM) implementation contained in *; ;* CTOS.Lib may be reconfigured by creating a tailored SAMGEN module. *; ;* First, the SAMGEN.ASM source file must be edited to reflect the new *; ;* configuration. After editing, the SAMGEN.ASM file must be assembled *; ;* and then the resulting object file, SAMGEN.OBJ, mustbe included in *; ;* the list of object modules at link time. Alternately, if the new SAM *; ;* configuration is to be the default SAM configuration, the Librarian *; ;* utility may be used to overwrite the SAMGEN module contained in *; ;* CTOS.Lib. The default SAM configuration contained in CTOS.Lib includes *; ;* disk, keyboard, video, parallel printer, null, and spooler byte streams.*; ;* In addition, the user may wish to include other byte streams, *; ;* e.g. communication or serial printer byte streams. *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1993 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; $INCLUDE ([sys]samgen.mdf) %Init $EJECT ;***************************************************************************** ; The "DeviceOpen(deviceName,OpenProc)" macro defines an OpenProc routine to * ; be called when OpenByteStream is called with the deviceName specified. To * ; add an additional byte stream to the SAM configuration specified in this * ; file, add a DeviceOpen macro to this section, defining the new deviceName * ; and the corresponding OpenProc. To omit a byte stream, delete from this * ; section the DeviceOpen macro associated with the byte stream to be omitted.* ; To substitute a new byte stream for an existing byte stream, replace the * ; OpenProc parameter in the appropriate DeviceOpen macro with the new * ; OpenProc. To add, omit, or substitute byte streams also requires editing * ; the following sections of macros. Note that the deviceName "[Disk]" is a * ; psuedo name for disk byte streams. DO NOT call OpenByteStream with the * ; device spec "[Disk]". * ; * ; To add a user written byte stream for device Foo add the following line to * ; this section * ; * %' %DeviceOpen([Foo],OpenByteStreamFoo) * ; * ; To omit disk and spooler byte streams delete the following lines from this * ; section * ; * %' %DeviceOpen([Spl],OpenByteStreamSpl) * %' %DeviceOpen([Disk],OpenByteStreamAD) * ; * ; To substitute synchronous byte streams for asynchronous byte streams * ; replace * ; * %' %DeviceOpen([Disk],OpenByteStreamAD) * ; * ; with * ; * %' %DeviceOpen([Disk],OpenByteStreamSD) * ; * ; If you know that you are going to use the 8251 chips on the MegaFrame, * ; then replace * ; * %' %DeviceOpen([Comm],OpenByteStreamC) * %' %DeviceOpen([Ptr],OpenByteStreamPtr) * ; * ; with * ; * %' %DeviceOpen([Comm],OpenByteStream_8251) * %' %DeviceOpen([Ptr],OpenByteStreamPtr_8251) * ; * ; And delete the DeviceOpen for [8251] * ; * ;***************************************************************************** ; %DeviceOpen([Kbd],OpenByteStreamK) %DeviceOpen([Vid],OpenByteStreamVid) %DeviceOpen([Lpt],OpenByteStreamLpt) %DeviceOpen([Ptr],OpenByteStreamPtr) %DeviceOpen([Nul],OpenByteStreamN) %DeviceOpen([Comm],OpenByteStreamC) %DeviceOpen([8251],OpenByteStream_8251) %DeviceOpen([Spl],OpenByteStreamSpl) %DeviceOpen([Disk],OpenByteStreamAD) %DeviceOpen([Gpam],OpenByteStreamGp) %DeviceOpen([Debug],OpenByteStreamDbg) ;*************************************************************** ; To add 1/2 inch Tape or QIC bytestreams, remove the leading ; percentsign-quote (%') from the following lines: ;*************************************************************** %' %DeviceOpen([Qic],OpenByteStreamT) %' %DeviceOpen([Tape],OpenByteStreamT) $EJECT ;***************************************************************************** ; The "tagProcs(tagName,FillBufferProc,FlushBufferProc,CheckPointProc, * ; ReleaseProc,SetImageModeProc)" macro declares five * ; device dependent procedures to be called when the various device * ; independent procedures (ReadByte and ReadBsRecord, Writebyte and * ; WriteBsRecord, CheckPointBs and ReleaseByteStream, and * ; SetImageMode) are called. * ; * ; Note that "tagProcs" replaces an earlier macro called "tagProc", * ; in 10.0 CTOS and earlier. "tagProc" is still defined in SamGen.mdf * ; to avoid breaking existing user-customized SamGen files. Be careful * ; to use "tagProcs" exclusively in all new SamGen files, and never * ; to mix these two macros in a single file! * ; * ; The tagName parameter is declared as a PUBLIC BYTE and is given a * ; value. This value is used to route the device independent calls to * ; the apppropriate device dependent routines. The appropriate tag * ; should be declared as an EXTERNAL BYTE within the OpenProc procedure * ; and the tag byte of the BSWA should be assigned this tag value. * ; * ; To add an additional byte stream to the SAM configuration specified * ; in this file, add to this section a tagProcs macro for each access * ; mode associated with the new byte stream, declaring the five device * ; dependent procedures to be used when a device independent procedure * ; (ReadByte and ReadBsRecord, Writebyte and WriteBsRecord, CheckPointBs, * ; ReleaseByteStream, and SetImageMode) is called. In some cases not * ; all five entries will apply. For example, if SetImageMode does * ; not apply, use the name SetImageModeIllegal. To omit a byte stream, * ; delete from this section all the tagProcs macros associated with the * ; byte stream to be deleted. To substitute a new byte stream for an * ; existing byte stream, replace the five device dependent procedures * ; declared in the tagProcs macros with the new procedure names. To add, * ; omit, or substitute byte streams also requires editing the previous * ; section of macros and the following section of macros. * ; * ; To add a byte stream for device Foo, which can be opened with mode * ; read or mode write, add the following lines to this section: * ; * %' %tagProcs(tagFooRead,FillBufferFoo,FlushBufIllegal,CheckPointBsFoo,ReleaseByteStreamFoo,SetImageModeFoo) %' %tagProcs(tagFooWrite,FillBufIllegal,FlushBufferFoo,CheckPointBsFoo,ReleaseByteStreamFoo,SetImageModeFoo) ; ; To omit disk, spooler, and CDROM byte streams delete the following lines ; from this section: ; %' %tagProcs(tagDiskRead,FillBufferAD,FlushBufIllegal,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagDiskWrite,FillBufIllegal,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagDiskModify,FillBufferAD,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagSplWrite,FillBufIllegal,FlushBufferAD,CheckpointBsAD,ReleaseByteStreamSpl,SetImageModeSpl) %' %tagProcs(tagCdRead,FillBufferCD,FlushBufIllegal,ChkptNop,ReleaseByteStreamCD,SetImageModeIllegal) ; ; To substitute synchronous disk byte streams for asynchronous disk byte ; streams replace: ; %' %tagProcs(tagDiskRead,FillBufferAD,FlushBufIllegal,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagDiskWrite,FillBufIllegal,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagDiskModify,FillBufferAD,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %' %tagProcs(tagSplWrite,FillBufIllegal,FlushBufferAD,CheckpointBsAD,ReleaseByteStreamSpl,SetImageModeSpl) %' %tagProcs(tagGpamWrite,FillBufIllegal,FlushBufferGp,CheckPointBsGp,ReleaseByteStreamGp,SetImageModeGp) ; ; with ; %' %tagProcs(tagDiskRead,FillBufferSD,FlushBufIllegal,CheckPointBsSD,ReleaseByteStreamSD,SetImageModeIllegal) %' %tagProcs(tagDiskWrite,FillBufIllegal,FlushBufferSD,CheckPointBsSD,ReleaseByteStreamSD,SetImageModeIllegal) %' %tagProcs(tagDiskModify,FillBufferSD,FlushBufferSD,CheckPointBsSD,ReleaseByteStreamSD,SetImageModeIllegal) %' %tagProcs(tagSplWrite,FillBufIllegal,FlushBufferSD,CheckpointBsSD,ReleaseByteStreamSpl,SetImageModeSpl) ; ;***************************************************************************** ; %tagProcs(tagDiskRead,FillBufferAD,FlushBufIllegal,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %tagProcs(tagDiskWrite,FillBufIllegal,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %tagProcs(tagDiskModify,FillBufferAD,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamAD,SetImageModeIllegal) %tagProcs(tagKbdRead,FillBufferK,FlushBufIllegal,ChkptNop,ReleaseEasy,SetImageModeIllegal) %tagProcs(tagVideoWrite,FillBufIllegal,FlushBufferVid,ChkptNop,ReleaseEasy,SetImageModeIllegal) %tagProcs(tagLptWrite,FillBufIllegal,FlushBufferLpt,CheckPointBsLpt,ReleaseByteStreamLpt,SetImageModeLpt) %tagProcs(tagLptRead,FillBufferLpt,FlushBufIllegal,CheckPointBsLpt,ReleaseByteStreamLpt,SetImageModeIllegal) %tagProcs(tagLptModify,FillBufferLpt,FlushBufferLpt,CheckPointBsLpt,ReleaseByteStreamLpt,SetImageModeLpt) %tagProcs(tagPtrWrite,FillBufIllegal,FlushBufferC,CheckPointBsC,ReleaseByteStreamC,SetImageModeC) %tagProcs(tagNul,FillBufferN,FlushBufferN,ChkptNop,ReleaseEasy,SetImageModeIllegal) %tagProcs(tagCommRead,FillBufferC,FlushBufIllegal,CheckPointBsC,ReleaseByteStreamC,SetImageModeC) %tagProcs(tagCommWrite,FillBufIllegal,FlushBufferC,CheckPointBsC,ReleaseByteStreamC,SetImageModeC) %tagProcs(tagCommModify,FillBufferC,FlushBufferC,CheckPointBsC,ReleaseByteStreamC,SetImageModeC) %tagProcs(tag8251Read,FillBuffer_8251,FlushBufIllegal,CheckPointBs_8251,ReleaseByteStream_8251,SetImageModeC) %tagProcs(tag8251Write,FillBufIllegal,FlushBuffer_8251,CheckPointBs_8251,ReleaseByteStream_8251,SetImageModeC) %tagProcs(tag8251Modify,FillBuffer_8251,FlushBuffer_8251,CheckPointBs_8251,ReleaseByteStream_8251,SetImageModeC) %tagProcs(tagPtr8251Write,FillBufIllegal,FlushBuffer_8251,CheckPointBs_8251,ReleaseByteStream_8251,SetImageModeC) %tagProcs(tagSplWrite,FillBufIllegal,FlushBufferAD,CheckPointBsAD,ReleaseByteStreamSpl,SetImageModeSpl) %tagProcs(tagGpamWrite,FillBufIllegal,FlushBufferGp,CheckPointBsGp,ReleaseByteStreamGp,SetImageModeGP) %tagProcs(tagCdRead,FillBufferCD,FlushBufIllegal,ChkptNop,ReleaseByteStreamCD,SetImageModeIllegal) %tagProcs(tagDbg,FillBufIllegal,FlushBufferDbg,ChkptNop,ReleaseEasy,SetImageModeIllegal) ;*************************************************************** ; To add 1/2 inch Tape or QIC bytestreams, remove the leading ; percentsign-quote from the following lines: ;*************************************************************** %' %tagProcs(tagTapeRead,FillBufferT,FlushBufIllegal,ChkptNop,ReleaseByteStreamT,SetImageModeIllegal) %' %tagProcs(tagTapeWrite,FillBufIllegal,FlushBufferT,CheckPointBsT,ReleaseBytestreamT,SetImageModeIllegal) ; $EJECT ;***************************************************************************** ; The "DevDepProc(devDepCall,devDepProc)" macro declares a routine devDepProc* ; to be called when the device dependent routine devDepCall is called. This * ; macros allows for substitution of alternate routines to handle any device * ; dependent byte stream routines defined (such as QueryVidBs, GetBsLfa, * ; SetBsLfa, or SetImageMode) or the omission of any device dependent routines* ; not needed. * ; * ; To substitue synchronous disk byte stream implementations of the device * ; dependent routines GetBsLfa and SetBsLfa for the asynchronous * ; implementations, replace * ; * %' %DevDepProc(GetBsLfa,GetBsLfaAsync) * %' %DevDepProc(SetBsLfa,SetBsLfaAsync) * ; * ; with * ; * %' %DevDepProc(GetBsLfa,GetBsLfaSync) * %' %DevDepProc(SetBsLfa,SetBsLfaSync) * ; * ; To omit the device dependent routine QueryVidBs delete the following * ; line * ; * %' %DevDepProc(QueryVidBs,QueryVideoBs) * ; * ;***************************************************************************** ; %DevDepProc(QueryVidBs,QueryVideoBs) %DevDepProc(GetBsLfa,GetBsLfaAsync) %DevDepProc(SetBsLfa,SetBsLfaAsync) %DevDepProc(RenameBytestream,RenameBsAsync) %DevDepProc(DeleteBytestream,DeleteBsAsync) %DevDepProc(SetImageMode,SetImageModeBrn) %Final GW*k$B  X0< tL!;vB Copyright 1993 Unisys Corporation. All rights reserved.Ver R12.3.1 Linker R12.3.1`zzoz oP/Э __`Oo`_ P/@?pP/`?O P_@o_p_/0_ o  _0p / ?/@Op_? `!p!P#O@$$`&P'/'(?0+p+P,? -`-..0`2`789:;? C`EO@HPQQROVXYo@Z[?`\k@o0pq?qr_rOt/Pt?vwPyPz/@|p}P~O00ЈOPp `_?@p*'(")#+7* 8% /N!)bb   *IWVl0 i i , Y JWXgt<X2 6T6g66AAA!!!!!!!!!\'M  / F X )<_F0 {!zzzFG_y3r7H0Cc&&&l&&&&v&&&&&&&+&B &{ & &! &T & & &k & & &1 &g & & & &&&a T-hjDiy/.+^F^f^^^U8)4)A)])v))) ) )S ) )))R)^;^^^^=P,2(`(((((((   b0 = ` ?  + , L e f i j 8>@CKq(4GLbvw%26AOm iyz&Tcp}$7E^)^$(GH   $ ] l      . 5 < C J O j       / O V j }        $ 0 B O ^ bb5bTbibbbbbbbb7bbbbbbbbb;bGbbbbKbdbbbb1bRbkbbbb7bPbsbbbb?bXbnb}bbbbb b9bObebbb0bFbab|bbbb+4 n Cj Wt" 8 N r         / D W m     c     2Q_jG[ycu>zSew'Kg}>MYy L [   !   '    5 ?  If5p` 0 !0 '0 10 G0 q0 0 0 0 0 = f= = = = = = = = (= R= i= = = = = 4= = = = = := ]= = = = = = = =  $ @ G 2      / 6    ' J Q m t      o     V       X  : r " 6 ? ` ` P` m` ` ` ` H` [` e` ` _` ` :` ` ` ` @` G` c` j` ` ` ` ` M`  H D  e J   K  5 e { ? +? A? F? p r    /!9!    (  Z      - \  C, i, , , , ], k, , , , vL L L L j 'j Zj jj Ej wj / B  O u     ! F u     d  F L R M {{{5 I  ddd 4  N y     68V8 >> CCCC"CJC"K/K9K>KHKWKK!K&K8KBKQKVKcKhKuKKKKKKKKKK<KFKPKUK_KiKxK}KKKKKKKKKKK KKK)K.K8KKKK?KNKSKbKgKtKBKKKKdKKJK6 Kptqqqaqq!0Lu/"U  %.8=FY^!! %:Ve($(G(L(Q(Z(|(( 44!44444ww (=!8FKUZ s + (4? %%%%"2?66AX!b!l!v!!!!!O!=O!kO!O!O!O!#O!QO!O!!!!!!!! !!!!! !$!)!-!1!5!9!>!B!F!J!N!S!W![!_!c!h!l!p!t!x!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!#Q ~}sg!!8Tr3in!5AmIl*Pt os6iCi\iiiizQ`b%NIa;&&&A & & &p"`9Z03$$$ $773EzEE9EkEF^^4uR! ))p))`))I)`)))Q)))Q))))\ ) ) ) ) ) )% ) ) ) )9 ) ) )))))B)))),)y)))))+)^y^^^^,^b^Yeq&   {  t  Q  #$(MetaWare High C Run-time Library Copyright (C) 1983-1988 MetaWare Incorporated..[KBD][VID][]}[!Scr]]$$.Tmp}[!Scr][!Scr][scr]<$>BsFilter.tmpVNVFp        ~,,{}MASTERSERVERLOCAL{}[]{}[]<>[sys]LptConfig.Sys&Error 2624: msg= %0N maxlen= %1N^YesNo`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijklmnopqrstuvwxyPress NEXT PAGE or SCROLL UP to continue,(Press NEXT PAGE to continue,!a?!*a**2Q=\zCKACTION BACK SPACEBOUNDCANCELCODECOPYDELETEFINISHGOHELPLOCKMARKMOVENEXT NEXT PAGE OVER TYPE PREV PAGERETURN SCROLL DOWN SCROLL UPSHIFTTAB#+17?GKQW]citTD aAdDhHmMnNoOsStTwWyYgG!oo!/!0d!/!0y! !hh!:!0m!!2AA!!*o!/!0d!/!0y! !*h!:!0m!!2*A!"!Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!"!Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!(!Www! !Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!(!Www! !Nnn! !*d!, !yyyy! !*h!:!0m! !2*A! !0t!:!0m! !*t!:!0m!!hh!:!0m! !2AA!!*h!:!0m! !2*A!!0o!/!0d!/!0y!!*o!/!*d!/!0y!!0h!:!0m!:!0s!!0t!:!0m!:!0s!.tmp!W*w! !N*n! !*d!, !*y!!N*n! !*d!, !*y!"!0o!/!0d!/!0y!-!0h!:!0m!:!0s!!2*A!!Nnn! !*d!, !yyyy!Invalid Template Index$Cb %6FVfzTN00sundaymondaytuesday wednesdaythursdayfridaysaturdayjanuaryfebruarymarchaprilmayjunejulyaugust septemberoctobernovemberdecemberampmnoonmidnight05 invalid namesunmontuewedthufrisatjanfebmaraprmayjunjulaugsepoctnovdecampmnm05 %0:BLU_fmrx~ #(-27;?BEI{R12.3.1<2C2[Kbd][Vid] L[Lpt][Nul][Debug]d[SysIn][SysOut]>!#4>%)*]7Tu8lDDa]yt]yB.\B\B.\Z]y DO$$yd]y ]y {y2,  \;\4|$ >5>5      %5lXh UNKNWN %2Xh[%4Xh] Unable to copy file "%s" to file "%s" Total of %d PUBDEF records required sorting Unable to copy file "%s" to file "%s"BParameter on line %d of the form is invalid. SPCS %s: Input File is a required parameter-new-new Error opening input file %s, Error %u Invalid input file %s Error opening output file %s, Error %uw Error opening list file %s, Error %ur Error opening Input Symbol file %s, Error %uw Error opening Output Symbol file %s, Error %u Input File: "%s" Output Files: "%s" "%s-old" Output File: "%s" Input Symbol File: "%s" Output Symbol File: "%s" List File: "%s" [Sys]PublicSymbolUtilityMsg.bin0123456789ABCDEF %s %s %s %s %s"%s" %8lXh --END OF FILE-- %2Xh%sSubt1FromBufIndexSkipRestOfRecord READ : lfa %08lX = %08lX + %04X Seek error file "%s" to file "%s" Start copy of file %s to %s End copy of file %s to %s Unable to copy file "%s" to file "%s"Error copying file %s to file %s Unable to truncate file "%s"-old-oldCODEINVALID DATASEG TYPE %02Xh<<< Module: "%s" at lfa %08lX ModEND: "%s" at lfa %08lX ModNXT: "%s" at lfa %08lX = %02XhMyAlloc - error, needed %d bytes MyReAlloc - error, needed %d bytes Parameter %n is not a valid yes or no string. Binary nationalization file "%s" is required.Unknown errorUnknown errorUnknown error %s %s In ""; "j" is bogus. It is %d In ""; "k" is bogus. It is %d prgPubDefTotalRecordInfo:%s [%d.]rcdSt=%08lX:nmSt=%08lX:rcdEnd=%08lX:SI=%04X:Srt=%02X:Out=%02X prgPubDefInfo:%s [%d.]rcdSt=%08lX:rcdEnd=%08lX:SI=%04X:ra=%04X In ""; "j" is bogus. It is %d In ""; "k" is bogus. It is %d In ""; "j" is bogus. It is %d In ""; "k" is bogus. It is %d In ""; "j" is bogus. It is %d In ""; "k" is bogus. It is %d Module: "%s" at lfa %08lXOutputSortedPubDefOutputSortedPubDef %d. Name = "%s";Class = "%s"PubdefInfo: Nextnewpublic=%08lX; recordlength=%d. ReadFrom (%08lX, %08lX) WriteTo (%08lX, %08lX) [%d.] copy pubdef to lfa = %08lX from %08lX to %08lXafter CompareRaOfPublicbefore sortafter CompareAlreadySortedFlagafter CompareLfaStart [%d.] copy remain to lfa = %08lX from start=%08lX to end=%08lX (cb=%08lX) [%d.] copy last to lfa = %08lX from start=%08lX to end=%08lX (cb=%08lX)%s '%s'. LOOKUP found %s%s '%s'. Case sensitive conflict between %s and %s %s too large %s %lX File "%s" contains the following symbols: File "%s" does not contain the symbols: %s In ""; "j" is bogus. It is %d In ""; "k" is bogus. It is %d%s %s ;Data %s ;Code %d %s%s %s 0000000000 ZZ Z ((((( AAAAAABBBBBB   VNVF4@4@4tmwmmml\l]^?Ǫ0mCD@@@ @ @4@p+ŝi@զIx@ߌGA~QC‘F uuvHM]=];Zw R`%uUF#tP(U^*nv.-X5:RL^jdvF|p@+ " ~ x r l gb]XSNI!D?:50+&! %#UP;;;-;;;+;;;;;PF=$v?>;u% >;u 6;;*P6;6;h7 vv;u6;^ v.GLLLL@LLLLLLLLLL2L LLL9LLLL+L@9G C >;tF;;;r.u;;;;r#0 - { ;"tUjjFV+~uA+FVvV+~uA+ًAv~vv  "uE"ut;>8u69696Z;6X;+>X;uA+RPPPhmm6L;6J;h@8#t#6Z;6X;6P;6N;h8j6;h,8>;t hH8hJ8>8u>j;t6h;6f; >\;ti69696Z;6X;+>X;uA+RPPPhmm6L;6J;h@8#t#6Z;6X;6P;6N;h\8j >t;t<-6r;6p; >];t +jjR;T;j=v<j6`;6^;h Z 3ҡR; T;tBV;jjb;d; t,j=v<j6`;6^;h Z j;jjl;n; t,j=v<j6`;6^;h Z t;jjR;T;j=v<j6`;6^;h Z 3ҡR; T;tBV;U^;<`;jjFVv&*XVt v&, v&v&D*XVt v&D, v&DjhD<V#u8MjhHN;uA+уVVv6X;Z;+>N;uA+ًA6N;>X;>X;uA+Ѿ|<uA+Av<>X;.j=v<j6`;6^;h Z \;>8t >8t h@F;H; uJh@J;L; u198 99"99*:9,::.::6;:8;6 9696P;6N;+>N;uA+RPPPhrm6H;6F;h@8#t P6P;6N;h<h Z<f6 969jj8#u6 969h;8; ;u6P;6N;h<h Z< 6 969jj8>\;t_69696Z;6X;+>X;uA+RPPPhwm6L;6J;h@8#tP6Z;6X;h<h Z<>V;uzh<6T;6R;d88 u[68;66;6T;6R;+>R;uA+RPPPhwm6D;6B;h@8P6T;6R;h<h Z<>j;uzh=6d;6b;df;h; u[6,:6*:6d;6b;+>b;uA+RPPPhrm6<;6:;h@8P6d;6b;h=h Z<>t;uzhB=6n;6l;dp;r; u[6:6:6n;6l;+>l;uA+RPPPhwm6@;6>;h@8P6n;6l;hD=h Z<><t j@;P;; uh@;; u;@;h;; u<h< < u;R;; u;R;; uuh;; t_h;; tIh@;; t3<>8t1hh<*#u<h@h;*#t+;@+v;;;:8t x;};;;;;6P;6N;ht=>\;tB>];t'6P;6N;h=6P;6N;h=6Z;6X;h=>j;t6d;6b;h=>t;t6n;6l;h>>V;t6T;6R;h >h<>h>>UFv>w>$*䖊d>v&w>$*䓊d>&Dv>$*䓊d>&Dv>$*䓊d>&D&D~UFt>$*䖊d>v&t>$*䓊d>&DU+F ~(v&DPF ;F rFv>w>$*䓊d>&Dw>$*䓊d>&Dv>$*䓊d>&Dv>$*䓊d>&D&D ~FFF<vsV ;V skv&Vt>**Ћd>v&@ t>$*䗊d>&@ F< r<w*.V*^&@>FF F냊F*^&@>FU+FDBV ;V rV;tFF%DF HF H;rNQDFPRvvKjEVPFP#tIB#t/=v6<6<hx>LPh|>džBFPh>iBjPFPLPK*HdžDF BB#t)=v6<6<h>LPh>UF FVPvvh>$@ >V;t6868jPh>6868hZj6@h>hZ UF=r";;w;&p&0h@l h@_UF*P6;6;h@A >];t jU졶;;;r"u ;;;vvvh@j UF+;;˃;;h@UF+;;h@ˡ;;Ċ*@@Ԋ*@@;6;?+@;;;@u ;@u>8tQRP6;6;h@=6 9696@6@8#tj68(6 9696;6;h@h@8#tHu@@@@6;&Pp68(6;@&;;;;;;;;@@@@6 969jj8#u6969jj8#t+6Z;6X;6P;6N;hA(68jU>8t6Z;6X;6P;6N;h6A 6 969jj8#t6969jj8#tFFF@6 9696;6;h@FP8#tHu 69696;6;vFPZ8F@VF;;w"u F;;s8=t#tP녀>8t6Z;6X;6P;6N;hTA 69698#u69698#t+6Z;6X;6P;6N;hrA68jUF +FF#u+;;;Vru;Fr ;V ru;F s jFF;;v/?*;&;j6;6;6;9;;6 969vv8#u(6 9696;6;vFP8#u68+UF +FF#u+;;;Vru;Fr ;V ru;F s jQF@;;v2F?*;&;j6;6;6;9;;6969vv8#u(69696;6;vFP8#u68+UF +FF#u+;;;Vru;Fr ;V ru;F s jFF;;v<?*;&;6;6;6;G;; u h6969vv8#u(69696;6;vFPZ8#u+6Z;6X;6P;6N;hA868jUP@F#te@69696@6@8#u:69696;6;vh@Z8#tHu69698#t 68(U FVĊ*FVԊ*FVNv?+NN+NvNvٖߊ*^FNJ*۹^FVN;@u;@u ;u;uF;FuF;Ftj@@6969vv8#u;6969v v vFPZ8#u69698#u68(6969vv8#tj68(69696;6;h@h@8#tHuFV@@@@6;&P68(vv v 6;vV UF V +FVFVFV#u#uFV;wu;s F@FFVFVRPvvFV"tFVFVRPvvFVNFVFVFVFVFV)FVhFVUP;;Fu ;;FuFV;;69698#tFP6Z;6X;+>X;uA+RPPPhmm8#uevvv 8#uPv 8#uA69696Z;6X;+>X;uA+RPPPhmm6L;6J;h@8#t6Z;6X;hASU 6 9696;6;8#t6 9698#t6 9698#t69698#t+>X;uA+щVRvV+>N;uA+ًA6N;~~uA+ѾAuA+AA~FVRvvvPPPhmm88#tt vP68FP6P;6N;VRjjjhmmVPvvvvjjjPv PFP6Z;6X;vjjjhmmPv6Z;6X;vjjjPv PvvUF*䨀t*V*ЉVF*FFUPFFF:FsV*^&FF*^&FUPFV**U FFFFV*N*FN*+^vUFFFF*䙊Ԋ*N*+֊Ԋ*N*+֊Ԋ*N*+NvUPFV**UFFF*䙊Ԋ*N*+֊Ԋ*N*+NvUFFFF*䙊Ԋ*N*+֊Ԋ*N*+֊Ԋ*N*+NvUPFF8u};;Fvu ;;Fry;;FԉV6;6;hFvv6;6;vΉVЃ #u#t&|uF&DFFA냀~u >AtF;;Aw9;j;R6;6; ;; u jAFV;&&PA;;&@&P AF&@ AF&@A&@;;Fvu ;;Fr;;Aw9;j;R6;6; ;; u j;;FԉV6;6;F>8tvv6;6;F;FsFFFkFAFԋV;&&PA;;&@&PAF&@ AF&@AAF؋V;&@&PAF&@A;;;;6 969RP8UPFUPF*䓃zw.v+U^*c%v.dzz"tFP~'HF~uFPZ"u{Nۚ*Fv:fFP(~yuN)F+6;6;/SFFFV+U F;;;vu ;;;r;;FV6;6; F>8tvv6;6;FF8tvv6;6;FF뤡;;;;UP;;;;;;;;;-P>8t#;+ҊԊ*;;RP >8tFjFPjj ! U>8u;HFh FV衤;;;;FVFF;;vFV죴;;FVFVF~sv^&FFVFVFF=%sfv&*Ff~tLF+FVFV;;6;6;Fn&*䖃;&x!tvvSFFh)vvˀ>At"+A<; >8t6;6;6;6;h B UF;;;;vRu ;;rGFV6;6;F*@<=r h;;;;w%;j;P6;6;;;6;;;<>;&&DF*@<6;+>;uA+ыAv6;;~&9:8tpFFF*;F~>6;^&*XVt6;^&, F6;^&:t&FF븀~tF*P6;6;vv! FbUFFFFFFFFFFjjP)FjjvFjjv FjjvF <^*#t tt'vFFF9F2F+F~tFFF<; At);;;;6 969RP8>;u{>8t6;6;6;6;h8tRP6;6;hXB U ;*PhvB+FFF;;;vu ;;;r~uFFF~s];;;wTu ;;;sIj6 9696;6;jFP8#u6;&F6;^&FFvvj6;6; S~u vuqUF v&D&T^ &v&T^ &Wv&)Dv &&TFVN F #t v&UFF$F;AwVRPhAA;Frl~wFF$FA AuFv6AhAF~uvhAF#u+AA~u+FAFPvhAnFv&F ~t"vhBh Zv FVUPnv&FV;AuA;VuA;s A)A F;AvVNAAAAUv&D-F;F ryvvv FV#u#t)~ t#;Vu;FtNF#tv&v&FV#u$#u v hBh Zh U+~uA+BRvV#u#t(+~uA+ًAv~FVUF @PFV#u#tv vvRPv^ & FVUFVFVv&*XVt v&, v&"tF֋FVUPv&*XVt v&*䖃 vv &*XVt v &*䖃 ;vuv&<u+HFF v&*XVt v&*䖃 vv &*XVt v &*䖃 F+UFv&*XVt v&*䖃 vv &*XVt v &*䖃 ;vu(F;Fs v&<tF;Fu+KFF Fv&*XVt v&*䖃 vv &*XVt v &*䖃 F+UF*V *N*A+"ؓUFF*^&8tUƈFFF*^ &"tV*^&"t :uFFӊF"t*^ &8uF*F뜸U vV;vFvRFPP(F@PFVvvvRPv^&ƒ +U Fv#tJvjFPP(jjFPFP4F#tvhBh Zv d FUj\FV+~uA+Av~vv~uA+RPPPhChhGhC$#tvvhNh ZjvvF~<~F@PhChFP$#u=F*ƄCFVvMM+CuA+ACD+NuA+BRvMM+NuA+ANFFBU~=~F=vMMUvv BU(+FډF؋F=},+~uA+JF;vv&8%uFF̍F FVFF;F}F^&W&OR܉JFjLRPhNhN^Kw.=Zqvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv`vvvvvvvvvvvv2vvvvvvvvvvvvvvBBU(B+FډF؋F=},+~uA+JF;vv&8%uFF̍F FVFF;F}F^&W&OR܉JFjRPhNhN^Kw.%Bevvvvvvvvvvvv vvvvvvvvvvvvvvvvvv`vvvvvvvvvvvv2vvvvvvvvvvvvvvhOhZ hZ 6BUF#|;Avvh(OjF#|;AvvhHOjFF;&@&+AF@~;~u%FF;&&+F~u+t~}iFv6;;O Fv6;;~>;; O~>;; UPvvhhOFF;AwJ;&@*P&@*P&p&p &p&p&p&p&0vhOFUPvvhOFF;Aw8;&p &p&p&p&p&0vhOFUF#|;Avvh PjF#|;Avvh,PjFF;&@ &+A F#u+t~}iFv6;;OFv6;;~>;;O~>;;UF#|;AvvhLPjF#|;AvvhlPjFF;&@&;AukFF;&A*&P*+ЉVB~;~u%FF;&&+F~u+t~}iFv6;;O Fv6;;~>;; O~>;; UF#|;AvvhPjF#|;AvvhPjFF;&&+F#u+t~}iFv6;;O Fv6;;~>;; O~>;; UF+FVFF;AsQ;&@;Fu6&@;Fwu&;FwF"F;&&PFVFFF;As";&@;FuF&@FՊFU6;6;hP>8t$6;6;hPhP&hPF+F@;FFF;Fv;&@F<&8;&&QFV><&q;&&pNv^CShQ^vvh"Qvvh0QFFe>8t h>Q$O &OuF;&&P$O&OF;&&PFV&@&PFVF+FFFF;As%;&@;Fu &@&+FF҃n>8tRv6&O6$OhJQvvvvhrQ$O&OFV+FVRP6&O6$OhQ"vvvvv>;G$O&OFV+FVRP6&O6$OFV+FV$O&OFF;Ar;&@;Fuc>8t&&p&p&p&06&O6$OvhQ6&O6$OF;&p&p&p&0 $O&O Fu$O&O6 9696;6;8P69698PU+FFFA;uJu 6;&:Dt$O&Oh6A>8t hQ>Av">8t hQh6A>Au$6;&t"tzjj?lA;&@A+&@F@FF;Aw6F;&A&;@tP4FFFh6AFF;Aw';&xuFA&@FЀ>8t hR6;&|u+FFF;Aw@F;&@&;AtFHFPv FFFh-6A>8t h RSFAHV;w>8tT;&@&P&+@&P -RP&p&p&@&P RP6&O6$Ovh6R6&O6$OF;&p&p&@&P RP $O&OF R>8t]F;;;&+@&P RP;;-RP&@&P RP6&O6$OvhR6&O6$O;;-RPF;&@&P RP $O&O69698P;+$OHF#u N>;v>;nv;v;v;~yF69696;6;vFPZ8P69698PUPFF=}DŽRDŽRFUPv&t&4&FRR^&G&WRRUPFv&<t$v&*XVt v&*䖃 vFӋFU+F~uA+щVP~&v&DPVj^RPhTEFP vvkRRFVvF#u#u+v&8tvvhTFVv&D&TFV[+U +~uA+щVP~&v&DPVj^RPhTEFP jvvFV#t#tjvvyFV#u#t%vvhTv&t&4hUj FV uF@<=r!h<< u+e<6<<6<^&7&G+&G~uA+ыAv^&?vv6F@<FVU+F[Z6f;&|~/&&? u 6f;&D @u6f;&L&&D&&*6h;6f;FZt= tƆZvXVu F=;t@u1~;uƆZF#~TƂ\\PFƆ[5[u.Fv\F~v\Ph:UƆ[N~tUF V >\;u>8tv v vvhHU jvvXFV tv>RtMb;d;#u#t+>b;uA+;u6P;6N;hTU 6d;6b;hURvvhUvvFV +v&t;tvvFVFVU F#|;U~vhUjF#|;U~vhUjvU&8&u&5~U&&w&7v~F#u/j6U^&&w&76U^&0&t&4F ~u+F~};vU&&PFV~& &A&&@FV&&QUFU^FU^FV^;;UU+UFF=}hRRFVvF#u#tC>UU&1&AU>8t&t&46UhV v&D&TFh#6UFF;U}hU&0vF&\*#ttt FVFVFVFVv&t&4vv6r;6p;F UF+FF#~:FF;F}*+FFF#|FPv^@~F)FF΋FUR&2*Vʾ2~BVRvvhVh ZUSN v^6F 6GY]U.V0V.2Vvvv v v&,V]UFPv v vv ]USv6t6tv Pvv N +;u;t v6D-Y]UP.V0V.2Vvvv v ,VfFY]Uv v vv6NV6LV ]UF Pvv6NV6LV ]UFPv v vvx ]UFYFYvvFF&D t&D @tvv v &D Pv<F;V ~~ F uA+v&T#tER^ F ^PS&D Pv<FF+vFV&D;Vt;FtFF)F~v(6\W^WPv&D Pv<;\WtFFN~w^v&|u&Dv&D @ts&D=|V+ɉVNN^+|ډNv ^&?F+vFV&D;Vu=;Fu8P&t&t&T Rv<=tv&D&D&T&&T Fv&)D&FF)FFF=v5 FPv vVv&T Rv<;FtFFF)FF#wv v^&?v&)D&FdFv&DN+ۋ+|Ӓ ~~ F N^uA+v&Tv v^&?v&DFF&&DN^+|ӉFV&D+FV}D&D&+D;\W} &4& F\W^W^&?FFN\Wv&\W&)Dv&D)F&)Dv&|~ ~v F#w #u<~t6Pv&t&t&T Rv<=u;v&D&D&T&&T~tv&& v&&L~v>Yt v&L FYF] U vvF&D u Y&L Hv&D t vv,v&L F n FV"| ++}YF Fu+dv&D tP+PP&D P|vvvvv+~ Fv&D t!vv YYP+PPv&D P|F]UP#F ;rVRvv2V.VF)F ~ wY]UP&V=t0V;v)+‰F,V$Vt $VuP4Vv>VPY]US6pW&F<*t<1r<9v~u6pW&<0t6pW&F<0r<<9w8FF 6pW&*Ѓ0VpW6pW&F<0ra<9v[6pW&<*uQ6`W&<} ~PuF6`W&؉F$V 6`W&F`WpW~PuFFF]USFVpWrW+$V&V(V*VF6pW&:ue6pW&<%t8jW%uA+щV6pW6dWfWhWpW)jW0P^ ^뚡pWrWFVFpW6pW&* wL.-BB4BBBBBBB&BBB;$V $V$V$V $VF~t+PFP&V6pW&<.u4pW6pW&<-upW6pW&F<0r<9vPPP(V6pW&(VuF Fu +P4>(VuWW(VW;rW&V=t ;WvFFFF"t$Vu $VukW#tPWP2V.V~t $VuD(V=tW;v+‰F,VP4VPU>(VuF Fu WWW,VP6WsWV2V.V~t]USPBF%FVV= s0v6|tF7 FWv^6@N~w]US00~F:F+҉FV#u#v PvsF+҉FV#u#v PvT F,VPFP2V.V]U+,V~uA+щjWF V `WbWUPvv_]US ^*%u0tzE3v..&M M M M M M M M M PM M M M M M M M M M M M M M M M M M M M M M |PM M M M M hW,VP6fW6dW2V.V>*Vu6`W&&TlWnW`W*F*Vu'v6`W&t&t&t&t&4 `W v6`WΚ)`W6`W&&TlWnW`W3ɀ~PuAQRP^,V6`W&&`WF%,V$VuPPVR2V.V$VuP}6`W&F`W6`W&&TFV`W#u#tZ6(V+~uA+v(V;rv6,V$VuVvvv2V.V$VtvY]UvvF&D u YFv&D tv&|t&D t+v&D u&||x&D tP+PP&D P|v&+DP&t&t&D Pv<Fv&+T;uFYFv&L v&D&T&&T&DFF]U +FvVZ+ӹvV+}|++VN}lv&;D tcvF&D t>&D t VFYY v&D t8v&D u&D u&t&tYYv&D Pv&D YFF]UPFv ZtZ;RVu;PVtPYYF=sF6RV6PVYYY]Uv9]U$vO]UP]˃VW&& _^QR˃݃ՃUv ]init]\+P9˄.ػ*Ћ22.TX+@42"t382>82&82?>82?u>>8282u...62ٛ>:2:2t:2.<tK2K2 4,D;w+jhhInsufficient stack for argv[]+SS+UDP>62t7>Wͫu/W;Wu&.6.66W6W6W6I26G2Z>:2tV>WͫuN.6.6.6.6P6I26G2Z.6.6WPW PW- P80387$$LA@4ı=@r-@ =r-UF2F2]UV+V K2F+F ]UvvF&d Zڌ;u#;u&D P<F<t <tv&L Z;Vu(;Fu#v&D P<<u v&d v&L  Z;Vu ;Fuv&d v&D t6Pv&D&TY u&d v&D&T&&T&Dv&D]U]U]UF ▸4;Wt;WtF@4PWPPFPZFF WWFPPFPF#t@4PWRRVRZFF<tG<tC<u$~t@4PFPPFPZF@4PFPPFPZF^*uu F#tNFv^&F<t^< tZF;F wM+FF WtY1F WWv vv FPF=tPlF]UPF WWv vv FPZPlF;F s >YuYFY]UF WWFPF#t+]_mwARGput_parmUS6YYY&7&G~6M6u>Yv6tF6Y6Y&DYY]scan_args U+PPVR~tYF@YYFFH|ZvHFF@~9vvFP~t<YF@YYF;F}FNjF;F}F릋]count_args UPY+YY+P8YYF%t+VFY]set_up_args Uv6YY6YYYYP6Y&&DY]U^ F㑋Fʖf ֒]0U YF+YFv&v&Fv vF&Vv&^*+tfat"bumrtEtuiutVwt~~tuFv&3ҊFYt~t-+Yv&<tPvv0l+PvvlF>Yt v&FYF]UFv惼 Zt F~v~vYFFv捄ZF^FV]UvvFF &D ~ u&D ~ u v&D  v&D ~tv&L ~tv&L @v <F<t<uF~tv&L ~tP+PPv |]U 3_tBVVFPVRVRVRVRv v vv?F~t FF FVF Ft'vvvvvvvv&L &DFV]USFv6DF ꖁƸWv^DPtv&&TPtv&D&T& &t t uYn]UYHFV;*F ▋WW uvcF;F}F֡Y=2}YYHP@YfF]UF WWvVS tvWWS tvDŽWDŽW]UF=u[=tV=tQF=t= u QF=r=v=F=t5=) t0~u+F=t= u~u ~t+P]Uv&<[uC&DFYuF WWvv+~uA+SPPP6YWWRDFP~tF WWFP~tF WWvv+~uA+SPPP6YWWQvVDF#tQvWWvv+~uA+RPPP6YWWRDFP~tvF]Uv vv]U+~uA+уrvv1"t+F>Yuw~ uF ▀WF F WWvv+~uA+SPPP^ *YWWRDFP,~tvF]U+~uA+уrvvu"t+7F>Yu~ uF ▀WF ~ u3F WWvv+~uA+SPPP.6:7F WWvv+~uA+SPPP^ *YWWPDFP7~tvF]UPFPvv+~uA+RPPP6YPvPY]tmHEAPCODEoffsetUF+҉FVF +FV++FV}vvPFFFV]sub_ptrUF+҉FVF +)FV~}vvPFFFV]each_chunk U YYPv&+RPV"uvvP9v&D&TFVV^ ^vFvFFVFVF Fu]each_item_in_chunkU PvvXv&tVFV&^&;Gt$SPvv^^ vv^^ "vv^^ FVFVv&|u] each_allocated_itemUFFU PFV#u#tRP^ ^]USU+Pvv]USv&|Du6v6t6D6T#u#t RP6\ 6\FVv6t6D6T]each_free_itemU YYFVFFvvF&|Ut VPv&D;Fu &D ;FtvvPFFSv&tVv&L&;tvvPvv^ ^FVFVv&D&T FVF FtV]remove_from_free_chainUv&|rY&D &T u&D&T YYv&D&T &t &D&T v&\&D #u#t&T &L&W &O]US]insert_into_free_chainUv&tVvV&|t&|UuVEv&Dv&D?v&#t^PVFV&|UuGVv&Dv&DvF&tVvV^&G&vvZJv&|r@YY^F&\&D #u#t Ž&w &Wv&D &D6YY]search_free_chainUU0PtFFfFV]USv&D^6;Gr 6w6Gʋ]normalize_relativeUFVFVN v NvN;Nt RP PFV]insert_chunk U+v&D&TYY&L&\;Yu;YtY&w&GFVYYv &DU~tvvVRF V v v ]add_new_chunk UF+FV+VQRPԊ*҉FV++}FV-} FFvvFV uvvFF&&D&D&D&D vF&&DDFV-&D&D&tVvV^&G&&D&Dvvvvj]malloc2U >YtFsF~v+ FvxFV uvv`FVF Fuvvv&D+FF=w &DFFFv&D-Y&DDY&DF&DPV FVRP^^ vvvFVN& ~v?F&D&DU&DY&TPVN& vv FF>YttFV] zU]hmallocU+PRvvvV>Yt%#u#tY#vYYFV]mallocUv6Y]possibly_free_chunkU]errUSv6t6tPnfreeUF FuFFVFV>Ytsv&|Du#v&DFPvvq&F;Ft~v&DUV5vvV>Ytf]check_heap_integrityUU PU% Py]US]US]HEAPCODEbefore_freeingUS `Fv6T ;vVNv~v6D;Fu 6D;Ftfv6D F6T;vV~sFnv6D6TNvFVNFvv~]reallocUvvFF^&G*F^F&WVv~YvvS t+Y`UI Pvv VtFV>`u9>`t2UI PvvVtFV>`u``FF `>Yt6vF#u#t(&D-FV;v+ʠYFV]creallocU`v v&t&4v&&T`F`]U^ *#t ttZF WW=F WWFPvVPlvWWFVFV v v`F WWPPvVPlvWWFPPlvWWFV+FV FV RPPlFV ]U+~uA+BV~ uA+BVF;rV;rPv v vv]UF#tY]U~v0F*WW#tPvl]UF*P d]UPvvPPFPj #uF*Y]UvvYY]U6JV6HVYY]UYF+YvvF&D uFv&D @u&|ui&|ub>XWu[&D tRZW&\&Pv&D&TRP&D P<@v&DHucv&D&T&&T&Dv&|uV&D tHv&D uP&t&t&D P<v&Dv&|uv&D&T&&T&Dv&|&D=t&D&T&+&T|v&TZW&XWuk>v&D&&T&LA&\+ىFVZW~uA+Cv&\v&DH&T;~&&T–&:[Wuv&D&;Du&D3v&DH&;Du>XWu&Dv&&T&+D&T&Dv&|uv&|u$>XWu&DN ++}v&DHxv&&T&+D&TFV&D+FVFF V;sEv&4^~9v^& BV)V FXWv&)D~>XW&[u~ vv&L >Yt v&L FY] U vvF&D u Y&L Uv&D t vv,v&d &|u&DF n FV"| ++}YF Fu+vvvvv[+~ F]UFfFV++|"}+YYvtFVY]Uv vv t]UvvS t]Uvt]UVWv~ N+rt@H_^] U[&D4M,$[PO]UF;[~[]U>[t [PO[[#~ V;|F[]US&v6D*6T+ЉVRFPv\SFP FPqFPFP<v~v6DFFvBFVs*$FFv6LF06\6@FrFF=} F뵋v6Dv6\6x0t+F@;}6D]US Fv6;D|vV.6: .68 tuvFPFP.6> .6< tv\Sv\Sqv\S.6B .6@ tr@v6D#t-\SD P v\Sqv6D]U6FPFP<v~v&<tFP<F#}*@F#t.PFPFPFPFPqFP.6B .6@ tsFPD P FPqFF**F#t0PFPFPFP FPqFPD Ps+FP.6P .6N t FPqNF^*Et Gt"etftgt"FF+ F@P FV;|Rnx00~GG FvB^~&AFF~~Fv&]UvFP$ Sq] US&V=t[;vR4[Y]US,V&V=t =r&VY]US[vV.6: .68 ts&vVFlvVq[-$Vt[+ $Vt[ [lY]USPFFNF;Fv[0tF+ҋN+;u;u$Vu v[.uNFHv6DF+F)[]US$Vu$Vu v6\[#tP[P2V.V$Vu>[u v6\Y]USP>[>[t[.v6D(V#unv6T[;}A+;rЉVʋ[[[Bv6TF)(V6|t<R@@P.v6|t$$Vu>&Vt [$Vu v6D^v6D[;|R[P2V.Vv6D[;~ +R4VPv6D#tP[P2V.V(V#u/v6|t"[#}أ[(V#t5;~'v6tV.6: .68 tuFv6|t$$Vu[^9PR [(V@@[^PT u[)(V(Vv6T;rЉVʾ[[)(Vv6T6|t PPd^PT P2V.V6[4VPv6t[P2V.Vv6|u(V#t P4VP]US F[[>[t FƄ[.F(V#u~v6T;rЉVʾ[^[V)(VFHv6D6|t Pv^v6t[P2V.Vv6|u,(V#t%P4VP^FHP[P2V.V[#F-#}@[F+[FF"[ #}у0v[[NF>[׋F=|ϊVv[^6W[@@Pƾ[V2V.V]USF>*VuFF^*Et=Gtet3ftXguX>(VtQ$VuF[H=|;(V~n(VD(Ff[#~(V;r)(V [(V]US[#}؉FFF FF~c[@*(V@@F]U.W>(Vu(V>*VuFFFPv6(Vvvv v vvVRv[F#tP4vFP2V.V>(Vu $VuFFF[^*Et0Gt2et&ftgt#[;|(V[*+$>(Vu[`[H=|;(V~ H[B[#~[*(VH3;(VuAʉ[[*(V+[@[>(Vu[[,V[v>[u] ??? A00.UFVFV~tAV+~ uA+щVv ~N;s+~FV]U~P PFPF>\u>\u #u+\\]Ul\PPF#t \0Fl\^+Fv&TR*;t FƄ\{v&LR*S^\v&DR*F#t FvƄ\}v&D*#t FvƄ\[v&L*^\v&D*F#t FvƄ\]v&D*#t FvƄ\Fl^v&L)**\v&D)*F+v\]UNv>r^+6r^^&vFv&&T>r^uA+Ѱ^>r^uA+Ѿ+>r^uA+V;tFvr^&@v&&Dv&<uv&<{t<[t<n^6n^vFuA+Ѱ>>n^uA+Bl^+\uA+ыA\>n^v&<\tl^>n^p^6n^p^6l^V+\uA+Ѿ~uA+Av>n^p^\uA+ы6n^p^vF+>n^uA+щVFN#t6n^^&8/u&\v&"u<.t&|.t}&|\tsvF6n^l^@;FrlFv&<\tn^p^l^N;u;uߺ+~uA+ыAvF~FNeF_n^p^v &&T+]U F#tyvvvFPFP%F#u[vvvv+~uA+RvvFV#u#t+~uA++Vv v vv]U YF#tpvvvFPFPF#uRvvvv+~uA+RvvFV#u#t+~uA++Vv]UF#tvvv FPFPF#tFPvv+~uA+RvvFV#u#t+~uA++VmmPF#tv vvFPFPF#uSvvv+~uA+RvvFV#u#t+~uA++VF#t v Fv ] SwFpEmulatorU>52uN #u3N F+؋F+}fFf+fv fff]^ VF"tĊ*ߊ*r #uP+RPv v TYv^;wu ;vI^ v ++ґ]Uv v vv֋]U>52udV V#}+ҋF V RPRv V1V#}+ҋFVRPRvFt+ʋFt+΋]fFff~ fff]Uv v vv#}^ v ֋]Uv v vv֓]U>62t6_6_6_ V@L}6_\^FvF3&L&;OsBV#t^FvFvF^Fv&Dv&+DF=@&| t#~u6_>_ _F#t Pvvv&D ^&:G u2PSvv"tkPvvv&L&DNv&| tPvvVDPvvvv"v&D v&| t PVh_~uv>_6_6_K]Ul]U>62t6_6_6_ VgLK36_&D &:DtB&T6_&| t _J_6_&DB_>_6_&|t_6_ V6_&L6_&|r6_6_6_&L6_&|rV\PSPS|+6_&L+&t++>@+v~_#}6|FP6_6_6_&D*_>_ F6_&D6_6_K] CDOS_ALLOC sysallocU>_t-_++FV|v6__PF#t%_v_PF#t +__F_FFV]sysfreeUvvF++ɾ+Q]allocated U]least_free_memoryU]U!v>_>62uH6_vF&D%&D #t&d v&& D& D& D@&D #t&D ]U6_~>62u6_&| t&| uv&L _]UF0FdPFP6_~PP9]U츌P]HEAPMGMT - heap error # Aborting...)*** Cheap-heap linked in => no heap dump.U*>62t6_6_6_ VbL_6_~6_ vF~u&| t_*_>__3ҊFv&:D tBVF-?&D@FVFPFPdFNNFPZ~s~wv~~݀r'FFFFPFPFPv>_6_6_K]UP46_P9]U___+|_ ]U_]UvvF&& D& D& Du+&D&D &D hv&|rJ_&DB_~Hv&|s>VFv&L++| F&)DFv&+DPVv&D]#***Floating point stack overflow***Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] UvN 3ۋCC]U~3ɋE]u=u Ëދ3҃sArE]u]U~%UUU]U~m]]]U~N BE]ur֋3ss 3ɃE]u]U~%UUUUU U U]U!>62tvvL6_6_Lvv6_6_T]U_t6HV&d 6LV&d 6HV&L @6LV&L @_t 6PV&d 6PV&L @]U /6VV6TVl6TVvF&D &T TVVVVYYTV VVuȋ]Uv&4FFVPv<6\W^WPPv<]U_vvP4M,$_PO]U츢P]U6_P9]ː***Program aborted.******STACK/HEAP OVERFLOW***UPv v %GFA~v F% F^wV.Cafaf{{v&&DNA&DN~v&Y]Uv&&T& D& T u+ v&D-?]Uv v vv]Uv v vvq]UnnormalInfinityDenormalU__FVNv_6_]˸;_u;_t ___>__% ã_._Û>_P_%A=@t=XÛÛÛ.2636&-6&-.:Л&=۾֋6&-6&-uܛ6G6G_6G_.____ˋܛ6G6_&6_&6_&?6_&/3tr@HÛ˻ >_.___˻>__ˋ6_&76_&'U~ UM]~tctgE ?uƀtE E Պϊ܊2҃t΀UM]]E E U~ ]MUu?||qĊߊ͊ցst F&E t΀ ~UM]]3333__U.>v .>v._3ۋˋ_#t_#tʡ_#t_#t ڃ_#t_#t ڃ_#t_#t _#t_#t _#t_#t VQS3΋ޡ_#t_#t _#t_#t _#t_#t _#t_#t _#t_#t _#t_#t _#t_#t _#t_#t ʃ_#t_#t ʃ_#t_#tWU._~EEEEu M ]] U 6_ ~6__v>_]U>62t 6_&t 6_&| u&t ]U]U>62t 6_&t 6_&| u&t ]U>62t 6_&d  6_&D ]U!6_ >_]U!>62tvvL6_6_Lvv6_6_]_Uv .>v_+؋U&`.__>_u>_u>_u >_u;._w rB;_wr:>_;>_w0r >_;>_w$>_)>_>_>__._ u*uu>_u>_tUL&__r~&__r&;._w rP;_wrH>_;>_w>r >_;>_w2$u Ë3u L&`&`]`+`~& &]&E&u] ;._wr;_r+_._ u uuvr;._wr;_rPLrU>62t6_6_6_ VlL6_&| t&|u6_>_  u+[6_&D F&TV:u5 ~P6_6_FP"3:FtBVFFF*@]UPFF_Y]UF@FF;F}F]UFz~F s3F ꖍFPvv`P FPqn F~ uv~]?Uv&4FFVPv<]U6\W^WPPv<]U !>62tvvHL6_6_LF3v&| vBV"_~"_~FFrv^&$v^&FFPv~FPFPPFPFPFFPFPFPF#vNoF>@v>_6_6_K]U.>62t6_6_Lvv:L6_~F-?F~t v&D v&D ~?~FFFFv^&@ sFF#}Z=?~R?+RFPv~F Fu~ u~wFFFԈFF~t1F FuFV FҋF+VًF+҉FVF Fu F FuFFFvFڋV+ҋJ+ ؉Nډ^ u +FىB+vFڋVܹ B+PQvvښFډV܈FًF#vN럍v~FrF*䖊F^&F*䖊Fٱ^&F<sF_]UP]&Cheap stack dump linked in => no dump.UF V 2~tDtHE ?]ƀtE E Ԋ2t΀UE3E]E E U~EU]?|I=Ċ֊t€t C2E t΀ ]333U>62t6_6_L-LFL^;_u ;_uFAd6_~FF~tN@=~u vB_uNN~uND ~rN _%V* Љ _F]UF>P2t=t P d]U~u] vFP,F uqv~N^Y~u ЉFVsjjj ^SvNF,jjFP/F uF^&G Z&W F&GF^SvFv dUFPFP"V^&?{t@&?[uT6`2:!4t. FPQSVSVQ^[Y=Xt ],N~] t&<~&] ~&] Y]^&G :!3tSv^ S^Sg<^SFP4F u'^Sv^ S^SgF!3^&G F^ &&W^&^&O :4v^&z4Vnjޱ;u$:u04r)4P+PjRPQhrmRPQF u(^&G :3u 4FF^Su ^&G s<&G s4~u ^&"^&G ^G ^ &Z&W^&}^&G&;Gr$Sv^ S^S9F uX^&?uL^&G&O+;FsFF^&^&FFv&t^^ &Z&W^F&G FFN F;vP~uJ^S+QFPFPF t tu.^ v8vNFYFF릋F^&F^&G :!3tRS^ Sv ^SF(5sm@4Vnjޱ;u$:uH^SF9^SFP4F u'^S^ Sv ^SF!3^&G F ^&^&O :4v ^&@4Vnjޱ;u$:u7Z4r0(5r)@4P+PjRPQhwmRPQF u(^&G :3u 4FF^Su FFN F;w~t^&W&;WrS^ R+QFPFT^&G&+GFV N+;sV^&FF^ v0~&}^9N^Y^F&GFFcF^&FU^&G :4v ]U^&G :4v ^&G ]U^&]U^&]U]U^& t^&G :2u &G& u]UQF =rmt =tmt"63rmP'443^&G ]UQF =wmt =amt!63v '443^&G ]U^&G :3t ^&4SP(]UQ^&^ &&W^&G :3t 4S)$]U^&G :3u4Sv*\ ]U+Zr tH]j&j^S/ u ^& +ZrHU3 &L&;Wt]U#tH3&GtH] 6r"^&&W&G4&G;F s Wv 4X^F&F&GFFF;FsN ;Nv4&@FFڋF;Fr ,4v@^&Z&WS4&_[&GU|s]4&G@] ar 4&G;FsGv4X^F&F&GFFF;Fs4&@FFFU>4u4P u>4t4&G44>4u]ð]UQQ4P4 55P uJF64P| u8 5=u04P u!F64P| u4=t=!t3]^ &G :=4uSvv^ &G :!3tWSvv n 3^ &G ^ Svv FNs=u8^ SFP,~u#!3^ &G ^ &dt@Fs2률!3^ &G F,^ &G :4r^ &G :2tw&G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &O^ &O^ &O&W;Vu;Ns+^ &r &G&;Gwe^ &G &W"N~;u;wL&wщFVN;u;s&+O &"N։~؋F^ &G-sSF u^ &G-sG<PFP<F^ &G-FVFVF%Ff^ &G^ &G^ &GNV^ &O &W"^ SPFPFPF u4F^ &G^ &G : 3t :3t^ SjF t^ &G&G &W"FV&9Wu&9Gw&G&W9Fu9Fu^ &G&WFV^ &G&9G*s&G*^ &FF^ &G@1&@FތFF^ FV&9W"u&9G v&G*H1Fܺ&G &W"N~;u;r_F&+O &"N։~؋F։F&O,r&9G*sSl F tF^ &G^ &G*&;G(uF&G(F^ &G* ^ F&9G*s&G*^ F&9G(v&G(Fr^ Sj$DF u^ Sl F uy^ &G ts&w8&SP^ &w"&w G<P^ &w: <F t@^ &G-^ &G &W"&G4&W6^ &G&G.^ &F&G0Z&W2~Yt^ &G@1&W^ &w&@F&Z&W^ &GN^ &O^ &OF~+&G &"^ &G&G(^ &G&G*^ &G,^ &Yti&w8&Sh^ &w"&w FP#Fu^ &?^ &G,(~t^ &G&GF^ &G :3t ^&FF^&G &W"&O*&;Wu&;GrI1&G^&G*1 uSj$DF u`^&G@1&@FF^&G*1&G &W"FV&w8^SQRPFP#FtK uX^&G*1V+^0^~&}*9^Y^&G*H13^SjDF u/v&|*&L+^9 ^&G*&G^&G,^ &G :=4uS^SzO^ &G :!3t S^S<6^ &du2 3^ &G ^ S^SF!3^ &G FU^&G :4r^&G : 3t:3u^&G&G &W"^&&Wc^&G :2uX&r&G&;Gv &G&W^&G&G &W"^&&W^&G s7&G s/^&/&_!^&G :3u^&&G ]^&^ &&W^&G :2t ^SF uk^&G;s]@1V&G&G &"F~&w8&XSv^&pWPG<P^&w:<F t@^&G-F^&GFrF@1V^&G&G &W"FV&G-sG<PFP<F^&G-3^&w8v&XSv^&pvvFP#FNVF׉NV~u t%^&9Wu&9Or&O&WFF t ^&Gv^&@F&Z&W^&GFV^&G &W"^&G&W;Vu;FYvF&GF^&G8^&G^&G&W&+G &W"FVF&G^&uFF^&G :!3t SvW6^&du2 3^&G ^SvWF!3^&G F^&G : 3t:3t :!3t^&G&G &W"FV&9Wu&9Gw&G&W^&G&9G*s&G*FP&t@"FP$DF u^&uSl F t^&w8&S^&w&w"&w G<P^&w: <F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2^Sv$DF Yu,^&w8jGPj ^&G :2u ^&G : 3t@&& tA"F&G :!3uC&du2 ^&du 3&G ^&G-sS&G :2u0G<PFP<1^&G : 3t:2t:3t ^G<PFP<FF^&w:FP u ~u~uߊFs^&w8jGPj FF^&w8 F^&w:)F^&G F u F uFF :r10^&Fr^&0FFF 10^v&F@ vvFPF^SvhF^&:F@F^Pvj]FF^&:F@F^Pvj6FF(FFF^SvRQPNQNQP F u$F t^ SNQvNQPjF~uVFF^S +PvFP<F u2~t,^S +PvFP<F u~tF;Fv4N+NA^v0^ ~9^YFF+F@^&^&<{t<[tF FF^&^&?{uFS +PvFP<F uoF sdt_NAv~^YF@^&^v&48 + ^& ^S+PvFP<F u ~uFHN;v9@N+^vp^~&=9^YF@N+^&CFPF u^&O@wA^~&=9^Y^&G@^&^v&48+^&v&4^P^&wg&we^&^v&48+^&"^vFF^&F^&G^vNFY^&Gw^ &Gj^&GyF^&^vNFYFPF uQ^&G@^&^&O@wA^^Y^&Ƈ^&Ƈ^PF uN^ GkP^ &PFPFPj$F u#FPvhjj^Sh+Pj Ⱦ^&G F =wmt =amt^SvFPFPjF$F uݍFPvjjFPQ؍GPQF!t=u~^&Gi^GePF9FvF^kvN@YF^&^S^Sv^SFP$F tF~u;^SvRPPRPF=u^v&xF^&Gi뾃~t<džCFEGv@CPEP}FF7^SFPvRQjv PvF u 3^&G +s ^&G8^&G8Fvj^ Sj7F t^&F^GkP#+P^&PFP<F uFt @^&F^& ^ &Ow~&=^ 9^NOY^ &G^&F t$@^wk~ ^Y^ vx$+/+~ B^&G :3t 3^&G ^SFPFPP$F u^SrF u}^&FFvN^S^Svm$F tJ^G8P^SvRPjhmm4F u"^&w8F t^&w8 FFU^&G :3t ~v F^&Gj]^ &dtZSFP^& uV^ &du&G-sG<P^S<^&^ Shwmvv^& u 3^ &G ^&^ &Gd<tN<uSh^& uH^ SFP^& u/^ Shrmvv^& u2^ &G ^&U]. 5]U#U$VWQ^S Y_^F^OGG w 3GGG؉GGGFG F GFGFGFGFGPS]UU^ SG PPFP,[#uMG~&wr/^ F%;u^ ^ FF;tX F ;FuX] ^&^SP$DF t^&G t~&w8&SP^&w"&w G<P^&w: <F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2~Yt^&GFu^&G@1V&G&G &W"F^&Gv^&@F&Z&Wv^&@&G^&G*^&G(^&G^&G, ^&G : 3t :3t F^&G-rG<PFP<F^&G-^&G0FF^F&G4&W6Ft.H^&O.+N^v0^9^Y^&O.N^F&)G.^v^&G0Z&W2F^&.uF tuSvDF tF^&G0FF^&w8^S^&w.&w6&w4FP$FFt.H^&O.+N^v0^9^Y^&O.N^F&G4&W6^F&)G.^v^&G0Z&W2F t ^&.u%FsFr^ShDF u^&G : 3t :3t ^&G&WFV&O&O &"N~;u;wN~Fs FF%5 uG^&w8>5 u4^&G&G^&G-^S>5^_]Uz+~F =amt =wmtO+F^PFPDF u1~Ps &F^&G3^&G F^&Z&W]U ^&^&G :3t ^&FF^&GF u^&O;wINF FF)F v ~^Y~ Nu+JVFt)N+^p^9^YN^&^v&FPFPDFv u^F&L]U^ S^Sl]FFFFFPFFFFP FFFF^FFPFuFF u)vFP|FF^&F^ &Ȇ^&^&G :K3t W^&G<t':t!&OFPsFr^&G^&u2F ^&~ t^ &?utPPP^ Sv _>D5u!D5FPF u ~ rD5B5 @5ujj@5P/F t^&GF@5&8G wF@5X ^Fv&DF&GF&GF&GF^&GF&GF&GF&GF&G F&8G uANsNQPPF t FF^&#tF ;Fv F&O#F ;Fw FrF9F w~^ &FF^&O&@^&G^&w6 FA:r jF~uv&<tF~to~tEv&<u<^&?~6t'~tv &*6 v &*6&4v &^&~tv &F^ &^So,PvFP<F uFt^ &FFF~NuV~u ^&P ~u^&726P^ S$~u8^&w&726P^ S$26F^~Hu2Ft tuS^Sv26P^ S$26F^~Du_~uFPF~u^&&WFV, PRPvvv26Pj ^ STF26F^^S^ &7^Svv^S$FU5Pj7j'+* +!'H"6o#:$<%-&"H'j()-*3+,"-:.<L/0,1"2>3495"X6z789 : ;B<H=< Error Warning detected LineNo errors detectedError detectedErrors detectedNo warnings detectedWarning detectedWarningsmissing input file.is duplicated file name on command line.should have only one input file.Unable to openImport library not created; Input file did not contain Exports.Librarian[Sys]Librarian.Run00Yes16Identifier truncated toToken size exceeded:Module-definition statement expected.V8 run specification required with Exports and Imports.Run specification should only appear once.Code statement should only appear once.Data statement should only appear once.StackSize statement should only appear once.ProtMode or RealMode statement should only appear once.Invalid LoadSpec in LoadType statement.HEAPSIZE statement should only appear once.RunType statement should only appear once.LoadType statement should only appear once. specification should only appear once.MinInstruction should be 8086, 80186, 80286, or 80386.MinMathInstruction should be 8087, 80187, 80287, or 80387.defined as both initialization procedure and exit procedure.is multiply defined as an exported entryname.'pwords' field ignored for segment'pwords' field required. is self-referenced modulename.is multiply defined as an internal entryname.Internal entry name required with an ordinal entry.Unrecognized construct.is not recognized in this context.statement ignored.Name or Library statement must precede all other statements.ignoredLoadOnCall, NoIOPL, Discardable, and Movable always set for non-Code segments.LoadOnCall, ReadOnly, Shared, NoIOPL, Discardable, and Movable always set for Code segments.attribute has already been set.attribute has been set by default.Multiply entered segmentandclassOrdinal valuedefined forhas been defined as an initialization procedure, but not exported.An initialization procedure name must follow InitGlobal or InitInstance.Unspecified error message.GW*<  XP tNG;v Copyright 1993 Unisys Corporation. All rights reserved.Ver R12.3.1 Linker R12.3.1Wsss0x zOЬ*o_ P/?0  /? O`O 0 _p o _@   /@ p _ oPP !_p#$%`&/ 'P(`)?* ++/,O-_.?`/002O3356/ 7P7?p::;?`<<P=0>@AFGPHIPJ?`RTOW_``aOe hhoij?kz~p@?P_O@/?/_OЗИpO0@@ _? *'(")#+7* 8% /N!))zGzzzzzzzzzZ; X- 1 T z         t ' J) p) ) * /   , YJWXgt<X T g  A"""""""""\'M /FX)<f_F0 {"NNNF___G_y3r7H0Cclv+B {  ! T   k   1 g    &a (U-UhUjDiy.5N+FfU8S4SAS]SvSSS S SS S SSSRS;=P, 2R`RRRRRRRzzzy    e   ! C Q R r #  E_w 6JKix} #AZf=MN_(7DQU^tyaoS!0 *8NRqqOz]zzzz z6z;zYzgzzz zz,z{zzzzzzz)zDzoz|zzzzzzz zzz+z9zFzSzczhzuzzzz$*=T  '1;Nj;U_is 7QgA_ u4Wex2*W-A,K    . m        K b t    - C v  -?Fdv?Vx ;m/j':Bu $Z''j+_p  ? W     Q c  ( T    8    " S k    6l*DpLcILWe[s&5DC[kSizXw yyyyyyy1y4y^yuyyyy y@yyyy9y\yyyyyy y+6;Tlw|1 H ! ' 1 G q '     H t D  e O  < u  J     K  5 e { e +e Ae Fe p r     /"9"! ! ! ! ! (! ! ! ! ! ! ! Z! ! ! ! ! ! -C \C C CR iR R R R ]R kR R R R vr r r r  ' Z j E w / B  O u     ! F####u#####d##F #LRM 5I 6V   "J"/9>HW!&8BQVchu<FPU_ix} ).8?NSbgtBdJ6 p/t/EEEaEE!_____0_L_u_w/wwww"wUw  %.8=FY^!!W %:Ve$GLQZ| !iKKii xx(x=x}!8FKUZ #s # #+ (4? %"?  X"b"l"v"""""#"=#"k#"#"#"#"##"Q#"#"""""""" """"" "$")"-"1"5"9">"B"F"J"N"S"W"["_"c"h"l"p"t"x"}"""""""""""""""""""""""""""""""""" """"#ZQZZ Z~ZZ}ZZZsZZZg""8Tr3in!5fffAmIl*Pt os6=C=\====N_Q_`___b_%NIa;A   D"ty`y9Z03 /aMu0PWaa3ozoo9okoF4uR! SSpSS`SSIS`SSSQSSSQSSSS\ S S S S S S% S S S S9 S S SSSSSBSSSS,SySSSSS+Sy,b !Y000000e000000q000& 0 0 0{ 0 0t 0 0Q 0 0*#NRMetaWare High C Run-time Library Copyright (C) 1983-1988 MetaWare Incorporated..[KBD][VID][]}[!Scr]]$$.Tmp}[!Scr][!Scr][scr]<$>BsFilter.tmpVNVFp        ~LL {}MASTERSERVERLOCAL{}[]{}[]<>[sys]LptConfig.Sys&Error 2624: msg= %0N maxlen= %1N^YesNo`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijklmnopqrstuvwxyPress NEXT PAGE or SCROLL UP to continue,(Press NEXT PAGE to continue,!a?!*a**2Q=\zCKACTION BACK SPACEBOUNDCANCELCODECOPYDELETEFINISHGOHELPLOCKMARKMOVENEXT NEXT PAGE OVER TYPE PREV PAGERETURN SCROLL DOWN SCROLL UPSHIFTTAB#+17?GKQW]citTD aAdDhHmMnNoOsStTwWyYgG!oo!/!0d!/!0y! !hh!:!0m!!2AA!!*o!/!0d!/!0y! !*h!:!0m!!2*A!"!Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!"!Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!(!Www! !Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!(!Www! !Nnn! !*d!, !yyyy! !*h!:!0m! !2*A! !0t!:!0m! !*t!:!0m!!hh!:!0m! !2AA!!*h!:!0m! !2*A!!0o!/!0d!/!0y!!*o!/!*d!/!0y!!0h!:!0m!:!0s!!0t!:!0m!:!0s!.tmp!W*w! !N*n! !*d!, !*y!!N*n! !*d!, !*y!"!0o!/!0d!/!0y!-!0h!:!0m!:!0s!!2*A!!Nnn! !*d!, !yyyy!Invalid Template Index$Cb %6FVfzTN00sundaymondaytuesday wednesdaythursdayfridaysaturdayjanuaryfebruarymarchaprilmayjunejulyaugust septemberoctobernovemberdecemberampmnoonmidnight05 invalid namesunmontuewedthufrisatjanfebmaraprmayjunjulaugsepoctnovdecampmnm05 %0:BLU_fmrx~ #(-27;?BEI{R12.3.1L2S2[Kbd][Vid] l[Lpt][Nul][Debug][SysIn] [SysOut]> 444!4#T>4%4) 4*]47tu484<<d<<4d<<a]y]yB.\B\B.\Z]y d<ODDy]y ]y {  y2L,,|;|4D >5>,5     8Input file: %s %s %s[Sys]ResourceLibrarianMsg.binDeletedAddedExtractedBParameter %d is not a valid yes or no string. %s: %s %s:%s %s:%s w%s: %s %s %s-new%s-old N9 \9h9ResourceTypeResourceID ResourceSpec: >UNKNOWN RESOURCE<*%dXX TYPE %d.*%dXX ID %d %c %s Parameter %s: .%s %s %s %s%s %s %s %s %s %s%s %s%s %s%s %s%s %s%s%s%s%s %s %s%s %s%s %s [%d]:%.*s [%d]:%.*s%s%s%s%s%s%s%s '%s'. LOOKUP found %s=%s LOOKUP not found %s%s %s First Token %s Second Token %s Value %s %s %u (%s) %s %u (%s) %s %s.%u%s%u.%u*.*%s.*%s%u%s%u.*%u ResDataBlk %d items: [%d] %s %s DELETE: *.* resourceresource %s %s %s; %s %s %s %s %s %s ADD: %s %s %s %s %s, %s %s %s %s %s %s %s %s %s %s %s Mask values for %s(created) tyFile=%04X;mask=%04X %s %s %s %s EXTRACT: %u.%u %s %s %s %s %s %s %s %s %s %d %s %s %s %s %30s %s %u.%u %30s (%08lXh) %10lu.Binary nationalization file "%s" is required.Unknown errorUnknown errorUnknown error %s : %s[Scr]<$>[Scr]<$>[Scr]<$>w%s: %s %s %s %s Parameter %n is not a valid yes or no string. [scr]<$>RsrcAPI.tmp0000000000 QQ Q ((((( AAAAAABBBBBB   VNVF4P4P4tmwmmm\S\TpU?Ǫ0mCd@@@ @ @4@p+ŝi@զIx@ߌGA~QC‘F uuvHM]=];Zw R`%uUPFPv v +~ uA+RPPPhmm8#tt$v v vPM 68(vvFPvv+~uA+RPPPhmmPMv v vv v +~ uA+RPPPPMv v v PMUPFPvv+~uA+RPPPhmm8#uvvvPM6868hl80 UPFF;T8}PjF8H8RP FUQ8Fh"86868+>8uA+RPPPhrmF#uF6"8jFPjP(F Fu>V8~6(86&8h˚M6"8 F~t46868jwRPh~8h Q6868vM88>8@8F8H8T8V8X8Z8N8h8jj 8 8RPf >T8tX8#tPj%d8f8V8#tPj%`8b8Z8#tPj%h8j8>R8tQ>X8t6f86d8h8>V8t6b86`8h8>Z8t6j86h8h8>8t$>V8t>X8u>V8t6z8#tP(L8#tP(8#tP(>N8t-6486286868C68686(86&8/6(86&8>Z8tAz8#tP(68688#tP(8#tP(>8 @8tAz8#tP(68688#tP(8#tP(j,U Fv#tJvjFPP(jjFPFPTF#tvh8h Qv  FUP+~uA+BR6\8^8+~uA+ًAv>\8vvj:Q8jF#u&j wRPvvh9h Qj,~v&jwRPvvh 9h Qj,jT8jF#ujj>8@8P8~v&jwRPvvh9h Qj,h96@86>8|B8D8 u16@86>8jwRPvvh9h Qj,jj88+>8uA+V&8(86868h(9RPR+>8uA+уR28486868h09RPR jV8jX8jZ8Uv&| u&|uv&| u &|t+Uhl;vv"t h|;v&| th;'v&|u &th; v&th;h;v&| th;'v&|u &th; v&th;v&D < t&t&t *Ph; Uvvh;F V FVF Ftvvh;v&&TUj*vv3 tAUFv &D&D&D &D&D&D F PFVv vvRPv^ & &@h;V FV#u#uRPj wRPh;ch;jj FVvv5 "t v &D jjvvFVNvNv u jFPVQjFPv&t&tv &D FV;Vu$;FuRPj wRPh;F F Fuvvj wRPh;vvv"t v &D jjvvFVNvNv u jFPVQjFPv&t&tv &D FV;Vu$;FuRPjwRPh;F vvFUjhFV+FFF;F|vPhf;P(Fv^&@ +FFF;j;s"6f;&*F=(t=)uFFFF;j;r6f;&*F=(t=)u$Fv ^&@FvV&PFvD~/u2~t,Fv ^&@FvV&PFv&@FFvF^&@FkFv^&@ FFv^&@ &Uv &~‰FVh;RPF#u v &FFh;vvv &FVUjjFVFVvv8;;;h;RPf;;>;uv&D ;;;;;;uE~u6;6;jwRPh~u6;6;jwRPh4<~u 6;6;jwRPh:< >R8tvvvvh@< >8uvvvvv >8uH>R8t"vvvvhL<vvjjv&&TFV~u6;6;jwRPhXR8uv&t&tvvht<v&D&TFV뢋F F u>R8tvvh<+XjFV#u#t:vvv&&T&Dv v v&D&TV FVUPv&t&4&Fj9l9^&G&Wj9l9UPFv&<t$v&*XMt v&*䖃 vFӋFU+FFF+F :89u)*Pvv;999v, #u v=9F+89uFUhFVvv+~uA+VvvhF#t"vvjwRPh<h Qdždž~tWPjzj:j:jF#t:"t*Ƃ>R8tPh<PPjzj j jF#t"ut*Ƃ>R8tPh<Pjzj j jF#t"u+*Ƃ>R8tPh<PPjtt$Ķ&D&D &D Ķ&D&D &T vvU~tBvwRPvjwRPh=h Q>N8uv(j,U~t>v vvjwRPh=h Q>N8uv(j,UFFFF:Ft1:Ft,F *PwRPh>h QFP5F3ҊF:FuBUFF=^jjjF+RPY FV #u#tl&t&4h>+ۍ=PRFjvvV+QRY FV uvh >v=PRF .v&t&4h> vvh>v=PRF vƄ=FVU+FF=^v&:D th>vvRFV&jjjv&D+RPY vV #u#u&t&4h>v=PRF v&| t h">h$>@jvvv&D+RPY FV u v&th(>rv&t&4h,>v=PRF bv&th0>^=PRF v&| th4>v=PRFv&th6>v=PRF vƄ=FVU v h:>FF;F w7v&T V&LNQRFVRPvhP>FF6<<h Qj,v&&TFVN ;Nr"uN ;Nv#u#tRPFVF FuF V FVv FVFVv&&TFVv&&T+U"+FVFVFVFVFVF Fu>R8thj>vv-vv"tv&| tRP#t&+>uA+ыAz>~j'wRP6868j4wRPvvh>h Q>R8tvvv{FFVFVF;Fvv&D F&TV6<68u*j&wRPvvh>h Q<N8@>8u,6868j4wRPvvh>h Q j68(FFDv&&TvvꚃFV8U6F+FVF܉VމFVFVFVF Fu>R8th>vv-vv"tFv&D &TF؉VڍNQRP+~؋uA+VPPPhrm8#t7vvjwRPh>h QFvv68Fh Q>R8tvvv[FF܋VމFVF;FvuFv&D F&DF>Q8t 6<6<V6<68upvvFԉV6868j+wRPvvh>h Qj1j3j2"t(6<68t)(PwRPvvh>h Q8C>8u*vvj4wRPvvh>h Qvv68FF~tHvvvj!8vvPvΚ 8vvPvvʚFʉṼv&&T vvܚF܉Vޡ8U <=h"8vv+~uA+RPPPhrm8#t0vvjwRPh>h Qvv686<< 8t O8FF$O8F%FF%FN@>R8t96868h>> 8t h?vvh?6(86&8+>&8uA+RPPPPP8#t=t~h.86(86&8+>&8uA+RPPPhmmF#t46(86&8jwRPh&?h Q6(86&868>8u6.8jj 8>8t46(86&8jwRPh.?h Q6(86&868f6<<X8t6f86d88jP>V8t6b86`8#8jP>O8t,6<6<6<6<&8#t6868P6<68tq6<6F+FV;Vru;Fv F+FF688668vvvFPZ8F+FVm8#t jPQvv6886688#u6886688#u+8UFPhR8th6?vv-vv"t#v&|t &DF&|t&DF&| /tFF<=<R8t&tPhB?6<&D ;Fu:&D;Fu1&&Tv&D&T<&G&Wv&D&TFFF<}~tGvvFVvvj4wRPvvhJ?h Qv&D&Dv&&T6<68uA+RPPPhrm6<6N8tj#wRPht?6D86B8><u j5wRPh|?6D86B8j%wRPj$wRPh?6D86B8F<=<<F;R8t6<&t&t h?6<&t&t FV6<&t&t&t&tRPh?6D86B8F<6<6Luv&F+ЉVv&4LPjRF+FVN~t+NFF%Fv&t&t&tPv &t&4FPTF#ujv&D%؉FV VtP6L6Lv;v&&Tv&F+v &&Tv&tjFPj F#u+UPL Lt>Luv &^&;s#v&,&\v&v &++& v&v &)vvv6L6L6Lv&t&4vv F#t=u)L+v&&Tv &4Lv&&T+Uv&DF€V&;Tv v&"L Lt>Lu 6LLvFv‰FVn &DF&D&TFV&DFF +FVFVFFF;FrvvvvjFVv&D&TF+&D&TFF;F v3A;Ns-F#uYvvvFPF PFPFP+FFvvjF#uFF`F;Fr++Uv&t&tjjFv &;Dv v&[v ƀVvlF#uDvƀVvUF#u-v v vvj}v ƀVvƀVvd+ UR+FF;Lu;Lt;LuALLFVv ‰FʉV&DF&D &T FމV&L&\N^&LNFL+;w u;sL~u~vF%-FFF#t8vvv6LVPjhFPF#t=tFFމFF+҉F҉VF+FЉFVF;FvRvvjjmFډVvvRPmFډVRPv &D+RPF%v&v&<u-&|u&&|uFVv &D &T +&D&Tv&DF&DF&D&T F։V؉FVF΋VЉFVFV FV&D+҉FVFVF‰VċF+҉FƉVvvʍFPFPj5F#t=u F u5F-F VF֋VFVNNFN v6L;r #u=vgF#tFV+҉FډV܋Nv+N҉vvvvFPVRVRNQFFډF6LLvVOF ;Fv0F#tyvvvFPFPFPFPKFvvFv։vFF;Fsu F;FsF+v &D&TF;FuF;Ft+U.FtL Lt>Lu}v&&TFV%FމV&D&TFډV܋N+NމN+NF܋LL^FL-F~t&DF+ЀVFFFF֋V;Vvu;FrNڋv+N҉vԋF+;Vru;FrFҋVF+҉F%Fv&t&t&tvvPvvލFP[F#t=tyF=u ~uhv&4LPvvVF+FPF%+FVF+;Vru;FrFҋVF+҉F+FVv&F+FFV;Vw>uV;Vw4~t.V+ЀVF;FwFF6LvVjP^NF=s%Fv&t&t&tPv &t&4FPF#t}F Ft1v&Dt&%؉FP6L6Lvv&&TF)FV#t6L6L6LVRnF+v &&TFv&F+UFu uL Lt>Luv&>LPvvvFv&&=w%Fv&t&t&tPv &t&4FPF#u_v&D%؉FP6L6Lvv&&TFv&)+^ &&W6L6L6LvVv&4_+Uv&tjFPjF#uTv&LFV&D &T +&D&T;Ft;V u;F tv v VvvvvvvUL Lt>Lu6LvF&FV;Vsun;Fwdv&|tvF^&Ov&D+^&G&W&G &G"v&&FV;Vr u;FvF FuCv&ͫ&D&D^&G+v&D&T^&G +vY~t#FV#u#tRPvvv v i0v&t&t&t6L6L6LvvFPF#t=u ~s F6LvF&<ͫt;v&ͫ&D&DFV&D&TFV&D &T 4vv6L6Ljv&D&T t&D&T u kfv&D&T#u= vMv&t&tjjFFv&;Dv v &vvvvvv v vU v &&TFVFvvhLjjFPVFPF#ud.L0Lv&D&T&D@&DFV&&ThLFPjv v FP|Fv &&T-%&&T+Uv&D&TFVFF;LrLL;Fu;vu&|u&|u$vFF~s/v&D;Fu&D;FuhLVF#ujFFˋvĴL‰FV&DFFF;Fs/v&D;Fu&D;FuhLVsF#uFFF!+UPv&D(&T* uD$RPVjjv v vvjjRF#tv&&T-%&&T^&G&W&ͫ&Gt)&G&W tv&&Tv&&Tv &<t.vvVjvvjjv&D4&T6 u+U&v&D&T u+'FtFPhj FFF@Fv&DFƀvFFF;Fr~t]v&D&T FVFFۋFF&D&TFV&D FFPj vvjvvv v FPF#usv &&TFVvvvvjvvvVvvF#u9FVv&&TFF>vvvvvv v vv6Uv&D&T u+Xv&Dtfv &&T^&+&W&G&Wv&&T^&G&W v&&Dv &&Tv&D &Tv&t&tjjFV-%v &&T^&G &W SjSjvvv v vv&F#tv&DFƀvFFF;FsAv&D&DVjvvjvvv v vvF#u'FFvvvvjv v vvUL Lt>Luv&D&T t0F V v&+D &T&D&TFV&D&Tv&t&t&t6L6LhjjFPF#t=t6LLvFRPvvj*v&D&T tv&&TF V Ċ*v&Dv&Dj6L6Lhv&Dv&t&t&thjjFPUL Lt>LuLLFVv &t&t&tRPhjjFPF#t=tv&DЉF&Dj6L6LhFv&DVN&T<&L>j6L6LhF+ÉFv&Dv &|t&t&t&thjjFP+UPv &D@&TB tBDFVu3v vvQhRPFPF#u3ҁͫuBU F6L&D+ҊԊ*҉FV&DFFN#t@vv v PhvvRF#u+%FV붃~uFVv&&TF UL Lt>Lu~ uvvv VF#tvvF#tvvjv FVFVvjFPjF#tV~ tbFV-%FVvRP F#t!vvv F#t vjFPj F#t~u~`v2vvv6L6LhjjFP5F#t=tF~u v& FFVv&D&TF&DF &D&DV &T~t"uFV#u#t4RPVvvAF#uL6L^F򉜘LLFFuv&L Fv&D%^&L6L^LL6L&LuvvvF#tvv@F#tFuzvjFPjF#t|F Ft]Fvvv6L6LhjjFPF#t=u ~u ~uF06L&FVv&+D &T ^&G@&WBv&D&T^&GL&WNv&D+^&GP&WR&Gv&D &T"v&D &T"+Uv v z؉F#tv vF&|uv荄‰FV&LNvvvvRPjQFPvvjj؉F#upF^މ^FFV;s+‹VSSRJNF^Sjj׋F+v&D&T&D+U ~ svvv ׉F#tFVLLF LhK?׉FhKPv vvjjF#t=umFPhKvjjjhmmF#uL~uvjj F#u2hLjh֋FV.L0L2L@4L6L7L+ UFF;LsĴL&|tVjF6.LF#u+U u. t!;v 33@33.P 3 ҃+@sH]U؋]UN~F V u. t!;v 33@33.P 3 ҃+@sH]UN~F V ؋]U+FЉFVFv&F< t< t< t< tF<+t<-u3v&<-uBVFv&F<_u>MF<_t)+R RvvlN*+0NvFv&FF<0r<9v~_t~t V^VFV]Uvv-]Uvv]USN v^6F 6GY]UM M."Mvvv v v&M]UFPv v vv ]USv6t6tv Pvv N +;u;t v6D-Y]UPM M."Mvvv v MfFY]Uv v vv6>M6M6Pt v&L FPF] U vvF&D u P&L Hv&D t vvDv&L F n FV"| ++}PF Fu+dv&D tP+PP&D Pvvvvv+~ Fv&D t!vv$YYP+PPv&D PF]UP#F ;rVRvv"MMF)F ~ wY]UPM=t0V;v)+‰FMMt MuP$Mv.MPY]US6pN&F<*t<1r<9v~u6pN&<0t6pN&F<0r<<9w8FF 6pN&*Ѓ0VpN6pN&F<0ra<9v[6pN&<*uQ6`N&<} ~PuF6`N&؉FM 6`N&F`NpN~PuFFF]USFVpNrN+MMMMF6pN&:ue6pN&<%t8jN%uA+щV6pN6dNfNhNpN)jN0P^ ^뚡pNrNFVFpN6pN&* wL.-BB4BBBBBBB&BBB;M MMM MF~t+PFPM6pN&<.u4pN6pN&<-upN6pN&F<0r<9vPPPM6pN&MuF Fu +P4>MuNNMN;rNM=t ;NvFFFF"tMu MukN#tPNP"MM~t MuDM=tN;v+‰FMP$MPU>MuF Fu NNNMP6NsNV"MM~t]USPBF%FVV= s0v6|tF7 FWv^6@N~w]US00~F:F+҉FV#u#v PvsF+҉FV#u#v PvT FMPFP"MM]U+M~uA+щjNF V `NbNUPvv_]US ^*%u0tzE3v..&M M M M M M M M M PM M M M M M M M M M M M M M M M M M M M M M |PM M M M M hNMP6fN6dN"MM>Mu6`N&&TlNnN`N*FMu'v6`N&t&t&t&t&4 `N v6`NΚ)4`N6`N&&TlNnN`N3ɀ~PuAQRP^M6`N&&`NF%MMuPPVR"MMMuP}6`N&F`N6`N&&TFV`N#u#tZ6M+~uA+vM;rv6MMuVvvv"MMMtvP]UvvF&D u PFv&D tv&|t&D t+v&D u&||x&D tP+PP&D Pv&+DP&t&t&D PvTFv&+T;uFPFv&L v&D&T&&T&DFF]U +FvVQ+ӹvV+}|++VN}lv&;D tcvF&D t>&D t VFYY v&D t8v&D u&D u&t&tYYv&D Pv&D PFF]UPFv QtQ;BMu;@MtPYYF=sF6BM6@MYYY]Uv9]U<vO]UP]˃VW&& _^QR˃݃ՃUv ]init3|+P9˄.ػ*Ћ 2"2.TX+@D2"t3H2>H2&H2?>H2?u>>H2H2u...F2ٛ>J2J2tJ2.<t[2[2 LL\;w+jhhInsufficient stack for argv[]+SS+U\P>F2t7>Nͫu/N;Nu&.6.66N6N6N6Y26W2Z>J2tV>NͫuN.6.6.6.6P6Y26W2Z.6.6NPN PN- P80387$<dAP4ı=@r-@ =r-UF"2F 2]UV+V [2F+F ]UvvF&d Qڌ;u#;u&D PTF<t <tv&L Q;Vu(;Fu#v&D PT<u v&d v&L  Q;Vu ;Fuv&d v&D t6Pv&D&TY u&d v&D&T&&T&Dv&D]U]U]UF ▸4;Nt;NtFP4PNPPFPZFF NNFPPFPF#tP4PNRRVRZFF<tG<tC<u$~tP4PFPPFPZFP4PFPPFPZF^*uu F#tNFv^&F<t^< tZF;F wM+FF NtP1F NNv vv FPF=tPF]UPF NNv vv FPZPF;F s >PuPFY]UF NNFPF#t+]_mwARGput_parmUS6PPP&7&G~6M6u>Pv6tF6P6P&DPY]scan_args U+PPVR~tPF@PPFFH|ZvHFF@~9vvFP~t<PF@PPF;F}FNjF;F}F릋]count_args UPP+PP+P8PPF%t+VFY]set_up_args Uv6PP6PPPPP6P&&DP]U^ F㑋Fʖf ֒]0U PF+PFv&v&Fv vF&Vv&^*+tfat"bumrtEtuiutVwt~~tuFv&3ҊFPt~t-+Pv&<tPvv0+PvvF>Pt v&FPF]UFv惼 Qt F~v~vPFFv捄QF^FV]UvvFF &D ~ u&D ~ u v&D  v&D ~tv&L ~tv&L @v TF<t<uF~tv&L ~tP+PPv ]U 3VtBVVFPVRVRVRVRv v vv?F~t FF FVF Ft'vvvvvvvv&L &DFV]USFv6DF ꖁƸNv^DPv&&TPv&D&T& &t t uPn]UPHFV;*F ▋NN uvcF;F}F֡P=2}PPHP@PfF]UF NNvVS vNNS vDŽNDŽN]UF=u[=tV=tQF=t= u QF=r=v=F=t5=) t0~u+F=t= u~u ~t+P]Uv&<[uC&DFPuF NNvv+~uA+SPPP6PNNRDFP~tF NNFP~tF NNvv+~uA+SPPP6PNNQvVDF#tQvNNvv+~uA+RPPP6PNNRDFP~tvF]Uv vv]U+~uA+уrvv1"t+F>Puw~ uF ▀NF F NNvv+~uA+SPPP^ *PNNRDFP,~tvF]U+~uA+уrvvu"t+7F>Pu~ uF ▀NF ~ u3F NNvv+~uA+SPPP.6:7F NNvv+~uA+SPPP^ *PNNPDFP7~tvF]UPFPvv+~uA+RPPP6PPvPY]tmU+~uA+щVBF ~uA+щV;Vw FVF+]UFVFV+~uA+v~ uA+щVVv&~ uA+;VtFFVvNv+|͋FV+FV]HEAPCODEoffsetUF+҉FVF +FV++FV}vvP$FFFV]sub_ptrUF+҉FVF +)FV~}vvP$FFFV]each_chunk U PPPv&+RPV"uvvP$9v&D&TFVV^ ^vFvFFVFVF Fu]each_item_in_chunkU PvvXv&tVFV&^&;Gt$SP$vv^^ vv^^ "vv^^ FVFVv&|u] each_allocated_itemUFFU PFV#u#tRP^ ^]USU+Pvv]USv&|Du6v6t6D6T#u#t RP6\ 6\FVv6t6D6T]each_free_itemU PPFVFFvvF&|Ut VP$v&D;Fu &D ;FtvvP$FFSv&tVv&L&;tvvP$vv^ ^FVFVv&D&T FVF FtV]remove_from_free_chainUv&|rY&D &T u&D&T PPv&D&T &t &D&T v&\&D #u#t&T &L&W &O]US]insert_into_free_chainUv&tVvV&|t&|UuVEv&Dv&D?v&#t^PVFV&|UuGVv&Dv&DvF&tVvV^&G&vvZJv&|r@PP^F&\&D #u#t Ž&w &Wv&D &D6PP]search_free_chainUU0PtFFfFV]USv&D^6;Gr 6w6Gʋ]normalize_relativeUFVFVN v NvN;Nt RP P$FV]insert_chunk U+v&D&TPP&L&\;Pu;PtP&w&GFVPPv &DU~tvvVRF V v v ]add_new_chunk UF+FV+VQRPԊ*҉FV++}FV-} FFvvFV uvvFF&&D&D&D&D vF&&DDFV-&D&D&tVvV^&G&&D&Dvvvvj]malloc2U >PtFsF~v+ FvxFV uvv`FVF Fuvvv&D+FF=w &DFFFv&D-P&DDP&DF&DPV FVRP^^ vvvFVN& ~v?F&D&DU&DP&TPVN& vv FF>PttFV] zU]hmallocU+PRvvvV>Pt%#u#tP#vPPFV]mallocUv6P]possibly_free_chunkU]errUSv6t6tP$nfreeUF FuFFVFV>Ptsv&|Du#v&DFPvvq&F;Ft~v&DUV5vvV>Ptf]check_heap_integrityUU PU% Py]US]US]HEAPCODEbefore_freeingUS WFv6T ;vVNv~v6D;Fu 6D;Ftfv6D F6T;vV~sFnv6D6TNvFVNFvv~]reallocUvvFF^&G*F^F&WVv~PvvS +PWUI Pvv VFV>Wu9>Wt2UI PvvVFV>WuWWFF W>Pt6vF#u#t(&D-FV;v+ʠPFV]creallocUWv v&t&4v&&TWFW]U^ *#t ttZF NN=F NNFPvVPvNNFVFV v v`F NNPPvVPvNNFPPvNNFV+FV FV RPPFV ]U+~uA+BV~ uA+BVF;rV;rPv v vv]UF#tP]U~v0F*NN#tPv]UF*P ]UFfFV++|"}+PPvFVP]Uv vv ]UvvS ]Uv]UFVFV+~uA+v~ uA+щVVv&~ uA+;VuFFVvNv+|͋FV+FV]UVWv~ N+rt@H_^] UR&dLML<RPO]UF;R~R]U>Rt RPORR#~ V;|FR]US&v6D*6T+ЉVRFPv\SFP,FPqFPFP\v~v6DFFvBFVs*$FFv6LF06\6@FrFF=} F뵋v6Dv6\6x0t+F@;}6D]US Fv6;D|vV.6: .68 uvFPFP.6> .6<  v\Sv\Sqv\S.6B .6@ r@v6D#t-\SD P,v\Sqv6D]U6FPFP\v~v&<tFP\F#}*@F#t.PFPFPFP FPqFP.6B .6@ sFPD P,FPqFF**F#t0PFPFPFP,FPqFPD Ps+FP.6P .6N ,FPqNF^*Et Gt"etftgt"FF+ F@P FV;|Rnx00~GG FvB^~&AFF~~Fv&]UvFPD Sq] USM=tR;vR4RY]USMM=t =rMY]USRvV.6: .68 s&vVFvVqR-MtR+ MtR RlY]USPFFNF;FvR0tF+ҋN+;u;uMu vR.uNFHv6DF+F)R]USMuMu v6\R#tPRP"MMMu>Ru v6\Y]USP>R>RtR.v6DM#unv6TR;}A+;rЉVʋRRRBv6TF)M6|t<R@@P.v6|t$Mu>Mt RMu v6D^v6DR;|RRP"MMv6DR;~ +R$MPv6D#tPRP"MMM#u/v6|t"R#}أRM#t5;~'v6tV.6: .68 uFv6|t$MuR^9PR RM@@R^PT uR)MMv6T;rЉVʾRR)Mv6T6|t PPd^PT P"MM6R$MPv6tRP"MMv6|uM#t P$MP]US FRR>Rt FƄR.FM#u~v6T;rЉVʾR^RV)MFHv6D6|t Pv^v6tRP"MMv6|u,M#t%P$MP^FHPRP"MMR#F-#}@RF+RFF"R #}у0vRRNF>R׋F=|ϊVvR^6WR@@PƮRV"MM]USF>MuFF^*Et=Gtet3ftXguX>MtQMuFRH=|;M~nMD(FfR#~M;r)M RM]USR#}؉FFF FF~cR@*M@@F]U.W>MuM>MuFFFPv6Mvvv v vvVRvRF#tP4vFP"MM>Mu MuFFFR^*Et0Gt2et&ftgt#R;|MR*+$>MuR`RH=|;M~ HRBR#~R*MH3;MuAʉRR*M+R@R>MuRRMRv>Ru] ??? A00.UFVFV~tAV+~ uA+щVv ~N;s+~FV]U~P PFPF>Ru>Ru #u+RR]U\SPPF#t R0F\S^+Fv&TR*;t FƄR{v&LR*S^Rv&DR*F#t FvƄR}v&D*#t FvƄR[v&L*^Rv&D*F#t FvƄR]v&D*#t FvƄRF\Uv&L)**Rv&D)*F+vR]UNv>bU+6bU^&vFv&&T>bUuA+Ѱ^>bUuA+Ѿ+>bUuA+V;tFvbU&@v&&Dv&<uv&<{t<[t<^U6^UvFuA+Ѱ>>^UuA+B\U+RuA+ыAR>^Uv&<\t\U>^U`U6^U`U6\UV+RuA+Ѿ~uA+Av>^U`URuA+ы6^U`UvF+>^UuA+щVFN#t6^U^&8/u&\v&"u<.t&|.t}&|\tsvF6^U\U@;FrlFv&<\t^U`U\UN;u;uߺ+~uA+ыAvF~FNeF_^U`Uv &&T+]U F#tyvvvFPFP%F#u[vvvv+~uA+RvvFV#u#t+~uA++Vv v vv]U YF#tpvvvFPFPF#uRvvvv+~uA+RvvFV#u#t+~uA++Vv]UF#tvvv FPFPF#tFPvv+~uA+RvvFV#u#t+~uA++VmmPF#tv vvFPFPF#uSvvv+~uA+RvvFV#u#t+~uA++VF#t v Fv ] SwFpEmulatorU>E2uN #u3N F+؋F+}fFf+fv fff]^ VF"tĊ*ߊ*r #uP+RPv v lYv^;wu ;vI^ v ++ґ]Uv v vv֋]U>E2udV V#}+ҋF V RPRv V1V#}+ҋFVRPRvFt+ʋFt+΋]fFff~ fff]Uv v vv#}^ v ֋]Uv v vv֓]U>F2t6V6 V6 V V@l}6 V\^FvF3&L&;OsBV#t^FvFvF^Fv&Dv&+DF=@&| t#~u6 V> V  VF#t Pvv<v&D ^&:G u2PSvv<"tkPvv<v&L&DNv&| tPvvVD<Pvvvv"<v&D v&| t PVh< V~uv> V6V6 VK4]U]U>F2t6V6 V6 V VglK36 V&D &:DtB&T6 V&| t  V:V6 V&D2V> V6 V&|t V6 V V<6 V&L6 V&|r6V6 V<6 V&L6 V&|rV\PSPS+6 V&L+&t++>@+v~ V#}6|FP6V6 V<6 V&DV> V F6 V&D6V6 VK4] CDOS_ALLOC sysallocU>tVt-rV++FV|v6tVrVPF#t%tVvrVPF#t +tVrVFtVFFV]sysfreeUvvF++ɾ+Q]allocated U]least_free_memoryU]U!4v> V>F2uH6 VvF&D%&D #t&d v&& D& D& D@&D #t&D ]U6 V~>F2u6 V&| t&| uv&L  V]UF0FdPFP6zV~PP9]U츌P]HEAPMGMT - heap error # Aborting...)*** Cheap-heap linked in => no heap dump.U*>F2t6V6 V6 V Vbl V6 V~6 V vF~u&| t VV> V V3ҊFv&:D tBVF-?&D@FVFPFPFNNFPZ<~s~wv~~݀r'FFFFPFPFP<v> V6V6 VK4]UPT6zVP9]U VVV+| V ]U V]UvvF&& D& D& Du+&D&D &D hv&|r:V&D2V~Hv&|s>V<Fv&L++| F&)DFv&+DPV<v&D]#***Floating point stack overflow***Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] UvN 3ۋCC]U~3ɋE]u=u Ëދ3҃sArE]u]U~%UUU]U~m]]]U~N BE]ur֋3ss 3ɃE]u]U~%UUUUU U U]U!4>F2tvvl6V6 Vlvv6V6 Vt]UVt68M&d 6VV% ãV.VÛ>VPV%A=@t=XÛÛÛ.2636&-6&-.:Л&=۾֋6&-6&-uܛ6G6GV6GV.VVVVˋܛ6G6_&6_&6_&?6_&/3tr@HÛ˻ >V.VVV˻>VVˋ6_&76_&'U~ UM]~tctgE ?uƀtE E Պϊ܊2҃t΀UM]]E E U~ ]MUu?||qĊߊ͊ցst F&E t΀ ~UM]]3333VVU.>v .>v.V3ۋˋV#tV#tʡV#tV#t ڃV#tV#t ڃV#tV#t V#tV#t V#tV#t VQS3΋ޡV#tV#t V#tV#t V#tV#t V#tV#t V#tV#t V#tV#t V#tV#t V#tV#t ʃV#tV#t ʃV#tV#tWU.V~EEEEu M ]] U 6 V ~6 V Vv> V]U>F2t 6 V&t 6 V&| u&t ]U]U>F2t 6 V&t 6 V&| u&t ]U>F2t 6 V&d  6 V&D ]U!46 V > V]U!4>F2tvvl6V6 Vlvv6V6 V]VUv .>vV+؋U&V.VV>Vu>Vu>Vu >Vu;.Vw rB;Vwr:>V;>Vw0r >V;>Vw$>V)>V>V>VV.V u*uu>Vu>VtUL&VVr~&VVr&;.Vw rP;VwrH>V;>Vw>r >V;>Vw2$u Ë3u L&V&V]V+V~& &]&E&u] ;.Vwr;Vr+V.V u uuvr;.Vwr;VrPLrU>F2t6V6 V6 V Vll6 V&| t&|u6 V> V  u+[6 V&D F&TV:u5 ~P6V6 VFP"<3:FtBVFFF*@]UPFF VY]UF@FF;F}F]UFz~F s3F ꖍFPvvWP,FPqn F~ uv~]?Uv&4FFVPvT]U6\N^NPPvT]U !4>F2tvvHl6V6 VlF3v&| vBVV~V~FFrv^&$v^&FFP<v~FP<FP<PFPFP<FFPFPFP<F#vNoF>@v> V6V6 VK4]U.>F2t6V6 Vlvv:l6 V~F-?F~t v&D v&D ~?~FFFFv^&@ sFF#}Z=?~R?+RFP<v~F Fu~ u~wFFFԈFF~t1F FuFV FҋF+VًF+҉FVF Fu F FuFFFvFڋV+ҋJ+ ؉Nډ^ u +FىB+vFڋVܹ B+PQvvښFډV܈FًF#vN럍v~FrF*䖊F^&F*䖊Fٱ^&F<sF V]UP]&Cheap stack dump linked in => no dump.UF V 2~tDtHE ?]ƀtE E Ԋ2t΀UE3E]E E U~EU]?|I=Ċ֊t€t C2E t΀ ]333U>F2t6V6 Vl-lFlpU;Vu ; VuFAd6 V~FF~tN@=~u v2VuNN~uND ~rNV%V* ЉVF]UF>`2t=t P ,]U~u] vFP,F uqv~N^Y~u ЉFVsjjj ^SvNF,jjFP/F uF^&G Z&W F&GF^SvFv UFPFP"$V^&?{t@&?[uT6p2:14t. FPQSVSVQ^[Y=Xt ],N~] t&<~&] ~&] Y]^&G :13tSv^ S^Sg<^SFP4F u'^Sv^ S^SgF13^&G F^ &&W^&^&O :4v^&z4Vnjޱ;u$:u04r)4P+PjRPQhrmRPQF u(^&G :3u 4FF^Su ^&G s<&G s4~u ^&"^&G ^G ^ &Z&W^&}^&G&;Gr$Sv^ S^S9F uX^&?uL^&G&O+;FsFF^&^&FFv&t^^ &Z&W^F&G FFN F;vP~uJ^S+QFPFPF t tu.^ v8vNFYFF릋F^&F^&G :13tRS^ Sv ^SF85smP4Vnjޱ;u$:uH^SF9^SFP4F u'^S^ Sv ^SF13^&G F ^&^&O :4v ^&P4Vnjޱ;u$:u7j4r085r)P4P+PjRPQhwmRPQF u(^&G :4u 4FF^Su FFN F;w~t^&W&;WrS^ R+QFPFT^&G&+GFV N+;sV^&FF^ v0~&}^9N^Y^F&GFFcF^&FU^&G :4v ]U^&G :4v ^&G ]U^&]U^&]U]U^& t^&G :3u &G& u]UQF =rmt =tmt"63rmP'443^&G ]UQF =wmt =amt!64v '444^&G ]U^&G :4t ^&4SP( ]UQ^&^ &&W^&G :3t 4S)D]U^&G :4u4Sv*| ]U+Zr tH]j&j^S/ u ^& +ZrHU3 &L&;Wt]U#tH3&GtH] 6r"^&&W&G4&G;F s Wv 4X^F&F&GFFF;FsN ;Nv4&@FFڋF;Fr ,4v@^&Z&WS4&_[&GU|s]4&G@] ar 4&G;FsGv4X^F&F&GFFF;Fs4&@FFFU>4u4P u>4t4&G44>4u]ð]UQQ5P555P uJF65P u85=u05P u!F65P u5=t=!t3]^ &G :M4uSvv^ &G :13tWSvv,n3^ &G ^ Svv,FNs=u8^ SFPL~u#13^ &G ^ &dt@Fs3률13^ &G F,^ &G :4r^ &G :3tw&G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &O^ &O^ &O&W;Vu;Ns+^ &r &G&;Gwe^ &G &W"N~;u;wL&wщFVN;u;s&+O &"N։~؋F^ &G-sS4F u^ &G-sG<PFP\F^ &G-FVFVF%Ff^ &G^ &G^ &GNV^ &O &W"^ SPFPFP4F u4F^ &G^ &G :3t :3t^ Sj<F t^ &G&G &W"FV&9Wu&9Gw&G&W9Fu9Fu^ &G&WFV^ &G&9G*s&G*^ &FF^ &G@1&@FތFF^ FV&9W"u&9G v&G*H1Fܺ&G &W"N~;u;r_F&+O &"N։~؋F։F&O,r&9G*sSl,F tF^ &G^ &G*&;G(uF&G(F^ &G* ^ F&9G*s&G*^ F&9G(v&G(Fr^ Sj$dF u^ Sl,F uy^ &G ts&w8&SP^ &w"&w G<P^ &w: \F t@^ &G-^ &G &W"&G4&W6^ &G&G.^ &F&G0Z&W2~Yt^ &G@1&W^ &w&@F&Z&W^ &GN^ &O^ &OF~+&G &"^ &G&G(^ &G&G*^ &G,^ &Yti&w8&Sh^ &w"&w FP#Fu^ &?^ &G,(~t^ &G&GF^ &G :3t ^&FF^&G &W"&O*&;Wu&;GrI1&G^&G*1 uSj$dF u`^&G@1&@FF^&G*1&G &W"FV&w8^SQRPFP#FtK uX^&G*1V+^0^~&}*9^Y^&G*H13^SjdF u/v&|*&L+^9 ^&G*&G^&G,^ &G :M4uS^SzO^ &G :13t S^S<6^ &du33^ &G ^ S^SF13^ &G FU^&G :4r^&G :3t:3u^&G&G &W"^&&Wc^&G :3uX&r&G&;Gv &G&W^&G&G &W"^&&W^&G s7&G s/^&/&_!^&G :3u^&&G ]^&^ &&W^&G :3t ^S4F uk^&G;s]@1V&G&G &"F~&w8&XSv^&pWPG<P^&w:\F t@^&G-F^&GFrF@1V^&G&G &W"FV&G-sG<PFP\F^&G-3^&w8v&XSv^&pvvFP#FNVF׉NV~u t%^&9Wu&9Or&O&WFF t ^&Gv^&@F&Z&W^&GFV^&G &W"^&G&W;Vu;FYvF&GF^&G8^&G^&G&W&+G &W"FVF&G^&uFF^&G :13t SvW<6^&du33^&G ^SvW<F13^&G F^&G :3t:3t :13t^&G&G &W"FV&9Wu&9Gw&G&W^&G&9G*s&G*FP&t@"FP$dF u^&uSl,F t^&w8&S^&w&w"&w G<P^&w: \F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2^Sv$dF Yu,^&w8jGPj ^&G :3u ^&G :3t@&& tA"F&G :13uC&du3 ^&du3&G ^&G-sS&G :3u0G<PFP\1^&G :3t:3t:3t ^G<PFP\FF^&w:FP< u ~u~uߊFs^&w8jGPj FF^&w8 F^&w:)F^&G F u F uFF :r10^&Fr^&0FFF 10^v&F@ vvFPF^SvhF^&:F@F^Pvj]FF^&:F@F^Pvj6FF(FFF^SvRQPNQNQP,F u$F t^ SNQvNQPj F~uVFF^S +PvFP\F u2~t,^S +PvFP\F u~tF;Fv4N+NA^v0^ ~9^YFF+F@^&^&<{t<[tF FF^&^&?{uFS +PvFP\F uoF sdt_NAv~^YF@^&^v&48 + ^& ^S+PvFP\F u ~uFHN;v9@N+^vp^~&=9^YF@N+^&CFPF u^&O@wA^~&=9^Y^&G@^&^v&48+^&v&4^P^&wg&we^&^v&48+^&"^vFF^&F^&G^vNFY^&Gw^ &Gj^&GyF^&^vNFYFPF uQ^&G@^&^&O@wA^^Y^&Ƈ^&Ƈ^PF uN^ GkP^ &PFPFPjDF u#FPvhjj^Sh+Pj Ⱦ^&G F =wmt =amt^SvFPFPjFDF uݍFPvjjFPQ؍GPQF!t=u~^&Gi^GePF9FvF^kvN@YF^&^S^Sv^SFPDF tF~u;^SvRPPRPF=u^v&xF^&Gi뾃~t<džCFEGv@CPEP}FF7^SFPvRQjv PvF u 3^&G +s ^&G8^&G8Fvj^ Sj7F t^&F^GkP#+P^&PFP\F uFt @^&F^& ^ &Ow~&=^ 9^NOY^ &G^&F t$@^wk~ ^Y^ vx$+/+~ B^&G :3t 3^&G ^SFPFPPDF u^SrF u}^&FFvN^S^SvmDF tJ^G8P^SvRPjhmmTF u"^&w8F t^&w8 FFU^&G :3t ~v F^&Gj]^ &dtZSFP^& uV^ &du&G-sG<P^S\^&^ Shwmvv^& u3^ &G ^&^ &Gd<tN<uSh<^& uH^ SFP^& u/^ Shrmvv^& u3^ &G ^&U].05]U#U$VWQ^S,Y_^F^OGG w 3GGG؉GGGFG F GFGFGFGFGPS]UU^ SG PPFPL[#uMG~&wr/^ F%;u^ ^ FF;tX F ;FuX] ^&^SP$dF t^&G t~&w8&SP^&w"&w G<P^&w: \F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2~Yt^&GFu^&G@1V&G&G &W"F^&Gv^&@F&Z&Wv^&@&G^&G*^&G(^&G^&G, ^&G :3t :3t F^&G-rG<PFP\F^&G-^&G0FF^F&G4&W6Ft.H^&O.+N^v0^9^Y^&O.N^F&)G.^v^&G0Z&W2F^&.uF tuSvdF tF^&G0FF^&w8^S^&w.&w6&w4FP$FFt.H^&O.+N^v0^9^Y^&O.N^F&G4&W6^F&)G.^v^&G0Z&W2F t ^&.u%FsFr^ShdF u^&G :3t :3t ^&G&WFV&O&O &"N~;u;wN~Fs FF%T5u!T5FPF u ~ rT5R5 P5ujjP5P/F t^&GFP5&8G wFP5X ^Fv&DF&GF&GF&GF^&GF&GF&GF&GF&G F&8G uANsNQPPF t FF^&#tF ;Fv F&O#F ;Fw FrF9F w~^ &FF^&O&@^&G^&w6 FA:r 6th~s\6P^Sv^Sv hrmF u566j6PjF uF6 6F% 666FU^Sv RPj^Sv] U^Sv ^Sv|]  6666 t P FF6FU욽]66ut uF66RPVFF66;6u;6sN66 6~ u;666S6 66666FP#Fw~u ~u&FF6v&^&66F^Sv v vvjF ui~ uPFFs?FP9F,Fu+JV~t@uA"F뺃~~uFFF U^Sv v vv] ^ Sv vvhjF FF~ uZFFs?FP9F,Fu+JV~t@uA"F뺃~uqFgF ~ u@FFsPFFFP9FFsF :Ft@~ tA" F :Fu@F~t@ F멃~uTFFFFrFP9F u-~ u0~s*FP9F u~ tF tF ~ u ~sF<'t<"u$Ft8FuFЈFsFFFFr_F :t u)8N u$,FNu+JVt@&~ uF< uAu@" F :Fu@FFrF<'t<"u^v&@FvF;vs~u ~tF~tFF^&FFsF F^ Svvj j^FFU^ Svv]U>6u66^&&W]U^S]>6uFV;6u;6v 6HFЉFV^~666;u;s##+NvFV#6#6N~+N~ 69Vu9FrL^Nv## t8666SP#N#vVQFP#Fw~u ~u FFFV66FUvvV]^SvFPFPj{j}$F uF;F vdP~ vE,~^vNFY^vx,F^&F F t~u5^&~u^S^Sv^ Sv FFUFF F uZvvvjjFPj j{j}jF#t1F#t)Fv^@‰FVvvvjjFPj j[j]jF#tF#t)Fv^@‰FV~u~u v&<jF~uv&<tF~to~tEv&<u<^&?6t'~tv &*6 v &*6&4v &^&~tv &F^ &^Su,PvFP\F uFt^ &FFF~NuV~u ^&P ~u^&7R6P^ SD~u8^&w&7R6P^ SDR6F^~Hu2Ft tuS^SvR6P^ SDR6F^~Du_~uFPF~u^&&WFV, PRPvvvR6Pj ^ StFR6F^^S^ &7^Svv^SDFU6PjP@@oA C?CSVWpX?@YY_ZOp[/[]?^_PaPb/@dpePfOg0k0llptPx/P|0P *'(" )#+7* 8% /!)71?r r~A~         6\6666MH ``/`F`X`h)h< _    ;;F;;;0;; ;{;;;F G _EyE3OrO7[H[0rCrcrr}}}l}}}}v}}}}}}}+}B }{ } }! }T } } }k } } }1 }g } } } }}q&qaqqqqq q-h'(j(((D<i<<y</UU.ee+FfUM;;Tj*:_&E=CPC,U2b`bbbbbbbrv~6H`h ; EO[r}q(<UeM8CUb #Vs {"1!/IViw|-D9Glr 0ly v<vfv~8 B L V b n {   = k    # Q                "&*.37;?CHLPTX]aeimrvz~O#Q ~}sh8hThrhhh3hihnhhh!hhhh5 A    m  I l;;*;P;t; ;o;s;;;6;;;;;;C\Q`b% N   I EaOOr;}}}A } } }(,qqqqqq"`g9<Z<0e3 3z9kF4uRMMM!My,bbUQQS^SvFPZFtu P ]UvPFPF uRPFPFPF tF]UPPFPFPPO^SvOu]U찈PPPOdPPl  u S6 P6ٚOP۴POu]UQ^^G_FF t)F 10^vPF1FNЋ]UPPFP FPPO^SvOPFPFPPO^SvOF~u~vQF@FPFP#FFFFPPO^SvOFPFPOn^뢚u]U FVFVFFV u9Vu9FrFbF)FV#sFhF`FVFFFPFPPOFPPOFFFPPOPPOPPOuFN]UPPPOPPOPFPlFPPO^SvOFFPPOPPOu]UFFF~u*vvF u~u FFׁFЋ]U찊PPPOu]UF]UQQ䠊FFĢPPPFPFFۃ~tuF]UۍvNFF]UQƇCfPPSFPZP(]UvP^S tPP^SP(]UdPPFPP(FPFPvPPrmPP(vPFPPP(v P(PFPvPPrmPPPP(Nv~FPPFPF t#vzٹFF^FFfPFPvPPwmPPPP(FV]UPP(fPP(]UPPFPF uFۍvۋFۍvۋS6ۚP PFPP۴PFPZFP PFP6ٸRPPP FFVPA蚉vvovv9 ]UF>t=t P  ]U~u] ^&G :t5SvFFsFތ;u;u PFF0^SFPsF u^SvFF^&O UFPFP"V^&?{t@&?[uT6:t. FPQSVSVQt^[Y=Xt ],N~] t&<~&] ~&] Y]U^ &G 33&:t :.t$C^Y tt &^&] ]U^&G :w):~u&G t&G uF&G &G 3  ]U^&G uPd u>t&G>u]ð]UQQP룴P| uJF6P, u8=u0P| u!F6P, u=t=!t3]^ &G :uSvv^ &G :tWSvvn^ &G ^ SvvFNs=u8^ SFP~u#^ &G ^ &dt@Fs률^ &G F,^ &G :r^ &G :tw&G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &O^ &O^ &O&W;Vu;Ns+^ &r &G&;Gwe^ &G &W"N~;u;wL&wщFVN;u;s&+O &"N։~؋F^ &G-sSF u^ &G-sG<PFP F^ &G-FVFVF%Ff^ &G^ &G^ &GNV^ &O &W"^ SPFPFPF u4F^ &G^ &G :t :Tt^ SjF t^ &G&G &W"FV&9Wu&9Gw&G&W9Fu9Fu^ &G&WFV^ &G&9G*s&G*^ &FF^ &G@1&@FތFF^ FV&9W"u&9G v&G*H1Fܺ&G &W"N~;u;r_F&+O &"N։~؋F։F&O,r&9G*sSlF tF^ &G^ &G*&;G(uF&G(F^ &G* ^ F&9G*s&G*^ F&9G(v&G(Fr^ Sj$F u^ SlF uy^ &G ts&w8&SP^ &w"&w G<P^ &w: F t@^ &G-^ &G &W"&G4&W6^ &G&G.^ &F&G0Z&W2~Yt^ &G@1&W^ &w&@F&Z&W^ &GN^ &O^ &OF~+&G &"^ &G&G(^ &G&G*^ &G,^ &Yti&w8&Sh^ &w"&w FP#Fu^ &?^ &G,(~t^ &G&GF^ &G :?t ^&FF^&G &W"&O*&;Wu&;GrI1&G^&G*1 uSj$F u`^&G@1&@FF^&G*1&G &W"FV&w8^SQRPFP#FtK uX^&G*1V+^0^~&}*9^Y^&G*H13^SjF u/v&|*&L+^9 ^&G*&G^&G,^ &G :uS^SzO^ &G :t S^S<6^ &du^ &G ^ S^SF^ &G FU^&G :r^&G :t:Tu^&G&G &W"^&&Wc^&G :uX&r&G&;Gv &G&W^&G&G &W"^&&W^&G s7&G s/^&/&_!^&G :?u^&&G ]^&^ &&W^&G :t ^SF uk^&G;s]@1V&G&G &"F~&w8&XSv^&pWPG<P^&w: F t@^&G-F^&GFrF@1V^&G&G &W"FV&G-sG<PFP F^&G-3^&w8v&XSv^&pvvFP#FNVF׉NV~u t%^&9Wu&9Or&O&WFF t ^&Gv^&@F&Z&W^&GFV^&G &W"^&G&W;Vu;FYvF&GF^&G8^&G^&G&W&+G &W"FVF&G^&uFF^&G :t SvW6^&du^&G ^SvWF^&G F^&G :t:Tt :t^&G&G &W"FV&9Wu&9Gw&G&W^&G&9G*s&G*FP&t@"FP$F u^&uSlF t^&w8&S^&w&w"&w G<P^&w: F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2^Sv$F Yu,^&w8jGPj ^&G :u ^&G :t@&& tA"F&G :uC&du ^&du&G ^&G-sS&G :u0G<PFP 1^&G :t:t:Tt ^G<PFP FF^&w:FP u ~u~uߊFs^&w8jGPj FF^&w8 F^&w:)F^&G F u F uFF :r10^&Fr^&0FFF 10^v&F@ vvFP|F^SvhF^&:F@F^Pvj]FF^&:F@F^Pvj6FF(FFF^SvRQPNQNQPF u$F t^ SNQvNQPjF~uVFF^SPvFPF u2~t,^SPvFPF u~tF;Fv4N+NA^v0^ ~9^YFF+F@^&^&<{t<[tF FF^&^&?{uFSPvFPF uoF sdt_NAv~^YF@^&^v&48ٹ ^& ^SPvFPF u ~uFHN;v9@N+^vp^~&=9^YF@N+^&CFPdF u^&O@wA^~&=9^Y^&G@^&^v&48ٹ^&v&4^P^&wg&we^&^v&48ٹ^&"^vFF^&F^&G^vNFY^&Gw^ &Gj^&GyF^&^vNFYFPdF uQ^&G@^&^&O@wA^^Y^&Ƈ^&Ƈ^PF uN^ GkP^ &PFPFPjF u#FPvhjj^ShPj Ⱦ^&G F =wmt =amt^SvFPFPjFF uݍFPvjjFPQ؍GPQF!t=u~^&Gi^GePF9FvF^kvN@YF^&^S^Sv^SFPF tF~u;^SvRPPRPF=u^v&xF^&Gi뾃~t<džCFEGv@CPEP}FF7^SFPvRQjv PvF u T^&G s ^&G8^&G8Fvj^ Sj7F t^&F^GkPP^&PFPF uFt @^&F^& ^ &Ow~&=^ 9^NOY^ &G^&F t$@^wk~ ^Y^ vx~ B^&G :Tt ^&G ^SFPFPPF u^SrF u}^&FFvN^S^SvmF tJ^G8P^SvRPjhmmF u"^&w8F t^&w8 FFU^&G :Tt ~v F^&Gj]^ &dtZSFP^& uV^ &du&G-sG<P^S ^&^ Shwmvvd^& u^ &G ^&^ &Gd<tN<uSh^& uH^ SFP^& u/^ Shrmvvd^& u^ &G ^&U].]U#U$VWQ^SY_^F^OGG w 3GGG؉GGGFG F GFGFGFGFGPS|]UU^ SG PPFP[#uMG~&wr/^ F%;u^ ^ FF;tX F ;FuX] ^&^SP$F t^&G t~&w8&SP^&w"&w G<P^&w: F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2~Yt^&GFu^&G@1V&G&G &W"F^&Gv^&@F&Z&Wv^&@&G^&G*^&G(^&G^&G, ^&G :t :Tt F^&G-rG<PFP F^&G-^&G0FF^F&G4&W6Ft.H^&O.+N^v0^9^Y^&O.N^F&)G.^v^&G0Z&W2F^&.uF tuSvF tF^&G0FF^&w8^S^&w.&w6&w4FP$FFt.H^&O.+N^v0^9^Y^&O.N^F&G4&W6^F&)G.^v^&G0Z&W2F t ^&.u%FsFr^ShF u^&G :t :Tt ^&G&WFV&O&O &"N~;u;wN~Fs FF%u!FPF u ~ r ujjP/dF t^&GF&8G wFX ^Fv&DF&GF&GF&GF^&GF&GF&GF&GF&G F&8G uANsNQPPDF t FF^&#tF ;Fv F&O#F ;Fw FrF9F w~^ &FF^&O&@^&G^&w6 FA:r jF~uv&<tF~to~tEv&<u<^&?t'~tv &* v &*&4v &^&~tv & &M&U&;Pu&;Hs4DF^&p4v&Z&TF^&A&DF끸4F F"F^UF Ful;C^&F F uc;.F Fui;!^ &~N u+J^&]UF Ful;B^&F F uc;-F Fui; ^ &~N OtI^&]UPF F uk;+v&;Vu ;F uj;{F<w*Pvv 6~uvv 5F#uv&F?~t6~u0F Fui;&~tv&v &v&+h;UF Fuk;\+v&;Vu ;Fui;CF F uj;6F#t,V;r#u`;v^&@v &v&+h;^&&WF F u<0rjj*P/d.0. u , *u{*F F^ &?TNt4bF FF&GF^ &O~F u+JVu4*^ &GFv^&FF^&Z&W U^SvP,]ULFs+PPFP/dF u,^&!t@FF^ &FPF usFFFFFNNFF @FF^F FsFs PFP < FP|F~u[vFP,F tF;FtFF u$ 8FvFF^ &ȍvF!uFFFΈFψFбNѴFҋVVԉFF.F FڌF܋FFލFF^NFsFs PFP < FP|F~uGvFP,F u6F;Ft )F։F u F^ &~!t FtFF][Sys]WrapMsg.bin.objWrap [KBD][VID][]}[!Scr]]$$.Tmp}[!Scr][!Scr][scr]<$>BsFilter.tmpVNVFp        ~{}MASTERSERVERLOCAL{}[]{}[]<>[sys]LptConfig.Sys&YesNo`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijklmnopqrstuvwxyPress NEXT PAGE or SCROLL UP to continue`4(Press NEXT PAGE to continue4R12.3.14[Kbd]T[Vid] [Lpt][Nul]\[Debug]4[SysIn][SysOut]>\T!#>%4)*T]7u8aT]yD]yB.\B\B.\\Z\]y Oy4]y ]y {y2,;,l4L [KBD][VID]>4>4      LIBRARY: ctos.lib VERSION: R12.3.1 (friday november 12, 1993, 15:10) LIBRARY: ctostoolkit.lib VERSION: R12.3.0 (friday october 15, 1993, 17:26) LIBRARY: enls.lib VERSION: R12.3.0 (friday october 15, 1993, 17:28) LIBRARY: wrap.lib VERSION: R12.3.1 (friday november 12, 1993, 16:17) COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. VERSION: R12.3.1 (friday november 12, 1993, 16:17)00000022255=```````````00  00````0000?? ??00 `` 000`````00000??0000000??```````0000000"mousecursorsubsMS Cn LLIBCE%0lOCV7=DGROUPMOUSECURSORSUBS_TEXTCODE_DATADATACONST_BSSBSS}HH H H V @EREADFILEPDREADICONFILEPDREADICONFILESѠUWV؋F VFV+FF^&~ sHFN~vvv P+PPFP~v~vF t ^&?ICtF^&&G F^&F9FsFՐF=wF V~n~uvvv PFF+RPFP~v~vF tm~vFFF^vF VN8F)F냐F VN~FF^&)F^_] V^V Dt mousevcsubsMS Cn LLIBCE%0lOCV79DGROUPMOUSEVCSUBS_TEXTCODE_DATADATACONST_BSSBSSʘH VHH H V @E' PDINITIALIZEPDGETCURSORPOSVCPDSETCURSORPOSVCREADINPUTEVENTPDSETCOORDINATESVC GETPSTRUCTUREPDTRANSLATENSCTOVCPDGETCURSORPOSPDTRANSLATEVCTONSCPDTRANSLATEVCTONSCRQPDSETMOTIONRECTANGLEVCQUERYREQUESTINFOPDSETCHARMAPCOORDINATESVCPDTRANSLATENSCTOVCRQPDSETVIRTUALCOORDINATESPDSETCHARMAPVIRTUALCOORDINATESREADINPUTEVENTVC READKBDDIRECTPDSETCURSORPOSMSE_INITIALIZEALTQUERYVIDHDWGETIBUSDEVINFOPDGETCURSORPOSNSC __aFuldiv __aFulmulPDSETMOTIONRECTANGLEPDSETCURSORPOSNSCPDSETMOTIONRECTANGLENSCREADINPUTEVENTNSCjH WNCOLSMAXp WNLINESMAXrDUSERSCALEXFACTORtDUSERSCALEYFACTORx[MSE_INITIALIZEPDTRANSLATENSCTOVCPDTRANSLATEVCTONSC:PDGETCURSORPOSdPDSETCURSORPOSPDSETMOTIONRECTANGLEPDSETVIRTUALCOORDINATESPDSETCHARMAPVIRTUALCOORDINATESREADINPUTEVENT MSE_FINITMSE_FADJUSTFORCHARMAPMSE_FVCMOUSERQ MSE_FINITRQ MSE_WUSERXMINZ MSE_WUSERYMIN\ MSE_WUSERXMAX^ MSE_WUSERYMAX`MSE_WCHARUSERXMINbMSE_WCHARUSERYMINdMSE_WCHARUSERXMAXfMSE_WCHARUSERYMAXhMSE_NCHARWIDTHjMSE_NCHARHEIGHTl MSE_NXCENTERnѠU WVP+PNQ~v~vF t_^&?uP&7P@PF t5PFPQ~v~vF u9FuPFPQ~v~vF u9FuPFPQ~v~vF u9Fu>t F u{HPP~v~vF uYLZN\P^R`@tvxzP^&7|PF|&G *p&G rF^_]UWV>u tq>tvvv v vv֐6v6tF+ҊԊ*RPZ^ &6z6xF+ҊԊ*RP\^&>un^ &9s&9&)f+b@&'ȡp&j+RPVQb^ &f&9v&&^&9s&&)h+d@&'ȡr&l+RPVQd^&h&9w&^^ &9v&`^^_] U WV>u t>tvvv v vv֐>tSF+b&p&jf+bA+FnFN ǭǢǞǚǖǒLjǁ|V d\UPVJD+ VʝƿƶΰVƧơƘƔvlfV3/%VVĝżŵͰVŪŤŏňuVpc_\XQNKHEB?<)VVV ƝĿ̦V ČsV QVH V F+d&r&l+ҋh+dA+SQRPF&FF+\FF6v6tF+Z+RP@^ &6z6xvv@^&P^ &9v&R^&9w&^_] UWV>u u[>tv v vv>v v vv~v~v u^ &7v&4v SV^_]UWV>u t>tvv>t'b9FrF9frd9Fr F9hs%XZ9Fr^9Fw\9Fr`9FwvvFPFP uvv~v~vu^_]UWV>u t>tv v vv>uF 9bw9frF 9dw9hsjfFlfFv v F PN Qv v 6v6tF+RP@҉VR6z6xF+RP@҉VR~v~vCZ9F se^9F vZ\9F sO`9F w\A^_]UWV t>tv v vvܐF \N^V`^ Z+A+SQP@+ҊԊ*`Ǎǃ|une`VNF?:V60VVƼƸΤVƚƖƌ·V neZTKE81,V  VVНV ųūţśőŅŀtngbVVKFV@:"V VVϝǝVļėĉtVkgQVJC?3)!V TbڃSQtvF+F @+RPȡR@ڊԊ*ڃSQxz%^_]UWV t>tv v vv>*u>&u >(up8 r *p(np8 r *p*n*jr8 r *rr96r 6r8lF bF dFfFh+PPHP HPv v vv^_]UWV>u t>tk>tv v vvv v vv~v~v u^&?t&?`u&w&wGPGPv FP~v~v tcF^&G& Q^_]-!V VVͻVũŢŚœ͎VňłniVWSNVID=71+%" ݝ؝՝ҝϝʝŝĸıĪ̠V Ďă~VkgbV,VH SQ  ? H*Zڊt rqlabl-mouseCTAsm x12.3.0/FTB-Iok??SEG??SEGSTACKSTACKseg14Hseg1CH seg0F09CH seg0F0A4H seg0F0B4H seg0F0BCH seg0F18CH seg0F194H8ht a Xۘ ^ i ˘ RK ^w  ReadInputEventVC^ PDSetWindowVPDRemoveCursorZvPDQuerySystemControlsPn PDLoadCursor6PDSetCursorDisplayInAreaVPDReadCurrentCursor\PDSetCursorDisplayXՐ PDSetCoordinatesVCZ%-PDGetCursorPosNSCReadInputEventNSC PDSetTrackingT PDSetCursorPosVCVGetIBusDevInfo6R PDSetCharMapCoordinatesVC\PDSetMotionRectangleVCXPDTranslateNSCtoVCRq^̐PDQueryControlsrPDSetSystemControlsݐ PDInitializePDSetMotionRectangleNSCR6PDSetCursorTypeX PDAssignMousep PDTranslateVCtoNSCRq PDDeinstallRϐPDSetCursorPosNSCP PDGetCursorPosVCT PDSetControls^PDLoadSystemCursorUIt(3=PFXaPDTranslateNSCtoVCRq MSE_NCHARHEIGHTPDSetSystemControls PDGetCursorPosNSC PDQueryControls MSE_WCHARUSERYMAX PDSetControls READINPUTEVENTd|k7[&vM@MSE_WCHARUSERXMAXMSE_INITIALIZEPDSETCHARMAPVIRTUALCOORDINATESPDREADICONFILEPDSETVIRTUALCOORDINATESPDSetCharMapCoordinatesVC PDSetCursorType PDSetWindow PDReadCurrentCursor WNCOLSMAXDUSERSCALEYFACTORPDTRANSLATEVCTONSC MSE_WUSERYMIN WNLINESMAXPDSetCursorPosVC mousecursorsubs! mousevcsubs! rqlabl-mouse! *P6 H`?YjPDSetMotionRectangleNSC ReadInputEventNSC MSE_FADJUSTFORCHARMAPPDRemoveCursor MSE_NCHARWIDTH MSE_WUSERXMINPDGETCURSORPOS MSE_FINITRQDUSERSCALEXFACTOR)FVrP6>}^jPDTranslateVCtoNSCRq PDSetCursorPosNSC PDSetMotionRectangleVC PDLoadCursor MSE_NXCENTERMSE_WCHARUSERYMIN MSE_FINIT PDAssignMouse PDSETMOTIONRECTANGLE MSE_WUSERYMAXPDTRANSLATENSCTOVCPDSetCursorDisplay qWP_G4(g<PDSetCoordinatesVC MSE_WCHARUSERXMINPDQuerySystemControls PDInitialize PDLoadSystemCursor MSE_FVCMOUSERQ PDDeinstall MSE_WUSERXMAX PDSetTracking PDGetCursorPosVC PDSetCursorDisplayInArea GetIBusDevInfo ReadInputEventVC PDSETCURSORPOS COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: mouse.lib VERSION: R12.3.1 (friday november 12, 1993, 16:42) GW\$GFI,$ @ @ @ v$$v@v,Copyright 1993 Unisys Corporation. All rights reserved.Ver R12.3.1 Linker R12.3.1  5>p?`D DoR?PTV[O `_ Pi_tz{`}~~? P?0 OP?PpOpO` _`OP?/p?`?0 __  ?P""#%&((,@-o.p/ 004/P5O5/5/8099:O <p?CDFGpI0JJK_L0N@OPQOpUhl mptuvw x`_`G`*h67-G8'0(&/."  )#+7*3 8F% +,"M$d1/m2,N!45 )Ai& 3  . M  3 ` WkQbQ'+aqFNNNNNNNlN Nh N%EKE#E:iMisi !)19AIQY SAd`fD7 >KKKKFKyKKK[KK K=KlKK(K>KBz)=Vr q { lv+B {  ! T   k   1 g    .BBa&aaaaaaa aQw0| I _I I I I 7w w w +w Gw Rw  \   - h    F   0   {   p Ap ~ ~ ~ ~ P ~ i ~ ~ ~ | ~ ~ X ~ } ~ ~ ~ ~ 1~ g 0g Rg ag ng Sg qg g g g g !g G  = n  w    K Z ~   7 w  b v   ; H m z       N N N   ? ] q   ! h U U U *U 6U '^ j jj j j /~ ~ M  / F X  ) </DSiSSySl%_Ah,,,,,)%)88*F_y3r7H0Cc TgH   +Ff, U8W4WAW]WvWWW W WS W WWWRW;N=jPjYj2`QFN.EiKBaE I w p ~ g N  6 L U Z ^ g j ~ /Sl,r%)8Zj HUX]1Al| WN_j|fxF  DJVh ,`f 17CU &9Mqw+AO\hp,;g#FTcy Q t > C U j p  ; G M h     ( 2 < N a g G M $4IOd$A IVco _s ;FY^oy  6 QwQ}QQQQQQQIQ_QiQsQQQQQQQBQLQ[QjQ{QQQQQQQQTQnQQQQQQQ?QQ,QQ_QnQxQQQQQQQQQQQ'Q1Q;QEQVQbQlQvQQQQQQQQ QQ(QQ/HZmJ47^F>FJFTFeF|aNN2NNN4N^NNNNNNN NJ N NA N Np N N N N N2.H.BiUitiziiii iiiii\i(2<FP[fr~=k#Q 7eK'y/7?G1O_Wbfjnrw{ #'+/48<@DIMQUY^bfjnsw{ #'+048<@EIMQUY_di"t:Ii/Ot!3Aguby 1     '!@N{"nL z K/KK&KNKKcKKKKKKQKKKKEKtKKK0KFKh       [5F$k$_         & t     ;A    0B  aaaaaa|(V#Q ~}sI AI I I I mI I II sw l  * P t  o s   6      p @z~ ~ 4~ ^~ ~ ~ D~ ~ ~ ~ ~ =~ ~ ~ / ~ = ~ a ~ o ~ ~ ~ 4 ~ B ~ g ~ ~ ~  ~ % ~ 4 ~ B ~  ~ J ~ ~  ~  ~ ~ ~ ^g g Ag Wg hg g % N   I T ;  l    d GN uN N N {N N N N N  X >     1 u   B Q ' 7L FL L #Z g^  8 T r   3 i n   !    5///9SZS&lKl_lwlllLlglll l"llFllll?lqlll79 ~,,,a,, ,%,8,1rryrrrrrrrrrrr,rrrrprr r(rDr`rrr;rrr r+)888ZCZ\ZZZZjjQ`ba?6 N      H"X]`]3 3z9kF<KRj{[t3Pds1<11@AA3AnAAA A:AAl|[|||F|o||4uZ<3zE'3zcR WWpWW`WWIW`WWWQWWWQWWWW\ W W W W W W% W W W W9 W W WWWWWBWWWW,WyWWWWW+W!y,bN<|Yeq&   {  t  Q  ffx4  $Pj] Pj V P6T +PjFPhtP(Pj]Pj ]PjZ P6X +PjFPhtP(Pj ]PjNP6L+PjFPhtP(NLPj]oPj ]PjZ P6X +PjFPhtP(yPj ]PPjR P6P +PjFPhtP(R P Pj] Pj V P6T +PjFPhtP(Pj]1>Y44PPj[Pj]PjS6+PjFPhtP(bPj];Pj ]PPjNP6L+PjFPhtP(NLEPj] Pj V P6T +PjFPhtP(IPj]U$Pj ]FP6D]1Pj]JP6H]5Pj]]U~tv] Pj ]PjZ P6X +PjFPhtP(Pj]U~sPDj*F 10^&<9v&F 1¹10^&G<9v&GF 1¹10^&G<9v&GF 10^&W9v&G]FFFHF^&htHu ~tN~sdF^&89v& ^F&u+JVt'FNFFF~uF!N뜸PD^Sv] $FFFHF<s3^F&0NNFF FuFN^&~ uFF HF^ &htHu ~tN~saF^ &89v& ^ F&u+JVu FN^&F~u Nj<F tFFF;Ftn~thjPFP< uR^SvFP;r-P^Sv]PjZF<^FFFjjFP< uUF tN70F<؍'vNF<؊F&FtL}~uF~Fy~uV~s FF~s FFFFFFF9Fr:SQjP)P*Fڸ9FuP* Pj]jhPP*Pj ]t+JuFNF1F~tG^&;t*Nsu+Jt N^GFFFF^NVV^N>;>u;u ,Y4>4PFPj u~4+Y4>4PFPjePj]FPj V P6T +PjFPhtP(lPj]P(P*hijklnpr5t$z|~hPP*PQRSTVXZ\%bdfPPP*6FPP*P;vu;Fu%6X*%< t <tF%FP%h;vu;Fu 6p*$F<thPPj*~sF<t#<tt ~uPj]F8Fu?~ u(У~Po~uk~PZ tPDPy<PDPQ1PQP<<Q~u j+~u j~u j ~uj ~u@ RRP^ S^SvFP tF Us F ~;FV ;Vu;Ft@]S^SvFPZdP*sP^SvFPZdP*SFPjFPZdP*sPFPjFPZdP*&+>Bu@rsFamFwmPCPBPFPjv済PhF t%Pvj < Py<msPDCPBP]#Py<rs )Py<, F>u s0r+Pt+Ju @P0FFw#؋ tQj<GPFuոMPD66j < t PD.Py< s PDFFFFމFFV>u FP~t P~t6FPP*P;vu;Fu*6X*F%<u&O.;uFݸP!h;vu;Fu6p*$FݸhPPj*~ u ,F7~uF*~uF8Fu P* 1Pj],/P~usPP*,>uFPLFsNFFN؎&;uFF^&7&w&w F;r^>"tr;uFhFFFFw;<؂&t(F":&u'Q"QPuFFuFsFFr"s ^&GFF tON;NsL^&;NuA&9Gu;~s &G;Fu,~s"8u"QQPu~t7t+J;tFu+JtS~r>tFF;t=PvvvN^&u+Jt FFVFF;FsD^&F&GF&GF""#^ s* t+Ju FFVs#PD66j <2Py<PDvj <5Py< t#F޺Y4>4FFv]7Py<+sPP* 9Py<Pv j<?Py<v j<CPy<s EPy< vj<JPy<vj <LPy< t#FY4>4FFvssF>tRNPy<s PPy<P9<>tRPy<6j<s TPy<VPy<U~u 1F Fd10¢F1¹ 10¢F10Ј8u >1t Pj]]U ~N~sF 10ӋvN^&v+&.V;vF 110v&Fv,F d1 10Ћv+^&:u& Fv,F 1 10Ћv+^&:u& Fv,F '1 10Ћv+^&:u& ]U %EFt$u$h%P(]$-&-&Gu &&$ & &L>r &&U&E$t h%>uFPPPRPjhrm ux6FjjPfP u]jjfP uKFPfP u8FVRPfP u"PjfP u>"uˡ"PHX"J"PL"NZHP6F F""UZ]v vvDrS">tFu@>uFt2"rТ"""rZ;t9Fu 9TucFZ\PhTs\Y4FVNRVRPfP uTЉF\FFFrFPjfP t FF~tIT9Fu$9Fu F;Rs3v~F\FPhRs F;TuFF@F;Ht|F N׉FVRPfP uJ"PjfP u"P"PfP t"R+F^~u@#Fu;r +NFF^Fu =r=r%F;Ps;NrF+NPH^FFPfP t[J N׉FVRPfP uFPjfPvvfPF^GFvTV FFFFÿ#ljF VFF#׉V9Vu9FuF;FF;FF;Fv>dt%>duhdPj td>dtkFF FFFFVFF"NQjRQP"PhF u >"w@Ft!ud^&7PhFP u Pv^GP^&w]U<^S]U^SF Pt]vj^GPjF ux^&G&W;Vu;FsFVF^&GFV&G&WN F&_&%&G &W FV%&G&G&G&G&G ^&FFF ^&"GF N &"ON rrFNV s NF^&GF sF^&G&G^&G&W%&O & v^;u;s(F^&G &W WQSF u8^&w^vPv^&w &W RVFP$F u ^&FF^&G&W;Vu;Fs N sMFVNVF ^&;Wu&;Ov.F s!&+O&WRQSF tFV%Fff^&OsOF =w@&GsFF^&w&SvvvFP#F u^&GZ^FV&9W u&9G uHN N;v8&Or0&w^QVRPFP#F u^&GFV%^&;W u&;G t&GsF F=v\hjSF u^&G&G&G^FY^&w^PPFVRPgF^&G &W FV`PP^SF ufF F=w@^&GsFF^&w&SvvvFP#F uF^&GFV&G &W F V ^&G&WF V &O&##^ ָ##;u;t"~&uN ~ RS F uF V ^&G&WU+F V ^&O&;u;rN ~ F F v v jh^S]U^&G&G &W &+G&W^ &&W]PP^SF uM^&G&G &W &+G&WRPSF u#^&G&WFV&wjFPj  ^&FFFV^&G&WRPjjSF u+^v&|^Fv&D^&^ & ^&FF^&G&G &W RPjjSF u(^v&|^F&^ &^&G ^&FFFV^&G&WRPjjSF u3^v&|^Fv&D^&&W^ &&W ^&FF^&G&G &W RPjjSF u0^v&|^F&&W^ &&W^&G^&FFFV^&G&WFVN &;Wu&;Gvwvvjj^SF u^&GsFFF^&+GFN ;sNN^v&t0~ ^YFt^&wNH^&^ &F)F Ft#PP^SF u^^&GF u^N&O &W =vFF^&w^Sv^&w &w FP#F umF ;FrFFN^ v8vFYFtHvvN^&^ &F)F FU^F&G=w@&GU^&G&G &W &+G&WRP^ Sv ^S*] ^&FFF V^&G&WRPjhSF uAv&|^^FF &s^&G^&v&G^&G ^&FF^&G&G &W RPjhSF uAv&|^^FF &s^&G^&v&G^&G ^&FFFV^&G&WRPjhSF uHv&|^^FF V &&Ws^&G^&v&G^&G ^&FF^&G&G &W RPjhSF uHv&|^^FF V &&Ws^&G^&v&G^&G ^&FF^&G&WN~N~F &;u&;Ov&+O&WQSF uvvjh^SF uc^&G+ȉNV ¾;ưw@& G&GsF&Gr>;s:&w~PV^&w &W RVFP#F t^&G^&&GF ;FsFN^v&t8v FYFtH^&OvN^ &^&F)F u ^&GzF^&G~ rZPP^SF uj^&G &W ^ v&t0~^Y^&G&G)F &G럃~ u ^&GPP^SF ui^&G &W &G9N v N&G&G F^&G^&w^vPh^&w &W RVFP#F uNN ^ v&t0~^YF t^&wNH^ &^&F ^&GU^&G&G &W &+G&WRP^ Sv ^S ] U^ &^&;r>^ &^&;wE^ &G^&;Gr ^ &G^&;Gw%^ &G^&;Gs^ &G^&;Gv] F FFFFF~t?~t9^&Fv& &^&F@NFNF@NFNN FFF ~wFF9F~f+FFF |TN VV QFNFFnFF ZFV^SRP ~^S^SvpF)FF뒋FyUv,rTF 33ttNN&6^&& && &-&&D3]BUF؋N stA  t ;OvFukC[7N+уw7p HB@@P;vG^&&_3] XPQ6jؚY uߜ>uLQ6jj|Y u-&U^7u;;pu6@)6@v)t O+rH;u Ƌ@@'D] 5 t ;r4wO  N;stHO J‹@ ;v>u3]6jj| t3^G>u/1HFX' V'u'6Z V'P*P(h`'P*P(Z >V'6X'6Z jP(6X'j@Z'PhdP(>Z' >`'@d'FF9Fs&;t#F&4&t&t >"u^WbF&D+^'Fhh'FZ'&8tOX'FvZ'&F~t4h'^&8Gu i'QO QPu ^&G%^&vF&tvFt>d'uFFFFruFFd'N;r`'&Fv`'&@F^&G^&;Gs*v`'&F&@&vF`'&@FFuf'^>d'tdX'F6f'`'&Ff'@f';d'r^^&OwFP^&w&w&w6X'h' PFPhdP(F^&GF^&G^&Gh'h'^v Z'&^&v FZ'&6d'F`'&d'@d'=@vj( ^'""h'""+OtINt'"P+HFZ+Jh'ٍ"FFF t\HF^arzw( ^v\ u+JVu^'ˋFN^'FFF^F8r,F\,u^PF8Fu]UQ^ PPF^ v&>\,uP^SFPsFFѰ]U^ PDFFFF:Fw>\,t^ PDFNs N^;st^&V*uF&> F u+JVt  &F> F u+JVt  &FF:FtFFLFFF^;s^&8*u& Fs F^F]UQQF>\,uV^ PP^ PD:F u3^ PF^ PD:Fu^ PD:FuFF룰]U>\,t^PF\,uP^SFPF^PFNr"^PDF뷀~u\,tn] UQQ>\,us^PF\,uPDFVN;w^ ;v +ʋ^ &FË] U^ G F^GWFVvFPFPFPFP^ PFY4FVRP^ PDFF~%sg^v&8u &%tT1^v&ÉFPv!s^F@F؋]FFFF%;r)N듋FFFN;w)NGU^FNFFFFF~tP^ F^ NV´3ЉVVŠ^3ӉVV3ӉVV3‰FNFN몋F16^,^ F%1^F16^,^ F1^^ ?u^?u] U^ G^ GN~+^ O]UQQ^^:t^FFuȈF^@>  u+JVtS &[@^F@>  u+JVtS &[@^FH^:Hun]UQ>\,tT^tP ^G ^PDF^P^G~u^P ^GF]U>\,t}^G FGF;r>OW^7G PQwwFP#\,u\,u^GF^vFFv^w^O^FG F]UQ^PDF^PDFF]UQ^t>\,u PDFl s^G t >\,u\,u]U^ &GF&GFv FPFPF ue~uF:FwSF*F1F~uF:Fw2F*F1FFFFNNN8Fr8Nsw ^ &GFFFF:FsFFF8Fw^ v^F&N&WVv PFPQRTFFt4v FPFP^GPFPFFN+v FPFP^&wFPFF@FF u9FFGFt,F ^ &GF^ &GF^ &G^ SV] U^&ux^&GF&GF&ON&GF&GF&GFNF:FsFFF8Fw^v^F&N&ONVRPFPPQTFFPFPFPPFPF u;FtFNF@FFFnFtS^&G]UQ^S^SvvF^SP^Sv^ S^S]UQ^S^SvvF^SP^ Sv ^S]UQ^S^ SvvF^SPy] UQQ^&G FFF;Fs^SPyP(F]UQ^S^ Sv vF^SPvW]UQ^S^Svv F^SP^SvA]U^&G FFF;Fst^&G FF&|^AFFv&t^&FN;u.^ S^SQu^&G t &G;FuFF넸] U~uy&F^&G FF^&ux^&GF&Ov& N^&W&TV&_^PQRfPSP(f`,Nt+Ju0^&Gu%&O N^v&t 0fdfPFP^Sv^ S^SPl ]U~uy&F^&G FF^&ux^&GF&Gv&F^&G&DF&GFbQP^ SF PFP^SPl F uHNF;v+ȋb`,FPFPFPbPFPP(]U ~uy&F^&G FF^&ux^&GF&Ov& N^&W&TV&GF&Gt1&G FFPQR&t ^PFPP(FFPNFȵQNQ6`,N*ȵQP(]U~uy&F^ &G FF^ &ux^ &GF&Gv&F^ &G&DF&GFFA;rQrFa;r qs)N7FStsu^&G%FUtuu ^&G%FFPFPFPvFPT]U~ uyF ^&G XZ\ĞX&\&G^&G`&G% u@b&G%@ u@d&G% u@f&Wꉖh&Ojs*&wVF^_&ƉV&l&@nĞX&G z&O ^ĶX&t 0|P\~N] U~.u+JVt2~:Nu+JVuFF F^^&?tdF@NFN&^;uQP~WStNF;v.^PR@+QFPPFPP F tpF^&FNFNFsFNFN^Sv^Sv^ Sv^&S^&FNFN!z]U~ t{~`,Nt+JVuFFFF9Fv8^&:`,t*0rJ9wEF ^v&0FFN+N^v8`,t+JVt|F^&^&]UQ^S^SvvF^SP^ S^Sc]U4FFP5F u ~u]U~uy&F^&G FF^&ux^&GF&Ov& N^&W&TV&GF&_^FPQRSFPTP(^ &NFNNFRQPFPF u^&?v&GBQP7P(Q$u@RƆOFPFPFP4F tFPFȴPFP4FF uNP5F tƆMRP PFPF u^슆N&@ NBPN:BuOrƆOPOr PvƆOF:FrKRr^FPFȴPFPLPP(L tFPFPFPNQN*ɵQAP(FPFPFPNPP(FNNF@tJ:NrEƆN^&GNu F:Fs}NuF:FsFjNuFF[NuWFPFPFPSPFPP(S NOuIFAN:NuNNu#F:FrFȈF犎RrۊNQNucFF:FwFPFPPFPN*NɵQAP(FPFȴPFP PPP(8NFF9Fv.NQNQN Q^PF uFʸ] UFPFPF u~ sUPPFP/$F um^&G :Fw\F^X ^F&G^ &^&G(FPFPFPGF uF^ &F^&] U~u8vv vlPvF uvv vlPvF] U &>  u+Jb, &>  u+Jd,>b,u &>  u+Jb,>d,u &>  u+Jd,f,]UQQf,r~`,Nt+JVt_^v&F &8t% &:Ft8 6b,F&8t  &8uF$ 6d,F&8t  &8uF|F~N F ^&]U^&s FF  FF FF;FsFv~N^YF^&]UQFFN ;sNv~N^YN F;v+^8`,~`,N OuIA^&]UQF FN;sNv~N^YF^&]UQQ~ t{y~v~N FFFF t4~u9Fu)FHFF 10^v&F1FŠ`,~NF^&]  ~i^GP^Sv^SvHF t&FPdF uWh,^w@,F,0-^&wh,PhMF^GP(F t^&G&G;G5P1F uT9FvFF1^&G;Fu&G^&G@&G^&G&G;FvSrFFGF^&GZ&W&Ov~ &w&&&W&O)+&G ^&w;FFU^&wvO]UF>@-t=t P  $]U~u]^&GFĴ.GFF'FK.FFK.F&5^ćH-FFğ-^Fv &F^&NFFu-#ȋ^H^&Z&Wv#^& F^&Z&W ^&G^&t H.I. $^&tH.H.I. J. ^SI.PH.PhFPv ^SvPF u^&G :*uShhv ^Svh,aF uF^&G8 @F^&srF F~u'~thtFN^S,F~t,UFPvQPQe]U^&G :*u:*u :*t^S]^&G :*u:*u:W*u ]^&G$&G ^&G,^&G(^&G2^&G3^&G0]^&G :*u:*u :*t^Sh^&G :*uF:*u=:*u4:W*u+:*u":*u:*u:*u ^Sh F u^&v#&wxh$^&wx&GpP$K^&u t1^&FFv&|^^F&7^&Gn@P$htF^&v&wxh$^&wx&wp$,^&u t^&7^&wn$FU^ &G :*u:*u:*u :*t^ S^S]^ &G :*uF:*u=:*u4:W*u+:*u":*u:*u:*u ]^ &G|^&^ &G|]Ȇ^&^&G :*t W^&G<t':t!&OFPsFr^&G^&u2F ^&~ t^ &?utPPP^ Sv _>P.u!P.FPF u ~ rP.N. L.ujjL.P/$F t^&GFL.&8G wFL.X ^Fv&DF&GF&GF&GF^&GF&GF&GF&GF&G F&8G uANsNQPP4F t FF^&#tF ;Fv F&O#F ;Fw FrF9F w~^ &FF^&O&@^&G^&w6 FA:r /s >/FF~t&F:Ft~t}<uu F;FrF:r*FF^&G$rF;FrFP&G!N*ȵQNɵQOQPF u@FP^&G!N*ȵQNɵQ&O%QPTF uʊFPFPFP^ vP^&G"&*G!PF u^SFPF u~uF ~uFF;FrJ^&G$saFP&G!N*ȵQNɵQOQPF uFP^&G!N*ȵQNɵQ&O%QPTF uˋFFF:~w Ft)F^&G$F^&G%^&G$FPFPFP^ vPF+PF^&Or' uFPFPFPFPvTF~uՋFFF~FF^&G!Ft^ȍvF^&G"^&G"F:FwGFNNV:w3NQPRjhF uqFȈFF> >%]?U.>><Ŀ&UB>"u$&U>tt u Ƈ3LJ@@H ; w3ǁFıV&t&u#&t&DŽ&DŽBřN tƇ23Uw(>Ƈ0Urx> uË ;$t6ķ&&,&FA +;$r3,z>ULJ@Hu H~U ;$t2uLJ@LJ@U"!#!!!!!.!?!!!!!*!+!!!!!.!?!!!!!U&.>>>ȋz>рp "t 2.9twx0>t ."t,<t<u$t\UƇ2@uLJ@td+w"+fw u, t>Ft;wtt x>u3Ut2 2t'Ƈ2;$t@uLJ@0uS-,Ƈ|UUpu51u.<t&<t".t5u < u Ƈ5 Ƈ5< t[苗d;r";wlpt@t9t0,ht :iuĿ&E&&&d;w;vLJ>:Ŀ&C;drXdrQჿ`u`+^"Ŀ&S&C+t&E3퉯^&FtLJF4LJ>:U`u`+^^&Ŀ&S&cFtLJFUd;t&r";v ;drdrLJ>1ttĿV&&UƇ4tBRP.x>p$p>Ŀ&U >XZtLJ@40uS-,U>ȋ=w>=wZ=wTĿ&U>t6t t3t'Ƈ3Ƈ0LJ@Ƈ3Ƈ0LJ@3tJz>Ƈ|"t5&d;w&";w;^s^ZFu33˥'^&vvvvv&<^ Pv ^SF-u~FN ;sNFF~u\FsUvvvvv&4^ PvFPF^F&~uFFV^&;F rF랋F^&^ &&W^&G :>+t ^&Gs^&G&G&WFV&w&wRP&S^&wFP4FV~NV~=]=u# t^&GF^&G^&GFF up^&GFV^&G&WF^&G^&G&W;Vu;Fw4&G^&G&W&+G&WFVF&G^&uFF^&G &w8 F^&G:t P)FF W,Y, S,U,.~eF =wmtAN=smt=pmu'^S^Sv^Svv ^Sv\0F =rmt=tmuFrmF =wmt =mmt=amuFmm iFP^Sv^SvvF=t=uB^S^Sv^Svv ^Sv\Ft !t= uFFa~uv~mmuo^Sv^Sv^&w&&w$F=u^Sv^SvjhF~u FP^Sv^SvvFFF t^G:P(F uM^&w:FP uF FuF^&G8#;u8. .uhj.P/$F tf.& r 9FvFF1F1F1F;s ^Sh %F^&GZ&WvF&MX&E&uF+ƹ1&EFF&Z&U&E$<&E&FYs߸&G&G<~ tmuv^S^GP,vj^GPjFF usF =rmt=tmu)^&G &G 5^&G&G~ mmu)&O FV)^&G FF^SvvF t ^SPmF^&G"s&G :)+tF ^&u&uF{FNs^&G$FP&O&xWF&wFPF u6^&Gt<uF ^&uSF u^&G~uFs ^&G#^&G#FF^&G :)+tF 1^&G$r&G&F uF FF^F ^G'FF^SvP^OQP=F^&t&G"s^&wFPF u*^&G"s2&w;^&G#sF^&G"rN^GEPF u-^&G&GG&G&GM&G5&G9GAPF t1^&G"^&G5&G9&G t&G5^&wFPF uJ^&G9&G5G5;vu;FuF^&G"&GIF^&wFPF u;^G5N^;u;t&^GA;u;u^&G"&GIFF~uiFFs-^&wFP t@F~u؃~uF^G5P2F^&w)F~u u^&G ~uFF^&G$FUB,Vnjޱ;u$:u ^&G( ~F =rmt =tmt )^&G ]^&^ &&W^&G :)t WFP5F uC>/~uF1~uF$^G^ &Z&W^&F^&GFU ~F =amt=wmt=rmt=tmt =mmt&l*^&G F^&Z&WF^&G]U^&^&G :l*t ^&GN ^&]U^&^ &&W^&G :l*t ]U^S^Sv^Svv ^Svj]U^S^Sv^Svv ^Svj]UFPjv^ S^SQFPQ]^&G :)tSv^ S^Sgd<^SFPW,F u'^Sv^ S^SgdF)^&G F^ &&W^&^&O :+v^&zB,Vnjޱ;u$:u0R,r)B,P PjRPQhrmRPQF u(^&G :h+u /FF^Sdu ^&G s<&G s4~u ^&"^&G ^G ^ &Z&W^&}^&G&;Gr$Sv^ S^S9F uX^&?uL^&G&O+;FsFF^&^&FFv&t^^ &Z&W^F&G FFN F;vP~uJ^S+QFPFPdF t tu.^ v8vNFYFF릋F^&F^&G :)tRS^ Sv ^SdFP0sm+Vnjޱ;u$:uH^SF9^SFPS,F u'^S^ Sv ^SdF)^&G F ^&^&O :+v ^&+Vnjޱ;u$:u7+r0P0r)+P PjRPQhwmRPQF u(^&G :}+u /FF^Sdu FFN F;w~t^&W&;WrS^ R+QFPFT^&G&+GFV N+;sV^&FF^ v0~&}^9N^Y^F&GFFcF^&FU^&G :+v ]U^&G :+v ^&G ]U^&]U^&]U]U^& t^&G :)u &G& u]Uv&D @/tM/O/P/Q/7>@/tM/O/ P/Q/M/\O/ P/Q/ЉR/T/V/X/Z/[/\/>D/u>@/t [/\/@^/`/b/~ rr/d/D/uut f/\>D/t f/`f/ci/h/j/8D/ti/h/j/!>D/th/8D/th/>r/r?l/m/A/n/O/p/Z/ utm/r/;s;t>t/r>@/sC>D/u9>Z/u/>E/u%FPFPF tFZ/F[/v/i/r z/>Z/t z/@z/>D/t>Z/u|/|/}/>D/u l/rw/x/y/w/x/y/F ;s;t~rl/>r/r/@9FwF@/~NF/PF u6/^Sv|UQF =rmt =tmt"6h+rmP'//h+^&G ]UQF =wmt =amt!6}+v '//}+^&G ]U^&G :}+t ^&/SP(]UQ^&^ &&W^&G :h+t /S),]U^&G :}+u/Sv*d ]j&jFP/$F u ^&G-hjFP/$F u^&G < sA<v@"FFF FtFPjF t@^&FU#U$VWQ^SY_^F^OGG w 3GGG؉GGGFG F GFGFGFGFGPS]UU^ SG PPFP4[#uMG~&wr/^ F%;u^ ^ FF;tX F ;FuX]F :r10^&Fr^&0FFF 10^v&F@ vvFPF^SvhF^&:F@F^Pvj]FF^&:F@F^Pvj6FF(FFF^SvRQPNQNQPlF u$F t^ SNQvNQPj$F~uVFF^SPvFPF u2~t,^SPvFPF u~tF;Fv4N+NA^v0^ ~9^YFF+F@^&^&<{t<[tF FF^&^&?{uFSPvFPF uoF sdt_NAv~^YF@^&^v&48 ^& ^SPvFPF u ~uFHN;v9@N+^vp^~&=9^YF@N+^&CFPdF u^&O@wA^~&=9^Y^&G@^&^v&48^&v&4^P^&wg&we^&^v&48^&"^vFF^&F^&G^vNFY^&Gw^ &Gj^&GyF^&^vNFYFPdF uQ^&G@^&^&O@wA^^Y^&Ƈ^&Ƈ^PF uN^ GkP^ &PFPFPjF u#FPvhjj^Sh#Pj Ⱦ^&G F =wmt =amt^SvFPFPjFF uݍFPvjjFPQ؍GPQF!t=u~^&Gi^GePF9FvF^kvN@YF^&^S^Sv^SFPF tF~u;^SvRPPRPF=u^v&xF^&Gi뾃~t<džCFEGv@CPEP}FF7^SFPvRQjv PvF u +^&G  s ^&G8^&G8Fvj^ Sj7F t^&F^GkP'P^&PFPF uFt @^&F^& ^ &Ow~&=^ 9^NOY^ &G^&F t$@^wk~ ^Y^ vx(3~ B^&G :+t )^&G ^SFPFPPF u^SrF u}^&FFvN^S^SvmF tJ^G8P^SvRPjhmmF u"^&w8F t^&w8 FFU^&G :+t ~v F^&Gj]UFPFP"V^&?{t@&?[uT6p(:+t. FPQSVSVQ^[Y=Xt ],N~] t&<FFv^"&@Fv^"&x"ti&Gwub@JP(F u,vZ^F&^&G ^S1F tvF^"&@VZ&PX^&GFth~%^"&Gwt^FR.FFV.FFZ.FF^.FFFFFF^"&OsN&OqN^&OcNNNNN&tFFFFFPFP tFF s u~r ЈFQ~ u?~uЈFF>ЈFF$~r)FFsF~ u~ r F$F~^SvFPvFPvF tlFƒwu{F^"&GF^"&GxF^"&GzF^"&^"&tu|FV^;u$:uF^"&Z&WF^"&G+/؍/^"&&_^"&G/@%/^"&G^"&G^"&tuB^"&FFv"&t^^FF&F^&GF^&GF^&GFsZFƒtu^"S^SPRQP^"S^Sv^Sv͚lF t^"S FF^"&G}^"&s &_ ^"&_BF^"&wIF&_v˷FF^"&vF&wxj$^"&wxj$F@F^"&Go^"&wx&wo$^"&wxj$^"&G :*t:W*u^"&G tu ^"&wxj ^"&wxj$^"&wxj$^"&G :*t@^"&G :*u&G tu1Fֹ@@2^"&u&Gn(^"&u Fֹ@@Fֹ@@ ^"&Gn^"&wx&wn$^"&wxj$Fֹ  ^"&Gp^"&wx&wp$^"&tu^"&G# F&s&G&Ov ^"&G+&Wv"Ѷ &Gn^"&u&On^"&u&On^"&wxj`$^&7^"&wn$^&wj$^&wj $^&wv$^"&GpsjFPhLFFsvv$jF$PPF uc^"&GFF^"&G& GtvjFPPF u3^"&GFF^"&G& GtvjFPPF u F^&u2&9w&wxP$^&wxj6^&tu)^&FFv&t^^F&wj$^&Ltb&GZ tXFF&G^&wLFP t^&^&GL^&G^&G^&wLFPF^&w &gp}^&wxj$^&wx&wp^&tu^&wj$^&Gwu&wF tF^&G FF;w|^&x"tf&Owu?&HJ tQ)F tFv^&@V t4P2F t&F!v^&XV^F&^&GFtzs}jFPhLFFsgvjQF uY^&GFF^&G& GtvjQF u.^&GFF^&G& GtvjQF uFU^&G :*t/:*t):*t#:W*t:*t:*t:*t :*t ^S ]hjFP/$F^&G F/~TF< t< u F =wmt =amty^S^SvFPctF ug~ u^&r^& w>~ u=^&s$S^Sv^Svv ^Sv.\^&t< ~s F^&GZ&WF^&G$~u^&G@A0FP40PjFP^v@PFF+PRPjhrmF~uF&w扜00^S^ڌFv&\Fډ00FFFFPF u{^&w拄r0FFF0F2NN&ONF&GHFFPF uNv^&w=SjvFPF^Ƈ2F utFFFFPF uFFF0F2NN^&ONFFPF tv)R0^&_LJr0F4vFPFv)R0^&_LJr0F uF0FFFFPF uq^ &w拄r0FډFF0F2NN&ONFF&O?NFN NF^^F&^ &GHF֍FPF t^ &;u vڸPSPv^ &w;SjvڍFPF܋^Ƈ2^&GF^&F=Ct=cuFZ^ &G?FҌF^&?t.F^&HN;r^ &_2^& Fu׋F^ &GEF ^ &G^ &G^&G^ &G^&G^ &G^&8Gt/^&u ^ &G"^&u ^ &G^&G^ &G^&G<t<u^ &G^ &G^&Gf^ &G FF w"؋^&;Gu F@^ & Fu^ & &FFFFPF uo^ &w拄r0F܉FF0F2NN&ONFFF<uF FFF~uF FFFFPF uv܍FPF uFF FF w8؋0 0t#ć0FF t& t PFFu2P(F tPNFN븰2F^FFF﹮2N^NN2NFF2NFFPdF tP222222P1F tP622PFT02njޱ;u$:u>^00t.F tP2^&GHF~ t9F ^㉇0Fr0^F00F^2Ƈ2 FF w+؊2s㋏0I0 u Ƈ2PnFu^ć000T0V0W0X0PF tP2Z0^00\02`0a00&Ob0c0^2ud0d0T0PF tP^&F^&&W^&G :*t:*u^Sv^S^S^&G :*t :*t g^&FtSjF u^&Gb;FsFF^&O*&Od^&`tN&9Os-SP^&+Qv ^SvhZaF uF^^&G^&Z&W^&G*^&^F&9Gw^&G^&^&^&)G^&^&G*^&G*&G^j^&G^&Z&W^&G*^&^&GFF^&G`F^&FN;s#&)^F&)G^F&G*F^&^F&)GF^&^&_㋇F u^&G*~uF ^&^&G*^&G^F&G`^&GFF^F&9G*tC u&G"FvN^&8uvv^FF^&w`^&)FFs^&G4sSFPF u8s,jFPhLFFs^&wvGPdFU^ &G :*t :*t Q^ &G^&^ &G^ &G&^ &G*^ &Gd^ &G^^ &G`^ &G4sS]^&G"&;Gw&4t^&Gte&w &wxj$^&Op^&wx&wp8^&tu+^&&G&OFN؎&WRR$ P$^&Gt j,^&G@^&G0rS-,^&G4U*2PFP t2>2 u ~r2 >2 s#^Sv^Sv ^SvP e>2 s2vN F2F^FFFFFFFFFFFF FFFFFFFPd]U(>2 sF uv vvP 'FڈFFF FFFFFFP ]U(>2 sFuvP FڈFFFFFP]U>2 sF uv v ^S$ 8>2 rv v ^S7l2FFv v ^S^S]UQQ>2 sF uv vv0 1>2 rv vv82FFv vvP]U^&&GFPtF uFF^&G&GSF u(vFPF uF;Ft ^&G]^&^&G :*t:*tSv^ S^S\\V^&G?^ &Z&W^&G?FFF9FvF^Sv^SF^&?t=ZuZ>F u^&.t&G9s!^&? u^&^G^ &Z&W^&G9FF^&HF~u^vPPF+PFPFFt͉F^& F;Fu ^&G9^v&x u^&F@N;sF+A^vp^~y^Y^&GE uE^&GGs7v &S^GHP^&7FPFFt @^&^ &G :*t:*t :*t:*u^ &G :*t-:*t':*t!:W*t:*t:*t:*t :*t~ wc^ .p+A\e}^ &G~^ &Gu^ &G :*u$&Gs&;Gqt'^ &su$^ &qu^ &G :*uFFv^ &@q3^ &Gv@^ &G :*tB^ &G8^ &G :*t,^ &G6v^ &G :*t^ &G.^^ &G :*u ]^ &G/C^ &G<^ &Gh&Oi$^ &Gq^ &Gs^ &Gl^ &GjFF^& F ^&G :)+udFv&^&_.2:I|^SF1^SF u^&ud&G܁~t^&G}^&G1VS&xWvF&pF uB^SF u^SF t ^&G~u^&GFFFP&O&xWF&wF uI^&G1&WR&@F&Z&W_^&@&G&G&GF~t_^ GSPF uP^ &G&GU&G&G[FF&G]Z&W_F&GaG3F&GcZ&WeGOPFYFF ^&G5&G9&G t&G5^&wFPF u}^&G9&G5G5;vu;FuF ^&GWF^&wFPF u6^G5N^;u;t!^GO;u;u ^&GWFFFUv&D ~&] ~&] Y]&FFF=F\FzFFFFFF2FQF 1F1FF1Vu FFmFm1FF1VF1F ;vNvB;FvNFF^&F 1^&W^&8Os&vF+B@^&GF1^&WF <1^&WF 1F1^&WF 1º PF1Y^&G^&^&G :*t?:*t9:*t3S^ Sv ^SM^SvdFF u6^&^&;F s"^ &F^&O :*uSPdøUj ]Uj ]Uj ]Uj ]Uj ]U] U]X[YZSP 3t !3tcRQRQS!3[YZ 3U+Zr tH]j&j^S/$ u ^& +ZrHU3 &L&;Wt]U#tH3&GtH]UFV>]UV>] vjFPjF uxFV^&&W~u~tYFuRFVFV)F^v^ SPvvFP#F u^ &?Gu&G &W^&&W ^Sv^ SjFPF u_^ &G &W ^&&W~u~t\FuUFVFV)F^vvvv^ SPFPF u^ &?Gu&G &W^&&WU u. t!;v 33@33.P 3 ҃+@sH]U؋]UN~F V u. t!;v 33@33.P 3 ҃+@sH]UN~F V ؋] 6r"^&&W&G&3&G;F s Wv &3X^F&F&GFFF;FsN ;Nv&3&@FFڋF;Fr ,&3v@^&Z&WS&3&_[&GU|s]&3&G@] ar &3&G;FsGv&3X^F&F&GFFF;Fs&3&@FFFU>$3u"3Pd u>$3t"3&G&3(3>(3u]ð]UQQ03Pt03D3>3P uJF603P u8F3=u0*3P u!F603P u23=t=!t3]^ &G :>+uSvv ^ &G :)tWSvvLn)^ &G ^ SvvLFNs=u8^ SFP~u#)^ &G ^ &dt@Fs)률)^ &G F,^ &G :+r^ &G :)tw&G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &O^ &O^ &O&W;Vu;Ns+^ &r &G&;Gwe^ &G &W"N~;u;wL&wщFVN;u;s&+O &"N։~؋F^ &G-sSTF u^ &G-sG<PFPF^ &G-FVFVF%Ff^ &G^ &G^ &GNV^ &O &W"^ SPFPFPTF u4F^ &G^ &G :)t :+t^ SjtF t^ &G&G &W"FV&9Wu&9Gw&G&W9Fu9Fu^ &G&WFV^ &G&9G*s&G*^ &FF^ &G@1&@FތFF^ FV&9W"u&9G v&G*H1Fܺ&G &W"N~;u;r_F&+O &"N։~؋F։F&O,r&9G*sSlLF tF^ &G^ &G*&;G(uF&G(F^ &G* ^ F&9G*s&G*^ F&9G(v&G(Fr^ Sj$F u^ SlLF uy^ &G ts&w8&SP^ &w"&w G<P^ &w: F t@^ &G-^ &G &W"&G4&W6^ &G&G.^ &F&G0Z&W2~Yt^ &G@1&W^ &w&@F&Z&W^ &GN^ &O^ &OF~+&G &"^ &G&G(^ &G&G*^ &G,^ &Yti&w8&Sh^ &w"&w FP#Fu^ &?^ &G,(~t^ &G&GF^ &G :l*t ^&FF^&G &W"&O*&;Wu&;GrI1&G^&G*1 uSj$F u`^&G@1&@FF^&G*1&G &W"FV&w8^SQRPFP#FtK uX^&G*1V+^0^~&}*9^Y^&G*H13^SjF u/v&|*&L+^9 ^&G*&G^&G,^ &G :>+uS^Sz O^ &G :)t S^S<6^ &du))^ &G ^ S^SF)^ &G FU^&G :+r^&G :)t:+u^&G&G &W"^&&Wc^&G :)uX&r&G&;Gv &G&W^&G&G &W"^&&W^&G s7&G s/^&/&_!^&G :l*u^&&G ]^&^ &&W^&G :)t ^STF uk^&G;s]@1V&G&G &"F~&w8&XSv^&pWPG<P^&w:F t@^&G-F^&GFrF@1V^&G&G &W"FV&G-sG<PFPF^&G-3^&w8v&XSv^&pvvFP#FNVF׉NV~u t%^&9Wu&9Or&O&WFF t ^&Gv^&@F&Z&W^&GFV^&G &W"^&G&W;Vu;FYvF&GF^&G8^&G^&G&W&+G &W"FVF&G^&uFFX3~6F =wmt =mmt=amu dF =rmt=tmuF smhFPjFt;v ^Sv^SvFPF t=c=u ~W=tX3~6FV^&G&WFF&Z&WF1&G&G;YsF^Sv^GPjFPF ui^&G(&W*&G&W~ tmu)&w&w^Sv^S^GP,F uA>+^&G &G SjjF u^&G &w&wFFU^&G(F&G F&1t SvL^&/ut~ u@&G:r8S PLF u^S PLF th^SvPdU^SvLF uD~ u ^&G:1^&G:'^&/u ~ uS P^SvLFF]UQQ^&OBN&GE1+ʉN&GE&OD;sF]UF^ &G(^ F&)G ]UQ^&/tS PLF u&^&/tS PLF u ^&GE]U ^&G(F&GEF&GBF uP&GEY1+ʉN&GE&OD;s S6dlFF;Fr\^&GE&:GDuS6dF uD^S PLF t!^SvFHPdF^&GEF^&GEFu]U^ &wĄ-FF^ &_ć.FF~ ~t u PF ^&NFFt(#^H^&Z&Wv#^&^&:F t v&Z&T] U^&G(F&G F&1t SvL^&GQrFF^SvFPHdFw^&:FuFFHN;s[^&F^&OE&:ODu< t< tS6dF u{^SvLF u~^&/u~ t^&/t ~ u&GEF< t< t < t^&GEFtk~ uS^&/t)S PLF u\^&GE^&/u^S PLF u^&/uz`^&GE&:GDuF< t< tS6dF uUF< t:^SPLF uFK.FK.;FsF~ t ~r^FH-J-~v@PFN ^㉇--C3H-J-9--5L-N-;--?s7P-R-=--FP^GP^&GPRPjhrmF t?^&Ow.b.F^&G..vb.QPv^ĿH-WhjjFP#F u3FFv^Ŀ-WPvvFP#F tv F) v F u ^&G}hjFP/$F^&G F A:r@ u ~rF^&G]Un^ SPv ^SF^&tF P^ Sv PNQNQNQNQNQNQNQNQNQNQPP\F u~u^SvКtF t]U PP?P/$F uA?&G @?~I@< t< tY^S^SvFPctF u^>@ u ^&r>@ u.^&s$S^Sv^Svv ^Sv\~ wmu~~s ~ mmuIF^&G?Z&WA^^&GZ&W^&G$^,^&GZ&WF-,`F =wmt=amuF^&GZ&WF^&G$>F =rmt=tmuTF^&G?Z&WA^^&GZ&WF-^&G"~u"^&GAH?FP?PuFP^v@PFF+PRPPrmPF~u>v^SPPPFP#F t v Fv F t( ^&?t' ^&G^&G^&G^&G^&G^&G^&G^&G;^&G ^&G=^&G ^&G.^&G ^&G/^&G^&GG^&G^&GHF =wmt=amu*~ mmu*F =rmt=tmu *^&G ^&G ^&G(^&G,^SCF u/?F^P^SP^S^SF t^&G F]^ &G :*t:*t :*t:*u^ Svv^ &G :*t-:*t':*t!:W*t:*t:*t:*t :*t~ wg^ Sj @ u^ &FFv &t^FF^.5\8X0YnFse;v[;u ^ &rJF^ &G^ &v&s5&On?&w+@ &Gn^ &Op៵&w6^ &On?&w+@ &Gn^ &Op៵&w &Gp^ &t38Fvr ^ &u~F^ &G^ &v&Go$&w &Go^ &s5&On?&w+@ &Gn^ &Op៵&w6^ &On?&w+@ &Gn^ &Op៵&w &Gp^ &wxj$^ &wx&wo$^ &wxj$^ &wx&wn$^ &wxj$^ &wx&wpd^ &tt^&7$F%F^ &s+&O F&uN^ &uN ^ &G F~Kw-F^ &GqF^ &Gs^ &wj%F uvF^ &Gv^ &w>&Go$&_v˷ ^ &Go^ &wxj$^ &wx&woA^ &tub^&7$F^ &vufN^&7v#^ &G :*tRF^ &G86^ &G :*t9F^ &G6^ &G :*t ~w8F^ &G.Z^ &G :*u K~wF^ &G/)~vF^ &G^ &G :*u&Gt tFF^ &G :*t&Gtt ^ &gn^ &On ^ &9we&wxP$^ &wxF$P$^ &wxj$^ &wx&wn$'Ft +t ^&G ^&w&w]^&GFFv&t(؊F&^&G$H&;G(v&G( ^&G(^&G ^&G5s&G5F^&G$H&;G w,&G=t ;Fu &G5,QjtFF^&u&_ @F^&u&_@ F^Svv^&XV^F&t4^&u ^&?u!v^&@F^&^&GFF, Fv^F&9@su7~u~t^&G &;G$s&G0r&G2r &G3r^v^&x6u FFKv^&@VFF u/~uv^&@J vF^&@Bv^&x6u ^&GTv^&@6 F^&GF^&v^&@B^&G^&GF^&GF^&G vF^&@FvF ^&@NZ&PP~uav^&pBFPP(F V ;Vu;Ft<svFPm4F^&GF^SvF F+ FF^ &dtZSFP^& uV^ &du&G-sG<P^S^&^ Shwmvv^& u)^ &G ^&^ &Gd<tN<uSht^& uH^ SFP^& u/^ Shrmvv^& u)^ &G ^&^&GFFF ;F r^& u&G,&;G(r &O$+ȉN ^&G FN F +;NsN^v&t,0^~ 9N^Y^F&^F&)G ^F&G,^&G,&;G$u&G,^& tFF Q^& u) ^&_ğ0^F&GF^&GF^&GF^&F^&GF^&GF^&GF^&GFFHN;tFH;uF;Fu* FNF;rE;Fu^S^SQF@^S^SvvFPF u.^S^Sv ^S^SvFHPFPFNFȋV;r +V+FFFFF^&GF^&GU]. @] ^&^SP$F t^&G t~&w8&SP^&w"&w G<P^&w: F t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2~Yt^&GFu^&G@1V&G&G &W"F^&Gv^&@F&Z&Wv^&@&G^&G*^&G(^&G^&G, ^&G :)t :+t F^&G-rG<PFPF^&G-^&G0FF^F&G4&W6Ft.H^&O.+N^v0^9^Y^&O.N^F&)G.^v^&G0Z&W2F^&.uF tuSvF tF^&G0FF^&w8^S^&w.&w6&w4FP$FFt.H^&O.+N^v0^9^Y^&O.N^F&G4&W6^F&)G.^v^&G0Z&W2F t ^&.u%FsFr^ShF u^&G :)t :+t ^&G&WFV&O&O &"N~;u;wN~Fs FF%@ uG^&w8>@ u4^&G&G^&G-^St>@^_]U~F =amt =wmtO F^PFPLF u1~Ps &F^&GS+^&G F^&Z&W]U ^&^&G :S+t ^&FF^&GF u^&O;wINF FF)F v ~^Y~ Nu+JVFt)N+^p^9^YN^&^v&FPFPLFv u^F&L]U^ S^S]FFFFFPtFFFFPFFFF^FFPFuFF u)vFPFF^&F^ & vFP,F uqv~N^Y~u ЉFVsjjj ^SvN\F,jjFP/$F uF^&G Z&W F&GF^SvFv ^ &G :*t:*t:*t :*t~ ww^ SjF uj^ S?PF t^.d.MrFs[waF?^ &GZ~wLF?^ &GE~Kw6FF;s؋;FsFF@?F uwqF?^ &G :*tQF^ &G=[^ &G :*t8F^ &G;B^ &G :*t~w5F^ &G.q^ &G :*u ~wيF^ &G/ك~wnFtu??F^ &G]Ft+uSvv'  0^ &G :>+t k^ &G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &G^ &G^ &O&W;Vu;Ns^ &Gs &G&;GwH^ &G&WN~;u;w/&wщFVN;u;s&+O&N։~؋FgFVFVF%Ff^ &G^ &GNV^ &O&W^ &G^ SPFPFP4F u F^ &G^ &G :>+u S^S  U^&G :>+uY&Gs&G&;Gv &G&W^&G&G&W^&&W^&G s7&G s/^&/&_!^&G :l*u^&&G ]UFF F uvvvjjFPj j{j}j4F#tF#t)Fv^@‰FV~u~~u v&<[uovvvvv v vj j[j]j4F#to~tEv&<u<^&?[t3vvvvv v vj jj^j4F#t ,v&v&<uvvvj vv V4F~uFFU3~ u~u`~uZV u 3NFrD@3n u9^N V u^uK;ruA;w ^tr]^SvFPFPj{j}TF uF;F vdP~ vE>~^vNFY^vx?F^&F F t~u5^&~u^S^Sv^ Sv$FFUFF F uZvvvjjFPj j{j}j4F#t1F#t)Fv^@‰FVvvvjjFPj j[j]j4F#tF#t)Fv^@‰FV~u~u v&<j4F~uv&<tF~to~tEv&<u<^&?TF u5FPF PFPjXTF uF;F vdS~ vHp~^vNFY^vxqFF^&F F t~u5^&~u^S^Sv^ Sv|FFUFF F u4vvvjjFPj j{j}j4F#t F#t)Fv^@‰FVvvvjjFPj j[j]j4F#tF#t)Fv^@‰FV~t~u v&<j4F#ukF#t)Fv^@‰FVvvvvv v vj2jj^j4F#u$v&<uvvvj2vv V4F~uFF F FuFFPFPFPjj^XTF uF F;FvdbF F2vRF t$N t~^Y^vFFv~N ^YFFF ^&F Ft~uF F t~u=^&~u'^S^Sv^Sv^ SvFFUFF F uRvvvjjFPj j{j}j4F#t)F#t)Fv^@‰FVvvvjjFPj j[j]j4F#tF#t)Fv^@‰FVvvvjjFPj jj4F#tF#t)Fv^@‰FVvvvjjFPj2jj^j4F#uWF;Fs v&8^uFF#t)FF~tv~vvvj vv v v4F~uFF^&&WF F u<@rjj@P/$@@@ u @ @u{@F F^ &?TNt4bF FF&GF^ &O~F u+JVu4*^ &GFv^&FF^&Z&W ^SPvFPF uJ~u ^Sv^SvRPjFPFPjF~t ~s ~ur^&GM&_O^&GL&^v@^&GMZ&WOF@N+^&OL^S^Sv^Svv ^Sv F uF^ &^SPvFPF uFt^ &FFF~NuV~u ^&P ~u^&7@P^ S~u8^&w&7@P^ S@F^~Hu2Ft tuS^Sv@P^ S@F^~Du_~uFPF~u^&&WFV, PRPvvv@Pj ^ SF@F^^S^ &7^Svv^SFU츾@PjJAt'~tv &*PA v &*LA&4v &^&~tv &"AFPs Frb"ArkF sFF :FF>F A AujjAP/$F umA&G ^ &:GwW^ &GAX ^F&G;FsF^ &GPj^&GȴP^SvF twEF^&~u8F>/^ &OQP^&OɵQPvFF tmn~uF~ t~uF r~t4FRPPNQNQPF uFPFPoF uP뻋F U^ Sh^Sm]U^ Sj^Sm] ^ &G :*t :}+t bF FuTFP^ &O }+:ʱtA sUFs&8W uH^&^&G^&GP^&G^&G^&G^&G^&GA^&G2 A AujjAP/$F uA&G ^ &:Gw^ &GA@ FF^ &G^&^&G^&G^&G^&G^&G^&G^&G^&G^&8G uA^&O^&8G u@^&G^ &GA^&G^ &G^&GUFV;6Au;4At^SLHistogramMsg.bin`$[sys]HistForm.form$HistForm$LInsufficient width for fieldMBogus numeric value: NBogus segment value O ignored.P#Symbol file name too long, ignored.Q"Bogus symbol file offset, ignored.R#Output file name too long, ignored.SWHistoGram requires a protected mode operating system (e.g. BTOS II, CTOSII or greater).T[HistoGram requires a protected mode operating system, so it can only be run on a 386 board.U-Can't run: clock interrupt isn't a task gate.V"Can't run: Interrupt tss not foundWHistogrammer - X3WARNING: too many samples selected - some are lost.Y Sorting ... Zdone.[Appending to file \Writing to file ] error code ^Tasks selected - _all`h aTotal number of samples - bZInvalid timer interval. Must be in the range 10 - 1000 milliseconds and a multiple of 10.c,Press NEXT PAGE, SCROLL UP, CANCEL or FINISHdNumber of samples selected - eIn Idle Process f,g3WARNING: ignoring superfluous symbol file name(s). h:"Segment only?" parameter is not a valid yes/no response. i2WARNING: ignoring superfluous print file name(s). j4"Append?" parameter is not a valid yes/no response. O Show Show Show Show Change OAll TSSSel TSSAll SymSel Sym OptionsNTime Running: %0S sec ACTION-SPACE start histogramNTime Running: %0S sec ACTION-BKSPC stop histogramM%0S% inside, %1S% outside selected TSS's FINISH exit histogramNTSS CS:IP count % Symbol Histogrammer: %00123456789ABCEFDATAABCDEFGHIJKLMNOPQRSTUVWXYZ $abcdefghijklmnopqrstuvwxyz $Yes $No $Binary  CharacterdFlagBDeviceNameDe;9         ~[KBD][VID]89>< DVTWPYX[]}[!Scr]]$$.Tmp}[!Scr][!Scr]N$[PTR][scr]<$>BsFilter.tmpVNVF2Knn,X` %K& $ % * - II021B02 II120A00SYSSYS8251Config.sysCommPtr&&II120A00p{}MASTERSERVERLOCAL{}[]0123456789ABCDEF[]{}[]<>^<>[sys]LptConfig.Sys&Error 2624: msg= %0N maxlen= %1N^YesNo`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijklmnopqrstuvwxyPress NEXT PAGE or SCROLL UP to continue$(Press NEXT PAGE to continue$!a?!*a**2Q=\zCKACTION BACK SPACEBOUNDCANCELCODECOPYDELETEFINISHGOHELPLOCKMARKMOVENEXT NEXT PAGE OVER TYPE PREV PAGERETURN SCROLL DOWN SCROLL UPSHIFTTAB#+17?GKQW]citTD aAdDhHmMnNoOsStTwWyYgG!oo!/!0d!/!0y! !hh!:!0m!!2AA!!*o!/!0d!/!0y! !*h!:!0m!!2*A!"!Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!"!Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!(!Www! !Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!(!Www! !Nnn! !*d!, !yyyy! !*h!:!0m! !2*A! !0t!:!0m! !*t!:!0m!!hh!:!0m! !2AA!!*h!:!0m! !2*A!!0o!/!0d!/!0y!!*o!/!*d!/!0y!!0h!:!0m!:!0s!!0t!:!0m!:!0s!.tmp!W*w! !N*n! !*d!, !*y!!N*n! !*d!, !*y!"!0o!/!0d!/!0y!-!0h!:!0m!:!0s!!2*A!!Nnn! !*d!, !yyyy!Invalid Template Index$Cb %6FVfzTN00sundaymondaytuesday wednesdaythursdayfridaysaturdayjanuaryfebruarymarchaprilmayjunejulyaugust septemberoctobernovemberdecemberampmnoonmidnight05 invalid namesunmontuewedthufrisatjanfebmaraprmayjunjulaugsepoctnovdecampmnm05 %0:BLU_fmrx~ #(-27;?BEI{R12.3.1XCEFXCEFAFAFX+$ . :$ $X53ƀSelected TSS's%3ƀProcedure Names$333333333ƀ Symbol fileOffset 33ƀ Output file Append (y/n)3  Report by proc only (y/n)  3ƀ2 SHIFT-DELETE removes all TSS's or Procedure Namesƀ, Press GO to accept changes, or CANCEL3NWENWE NWENWENWENWE%NWE+NWE3NWg3N Wg3N Wg3N Wg 3N Wg 3N Wg 3NWg 3NWg&NWg3NWE+NWg3NWE(NWEHistn[Kbd]L[Vid] [Lpt][Ptr].\[Nul]T[Comm]\[8251]t[Debug][SysIn][SysOut]>!l#<>%)*D]7\u8l3|; e"C$ &P+,|-t . /01|2L{|4|P 5 6\TdttddttdTttdaLd]dyddd$]dyddd.\Bd\dB.\d~VTZT]dydd\\d~V d~V \\~Vd[d[[d[ dtOdDDd 4d]dddy]dydd d]dydd d{ydd2LL;l 4<   ,,z,z, Error opening translation file: ![Sys]PtrAConfig.sys @?><3$>V3$[sys]CommXconfig.sys ? @? @   0123456789ABCDEF      LIBRARY: forms.lib VERSION: s9.1.2 (Freitag Februar 2, 1990, 16:44) LIBRARY: ctos.lib VERSION: R12.3.1 (friday november 12, 1993, 15:10) LIBRARY: ctostoolkit.lib VERSION: R12.3.0 (friday october 15, 1993, 17:26) LIBRARY: enls.lib VERSION: R12.3.0 (friday october 15, 1993, 17:28) LIBRARY: statistics.lib VERSION: R12.3.1 (friday november 12, 1993, 16:34) COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. VERSION: R12.3.1 (friday november 12, 1993, 16:33)`F uFڜ \#'9 3s ;w@B1 uá;vPjF tà88^8Ph6FHؠ8^Ƈ8 F;sA+1FC8˾8NOF@;FvFF8N8PFF@PWFT (049L OZ ]gpsVă ćĎėĥįĴц Ԏߎqs, F2816 mJ%O8ONN$MrNL M)N>O RP#[Q"~R#SWT[U-uV"WX3Y Z[\)] 9^D_U`XaZbtc,def,g3h:;i2uj4 Show Show Show Show Change All TSSSel TSSAll SymSel Sym OptionsTime Running: %0S sec ACTION-SPACE start histogramTime Running: %0S sec ACTION-BKSPC stop histogram%0S% inside, %1S% outside selected TSS's FINISH exit histogramTSS CS:IP count % Symbol Histogrammer: %0Insufficient width for fieldBogus numeric value: Bogus segment value ignored.Symbol file name too long, ignored.Bogus symbol file offset, ignored.Output file name too long, ignored.HistoGram requires a protected mode operating system (e.g. BTOS II, CTOSII or greater).HistoGram requires a protected mode operating system, so it can only be run on a 386 board.Can't run: clock interrupt isn't a task gate.Can't run: Interrupt tss not foundHistogrammer - WARNING: too many samples selected - some are lost.Sorting ... done.Appending to file Writing to file error code Tasks selected - allh Total number of samples - Unused messagePress NEXT PAGE, SCROLL UP, CANCEL or FINISHNumber of samples selected - In Idle Process WARNING: ignoring superfluous symbol file name(s). "Segment only?" parameter is not a valid yes/no response. WARNING: ignoring superfluous print file name(s). "Append?" parameter is not a valid yes/no response. 2 dump_procPLM86 V2.308/27/93 16:10:1Ӗ4STACKMEMORYCODEDATACONSTDUMP_PROC_CODEDGROUPh@1HtH,ݘTD KDUMPFDUMPXSDUMPɌ0 STACKMARK PRE_PRINT0 PRE_PRINT1 PRE_PRINT2l D II010B01 %04X K  %02bX # ! ݠ *Ϡ!. #%c& (*\n: ,%04X ' 2 %02bX9 ; = A *E.G%cJ L*\n P%04X  V %02bX] ۠_ ٠a e *i.k%cdn ʠp*\n\U~uHN;w5+ȉ;v&P6;r5&P^6&0>u &Puƒ>s-w%u &P&PӉ&P;r>^6&< r<~v &!P&#P^6&0u>s>w&&P&(P]#-14:>ADHMQWZcjnux~ĂĆČĒĠģĩĭİĶĺÍɆ̎ώӎ؎܎  '.17;ADJN}XU~uzN;wg+ȉ;v&^ S,P6;r?&^ S2P^6&0>u&^ S9Pu>s7w/u&^ S;P&^ S=Pɉ&^ SAP;rH^6&< r<~v&^ SEP&^ SGP^6&0u>s>w&^ SJP&^ SLP] u#-19?CFIMRV\dmtxćčđĕěġįķĽɍφӎن"*3:>BHOV^dhnv|ŀ*U~u^ &N;w|+ȉ;v& PPP6^ S PM;rG& PVP^6&0^ S P>u ^ S]Pu>s-w%u ^ S_P^ SaP^ SeP;rO^6&< r<~v ^ Si$& PkP^6&0^ S PVu>s>w^ SnP1& PpP^ S P w] r*48;@FJRZ]afjpsxāĈĐęĤĭıķĽύ܍#),1:AIRV\cnw}ŀŅŋœŜTWU^6&8t ^6 &t^>& ^6&]L'5<@ItprintfPLM86 V2.308/27/93 16:10:1Ӗ0STACKMEMORYCODEDATACONST PRNTF_CODEDGROUP2h@ HHHaTD K STACKMARK- PRE_PRINT0 PRE_PRINT1 PRE_PRINT2,PRINT0YPRINT1PRINT2rPUTCHAR? BSVID WRITEBYTE LQ_DWORD_DIV LQ_DWORD_MUL D  II010D02}Y\8x\8rۜ\8V0123456789abcdeff0123456789ABCDEFA)v PRINTF: parameter TYPE/COUNT error X%U~t~t6T? N]\<!U ";v >u+Q6"/ ]6"& +"P]A&,0TYU& ă@i&&Z&W))&&&]ʜJ #'/36:=@DHPXgkov}U+&& +ă@&&Z&W))&&&]ˡU!'+159<@CHLOS[_go~ĂĆčĔprU+&@ & +ă3&&Z&W))&&&]ʜX"',26<@DGKNSWZ^fmuĄĈČēĚmU 6&Au<%tJF6&AT V8:  "<-u F6A<+uU@ &AA< u">uU@ &A>A*u'.&% @ &AU08Au>uT@ &AA0:r<9w A*Ѷ£ ɸ9 v >A.u<@ &A<*u'.&%"@ &ACA0:r.<9w*" A*Ѷ£"@ &Aɸ9"v"ABKOSW[_cgkosw{ăċđĖĞĢĥĩĭĵĸǎˎΎҎ֎ގ !%)14AJS\aekos{ŃňőŔŘŜŤũŶſȎˎώӎێtAAgAAPPAAXu f8:.rrrs.r rS&&W02s*$=*$2460ף4602$ ~f0>24>6*.8&SCÈSQ"&.1=COUagsyąĊĐĜġħĴķĻ͎Ҏَ%)0;@JNQY_gmrx|ŋŕřŜŠţūůųŷŻюՎގpsu ƇC:S$.*듸CS"T r*&02&(s&02&(s&&W02&(&( tV&(#0#2 t10P? &(أ&(*1 u( &t P? *럠rr r(&02s &&WDs &/s2>u+&?} U-& yغ02S02PR460>2+*SȢS8&؈C_X00  #'*/3:EKTX\bgvz~ĄĉđěğģĩĮIJĹĽŎ\؎܎\ (158HPZbisx}ŌŐŔŘŜŠͦVŬʹVŹŽŎ͎ЎՎَ*f>2 u*S"*ss"UC*S<s؊C*CS߸Cs &7? s%&T >"uP%"t>A\ud@ &AAt@sP? ;t!**vAt P? *]ç "*-158DHLPUX\bjp\u}ăćċĐěĤĪĮIJĺɎ؎ \\%/\4;AGKNV\\}7? U@sF6 & Sv<]e (V-.r USS;Fs&0? S]) \"' U>^6>&8t>>] NJt printf_vid0PLM86 V2.308/27/93 16:10:2Җ5STACKMEMORYCODEDATACONSTPRNTF_VID0_CODEDGROUPh@ RHHaTD K STACKMARK- PRE_PRINT0 PRE_PRINT1 PRE_PRINT2,PRINT0YPRINT1PRINT2hPUTCHAR5  OUTPUTTOVID0 LQ_DWORD_DIV LQ_DWORD_MUL D  II010D02}Y\8\8h\8V0123456789abcdeff0123456789ABCDEFA)v PRINTF: parameter TYPE/COUNT error X%U~t~t6T5 N]\<!U ";v >u+Q6"% ]6" +"P]U&,0T{YU& ă@i&&Z&W))&&&]@ #'/36:>FN]aelsU+&& +ă@&&Z&W))&&&]˫U!'+159<@CHLOS[_go~ĂĆčĔphU+&@ & +ă3&&Z&W))&&&]ԜX"',26<@DGKNSWZ^fmuĄĈČēĚmU 6&Au<%tJF6&AT V8:  "<-u F6A<+uU@ &AA< u">uU@ &A>A*u'.&% @ &AU08Au>uT@ &AA0:r<9w A*Ѷ£ ɸ9 v >A.u<@ &A<*u'.&%"@ &ACA0:r.<9w*" A*Ѷ£"@ &Aɸ9"v"ABKOSW[_cgkosw{ăċđĖĞĢĥĩĭĵĸǎˎΎҎ֎ގ !%)14AJS\aekos{ŃňőŔŘŜŤũŶſȎˎώӎێtAAgAAPPAAXu f8:.rrrs.r rS&&W02s*$=*$2460ף4602$ ~f0>24>6*.8&SCÈS\"&.1=COUagsyąĊĐĜġħĴķĻ͎Ҏَ%)0;@JNQY_gmrx|ŋŕřŜŠţūůųŷŻюՎގpsu ƇC:S$.*듸CS"T r*&02&(s&02&(s&&W02&(&( tV&(#0#2 t10P5 &(أ&(*1 u( &t P5 *럠rr r(&02s &&WDs &/s2>u+&?} U-& yغ02S02PR460>2+*SȢS8&؈C_X0C  #'*/3:EKTX\bgvz~ĄĉđěğģĩĮIJĹĽŎ\؎܎\ (158HPZbisx}ŌŐŔŘŜŠͦVŬʹVŹŽŎ͎ЎՎَ,f>2 u*S"*ss"UC*S<s؊C*CS߸Cs &75 s%&T >"uP%"t>A\ud@ &AAt@sP5 ;t!**vAt P5 *]Ϝ "*-158DHLPUX\bjp\u}ăćċĐěĤĪĮIJĺɎ؎ \\%/\4;AGKNV\\}75 U@sF6 & FPP<]ۜ(V-.h USS;Fs&05 S]= \"' U>^6>&8t>>]* NJt printf_vid0!$+DUMPFDUMPSDUMPprintf! dump_proc! COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: printf.lib VERSION: R12.3.1 (friday november 12, 1993, 16:23) mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm CrashDump.sysFileheaders.sysMfd.sys SysImage.sysBootRecord.sysLog.sys BadBlk.sys0Development Utilities Diskette 2 of 3 (B25U22-2)}@ B25U22-2/3@ wwB @ D Z'3> ~89|P^Sys8 CTOS 9| Fileheaders.sysSys: w w wD wBootRecord.sysSys< w w w,}Mfd.sysSys: w w wB %yLog.sysSys< w w w@  SysImage.sysSys: w w ww_ BadBlk.sysSys< w w w9 CrashDump.sysSys8 w w w@ [S0Development Utilities Diskette 2 of 3 (B25U22-2)cinchSys< www requesttemplate.txtcinchCTOS  wvOvh Nls.asmcinchCTOS  wYvOvV CTOSLibImp.libcinchCTOS  )wKvRv_&`It Nls.mdfcinchCTOS  -wRsOv NPB OSSub.mdfcinchCTOS  /w@sOv RqLabl.mdfcinchCTOS 2w4sOv% SamGen.mdfcinchCTOS 5w)uOvPRUserRqLabel.asmcinchCTOS 9wsOvy2 UserSysCommonLabel.asmcinchCTOS ;wYvOvb&R(~ Async.libcinchCTOS >w(sOvGmWrap.runcinchCTOS cwdv>v  $$ ModuleDefinition.runcinchCTOS  w ?vRv] Yv!ModuleDefinitionMsg.bincinchCTOS! wl%t?vY, k" mc0_DLL.asmcinchCTOS" wRZv Pvr6t# mc0_DLL.objcinchCTOS# w?wuPvP$ mc0_PM.asmcinchCTOS$ wQZvPvT{% mc0_PM.objcinchCTOS% w>wuPvHlM& SystemImp.libcinchCTOS& wvPv]p^T'(S()R)*Q*+P+, O,- N-. M./ L/0 K01J12I23H34G45F56E67D78C89B9:@:;?;<><===><>?;?@:@A9AB8BC7CD6DE5EF4FG3GH2HI1IJ0JK/KL.LM-MN,NO+OP*PQ)QR(RS'ST&TU%UV$VW#WX"XY{YNls.asm CTOSLibImp.lib UserRqLabel.asm Mouse.libHistogramMsg.bin mc0_DLL.obj# SystemImp.lib&requesttemplate.txt Nls.mdf SamGen.mdfUserSysCommonLabel.asm Async.libPublicSymbolUtility.runResourceLibrarianMsg.binWrap.run Histogram.runModuleDefinition.run mc0_DLL.asm" mc0_PM.obj% OSSub.mdf RqLabl.mdf PsUser.lib SamGenAll.asmPublicSymbolUtilityMsg.binResourceLibrarian.runResourcelibConfig.sys Printf.lib SortMerge.libModuleDefinitionMsg.bin! mc0_PM.asm$ keycollationCTAsm x12.3.0/FTB-Io ??SEG??SEGConstConstDGrouphh\  rgbCharXlat cbCharXlat   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~t sortmergetextCTAsm x12.3.0/FTB-Io ??SEG??SEGConstConstDGrouphhV\rgbRs1FileSpecrgbRs2FileSpec cbFileError6 cbRs2FileSpeccbSysSysT cbRs1FileSpec cbMsgFileH rgbFileError rgbSysSysJ rgbMsgFile8MZ[scr]<$>rgLfa1[scr]<$>rgLfa2Error %0N on file %1S.SortMergeMsg.Bin[Sys] tsrtallCTAsm x12.3.0/FTB-Io??SEG??SEGsrtallCODE֘h`Y! StackAlloc StackDeAlloc0A4U^+F@%++Ћ^)F]-0UN^++F]KtsrtcmpCTAsm x12.3.0/FTB-Io*??SEG??SEGdatadatasrtcmpcodedgroupkhh@XZFGTPROCCC fKeyUneventype3fExternalStableSorttype1 vpKeyBlocktype2y AGFq\U&Ƞ"t"tAF Ft r]>HRVtsrtutlCTAsm x12.3.0/FTB-Io??SEG??SEGsrtutlcode:h@B^FGTQFEQQ FLTQ7QQADDPQQSUBeQADDWORDzQSUBWORDQDIVWORD QMULTWORDA$U]E ;EwrE;Ew2 U]E ;EuE;Euݠ7U]E ;Ewr֋E;ErƠPU]]]EE eU]]+]E EˠzU]]]E5U]]+]EU]E3uEuPU]EeȋEeю‹1tkeysPLM86 V2.309/30/93 12:44:2Ԗ/STACKMEMORYCODEDATACONST KEYS_CODEDGROUPh@ HHTBD K# BVALIDATEVER FNLSCOLLDONE2 FLIPBYTES FLIPSHORT"FLIPLONG[ FLIPARBITRARY NORMALIZEKEY CHECKKEYSPEC' TRANSLREALKEYTRANSIEEELREALKEY TRANSSREALKEY|TRANSIEEESREALKEY,TRANSIEEEEXTENDEDKEYTRANSSTRINGKEY TRANSBCDKEYTRANSINTEGERKEY; TRANSBINARYKEY TRANSDISPLAYKEY ( GETPNLSTABLE RGBCHARXLAT CBCHARXLAT D XW&^&F&G&F^&G="^S^GP^&F&G&F^&GJ \\S[^S"^GP"^&&WFV&G&W&&WFV^&G&W˜ \\OFFu,6vF+^&NH&&vNF^&NNF+;r2^&GF&G v wn~ r `~ u^&G;FtQ I~uF^Sv FP'F u+F^~ uFF^FN^.M*Mm^Svv v ^&wvv&w ~^Svv v ^Sj^Svv v ^Shvvd^Svv ^&wvv&wg^Svv ^&wvv&w|g^Svv v ^Svv^Svv v ^&wvv&w; ^Svv ^&wvv&wg^Svv ^&wvv&w,D^Svv CU\Ę\Ě\Ĝ\Ğ\Ġ\Ģ\Ĥ\Ħ\Ĩ\Ī\Ĭ\Į\İ\\ \/\R\r\͘\ͻ\\gG^&wvv&w!^Svv v ^Shvv FF\5\Ơ'^ &GF&G v wn^ &G^~ r u^.j^ &sIB^ &Gr6 w1^/^ &^ &^ & t ^ &u ^s Fs(A\C\E\G\I\K\M\O\Q\S\U\W\Y\ ~t ~t ^~u ^SvF sFF^&GF%FNNVVVV N tVF3F^ GF^&3^ F^&3G^ GF^&3G^ G~u ^Sv1\\ ~t ~t ^~u ^SvF sFF^&GF#F N tVF3F^ GF^&3^ F^&3G^ GF^&3G^ G~u ^SvM1\̭\/| ~t ~t ^~u ^S[F sFF^&GF%FNNVVVV N tVF3F^ GF^&3^ ~u ^S[͜.\̥\:, ~t ~~t s^~u ^S"F sFF^&GF#F N tVF3F^ GF^&3^ ~u ^S"-\̆\Z ~t ~ t ^ ~u ^SvF sFF^&GF#F N tVF3F^ GF^&3^ F^&3G^ GF^&3G^ GF^&3G^ G~u ^Sv1\̽\t~uF^ &G;Fu(~u^ &G;FrF~u^ &G;Fs $F^ &GsFF^ &G+FF&Gs FsF^FNFFFFF t)HF^&FN rF2F^vFЊF rrERPj FPF u&F t&?TCuwF^v0NתFFFF~tN^vF0FF^׎V 0mJ ~t ^ &G;Fu~u FNANsNs F^F^ &GsFFvN^&F$FNN&s,&Sv&SsFFFuv&Sv&0vPv&PPP2.s .3%V32=AEJO/ZV&kpĊ0̲V ̸\V\ن-2V \&.A*M.^1n1vV'Œ-Š2ͩVͯ\ŵ/V\͎V\ގ\PP] V V V W~tEv6..s PF1s 62*Fv&V \#(V08;\@VKV Ϡi* FsPF uEjjFPF u0FP^SvRPjhmmF u vFS V&VKVZV\_6 6 F66F66FPF6666Ff6 V"V#&*-V$5:V CGKORV! ?\4p XA sortutilityPLM86 V2.309/30/93 12:45:0U6STACKMEMORYCODEDATACONSTSORTUTILITY_CODEDGROUP4h@.HHTD KRSWABSWALOGFLOGFILE FSUPPRESSCONFIRMATION TIME0TIME1VINMERGEVINSORTQCSEQUENCEBREAKSFCREATEDOUTFILE FUSINGOUTFILE QCRECORDSQCBYTES7MAINTESTERC DELETEOUTFILE DISPLAYSTATSBSVID ALLOCMEMORYSL CLOSEALLFILESCLOSEBYTESTREAM CLOSEFILE CLOSERSFILE CSUBPARAMS DELETEFILE ERROREXITEXIT GETDATETIMEGETMSGGETRSLFAOPENBYTESTREAMOPENFILE OPENRSFILEPRINTMSG READRSRECORDRGPARAMSCANTOGOODRSRECORD SORTINSTARTSORTIN SORTINDONE SORTOUTSTARTSORTOUT SORTOUTDONE SORTERRORDOSORTPREPAREKEYSORT RETURNRECORD CONCLUDESORT TERMINATESORT FGETFLAGPARAM LOGMESSAGE WRITEERROR COMPUTETIMECOMPUTEMERGEPASSESCOMPUTENUMBYTESCOMPUTENUMRECORDS PARSEKEYFIELDINITINPUTFILES OPENMSGFILE TEST2ERCS PRECORDBUFFER SRECORDBUFFER CINPUTFILES SRECORDMAXPRECORD CMERGEPASSESSBVERRUN De%18 > PPF^㋇ tbP uS^㍇F^FhFPj7PhFPP7PvȚPh FjjFPF ughFPPP^SvRPjhwm^ShF t"hFPjPPv F^FhFPj7PhFPP7PvȚPPjjFPPFP^SvRPjhamF=u~u vʚFP^SvRPjhamS6F t? V*"V (\8@VOuV {\̉V"̏\̗\̪V̾V\ɎVV \\2&2FV L\ZV"`\eV)k\yV\͝Vū͸Vچ,-VhFPj7PhFPP7PvȚPvPPFPPjjjFPF uFv4)hRPjPj[FPPFȢ\jPFPF uFivj4)hRPjjPj[FPPFȢij @P^SRPFPFF^㋇ t[PvK^㍇F^FhFPj7PhFPP7PvȚPF똃~t FPV \-V"3\;\@EVK\UV([\bV!gsVĂĈĦ̲V ̸\ŎVV \#)V!.28>FIL/ORhV{̓Vœ͹V Ϳ\V"\V+ɠPFHN;sjQFPPP^SvRPjhrmS6PPFPPPS6FPFuF~uP66FPFPFFrSFΉF^FF؉FŒ^FhFPj 7PhFPP7PvȚPFԉF^F~uh~uhhFPj7PhFPP7PvȚPvvvvԠ PF th ~uF~uF̺SPvΚF uFΉF^FV\.'V-\2L,R-UV[\`jV p\u{0ā/̉VĦĬİ̽VV \V"\\V b\pV"v\Ň͍V͜\ŽƎʆ0VF܉FŒ^FhFPj 7PhFPP7PvȚPF̉F^FhFPj7PhFPP7PvȚPPRPP PF tjPPFtOPFPF t FPPjjFPPP^SvRPjhwmS6PFPSFPF=L t(~t FPSvjP뻚PPPFPF t FP sPP'V -\;V"A\lV r\̀V"̆\ĕ̛V̩\įĴĻV\V\VV+V\ V\2,8-;VA\GQ0[VsV+y0̓V͉\͐V͖\ś͠Vͦ\Ŭ͵VV+\Ў׎VV V sd~tRv6 FPF s PFs 6Fv*V#V $\)05V=EH\MVXV i FsPF uEjjFPF u0FP^SvRPjhmmF u vF V&VKVZV^[66F66F6FPF6666F4 V'V&&1)V%16V ?CGKNV$ ?\4p XAيsrtconPLM86 V2.309/30/93 12:45:2Ӗ1STACKMEMORYCODEDATACONST SRTCON_CODEDGROUPh@IŘHHTD K$FKEYSORTACTIVE FSORTACTIVEH CONCLUDESORT TERMINATESORTiFDISTRIXDELETEFILESANDMEMORY>CHECK CLOSEFILE DEALLOCEXCH DELETEFILEILIBTYPEUNGRABMEMORYSLCLOSERS FHWORKFILE1 FHWORKFILE2 VFCREATEDWF1 VFCREATEDWF2 VRUNSACTIVENWAYS RGRESPEXCHOUT PRGRESPEXCHINVFCONVERTEDWF1 VFFHWF1GOOD VFFHWF2GOODVFDOSORTCALLED BSWAWORKFILE1 DTSmr ^&O>tO ^&^&G6^&F t ^&N F^&G^& 8\PSSir ^& 0^&F t ^&N F^&G^& \69Ut@]#V4 F tˠs>rsrrw8 s%6ss 6FF tˠss%6ss 6FF tFr F˃~u6FPF6F t˃~u6FPF6F tFH;Fr@~uv&0FPFߋv&0F tFuFhV !(/6:>FNQVX_gjV{ ĂĊ ̍VĔěģ ̦VļVԆVVVV( ?JVZ`VsV0tsrtdstPLM86 V2.309/30/93 12:45:4і1STACKMEMORYCODEDATACONST SRTDST_CODEDGROUP֖h@EHH[TPD K CMERGEPASSESVIRUNINVIRUNOUT VFHFILEIN VFHFILEOUT VEOFFILEOUT VIBSWAIN VRUNSACTIVENWAYS PRGPRECBUFPRGPMERGEBUFIN PRGFRUNACTIVE PRGPCURRECORD PRGFOVERFLOWED$PRGOVERFLOWEDOFFSET(PRGBBUFFEREMPTY,PRGFFIRSTBUFFER0 PRGRESPEXCHIN4 PRGNEXTLFA8PRGPPRQ<PRGWIRUN@ PRGENDRUND RGRESPEXCHOUTHRGPMERGEBUFOUTLSBUFINTSBUFOUTV?DOSORTDOMERGEk STARTREAD) FSMALLERRECORD PSUBy ALLOCEXCHCHECKREADASYNCCHECKWRITEASYNCCLOSEBYTESTREAMOPENFILEREAD READASYNC RESETMEMORYQUERYMEMORYINFOSDIVIDEDMEMORY USEMEMORYUSEWALIGNMEMORYOUTPUTLASTRECORD SETRSLFASMREADLFAWRITELFA OUTPUTRUN OUTPUTRECORDOFGTPROC QUICKSORTVNUMRECSVPCURPTRVPPREPARESORTBLOCK VPKEYBLOCKVPSORTCONDITIONBLOCKVIRUN FKEYUNEVENFEXTERNALSTABLESORT BSWAWORKFILE1 FHWORKFILE1 FHWORKFILE2 VEOFWORKFILE1 VEOFWORKFILE2 FSORTACTIVE VFFHWF1GOODVFCONVERTEDWF1WGVFDOSORTCALLED IBUFFERINUSERGBBUFFERWRITING VLFACUROUTRGPRQOUT DWFظ&&Gr * tSPF uu#>uQ &&GS PF u}PGP&PG]P&G\PhmmF uA&FsFsFF uFPRPF t@FV9Vu9Fs6jPFPj PF6j$PFPj(PFPj,PF6j0PFPjPFPj4PFPj8PFP% #*"7?EVJVY`%ho{̀Vĉ$đėĠį̼Vņ#Ά׆VV 27TuR &&GTVFHN;r!6T㜠 V  %V 5IPVafVrwV̏V ğıώَV  V  %V 1JQV ^inV vV ŅōőřũŰŵŹÆʆԎ׎ގjPFFu6VjLPF6VjPPFXkF uF&GQ &ʜA V $)V 27urF;u   vjjF tvjjF t˸ЉFVFHN;sb;rFNȱv&vVX@&Fv@&FVvRPF tvFPF tvFPF tˋvF̋VD&&P6v&S6TvvFPF tt˃~uFˡTFVFVv8&&Pv~& &Z&Q,v&,v&@0v&$v|'3AEJ!N!S W Z^hV}VęĨĸɎ؎VVV6ALUcVŁśŴżȎՎǠ[& v&Ft;w~uFHN;r*&<t<uvv) F tFuFv&8sFFFFHN;r$&8vQv sFFFuыv &^FF&;TrP 6FP؋F&PF tFF܌Fދ&v@FF0v&s FF FFv~&^F$~&s(&0^FF$&vF &Z&P^S^SF^^،FFTI;vM+F&Vʃ;Flj^ԌFr&&G&7CY\rČȨ̌\ÎَV#Ubpłŕͪ\Jt‹@FԌFP^SFFT9FwH;Fv Frv&FF &Z&PT+Nv~^Y6T+v^FFv<&SFPF tt˃~uTHN;whT+Fvv+&0~F~ufv؍~NF~uT FFT+FFFsF^&T+N+F+TFʋvv&0~N^Yv&FFvv,&vv,&0v&$v&vF(&^&?uvv) F t^EG\&FT`wĐ̝VĹĎގ @NaŔŤŬŶɎ\8 &?uNv&8u&.v<&SFPF tt˃~uˋvv&FFv&8u&^ƇX.^S^Ss v&Fv&vF &Z&Pv@&0v&vv,&vv,&F6vF tFHN;r5&8u$Xs&^ƇX v&FFuF~uFFw,؊sĿWFPF tFűF1F1FNщF| &3V^k̏VęĩĿЎӎڎ V .8GNy'Ņ)͏VťŲŹŽʆ(΂(҆&ֆ'( [) 0v&s FF FFvF,&8th~8& &QNV6v&S6TRQ<&Sv4&0F t TFVFVvD&9Pu&9v 8&&P3v&8u& v@&;rv&v@&FVvRPF uvvFPF ubvFV8&&PvFPF u6vFVD&&Pv&vv,&[S4HYhqwĉ̏VĞĸǎԎ)V=VWiVŃŎšIJ v &FFv &FFP^Ss !4V,UF ;FtF N;v+F+F ]tsrtlv2PLM86 V2.308/27/93 21:39:5Ȗ1STACKMEMORYCODEDATACONST SRTLV2_CODEDGROUPh@HH TnD KvPREPAREKEYSORTRELEASERECORDREAL RELEASERECORD_RETURNRECORDREALz RETURNRECORDBASICPREPAREKEYSORT} NORMALIZEKEY CHECKKEYSPEC PREPARESORTRELEASERECORDANDKEYRETURNRECORDANDKEY STACKALLOC STACKDEALLOCFKEYSORTACTIVE˜ D ^&^&Gs p^GFFF^&HN;ra^PjFPF t ^&F&FF^&^&;v ^&dFFu^&s  ^SP^ S^SF uF/0ZVĝĴķĻǎЎVc^&^&Gr ^&46FPFONFF&HN;s^VF&V^PjFPF t^&eF^&G^&;v ^&^ vP^&wSPP6+v+v^PFPF t^&G^& PFFFt< s^^S^ SP^S^SFvF 4)0VMVXVU^S^ S^Sz] \% F2F^8&^8v4NFYF,F^8&G\^8]v.NFYF&F^8&Gi^8jv(NFYF F^8&^8v"NFYFV^8&&F^8&FV^8&&F^8&F^8&^8S^S^ S^S6\;tsrtmemPLM86 V2.309/30/93 12:46:1Ӗ1STACKMEMORYCODEDATACONST SRTMEM_CODEDGROUPh@RHH T0ӘD K>PRGMEMN64KSSMEMLASTCBMEMEND FMYOWNMEMORY n GRABMEMORYSLARRANGEMEMORYSLe RESETMEMORYUNGRABMEMORYSLQUERYMEMORYINFO'SDIVIDEDMEMORY USEMEMORYOUSEWALIGNMEMORY֌\ ALLOCMEMORYSL CREATEALIASDEALLOCMEMORYSLFPROTECTEDMODEQUERYBIGMEMAVAIL REUSEALIAS LQ_DWORD_DIV LQ_DWORD_MUL DiFPF uCF@F%F)FVPPF uFV;Vu;FvFV t FVFVF~tFFV uFVusYPFPF uFV&F&@F&@FVjFPF uJFV&F&@F&@Fn^ s; V5:VuąĈĬ̵Vώ܎ V&4E[eF F uE~u~ r5 ;F u,FVus؃N ;u;s!FraF %F9F vF FP+F )FVXF F FV+N~9~u9NvN~FV%FVF@F%F)FVF FFFs>^SFPF uFFNNP^SF t5F!FFF;FsFFFFF~tFFV uFVusGFV&F&@F&@FV*4 $ZVV7Vq{ŁńŨŹƎʎێ֠SFV&F&@F&@FFs:F^SFPF u2FFP^SF uFFn^Ȝ.OVgV>uFHN;v(&@F&@F͡ t'F&@F&@$F&@F&@#"+uX6F t˸PGP&PG]P&G\Phwm PhF t&FsFsFFHN;r?&^FF&FQSPFPF tFuPPjFPF t˸PPF tˡ%jRPF t˸P66Fdu V$ - < IQV`enxĈĘIJ̿Vӎ֎ۍVV !%,V :@DGVvPğ^F6FFNvr ;6svFYF+v~^Y FVv RPF u;v ĿW66 6ĿWF u]Ƈ FV +F^FF  s&ĿWFPF uGƇ +N+ĿvFY+N+ȉœ0IPTgnr̀\ĐĚĠĤĨĬIJĺ̽VʎЎ؎V)/4=AJ\`i8  vPjPF u} uFsFfF FVvRPF uvĿWv6 6ĿWF uhƇ FV s&ĿWFPF u$Ƈ v6 6FZ\@DR\bluy}ăċ̎VěġĩIJĶļȍVߎV FV;u;w&FFw2؊ s#ĿWFPF uQ^Ƈ Fuv 66F u-F ;uWu`  '+>JTVdquxVĈ čđĔ Ę ĝġĤ Ĩ tsrtprpPLM86 V2.309/30/93 12:46:4Ж1STACKMEMORYCODEDATACONST SRTPRP_CODEDGROUPϖh@HH)ThD K?VFCONVERTEDWF1 VFCONVERTEDWF2! VFFHWF1GOOD" VFFHWF2GOOD#VFDOSORTCALLED$ FHWORKFILE1 FHWORKFILE2 VEOFWORKFILE1 VEOFWORKFILE2 VFCREATEDWF1% VFCREATEDWF2& VFCREATEDWA'VCPARASSORTWORKAREA VPPREPARESORTBLOCKVPCURPTRVNUMRECS VPKEYBLOCKVPSORTCONDITIONBLOCK FKEYUNEVEN( & PREPARESORTBASICPREPARESORT CREATEFILE GETFILESTATUSOPENFILE GRABMEMORYSLARRANGEMEMORYSLQUERYMEMORYINFO USEMEMORYINITRSWRITELFAVIRUNVLFACURRGBBUFFERWRITING OBUFFEROUT IBUFFERINUSE VLFACUROUT FSORTACTIVE DFFظ&&Gs &IF% !"#$P^GP^&PG]P^&G\PhmmF tC=u;^GP^&PG]P^&G\P&&F% t6jPjF" u&P^GjP^&GiPP^&PhmmF tF=u^GjP^&GiPP^&P&&F& t6jPjF# u^&& u'jj'^ S^&&F uRPRPF t &I } ")4@DILORUX[̃V̾Vǎӎ؎V V^VgsxVňŠͨVŰVVPPPF^&#;t@(F u?PRPF u*&H F&G&pM V.1VFV U [ _ be h k nrv}ĉđF0F^6&^6v2NFYF*F^6&G\^6]v,NFYF$F^6&Gi^6jv&NFYFF^6&^6v NFYFV^6&&F^6&FV^6&&F^6&^6S^S^ S^S4\FtsrtrelPLM86 V2.308/27/93 21:40:5Ж1STACKMEMORYCODEDATACONST SRTREL_CODEDGROUPޖh@HHT*٘D KGTYPE1 TYPE2 TYPE3QCEXTERNALRECSFEXTERNALSTABLESORT|RELEASERECORDANDKEYŌ RESETMEMORY USEMEMORY QUICKSORT OUTPUTRUNVPPREPARESORTBLOCKVPSORTCONDITIONBLOCK VPKEYBLOCKVPCURPTRVNUMRECS FKEYUNEVEN FSORTACTIVE D M KIEDFظ&&Gr (&^&;tJ &^&;s P &&^&F@%^&jjPF t@;tA"F>u%&^&F@%^&6hPF t@"FFr&Z&Wv>^YFs8Fs v8Fv8v NFYFFF^&8vFY]S6F tK &N&O2F   ,@T^fĆ̋Věğĭ ĴļՎَߎV, 4FNV`enŘů ŵŻ ;VVӆ݆V0t&I F&G q& #tsrtretPLM86 V2.309/30/93 12:47:0Ӗ1STACKMEMORYCODEDATACONST SRTRET_CODEDGROUP֖h@PHH TFD KRETURNRECORDANDKEYCHECKREADASYNC STARTREADFSMALLERRECORDPSUB VPKEYBLOCK VRUNSACTIVENWAYS FKEYUNEVENFEXTERNALSTABLESORTVIBSWAIN FSORTACTIVE PRGFRUNACTIVE PRGPCURRECORDPRGPMERGEBUFINPRGFOVERFLOWEDPRGOVERFLOWEDOFFSETPRGFFIRSTBUFFER PRGPRECBUFPRGPPRQPRGBBUFFEREMPTYSBUFIN D$^&^&Gr ^&>uL ^&^&G &^&&FsFsFFHN;r%&8uQ6F tFuFv&8sFFFFHN;r$&8vQvsFFFuыv&FFFF&^&FsFsF&^v0~ ^YF&F^&^0~^Y^&v^FFv&s FF FFv~&^F~&s&0^FF&ea (BOXb rĀ ċ ̎VĨ †І V % 1PŊżɆ׆EvF&Z&P^&FS^SF^^FFI;vG+F&Vʃ;Fr&&t‹@FFP^SFF9FwH;Fv Frv&FF&Z&P+Nv~^Y6+v^FFv&SFPF tt3~u*HN;wy+Fvv+&0~F~ufv~NFFuF+FFFF+FFFFsFF+N+F+Fދvv&0~N^Yv,M (V>~VčĭĻ džކV!,FŁŖŶĆ׆Qvv&vv&v&v&vF&~uv&M ^&N^&On)<IM tsrtsrtPLM86 V2.308/27/93 21:41:1Ӗ1STACKMEMORYCODEDATACONST SRTSRT_CODEDGROUPȖh@:ӘHH T~D K QUICKSORT FGTPROCM DhFNINFNF+ȃr u ~tF@FF9FrqHFv^&FFv^&S^St!v^&F&@Z&PNY‹vF^&@Z&PF뇂~u|FȈFJ‰NBF=NFN^&NFVVF^&S^StKv~^&F&Z&QvF^&Z&Pv^&FFY^Sv^&Stfv~^&F&Z&QvF^&Z&Pv^&FFv^&S^SYtKvlVV{VVN~^&F&Z&QvF^&Z&Pv^&FFYv^&FFNF;v^&F&Z&PvF^&Z&PNYv^&S^StNދv^&FFF^Sv^&SubۋF+FVN+;sFJ‹FBFFFFB‹FBFFF ̴VVutsrtvrtPLM86 V2.309/30/93 12:47:2і1STACKMEMORYCODEDATACONST SRTVRT_CODEDGROUPŖh@HH6ϘT,טD KMINITRSREADLFAWRITELFA SETRSLFASM CLOSERS_ PBFROMLFACURCHANGEFILELENGTH CREATEFILE DELETEFILE GETFILESTATUSOPENFILEREADWRITERGBRS1FILESPEC CBRS1FILESPECRGBRS2FILESPECԜ D 4$$(,44 FF~v^㍇P^Ŀ WvRPjhmmF=u#~ s˸ F멋F t=t˃~t5FV^Ŀ WvWQjRPF tˋ^j^㍇PjF tˋ^^ĿWhjjFPF tFt˾|$2=NY\`cfjmptw z~ā ěĨ̼VтԎ؎ۂ ގ'V;HOVcnVGv FPF u'v~^Y^ デ,. \49Hv FPF u(v~^ デ,.^ Ƈ4 \-2:C ~u~r%^ FV,.v FPFw %)4\ 5_ FFwF tFuݸ0Vp^ ㋇,.FVN~;u;w9&u9$v^ 4s5^ ĿWhvvFPF uI^ Ƈ4^ FV9u9w?%FV^ RPF un^ FVFV%FV^ ㉇׉$&v ķVQvvFPF u7^ ćFFNV+N؋^&Z&WŜU 17CMXkV{čēı̶VЎԎ&V:JNtstmerrPLM86 V2.308/27/93 21:41:4Ж1STACKMEMORYCODEDATACONST STMERR_CODEDGROUPݖh@#HH TD K MERGEERRORY FINQUIREUSER D'Fs Fs  V0tstminiPLM86 V2.309/30/93 12:47:3Ж1STACKMEMORYCODEDATACONST STMINI_CODEDGROUPh@ HH5ҘTWD K CINPUTFILES SRECORDMAXPKEYDESCRIPTOR SKEYTOTALPRGLFA PRGPKEY PRGPOLDKEY PBUFFEROUT PRGPBUFFERINPRGPRECORDBUFFERSBUFFER"PRGFFILEACTIVE$PRGFRECORDEMPTY(PRGPRSWA, PRGSRECORD0FKEYODD41INITINPUTFILESMINITMEM INITKEYSPACEm ALLOCMEMORYSL CSUBPARAMSGETMSGGETSTAMFILEHEADERQUERYBIGMEMAVAILRGPARAM CHECKKEYSPEC PARSEKEYFIELD LOGMESSAGETESTERC LQ_DWORD_DIV LQ_DWORD_MUL DȔj u˸4N^FHN;sjQFPF t^SvRPj^SF tF&Z&PFvF&Z&PFFuIV V$V59u+JVuF FF@FFHFtv FȾ<~uEv<FF<QPRPjPhPhF~tFsFv<PvhRPjFPj FPPFPvFPPF;r˚Fh4P6ٜH#VĆ̆ V C\`VfVxV~VŇ͎Vřş͢\JtstmkeyPLM86 V2.308/27/93 21:42:2і1STACKMEMORYCODEDATACONST STMKEY_CODEDGROUPݖh@]HH T4ϘD K+UPDATERECORDANDKEYFSMALLERRECORDjd NORMALIZEKEY CHECKKEYSPEC STACKALLOC STACKDEALLOC SKEYTOTALPRGPRECORDBUFFERPRGPKEY PRGPOLDKEYPKEYDESCRIPTOR PRGSRECORDV DnvV&0Z_&9v&FF6FP^FONFF&HN;s^VF&V^PjFPF uQFFv&;vF ^vPFP^SQQ6+v+^PFPF u\FFFtXv^S&8^vv&S&Sjs  vFϜL 1>EVW g ̡VĹ V"+V8AI\_VLjFF t.HF^ &^&;wv^ &^&;sи tstmouPLM86 V2.308/27/93 21:42:3Ж0STACKMEMORYCODEDATACONST STMOU_CODEDGROUP$h@HH TD KMERGEOUT OUTPUTRECORD DU^ Svv]2V-tstmoudPLM86 V2.308/27/93 21:42:3Ж1STACKMEMORYCODEDATACONST STMOUD_CODEDGROUPޖh@HH TD K MERGEOUTDONE D U]˧tstmousPLM86 V2.308/27/93 21:42:4ϖ1STACKMEMORYCODEDATACONST STMOUS_CODEDGROUPϖh@HH TD K MERGEOUTSTARTW D U]˧tstmseqPLM86 V2.308/27/93 21:42:5Ζ1STACKMEMORYCODEDATACONST STMSEQ_CODEDGROUPݖh@#HH TD KMERGESEQUENCEBREAK FINQUIREUSER D'Fs Fs  V0tstmsgPLM86 V2.309/30/93 12:48:1і0STACKMEMORYCODEDATACONST STMSG_CODEDGROUP.h@!HH T4ΘD K WRITEERROR>BBSVIDCHECKERCGETMSGGETMSGUNEXPANDEDPRINTMSG LOGMESSAGEr DFs0vlPhFPF u,lPvFvRPjPF~uh逍PhFPPFF^FF^FFFs3h耍FPj lPhFPPlPvh耍FPj PP1V2VHMVoVuV̷V̽VV܆VVwtstoutrPLM86 V2.309/30/93 12:48:2Ж1STACKMEMORYCODEDATACONST STOUTR_CODEDGROUPɖh@HH TD K OUTPUTRECORD WRITERSRECORDRSWA DUP^ Sv] V׊tstparsPLM86 V2.309/30/93 12:48:4Ζ1STACKMEMORYCODEDATACONST STPARS_CODEDGROUPݖh@ HH'T]D KBCOLON0BPERIOD1 BASCENDING2 BDESCENDING3 BWORKSTATION4 BMEGAFRAME5FPARSEINITDONE6 RGBTYPENAMES7 RGPTYPENAMES6 PARSEKEYFIELD DECFROMSTRINGm DISPLAYBADKEYmM ALLOCMEMORYSL CSUBPARAMSGETMSG NLSULCMPBRGPARAMTESTERC LOGMESSAGE D6"*6shRPj0PjFPP~th4hRPj1PjFPP~th4hRPj2PjFPP~th4hRPj3PjFPP~th4hRPj4PjFPP~th4hRPj5PjFPP~th4FFރ~ w_~rh4FPRPj^7P+PFPP^v7FFFu6jF u FFP^SF u^&^FF&^'V-V;VLXV^VlV}̉V̏V̝VĮ̺VVVߎVVVV"V0VNVgwV}VōőŕŤͪVVGFFFFHN;s\jQFPF uFFFN0u+JV1F׃uN~u+JV0F׋F tt N;svFFF wMRQ^SĿWvFPP9Fu9Ft vFFFu~uvFF^&@F:1tFރt tt u~t%~uF^&Hp~t:~uF^&@u9Fuf^&@\~ uF^&@A 9Fu9F^&@ $Fރttt t u v%%V?Qȓ\ĻVV\\FFN+^x1u+JV tt BF;vv^v@PvFPmF tv~u0Fڹ1 uF^&@Fڹ1FڋFF^&@FF@FFFN+I^x1u+JV tuv^v@PvFPmF tvFF^&FF@FRQ^@P2PjFPP~uF^&@LRP^v@P3PjFPP~uF^&@vFF@F@N;tU^v&P:18\G\_\n\ێ\\ \S_VeVŗͣVͩV\ t;tvF@FRQ^@P4PjFPP~tKRP^v@P5PjFPP~uF^&@vFtj\-9V?V\hVnV̐\@[m^&FF HN;r5^ &F<0r<9v ^& N0&Fu N`ȌjvFPPhFPjtPhFPPtPvPh VV2V8VFVLVTVtstserrPLM86 V2.308/27/93 21:43:4Ζ1STACKMEMORYCODEDATACONST STSERR_CODEDGROUPזh@#HH TD K SORTERROR FINQUIREUSER D'Fs Fs  V0tstsinPLM86 V2.308/27/93 21:43:5͖0STACKMEMORYCODEDATACONST STSIN_CODEDGROUP+h@2ޘHH T D K SORTIN| RELEASERECORD D6FP^ SFPF t F uFV(tstsindPLM86 V2.308/27/93 21:44:0і1STACKMEMORYCODEDATACONST STSIND_CODEDGROUPh@HH TD K SORTINDONEN D U]˧tstsiniPLM86 V2.309/30/93 12:49:0і1STACKMEMORYCODEDATACONST STSINI_CODEDGROUPh@GȘHHTWD KM CINPUTFILES SRECORDMAX SRECORDBUFFER PRECORDBUFFERPRECORD INITINPUTFILESU ALLOCMEMORYSL CSUBPARAMSGETMSGGETSTAMFILEHEADERRGPARAM LOGMESSAGETESTERCN DKȔj u˸F^FF;rjPFPF t^SvRPjPF t:hFPjlPhFPPlPvP^&G ;v>PvV]bV̆V̌V̚V̠VİĵĹVVVV!&V36;VtstsinsPLM86 V2.308/27/93 21:44:2ϖ1STACKMEMORYCODEDATACONST STSINS_CODEDGROUP֖h@HH TD K SORTINSTART D U]˧tstsouPLM86 V2.308/27/93 21:44:3Ζ0STACKMEMORYCODEDATACONST STSOU_CODEDGROUPh@HH TD KSORTOUT OUTPUTRECORD DU^ Svv]2V-tstsoudPLM86 V2.308/27/93 21:44:3Ζ1STACKMEMORYCODEDATACONST STSOUD_CODEDGROUPؖh@HH TD K SORTOUTDONE D U]˧tstsousPLM86 V2.308/27/93 21:44:4͖1STACKMEMORYCODEDATACONST STSOUS_CODEDGROUPɖh@HH TD K SORTOUTSTART D U]˧tL*1GA9Q RESETMEMORY4VIRUNIN$COMPUTEMERGEPASSESW PRGPRECBUF$ BWORKSTATIONe FMYOWNMEMORY4CBMEMEND4srtcmp!srtret!G4xKEWso[c!.';j SORTERRORk PRECORDBUFFERn RGBBUFFER; SORTOUTDONErWRITELFAN PRGSRECORDSOUTPUTLASTRECORD; VFHFILEIN$COMPUTESEQUENCEBREAKSWNWAYS$ rgbFileError TRANSBCDKEYVLFACUR;QQADDPRECORDn FINQUIREUSERW WMSGFILEVERWVPSORTCONDITIONBLOCK@VIRUNOUT$ keycollation!stsini!nU)g8_1M@l"EqPRGBBUFFEREMPTY$SMEMLAST4 WRITEERRORb MERGEOUTSTART` PRGNEXTLFA$ TERMINATESORT!INITMEMS BVALIDATEVER cbRs2FileSpecTRANSIEEESREALKEY PRGRESPEXCHIN$stsous!sstsoud!r"WJk}^8t0*AQd BDESCENDINGe PBFROMLFACURN IBUFFERINUSE;QDIVWORD PRGPBUFFERINSRGPMERGEBUFOUT$QUERYMEMORYINFO4 VFHFILEOUT$ PRGENDRUN$ VPKEYBLOCK@cbSysSys LOGMESSAGEWTRANSINTEGERKEYrgbRs2FileSpecPRGFRECORDEMPTYSWG&R?!90\ StackDeAlloc USEMEMORY4PRGMEM4RGBBUFFERWRITING;TRANSDISPLAYKEY QMULTWORD GRABMEMORYSL4RETURNRECORDANDKEYGsrtdst!$stmkey!\)Q5#>.DJVTRANSIEEELREALKEY RGBMSGBUFW FLIPSHORTSBUFOUT$ PRGPOLDKEYSPKEYDESCRIPTORSFDISTRIX!MERGEOUT^ CHECKLENGTH;stpars!eAyZt8o0'JTfO~ SRECORDBUFFERnDELETEFILESANDMEMORY!ARRANGEMEMORYSL4 FLIPARBITRARYVFDOSORTCALLED@PRGFOVERFLOWED$SBUFIN$FGTPROCFLIPLONGTRANSIEEEEXTENDEDKEYFPARSEINITDONEesrtout!;stmseq!astsins!phE-L\zp2u'Td=SORTOUTq PBUFFEROUTS OUTPUTRECORDO;VPCURPTR@INITRSNVPPREPARESORTBLOCK@ cbRs1FileSpec rgbCharXlat RGRESPEXCHOUT$ VFCREATEDWF2@ VFCREATEDWF1@QQSUB FNLSCOLLDONEstmsg!bsrtrel!Dstmerr!Rstoutr!dE\<4,Srkb"Lv OBUFFEROUT; PRGFRUNACTIVE$RETURNRECORDREAL0 VEOFWORKFILE2@ VEOFWORKFILE1@TRANSBINARYKEY VFFHWF2GOOD@ rgbMsgFileFKEYSORTACTIVE!VNUMRECS@USEWALIGNMEMORY4 VLFACUROUT;FLTQR).C>W6^dKi!qPRGPRSWAS PRGPCURRECORD$ CONCLUDESORT!BCOLONe OUTPUTRECORDd BSWAWORKFILE2;PRGLFAS BSWAWORKFILE1; VFCREATEDWA@CLOSERSN SORTINDONEmQADDWORDsrtprp!@ sortutility!"C_6Xry)QIj<. OUTPUTRUN;INITINPUTFILESMS MERGEERRORRSBUFFERS PARSEKEYFIELDe TEST2ERCSW BMEGAFRAMEeRGPRQOUT; MERGEOUTDONE_ VEOFFILEOUT$ cbCharXlatPRGOVERFLOWEDOFFSET$ DISPLAYBADKEYe PREPARESORT@ SORTINSTARTpPRGPKEYSstmini!Ssrtutl!9% MC0>H,R rgbSysSys RGBMSGCACHEWPRGPPRQ$ FSORTACTIVE!FEQQPRGFFILEACTIVESstmoud!_stmou!^srtall!srtvrt!Nstmous!`ze4)q^;Rj!JXDSDIVIDEDMEMORY4DOMERGE$ NORMALIZEKEYUPDATERECORDANDKEY\ cbFileErrorQCEXTERNALRECSD SKEYTOTALS INITKEYSPACESQSUBWORD QUICKSORTK SETRSLFASMNSORTINl FHWORKFILE1@COMPUTENUMBYTESW FHWORKFILE2@ FLIPBYTES TRANSLREALKEYkeys!srtcon!!_c'/XLpEygTA: COMPUTETIMEWBPERIODe SORTOUTSTARTs FILEERROREXITWMERGESEQUENCEBREAKa VRUNSACTIVE$PSUB$ VFFHWF1GOOD@ DECFROMSTRINGeTYPE1D OPENMSGFILEWTYPE3DTYPE2DPRGFFIRSTBUFFER$PRGPMERGEBUFIN$ mergeutility!stsou!qstmisc!WaI@&\+7O3WfPRGPRECORDBUFFERSUNGRABMEMORYSL4FKEYODDS TRANSSREALKEYFGTQPREPAREKEYSORT0TRANSSTRINGKEYVIBSWAIN$ RETURNRECORD0stserr!kstsin!lstsind!m<GAel5],Rv! CHECKKEYSPEC cbMsgFileVCPARASSORTWORKAREA@rgbRs1FileSpec FKEYUNEVEN@DOSORT$PRGWIRUN$BASICPREPAREKEYSORT0RELEASERECORDANDKEYD RGBTYPENAMESe BASCENDINGeCOMPUTENUMRECORDSWFEXTERNALSTABLESORTD LASTRECORD;VIRUN; RELEASERECORD0sortmergetext!srtlv2!0>K mUE%-5^hrINITINPUTFILESnN64KS4READLFAN RGPTYPENAMESe FGETFLAGPARAMWVFCONVERTEDWF1@ StackAlloc STARTREAD$BASICPREPARESORT@VFCONVERTEDWF2@RELEASERECORDREAL0srtmem!4srtsrt!K COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. LIBRARY: sortmerge.lib VERSION: R12.3.1 (friday november 12, 1993, 16:26) GW a*Y,  X` tP?v Copyright 1993 Unisys Corporation. All rights reserved.Ver R12.3.1 Linker R12.3.1 @ O0 ??O_`_ "+/p-?--000244/666?9O0?O ?K_Lo M_M?M0NO_UPV/pVV_ Wobbdf_0ghpi j/jl m?nno/@pOpq_q? s`tptPvO@ww`yPz/z{?0~p~P? `pPPp?PO0 0O`o0? ?P_ O/?@/O`pPO`   `_`?*'(")#+7* 8% /N!)   5  ^   0 } o    = c MCMZMMWMMMM*M,Y<X" &T&g&&1A1?C?5??? ???G?!!!!!!!!!\''M0 HH/HFHXHP)P<_##F###0## #{###!F!G!_FyF3PrP7\H\0sCscss~~~l~~~~v~~~~~~~+~B ~{ ~ ~! ~T ~ ~ ~k ~ ~ ~1 ~g ~ ~ ~ ~~r&rarrrrr r-h j   D4i44y4/MM.]]+FfUE84A]v  S  R;==P=,92`   c YMB ./OhiHOi $7<Rfg"&1?'0HP#!FP\s~r 4M]|E2=O^9FXf|D~ & A I N ~        1 @ E Q V ] d k p }          . O T q  D e         ; S   3 @ t   0 Q j       1 B Y   " :         + S a x     n      h    "  5  <  H  p  v       >  D            \  b  i  o  v       3  9  ]  c  o  |   ! ' 1 G q Y e    $ c c c c c c c 8c x|:IXgv *9HWfu  ) 8 G V e t            ( 7 F U d s              &      *  Z |       0 M p         / X  + > M e x  * = I R i z  "*.26:BFRVZ^bfjnrvz~l  P   2 O }     # + ^ e z       G ^     $ + P  - 8 D R t      , G `  ; T  . ; B ] v 'Y<YnYYYYY2YWYrYYYYbYYY8YYYYYYYYYYY}YYYYYY^ Yg Ys Y Y Y Y Y Y8 Ya Y Y Y Y Y4 YE Y Y Y Y= YN Y Y YYY/Y6Yr v M2M!RXeOJK5e{B+BABFBpr /!9! (Z- \  C/i////]/k////vOOOOUidi|i#iUii'ZjEw/BOu!FudF LRM a a a 5II I I b$4Ny6V  "J"/9>HW!&8BQVchu<FPU_ix} ).8?NSbgtBdJ6 OOOaOO!iiiii0iLiui/"U  %.8=FY^!!   % : Ve$GLQZ| $$!$$$$$ gg (=!8FKUZ s  + (4? %""?&&1%?=????(??X!b!l!v!!!!!!=!k!!!!#!Q!!!!!!!!! !!!!! !$!)!-!1!5!9!>!B!F!J!N!S!W![!_!c!h!l!p!t!x!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!#Q ~}sg'!!P8PTPrPPP3PiPnPPP!PPPP5AmIl##*#P#t# #o#s###6######C\Q`b%!N!!!I!FaPPs;~~~A ~ ~ ~rrrrrr"`94Z40]3||| |3z9kF4uREEE!E p`I`QQ\      %    9   B,y+y,bOY^^^^^^e^^^^^^q^^^& ^ ^ ^{ ^ ^t ^ ^Q ^ ^FFX#|MetaWare High C Run-time Library Copyright (C) 1983-1988 MetaWare Incorporated..[KBD][VID][]}[!Scr]]$$.Tmp}[!Scr][!Scr][scr]<$>BsFilter.tmpVNVFp        ~\\{}MASTERSERVERLOCAL{}[]{}[]<>[sys]LptConfig.Sys&Error 2624: msg= %0N maxlen= %1N^YesNo`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijklmnopqrstuvwxyPress NEXT PAGE or SCROLL UP to continue,(Press NEXT PAGE to continue,!a?!*a**2Q=\zCKACTION BACK SPACEBOUNDCANCELCODECOPYDELETEFINISHGOHELPLOCKMARKMOVENEXT NEXT PAGE OVER TYPE PREV PAGERETURN SCROLL DOWN SCROLL UPSHIFTTAB#+17?GKQW]citTD aAdDhHmMnNoOsStTwWyYgG!oo!/!0d!/!0y! !hh!:!0m!!2AA!!*o!/!0d!/!0y! !*h!:!0m!!2*A!"!Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!"!Nnn! !*d!, !yyyy! !*h!:!0m! !2*A!(!Www! !Nnn! !dd!, !yyyy! !hh!:!0m! !2AA!(!Www! !Nnn! !*d!, !yyyy! !*h!:!0m! !2*A! !0t!:!0m! !*t!:!0m!!hh!:!0m! !2AA!!*h!:!0m! !2*A!!0o!/!0d!/!0y!!*o!/!*d!/!0y!!0h!:!0m!:!0s!!0t!:!0m!:!0s!.tmp!W*w! !N*n! !*d!, !*y!!N*n! !*d!, !*y!"!0o!/!0d!/!0y!-!0h!:!0m!:!0s!!2*A!!Nnn! !*d!, !yyyy!Invalid Template Index$Cb %6FVfzTN00sundaymondaytuesday wednesdaythursdayfridaysaturdayjanuaryfebruarymarchaprilmayjunejulyaugust septemberoctobernovemberdecemberampmnoonmidnight05 invalid namesunmontuewedthufrisatjanfebmaraprmayjunjulaugsepoctnovdecampmnm05 %0:BLU_fmrx~ #(-27;?BEI{R12.3.1<2C2[Kbd][Vid] |[Lpt][Nul][Debug][SysIn][SysOut]>DDD! D#d>D%D)D*]D7uD8< DD  tDD <tDD a ] y   ] y  B.\B \ B.\Z] y    tDOLL y] y    ] y    {y  2\44;4L >4>5     &8Input file: %s Object file: %s Library file: %s CODEDATAModuleDefinitionMsg.binCT DEF Compiler 1.0CT DEF Compiler 1.0"%s" %s%sMyAlloc - error, needed %d bytes MyReAlloc - error, needed %d bytes B%s %s %s: %s r+wr+w%s: %s r%s: %s %s def.lstdef.lstw%s: %s %s %s: %s %s r+"%s" %sdef.objdef.objw%s: %s %s "%s" %s"%s" %s"%s" %s.run.run[Scr]<$>[Scr]<$>[Scr]<$>w%s: %s %s -Old-Old%s is neither yes or no. [Sys][Sys]HTXBinary nationalization file "%s" is required.Unknown errorUnknown errorUnknown errorTm`p{{ p{{{{{{{{{Pp{{{{{ |{,|{{{z{{Dp{@|{\}{p{{p{yp{{p{ p (uuuuuuuu u u u u v v vv"v*v.v6v:{(737&/,-|C5A;@ED.`qabcdef7,-_p5^o]n[m;Yj\@Zzkwsy~-v}USQ`qFrb_def^=][Yx\9ZpHuolnhmWGj<k82g1V0`abcdefLMNOP '  !"#$?% !"#$KJBt%4TR*LLLE{:86h7({ 3h7 L1    1}xw  usqon kifdb &( !"#$%% ''..///////))778888888**;=; <<>>????????361:20594--@@AA ++BBDECFF,,GGHHHH          "$%&'(!#).==...@+* r%'g/35@JMOqsu !"#$&()fhlmnop*-.14689:;<=>b_a]ec^?ACDEFGHId`KRRtyik,-027BLQSUVWXYZ[\NP|Tvxj+z~{w}yacc stack overflowsyntax error!APPTYPEDYNAMICLINKINITGLOBALINITINSTANCEINITGLOBALCODECODEDATA"%s" %s%s "%s"%s "%s""%s" %s"%s" %s"%s" %s'%s' %sDATA'%s' %s!AppTypeinternal checkattribute error'%s' %s; %s %s'%s' %s; %s %s'%s'; '%s' %s%s %d %s "%s" %s "%s"%s "%s", %s "%s"%s %s^^SwFpEmulator0000000000 `p ((((( AAAAAABBBBBB   VNVF4@4@4tmwmmmp?Ǫ0mC l@@@ @ @4@p+ŝi@զIx@ߌGA~QC‘F uuvHM]=];Zw R`%uU6767h:6868h:>8t686 8h:D8F8J8L8d8ddPhn8p8b8h:_FVRP+ h:_FVRP+ B8h:_FVRP+ H8h8ddPr8t8f8dl8Pv8x8j8N8P8Z8[8\8]8^8_8`8777788 8877h:p`pjj8 8RPH[6767j+:uA+Rh:PhP6|8~8#u#t)&D u j~RP6|8&t&4h;[>>8u>N8u>P8t j>88u $@>98u wjjj;q6 868 >8t#8 8uj*~RPh ; 8 >8t6868>*8u~ 6(8UvjFV#u#uvh;ho Uv vvGFV#u#uv h4;ho UFV#u#t RP+U+~uA+BRHvV#u#t(+~uA+ًAv~FVUFVFVv&*t v&, v&"tF֋FVU+~uA+BRvV#u#t(+~uA+ًAv~vvZFVUR&2*Vʾ2~BVRvvhMU +~uA+BR6b;d;+~uA+ًAv>b;vv]j$F#u&j~RPvvhMhj FPFVFF;Fs Pjv^&&PFFFF=vC^&p&<>u2&|>uFMFM^v^&@&P77nF FuYF=vQ^&x&=>u@&}>uFM^^&@FM^v^&@&@&P77N~v&j~RPvvhMhj v&&T77hMRPtpp t6767j~RPvvhMh;h;;?;?6;6;6767+>7uA+RPPPhrm6?6?6f;MP +>7uA+щVBR677+>7uA+ًA67>7F#t#67&8.u&67^&8\tNj$#tjj77F Ft+>7uA+уR677+>7uA+ًA67>7>7uA+ѾMuA+AM>7FM^867676767 #u.j~RP6767vvhMhj hpvv6767\ t6767j~RPvvhMht@?v@xDx@zD6v@6t@6767+>7uA+RPPPhwm6zD6xD6f;MP jhMvv #ujjjhp j$#tTjj88RP6767  #tj~RP6767hMhj +>7uA+уR688+>7uA+ًA67>8>8uA+ѾNuA+AM>8h N6868t8 8 t6868j~RPvvhNhD|DEIEI6E6D6868+>8uA+RPPPhwm6I6I6f;MP j$#ujj 88RP6767  #u(j~RP686 8hNhj 686 86868 #u(j~RP686 8h"Nhj 77#u#t>686 8RP #u(j~RP686 8h*Nhj 888j`8j`8j`8+>7uA+уQR677+>7uA+ًA67>7>7uA+Ѿ8NuA+A2N>7U+~uA+Ѿ>NuA+FVFV+RNuA+AHN~~uA+Ѿ~uA+Av~Fh\Nvvt 88 tvvj~RP6d;6b;h^NhIIIMIM6I6Ivv+~uA+RPPPhwm6M6M6f;MP FVU@hjNh+> 8uA+щVRFV+> 8uA+A6 8~~uA+ѾrNuA+AlN~Fvvvv686 8j$FPFVFFF;FsUjPVR$P(FFjv^&&PF&EFV^&0&&TF룁FvFP,P(vvvjP(jdvV+> 8uA+ًA6 8~> 8uA+щVjVRP(+>8uA+ыA68~>8uA+щVjVRP(j~jF܉Vޚ~F؉V+~؋uA+Av~~uA+щVjVRP(j~jFԉV֚~FЉV+~ЋuA+Av~~uA+щVjVRP(j}P(j~jF̉VΚ~FȉV+~ȋuA+Av~~uA+щVVRP(j~jFĉVƚ~FV+~uA+Av~~uA+щVFPP(FF;Fs^&p&0P(Fj~jF܉Vޚ~F؉V+~؋uA+Av~~uA+щVvvRPPPjPPPP(U v$V;vFvRFP$P(F@PFVvvvRPv^&ƒ +UFv$#uvjFP$P(jjFPVRdF#t[jVBRFV uvvvvvvvvvvvhxNhjFUX+NuA+ыAN~PPVR/#uhv&*PFVFPj>FPvV#u#t4Fv&+~uA+ыAv~Uv&=v & U~u&N vVNF V$N v^VF ^ˡV#t6 868jPhN >8t^#t6868jPhV U~uCVF =~-6 868j6VhNV+N VV>^F =~*6868j6^hV+^V ^^jFPvjF PvU~u$VFFFF;V}3N*FF衶^FFFF;^}V*FFjFPv]UP+~uA+щVRhvjFPv&vv vvjvNUFPhvjFPvjF Pvvvv vjvUFPhvBjFPvjF PvjF PvvvvvljvUjhN8j hjvUF>b8wFF;b8w-n8&0vF+&j8s{FF;j8vv8&P&0vV&TVVRFv&tvvVF؉^Shvjh^vjh^vvFPvvFPvjh^vjvFBFF;j8vv8&P&0vV~v&TVVR6Fȋ~v&TVVRFȋ~{VPFPjhjv/FMUjhNvU j\FVRP +~uA+Ѿ~uA+Av~Fvv~uA+RPPPh`_hh`chCTF#tvvhDjhv  vvF~8~F@Ph^hFPT#u=F*Ƅ^FVv`ibi+^uA+A^D+rjuA+BRv`ibi+juA+AjFF^U~9~F9v\i^iUPv&*t v&*䖃 vv &*t v &*䖃 ;vuv&<u+FF v &*v&*+ВUPv&*t v&*䖃 vv &*t v &*䖃 ;vuv&<u+FF v &*v&*+ВUP| F@^C v.$8CIXw|D #t뻃> qujq> qujqj qNmh&j'j"hN5h 6jj*P5vhz6 p6 p ?+UPTm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+j6jjF< t"tmj qNmUFTm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+j6jjF:FuFF=|#+vƟjVj ~RPhz& ^*#u u u\tTm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+j6jjj+ 6jƄjUPF~BsF+qV>FUv+6"q^z`zFVUv+6"qzU+~uA+уPv v&DPVj7~RPh{s vvbxdxFVF Ft2v&t&4vv #uwv&D &T FVjFV#u#tL>8t vv vv{v&&Tv&D+&D&D&D V FVUPv&t&4&Fbxdx^&G &W bxdxUPFv&<t$v&*t v&*䖃 vFӋFU qj^tutjjjj6 qƞjV+vq(j+ q;|O;rR6 qƞjVhvq"8vq$8j+ qPj+ qQ6 qƟjVRP"8$8 i6 qƞjV6&&T"8$8&DF1j6v>66"8$8j qNmFˡj#~ +ҖjjUvv (8U(+FډF؋F=},+~uA+JF;vv&8%uFF̍F FVFF;F}F^&W&OR܉JFj ~RPh {h{^Kw.!8Uxvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv`vvvvvvvvvvvv2vvvvvvvvvvvvvv*8(8U(,8>8t+FډF؋F=},+~uA+JF;vv&8%uFF̍F FVFF;F}F^&W&OR܉JFj8~RPh{h{^Kw. 7 _ vvvvvvvvvvvv vvvvvvvvvvvvvvvvvv`vvvvvvvvvvvv2vvvvvvvvvvvvvv6pj~RPh${ ˃>,8u:j+~RPh,{ >8uj+~RPh0{hq>,8uj-~RP6,8h4{j/~RP6,8h<{ >8t7>,8uj-~RP6,8hD{j/~RP6,8hL{h>*8u:j)~RPhT{ >8uj)~RPhZ{hq>*8uj,~RP6*8h`{j.~RP6*8hh{ >8t7>*8uj,~RP6*8hp{j.~RP6*8hx{hhphp>*8t6868k6(8˸UF>Nmu5Nm6jƞj؉vFF^6qvF6pp> uF v&&TFV{;u3;u/~u)&tvF#u#u6ڎ&;Tu&; u$Tm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+FvF&FvvF{;Fs@~vFF;*v&*p;Ft;^t{V;w+{v^v^~~F;*w!v&*p;Fu;^tDv.*^މ^FF;*vr&*p;FuY;^uTv&D*pغp;u;thv&D*p؉^FvF&&Dv&tvF#u#t"&&TFV{;t;tNv&*p= upp6PmPm&vF;r+vN&v&;Tu&;t&&w6Ќ;u;t&;}v6:tU6&Pv&&w &wHt3;Fs+FvN&*p= upp6PmPm&v&*䣊FV~jV+BjƄj6&>juPmTmRm+Tm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+j*䣊Fj^UF Ftv&<tF&;F u+˸Tm;PmrJ6p&|~-&&? u 6p&D @u6p&L&&D&&6p6p Pm6Pm&*p= upp@tp+U6 p&D#~&LF&&T&&6 p6 pv UFp= upp6PmPm&UPjhvv #uhjhvv #tjh6$86"8 #td+>"8uA+Ju/6"8&Fj6~RPF*P6$86"8h[@j6~RP6$86"8h[!j5~RP[vvBUJ+FVFVFFF;wh Fv&F ~󥤋vԌF=~j>}@FV#|E}?V;u*󥤉V#SLvZF=u^>}@F ^v&u F𣰠vvFۋF%@F~F؉F~v Fvv,v&BV}V;tv,F~tF򣮠FVFVKvW.                 (Om     1[  ] v                       5=|                        4 t ( g r z     6 J   (j3Nv&t&t&t&t*v&t&t&t&t&t&tv&D&+-P&t&tjhjj:>88uj~RP[>88t@>98tj~RP[n>98tdw\>?8tj({?8N8 v&DV89>;8tj ~RP[;8N8v&D&TR8T8v&DN8jjjjv&t&t "uQ8 +v&|uA+Rv&t&tjhPP_yjjjjv&t&tv&t&t&t&t&tY>>8tj%~RP[>8$>=8ujjjjv&t&tH>=8tj"v&t&| tj~RP[#v&t&t&t&t&t&tꚞ =8v&Dh֠v&Dhyv&|u&&D𣤊&t&|uhOhIv&\&D|8~8&t&|u &O '6|8&L v&Dh_v&t&t&t&t$h_RP+ B8n8&p&0v&t&tv&t&L hv&t&t #u$hv&t&t #tL8 28J8 08v&t&tv&t&t&t&t&t&tjjv&t&t&t&t v&\&G t#j~RPv&t&t&4h$[v&t&L z8uv&t&t&tꚖ v&|u:E8u#&t&t&4j0~RPh,  v&D% z8-E8t&v&t&t&4j1~RPh4  v&t&t&t&t&tϚ v&\&G t#j!~RPv&t&t&4h< v&\&O z8vz8 v&D+Уumz8 e]v&t&t&t&t&4&t&t&t&tSv&\&G t#j!~RPv&t&t&4hD v&t&t&t&t&4&t&tjjBj~RP[v&\&G t#j!~RPv&t&t&4hL v&\&O v mv&DLv&D&t&t_v&D&T>.8ujjjj.8Uj4~RPv &t&4hT UP08D828F8 FjFPjhjj_88U08J828L8 Fh\_FVRP H8jFPjhjj_98UF):8v&&TFV+~uA+v;V u;F t&v &&LVNuA+v FVF V F@FFz8t>8tz8F+N8z88V8vvvh8Fv􈄂8 F#tPvvƃ8V z8t*>8tz8vvvv^썿8v &D "t t vƄ8v &D tvƄ8vh8jhjj_>8u}8 8uv&t&4=88v&t&4j6767_FVjvvRPvv%FPh8jhjj_&j;U+F3ҋ;Nu;FuBV:tF%v&&TFV+~uA+vF FuFVFVFFBv&&TFV+~uA+v:Fuvvvv #uFv &&TFV+~uA+vVBBVVʿ8V8N8vvvh8Fv8vvv􍄃8P~tvvvv^荿8$vvFꈄ8vvvƄ8V FUFFF:8~uFF FVFV6767_;V u$;F uj2~RPv &t&4hb vvvv v vvFPh8jhjj_UP>.8~j ~RP[.8vF#u#t@&&T#u#t/+^&?uA+Av&4>7+>7uA+щVʃ8N8R6767h8v^8v &D8Sh8hjj<8UP>.8~j ~RP[.8vF#u#t@&&T#u#t/+^&?uA+Av&4>7+>7uA+щVʃ8N8R6767h8 F F uhj_F V v ^8+8Sh8hPPU+v v LFFvv8FvvP08284868+z8@808284868D808F828 +"q!+"q#+"q &+"q ߹$+"q (+"q ߹'+"q >2808h4868"+"q %+"q 6848@80828 +"q$+"q й(+"q '+"q 2808@4868J848L868!+"q &+"q 6848!@8U F Fuht[v&DF&TVP-FVN+"qFvMF>@8u!+"q#+"q й +"q ¹&+"q й$+"q ¹(+"q й'+"q …Fuj~RPj~RPj~RPv&t&4hj$+"q +"q й(+"q ¹'+"q ЅVt:j~RPj~RPj~RPv&t&4h w28Ft6F#08V#V;t%j~RPvvv&t&4h F 28~!u$~u&+"q#+"q# 28F 08U 08F28F68F48F"qFF;$q~~+"qVNucVt^ V wQ.    F%-F%%F%F%F+F%@F% FFvFUPv&DF#uWb8d8;b8w#d8dd8P6p86n8n8p86b8^F>n8&&Eb8&Wb8UFF;f8wfr8&0&;F uN&tvF&t&4j~RPv&t&4j ~RPv j ~RPhġ[Ff8h8;f8w#h8dh8P6t86r8r8t8j6f8r8&&P6f8F &0&6f8FVr8&0&D&TU FF;j8v{Fv8&0&;DuaV&;TuXn8&@&0vF&^F&w&7j~RPv&t&4j&~RPhڡ[Fyj8l8;j8w#l8dl8P6x86v8v8x8j6j8v8&&P6j8F&0&D6j8Fv8&0&D6j8F v8&0&Uv&DFt tuP8% v&D#N8F~t$j'~RPv&t&4h졚[+^ v.11eWs{>v&D P8gv&D P8F X8FY8NF ]8F^85F [8F\8'F Z8v v $_8 v v q`8v&D N8U~u ~:9u+F~u ~9u5~u ~:u$~u ~f:uj~RP[+U~u ~9u+$~u ~:uj~RP[+Uhhj FPF>u>u #u+Uh^hF#t HF^^+Fv&TR*;t FƄ{v&LR*S^v&DR*F#t FvƄ}v&D*#t FvƄ[v&L*^v&D*F#t FvƄ]v&D*#t FvƄF^v&L)**v&D)*F+vUNv>d+6d^&vFv&&T>duA+Ѱ^>duA+Ѿ+>duA+V;tFvd&@v&&Dv&<uv&<{t<[t<`6`vFuA+Ѱ>>`uA+B^+uA+ыA>`v&<\t^>`b6`b6^\+uA+Ѿ~uA+Av>`buA+ы6`bvF+>`uA+щVFN#t6`^&8/u&\v&"u<.t&|.t&|\tyvF6`^@;FrrFv&<\t`b^N;u;uߺ+~uA+ыAvF~FN_FY`bv &&T+U vvvvvvvvv v vv#u+F#tyvvvFPFPF#u[vvvv+~uA+RvvFV#u#t+~uA++Vv v vvU vvvvvv v vv#u+~F#tpvvvFPFPF#uRvvvv+~uA+RvvFV#u#t+~uA++VvUBF#t1vvv FPFPF#tv vvFPFPnF#tFPvvv jjjhmm#uvv vvtFPvv+~uA+RvvFV#u#t+~uA++VhmmF#uhvvv+~uA+RvvFV#u#t+~uA++VF#t v Fv UxFxv v vv>xu FxFxFF]_mwDOS_interface2c_renameUvv+~uA+Rv v ~ uA+RP|]USv6t6tv Pvv N +;u;t v6D-Y]UP.vvv v  fFY]Uv v vv66 ]UF Pvv66 ]UFPv v vvx ]U+FЉFVFv&F< t< t< t< tF<+t<-u3v&<-uBVF~u5v&<0u%Fv&Fxt v&L FxF] U vvF&D u x&L Hv&D t vv4v&L F n FV"| ++}xF Fu+dv&D tP+PP&D Pvvvvv+~ Fv&D t!vvYYP+PPv&D PF]UP#F ;rVRvvF)F ~ wY]UP|=t0V;v)+‰Fzt zuPvPY]US6Х&F<*t<1r<9v~u6Х&<0t6Х&F<0r<<9w8FF 6Х&*Ѓ0VХ6Х&F<0ra<9v[6Х&<*uQ6&<} ~PuF6&؉Fz 6&FХ~PuFFF]USFVХҥ+z|~F6Х&:ue6Х&<%t8ʥ%uA+щV6Х6ĥƥȥХ)ʥ0P^ ^뚡ХҥFVFХ6Х&* wL.-BB4BBBBBBB&BBB;z zzz zF~t+PFP|6Х&<.u4Х6Х&<-uХ6Х&F<0r<9vPPP~6Х&~uF Fu +P4>~u~;r|=t ;vFFFF"tzu zuk#tPP~t zuD~=t;v+‰FPPU>~uF Fu P6ӥV~t]USPBF%FVV= s0v6|tF7 FWv^6@N~w]US00~F:F+҉FV#u#v PvsF+҉FV#u#v PvT FPFP]U+~uA+щʥF V ¥UPvv_]US ^*%u0tzE3v..&M M M M M M M M M PM M M M M M M M M M M M M M M M M M M M M M |PM M M M M ȥP6ƥ6ĥ>u6&&T̥Υ*Fu'v6&t&t&t&t&4  v6Κ)$6&&T̥Υ3ɀ~PuAQRP^6&&F%zuPPVRzuP}6&F6&&TFV#u#tZ6~+~uA+v~;rv6zuVvvvztvx]UvvF&D u xFv&D tv&|t&D t+v&D u&||x&D tP+PP&D Pv&+DP&t&t&D PvDFv&+T;uFxFv&L v&D&T&&T&DFF]U +FvV`+ӹvV+}|++VN}lv&;D tcvF&D t>&D t VFYY v&D t8v&D u&D u&t&tYYv&D Pv&D xFF]UPFvjt`;u;tPYYF=sF66YYY]Uv9]U,vO]UP]˃VW&& _^QR˃݃ՃUv ]init;+P9˄.ػ*Ћ22.TX+@42"t382>82&82?>82?u>>8282u...62ٛ>:2:2t:2.<tK2K2 <TL;w+jhhInsufficient stack for argv[]+SS+ULP>62t7>ͫu/;u&.6.6666 6I26G2Z >:2tV> ͫuN.6.6.6.6P6I26G2Z .6.6P P - P80387$,TA@4ı=@r-@ =r-UF2F2]UV+V K2F+F ]UvvF&d `ڌ;u#;u&D PDF<t <tv&L p;Vu(;Fu#v&D PD<u v&d v&L ;Vu ;Fuv&d v&D t6Pv&D&TY u&d v&D&T&&T&Dv&D]U]U]UF ▸4;t;tF@4PPPFPZ FF FPPFP F#t@4PRRVRZ FF<tG<tC<u$~t@4PFPPFPZ F@4PFPPFPZ F^*uu F#tNFv^&F<t^< tZF;F wM+FF tx1F v vv FP F=tP|F]UPF v vv FPZ P|F;F s >xuxFY]UF FPF#t+]_mwARGput_parmUS6&(*&7&G~6M6u>&v6tF6&6&&D*Y]scan_args U+PPVR$~t F@"$$FFH|Zv$HFF@~9vvFP$~t< F@"$F;F}FNjF;F}F릋]count_args UP"+  +P8 "F%t+VFY]set_up_args Uv6*,6&( &P6*&&D$]UvF`+vF"}++}vvF&D t&D t VYYv&D PDF<t<t v&D Pv&D F+&D VN;u;t!;u;t;u;t 3.FV;u;t ;u;u 33tBVVFPVRVRVRVRv v vvtF~tFVFVvvvvvvvtv&D tLFtFt v&L Zv&D u &D uxv&D&T&&TFt+&L $FtFuFuv&t&tYYv&D x+FV]U^ F㑋Fʖf ֒]0U xF+xFv&v&Fv vF&Vv&^*+tfat"bumrtEtuiutVwt~~tuFv&3ҊFxt~t-+xv&<tPvv0|+Pvv|F>xt v&FxF]UFv惼jt F~v~vxFFv捄`F^FV]UvvFF &D ~ u&D ~ u v&D  v&D ~tv&L ~tv&L @v DF<t<uF~tv&L ~tP+PPv ]U 3tBVVFPVRVRVRVRv v vv?F~t FF FVF Ft'vvvvvvvv&L &DFV]USFv6DF ꖁv^DPv&&TPv&D&T& &t t uxn]U6HFV;*F ▋ uvcF;F}F֡6=2}66HP@xfF]UF vVS vS vDŽDŽ]UF=u[=tV=tQF=t= u QF=r=v=F=t5=) t0~u+F=t= u~u ~t+P]Uv&<[uC&DFxuF vv+~uA+SPPP62RuFP~tF TFP~tF vv+~uA+SPPP64QvVuF#tQvvv+~uA+RPPP62RuFP~tvF]Uv vv]U+~uA+уrvv1"t+F>xuw~ uF ▀ F F vv+~uA+SPPP^ *0RuFP,~tvF]U+~uA+уrvvu"t+7F>xu~ uF ▀ F ~ u3F vv+~uA+SPPP.6:7F vv+~uA+SPPP^ *0PuFP7~tvF]UPFPvv+~uA+RPPP648PvPY]tmU+~uA+щVBF ~uA+щV;Vw FVF+]HEAPCODEoffsetUF+҉FVF +FV++FV}vvP,FFFV]sub_ptrUF+҉FVF +)FV~}vvP,FFFV]each_chunk U FHPv&+RPV"uvvP,9v&D&TFVV^ ^vFvFFVFVF Fu]each_item_in_chunkU PvvXv&tVFV&^&;Gt$SP,vv^^ vv^^ "vv^^ FVFVv&|u] each_allocated_itemUFFU PFV#u#tRP^ ^]USU+Pvv]USv&|Du6v6t6D6T#u#t RP6\ 6\FVv6t6D6T]each_free_itemU BDFVFFvvF&|Ut VP,v&D;Fu &D ;FtvvP,FFSv&tVv&L&;tvvP,vv^ ^FVFVv&D&T FVF FtV]remove_from_free_chainUv&|rY&D &T u&D&T BDv&D&T &t &D&T v&\&D #u#t&T &L&W &O]US]insert_into_free_chainUv&tVvV&|t&|UuVEv&Dv&D?v&#t^PVFV&|UuGVv&Dv&DvF&tVvV^&G&vvZJv&|r@BD^F&\&D #u#t Ž&w &Wv&D &D6BD]search_free_chainUU0PtFFfFV]USv&D^6;Gr 6w6Gʋ]normalize_relativeUFVFVN v NvN;Nt RP P,FV]insert_chunk U+v&D&TFH&L&\;Hu;FtF&w&GFVFHv &DU~tvvVRF V v v ]add_new_chunk UF+FV+VQRPԊ*҉FV++}FV-} FFvvFV uvvFF&&D&D&D&D vF&&DDFV-&D&D&tVvV^&G&&D&Dvvvvj]malloc2U >:tFsF~v+ FvxFV uvv`FVF Fuvvv&D+FF=w &DFFFv&D-P&DDL&DF&DPV FVRP^^ vvvFVN& ~v?F&D&DU&DL&TPVN& vv FF>:ttFV] zU]hmallocU+PRvvvV><t%#u#tP#v;PFV]mallocUv6>]possibly_free_chunkU]errUSv6t6tP,nfreeUF FuFFVFV>:tsv&|Du#v&DFPvvq&F;Ft~v&DUV5vvV>:tf]check_heap_integrityUU PU% Py]US]US]HEAPCODEbefore_freeingUS Fv6T ;vVNv~v6D;Fu 6D;Ftfv6D F6T;vV~sFnv6D6TNvFVNFvv~]reallocUvvFF^&G*F^F&WVv~JvvS +JUI Pvv VFV>u9>t2UI PvvVFV>uFF ><t6vF#u#t(&D-FV;v+ʠ;FV]creallocUv v&t&4v&&TF]U^ *#t ttZF =F FPvVP|vFVFV v v`F PPvVP|vFPP|vFV+FV FV RPP|FV ]U+~uA+BV~ uA+BVF;rV;rPv v vv]UF#tx]U~v0F*T#tPv|]UF*P ]UPvvPPFPj #uF*Y]UvvYY]U66YY]UxFxvv|>xu FxFxFF]UF#|=~FxF+xvvF&d &D u&|tN&D t&D t&D t vvYY~u&v&D t&D t&D uv&D)F V vv v v&D Pv&D&D&T&&Tvv v v&D P>xu FxFxFv&d F]U vFvFR+QQ&D PFVv&D tC&|t<&D t&D t&D uv&D)FVv&D++NvFVFV]U+PPPvve v&d ]UxF+xvvF&D uFv&D @u&|ui&|ub>u[&D tR&\&Pv&D&TRP&D PD@v&DHucv&D&T&&T&Dv&|uV&D tHv&D uP&t&t&D PDv&Dv&|uv&D&T&&T&Dv&|&D=t&D&T&+&T|v&T&uk>v&D&&T&LA&\+ىFV~uA+Cv&\v&DH&T;~&&T–&:uv&D&;Du&D3v&DH&;Du>u&Dv&&T&+D&T&Dv&|uv&|u$>u&DN ++}v&DHxv&&T&+D&TFV&D+FVFF V;sEv&4^~9v^& BV)V Fv&)D~>&u~ vv&L >xt v&L Fx] U vvF&D u x&L Uv&D t vv4v&d &|u&DF n FV"| ++}xF Fu+vvvvv+~ F]UFfFV++|"}+<;vFV<]Uv vv ]UvvS ]Uv]UVWv~ N+rt@H_^] U!&l<MT, PO]UF;"~"]U>$t PO$"#~ V;|F ]US&v6D*6T+ЉVRFPv\S$FP$4FPq$FPFPdv~v6DFFvBFVs*$FFv6LF06\6@FrFF=} F뵋v6Dv6\6x0t+F@;}6D]US Fv6;D|vV$.6: .68 uvFPFP$.6> .6< v\S$v\Sq$v\S$.6B .6@ r@v6D#t-\S$D P$4v\Sq$v6D]U6FPFPdv~v&<tFPdF#}*@F#t.PFPFP$FP$FPq$FP$.6B .6@ sFP$D P$4FPq$FF**F#t0PFPFP$FP$4FPq$FP$D P$s+FP$.6P .6N 4FPq$NF^*Et Gt"etftgt"FF+ F@P FV;|Rnx00~GG FvB^~&AFF~~Fv&]UvFPL Sq$] US|=tX;vR4 TY]US|=t =r|Y]USVvV$.6: .68 s&vV$FvVq$P-ztP+ ztP VlY]USPFFNF;Fv.0tF+ҋN+;u;uzu v/.uNFHv6DF+F)X]USzuzu v6\V#tPPPzu>Tu v6\Y]USP>Z>ot0.v6D~#unv6TZ;}A+;rЉVʋZ\1Bv6TF)~6|t<R@@P.v6|t$zu>|t Xzu v6D^v6DZ;|R\Pv6DZ;~ +RP v6D#tP0P~#u/v6|t"Z#}أZ~#t5;~'v6tV$.6: .68 uFv6|t$zuX^9PR X~@@X^PT uZ)~~v6T;rЉVʾ\0)~v6T6|t PPd^PT P6ZP v6t0Pv6|u~#t PP ]US F\/>ot FƄ/.F~#u~v6T;rЉVʾ]^/V)~FHv6D6|t Pv^v6t0Pv6|u,~#t%PP ^FHP0PZ#F-#}@ZF+ZFF"Z #}у0v/ZNF>Z׋F=|ϊVv/^6W.@@P.V]USF>uFF^*Et=Gtet3ftXguX>~tQzuFZH=|;~~n~D(FfZ#~~;r)~ Z~]USZ#}؉FFF FF~co@*~@@F]U.W>~u~>uFFFPv6~vvv v vvVRvZF#tP4 vFP>~u zuFFFo^*Et0Gt2et&ftgt#Z;|~o*+$>~uX`ZH=|;~~ HXBZ#~o*~H3;~uAʉXo*~+Z@X>~uXXTv>Tu] ??? A00.UFVFV~tAV+~ uA+щVv ~N;s+~FV]U>52uN #u3N F+؋F+}fFf+fv fff]^ VF"tĊ*ߊ*r #uP+RPv v dYv^;wu ;vI^ v ++ґ]Uv v vv֋]U>52udV V#}+ҋF V RPRv V1V#}+ҋFVRPRvFt+ʋFt+΋]fFff~ fff]Uv v vv#}^ v ֋]Uv v vv֓]U>62t66 6 V@t}6 \^FvF3&L&;OsBV#t^FvFvF^Fv&Dv&+DF=@&| t#~u6 >  F#t PvvDv&D ^&:G u2PSvvD"tkPvvDv&L&DNv&| tPvvVDDPvvvv"Dv&D v&| t PVhD ~uv> 66 K<]UFFv vPPVR HtFFFF]UPv vvF]UP66vF]UF Fu+N+~uA+щVv v RPvvF N+;u;tFFF]UP66vvF66PPpRHtFFY]U]U>62t66 6 VgtK36 &D &:DtB&T6 &| t  :6 &D2> 6 &|t 6 VD6 &L6 &|r66 D6 &L6 &|rV\PSPS+6 &L+&t++>@+v~ #}6|FP66 D6 &D>  F6 &D66 K<] CDOS_ALLOC sysallocU>t-++FV|v6PF#t%vPF#t +FFFV]sysfreeUvvF++ɾ+Q]allocated U]least_free_memoryU]U!<v> >62uH6 vF&D%&D #t&d v&& D& D& D@&D #t&D ]U6 ~>62u6 &| t&| uv&L  ]UF0FdPFP6~PP9]U츌P]HEAPMGMT - heap error # Aborting...)*** Cheap-heap linked in => no heap dump.U*>62t66 6 Vbt 6 ~6 vF~u&| t >  3ҊFv&:D tBVF-?&D@FVFPFPFNNFPZD~s~wv~~݀r'FFFFPFPFPDv> 66 K<]UP\6P9]U +| ]U ]UvvF&& D& D& Du+&D&D &D hv&|r:&D2~Hv&|s>VDFv&L++| F&)DFv&+DPVDv&D]#***Floating point stack overflow***Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] Uv~ 3ۋN&CC] UvN 3ۋCC]U~3ɋE]u=u Ëދ3҃sArE]u]U~%UUU]U~m]]]U~N BE]ur֋3ss 3ɃE]u]U~%UUUUU U U]U!<>62tvvt66 tvv66 |]Ut6&d 6&d 6&L @6&L @t 6&d 6&L @]U/66|6vF&D &T VYY uȋ]Uv&4FFVPvD6PPvD]UvvP<MT,PO]U츢P]U6P9]ː***Program aborted.******STACK/HEAP OVERFLOW***UPv v $%GFA<~v F% F^wV.Cafaf{{v&&DNA&DN~v&Y]Uv&&T& D& T u+ v&D-?]Uv v $vv]Uv v vvq$]UnnormalInfinityDenormalUFVNv6]˸;u;t >% ã.Û>P%A=@t=XÛÛÛ.2636&-6&-.:Л&=۾֋6&-6&-uܛ6G6G6G.ˋܛ6G6_&6_&6_&?6_&/3tr@HÛ˻ >.˻>ˋ6_&76_&'U~ UM]~tctgE ?uƀtE E Պϊ܊2҃t΀UM]]E E U~ ]MUu?||qĊߊ͊ցst F&E t΀ ~UM]]3333ЫثU.>v .>v.3ۋˋЫ#tث#tʡЫ#tګ#t ڃҫ#tث#t ڃԫ#tث#t ҫ#tګ#t Ы#tܫ#t VQS3΋ޡ֫#tث#t ԫ#tګ#t ҫ#tܫ#t Ы#tޫ#t ֫#tګ#t ԫ#tܫ#t ҫ#tޫ#t ֫#tܫ#t ʃԫ#tޫ#t ʃ֫#tޫ#tWU.~EEEEu M ]] U 6 ~6  v> ]U>62t 6 &t 6 &| u&t ]U]U>62t 6 &t 6 &| u&t ]U>62t 6 &d  6 &D ]U!<6 > ]U!<>62tvvt66 tvv66 ]Uv .>v+؋U&.>u>u>u >u;.w rB;wr:>;>w0r >;>w$>)>>>. u*uu>u>tUL&r~&r&;.w rP;wrH>;>w>r >;>w2$u Ë3u L&&]+~& &]&E&u] ;.wr;r+. u uuvr;.wr;rPLrU>62t66 6 Vlt6 &| t&|u6 >  u+[6 &D F&TV:u5 ~P66 FP"D3:FtBVFFF*@]UPFF Y]UF@FF;F}F]UFz~F s3F ꖍFPv$vP$4FPq$n F~ uv~]?Uv&4FFVPvD]U6PPvD]U !<>62tvvHt66 tF3v&| vBV~~FFrv^&$v^&FFPDv~FPDFPDPFPFPDFFPFPFPDF#vNoF>@v> 66 K<]U.>62t66 tvv:t6 ~F-?F~t v&D v&D ~?~FFFFv^&@ sFF#}Z=?~R?+RFPDv~F Fu~ u~wFFFԈFF~t1F FuFV FҋF+VًF+҉FVF Fu F FuFFFvFڋV+ҋJ+ ؉Nډ^ u +FىB+vFڋVܹ B+PQvvښFډV܈FًF#vN럍v~FrF*䖊F^&F*䖊Fٱ^&F<sF ]UP]&Cheap stack dump linked in => no dump.UF V 2~tDtHE ?]ƀtE E Ԋ2t΀UE3E]E E U~EU]?|I=Ċ֊t€t C2E t΀ ]333U>62t66 t-tFtp;u ; uFAd6 ~FF~tN@=~u v2uNN~uND ~rN%V* ЉF]UF>P2t=t P ]U~u] vFP,F uqv~N^Y~u ЉFVsjjj ^SvNF,jjFP/F uF^&G Z&W F&GF^SvFv UFPFP"4V^&?{t@&?[uT6`2:!4t. FPQSVSVQ^[Y=Xt ],N~] t&<X2u>V2uV2PP(~u<V2&G& GujF P,F u|FV2&_^ F &FF #t+ȉNF V F V )NF V2&GZ&WF^ &F FN;s^ S+P F uHF^ &GF^ &GFF9Fr$^ X^F&^&GFuԸZ2>X2u>V2uV2PP(V2&_^F&G;F s FP^Sv ؎F@P>X2u>V2uV2PP(V2&_^F&G;Fs 2Z2v^@R2T2^&O&R2&GUZ2r V2&_S^SR2S]^&v ^ &Gv&L@^ &;vS&O+P0F ud^&O&7^ &y^Y^&G^ &w&^ &G^&^&G@^&G^ &Gv&D@^ &G ^&v ^&&G^ &;Gthj ^ &G@v&L^ &;vS&wF+PiF u^^&O&7^ &y^Y^&G^ &w&^&G@v&D^&G^ &G@v&D^ &G 9FsF^&&+GFSv+FF9Fw^SF+FPF%FPvFPF=t5v(^&%FN;tFPQvP( FF^&F^&OANFF;Fs"^&@&PFVFFFFFFF;FwFFF;Fs;^&@&PFVF9Fv9Fw~t FFFFF뽋v^&@&PFVFN;s7N0^~9^YFFvFV^&@&PFFFF@F^&GFF;Fs@^&@&PFV~uFFvFV^&@&PF^&+FFN@;vjvFPF=tCv(vF#^;Vu&#+ЉVFNPQjFLNFȃ#ʉN^QN+#QF uFP+F%Y+ȉNFF^&FU^SP u].24s].2]U^SP u].24s].2]U^S!P u].24s].2]U^S#P u].24s].2]U^S%P u].24s].2]U^ S)P u].24s].2] U^ S*P u].24s].2]U^S7P u].24s].2]U^ S8P u].24s].2] U]. 4U]. 4U].4U].4U].4U].4^&G :!3tSv^ S^Sg <^SFP4F u'^Sv^ S^Sg F!3^&G F^ &&W^&^&O :4v^&z4Vnjޱ;u$:u04r)4P+PjRPQhrmRPQF u(^&G :3u 4FF^S u ^&G s<&G s4~u ^&"^&G ^G ^ &Z&W^&}^&G&;Gr$Sv^ S^S9TF uX^&?uL^&G&O+;FsFF^&^&FFv&t^^ &Z&W^F&G FFN F;vP~uJ^S+QFPFP F t tu.^ v8vNFYFF릋F^&F^&G :!3tRS^ Sv ^S F(5sm@4Vnjޱ;u$:uH^STF9^SFP4F u'^S^ Sv ^S F!3^&G F ^&^&O :4v ^&@4Vnjޱ;u$:u7Z4r0(5r)@4P+PjRPQhwmRPQF u(^&G :3u 4FF^S u FFN F;w~t^&W&;WrS^ R+QFPTFT^&G&+GFV N+;sV^&FF^ v0~&}^9N^Y^F&GFFcF^&FU^&G :4v ]U^&G :4v ^&G ]U^&]U^&]U]U^& t^&G :2u &G& u]UQF =rmt =tmt"63rmP'443^&G ]UQF =wmt =amt!63v '443^&G ]U^&G :3t ^&4SP(]UQ^&^ &&W^&G :3t 4S)T]U^&G :3u4Sv* ]U+Zr tH]j&j^S/ u ^& +ZrHU3 &L&;Wt]U#tH3&GtH] 6r"^&&W&G4&G;F s Wv 4X^F&F&GFFF;FsN ;Nv4&@FFڋF;Fr ,4v@^&Z&WS4&_[&GU|s]4&G@] ar 4&G;FsGv4X^F&F&GFFF;Fs4&@FFFU>4u4P u>4t4&G44>4u]ð]UQQ4P455P uJF64P u85=u04P u!F64P u4=t=!t3]^ &G :=4uSvv^ &G :!3tWSvv4n 3^ &G ^ Svv4FNs=u8^ SFP\~u#!3^ &G ^ &dt@Fs2률!3^ &G F,^ &G :4r^ &G :2tw&G 9Fu9Fu^ &G&WFV^ &G&W;Vu;Fw3&G^ &O^ &O^ &O&W;Vu;Ns+^ &r &G&;Gwe^ &G &W"N~;u;wL&wщFVN;u;s&+O &"N։~؋F^ &G-sS<F u^ &G-sG<PFPlF^ &G-FVFVF%Ff^ &G^ &G^ &GNV^ &O &W"^ SPFPFP<F u4F^ &G^ &G : 3t :3t^ SjDF t^ &G&G &W"FV&9Wu&9Gw&G&W9Fu9Fu^ &G&WFV^ &G&9G*s&G*^ &FF^ &G@1&@FތFF^ FV&9W"u&9G v&G*H1Fܺ&G &W"N~;u;r_F&+O &"N։~؋F։F&O,r&9G*sSl4F tF^ &G^ &G*&;G(uF&G(F^ &G* ^ F&9G*s&G*^ F&9G(v&G(Fr^ Sj$tF u^ Sl4F uy^ &G ts&w8&SP^ &w"&w G<P^ &w: lF t@^ &G-^ &G &W"&G4&W6^ &G&G.^ &F&G0Z&W2~Yt^ &G@1&W^ &w&@F&Z&W^ &GN^ &O^ &OF~+&G &"^ &G&G(^ &G&G*^ &G,^ &Yti&w8&Sh^ &w"&w FP#Fu^ &?^ &G,(~t^ &G&GF^ &G :3t ^&FF^&G &W"&O*&;Wu&;GrI1&G^&G*1 uSj$tF u`^&G@1&@FF^&G*1&G &W"FV&w8^SQRPFP#FtK uX^&G*1V+^0^~&}*9^Y^&G*H13^SjtF u/v&|*&L+^9 ^&G*&G^&G,^ &G :=4uS^SzO^ &G :!3t S^S<6^ &du2 3^ &G ^ S^SF!3^ &G FU^&G :4r^&G : 3t:3u^&G&G &W"^&&Wc^&G :2uX&r&G&;Gv &G&W^&G&G &W"^&&W^&G s7&G s/^&/&_!^&G :3u^&&G ]^&^ &&W^&G :2t ^S<F uk^&G;s]@1V&G&G &"F~&w8&XSv^&pWPG<P^&w:lF t@^&G-F^&GFrF@1V^&G&G &W"FV&G-sG<PFPlF^&G-3^&w8v&XSv^&pvvFP#FNVF׉NV~u t%^&9Wu&9Or&O&WFF t ^&Gv^&@F&Z&W^&GFV^&G &W"^&G&W;Vu;FYvF&GF^&G8^&G^&G&W&+G &W"FVF&G^&uFF^&G :!3t SvWD6^&du2 3^&G ^SvWDF!3^&G F^&G : 3t:3t :!3t^&G&G &W"FV&9Wu&9Gw&G&W^&G&9G*s&G*FP&t@"FP$tF u^&uSl4F t^&w8&S^&w&w"&w G<P^&w: lF t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2^Sv$tF Yu,^&w8jGPj ^&G :2u ^&G : 3t@&& tA"F&G :!3uC&du2 ^&du 3&G ^&G-sS&G :2u0G<PFPl1^&G : 3t:2t:3t ^G<PFPlFF^&w:FPL u ~u~uߊFs^&w8jGPj FF^&w8 F^&w:)F^&G F u F uFF :r10^&Fr^&0FFF 10^v&F@ vvFPF^SvhF^&:F@F^Pvj]FF^&:F@F^Pvj6FF(FFF^SvRQPNQNQP<F u$F t^ SNQvNQPjF~uVFF^S +PvFPlF u2~t,^S +PvFPlF u~tF;Fv4N+NA^v0^ ~9^YFF+F@^&^&<{t<[tF FF^&^&?{uFS +PvFPlF uoF sdt_NAv~^YF@^&^v&48 + ^& ^S+PvFPlF u ~uFHN;v9@N+^vp^~&=9^YF@N+^&CFPF u^&O@wA^~&=9^Y^&G@^&^v&48+^&v&4^P^&wg&we^&^v&48+^&"^vFF^&F^&G^vNFY^&Gw^ &Gj^&GyF^&^vNFYFPF uQ^&G@^&^&O@wA^^Y^&Ƈ^&Ƈ^PF uN^ GkP^ &PFPFPjLF u#FPvhjj^Sh+Pj Ⱦ^&G F =wmt =amt^SvFPFPjFLF uݍFPvjjFPQ؍GPQF!t=u~^&Gi^GePF9FvF^kvN@YF^&^S^Sv^SFPLF tF~u;^SvRPPRPF=u^v&xF^&Gi뾃~t<džCFEGv@CPEP}FF7^SFPvRQjv PvF u 3^&G +s ^&G8^&G8Fvj^ Sj7F t^&F^GkP#+P^&PFPlF uFt @^&F^& ^ &Ow~&=^ 9^NOY^ &G^&F t$@^wk~ ^Y^ vx$+/+~ B^&G :3t 3^&G ^SFPFPPLF u^SrTF u}^&FFvN^S^SvmLF tJ^G8P^SvRPjhmmdF u"^&w8F t^&w8 FFU^&G :3t ~v F^&Gj]Uv&D ~&] ~&] Y]^ &dtZSFP^& uV^ &du&G-sG<P^Sl^&^ Shwmvv^& u 3^ &G ^&^ &Gd<tN<uShD^& uH^ SFP^& u/^ Shrmvv^& u2^ &G ^&U]. 5]U#U$VWQ^S<Y_^F^OGG w 3GGG؉GGGFG F GFGFGFGFGPS]UU^ SG PPFP\[#uMG~&wr/^ F%;u^ ^ FF;tX F ;FuX] ^&^SP$tF t^&G t~&w8&SP^&w"&w G<P^&w: lF t@^&G-^&G &W"&G4&W6^&G&G.^&F&G0Z&W2~Yt^&GFu^&G@1V&G&G &W"F^&Gv^&@F&Z&Wv^&@&G^&G*^&G(^&G^&G, ^&G : 3t :3t F^&G-rG<PFPlF^&G-^&G0FF^F&G4&W6Ft.H^&O.+N^v0^9^Y^&O.N^F&)G.^v^&G0Z&W2F^&.uF tuSvtF tF^&G0FF^&w8^S^&w.&w6&w4FP$FFt.H^&O.+N^v0^9^Y^&O.N^F&G4&W6^F&)G.^v^&G0Z&W2F t ^&.u%FsFr^ShtF u^&G : 3t :3t ^&G&WFV&O&O &"N~;u;wN~Fs FF%5 uG^&w8>5 u4^&G&G^&G-^SD>5^_]Uz+~F =amt =wmtO+F^PFPtF u1~Ps &F^&G3^&G F^&Z&W]U ^&^&G :3t ^&FF^&GF u^&O;wINF FF)F v ~^Y~ Nu+JVFt)N+^p^9^YN^&^v&FPFPtFv u^F&L]U^ S^S]FFFFFPFFFFP<FFFF^FFPFuFF u)vFPFF^&F^ &Ȇ^&^&G :K3t W^&G<t':t!&OFPsFr^&G^&u2F ^&~ t^ &?utPPP^ Sv  _>D5u!D5FPF u ~ rD5B5 @5ujj@5P/F t^&GF@5&8G wF@5X ^Fv&DF&GF&GF&GF^&GF&GF&GF&GF&G F&8G uANsNQPPF t FF^&#tF ;Fv F&O#F ;Fw FrF9F w~^ &FF^&O&@^&G^&w6 FA:r j,F~uv&<tF~to~tEv&<u<^&?~6t'~tv &*6 v &*6&4v &^&~tv &F^ &^So,PvFPlF uFt^ &FFF~NuV~u ^&P ~u^&726P^ ST~u8^&w&726P^ ST26F^~Hu2Ft tuS^Sv26P^ ST26F^~Du_~uFPF~u^&&WFV, PRPvvv26Pj ^ SF26F^^S^ &7^Svv^STFU5Pj&"d,(     <JBQ3:6 6?ADF]'a ''- +;!-f"+#7$*%*&I''a(,)*?+,-'.7/F0"N1p23%456"78.9?andattribute has already been set.Unable to open always set for Code segments.LoadOnCall, ReadOnly, Shared, NoIOPL, Discardable, and Movable always set for non-Code segments.LoadOnCall, NoIOPL, Discardable, and Movableis duplicated file name on command line.defined forOrdinal valueError Token size exceeded:Name or Library statement must precede all other statements.ignoredhas been defined as an initialization procedure, but not exported.Internal entry name required with an ordinal entry.MinMathInstruction should be 8087, 80187, 80287, or 80387.MinInstruction should be 8086, 80186, 80286, or 80386.Librarian00Yes16[Sys]Librarian.RunLineInvalid LoadSpec in LoadType statement.should have only one input file.missing input file.classCode statement should only appear once.Data statement should only appear once.is multiply defined as an exported entryname.HEAPSIZE statement should only appear once.is multiply defined as an internal entryname.LoadType statement should only appear once.ProtMode or RealMode statement should only appear once.Run specification should only appear once.RunType statement should only appear once.Multiply entered segment specification should only appear once.StackSize statement should only appear once.No errors detectedImport library not created; Input file did not contain Exports.No warnings detectedError detectedWarning detectedErrors detectedWarnings'pwords' field ignored for segment'pwords' field required. is self-referenced modulename.Module-definition statement expected.statement ignored.Unrecognized construct.is not recognized in this context.Identifier truncated toWarning detected Unspecified error message.;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: mc0_dll.asm *; ;* *; ;* MACHINE: NGen/SGen LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION: first.asm - CTOS segment ordering *; ;* *; ;* NOTE: MUST assemble using -MX for case sensitivity *; ;* *; ;* MASM -MX mc0_DLL.asm *; ;* *; ;* Linked in first in order to get proper segment ordering. *; ;* *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* 04/24/92 SRE Added some missing externals for non-PM MSC Dlls. *; ;* 02/27/92 SRE Added a NOP to top of main so that we can at least *; ;* set a debug statement before running. *; ;* 12/12/91 SRE Add comment about assembling with -MX; C_INIT to *; ;* uppercase; *; ;* 10/11/91 SRE Remove hideous Tom Ball stuff for cbHeap. *; ;* 06/11/91 SRE OS sets up registers for us; work around OS/Linker *; ;* problem with cbHeap. *; ;* 11/13/90 TAB Created from MC0_PM.asm *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1993 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; code segments first _TEXT SEGMENT WORD PUBLIC 'CODE' _TEXT ENDS C_ETEXT SEGMENT WORD PUBLIC 'ENDCODE' C_ETEXT ENDS ; non-DGroup'd segments follow. WFONT5_DATA SEGMENT WORD PUBLIC 'FAR_DATA' WFONT5_DATA ENDS THREADDATA SEGMENT WORD PUBLIC 'THREADDATASEG' THREADDATA ENDS LOCKS SEGMENT WORD PUBLIC 'LOCKSEG' LOCKS ENDS ALTMATH_PTD SEGMENT WORD PUBLIC 'ALTMATH_DATA' ALTMATH_PTD ENDS FAR_BSS SEGMENT WORD PUBLIC 'FAR_BSS' FAR_BSS ENDS ; DGroup: BEGDATA first NULL SEGMENT WORD PUBLIC 'BEGDATA' NULL ENDS ; DGroup: segments not of class BEGDATA, BSS, STACK or HEAP DATA SEGMENT WORD PUBLIC 'DATA' public _api_chainer public __ctoserrno _api_chainer dw 0 ; Used to identify a possible parent pgm to apienv __ctoserrno dw 0 ; Used to report CTOS error code from file ops, etc. DATA ENDS MEMORY SEGMENT WORD MEMORY 'MEMORY' MEMORY ENDS CONST SEGMENT WORD PUBLIC 'CONST' CONST ENDS MSG SEGMENT WORD PUBLIC 'MSG' MSG ENDS ; DGroup: BSS before Stack BSS SEGMENT WORD PUBLIC 'BSS' public _edata _edata label byte BSS ENDS ___BSS SEGMENT WORD PUBLIC 'BSS' public _end _end label byte public _MemoryEnd ; used by DOSCALLS.LIB _MemoryEnd label byte ___BSS ENDS ; DGroup: Stack before Heap STACK SEGMENT WORD STACK 'STACK' PUBLIC StackBottom StackBottom LABEL WORD STACK ENDS ___STACK SEGMENT WORD PUBLIC 'STACK' public _end_stack _end_stack label byte ___STACK ENDS ; heap must be last so WinCreateHeap will work properly HEAP SEGMENT WORD PUBLIC 'HEAP' public _st_heap _st_heap label byte HEAP ENDS ___HEAP SEGMENT WORD PUBLIC 'HEAP' public _end_heap, _end_mem, _Heap_End _Heap_End label byte _end_heap label byte _end_mem label byte ___HEAP ENDS DGROUP group NULL,DATA,MEMORY,CONST,MSG DGROUP group BSS,___BSS,STACK,___STACK,HEAP,___HEAP dataOFFSET equ offset DGROUP: ; Microsoft C pre-initialization extrn C_INIT:far ; Microsoft C entry point (LLIBCDLL.LIB) _TEXT SEGMENT assume cs:_TEXT PUBLIC _main_dll _main_dll PROC FAR NOP ; Added for debugging (can put Debug here) call C_INIT ret _main_dll ENDP _TEXT ENDS END _main_dll mc0_DLL.asmDGROUPMEMORYBEGDATA THREADDATASEGENDCODE___BSSLOCKSEGFAR_BSSC_ETEXT___HEAPFAR_DATA___STACKMSGBSS THREADDATADATACODEHEAPNULLSTACK WFONT5_DATALOCKSCONST ALTMATH_PTD_TEXT ALTMATH_DATAHH H HHHH HHDHHHHTH HH  Ȍ C_INIT _api_chainerv_end_mem_st_heap _Heap_End _end_heapI _main_dll _end _end_stack: _MemoryEndX StackBottomِ __ctoserrno _edataҠ O _&hBCS 0x00200000L #define ES_MIXED 0x00300000L #endif /* INCL_NLS */ #define WC_COMBOBOX ((PSZ)0xffff0002L) /* * combo box styles */ #define CBS_SIMPLE 0x0001L #define CBS_DROPDOWN 0x0002L #define CBS_DROPDOWNLIST 0x0004L #define CBM_SHOWLIST 0x0170L #define CBM_HILITE 0x0171L #define CBM_ISLISTSHOW;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: mc0_pm.asm *; ;* *; ;* MACHINE: SGen/NGen LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION: first.asm - CTOS segment ordering *; ;* *; ;* NOTE: MUST assemble with -MX option for case sensitivity. *; ;* *; ;* MASM -MX MC0_PM.Asm *; ;* *; ;* Linked in first in order to get proper segment ordering. *; ;* *; ;* HISTORY: *; ;* *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* 05/07/92 SRE Added __ctoserrno. *; ;* 02/27/92 SRE Added a NOP to top of main so that we can at least *; ;* set a debug statement before running. *; ;* 12/12/91 SRE Converted _BUILDENV and __PREASTART to uppercase; *; ;* added comment about assembling with -MX (for case *; ;* sensitivity). *; ;* 11/21/90 TAB Added startup code. *; ;* 10/08/90 TAB Reordered to match OS/2 segment ordering. *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;* *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1993 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; code segments first _TEXT SEGMENT WORD PUBLIC 'CODE' _TEXT ENDS C_ETEXT SEGMENT WORD PUBLIC 'ENDCODE' C_ETEXT ENDS ; non-DGroup'd segments follow. FAR_BSS SEGMENT WORD PUBLIC 'FAR_BSS' FAR_BSS ENDS ; DGroup: BEGDATA first NULL SEGMENT WORD PUBLIC 'BEGDATA' NULL ENDS ; DGroup: segments not of class BEGDATA, BSS, STACK or HEAP DATA SEGMENT WORD PUBLIC 'DATA' public __ctoserrno __ctoserrno dw 0 ; Used to report CTOS error code from file ops, etc. DATA ENDS MEMORY SEGMENT WORD MEMORY 'MEMORY' MEMORY ENDS CONST SEGMENT WORD PUBLIC 'CONST' CONST ENDS MSG SEGMENT WORD PUBLIC 'MSG' MSG ENDS ; DGroup: BSS before Stack BSS SEGMENT WORD PUBLIC 'BSS' public _edata _edata label byte BSS ENDS ___BSS SEGMENT WORD PUBLIC 'BSS' public _end _end label byte ___BSS ENDS ; DGroup: Stack before Heap STACK SEGMENT WORD STACK 'STACK' PUBLIC StackBottom StackBottom LABEL WORD STACK ENDS ___STACK SEGMENT WORD PUBLIC 'STACK' public _end_stack _end_stack label byte ___STACK ENDS ; heap must be last so WinCreateHeap will work properly HEAP SEGMENT WORD PUBLIC 'HEAP' public _st_heap _st_heap label byte HEAP ENDS ___HEAP SEGMENT WORD PUBLIC 'HEAP' public _end_heap, _end_mem _end_heap label byte _end_mem label byte ___HEAP ENDS DGroup group NULL,DATA,MEMORY,CONST,MSG DGroup group BSS,___BSS,STACK,___STACK,HEAP,___HEAP ; Microsoft C pre-initialization extrn __PREASTART:far ; set up command line extrn _BUILDENV:far ; set up registers extrn __astart:far ; Microsoft C entry point _TEXT SEGMENT assume cs:_TEXT PUBLIC _main_pm _main_pm PROC FAR NOP ; Added for debugging (can put Debug here) mov ax, DGroup mov ds, ax call __PREASTART call _BUILDENV call __astart ; never exits _main_pm ENDP _TEXT ENDS END _main_pm mc0_pm.asmvDGROUPMEMORYBEGDATAENDCODE___BSSFAR_BSSC_ETEXT___HEAP___STACKMSGBSSDATACODEHEAPNULLSTACKCONST_TEXTHH H HH DHH H H TH HH  #__astart _BUILDENV __PREASTART_end_mem_main_pm _st_heap  _end_heap _end _end_stack> StackBottomݐ __ctoserrno _edataҠUؚʜ& &&hv FPPRPQRPQRPQ6mF]UF@vWv FPPNQPNQNAQNQP6mFFvBv FPFVNQQPQFPQ6mF]UQQFP6ZF uvvv6l]U FP6ZF u vv6l]UFFFFFsFFvRPQ^SWRPQRPQ6mF]UQQFP6ZF u(v^Sv^Sv^Sv ^Sv6m]U&>u6mF tPFPP6ZF . doshugeincrCTAsm x12.2-FSF-III; ??SEG??SEGh= DosHugeIncr__AHINCR DosHugeShift __AHSHIFTՊt DosStubs%DGROUPDATACODE PMSTUBS2SEG_TEXT>HH-H`h GETPSTRUCTURE_end_mem_st_heap _end_heap _end_stackCTOSALLOCRING2SEL StackBottom QUERYSNINFO4 __push_regsdomysetdomypopdomypushCauseInterrupt _BUILDENV __pop_regs fDebugѠ[UjFPFPP#uvjPPFP#uFPȸ&uGWø-&6&&&[X_&>SS[]UUXQRNVSVWRQP]ˋYZNVXuu_^[ZY]Ɯ.&!&?&or|ĀĈ+Uؠ t]H  t INITSYSTEMDLL INITSYSTEMDLLSYSTEMW CTOSTODOSERC CTOSTODOSERCSYSTEM DOSGETPID DOSGETPIDSYSTEM DOSCASEMAP DOSCASEMAPSYSTEM< DOSGETCPDOSGETCPSYSTEM DOSGETDBCSEV DOSGETDBCSEVSYSTEM݊ DOSALLOCSEG DOSALLOCSEGSYSTEM DOSFREESEG DOSFREESEGSYSTEMC DOSEXITDOSEXITSYSTEMvDOSGETMACHINEMODEDOSGETMACHINEMODESYSTEMJ DOSGETVERSION DOSGETVERSIONSYSTEMN DOSREALLOCSEG DOSREALLOCSEGSYSTEM) DOSSETVEC DOSSETVECSYSTEM  DOSCHDIRDOSCHDIRSYSTEM DOSCHGFILEPTR DOSCHGFILEPTRSYSTEM0 DOSCLOSEDOSCLOSESYSTEM DOSDELETE DOSDELETESYSTEM DOSDUPHANDLE DOSDUPHANDLESYSTEMۊ DOSNEWSIZE DOSNEWSIZESYSTEMg DOSOPENDOSOPENSYSTEMn DOSQFILEMODE DOSQFILEMODESYSTEM܊ DOSQHANDTYPE DOSQHANDTYPESYSTEM DOSREADDOSREADSYSTEMXDOSSETFILEINFODOSSETFILEINFOSYSTEM DOSSETMAXFH DOSSETMAXFHSYSTEM DOSWRITEDOSWRITESYSTEMɊ___INITIALIZEFILESUPPORT&___INITIALIZEFILESUPPORTSYSTEMDOSSETDATETIMEDOSSETDATETIMESYSTEM DOSALLOCHUGE DOSALLOCHUGESYSTEMڊDOSALLOCSHRSEGDOSALLOCSHRSEGSYSTEM DOSBEEPDOSBEEPSYSTEMX DOSBUFRESET DOSBUFRESETSYSTEM DOSCALLBACK DOSCALLBACKSYSTEMq DOSCLOSESEM DOSCLOSESEMSYSTEM DOSCREATESEM DOSCREATESEMSYSTEMߊDOSCREATEQUEUEDOSCREATEQUEUESYSTEMDOSCREATETHREADDOSCREATETHREADSYSTEM DOSDEVIOCTL DOSDEVIOCTLSYSTEMDOSENTERCRITSECDOSENTERCRITSECSYSTEM׊ DOSERRORDOSERRORSYSTEMȊ DOSEXECPGM DOSEXECPGMSYSTEMKDOSEXITCRITSECDOSEXITCRITSECSYSTEM DOSEXITLIST DOSEXITLISTSYSTEM DOSFINDCLOSE DOSFINDCLOSESYSTEM݊ DOSFINDFIRST DOSFINDFIRSTSYSTEM DOSFINDNEXT DOSFINDNEXTSYSTEM DOSFREEMODULE DOSFREEMODULESYSTEM0DOSFSRAMSEMCLEARDOSFSRAMSEMCLEARSYSTEMDOSFSRAMSEMREQUEST DOSFSRAMSEMREQUESTSYSTEMي DOSGETCOLLATE DOSGETCOLLATESYSTEM,DOSGETCTRYINFODOSGETCTRYINFOSYSTEMDOSGETDATETIMEDOSGETDATETIMESYSTEMw DOSGETENV DOSGETENVSYSTEM  DOSGETINFOSEG DOSGETINFOSEGSYSTEM3DOSGETMODHANDLEDOSGETMODHANDLESYSTEM DOSGETMODNAME DOSGETMODNAMESYSTEM)DOSGETPROCADDRDOSGETPROCADDRSYSTEMyDOSGETRESOURCEDOSGETRESOURCESYSTEM DOSGETSEG DOSGETSEGSYSTEM DOSGETSHRSEG DOSGETSHRSEGSYSTEM DOSGIVESEG DOSGIVESEGSYSTEML DOSHOLDSIGNAL DOSHOLDSIGNALSYSTEM- DOSLOADMODULE DOSLOADMODULESYSTEM. DOSLOCKSEG DOSLOCKSEGSYSTEMJ DOSMOVEDOSMOVESYSTEMs DOSMUXSEMWAIT DOSMUXSEMWAITSYSTEM\ DOSOPENQUEUE DOSOPENQUEUESYSTEM DOSOPENSEM DOSOPENSEMSYSTEMY DOSQAPPTYPE DOSQAPPTYPESYSTEM DOSQCURDIR DOSQCURDIRSYSTEM\ DOSQCURDISK DOSQCURDISKSYSTEMDOSQFHANDSTATEDOSQFHANDSTATESYSTEM} DOSQFILEINFO DOSQFILEINFOSYSTEM DOSQPATHINFO DOSQPATHINFOSYSTEM DOSQSYSINFO DOSQSYSINFOSYSTEMDOSR2STACKREALLOCDOSR2STACKREALLOCSYSTEML DOSREADASYNC DOSREADASYNCSYSTEM DOSREADQUEUE DOSREADQUEUESYSTEMDOSREALLOCHUGEDOSREALLOCHUGESYSTEMu DOSSCANENV DOSSCANENVSYSTEMP DOSSEARCHPATH DOSSEARCHPATHSYSTEM+ DOSSELECTDISK DOSSELECTDISKSYSTEM3 DOSSEMCLEAR DOSSEMCLEARSYSTEM DOSSEMREQUEST DOSSEMREQUESTSYSTEMV DOSSEMSET DOSSEMSETSYSTEM DOSSEMWAIT DOSSEMWAITSYSTEM\ DOSSETFGND DOSSETFGNDSYSTEMMDOSSETFHANDSTATEDOSSETFHANDSTATESYSTEM DOSSETPRTY DOSSETPRTYSYSTEM} DOSSIZESEG DOSSIZESEGSYSTEM\ DOSSLEEPDOSSLEEPSYSTEM DOSSUBALLOC DOSSUBALLOCSYSTEM DOSSUBFREE DOSSUBFREESYSTEMN DOSSUBSET DOSSUBSETSYSTEM DOSWRITEASYNC DOSWRITEASYNCSYSTEMQ DOSWRITEQUEUE DOSWRITEQUEUESYSTEMXDOSCREATECSALIASDOSCREATECSALIASSYSTEMDOSGETHUGESHIFTDOSGETHUGESHIFTSYSTEMӊDOSRESUMETHREADDOSRESUMETHREADSYSTEMՊDOSSUSPENDTHREADDOSSUSPENDTHREADSYSTEM( DOSMEMAVAIL DOSMEMAVAILSYSTEMDOSGETRESOURCE2DOSGETRESOURCE2SYSTEMƊDOSFREERESOURCEDOSFREERESOURCESYSTEM֊ DOSUNLOCKSEG DOSUNLOCKSEGSYSTEM DOSFINDFIRST2 DOSFINDFIRST2SYSTEM# DOSOPEN2DOSOPEN2SYSTEM DOSMKDIRDOSMKDIRSYSTEM DOSRMDIRDOSRMDIRSYSTEM DOSCOPYDOSCOPYSYSTEMw DOSGETMESSAGE DOSGETMESSAGESYSTEM-DOSSETPATHINFODOSSETPATHINFOSYSTEM DOSFILELOCKS DOSFILELOCKSSYSTEM DOSQFSINFO DOSQFSINFOSYSTEMX DOSFILEIO DOSFILEIOSYSTEMDOSSETFILEMODEDOSSETFILEMODESYSTEM{ DOSCLOSEQUEUE DOSCLOSEQUEUESYSTEMC DOSGETPRTY DOSGETPRTYSYSTEMq DOSTIMERSTART DOSTIMERSTARTSYSTEMW DOSTIMERSTOP DOSTIMERSTOPSYSTEM  DOSCWAITDOSCWAITSYSTEM DOSDEVIOCTL2 DOSDEVIOCTL2SYSTEMҊDOSKILLPROCESSDOSKILLPROCESSSYSTEM DOSSGSWITCH DOSSGSWITCHSYSTEM DOSSGSWITCHME DOSSGSWITCHMESYSTEMFDOSSGSWITCHPROC2DOSSGSWITCHPROC2SYSTEM DOSSYSTEMSERVICEDOSSYSTEMSERVICESYSTEMD DOSSYSTRACE DOSSYSTRACESYSTEM KBDCHARIN KBDCHARINSYSTEM KBDFREEKBDFREESYSTEMI KBDSHELLINIT KBDSHELLINITSYSTEM݊ KBDSWITCHFGND KBDSWITCHFGNDSYSTEM$ MOUFREEMOUFREESYSTEMi MOUSETHOTKEY MOUSETHOTKEYSYSTEM MOUSHELLINIT MOUSHELLINITSYSTEM VIOGETMODE VIOGETMODESYSTEMO VIOFREEVIOFREESYSTEMf VIORESTORE VIORESTORESYSTEMn VIOSAVEVIOSAVESYSTEMs VIOSETMODE VIOSETMODESYSTEM[ VIOSCROLLDN VIOSCROLLDNSYSTEM VIOSHELLINIT VIOSHELLINITSYSTEM VIOSRFUNBLOCK VIOSRFUNBLOCKSYSTEMI VIOSRFBLOCK VIOSRFBLOCKSYSTEM VIOSSWSWITCH VIOSSWSWITCHSYSTEM DOSEDITNAME DOSEDITNAMESYSTEM DOSSHUTDOWN DOSSHUTDOWNSYSTEMDOSSETSIGHANDLERDOSSETSIGHANDLERSYSTEM DOSGETPPID DOSGETPPIDSYSTEMODOSENUMATTRIBUTEDOSENUMATTRIBUTESYSTEM7 DOSDEVCONFIG DOSDEVCONFIGSYSTEMۊ DEBUGPUTCHAR DEBUGPUTCHARSYSTEMފ DEBUGPRINT DEBUGPRINTSYSTEMPDEBUGPOSCURSORDEBUGPOSCURSORSYSTEMCTOSGETRING2SELCTOSGETRING2SELSYSTEMŊ CTOSQCURDISK CTOSQCURDISKSYSTEMCTOSSELECTDISKCTOSSELECTDISKSYSTEM CTOSQFSINFO CTOSQFSINFOSYSTEM DSSEXECPGM DSSEXECPGMSYSTEMO DEPARGSTOVLPB DEPARGSTOVLPBSYSTEM?CAUSEINTERRUPTCAUSEINTERRUPTSYSTEM__INITIALIZELINFOSEG"__INITIALIZELINFOSEGSYSTEMw __PREASTART __PREASTARTSYSTEMҊ DOSPATCHWORD DOSPATCHWORDSYSTEM DOSQFSATTACH DOSQFSATTACHSYSTEM DOSERRCLASS DOSERRCLASSSYSTEMCTOSALLOCRING2SELCTOSALLOCRING2SELSYSTEMT BUILDINISPEC BUILDINISPECSYSTEMۊ DOSGETTIDTEMP DOSGETTIDTEMPSYSTEM?PMEXITSYSTEMDLLPMEXITSYSTEMDLLSYSTEM DOSVALIDSEG DOSVALIDSEGSYSTEMDOSIFSRAMSEMCLEARDOSIFSRAMSEMCLEARSYSTEM^DOSIFSRAMSEMREQUEST!DOSIFSRAMSEMREQUESTSYSTEM$DOSQPIDBOOSTEDDOSQPIDBOOSTEDSYSTEM DOSSETCPDOSSETCPSYSTEM PLOGENABLE PLOGENABLESYSTEM5 PLOGINITPLOGINITSYSTEM PLOGDISABLE PLOGDISABLESYSTEM PLOGFLUSH PLOGFLUSHSYSTEMERROREXITSTRINGPLOG!ERROREXITSTRINGPLOGSYSTEM;PLOGWRITESTRINGPLOGWRITESTRINGSYSTEMCTOSMAPTMSHANDLETOPID#CTOSMAPTMSHANDLETOPIDSYSTEMCTOSMAPPIDTOTMSHANDLE#CTOSMAPPIDTOTMSHANDLESYSTEM REALLOCSEG REALLOCSEGSYSTEM=&C5-LSDOSSUSPENDTHREADDOSSETFILEMODE DOSSUBFREE DOSEXITLIST!___INITIALIZEFILESUPPORT!DOSSETPATHINFO! DOSFILEIO!w?!0r7)aKZiS DOSGETVERSIONWdomypush DOSFREEMODULE DOSALLOCSEGI DOSQCURDIR3 DOSTIMERSTOPCTOSMAPPIDTOTMSHANDLE DOSDEVIOCTL2 DOSFREESEGM VIORESTORE( DOSOPENQUEUE(CTOSSELECTDISKoDOSCOPYDEBUGPOSCURSOR!c DOSDEVIOCTL!DOSEXIT!PDOSENUMATTRIBUTE!T PLOGDISABLE!DOSCREATETHREAD! CTOSQCURDISK!kDOSFREERESOURCE!+3Sj;$qCK[bxCTOSMAPTMSHANDLETOPIDDOSBEEP DOSGETPRTY INITSYSTEMDLL4 DOSGETDBCSEVE DOSCALLBACK! __PREASTART! DEBUGPUTCHAR!\ DOSEDITNAME!E PLOGFLUSH! DOSOPENQUEUE!( DOSGETPID!< PLOGENABLE!|V-kC3\ DOSCALLBACK DEPARGSTOVLPBzDOSGETRESOURCE VIOSRFBLOCK= DOSLOADMODULE DSSEXECPGMw DOSQFSATTACHPLOGINITDOSSETCP VIOSCROLLDN!1 DOSREADQUEUE!RCauseInterrupt!~ DSSEXECPGM!wERROREXITSTRINGPLOG!KBDSWITCHFGND! DOSQCURDIR!3 DOSERRCLASS!EpX=b /6N'gx DOSFINDNEXTDOSMKDIR __pop_regs DOSREADQUEUER DOSGIVESEG DOSSETPRTYz DOSCLOSEQUEUEDOSSETDATETIMECTOSALLOCRING2SELDOSIFSRAMSEMCLEARdomyset DOSFREERESOURCE DOSMEMAVAIL! DOSSETMAXFH!DOSFREEMODULE!DOSGETMODNAME!DOSCLOSEQUEUE! DOSALLOCHUGE!'E;r] .5kUeLz DOSUNLOCKSEGDOSREAD DOSSEMWAITp DOSSCANENVZ DOSDEVIOCTLDOSCWAITDOSSETFHANDSTATEv PLOGENABLEDOSKILLPROCESS! DOSBUFRESET! DOSSGSWITCH! DOSCWAIT! DOSOPENSEM!, VIOSHELLINIT!5>d16TmD~\u &+MVIOFREE% DOSGETTIDTEMPDOSOPEN2domypop DOSRMDIRDOSEXITP DOSGETMODNAME DOSSETVEC_DOSGETMESSAGE! DOSEXECPGM! DOSDUPHANDLE!o DOSALLOCSEG!IDOSTIMERSTART! MOUSETHOTKEY!DOSGETCTRYINFO!DOSCREATEQUEUE!DOSOPEN!v/Ika(Sr9"A|[ DOSMEMAVAIL DOSFINDFIRST DOSFILEIO DOSSHUTDOWNIDOSCREATECSALIAS! DOSFINDCLOSE! DOSQFILEMODE!yDOSSUSPENDTHREAD! DOSVALIDSEG! DOSRMDIR!DOSRESUMETHREAD! DOSCASEMAP!?DOSSETSIGHANDLER!M DOSTIMERSTOP! DOSCREATESEM!DOSSETDATETIME!DOSSELECTDISK!aOGtzW%n]?f,4DOSKILLPROCESSDOSREALLOCHUGEV DOSEXECPGM DOSDUPHANDLEoERROREXITSTRINGPLOG DosHugeShift DOSDEVCONFIGX DOSQPATHINFOB _BUILDENV DOSALLOCSHRSEG VIOSHELLINIT5 DOSCLOSE!iVIOFREE!%DOSREALLOCSEG![DOSR2STACKREALLOC!JDOSSEMREQUEST!iDOSLOADMODULE! DOSSCANENV!Z DOSNEWSIZE!s DOSQPATHINFO!B DOSSYSTRACE! DOSDELETE!l DOSSEMCLEAR!e DOSQSYSINFO!F DOSSLEEP!DOSCOPY!dBL4PLOGWRITESTRING __PREASTARTDOSQFHANDSTATE: DOSHOLDSIGNALfDebug DOSMOVE!DOSCREATETHREADVIOSAVE+ CTOSQCURDISKkDOSFSRAMSEMREQUEST BUILDINISPEC DOSGETPID< DOSGETSEG DOSWRITEASYNC!KBDFREE! DOSQPIDBOOSTED! DOSSETPRTY!zDOSGETINFOSEG!DOSSETFILEMODE! DosStubs! DOSGETRESOURCE2! VIORESTORE!(M>G(6/U DOSGETENVMOUFREE!DOSHOLDSIGNAL! DOSSEMWAIT!p DOSGIVESEG! KBDSHELLINIT!INITSYSTEMDLL!4 DOSWRITE! DOSCLOSESEM!VO6?c#Gp[(y/ VIOSRFUNBLOCK9 DOSSEMREQUESTiKBDFREE  PLOGDISABLE DOSOPENSEM,DOSGETDATETIME DOSMUXSEMWAIT$ MOUSHELLINIT DOSQSYSINFOFDOSOPENv DOSQFILEINFO!>CTOSMAPTMSHANDLETOPID!DEPARGSTOVLPB!z DOSSIZESEG!}DOSSGSWITCHME! VIOSETMODE!. DOSGETDBCSEV!EDOSCHGFILEPTR!eDOSGETDATETIME! DOSDEVIOCTL2! DOSLOCKSEG!m9B0&\eJTuPMEXITSYSTEMDLLDOSENUMATTRIBUTETDOSSETSIGHANDLERMDOSSETFILEINFODOSCREATEQUEUE DOSSELECTDISKaDOSGETHUGESHIFT! DOSFILELOCKS!DOSGETCOLLATE! CTOSTODOSERC!8 DOSSHUTDOWN!I`*Cg3m|QXI#;sDOSEXITCRITSEC VIOSCROLLDN1 DOSEXITLISTDOSQPIDBOOSTED DOSTIMERSTART KBDSWITCHFGNDDOSGETCPB DOSCHGFILEPTRe DOSSYSTRACE DOSCREATESEM DOSCLOSESEM DOSDELETEl PLOGFLUSHDOSGETCTRYINFO CTOSQFSINFO!sDOSIFSRAMSEMREQUEST!CTOSGETRING2SEL!g DOSQFSATTACH! DOSSUBFREE! DOSGETENV! DOSQFSINFO! doshugeincr!m/L}Ud[5tE='DOSIFSRAMSEMREQUESTDEBUGPOSCURSORc DOSGETINFOSEGDOSWRITE VIOSSWSWITCHA DOSFINDNEXT! DOSSETFGND!sDOSWRITEQUEUE!DOSREAD!DOSREALLOCHUGE!VVIOSRFUNBLOCK!9 DOSSUBSET!DOSFINDFIRST2! DOSGETPPID!Q COPYRIGHT 1989, 1993 MICROSOFT CORPORATION. ALL RIGHTS RESERVED. COPYRIGHT 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH THE APPLICABLE PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE OFFICE OF THE GENERAL COUNSEL, PATENT AND TECHNOLOGY DIVISION, BLUE BELL, PENNSYLVANIA, 19424, USA. LIBRARY: SYSTEMIMP.LIB VERSION: x12.3.0/FBF (Monday October 11, 1993, 21:33) mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm