changeset 604:ca4556fb60b9

bump to 2.99beta, work on 3.00 stable
author heinrichsweikamp
date Thu, 22 Nov 2018 19:47:26 +0100
parents 00b24fb4324d
children 5ce603c29750
files src/Icons/dive_warning2.inc src/aa_fonts.asm src/aa_wordprocessor.asm src/adc_lightsensor.asm src/adc_lightsensor.inc src/calibrate.asm src/color_processor.asm src/colorschemes.inc src/comm.asm src/compass.c src/compass.h src/compass_calib.c src/compass_ops.asm src/convert.asm src/convert.inc src/customview.asm src/customview.inc src/divemenu_tree.asm src/divemode.asm src/divemode.inc src/eeprom_rs232.asm src/external_flash.asm src/gaslist.asm src/gaslist.inc src/ghostwriter.asm src/hwos.asm src/hwos.inc src/i2c.asm src/i2c.inc src/icons.asm src/isr.asm src/isr.inc src/logbook.asm src/math.asm src/math.inc src/mcp.asm src/mcp.inc src/menu_processor.asm src/menu_tree.asm src/ms5541.asm src/ms5541.inc src/option_table.asm src/options.asm src/p2_deco.c src/p2_definitions.h src/ports.inc src/rtc.asm src/rtc.inc src/rx_ops.asm src/rx_ops.inc src/shared_definitions.h src/simulator.asm src/sleepmode.asm src/sleepmode.inc src/start.asm src/strings.asm src/strings.inc src/surfmode.asm src/text_english.inc src/text_french.inc src/text_german.inc src/text_italian.inc src/text_multilang.asm src/text_multilang.inc src/tft.asm src/tft.inc src/tft_outputs.asm src/tft_outputs.inc src/varargs.inc src/wait.asm src/wait.inc tools/dev_ostc3_firmware.hex
diffstat 72 files changed, 24590 insertions(+), 21147 deletions(-) [+]
line wrap: on
line diff
--- a/src/Icons/dive_warning2.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/Icons/dive_warning2.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,58 +1,60 @@
 ; \file C:/hw/osct3_code/src/Icons/dive_warning2.inc
-; Generated 2015-03-19T13:15:44
+; Generated 2015-03-19T13:15:44								V2.98a
 ;
-dive_warning2_version  equ .112
-dive_warning2_width    equ .45
-dive_warning2_height   equ .39
+dive_warning2_version	equ .112
+dive_warning2_width		equ .45
+dive_warning2_height	equ .39
 ;
 dive_warning2_block:
-    db  .22, .39
-    db  .2, 0
+	db	.22, .39	; width/2, height
+	db	.4, 0		; #colors, spare
 ;
-    dw  0x0000 ; rgb=(0,0,0)
-    dw  0xff80 ; rgb=(255,242,0)
+	dw	0x0000		; color 0x00: outside	black	rgb=(  0,  0,  0)
+	dw	0xff80		; color 0x01: triangle	yellow	rgb=(255,242,  0)
+	dw	0xff80		; color 0x02: excl.mark	yellow	rgb=(255,242,  0)
+	dw	0x0000		; color 0x03: inside	black	rgb=(  0,  0,  0)
 ;
-    db  0x9d, 0x00, 0x84, 0x01, 0xa0, 0x00, 0x86, 0x01
-    db  0x9d, 0x00, 0x89, 0x01, 0x9b, 0x00, 0x8a, 0x01
-    db  0x99, 0x00, 0x8c, 0x01, 0x98, 0x00, 0x86, 0x01
-    db  0x81, 0x00, 0x84, 0x01, 0x96, 0x00, 0x87, 0x01
-    db  0x83, 0x00, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01
-    db  0x85, 0x00, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01
-    db  0x86, 0x00, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01
-    db  0x88, 0x00, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01
-    db  0x89, 0x00, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01
-    db  0x8b, 0x00, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01
-    db  0x8c, 0x00, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01
-    db  0x8e, 0x00, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01
-    db  0x8f, 0x00, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01
-    db  0x91, 0x00, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01
-    db  0x92, 0x00, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01
-    db  0x94, 0x00, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01
-    db  0x95, 0x00, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01
-    db  0x97, 0x00, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01
-    db  0x98, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
-    db  0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01
-    db  0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
-    db  0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01
-    db  0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
-    db  0x86, 0x00, 0x8a, 0x01, 0x81, 0x00, 0x82, 0x01
-    db  0x82, 0x00, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01
-    db  0x98, 0x00, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01
-    db  0x97, 0x00, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01
-    db  0x95, 0x00, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01
-    db  0x94, 0x00, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01
-    db  0x92, 0x00, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01
-    db  0x91, 0x00, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01
-    db  0x8f, 0x00, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01
-    db  0x8e, 0x00, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01
-    db  0x8c, 0x00, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01
-    db  0x8b, 0x00, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01
-    db  0x89, 0x00, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01
-    db  0x88, 0x00, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01
-    db  0x86, 0x00, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01
-    db  0x85, 0x00, 0x83, 0x01, 0x96, 0x00, 0x87, 0x01
-    db  0x83, 0x00, 0x83, 0x01, 0x98, 0x00, 0x86, 0x01
-    db  0x81, 0x00, 0x84, 0x01, 0x99, 0x00, 0x8c, 0x01
-    db  0x9b, 0x00, 0x8a, 0x01, 0x9c, 0x00, 0x89, 0x01
-    db  0x9e, 0x00, 0x86, 0x01, 0xa0, 0x00, 0x84, 0x01
-    db  0x83, 0x00
+	db	0x9d, 0x00, 0x84, 0x01, 0xa0, 0x00, 0x86, 0x01
+	db	0x9d, 0x00, 0x89, 0x01, 0x9b, 0x00, 0x8a, 0x01
+	db	0x99, 0x00, 0x8c, 0x01, 0x98, 0x00, 0x86, 0x01
+	db	0x81, 0x03, 0x84, 0x01, 0x96, 0x00, 0x87, 0x01
+	db	0x83, 0x03, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01
+	db	0x85, 0x03, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01
+	db	0x86, 0x03, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01
+	db	0x88, 0x03, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01
+	db	0x89, 0x03, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01
+	db	0x8b, 0x03, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01
+	db	0x8c, 0x03, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01
+	db	0x8e, 0x03, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01
+	db	0x8f, 0x03, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01
+	db	0x91, 0x03, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01
+	db	0x92, 0x03, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01
+	db	0x94, 0x03, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01
+	db	0x95, 0x03, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01
+	db	0x97, 0x03, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01
+	db	0x98, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
+	db	0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02
+	db	0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
+	db	0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02
+	db	0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x85, 0x01
+	db	0x86, 0x03, 0x8a, 0x02, 0x81, 0x03, 0x82, 0x02
+	db	0x82, 0x03, 0x83, 0x01, 0x82, 0x00, 0x86, 0x01
+	db	0x98, 0x03, 0x83, 0x01, 0x83, 0x00, 0x86, 0x01
+	db	0x97, 0x03, 0x83, 0x01, 0x84, 0x00, 0x87, 0x01
+	db	0x95, 0x03, 0x83, 0x01, 0x86, 0x00, 0x86, 0x01
+	db	0x94, 0x03, 0x83, 0x01, 0x87, 0x00, 0x87, 0x01
+	db	0x92, 0x03, 0x83, 0x01, 0x89, 0x00, 0x86, 0x01
+	db	0x91, 0x03, 0x83, 0x01, 0x8a, 0x00, 0x87, 0x01
+	db	0x8f, 0x03, 0x83, 0x01, 0x8c, 0x00, 0x86, 0x01
+	db	0x8e, 0x03, 0x83, 0x01, 0x8d, 0x00, 0x87, 0x01
+	db	0x8c, 0x03, 0x83, 0x01, 0x8f, 0x00, 0x86, 0x01
+	db	0x8b, 0x03, 0x83, 0x01, 0x90, 0x00, 0x87, 0x01
+	db	0x89, 0x03, 0x83, 0x01, 0x92, 0x00, 0x86, 0x01
+	db	0x88, 0x03, 0x83, 0x01, 0x93, 0x00, 0x87, 0x01
+	db	0x86, 0x03, 0x83, 0x01, 0x95, 0x00, 0x86, 0x01
+	db	0x85, 0x03, 0x83, 0x01, 0x96, 0x00, 0x87, 0x01
+	db	0x83, 0x03, 0x83, 0x01, 0x98, 0x00, 0x86, 0x01
+	db	0x81, 0x03, 0x84, 0x01, 0x99, 0x00, 0x8c, 0x01
+	db	0x9b, 0x00, 0x8a, 0x01, 0x9c, 0x00, 0x89, 0x01
+	db	0x9e, 0x00, 0x86, 0x01, 0xa0, 0x00, 0x84, 0x01
+	db	0x83, 0x00
--- a/src/aa_fonts.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/aa_fonts.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,168 +1,171 @@
 ;=============================================================================
 ;
-;   File aa_fonts.asm
+;   File aa_fonts.asm													V2.99d
 ;
 ;   Font-data for the anti-aliased word processor
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;  2010-11-23 : [jDG] Creation for OSTC 1.72, with the original fonts repacked.
-;  2010-12-01 : [jDG] Adding 3bits antialiased fonts.
+;  2010-11-23 : [jDG] Creation for OSTC 1.72, with the original fonts repacked
+;  2010-12-01 : [jDG] Adding 3 bit anti-aliased fonts
 ;=============================================================================
 
 ;---- TINY font description and data ----------------------------------------
-fonts_data	CODE_PACK   0x11000	    ; <- Make sure all three fonts are in the same 64kByte page...
+
+; Attention: all three fonts need to be in the same 64 kByte page
+fonts_data	CODE_PACK	0x11000
 
 
-            global  aa_font16_block
+	global	aa_font16_block
 aa_font16_block:
-			DB	'°', 0x7F               ; Remap a few ASCII chars, to avoid
-			DB	'ö', 0x80               ; holes in the character table...
-			DB	'ä', 0x81
-			DB	'ü', 0x82
-			DB	'ß', 0x83
-			DB	'é', 0x84               ; French accents
-			DB	'è', 0x85
-			DB	'ê', 0x86
-			DB	'ç', 0x87
-			DB	'á', 0x88               ; Spanish accents
-			DB	'í', 0x89
-			DB	'ó', 0x8A
-			DB	'ú', 0x8B
-			DB	'ñ', 0x8C
-			DB	'¡', 0x8D
-			DB	'¿', 0x8E
-			DB	0				; End of translation table
-			DB	aa_font16_firstChar			; To be substracted
-			DB	aa_font16_chars				; Max value
-			DB	'¿'-aa_font16_firstChar     ; replace by ¿ when unknown.
-			DB	aa_font16_height + 0x80
+	DB		'°', 0x7F					; remap a few ASCII chars, to avoid
+	DB		'ö', 0x80					; holes in the character table
+	DB		'ä', 0x81
+	DB		'ü', 0x82
+	DB		'ß', 0x83
+	DB		'é', 0x84					; French accents
+	DB		'è', 0x85
+	DB		'ê', 0x86
+	DB		'ç', 0x87
+	DB		'á', 0x88					; Spanish accents
+	DB		'í', 0x89
+	DB		'ó', 0x8A
+	DB		'ú', 0x8B
+	DB		'ñ', 0x8C
+	DB		'¡', 0x8D
+	DB		'¿', 0x8E
+	DB		0							; end of translation table
+	DB		aa_font16_firstChar			; to be subtracted
+	DB		aa_font16_chars				; max value
+	DB		'¿'-aa_font16_firstChar		; replace by ¿ when unknown
+	DB		aa_font16_height + 0x80
 ;
-#include	"../src/Fonts/aa_font16_idx.inc"				; SHOULD FOLLOW !
+#include	"../src/Fonts/aa_font16_idx.inc"
 #include	"../src/Fonts/aa_font16.inc"
 aa_font16_end:
-; Make sure this is coherent...
+; Attention: make sure this is coherent
 	if aa_font16_nbbits != 3
-		error TINY fount should be encoded with anti-aliasing...
+		error TINY font should be encoded with 3 bits anti-aliasing!
 	endif
 
 ;---- SMALL font description and data ----------------------------------------
-            global  aa_font28_block
+	global	aa_font28_block
 aa_font28_block:
-			DB	'°', 0x7F               ; Remap a few ASCII chars, to avoid
-			DB	'ö', 0x80               ; holes in the character table...
-			DB	'ä', 0x81
-			DB	'ü', 0x82
-			DB	'ß', 0x83
-			DB	'é', 0x84               ; French accents
-			DB	'è', 0x85
-			DB	'ê', 0x86
-			DB	'ç', 0x87
-			DB	'á', 0x88               ; Spanish accents
-			DB	'í', 0x89
-			DB	'ó', 0x8A
-			DB	'ú', 0x8B
-			DB	'ñ', 0x8C
-			DB	'¡', 0x8D
-			DB	'¿', 0x8E
-			DB	'¤', 0x8F               ; Unused
-			; 90, 91 are the logo.
-			DB	0xB7,0x92		        ; Cursor
-			DB	0xB8,0x93		        ; Dimmed cursor.
-			DB	0				; End of translation table
-			DB	aa_font28_firstChar			; To be substracted
-			DB	aa_font28_chars				; Max value
-			DB	0x83-aa_font28_firstChar; replace by ¤ when unknown.
-			DB	aa_font28_height + 0x80
+	DB		'°', 0x7F					; remap a few ASCII chars, to avoid
+	DB		'ö', 0x80					; holes in the character table
+	DB		'ä', 0x81
+	DB		'ü', 0x82
+	DB		'ß', 0x83
+	DB		'é', 0x84					; French accents
+	DB		'è', 0x85
+	DB		'ê', 0x86
+	DB		'ç', 0x87
+	DB		'á', 0x88					; Spanish accents
+	DB		'í', 0x89
+	DB		'ó', 0x8A
+	DB		'ú', 0x8B
+	DB		'ñ', 0x8C
+	DB		'¡', 0x8D
+	DB		'¿', 0x8E
+	DB		'¤', 0x8F					; unused
+	; 90 and 91 contain the logo
+	DB		0xB7,0x92					; cursor
+	DB		0xB8,0x93					; arrow down
+	DB		0xB9,0x94					; arrow up
+	DB		0							; end of translation table
+	DB		aa_font28_firstChar			; to be subtracted
+	DB		aa_font28_chars				; max value
+	DB		0x83-aa_font28_firstChar	; replace by ¤ when unknown
+	DB		aa_font28_height + 0x80
 ;
-#include	"../src/Fonts/aa_font28_idx.inc"				; SHOULD FOLLOW !
+#include	"../src/Fonts/aa_font28_idx.inc"
 #include	"../src/Fonts/aa_font28.inc"
 aa_font28_end:
-; Make sure this is coherent...
+; Attention: make sure this is coherent...
 	if aa_font28_nbbits != 3
-		error SMALL fount should be encoded with anti-aliasing...
+		error SMALL font should be encoded with 3 bits anti-aliasing!
 	endif
 
 ;---- STD font description and data ------------------------------------------
-            global  aa_font36_block
+	global	aa_font36_block
 aa_font36_block:
-			DB	'°', 0x7F               ; Remap a few ASCII chars, to avoid
-			DB	'ö', 0x80               ; holes in the character table...
-			DB	'ä', 0x81
-			DB	'ü', 0x82
-			DB	'ß', 0x83
-			DB	'é', 0x84               ; French accents
-			DB	'è', 0x85
-			DB	'ê', 0x86
-			DB	'ç', 0x87
-			DB	'à', 0x88               ; Spanish accents
-			DB	'á', 0x89               ; Spanish accents
-			DB	'í', 0x8A
-			DB	'ó', 0x8B
-			DB	'ú', 0x8C
-			DB	'ñ', 0x8D
-			DB	'¡', 0x8E
-			DB	'¿', 0x8F
-			; 90, 91 are the logo.
-			DB	0xB7,0x92		        ; Cursor
-            ; 93 is down arrow (dive start)
-            ; 94 is up arrow (dive end)
-            ; 95 is left-right arrow (dive duration)
-			DB	'¤', 0x96               ; Unused
-			DB	0				; End of translation table
-			DB	aa_font34_firstChar			; To be substracted
-			DB	aa_font34_chars				; Max value
-			DB	0x87-aa_font34_firstChar; replace by ¤ when unknown.
-			DB	aa_font34_height + 0x80
+	DB		'°', 0x7F					; remap a few ASCII chars, to avoid
+	DB		'ö', 0x80					; holes in the character table
+	DB		'ä', 0x81
+	DB		'ü', 0x82
+	DB		'ß', 0x83
+	DB		'é', 0x84					; French accents
+	DB		'è', 0x85
+	DB		'ê', 0x86
+	DB		'ç', 0x87
+	DB		'à', 0x88					; Spanish accents
+	DB		'á', 0x89
+	DB		'í', 0x8A
+	DB		'ó', 0x8B
+	DB		'ú', 0x8C
+	DB		'ñ', 0x8D
+	DB		'¡', 0x8E
+	DB		'¿', 0x8F
+	; 90, 91 contain the the logo
+	DB	0xB7,0x92						; cursor
+	; 93 is down arrow (dive start)
+	; 94 is up   arrow (dive end)
+	; 95 is left-right arrow (dive duration)
+	DB	'¤', 0x96						; unused
+	DB	0								; end of translation table
+	DB	aa_font34_firstChar				; to be subtracted
+	DB	aa_font34_chars					; max value
+	DB	0x87-aa_font34_firstChar		; replace by ¤ when unknown.
+	DB	aa_font34_height + 0x80
 ;
-#include	"../src/Fonts/aa_font34_idx.inc"				; SHOULD FOLLOW !
+#include	"../src/Fonts/aa_font34_idx.inc"
 #include	"../src/Fonts/aa_font34.inc"
 aa_font36_end:
-; Make sure this is coherent...
+; Attention: make sure this is coherent...
 	if aa_font34_nbbits != 3
-		error STANDARD fount should be encoded with anti-aliasing...
+		error STANDARD font should be encoded with 3 bits anti-aliasing!
 	endif
 
 ;---- MEDIUM font description and data ---------------------------------------
-            global  aa_font48_block
+	global	aa_font48_block
 aa_font48_block:
-			DB	0x27, 0x3B					; ' char
-			DB	'"', 0x3C
-			DB	'm', 0x3D
-			DB	'f', 0x3E
-			DB	' ', 0x3F
-			DB	0
-			DB	aa_font48_firstChar
-			DB	aa_font48_chars
-			DB	0x3E-aa_font48_firstChar
-			DB	aa_font48_height + 0x80		; AA flag.
+	DB		0x27, 0x3B					; ' char
+	DB		'"', 0x3C
+	DB		'm', 0x3D
+	DB		'f', 0x3E
+	DB		' ', 0x3F
+	DB		0
+	DB		aa_font48_firstChar
+	DB		aa_font48_chars
+	DB		0x3E-aa_font48_firstChar
+	DB		aa_font48_height + 0x80		; AA flag
 ;
 #include	"../src/Fonts/aa_font48_idx.inc"
 #include	"../src/Fonts/aa_font48.inc"
 aa_font48_end:
-; Make sure this is coherent...
+; Attention: make sure this is coherent...
 	if aa_font48_nbbits != 3
-		error MEDIUM fount should be encoded with 3bits anti-aliasing...
+		error MEDIUM font should be encoded with 3 bits anti-aliasing!
 	endif
 
 ;---- LARGE font description and data ----------------------------------------
-            global aa_font90_block
+	global	aa_font90_block
 aa_font90_block:
-			DB	' ', 0x2F
-			DB	0
-			DB	aa_font90_firstChar
-			DB	aa_font90_chars
-			DB	0x2F-aa_font90_firstChar
-			DB	aa_font90_height + 0x80		; AA flag.
+	DB		' ', 0x2F
+	DB		0
+	DB		aa_font90_firstChar
+	DB		aa_font90_chars
+	DB		0x2F-aa_font90_firstChar
+	DB		aa_font90_height + 0x80		; AA flag
 ;
 #include	"../src/Fonts/aa_font90_idx.inc"
 #include	"../src/Fonts/aa_font90.inc"
 aa_font90_end:
-; Make sure this is coherent...
+; Attention: make sure this is coherent...
 	if aa_font90_nbbits != 3
-		error SMALL fount should be encoded with 3bits anti-aliasing...
+		error SMALL font should be encoded with 3 bits anti-aliasing!
 	endif
 
 ;=============================================================================
-            END
\ No newline at end of file
+	END
\ No newline at end of file
--- a/src/aa_wordprocessor.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/aa_wordprocessor.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,14 +1,14 @@
 ;=============================================================================
 ;
-;   File aa_wordprocessor.asm										## V2.97
+;   File aa_wordprocessor.asm										## V2.99e
 ;
 ;   Anti-aliased word processor
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;  2010-11-22 : [jDG] Creation.
-;  2010-12-01 : [jDG] Adding 3bits anti-aliased fonts.
+;  2010-11-22 : [jDG] Creation
+;  2010-12-01 : [jDG] Adding 3bits anti-aliased fonts
 ;  2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0
 ;  2012-08-12 : [mH]  Moved font28 into bootloader section 0x1C000
 ;
@@ -48,16 +48,18 @@
 	extern	aa_font48_block
 	extern	aa_font90_block
 
+aa_word		CODE
+
 ;------------------------------------------------------------------------------
 ; Setup pointers for a char:
 ; Inputs   WREG = char to draw, win_font
 ; Output   aa_start, aa_end, win_height, aa_flags
 ; Trashed  PRODH, PRODL, TBLPTR, TABLAT
 ;
-basic	CODE
+
 aa_char_setup:
 	movwf	PRODL					; save char into PROD for now
-	movf	win_font,W,BANKED		; Get font number (updates Z flag)
+	movf	win_font,W				; get font number (updates Z flag)
 	bnz		aa_char_1
 
 	; TINY font ---------------------------------------------------------
@@ -74,8 +76,8 @@
 	; SMALL font ---------------------------------------------------------
 	; Font SMALL character folding...
 aa_char_1:
-	decfsz	WREG					; This is small font ???
-	bra		aa_char_2
+	decfsz	WREG					; requested small font?
+	bra		aa_char_2				; NO
 	movlw	LOW aa_font28_block
 	movwf	TBLPTRL
 	movlw	HIGH aa_font28_block
@@ -87,8 +89,8 @@
 	; STD font -----------------------------------------------------------
 	; Font SMALL character folding...
 aa_char_2:
-	decfsz	WREG					; This is small font ???
-	bra		aa_char_3
+	decfsz	WREG					; requested std font?
+	bra		aa_char_3				; NO
 	movlw	LOW aa_font36_block
 	movwf	TBLPTRL
 	movlw	HIGH aa_font36_block
@@ -99,10 +101,8 @@
 
 	; MEDIUM font --------------------------------------------------------
 aa_char_3:
-	decfsz	WREG				 	; This is medium font ???
-	bra		aa_char_4
-
-	; Font MEDIUM block:
+	decfsz	WREG				 	; requested medium font?
+	bra		aa_char_4				; NO
 	movlw	LOW aa_font48_block
 	movwf	TBLPTRL
 	movlw	HIGH aa_font48_block
@@ -113,7 +113,7 @@
 
 	; LARGE font ---------------------------------------------------------
 aa_char_4:
-	; Font LARGE block:
+									; no to all above - must be large font then...
 	movlw	LOW aa_font90_block
 	movwf	TBLPTRL
 	movlw	HIGH aa_font90_block
@@ -130,53 +130,53 @@
 
 	; Proceed to character substitutions
 aa_char_30:
-	tblrd*+							; Read FROM char
-	movf	TABLAT,W				; Get it, and set Z,N
-	bz		aa_char_32				; Break at end of translations
+	tblrd*+							; read FROM char
+	movf	TABLAT,W				; get it, and set Z,N
+	bz		aa_char_32				; break at end of translations
 
-	tblrd*+							; Read TO char
-	cpfseq	PRODL					; FROM == current char ? 
-	bra		aa_char_30				; Different: loop
+	tblrd*+							; read TO char
+	cpfseq	PRODL					; FROM == current char ?
+	bra		aa_char_30				; different -> loop
 	movff	TABLAT, PRODL			; make substitution
-	bra		aa_char_30				; Loop
+	bra		aa_char_30				; loop
 
 	; Make sure char is in the available range
 aa_char_32:
-	tblrd*+							; Read first char
+	tblrd*+							; read first char
 	movf	TABLAT,W				; get it
 	subwf	PRODL,F					; (char - first) --> PRODL
-	tblrd*+							; Read nb chars
+	tblrd*+							; read nb chars
 	movf	TABLAT,W				; nbchars --> WREG
-	tblrd*+							; Read default char
-	cpfslt	PRODL					; if char > WREG ?
+	tblrd*+							; read default char
+	cpfslt	PRODL					; char > WREG ?
 	movff	TABLAT,PRODL			; replace PRODL
 
 	; Decode font height and anti-aliasing mode
-	clrf	aa_flags				; Default to no AA
-	tblrd*+							; Read font height + AA flag
+	clrf	aa_flags				; default to no AA
+	tblrd*+							; read font height + AA flag
 	movf	TABLAT,W				; into WREG
-	bnn		aa_char_34				; High bit set ?
-	bsf		aa_antialias			; YES : then the font is AA
+	bnn		aa_char_34				; high bit set ?
+	bsf		aa_antialias			; YES - then the font is AA
 aa_char_34:
-	andlw	0x7F					; Keep just font height,
-	movwf	win_height,BANKED		; then save it (its a register)
+	andlw	0x7F					; keep just font height,
+	movwf	win_height				; then save it (its a register)
 
 	; Set PROM pointer to the char index
-	movf	PRODL,W					; Read back char
+	movf	PRODL,W					; read back char
 	mullw	2						; PROD = 2*(char - base), TBLPTR=idx
 	movf	PRODL,W
-	addwf	TBLPTRL,F				; Add into TBLPTR (low byte)
+	addwf	TBLPTRL,F				; add into TBLPTR (low byte)
 	movf	PRODH,W
 	addwfc	TBLPTRH,F				; and high byte
 
 	; Read start and stop pointers
 	tblrd*+							; aa_start = PROM16(*tblptr++)
-	movff	TABLAT,aa_start+0		; Read low byte
+	movff	TABLAT,aa_start+0		; read low byte
 	tblrd*+
 	movff	TABLAT,aa_start+1		; and high byte
 
 	tblrd*+							; aa_end = PROM16(*tblptr++)
-	movff	TABLAT,aa_end+0			; Read low byte
+	movff	TABLAT,aa_end+0			; read low byte
 	tblrd*+
 	movff	TABLAT,aa_end+1			; and high byte
 
@@ -193,53 +193,53 @@
 	movff	aa_start+1, TBLPTRH
 	clrf	aa_bitlen				; clear reminders...
 
-		; Read bitmap byte, and decode length:
+	; Read bitmap byte, and decode length:
 aa_char_width_1:
 
 	ifdef AA_BYTE_SWAP
-		btg		TBLPTRL,0			; Toggle low ptr bit
+		btg		TBLPTRL				; toggle low ptr bit
 		tblrd*
-		movf	TABLAT,W			; Store to WREG
-		btg		TBLPTRL,0			; Get is back
+		movf	TABLAT,W			; store to WREG
+		btg		TBLPTRL				; get is back
 		tblrd*+						; then increment (but trash TABLAT)
-		movwf	TABLAT				; Then restore copy to TABLAT
+		movwf	TABLAT				; then restore copy to TABLAT
 	else
-		tblrd*+						; Normal read...
-		movf	TABLAT,W			; Store copy to WREG
+		tblrd*+						; normal read...
+		movf	TABLAT,W			; store copy to WREG
 	endif
 
-	btfss	aa_antialias			; Anti-aliased font ?
-	bra		aa_char_width_10		; No: always 7 bits count
+	btfss	aa_antialias			; anti-aliased font ?
+	bra		aa_char_width_10		; NO - always 7 bit count
 
-	bn		aa_char_width_10		; Non-white pixels ?
-	andlw	0x1F					; Yes : 5 bits count
+	bn		aa_char_width_10		; none-white pixels?
+	andlw	0x1F					; YES - 5 bit count
 aa_char_width_10:
-	andlw	0x7F					; No: 7 bit count
+	andlw	0x7F					; NO  - 7 bit count
 	incf	WREG 					; WREG = repetition count
-	addwf	aa_bitlen,F				; Add remaining pixels from last code
+	addwf	aa_bitlen,F				; add remaining pixels from last code
 
-	movf	win_height,W,BANKED		; WREG = - height
+	movf	win_height,W			; WREG -= height
 	negf	WREG
 
 	; This is a hand-made division by successive subtraction of height
 aa_char_width_2:
-	addwf	aa_bitlen,F				; Try to subtract win_height
-	bn		aa_char_width_3			; If neg it was a bad idea...
+	addwf	aa_bitlen,F				; try to subtract win_height
+	bn		aa_char_width_3			; if neg it was a bad idea...
 
-	infsnz	win_width+0,F			; Succeeded: do a 16bit increment
+	infsnz	win_width+0,F			; succeeded: do a 16 bit increment
 	incf	win_width+1,F			; on the win_width counter
 	bra		aa_char_width_2			; and loop
 
 aa_char_width_3:
 	negf	WREG					; WREG = +height
-	addwf	aa_bitlen,F				; Restore true reminder
+	addwf	aa_bitlen,F				; restore true reminder
 
 	; Are we done ?
-	movf	TBLPTRL,W				; Compare TBLPTR to aa_end
+	movf	TBLPTRL,W				; compare TBLPTR to aa_end
 	cpfseq	aa_end+0  
-	bra		aa_char_width_1			; Loop if LOW is different
+	bra		aa_char_width_1			; loop if LOW is different
 	movf	TBLPTRH,W
-	cpfseq	aa_end+1				; Loop to if HIGH is different
+	cpfseq	aa_end+1				; loop to if HIGH is different
 	bra		aa_char_width_1
 	return
 
@@ -251,12 +251,12 @@
 ;
 aa_string_width:
 	lfsr	FSR2, buffer			; FSR2 pointer to start of string
-	clrf	win_width+0				; Clear width sum
+	clrf	win_width+0				; clear width sum
 	clrf	win_width+1				; (16 bit counter)
 
 aa_string_width_1:
 	movf	POSTINC2,W  			; WREG = *FSR2++
-	bz		aa_string_width99		; Exit if null byte encountered
+	bz		aa_string_width99		; exit if null byte encountered
 
 	rcall	aa_char_setup			; setup aa_start / aa_end
 	rcall	aa_char_width			; sum-up width into win_width
@@ -279,73 +279,73 @@
 aa_decode_1:
 
 	ifdef AA_BYTE_SWAP
-		btg		TBLPTRL,0			; Toggle low ptr bit
+		btg		TBLPTRL				; toggle low ptr bit
 		tblrd*
-		movf	TABLAT,W			; Store to WREG
-		btg		TBLPTRL,0			; Get is back
+		movf	TABLAT,W			; store to WREG
+		btg		TBLPTRL				; get is back
 		tblrd*+						; then increment (but trash TABLAT)
-		movwf	TABLAT				; Then restore copy to TABLAT
+		movwf	TABLAT				; then restore copy to TABLAT
 	else
-		tblrd*+						; Normal read...
-		movf	TABLAT,W			; Store copy to WREG
+		tblrd*+						; normal read...
+		movf	TABLAT,W			; store copy to WREG
 	endif
 
-	btfss	aa_antialias			; Anti-aliased font ?
-	bra		aa_decode_10			; No: always 7 bits count
-	bn		aa_decode_10			; Non-white pixels ?
-	andlw	0x1F					; Yes : 5 bits count
+	btfss	aa_antialias			; anti-aliased font?
+	bra		aa_decode_10			; NO - always 7 bit count
+	bn		aa_decode_10			; none-white pixels?
+	andlw	0x1F					; Yes - 5 bit count
 aa_decode_10:
-	andlw	0x7F					; No: 7 bit count
+	andlw	0x7F					; NO  - 7 bit count
 	incf	WREG
 	movwf	aa_bitlen				; repetition count --> aa_bitlen
 
 	;---- COLOR DECODING -------------------------------------------------
 	;
 	;   Code    Normal    Inverse
-	;   1xx        0%      100%	: Managed by aa_decode_13
+	;   1xx        0%      100% : Managed by aa_decode_13
 	;   011       25%       75%
 	;   010       50%       50%
 	;   001       75%       25%
-	;   000      100%        0% : Managed by aa_decode_13 too
+	;   000      100%        0% : Managed by aa_decode_13, too
 	;
-	movf	TABLAT,W				; Get back code
-	btfss	aa_antialias			; Anti-aliased font ?
-	bra		aa_decode_13			; NO: 1bit case
+	movf	TABLAT,W				; get back code
+	btfss	aa_antialias			; anti-aliased font?
+	bra		aa_decode_13			; NO - 1 bit case
 
 	; Asymmetry test: 1xx code is another case for 1bit color.
 	; This have to be done before inverse video, because
-	; of the asymmetric processing !
-	bn		aa_decode_13			; decode as not-aa
+	; of the asymmetric processing!
+	bn		aa_decode_13			; decode as none-aa
 
 	; Manage 000 special case too:
-	andlw	0xE0					; Select color bits
-	bz		aa_decode_13			; That's a 000 !
+	andlw	0xE0					; select color bits
+	bz		aa_decode_13			; that's a 000 !
 
 	; Apply reverse video, in a reversed way
-	btfss	win_invert  			; Inverse video mode ?
-	sublw	0x80
+	btfss	win_invert				; inverse video mode?
+	sublw	0x80					; NO
 
 	; Move the two bits to aa_color_half and aa_color_quarter:
 	swapf	WREG					; --> 0000.0LL0 byte
-	iorlw	b'001'					; We are in AA mode, don't forget it !
+	iorlw	b'001'					; we are in AA mode, don't forget it!
 	movwf	aa_flags				; save that to aa_color_(half/quad)/AA flags
 
 	;---- 2 bit x RGB(16bits) computation --------------------------------
-	clrf	PRODL					; We will accumulate result here...
+	clrf	PRODL					; we will accumulate result here...
 	clrf	PRODH
 
 	; Take color div 2 into aa_temp. Max red = 15/31
-	rrcf	win_color1,W,BANKED		; xRRRRxGG
+	rrcf	win_color1,W			; xRRRRxGG
 	andlw	b'01111011'				; 0RRRR0GG (don't change C)
 	movwf	aa_temp+0
-	rrcf	win_color2,W,BANKED		; GGGxBBBB
+	rrcf	win_color2,W			; GGGxBBBB
 	andlw	b'11101111'				; GGG0BBBB
 	movwf	aa_temp+1
 
 	btfss	aa_color_half
 	bra		aa_decode_12
 
-	movff	aa_temp+0,PRODH			; Add color/2 if bit set
+	movff	aa_temp+0,PRODH			; add color/2 if bit set
 	movff	aa_temp+1,PRODL			; TFT is big endian, so swap here
 aa_decode_12:
 	btfss	aa_color_quart
@@ -359,41 +359,41 @@
 	andlw	b'11100111'				; GGG00BBB
 	movwf	aa_temp+1
 
-	movf	aa_temp+1,W				; Add color/4
+	movf	aa_temp+1,W				; add color/4
 	addwf	PRODL,F					; NOTE: 7/31+15/31=22/31,
 	movf	aa_temp+0,W				; hence components won't overlap
-	addwfc	PRODH,F					; In right order, to propagate carry
+	addwfc	PRODH,F					; in right order, to propagate carry
 
-	bra		aa_decode_3				; Done
+	bra		aa_decode_3				; done
 
 	; ---- Simple BLACK and WHITE cases ------------------------------
-aa_decode_13:						; Got a 1xx or a 000 code...
-	btfsc	win_invert  			; Inverse video mode ?
-	xorlw	0x80					; YES: invert levels
-	bn		aa_decode_2				; Then test high bit
+aa_decode_13:						; got a 1xx or a 000 code...
+	btfsc	win_invert  			; inverse video mode?
+	xorlw	0x80					; YES - invert levels
+	bn		aa_decode_2				; then test high bit
 
 	; WHITE pixel (i.e. full color)
-	bsf		tft_rs,0				; RS_H Data
+	bsf		tft_rs					; RS_H Data
 	movff	win_color1,PORTA		; current draw color
 	movff	win_color2,PORTH		; (rem: TFT is big endian)
 	bra		aa_decode_4
 
 aa_decode_2:
-	bsf		tft_rs,0				; RS_H Data
+	bsf		tft_rs					; RS_H Data
 	clrf	PORTA					; BLACK pixel
 	clrf	PORTH
 	bra		aa_decode_4
 
 aa_decode_3:
-	bsf		tft_rs,0				; RS_H Data
-	movff	PRODH,PORTA				; Move high byte to PORTA
-	movff	PRODL,PORTH				; Move low byte to PORTH
+	bsf		tft_rs					; RS_H Data
+	movff	PRODH,PORTA				; move high byte to PORTA
+	movff	PRODL,PORTH				; move low byte to PORTH
 aa_decode_4:
 	bcf	INTCON,GIE
 aa_decode_4a:
 	;---- PIXEL WRITE LOOP -----------------------------------------------
-	bcf		tft_nwr,0				; WR_L
-	bsf		tft_nwr,0				; WR_H Tick
+	bcf		tft_nwr					; WR_L
+	bsf		tft_nwr					; WR_H tick
 
 	decf	aa_bitlen,F
 	bnz		aa_decode_4a
@@ -401,11 +401,11 @@
 	bsf		INTCON,GIE
 	;---- BYTE-CODE LOOP -------------------------------------------------
 	; Are we done ?
-	movf	TBLPTRL,W				; Compare TBLPTR to aa_end
+	movf	TBLPTRL,W				; compare TBLPTR to aa_end
 	cpfseq	aa_end+0
-	bra		aa_decode_1				; Loop if LOW is different
+	bra		aa_decode_1				; loop if LOW is different
 	movf	TBLPTRH,W
-	cpfseq	aa_end+1				; Loop too if HIGH is different
+	cpfseq	aa_end+1				; loop too if HIGH is different
 	bra		aa_decode_1
 	return
 
@@ -414,21 +414,21 @@
 ; Inputs : buffer : string to print (SHOULD BE NULL TERMINATED)
 ; Output : TFT commands on port D + clocks.
 ; 
-	global	aa_wordprocessor		; Callable from C-code
+	global	aa_wordprocessor		; callable from C-code
 aa_wordprocessor:
-	banksel	win_font				; Bank1, just to be sure
-	rcall	aa_string_width			; Set win_height, compute win_width:2
-	call	TFT_box_write			; Use that for the box
+	banksel	win_font				; bank1, just to be sure
+	rcall	aa_string_width			; set win_height, compute win_width:2
+	call	TFT_box_write			; use that for the box
 
 	; Restart the loop for each char to print
 	lfsr	FSR2, buffer			; FSR2 pointer to start of string
 
 	; DATA block command
-	Index_out	0x22				; Index_out is a macro defined in tft.inc
+	Index_out	0x22				; index_out is a macro defined in tft.inc
 
 aa_wordprocessor_1:
 	movf	POSTINC2,W  			; WREG = *FSR2++
-	bz		aa_wordprocessor_99		; Exit if null byte encountered
+	bz		aa_wordprocessor_99		; exit if null byte encountered
 
 	rcall	aa_char_setup			; setup aa_start / aa_end
 	rcall	aa_decode_char			; write pixels to screen
--- a/src/adc_lightsensor.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/adc_lightsensor.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File adc.asm														V2.98
+;   File adc.asm														V2.99e
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -16,7 +16,7 @@
 
 	extern	reset_battery_internal_only
 
-sensors		CODE
+adc_light		CODE
 
 ;=============================================================================
 
@@ -25,20 +25,20 @@
 	nop
 	bsf		ADCON0,1						; start ADC
 wait_adc2:
-	btfsc	ADCON0,1						; Wait...
+	btfsc	ADCON0,1						; wait...
 	bra		wait_adc2
 	return
 
 	global	get_battery_voltage
 get_battery_voltage:						; starts ADC and waits until finished
 	btfss	battery_gauge_available
-	bra		get_battery_voltage1			; Normal ostc3 hardware
+	bra		get_battery_voltage1			; normal ostc3 hardware
 
 	call	lt2942_get_accumulated_charge
 	call	lt2942_get_voltage
 
-	tstfsz	batt_voltage+1					; <256mV?
-	bra		get_battery_voltage_noretry		; No
+	tstfsz	batt_voltage+1					; < 256 mV ?
+	bra		get_battery_voltage_noretry		; NO
 
 	; Retry
 	call	lt2942_get_accumulated_charge
@@ -46,7 +46,7 @@
 
 get_battery_voltage_noretry:
 	btfsc	divemode
-	return									; Not in divemode
+	return									; not in divemode
 
 	bcf		cv_active
 	bcf		cc_active
@@ -68,28 +68,28 @@
 	decfsz	get_bat_volt_counter,F
 	return
 	movlw	.15
-	cpfsgt	batt_voltage+1					; Batt Voltage >= 16*256mV (4,096V)?
-	bra		charge_cc_active				; No
+	cpfsgt	batt_voltage+1					; battery voltage >= 16*256mV (4,096V)?
+	bra		charge_cc_active				; NO
 	bsf		cc_active
 	bsf		cv_active
-	bsf		LEDr							; Indicate charging
-	call	lt2942_charge_done				; Reset accumulating registers to 0xFFFF
+	bsf		LEDr							; indicate charging
+	call	lt2942_charge_done				; reset accumulating registers to 0xFFFF
 	WAITMS	d'10'
-	bcf		LEDr							; Indicate charging
+	bcf		LEDr							; indicate charging
 	bsf		get_bat_volt_counter,0			; =1
 	return
 
 charge_cc_active:
 	bsf		cc_active
-	bsf		LEDr							; Indicate charging
+	bsf		LEDr							; indicate charging
 	bcf		CHRG_OUT
-	bsf		TRISJ,2							; Chrg-Out high impedance
+	bsf		TRISJ,2							; chrg-Out high impedance
 	movlw	.15
-	cpfsgt	batt_voltage+1					; Batt Voltage >= 16*256mV (4,096V)?
-	bra	charge_cc_active2				; No
+	cpfsgt	batt_voltage+1					; battery voltage >= 16*256mV (4.096 V)?
+	bra		charge_cc_active2				; NO
 	movlw	.81
-	cpfslt	batt_voltage+0					; Batt Voltage >= 80mV(+4096mV from batt_voltage+1)?
-	bra	charge_cv_active    				; Yes
+	cpfslt	batt_voltage+0					; battery voltage >= 80mV (+4096mV from batt_voltage+1)?
+	bra		charge_cv_active				; YES
 charge_cc_active2:
 	movlw	.10
 	movwf	get_bat_volt_counter
@@ -106,7 +106,7 @@
 	movff	ADRESL,batt_voltage+0			; store value
 	bcf		ADCON0,0						; power off ADC
 
-; Multiply with 2,006 to be exact here...
+; Multiply with 2.006 to be exact here...
 ;	bcf		STATUS,C
 ;	rlcf	xA+0,F
 ;
@@ -122,11 +122,10 @@
 	movff	batt_voltage+0,sub_b+0
 	movff	batt_voltage+1,sub_b+1
 	call	subU16							; sub_c = sub_a - sub_b
-	; Battery is 3,6V (>lithium_36v_low?)
+	; Battery is 3.6V (> lithium_36v_low?)
 	btfss	neg_flag
-	bra		get_battery_voltage4			; No, use 1,5V
-
-	bsf		battery_is_36v					; Yes, set flag (Cleared in power-on reset only!)
+	bra		get_battery_voltage4			; NO  - use 1.5V
+	bsf		battery_is_36v					; YES - set flag (Cleared in power-on reset only!)
 
 	; Check if the battery is near-dead already
 	movlw	LOW  lithium_36v_empty
@@ -134,9 +133,9 @@
 	movlw	HIGH lithium_36v_empty
 	movwf	sub_a+1
 	call	subU16							; sub_c = sub_a - sub_b
-	; Battery is not dead yet (>lithium_36v_empty?)
+	; Battery is not dead yet (> lithium_36v_empty)?
 	btfsc	neg_flag
-	bra		get_battery_voltage2			; Yes, battery is still ok
+	bra		get_battery_voltage2			; YES - battery is still ok
 
 	; Battery is probably dead very soon
 	; Set ">=24Ah used" into battery gauge registers
@@ -144,24 +143,24 @@
 	movff	WREG,battery_gauge+5
 
 get_battery_voltage2:
-	; Use 3,6V battery gauging mode
+	; Use 3.6V battery gauging mode
 	movff	battery_gauge+5,xC+3
 	movff	battery_gauge+4,xC+2
 	movff	battery_gauge+3,xC+1
 	movff	battery_gauge+2,xC+0
-	; battery_gauge:6 is nAs
-	; devide through 65536
-	; devide through battery_capacity:2
-	; Result is in percent
+	; battery_gauge: 6 is nAs
+	; divide through 65536
+	; divide through battery_capacity:2
+	; result is in percent
 	movff	internal_battery_capacity+0,xB+0
 	movff	internal_battery_capacity+1,xB+1
-	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	call	div32x16						; xC:4 = xC:4 / xB:2 with xA as remainder
 	movff	xC+0,lo
-	; Limit to 100
+	; limit to 100
 	movlw	.100
 	cpfslt	lo
 	movwf	lo
-	; lo will be between 0 (Full) and 100 (empty)
+	; lo will be between 0 (full) and 100 (empty)
 	movf	lo,W
 	sublw	.100
 	movwf	lo
@@ -169,9 +168,9 @@
 	movlw	.100
 	cpfslt	lo
 	movwf	lo
-	; lo will be between 100 (Full) and 0 (empty)
+	; lo will be between 100 (full) and 0 (empty)
 
-	; use 3,6V battery sensing based on 50mA load
+	; use 3.6V battery sensing based on 50 mA load
 	; 75%
 	movff	batt_voltage+0,sub_b+0
 	movff	batt_voltage+1,sub_b+1
@@ -221,18 +220,18 @@
 	movlw	.100
 	cpfslt	lo
 	movwf	lo
-	; lo will be between 100 (Full) and 0 (empty)
+	; lo will be between 100 (full) and 0 (empty)
 	movf	batt_percent,W
 	cpfsgt	lo								; keep batt_percent on the lowest value found
 	movff	lo,batt_percent					; store value
-	btfsc	battery_is_36v					; but always use computed value for 3,6V battery
+	btfsc	battery_is_36v					; but always use computed value for 3.6V battery
 	movff	lo,batt_percent					; store value
-	bcf		adc_running						; =1: The ADC is in use
+	bcf		adc_running						; =1: the ADC is in use
 	return
 
 get_battery_voltage4:
-	; Use 1,5V battery voltage mode
-	; Use approximation (batt_voltage:2-aa_15v_low)/4 = lo
+	; use 1.5V battery voltage mode
+	; use approximation (batt_voltage:2-aa_15v_low)/4 = lo
 	movff	batt_voltage+0,sub_a+0
 	movff	batt_voltage+1,sub_a+1
 	movlw	LOW  aa_15v_low
@@ -247,17 +246,17 @@
 	rrcf	sub_c+1
 	rrcf	sub_c+0							; /4
 	movff	sub_c+0,lo
-	bra		get_battery_voltage3d			; Check limits and return
+	bra		get_battery_voltage3d			; check limits and return
 
 	global	get_ambient_level
 get_ambient_level:							; starts ADC and waits until finished
 	btfsc	adc_running						; ADC in use?
-	return									; Yes, return
+	return									; YES - return
 
 	btfsc	ambient_sensor
-	bra		get_ambient_level1				; Normal ostc3 hardware
+	bra		get_ambient_level1				; normal OSTC3 hardware
 
-	banksel	isr_backup						; Back to Bank0 ISR data
+	banksel	isr_backup						; back to bank0 ISR data
 	movff	opt_brightness,isr1_temp
 	incf	isr1_temp,F						; adjust 0-2 to 1-3
 	movlw	ambient_light_max_high_cr		; cR and 2 hardware brightest setting
@@ -266,8 +265,8 @@
 	dcfsnz	isr1_temp,F
 	movlw	ambient_light_max_medium		; brightest setting
 
-	movff	WREG,ambient_light+0			; Set to max.
-	movff	ambient_light+0,max_CCPR1L		; Store value for dimming in TMR7 interrupt
+	movff	WREG,ambient_light+0			; set to max.
+	movff	ambient_light+0,max_CCPR1L		; store value for dimming in TMR7 interrupt
 	return
 
 get_ambient_level1:
@@ -281,7 +280,7 @@
 	bcf		ADCON0,0						; power off ADC
 
 	; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness)
-	; First: Divide by 16
+	; first: divide by 16
 	banksel	ambient_light
 	bcf		STATUS,C
 	rrcf	ambient_light+1
@@ -295,40 +294,40 @@
 	bcf		STATUS,C
 	rrcf	ambient_light+1
 	rrcf	ambient_light+0
-	; Result: ambient_light:2/16
-	; Now, make sure to have value between ambient_light_low and ambient_light_max
+	; result: ambient_light:2/16
+	; now make sure to have value between ambient_light_low and ambient_light_max
 
 	movlw	.254
-	tstfsz	ambient_light+1					; >255?
-	movwf	ambient_light+0					; avoid ADC clipping
+	tstfsz	ambient_light+1					; > 255 ?
+	movwf	ambient_light+0					; YES - avoid ADC clipping
 
-	incfsz	ambient_light+0,W				; =255?
-	bra		get_ambient_level2				; No, continue
+	incfsz	ambient_light+0,W				; = 255 ?
+	bra		get_ambient_level2				; NO - continue
 
 	movlw	.254
 	movwf	ambient_light+0					; avoid ADC clipping
 
 get_ambient_level2:
 ;	movlw	.10
-;	subwf	ambient_light+0,F				; Subtract 10 (ADC Offset)
+;	subwf	ambient_light+0,F				; subtract 10 (ADC Offset)
 ;	btfsc	STATUS,N
 ;	movwf	ambient_light+0					; avoid clipping
 
-	banksel	isr_backup						; Back to Bank0 ISR data
+	banksel	isr_backup						; back to bank0 ISR data
 	movff	opt_brightness,isr1_temp
 
 	btfsc	RCSTA1,7						; UART module on?
-	clrf	isr1_temp						; Yes, set temporally to eco mode
+	clrf	isr1_temp						; YES - set temporally to eco mode
 
 	incf	isr1_temp,F						; adjust 0-2 to 1-3
 
 	banksel	common							; flag is in bank1
 	movlw	ambient_light_max_high_cr		; cR and 2 hardware brightest setting
 	btfss	battery_gauge_available
-	movlw	ambient_light_max_high_15V		; 1,5V battery brightest setting
-	btfsc	battery_is_36v					; 3,6V battery in use?
-	movlw	ambient_light_max_high_36V		; 3,6V battery brightest setting
-	banksel	isr_backup						; Back to Bank0 ISR data
+	movlw	ambient_light_max_high_15V		; 1.5V battery brightest setting
+	btfsc	battery_is_36v					; 3.6V battery in use?
+	movlw	ambient_light_max_high_36V		; YES - 3.6V battery brightest setting
+	banksel	isr_backup						; back to bank0 ISR data
 
 	dcfsnz	isr1_temp,F
 	movlw	ambient_light_max_eco			; brightest setting
@@ -337,10 +336,10 @@
 
 	banksel	ambient_light
 	incf	ambient_light+0,F				; +1
-	cpfslt	ambient_light+0					; smaller then WREG?
-	movwf	ambient_light+0					; No, set to max.
+	cpfslt	ambient_light+0					; smaller than WREG?
+	movwf	ambient_light+0					; NO - set to max.
 
-	banksel	isr_backup						; Back to Bank0 ISR data
+	banksel	isr_backup						; back to bank0 ISR data
 	movff	opt_brightness,isr1_temp
 	incf	isr1_temp,F						; adjust 0-2 to 1-3
 	movlw	ambient_light_min_high			; darkest setting
@@ -353,139 +352,141 @@
 	movlw	ambient_light_min_high			; darkest setting
 
 	banksel	ambient_light
-	cpfsgt	ambient_light+0					; bigger then WREG?
-	movwf	ambient_light+0					; No, set to min
+	cpfsgt	ambient_light+0					; bigger than WREG?
+	movwf	ambient_light+0					; NO - set to min
 	banksel	common
 
-	movff	ambient_light+0,max_CCPR1L		; Store value for dimming in TMR7 interrupt
+	movff	ambient_light+0,max_CCPR1L		; store value for dimming in TMR7 interrupt
 	return
 
 	global	get_analog_inputs
-get_analog_inputs:							; starts ADC and waits until finished
+get_analog_inputs:							; start ADC and wait until finished
 	bsf		adc_running						; =1: The ADC is in use
 	btfsc	TFT_PWM
-	bra		get_analog_inputs				; Wait for PWM low
-	movlw	b'00100000'						; 2.048V Vref+ -> 1LSB = 500µV
+	bra		get_analog_inputs				; wait for PWM low
+	movlw	b'00100000'						; 2.048V Vref+ -> 1 LSB = 500 µV
 	movwf	ADCON1
 	movlw	b'00100001'						; power on ADC, select AN8
 	rcall	wait_adc
 	bcf		STATUS,C
 	rrcf	ADRESH,F						; /2
 	rrcf	ADRESL,W
-	; add to o2_mv_sensor1:2
+											; add to o2_mv_sensor1:2
 	addwf	o2_mv_sensor1+0,F
 	movf	ADRESH,W
 	addwfc	o2_mv_sensor1+1,F
-	; Devide by 2
+											; divide by 2
 	bcf		STATUS,C
 	rrcf	o2_mv_sensor1+1,F				; /2
 	rrcf	o2_mv_sensor1+0,F
 
 	movlw	HIGH ignore_mv
-	cpfsgt	o2_mv_sensor1+1					; >ignore_mv?
-	bra		get_analog_inputs2a				; No
-	; Yes, ignore this reading
+	cpfsgt	o2_mv_sensor1+1					; > ignore_mv ?
+	bra		get_analog_inputs2a				; NO
+											; YES - ignore this reading
 	clrf	o2_mv_sensor1+1
 	clrf	o2_mv_sensor1+0
 get_analog_inputs2a:
-	; Ignore 1,9mV noise for not-connected inputs
-	tstfsz	o2_mv_sensor1+1					; >25,5mV?
-	bra		get_analog_inputs2				; Yes, skip here
+											; ignore 1.9 mV noise for not-connected inputs
+	tstfsz	o2_mv_sensor1+1					; > 25.5mV ?
+	bra		get_analog_inputs2				; YES - skip here
 	movlw	.19
-	cpfsgt	o2_mv_sensor1+0					; >1,9mV?
-	clrf	o2_mv_sensor1+0					; no, clear result
+	cpfsgt	o2_mv_sensor1+0					; > 1.9mV ?
+	clrf	o2_mv_sensor1+0					; NO - clear result
 get_analog_inputs2:
 	movlw	b'00100101'						; power on ADC, select AN9
 	rcall	wait_adc
 	bcf		STATUS,C
 	rrcf	ADRESH,F						; /2
 	rrcf	ADRESL,W
-	; add to o2_mv_sensor2:2
+											; add to o2_mv_sensor2:2
 	addwf	o2_mv_sensor2+0,F
 	movf	ADRESH,W
 	addwfc	o2_mv_sensor2+1,F
-	; Devide by 2
+											; divide by 2
 	bcf		STATUS,C
 	rrcf	o2_mv_sensor2+1,F				; /2
 	rrcf	o2_mv_sensor2+0,F
 
 	movlw	HIGH ignore_mv
-	cpfsgt	o2_mv_sensor2+1					; >ignore_mv?
-	bra		get_analog_inputs3a				; No
-	; Yes, ignore this reading
+	cpfsgt	o2_mv_sensor2+1					; > ignore_mv ?
+	bra		get_analog_inputs3a				; NO
+											; YES - ignore this reading
 	clrf	o2_mv_sensor2+1
 	clrf	o2_mv_sensor2+0
 get_analog_inputs3a:
-	; Ignore 1,9mV noise for not-connected inputs
-	tstfsz	o2_mv_sensor2+1					; >25,5mV?
-	bra		get_analog_inputs3				; Yes, skip here
+											; ignore 1.9 mV noise for not-connected inputs
+	tstfsz	o2_mv_sensor2+1					; > 25.5 mV ?
+	bra		get_analog_inputs3				; YES - skip here
 	movlw	.19
-	cpfsgt	o2_mv_sensor2+0					; >1,9mV?
-	clrf	o2_mv_sensor2+0					; no, clear result
+	cpfsgt	o2_mv_sensor2+0					; > 1.9 mV ?
+	clrf	o2_mv_sensor2+0					; NO - clear result
 get_analog_inputs3:
 	movlw	b'00101001'						; power on ADC, select AN10
 	rcall	wait_adc
 	bcf		STATUS,C
 	rrcf	ADRESH,F						; /2
 	rrcf	ADRESL,W
-	; add to o2_mv_sensor3:2
+											; add to o2_mv_sensor3:2
 	addwf	o2_mv_sensor3+0,F
 	movf	ADRESH,W
 	addwfc	o2_mv_sensor3+1,F
-	; Devide by 2
+											; divide by 2
 	bcf		STATUS,C
 	rrcf	o2_mv_sensor3+1,F				; /2
 	rrcf	o2_mv_sensor3+0,F
 
 	movlw	HIGH ignore_mv
-	cpfsgt	o2_mv_sensor3+1					; >ignore_mv?
-	bra		get_analog_inputs4a ; No
-	; Yes, ignore this reading
+	cpfsgt	o2_mv_sensor3+1					; > ignore_mv ?
+	bra		get_analog_inputs4a				; NO
+											; YES - ignore this reading
 	clrf	o2_mv_sensor3+1
 	clrf	o2_mv_sensor3+0
 get_analog_inputs4a:
-	; Ignore 1,9mV noise for not-connected inputs
-	tstfsz	o2_mv_sensor3+1					; >25,5mV?
-	bra		get_analog_inputs4				; Yes, skip here
+											; ignore 1.9mV noise for not-connected inputs
+	tstfsz	o2_mv_sensor3+1					; > 25.5 mV ?
+	bra		get_analog_inputs4				; YES - skip here
 	movlw	.19
-	cpfsgt	o2_mv_sensor3+0					; >1,9mV?
-	clrf	o2_mv_sensor3+0					; no, clear result
+	cpfsgt	o2_mv_sensor3+0					; > 1.9 mV ?
+	clrf	o2_mv_sensor3+0					; NO - clear result
 get_analog_inputs4:
 	bcf		ADCON0,0						; power off ADC
-	bcf		adc_running						; =1: The ADC is in use
+	bcf		adc_running						; =1: the ADC is in use
 	return
 
-	global	piezo_config					; sets up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms)
-piezo_config:								; Settings between 20 and 200
+	global	piezo_config					; set up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms)
+piezo_config:								; settings between 20 and 200
 	clrf	TMR5H
 	clrf	TMR5L							; ~2sec
-	bcf		PIR5,TMR5IF						; Clear flag
+	bcf		PIR5,TMR5IF						; clear flag
 	bcf		switch_right
 	bcf		switch_left
 piezo_config0:
 	btfsc	switch_right
 	bra		piezo_config
 	btfsc	switch_left
-	bra		piezo_config					; Restart on button press
+	bra		piezo_config					; restart on button press
 
 	btfss	PIR5,TMR5IF
-	bra		piezo_config0					; Wait loop
+	bra		piezo_config0					; wait loop
 
 	bcf		INTCON,GIE
+
 	movff	opt_cR_button_right,WREG		; right button
 	btfsc	flip_screen						; 180° rotation ?
-	movff	opt_cR_button_left,WREG			; Yes, left button
+	movff	opt_cR_button_left,WREG			; YES - left button
 	rcall	piezo_config_tx
 
 	movff	opt_cR_button_left,WREG			; left button
 	btfsc	flip_screen						; 180° rotation ?
-	movff	opt_cR_button_right,WREG		; Yes, right button
+	movff	opt_cR_button_right,WREG		; YES - right button
 	rcall	piezo_config_tx
 
 	movlw	.20								; reserved
 	rcall	piezo_config_tx
 	movlw	.20								; reserved
 	rcall	piezo_config_tx
+
 	bsf		INTCON,GIE
 	return
 
@@ -512,32 +513,32 @@
 	setf	TMR5H
 	movlw	.255-.26 						; 26 x 31,5µs = 819us
 	movwf	TMR5L
-	bcf		PIR5,TMR5IF						; Clear flag
+	bcf		PIR5,TMR5IF						; clear flag
 piezo_config_wait_bit3:
 	btfss	PIR5,TMR5IF
-	bra		piezo_config_wait_bit3			; Wait loop
+	bra		piezo_config_wait_bit3			; wait loop
 	return
 
 	global	reset_battery_pointer
-reset_battery_pointer:						; Resets battery pointer 0x07-0x0C and battery_gauge:5
+reset_battery_pointer:						; reset battery pointer 0x07-0x0C and battery_gauge:5
 	extern	lt2942_charge_done
-	btfsc	battery_gauge_available			; Something to reset?
-	call	lt2942_charge_done				; Yes, reset accumulating registers to 0xFFFF
+	btfsc	battery_gauge_available			; something to reset?
+	call	lt2942_charge_done				; YES - reset accumulating registers to 0xFFFF
 	goto	reset_battery_internal_only		; and return
 
 
 	global	get_analog_switches
-get_analog_switches:						; starts ADC and waits until finished
-	btfsc	analog_switches
-	bra		get_analog_switches2
-	; no analog switches
-	bcf		analog_sw2_pressed
-	bcf		analog_sw1_pressed
-	return									; Done.
+get_analog_switches:						; start ADC and wait until finished
+	btfsc	analog_switches					; does the OSTC have analog switches?
+	bra		get_analog_switches2			; YES
+											; NO
+	bcf		analog_sw1_pressed				; NO  - clear flag for analog switch 1
+	bcf		analog_sw2_pressed				;     - clear flag for analog switch 2
+	return									;     - done
 get_analog_switches2:
 	btfsc	adc_running						; ADC in use?
-	return									; Yes, return
-
+	return									; YES - abort
+											; NO
 	movlw	b'00001001'						; left justified
 	movwf	ADCON2
 ;	movlw	b'00000000'						; Vref+ = Vdd
@@ -550,8 +551,8 @@
 	movlw	.0
 	addwfc	analog_sw2_raw+1
 	decfsz	analog_counter,F				; continue averaging?
-	bra		get_analog_switches2a			; Yes
-	; Done. Compute average
+	bra		get_analog_switches2a			; YES
+											; NO - done, compute average
 	bcf		STATUS,C
 	rrcf	analog_sw2_raw+1
 	rrcf	analog_sw2_raw+0				; /2
@@ -566,35 +567,35 @@
 	rrcf	analog_sw2_raw+0				; /16
 	movff	analog_sw2_raw+0,analog_sw2
 	clrf	analog_sw2_raw+1
-	clrf	analog_sw2_raw+0				; Reset average registers
+	clrf	analog_sw2_raw+0				; reset average registers
 ;	movlw	.16
 ;	movwf	analog_counter					; only once...
 get_analog_switches2a:
 	banksel	common
 	bcf		analog_sw2_pressed
-	movff	opt_cR_button_left,WREG			;20-100
+	movff	opt_cR_button_left,WREG			; 20-100
 	bcf		STATUS,C
-	rrcf	WREG							;/2 -> 10-50
+	rrcf	WREG							; /2 -> 10-50
 	bcf		STATUS,C
-	rrcf	WREG							;/2 -> 5-25
-	decf	WREG,W							;-1
-	decf	WREG,W							;-1
-	decf	WREG,W							;-1 -> 2-22
+	rrcf	WREG							; /2 -> 5-25
+	decf	WREG,W							; -1
+	decf	WREG,W							; -1
+	decf	WREG,W							; -1 -> 2-22
 	banksel	analog_sw2
-	btfss	button_polarity,1				;(1= normal, 0=inverted)
+	btfss	button_polarity,1				; (1= normal, 0=inverted)
 	bra		sw2_inverted
 	addwf	analog_sw2,W					; average (~128)
 	cpfsgt	ADRESH
 	bra		get_analog_sw1
 	banksel	common
-	bsf		analog_sw2_pressed				; Left button normal
+	bsf		analog_sw2_pressed				; left button normal
 	bra		get_analog_sw1
 sw2_inverted:
 	subwf	analog_sw2,W					; average (~128)
 	cpfslt	ADRESH
 	bra		get_analog_sw1
 	banksel	common
-	bsf		analog_sw2_pressed				; Left button inverted
+	bsf		analog_sw2_pressed				; left button inverted
 get_analog_sw1:
 	banksel	common
 	movlw	b'00101001'						; power on ADC, select AN10
@@ -605,8 +606,8 @@
 	movlw	.0
 	addwfc	analog_sw1_raw+1
 	tstfsz	analog_counter					; continue averaging?
-	bra		get_analog_switches1a			; Yes
-	; Done. Compute average
+	bra		get_analog_switches1a			; YES
+											; NO - done, compute average
 	bcf		STATUS,C
 	rrcf	analog_sw1_raw+1
 	rrcf	analog_sw1_raw+0				; /2
@@ -621,22 +622,22 @@
 	rrcf	analog_sw1_raw+0				; /16
 	movff	analog_sw1_raw+0,analog_sw1
 	clrf	analog_sw1_raw+1
-	clrf	analog_sw1_raw+0				; Reset average registers
+	clrf	analog_sw1_raw+0				; reset average registers
 	movlw	.16
 	movwf	analog_counter					; only once...
 get_analog_switches1a:
 	banksel	common
 	bcf		analog_sw1_pressed
-	movff	opt_cR_button_right,WREG		;20-100
+	movff	opt_cR_button_right,WREG		; 20-100
 	bcf		STATUS,C
-	rrcf	WREG							;/2 -> 10-50
+	rrcf	WREG							; /2 -> 10-50
 	bcf		STATUS,C
-	rrcf	WREG							;/2 -> 5-25
-	decf	WREG,W							;-1
-	decf	WREG,W							;-1
-	decf	WREG,W							;-1 -> 2-22
+	rrcf	WREG							; /2 -> 5-25
+	decf	WREG,W							; -1
+	decf	WREG,W							; -1
+	decf	WREG,W							; -1 -> 2-22
 	banksel	analog_sw1
-	btfss	button_polarity,0				;(1= normal, 0=inverted)
+	btfss	button_polarity,0				; (1= normal, 0=inverted)
 	bra		sw1_inverted
 	addwf	analog_sw1,W					; average (~128)
 	cpfsgt	ADRESH
@@ -652,13 +653,13 @@
 	bsf		analog_sw1_pressed				; right button inverted
 get_analog_sw_done:
 	banksel	common
-	movlw	b'10001101'						; Restore to right justified
+	movlw	b'10001101'						; restore to right justified
 	movwf	ADCON2
 	btfsc	analog_sw1_pressed
 	return
 	btfsc	analog_sw2_pressed
 	return
-	setf	TMR1H							; No button pressed, enhance timer1 to overflow quickly
+	setf	TMR1H							; no button pressed, enhance timer1 to overflow quickly
 	return
 
 	END
\ No newline at end of file
--- a/src/adc_lightsensor.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/adc_lightsensor.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -8,10 +8,10 @@
 ; HISTORY
 ;  2011-08-08 : [mH] moving from OSTC code
 
-    extern	get_battery_voltage         ; And percent...
-    extern	get_ambient_level
-    extern  reset_battery_pointer           ; Resets battery pointer 0x07-0x0C and battery_gauge:5
-    extern  reset_battery_internal_only	    ; internal registers only
-    extern  get_analog_inputs               ; Get AN8-10
-    extern  piezo_config                    ; Sets up piezo sensitivity of heinrichs weikamp Piezo buttons (~30ms)
-    extern  get_analog_switches		    ; Get analog switches
+	extern	get_battery_voltage				; and percent...
+	extern	get_ambient_level
+	extern	reset_battery_pointer			; resets battery pointer 0x07-0x0C and battery_gauge:5
+	extern	reset_battery_internal_only		; internal registers only
+	extern	get_analog_inputs				; get AN8-10
+	extern	piezo_config					; set up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms)
+	extern	get_analog_switches				; get analog switches
--- a/src/calibrate.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/calibrate.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File calibration.asm							REFACTORED VERSION V2.98
+;   File calibration.asm							REFACTORED VERSION V2.98b
 ;
 ;   o2 sensor calibration subroutines
 ;
@@ -8,209 +8,180 @@
 ;=============================================================================
 
 #include "hwos.inc"
-#include "shared_definitions.h"				; Mailbox between c and asm
+#include "shared_definitions.h"				; mailbox between c and asm
 #include "math.inc"
 #include "adc_lightsensor.inc"
 #include "eeprom_rs232.inc"
+#include "isr.inc"	
 
 
 calibrate	CODE
 
-	global	check_sensors					; Check O2 sensor thresholds for fallback and voting logic
-check_sensors:
-	; Check min_mv
-	movff	o2_mv_sensor1+0, sub_a+0
-	movff	o2_mv_sensor1+1, sub_a+1
-	movlw	LOW  min_mv
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	bsf		use_O2_sensor1					;=1: Use this sensor for deco
-	btfsc	neg_flag
-	bcf		use_O2_sensor1					;=1: Use this sensor for deco
+
+	global	transmit_setpoint				; transmit current setpoint from WREG (in cbar) to external electronics
+transmit_setpoint:
+	return									; 					!!!! FUNCTION IS CURRENTLY DISABLED !!!!
+	btfss	s8_digital						; S8 Digital connection existing?
+	return									; NO  - ignore
+											; YES - transmit setpoint from WREG
+	clrf	lo								; initialize checksum
+	movwf	hi								; store setpoint
+	movlw	0xAA							; start byte
+	rcall	tx_to_HUD						; transmit to HUD
+	movlw	0x60							; command new SP
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	hi,WREG							; SP in cbar
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	lo,WREG							; checksum
+	rcall	tx_to_HUD_cs					; transmit checksum
+	return
+
+tx_to_HUD:									; entry point to transmit a byte to the HUD
+	addwf	lo,F							; add byte to checksum
+tx_to_HUD_cs:								; entry point to transmit the checksum
+	movff	WREG,TXREG2						; transmit byte
+	call	rs232_wait_tx2					; wait for UART
+	return
+
 
-	movff	o2_mv_sensor2+0, sub_a+0
-	movff	o2_mv_sensor2+1, sub_a+1
-	movlw	LOW  min_mv
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	bsf		use_O2_sensor2					;=1: Use this sensor for deco
-	btfsc	neg_flag
-	bcf		use_O2_sensor2					;=1: Use this sensor for deco
+	global	calibrate_mix
+calibrate_mix:
+	; set usage and calibration flags as per default
+	bsf		use_O2_sensor1
+	bsf		use_O2_sensor2
+	bsf		use_O2_sensor3
+	bsf		sensor1_calibrated_ok
+	bsf		sensor2_calibrated_ok
+	bsf		sensor3_calibrated_ok
+
+	; check for HUD
+	btfss	s8_digital						; S8 Digital connection existing?
+	bra		calibrate_mix1					; NO  - skip HUD part
 
-	movff	o2_mv_sensor3+0, sub_a+0
-	movff	o2_mv_sensor3+1, sub_a+1
-	movlw	LOW  min_mv
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	bsf		use_O2_sensor3					;=1: Use this sensor for deco
-	btfsc	neg_flag
-	bcf		use_O2_sensor3					;=1: Use this sensor for deco
+	; calibrate any S8-connected HUD
+	clrf	lo								; initialize checksum
+	movlw	0xAA							; start byte
+	rcall	tx_to_HUD						; transmit to HUD
+	movlw	0x31							; calibration command
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	opt_calibration_O2_ratio,WREG	; calibration gas %O2
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	amb_pressure+0,WREG				; ambient pressure low byte
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	amb_pressure+1,WREG				; ambient pressure high byte
+	rcall	tx_to_HUD						; transmit to HUD
+	movff	lo,WREG							; checksum
+	rcall	tx_to_HUD_cs					; transmit to HUD
+;	bra		calibrate_mix2
 
-	; Check max_mv
-	movff	o2_mv_sensor1+0, sub_a+0
+	; calibrate internal sensors
+calibrate_mix1:								; compute %O2 * 100 * ambient_pressure[mbar] / 100
+	movff	opt_calibration_O2_ratio,WREG
+	mullw	.100
+	movff	PRODL,xA+0
+	movff	PRODH,xA+1
+	SAFE_2BYTE_COPY amb_pressure,xB 
+	call	mult16x16						; xA*xB=xC
+	movlw	LOW  .100
+	movwf	xB+0
+	movlw	HIGH .100
+	movwf	xB+1
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+
+	; keep a copy of the result
+	movff	xC+0,lo
+	movff	xC+1,hi
+	movff	xC+2,up
+	movff	xC+3,ex
+
+	; compute factor for sensor 1
+	movff	o2_mv_sensor1+0,xB+0
+	movff	o2_mv_sensor1+1,xB+1
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	movff	xC+0,opt_x_s1+0					; xC= ppO2/mV as factor for sensor 1
+	movff	xC+1,opt_x_s1+1
+
+	; restore result
+	movff	lo,xC+0
+	movff	hi,xC+1
+	movff	up,xC+2
+	movff	ex,xC+3
+
+	; compute factor for sensor 2
+	movff	o2_mv_sensor2+0,xB+0
+	movff	o2_mv_sensor2+1,xB+1
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	movff	xC+0,opt_x_s2+0					; xC= ppO2/mV as factor for sensor 2
+	movff	xC+1,opt_x_s2+1
+
+	; restore result
+	movff	lo,xC+0
+	movff	hi,xC+1
+	movff	up,xC+2
+	movff	ex,xC+3
+
+	; compute factor for sensor 3
+	movff	o2_mv_sensor3+0,xB+0
+	movff	o2_mv_sensor3+1,xB+1
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	movff	xC+0,opt_x_s3+0					; xC= ppO2/mV as factor for sensor 3
+	movff	xC+1,opt_x_s3+1
+
+	; check sensor 1 for min/max mV
+	movff	o2_mv_sensor1+0, sub_a+0		; get mV from sensor 1
 	movff	o2_mv_sensor1+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	btfss	neg_flag
-	bcf		use_O2_sensor1					;=1: Use this sensor for deco
+	rcall	calibrate_mix_helper			; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1
+	TSTFSZ	WREG							; sensor mV within thresholds?
+	bcf		use_O2_sensor1					; NO - clear usage flag
 
-	movff	o2_mv_sensor2+0, sub_a+0
+	; check sensor 2 for min/max mV
+	movff	o2_mv_sensor2+0, sub_a+0		; get mV from sensor 2
 	movff	o2_mv_sensor2+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	btfss	neg_flag
-	bcf		use_O2_sensor2					;=1: Use this sensor for deco
+	rcall	calibrate_mix_helper			; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1
+	TSTFSZ	WREG							; sensor mV within thresholds?
+	bcf		use_O2_sensor2					; NO - clear usage flag
 
-	movff	o2_mv_sensor3+0, sub_a+0
+	; check sensor 3 for min/max mV
+	movff	o2_mv_sensor3+0, sub_a+0		; get mV from sensor 3
 	movff	o2_mv_sensor3+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16							; sub_c = sub_a - sub_b
-	btfss	neg_flag
-	bcf		use_O2_sensor3					;=1: Use this sensor for deco
+	rcall	calibrate_mix_helper			; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1
+	TSTFSZ	WREG							; sensor mV within thresholds?
+	bcf		use_O2_sensor3					; NO - clear usage flag
 
-	btfss	hud_connection_ok				;=1: HUD connection ok
-	bra		check_sensor2					; No HUD/Digital data
+calibrate_mix2:
+	; check for HUD
+	btfss	hud_connection_ok				; HUD connection existing?
+	bra		calibrate_mix3					; NO - skip HUD part
 
-	; Copy disable flags from digital input
+	; Copy disable flags from HUD digital input
 	btfss	sensor1_active
 	bcf		use_O2_sensor1
 	btfss	sensor2_active
 	bcf		use_O2_sensor2
 	btfss	sensor3_active
 	bcf		use_O2_sensor3
-	return
-
-check_sensor2:
-	; Copy disable flags from internal calibration routine
-	btfss	sensor1_calibrated_ok
-	bcf		use_O2_sensor1
-	btfss	sensor2_calibrated_ok
-	bcf		use_O2_sensor2
-	btfss	sensor3_calibrated_ok
-	bcf		use_O2_sensor3
-	return
-
-
-	global	calibrate_mix
-calibrate_mix:
-	; calibrate S8 HUD
-	btfss	s8_digital						; S8 Digital?
-	bra		calibrate_mix2					; No
-
-	; Yes, calibrate any S8-connected HUD
-	clrf	lo								; Checksum
-	movlw	0xAA							; Start Byte
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movlw	0x31							; Calibrate
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movff	opt_calibration_O2_ratio,WREG	; Calibration gas %O2
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movff	amb_pressure+0,WREG				; Ambient pressure
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-	movff	amb_pressure+1,WREG
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movff	lo,TXREG2						; Checksum
-	call	rs232_wait_tx2
 
-calibrate_mix2:
-	movff	opt_calibration_O2_ratio,WREG	; Calibration gas %O2
-	mullw	.100
-	movff	PRODL,xA+0
-	movff	PRODH,xA+1
-	; (%O2*100)*[ambient,mbar]/100 -> xC
-	movff	amb_pressure+0,xB+0
-	movff	amb_pressure+1,xB+1
-	rcall	calibrate_mix2_helper
-	movff	o2_mv_sensor1+0,xB+0
-	movff	o2_mv_sensor1+1,xB+1
-	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	; xC= ppO2/mV
-	movff	xC+0,opt_x_s1+0
-	movff	xC+1,opt_x_s1+1					; Factor for Sensor1
+calibrate_mix3:
+	; clear calibration flags if sensors are not found to be ok
+	btfss	use_O2_sensor1					; sensor 1 out of range?
+	bcf		sensor1_calibrated_ok			; YES - disable this sensor
+	btfss	use_O2_sensor2					; sensor 2 out of range?
+	bcf		sensor2_calibrated_ok			; YES - disable this sensor
+	btfss	use_O2_sensor3					; sensor 3 out of range?
+	bcf		sensor3_calibrated_ok			; YES - disable this sensor
 
-	movff	opt_calibration_O2_ratio,WREG	; Calibration gas %O2
-	mullw	.100
-	movff	PRODL,xA+0
-	movff	PRODH,xA+1
-	; (%O2*100)*[ambient,mbar]/100 -> xC
-	movff	amb_pressure+0,xB+0
-	movff	amb_pressure+1,xB+1
-	rcall	calibrate_mix2_helper
-	movff	o2_mv_sensor2+0,xB+0
-	movff	o2_mv_sensor2+1,xB+1
-	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	; xC= ppO2/mV
-	movff	xC+0,opt_x_s2+0
-	movff	xC+1,opt_x_s2+1					; Factor for Sensor2
-
-	movff	opt_calibration_O2_ratio,WREG	; Calibration gas %O2
-	mullw	.100
-	movff	PRODL,xA+0
-	movff	PRODH,xA+1
-	; (%O2*100)*[ambient,mbar]/100 -> xC
-	movff	amb_pressure+0,xB+0
-	movff	amb_pressure+1,xB+1
-	rcall	calibrate_mix2_helper
-	movff	o2_mv_sensor3+0,xB+0
-	movff	o2_mv_sensor3+1,xB+1
-	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	; xC= ppO2/mV
-	movff	xC+0,opt_x_s3+0
-	movff	xC+1,opt_x_s3+1					; Factor for Sensor3
-
-	bsf		sensor1_calibrated_ok
-	bsf		sensor2_calibrated_ok
-	bsf		sensor3_calibrated_ok			; Set flags prior check
-
-	rcall	check_sensors					; Check O2 sensor thresholds min_mv and max_mv and set use_02_sensorX flags
-	; initialize internal calibration flags
-	btfss	use_O2_sensor1					; Sensor out of range?
-	bcf		sensor1_calibrated_ok			; Yes, disable this sensor
-	btfss	use_O2_sensor2					; Sensor out of range?
-	bcf		sensor2_calibrated_ok			; Yes, disable this sensor
-	btfss	use_O2_sensor3					; Sensor out of range?
-	bcf		sensor3_calibrated_ok			; Yes, disable this sensor
-
-	; When no sensor is found, enable all three to show error state
+	; When no sensor is found, enable all three to show error state and clear calibration factors
 	btfsc	use_O2_sensor1
 	return
 	btfsc	use_O2_sensor2
 	return
 	btfsc	use_O2_sensor3
 	return
+	; Enable all sensors
 	bsf		use_O2_sensor1
 	bsf		use_O2_sensor2
 	bsf		use_O2_sensor3
-	; Clear factors
+	; Clear calibration factors
 	banksel opt_x_s1+0
 	clrf	opt_x_s1+0
 	clrf	opt_x_s1+1
@@ -221,90 +192,60 @@
 	banksel	common
 	return
 
-
-calibrate_mix2_helper:
-	call	mult16x16						; xA*xB=xC
-	movlw	LOW  .100
-	movwf	xB+0
-	movlw	HIGH .100
-	movwf	xB+1
-	goto	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder (And return)
+calibrate_mix_helper:
+	movlw	LOW  min_mv						; load minimum threshold...
+	movwf	sub_b+0							; ...into sub_b
+	movlw	HIGH min_mv
+	movwf	sub_b+1
+	call	sub16							; sub_c = sub_a - sub_b
+	btfsc	neg_flag						; sensor mV lower than minimum threshold?
+	retlw	.1								; YES - return signaling threshold violation
+	movlw	LOW  max_mv						; load maximum threshold...
+	movwf	sub_b+0							; ...into sub_b
+	movlw	HIGH max_mv
+	movwf	sub_b+1
+	call	sub16							; sub_c = sub_a - sub_b
+	btfss	neg_flag						; sensor mV higher than maximum threshold?
+	retlw	.1								; YES - return signaling threshold violation
+	retlw	.0								; NO  - return signaling min/max ok
 
 
 	global	compute_mvolts_for_all_sensors
-compute_mvolts_for_all_sensors:				; Compute mV or all sensors (S8 Mode)
+compute_mvolts_for_all_sensors:				; compute mV or all sensors (S8 mode)
 ; compute AD results in 100µV steps (16bit/sensor)
 ; 24bit AD result is in 244,1406541nV
 ; Divide 24bit value through 409,5999512 -> 410 (0,01% error)
 	#DEFINE	ad2mv_factor .410
+	movlw	LOW  ad2mv_factor
+	movwf	xB+0
+	movlw	HIGH ad2mv_factor
+	movwf	xB+1
 	; Sensor 1
 	clrf	xC+3
 	movff	s8_rawdata_sensor1+2,xC+2
 	movff	s8_rawdata_sensor1+1,xC+1
 	movff	s8_rawdata_sensor1+0,xC+0
-	movlw	LOW  ad2mv_factor
-	movwf	xB+0
-	movlw	HIGH ad2mv_factor
-	movwf	xB+1
 	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+1,o2_mv_sensor1+1
-	movff	xC+0,o2_mv_sensor1+0			; in 100uV steps
+	movff	xC+0,o2_mv_sensor1+0			; in 100 uV steps
 	; Sensor 2
 	clrf	xC+3
 	movff	s8_rawdata_sensor2+2,xC+2
 	movff	s8_rawdata_sensor2+1,xC+1
 	movff	s8_rawdata_sensor2+0,xC+0
-	movlw	LOW  ad2mv_factor
-	movwf	xB+0
-	movlw	HIGH ad2mv_factor
-	movwf	xB+1
 	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+1,o2_mv_sensor2+1
-	movff	xC+0,o2_mv_sensor2+0			; in 100uV steps
+	movff	xC+0,o2_mv_sensor2+0			; in 100 uV steps
 	; Sensor 3
 	clrf	xC+3
 	movff	s8_rawdata_sensor3+2,xC+2
 	movff	s8_rawdata_sensor3+1,xC+1
 	movff	s8_rawdata_sensor3+0,xC+0
-	movlw	LOW  ad2mv_factor
-	movwf	xB+0
-	movlw	HIGH ad2mv_factor
-	movwf	xB+1
 	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+1,o2_mv_sensor3+1
-	movff	xC+0,o2_mv_sensor3+0			; in 100uV steps
-
-	bcf		new_s8_data_available			; Clear flag
-	return									; Done.
-
-
-	global	transmit_setpoint				; Transmit current setpoint from WREG (in cbar) to external electronics
-transmit_setpoint:
-	return									; 					!!!! FUNCTION IS CURRENTLY DISABLED !!!!
-	btfss	s8_digital						; S8 Digital?
-	return									; No, ignore
+	movff	xC+0,o2_mv_sensor3+0			; in 100 uV steps
 
-	; Yes, transmit setpoint from WREG
-	movwf	hi								; Store setpoint
-	clrf	lo								; Checksum
-	movlw	0xAA							; Start Byte
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movlw	0x60							; New SP
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movff	hi,WREG							; SP in cbar
-	addwf	lo,F
-	movff	WREG,TXREG2
-	call	rs232_wait_tx2
-
-	movff	lo,TXREG2						; Checksum
-	call	rs232_wait_tx2
-	return
-
+	bcf		new_s8_data_available			; clear flag
+	return									; done
 
 	END
\ No newline at end of file
--- a/src/color_processor.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/color_processor.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File File color_processor.asm									## V2.98
+;   File File color_processor.asm									## V2.98c
 ;
 ;   Decompress and draw an image.
 ;
@@ -19,61 +19,52 @@
 ; Trashed: TBLPTR, TABLAT, FSR2, PROD, win_width, win_height
 ;
 ; ImageBloc:
-;       db  widthx2, height
-;       db  nbColors, 0     ; Unused yet... Should be 0 to keep packing happy.
+;       db  widthx2,  height
+;       db  nbColors, 0     ; 0 = unused yet, should remain 0 to keep packing happy
 ;       dw  color0, color1, color2, color3, ...
-;       db  ...packed pixels...
+;       db  packed pixels...
 ;
 ; Limitations:
-; * nbColors should be <= 15.
-; * image width should be even.
-; * image left border should be on even position too.
+; * nbColors <= 127
+; * image width should be even
+; * image left border should be on even position, too
+;
 ; Compressed format:
-; - Upper nibble = color, lower nibble = count-1.
-; - All bytes F* accumulates to make count larger than 16.
-; Eg. 00          is 1 pixel  color 0
-;     07          is 8 pixels color 0
-;     70          is 1 pixel  color 7
-;     bf          is 16 pixels of color .11
-;     F1 F2 F3 04 is 0x1235 pixels of color 0.
+; - 1-3 bytes pixel count, followed by 1 byte pixel color
+; - bit 7 = 1: byte holds pixel count in bits 6-0
+; - bit 7 = 0: byte holds pixel color in bits 6-0
+; - all pixel count bytes accumulate:
+;   - 1 byte  pixel count: 1xxxxxxx                   ->  7 bit pixel count
+;   - 2 bytes pixel count: 1yyyyyyy 1xxxxxxx          -> 14 bit pixel count
+;   - 3 bytes pixel count: 1zzzzzzz 1yyyyyyy 1xxxxxxx -> 21 bit pixel count
+;
+; Pixels are written column by column from left to right, with columns down first.
 ;
 ;-----------------------------------------------------------------------------
 
-#include "hwos.inc"
-#include "tft.inc"
+#include	"hwos.inc"
+#include	"tft.inc"
+
+color_proc		CODE
 
 ;-----------------------------------------------------------------------------
-;
-; Note: Some variables (win_width, win_height) are in BANK0 !
-basic	CODE
+; Note: some variables (win_width, win_height) are in BANK 0 !
+
 	global	color_image
 color_image:
-	banksel	common					; Bank1, just to be sure...
+	banksel	common					; Bank 1, just to be sure...
 
-	;---- Get image parameters -------------------------------------------
+	;---- Get image size -----------------------------------------------
 	tblrd*+
 	movff	TABLAT,win_width
 	tblrd*+
 	movff	TABLAT,win_height
-	tblrd*+
-	movff	TABLAT,lo				; image colors
-	tblrd*+							; Skip one byte (future flags ?)
-	;---- Copy color table -----------------------------------------------
-	movf	lo,W
-	lfsr	FSR2,buffer
-get_colors_loop:
-	tblrd*+
-	movff	TABLAT,POSTINC2
-	tblrd*+
-	movff	TABLAT,POSTINC2
-	decfsz	WREG
-	bra		get_colors_loop
 
 	; Compute width * height * 2 : the number of pixels to write.
 	clrf	img_pixels+2
 	movf	win_width,W				; Compute number of pixels to draw
 	mulwf	win_height				; 0 .. 160x240
-	bcf		STATUS,C				; BEWARE: mulwf does not reset carry flag !
+	bcf		STATUS,C				; BEWARE: mulwf does not reset carry flag!
 	rlcf	PRODL					; x2 --> 0 .. 320x240, might be > 0xFFFF
 	rlcf	PRODH
 	movff	PRODL, img_pixels+0
@@ -92,6 +83,9 @@
 	call	TFT_box_write
 	Index_out 0x22
 
+	;---- Read the colors ------------------------------------------------
+	rcall	get_colors
+
 	;---- Decode pixels --------------------------------------------------
 color_image_loop_xy:
 	; Get pixel count
@@ -132,7 +126,6 @@
 	movlw	0
 	subwfb	img_pixels+2,F
 
-color_image_not_over:
 	infsnz	img_count+0				; Increment count
 	incf	img_count+1
 
@@ -150,7 +143,7 @@
 	decfsz	img_count+1
 	bra		color_image_loop_pixel
 	bsf		INTCON,GIE
-	
+
 	; And count (on a 24bit counter)
 	clrf	WREG					; Make a 24bit decrement
 	decf	img_pixels+0
@@ -163,4 +156,25 @@
 	Index_out 0x00
 	return
 
+
+	global	get_colors
+get_colors:
+	tblrd*+							; read number of image colors
+	movff	TABLAT,lo				; store in lo
+	tblrd*+							; skip one spare byte (future flags ?)
+	movf	lo,W
+	lfsr	FSR2,buffer				; set up buffer as storage for the colors
+get_colors_loop:
+	tblrd*+
+	btfss	use_custom_colors		; shall custom colors be used?
+	movff	TABLAT,POSTINC2			; NO
+	tblrd*+
+	btfss	use_custom_colors		; shall custom colors be used?
+	movff	TABLAT,POSTINC2			; NO
+	decfsz	WREG
+	bra		get_colors_loop
+
+	bcf		use_custom_colors		; clear custom colors request
+	return
+
 	END
--- a/src/colorschemes.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/colorschemes.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -6,21 +6,21 @@
 
 ; Dive mode
 ; Standard
-#DEFINE color_scheme_divemode_mask1     color_green
-#DEFINE color_scheme_divemode_std1      color_white
-#DEFINE color_scheme_divemode_dis1      color_lightblue     ;color_grey
+#DEFINE color_scheme_divemode_mask1		color_green
+#DEFINE color_scheme_divemode_std1		color_white
+#DEFINE color_scheme_divemode_dis1		color_lightblue		; color_grey
 
 ; Redish
-#DEFINE color_scheme_divemode_mask2     color_red
-#DEFINE color_scheme_divemode_std2      color_orange
-#DEFINE color_scheme_divemode_dis2      color_dark_red
+#DEFINE color_scheme_divemode_mask2		color_red
+#DEFINE color_scheme_divemode_std2		color_orange
+#DEFINE color_scheme_divemode_dis2		color_violet
 
 ; greenish
-#DEFINE color_scheme_divemode_mask3     color_cyan
-#DEFINE color_scheme_divemode_std3      color_green
-#DEFINE color_scheme_divemode_dis3      color_dark_green
+#DEFINE color_scheme_divemode_mask3		color_cyan
+#DEFINE color_scheme_divemode_std3		color_green
+#DEFINE color_scheme_divemode_dis3		color_greenish
 
 ; blueish
-#DEFINE color_scheme_divemode_mask4     color_blue
-#DEFINE color_scheme_divemode_std4      color_lightblue
-#DEFINE color_scheme_divemode_dis4      color_deepblue
\ No newline at end of file
+#DEFINE color_scheme_divemode_mask4		color_blue
+#DEFINE color_scheme_divemode_std4		color_lightblue
+#DEFINE color_scheme_divemode_dis4		color_pink
\ No newline at end of file
--- a/src/comm.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/comm.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File comm.asm									REFACTORED VERSION 2.98
+;   File comm.asm									REFACTORED VERSION V2.99d
 ;
 ;   RS232 via USB
 ;
@@ -8,7 +8,7 @@
 ;=============================================================================
 ; HISTORY
 ;  2011-08-22 : [mH] Creation
-;  2012-02-11 : [jDG] Added "c" set custom text, and "i" identify.
+;  2012-02-11 : [jDG] Added "c" set custom text, and "i" identify
 
 #include "hwos.inc"
 #include "eeprom_rs232.inc"
@@ -22,6 +22,7 @@
 #include "rtc.inc"
 #include "adc_lightsensor.inc"
 #include "shared_definitions.h"
+#include "math.inc"
 
 	extern	restart
 	extern	option_reset_all
@@ -29,13 +30,18 @@
 	extern	gaslist_cleanup_list
 	extern	get_first_gas_to_WREG
 	extern	get_first_dil_to_WREG
+	extern	option_save_all
 	extern	vault_decodata_into_eeprom
-	extern	color_image
+	extern  menu_processor_bottom_line_comm
+
+ IFDEF _rx_functions
+	extern	I2C_update_OSTC_rx
+ ENDIF
 
 
-#DEFINE timeout_comm_pre_mode	.240	; Pre-loop
-#DEFINE timeout_comm_mode		.120	; Download mode
-#DEFINE timeout_service_mode	.120	; Service mode
+#DEFINE timeout_comm_pre_mode	.240	; pre-loop
+#DEFINE timeout_comm_mode		.120	; download mode
+#DEFINE timeout_service_mode	.120	; service mode
 
 #DEFINE comm_title_row			.0
 #DEFINE comm_title_column_usb	.50
@@ -50,143 +56,141 @@
 #DEFINE comm_status2_column		comm_status1_column
 #DEFINE comm_status3_row		.130
 #DEFINE comm_status3_column		comm_status1_column
+#DEFINE	comm_status4_row		.160
+#DEFINE	comm_status4_column		comm_status1_column
+
 
 #DEFINE comm_warning_row		.160
 #DEFINE comm_warning_column		.65
 
-comm code
+comm	CODE
+
+;=============================================================================
 
 	; test for comm
 	global	comm_mode, comm_mode0
 comm_mode:
 	WAITMS	d'1'
 	btfss	vusb_in						; USB plugged in?
-	return								; No, it was only a glitch
+	return								; NO - it was only a glitch
 	WAITMS	d'1'
 	btfss	vusb_in						; USB plugged in?
-	return								; No, it was only a glitch
+	return								; NO - it was only a glitch
 comm_mode0:
 	call	TFT_ClearScreen
 	WIN_COLOR color_greenish
-	btfsc	ble_available				; ble available
+	btfsc	ble_available							; BLE available
 	bra		comm_mode0_ble
 	WIN_SMALL comm_title_column_usb, comm_title_row
-	STRCPY_TEXT_PRINT tUsbTitle			; USB Mode
+	STRCPY_TEXT_PRINT tUsbTitle						; USB mode
 	bra		comm_mode0_common
 comm_mode0_ble:
 	WIN_SMALL comm_title_column_ble, comm_title_row
-	STRCPY_TEXT_PRINT tBleTitle			; BLE Mode
+	STRCPY_TEXT_PRINT tBleTitle						; BLE mode
 comm_mode0_common:
 	call	TFT_standard_color
 	WIN_TOP  .10
 	WIN_LEFT .1
-	movlw	0xDE
-	movwf	TBLPTRL
-	movlw	0xEE
-	movwf	TBLPTRH
-	movlw	0x01
-	movwf	TBLPTRU
-	call	color_image					; Show USB logo
+	TFT_WRITE_PROM_IMAGE_BY_ADDR usb_ble_logo_block
 	WIN_SMALL comm_status1_column,comm_status1_row
-	STRCPY_TEXT_PRINT tUsbStarting		; Starting...
-	call	TFT_serial					; Show serial and firmware version
-	bcf		enable_screen_dumps			; =1: Ignore vin_usb, wait for "l" command (Screen dump)
+	STRCPY_TEXT_PRINT tUsbStarting					; starting...
+	call	menu_processor_bottom_line_comm			; serial and fw version
+	call	option_save_all							; save all settings into EEPROM (comm mode may be entered after settings have been changed without leaving the menu in between)
+
+ IFDEF _screendump
+	bcf		enable_screen_dumps			; =1: ignore vin_usb, wait for "l" command (screen dump)
+ ENDIF
+
 	bcf		switch_right
 	bcf		comm_service_enabled
 	bsf		menubit
-	bcf		battery_removed_in_usb		; =1: The battery has been removed in USB (properly not used for anything useful)
+	bcf		battery_removed_in_usb		; =1: the battery has been removed in USB (properly not used for anything useful)
 	movlw	timeout_comm_pre_mode
 	movwf	comm_timeout
 	WIN_SMALL comm_status1_column+.80,comm_status1_row
-	STRCPY_TEXT_PRINT tUsbStartDone		; Done...
-	call	enable_rs232				; Also sets to speed_normal ...
+	STRCPY_TEXT_PRINT tUsbStartDone		; done...
+	call	enable_rs232				; also sets to speed_normal ...
 comm_mode1:
 	bcf		onesecupdate
 	bcf		LEDr
 	dcfsnz	comm_timeout,F
-	bra		comm_service_exit			; Timeout -> Exit
+	bra		comm_service_exit			; timeout -> exit
 comm_mode2:
-	rcall	comm_write_get_byte
+	rcall	comm_get_byte
 
 	movlw	0xAA						; start byte=0xAA?
 	cpfseq	RCREG1
 	bra		comm_mode2a
-	bra		comm_mode2b					; Start byte for service mode found
+	bra		comm_mode2b					; start byte for service mode found
 comm_mode2a:
 	movlw	0xBB						; start byte=0xBB?
 	cpfseq	RCREG1
 	bra		comm_mode2c
-	bra		comm_download_mode			; Start byte for download mode found
+	bra		comm_download_mode			; start byte for download mode found
 
 comm_mode2c:
 	btfss	vusb_in						; USB plugged in?
-	bra		comm_service_exit_nousb_delay	; Disconnected -> Exit
+	bra		comm_service_exit_nousb_delay	; disconnected -> exit
 comm_mode4a:
-	btfsc	switch_right				; Abort with right
+	btfsc	switch_right				; abort with right
 	bra		comm_service_exit
 
 	btfsc	onesecupdate
 	bra		comm_mode1
 
-	bra		comm_mode2					; Cycle
+	bra		comm_mode2					; cycle
 
 comm_mode2b:
 	; Startbyte found
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	movlw	0x4B
-	movwf	TXREG1						; Send Answer
+	movwf	TXREG1						; send answer
 	; Now, check comm command
 
-	rcall	comm_write_get_byte			; first byte
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_get_byte				; first byte
+	rcall	comm_write_byte				; wait for UART
 	movff	RCREG1,TXREG1				; Echo
 	movlw	UPPER comm_service_key
 	cpfseq	RCREG1
-	bra		comm_mode1					; Wrong -> Restart
-	rcall	comm_write_get_byte			; second byte
-	rcall	comm_rs232_wait_tx			; Wait for UART
-	movff	RCREG1,TXREG1				; Echo
+	bra		comm_mode1					; wrong -> restart
+	rcall	comm_get_byte				; second byte
+	rcall	comm_write_byte				; wait for UART
+	movff	RCREG1,TXREG1				; echo
 	movlw	HIGH (comm_service_key & 0xFFFF)
 	cpfseq	RCREG1
-	bra		comm_mode1					; Wrong -> Restart
-	rcall	comm_write_get_byte			; third byte
-	rcall	comm_rs232_wait_tx			; Wait for UART
-	movff	RCREG1,TXREG1				; Echo
+	bra		comm_mode1					; wrong -> restart
+	rcall	comm_get_byte				; third byte
+	rcall	comm_write_byte				; wait for UART
+	movff	RCREG1,TXREG1				; echo
 	movlw	LOW comm_service_key
 	cpfseq	RCREG1
-	bra		comm_mode1					; Wrong -> Restart
+	bra		comm_mode1					; wrong -> restart
 
 	; Enable comm service mode
 	WIN_SMALL comm_status2_column, comm_status2_row
-	STRCPY_TEXT_PRINT tUsbServiceMode	; Service mode enabled
-	bsf		comm_service_enabled		; Set flag...
+	STRCPY_TEXT_PRINT tUsbServiceMode	; service mode enabled
+	bsf		comm_service_enabled		; set flag...
 	bra		comm_download_mode0			; ... but use common routine
 
 comm_service_exit_nousb_delay:
 	WAITMS	d'200'
 	btfsc	vusb_in						; USB plugged in?
-	bra		comm_mode4a					; (Still) connected, return
-comm_service_exit_nousb:				; Disconnected -> Exit
+	bra		comm_mode4a					; YES - (still) connected, return
+comm_service_exit_nousb:				; NO  - disconnected -> exit
 	WIN_SMALL comm_status3_column, comm_status3_row
-	STRCPY_TEXT_PRINT tUsbClosed		; Port closed
+	STRCPY_TEXT_PRINT tUsbClosed		; port closed
 	bra		comm_service_exit_common
 
 comm_service_exit:
 	WIN_SMALL	comm_status3_column, comm_status3_row
-	STRCPY_TEXT_PRINT	tUsbExit		; Exited
+	STRCPY_TEXT_PRINT	tUsbExit		; exited
 comm_service_exit_common:
-	rcall	comm_rs232_wait_tx			; Wait for UART
-	movlw	0xFF						; Reply FF
-	movwf	TXREG1						; Send Answer
+	rcall	comm_write_byte				; wait for UART
+	movlw	0xFF						; reply FF
+	movwf	TXREG1						; send answer
 
-	; Wait 1 second
-	bcf		onesecupdate
-	btfss	onesecupdate
-	bra		$-2
-	; Wait 1 second
-	bcf		onesecupdate
-	btfss	onesecupdate
-	bra		$-2
+	call	wait_1s						; wait 1 second
+	call	wait_1s						; wait 1 second
 
 	call	disable_rs232
 	goto	restart
@@ -196,50 +200,50 @@
 comm_service_ll_bootloader:
 	bsf		LEDr
 	WIN_SMALL comm_status3_column, comm_status3_row
-	STRCPY_TEXT_PRINT tUsbLlBld					; Low Level Bootloader started
+	STRCPY_TEXT_PRINT tUsbLlBld							; low level bootloader started
 	WIN_TOP  comm_warning_row
 	WIN_LEFT comm_warning_column
-	TFT_WRITE_PROM_IMAGE dive_warning2_block	; Show Warning icon
+	TFT_WRITE_PROM_IMAGE_BY_LABEL dive_warning2_block	; show warning icon
 	goto	0x1FF0C
 
 ;-----------------------------------------------------------------------------
 ; send firmware to bootloader
 ;
 comm_send_firmware:
-	movlw	0x50							; send echo
+	movlw	0x50						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 
 	; Read 5 bytes into buffer.
 	lfsr	FSR2,buffer
-	movlw	.5								; counter
+	movlw	.5							; counter
 	movwf	lo
-	movlw	0x55							; 5'ft byte checksum.
+	movlw	0x55						; 5'ft byte checksum
 	movwf	hi
 
 comm_send_firmware_loop:
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_send_firmware_abort		; No, abort!
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_send_firmware_abort	; NO - abort
 	movf	RCREG1,W
-	movwf	POSTINC2						; Store checksum byte.
-	xorwf	hi,F							; Also xor into checksum
-	rlncf	hi,F							; And rotate it.
+	movwf	POSTINC2					; store checksum byte
+	xorwf	hi,F						; also xor into checksum
+	rlncf	hi,F						; and rotate it
 	decfsz	lo,F
 	bra		comm_send_firmware_loop
 
-	; Check that 5ft byte checksum's checksum
+	; check that 5ft byte checksum's checksum
 	movf	hi,W
 	bnz		comm_send_firmware_failed
 
-	movlw	0x4C							; send OK
+	movlw	0x4C						; send OK
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 
 	; Passed: goto second stage verification.
 	; NOTE: Bootloader is Bank0. With buffer at address 0x200.
-	call	vault_decodata_into_eeprom		; Store last deco data (And Time/Date) into EEPROM
-	goto	0x1FDF0							; And pray...
+	call	vault_decodata_into_eeprom	; store last deco data (and time/date) into EEPROM
+	goto	0x1FDF0						; and pray...
 
 comm_send_firmware_failed:
 	WIN_SMALL comm_string_column, comm_string_row
@@ -248,9 +252,9 @@
 
 comm_send_firmware_abort:
 
-	movlw	0xFF							; send ABORTED byte.
+	movlw	0xFF						; send ABORTED byte
 	movwf	TXREG1
-	bra		comm_download_mode0				; Done.
+	bra		comm_download_mode0			; done
 
 ;-----------------------------------------------------------------------------
 ; Reset to Dive 1 in logbook
@@ -261,111 +265,111 @@
 	bra		comm_download_mode0				; done
 
 ;-----------------------------------------------------------------------------
-comm_reset_battery_gauge:					; Resets battery gauge registers
-	call	reset_battery_pointer			; Resets battery pointer 0x07-0x0C and battery_gauge:5
-	bra		comm_download_mode0				; Done.
+comm_reset_battery_gauge:				; resets battery gauge registers
+	call	reset_battery_pointer		; resets battery pointer 0x07-0x0C and battery_gauge:5
+	bra		comm_download_mode0			; done
 
 ;-----------------------------------------------------------------------------
-; erases range in 4kB steps
+; erases range in 4 kB steps
 
 comm_erase_range4kb:
-	movlw	0x42							; send echo
+	movlw	0x42						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
-	bcf		INTCON,GIE						; All interrupts off!
-	rcall	comm_get_flash_address			; Get three bytes address or return
-	btfsc	rs232_receive_overflow			; Got Data?
-	bra		comm_download_mode0				; No, Done.
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_write_byte				; wait for UART
+	bcf		INTCON,GIE					; all interrupts off!
+	rcall	comm_get_flash_address		; get three bytes address or return
+	btfsc	rs232_receive_overflow		; got data?
+	bra		comm_download_mode0			; NO - done
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - done
 	movff	RCREG1,lo
 	; Got 4 bytes: 3 bytes address and 1 byte (lo) amount of 4kB blocks
 comm_erase_range4kb_loop:
-	call	ext_flash_erase4kB				; Erase block!
+	call	ext_flash_erase4kB			; erase block
 	movlw	0x10
 	addwf	ext_flash_address+1,F
 	movlw	.0
-	addwfc	ext_flash_address+2,F			; Increase address by .4096, or 0x1000
+	addwfc	ext_flash_address+2,F		; increase address by .4096, or 0x1000
 	decfsz	lo,F
-	bra		comm_erase_range4kb_loop		; Loop until lo=zero
-	bra		comm_download_mode0				; Done (Sends the 4C OK too).
+	bra		comm_erase_range4kb_loop	; loop until lo=zero
+	bra		comm_download_mode0			; done (sends the 4C OK too)
 
 ;-----------------------------------------------------------------------------
 
-comm_erase_4kb:								; Get 3 bytes start address
-	bcf		INTCON,GIE						; All interrupts off!
+comm_erase_4kb:							; get 3 bytes start address
+	bcf		INTCON,GIE					; all interrupts off
 
-	rcall	comm_get_flash_address			; Get three bytes address or return
-	btfsc	rs232_receive_overflow			; Got Data?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_get_flash_address		; get three bytes address or return
+	btfsc	rs232_receive_overflow		; got data?
+	bra		comm_download_mode0			; NO - done
 
-	call	ext_flash_erase4kB				; Erase one block
-	bra		comm_download_mode0				; Done.
+	call	ext_flash_erase4kB			; erase one block
+	bra		comm_download_mode0			; done
 
 ;-----------------------------------------------------------------------------
 
-comm_write_range:							; Get 3 bytes start address
-	movlw	0x30							; send echo
+comm_write_range:						; get 3 bytes start address
+	movlw	0x30						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 
-	bcf		INTCON,GIE						; All interrupts off!
+	bcf		INTCON,GIE					; all interrupts off
 
-	rcall	comm_get_flash_address			; Get three bytes address or return
-	btfsc	rs232_receive_overflow			; Got Data?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_get_flash_address		; get three bytes address or return
+	btfsc	rs232_receive_overflow		; got data?
+	bra		comm_download_mode0			; NO - done
 
 comm_write_range_loop:
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_download_mode0				; No, Done (and send OK byte too).
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - done (and send OK byte too)
 	movf	RCREG1,W
-;	bsf		NCTS							; Hold Bluetooth Chip (Requires PC/Android/iOS side to use flow control...)
-	call	ext_flash_byte_write_comms		; write one byte
-;	bcf		NCTS							; Release Bluetooth Chip (Requires PC/Android/iOS side to use flow control...)
-	call	incf_ext_flash_address_p1		; increase address+1
+;	bsf		NCTS						; hold Bluetooth chip (requires PC/Android/iOS side to use flow control...)
+	call	ext_flash_byte_write_comms	; write one byte
+;	bcf		NCTS						; release Bluetooth chip (requires PC/Android/iOS side to use flow control...)
+	call	incf_ext_flash_address_p1	; increase address+1
 	bra	comm_write_range_loop
 
 ;-----------------------------------------------------------------------------
 
-comm_send_range:							; Get 3 bytes start address and 3 bytes amount
-	movlw	0x20							; send echo
+comm_send_range:						; get 3 bytes start address and 3 bytes amount
+	movlw	0x20						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
-	bcf		INTCON,GIE						; All interrupts off!
-	rcall	comm_get_flash_address			; Get three bytes address or return
-	btfsc	rs232_receive_overflow			; Got Data?
-	bra		comm_download_mode0				; No, Done.
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_write_byte				; wait for UART
+	bcf		INTCON,GIE					; all interrupts off
+	rcall	comm_get_flash_address		; get three bytes address or return
+	btfsc	rs232_receive_overflow		; got data?
+	bra		comm_download_mode0			; NO - done
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - done
 	movff	RCREG1,up
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - done
 	movff	RCREG1,hi
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_download_mode0				; No, Done.
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - done
 	movff	RCREG1,lo
-	; If lo==0, we must precondition hi because there are to many bytes send !
+	; if lo==0, we must precondition hi because there are too many bytes sent
 	movf	lo,W
 	bnz		$+4
 	decf	hi,F
 	movlw	0x40
-	cpfslt	up								; Abort when up > 0x3F
-	bra		comm_download_mode0				; Abort
+	cpfslt	up							; up > 0x3F?
+	bra		comm_download_mode0			; YES - abort
 	; 6 bytes received, send data
 	; needs ext_flash_address:3 start address and up:hi:lo amount
 	call	ext_flash_read_block_start
 	movwf	TXREG1
-	bra		comm_send_range24				; counter 24bit
+	bra		comm_send_range24			; counter 24 bit
 comm_send_range24_loop:
-	call	ext_flash_read_block			; Read one byte
-	movwf	TXREG1							; Start new transmit
+	call	ext_flash_read_block		; read one byte
+	movwf	TXREG1						; start new transmit
 comm_send_range24:
-	rcall	comm_rs232_wait_tx				; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	decfsz	lo,F
 	bra		comm_send_range24_loop
 	decf	hi,F
@@ -377,22 +381,22 @@
 	cpfseq	up
 	bra		comm_send_range24_loop
 	call	ext_flash_read_block_stop
-	bra		comm_download_mode0				; Done.
+	bra		comm_download_mode0			; done
 
 ;-----------------------------------------------------------------------------
 
 comm_get_flash_address:
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	return									; No, return
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	return								; NO - return
 	movff	RCREG1,ext_flash_address+2
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	return									; No, return
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	return								; NO - return
 	movff	RCREG1,ext_flash_address+1
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	return									; No, return
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	return								; NO - return
 	movff	RCREG1,ext_flash_address+0
 	return
 
@@ -401,39 +405,39 @@
 comm_download_mode:
 	; Enable comm download mode
 	WIN_SMALL comm_status2_column, comm_status2_row
-	STRCPY_TEXT_PRINT tUsbDownloadMode	; Download mode enabled
-	bsf		INTCON,GIE					; All interrupts on
-	rcall	comm_rs232_wait_tx			; Wait for UART
-	movlw	0xBB						; Command Echo
-	movwf	TXREG1						; Send Answer
+	STRCPY_TEXT_PRINT tUsbDownloadMode	; download mode enabled
+	bsf		INTCON,GIE					; all interrupts on
+	rcall	comm_write_byte				; wait for UART
+	movlw	0xBB						; command echo
+	movwf	TXREG1						; send answer
 comm_download_mode0:
-	bsf		INTCON,GIE					; All interrupts on
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	bsf		INTCON,GIE					; all interrupts on
+	rcall	comm_write_byte				; wait for UART
 	movlw	0x4C						; 4C in service mode
 	btfss	comm_service_enabled
 	movlw	0x4D						; 4D in download mode
-	movwf	TXREG1						; Send Answer
+	movwf	TXREG1						; send answer
 	movlw	timeout_service_mode
-	movwf	comm_timeout				; Timeout
+	movwf	comm_timeout				; timeout
 	bcf		switch_right
 comm_download_mode1:
 	bcf		onesecupdate
 	dcfsnz	comm_timeout,F
-	bra		comm_service_exit			; Timeout -> Exit
+	bra		comm_service_exit			; timeout -> exit
 comm_download_mode2:
-	rcall	comm_write_get_byte			; Check for a byte
+	rcall	comm_get_byte				; check for a byte
 	btfsc	comm_service_enabled
-	btg		LEDr						; Blink in Service mode
+	btg		LEDr						; blink in service mode
 	btfss	vusb_in						; USB plugged in?
-	bra		comm_service_exit_nousb		; Disconnected -> Exit
-	btfsc	switch_right				; Abort with right
+	bra		comm_service_exit_nousb		; NO - disconnected -> exit
+	btfsc	switch_right				; abort with right button
 	bra		comm_service_exit
 	btfsc	onesecupdate
 	bra		comm_download_mode1
 	btfsc	rs232_receive_overflow
-	bra		comm_download_mode2			; Wait for command byte
+	bra		comm_download_mode2			; wait for command byte
 
-	; command received!
+	; command received
 	bcf		LEDr
 	movlw	0xFF
 	cpfseq	RCREG1
@@ -442,58 +446,62 @@
 	movlw	"a"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_send_headers			; Send all 256 dive headers
+	bra		comm_send_headers			; send all 256 dive headers
 	movlw	"b"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_set_time				; Read time and date from the PC and set clock
+	bra		comm_set_time				; read time and date from the PC and set clock
 	movlw	"c"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_set_custom_text		; Send a opt_name_length byte string of custom text.
+	bra		comm_set_custom_text		; send a opt_name_length byte string of custom text
 	movlw	"f" 						; 0x66
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_send_dive				; Send header and profile for one dive
+	bra		comm_send_dive				; send header and profile for one dive
 	movlw	"i"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_identify				; Send firmware, serial, etc.
+	bra		comm_identify				; send firmware, serial, etc.
 	movlw	"j"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_hardware_descriptor	; Send hardware descriptor byte
+	bra		comm_hardware_descriptor	; send hardware descriptor byte
 	movlw	0x60
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_feature_and_hardware	; Send more detailed informations
+	bra		comm_feature_and_hardware	; send more detailed information
 	movlw	"n"
 	cpfseq	RCREG1
 	bra		$+4
-	goto	comm_send_string			; Send a 15byte string to the screen
+	goto	comm_send_string			; send a 15 byte string to the screen
 	movlw	"m"
 	cpfseq	RCREG1
 	bra		$+4
-	goto	comm_send_compact_headers	; Send all 256 compact headers
+	goto	comm_send_compact_headers	; send all 256 compact headers
+
+ IFDEF _screendump
 	movlw	"l"
 	cpfseq	RCREG1
-	bra		$+4
-	call	TFT_dump_screen				; Dump the screen contents
+	bra	$+4
+	call	TFT_dump_screen				; dump the screen contents
+ ENDIF
+
 	movlw	"r"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_read_setting			; Read a setting (And send via USB)
+	bra		comm_read_setting			; read a setting (and send via USB)
 	movlw	"w"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_write_setting			; Write a setting (Into RAM)
+	bra		comm_write_setting			; write a setting (into RAM)
 	movlw	"x"
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_option_reset_all		; Reset all options to factory default.
+	bra		comm_option_reset_all		; reset all options to factory default
 
-	btfss	comm_service_enabled		; Done for Download mode
-	bra		comm_download_mode0			; Loop with timeout reset
+	btfss	comm_service_enabled		; done for download mode
+	bra		comm_download_mode0			; loop with timeout reset
 
 	movlw	0x20
 	cpfseq	RCREG1
@@ -502,23 +510,23 @@
 	movlw	0x22
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_reset_logbook_pointers	; Resets all logbook pointers and the logbook (!)
+	bra		comm_reset_logbook_pointers	; reset all logbook pointers and the logbook
 	movlw	0x23
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_reset_battery_gauge	; Resets battery gauge registers
+	bra		comm_reset_battery_gauge	; reset battery gauge registers
 	movlw	0x30
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_write_range			; write bytes starting from ext_flash_address:3 (Stop when timeout)
+	bra		comm_write_range			; write bytes starting from ext_flash_address:3 (stop when timeout)
 	movlw	0x40
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_erase_4kb				; erases 4kB block from ext_flash_address:3 (Warning: No confirmation or built-in security here...)
+	bra		comm_erase_4kb				; erase 4 kB block from ext_flash_address:3 (Warning: no confirmation or built-in security here...)
 	movlw	0x42
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_erase_range4kb			; erases range in 4kB steps (Get 3 bytes address and 1byte amount of 4kB blocks)
+	bra		comm_erase_range4kb			; erase range in 4 kB steps (get 3 bytes address and 1 byte amount of 4 kB blocks)
 	movlw	0x50
 	cpfseq	RCREG1
 	bra		$+4
@@ -526,19 +534,25 @@
 ;	movlw	"t"
 ;	cpfseq	RCREG1
 ;	bra		$+4
-;	goto	testloop					; Start raw-data testloop
+;	goto	testloop					; start raw-data test loop
+ IFDEF _rx_function
+	movlw	0x70
+	cpfseq	RCREG1
+	bra		$+4
+	bra		comm_update_ostc_rx			; send firmware from external memory 3D0800h -> 3DFFFFh to OSTC RX circuity
+ ENDIF
 	movlw	0xC1
 	cpfseq	RCREG1
 	bra		$+4
-	bra		comm_service_ll_bootloader	; Start low-level bootloader
-	bra		comm_download_mode0			; Loop with timeout reset
+	bra		comm_service_ll_bootloader	; start low-level bootloader
+	bra		comm_download_mode0			; loop with timeout reset
 
 ;-----------------------------------------------------------------------------
 
 comm_send_compact_headers:
 	movlw	"m"							; send echo
 	movwf	TXREG1
-	; Send 13 bytes/dive (Compact Header)
+	; send 13 bytes/dive (compact header)
 	; 1st: 200009h-200016h
 	; 2nd: 201009h-201016h
 	; 3rd: 202009h-202016h
@@ -552,29 +566,29 @@
 comm_send_compact_headers2:
 	movlw	0x09
 	movwf	ext_flash_address+0
-	; Adjust address for next dive
+	; adjust address for next dive
 	movlw	0x10
 	addwf	ext_flash_address+1
 	movlw	0x00
 	addwfc	ext_flash_address+2
 
 	movlw	0x30
-	cpfseq	ext_flash_address+2			; All 256 dive send?
-	bra		comm_send_compact_headers4	; No, continue
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	cpfseq	ext_flash_address+2			; all 256 dive send?
+	bra		comm_send_compact_headers4	; NO - continue
+	bra		comm_download_mode0			; done, loop with timeout reset
 
 comm_send_compact_headers4:
 	movlw	.13
-	movwf	lo							; Counter
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	movwf	lo							; counter
+	rcall	comm_write_byte				; wait for UART
 	call	ext_flash_read_block_start	; 1st byte
 	movwf	TXREG1
-	bra		comm_send_compact_headers3	; counter 24bit
+	bra		comm_send_compact_headers3	; counter 24 bit
 comm_send_compact_headers_loop:
-	call	ext_flash_read_block		; Read one byte
-	movwf	TXREG1						; Start new transmit
+	call	ext_flash_read_block		; read one byte
+	movwf	TXREG1						; start new transmit
 comm_send_compact_headers3:
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	decfsz	lo,F
 	bra		comm_send_compact_headers_loop
 	call	ext_flash_read_block_stop
@@ -584,18 +598,18 @@
 	movwf	ext_flash_address+0
 	call	ext_flash_read_block_start	; 1st byte
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	call	ext_flash_read_block		; 2nd byte
 	movwf	TXREG1
 	call	ext_flash_read_block_stop
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 
 	; Offset to Logbook-Profile version
 	movlw	.8
 	movwf	ext_flash_address+0
-	call	ext_flash_byte_read			; Get byte
+	call	ext_flash_byte_read			; get byte
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	bra		comm_send_compact_headers2	; continue
 
 
@@ -622,20 +636,20 @@
 	movlw	0x00
 	addwfc	ext_flash_address+2
 	movlw	0x30
-	cpfseq	ext_flash_address+2			; All 256 dive send?
-	bra		comm_send_headers4			; No, continue
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	cpfseq	ext_flash_address+2			; all 256 dive send?
+	bra		comm_send_headers4			; NO - continue
+	bra		comm_download_mode0			; done, loop with timeout reset
 comm_send_headers4:
-	clrf	lo							; Counter
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	clrf	lo							; counter
+	rcall	comm_write_byte				; wait for UART
 	call	ext_flash_read_block_start	; 1st byte
 	movwf	TXREG1
-	bra		comm_send_headers3			; counter 24bit
+	bra		comm_send_headers3			; counter 24 bit
 comm_send_headers_loop:
-	call	ext_flash_read_block		; Read one byte
-	movwf	TXREG1						; Start new transmit
+	call	ext_flash_read_block		; read one byte
+	movwf	TXREG1						; start new transmit
 comm_send_headers3:
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	decfsz	lo,F
 	bra		comm_send_headers_loop
 	call	ext_flash_read_block_stop
@@ -643,127 +657,121 @@
 
 ;-----------------------------------------------------------------------------
 
-comm_option_reset_all:					; Reset all options to factory default.
+comm_option_reset_all:					; reset all options to factory default
 	movlw	"x"							; send echo
 	movwf	TXREG1
 	call	option_reset_all
-	bra		comm_download_mode0			; Done. back to loop with timeout reset
+	bra		comm_download_mode0			; done, back to loop with timeout reset
 
 ;-----------------------------------------------------------------------------
 
-comm_write_get_byte:
-	goto	rs232_get_byte				; returns...
-
-comm_rs232_wait_tx:
-	goto	rs232_wait_tx				; returns...
-
 comm_set_time:
 	movlw	"b"							; send echo
 	movwf	TXREG1
 
-	rcall	comm_rs232_wait_tx			; wait for UART
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
+	rcall	comm_write_byte				; wait for UART
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
 	movff	RCREG1, hours
 	movlw	d'24'
 	cpfslt	hours
 	clrf	hours
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
 	movff	RCREG1, mins
 	movlw	d'60'
 	cpfslt	mins
 	clrf	mins
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
 	movff	RCREG1, secs
 	movlw	d'60'
 	cpfslt	secs
 	clrf	secs
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
 	movff	RCREG1, month
 	movlw	d'13'
 	cpfslt	month
 	movwf	month
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
-	call	comm_check_day				; Check day
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
+	call	comm_check_day				; check day
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort
 	movff	RCREG1, year
 	movlw	d'100'
 	cpfslt	year
 	clrf	year
-	; All ok, set RTCC
+	; all ok, set RTCC
 	call	rtc_set_rtc					; writes mins,sec,hours,day,month and year to RTC module
-	bra		comm_download_mode0			; Done. back to loop with timeout reset
+	bra		comm_download_mode0			; done, back to loop with timeout reset
 
 ;-----------------------------------------------------------------------------
-; Set OSTC3 custom text string (opt_name_length ASCII chars).
+; Set custom text string (opt_name_length ASCII chars)
 ;
 
 comm_set_custom_text:
 	movlw	"c"							; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
+	rcall	comm_write_byte				; wait for UART
 	lfsr	FSR2,opt_name
 	movlw	opt_name_length
 	movwf	lo							; counter
 comm_set_ctext_loop:
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_set_ctext_loop_done	; no, abort
-	movff	RCREG1,POSTINC2				; Store character
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_set_ctext_loop_done	; NO - abort
+	movff	RCREG1,POSTINC2				; store character
 	decfsz	lo,F
 	bra		comm_set_ctext_loop
 comm_set_ctext_loop_done:
-	tstfsz	lo							; Got opt_name_length bytes?
-	bra		comm_set_ctext_loop_done2	; no, clear remaining chars
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	tstfsz	lo							; got opt_name_length bytes?
+	bra		comm_set_ctext_loop_done2	; NO - clear remaining chars
+	bra		comm_download_mode0			; done, loop with timeout reset
 comm_set_ctext_loop_done2:
 	clrf	POSTINC2
 	decfsz	lo,F
 	bra		comm_set_ctext_loop_done2
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	bra		comm_download_mode0			; done, loop with timeout reset
 
 ;-----------------------------------------------------------------------------
-; Reply Serial (2 bytes low:high), firmware (major.minor) and custom text.
+; Reply Serial (2 bytes low:high), firmware (major.minor) and custom text
 ;
 
 comm_identify:
 	movlw	"i"							; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
+	rcall	comm_write_byte				; wait for UART
 
 	;---- Read serial from internal EEPROM address 0000
 	clrf	EEADRH
-	clrf	EEADR						; Get Serial number LOW
+	clrf	EEADR						; get serial number LOW
 	call	read_eeprom					; read byte
 	movff	EEDATA,lo
-	incf	EEADR,F						; Get Serial number HIGH
+	incf	EEADR,F						; get serial number HIGH
 	call	read_eeprom					; read byte
 	movff	EEDATA,hi
 
 	;---- Emit serial number
 	movff	lo,TXREG1
-	rcall	comm_rs232_wait_tx
+	rcall	comm_write_byte
 	movff	hi,TXREG1
-	rcall	comm_rs232_wait_tx
+	rcall	comm_write_byte
 
 	;---- Emit firmware hi.lo
 	movlw	softwareversion_x
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx
+	rcall	comm_write_byte
 	movlw	softwareversion_y
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx
+	rcall	comm_write_byte
 
 	;---- Emit custom text
 	movlw	opt_name_length
@@ -772,11 +780,19 @@
 
 common_identify_loop:
 	movff	POSTINC2,TXREG1
-	rcall	comm_rs232_wait_tx
+	rcall	comm_write_byte
 	decfsz	hi,F
 	bra		common_identify_loop
 
-	bra		comm_download_mode0			; Done.
+	bra		comm_download_mode0			; done
+
+;-----------------------------------------------------------------------------
+
+comm_get_byte:
+	goto	rs232_get_byte				; ... and return
+
+comm_write_byte:
+	goto	rs232_wait_tx				; ... and return
 
 ;-----------------------------------------------------------------------------
 ; Reply hardware descriptor byte
@@ -785,28 +801,109 @@
 comm_hardware_descriptor:
 	movlw	"j"							; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movff	hardware_flag,TXREG1
-	bra		comm_download_mode0			; Done.
+	rcall	comm_write_byte				; wait for UART
+	movff	hardware_flag1,TXREG1
+	bra		comm_download_mode0			; done
 
 comm_feature_and_hardware:
 	movlw	0x60						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movlw	0x00						; Hardware high byte
+	rcall	comm_write_byte				; wait for UART
+	movlw	0x00						; hardware high byte
+	movwf	TXREG1
+	rcall	comm_write_byte				; wait for UART
+	movff	hardware_flag1,TXREG1
+	rcall	comm_write_byte				; wait for UART
+	movlw	0x00						; feature high Byte
+	movwf	TXREG1
+	rcall	comm_write_byte				; wait for UART
+	movlw	0x00						; feature low Byte
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movff	hardware_flag,TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movlw	0x00						; Feature high Byte
+	rcall	comm_write_byte				; wait for UART
+	movlw	0x00						; model descriptor byte
+	movwf	TXREG1
+	bra		comm_download_mode0			; done
+
+;-----------------------------------------------------------------------------
+
+ IFDEF _rx_function
+
+comm_update_ostc_rx:
+	movlw	0x70						; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movlw	0x00						; Feature low Byte
-	movwf	TXREG1
-	rcall	comm_rs232_wait_tx			; wait for UART
-	movlw	0x00						; Model descriptor byte
-	movwf	TXREG1
-	bra		comm_download_mode0			 ; Done.
+	rcall	comm_write_byte				; wait for UART
+;	btfss	ostc_rx_present				; rx model?
+;	bra		comm_download_mode0			; NO - abort
+
+	; Setup ext_flash_address:3
+	movlw	LOW   0x3D0800
+	movwf	ext_flash_address+0
+	movlw	HIGH  (0x3D0800 & 0xFFFF)	; <- & 0xFFFF to suppress warning message...
+	movwf	ext_flash_address+1
+	movlw	UPPER 0x3D0800
+	movwf	ext_flash_address+2
+
+	bsf		active_reset_ostc_rx
+	WAITMS	.5
+	bcf		active_reset_ostc_rx
+	WAITMS	.100
+	bcf		INTCON,GIE					; halt all interrupts
+
+	movlw	LOW  .992
+	movwf	uart1_temp
+	movlw	HIGH .992
+	movwf	uart2_temp
+	incf	uart2_temp,F				; ++1
+	WAITMS	.1
+
+	call	ext_flash_read_block_start
+	movwf	up							; first byte to write
+
+comm_update_ostc_rx_loop:				; (run 992 times)
+	WIN_SMALL comm_status4_column, comm_status4_row
+	movff	uart1_temp,xA+0
+	movf	uart2_temp,W
+	tstfsz	uart2_temp
+	decf	uart2_temp,W				; --1 for display
+	movwf	xA+1
+	movlw	.64
+	movwf	xB+0
+	clrf	xB+1
+	call	mult16x16					; xA * xB = xC
+	movff	xC+0,lo
+	movff	xC+1,hi
+	bsf		leftbind
+	output_16
+	bcf		leftbind
+	STRCAT_PRINT " Bytes left  "
+
+	call	I2C_update_OSTC_rx			; send firmware from external memory 3D0800h -> 3DFFFFh to OSTC RX circuity
+
+	tstfsz	WREG						; returns with WREG=0 if everything was ok
+	bra		comm_update_ostc_rx_loop_error	; error -> abort
+
+	decfsz	uart1_temp,F
+	bra		comm_update_ostc_rx_loop
+	decfsz	uart2_temp,F
+	bra		comm_update_ostc_rx_loop
+
+comm_update_ostc_rx_loop_done:
+	call	ext_flash_read_block_stop
+	bsf		INTCON,GIE
+	WIN_SMALL comm_status4_column, comm_status4_row
+	STRCPY_PRINT "                "
+	bra		comm_download_mode0			; done
+
+comm_update_ostc_rx_loop_error:
+	bsf		INTCON,GIE
+	WIN_SMALL comm_status4_column, comm_status4_row
+	STRCPY_PRINT "ERROR. Retry!  "
+	call	wait_1s						; do not use for time critical routines, can be between 0 and 1 sec!
+	call	wait_1s						; do not use for time critical routines, can be between 0 and 1 sec!
+	call	wait_1s						; do not use for time critical routines, can be between 0 and 1 sec!
+	bra		comm_update_ostc_rx_loop_done
+
+ ENDIF
 
 ;-----------------------------------------------------------------------------
 
@@ -814,12 +911,12 @@
 	movlw	"f"; 0x66					; send echo
 	movwf	TXREG1
 
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_download_mode0			; No, abort!
-	movff	RCREG1,lo					; Store dive number (0-255)
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_download_mode0			; NO - abort!
+	movff	RCREG1,lo					; store dive number (0-255)
 ; First, send the header (again)
-	; Set ext_flash_address:3 to TOC entry of this dive
+	; set ext_flash_address:3 to TOC entry of this dive
 	; 1st: 200000h-200FFFh -> lo=0
 	; 2nd: 201000h-201FFFh -> lo=1
 	; 3rd: 202000h-202FFFh -> lo=2
@@ -835,48 +932,48 @@
 	movf	PRODH,W
 	addwfc	ext_flash_address+2,F
 
-	incf_ext_flash_address d'2'			; Skip 0xFA, 0xFA
-	call	ext_flash_byte_read_plus	; Read start address of profile
+	incf_ext_flash_address d'2'			; skip 0xFA, 0xFA
+	call	ext_flash_byte_read_plus	; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+0
-	call	ext_flash_byte_read_plus	; Read start address of profile
+	call	ext_flash_byte_read_plus	; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+1
-	call	ext_flash_byte_read_plus	; Read start address of profile
+	call	ext_flash_byte_read_plus	; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+2
-	call	ext_flash_byte_read_plus	; Read end address of profile
+	call	ext_flash_byte_read_plus	; read end address of profile
 	movff	ext_flash_rw,ext_flash_end_pointer+0
-	call	ext_flash_byte_read_plus	; Read end address of profile
+	call	ext_flash_byte_read_plus	; read end address of profile
 	movff	ext_flash_rw,ext_flash_end_pointer+1
-	call	ext_flash_byte_read_plus	; Read end address of profile
+	call	ext_flash_byte_read_plus	; read end address of profile
 	movff	ext_flash_rw,ext_flash_end_pointer+2
-	decf_ext_flash_address	d'8'		; Back again to first 0xFA in header
+	decf_ext_flash_address	d'8'		; back again to first 0xFA in header
 
 	movf	ext_flash_log_pointer+0,W
-	cpfseq	ext_flash_end_pointer+0		; Equal?
-	bra		comm_send_dive1				; No, Send header
+	cpfseq	ext_flash_end_pointer+0		; equal?
+	bra		comm_send_dive1				; NO - send header
 
 	movf	ext_flash_log_pointer+1,W
-	cpfseq	ext_flash_end_pointer+1		; Equal?
-	bra		comm_send_dive1				; No, Send header
+	cpfseq	ext_flash_end_pointer+1		; equal?
+	bra		comm_send_dive1				; NO - send header
 
 	movf	ext_flash_log_pointer+2,W
-	cpfseq	ext_flash_end_pointer+2		; Equal?
-	bra		comm_send_dive1				; No, Send header
+	cpfseq	ext_flash_end_pointer+2		; equal?
+	bra		comm_send_dive1				; NO - send header
 
 	; Start=End -> Not good, abort
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	bra		comm_download_mode0			; done, loop with timeout reset
 
 comm_send_dive1:
 	; Send header
-	clrf	hi							; Counter
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	clrf	hi							; counter
+	rcall	comm_write_byte				; wait for UART
 	call	ext_flash_read_block_start	; 1st byte
 	movwf	TXREG1
 	bra		comm_send_dive_header
 comm_send_dive_header2:
-	call	ext_flash_read_block		; Read one byte
-	movwf	TXREG1						; Start new transmit
+	call	ext_flash_read_block		; read one byte
+	movwf	TXREG1						; start new transmit
 comm_send_dive_header:
-	rcall	comm_rs232_wait_tx			; Wait for UART
+	rcall	comm_write_byte				; wait for UART
 	decfsz	hi,F
 	bra		comm_send_dive_header2
 	call	ext_flash_read_block_stop
@@ -886,15 +983,15 @@
 	movff	ext_flash_log_pointer+1,ext_flash_address+1
 	movff	ext_flash_log_pointer+2,ext_flash_address+2
 
-	movlw	.6								; Skip 6byte short header in profile - only for internal use
+	movlw	.6								; skip 6 byte short header in profile - only for internal use
 	call	incf_ext_flash_address0_0x20	; increases bytes in ext_flash_address:3 with 0x200000 bank switching
 
 	; Set address for short header/compact header, Byte 0
 
 comm_send_dive_profile:
-	call	ext_flash_byte_read_plus_0x20	; Read one byte into ext_flash_rw, takes care of banking at 0x200000
-	rcall	comm_rs232_wait_tx				; Wait for UART
-	movff	ext_flash_rw,TXREG1				; Send a byte
+	call	ext_flash_byte_read_plus_0x20	; read one byte into ext_flash_rw, takes care of banking at 0x200000
+	rcall	comm_write_byte					; wait for UART
+	movff	ext_flash_rw,TXREG1				; send a byte
 
 	; 24bit compare with end address
 	movff	ext_flash_end_pointer+0,WREG
@@ -907,401 +1004,387 @@
 	cpfseq	ext_flash_address+2
 	bra		comm_send_dive_profile
 
-	rcall	comm_read_setting_wait		; Wait for UART
-	bra		comm_download_mode0			; Done. Loop with timeout reset
+	rcall	comm_write_byte				; wait for UART
+	bra		comm_download_mode0			; done, loop with timeout reset
 
 ;-----------------------------------------------------------------------------
 
 comm_read_setting:
 	movlw	"r"
 	movwf	TXREG1
-	rcall	comm_write_get_byte
-	btfsc	rs232_receive_overflow		; Got byte?
-	bra		comm_read_abort				; No, abort!
-	rcall	comm_read_setting_wait		; Wait for UART
+	rcall	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_read_abort				; NO - abort!
+	rcall	comm_write_byte				; wait for UART
 	movlw	0x0F
 	cpfsgt	RCREG1						; 0x00-0x0F: unused
 	bra		comm_read_abort				; abort!
-	subwf	RCREG1,W					; Subtract unused commands
-	dcfsnz	WREG
-	bra		comm_read_gas1				; RCREG1=0x10
+	subwf	RCREG1,W					; subtract unused commands
+
+	clrf	up							; set gas/dil index to 0 (0 = gas 1)
 	dcfsnz	WREG
-	bra		comm_read_gas2				; RCREG1=0x11
+	bra		comm_read_gas_dil			; RCREG1=0x10
+	incf	up							; increment gas/dil index (1 = gas 2)
 	dcfsnz	WREG
-	bra		comm_read_gas3				; RCREG1=0x12
+	bra		comm_read_gas_dil			; RCREG1=0x11
+	incf	up							; increment gas/dil index (2 = gas 3)
 	dcfsnz	WREG
-	bra		comm_read_gas4				; RCREG1=0x13
+	bra		comm_read_gas_dil			; RCREG1=0x12
+	incf	up							; increment gas/dil index (3 = gas 4)
 	dcfsnz	WREG
-	bra		comm_read_gas5				; RCREG1=0x14
+	bra		comm_read_gas_dil			; RCREG1=0x13
+	incf	up							; increment gas/dil index (4 = gas 5)
 	dcfsnz	WREG
-	bra		comm_read_dil1				; RCREG1=0x15
+	bra		comm_read_gas_dil			; RCREG1=0x14
+	incf	up							; increment gas/dil index (5 = dil 1)
+	dcfsnz	WREG
+	bra		comm_read_gas_dil			; RCREG1=0x15
+	incf	up							; increment gas/dil index (6 = dil 2)
 	dcfsnz	WREG
-	bra		comm_read_dil2				; RCREG1=0x16
+	bra		comm_read_gas_dil			; RCREG1=0x16
+	incf	up							; increment gas/dil index (7 = dil 3)
 	dcfsnz	WREG
-	bra		comm_read_dil3				; RCREG1=0x17
+	bra		comm_read_gas_dil			; RCREG1=0x17
+	incf	up							; increment gas/dil index (8 = dil 4)
 	dcfsnz	WREG
-	bra		comm_read_dil4				; RCREG1=0x18
+	bra		comm_read_gas_dil			; RCREG1=0x18
+	incf	up							; increment gas/dil index (9 = dil 5)
 	dcfsnz	WREG
-	bra		comm_read_dil5				; RCREG1=0x19
+	bra		comm_read_gas_dil			; RCREG1=0x19
+
+	clrf	up							; set setpoint index to 0 (0 = SP 1)
 	dcfsnz	WREG
-	bra		comm_read_sp1				; RCREG1=0x1A
+	bra		comm_read_sp				; RCREG1=0x1A
+	incf	up							; increment setpoint index (1 = SP2)
 	dcfsnz	WREG
-	bra		comm_read_sp2				; RCREG1=0x1B
+	bra		comm_read_sp				; RCREG1=0x1B
+	incf	up							; increment setpoint index (2 = SP3)
 	dcfsnz	WREG
-	bra		comm_read_sp3				; RCREG1=0x1C
+	bra		comm_read_sp				; RCREG1=0x1C
+	incf	up							; increment setpoint index (3 = SP4)
 	dcfsnz	WREG
-	bra		comm_read_sp4				; RCREG1=0x1D
+	bra		comm_read_sp				; RCREG1=0x1D
+	incf	up							; increment setpoint index (4 = SP5)
 	dcfsnz	WREG
-	bra		comm_read_sp5				; RCREG1=0x1E
+	bra		comm_read_sp				; RCREG1=0x1E
+
 	dcfsnz	WREG
-	movff	opt_ccr_mode, TXREG1		; RCREG1=0x1F
+	movff	opt_ccr_mode,				TXREG1	; RCREG1=0x1F
+	dcfsnz	WREG
+	movff	opt_dive_mode,				TXREG1	; RCREG1=0x20
 	dcfsnz	WREG
-	movff	opt_dive_mode, TXREG1		; RCREG1=0x20
+	movff	char_I_deco_model,			TXREG1	; RCREG1=0x21
+	dcfsnz	WREG
+	movff	char_I_ppO2_max,			TXREG1	; RCREG1=0x22
 	dcfsnz	WREG
-	movff	char_I_deco_model, TXREG1	; RCREG1=0x21
+	movff	char_I_ppO2_min,			TXREG1	; RCREG1=0x23
 	dcfsnz	WREG
-	movff	char_I_ppO2_max, TXREG1		; RCREG1=0x22
+	movff	char_I_extra_time,			TXREG1	; RCREG1=0x24
+	dcfsnz	WREG
+	movff	opt_GF_low,					TXREG1	; RCREG1=0x25
 	dcfsnz	WREG
-	movff	char_I_ppO2_min, TXREG1		; RCREG1=0x23
+	movff	opt_GF_high,				TXREG1	; RCREG1=0x26
+	dcfsnz	WREG
+	movff	opt_aGF_low,				TXREG1	; RCREG1=0x27
 	dcfsnz	WREG
-	movff	char_I_extra_time, TXREG1	; RCREG1=0x24
+	movff	opt_aGF_high,				TXREG1	; RCREG1=0x28
+	dcfsnz	WREG
+	movff	opt_enable_aGF,				TXREG1	; RCREG1=0x29
 	dcfsnz	WREG
-	movff	opt_GF_low, TXREG1			; RCREG1=0x25
+	movff	opt_sat_multiplier_non_gf,	TXREG1	; RCREG1=0x2A
+	dcfsnz	WREG
+	movff	opt_desat_multiplier_non_gf,TXREG1	; RCREG1=0x2B
 	dcfsnz	WREG
-	movff	opt_GF_high, TXREG1			; RCREG1=0x26
+	movff	opt_last_stop,				TXREG1	; RCREG1=0x2C
 	dcfsnz	WREG
-	movff	opt_aGF_low, TXREG1			; RCREG1=0x27
+	movff	opt_brightness,				TXREG1	; RCREG1=0x2D
 	dcfsnz	WREG
-	movff	opt_aGF_high, TXREG1		; RCREG1=0x28
+	movff	opt_units,					TXREG1	; RCREG1=0x2E
+	dcfsnz	WREG
+	movff	opt_sampling_rate,			TXREG1	; RCREG1=0x2F
 	dcfsnz	WREG
-	movff	opt_enable_aGF, TXREG1		; RCREG1=0x29
+	movff	opt_salinity,				TXREG1	; RCREG1=0x30
+	dcfsnz	WREG
+	movff	opt_dive_color_scheme,		TXREG1	; RCREG1=0x31
 	dcfsnz	WREG
-	movff	opt_sat_multiplier_non_gf, TXREG1	; RCREG1=0x2A
+	movff	opt_language,				TXREG1	; RCREG1=0x32
+	dcfsnz	WREG
+	movff	opt_dateformat,				TXREG1	; RCREG1=0x33
 	dcfsnz	WREG
-	movff	opt_desat_multiplier_non_gf, TXREG1	; RCREG1=0x2B
+	movff	opt_compass_gain,			TXREG1	; RCREG1=0x34
 	dcfsnz	WREG
-	movff	opt_last_stop, TXREG1		; RCREG1=0x2C
+	movff	opt_pressure_adjust,		TXREG1	; RCREG1=0x35
 	dcfsnz	WREG
-	movff	opt_brightness, TXREG1		; RCREG1=0x2D
+	movff	opt_enable_safetystop,		TXREG1	; RCREG1=0x36
+	dcfsnz	WREG
+	movff	opt_calibration_O2_ratio,	TXREG1	; RCREG1=0x37
 	dcfsnz	WREG
-	movff	opt_units, TXREG1			; RCREG1=0x2E
+	clrf	TXREG1								; RCREG1=0x38	NOT USED ANYMORE (ex opt_sensor_fallback)
+	dcfsnz	WREG
+	movff	opt_flip_screen,			TXREG1	; RCREG1=0x39
 	dcfsnz	WREG
-	movff	opt_sampling_rate, TXREG1	; RCREG1=0x2F
+	movff	opt_cR_button_left,			TXREG1	; RCREG1=0x3A
+	dcfsnz	WREG
+	movff	opt_cR_button_right,		TXREG1	; RCREG1=0x3B
 	dcfsnz	WREG
-	movff	opt_salinity, TXREG1		; RCREG1=0x30
+	movff	char_I_bottom_usage,		TXREG1	; RCREG1=0x3C
 	dcfsnz	WREG
-	movff	opt_dive_color_scheme, TXREG1	; RCREG1=0x31
+	movff	char_I_deco_usage,			TXREG1	; RCREG1=0x3D
 	dcfsnz	WREG
-	movff	opt_language, TXREG1		; RCREG1=0x32
+	movff	opt_modwarning,				TXREG1	; RCREG1=0x3E
+	dcfsnz	WREG
+	movff	opt_vsitextv2,				TXREG1	; RCREG1=0x3F
 	dcfsnz	WREG
-	movff	opt_dateformat, TXREG1		; RCREG1=0x33
+	movff	opt_vsigraph,				TXREG1	; RCREG1=0x40
+	dcfsnz	WREG
+	movff	opt_showppo2,				TXREG1	; RCREG1=0x41
 	dcfsnz	WREG
-	movff	opt_compass_gain, TXREG1	; RCREG1=0x34
+	movff	opt_temperature_adjust,		TXREG1	; RCREG1=0x42
+	dcfsnz	WREG
+	movff	opt_safety_stop_length,		TXREG1	; RCREG1=0x43
 	dcfsnz	WREG
-	movff	opt_pressure_adjust, TXREG1	; RCREG1=0x35
+	movff	opt_safety_stop_start,		TXREG1	; RCREG1=0x44
 	dcfsnz	WREG
-	movff	opt_enable_safetystop, TXREG1	; RCREG1=0x36
+	movff	opt_safety_stop_end,		TXREG1	; RCREG1=0x45
 	dcfsnz	WREG
-	movff	opt_calibration_O2_ratio, TXREG1; RCREG1=0x37
+	movff	opt_safety_stop_reset,		TXREG1	; RCREG1=0x46
+	dcfsnz	WREG
+	clrf	TXREG1								; RCREG1=0x47, ignore conservatism in hwOS tech firmware
 	dcfsnz	WREG
-	clrf	TXREG1				; RCREG1=0x38	NOT USED ANYMORE (ex opt_sensor_fallback)
+	movff	opt_diveTimeout,			TXREG1	; RCREG1=0x48
+	dcfsnz	WREG
+	movff	button_polarity,			TXREG1	; RCREG1=0x49
 	dcfsnz	WREG
-	movff	opt_flip_screen, TXREG1		; RCREG1=0x39
+	movff	char_I_PSCR_drop,			TXREG1	; RCREG1=0x4A
+	dcfsnz	WREG
+	movff	char_I_PSCR_lungratio,		TXREG1	; RCREG1=0x4B
 	dcfsnz	WREG
-	movff	opt_cR_button_left, TXREG1	; RCREG1=0x3A
+	movff	char_I_ppO2_max_deco,		TXREG1	; RCREG1=0x4C
 	dcfsnz	WREG
-	movff	opt_cR_button_right, TXREG1	; RCREG1=0x3B
+	movff	char_I_ppO2_min_loop,		TXREG1	; RCREG1=0x4D
 	dcfsnz	WREG
-	movff	char_I_bottom_usage, TXREG1	; RCREG1=0x3C
+	movff	char_I_tank_size+0,			TXREG1	; RCREG1=0x4E
+	dcfsnz	WREG
+	movff	char_I_tank_size+1,			TXREG1	; RCREG1=0x4F
 	dcfsnz	WREG
-	movff	char_I_deco_usage, TXREG1	; RCREG1=0x3D
+	movff	char_I_tank_size+2,			TXREG1	; RCREG1=0x50
+	dcfsnz	WREG
+	movff	char_I_tank_size+3,			TXREG1	; RCREG1=0x51
 	dcfsnz	WREG
-	movff	opt_modwarning, TXREG1		; RCREG1=0x3E
+	movff	char_I_tank_size+4,			TXREG1	; RCREG1=0x52
+	dcfsnz	WREG
+	movff	char_I_tank_pres_fill+0,	TXREG1	; RCREG1=0x53
 	dcfsnz	WREG
-	movff	opt_vsitextv2, TXREG1		; RCREG1=0x3F
+	movff	char_I_tank_pres_fill+1,	TXREG1	; RCREG1=0x54
 	dcfsnz	WREG
-	movff	opt_vsigraph, TXREG1		; RCREG1=0x40
+	movff	char_I_tank_pres_fill+2,	TXREG1	; RCREG1=0x55
 	dcfsnz	WREG
-	movff	opt_showppo2, TXREG1		; RCREG1=0x41
+	movff	char_I_tank_pres_fill+3,	TXREG1	; RCREG1=0x56
+	dcfsnz	WREG
+	movff	char_I_tank_pres_fill+4,	TXREG1	; RCREG1=0x57
 	dcfsnz	WREG
-	movff	opt_temperature_adjust, TXREG1	; RCREG1=0x42
+	movff	char_I_cc_max_frac_o2,		TXREG1	; RCREG1=0x58
+	dcfsnz	WREG
+	movff	opt_sim_setpoint_number,	TXREG1	; RCREG1=0x59
 	dcfsnz	WREG
-	movff	opt_safety_stop_length, TXREG1	; RCREG1=0x43
+	movff	opt_calc_asc_gasvolume,		TXREG1	; RCREG1=0x5A
+	dcfsnz	WREG
+	movff	opt_sim_use_aGF,			TXREG1	; RCREG1=0x5B
 	dcfsnz	WREG
-	movff	opt_safety_stop_start, TXREG1	; RCREG1=0x44
+	movff	char_I_altitude_wait,		TXREG1	; RCREG1=0x5C
 	dcfsnz	WREG
-	movff	opt_safety_stop_end, TXREG1		; RCREG1=0x45
+	movff	opt_enable_IBCD,			TXREG1	; RCREG1=0x5D
 	dcfsnz	WREG
-	movff	opt_safety_stop_reset, TXREG1	; RCREG1=0x46
+	movff	opt_sat_multiplier_gf,		TXREG1	; RCREG1=0x5E
+	dcfsnz	WREG
+	movff	opt_desat_multiplier_gf,	TXREG1	; RCREG1=0x5F
 	dcfsnz	WREG
-	clrf	TXREG1							; RCREG1=0x47, ignore conservatism for standard hwOS
+	movff	opt_transmitter_id_1+0,		TXREG1	; RCREG1=0x60
+	dcfsnz	WREG
+	movff	opt_transmitter_id_1+1,		TXREG1	; RCREG1=0x61
 	dcfsnz	WREG
-	movff	opt_diveTimeout, TXREG1			; RCREG1=0x48
+	movff	opt_transmitter_id_2+0,		TXREG1	; RCREG1=0x62
+	dcfsnz	WREG
+	movff	opt_transmitter_id_2+1,		TXREG1	; RCREG1=0x63
 	dcfsnz	WREG
-	movff	button_polarity, TXREG1			; RCREG1=0x49
+	movff	opt_transmitter_id_3+0,		TXREG1	; RCREG1=0x64
 	dcfsnz	WREG
-	movff	char_I_PSCR_drop, TXREG1		; RCREG1=0x4A
+	movff	opt_transmitter_id_3+1,		TXREG1	; RCREG1=0x65
 	dcfsnz	WREG
-	movff	char_I_PSCR_lungratio, TXREG1	; RCREG1=0x4B
+	movff	opt_transmitter_id_4+0,		TXREG1	; RCREG1=0x66
+	dcfsnz	WREG
+	movff	opt_transmitter_id_4+1,		TXREG1	; RCREG1=0x67
 	dcfsnz	WREG
-	movff	char_I_ppO2_max_deco, TXREG1	; RCREG1=0x4C
+	movff	opt_transmitter_id_5+0,		TXREG1	; RCREG1=0x68
+	dcfsnz	WREG
+	movff	opt_transmitter_id_5+1,		TXREG1	; RCREG1=0x69
 	dcfsnz	WREG
-	movff	char_I_ppO2_min_loop, TXREG1	; RCREG1=0x4D
+	movff	opt_transmitter_id_6+0,		TXREG1	; RCREG1=0x6A
+	dcfsnz	WREG
+	movff	opt_transmitter_id_6+1,		TXREG1	; RCREG1=0x6B
 	dcfsnz	WREG
-	movff	char_I_tank_size+0, TXREG1		; RCREG1=0x4E
+	movff	opt_transmitter_id_7+0,		TXREG1	; RCREG1=0x6C
 	dcfsnz	WREG
-	movff	char_I_tank_size+1, TXREG1		; RCREG1=0x4F
+	movff	opt_transmitter_id_7+1,		TXREG1	; RCREG1=0x6D
 	dcfsnz	WREG
-	movff	char_I_tank_size+2, TXREG1		; RCREG1=0x50
+	movff	opt_transmitter_id_8+0,		TXREG1	; RCREG1=0x6E
+	dcfsnz	WREG
+	movff	opt_transmitter_id_8+1,		TXREG1	; RCREG1=0x6F
 	dcfsnz	WREG
-	movff	char_I_tank_size+3, TXREG1		; RCREG1=0x51
+	movff	opt_transmitter_id_9+0,		TXREG1	; RCREG1=0x70
+	dcfsnz	WREG
+	movff	opt_transmitter_id_9+1,		TXREG1	; RCREG1=0x71
 	dcfsnz	WREG
-	movff	char_I_tank_size+4, TXREG1		; RCREG1=0x52
+	movff	opt_transmitter_id_10+0,	TXREG1	; RCREG1=0x72
+	dcfsnz	WREG
+	movff	opt_transmitter_id_10+1,	TXREG1	; RCREG1=0x73
 	dcfsnz	WREG
-	movff	char_I_tank_pres_fill+0, TXREG1	; RCREG1=0x53
+	movff	char_I_tank_size+5,			TXREG1	; RCREG1=0x74
 	dcfsnz	WREG
-	movff	char_I_tank_pres_fill+1, TXREG1	; RCREG1=0x54
+	movff	char_I_tank_size+6,			TXREG1	; RCREG1=0x75
 	dcfsnz	WREG
-	movff	char_I_tank_pres_fill+2, TXREG1	; RCREG1=0x55
+	movff	char_I_tank_size+7,			TXREG1	; RCREG1=0x76
+	dcfsnz	WREG
+	movff	char_I_tank_size+8,			TXREG1	; RCREG1=0x77
 	dcfsnz	WREG
-	movff	char_I_tank_pres_fill+3, TXREG1	; RCREG1=0x56
+	movff	char_I_tank_size+9,			TXREG1	; RCREG1=0x78
+	dcfsnz	WREG
+	movff	char_I_tank_pres_fill+5,	TXREG1	; RCREG1=0x79
 	dcfsnz	WREG
-	movff	char_I_tank_pres_fill+4, TXREG1	; RCREG1=0x57
+	movff	char_I_tank_pres_fill+6,	TXREG1	; RCREG1=0x7A
+	dcfsnz	WREG
+	movff	char_I_tank_pres_fill+7,	TXREG1	; RCREG1=0x7B
 	dcfsnz	WREG
-	movff	char_I_cc_max_frac_o2, TXREG1	; RCREG1=0x58
+	movff	char_I_tank_pres_fill+8,	TXREG1	; RCREG1=0x7C
 	dcfsnz	WREG
-	movff	opt_sim_setpoint_number, TXREG1	; RCREG1=0x59
+	movff	char_I_tank_pres_fill+9,	TXREG1	; RCREG1=0x7D
 	dcfsnz	WREG
-	movff	opt_calc_asc_gasvolume, TXREG1	; RCREG1=0x5A
+	movff	opt_TR_mode,				TXREG1	; RCREG1=0x7E
+	dcfsnz	WREG
+	movff	opt_TR_1st_pres,			TXREG1	; RCREG1=0x7F
 	dcfsnz	WREG
-	movff	opt_sim_use_aGF, TXREG1			; RCREG1=0x5B
+	movff	opt_TR_2nd_pres,			TXREG1	; RCREG1=0x80
 	dcfsnz	WREG
-	movff	char_I_altitude_wait, TXREG1	; RCREG1=0x5C
+	movff	opt_TR_Bail_pres,			TXREG1	; RCREG1=0x81
 	dcfsnz	WREG
-	movff	opt_enable_IBCD, TXREG1			; RCREG1=0x5D
+	movff	char_I_max_pres_diff,		TXREG1	; RCREG1=0x82
+	dcfsnz	WREG
+	movff	opt_ZfactorUse,				TXREG1	; RCREG1=0x83
 	dcfsnz	WREG
-	movff	opt_sat_multiplier_gf, TXREG1	; RCREG1=0x5E
+	movff	opt_ZfactorTemp,			TXREG1	; RCREG1=0x84
 	dcfsnz	WREG
-	movff	opt_desat_multiplier_gf, TXREG1; RCREG1=0x5F
-
+	movff	opt_2ndDepthDisp,			TXREG1	; RCREG1=0x85
 
 comm_read_abort:
 comm_read_done:
-	bra		comm_download_mode0				; Done. Loop with timeout reset
+	bra		comm_download_mode0			; done, loop with timeout reset
 
-comm_read_setting_wait:
-	bra	comm_rs232_wait_tx					; Wait for UART (and return!)
+;-----------------------------------------------------------------------------
 
-comm_read_gas1:
-	movff	opt_gas_O2_ratio+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_He_ratio+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_type+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_OC_bail_gas_change+0,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_gas2:
-	movff	opt_gas_O2_ratio+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_He_ratio+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_type+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_OC_bail_gas_change+1,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_gas3:
-	movff	opt_gas_O2_ratio+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_He_ratio+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_type+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_OC_bail_gas_change+2,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_gas4:
-	movff	opt_gas_O2_ratio+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_He_ratio+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_type+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_OC_bail_gas_change+3,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_gas5:
-	movff	opt_gas_O2_ratio+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_He_ratio+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_gas_type+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_OC_bail_gas_change+4,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
+; Memory map is as follows:
+; -------------------------
+; opt_gas_O2_ratio			res 5		; O2 ratios of OC/bailout gases
+; opt_dil_O2_ratio			res 5		; O2 ratios of diluents
+; opt_gas_He_ratio			res 5		; He ratios of OC/bailout gases
+; opt_dil_He_ratio			res 5		; He ratios of diluents
+; opt_gas_type				res 5		; OC/bailout gas type
+; opt_dil_type				res 5		; dil type
+; opt_gas_change			res 5		; change depths for OC/Bailout gases
+; opt_dil_change			res 5		; change depths for diluents
 
-comm_read_dil1:
-	movff	opt_dil_O2_ratio+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_He_ratio+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_type+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_dil_change+0,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_dil2:
-	movff	opt_dil_O2_ratio+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_He_ratio+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_type+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_dil_change+1,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_dil3:
-	movff	opt_dil_O2_ratio+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_He_ratio+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_type+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_dil_change+2,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_dil4:
-	movff	opt_dil_O2_ratio+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_He_ratio+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_type+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_dil_change+3,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_dil5:
-	movff	opt_dil_O2_ratio+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_He_ratio+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	opt_dil_type+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_dil_change+4,TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-
-comm_read_sp1:
-	movff	char_I_setpoint_cbar+0, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_setpoint_change+0, TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_sp2:
-	movff	char_I_setpoint_cbar+1, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_setpoint_change+1, TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_sp3:
-	movff	char_I_setpoint_cbar+2, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_setpoint_change+2, TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_sp4:
-	movff	char_I_setpoint_cbar+3, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_setpoint_change+3, TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
-comm_read_sp5:
-	movff	char_I_setpoint_cbar+4, TXREG1
-	rcall	comm_read_setting_wait			; Wait for UART
-	movff	char_I_setpoint_change+4, TXREG1
-	bra		comm_read_done					; Done. Wait for UART and loop with timeout reset
+comm_read_gas_dil:
+	lfsr	FSR0,opt_gas_O2_ratio		; load base address of gas data arrays
+	movf	up,W						; load index (0-9) of gas/dil into WREG, addressing O2 ratio
+	movff	PLUSW0, TXREG1				; transmit O2 ratio
+	rcall	comm_write_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing He ratio now
+	movff	PLUSW0, TXREG1				; transmit He ratio
+	rcall	comm_write_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing gas/dil type now
+	movff	PLUSW0, TXREG1				; transmit gas/dil type
+	rcall	comm_write_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing change depth now
+	movff	PLUSW0,TXREG1				; transmit change depth
+	bra		comm_read_done				; done, wait for UART and loop with timeout reset
 
 
+; Memory map is as follows:
+; -------------------------
+; char_I_setpoint_cbar			res 5	; setpoints in cbar
+; char_I_setpoint_change		res 5	; change depth for the setpoints in meter
+
+comm_read_sp:
+	lfsr	FSR0,char_I_setpoint_cbar	; load base address of setpoint cbar values
+	movf	up,W						; load index (0-4) of setpoint into WREG, addressing cbar value
+	movff	PLUSW0, TXREG1				; transmit setpoint cbar value
+	rcall	comm_write_byte				; wait for UART
+	addlw	.5							; increment index by 5, addressing change depth now
+	movff	PLUSW0, TXREG1				; transmit change depth
+	bra		comm_read_done				; done, wait for UART and loop with timeout reset
+
 ;-----------------------------------------------------------------------------
-comm_write_gas1:
-	movff	RCREG1,opt_gas_O2_ratio+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_He_ratio+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_type+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_OC_bail_gas_change+0
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_gas2:
-	movff	RCREG1,opt_gas_O2_ratio+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_He_ratio+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_type+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_OC_bail_gas_change+1
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_gas3:
-	movff	RCREG1,opt_gas_O2_ratio+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_He_ratio+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_type+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_OC_bail_gas_change+2
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_gas4:
-	movff	RCREG1,opt_gas_O2_ratio+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_He_ratio+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_type+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_OC_bail_gas_change+3
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_gas5:
-	movff	RCREG1,opt_gas_O2_ratio+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_He_ratio+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_gas_type+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_OC_bail_gas_change+4
-	bra		comm_write_abort				; Done. Loop with timeout reset
-
 
 comm_write_setting:
 	movlw	"w"
 	movwf	TXREG1
-	rcall	comm_write_get_byte				; "Byte 2"
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_write_abort				; No, abort!
-	movff	RCREG1,lo						; Copy
-	rcall	comm_write_get_byte				; "Byte 3"
-	rcall	comm_read_setting_wait			; Wait for UART
+	rcall	comm_get_byte					; "Byte 2"
+	btfsc	rs232_receive_overflow			; got byte?
+	bra		comm_write_abort				; NO - abort!
+	movff	RCREG1,lo						; copy
+	rcall	comm_get_byte					; "Byte 3"
+	rcall	comm_write_byte					; wait for UART
 	movlw	0x0F
 	cpfsgt	lo								; 0x00-0x0F: unused
 	bra		comm_write_abort				; abort!
-	subwf	lo,W							; Subtract unused commands
-	dcfsnz	WREG
-	bra		comm_write_gas1					; RCREG1=0x10
+	subwf	lo,W							; subtract unused commands
+
+	clrf	up								; set gas/dil index to 0  (0 = gas 1)
 	dcfsnz	WREG
-	bra		comm_write_gas2					; RCREG1=0x11
+	bra		comm_write_gas_dil				; RCREG1=0x10
+	incf	up								; increment gas/dil index (1 = gas 2)
 	dcfsnz	WREG
-	bra		comm_write_gas3					; RCREG1=0x12
+	bra		comm_write_gas_dil				; RCREG1=0x11
+	incf	up								; increment gas/dil index (2 = gas 3)
 	dcfsnz	WREG
-	bra		comm_write_gas4					; RCREG1=0x13
+	bra		comm_write_gas_dil				; RCREG1=0x12
+	incf	up								; increment gas/dil index (3 = gas 4)
 	dcfsnz	WREG
-	bra		comm_write_gas5					; RCREG1=0x14
+	bra		comm_write_gas_dil				; RCREG1=0x13
+	incf	up								; increment gas/dil index (4 = gas 5)
 	dcfsnz	WREG
-	bra		comm_write_dil1					; RCREG1=0x15
+	bra		comm_write_gas_dil				; RCREG1=0x14
+	incf	up								; increment gas/dil index (5 = dil 1)
 	dcfsnz	WREG
-	bra		comm_write_dil2					; RCREG1=0x16
+	bra		comm_write_gas_dil				; RCREG1=0x15
+	incf	up								; increment gas/dil index (6 = dil 2)
+	dcfsnz	WREG
+	bra		comm_write_gas_dil				; RCREG1=0x16
+	incf	up								; increment gas/dil index (7 = dil 3)
 	dcfsnz	WREG
-	bra		comm_write_dil3					; RCREG1=0x17
-	dcfsnz	WREG
-	bra		comm_write_dil4					; RCREG1=0x18
+	bra		comm_write_gas_dil				; RCREG1=0x17
+	incf	up								; increment gas/dil index (8 = dil 4)
 	dcfsnz	WREG
-	bra		comm_write_dil5					; RCREG1=0x19
+	bra		comm_write_gas_dil				; RCREG1=0x18
+	incf	up								; increment gas/dil index (9 = dil 5)
 	dcfsnz	WREG
-	bra		comm_write_sp1					; RCREG1=0x1A
+	bra		comm_write_gas_dil				; RCREG1=0x19
+
+	clrf	up								; set setpoint index to 0 (0 = SP 1)
 	dcfsnz	WREG
-	bra		comm_write_sp2					; RCREG1=0x1B
+	bra		comm_write_sp					; RCREG1=0x1A
+	incf	up								; increment setpoint index (1 = SP2)
 	dcfsnz	WREG
-	bra		comm_write_sp3					; RCREG1=0x1C
+	bra		comm_write_sp					; RCREG1=0x1B
+	incf	up								; increment setpoint index (2 = SP3)
 	dcfsnz	WREG
-	bra		comm_write_sp4					; RCREG1=0x1D
+	bra		comm_write_sp					; RCREG1=0x1C
+	incf	up								; increment setpoint index (3 = SP4)
 	dcfsnz	WREG
-	bra		comm_write_sp5					; RCREG1=0x1E
+	bra		comm_write_sp					; RCREG1=0x1D
+	incf	up								; increment setpoint index (4 = SP5)
+	dcfsnz	WREG
+	bra		comm_write_sp					; RCREG1=0x1E
+
 	dcfsnz	WREG
 	movff	RCREG1, opt_ccr_mode			; RCREG1=0x1F
 	dcfsnz	WREG
@@ -1353,7 +1436,7 @@
 	dcfsnz	WREG
 	movff	RCREG1, opt_calibration_O2_ratio; RCREG1=0x37
 	dcfsnz	WREG
-	nop						; RCREG1=0x38	NOT USED ANYMORE (ex opt_sensor_fallback)
+	nop										; RCREG1=0x38	NOT USED ANYMORE (ex opt_sensor_fallback)
 	dcfsnz	WREG
 	movff	RCREG1, opt_flip_screen			; RCREG1=0x39
 	dcfsnz	WREG
@@ -1432,116 +1515,163 @@
 	movff	RCREG1, opt_sat_multiplier_gf	; RCREG1=0x5E
 	dcfsnz	WREG
 	movff	RCREG1, opt_desat_multiplier_gf	; RCREG1=0x5F
-
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_1+0	; RCREG1=0x60
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_1+1	; RCREG1=0x61
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_2+0	; RCREG1=0x62
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_2+1	; RCREG1=0x63
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_3+0	; RCREG1=0x64
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_3+1	; RCREG1=0x65
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_4+0	; RCREG1=0x66
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_4+1	; RCREG1=0x67
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_5+0	; RCREG1=0x68
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_5+1	; RCREG1=0x69
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_6+0	; RCREG1=0x6A
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_6+1	; RCREG1=0x6B
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_7+0	; RCREG1=0x6C
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_7+1	; RCREG1=0x6D
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_8+0	; RCREG1=0x6E
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_8+1	; RCREG1=0x6F
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_9+0	; RCREG1=0x70
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_9+1	; RCREG1=0x71
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_10+0	; RCREG1=0x72
+	dcfsnz	WREG
+	movff	RCREG1, opt_transmitter_id_10+1	; RCREG1=0x73
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_size+5		; RCREG1=0x74
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_size+6		; RCREG1=0x75
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_size+7		; RCREG1=0x76
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_size+8		; RCREG1=0x77
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_size+9		; RCREG1=0x78
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_pres_fill+5	; RCREG1=0x79
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_pres_fill+6	; RCREG1=0x7A
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_pres_fill+7	; RCREG1=0x7B
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_pres_fill+8	; RCREG1=0x7C
+	dcfsnz	WREG
+	movff	RCREG1, char_I_tank_pres_fill+9	; RCREG1=0x7D
+	dcfsnz	WREG
+	movff	RCREG1, opt_TR_mode				; RCREG1=0x7E
+	dcfsnz	WREG
+	movff	RCREG1, opt_TR_1st_pres			; RCREG1=0x7F
+	dcfsnz	WREG
+	movff	RCREG1, opt_TR_2nd_pres			; RCREG1=0x80
+	dcfsnz	WREG
+	movff	RCREG1, opt_TR_Bail_pres		; RCREG1=0x81
+	dcfsnz	WREG
+	movff	RCREG1, char_I_max_pres_diff	; RCREG1=0x82
+	dcfsnz	WREG
+	movff	RCREG1, opt_ZfactorUse			; RCREG1=0x83
+	dcfsnz	WREG
+	movff	RCREG1, opt_ZfactorTemp			; RCREG1=0x84
+	dcfsnz	WREG
+	movff	RCREG1, opt_2ndDepthDisp		; RCREG1=0x85
 
 comm_write_abort:
-	; Check Options, gases and diluents
-	call	option_check_all				; Check all options (and reset if not within their min/max boundaries)
-	bsf		ccr_diluent_setup				; =1: Setting up Diluents ("Gas6-10")
-	call	gaslist_cleanup_list			; Takes care that only one gas can be first and first has 0m change depth
-	bcf		ccr_diluent_setup				; =1: Setting up Diluents ("Gas6-10")
-	call	gaslist_cleanup_list			; Takes care that only one gas can be first and first has 0m change depth
-	call	get_first_gas_to_WREG			; Makes sure at least one Gas is "First"
-	call	get_first_dil_to_WREG			; Makes sure at least one Diluent is "First"
-	goto	comm_download_mode0				; Done. Loop with timeout reset
+comm_write_done:
+	; check options, gases and diluents
+	call	option_check_all			; check all options (and reset if not within their min/max boundaries)
+	bsf		FLAG_diluent_setup			; =1: setting up diluents
+	call	gaslist_cleanup_list		; take care that only one gas can be first and first has 0m change depth
+	bcf		FLAG_diluent_setup			; =1: Setting up diluents
+	call	gaslist_cleanup_list		; take care that only one gas can be first and first has 0m change depth
+	call	get_first_gas_to_WREG		; make sure at least one gas is "First"
+	call	get_first_dil_to_WREG		; make sure at least one diluent is "First"
+	goto	comm_download_mode0			; done, loop with timeout reset
+
+;-----------------------------------------------------------------------------
+
+; Memory map is as follows:
+; -------------------------
+; opt_gas_O2_ratio			res 5		; O2 ratios of OC/bailout gases
+; opt_dil_O2_ratio			res 5		; O2 ratios of diluents
+; opt_gas_He_ratio			res 5		; He ratios of OC/bailout gases
+; opt_dil_He_ratio			res 5		; He ratios of diluents
+; opt_gas_type				res 5		; OC/bailout gas type
+; opt_dil_type				res 5		; dil type
+; opt_gas_change			res 5		; change depths for OC/Bailout gases
+; opt_dil_change			res 5		; change depths for diluents
 
-comm_write_dil1:
-	movff	RCREG1,opt_dil_O2_ratio+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_He_ratio+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_type+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_dil_change+0
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_dil2:
-	movff	RCREG1,opt_dil_O2_ratio+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_He_ratio+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_type+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_dil_change+1
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_dil3:
-	movff	RCREG1,opt_dil_O2_ratio+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_He_ratio+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_type+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_dil_change+2
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_dil4:
-	movff	RCREG1,opt_dil_O2_ratio+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_He_ratio+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_type+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_dil_change+3
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_dil5:
-	movff	RCREG1,opt_dil_O2_ratio+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_He_ratio+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,opt_dil_type+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_dil_change+4
-	bra		comm_write_abort				; Done. Loop with timeout reset
+comm_write_gas_dil:
+	lfsr	FSR0,opt_gas_O2_ratio		; load base address of gas data arrays
+	movf	up,W						; load index (0-9) of gas/dil into WREG, addressing O2 ratio
+	movff	RCREG1,PLUSW0				; receive O2 ratio
+	rcall	comm_get_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing He ratio now
+	movff	RCREG1,PLUSW0				; receive He ratio
+	rcall	comm_get_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing gas/dil type now
+	movff	RCREG1,PLUSW0				; receive gas/dil type
+	rcall	comm_get_byte				; wait for UART
+	addlw	.10							; increment index by 10, addressing change depth now
+	movff	RCREG1,PLUSW0				; receive change depth
+	bra		comm_write_done				; done, loop with timeout reset
 
-comm_write_sp1:
-	movff	RCREG1,char_I_setpoint_cbar+0
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_setpoint_change+0
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_sp2:
-	movff	RCREG1,char_I_setpoint_cbar+1
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_setpoint_change+1
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_sp3:
-	movff	RCREG1,char_I_setpoint_cbar+2
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_setpoint_change+2
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_sp4:
-	movff	RCREG1,char_I_setpoint_cbar+3
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_setpoint_change+3
-	bra		comm_write_abort				; Done. Loop with timeout reset
-comm_write_sp5:
-	movff	RCREG1,char_I_setpoint_cbar+4
-	rcall	comm_write_get_byte
-	movff	RCREG1,char_I_setpoint_change+4
-	bra		comm_write_abort				; Done. Loop with timeout reset
+
+; Memory map is as follows:
+; -------------------------
+; char_I_setpoint_cbar			res 5	; setpoints in cbar
+; char_I_setpoint_change		res 5	; change depth for the setpoints in meter
+
+comm_write_sp:
+	lfsr	FSR0,char_I_setpoint_cbar	; load base address of setpoint cbar values
+	movf	up,W						; load index (0-4) of setpoint into WREG, addressing cbar value
+	movff	RCREG1,PLUSW0				; receive setpoint cbar value
+	rcall	comm_get_byte				; wait for UART
+	addlw	.5							; increment index by 5, addressing change depth now
+	movff	RCREG1,PLUSW0				; receive change depth
+	bra		comm_write_done				; done, loop with timeout reset
 
 ;-----------------------------------------------------------------------------
 
 comm_send_string:
-	movlw	"n"								; send echo
+	movlw	"n"							; send echo
 	movwf	TXREG1
-	rcall	comm_rs232_wait_tx				; Wait for UART
+	call	comm_write_byte				; wait for UART
 	WIN_SMALL comm_string_column, comm_string_row
 	movlw	.16
-	movwf	lo								; counter
+	movwf	lo							; counter
 comm_send_string_loop:
-	call	comm_write_get_byte
-	btfsc	rs232_receive_overflow			; Got byte?
-	bra		comm_send_string_abort			; No, abort!
-	movff	RCREG1,POSTINC2					; Store character
+	call	comm_get_byte
+	btfsc	rs232_receive_overflow		; got byte?
+	bra		comm_send_string_abort		; NO - abort!
+	movff	RCREG1,POSTINC2				; store character
 	decfsz	lo,F
 	bra		comm_send_string_loop
 comm_send_string_abort:
-	STRCAT_PRINT ""							; Show the text
-	goto	comm_download_mode0				; Done. Loop with timeout reset
+	STRCAT_PRINT ""						; show the text
+	goto	comm_download_mode0			; done, loop with timeout reset
 
 ;-----------------------------------------------------------------------------
 
 comm_check_day:
 	movff	RCREG1,day
-	movff	month,lo						; new month
+	movff	month,lo					; new month
 	dcfsnz	lo,F
 	movlw	.31
 	dcfsnz	lo,F
@@ -1566,23 +1696,23 @@
 	movlw	.30
 	dcfsnz	lo,F
 	movlw	.31
-	cpfsgt	day								; day ok?
-	return									; OK
-	movlw	.1								; not OK, set to 1st
+	cpfsgt	day							; day ok?
+	return								; YES
+	movlw	.1							; NO - set to 1st
 	movwf	day
 	return
 
 comm_write_button_polarity:
-	; Store RCREG1 into EEPROM .897
+	; store RCREG1 into EEPROM .897
 	movlw	LOW  .897
 	movwf	EEADR
 	movlw	HIGH .897
 	movwf	EEADRH
 	movff	RCREG1,EEDATA
-	movff	EEDATA,button_polarity			; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) 
-	call	write_eeprom					; EEDATA into EEPROM@EEADR
-	clrf	EEADRH							; Reset EEADRH
-	goto	comm_download_mode0				; Done. Loop with timeout reset
+	movff	EEDATA,button_polarity		; 0xFF (both normal), 0x00 (both inverted), 0x01 (left inverted only), 0x02 (right inverted only) 
+	call	write_eeprom				; EEDATA into EEPROM@EEADR
+	clrf	EEADRH						; reset EEADRH
+	goto	comm_download_mode0			; done, loop with timeout reset
 
 ;----------------------------------------------------------------------------
 	END
\ No newline at end of file
--- a/src/compass.c	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/compass.c	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,7 @@
 //////////////////////////////////////////////////////////////////////////////
 /// compass.c
-/// Compute north direction from magnetic/acceleration measures.
+/// Compute north direction from magnetic/acceleration measures
+///
 /// Copyright (c) 2012-2015, JD Gascuel, HeinrichsWeikamp, all right reserved.
 //////////////////////////////////////////////////////////////////////////////
 // HISTORY
@@ -12,189 +13,197 @@
 #include "compass.h"
 
 //////////////////////////////////////////////////////////////////////////////
-// mH: Crude work-around, needs to be made right
+// mH: crude work-around, needs to be fixed up
 #ifndef UNIX
-#   pragma udata overlay bank8=0x800
-    static char	  C_STACK[256];  // Overlay C-code data stack here.
-#       define RESET_C_STACK    \
-        _asm                    \
-            LFSR    1, 0x800    \
-            LFSR    2, 0x800    \
-        _endasm
-#   pragma udata overlay bank9_compass
-#   pragma code compass_run
+#	pragma udata overlay bank8=0x800
+	static char C_STACK[256];			// overlay C-code data stack here
+#	define RESET_C_STACK		\
+		_asm					\
+			LFSR	1, 0x800	\
+			LFSR	2, 0x800	\
+		_endasm
+#	pragma udata overlay bank9_compass
+#	pragma code compass_run
 #else
-#   define RESET_C_STACK
+#	define RESET_C_STACK
 #endif
 
 //////////////////////////////////////////////////////////////////////////////
 // fifth order of polynomial approximation of atan(), giving 0.05 deg max error
 //
-#define K1  (5701)  // Needs K1/2**16
-#define K2  (1645)  // Needs K2/2**48  WAS NEGATIV
-#define K3  ( 446)  // Needs K3/2**80
+#define K1	(5701)			// needs K1/2**16
+#define K2	(1645)			// needs K2/2**48  WAS NEGATIV
+#define K3	( 446)			// needs K3/2**80
+
 
 //////////////////////////////////////////////////////////////////////////////
-// Interface to assembleur multiplies
+// Interface to assembler multiplies
+
 Int16 umul(PARAMETER Int16 a, PARAMETER Int16 b)
 {
-    extern Int16 compass_umul(void);
-    extern Int16 compass_a, compass_b;
-    compass_a = a;
-    compass_b = b;
-    return compass_umul();
+	extern Int16 compass_umul(void);
+	extern Int16 compass_a, compass_b;
+	compass_a = a;
+	compass_b = b;
+	return compass_umul();
 }
 
 Int16 imul(PARAMETER Int16 a, PARAMETER Int16 b)
 {
-    extern Int16 compass_imul(void);
-    extern Int16 compass_a, compass_b;
-    compass_a = a;
-    compass_b = b;
-    return compass_imul();
+	extern Int16 compass_imul(void);
+	extern Int16 compass_a, compass_b;
+	compass_a = a;
+	compass_b = b;
+	return compass_imul();
 }
 
 //////////////////////////////////////////////////////////////////////////////
 /// Returns a / b * 2**16
 ///
-/// A 16/16 -> 16 bits divide, returning a scalled result.
+/// A 16/16 -> 16 bits divide, returning a scaled result.
 /// Used to multiply fractional numbers in the range 0..1,
 /// represented as 0..32767.
+
 Int16 udiv(PARAMETER Int16 a, PARAMETER Int16 b)
 {
-    OVERLAY Int16 d, r;
+	OVERLAY Int16 d, r;
 
-    //---- Pre-scale both numerator and denominator --------------------------
-    while( (((a>>8) | (b>>8)) & 0xC0) == 0 )
-    {
-        a <<= 1;
-        b <<= 1;
-    }
+	//---- Pre-scale both numerator and denominator --------------------------
+	while( (((a>>8) | (b>>8)) & 0xC0) == 0 )
+	{
+		a <<= 1;
+		b <<= 1;
+	}
 
-    //---- Make division trials ----------------------------------------------
-    d = 0x4000;             // Starts with 0.5, because 1.0 is sign bit.
-    b >>= 1;                // Hence pre-shift b.
-    r = 0;
-    do {
-        if( a >= b ) {      // a is big enough ?
-            a -= b;         // then count d times b out of it.
-            r |= d;         // and accumulate that bit.
-        }
-        b >>= 1;            // then loop trying twice smaller.
-        d >>= 1;
-    } while( b );
-    return r;
+	//---- Make division trials ----------------------------------------------
+	d = 0x4000;				// start with 0.5, because 1.0 is sign bit
+	b >>= 1;				// hence pre-shift b
+	r = 0;
+	do {
+		if( a >= b )		// a is big enough ?
+		{
+			a -= b;			// then count d times b out of it
+			r |= d;			// and accumulate that bit
+		}
+		b >>= 1;			// then loop trying twice smaller
+		d >>= 1;
+	} while( b );
+	return r;
 }
 
 //////////////////////////////////////////////////////////////////////////////
 /// Computes atan(y/x) in Angle, for x, y in range 0..32767
 ///
 /// Results a single quadrant Angle, in the range 0 .. Q_PI/2
+
 Angle utan(PARAMETER Int16 y, PARAMETER Int16 x)
 {
-    OVERLAY Int16 ratio, angle, x2, x3;
+	OVERLAY Int16 ratio, angle, x2, x3;
 
-    //---- Handle zero divisor -----------------------------------------------
-    if( x == 0 )
-        return (y == 0) ? 0 : Q_PIO2;
+	//---- Handle zero divisor -----------------------------------------------
+	if( x == 0 )
+		return (y == 0) ? 0 : Q_PIO2;
 
-    //---- Make it half-quadrant : 0 .. 45 deg -------------------------------
-    ratio = (x > y) ? udiv(y, x) : udiv(x, y);
+	//---- Make it half-quadrant : 0 .. 45 deg -------------------------------
+	ratio = (x > y) ? udiv(y, x) : udiv(x, y);
 
-    //---- Then apply the polynomial approximation ---------------------------
-    angle = umul(K1, ratio);            // r*K1 / 2**16
-    x2 = umul(ratio, ratio);            // r**2 / 2**16
-    x3 = umul(x2, ratio);               // r**3 / 2**32
-    angle -= umul(x3, K2);              // K2*r**3 / 2**48: NEGATIV.
+	//---- Then apply the polynomial approximation ---------------------------
+	angle = umul(K1, ratio);			// r*K1 / 2**16
+	x2 = umul(ratio, ratio);			// r**2 / 2**16
+	x3 = umul(x2, ratio);				// r**3 / 2**32
+	angle -= umul(x3, K2);				// K2*r**3 / 2**48: NEGATIV.
 
-    x3 = umul(x3, x2);                  // r**5 / 2**64
-    angle += umul(x3, K3);              // K3*r**5 / 2**80
+	x3 = umul(x3, x2);					// r**5 / 2**64
+	angle += umul(x3, K3);				// K3*r**5 / 2**80
 
-    //---- Recover the full quadrant -----------------------------------------
-    return (x < y) ? (Angle)(Q_PIO2 - angle)
-                   : (Angle)(angle);
+	//---- Recover the full quadrant -----------------------------------------
+	return (x < y) ? (Angle)(Q_PIO2 - angle)
+				   : (Angle)(angle);
 }
 
 //////////////////////////////////////////////////////////////////////////////
 /// Computes atan2(y/x) in Angle, for x, y in range -32768 to 32767
 ///
 /// Results a four quadrant Angle, in the range -Q_PI .. +Q_PI
+
 Angle itan(PARAMETER Int16 y, PARAMETER Int16 x)
 {
-    // Beware: -32768 is not properly handled (sgn error).
-    if( x == -32768 ) x = -32767;
-    if( y == -32768 ) y = -32767;
+	// Beware: -32768 is not properly handled (sign error)
+	if( x == -32768 ) x = -32767;
+	if( y == -32768 ) y = -32767;
 
-    if( x >= 0 )
-        if( y >= 0 )    // First quadrant: 0..90 deg.
-            return utan(y,x);
-        else            // Fourth quadrant: 0..-90 deg
-            return -utan(-y,x);
-    else
-        if( y >= 0 )    // Second quadrant: 90..180 deg
-            return Q_PI - utan(y, -x);
-        else            // Third quadrant: -90..-180 deg;
-            return -Q_PI + utan(-y, -x);
+	if( x >= 0 )
+		if( y >= 0 )					// first  quadrant: 0..90 deg.
+			return utan(y,x);
+		else							// fourth quadrant: 0..-90 deg
+			return -utan(-y,x);
+	else
+		if( y >= 0 )					// second quadrant: 90..180 deg
+			return Q_PI - utan(y, -x);
+		else							// third  quadrant: -90..-180 deg;
+			return -Q_PI + utan(-y, -x);
 }
 
 //////////////////////////////////////////////////////////////////////////////
 /// Computes cos(theta) = sqrtf(x2/h2),
 /// when theta = atan(y/x) and h2=x*x+y*y
 ///
+
 Int16 cosxh(PARAMETER Int16 x2, PARAMETER Int16 h2)
 {
-    OVERLAY Int16 r = 0;
-    OVERLAY Int16 d = 0x4000;
+	OVERLAY Int16 r = 0;
+	OVERLAY Int16 d = 0x4000;
 
-    do {
-        OVERLAY Int16 a = r + d;
-        a = umul(a, a);
-        a = umul(a, h2);
-        if( a <= x2 ) r += d;
-        d >>= 1;
-    } while( d );
+	do {
+		OVERLAY Int16 a = r + d;
+		a = umul(a, a);
+		a = umul(a, h2);
+		if( a <= x2 ) r += d;
+		d >>= 1;
+	} while( d );
 
-    return r;
+	return r;
 }
 
 //////////////////////////////////////////////////////////////////////////////
 /// Computes both sin and cos of angle y/x,
 /// with h = sqrt(x**2+y**2).
 ///
+
 void sincos(PARAMETER Int16 x, PARAMETER Int16 y, Int16* sin, Int16* cos)
 {
-    OVERLAY Int16 x2, y2, h2;
+	OVERLAY Int16 x2, y2, h2;
 
-    //---- Fold into one quadant ---------------------------------------------
-    OVERLAY char neg = 0;
-    if( x < 0 )
-    {
-        neg |= 1;
-        x = -x;
-    }
-    if( y < 0 )
-    {
-        neg |= 2;
-        y = -y;
-    }
+	//---- Fold into one quadant ---------------------------------------------
+	OVERLAY char neg = 0;
+	if( x < 0 )
+	{
+		neg |= 1;
+		x = -x;
+	}
+	if( y < 0 )
+	{
+		neg |= 2;
+		y = -y;
+	}
 
-    //---- Pre-scale both numerator and denominator ----------------------
-    while( (((x>>8) | (y>>8)) & 0xE0) == 0 )
-    {
-        x <<= 1;
-        y <<= 1;
-    }
+	//---- Pre-scale both numerator and denominator ----------------------
+	while( (((x>>8) | (y>>8)) & 0xE0) == 0 )
+	{
+		x <<= 1;
+		y <<= 1;
+	}
 
-    //---- Uses trig() to do the stuff one on quadrant -------------------
-    x2 = umul(x,x);
-    y2 = umul(y,y);
-    h2 = x2 + y2;
-    x2 = cosxh(x2, h2);
+	//---- Uses trig() to do the stuff one on quadrant -------------------
+	x2 = umul(x,x);
+	y2 = umul(y,y);
+	h2 = x2 + y2;
+	x2 = cosxh(x2, h2);
 
-    //---- Results back in four quadrants --------------------------------
-    *cos = (neg & 1) ? -x2 : x2;
-    y2 = cosxh(y2, h2);
-    *sin = (neg & 2) ? -y2 : y2;
+	//---- Results back in four quadrants --------------------------------
+	*cos = (neg & 1) ? -x2 : x2;
+	y2   = cosxh(y2, h2);
+	*sin = (neg & 2) ? -y2 : y2;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -202,47 +211,48 @@
 
 void compass(void)
 {
-    OVERLAY Int16 sin, cos;
-    OVERLAY Int16 iBfx, iBfy, Gz;
-    OVERLAY Int16 iBpx, iBpy, iBpz;
-    RESET_C_STACK;
+	OVERLAY Int16 sin, cos;
+	OVERLAY Int16 iBfx, iBfy, Gz;
+	OVERLAY Int16 iBpx, iBpy, iBpz;
+
+	RESET_C_STACK;
 
-    //---- Make hard iron correction -----------------------------------------
-    // Measured magnetometer orientation, measured ok.
-    // From matthias drawing: (X,Y,Z) --> (X,Y,Z) : no rotation.
-    iBpx = compass_DX_f - compass_CX_f; // X
-    iBpy = compass_DY_f - compass_CY_f; // Y
-    iBpz = compass_DZ_f - compass_CZ_f; // Z
+	//---- Make hard iron correction -----------------------------------------
+	// Measured magnetometer orientation, measured ok
+	// From matthias drawing: (X,Y,Z) --> (X,Y,Z) : no rotation
+	iBpx = compass_DX_f - compass_CX_f; // X
+	iBpy = compass_DY_f - compass_CY_f; // Y
+	iBpz = compass_DZ_f - compass_CZ_f; // Z
 
-    //---- Calculate sine and cosine of roll angle Phi -----------------------
-    sincos(accel_DZ_f, accel_DY_f, &sin, &cos);
+	//---- Calculate sine and cosine of roll angle Phi -----------------------
+	sincos(accel_DZ_f, accel_DY_f, &sin, &cos);
 
-    //---- rotate by roll angle (-Phi) ---------------------------------------
-    iBfy = imul(iBpy, cos) - imul(iBpz, sin);
-    iBpz = imul(iBpy, sin) + imul(iBpz, cos);
-    Gz = imul(accel_DY_f, sin) + imul(accel_DZ_f, cos);
+	//---- rotate by roll angle (-Phi) ---------------------------------------
+	iBfy = imul(iBpy, cos) - imul(iBpz, sin);
+	iBpz = imul(iBpy, sin) + imul(iBpz, cos);
+	Gz = imul(accel_DY_f, sin) + imul(accel_DZ_f, cos);
 
-    //---- calculate sin and cosine of pitch angle Theta ---------------------
-    sincos(Gz, -accel_DX_f, &sin, &cos);     // NOTE: changed sin sign.
+	//---- calculate sin and cosine of pitch angle Theta ---------------------
+	sincos(Gz, -accel_DX_f, &sin, &cos);	 // NOTE: changed sin sign
 
-    /* correct cosine if pitch not in range -90 to 90 degrees */
-    if( cos < 0 ) cos = -cos;
+	/* correct cosine if pitch not in range -90 to 90 degrees */
+	if( cos < 0 ) cos = -cos;
 
-    ///---- de-rotate by pitch angle Theta -----------------------------------
-    iBfx = imul(iBpx, cos) + imul(iBpz, sin);
+	///---- de-rotate by pitch angle Theta -----------------------------------
+	iBfx = imul(iBpx, cos) + imul(iBpz, sin);
 
-    //---- Detect uncalibrated compass ---------------------------------------
-    if( !compass_CX_f && !compass_CY_f && !compass_CZ_f )
-    {
-        compass_heading = -1;
-        return;
-    }
+	//---- Detect uncalibrated compass ---------------------------------------
+	if( !compass_CX_f && !compass_CY_f && !compass_CZ_f )
+	{
+		compass_heading = -1;
+		return;
+	}
 
-    //---- calculate current yaw = e-compass angle Psi -----------------------
-    // Result in degree (no need of 0.01 deg precision...
-    compass_heading = itan(-iBfy, iBfx) / 100;
+	//---- calculate current yaw = e-compass angle Psi -----------------------
+	// Result in degree (no need of 0.01 deg precision...
+	compass_heading = itan(-iBfy, iBfx) / 100;
 
-    // Result in 0..360 range:
-    if( compass_heading < 0 )
-        compass_heading += 360;
+	// Result in 0..360 range:
+	if( compass_heading < 0 )
+		compass_heading += 360;
 }
--- a/src/compass.h	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/compass.h	Thu Nov 22 19:47:26 2018 +0100
@@ -5,23 +5,23 @@
 //---- Storage classes -------------------------------------------------------
 // Declaring PIC18 and VC++/G++ functions.
 #ifdef UNIX
-#   define PARAMETER
-#   define OVERLAY
+#	define PARAMETER
+#	define OVERLAY
 #else
 //---- Bank 9 parameters -----------------------------------------------------
-#   pragma udata overlay bank9_compass = 0x900
-#   define PARAMETER    static
-#   define OVERLAY      overlay
+#	pragma udata overlay bank9_compass = 0x900
+#	define PARAMETER	static
+#	define OVERLAY		overlay
 #endif
 
 //////////////////////////////////////////////////////////////////////////////
 
-#define Q_PI    (18000)
-#define Q_PIO2  (9000)
+#define Q_PI	(18000)
+#define Q_PIO2	(9000)
 
-typedef short int Int16;
-typedef signed char Int8;
-typedef Int16 Angle;
+typedef short  int	Int16;
+typedef signed char	Int8;
+typedef Int16		Angle;
 
 // The (filtered) components of the magnetometer sensor:
 extern Int16 compass_DX_f;
@@ -49,12 +49,12 @@
 extern Angle utan(PARAMETER Int16 a, PARAMETER Int16 b);
 extern Angle itan(PARAMETER Int16 a, PARAMETER Int16 b);
 extern Angle cosxh(PARAMETER Int16 a, PARAMETER Int16 b);
-extern void  sincos(PARAMETER Int16 a, PARAMETER Int16 b, Int16* sin, Int16* cos);
+
+extern void sincos(PARAMETER Int16 a, PARAMETER Int16 b, Int16* sin, Int16* cos);
 
 //////////////////////////////////////////////////////////////////////////////
 // The user functions
 extern void compass(void);
 extern void compass_reset_calibration(void);
 extern void compass_add_calibration(void);
-
 extern void compass_solve_calibration(void);
--- a/src/compass_calib.c	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/compass_calib.c	Thu Nov 22 19:47:26 2018 +0100
@@ -11,12 +11,12 @@
 // mH: Put compass data into bank 8 (stack) and bank 9 (variables)
 #ifndef UNIX
 #   pragma udata overlay bank8=0x800
-    static char	  C_STACK[256];  // Overlay C-code data stack here.
-#       define RESET_C_STACK    \
-        _asm                    \
-            LFSR    1, 0x800    \
-            LFSR    2, 0x800    \
-        _endasm
+	static char C_STACK[256];				// overlay C-code data stack here
+#	define RESET_C_STACK		\
+		_asm					\
+			LFSR	1, 0x800	\
+			LFSR	2, 0x800	\
+		_endasm
 #   pragma udata overlay bank9_compass
 #else
 #   define RESET_C_STACK
@@ -26,157 +26,158 @@
 
 static unsigned short int compass_N;
 
-static float Su, Sv, Sw;                    // First order moments.
-static float Suu, Svv, Sww, Suv, Suw, Svw;  // Second order moments.
-static float Saa;  // Suu + Svv + Sww
-static float Saau; // Suuu + Svvu + Swwu    // Third order moment.
-static float Saav; // Suuv + Svvv + Swwv
-static float Saaw; // Suuw + Svvw + Swww
-static float yu, yv, yw;                    // temp solution vector.
-static float uc, vc, wc;                    // temp sphere's center.
+static float Su, Sv, Sw;											// first order moments
+static float Suu, Svv, Sww, Suv, Suw, Svw;							// second order moments
+static float Saa;							// Suu  + Svv  + Sww
+static float Saau;							// Suuu + Svvu + Swwu	// third order moment
+static float Saav;							// Suuv + Svvv + Swwv
+static float Saaw;							// Suuw + Svvw + Swww
+static float yu, yv, yw;											// temp solution vector
+static float uc, vc, wc;											// temp sphere's center
 
 //////////////////////////////////////////////////////////////////////////////
 
 void compass_reset_calibration()
 {
-    RESET_C_STACK;
+	RESET_C_STACK;
 
-    compass_N = 0;
-    Su = Sv = Sw = 0.0;
-    Suu = Svv = Sww = Suv = Suw = Svw = 0.0;
-    Saau = Saav = Saaw = 0.0;
-    compass_CX_f = compass_CY_f = compass_CZ_f = 0;
+	compass_N                                   = 0;
+	Su           = Sv           = Sw            = 0.0;
+	Suu          = Svv          = Sww           = 0.0;
+	Suv          = Suw          = Svw           = 0.0;
+	Saau         = Saav         = Saaw          = 0.0;
+	compass_CX_f = compass_CY_f = compass_CZ_f  = 0;
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
 void compass_add_calibration()
 {
-    RESET_C_STACK;
+	RESET_C_STACK;
 
-    // Get filtered/calibrated magnetic direction:
-    yu = (compass_DX_f - compass_CX_f) / 32768.0f;
-    yv = (compass_DY_f - compass_CY_f) / 32768.0f;
-    yw = (compass_DZ_f - compass_CZ_f) / 32768.0f;
+	// get filtered/calibrated magnetic direction
+	yu = (compass_DX_f - compass_CX_f) / 32768.0f;
+	yv = (compass_DY_f - compass_CY_f) / 32768.0f;
+	yw = (compass_DZ_f - compass_CZ_f) / 32768.0f;
 
-    // Add to all moments:
-    compass_N++;
+	// add to all moments
+	compass_N++;
 
-    Su += yu;
-    Sv += yv;
-    Sw += yw;
+	Su += yu;
+	Sv += yv;
+	Sw += yw;
 
-    Suu += yu*yu;
-    Suv += yu*yv;
-    Suw += yu*yw;
-    Svv += yv*yv;
-    Svw += yv*yw;
-    Sww += yw*yw;
+	Suu += yu*yu;
+	Suv += yu*yv;
+	Suw += yu*yw;
+	Svv += yv*yv;
+	Svw += yv*yw;
+	Sww += yw*yw;
 
-    Saa = yu*yu + yv*yv + yw*yw;
-    Saau += yu * Saa;
-    Saav += yv * Saa;
-    Saaw += yw * Saa;
+	Saa   = yu*yu + yv*yv + yw*yw;
+	Saau += yu * Saa;
+	Saav += yv * Saa;
+	Saaw += yw * Saa;
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
 static float compass_discriminent(PARAMETER char column)
 {
-    // Basic symetric matrix:
-    OVERLAY float a = Suu, d = Suv, g = Suw;
-    OVERLAY float b = Suv, e = Svv, h = Svw;
-    OVERLAY float c = Suw, f = Svw, i = Sww;
+	// basic symmetric matrix
+	OVERLAY float a = Suu, d = Suv, g = Suw;
+	OVERLAY float b = Suv, e = Svv, h = Svw;
+	OVERLAY float c = Suw, f = Svw, i = Sww;
 
-    // Substitute a column, if asked to:
-    if( column==1 ) { a = yu; b = yv; c = yw; }
-    if( column==2 ) { d = yu; e = yv; f = yw; }
-    if( column==3 ) { g = yu; h = yv; i = yw; }
+	// substitute a column, if asked to
+	if( column==1 ) { a = yu; b = yv; c = yw; }
+	if( column==2 ) { d = yu; e = yv; f = yw; }
+	if( column==3 ) { g = yu; h = yv; i = yw; }
 
-    // Do the math:
-    return   a * (e * i - f * h)
-           - b * (d * i - f * g)
-           + c * (d * h - e * g);
+	// do the math
+	return   a * (e * i - f * h)
+	       - b * (d * i - f * g)
+	       + c * (d * h - e * g);
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
 static float compass_dotc(PARAMETER float u, float v, float w)
 {
-    return u*uc + v*vc + w*wc;
+	return u*uc + v*vc + w*wc;
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
 void compass_solve_calibration()
 {
-    OVERLAY float delta;
-    RESET_C_STACK;
+	OVERLAY float delta;
+	RESET_C_STACK;
 
-    //---- Compute center of measured magnetic directions --------------------
-    uc = Su/compass_N;
-    vc = Sv/compass_N;
-    wc = Sw/compass_N;
+	//---- Compute center of measured magnetic directions --------------------
+	uc = Su/compass_N;
+	vc = Sv/compass_N;
+	wc = Sw/compass_N;
 
-    //---- Normalize partial sums --------------------------------------------
-    //
-    // We measured the (u, v, w) values, and need the centered (x, y, z) ones
-    // around the sphere center's (uc, vc, wc) as:
-    // uc = Su / N;     The mean value
-    // x  = u - uc;     The differnce to the mean.
-    //
-    // So:
-    // x**2 = (u - uc)**2 = u**2 - 2u*uc + uc**2
-    //
-    // We need the Sxx sum of 2nd orders:
-    // Sxx = Suu - 2 uc Su + N*uc*(Su/N) = Suu - uc Su
-    Suu -= Su*uc;
-    Svv -= Sv*vc;
-    Sww -= Sw*wc;
+	//---- Normalize partial sums --------------------------------------------
+	//
+	// We measured the (u, v, w) values, and need the centered (x, y, z) ones
+	// around the sphere center's (uc, vc, wc) as:
+	// uc = Su / N;	 The mean value
+	// x  = u - uc;	 The differnce to the mean.
+	//
+	// So:
+	// x**2 = (u - uc)**2 = u**2 - 2u*uc + uc**2
+	//
+	// We need the Sxx sum of 2nd orders:
+	// Sxx = Suu - 2 uc Su + N*uc*(Su/N) = Suu - uc Su
+	Suu -= Su*uc;
+	Svv -= Sv*vc;
+	Sww -= Sw*wc;
 
-    // (u - uc)(v - vc) = uv - u vc - v uc + uc vc
-    // Sxy = Suv - Su vc -   Sv uc + N uc vc
-    //     = Suv - Su vc - N vc uc + N uc vc
-    //     = Suv - Su vc
-    Suv -= Su*vc;
-    Suw -= Su*wc;
-    Svw -= Sv*wc;
+	// (u - uc)(v - vc) = uv - u vc - v uc + uc vc
+	// Sxy = Suv - Su vc -   Sv uc + N uc vc
+	//     = Suv - Su vc - N vc uc + N uc vc
+	//     = Suv - Su vc
+	Suv -= Su*vc;
+	Suw -= Su*wc;
+	Svw -= Sv*wc;
 
-    // (u + um)**3 = u**3 + 3 u**2 um + 3 u um**2 + um**3
-    // Sxxx = Suuu + 3 um Suu + 3 um**2 Su + N.um**3
-    // Su = 0, um = Sx/N:
-    // Suuu = Sxxx - 3 Sx*Suu/N - N.(Sx/N)**3
-    //      = Sxxx - 3 Sx*Suu/N - Sx**3/N**2
+	// (u + um)**3 = u**3 + 3 u**2 um + 3 u um**2 + um**3
+	// Sxxx = Suuu + 3 um Suu + 3 um**2 Su + N.um**3
+	// Su   = 0, um = Sx/N:
+	// Suuu = Sxxx - 3 Sx*Suu/N - N.(Sx/N)**3
+	//      = Sxxx - 3 Sx*Suu/N - Sx**3/N**2
 
-    // (u + um)**2 (v + vm) = (u**2 + 2 u um + um**2)(v + vm)
-    // Sxxy = Suuv + vm Suu + 2 um (Suv + vm Su) + um**2 (Sv + N.vm)
-    //
-    // Su = 0, Sv = 0, vm = Sy/N:
-    // Sxxy = Suuv + vm Suu + 2 um Suv + N um**2 vm
-    //
-    // Suuv = Sxxy - (Sy/N) Suu - 2 (Sx/N) Suv - (Sx/N)**2 Sy
-    //      = Sxxy - Suu*Sy/N - 2 Suv*Sx/N - Sx*Sx*Sy/N/N
-    //      = Sxxy - (Suu + Sx*Sx/N)*Sy/N - 2 Suv*Sx/N
-    Saa = Suu + Svv + Sww;
-    yu = Saau - Saa*uc - compass_dotc(Su*uc + 2*Suu, Sv*uc + 2*Suv, Sw*uc + 2*Suw);
-    yv = Saav - Saa*vc - compass_dotc(Su*vc + 2*Suv, Sv*vc + 2*Svv, Sw*vc + 2*Svw);
-    yw = Saaw - Saa*wc - compass_dotc(Su*wc + 2*Suw, Sv*wc + 2*Svw, Sw*wc + 2*Sww);
+	// (u + um)**2 (v + vm) = (u**2 + 2 u um + um**2)(v + vm)
+	// Sxxy = Suuv + vm Suu + 2 um (Suv + vm Su) + um**2 (Sv + N.vm)
+	//
+	// Su   = 0, Sv = 0, vm = Sy/N:
+	// Sxxy = Suuv + vm Suu + 2 um Suv + N um**2 vm
+	//
+	// Suuv = Sxxy - (Sy/N) Suu - 2 (Sx/N) Suv - (Sx/N)**2 Sy
+	//      = Sxxy - Suu*Sy/N - 2 Suv*Sx/N - Sx*Sx*Sy/N/N
+	//      = Sxxy - (Suu + Sx*Sx/N)*Sy/N - 2 Suv*Sx/N
+	Saa = Suu + Svv + Sww;
+	yu = Saau - Saa*uc - compass_dotc(Su*uc + 2*Suu, Sv*uc + 2*Suv, Sw*uc + 2*Suw);
+	yv = Saav - Saa*vc - compass_dotc(Su*vc + 2*Suv, Sv*vc + 2*Svv, Sw*vc + 2*Svw);
+	yw = Saaw - Saa*wc - compass_dotc(Su*wc + 2*Suw, Sv*wc + 2*Svw, Sw*wc + 2*Sww);
 
-    //---- Solve the system --------------------------------------------------
-    // uc Suu + vc Suv + wc Suw = (Suuu + Svvu + Swwu) / 2
-    // uc Suv + vc Svv + wc Svw = (Suuv + Svvv + Swwv) / 2
-    // uc Suw + vc Svw + wc Sww = (Suuw + Svvw + Swww) / 2
-    // Note this is symetric, with a positiv diagonal, hence
-    // discriminent is always not null.
-    delta = 0.5f / compass_discriminent(0);
+	//---- Solve the system --------------------------------------------------
+	// uc Suu + vc Suv + wc Suw = (Suuu + Svvu + Swwu) / 2
+	// uc Suv + vc Svv + wc Svw = (Suuv + Svvv + Swwv) / 2
+	// uc Suw + vc Svw + wc Sww = (Suuw + Svvw + Swww) / 2
+	// Note this is symmetric, with a positive diagonal, hence
+	// discriminant is always not null.
+	delta = 0.5f / compass_discriminent(0);
 
-    // So computed new center, with offsetted values:
-    uc += compass_discriminent(1) * delta;
-    vc += compass_discriminent(2) * delta;
-    wc += compass_discriminent(3) * delta;
+	// so computed new center, with offset values:
+	uc += compass_discriminent(1) * delta;
+	vc += compass_discriminent(2) * delta;
+	wc += compass_discriminent(3) * delta;
 
-    // Add correction due to already applyed calibration:
-    compass_CX_f += (short)(32768 * uc);
-    compass_CY_f += (short)(32768 * vc);
-    compass_CZ_f += (short)(32768 * wc);
+	// add correction due to already applied calibration:
+	compass_CX_f += (short)(32768 * uc);
+	compass_CY_f += (short)(32768 * vc);
+	compass_CZ_f += (short)(32768 * wc);
 }
--- a/src/compass_ops.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/compass_ops.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File compass_ops.asm												V2.98
+;   File compass_ops.asm												V2.98a
 ;
 ;   Compass Operations
 ;
@@ -1446,17 +1446,4 @@
 	banksel	common
 	return
 
-	global  TFT_surf_set_bearing
-TFT_surf_set_bearing:
-	btfsc	premenu
-	return								; Already shown, return
-	bsf		premenu						; set flag
-	WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right
-	WIN_SMALL surf_compass_bear_column,surf_compass_bear_row
-	WIN_COLOR color_yellow
-	bsf		win_invert
-	STRCPY_TEXT_PRINT tSetHeading		; 7 chars
-	bcf		win_invert
-	return
-
 	END
--- a/src/convert.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/convert.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File convert.asm												## V2.98
+;   File convert.asm												## V2.98c
 ;
 ;   Converts register values to string
 ;
@@ -13,7 +13,7 @@
 
 #include "hwos.inc"						; Mandatory header
 
-basic	CODE
+convert		CODE
 
 ;=============================================================================
 
@@ -28,7 +28,7 @@
 output99:
 	movlw	d'99'
 	cpfslt	lo
-	movwf	lo							; Limit to 99
+	movwf	lo							; limit to 99
 	movff	lo,lo_temp
 	clrf	hi_temp
 	bcf		pre_zero_flag				; do not display leading zeros
@@ -54,7 +54,7 @@
 
 	movlw	d'99'
 	cpfslt	lo
-	movwf	lo							; Limit to 99
+	movwf	lo							; limit to 99
 	movff	lo, lo_temp
 	clrf	hi_temp
 	bsf		pre_zero_flag				; display leading zeros
@@ -84,18 +84,18 @@
 	; 9999 = 27 0F = [39][15]
 	movlw	.40
 	cpfslt	hi							; hi < 40 ?
-	bra		output16_4_call_2			; No, hi >= 40, do limit
+	bra		output16_4_call_2			; NO - hi >= 40, do limit
 	; Yes, hi <= 39
 	movlw	.39
 	cpfseq	hi							; hi = 39 ?
-	bra		output16_4_call_3			; No, hi < 39, no limit needed
+	bra		output16_4_call_3			; NO - hi < 39, no limit needed
 	; Yes, hi = 39
 	movlw	.15
 	cpfslt	lo							; lo < 15
-	movwf	lo							; No, lo >= 15, set lo = 15.
+	movwf	lo							; NO - lo >= 15, set lo = 15.
 	; Yes, lo <= 14 or lo set to =15
-	bra		output16_4_call_3			; done.
-output16_4_call_2:						; Set to 9999
+	bra		output16_4_call_3			; done
+output16_4_call_2:						; set to 9999
 	movlw	LOW  .9999
 	movwf	lo
 	movlw	HIGH .9999
@@ -113,13 +113,13 @@
 	cpfslt	hi
 	bra	output16_3_call_2
 	movlw	.3
-	cpfseq	hi							; =3?
-	bra		output16_3_call_3			; No, done.
-	movlw	.231						; Limit to 231(+768=999...)
+	cpfseq	hi							; = 3 ?
+	bra		output16_3_call_3			; NO - done
+	movlw	.231						; limit to 231(+768=999...)
 	cpfslt	lo
 	movwf	lo
-	bra		output16_3_call_3			; done.
-output16_3_call_2:						; Set to .999
+	bra		output16_3_call_3			; done
+output16_3_call_2:						; set to .999
 	movlw	LOW  .999
 	movwf	lo
 	movlw	HIGH .999
@@ -130,10 +130,10 @@
 	incf	ignore_digits,F
 	clrf	WREG
 output16:
-	movwf	cvt_temp4						; Passed from output16dp macro, cleared by others.
+	movwf	cvt_temp4					; passed from output16dp macro, cleared by others.
 	bcf		all_zeros_flag				; do not display any zero from here unless there was at least one figure /zero
 	bsf		leading_zeros
-	tstfsz	cvt_temp4						; Display leading zeros at all?
+	tstfsz	cvt_temp4					; display leading zeros at all?
 	bcf		leading_zeros
 	bsf		DP_done2
 	tstfsz	cvt_temp4
@@ -149,7 +149,7 @@
 	bra		output16_sk5
 	btfsc	show_last4					; display only last four figures?
 	bra		output16_sk5
-	rcall	DEC2ASCII					; No, show all. Here: 5th order digit
+	rcall	DEC2ASCII					; NO - show all, here: 5th order digit
 
 output16_sk5:
 	bcf		show_last4
@@ -157,41 +157,41 @@
 	movwf	cvt_temp2
 	movlw	b'00000011'
 	movwf	cvt_temp3
-	btfsc	DP_done2					; Is there a decimal point at all?
-	bra		output16_2					; no, use normal display mode
+	btfsc	DP_done2					; is there a decimal point at all?
+	bra		output16_2					; NO - use normal display mode
 
 	btfsc	all_zeros_flag				; display any zero from here
 	bra		output16_1					; there was a figure /zero already
 
 	bsf		pre_zero_flag				; display figure if zero?
 	decfsz	cvt_temp4,W
-	bcf		pre_zero_flag				; No
+	bcf		pre_zero_flag				; NO
 
 output16_1:
-	btfsc	DP_done						; Decimal point set already?
-	bsf		pre_zero_flag				; Yes, so display the rest
+	btfsc	DP_done						; decimal point set already?
+	bsf		pre_zero_flag				; YES - so display the rest
 output16_2:
 	btfss	show_last3					; display only last three figures?
-	rcall	DEC2ASCII					; No, show all. Here: 4th order digit
-	bcf		show_last3					; Yes, so display the rest
+	rcall	DEC2ASCII					; NO  - show all. Here: 4th order digit
+	bcf		show_last3					; YES - so display the rest
 	movlw	b'01100100'					; 100s
 	movwf	cvt_temp2
 	clrf	cvt_temp3
-	btfsc	ignore_digit3				; Ignore 3rd-5th digit?
-	bra		output16_5					; Yes, skip the rest
-	btfsc	DP_done2					; Is there a decimal point at all?
-	bra		output16_3					; no, use normal display mode
+	btfsc	ignore_digit3				; ignore 3rd-5th digit?
+	bra		output16_5					; YES - skip the rest
+	btfsc	DP_done2					; is there a decimal point at all?
+	bra		output16_3					; NO  - use normal display mode
 	btfsc	all_zeros_flag				; display any zero from here
 	bra		output16_2_1				; there was a figure /zero already
 	bsf		pre_zero_flag				; display figure if zero?
 	decfsz	cvt_temp4,W
-	bcf		pre_zero_flag				; No
+	bcf		pre_zero_flag				; NO
 
 output16_2_1:
-	btfsc	DP_done						; Decimal point set already?
-	bsf		pre_zero_flag				; Yes, so display the rest
-	btfsc	DP_done2					; Is there a decimal point at all?
-	bsf		pre_zero_flag				; No, so display the rest
+	btfsc	DP_done						; decimal point set already?
+	bsf		pre_zero_flag				; YES - so display the rest
+	btfsc	DP_done2					; is there a decimal point at all?
+	bsf		pre_zero_flag				; NO  - so display the rest
 output16_3:
 	rcall	DEC2ASCII					; 3th order digit...
 	movlw	b'00001010'					; 10s
@@ -211,28 +211,28 @@
 	btfsc	DP_done2
 	bsf		pre_zero_flag
 output16_4:
-	btfsc	ignore_digit4				; Ignore 4-5th digit?
-	bra		output16_5					; Yes, skip the rest
+	btfsc	ignore_digit4				; ignore 4-5th digit?
+	bra		output16_5					; YES - skip the rest
 	rcall	DEC2ASCII					; 2nd order digit
 
 	movlw	b'00000001'					; 1s
 	movwf	cvt_temp2
 	clrf	cvt_temp3
 	bsf		pre_zero_flag
-	btfss	ignore_digit5				; Ignore 5th digit?
+	btfss	ignore_digit5				; ignore 5th digit?
 	rcall	DEC2ASCII					; 1st order digit
-	bcf		ignore_digit5				; yes, and clear flag
+	bcf		ignore_digit5				; YES - clear flag
 output16_5:
-	bcf		ignore_digit4				; Clear flag
-	bcf		ignore_digit3				; Clear flag
+	bcf		ignore_digit4				; clear flag
+	bcf		ignore_digit3				; clear flag
 	clrf	ignore_digits
 	incf	ignore_digits,F
 	bcf		DP_done
-	RETURN								; Done with convert.asm...
+	return								; done with convert.asm...
 
 
 DEC2ASCII:
-	clrf	cvt_temp1						; converts into ASCII code
+	clrf	cvt_temp1					; converts into ASCII code
 DEC2ASCII_2:
 	movf	cvt_temp3,W
 	subwf	hi_temp,W
@@ -257,10 +257,10 @@
 	decfsz	ignore_digits,F
 	return
 	incf	ignore_digits,F				; so ignore_digits stays zero for the test above
-	movlw	'0'							; Offset for ASCII-value
+	movlw	'0'							; offset for ASCII-value
 	addwf	cvt_temp1,W
 	btfsc	pre_zero_flag				; is this a leading zero?
-	bra		DEC2ASCII_4_1				; no
+	bra		DEC2ASCII_4_1				; NO
 	btfsc	leftbind
 	bra		DEC2ASCII_6
 	movlw	' '							; instead of leading zeros a space!
@@ -270,11 +270,34 @@
 DEC2ASCII_5:
 	movwf	POSTINC2
 DEC2ASCII_6:
-	decfsz	cvt_temp4,F						; Set decimal point?
-	RETURN								; No
-	movlw	"."							; Yes
+	decfsz	cvt_temp4,F					; set decimal point?
+	RETURN								; NO
+	movlw	"."							; YES
 	movwf	POSTINC2
 	bsf		DP_done
 	return
 
+
+	global	outputHEX_call
+outputHEX_call:							; coverts 8 Bit integer into two hex digits
+	movwf	cvt_temp1					; copy byte to process from WREG to local temp
+	swapf	cvt_temp1,F					; swap nibbles to process upper nibble first
+	rcall	outputHEX_nibble			; print nibble as ASCII
+	swapf	cvt_temp1,F					; swap back to process lower nibble
+outputHEX_nibble:
+	movff	cvt_temp1,cvt_temp2			; create a working copy
+	movlw	0x0F						; mask for lower nibble
+	andwf	cvt_temp2,F					; isolate lower nibble
+	movlw	0x30						; offset from binary 0 to ASCII code for "0"
+	addwf	cvt_temp2,F					; add offset
+	movlw	0x39						; ASCII code for "9"
+	cpfsgt	cvt_temp2					; character code in cvt_temp2 pointing to something after "9"?
+	bra		outputHEX_1					; NO  - character code represents "0"..."9", can be printed
+	movlw	0x07						; YES - offset from ASCII code for character after "9" to character "A"
+	addwf	cvt_temp2,F					;     - add offset, character code now represents "A"..."F", can be printed now
+outputHEX_1:
+	movff	cvt_temp2,POSTINC2			; copy character code to output buffer
+	return
+
+
 	END
--- a/src/convert.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/convert.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File convert.inc												## V2.98
+;   File convert.inc												## V2.98b
 ;
 ;   Converts register values to string
 ;
@@ -12,37 +12,42 @@
 
 
 	extern	output16_3_call
-output_16_3	macro				; displays only last three figures from a 16Bit value (0-999)
+output_16_3	macro				; displays only last three digits from a 16 bit value (0-999)
 	call	output16_3_call
 	endm
 
 	extern	output16_4_call
-output_16_4	macro				; displays only last four figures from a 16Bit value (0-9999)
+output_16_4	macro				; displays only last four digits from a 16 bit value (0-9999)
 	call	output16_4_call
 	endm
 
 	extern	output16
-output_16dp	macro dp_position	; 16 Bit with decimal point
+output_16dp	macro dp_position	; 16 bit with decimal point
 	movlw	dp_position
 	call	output16
 	endm
 
 	extern	output16_call
-output_16	macro				; 16Bit Normal
+output_16	macro				; 16 bit normal
 	call	output16_call
 	endm
 
 	extern	output8_call
-output_8	macro				; 8 Bit Normal
+output_8	macro				; 8 bit normal
 	call	output8_call
 	endm
 
 	extern	output99_call
-output_99	macro				; displays only last two figures from a 8Bit value (0-99)
+output_99	macro				; displays only last two digits from a 8 bit value (0-99)
 	call	output99_call
 	endm
 
 	extern	output99x_call
-output_99x	macro				; displays only last two figures from a 8Bit value with leading zero (00-99) 
+output_99x	macro				; displays only last two figures from a 8 bit value with leading zero (00-99)
 	call	output99x_call
 	endm
+
+	extern	outputHEX_call
+output_hex	macro				; displays 8 bit integer in hex, input via WREG
+	call	outputHEX_call
+	endm
--- a/src/customview.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/customview.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,8 +1,8 @@
 ;=============================================================================
 ;
-;   File customview.asm								REFACTORED VERSION V2.98
+;   File customview.asm								REFACTORED VERSION V2.99e
 ;
-;   Customview in Surfacemode and Divemode
+;   Custom Views in Surface and Dive Mode
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
@@ -11,7 +11,7 @@
 
 ;=============================================================================
 
-#include "hwos.inc"						; Mandatory header
+#include "hwos.inc"						; mandatory header
 #include "tft_outputs.inc"
 #include "strings.inc"
 #include "tft.inc"
@@ -24,71 +24,65 @@
 #include "start.inc"
 
 
-	extern	gaslist_strcat_gas_mod
+	extern	gaslist_strcat_gas_cd
 	extern	char_I_deco_model
-	extern	TFT_sensor_mV
 	extern	TFT_surface_compass_mask
 	extern	TFT_dive_compass_mask
 
-
-gui	CODE
+custview	CODE
 
 ;=============================================================================
-; Do every-second tasks for the custom view area (Dive mode)
+; Jump table for the every-second tasks for the custom view area (dive mode)
+;
+; Attention: the ordering must be in line with the init jump table and the
+;            index numbers defined in hwos.inc!
 
 	global	customview_second
 customview_second:
-	movff	menupos3,WREG				; copy current view (1-...)
-	dcfsnz	WREG,F
-	goto	TFT_update_ppo2_sensors		; Update Sensor data ; and return
-	dcfsnz	WREG,F
-	goto	TFT_update_avr_stopwatch	; Update average depth and stopwatch; and return
-	dcfsnz	WREG,F
-	goto	TFT_decoplan				; Show decoplan ; and return
-	dcfsnz	WREG,F
-	goto	TFT_battinfo_tissues_clock	; Update Battery, Tissues and clock ; and return
-	dcfsnz	WREG,F
-	goto	TFT_gf_info					; Update GF informations ; and return
-	dcfsnz	WREG,F
-	return								; Compass updated separately (faster) in divemode;
-	dcfsnz	WREG,F
-	nop									; ex goto TFT_dyn_gaslist
-	dcfsnz	WREG,F
-	goto	TFT_CNS						; Show CNS values for end-of-dive, ex goto TFT_hud_voltages
-	dcfsnz	WREG,F
-	bra		customview_1sec_view9		; Make sure to change value in "check_ppo2_display:" when moving around custom views
-	dcfsnz	WREG,F
-	goto	TFT_sensor_check			; Show ppO2 of O2 and Diluent ; and return
-	dcfsnz	WREG,F
-	goto	TFT_ppo2_ead_end_cns		; Show ppO2, END/EAD and CNS; and return
-	dcfsnz	WREG,F
-	goto	TFT_pscr_info				; Show ppO2, drop and lung ratio; and return
-	dcfsnz	WREG,F
-	goto	TFT_gas_needs				; Show gas needs
+	movf	menupos3,W					; copy current view (1-...)
+	dcfsnz	WREG,F						; 1:
+	goto	TFT_avr_stopwatch			; average depth and stopwatch
+	dcfsnz	WREG,F						; 2:
+	return								; compass - will be updated separately (faster) in divemode
+	dcfsnz	WREG,F						; 3:
+	goto	TFT_ppo2_sensors			; ppO2 sensors
+	dcfsnz	WREG,F						; 4:
+	goto	TFT_sensor_check			; sensor check
+	dcfsnz	WREG,F						; 5;
+	goto	TFT_pscr_info				; pSCR data
+	dcfsnz	WREG,F						; 6:
+ IFDEF _rx_functions
+	goto	TFT_pressures_SAC			; tank pressure and SAC rate
+ ELSE
+	return								; not available without RX functions
+ ENDIF
+	dcfsnz	WREG,F						; 7:
+	goto	TFT_gas_needs_ascent		; gas needs for ascent / cave return
+	dcfsnz	WREG,F						; 8:
+	goto	TFT_decoplan				; deco plan
+	dcfsnz	WREG,F						; 9:
+	goto	TFT_ceiling_GF_tissue		; ceiling, current GF and tissues
+	dcfsnz	WREG,F						; 10:
+	goto	TFT_CNS						; CNS values
+	dcfsnz	WREG,F						; 11:
+	goto	TFT_ppo2_ead_end_cns		; ppO2, END/EAD and CNS
+	dcfsnz	WREG,F						; 12:
+	goto	TFT_gf_factors				; GF factors
+	dcfsnz	WREG,F						; 13:
+	goto	TFT_clock_batt_surfpress	; clock, battery and surface pressure
+	return								; menupos3 = 0 -> do nothing
 
-	; Menupos3=0, do nothing
-	return
-
-customview_1sec_view9:					; Ceiling
-	call	TFT_ceiling					; Show Ceiling
-	call	TFT_display_pure_ppo2		; ppO2 value
-	TSTOSS	char_I_deco_model			; 0 = ZH-L16, 1 = ZH-L16-GF
-	return								; No GF info for non-GF modes
-	goto	TFT_gf_info					; Update GF informations ; and return
 
 	global	customview_alternative_second
 customview_alternative_second:
-	movff	menupos3,WREG				; copy current view (1-...)
+	movf	menupos3,W					; copy current view (0-...)
 	dcfsnz	WREG,F
-	bra		customview_alt_second_view1	; View 1
+	nop									; view 1
 	dcfsnz	WREG,F
-	nop									; View 2
+	nop									; view 2
+	;bra	customview_alt_second_view0 ; default view
 
-	; Menupos3=0, do nothing
-	return
-
-customview_alt_second_view1:
-	bsf		FLAG_TFT_max_depth_alt
+customview_alt_second_view0:
 	bsf		FLAG_TFT_big_deco_alt
 	return
 
@@ -96,9 +90,9 @@
 ; Do every-minute tasks for the custom view area
 
 	global	customview_minute
-customview_minute:
+customview_minute:						; called from dive mode, call disabled at present
 	return
-;	movff	menupos3,WREG				; copy
+;	movf	menupos3,W					; copy
 ;	dcfsnz	WREG,F
 ;	bra		customview_1min_view1
 ;	dcfsnz	WREG,F
@@ -121,7 +115,7 @@
 ;	bra		customview_1min_view10
 ;	dcfsnz	WREG,F
 ;	bra		customview_1min_view11
-;	; Menupos3=0, do nothing
+;	; menupos3=0, do nothing
 ;	return
 ;
 ;customview_1min_view1:
@@ -140,12 +134,19 @@
 	global	surf_customview_toggle
 surf_customview_toggle:
 	bcf		switch_right
-	incf	menupos3,F					; Number of customview to show
-	movlw	d'9'						; Max number of customsviews in surface mode
-	cpfsgt	menupos3					; Max reached?
-	bra		surf_customview_mask		; No, show
+	incf	menupos3,F					; number of custom view to show
+
+	movlw	.6							; index of surface custom view compass
+	cpfseq	menupos3					; will compass be shown in custom view?
+	call	I2C_sleep_accelerometer		; NO - stop accelerometer
+	cpfseq	menupos3					; will compass be shown in custom view?
+	call	I2C_sleep_compass			; NO - stop compass
+
+	movlw	d'10'						; max number of custom views in surface mode
+	cpfsgt	menupos3					; max reached?
+	bra		surf_customview_mask		; NO - show
 	movlw	.1
-	movwf	menupos3					; Reset to one (Always one custom view visible)
+	movwf	menupos3					; reset to one (always one custom view visible)
 
 	global	surf_customview_mask
 surf_customview_mask:
@@ -153,555 +154,560 @@
 	; Prepare title
 	WIN_TINY  surf_customview_title_column,surf_customview_title_row
 	WIN_COLOR color_greenish
-	movff	menupos3,WREG				; Menupos3 holds number of customview function
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view1	; OC Gas list
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view2	; CC Dil list
-	dcfsnz	WREG,F
+	movf	menupos3,W					; menupos3 holds number of custom view function
+	dcfsnz	WREG,F						; 1:
+	bra		surf_customview_init_view1	; OC gas list
+	dcfsnz	WREG,F						; 2:
+	bra		surf_customview_init_view2	; CC dil list
+	dcfsnz	WREG,F						; 3:
 	bra		surf_customview_init_view3	; CC SP list
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view4	; Custom Text
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view5	; Tissue Diagram
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view6	; Compass
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view7	; Deco settings
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view8	; Last Dive info
-	dcfsnz	WREG,F
-	bra		surf_customview_init_view9	; Sensor mV readings
+	dcfsnz	WREG,F						; 4:
+	bra		surf_customview_init_view4	; custom text
+	dcfsnz	WREG,F						; 5:
+	bra		surf_customview_init_view5	; tissue diagram
+	dcfsnz	WREG,F						; 6:
+	bra		surf_customview_init_view6	; compass
+	dcfsnz	WREG,F						; 7:
+	bra		surf_customview_init_view7	; deco settings
+	dcfsnz	WREG,F						; 8:
+	bra		surf_customview_init_view8	; last dive info
+	dcfsnz	WREG,F						; 9:
+	bra		surf_customview_init_view9	; sensor mV readings
+	dcfsnz	WREG,F						; 10:
+	bra		surf_customview_init_view10	; tank data
+	bra		surf_customview_init_view4	; default view after restart and loading new firmware
 
-	call	I2C_sleep_accelerometer		; Stop accelerometer
-	call	I2C_sleep_compass			; Stop compass
-
-	movlw	.1
-	movwf	menupos3					; Reset to one (Always one custom view visible)
-
-surf_customview_init_view1:				; View1: OC Gas list
+surf_customview_init_view1:				; view 1: OC Gas list
 	btfsc	FLAG_gauge_mode
 	bra		surf_customview_toggle
 	btfsc	FLAG_apnoe_mode
 	bra		surf_customview_toggle
-	btfsc	FLAG_ccr_mode
-	bra		surf_customview_init_view1_bail ; Bailout version of "OC Gas List"
-	btfsc	FLAG_pscr_mode
-	bra		surf_customview_init_view1_bail ; Bailout version of "OC Gas List"
-	STRCPY_TEXT_PRINT tGaslist			; Title of customview
+	btfss	FLAG_oc_mode
+	bra		surf_customview_init_view1a	; bailout version of "OC Gas List"
+	STRCPY_TEXT_PRINT tGaslist			; title of custom view / OC mode
+	bra		surf_customview_init_view1b
+surf_customview_init_view1a:
+	STRCPY_TEXT_PRINT tDiveBailout		; title of custom view / CCR & pSCR mode
+surf_customview_init_view1b:			; remaining common part
 	call	TFT_standard_color
-	call	TFT_gaslist_surfmode		; Show gas list
-	bra		customview_toggle_exit		; Done.
+	call	TFT_gaslist_surfmode		; show gas list
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view1_bail:
-	STRCPY_TEXT_PRINT tDiveBailout		; Title of customview
-	call	TFT_standard_color
-	call	TFT_gaslist_surfmode		; Show gas list
-	bra		customview_toggle_exit		; Done.
-
-surf_customview_init_view2:				; View2: CC Dil list
+surf_customview_init_view2:				; view 2: CCR / pSCR diluent list
+	btfsc	FLAG_ccr_mode
+	bra		surf_customview_init_view2a
 	btfsc	FLAG_pscr_mode
-	bra		surf_customview_init_view2_2
-	btfss	FLAG_ccr_mode
-	bra		surf_customview_toggle
-	btfsc	FLAG_gauge_mode
+	bra		surf_customview_init_view2a
 	bra		surf_customview_toggle
-	btfsc	FLAG_apnoe_mode
-	bra		surf_customview_toggle
-surf_customview_init_view2_2:	
-	STRCPY_TEXT_PRINT tGaslistCC		; Title of customview
+surf_customview_init_view2a:
+	STRCPY_TEXT_PRINT tGaslistCC		; title of custom view
 	call	TFT_standard_color
-	call	TFT_dillist_surfmode		; Show diluent list
-	bra		customview_toggle_exit		; Done.
+	call	TFT_dillist_surfmode		; show diluent list
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view3:				; View3: CC SP list
-	btfss	FLAG_ccr_mode
+surf_customview_init_view3:				; view 3: CC SP list
+	btfsc	FLAG_ccr_mode
+	bra		surf_customview_init_view3a
 	bra		surf_customview_toggle
-	btfsc	FLAG_gauge_mode
-	bra		surf_customview_toggle
-	btfsc	FLAG_apnoe_mode
-	bra	surf_customview_toggle
-	STRCPY_TEXT_PRINT tFixedSetpoints	; Title of customview
+surf_customview_init_view3a:
+	STRCPY_TEXT_PRINT tFixedSetpoints	; title of custom view
 	call	TFT_standard_color
-	call	TFT_splist_surfmode			; Show Setpoint list
-	bra		customview_toggle_exit		; Done.
+	call	TFT_splist_surfmode			; show setpoint list
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view9:				; View 9: Sensor mV on the surface
+surf_customview_init_view9:				; view 9: sensor mV at the surface
 	btfsc	FLAG_ccr_mode 
-	bra		surf_customview_init_view9a	; we are in CCR mode 
+	bra		surf_customview_init_view9a	; we are in CCR mode
 	btfsc	FLAG_pscr_mode
 	bra		surf_customview_init_view9a	; we are in PSCR mode 
-	bra		surf_customview_toggle		; we are not in any rebreather mode, so skip 
-surf_customview_init_view9a: 
-	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor, =2: Auto SP 
-	sublw	.1							; opt_ccr_mode = 1 (Sensor)? 
-	bnz		surf_customview_toggle		; sorry, no sensors, skip again 
-	STRCPY_TEXT_PRINT tSensorMilliVolt	; Title of customview 
-	call	TFT_standard_color 
+	bra		surf_customview_toggle		; we are not in any rebreather mode, so skip
+surf_customview_init_view9a:
+	movff	opt_ccr_mode,WREG			; =0: fixed SP, =1: Sensor, =2: auto SP
+	sublw	.1							; opt_ccr_mode = 1 (sensor)?
+	bnz		surf_customview_toggle		; sorry, no sensors, skip again
+	STRCPY_TEXT_PRINT tSensorMilliVolt	; title of custom view
 	call	TFT_sensor_mV				; write sensor mV readings to screen 
-	bra		customview_toggle_exit		; Done.
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view4:				; View4: Custom text
-	call	TFT_standard_color
-	call	TFT_custom_text				; Show the custom text
-	bra		customview_toggle_exit		; Done.
+surf_customview_init_view4:				; view 4: custom text
+	call	TFT_custom_text				; show the custom text
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view5:				; View5: Tissue Diagram
+surf_customview_init_view5:				; view 5: tissue diagram
 	btfsc	FLAG_gauge_mode
 	bra		surf_customview_toggle
 	btfsc	FLAG_apnoe_mode
 	bra		surf_customview_toggle
 	call	TFT_standard_color
-	call	TFT_surface_tissues			; Show Tissue diagram
-	bra		customview_toggle_exit		; Done.
+	call	TFT_surface_tissues			; show tissue diagram
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view6:				; View6: Compass
-	call	I2C_init_accelerometer		; Start accelerometer
-	call	I2C_init_compass			; Start compass
-	call	TFT_surface_compass_mask	; Show compass
-	bra		customview_toggle_exit		; Done.
+surf_customview_init_view6:				; view 6: compass
+	call	I2C_init_accelerometer		; start accelerometer
+	call	I2C_init_compass			; start compass
+	call	TFT_surface_compass_mask	; show compass mask
+	bra		customview_toggle_exit		; done
 
 surf_customview_init_view7:
-	btfsc	FLAG_gauge_mode				; View7: Deco settings
+	btfsc	FLAG_gauge_mode				; view 7: deco settings
 	bra		surf_customview_toggle
 	btfsc	FLAG_apnoe_mode
 	bra		surf_customview_toggle
+	call	TFT_surface_decosettings	; show all deco settings
+	bra		customview_toggle_exit		; done
 
-	call	TFT_surface_decosettings	; Show all deco settings
-	bra		customview_toggle_exit		; Done.
+surf_customview_init_view8:				; view 8: last dive info
+	call	TFT_surface_lastdive		; show last dive interval
+	bra		customview_toggle_exit		; done
 
-surf_customview_init_view8:				; View8: Last dive info
-	call	TFT_surface_lastdive		; Show last dive interval
-	bra		customview_toggle_exit		; Done.
+surf_customview_init_view10:			; transmitter data / debug
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; TR functions enabled?
+	bra		surf_customview_toggle		; NO - show next view in list
+	STRCAT_PRINT "ID     bar  Volt"		; title of custom view (none language-dependent)
+	call	TFT_surface_tankdata
+	bra		customview_toggle_exit		; done
+ ELSE
+	bra		surf_customview_toggle
+ ENDIF
+
+
+	global	switch_layout_to_normal
+switch_layout_to_normal:				; switch back from alternative to normal layout
+										; needs custom view to be selected / restored separately!
+	bcf		alternative_divelayout		; clear flag
+	bsf		FLAG_TFT_divemode_mask		; set flag for normal layout mask
+	bsf		FLAG_TFT_max_depth			; set flag for normal layout data
+	btfss	decostop_active				; deco?
+	bsf		FLAG_TFT_display_ndl_mask	; NO  - set flag for normal layout NDL data
+	btfsc	decostop_active				; deco?
+	bsf		FLAG_TFT_display_deko_mask	; YES - set flag for normal layout deco data
+	clrf	menupos3					; set to no active custom view
+	call	TFT_ClearScreen				; clear the whole screen
+	return
 
 
 	global	menuview_toggle
-menuview_toggle:						; Show Menu or the simulator tasks
-	btfss	alternative_divelayout		; In alternative layout mode?
-	bra		menuview_toggle2			; No
-	; Switch back to normal mode for any menu tasks
-	bcf		alternative_divelayout		; clear flag
-	bsf		FLAG_TFT_divemode_mask		; Set flag for mask
-	bsf		FLAG_TFT_max_depth			; set flag
-	btfss	decostop_active				; deco?
-	bsf		FLAG_TFT_display_ndl_mask	; NDL
-	btfsc	decostop_active				; deco?
-	bsf		FLAG_TFT_display_deko_mask	; Deco
-	call	TFT_ClearScreen				; Clear screen
-	rcall	customview_mask				; Re-Draw customview
+menuview_toggle:						; show menu or the simulator tasks
+	bcf		switch_left
+	btfss	alternative_divelayout		; in alternative layout mode?
+	bra		menuview_toggle2			; NO  - continue with menu or simulator tasks
+	rcall	switch_layout_to_normal		; YES - switch back to normal layout
+	movff	customview_divemode,menupos3;     - restore the custom view shown in normal layout
+	rcall	customview_mask				;     - re-draw the custom view
+	bra		menuview_toggle_reset		;     - suppress the menu when returning from alternative layout
 
 menuview_toggle2:
 	movlw	divemode_menuview_timeout
 	movwf	timeout_counter2
-	bsf		menuview
-	bcf		switch_left
-	incf	menupos2,F					; Number of options to show
-	movlw	d'10'						; Max number of options in divemode
-	cpfsgt	menupos2					; Max reached?
-	bra		menuview_mask				; No, show
+	bsf		menuview					; flag that the options menu is shown
+	incf	menupos2,F					; number of option to show
+	movlw	d'10'						; max number of options in divemode
+	cpfsgt	menupos2					; max reached?
+	bra		menuview_mask				; NO - show option
 	global	menuview_toggle_reset
-menuview_toggle_reset:					; Timeout occurred
-	clrf	menupos2
-	bcf		menuview
+menuview_toggle_reset:					; timeout occurred, beyond max number of options, or item executed
+	clrf	menupos2					; reset option selector
+	bcf		menuview					; revoke options menu if shown
 menuview_mask:
-	WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.49 ; top, bottom, left, right
-	btfss	FLAG_gauge_mode
-	bra		menuview_mask2
-	; Clear some more in gauge mode -- "Reset Avg." text is longer than normal simtext
-	WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column+.50, dm_simtext_column+.70 ; top, bottom, left, right
+	WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.46		; top, bottom, left, right
+	btfss	FLAG_gauge_mode				; in gauge mode?
+	bra		menuview_mask2				; NO
+										; YES - clear some more in gauge mode -- "Reset Avg." text is longer than all the other texts
+	WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column+.47, dm_simtext_column+.70	; top, bottom, left, right
 menuview_mask2:
 	call	TFT_draw_gassep_line
 	movlw	color_yellow
 	call	TFT_set_color
-	bsf		win_invert					; Set invert flag
+	bsf		win_invert					; set invert flag
 	WIN_SMALL dm_simtext_column,dm_simtext_row
-	movff	menupos2,WREG				; Menupos2 holds number of menu option to show
+	movf	menupos2,W					; menupos2 holds number of menu option to show
 	dcfsnz	WREG,F
-	bra		menuview_view_gaschange		; If a better gas is indicated
+	bra		menuview_view_gaschange		; check if a better gas/diluent is advised and prompt for switching if yes
 	dcfsnz	WREG,F
-	bra		menuview_view1				; "Menu?" (Not in Gauge and Anpnoe)
+	bra		menuview_view1				; "Menu?"				(skipped in gauge and apnoe modes)
 	dcfsnz	WREG,F
-	bra		menuview_view2				; "Quit Simulation?" (Sim only)
+	bra		menuview_view2				; "Quit?"				(in simulation mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view3				; "Descent 1m" (Sim only)
+	bra		menuview_view3				; "Sim-1m"				(in simulation mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view4				; "Ascend 1m" (Sim only)
+	bra		menuview_view4				; "Sim+1m"				(in simulation mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view5				; "Quit Apnea mode?" (Apnea only)
+	bra		menuview_view5				; "Quit?"				(in apnoe mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view6				; "Reset Avr." (Gauge only)
+	bra		menuview_view6				; "Reset Avr."			(in gauge mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view7				; "Sim:+5mins" (Sim only)
+	bra		menuview_view7				; "Sim+5'"				(in simulation mode only)
 	dcfsnz	WREG,F
-	bra		menuview_view8				; "Heading" (When compass is shown)
+	bra		menuview_view8				; "Heading"				(only when compass is shown)
 	dcfsnz	WREG,F
-	bra		menuview_view9				; "Layout" (Alternative Layout, aka Blind mode)
+	bra		menuview_view9				; "Layout"				(offer alternative layout, aka blind mode)
 
 menuview_exit:
 	call	TFT_standard_color
-	bcf		win_invert					; Reset invert flag
-	return								; Menupos2 = 0, Show nothing
+	bcf		win_invert					; reset invert flag
+	btfss	alternative_divelayout		; in alternative layout?
+	bsf		FLAG_TFT_active_gas_divemode; NO - redraw gas and setpoint (eventually needed to restore the "Bailout" text)
+	return								; menupos2 = 0, show nothing
 
 
 menuview_view_gaschange:
-	btfss	better_gas_available		; =1: A better gas is available
-	bra		menuview_toggle				; No, call next option
-	btfsc	divemode_gaschange			; Skip if the last gas change is not done yet.
-	bra		menuview_toggle
-	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	movff	better_gas_number,PRODL		; number (1-5) of the "better gas" in divemode, =0: no better gas available
-	decf	PRODL,F
-	call	gaslist_strcat_gas_mod		; Append gas description of gas #PRODL (0-4) to current string
+	btfsc	divemode_gaschange			; last gas change done yet?
+	bra		menuview_toggle				; NO - call next option
+	btfsc	FLAG_oc_mode				; in OC mode?
+	bra		menuview_view_gaschange_OC	; YES
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		menuview_view_gaschange_OC	; YES
+menuview_view_gaschange_DIL:
+	btfss	better_dil_available		; is the better diluent still available?
+	bra		menuview_toggle				; NO - call next option
+	movff	best_dil_number,PRODL		; number (1-5) of the "best diluent"
+	bsf		FLAG_diluent_setup			; flag to use diluents
+	bra		menuview_view_gaschange_com
+menuview_view_gaschange_OC:
+	btfss	better_gas_available		; is the better gas still available?
+	bra		menuview_toggle				; NO - call next option
+	movff	best_gas_number,PRODL		; number (1-5) of the "best gas"
+	bcf		FLAG_diluent_setup			; flag to use oc gases
+menuview_view_gaschange_com:
+	decf	PRODL,F						; (1-5) -> (0-4)
+	bsf		short_gas_decriptions		; =1: use short version of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bsf		better_gas_hint				; color-code as best gas/diluent
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	movlw	.5
-	movwf	FSR2L						; Point to char 6 (5 chars gas description only)
+	movwf	FSR2L						; point to 6th character (5 chars are used for the gas/dil description)
 	STRCAT_PRINT "?"
-	bra		menuview_exit				; Done.
+	bra		menuview_exit				; done
+
 menuview_view1:
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		menuview_toggle				; Call next option
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		menuview_toggle				; Call next option
-	STRCPY_TEXT_PRINT tDivePreMenu		; "Menu?"
-	bra		menuview_exit				; Done.
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		menuview_toggle				; YES - goto next option
+	btfsc	FLAG_gauge_mode				; in Gauge mode?
+	bra		menuview_toggle				; YES - goto next option
+	STRCPY_TEXT_PRINT tDivePreMenu		; print "Menu?"
+	bra		menuview_exit				; done
+
 menuview_view2:
-	btfss	simulatormode_active		; View only for simulator mode
-	bra		menuview_toggle				; Call next option
-	STRCPY_TEXT_PRINT tQuitSim			; "Quit Simulation?"
-	bra		menuview_exit				; Done.
+	btfss	simulatormode_active		; in simulator mode?
+	bra		menuview_toggle				; NO - goto next option
+	STRCPY_TEXT_PRINT tQuitSim			; print "Quit Simulation?"
+	bra		menuview_exit				; done
+
 menuview_view3:
-	btfss	simulatormode_active		; View only for simulator mode
-	bra		menuview_toggle				; Call next option
-	STRCPY_PRINT "Sim-1m"				; "-" for going down
-	bra	menuview_exit					; Done.
+	btfss	simulatormode_active		; in simulator mode?
+	bra		menuview_toggle				; NO - goto next option
+;	STRCPY_PRINT "Sim-1m"				; print "-" for going down
+	STRCPY_PRINT "Sim\xb8"				; print down arrow for going down
+	bra		menuview_exit				; done
+
 menuview_view4:
-	btfss	simulatormode_active		; View only for simulator mode
-	bra		menuview_toggle				; Call next option
-	STRCPY_PRINT "Sim+1m"				; "+" for going up
-	bra		menuview_exit				; Done.
+	btfss	simulatormode_active		; in simulator mode?
+	bra		menuview_toggle				; NO - goto next option
+;	STRCPY_PRINT "Sim+1m"				; "+" for going up
+	STRCPY_PRINT "Sim\xb9"				; print up arrow for going up
+	bra		menuview_exit				; done
+
 menuview_view5:
-	btfss	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		menuview_toggle				; No, call next option
-	btfss	FLAG_active_descent			; Are we descending?
-	bra		menuview_toggle				; Yes
-; We are at the surface:
-	STRCPY_TEXT_PRINT tQuitSim			; "Quit Apnea mode?"
-	bra		menuview_exit				; Done.
+	btfss	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		menuview_toggle				; NO - goto next option
+	btfss	FLAG_active_descent			; descending?
+	bra		menuview_toggle				; YES - goto next option
+	; We are at the surface:
+	STRCPY_TEXT_PRINT tQuitSim			; print "Quit Apnea mode?"
+	bra		menuview_exit				; done
+
 menuview_view6:
-	btfss	FLAG_gauge_mode				; In Gauge mode?
-	bra		menuview_toggle				; No, call next option
-	STRCPY_TEXT_PRINT tDivemenu_ResetAvg; "Reset Avg."
-	bra		menuview_exit				; Done.
+	btfss	FLAG_gauge_mode				; in Gauge mode?
+	bra		menuview_toggle				; NO - goto next option
+	STRCPY_TEXT_PRINT tDivemenu_ResetAvg; print "Reset Avg."
+	bra		menuview_exit				; done
+
 menuview_view7:
-	btfss	simulatormode_active		; View only for simulator mode
-	bra		menuview_toggle				; Call next option
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		menuview_toggle				; Yes, call next option
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		menuview_toggle				; Yes, call next option
-	STRCPY_PRINT "Sim+5'"
-	bra		menuview_exit				; Done.
+	btfss	simulatormode_active		; in simulator mode?
+	bra		menuview_toggle				; NO - goto next option
+	btfsc	FLAG_gauge_mode				; in Gauge mode?
+	bra		menuview_toggle				; YES - goto next option
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		menuview_toggle				; YES - goto next option
+	STRCPY_PRINT "Sim+5'"				; print "Sim+5'"
+	bra		menuview_exit				; done
+
 menuview_view8:
-	movlw	.6
+	movlw	index_compass_dm			; index of compass view
 	cpfseq	menupos3					; in compass view?
-	bra		menuview_toggle				; No, call next option
-	STRCPY_TEXT_PRINT	tSetHeading		; "Heading"
-	bra		menuview_exit				; Done.
+	bra		menuview_toggle				; NO - goto next option
+	STRCPY_TEXT_PRINT tSetHeading		; print "Heading"
+	bra		menuview_exit				; done
+
 menuview_view9:
-    	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		menuview_toggle				; Yes, call next option
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		menuview_toggle				; Yes, call next option
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		menuview_toggle				; YES - goto next option
 	STRCPY_PRINT "Layout"
-	bra		menuview_exit				; Done.
+	bra		menuview_exit				; done
 
 ;=============================================================================
 
+	global	customview_mask_alternative
 customview_toggle_alternative:
-	movlw	d'1'						; Max number of customviews in divemode, alternative layout
-	cpfsgt	menupos3					; Max reached?
-	bra		customview_mask_alternative	; No, show
-	movlw	.1
-	movwf	menupos3					; Reset to one, always one customview visible in alternative layout
-customview_mask_alternative:	
+	call	I2C_sleep_accelerometer		; no compass in alternative layout - stop accelerometer
+	call	I2C_sleep_compass			; no compass in alternative layout - stop compass
+	movlw	d'0'						; max number of custom views in divemode, alternative layout
+	cpfsgt	menupos3					; max reached?
+	bra		customview_mask_alternative	; NO - show
+	clrf	menupos3					; reset to zero (zero = default custom view in alternative layout)
+customview_mask_alternative:
 	; Clear custom view area in divemode
-	WIN_BOX_BLACK	dm_customview_row, .239, .0, .159	; top, bottom, left, right
-	call	TFT_standard_color
-	movff	menupos3,WREG				; Menupos3 holds number of customview function
+	WIN_BOX_BLACK dm_customview_row, .239, .0, .159 ; top, bottom, left, right
+	movf	menupos3,W					; menupos3 holds number of custom view function
 	dcfsnz	WREG,F
-	bra		customview_alt_init_view1	; View 1: Big deco/ndl and max. depth
+	bra		customview_alt_init_view1	; view 1: -- for test only --
 	dcfsnz	WREG,F
-	bra		customview_alt_init_view2	; View 2: 
-
-	;bra	customview_alternative_toggle_exit	; No view (menupos3=0)
+	nop									; view 2: ...
+	;bra	customview_alt_init_view0	; default view: big deco/ndl and max. depth
 
-customview_alt_toggle_exit:
-	call	TFT_standard_color
-	bcf		toggle_customview			; Clear flag
-	return
-
-customview_alt_init_view1:				; View 1: Big deco/ndl and max. depth
+customview_alt_init_view0:				; default view: big deco/ndl and max. depth
 	call	TFT_max_depth_alternative
 	call	TFT_big_deco_alt
 	bra		customview_alt_toggle_exit
 
-customview_alt_init_view2:
-	; /* Just for test...
-	call	TFT_mask_avr_stopwatch		; Show mask for average depth and stopwatch
-	call	TFT_update_avr_stopwatch	; Update average depth and stopwatch
-	; ...Just for test */
+customview_alt_init_view1:				; view 1 - just for test use
+	call	TFT_avr_stopwatch_mask		; mask for average depth and stopwatch
+	call	TFT_avr_stopwatch			; data for average depth and stopwatch
 	bra		customview_alt_toggle_exit
 
+customview_alt_toggle_exit:
+	bcf		toggle_customview			; clear flag
+	return
 
-; Show next customview (and delete this flag)
+
+; Show next dive mode custom view (and delete this flag)
 	global	customview_toggle
 customview_toggle:
-	bcf	switch_right
-	incf	menupos3,F					; Number of customview to show
+	bcf		switch_right
+	incf	menupos3,F					; number of custom view to show
+
+	btfsc	alternative_divelayout			; in alternative layout mode?
+	bra		customview_toggle_alternative	; YES - use the big ones instead
 
-	btfsc	alternative_divelayout			; In alternative layout mode?
-	bra		customview_toggle_alternative	; Yes, use the big ones instead
+	movlw	index_compass_dm			; index of custom view compass
+	cpfseq	menupos3					; will compass be shown in custom view?
+	call	I2C_sleep_accelerometer		; NO - stop accelerometer
+	cpfseq	menupos3					; will compass be shown in custom view?
+	call	I2C_sleep_compass			; NO - stop compass
 
-	movlw	d'13'						; Max number of customviews in divemode
-	cpfsgt	menupos3					; Max reached?
-	bra		customview_mask				; No, show
-	clrf	menupos3					; Reset to zero (Zero=no custom view)
+	movlw	index_cv_dm_max				; highest index in use in dive mode custom view
+	cpfsgt	menupos3					; max reached?
+	bra		customview_mask				; NO - show
+	clrf	menupos3					; reset to zero (zero = no custom view)
 
+;----------------------------------------------------------------------------------
+; Jump table for initialization of the every-second tasks in custom view area (dive mode)
+;
+; Attention: the ordering must be in line with the every-second update jump table
+;            and the index numbers defined in hwos.inc!
+;
 	global	customview_mask
-customview_mask:	
+customview_mask:
+	bcf		redraw_custview_mask		; clear redraw request flag
 	; Clear custom view area in divemode
-	WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt	; top, bottom, left, right
-	WIN_SMALL     dm_customview_column,dm_customview_row
-	call	TFT_standard_color
-	movff	menupos3,WREG				; Menupos3 holds number of customview function
-	dcfsnz	WREG,F
-	bra		customview_init_view1		; Update Sensor data
-	dcfsnz	WREG,F
-	bra		customview_init_view2		; average depth and stopwatch
-	dcfsnz	WREG,F
-	bra		customview_init_view3		; Decoplan
-	dcfsnz	WREG,F
-	bra		customview_init_view4		; Battery info, Tissues and clock
-	dcfsnz	WREG,F
-	bra		customview_init_view5		; GF informations
-	dcfsnz	WREG,F
-	bra		customview_init_view6		; Compass
-	dcfsnz	WREG,F
-	bra		customview_init_view7		; Dynamic gaslist
-	dcfsnz	WREG,F
-	bra		customview_init_view8		; CNS
-	dcfsnz	WREG,F
-	bra		customview_init_view9		; ppO2, Ceiling and current GF
-	dcfsnz	WREG,F
-	bra		customview_init_view10		; Sensor check
-	dcfsnz	WREG,F
-	bra		customview_init_view11		; ppO2, END/EAD and CNS
-	dcfsnz	WREG,F
-	bra		customview_init_view12		; PSCR Info
-	dcfsnz	WREG,F
-	bra		customview_init_view13		; Gas needs
+	WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt ; top, bottom, left, right
+	movf	menupos3,W					; menupos3 holds number of custom view function
+	dcfsnz	WREG,F						; 1:
+	bra		init_avr_stopwatch			; average depth and stopwatch
+	dcfsnz	WREG,F						; 2:
+	bra		init_TFT_dive_compass		; compass
+	dcfsnz	WREG,F						; 3:
+	bra		init_ppo2_sensors			; ppO2 sensors
+	dcfsnz	WREG,F						; 4:
+	bra		init_sensor_check			; sensor check
+	dcfsnz	WREG,F						; 5:
+	bra		init_pscr_info				; pSCR data
+	dcfsnz	WREG,F						; 6:
+	bra		init_pressures_SAC			; tank pressure and SAC rate
+	dcfsnz	WREG,F						; 7:
+	bra		init_gas_needs_ascent		; gas needs for ascent / cave return
+	dcfsnz	WREG,F						; 8:
+	bra		init_decoplan				; deco plan
+	dcfsnz	WREG,F						; 9:
+	bra		init_ceiling_GF_tissue		; ceiling, current GF and tissues
+	dcfsnz	WREG,F						; 10:
+	bra		init_CNS					; CNS values
+	dcfsnz	WREG,F						; 11:
+	bra		init_ppo2_ead_end_cns		; ppO2, END/EAD and CNS
+	dcfsnz	WREG,F						; 12:
+	bra		init_gf_factors				; GF factors
+	dcfsnz	WREG,F						; 13:
+	bra		init_clock_batt_surfpress	; clock, battery and surface pressure
+	bra		customview_toggle_exit		; no view (blank screen in custom view area)
 
-customview_init_nocustomview:
-	call	I2C_sleep_accelerometer		; Stop accelerometer
-	call	I2C_sleep_compass			; Stop compass
-	bra		customview_toggle_exit
 
-customview_init_view1:
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; yes, Call next view...
-	btfsc	FLAG_pscr_mode				; In PSCR mode?
-	bra		customview_init_view1a		; Yes
-	btfss	FLAG_ccr_mode				; In CC mode?
-	bra		customview_toggle			; no, Call next view...
-
+init_ppo2_sensors:
+	btfsc	FLAG_ccr_mode				; in CC mode?
+	bra		customview_init_view1a		; YES
+	btfsc	FLAG_pscr_mode				; in PSCR mode?
+	bra		customview_init_view1a		; YES
+	bra		customview_toggle			; NO to both, call next view
 customview_init_view1a:
 	btfsc	analog_o2_input				; do we have an analog input?
 	bra		customview_init_view1b		; YES - show this view
-	btfsc	s8_digital				; NO  - do we have a digital input?
+	btfsc	s8_digital					; NO  - do we have a digital input?
 	bra		customview_init_view1b		; YES - show this view
 	btfss	optical_input				; NO  - do we have an optical input?
-	bra		customview_toggle		; NO  - call next view...
-
+	bra		customview_toggle			; NO  - call next view
 	;       YES - show this view
 customview_init_view1b:
-	call	TFT_hud_mask				; Setup HUD mask
-	call	TFT_update_ppo2_sensors		; Update Sensor data
+	call	TFT_ppo2_sensors_mask		; mask for ppO2 sensors
+	call	TFT_ppo2_sensors			; data for ppO2 sensors
 	bra		customview_toggle_exit
 
-customview_init_view2:
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; Yes, Call next view...
-	call	TFT_mask_avr_stopwatch		; Show mask for average depth and stopwatch
-	call	TFT_update_avr_stopwatch	; Update average depth and stopwatch
+init_avr_stopwatch:
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	call	TFT_avr_stopwatch_mask		; mask for average depth and stopwatch
+	call	TFT_avr_stopwatch			; data for average depth and stopwatch
 	bra		customview_toggle_exit
 
-customview_init_view3:
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; Yes, Call next view...
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-	call	TFT_decoplan				; Show decoplan
+init_decoplan:
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		customview_toggle			; YES - call next view
+	call	TFT_decoplan_mask			; mask for deco plan
+	call	TFT_decoplan				; data for deco plan
 	bra		customview_toggle_exit
 
-customview_init_view4:
-	call	TFT_battinfo_tissues_clock_mask	; Setup Mask
-	call	TFT_battinfo_tissues_clock		; Show Battery info, Tissues and clock
+init_clock_batt_surfpress:
+	call	TFT_clock_batt_surfpress_mask	; mask for clock, battery and surface pressure
+	call	TFT_clock_batt_surfpress		; data for clock, battery and surface pressure
 	bra		customview_toggle_exit
 
-customview_init_view5:
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; Yes, Call next view...
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-
-	TSTOSS	char_I_deco_model			; 0 = ZH-L16, 1 = ZH-L16-GF
-	bra		customview_toggle			; No GF info for non-GF modes
-
-	call	TFT_gf_mask					; Setup Mask
-	call	TFT_gf_info					; Show GF informations
+init_gf_factors:
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		customview_toggle			; YES - call next view
+	TSTOSS	char_I_deco_model			; in GF mode (0 = ZH-L16, 1 = ZH-L16-GF)?
+	bra		customview_toggle			; NO - no GF info for non-GF modes
+	call	TFT_gf_factors_mask			; mask for GF factors
+	call	TFT_gf_factors				; data for GF factors
 	bra		customview_toggle_exit
 
-customview_init_view6:					; Compass (View 6)
-	call	I2C_init_accelerometer		; Start accelerometer
-	call	I2C_init_compass			; Start compass
-	call	TFT_dive_compass_mask		; Show compass
+init_TFT_dive_compass:					; compass
+	call	I2C_init_accelerometer		; start accelerometer
+	call	I2C_init_compass			; start compass
+	call	TFT_dive_compass_mask		; show compass mask
 	bra		customview_toggle_exit
 
-customview_init_view7:					; view disabled
-	bra		customview_toggle
-
-customview_init_view8:					; CNS at end of dive
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; yes, Call next view...
-	call	TFT_CNS_mask
-	call	TFT_CNS
-	goto	customview_toggle_exit
+init_pressures_SAC:						; tank pressure and SAC rate
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; TR functions enabled?
+	bra		customview_toggle			; NO - call next view
+	call	TFT_pressures_SAC_mask		; mask for pressures and SAC
+	call	TFT_pressures_SAC			; data for pressures and SAC
+	bra		customview_toggle_exit
+ ELSE
+	bra		customview_toggle			; skip, not available without RX functions
+ ENDIF
 
-customview_init_view9:					; ppO2, Ceiling and current GF
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; yes, Call next view...
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-	call	TFT_ceiling_mask			; Setup mask
-	call	TFT_ceiling					; Show Ceiling
+init_CNS:								; CNS at end of dive
+	btfsc	FLAG_gauge_mode				; in Gauge mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	call	TFT_CNS_mask				; mask for CNS values
+	call	TFT_CNS						; data for CNS values
+	bra		customview_toggle_exit
 
-	; ppO2 value
-	call	TFT_mask_ppo2
-	call	TFT_display_pure_ppo2
-
-	; current GF value
-	TSTOSS	char_I_deco_model			; 0 = ZH-L16, 1 = ZH-L16-GF
-	bra		customview_toggle_exit		; No GF info for non-GF modes
-	; current GF value
-	call	TFT_gf_mask_cGF				; Setup Mask - current GF only
-	call	TFT_gf_info					; Show GF informations
+init_ceiling_GF_tissue:					; ceiling, tissues and current GF
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		customview_toggle			; YES - call next view
+	call	TFT_ceiling_GF_tissue_mask	; mask for ceiling, current GF and tissues
+	call	TFT_ceiling_GF_tissue		; data for ceiling, current GF and tissues
 	bra		customview_toggle_exit
 
-customview_init_view10:					; Sensor check
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; yes, Call next view...
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-	btfss	FLAG_ccr_mode				; In CC mode?
-	bra		customview_toggle			; no, Call next view...
-
-	call	TFT_sensor_check_mask		; Show ppO2 of O2 and Diluent mask
-	call	TFT_sensor_check			; Show ppO2 of O2 and Diluent
+init_sensor_check:						; sensor check
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	bra		customview_init_view10a		; YES
+;	btfsc	FLAG_pscr_mode				; in pSCR mode?
+;	bra		customview_init_view10a		; YES
+	bra		customview_toggle			; NO to both, call next view
+customview_init_view10a:
+	call	TFT_sensor_check_mask		; mask for sensor check
+	call	TFT_sensor_check			; data for sensor check
 	bra		customview_toggle_exit
 
-customview_init_view11:					; ppO2, END/EAD and CNS
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		customview_toggle			; yes, Call next view...
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	bra		customview_toggle			; Yes, Call next view...
-
-	call	TFT_ppo2_ead_end_cns_mask	; Show ppO2, END/EAD and CNS mask
-	call	TFT_ppo2_ead_end_cns		; Show ppO2, END/EAD and CNS
-	goto	customview_toggle_exit
-
-customview_init_view12:					; PSCR Info	
-	btfss	FLAG_pscr_mode				; In PSCR mode?
-	bra		customview_toggle			; No, Call next view...
-	
-	call	TFT_pscr_info_mask			; Show ppO2, drop and lung ratio
-	call	TFT_pscr_info				; Show ppO2, drop and lung ratio
+init_ppo2_ead_end_cns:					; ppO2, END/EAD and CNS
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		customview_toggle			; YES - call next view
+	call	TFT_ppo2_ead_end_cns_mask	; mask for ppO2, END/EAD and CNS
+	call	TFT_ppo2_ead_end_cns		; data for ppO2, END/EAD and CNS
 	bra		customview_toggle_exit
 
-customview_init_view13:					; Gas Needs
-	TSTOSS	opt_calc_asc_gasvolume		; check if gas volume calculations is switched on
-	bra		customview_toggle			; NO  - Call next view...
-	call	TFT_gas_needs_mask			; YES - Show the mask for gas needs
-	call	TFT_gas_needs				;       Show the gas needs
+init_pscr_info:							; pSCR information
+	btfss	FLAG_pscr_mode				; in pSCR mode?
+	bra		customview_toggle			; NO - call next view
+	call	TFT_pscr_info_mask			; mask for pSCR info
+	call	TFT_pscr_info				; data for pSCR info
+	bra		customview_toggle_exit
+
+init_gas_needs_ascent:					; gas needs for ascent
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		customview_toggle			; YES - call next view
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		customview_toggle			; YES - call next view
+	TSTOSS	opt_calc_asc_gasvolume		; check if gas volume calculation is switched on
+	bra		customview_toggle			; NO  - call next view
+	call	TFT_gas_needs_ascent_mask	; mask for gas needs ascent
+	call	TFT_gas_needs_ascent		; data for gas needs ascent
 	bra		customview_toggle_exit
 
 customview_toggle_exit:
-	btfsc	divemode					; In Dive Mode?
-	bsf		FLAG_TFT_temp_divemode		; Set flag to redraw temp
-	call	TFT_standard_color
-	bcf		toggle_customview			; Clear flag
-	return
-
-	global	customview_show_change_depth
-customview_show_change_depth:			; Put " lom" or " loft" into Postinc2
-	PUTC	" "
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		customview_show_mix_metric
-	movf	lo,W
-	mullw	.100						; convert meters to mbar
-	movff	PRODL,lo
-	movff	PRODH,hi
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	bsf		leftbind
-	output_16							; Change depth in lo:hi
-	bcf		leftbind
-	STRCAT_TEXT tFeets
-	return
-customview_show_mix_metric:
-	output_99							; Change depth in lo
-	STRCAT_TEXT tMeters
+	bcf		toggle_customview			; clear flag
+	btfsc	divemode					; in dive mode?
+	bsf		FLAG_TFT_temp_divemode		; YES - set flag to redraw temp
 	return
 
 
 	global	customview_show_mix
-customview_show_mix:					; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
+customview_show_mix:					; put "Nxlo", "Txlo/hi", "Air" or "O2" into postinc2
 	tstfsz	hi							; He=0?
-	bra		customview_show_mix5		; No, Show a TX
+	bra		customview_show_mix5		; NO - show a TX
 	movlw	.21
 	cpfseq	lo							; Air?
-	bra		customview_show_mix2		; No
-	STRCAT_TEXT tSelectAir				; Yes, show "Air"
+	bra		customview_show_mix2		; NO
+	STRCAT_TEXT tSelectAir				; YES - show "Air"
 	bra		customview_show_mix4b
 customview_show_mix2:
 	movlw	.100
 	cpfseq	lo							; O2?
-	bra		customview_show_mix3		; No
-	STRCAT_TEXT tSelectO2				; Yes, show "O2"
+	bra		customview_show_mix3		; NO
+	STRCAT_TEXT tSelectO2				; YES - show "O2"
 	bra		customview_show_mix4b
-
 customview_show_mix3:
 	movlw	.21
 	cpfslt	lo							; < Nx21?
-	bra		customview_show_mix4		; No
-	STRCAT_TEXT tGasErr					; Yes, show "Err"
+	bra		customview_show_mix4		; NO
+	STRCAT_TEXT tGasErr					; YES - show "Err"
 	output_99							; O2 ratio is still in "lo"
-	bra	 customview_show_mix4c
-
+	bra		customview_show_mix4c
 customview_show_mix4:
-	STRCAT_TEXT tSelectNx				; Show "Nx"
+	STRCAT_TEXT tSelectNx				; show "Nx"
 	output_99							; O2 ratio is still in "lo"
 customview_show_mix4b:
 	STRCAT	" "
 customview_show_mix4c:
-	btfsc	divemode					; In divemode
-	return								; Yes
+	btfsc	divemode					; in divemode?
+	return								; YES
 	STRCAT	"  "
 	return
-
 customview_show_mix5:
 	btfsc	divemode
 	bra		customview_show_mix6
-	STRCAT_TEXT tSelectTx				; Show "Tx"
+	STRCAT_TEXT tSelectTx				; show "Tx"
 customview_show_mix6:
 	output_99							; O2 ratio is still in "lo"
 	PUTC	"/"
--- a/src/customview.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/customview.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File customview.inc
+;   File customview.inc													V2.99d
 ;
 ;   Customview for divemode and surfacemode
 ;
@@ -9,21 +9,25 @@
 ; HISTORY
 ;   2011-08-10 : [mH] Import into hwOS sources
 
-    ; Dive mode
+; Dive mode
 	extern	customview_toggle
 	extern	customview_second
 	extern	customview_minute
-    extern  customview_show_mix             ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
-    extern  customview_show_change_depth    ; Put " in lo m" or " in lo ft" into Postinc2
-    extern  menuview_toggle
-    extern  menuview_toggle_reset
-    extern  customview_mask
-    
-    extern  customview_alternative_second
+	extern	customview_show_mix				; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
+	extern	menuview_toggle
+	extern	menuview_toggle_reset
+	extern	customview_mask
+	extern	customview_mask_alternative
+	extern	customview_alternative_second
+	extern	switch_layout_to_normal
 
-    ; Surface mode
-    extern  surf_customview_toggle
-    extern  surf_customview_mask
+; Surface mode
+	extern	surf_customview_toggle
+	extern	surf_customview_mask
+
 
-;	extern	surf_customview_second
-;	extern	surf_customview_minute
+
+
+
+
+
--- a/src/divemenu_tree.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/divemenu_tree.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File divemenu_tree.asm							REFACTORED VERSION V2.98
+;   File divemenu_tree.asm							REFACTORED VERSION V2.99e
 ;
 ;   OSTC dive mode menu
 ;
@@ -18,115 +18,165 @@
 #include "calibrate.inc"
 
 	extern	timeout_divemode_menu2
+	extern	restart_deco_engine_wo_ceiling
 	extern	diveloop_loop4
 
 
-divegui		CODE
+dmenu_tree		CODE
 
 ;=============================================================================
 ; Main Menu
+
+do_return_main_divemenu:
+	call	menu_processor_double_pop	; drop exit line and back to last line
+	incf	selected_item,W				; item numbers start with 0, menu positions with 1
+	movwf	menupos1					; position cursor where we came from
+	bra		do_main_divemenu_common
+
 	global	do_main_divemenu
 do_main_divemenu:
 	call	menu_processor_reset		; restart from first icon
 	movlw	.1
 	movwf	menupos1					; set to first option in divemode menu
+
+do_main_divemenu_common:
 	btfsc	FLAG_ccr_mode
 	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu
 	btfsc	FLAG_pscr_mode
 	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu
 
 main_divemenu_OC:
-	bcf		ccr_diluent_setup
+	bcf		FLAG_diluent_setup			; set to operations on OC gases
 	bcf		is_bailout_menu
 
+ IFDEF _cave_mode
+	btfss	FLAG_cave_mode				; in cave mode?
+	bra		main_divemenu_OC_no_cave	; NO - do OC menu without turn option
+
+	MENU_BEGIN	tMainMenu,	.6
+		MENU_CALL		tDivemenu_Gaslist,	do_divemode_gaslist
+		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
+		MENU_DYNAMIC	do_toggle_gf_label,	do_toggle_gf
+		MENU_CALL		tDivemenu_Marker,	do_set_marker
+		MENU_DYNAMIC	do_turn_dive_label,	do_turn_dive
+		MENU_CALL		tExit,				do_exit_divemode_menu
+	MENU_END
+ ENDIF
+
+main_divemenu_OC_no_cave:
 	MENU_BEGIN	tMainMenu,	.5
-		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
-		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
-		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
-		MENU_CALL	tDivemenu_Marker,	do_set_marker
-		MENU_CALL	tExit,				do_exit_divemode_menu
+		MENU_CALL		tDivemenu_Gaslist,	do_divemode_gaslist
+		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
+		MENU_DYNAMIC	do_toggle_gf_label,	do_toggle_gf
+		MENU_CALL		tDivemenu_Marker,	do_set_marker
+		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
+
 main_divemenu_loop:
-	bsf		ccr_diluent_setup			; default to operations on diluents
-	bcf		is_bailout_menu				; default to none-bailout menu
+	bsf		FLAG_diluent_setup			; set to operations on diluents
+	bcf		is_bailout_menu				; flag as none-bailout menu
 	btfsc	FLAG_pscr_mode
-	bra		main_divemenu_pscr			; PSCR Menu
+	bra		main_divemenu_pscr			; pSCR menu
 
 	MENU_BEGIN	tMainMenu,	.6
-		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
-		MENU_CALL	tDivemenu_Setpoint,	do_divemode_splist
-		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
-		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
-		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
-		MENU_CALL	tExit,				do_exit_divemode_menu
+		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
+		MENU_CALL		tDivemenu_Setpoint,	do_divemode_splist
+		MENU_CALL		tDivemenu_Diluent,	do_divemode_gaslist
+		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
+		MENU_DYNAMIC	do_toggle_gf_label,	do_toggle_gf
+		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
 main_divemenu_pscr:
-	btfsc	analog_o2_input			; do we have an analog input?
-	bra	main_divemenu_pscr_sensors	; YES
-	btfsc	s8_digital			; do we have a digital input?
-	bra	main_divemenu_pscr_sensors	; YES
-	btfsc	optical_input			; do we have an optical input?
-	bra	main_divemenu_pscr_sensors	; YES
+	btfsc	analog_o2_input				; do we have an analog  input (OSTC cR)?
+	bra		main_divemenu_pscr_sensors	; YES
+	btfsc	optical_input				; do we have an optical input (OSTC 3)?
+	bra		main_divemenu_pscr_sensors	; YES
 
 main_divemenu_pscr_no_sensors:
 	MENU_BEGIN	tMainMenu,	.6
-		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
-		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
-		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
-		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
-		MENU_CALL	tDivemenu_Marker,	do_set_marker
-		MENU_CALL	tExit,				do_exit_divemode_menu
+		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
+		MENU_CALL		tDivemenu_Premix,	do_divemode_gaslist
+		MENU_CALL		tBackToLoop,		do_switch_sp_calc
+		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
+		MENU_DYNAMIC	do_toggle_gf_label,	do_toggle_gf
+		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
 main_divemenu_pscr_sensors:
 	MENU_BEGIN	tMainMenu,	.6
-		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
-		MENU_CALL	tCCRSensor,			do_divemode_setpoint_pscr
-		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
-		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
-		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
-		MENU_CALL	tExit,				do_exit_divemode_menu
+		MENU_CALL		tDiveBailout,		do_divemode_gaslist_bail
+		MENU_CALL		tCCRSensor,			do_divemode_setpoint_pscr
+		MENU_CALL		tDivemenu_Premix,	do_divemode_gaslist
+		MENU_CALL		tDivemenu_Avg_Mkr,	do_reset_avg_set_mkr
+		MENU_DYNAMIC	do_toggle_gf_label,	do_toggle_gf
+		MENU_CALL		tExit,				do_exit_divemode_menu
 	MENU_END
 
 
 do_toggle_gf:
-	movff	char_I_deco_model,WREG		; 0 = ZH-L16, 1 = ZH-L16-GF
-	decfsz	WREG,W						; Toggle GF only in GF modes - in GF mode?
-	bra		do_main_divemenu			; No, do nothing and return
+	TSTOSS	char_I_deco_model			; toggle GF only in GF modes - in GF mode? (0 = ZH-L16, 1 = ZH-L16-GF)
+	bra		do_main_divemenu_common		; NO - do nothing and return
 	TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater
-	bra		do_main_divemenu			; No, do nothing and return
-	movlw	.4							; Set customview to 5 (GF informations)
-	movwf	menupos3					; Customview to come-1
-	bsf		toggle_customview			; Set flag, the customview will be toggled very soon now...
+	bra		do_main_divemenu_common		; NO - do nothing and return
+	movlw	index_gf_factors-1			; custom view number one below GF factors
+	movwf	menupos3					; set custom view number
+	bsf		toggle_customview			; initiate toggle to desired custom view -> GF factors
 	movlw	.1
-	movwf	menupos1					; Set to first option in divemode menu
+	movwf	menupos1					; set to first option in dive mode menu
 
 	MENU_BEGIN	tDivemenu_ToggleGF,	.2
-		MENU_CALL	tDivemenu_ToggleGF,	do_togglegf
-		MENU_CALL	tBack,				do_main_divemenu
+		MENU_CALL		tDivemenu_ToggleGF,	do_togglegf
+		MENU_CALL		tBack,				do_return_main_divemenu
 	MENU_END
 
 do_togglegf:
-	;TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater ; check is now done before entering menu
-	;bra	do_exit_divemode_menu		; continue with exiting menu code
-	bsf		toggle_gf					; Set flag...
+	bsf		toggle_gf					; set command flag...
 	bra		do_exit_divemode_menu		; continue with exiting menu code
 
 
+do_reset_avg_set_mkr:
+	movlw	.1
+	movwf	menupos1					; set to first option in dive mode menu
+
+ IFDEF _cave_mode
+	btfss	FLAG_cave_mode				; in cave mode?
+	bra		do_reset_average_no_cave	; NO - do menu without turn option
+
+	MENU_BEGIN	tDivemenu_Avg_Mkr,	.4
+		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
+		MENU_CALL		tDivemenu_Marker,	do_set_marker
+		MENU_DYNAMIC	do_turn_dive_label,	do_turn_dive
+		MENU_CALL		tBack,				do_return_main_divemenu
+	MENU_END
+ ENDIF
+
+do_reset_average_no_cave:
+	MENU_BEGIN	tDivemenu_Avg_Mkr,	.3
+		MENU_CALL		tDivemenu_ResetAvg,	do_reset_average
+		MENU_CALL		tDivemenu_Marker,	do_set_marker
+		MENU_CALL		tBack,				do_return_main_divemenu
+	MENU_END
+
+
+do_reset_average:
+	bsf		reset_average_depth			; set flag...
+	bra		do_exit_divemode_menu		; ... and exit
+
 do_set_marker:
 	bsf		FLAG_set_marker				; set flag...
 	bra		do_exit_divemode_menu		; ... and exit
 
-
-do_reset_average:
-	bsf		reset_average_depth			; Set Flag
-	bra		do_exit_divemode_menu		; continue with exiting menu code
+ IFDEF _cave_mode
+do_turn_dive:
+	bsf		toggle_turn_dive			; set flag...
+	bra		do_exit_divemode_menu		; ... and exit
+ ENDIF
 
 
 do_switch_sensor:						; entry point when coming from switch to sensor
-	movlw	.1							; Switch to Sensor
+	movlw	.1							; switch to sensor
 	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
 	; enable all sensors
 	bsf		use_O2_sensor1
@@ -141,7 +191,7 @@
 	movff	char_I_const_ppO2,WREG
 	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
 	bcf		setpoint_fallback			; clear fallback condition (stops fallback warning)
-	clrf	WREG						; Switch to fixed SP
+	clrf	WREG						; switch to fixed SP
 	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
 	bra		do_switch_sp_com
 
@@ -156,11 +206,13 @@
 	bsf		setpoint_changed			; set flag (for profile)
 
 	; Clear some flags in case we were in bailout before...
-	bcf		is_bailout					; end bailout mode
+	bcf		FLAG_bailout_mode			; end bailout mode
 	;bcf	is_bailout_menu				; not needed
-	bcf		better_gas_available		; =1: A better gas is available and a gas change is advised in divemode
+	bcf		better_gas_available		; =1: a better gas is available and a gas change is advised in dive mode
+	bcf		better_dil_available		; =1: a better diluent is available and a gas change is advised in dive mode
 	bcf		blinking_better_gas			; clear blinking flag
-	call	customview_mask				; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2:
+	bcf		blinking_better_dil			; clear blinking flag
+	bsf		redraw_custview_mask		; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label
 
 	bsf		FLAG_back_to_loop			; indicate that it is a switchback from OC bailout to CCR/pSCR loop
 	bsf		divemode_gaschange			; initiate reconfiguration to loop mode on last diluent
@@ -169,28 +221,35 @@
 
 
 do_divemode_gaslist_bail:				; entry point from CCR/pSCR to bailout to OC gases
-	bcf		ccr_diluent_setup			; switch to OC gases
+	bcf		FLAG_diluent_setup			; switch to OC gases
 	bsf		is_bailout_menu				; flag it is a bailout action
 do_divemode_gaslist:					; entry point for switching: OC -> gases, loop -> diluents
-	btfsc	is_bailout					; in bailout mode?
-	bcf		ccr_diluent_setup			; yes - for safety reasons, redirect to OC (bailout) gases
-do_divemode_gaslist_com:
-	bsf		short_gas_decriptions
-	movlw	.1
-	movwf	menupos1					; Set to first option in divemode menu
+	btfsc	FLAG_bailout_mode			; in bailout mode?
+	bcf		FLAG_diluent_setup			; yes - for safety reasons, redirect to OC (bailout) gases
+	bsf		short_gas_decriptions		; do not show "Gas x" etc.
+	bsf		better_gas_hint				; mark the gas which is the best gas/diluent
+	movf	best_gas_number,W			; load number of best gas (1-5)into WREG
+	btfsc	FLAG_diluent_setup			; in diluent selection?
+	movf	best_dil_number,W			; YES - overwrite with best diluent (1-5)
+	bnz		do_divemode_gaslist_1		; best gas/dil number  =   0 (none available) ?
+	movlw	.1							; YES - default to first gas/dil
+	btfsc	WREG,7						; best gas/dil number >= 128 (not computed yet) ?
+	movlw	.1							; YES - default to first gas/dil
+do_divemode_gaslist_1:
+	movwf	menupos1					; position cursor to best gas/dil (or first option if none avail)
 	MENU_BEGIN	tGaslist,	.6
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_switch_gas
 		MENU_CALL		tMore,					do_divemode_gaslist_more
 	MENU_END
 
 
 do_divemode_gaslist_more:
 	movlw	.1
-	movwf	menupos1						; Set to first option in divemode menu
+	movwf	menupos1						; set to first option in dive mode menu
 
 	movff	char_I_O2_ratio,gas6_O2_ratio	; initialize gas6 with currently breathed gas - O2 ratio
 	movff	char_I_He_ratio,gas6_He_ratio	; initialize gas6 with currently breathed gas - He ratio
@@ -208,30 +267,38 @@
 
 do_lost_gas:
 	movlw	.1
-	movwf	menupos1					; Set to first option in divemode menu
+	movwf	menupos1					; set to first option in dive mode menu
 do_lost_gas_common:
-	bsf		short_gas_decriptions
+	bsf		short_gas_decriptions		; do not show "Gas x" etc.
+	bcf		better_gas_hint				; do not mark the best gas/diluent
 	MENU_BEGIN	tDivemenu_LostGas, .6
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_active	; toggle the gas (in)active
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_active	; toggle the gas (in)active
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_active	; toggle the gas (in)active
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_active	; toggle the gas (in)active
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,	do_toggle_active	; toggle the gas (in)active
 		MENU_CALL		tExit,					do_exit_divemode_menu
 	MENU_END
 
 
 do_switch_gas6:
 	movlw	.6							; gas 6
-	movwf	menupos1					; transfer register for selected gas towards gas_switched_common: 
+	movwf	menupos1					; transfer register for selected gas towards gas_switched_common
 	bsf		gas6_changed				; set flag for profile recording
 	;bra	do_switch_gas				; continue with common gas-switched code
 
 do_switch_gas:
-	bsf		divemode_gaschange			; Set flag, will also trigger restart of deco_engine
-	btfsc	is_bailout_menu				; Bailout confirmed?
-	bsf		is_bailout					; begin bailout mode
-	call	customview_mask				; update custom view mask to (eventually) rewrite ppO2(Dil): to ppO2:
+	bsf		divemode_gaschange			; set flag, will also trigger restart of deco_engine
+	btfss	is_bailout_menu				; doing a bailout?
+	bra		do_switch_gas_1				; NO
+	bsf		FLAG_bailout_mode			; YES - begin bailout mode
+ IFDEF _cave_mode
+	btfsc	FLAG_cave_mode				;     - in cave mode?
+	bsf		FLAG_dive_turned			;       YES - set dive as turned
+ ENDIF
+do_switch_gas_1:
+	bcf		setpoint_fallback			; eventually terminate fallback mode and get rid of its warning
+	bsf		redraw_custview_mask		; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label
 	;bra	do_exit_divemode_menu		; continue with exiting menu code
 
 do_exit_divemode_menu:
@@ -241,35 +308,31 @@
 
 
 do_toggle_active:
-	extern	restart_deco_engine_wo_ceiling
-	call	restart_deco_engine_wo_ceiling
 	movlw	.5
-	btfsc	ccr_diluent_setup			; diluents?
-	addwf	menupos1,F					; yes 1-5 -> 6-10
-	decf	menupos1,W					; -> 0-4 for gases / 5-9 for diluents
-	lfsr	FSR1,opt_gas_type+0
-	movff	PLUSW1,lo
-	tstfsz	lo							; Already disabled?
-	bra		do_toggle_active2			; No, disable now!
-	lfsr	FSR1,opt_gas_type_backup+0	; copy opt_gas_type_backup+W back to opt_gas_type+W
-	movff	PLUSW1,lo
-	lfsr	FSR1,opt_gas_type+0
-	movff	lo,PLUSW1
-	lfsr	FSR1,opt_OC_bail_gas_change_backup+0 ; copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W
-	movff	PLUSW1,lo
-	lfsr	FSR1,opt_OC_bail_gas_change+0
-	movff	lo,PLUSW1
-	bra		do_toggle_active3
-do_toggle_active2:
-	clrf	PLUSW1						; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	lfsr	FSR1,opt_OC_bail_gas_change+0
-	clrf	PLUSW1						; also delete change depth here to have the menu updated immediately
-do_toggle_active3:
+	btfsc	FLAG_diluent_setup			; operating on diluents?
+	addwf	menupos1,F					; YES - add offset of 5 to shift 1-5 -> 6-10
+	decf	menupos1,W					; 1-10 -> 0-4 for gases / 5-9 for diluents
+	lfsr	FSR1,opt_gas_type			; load base address of gas types
+	movff	PLUSW1,lo					; get gas/dil type
+	tstfsz	lo							; already disabled?
+	bra		do_toggle_active_disable	; NO  - disable   now
+do_toggle_active_enable					; YES - re-enable now
+	lfsr	FSR1,opt_gas_type_backup	; load base address of backed-up gas types
+	movff	PLUSW1,lo					; get backed-up gas/dil type
+	lfsr	FSR1,opt_gas_type			; load base address of gas types
+	movff	lo,PLUSW1					; restore gas type
+	bra		do_toggle_active_common
+do_toggle_active_disable:				; disable gas / diluent
+	;lfsr	FSR1,opt_gas_type			; (still set)
+	clrf	PLUSW1						; set type to disabled (0=disabled, 1=first, 2=travel/normal, 3=deco/-)
+do_toggle_active_common:
 	movlw	.5
-	btfsc	ccr_diluent_setup			; use OC gases?
-	subwf	menupos1,F					; back to 1-5 
-	bra		do_lost_gas					; return to list and show updated result
-
+	btfsc	FLAG_diluent_setup			; operating on diluents?
+	subwf	menupos1,F					; NO - back to 0-4 for gases 1-5
+	bcf		blinking_better_gas			; clear blinking flag for gases    to avoid "leftovers"
+	bcf		blinking_better_dil			; clear blinking flag for diluents to avoid "leftovers"
+	call	restart_deco_engine_wo_ceiling ; invalidate deco data (but not the ceiling) and restart deco engine
+	bra		do_lost_gas_common
 
 do_dive_pO2:
 	banksel	gas6_O2_ratio
@@ -303,7 +366,7 @@
 	movwf	lo
 	movlw	.101
 	cpfslt	lo							; O2 + He < 101 ?
-	decf	gas6_He_ratio,F				; Yes, He-- (Unchanged)
+	decf	gas6_He_ratio,F				; Yes, He-- (unchanged)
 	banksel	common
 	bra		do_divemode_gaslist_more_common
 
@@ -320,14 +383,14 @@
 do_divemode_splist:
 	bsf		short_gas_decriptions
 	movlw	.1
-	movwf	menupos1					; set to first option in divemode menu
+	movwf	menupos1					; set to first option in dive mode menu
 
 do_divemode_splist_common:
-	btfsc	analog_o2_input				; do we have an analog input?
+	btfsc	analog_o2_input				; do we have an analog input (OSTC cR)?
 	bra		do_divemode_splist_sensor	; YES
-	btfsc	s8_digital				; do we have a digital input?
-	bra		do_divemode_splist_sensor	; YES
-	btfsc	optical_input				; do we have an optical input?
+;	btfsc	s8_digital					; do we have a digital input?
+;	bra		do_divemode_splist_sensor	; YES
+	btfsc	optical_input				; do we have an optical input (OSTC 3)?
 	bra		do_divemode_splist_sensor	; YES
 
 do_divemode_splist_no_sensor:
@@ -351,10 +414,11 @@
 
 
 do_divemode_sensor:
-	clrf	menupos3					; show customview 1 (HUD Data)
-	bsf		toggle_customview
+	movlw	index_ppo2_sensors-1		; custom view number one below ppO2 sensors
+	movwf	menupos3					; set custom view number
+	bsf		toggle_customview			; initiate toggle to desired custom view -> ppO2 sensors
 	movlw	.1
-	movwf	menupos1					; Set to 1st option: use sensors
+	movwf	menupos1					; set to 1st option: use sensors
 
 do_return_divemode_sensor:
 	MENU_BEGIN	tGaslist,	.6
@@ -368,7 +432,7 @@
 
 do_divemode_setpoint_pscr:
 	movlw	.1
-	movwf	menupos1					; Set to 1st option: use calculated ppO2
+	movwf	menupos1					; set to 1st option: use calculated ppO2
 	MENU_BEGIN	tGaslist,	.6
 		MENU_CALL		tCalculated,			do_switch_sp_calc
 		MENU_CALL		tDivemenu_UseSensor,	do_switch_sensor
--- a/src/divemode.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/divemode.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File divemode.asm								REFACTORED VERSION V2.98
+;   File divemode.asm								REFACTORED VERSION V2.99e
 ;
 ;   Divemode
 ;
@@ -9,8 +9,8 @@
 ; HISTORY
 ;  2011-08-15 : [mH] moving from OSTC code
 
-#include "hwos.inc"						; Mandatory header
-#include "shared_definitions.h"			; Mailbox from/to p2_deco.c
+#include "hwos.inc"						; mandatory header
+#include "shared_definitions.h"			; mailbox from/to p2_deco.c
 #include "tft_outputs.inc"
 #include "strings.inc"
 #include "tft.inc"
@@ -26,6 +26,10 @@
 #include "calibrate.inc"
 #include "convert.inc"
 
+ IFDEF _rx_functions
+#include "rx_ops.inc"
+ ENDIF
+
 
 	extern	TFT_dive_compass_heading
 	extern	do_line_menu
@@ -38,37 +42,50 @@
 
 	CBLOCK	local1						; max size is 16 Byte !!!
 		apnoe_timeout_counter			; timeout counter for apnoe mode
-		average_depth_hold:4			; used in calculation of the average depth
 		sensor_setpoint					; sensor ppo2 in 0.01bar for deco routine
-		active_diluent					; backup of diluent gas for when switching back from bailout to CCR/pSCR loop
-		average_depth_hold_total:4		; used to calculate the average depth
-	ENDC								; used: 11 byte, remaining: 5 byte
-
-gui		CODE
+		check_gas_num					; used in search for best gas/dil: current gas/dil number (1-5)
+		check_gas_depth					; used in search for best gas/dil: current gas/dil change depth
+		check_gas_type					; used in search for best gas/dil: current gas/dil type
+		check_gas_O2_ratio				; used in search for best gas/dil: current gas/dil O2 ratio
+		best_gas_num					; used in search for best gas/dil: best    gas/dil number (1-5)  CAUTION: there is also a variable named best_gas_number !
+		best_gas_depth					; used in search for best gas/dil: best    gas/dil change depth
+		ppO2_min						; used in search for best gas/dil: minimum ppO2 required
+		ppO2_max						; used in search for best gas/dil: maximum ppO2 allowed
+	ENDC								; used: 10 byte, remaining: 6 byte
+
+	CBLOCK	local2						; max size is 16 Byte !!!
+		average_depth_hold:4			; used to calculate the resettable average depth
+		average_depth_hold_total:4		; used to calculate the absolute   average depth
+	ENDC								; used: 8 byte, remaining: 8 byte
+
+dmode		CODE
 
 ;=============================================================================
 
 	global	diveloop
 diveloop:
-	banksel common
+	banksel	common
 	call	speed_normal
-	call	diveloop_boot				; Boot tasks for all modes
-
-	; Startup Tasks for all modes
-	call	TFT_boot					; Initialize TFT (includes clear screen)
-	bsf		FLAG_TFT_divemode_mask		; Display mask
-	movff	customview_divemode,menupos3; Reload last customview
-	call	customview_mask				; Redraw last custom view
+	call	diveloop_boot				; boot tasks for all modes
+
+	; startup tasks for all modes
+	call	TFT_boot					; initialize TFT (includes clear screen)
+	bsf		FLAG_TFT_divemode_mask		; request display of dive mode mask
+
+	movff	customview_divemode,menupos3; reload last custom view
+	bsf		redraw_custview_mask		; request redraw of last custom view
 
 	btfsc	FLAG_apnoe_mode
-	bsf		realdive					; Set Realdive flag in Apnoe mode
-
-	btfsc	FLAG_apnoe_mode				; Done for Apnoe or Gauge mode
+	bsf		realdive					; set realdive flag in apnoe mode
+
+	btfsc	FLAG_apnoe_mode				; done for apnoe or gauge mode
 	bra		diveloop_loop_start
-	btfsc	FLAG_gauge_mode				; Done for Apnoe or Gauge mode
+	btfsc	FLAG_gauge_mode				; done for apnoe or gauge mode
 	bra		diveloop_loop_start
 
-	bsf		FLAG_TFT_display_ndl_mask	; display "NDL"
+	; Deco modes
+	bsf		FLAG_TFT_active_gas_divemode; request display of gas and setpoint
+	bsf		FLAG_TFT_display_ndl_mask	; request display of "NDL"
 
 	; +@5 init
 	clrf	WREG						; WAIT marker: display "---"
@@ -79,37 +96,53 @@
 	movff	WREG,int_O_alternate_ascenttime+1
 
 diveloop_loop_start:
+	btfsc	FLAG_TFT_divemode_mask
+	call	TFT_divemode_mask
 	btfsc	FLAG_TFT_display_ndl_mask
 	call	TFT_display_ndl_mask
 
-
-diveloop_loop:							; The diveloop starts here
+diveloop_loop:							; the dive loop starts here
 	btfss	quarter_second_update
 	bra		diveloop_loop1
 
 	; tasks any 1/4 second, any mode
 	bcf		quarter_second_update		; clear flag
 
-	movlw	.6
-	cpfseq	menupos3					; in compass view?
-	bra		diveloop_loop1				; No, done.
-
-	btfsc	alternative_divelayout		; In alternative layout mode?
-	bra		diveloop_loop1				; Yes, done. No Compass.
-
-; TFT Output routines
-	call	TFT_dive_compass_heading	; Yes, update compass heading value
-	bsf		FLAG_TFT_temp_divemode		; Redraw temperature (is slightly affected from compass heading arrow)
-; TFT Output routines
+	btfsc	alternative_divelayout		; in alternative layout?
+	bra		diveloop_loop1				; YES - no compass in alternative layout mode
+	movlw	index_compass_dm			; NO  - index of compass view
+	cpfseq	menupos3					;     - in compass view?
+	bra		diveloop_loop1				;       NO  - done
+	call	TFT_dive_compass_heading	;       YES - update compass heading value
+	bsf		FLAG_TFT_temp_divemode		;           - redraw temperature (is slightly affected from compass heading arrow)
 
 diveloop_loop1:
-	btfss	onesecupdate
-	bra		diveloop_loop3
+	btfss	onesecupdate				; next second begun?
+	bra		diveloop_loop3				; NO
 
 ; tasks any new second...
 	bcf		onesecupdate				; one seconds update, clear flag here in case it's set again in ISR before all tasks are done.
 
-	;bsf	LEDg	; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ###
+;	###-- USE FOR DEBUG ONLY - RESETS RX CIRCUITRY --###
+;	bsf		LEDg
+;	###----------------------------------------------###
+
+	; compute current depth in meters
+	SAFE_2BYTE_COPY rel_pressure,xA
+	movlw	.100
+	movwf	xB+0
+	clrf	xB+1
+	call	div16x16						; xC = xA / xB, xC+0 now holds depth in full meters
+	movff	xC+0,curr_depth					; store result in curr_depth
+
+	; compute ambient pressure / 10, will be needed later
+	SAFE_2BYTE_COPY amb_pressure,xA
+	movlw	.10
+	movwf	xB+0
+	clrf	xB+1
+	call	div16x16						; xC = xA / xB = p_amb / 10
+	movff	xC+0,amb_press_10+0				; store result for later use
+	movff	xC+1,amb_press_10+1				; ...
 
 	; display depth based on full seconds interval (nicer blinking)
 	btfss	alternative_divelayout
@@ -117,22 +150,29 @@
 	btfsc	alternative_divelayout
 	rcall	TFT_output4_alternative
 
-	btfsc	FLAG_apnoe_mode				; Only in apnoe mode
-	bra		diveloop_loop1_nonedeco		; One Second Tasks in Apnoe mode
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		diveloop_loop1_nonedeco		; YES - do Apnoe mode every second tasks
 
 ; tasks any new second - only for deco modes
-diveloop_loop1_decomodes:
-	bsf		FLAG_TFT_divemins			; Display (new) divetime!
-	btfsc	show_safety_stop			; Show the safety stop?
-	bsf		FLAG_TFT_show_safety_stop	; Yes, show/delete if done.
+diveloop_loop1_deco:
+	bsf		FLAG_TFT_divemins			; display (new) dive time!
+	btfsc	show_safety_stop			; show the safety stop?
+	bsf		FLAG_TFT_show_safety_stop	; YES - show/delete if done
 
 	btfss	alternative_divelayout
 	rcall	TFT_output1_normal
 	btfsc	alternative_divelayout
 	rcall	TFT_output1_alternative
 
-	btfsc	FLAG_ccr_mode				; in CCR mode...
-	call	check_dive_autosp			; ...check for Auto-SP
+	call	divemode_check_for_warnings	; check for warnings
+
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; TR functions enabled?
+	bra		diveloop_loop1_deco1		; NO  - skip pressure readings part
+	call	get_pressure_readings		; YES - get  pressure readings
+	call	configure_sac_calculation	;     - set up SAC calculation
+diveloop_loop1_deco1:
+ ENDIF
 
 	call	calc_deko_divemode			; calculate decompression and set resulting display flags
 
@@ -140,124 +180,108 @@
 	rcall	TFT_output2_normal
 	btfsc	alternative_divelayout
 	rcall	TFT_output2_alternative
-
-	call	divemode_check_for_warnings	; Check for any warnings
-
-	bra		diveloop_loop2				; Common Tasks
-
+	bra		diveloop_loop2				; continue with common tasks
 
 ; tasks any new second - only for apnoe mode
 diveloop_loop1_nonedeco:
-	rcall	divemode_apnoe_tasks		; 1 sec. Apnoe tasks
-	call	customview_second			; Do every-second tasks for the custom view area
-	;bra	diveloop_loop2				; Common Tasks
+	rcall	divemode_apnoe_tasks		; 1 sec. apnoe tasks
+	call	customview_second			; do every-second tasks for the custom view area
+	;bra	diveloop_loop2				; common tasks
 
 ; continue tasks any new second, any mode
 diveloop_loop2:
-	rcall	timeout_divemode			; ** menu timeout? ** This routine sets the required flags
+	btfsc	redraw_custview_mask		; shall we redraw the custom view mask?
+	call	customview_mask				; YES - redraw custom view mask
+
+	rcall	timeout_divemode			; ** menu timeout? ** - this routine sets the required flags
 	rcall	set_dive_modes				; tests if depth > threshold
-	rcall	set_min_temp				; store min. temp if required (Future hardware will need this to be checked 1/second...)
+	rcall	set_min_temp				; store min. temp if required (future hardware will need this to be checked 1/second...)
 
 	btfsc	oneminupdate				; one minute tasks
-	rcall	update_divemode60			; Update clock, etc.
+	rcall	update_divemode60			; update clock, etc.
+
+	btfss	FLAG_oc_mode				; are we in OC mode?
+	bsf		FLAG_TFT_active_gas_divemode; NO - have the gas and setpoint redrawn on every second to update setpoint display, animate the blinking, etc.
 
 	btfss	alternative_divelayout
 	rcall	TFT_output3_normal
 	btfsc	alternative_divelayout
 	rcall	TFT_output3_alternative
 
-	;bcf	LEDg	; ### USE FOR DEBUG ONLY - RESETS RX CIRCUITRY ###
+;	###-- USE FOR DEBUG ONLY - RESETS RX CIRCUITRY --###
+;	bcf		LEDg
+;	###----------------------------------------------###
 
 ; tasks any round, any mode
 diveloop_loop3:
-	call	test_switches_divemode		; Check switches in divemode
+	call	test_switches_divemode		; check switches in dive mode
 
 	global	diveloop_loop4
-diveloop_loop4:							; Menu-Exit returns here...
-	btfsc	divemode_menu				; in the big divemode menu?
-	bra		diveloop_loop4b				; YES - no space for CCR/pSCR info
-	btfsc	menuview					; NO  - in the small yellow menu?
-	bra		diveloop_loop4b				;       YES - no space for CCR/pSCR info
-	btfsc	alternative_divelayout		;       NO  - in the alternative layout?
-	bra		diveloop_loop4b				;             YES - no space for CCR/pSCR info
-	call	TFT_show_mode_divemode		;             NO  - (re)write CCR/pSCR mode info to display
-diveloop_loop4b:
-	btfsc	toggle_customview			; Next view?
-	call	customview_toggle			; Yes, show next customview (and delete this flag)
-
-	btfsc	divemode_gaschange			; Gas switch flag set?
+diveloop_loop4:							; menu-exit returns here...
+	btfsc	toggle_customview			; next view?
+	call	customview_toggle			; YES - show next custom view (and delete this flag)
+
+	btfsc	divemode_gaschange			; gas switch flag set?
 	call	gas_switched_common			; YES
 
-	btfsc	toggle_gf					; Toggle GF/aGF?
+	btfsc	toggle_gf					; toggle GF/aGF?
 	rcall	divemodemode_togglegf		; YES
 
-	btfsc	FLAG_set_marker				; shall a marker be set?
+ IFDEF _cave_mode
+	btfsc	toggle_turn_dive			; toggle dive turned?
+	rcall	divemodemode_toggleturn		; YES
+ ENDIF
+
+	btfsc	FLAG_set_marker				; shall set a marker?
 	call	set_logbook_marker			; YES
 
-	btfsc	store_sample				; store new sample?
-	call	store_dive_data				; Store profile data
-
-	btfss	divemode					; Dive finished?
-	goto	ghostwriter_end_dive		; Dive finished!
+	btfsc	store_sample				; shall store new sample?
+	call	store_dive_data				; YES - store profile data
+
+	btfss	divemode					; dive finished?
+	goto	ghostwriter_end_dive		; YES - dive finished!
 
 	btfsc	pressure_refresh			; new pressure available?
-	rcall	set_max_depth				; update max. depth if required
+	rcall	set_max_depth				; YES - update max. depth if required
 	btfsc	pressure_refresh			; new pressure available?
-	bsf		FLAG_TFT_depth				; Yes, update depth
+	bsf		FLAG_TFT_depth				; YES - update depth
 	bcf		pressure_refresh			; clear flag
 
-	btfsc	temp_changed
-	bsf		FLAG_TFT_temp_divemode		; Displays temperature
-
-	; display depth based on as-fast-as-possible (no nice blinking)
-	;btfss	alternative_divelayout
-	;rcall	TFT_output4_normal
-	;btfsc	alternative_divelayout
-	;rcall	TFT_output4_alternative
-
-	btfsc	enable_screen_dumps			; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	bra		diveloop_loop5
-	bra		diveloop_loop6
-
-diveloop_loop5:
-	btfss	vusb_in						; USB (still) plugged in?
-	bcf		enable_screen_dumps			; No, clear flag
-	call	rs232_get_byte
-	btfsc	rs232_receive_overflow
-	bra		diveloop_loop6
-	movlw	"l"
-	cpfseq	RCREG1
-	bra		diveloop_loop6
-	call	TFT_dump_screen				; Dump the screen contents
-
-diveloop_loop6:
-	bra		diveloop_loop				; Loop the divemode
+	btfsc	temp_changed				; temperature changed?
+	bsf		FLAG_TFT_temp_divemode		; YES - display temperature
+
+ IFDEF _screendump
+	btfsc	enable_screen_dumps			; screen dump function enabled?
+	call	TFT_dump_screen_check		; YES - check if requested and do it
+ ENDIF
+
+	bra		diveloop_loop				; loop the dive mode
 
 ;--------------------------------------------------------------------------------------------------------	
 
-TFT_output1_normal:						; beginning of any new second - only for deco modes
+TFT_output1_normal:							; beginning of any new second - only for deco modes
 	btfsc	FLAG_TFT_divemode_mask
 	call	TFT_divemode_mask
 	btfsc	FLAG_TFT_divemins
-	call	TFT_divemins				; Display (new) divetime!
-	call	customview_second			; Do every-second tasks for the custom view area (In sync with the divetime) mH
+	call	TFT_divemins					; display (new) dive time!
+	call	customview_second				; do every-second tasks for the custom view area (in sync with the dive time) mH
 	btfsc	FLAG_TFT_show_safety_stop
-	call	TFT_show_safety_stop		; Show safety stop
+	call	TFT_show_safety_stop			; show safety stop
 	btfsc	FLAG_TFT_clear_safety_stop
-	call	TFT_clear_safety_stop		; Clear safety stop
+	call	TFT_clear_safety_stop			; clear safety stop
 	return
 
-TFT_output1_alternative:				; beginning of any new second - only for deco modes
+TFT_output1_alternative:					; beginning of any new second - only for deco modes
+	btfsc	FLAG_TFT_divemode_mask_alt
+	call	TFT_divemode_mask_alternative	; alternative mask
 	btfsc	FLAG_TFT_divemins
-	call	TFT_divemins_alternative	; Display (new) divetime!
-	btfsc	FLAG_TFT_divemode_mask_alt
-	call	TFT_divemode_mask_alternative ; Alt. mask
-	call	customview_alternative_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH
+	call	TFT_divemins_alternative		; display (new) divetime!
+	call	customview_alternative_second	; do every-second tasks for the custom view area (in sync with the dive time) mH
 	btfsc	FLAG_TFT_big_deco_alt
-	call	TFT_big_deco_alt			; Big deco and safety stop
+	call	TFT_big_deco_alt				; big deco, also manages alternative safety stop thus moved to first wave of outputs [rl]
 	return
 
-TFT_output2_normal:						; any new second - only for deco modes
+TFT_output2_normal:							; any new second - only for deco modes
 	btfsc	FLAG_TFT_display_ndl_mask
 	call	TFT_display_ndl_mask
 	btfsc	FLAG_TFT_display_ndl
@@ -270,56 +294,56 @@
 	call	TFT_display_tts
 	return
 
-TFT_output2_alternative:				; any new second - only for deco modes
+TFT_output2_alternative:					; any new second - only for deco modes
 	return
 
-TFT_output3_normal:						; tasks any new second, any mode
+TFT_output3_normal:							; tasks any new second, any mode, after deco calculations
 	btfsc	FLAG_TFT_max_depth
-	call	TFT_max_depth				; use normal max. depth
+	call	TFT_max_depth					; use normal max. depth
 	btfsc	FLAG_TFT_divemode_warning
 	call	TFT_divemode_warning
 	btfsc	FLAG_TFT_divemode_warning_clear
 	call	TFT_divemode_warning_clear
-	btfsc	FLAG_TFT_active_gas_divemode
-	call	TFT_active_gas_divemode		; Display gas/Setpoint
 	btfsc	FLAG_TFT_dive_warning_text_clear
-	call	TFT_clear_warning_text		; clear complete warnings area
+	call	TFT_clear_warning_text			; clear complete warnings area
 	btfsc	FLAG_TFT_dive_warning_text_clr2
-	call	TFT_clear_warning_text_2nd_row; clear 2nd row of warnings
+	call	TFT_clear_warning_text_2nd_row	; clear 2nd row of warnings
 	return
 
-TFT_output3_alternative:				; tasks any new second, any mode
-	btfsc	FLAG_TFT_max_depth_alt
-	call	TFT_max_depth_alternative	; big max. depth
+TFT_output3_alternative:					; tasks any new second
+	btfsc	FLAG_TFT_max_depth
+	call	TFT_max_depth_alternative		; big max. depth
 	btfsc	FLAG_TFT_dive_warning_text_clear
-	call	TFT_clear_warning_text		; clear complete warnings area (In alt mode only 2nd. row...)
+	call	TFT_clear_warning_text			; clear complete warnings area (in alt mode only 2nd row...)
 	return
 
-TFT_output4_normal:						; tasks any round, any mode
+TFT_output4_normal:							; tasks any round, any mode, before deco calculations (stable timebase)
 	btfsc	FLAG_TFT_depth
-	call	TFT_depth					; Displays new depth
+	call	TFT_depth						; display depth
+	btfsc	FLAG_TFT_active_gas_divemode
+	call	TFT_active_gas_divemode			; display gas/setpoint
 	btfsc	FLAG_TFT_temp_divemode
-	call	TFT_temp_divemode			; Update temperature
+	call	TFT_temp_divemode				; update temperature
 	return
 
-TFT_output4_alternative:				; tasks any round, any mode
+TFT_output4_alternative:					; tasks any round, any mode
 	btfsc	FLAG_TFT_depth
-	call	TFT_depth					; Displays new depth
+	call	TFT_depth						; display new depth
 	return
 
 
 ;--------------------------------------------------------------------------------------------------------
 
-divemode_apnoe_tasks:					; 1 sec. Apnoe tasks
-	call	TFT_display_apnoe_descent	; Yes, Show descent timer
+divemode_apnoe_tasks:					; 1 sec. apnoe tasks
+	call	TFT_display_apnoe_descent	; show descent timer
 	call	TFT_max_depth				; use normal max. depth
 
-	btfsc	divemode2					; Time running?
-	bra		divemode_apnoe_tasks2		; New descent, reset data if flag is set
+	btfsc	divemode2					; time running?
+	bra		divemode_apnoe_tasks2		; YES - new descent, reset data if flag is set
 
 	rcall	apnoe_calc_maxdepth
 	call	TFT_display_apnoe_surface
-	call	TFT_display_apnoe_last_max	; Show last max. depth
+	call	TFT_display_apnoe_last_max	; show last max. depth
 	incf	apnoe_surface_secs,F
 	movlw	d'60'
 	cpfseq	apnoe_surface_secs
@@ -328,26 +352,26 @@
 	incf	apnoe_surface_mins,F
 
 divemode_apnoe_tasks1:
-	bcf		FLAG_active_descent			; Clear flag
-	btfsc	divemode2					; Time running?
-	return								; Yes, return
-	bsf		FLAG_active_descent			; Set Flag
+	bcf		FLAG_active_descent			; clear flag
+	btfsc	divemode2					; time running?
+	return								; YES - return
+	bsf		FLAG_active_descent			; set flag
 	return
 
 divemode_apnoe_tasks2:
-	btfss	FLAG_active_descent			; Are we descending?
-	return								; No, We are at the surface
-	rcall	apnoe_calc_maxdepth			; Yes!
-	call	TFT_apnoe_clear_surface		; Clear Surface timer
-	clrf	apnoe_timeout_counter		; Delete timeout
+	btfss	FLAG_active_descent			; are we descending?
+	return								; NO - we are at the surface
+	rcall	apnoe_calc_maxdepth			; YES
+	call	TFT_apnoe_clear_surface		; clear surface timer
+	clrf	apnoe_timeout_counter		; delete timeout
 	clrf	apnoe_surface_secs
 	clrf	apnoe_surface_mins
 	clrf	apnoe_secs
-	clrf	apnoe_mins					; Reset Descent time
+	clrf	apnoe_mins					; reset descent time
 	movlw	.0
 	movff	WREG,max_pressure+0
-	movff	WREG,max_pressure+1			; Reset Max. Depth
-	bcf		FLAG_active_descent			; Clear flag
+	movff	WREG,max_pressure+1			; reset max. depth
+	bcf		FLAG_active_descent			; clear flag
 	return
 
 	global	apnoe_calc_maxdepth
@@ -357,8 +381,8 @@
 	movff	max_pressure+0,sub_b+0
 	movff	max_pressure+1,sub_b+1
 	call	subU16						; sub_c = sub_a - sub_b
-										; apnoe_max_pressure<max_pressure -> neg_flag=1
-										; max_pressure<=apnoe_max_pressure -> neg_flag=0
+										; apnoe_max_pressure <  max_pressure       -> neg_flag=1
+										; max_pressure       <= apnoe_max_pressure -> neg_flag=0
 	btfss	neg_flag
 	return
 										;apnoe_max_pressure<max_pressure
@@ -369,148 +393,193 @@
 	; --------------------------------------------------------------------------------------
 
 calc_deko_divemode:
-	rcall	calc_deko_divemode2			; all deco relevant code is now invoked every second
-	btfsc	twosecupdate
-	bra		calc_deko_divemode1
-	bsf		twosecupdate
-	return
-
-calc_deko_divemode1:					; the following code is invoked every 2 seconds
-	bcf		twosecupdate
-
+	btfss	FLAG_gauge_mode				; in gauge mode?
+	rcall	calc_deko_engine			; NO - do deco calculations
+
+	; Increment the time accumulators used for calculating the average depths.
+	; This done here and not in the ISR to guarantee synchronism between time
+	; and depth accumulator incrementing.
+	infsnz	average_divesecs+0,F
+	incf	average_divesecs+1,F
+	infsnz	average_divesecs_total+0,F
+	incf	average_divesecs_total+1,F
+
+	btg		onesectoggle				; toggle the one-second toggle bit
+	btfss	onesectoggle				; toggle bit set?
+	bra		calc_deko_divemode2			; NO
+	;bra	calc_deko_divemode1			; YES
+
+calc_deko_divemode1:					; every-2-seconds tasks, 1st phase
+;	call	TFT_debug_output			; optional debug output
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	return								; YES - done
+	goto	check_gas_best			; NO  - checks if a better gas should be selected (by user) and return
+
+calc_deko_divemode2:					; every-2-seconds tasks, 2nd phase
 	call	calc_average_depth			; calculate average depth
 	call	calc_velocity				; calculate vertical velocity and display if > threshold (every two seconds)
-	call	set_reset_safety_stop		; Set flags for safety stop and/or reset safety stop
-	call	TFT_debug_output
-
-	btfsc	FLAG_apnoe_mode				; Done for Apnoe or Gauge mode
-	return
-	btfsc	FLAG_gauge_mode				; Done for Apnoe or Gauge mode
-	return
-
-; Check for a gas change
-	goto	check_gas_change			; Checks if a better gas should be selected (by user) and return...
-
-
-calc_deko_divemode2:
-	btfsc	FLAG_gauge_mode				; Done for Apnoe or Gauge mode
-	return
-
-	btfsc	FLAG_ccr_mode				; In CCR mode?
-	rcall	calc_deko_divemode_sensor	; do sensor data acquisition if applicable by OSTC model
-
-	btfsc	FLAG_pscr_mode				; In PSCR mode?
-	rcall	calc_deko_divemode_sensor	; do sensor data acquisition if applicable by OSTC model
-
-	SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine
+	goto	set_reset_safety_stop		; set/reset flags for safety stop and return
+
+
+calc_deko_engine:
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	call	check_dive_autosp			; YES - check for Auto-SP
+
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	rcall	calc_deko_divemode_sensor	; YES - do sensor data acquisition if applicable by OSTC model
+
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	rcall	calc_deko_divemode_sensor	; YES - do sensor data acquisition if applicable by OSTC model
 
 
 	; check deco engine state and switch between normal and alternative plan calculations
 	;
 	; Remark: Any reconfigurations done here do only affect the ascent & deco calculation settings,
-	;		not the settings for the calculations done on the real tissues. The later ones are only
-	;		altered in case of a gas change, or in case of a real bailout or switchback to setpoint
-	;		or sensor, respectively.
-	;		In case of a gas change or real bailout/switchback, the settings for the deco calculations
-	;		are also changed to match the settings for the real tissues. This is done on signal through
-	;		'divemode_gaschange' and will also leave the deco engine status in state as if having done
-	;		the alternative plan last.
-
-	; check state of ascent/deco calculations
-	movff	char_O_deco_status,lo		; get a working copy of char_O_deco_status into bank common
-	movlw	DECO_STATUS_MASK			; load bit mask covering the deco status bits
-	andwf	lo,W						; mask out bits showing deco engine computations state
-	tstfsz	WREG						; check if the last compute cycle has finished (bits 1 and 0 cleared)
-	bra		calc_deko_divemode2e		; NO  - computations still in progress, needs more computation cycles
-	btfss	lo,DECO_PLAN_FLAG			; YES - computation cycle finished, so check what has been computed
-	bra		calc_deko_divemode2b		; PLAN bit is cleared i.e. normal plan was done, may do alternative next
-
-	; The PLAN bit is set, i.e. an alternative plan was computed in the last cycle, or the deco engine has
-	; been restarted because of a gas change etc. --> Reconfigure to normal plan for next computation cycle.
-
-	; reset flags for special calculations
+	;         not the settings for the calculations done on the real tissues. The later ones are only
+	;         altered in case of a gas change, or in case of a real bailout or switchback to setpoint
+	;         or sensor, respectively.
+	;         In case of a gas change or real bailout/switchback, the settings for the deco calculations
+	;         are also changed to match the settings for the real tissues. This is done on signal through
+	;         'divemode_gaschange' and will also leave the deco engine status in state as if having done
+	;         the alternative plan last.
+
+	; get working copies of char_O_main_status and char_O_deco_status
+	movff	char_O_main_status,hi		; get char_O_main_status into hi
+	movff	char_O_deco_status,lo		; get char_O_deco_status into lo
+
+	; check state of deco calculations
+	btfsc	hi,DECO_COMPLETED_NORM		; finished calculations for normal plan?
+	bra		calc_deko_engine_alt		; YES - do an alternative plan next (or a normal one with more features enabled)
+	btfsc	hi,DECO_COMPLETED_ALT		; finished calculations for alternative plan?
+	bra		calc_deko_engine_norm		; YES - do a normal plan next
+	bra		calc_deko_engine_cont		; NO to both - continue calculations / do first invocation in INIT mode
+
+calc_deko_engine_norm:
+	; Last cycle did an alternative plan, or the deco engine has been restarted because of a gas change etc.
+	; --> Reconfigure to normal plan for next computation cycle.
+	bcf		lo,DECO_PLAN_FLAG			; clear flag for alternative plan to do a normal plan next
+	bcf		lo,DECO_ASCENT_FLAG			; clear flag for delayed ascent calculation
+	bcf		lo,DECO_VOLUME_FLAG			; clear flag for gas needs calculation
+	bcf		lo,DECO_BAILOUT_FLAG		; clear flag for bailout mode
+ IFDEF _cave_mode
+	bcf		hi,DECO_CAVE_MODE			; clear flag for cave mode
+ ENDIF
+
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	bra		calc_deko_engine_norm_loop	; YES - reload diluents and reconfigure CCR mode if not in bailout
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	bra		calc_deko_engine_norm_loop	; YES - reload diluents and reconfigure pSCR mode if not in bailout
+	;bra	calc_deko_engine_norm_OC	; neither in CCR nor pSCR mode, so reload OC gases and reconfigure OC mode
+										; (first cycle omits gas needs calculation for faster first deco results)
+calc_deko_engine_norm_OC:
+	movff	active_gas,WREG				; get current OC gas
+	call	deco_setup_oc_gases_pre		; set up deco calculations in OC mode with OC gases
+	bra		calc_deko_engine_start		; start deco engine
+
+calc_deko_engine_norm_loop:				; switch to loop calculation if not in a real bailout situation
+	btfsc	FLAG_bailout_mode			; check if a real bailout situation is present
+	bra		calc_deko_engine_norm_OC	; YES - revert to OC mode
+										; NO  - switch to loop calculation:
+	movff	active_dil,WREG				;     - get current diluent
+	call	deco_setup_cc_diluents_pre	;     - set up deco calculations in CCR/pSCR mode with diluents
+	bra		calc_deko_engine_start		;     - start deco engine
+
+calc_deko_engine_alt:
+	; A normal plan was computed in the last cycle. For the next calculation cycle the mode may be switched
+	; to alternative plan, or stay in normal plan but with certain features enabled...
+	bcf		lo,DECO_ASCENT_FLAG			; clear flag for delayed ascent calculation
+	bcf		lo,DECO_VOLUME_FLAG			; clear flag for gas needs calculation
+	bcf		lo,DECO_BAILOUT_FLAG		; clear flag for bailout mode
+ IFDEF _cave_mode
+	bcf		hi,DECO_CAVE_MODE			; clear flag for cave mode
+ ENDIF
+
+	btfsc	FLAG_bailout_mode			; check if a real bailout situation is present
+	bra		calc_deko_engine_alt_1		; YES - stay in normal plan mode and preclude delayed ascent calculation
+	TSTOSS	char_I_extra_time			; NO  - check if a delayed ascent is enabled
+	bra		calc_deko_engine_alt_1		;       NO  - stay in normal plan mode and preclude delayed ascent calculation
+	bsf		lo,DECO_PLAN_FLAG			;       YES - set flag for alternative plan
+	bsf		lo,DECO_ASCENT_FLAG			;           - set flag for delayed ascent
+
+calc_deko_engine_alt_1:
+	TSTOSS	opt_calc_asc_gasvolume		; check if gas volume calculation is enabled
+	bra		calc_deko_engine_start		; NO  - no volume calculation, no simulated bailout plan in this case
+	bsf		lo,DECO_VOLUME_FLAG			; YES - set gas needs calculation flag
+
+	btfsc	FLAG_bailout_mode			; check if a real bailout situation is present
+	bra		calc_deko_engine_start		; YES - normal plan already does bailout (OC) calculation "for real"
+
+ IFDEF _cave_mode
+	bsf		hi,DECO_CAVE_MODE			; activate cave mode by default
+	btfss	FLAG_cave_mode				; cave mode switched on?
+	bcf		hi,DECO_CAVE_MODE			; NO  - deactivate p2deco cave mode again
+	btfsc	FLAG_dive_turned			; dive turned?
+	bcf		hi,DECO_CAVE_MODE			; YES - deactivate p2deco cave mode again
+	btfsc	FLAG_cave_mode_shutdown		; cave mode function shut down?
+	bcf		hi,DECO_CAVE_MODE			; YES - deactivate p2deco cave mode again
+ ENDIF
+
+	btfss	lo,DECO_MODE_LOOP_FLAG		; NO  - has a loop mode calculation been done during the normal plan?
+	bra		calc_deko_engine_start		;       NO  - when not in loop mode, no simulated bailout to be done
+	decf	best_gas_number,W			;       YES - get best gas number -1 into WREG. If not available, WREG will be 255 now. If not computed yet, WREG will be 254 now.
+	btfsc	WREG,7						;           - WREG < 128 (a bailout gas is available)?
+	bra		calc_deko_engine_alt_2		;             NO  - no simulated bailout possible because no bailout gas available to switch to
+	bsf		lo,DECO_PLAN_FLAG			;             YES - set flag for alternative plan
+	bsf		lo,DECO_BAILOUT_FLAG		;                 - set bailout mode flag (enables gas changes before 1st stop)
+	movf	best_gas_number,W			;                 - put number of best gas into WREG
+	call	deco_setup_oc_gases_pre		;                 - set up deco calculations in OC mode with OC gases
+	bra		calc_deko_engine_start		;                 - start in alternative plan mode
+
+calc_deko_engine_alt_2:
 	bcf		lo,DECO_PLAN_FLAG			; clear flag for alternative plan
 	bcf		lo,DECO_ASCENT_FLAG			; clear flag for delayed ascent calculation
 	bcf		lo,DECO_VOLUME_FLAG			; clear flag for gas needs calculation
+ IFDEF _cave_mode
+	bcf		hi,DECO_CAVE_MODE			; clear flag for cave mode
+ ENDIF
+	call	inval_alternative_plan_data	; invalidate all alternative (bailout) plan data because they are not applicable any more
+
+calc_deko_engine_start:
+ IFDEF _cave_mode
+	movff	hi,char_O_main_status		; write-back char_O_main_status to deco engine interface
+ ENDIF
 	movff	lo,char_O_deco_status		; write-back char_O_deco_status to deco engine interface
 
-	; check if a switchback from CCR or pSCR bailout calculation is to be done
-	btfsc	FLAG_ccr_mode				; may a switchback from a CCR bailout calculation be needed?
-	bra		calc_deko_divemode2a		; in CCR  mode, so may need to switch back from bailout calculation
-	btfsc	FLAG_pscr_mode				; may a switchback from a pSCR bailout calculation be needed?
-	bra		calc_deko_divemode2a		; in pSCR mode, so may need to switch back from bailout calculation
-	bra		calc_deko_divemode2e		; not in CCR nor pSCR, so no switchback needed, start normal plan now
-										; (first cycle omits gas needs calculation in OC without delayed ascent)
-
-	; switch back to loop calculation if last cycle was doing a bailout calculation
-calc_deko_divemode2a:					
-	movff	opt_calc_asc_gasvolume,hi	; get the gas volume needs calculation setting
-	movf	hi,W						; are gas volume calculations turned on?
-	bz		calc_deko_divemode2e		; NO  - can't have done a bailout calculation then, start normal plan
-	btfsc	is_bailout					; YES - check if a real bailout situation is present
-	bra		calc_deko_divemode2e		; YES - OC gases have been set by bailout action then, start normal plan
-	movff	active_gas,WREG				; NO  - switch back to loop calculation: get current (diluent) gas, ...
-	call	deco_setup_cc_diluents		;     ... set up deco calculations in CCR/pSCR mode with diluents,
-	bra		calc_deko_divemode2e		;     ... and start in normal plan mode
-
-	; The PLAN bit was cleared, i.e. a normal plan was computed in the last cycle. For the next
-	; computation cycle the mode may be switched to alternative plan, or stay in normal mode...
-
-calc_deko_divemode2b:
-	bcf		lo,DECO_ASCENT_FLAG			; clear flag for delayed ascent calculation (for safety only)
-	btfsc	is_bailout					; check if a real bailout situation is present
-	bra		calc_deko_divemode2c		; YES - stay in normal plan mode and preclude delayed ascent calculation
-	movff	char_I_extra_time,hi		; NO  -	get the delayed ascent setting
-	tstfsz	hi							;       check if delayed ascent calculation is enabled
-	bsf		lo,DECO_ASCENT_FLAG			;       YES - set flag for delayed ascent calculation
-	tstfsz	hi							;       check if delayed ascent calculation is enabled (again)
-	bsf		lo,DECO_PLAN_FLAG			;       YES - set flag for alternative plan
-
-	; check if a gas needs calculation shall be done
-calc_deko_divemode2c:					
-	bsf		lo,DECO_VOLUME_FLAG			; set gas needs calculation flag (may be cleared again next)
-	TSTOSS	opt_calc_asc_gasvolume		; check if gas needs calculation is enabled
-	bcf		lo,DECO_VOLUME_FLAG			; NO  - reset flag again
-	movff	lo,char_O_deco_status		; write-back char_O_deco_status to deco engine interface
-	TSTOSS	opt_calc_asc_gasvolume		; check if gas volume calculation is enabled (again)
-	bra		calc_deko_divemode2e		; NO  - no volume calculation, no simulated bailout plan in no case
-
-	; check if conditions are met to calculate a bailout plan
-	btfsc	is_bailout					; check if a real bailout situation is present
-	bra		calc_deko_divemode2e		; YES - normal plan already does bailout (OC) calculation "for real"
-	btfss	lo,DECO_MODE_LOOP_FLAG		; NO  - have loop mode calculation been done during the normal plan?
-	bra		calc_deko_divemode2e		; NO  - when not in loop mode, no simulated bailout to be done
-	bsf		lo,DECO_PLAN_FLAG			; YES - set flag for alternative plan
-	movff	lo,char_O_deco_status		;       write-back char_O_deco_status to deco engine interface
-	call	get_first_gas_to_WREG		;       get first OC gas, ...
-	call	deco_setup_oc_gases			;       ... set up deco calculations in OC mode with OC gases,
-	;bra	calc_deko_divemode2e		;       ... and start in alternative plan mode
-
-
-calc_deko_divemode2e:
-	clrf	TMR5L
-	clrf	TMR5H						; 30,51757813µs/bit in TMR5L:TMR5H
-	call	deco_calc_hauptroutine		; calc_tissue
+calc_deko_engine_cont:
+	SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine
+	clrf	TMR5L						; restart timer used to preempt stops calculation
+	clrf	TMR5H						;
+	call	deco_calc_hauptroutine		; invoke the deco engine (p2_deco.c)
 	banksel	common
 
-	; Check if deco stops are necessary
-	movff	char_O_first_deco_depth,WREG; get ceiling
-	tstfsz	WREG						; ceiling < 0m (aka in deco) ?
-	bra		calc_deko_divemode3			; YES
-	; NO - within NDL
-	btfsc	decostop_active				; already in no deco mode ?
-	bsf		FLAG_TFT_display_ndl_mask	; NO - clear deco data, display NDL time
+	; check if display shall be updated due to deco engine restart
+	btfsc	FLAG_TFT_display_ndl_or_deko; shall update immediately?
+	bra		calc_deko_engine_update		; YES
+
+	; check if new calculation results for normal plan mode are available
+	movff	char_O_main_status,WREG		; get deco status of deco engine
+	btfss	WREG,DECO_COMPLETED_NORM	; new calculation results for normal plan available?
+	return								; NO  - done
+calc_deko_engine_update:
+	bcf		FLAG_TFT_display_ndl_or_deko; YES - reset flag for immediate update
+	movff	char_O_deco_info,WREG		;     - get deco info vector
+	btfsc	WREG,deco_ceiling			;     - ceiling depth > 0 ?
+	bra		calc_deko_engine_update_deco;       YES - in deco
+	;bra	calc_deko_engine_update_NDL	;       NO  - within NDL
+
+calc_deko_engine_update_NDL:			; within NDL
+	btfsc	decostop_active				; been in deco mode before?
+	bsf		FLAG_TFT_display_ndl_mask	; YES - clear deco data, display NDL time
 	bsf		FLAG_TFT_display_ndl		; display NDL time
-	bcf		decostop_active				; clear flag (again)
+	bcf		decostop_active				; clear flag for been in deco mode before
 	return
 
-calc_deko_divemode3:
-	; YES - in deco
-	btfss	decostop_active				; already in deco mode ?
+calc_deko_engine_update_deco:			; in deco
+	btfss	decostop_active				; already been in deco mode before?
 	bsf		FLAG_TFT_display_deko_mask	; NO - clear NDL time, display deco data
 	bsf		FLAG_TFT_display_deko		; display deco data
 	bsf		FLAG_TFT_display_tts		; display TTS
-	bsf		decostop_active				; set flag (again)
+	bsf		decostop_active				; set flag for being in deco mode
 	return
 
 	; --------------------------------------------------------------------------------------
@@ -521,71 +590,57 @@
 	btfss	s8_digital						 ; check if we have a digital interface to the sensors
 	bra		calc_deko_divemode_sensor_analog ; NO  - check if we have an analog interface
 	btfss	new_s8_data_available			 ; YES - check if a new data frame was received
-	bra		calc_deko_divemode_sensor_common ; NO  - use old values -- TODO: add timeout for no new data
+	bra		calc_deko_divemode_sensor_common ; NO  - use old values
 	call	compute_mvolts_for_all_sensors	 ; YES - compute mV values from digital data
 	bra		calc_deko_divemode_sensor_common
-
+calc_deko_divemode_sensor_analog:
+	btfss	analog_o2_input					; do we have an analog input?
+	bra		calc_deko_divemode_sensor_opt	; NO  - check if we have an optical interface
+	call	get_analog_inputs				; YES - get the analog voltages and continue with the common part
+	bra		calc_deko_divemode_sensor_common
 calc_deko_divemode_sensor_opt:
-	btfss	optical_input				; do we have an optical input?
-	return						; No, return (We have no sensors at all. Not analog, not S8 and not optical)
-	;o2_ppo2_sensor1, o2_ppo2_sensor2 and o2_ppo2_sensor3 are already filled in ISR
-	;clear use_O2_sensorX for timeout case
-	btfss	sensor1_active
-	bcf	use_O2_sensor1
-    	btfss	sensor2_active
-	bcf	use_O2_sensor2
+	btfss	optical_input					; do we have an optical input?
+	return									; NO  - return (we have no sensors at all: not analog, not S8 and not optical)
+	btfss	sensor1_active					; YES - o2_ppo2_sensor1, o2_ppo2_sensor2 and o2_ppo2_sensor3 are already filled in ISR
+	bcf		use_O2_sensor1					;       check HUD status data and eventually clear use_O2_sensorX
+	btfss	sensor2_active
+	bcf		use_O2_sensor2
 	btfss	sensor3_active
-	bcf	use_O2_sensor3
-	bra	calc_deko_divemode_sensor1
-	
-calc_deko_divemode_sensor_analog:
-	btfss	analog_o2_input				; do we have an analog input?
-	bra	calc_deko_divemode_sensor_opt		; NO  - check if we have an optical interface
-	call	get_analog_inputs			; YES - get the analog voltages and continue with the common part
+	bcf		use_O2_sensor3
+	bra		calc_deko_divemode_sensor_A		; continue with calculating sensor average
 
 calc_deko_divemode_sensor_common:
-	; Check for each sensor if it is calibrated and if its mv value is within min_mv and max_mv limits.
-	; If     ok: compute o2_ppo2_sensorX := o2_mv_sensorX * opt_x_sX / 1000
+	; Check each sensor if it is calibrated and if its mV value is within min_mv and max_mv limits.
+	; If     ok: compute o2_ppo2_sensorX = o2_mv_sensorX * opt_x_sX / 1000
 	; If not ok: reset   o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before
 
-	; Check min_mv of sensor 1
+	; check sensor 1
 	btfss	sensor1_calibrated_ok		; check if sensor is usable at all
 	bra		check_sensor_1_fail			; NO  - handle it as failed
-	movff	o2_mv_sensor1+0, sub_a+0	; load sensor mV value
-	movff	o2_mv_sensor1+1, sub_a+1
-	movlw	LOW  min_mv					; load minimum mV value
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - min_mv
+	; check min threshold
+	movff	o2_mv_sensor1+0,sub_a+0		; load sensor mV value
+	movff	o2_mv_sensor1+1,sub_a+1
+	rcall	check_min_threshold
 	btfsc	neg_flag					; check if result is negative, i.e. sensor_mv < min_mv
 	bra		check_sensor_1_fail			; YES - declare sensor as failed
-	; Check max_mv of sensor 1			; NO  - continue with next check
-	movff	o2_mv_sensor1+0, sub_a+0
-	movff	o2_mv_sensor1+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - max_mv
+	; check max_threshold
+	rcall	check_max_threshold
 	btfss	neg_flag					; check if result is negative, i.e. sensor_mv < max_mv
 	bra		check_sensor_1_fail			; NO  - declare sensor as failed
-	; Check HUD data, if available		; YES - continue with next check
+	; check HUD data, if available
 	btfss	hud_connection_ok			; check if there is a HUD connected
 	bra		check_sensor_1_ok			; NO  - all checks done then and positive
-	btfss	sensor1_active				; YES - check HUD report on sensor
-	bra		check_sensor_1_fail			; HUD reports a fail
-
+	btfss	sensor1_active				; YES - HUD status ok?
+	bra		check_sensor_1_fail			;       NO - HUD reports a fail
 check_sensor_1_ok:
-	; o2_ppo2_sensor1 := o2_mv_sensor1:2 * opt_x_s1:2 / 1000
+	; o2_ppo2_sensor1 = o2_mv_sensor1:2 * opt_x_s1:2 / 1000
 	movff	o2_mv_sensor1+0,xA+0
 	movff	o2_mv_sensor1+1,xA+1
 	movff	opt_x_s1+0,xB+0
 	movff	opt_x_s1+1,xB+1
 	rcall	compute_ppo2_helper
-	movff	xC+0,o2_ppo2_sensor1		; result in 0.01bar
+	movff	xC+0,o2_ppo2_sensor1		; result in 0.01 bar
 	bra		check_sensor_2				; continue with next sensor
-
 check_sensor_1_fail:
 	clrf	WREG
 	movff	WREG,o2_ppo2_sensor1		; set ppO2 reading to zero
@@ -594,46 +649,34 @@
 	call	check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met
 check_sensor_1_fail_1:
 	bcf		use_O2_sensor1				; revoke sensor from usage
-	;bra	check_sensor_2				; continue with next sensor
-
-check_sensor_2:							; Check min_mv of sensor 2
+
+check_sensor_2:							; check min_mv of sensor 2
 	btfss	sensor2_calibrated_ok		; check if sensor is usable at all
 	bra		check_sensor_2_fail			; NO  - handle it as failed
-	movff	o2_mv_sensor2+0, sub_a+0	; load sensor mV value
-	movff	o2_mv_sensor2+1, sub_a+1
-	movlw	LOW  min_mv					; load minimum mV value
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - min_mv
+	; check min threshold
+	movff	o2_mv_sensor2+0,sub_a+0		; load sensor mV value
+	movff	o2_mv_sensor2+1,sub_a+1
+	rcall	check_min_threshold
 	btfsc	neg_flag					; check if result is negative, i.e. sensor_mv < min_mv
 	bra		check_sensor_2_fail			; YES - declare sensor as failed
-	; Check max_mv of sensor 2			; NO  - continue with next check
-	movff	o2_mv_sensor2+0, sub_a+0
-	movff	o2_mv_sensor2+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - max_mv
+	; check max_threshold
+	rcall	check_max_threshold
 	btfss	neg_flag					; check if result is nagative, i.e. sensor_mv < max_mv
 	bra		check_sensor_2_fail			; NO  - declare sensor as failed
-	; Check HUD data, if available		; YES - continue with next check
+	; check HUD data, if available
 	btfss	hud_connection_ok			; check if there is a HUD connected
 	bra		check_sensor_2_ok			; NO  - all checks done then and positive
-	btfss	sensor2_active				; YES - check HUD report on sensor
-	bra		check_sensor_2_fail			; HUD reports a fail
-
+	btfss	sensor2_active				; YES - HUD status ok?
+	bra		check_sensor_2_fail			;       NO - HUD reports a fail
 check_sensor_2_ok:
-	; o2_ppo2_sensor2 := o2_mv_sensor2:2 * opt_x_s2:2 / 1000
+	; o2_ppo2_sensor2 = o2_mv_sensor2:2 * opt_x_s2:2 / 1000
 	movff	o2_mv_sensor2+0,xA+0
 	movff	o2_mv_sensor2+1,xA+1
 	movff	opt_x_s2+0,xB+0
 	movff	opt_x_s2+1,xB+1
 	rcall	compute_ppo2_helper
-	movff	xC+0,o2_ppo2_sensor2		; result in 0.01bar
+	movff	xC+0,o2_ppo2_sensor2		; result in 0.01 bar
 	bra		check_sensor_3				; continue with next sensor
-
 check_sensor_2_fail:
 	clrf	WREG
 	movff	WREG,o2_ppo2_sensor2		; set ppO2 reading to zero
@@ -642,186 +685,191 @@
 	call	check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met
 check_sensor_2_fail_1:
 	bcf		use_O2_sensor2				; revoke sensor from usage
-	;bra	check_sensor_3				; continue with next sensor	
-
-check_sensor_3:							; Check min_mv of sensor 2
+
+check_sensor_3:							; check min_mv of sensor 2
 	btfss	sensor3_calibrated_ok		; check if sensor is usable at all
 	bra		check_sensor_3_fail			; NO  - handle it as failed
-	movff	o2_mv_sensor3+0, sub_a+0	; load sensor mV value
-	movff	o2_mv_sensor3+1, sub_a+1
-	movlw	LOW  min_mv					; load minimum mV value
-	movwf	sub_b+0
-	movlw	HIGH min_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - min_mv
+	; check min threshold
+	movff	o2_mv_sensor3+0,sub_a+0		; load sensor mV value
+	movff	o2_mv_sensor3+1,sub_a+1
+	rcall	check_min_threshold
 	btfsc	neg_flag					; check if result is negative, i.e. sensor_mv < min_mv
 	bra		check_sensor_3_fail			; YES - declare sensor as failed
-	; Check max_mv of sensor 2			; NO  - continue with next check
-	movff	o2_mv_sensor3+0, sub_a+0
-	movff	o2_mv_sensor3+1, sub_a+1
-	movlw	LOW  max_mv
-	movwf	sub_b+0
-	movlw	HIGH max_mv
-	movwf	sub_b+1
-	call	sub16						; sub_c = sensor_mv - max_mv
+	; check max threshold
+	rcall	check_max_threshold
 	btfss	neg_flag					; check if result is negative, i.e. sensor_mv < max_mv
 	bra		check_sensor_3_fail			; NO  - declare sensor as failed
-	; Check HUD data, if available		; YES - continue with next check
+	; check HUD data, if available
 	btfss	hud_connection_ok			; check if there is a HUD connected
 	bra		check_sensor_3_ok			; NO  - all checks done then and positive
-	btfss	sensor3_active				; YES - check HUD report on sensor
-	bra		check_sensor_3_fail			; HUD reports a fail
-
+	btfss	sensor3_active				; YES - HUD status ok?
+	bra		check_sensor_3_fail			;       NO - HUD reports a fail
 check_sensor_3_ok:
-	; o2_ppo2_sensor3 := o2_mv_sensor3:2 * opt_x_s1:2 / 1000
+	; o2_ppo2_sensor3 = o2_mv_sensor3:2 * opt_x_s1:2 / 1000
 	movff	o2_mv_sensor3+0,xA+0
 	movff	o2_mv_sensor3+1,xA+1
 	movff	opt_x_s3+0,xB+0
 	movff	opt_x_s3+1,xB+1
 	rcall	compute_ppo2_helper
-	movff	xC+0,o2_ppo2_sensor3		; result in 0.01bar
-	bra		calc_deko_divemode_sensor1	; continue with calculating sensor average
-
+	movff	xC+0,o2_ppo2_sensor3		; result in 0.01 bar
+	bra		calc_deko_divemode_sensor_A	; continue with calculating sensor average
 check_sensor_3_fail:
 	clrf	WREG
 	movff	WREG,o2_ppo2_sensor3		; set ppO2 reading to zero
 	btfss	use_O2_sensor3				; check if sensor was in use before
 	bra		check_sensor_3_fail_1		; NO  - no new news then
-	call	check_sensor_custview_helper; YES - show customview 1 (sensor values) on further conditions met
+	call	check_sensor_custview_helper; YES - show custom view 1 (sensor values) on further conditions met
 check_sensor_3_fail_1:
 	bcf		use_O2_sensor3				; revoke sensor from usage
-	;bra	calc_deko_divemode_sensor1	; continue with calculating sensor average
-
-calc_deko_divemode_sensor1:				; calculate sensor average
-	; exit here if not in divemode
+
+calc_deko_divemode_sensor_A:			; calculate sensor average
+	; exit here if not in dive mode
 	btfss	divemode
 	return
 
-	; compute sensor_setpoint := average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true
+	; compute sensor_setpoint = average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true
 	; sum up sensor values (in xA:2) and active sensors in (xB:2)
 	clrf	xB+0
 	clrf	xB+1
 	clrf	xA+0
 	clrf	xA+1
-	btfss	use_O2_sensor1				; Sensor1 active?
-	bra		divemode_setup_sensor_values2 ; No
+divemode_setup_sensor_1_value:
+	btfss	use_O2_sensor1					; sensor1 active?
+	bra		divemode_setup_sensor_2_value	; NO
 	movf	o2_ppo2_sensor1,W
-	addwf	xA+0
+	addwf	xA+0,F
 	movlw	.0
-	addwfc	xA+1						; Add into xA:2
-	incf	xB+0,F						; Add a sensor
-divemode_setup_sensor_values2:
-	btfss	use_O2_sensor2				; Sensor2 active?
-	bra		divemode_setup_sensor_values3 ; No
+	addwfc	xA+1,F							; add into xA:2
+	incf	xB+0,F							; add a sensor
+divemode_setup_sensor_2_value:
+	btfss	use_O2_sensor2					; sensor2 active?
+	bra		divemode_setup_sensor_3_value	; NO
 	movf	o2_ppo2_sensor2,W
-	addwf	xA+0
+	addwf	xA+0,F
 	movlw	.0
-	addwfc	xA+1						; Add into xA:2
-	incf	xB+0,F						; Add a sensor
-divemode_setup_sensor_values3:
-	btfss	use_O2_sensor3				; Sensor3 active?
-	bra		divemode_setup_sensor_values4 ; No
+	addwfc	xA+1,F							; add into xA:2
+	incf	xB+0,F							; add a sensor
+divemode_setup_sensor_3_value:
+	btfss	use_O2_sensor3					; sensor3 active?
+	bra		divemode_setup_sensor_mean		; NO
 	movf	o2_ppo2_sensor3,W
-	addwf	xA+0
+	addwf	xA+0,F
 	movlw	.0
-	addwfc	xA+1						; Add into xA:2
-	incf	xB+0,F						; Add a sensor
-
-	; Divide sum of sensor values by number of active sensors found.
-divemode_setup_sensor_values4:
-	call	div16x16					; xA/xB=xC with xA+0 as remainder
-	movff	xC+0,sensor_setpoint		; copy result
-
-	; set default value for pSCR mode: 0 = let p2_deco.c compute the ppO2 based on current dil gas and depth
+	addwfc	xA+1,F							; add into xA:2
+	incf	xB+0,F							; add a sensor
+
+	; divide sum of sensor values by number of active sensors found
+divemode_setup_sensor_mean:
+	clrf	xC+0							; set zero as default result
+	tstfsz	xB+0							; pending div/0 ?
+	call	div16x16						; NO - execute xC = xA / xB = summed ppO2 / number of sensors
+	movff	xC+0,sensor_setpoint			; copy result (or its default)
+
+	; set default value for pSCR mode: 0 => let p2_deco.c compute the ppO2 based on current dil gas and depth
 	; will be overwritten later in case we are in sensor mode and have at least one usable sensor
-	clrf	WREG						; preload a zero
-	btfsc	FLAG_pscr_mode				; check if we are in pSCR mode
-	movff	WREG,char_I_const_ppO2		; YES - write 0 to char_I_const_ppo2,
-										;		it will be overwritten if we have a usable sensor reading
-
-	btfsc	is_bailout					; check if we are in bailout
-	bra		calc_deko_divemode_sensor2	; YES - no sensor data transfer to char_I_const_ppO2 in this case
-	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor, =2: Auto SP
-	sublw	.1							; opt_ccr_mode = 1 (Sensor)?
-	bnz		calc_deko_divemode_sensor2	; not in sensor mode - no transfer of sensor data to char_I_const_ppO2
-	tstfsz	xB+0						; check if we have found at least one usable sensor
-	bra		calc_deko_divemode_sensor1a	; YES - we have at least one usable sensor
-	bsf		setpoint_fallback			; NO  - we have NO usable sensors -> initiate fallback
-	btfss	FLAG_ccr_mode				; check if we are in CCR mode
-	bra		calc_deko_divemode_sensor2	; NO  - continue with voting logic flags
-	movff	char_I_setpoint_cbar+0,char_I_const_ppO2	; YES - select fixed setpoint no. 1 for fallback
-	bra		calc_deko_divemode_sensor2	; done - continue with voting logic flags
-calc_deko_divemode_sensor1a:			; we have at least one usable sensor with a value > 0
-	bcf		setpoint_fallback			; clear fallback condition
+	clrf	WREG								; preload a zero
+	btfsc	FLAG_pscr_mode						; check if we are in pSCR mode
+	movff	WREG,char_I_const_ppO2				; YES - write 0 to char_I_const_ppo2,
+												;       it will be overwritten if we have a usable sensor reading
+	btfsc	FLAG_bailout_mode					; check if we are in bailout
+	bra		calc_deko_divemode_sensor_V			; YES - no sensor data transfer to char_I_const_ppO2 in this case
+	movff	opt_ccr_mode,WREG					; NO  - get mode (0: Fixed SP, 1: Sensor, 2: Auto SP)
+	sublw	.1									;     - in sensor mode?
+	bnz		calc_deko_divemode_sensor_V			;       NO  - not in sensor mode - no transfer of sensor data to char_I_const_ppO2
+	tstfsz	xB+0								;       YES - check if we have found at least one usable sensor
+	bra		divemode_setup_sensor_mean1			;             YES - we have at least one usable sensor
+	bsf		setpoint_fallback					;             NO  - we have NO usable sensors -> initiate fallback
+	btfss	FLAG_ccr_mode						;                 - check if we are in CCR mode
+	bra		calc_deko_divemode_sensor_V			;                   NO  - continue with voting logic flags
+	movff	char_I_setpoint_cbar+0,char_I_const_ppO2;               YES - select fixed setpoint no. 1 for fallback
+	bra		calc_deko_divemode_sensor_V			;                       - continue with voting logic flags
+	; we have at least one usable sensor with a ppO2 value > 0
+divemode_setup_sensor_mean1:
+	bcf		setpoint_fallback					; clear fallback condition
 	movff	sensor_setpoint,char_I_const_ppO2	; transfer average sensor value to p2_deco.c code
-	;bra	calc_deko_divemode_sensor2
-
-calc_deko_divemode_sensor2:
+	; vote sensors
+calc_deko_divemode_sensor_V:
 	bsf		voting_logic_sensor1
 	movff	o2_ppo2_sensor1,lo
 	rcall	check_sensor_voting_helper
-	incfsz	WREG						; Was WREG = 255?
-	bcf		voting_logic_sensor1		; No, ignore this sensor
+	tstfsz	WREG						; sensor within range (WREG = 0)?
+	bcf		voting_logic_sensor1		; NO - vote out this sensor
 
 	bsf		voting_logic_sensor2
 	movff	o2_ppo2_sensor2,lo
 	rcall	check_sensor_voting_helper
-	incfsz	WREG						; Was WREG=255?
-	bcf		voting_logic_sensor2		; No, ignore this sensor
+	tstfsz	WREG						; sensor within range (WREG = 0)?
+	bcf		voting_logic_sensor2		; NO - vote out this sensor
 
 	bsf		voting_logic_sensor3
 	movff	o2_ppo2_sensor3,lo
 	rcall	check_sensor_voting_helper
-	incfsz	WREG						; Was WREG=255?
-	bcf		voting_logic_sensor3		; No, ignore this sensor
+	tstfsz	WREG						; sensor within range (WREG = 0)?
+	bcf		voting_logic_sensor3		; NO - vote out this sensor
 
 	; check if a warning shall be issued on sensor disagreement
-
 	btfsc	FLAG_ccr_mode				; check if we are in CCR mode
-	bra		check_warn_sensor_1			; YES - continue with further checks
+	bra		check_warn_sensor_0			; YES - continue with further checks
 	btfsc	FLAG_pscr_mode				; check if we are in pSCR mode
-	bra		check_warn_sensor_1			; YES - continue with further checks
-	bra		check_warn_sensor_agree		; not in CCR and not in pSCR, so no warning
-check_warn_sensor_1:					; we are in CCR or pSCR mode
-	btfsc	is_bailout					; check if we are in bailout
-	bra		check_warn_sensor_agree		; YES - no warning in this case
-	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor, =2: Auto SP
-	sublw	.1							; opt_ccr_mode = 1 (Sensor)?
-	bnz		check_warn_sensor_agree		; not in sensor mode - no warning in this case
-										; check sensor 1
+	bra		check_warn_sensor_0			; YES - continue with further checks
+	bra		check_warn_sensor_done		; not in CCR and not in pSCR, so no warning
+check_warn_sensor_0:					; we are in CCR or pSCR mode
+	btfsc	FLAG_bailout_mode			; check if we are in bailout
+	bra		check_warn_sensor_done		; YES - no warning in this case
+	movff	opt_ccr_mode,WREG			; get mode (0: Fixed SP, 1: Sensor, 2: Auto SP)
+	sublw	.1							; in sensor mode?
+	bnz		check_warn_sensor_done		; NO - not in sensor mode - no warning in this case
+	; check sensor 1
+check_warn_sensor_1:
 	btfss	sensor1_calibrated_ok		; check if sensor has a valid calibration
 	bra		check_warn_sensor_2			; NO  - sensor can not cause a warning then
 	btfss	use_O2_sensor1				; YES - check if sensor is in use
-	bra		check_warn_sensor_2			; NO  - sensor can not cause a warning then
-	btfsc	voting_logic_sensor1		; YES - check if sensor value is within agreement range
-	bra		check_warn_sensor_2			; YES - continue with next sensor
-	bcf		sensors_agree				; NO  - issue a warning
+	bra		check_warn_sensor_2			;       NO  - sensor can not cause a warning then
+	btfsc	voting_logic_sensor1		;       YES - check if sensor value is within agreement range
+	bra		check_warn_sensor_2			;             YES - continue with next sensor
+	bcf		sensors_agree				;             NO  - issue a warning
 	return
-
-check_warn_sensor_2:					; check sensor 2
+	; check sensor 2
+check_warn_sensor_2:
 	btfss	sensor2_calibrated_ok		; check if sensor has a valid calibration
 	bra		check_warn_sensor_3			; NO  - sensor can not cause a warning then
 	btfss	use_O2_sensor2				; YES - check if sensor is in use
-	bra		check_warn_sensor_3			; NO  - sensor can not cause a warning then
-	btfsc	voting_logic_sensor2		; YES - check if sensor value is within agreement range
-	bra		check_warn_sensor_3			; YES - continue with next sensor
-	bcf		sensors_agree				; NO  - issue a warning
+	bra		check_warn_sensor_3			;       NO  - sensor can not cause a warning then
+	btfsc	voting_logic_sensor2		;       YES - check if sensor value is within agreement range
+	bra		check_warn_sensor_3			;             YES - continue with next sensor
+	bcf		sensors_agree				;             NO  - issue a warning
 	return
-
-check_warn_sensor_3:					; check sensor 2
+	; check sensor 3
+check_warn_sensor_3:
 	btfss	sensor3_calibrated_ok		; check if sensor has a valid calibration
 	bra		check_warn_sensor_agree		; NO  - sensor can not cause a warning then
 	btfss	use_O2_sensor3				; YES - check if sensor is in use
-	bra		check_warn_sensor_agree		; NO  - sensor can not cause a warning then
-	btfsc	voting_logic_sensor3		; YES - check if sensor value is within agreement range
-	bra		check_warn_sensor_agree		; YES - continue with next sensor
-	bcf		sensors_agree				; NO  - issue a warning
+	bra		check_warn_sensor_agree		;       NO  - sensor can not cause a warning then
+	btfsc	voting_logic_sensor3		;       YES - check if sensor value is within agreement range
+	bra		check_warn_sensor_agree		;             YES - continue with next sensor
+	bcf		sensors_agree				;             NO  - issue a warning
 	return
-
+	; no need for a warning
+check_warn_sensor_done:
 check_warn_sensor_agree:
 	bsf		sensors_agree
 	return
 
+
+check_min_threshold:
+	movlw	LOW  min_mv					; load minimum mV value
+	movwf	sub_b+0
+	movlw	HIGH min_mv
+	movwf	sub_b+1
+	goto	sub16						; sub_c = sensor_mv - min_mv (and return)
+
+check_max_threshold:
+	movlw	LOW  max_mv
+	movwf	sub_b+0
+	movlw	HIGH max_mv
+	movwf	sub_b+1
+	goto	sub16						; sub_c = sensor_mv - max_mv (and return)
+
 compute_ppo2_helper:
 	call	mult16x16					; xA:2*xB:2=xC:4
 	movlw	LOW  .1000
@@ -834,75 +882,83 @@
 	movlw	d'0'
 	addwfc	xC+1,W						; we are still just interested in the carry flag
 	tstfsz	WREG						; ppO2 is higher than 2.55bar?
-	setf	xC+0						; Yes.
+	setf	xC+0						; YES
 	return
 
 check_sensor_custview_helper:
-	btfss	divemode					; check if we are in divemode
+	btfss	divemode					; check if we are in dive mode
 	return								; NO  - not in dive mode, return
-	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor, =2: Auto SP
-	sublw	.1							; opt_ccr_mode = 1 (Sensors)?
-	bnz		check_sensor_helper_1		; NO  - not using the sensors in the moment
-	clrf	menupos3					; YES - arm customview 1 (sensor values)
-	bsf		toggle_customview			;       and request a customview toggle
-check_sensor_helper_1:
+	movff	opt_ccr_mode,WREG			; YES - =0: Fixed SP, =1: Sensor, =2: Auto SP
+	decfsz	WREG,W						;     - opt_ccr_mode = 1 (sensors)?
+	return								;       NO  - not using the sensors in the moment
+	btfsc	alternative_divelayout		;       YES - in alternative layout?
+	call	switch_layout_to_normal		;             YES - switch to normal layout
+	movlw	index_ppo2_sensors-1		;             custom view number one below ppO2 sensors
+	movwf	menupos3					;             set custom view number
+	bsf		toggle_customview			;             initiate toggle to desired custom view -> ppO2 sensors
 	return
 
-
 check_sensor_voting_helper:
 	movf	lo,W
 	cpfsgt	sensor_setpoint
-	bra		check_sensor_voting_common2	; lo < sensor_setpoint
+	bra		check_sensor_voting_helper2		; lo < sensor_setpoint
 	; lo > sensor_setpoint
 	movf	lo,W
 	subwf	sensor_setpoint,W
 	movwf	lo
-check_sensor_voting_common1:
-	movlw	sensor_voting_logic_threshold ; Threshold in 0.01 bar
+check_sensor_voting_helper1:
+	movlw	sensor_voting_logic_threshold	; threshold in 0.01 bar
 	cpfsgt	lo
-	retlw	.255						; Within range
-	retlw	.0							; Out of range
-check_sensor_voting_common2:
-	; lo<sensor_setpoint
+	retlw	.0								; within range
+	retlw	.1								; out of range
+check_sensor_voting_helper2:
+	; lo < sensor_setpoint
 	movf	sensor_setpoint,W
 	subwf	lo,F
-	bra		check_sensor_voting_common1
+	bra		check_sensor_voting_helper1
 
 ;-----------------------------------------------------------------------------
 
-divemodemode_togglegf:								; Toggle aGF/GF
-	bcf		toggle_gf								; clear flag
-	btg		use_agf									; toggle GF
-
-	btfsc	use_agf									; switch to aGF?
+divemodemode_togglegf:								; toggle aGF/GF
+	bcf		toggle_gf								; clear command flag
+	btg		use_agf									; toggle status flag for GF
+
+	btfsc	use_agf									; aGF activated?
 	bra		divemodemode_togglegf_1					; YES - branch to using aGF
 	movff	opt_GF_low,char_I_GF_Low_percentage		; NO  - use normal GF factors
-	movff	opt_GF_high,char_I_GF_High_percentage	;
-	bra		divemodemode_togglegf_2					;       continue with common part
-
-divemodemode_togglegf_1:							; use alternative GF factors
-	movff	opt_aGF_low,char_I_GF_Low_percentage
-	movff	opt_aGF_high,char_I_GF_High_percentage
-
+	movff	opt_GF_high,char_I_GF_High_percentage	;     -
+	bra		divemodemode_togglegf_2					;     - continue with common part
+divemodemode_togglegf_1:
+	movff	opt_aGF_low,char_I_GF_Low_percentage	; YES - use alternative GF factors
+	movff	opt_aGF_high,char_I_GF_High_percentage	;     -
 divemodemode_togglegf_2:
-	call	TFT_gf_mask								; update customview mask to show which one is in use
-													; the customview itself has been called from divemenu_tree before
+	call	TFT_gf_factors_mask						; update custom view mask to show which one is in use
+													; the custom view itself has been called from divemenu_tree before
 	goto	restart_deco_engine						; ...and return
 
 
-calc_velocity:									; called every two seconds
+ IFDEF _cave_mode
+divemodemode_toggleturn:
+	bcf		toggle_turn_dive						; clear command flag
+	btg		FLAG_dive_turned						; toggle dive turned state
+	btfsc	FLAG_cave_mode_shutdown					; cave mode function shut down?
+	bsf		FLAG_dive_turned						; YES - allow only activating turned state
+	goto	set_logbook_marker						; set a logbook marker (and return)
+ ENDIF
+
+calc_velocity:										; called every two seconds
 	btfsc	display_velocity
-	bra		calc_velocity1						; Always update if already displayed
+	bra		calc_velocity1							; always update if already displayed
 	btfss	divemode2
-	return										; display velocity only if deeper then 1m (Not at the surface after the dive)
+	return											; display velocity only if deeper then 1m (Not at the surface after the dive)
 calc_velocity1:
 	SAFE_2BYTE_COPY amb_pressure, sub_a
 	movff	last_pressure_velocity+0,sub_b+0
 	movff	last_pressure_velocity+1,sub_b+1
-	movff	sub_a+0,last_pressure_velocity+0	; store old value for velocity
+	movff	sub_a+0,last_pressure_velocity+0		; store old value for velocity
 	movff	sub_a+1,last_pressure_velocity+1
 
-	call	subU16								; sub_c = amb_pressure - last_pressure
+	call	subU16									; sub_c = amb_pressure - last_pressure
 
 	bcf		neg_flag_velocity
 	btfsc	neg_flag
@@ -917,13 +973,12 @@
 	movff	xC+0,divA+0
 	movff	xC+1,divA+1
 	movlw	d'7'
-	movwf	divB+0
-	call	div16						; divided by 2^7 equals velocity in m/min
+	call	div16						; divA = divA / 2^WREG, divide by 2^7 equals velocity in m/min
 
 	movlw	d'99'
-	cpfsgt	divA+0						; limit to 99m/min
-	bra		calc_velocity3
-	movwf	divA+0						; divA=99
+	cpfsgt	divA+0						; velocity > 99 m/min ?
+	bra		calc_velocity3				; NO
+	movwf	divA+0						; YES - set divA = 99
 
 calc_velocity3:
 	; Copy old speeds
@@ -948,19 +1003,19 @@
 ;	addwf	divA+0,F					; add old speed
 ;	bcf		STATUS,C
 ;	rrcf	divA+0,F					; /2
-	goto	TFT_display_velocity		; With divA+0 = m/min..., and return...
+	goto	TFT_display_velocity		; with divA+0 = m/min..., and return...
 
 
 ;=============================================================================
 
-set_reset_safety_stop:					; Set flags for safety stop and/or reset safety stop
-	TSTOSS	opt_enable_safetystop		; =1: A safety stop is shown
-	bra		delete_safety_stop			; No, don't show safety stop
-
-	btfsc	decostop_active				; Is a deco stop displayed?
-	bra		delete_safety_stop			; Yes, don't show safety stop
-
-	; Below "opt_safety_stop_reset"? Set flag and reset count-down timer
+set_reset_safety_stop:					; set flags for safety stop and/or reset safety stop
+	TSTOSS	opt_enable_safetystop		; safety stop enabled? (=1: show safety stop)
+	bra		delete_safety_stop			; NO - don't show safety stop
+
+	btfsc	decostop_active				; is a deco stop displayed?
+	bra		delete_safety_stop			; YES - don't show safety stop
+
+	; Below "opt_safety_stop_reset"? if yes, set flag and reset count-down timer
 	SAFE_2BYTE_COPY rel_pressure, lo
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
 	movff	lo,sub_a+0
@@ -971,51 +1026,43 @@
 	movff	PRODH,sub_b+1
 	call	subU16						; sub_c = sub_a - sub_b
 	btfss	neg_flag
-	bra		reset_safety_stop			; Below 10m, reset safety stop
-
-	; Above "opt_safety_stop_end"? Clear flag.
-	SAFE_2BYTE_COPY rel_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	movff	lo,sub_a+0
-	movff	hi,sub_a+1
+	bra		reset_safety_stop			; below 10m, reset safety stop
+
+	; Above "opt_safety_stop_end"? if yes ,clear flag
 	movff	opt_safety_stop_end,WREG	; [cbar]
 	mullw	.10							; mbar in PRODL:H
-	movff	PRODL,sub_b+0
+	movff	PRODL,sub_b+0				; sub_a is still loaded with adjusted rel_pressure
 	movff	PRODH,sub_b+1
 	call	subU16						; sub_c = sub_a - sub_b
 	btfsc	neg_flag
-	bra		delete_safety_stop			; Above 3m, remove safety stop
-
-	; Above "opt_safety_stop_start"? Activate safety stop
-	SAFE_2BYTE_COPY rel_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	movff	lo,sub_a+0
-	movff	hi,sub_a+1
+	bra		delete_safety_stop			; above 3m, remove safety stop
+
+	; Above "opt_safety_stop_start"? if yes, activate safety stop
 	movff	opt_safety_stop_start,WREG	; [cbar]
 	mullw	.10							; mbar in PRODL:H
-	movff	PRODL,sub_b+0
+	movff	PRODL,sub_b+0				; sub_a is still loaded with adjusted rel_pressure
 	movff	PRODH,sub_b+1
 	call	subU16						; sub_c = sub_a - sub_b
 	btfsc	neg_flag
-	bra		acivate_safety_stop			; Above 5m, activate safety stop
-	bra		reset_safety_stop2			; Pause safety stop
+	bra		acivate_safety_stop			; above 5m, activate safety stop
+	bra		reset_safety_stop2			; pause safety stop
 
 acivate_safety_stop:
-	tstfsz	safety_stop_countdown		; Countdown at zero?
-	bsf		show_safety_stop			; No, Set flag!
+	tstfsz	safety_stop_countdown		; countdown at zero?
+	bsf		show_safety_stop			; NO - set flag
 	return
 
 delete_safety_stop:
 	clrf	safety_stop_countdown		; reset timer
-	bra		reset_safety_stop2			; Remove safety stop from display
+	bra		reset_safety_stop2			; remove safety stop from display
 
 reset_safety_stop:
 	movff	opt_safety_stop_length,safety_stop_countdown ; reset timer
 reset_safety_stop2:
-	bcf		show_safety_stop			; Clear flag
-	btfss	safety_stop_active			; Safety stop shown
-	return								; No, don't delete it
-	bcf		safety_stop_active			; Clear flag
+	bcf		show_safety_stop			; clear flag
+	btfss	safety_stop_active			; safety stop shown?
+	return								; NO - don't delete it
+	bcf		safety_stop_active			; clear flag
 	bsf		FLAG_TFT_clear_safety_stop	; Clear safety stop
 	return
 
@@ -1023,27 +1070,28 @@
 ;=============================================================================
 
 timeout_menuview:
-	decfsz	timeout_counter2,F			; timeout for menuview
-	return								; No timeout, return
+	decfsz	timeout_counter2,F			; timeout for menu view?
+	return								; NO - done
 	; Timeout, clear e.g. "Menu?"
-	goto	menuview_toggle_reset		; "returns"
+	goto	menuview_toggle_reset		; ...and return
 
 timeout_divemode_menu:
 	decfsz	timeout_counter2,F			; timeout for divemode menu
 	return
 
 	global	timeout_divemode_menu2
-timeout_divemode_menu2:					; Called from divemenu_tree.asm
-	bcf		divemode_menu				; Timeout! Clear flag
-	call	TFT_clear_divemode_menu		; Clear menu
-	bsf		FLAG_TFT_active_gas_divemode; Redraw gas/setpoint/diluent
-	bcf		blinking_better_gas			; Clear flag to have temperature updated once
-	bsf		FLAG_TFT_temp_divemode		; Displays temperature
-	call	TFT_draw_gassep_line		; Gas separator grid in spec mode only
-
-	btfss	decostop_active				; In deco mode ?
-	bra		timeout_divemode_menu_ndl	; No, show NDL again
-	; Show deco
+timeout_divemode_menu2:					; called from divemenu_tree.asm
+	bcf		divemode_menu				; timeout, clear flag
+	call	TFT_clear_divemode_menu		; clear menu
+	bsf		FLAG_TFT_active_gas_divemode; redraw gas/setpoint/diluent
+	bcf		blinking_better_gas			; clear flag to have temperature updated once
+	bcf		blinking_better_dil			; clear flag to have temperature updated once
+	bsf		FLAG_TFT_temp_divemode		; display temperature
+	call	TFT_draw_gassep_line		; gas separator grid in spec mode only
+
+	btfss	decostop_active				; in deco mode ?
+	bra		timeout_divemode_menu_ndl	; NO - show NDL again
+	; Show deco data
 	bsf		FLAG_TFT_display_deko_mask
 	bsf		FLAG_TFT_display_deko
 	bsf		FLAG_TFT_display_tts
@@ -1056,37 +1104,37 @@
 	return
 
 timeout_divemode:
-	btfsc	divemode_menu				; Divemode menu active?
-	rcall	timeout_divemode_menu		; Yes, check the timeout for it...
-
-	btfsc	menuview					; is a menuview shown?
-	rcall	timeout_menuview			; Yes, check the timeout for it...
-
-	btfss	realdive					; Dive longer then one minute
-	return
-
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	bra		timeout_divemode2			; Yes, use apnoe_timeout [min] for timeout
-
-	ifndef __DEBUG
-		btfsc	simulatormode_active	; In Simulator mode?
-		bra		timeout_divemode3		; Yes, use simulator timeout
-	endif
-
-	bcf		divemode
-	infsnz	timeout_counter1+0,F
+	btfsc	divemode_menu				; divemode menu active?
+	rcall	timeout_divemode_menu		; YES - check the timeout for it...
+
+	btfsc	menuview					; is a menu view shown?
+	rcall	timeout_menuview			; YES - check the timeout for it...
+
+	btfss	realdive					; dive longer than one minute?
+	return								; NO  - done
+
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	bra		timeout_divemode2			; YES - use apnoe_timeout [min] for timeout
+
+ IFNDEF __DEBUG
+	btfsc	simulatormode_active		; in simulator mode?
+	bra		timeout_divemode3			; YES - use simulator timeout
+ ENDIF
+
+	bcf		divemode					; terminate divemode my default
+	infsnz	timeout_counter1+0,F		; increment timeout counter
 	incf	timeout_counter1+1,F		; timeout is 16 bit counter
 
-	movff	opt_diveTimeout,WREG		; in [min]
-	mullw	.60
+	movff	opt_diveTimeout,WREG		; get timeout in minutes
+	mullw	.60							; convert into seconds
 	movff	PRODL,sub_a+0
-	movff	PRODH,sub_a+1				; in [s]
+	movff	PRODH,sub_a+1
 
 	movff	timeout_counter1+0,sub_b+0
 	movff	timeout_counter1+1,sub_b+1
 	call	subU16						; sub_c = sub_a - sub_b
-	btfss	neg_flag					; Result negative?
-	bsf		divemode					; No, set flag
+	btfss	neg_flag					; result negative, i.e. timeout?
+	bsf		divemode					; NO - set divemode flag again
 	return
 
 timeout_divemode2:
@@ -1113,36 +1161,59 @@
 
 update_divemode60:						; update any minute
 	call	get_battery_voltage			; gets battery voltage
-	rcall	set_powersafe				; Battery low?
-	call	customview_minute			; Do every-minute tasks for the custom view area
+	rcall	set_powersafe				; check if battery low
+	;call	customview_minute			; do every-minute tasks for the custom view area
 	bcf		oneminupdate
-
+ IFDEF _cave_mode
+	movlw	.1							; prepare to add backtrack data for 1 minute
+	btfsc	FLAG_cave_mode				; cave mode enabled?
+	rcall	update_backtrack			; YES - make it so
+ ENDIF
 	btfss	simulatormode_active		; in simulator mode?
-	return								; No
-	; Yes, quite dive mode simulation after 21*256s=89min:36s
-	movlw	.20
-	cpfsgt	total_divetime_seconds+1	; Timeout?
-	return								; No
-
-	ifdef __DEBUG
-		return							; No simulator timeout in debug mode
-	endif
-
-	bra		divemode_option1			; Yes, set to 0m and "return"
+	return								; NO  - done
+	movlw	.20							; YES - quite dive mode simulation after 21 * 256 sec = 89 min : 36 sec
+	cpfsgt	total_divetime_seconds+1	; timeout?
+	return								; NO  - done
+ IFDEF __DEBUG
+	return								; YES -  but no timeout in debug mode
+ ENDIF
+	bra		divemode_option1			; YES - set depth to 0 m and "return"
+
+ IFDEF _cave_mode
+update_backtrack:
+	btfsc	FLAG_dive_turned			; dive turned?
+	return								; YES - done
+	movwf	lo							; store minutes to add in lo
+	lfsr	FSR1,char_I_backtrack_depth ; load FSR1 with base address of backtrack storage
+	movff	char_I_backtrack_time,FSR1L	; adjust FSR1 to last index
+update_backtrack_loop:
+	btfsc	FLAG_cave_mode_shutdown		; backtrack storage full?
+	return								; YES - done
+	movff	curr_depth,PREINC1			; NO  - increment index and write current depth to backtrack storage
+	incfsz	FSR1L,W						;     - did a wrap-around of the index occur (backtrack storage full)?
+	bra		update_backtrack_loop_1		;       NO  - continue loop
+	bsf		FLAG_cave_mode_shutdown		;       YES - flag backtrack storage as being full
+	return
+update_backtrack_loop_1:
+	decfsz	lo,F						; decrement loop counter, did it became zero?
+	bra		update_backtrack_loop		; NO  - loop
+	movff	FSR1L,char_I_backtrack_time	; YES - read-back index
+	return								;     - done
+ ENDIF
 
 set_max_depth:
 	movff	max_pressure+0,sub_a+0
 	movff	max_pressure+1,sub_a+1
 	SAFE_2BYTE_COPY rel_pressure, sub_b
 	call	subU16						; sub_c = sub_a - sub_b
-										; max_pressure<rel_pressure -> neg_flag=1
-										; rel_pressure<=max_pressure -> neg_flag=0
+										; max_pressure <  rel_pressure -> neg_flag=1
+										; rel_pressure <= max_pressure -> neg_flag=0
 	btfss	neg_flag
 	return
-										; max_pressure<rel_pressure
+										; max_pressure < rel_pressure
 	movff	sub_b+0,max_pressure+0
 	movff	sub_b+1,max_pressure+1
-	bsf		FLAG_TFT_max_depth			; Set flag
+	bsf		FLAG_TFT_max_depth			; set flag
 	return
 
 set_min_temp:
@@ -1150,8 +1221,8 @@
 	movff	minimum_temperature+1,sub_a+1
 	SAFE_2BYTE_COPY temperature,sub_b
 	call	sub16						; sub_c = sub_a - sub_b
-										; minimum_temperature<T -> neg_flag=1
-										; T<=minimum_temperature -> neg_flag=0
+										; minimum_temperature < T  -> neg_flag=1
+										; T <= minimum_temperature -> neg_flag=0
 	btfsc	neg_flag
 	return
 	; minimum_temperature >= T
@@ -1161,8 +1232,8 @@
 
 	global	set_dive_modes
 set_dive_modes:
-	btfsc	high_altitude_mode			; In high altitude (Fly) mode?
-	bra		set_dive_modes3				; Yes!
+	btfsc	high_altitude_mode			; in high altitude (fly) mode?
+	bra		set_dive_modes3				; YES
 
 set_dive_modes0:
 	movlw	LOW  start_dive_threshold
@@ -1177,23 +1248,22 @@
 	btfss	neg_flag
 	bra		set_dive_modes2				; too shallow (rel_pressure < dive_threshold)
 
-	btfsc	realdive					; Dive longer than one minute?
-	clrf	timeout_counter1+0			; Yes, reset timeout counter +++
-
-	bsf		divemode					; (Re-)Set divemode flag
+	btfsc	realdive					; dive longer than one minute?
+	clrf	timeout_counter1+0			; YES - reset timeout counter
+
+	bsf		divemode					; (re-)set divemode flag
 	bsf		divemode2					; displayed divetime is running
 	return
 
 set_dive_modes2:
-	bcf		divemode2					; Stop time
+	bcf		divemode2					; stop time
 	btfss	realdive					; dive longer then one minute?
-	bcf		divemode					; no -> this was no real dive
-	return								; No, return
-
-
-set_dive_modes3:						; High-altitude mode
+	bcf		divemode					; NO  - this was no real dive
+	return								; YES - return
+
+set_dive_modes3:						; high-altitude mode
 	btfsc	realdive					; dive longer then one minute?
-	bra		set_dive_modes0				; Yes -> this is a real dive -> Use start_dive_threshold or ascend
+	bra		set_dive_modes0				; YES - this is a real dive -> Use start_dive_threshold or ascend
 
 	movlw	LOW  high_altitude_dive_threshold
 	movwf	sub_a+0
@@ -1206,181 +1276,181 @@
 	cpfslt	batt_percent
 	return
 
-	movlw	d'7'						; Type of Alarm (Battery Low)
-	movwf	AlarmType					; Copy to Alarm Register
+	movlw	d'7'						; type of alarm (battery Low)
+	movwf	AlarmType					; copy to alarm register
 	bsf		event_occured				; set event flag
 	movlw	.0
-	movff	WREG,opt_brightness			; Set Brightness to ECO
+	movff	WREG,opt_brightness			; set brightness to ECO
 	return								; return
 
+
+reset_average:
+	bcf		reset_average_depth			; clear reset-average flag
+	clrf	average_depth_hold+0		; clear the depth accumulator
+	clrf	average_depth_hold+1		; ...
+	clrf	average_depth_hold+2		; ...
+	clrf	average_depth_hold+3		; ...
+	clrf	average_divesecs+0			; clear the time accumulator
+	clrf	average_divesecs+1			; ...
+	SAFE_2BYTE_COPY rel_pressure,avg_rel_pressure ; prime result with current rel.pressure/depth
+	return
+
+
 calc_average_depth:
-	btfsc	reset_average_depth			; Reset the Average depth?
-	rcall	reset_average1				; Reset the resettable average depth
-
-	; 1. Add new 2xdepth to the Sum of depths registers
-	SAFE_2BYTE_COPY rel_pressure,xB		; Buffer...
+	; 1. compute rel_pressure x 2, because this routine is called every 2nd second only
+	SAFE_2BYTE_COPY rel_pressure,xB		; copy current rel pressure to xB
 	bcf		STATUS,C
-	rlcf	xB+0,F
-	rlcf	xB+1,F						; x2
-
-	movf	xB+0,w
+	rlcf	xB+0,F						; multiply rel pressure x 2 (via shift left)
+	rlcf	xB+1,F						; ...
+
+	; 2a add (rel_pressure x 2) to the resettable depth accumulator
+	movf	xB+0,W
 	addwf	average_depth_hold+0,F
-	movf	xB+1,w
+	movf	xB+1,W
 	addwfc	average_depth_hold+1,F
-	movlw	d'0'
+	movlw	.0
 	addwfc	average_depth_hold+2,F
-	addwfc	average_depth_hold+3,F		; Will work up to 9999mbar*60*60*24=863913600mbar
-
-	; Do the same for the _total registers (Non-Resettable)
-	movf	xB+0,w
+	addwfc	average_depth_hold+3,F			; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth)
+
+	; 2b add (rel_pressure x 2) to the total depth accumulator
+	movf	xB+0,W
 	addwf	average_depth_hold_total+0,F
-	movf	xB+1,w
+	movf	xB+1,W
 	addwfc	average_depth_hold_total+1,F
-	movlw	d'0'
+	movlw	.0
 	addwfc	average_depth_hold_total+2,F
-	addwfc	average_depth_hold_total+3,F; Will work up to 9999mbar*60*60*24=863913600mbar
-
-	; 2. Compute Average Depth on base of average_divesecs:2
-	movff	average_divesecs+0,xB+0
-	movff	average_divesecs+1,xB+1		; Copy
+	addwfc	average_depth_hold_total+3,F	; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth)
+
+	; 3a compute avg_rel_pressure on base of average_divesecs:2
 	movff	average_depth_hold+0,xC+0
 	movff	average_depth_hold+1,xC+1
 	movff	average_depth_hold+2,xC+2
-	movff	average_depth_hold+3,xC+3
-
-	call	div32x16					; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	movff	average_depth_hold+3,xC+3		; copy accumulated depth
+	movff	average_divesecs+0,xB+0
+	movff	average_divesecs+1,xB+1			; copy accumulated time
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+0,avg_rel_pressure+0
-	movff	xC+1,avg_rel_pressure+1
-
-	btfss	divemode2					; displayed divetime is running?
-	return								; No (e.g. too shallow)
-
-	; 3. Compute Total Average Depth on base of total_divetime_seconds:2
-	movff	total_divetime_seconds+0,xB+0
-	movff	total_divetime_seconds+1,xB+1	; Copy
+	movff	xC+1,avg_rel_pressure+1			; store result
+
+	btfss	divemode2						; displayed divetime is running?
+	return									; NO (e.g. too shallow)
+
+	; 3b compute avg_rel_pressure_total on base of average_divesecs_total:2
 	movff	average_depth_hold_total+0,xC+0
 	movff	average_depth_hold_total+1,xC+1
 	movff	average_depth_hold_total+2,xC+2
-	movff	average_depth_hold_total+3,xC+3
-	call	div32x16					; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	movff	average_depth_hold_total+3,xC+3	; copy accumulated depth
+	movff	average_divesecs_total+0,xB+0
+	movff	average_divesecs_total+1,xB+1	; copy accumulated time
+	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+0,avg_rel_pressure_total+0
-	movff	xC+1,avg_rel_pressure_total+1
+	movff	xC+1,avg_rel_pressure_total+1	; store result
+
+	btfsc	reset_average_depth				; reset the resettable average depth?
+	rcall	reset_average					; YES - reset the resettable average depth
+
+	TSTOSS	opt_2ndDepthDisp				; drawing avg depth instead of max depth?
+	return									; NO  - done
+	bsf		FLAG_TFT_max_depth				; YES - flag to update display
 	return
 
-reset_average1:
-	clrf	average_depth_hold+0
-	clrf	average_depth_hold+1
-	clrf	average_depth_hold+2
-	clrf	average_depth_hold+3		; Clear average depth register
-	movlw	d'2'
-	movwf	average_divesecs+0
-	clrf	average_divesecs+1
-	bcf		reset_average_depth			; Clear flag
-	return
-
-test_switches_divemode:					; checks switches in divemode
-	btfsc	divemode_menu				; Divemode menu shown?
-	bra		test_switches_divemode_menu	; Yes, use menu processor
-	btfsc	switch_left
-	;bra	test_switches_divemode2		; Enter button pressed, check if we need to do something
-	goto	menuview_toggle				; Menu or Simulator tasks; and return...
-	btfss	switch_right
-	return								; No button press
-	tstfsz	menupos2					; any option shown?
-	bra		test_switches_divemode1		; Yes, do option tasks
-	bsf		toggle_customview			; No, toggle custom view
-	return
+
+test_switches_divemode:						; checks switches in divemode
+	btfsc	divemode_menu					; divemode menu shown?
+	bra		test_switches_divemode_menu		; YES - use menu processor
+	btfsc	switch_left						; NO  - left button pressed?
+	goto	menuview_toggle					;       YES - menu or simulator tasks; and return...
+	btfss	switch_right					;       NO  - right button pressed?
+	return									;             NO  - done
+	tstfsz	menupos2						;             YES - any option shown?
+	bra		test_switches_divemode1			;                   YES - do option tasks
+	bsf		toggle_customview				;                   NO  - toggle custom view
+	return									;                       - done
 
 test_switches_divemode_menu:
 	btfsc	switch_left
-	bra		test_switches_divemode_menu2; Move cursor
-	btfsc	switch_right
-	bra		test_switches_divemode_menu3; Enter submenu or do something
-	return								; No button press
+	bra		test_switches_divemode_menu2	; move cursor
+	btfsc	switch_right					; left button pressed?
+	bra		test_switches_divemode_menu3	; YES - enter submenu or do something
+	return									; NO  - done
 
 test_switches_divemode_menu1:
 	clrf	menupos1
 test_switches_divemode_menu2:
 	incf	menupos1,F
-	incf	menupos4,W					; menupos4+1 -> WREG
-	cpfslt	menupos1					; > menupos4 (Set in menu_processor.asm)?
-	bra		test_switches_divemode_menu1; > Yes, set to 1
-	call	TFT_divemode_menu_cursor	; Update the cursor
+	incf	menupos4,W						; menupos4 + 1 -> WREG
+	cpfslt	menupos1						; > menupos4 (set in menu_processor.asm)?
+	bra		test_switches_divemode_menu1	; YES - set to 1
+	call	TFT_divemode_menu_cursor		; update the cursor
 	bcf		switch_left
-	movlw	divemode_menu_timeout		; Reload timeout
-	movwf	timeout_counter2			; timeout for divemode menu
+	movlw	divemode_menu_timeout			; reload timeout
+	movwf	timeout_counter2				; timeout for divemode menu
 	return
 
-test_switches_divemode_menu3:			; Enter submenu or do something
+test_switches_divemode_menu3:			; enter submenu or do something
 	bcf		switch_right
 ;	decf	menupos1,F					; menu_processor needs 0-5...
-	goto	do_line_menu				; Warning! Trashes STKPTR and returns to diveloop_loop4:
+	goto	do_line_menu				; Warning! trashes STKPTR and returns to diveloop_loop4:
 
 test_switches_divemode1:
 	bcf		switch_right
 	movlw	divemode_menuview_timeout
-	movwf	timeout_counter2			; Reload timeout
+	movwf	timeout_counter2			; reload timeout
 	movff	menupos2,WREG				; menupos2 holds number of customview/divemode menu function
 	dcfsnz	WREG,F
-	bra		divemode_option_gaschange	; Switch to the indicated "better gas"
+	bra		divemode_option_gaschange	; switch to the the "better gas" / "better diluent"
 	dcfsnz	WREG,F
-	bra		divemode_option0			; Start/Setup Divemode menu
+	bra		divemode_option0			; start/setup Divemode menu
 	dcfsnz	WREG,F
-	bra		divemode_option1			; Quit Simulation?
+	bra		divemode_option1			; quit simulation?
 	dcfsnz	WREG,F
-	bra		divemode_option2			; Descent 1m
+	bra		divemode_option2			; descent 1m
 	dcfsnz	WREG,F
-	bra		divemode_option3			; Ascend 1m
+	bra		divemode_option3			; ascend 1m
 	dcfsnz	WREG,F
-	bra		divemode_option4			; Quit Apnoe mode
+	bra		divemode_option4			; quit Apnoe mode
 	dcfsnz	WREG,F
-	bra		divemode_option5			; Reset Stopwatch (In Gauge mode)
+	bra		divemode_option5			; reset stopwatch (gauge mode only)
 	dcfsnz	WREG,F
 	bra		divemode_option6			; +5mins simulation
 	dcfsnz	WREG,F
-	bra		divemode_option7			; Store heading
+	bra		divemode_option7			; store heading
 	dcfsnz	WREG,F
-	bra		divemode_option8			; Switch to alt. layout
+	bra		divemode_option8			; switch to alternative layout
 	return
 
 gas_switched_common:
-	bcf		divemode_gaschange			; Clear flag
+	bcf		divemode_gaschange			; clear flag
 	btfss	FLAG_back_to_loop			; check if it is a switchback from OC bailout to loop
 	bra		gas_switched_common0		; NO  - continue with checking if selected gas is valid
 	bcf		FLAG_back_to_loop			; YES - clear flag
-	movff	active_diluent,menupos1		;       reload last diluent
+	movff	active_dil,menupos1			;       reload last diluent
 	bra		gas_switched_common1		;       continue with common part
 gas_switched_common0:
-	tstfsz	menupos1					; menupos1=0?
+	tstfsz	menupos1					; menupos1 = 0 ?
 	bra		gas_switched_common1		; NO  - valid gas
 	return								; YES - something went wrong, invalid gas, abort
 gas_switched_common1:
 	movf	menupos1,W					; get selected gas into WREG (1-6)
-
-	btfsc	FLAG_ccr_mode				; in CCR mode?
-	bra		gas_switched_common2		; YES - configure diluent or bailout
-	btfsc	FLAG_pscr_mode				; in pSCR mode?
-	bra		gas_switched_common2		; YES - configure diluent or bailout
-
-	; OC
-	rcall	setup_gas_registers			; With WREG = Gas 1-6
-	rcall	deco_setup_oc_gases			; With WREG = Gas 1-6
+	btfsc	FLAG_oc_mode				; in OC mode?
+	bra		gas_switched_common_OC		; YES
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		gas_switched_common_OC		; YES
+gas_switched_common_loop:				; NO to both - must be loop mode then
+	rcall	setup_dil_registers			; with WREG = diluent 1-6
+	rcall	deco_setup_cc_diluents		; with WREG = diluent 1-6
 	bra		gas_switched_common3
-
-	; loop or bailout
-gas_switched_common2:
-	rcall	setup_dil_registers			; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases
-	rcall	deco_setup_cc_diluents		; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases
-
+gas_switched_common_OC:
+	rcall	setup_gas_registers			; with WREG = Gas 1-6
+	rcall	deco_setup_oc_gases			; with WREG = Gas 1-6
 gas_switched_common3:
-	bsf		FLAG_TFT_active_gas_divemode	; Redraw gas/setpoint/diluent
+	bsf		FLAG_TFT_active_gas_divemode	; redraw gas/setpoint/diluent
 	call	restart_deco_engine_wo_ceiling	; abort any running deco calculations and restart the deco engine
-
-	; Set flags for profile recording
+	; set flags for profile recording
 	bsf		event_occured				; set event flag
-	btfsc	is_bailout					; Choose OC Bailouts (OC Gases)
-	bsf		bailoutgas_event			; Bailout gas change
-	btfss	is_bailout					; Choose OC Bailouts (OC Gases)
+	btfsc	FLAG_bailout_mode			; choose OC Bailouts (OC Gases)
+	bsf		bailoutgas_event			; bailout gas change
+	btfss	FLAG_bailout_mode			; choose OC Bailouts (OC Gases)
 	bsf		stored_gas_changed			; OC gas change
 	return
 
@@ -1388,165 +1458,130 @@
 ; Code to pass all parameters to the C code
 
 	global	get_first_gas_to_WREG
-get_first_gas_to_WREG:					; Gets first gas (1-5) into WREG
-	lfsr	FSR1,opt_gas_type			; Point to gas types
-	clrf	lo							; start with Gas0
+get_first_gas_to_WREG:					; gets first gas (1-5) into WREG
+	lfsr	FSR1,opt_gas_type			; point to gas types
+	clrf	lo							; start with gas 0
 get_first_gas_to_WREG2:
 	movf	lo,W
-	movf	PLUSW1,W					; Get Type of Gas #lo
+	movf	PLUSW1,W					; get type of gas #lo
 	sublw	.1							; it is = 1 (First Gas)
-	bz		get_first_gas_to_WREG3		; Found the first gas!
+	bz		get_first_gas_to_WREG3		; found the first gas!
 	incf	lo,F						; ++
 	movlw	NUM_GAS+1
-	cpfseq	lo							; All done?
-	bra		get_first_gas_to_WREG2		; Not yet
-	; No first gas found, use #1
+	cpfseq	lo							; all done?
+	bra		get_first_gas_to_WREG2		; NO - not yet
+	; no first gas found, use #1
 	movlw	.0
-	movff	WREG,opt_gas_type+0			; Set Gas1 to First
+	movff	WREG,opt_gas_type+0			; set gas 1 to First
 	incf	WREG,W						; 0 -> 1
 	return
 get_first_gas_to_WREG3:
-	movf	lo,W						; Put into Wreg
+	movf	lo,W						; put into WREG
 	incf	WREG,W						; 0-4 -> 1-5
-	return								; Done
+	return								; done
 
 	global	get_first_dil_to_WREG
-get_first_dil_to_WREG:					; Gets first dil (1-5) into WREG
-	lfsr	FSR1,opt_dil_type			; Point to dil types
-	clrf	lo							; start with Gas0
+get_first_dil_to_WREG:					; gets first dil (1-5) into WREG
+	lfsr	FSR1,opt_dil_type			; point to dil types
+	clrf	lo							; start with dil 0
 get_first_dil_to_WREG2:
 	movf	lo,W
-	movf	PLUSW1,W					; Get Type of Dil #lo
+	movf	PLUSW1,W					; get type of Dil #lo
 	sublw	.1							; it is = 1 (First Dil)
-	bz		get_first_dil_to_WREG3		; Found the first dil!
+	bz		get_first_dil_to_WREG3		; found the first dil!
 	incf	lo,F						; ++
 	movlw	NUM_GAS+1
-	cpfseq	lo							; All done?
-	bra		get_first_dil_to_WREG2		; Not yet
-	; No first dil found, use #1
+	cpfseq	lo							; all done?
+	bra		get_first_dil_to_WREG2		; NO - not yet
+	; no first dil found, use #1
 	movlw	.0
-	movff	WREG,opt_dil_type+0			; Set Dil1 to First
+	movff	WREG,opt_dil_type+0			; set dil 1 to First
 	incf	WREG,W						; 0 -> 1
 	return
 get_first_dil_to_WREG3:
-	movf	lo,W						; Put into Wreg
+	movf	lo,W						; Put into WREG
 	incf	WREG,W						; 0-4 -> 1-5
-	return								; Done
-
-	global	deco_setup_oc_gases
+	return								; done
+
+
 deco_setup_oc_gases:					; with currently breathed gas in WREG (1-5 or 6)
-	movff	WREG,char_I_current_gas		; gas to start with when doing the deco calculations
-
-	banksel	opt_gas_type				; opt_gas_type[] and opt_OC_bail_gas_change[] are together in bank common2
-
-	movff	opt_gas_He_ratio+0,char_I_deco_He_ratio+0
-	movff	opt_gas_O2_ratio+0,char_I_deco_O2_ratio+0
-
-	movlw	.3							; 3=Deco
-	cpfseq	opt_gas_type+0				; Gas is deco type?
-	clrf	opt_OC_bail_gas_change+0	; No, clear depth for 0=Disabled, 1=First and 2=Travel
-
-	movff	opt_gas_He_ratio+1,char_I_deco_He_ratio+1
-	movff	opt_gas_O2_ratio+1,char_I_deco_O2_ratio+1
-	movlw	.3							; 3=Deco
-	cpfseq	opt_gas_type+1				; Gas is deco type?
-	clrf	opt_OC_bail_gas_change+1	; No, clear depth for 0=Disabled, 1=First and 2=Travel
-
-	movff	opt_gas_He_ratio+2,char_I_deco_He_ratio+2
-	movff	opt_gas_O2_ratio+2,char_I_deco_O2_ratio+2
-	movlw	.3							; 3=Deco
-	cpfseq	opt_gas_type+2				; Gas is deco type?
-	clrf	opt_OC_bail_gas_change+2	; No, clear depth for 0=Disabled, 1=First and 2=Travel
-
-	movff	opt_gas_He_ratio+3,char_I_deco_He_ratio+3
-	movff	opt_gas_O2_ratio+3,char_I_deco_O2_ratio+3
-	movlw	.3							; 3=Deco
-	cpfseq	opt_gas_type+3				; Gas is deco type?
-	clrf	opt_OC_bail_gas_change+3	; No, clear depth for 0=Disabled, 1=First and 2=Travel
-
-	movff	opt_gas_He_ratio+4,char_I_deco_He_ratio+4
-	movff	opt_gas_O2_ratio+4,char_I_deco_O2_ratio+4
-	movlw	.3							; 3=Deco
-	cpfseq	opt_gas_type+4				; Gas is deco type?
-	clrf	opt_OC_bail_gas_change+4	; No, clear depth for 0=Disabled, 1=First and 2=Travel
-
-	banksel common
-
-	; Setup char_I_deco_gas_change array
-	movff	opt_OC_bail_gas_change+0, char_I_deco_gas_change+0
-	movff	opt_OC_bail_gas_change+1, char_I_deco_gas_change+1
-	movff	opt_OC_bail_gas_change+2, char_I_deco_gas_change+2
-	movff	opt_OC_bail_gas_change+3, char_I_deco_gas_change+3
-	movff	opt_OC_bail_gas_change+4, char_I_deco_gas_change+4
-
-	; switch to oc mode
 	movff	char_O_deco_status,lo		; working copy of char_O_deco_status in bank common
+deco_setup_oc_gases_pre:				; entry point with lo preloaded
+	movff	WREG,char_I_current_gas		; set gas to start with when doing the deco calculations
+	;
+	; Memory Map:
+	; ---------------------------------------------------------------------------------
+	; opt_gas_O2_ratio		res NUM_GAS		|	char_I_deco_O2_ratio		res NUM_GAS
+	; opt_dil_O2_ratio		res NUM_GAS		|
+	; opt_gas_He_ratio		res NUM_GAS		|	char_I_deco_He_ratio		res NUM_GAS
+	; opt_dil_He_ratio		res NUM_GAS		|
+	; opt_gas_type			res NUM_GAS		|	char_I_deco_gas_type		res NUM_GAS
+	; opt_dil_type			res NUM_GAS		|
+	; opt_gas_change		res NUM_GAS		|	char_I_deco_gas_change		res NUM_GAS
+	; opt_dil_change		res NUM_GAS		|
+	;
+	lfsr	FSR2,char_I_deco_O2_ratio	; Load FSR2 with base address of char_I_deco_O2_ratio.
+										; FSR2 will step through all char_I_deco_... vars.
+	lfsr	FSR1,opt_gas_O2_ratio		; load FSR1 with base address of opt_gas_O2_ratio
+	rcall	deco_setup_copy				; copy all OC O2 ratios
+	lfsr	FSR1,opt_gas_He_ratio		; load FSR1 with base address of opt_gas_He_ratio
+	rcall	deco_setup_copy				; copy all OC He ratios
+	lfsr	FSR1,opt_gas_type			; load FSR1 with base address of opt_gas_type
+	rcall	deco_setup_copy				; copy all gas types
+	lfsr	FSR1,opt_gas_change			; load FSR1 with base address of opt_gas_change
+	rcall	deco_setup_copy				; copy all gas change depths
+										; switch to oc mode
 	bcf		lo,DECO_MODE_PSCR_FLAG		; clear the pSCR-mode flag (may not be set, but never mind)
 	bcf		lo,DECO_MODE_LOOP_FLAG		; clear the loop/CCR-mode flag
 	movff	lo,char_O_deco_status		; bank safe write-back of char_O_deco_status
-
 	return
 
 
-	global	deco_setup_cc_diluents
-deco_setup_cc_diluents:					; with currently breathed gas in WREG (1-5 or 6)
-	btfsc	is_bailout					; check if in bailout condition
-	bra		deco_setup_oc_gases			; revert to setting up OC gases in bailout condition
-
-	movff	WREG,char_I_current_gas		; gas to start with when doing the deco calculations
-
-	movff	opt_dil_He_ratio+0,char_I_deco_He_ratio+0
-	movff	opt_dil_O2_ratio+0,char_I_deco_O2_ratio+0
-	movff	opt_dil_type+0,WREG			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	WREG						; Disabled?
-	bra		$+4							; No
-	movff	WREG,char_I_dil_change+0	; Yes, clear char_I_deco_gas_change (Bank safe)
-
-	movff	opt_dil_He_ratio+1,char_I_deco_He_ratio+1
-	movff	opt_dil_O2_ratio+1,char_I_deco_O2_ratio+1
-	movff	opt_dil_type+1,WREG			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	WREG						; Disabled?
-	bra		$+4							; No
-	movff	WREG,char_I_dil_change+1	; Yes, clear char_I_dil_change
-
-	movff	opt_dil_He_ratio+2,char_I_deco_He_ratio+2
-	movff	opt_dil_O2_ratio+2,char_I_deco_O2_ratio+2
-	movff	opt_dil_type+2,WREG			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	WREG						; Disabled?
-	bra		$+4							; No
-	movff	WREG,char_I_dil_change+2	; Yes, clear char_I_dil_change
-
-	movff	opt_dil_He_ratio+3,char_I_deco_He_ratio+3
-	movff	opt_dil_O2_ratio+3,char_I_deco_O2_ratio+3
-	movff	opt_dil_type+3,WREG			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	WREG						; Disabled?
-	bra		$+4							; No
-	movff	WREG,char_I_dil_change+3	; Yes, clear char_I_dil_change
-
-	movff	opt_dil_He_ratio+4,char_I_deco_He_ratio+4
-	movff	opt_dil_O2_ratio+4,char_I_deco_O2_ratio+4
-	movff	opt_dil_type+4,WREG			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	WREG						; Disabled?
-	bra		$+4							; No
-	movff	WREG,char_I_dil_change+4	; Yes, clear char_I_dil_change
-
-	; Setup char_I_deco_gas_change array
-	movff	char_I_dil_change+0, char_I_deco_gas_change+0
-	movff	char_I_dil_change+1, char_I_deco_gas_change+1
-	movff	char_I_dil_change+2, char_I_deco_gas_change+2
-	movff	char_I_dil_change+3, char_I_deco_gas_change+3
-	movff	char_I_dil_change+4, char_I_deco_gas_change+4
-
-	; switch to CCR / pSCR mode
+deco_setup_cc_diluents:					; with currently breathed diluent in WREG (1-5 or 6)
 	movff	char_O_deco_status,lo		; working copy of char_O_deco_status in bank common
+deco_setup_cc_diluents_pre:				; entry point with lo preloaded
+	btfsc	FLAG_bailout_mode			; check if in bailout condition       | --------------- FOR SAFETY ONLY --------------
+	bra		deco_setup_oc_gases_pre		; YES - revert to setting up OC gases | This branch should never happen to be taken...
+	movff	WREG,char_I_current_gas		; NO  - set diluent to start with when doing the deco calculations
+	;
+	; Memory Map:
+	; ---------------------------------------------------------------------------------
+	; opt_gas_O2_ratio		res NUM_GAS		|
+	; opt_dil_O2_ratio		res NUM_GAS		|	char_I_deco_O2_ratio		res NUM_GAS
+	; opt_gas_He_ratio		res NUM_GAS		|
+	; opt_dil_He_ratio		res NUM_GAS		|	char_I_deco_He_ratio		res NUM_GAS
+	; opt_gas_type			res NUM_GAS		|
+	; opt_dil_type			res NUM_GAS		|	char_I_deco_gas_type		res NUM_GAS
+	; opt_gas_change		res NUM_GAS		|
+	; opt_dil_change		res NUM_GAS		|	char_I_deco_gas_change		res NUM_GAS
+	;
+	lfsr	FSR2,char_I_deco_O2_ratio	; Load FSR2 with base address of char_I_deco_O2_ratio.
+										; FSR2 will step through all char_I_deco_... vars.
+	lfsr	FSR1,opt_dil_O2_ratio		; load FSR1 with base address of opt_dil_O2_ratio
+	rcall	deco_setup_copy				; copy all dil O2 ratios
+	lfsr	FSR1,opt_dil_He_ratio		; load FSR1 with base address of opt_dil_He_ratio
+	rcall	deco_setup_copy				; copy all dil He ratios
+	lfsr	FSR1,opt_dil_type			; load FSR1 with base address of opt_dil_type
+	rcall	deco_setup_copy				; copy all dil types
+	lfsr	FSR1,opt_dil_change			; load FSR1 with base address of opt_dil_change
+	rcall	deco_setup_copy				; copy all dil change depths
+										; switch to CCR / pSCR mode
 	bsf		lo,DECO_MODE_LOOP_FLAG		; loop flag is set in both, CCR and pSCR mode
 	bcf		lo,DECO_MODE_PSCR_FLAG		; clear pSCR mode flag by default
 	btfsc	FLAG_pscr_mode				; check if we are in pSCR mode
 	bsf		lo,DECO_MODE_PSCR_FLAG		; YES - set additional flag for pSCR mode
-	movff	lo,char_O_deco_status		; bank safe write-back of char_O_deco_status	
-
+	movff	lo,char_O_deco_status		; bank safe write-back of char_O_deco_status
 	return
 
+deco_setup_copy:
+	movlw	NUM_GAS						; load loop counter with number of gases (5)
+deco_setup_copy_loop:
+	movff	POSTINC1,POSTINC2			; copy from (FSR1) to (FSR2)
+	decfsz	WREG						; decrement loop counter and check if it became 0
+	bra		deco_setup_copy_loop		; NO  - not yet, loop
+	return								; YES - done
+
+
 	global	setup_gas_registers
 setup_gas_registers:					; with currently breathed gas in WREG (1-5 or 6)
 	movwf	active_gas					; set as current gas
@@ -1554,76 +1589,92 @@
 	cpfseq	active_gas					; gas = gas6 ?
 	bra		setup_gas_registers_15		; NO - load gas 1-5
 	movff	gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine
-	movff	gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine	
+	movff	gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine
+	movlw	.3							; declare gas6 as a deco gas
+	movff	WREG,char_I_current_gas_type; copy gas type to deco engine
+	movff	curr_depth,char_I_gas6_depth; set current depth as change depth
 	bra		setup_gas_registers_com		; continue with common part
 setup_gas_registers_15:
 	decf	active_gas,W				; 1-5 -> 0-4
-	lfsr	FSR1,opt_gas_O2_ratio+0
+	lfsr	FSR1,opt_gas_O2_ratio
 	movff	PLUSW1,char_I_O2_ratio		; copy gas 1-5 O2 ratio to deco engine
-	lfsr	FSR1,opt_gas_He_ratio+0
+	lfsr	FSR1,opt_gas_He_ratio
 	movff	PLUSW1,char_I_He_ratio		; copy gas 1-5 He ratio to deco engine
-setup_gas_registers_com:	
-	;lfsr	FSR1,opt_gas_type			; commented out - currently not used anywhere
-	;movff	PLUSW1,active_gas_type		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	lfsr	FSR1,opt_gas_type			;
+	movff	PLUSW1,char_I_current_gas_type ; copy gas 1-5 type (0=Disabled, 1=First, 2=Travel, 3=Deco)
+setup_gas_registers_com:
 	movff	char_O_main_status,lo		; working copy of char_O_main_status in bank common
 	bcf		lo,DECO_MODE_PSCR_FLAG		; clear the pSCR-mode flag (may not be set, but never mind)
 	bcf		lo,DECO_MODE_LOOP_FLAG		; clear the loop/CCR-mode flag
 	movff	lo,char_O_main_status		; bank safe write-back of char_O_main_status
-	movf	active_gas,W				; reload WREG with diluent 1-5 or 6 (important!)
+	movf	active_gas,W				; reload WREG with gas 1-5 or 6 (important!)
 	return
 
 	global	setup_dil_registers
 setup_dil_registers:					; with currently breathed gas in WREG (1-5 or 6)
-	btfsc	is_bailout					; check if in bailout condition
-	bra		setup_gas_registers			; revert to setting up OC gases in bailout condition
-	movwf	active_gas					; set as current gas
-	movff	WREG,active_diluent			; remember for when switching back from bailout to loop
+	btfsc	FLAG_bailout_mode			; check if in bailout condition                      | --------------- FOR SAFETY ONLY --------------
+	bra		setup_gas_registers			; revert to setting up OC gases in bailout condition | This branch should never happen to be taken...
+	movwf	active_dil					; set as current diluent
 	movlw	.6
-	cpfseq	active_gas					; diluent = gas6 ?
+	cpfseq	active_dil					; diluent = gas6 ?
 	bra		setup_dil_registers_15		; NO - load diluent 1-5
 	movff	gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine
 	movff	gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine
+	movlw	.2							; declare gas6 as a normal diluent
+	movff	WREG,char_I_current_gas_type; copy gas type to deco engine
+	movff	curr_depth,char_I_gas6_depth; set current depth as change depth
 	bra		setup_dil_registers_com		; continue with common part
 setup_dil_registers_15:
-	decf	active_gas,W				; 1-5 -> 0-4
-	lfsr	FSR1,opt_dil_O2_ratio+0
+	decf	active_dil,W				; 1-5 -> 0-4
+	lfsr	FSR1,opt_dil_O2_ratio
 	movff	PLUSW1,char_I_O2_ratio		; copy diluent 1-5 O2 ratio to deco engine
-	lfsr	FSR1,opt_dil_He_ratio+0
+	lfsr	FSR1,opt_dil_He_ratio
 	movff	PLUSW1,char_I_He_ratio		; copy diluent 1-5 He ratio to deco engine
+	lfsr	FSR1,opt_dil_type			;
+	movff	PLUSW1,char_I_current_gas_type ; copy dil type (0=Disabled, 1=First, 2=Normal)
 setup_dil_registers_com:
-	;lfsr	FSR1,opt_dil_type			; commented out - currently not used anywhere
-	;movff	PLUSW1,active_gas_type		; 0=Disabled, 1=First, 2=Normal (there is no type 3 for diluents)
 	movff	char_O_main_status,lo		; working copy of char_O_main_status in bank common
 	bsf		lo,DECO_MODE_LOOP_FLAG		; loop flag is set in both, CCR and pSCR mode
 	bcf		lo,DECO_MODE_PSCR_FLAG		; clear pSCR mode flag by default
 	btfsc	FLAG_pscr_mode				; check if we are in pSCR mode
 	bsf		lo,DECO_MODE_PSCR_FLAG		; YES - set additional flag for pSCR mode
 	movff	lo,char_O_main_status		; bank safe write-back of char_O_main_status
-	movf	active_gas,W				; reload WREG with diluent 1-5 or 6 (important!)
+	movf	active_dil,W				; reload WREG with diluent 1-5 or 6 (important!)
 	return
 
-divemode_option_gaschange:				; Switch to the better gas
-	movff	better_gas_number,menupos1	; 1-5
-	bsf		divemode_gaschange			; Change the gas in the dive mode loop...
-	call	menuview_toggle_reset		; Reset to zero (Zero=no menuview)
-	bcf		better_gas_available		; Clear flag immediately
+
+divemode_option_gaschange:				; switch to the "better gas" / "better diluent"
+	btfsc	FLAG_oc_mode				; in OC mode?
+	bra		divemode_option_gaschange_oc; YES
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		divemode_option_gaschange_oc; YES
+divemode_option_gaschange_loop:			; in CCR/pSCR mode and not in bailout
+	movff	best_dil_number,menupos1	; NO  - select best diluent
+	bcf		better_dil_available		;     - clear flag immediately
+	bra		divemode_option_gaschange3	;     - continue with common part
+divemode_option_gaschange_oc:			; in OC or bailout
+	movff	best_gas_number,menupos1	; select best gas
+	bcf		better_gas_available		; clear flag immediately
+divemode_option_gaschange3				; common part
+	bsf		divemode_gaschange			; command a gas/diluent change
+	call	menuview_toggle_reset		; terminate the options menu
 	return
 
-divemode_option0:						; Start/Setup Divemode menu
-	call	TFT_clear_divemode_menu		; Clear menu area
+divemode_option0:						; start/setup dive mode menu
+	call	TFT_clear_divemode_menu		; clear menu area
 	bcf		menuview
 	call	do_main_divemenu
 
 	global	divemode_option0_return
 divemode_option0_return:
 ;	movlw	.1
-;	movwf	menupos1					; Set to first option in divemode menu
-	call	TFT_divemode_menu_cursor	; Show the cursor
+;	movwf	menupos1					; set to first option in dive mode menu
+	call	TFT_divemode_menu_cursor	; show the cursor
 	movlw	divemode_menu_timeout
-	movwf	timeout_counter2			; timeout for divemode menu
-	bsf		divemode_menu				; Set flag
-	clrf	menupos2					; Clear option counter
-	goto	diveloop_loop4				; Goto back to diveloop (menu processor trashes STKPTR!)
+	movwf	timeout_counter2			; timeout for dive mode menu
+	bsf		divemode_menu				; set flag
+	clrf	menupos2					; clear option counter
+	goto	diveloop_loop4				; go back to dive loop (menu processor trashes STKPTR!)
 
 divemode_option4:
 	movlw	d'58'						; two seconds left
@@ -1631,18 +1682,20 @@
 	movlw	apnoe_timeout-1				; apnoe timeout [min]
 	movwf	apnoe_timeout_counter
 	btfss	simulatormode_active		; in simulator mode?
-	return								; No
-divemode_option1:						; Quit simulation mode
+	return								; NO
+	;bra	divemode_option1			; YES
+
+divemode_option1:						; quit simulation mode
 	banksel	isr_backup
 	movlw	LOW  .1000
 	movwf	sim_pressure+0
 	movlw	HIGH .1000
-	movwf	sim_pressure+1				; Set to 0m -> End of Dive
+	movwf	sim_pressure+1				; set to 0m -> end of dive
 	banksel	common
-	call	menuview_toggle_reset		; Reset to zero (Zero=no menuview)
-
-	btfss	FLAG_apnoe_mode				; In Apnoe mode?
-	return								; No
+	call	menuview_toggle_reset		; reset to zero (zero = no menu view)
+
+	btfss	FLAG_apnoe_mode				; in apnoe mode?
+	return								; NO - done
 	movlw	d'58'						; two seconds left
 	movwf	timeout_counter1+0
 	movlw	apnoe_timeout-1				; apnoe timeout [min]
@@ -1662,51 +1715,74 @@
 divemode_option2:						; plus 1m
 	banksel	isr_backup
 	movlw	d'100'
-	addwf	sim_pressure+0
+	addwf	sim_pressure+0,F
 	movlw	.0
-	addwfc	sim_pressure+1
+	addwfc	sim_pressure+1,F
 	rcall	divemode_simulator_check_limits
 	banksel	common
 	return
 
 divemode_option5:
-	call	menuview_toggle_reset		; Reset to zero (Zero=no menuview)
-	bsf		reset_average_depth			; Set Flag
+	call	menuview_toggle_reset		; reset to zero (zero = no menu view)
+	bsf		reset_average_depth			; set flag
 	return
 
 divemode_option6:
-	bcf		divemode2					; Stop divetime
+	; advance tissues and deco by 5 minutes
+	movlw	.5							; + 5 minutes
+	movff	WREG,char_I_sim_advance_time; copy to mailbox
+	call	restart_deco_engine
+
+	; stop divetime incrementing in ISR
+	bcf		divemode2
+
+	; add 5 minutes to divemins
 	movlw	.5
 	addwf	divemins+0,F
 	movlw	.0
-	addwfc	divemins+1,F				; Add 5 mins
+	addwfc	divemins+1,F
+
+	; add 5 minutes (5 * 60 seconds) to total_divetime_seconds
+	movlw	LOW  (.5*.60)
+	addwf	total_divetime_seconds+0,F
+	movlw	HIGH (.5*.60)
+	addwfc	total_divetime_seconds+1,F
+
+	; continue dive time incrementing in ISR
+	bsf		divemode2
+
+	; add 5 minutes (5 * 60 seconds) to resettable time accumulator
 	movlw	LOW  (.5*.60)
 	addwf	average_divesecs+0,F
 	movlw	HIGH (.5*.60)
-	addwfc	average_divesecs+1,F		; Add 5*60 seconds
+	addwfc	average_divesecs+1,F
+
+	; add 5 minutes (5 * 60 seconds) to total time accumulator
 	movlw	LOW  (.5*.60)
-	addwf	total_divetime_seconds+0,F
+	addwf	average_divesecs_total+0,F
 	movlw	HIGH (.5*.60)
-	addwfc	total_divetime_seconds+1,F	; Add 5*60 seconds
-
-	; 1. Add 300xdepth to the sum of depths registers
-	SAFE_2BYTE_COPY rel_pressure, xB	; Buffer...
+	addwfc	average_divesecs_total+1,F
+
+
+	; calculate 300 x depth in mbar (300 = 5 min * 60 sec/min)
+	SAFE_2BYTE_COPY rel_pressure, xB
 	movlw	LOW  (.5*.60)
 	movwf	xA+0
 	movlw	HIGH (.5*.60)
 	movwf	xA+1
 	call	mult16x16					; xA*xB=xC
 
-	movf	xC+0,w
+	; add to the resettable depth accumulator
+	movf	xC+0,W
 	addwf	average_depth_hold+0,F
-	movf	xC+1,w
+	movf	xC+1,W
 	addwfc	average_depth_hold+1,F
-	movf	xC+2,w
+	movf	xC+2,W
 	addwfc	average_depth_hold+2,F
-	movf	xC+3,w
-	addwfc	average_depth_hold+3,F		; Will work up to 9999mbar*60*60*24=863913600mbar
-
-	; Do the same for the _total registers (Non-Resettable)
+	movf	xC+3,W
+	addwfc	average_depth_hold+3,F
+
+	; add to the total depth accumulator
 	movf	xC+0,w
 	addwf	average_depth_hold_total+0,F
 	movf	xC+1,w
@@ -1714,12 +1790,14 @@
 	movf	xC+2,w
 	addwfc	average_depth_hold_total+2,F
 	movf	xC+3,w
-	addwfc	average_depth_hold_total+3,F; Will work up to 9999mbar*60*60*24=863913600mbar
-
-	movlw	.5							; + 5 minutes
-	movff	WREG,char_I_sim_advance_time; copy to mailbox
-	bsf		divemode2					; continue divetime
-	call	restart_deco_engine
+	addwfc	average_depth_hold_total+3,F
+
+ IFDEF _cave_mode
+	; update backtracking data
+	movlw	.5							; add backtrack data for 5 minutes
+	call	update_backtrack			; make it so
+ ENDIF
+
 	goto	menuview_toggle_reset		; and return...
 
 divemode_option7:
@@ -1727,38 +1805,42 @@
 	movff	compass_heading_shown+0,compass_bearing+0
 	movff	compass_heading_shown+1,compass_bearing+1
 	bsf		compass_bearing_set			; set flag
-	goto	menuview_toggle_reset		; Done and return...
-	
+	goto	menuview_toggle_reset		; and return...
+
 divemode_option8:
-	bsf		alternative_divelayout		; Set flag for mode
-	bsf		FLAG_TFT_divemode_mask_alt	; Set flag for mask
-	movlw	.1
-	movwf	menupos3					; For the customviews...
-	call	TFT_ClearScreen				; Clear screen
-	goto	menuview_toggle_reset		; Done and return...
+	bsf		alternative_divelayout		; set flag for alternative layout mode
+	call	menuview_toggle_reset		; terminate the pre-menu
+	call	TFT_ClearScreen				; clear the whole screen
+	bsf		FLAG_TFT_divemode_mask_alt	; set flag to draw the alternative mask
+	movff	menupos3,customview_divemode; back-up the custom view shown in normal layout
+	clrf	menupos3					; select the default alternative layout
+	call	customview_mask_alternative ; draw   the default alternative layout
+	return								; done
+
 
 divemode_simulator_check_limits:
-	; Check limits (150m and 0m)
-	movlw	LOW  d'16000'			; Compare to 16bar=16000mbar (150m).
+	; check limits (150m and 0m)
+	movlw	LOW  d'16000'				; compare to 16 bar = 16000 mbar (150m)
 	subwf	sim_pressure+0,W
 	movlw	HIGH d'16000'
 	subwfb	sim_pressure+1,W
-	bnc		divemode_simulator_check_limits2 ; No-carry = borrow = not deeper
-
-	; Too deep, limit to 150m
+	bnc		divemode_simulator_check_limits2 ; no carry = borrow = not deeper
+
+	; too deep, limit to 150m
 	movlw	LOW  d'16000'
 	movwf	sim_pressure+0
 	movlw	HIGH d'16000'
 	movwf	sim_pressure+1
 	return
+
 divemode_simulator_check_limits2:
-	movlw	LOW  d'1000'				; Compare to 1bar == 0m == 1000 mbar.
+	movlw	LOW  d'1000'				; compare to 1 bar == 0m == 1000 mbar
 	subwf	sim_pressure+0,W
 	movlw	HIGH d'1000'
 	subwfb	sim_pressure+1,W
-	btfsc	STATUS,C					; No-carry = borrow = not deeper.
-	return								; Deeper than 0m == Ok.
-	; Too shallow, limit to 0m
+	btfsc	STATUS,C					; no carry = borrow = not deeper
+	return								; deeper than 0 m == ok
+	; too shallow, limit to 0m
 	movlw	LOW  d'1000'
 	movwf	sim_pressure+0
 	movlw	HIGH d'1000'
@@ -1766,291 +1848,383 @@
 	return
 
 ;=============================================================================
-; Compare all enabled gas in list, to see if a better one is available.
+; Find the best gas and diluent for the current depth
+; and check if a gas/diluent change is to be advised.
+;
+; Output: best_gas_number      : number of best gas, 0= none avail, 255= not computed
+;         best_dil_number      : number of best dil, 0= none avail, 255= not computed
+;         better_gas_available : flag indicating if a change is advised
+;         better_dil_available : flag indicating if a change is advised
+;
+;
+; in CCR and pSCR mode: - checks both, gases and diluents for respective best gas / best diluent
+;                       - if not in bailout, sets better_dil_available on diluents
+;                       - if     in bailout, sets better_gas_available on OC gases
+;
+; in OC mode          : - checks only gases for best gas
+;                       - sets better_gas_available on OC gases
 ;
-; Output: better_gas_available, better_gas_number
+check_gas_best:
+	movff	amb_press_10+0,xA+0				; copy ambient pressure / 10 into xA:2, will be used by ppO2 min/max checks later
+	movff	amb_press_10+1,xA+1				; ...
+	; set maximum ppO2 allowed
+	movff	char_I_ppO2_max,ppO2_max		; max ppO2 for working phase (default)
+	movff	char_O_deco_info,lo				; bank-safe copy of deco info vector
+	btfsc	lo,deco_flag					; is the ppo2 deco limit enabled?
+	movff	char_I_ppO2_max_deco,ppO2_max	; YES - replace by max ppO2 for deco phase
+	; check dive mode
+	btfsc	FLAG_oc_mode					; in OC mode?
+	bra		check_gas_best_gas				; YES - skip diluents, check for best gas only
+
+check_gas_best_dil:
+	; set minimum ppO2 required
+	movff	char_I_ppO2_min,WREG			; min ppO2 for pure diluent in CCR mode (default)
+	btfsc	FLAG_pscr_mode					; in pSCR mode?
+	movff	char_I_ppO2_min_loop,ppO2_min	; YES - replace by min ppO2 for pure diluent in pSCR mode
+	; preset results to nothing found
+	clrf	best_gas_num					; initialize best diluent as 0 = nothing found yet
+	bcf		better_dil_available			; =1: a better diluent is available and a gas change is advised in divemode
+;	; current diluent = 'gas6' ?
+;	movlw	.6								;
+;	cpfseq	active_dil						; using 'gas6' as current diluent?
+;	bra		check_gas_best_dil0				; NO  - continue
+;	bra		check_gas_best_dil3				; YES - suppress better diluent search in this case
+;check_gas_best_dil0:
+	; check all diluents
+	lfsr	FSR1,opt_dil_O2_ratio			; set base address for diluent arrays
+	movff	active_dil,lo					; number of currently used diluent
+	setf	best_gas_depth					; initialize change depth of best dil found so far to 255 meter
+; original code
+	clrf	check_gas_num
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check diluent 1
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check diluent 2
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check diluent 3
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check diluent 4
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check diluent 5
+; alternative code
+;	movlw	.5
+;	movwf	check_gas_num
+;check_gas_best_dil_loop:
+;	rcall	check_gas_best_common
+;	decfsz	check_gas_num
+;	bra		check_gas_best_dil_loop
 ;
-check_gas_change:						; Checks if a better gas should be selected (by user)
-	bcf		better_gas_available		; =1: A better gas is available and a gas change is advised in divemode
-	clrf	WREG
-	movff	WREG,better_gas_number		; clear better gas register
-
-	SAFE_2BYTE_COPY rel_pressure,xA
-	movlw	d'100'
-	movwf	xB+0
-	clrf	xB+1
-	call	div16x16					; compute depth in full m -> result in xC+0
-
-	btfsc	FLAG_pscr_mode				; in PSCR mode?
-	bra		check_gas_change2			; YES - check for diluents
-	btfss	FLAG_ccr_mode				; in CCR mode?
-	bra		check_gas_change_OC_bail	; NO - check for OC
-check_gas_change2:
-	btfsc	is_bailout					; in bailout?
-	bra		check_gas_change_OC_bail	; YES - check for OC
-
-	; Check Diluents
-	movlw	.0
-	rcall	check_dil_common			; With Gas 0-4 in WREG
-	movlw	.1
-	rcall	check_dil_common			; With Gas 0-4 in WREG
-	movlw	.2
-	rcall	check_dil_common			; With Gas 0-4 in WREG
-	movlw	.3
-	rcall	check_dil_common			; With Gas 0-4 in WREG
-	movlw	.4
-	rcall	check_dil_common			; With Gas 0-4 in WREG
-	bra		check_gas_change_exit
-
-check_gas_change_OC_bail:
-	movlw	.0
-	rcall	check_gas_common			; With Gas 0-4 in WREG
-	movlw	.1
-	rcall	check_gas_common			; With Gas 0-4 in WREG
-	movlw	.2
-	rcall	check_gas_common			; With Gas 0-4 in WREG
-	movlw	.3
-	rcall	check_gas_common			; With Gas 0-4 in WREG
-	movlw	.4
-	rcall	check_gas_common			; With Gas 0-4 in WREG
-	;bra	check_gas_change_exit
-
-check_gas_change_exit:
-	bsf		FLAG_TFT_active_gas_divemode; redraw gas/setpoint/diluent
-	btfss	better_gas_available		; is a better gas available?
-	bcf		blinking_better_gas			; NO - clear blinking flag
-	btfsc	better_gas_available		; is a better gas available?
-	return								; YES
-	clrf	WREG						; NO  - clear better_gas_number (for gaslist display)
-	movff	WREG,better_gas_number
+	; store result
+	movff	best_gas_num,best_dil_number	; store new best diluent found (1-5 or 0 of no usable diluent available)
+	; check if change advices shall be given in general
+	btfsc	FLAG_bailout_mode				; in bailout?
+	bra		check_gas_best_gas				; YES - no better diluent advice when in bailout
+check_gas_best_dil1:
+	; check if a change advice shall be given right now
+	movf	best_dil_number,W				; load number of best diluent into WREG (1-5)
+	bz		check_gas_best_dil3				; has a best diluent been found at all?  NO - nothing to signal for
+	cpfseq	active_dil						; is this the currently used diluent?
+	bra		check_gas_best_dil2				; NO
+	bra		check_gas_best_dil3				; YES - no need to signal a better diluent if this diluent is already in use
+check_gas_best_dil2:
+	btfsc	setpoint_fallback				; is a fallback warning active?
+	bra		check_gas_best_dil3				; YES - suppress better diluent prompt in this case
+	; not using the best gas - show better diluent hint whenever a better diluent is available
+	bsf		better_dil_available			; signal that a better diluent is available
+	bsf		FLAG_TFT_active_gas_divemode	; redraw gas/setpoint/diluent
+check_gas_best_dil3:
+	btfss	better_dil_available			; shall a better diluent be signaled for?
+	bcf		blinking_better_dil				; NO  - clear blinking flag
+	; continue with checking for best bailout gas
+
+check_gas_best_gas:
+	; set minimum ppO2 required
+	movff	char_I_ppO2_min,ppO2_min		; min ppO2 for OC/Bailout
+	; preset results to nothing found
+	clrf	best_gas_num					; initialize best gas as 0 = nothing found yet
+	bcf		better_gas_available			; =1: a better gas is available and a gas change is advised in divemode
+;	; current gas = 'gas6' ?
+;	movlw	.6								;
+;	cpfseq	active_gas						; using 'gas6' as current gas?
+;	bra		check_gas_best_gas0				; NO  - continue
+;	bra		check_gas_best_gas3				; YES - suppress better gas search in this case
+;check_gas_best_gas0:
+	; check all gases
+	lfsr	FSR1,opt_gas_O2_ratio			; set base address for gas arrays
+	movff	active_gas,lo					; number of currently used gas
+	setf	best_gas_depth					; initialize change depth of best gas found so far to 255 meter
+; original code
+	clrf	check_gas_num
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check gas 1
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check gas 2
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check gas 3
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check gas 4
+	incf	check_gas_num,F
+	rcall	check_gas_best_common			; check gas 5
+; alternative code
+;	movlw	.5
+;	movwf	check_gas_num
+;check_gas_best_gas_loop:
+;	rcall	check_gas_best_common
+;	decfsz	check_gas_num
+;	bra		check_gas_best_gas_loop
+;
+	; store result
+	movff	best_gas_num,best_gas_number	; store new best gas found (1-5 or 0 of no usable gas available)
+	; check if change advices shall be given in general
+	btfsc	FLAG_oc_mode					; in OC mode?
+	bra		check_gas_best_gas1				; YES
+	btfsc	FLAG_bailout_mode				; in bailout?
+	bra		check_gas_best_gas1				; YES
+	return									; NO  - no better (OC) gas advice when not in OC or bailout mode
+check_gas_best_gas1:						; check if we are already on the best gas
+	; check if a change advice shall be given right now
+	movf	best_gas_number,W				; load number of best gas into WREG (1-5)
+	bz		check_gas_best_gas3				; has a best gas been found at all?  NO - nothing to signal for
+	cpfseq	active_gas						; is this the currently used gas?
+	bra		check_gas_best_gas2				; NO
+	bra		check_gas_best_gas3				; YES - no need to signal a better gas if this gas is already in use
+check_gas_best_gas2:
+	; not using the best gas - show better gas hint whenever a better gas is available
+	bsf		better_gas_available			; YES - signal that a better gas is available
+	bsf		FLAG_TFT_active_gas_divemode	; YES - redraw gas/setpoint/diluent
+check_gas_best_gas3:
+	btfss	better_gas_available			; shall a better gas be signaled for?
+	bcf		blinking_better_gas				; NO - clear blinking flag
 	return
 
-check_gas_common:						; With Gas 0-4 in WREG
-	btfsc	better_gas_available		; Better Gas already found?
-	return								; Yes, return
-	lfsr	FSR1,opt_gas_type			; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	btfss	PLUSW1,0					; Test for Bit0 and 1 -> type=3 -> Deco
-	return								; No
-	btfss	PLUSW1,1					; Test for Bit0 and 1 -> type=3 -> Deco
-	return								; No
-	incf	WREG,W						; 1-5
-	cpfseq	active_gas					; is this gas current gas?
-	bra		check_gas_common2			; No
-	return								; Yes, skip test for active gas
-check_gas_common2:
-	decf	WREG,W						; 0-4
-	movwf	hi							; Save tested gas 0-4
-	lfsr	FSR1,opt_OC_bail_gas_change
-	movff	PLUSW1,lo					; Change depth into lo
-	movlw	minimum_change_depth
-	cpfsgt	lo							; Change depth>minimum_change_depth?
-	return								; No, Change depth not deep enough, skip!
-	movf	xC+0,W						; load depth in m into WREG
-	cpfsgt	lo							; gas_change_depth < current depth?
-	bra		check_gas_common3			; No, check if we are within the better_gas_window_pos window
-	incf	hi,W						; 1-5
-	movff	WREG,better_gas_number		; number (1-5) of the "better gas" in divemode, =0: no better gas available
-	movlw	better_gas_window_neg
-	subwf	lo,W						; Change depth-better_gas_window_neg
-	cpfslt	xC+0						; current depth<Change depth-better_gas_window_neg?
-	bra		check_gas_common4			; Ok, now check the better gas ppO2<char_I_ppO2_max
-	return
-check_gas_common3:
-	incf	hi,W						; 1-5
-	movff	WREG,better_gas_number		; number (1-5) of the "better gas" in divemode, =0: no better gas available
-	movlw	better_gas_window_pos
-	addwf	lo,W						; Change depth+better_gas_window_pos
-	cpfsgt	xC+0						; current depth>Change depth+better_gas_window_pos?
-	bra		check_gas_common4			; Ok, now check the better gas ppO2<char_I_ppO2_max
-	return
-check_gas_common4:
-	movf	hi,W						; gas 0-4 into WREG
-	lfsr	FSR1,char_I_deco_O2_ratio	; load base address char_I_deco_O2_ratio array
-	movff	PLUSW1,lo					; read O2 ratio from array into lo
-
-	SAFE_2BYTE_COPY amb_pressure, xA
-	movlw	d'10'
-	movwf	xB+0
+check_gas_best_common:						; with gas to be checked in check_gas_num (1-5)
+;											; and  current gas       in lo            (1-5)
+	;
+	; Memory Map:
+	; ---------------------------------------------------------------------------------------
+	; opt_gas_O2_ratio		res 5	; base address for gases
+	; opt_dil_O2_ratio		res 5	; base address for diluents
+	; opt_gas_He_ratio		res 5	; (not needed here)
+	; opt_dil_He_ratio		res 5	; (not needed here)
+	; opt_gas_type			res 5	; has offset of 20 bytes from base address for gases
+	; opt_dil_type			res 5	; has offset of 20 bytes from base address for diluents
+	; opt_gas_change		res 5	; has offset of 10 bytes from opt_gas_type
+	; opt_dil_change		res 5	; has offset of 10 bytes from opt_dil_type
+
+	; get gas data
+	decf	check_gas_num,W					; (1-5) -> (0-4) into WREG to be used as index
+	movff	PLUSW1,check_gas_O2_ratio		; load O2 ratio (%) of current gas/dil into check_gas_O2_ratio
+	addlw	.20								; add offset of 20 bytes to index type in opt_gas_type/opt_dil_type
+	movff	PLUSW1,check_gas_type			; load type of current gas/dil into check_gas_type (0=disabled, 1=first, 2=travel/normal, 3=deco/-)
+	addlw	.10								; add offset of 10 bytes to index change depth in opt_gas_change/opt_dil_change
+	movff	PLUSW1,check_gas_depth			; load change depth of current gas/dil into check_gas_depth
+	; check if gas is usable (i.e. not disabled)
+	tstfsz	check_gas_type					; type = disabled (0)?
+	bra		check_gas_best_common0			; NO  - continue checks
+	movf	check_gas_num,W					; YES - get the number of the gas to be checked (1-5)
+	cpfseq	lo								;     - is this the currently used gas?
+	return									;       NO  - skip disabled gases which are not the current gas
+	bra		check_gas_best_common1			;       YES - a gas in use overrides it's disabled status, therefore treat it as available
+check_gas_best_common0:
+	; skip deco gases (type=3) if not in deco mode, but search among all enabled gases when in loop or bailout mode
+	movlw	.3
+	cpfseq	check_gas_type					; type = deco (3)?
+	bra		check_gas_best_common1			; NO  - proceed
+	btfsc	FLAG_bailout_mode				; YES - in bailout?
+	bra		check_gas_best_common1			;       YES - proceed, include deco gases
+	movff	char_O_main_status,WREG			;       NO  - get main deco mode
+	btfsc	WREG,DECO_MODE_LOOP_FLAG		;           - in loop mode?
+	bra		check_gas_best_common1			;             YES - proceed, include deco gases
+	movff	char_O_deco_info,WREG			;             NO  - get deco info vector
+	btfss	WREG,deco_flag					;                 - in deco mode (deco_flag set), i.e. use of deco gases allowed?
+	return									;                   NO  - skip deco gas while not in deco mode
+check_gas_best_common1:						;                   YES - proceed
+;	; check if gas change depth is below minimum change depth
+;	movlw	minimum_change_depth			; for value see definition in hwos.inc
+;	cpfsgt	check_gas_depth					; change depth of checked gas > minimum_change_depth?
+;	return									; NO - change depth not deep enough, skip and check next gas
+	; check if gas is usable, i.e. its change depth is below or equal to the current depth
+	movf	curr_depth,W					; load current depth (in m) into WREG
+	cpfslt	check_gas_depth					; change depth of checked gas < (shallower than) current depth?
+	bra		check_gas_best_common2			; NO  - gas is usable
+	return									; YES - gas is not usable
+check_gas_best_common2:
+	; check if this gas is the first best gas candidate
+	movf	best_gas_num,W					; get best gas found so far (1-5) or 0 if none found yet
+	tstfsz	WREG							; has a best gas candidate been found yet?
+	bra		check_gas_best_common3			; YES - check if the new one is better than the one we have so far
+	bra		check_gas_best_common4			; NO  - no need to do the above mentioned check
+check_gas_best_common3:
+	; check if the change depth of the checked gas is < (shallower) than the change depth of the best gas found so far
+	movf	best_gas_depth,W				; load change depth of best gas so far into WREG
+	cpfslt	check_gas_depth					; change depth of checked gas < (shallower than) change depth of best gas so far?
+	return									; NO - this gas is not better than the best already found
+check_gas_best_common4:
+	; check if the gas fits into the ppO2 limits
+	movff	check_gas_O2_ratio,xB+0			; xB = O2 ratio, xA is still loaded with (p_amb / 10)
 	clrf	xB+1
-	call	div16x16					; xC=p_amb/10
-	movff	xC+0,xA+0
-	movff	xC+1,xA+1
-	movff	lo,xB+0						; =O2 ratio
-	clrf	xB+1
-	call	mult16x16					; lo * p_amb/10
-
-	; Check very high ppO2 manually
-	tstfsz	xC+2						; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
-	return								; Done.
-	; Check if ppO2>3,30bar
-	btfsc	xC+1,7
-	return								; Done.
-
-	; Check for low ppo2
-	movff	xC+0,sub_b+0
-	movff	xC+1,sub_b+1
-	movff	char_I_ppO2_min,WREG
-	mullw	d'100'						; char_I_ppO2_min*100
-	movff	PRODL,sub_a+0
-	movff	PRODH,sub_a+1
-	call	subU16						; sub_c = sub_a - sub_b
-	btfss	neg_flag
-	return								; Done (Too low).
-
-	;check if we are within our warning thresholds!
+	call	mult16x16						; xC = O2 ratio * (p_amb / 10)
+	; check for very high ppO2
+	tstfsz	xC+2							; O2_ratio * p_amb / 10 > 65536, i.e. ppO2 > 6.55 bar ?
+	return									; YES - gas is not usable
+	btfsc	xC+1,7							; check if ppO2 > 3.30 bar
+	return									; YES - gas is not usable
+	; check for low ppO2
 	movff	xC+0,sub_a+0
 	movff	xC+1,sub_a+1
-	movff	char_I_ppO2_max_deco,WREG	; ppO2 max for MOD calculation and color coding in divemode
-	addlw	.1							; e.g. >1.60
-	mullw	d'100'						; char_I_ppO2_max*100
+	movf	ppO2_min,W
+	mullw	.100							; char_I_ppO2_min * 100
 	movff	PRODL,sub_b+0
 	movff	PRODH,sub_b+1
-	call	subU16						; sub_c = sub_a - sub_b
-	btfsc	neg_flag
-	bsf		better_gas_available		;=1: A better gas is available and a gas change is advised in divemode
-	return								; Done.
-
-
-check_dil_common:						; With Dil 0-4 in WREG
-	btfsc	better_gas_available		; Better Diluent already found?
-	return								; Yes, return
-	lfsr	FSR1,opt_dil_type			; 0=Disabled, 1=First, 2=Normal
-	tstfsz	PLUSW1						; =0?
-	bra		check_dil_common1			; No
-	return								; Yes, skip inactive diluents for test
-check_dil_common1:
-	incf	WREG,W						; 1-5
-	cpfseq	active_gas					; is this the current diluent?
-	bra		check_dil_common2			; No
-	return								; Yes, skip test for active diluent
-check_dil_common2:
-	decf	WREG,W						; 0-4
-	movwf	hi							; Save tested diluent 0-4
-	lfsr	FSR1,char_I_dil_change
-	movff	PLUSW1,lo					; Change depth into lo
-	movlw	minimum_change_depth
-	cpfsgt	lo							; Change depth>minimum_change_depth?
-	return								; No, Change depth not deep enough, skip!
-	movf	xC+0,W						; load depth in m into WREG
-	cpfsgt	lo							; gas_change_depth < current depth?
-	return								; No, check next gas
-	incf	hi,W						; 1-5
-	movff	WREG,better_gas_number		; number (1-5) of the "better gas" in divemode, =0: no better gas available
-	movlw	better_gas_window_neg
-	subwf	lo,W						; Change depth-better_gas_window_neg
-	cpfslt	xC+0						; current depth<Change depth-better_gas_window_neg?
-	bsf		better_gas_available		;=1: A better gas is available and a gas change is advised in divemode
+	call	subU16							; sub_c = sub_a - sub_b
+	btfsc	neg_flag						; within limit?
+	return									; NO - too low, gas is not usable
+	; check for high ppO2
+	movf	ppO2_max,W
+	mullw	.100							; ppO2_max * 100
+	movff	PRODL,sub_b+0
+	movff	PRODH,sub_b+1
+	infsnz	sub_b+0,F						; add 1 mbar to allowance to avoid exclusion on equal
+	incf	sub_b+1,F
+	call	subU16							; sub_c = sub_a - sub_b
+	btfss	neg_flag						; within limit?
+	return									; NO - too high, gas is not usable
+	; we have a (new) best gas
+	movff	check_gas_num,  best_gas_num	; set checked gas (1-5) as best gas
+	movff	check_gas_depth,best_gas_depth	; memorize its change depth
 	return
 
 
 ;=============================================================================
 ; Check for Auto-SP
 ;
-check_dive_autosp:						; Check for Auto-SP
+check_dive_autosp:						; check for Auto-SP
 	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor, =2: Auto SP
 	sublw	.2							; opt_ccr_mode = 2 (Auto SP)?
-	bz		check_dive_autosp2			; Yes, check
-	return								; No, return for Sensor or Fixed mode
+	bz		check_dive_autosp2			; YES - check
+	return								; NO  - return for sensor or fixed mode
 check_dive_autosp2:
-	SAFE_2BYTE_COPY rel_pressure,xA
-	movlw	d'100'
-	movwf	xB+0
-	clrf	xB+1
-	call	div16x16					; compute depth in full m -> result in xC+0
 	; Check SP2
-	btfsc	sp2_switched				; =1: This setpoint has been autoselected already
-	bra		check_dive_autosp3			; Skip check
-	movff	char_I_setpoint_change+1,lo	; Get depth in m
-	tstfsz	lo							; =0?
-	bra		check_dive_autosp2a			; No, continue
-	bra		check_dive_autosp3			; Skip check
+	btfsc	sp2_switched				; SP 2 used so far?
+	bra		check_dive_autosp3			; YES - continue with SP 3
+	movff	char_I_setpoint_change+1,lo	; NO  - get depth in m
+	tstfsz	lo							;     - SP change depth = 0 ?
+	bra		check_dive_autosp2a			;       NO  - continue
+	bra		check_dive_autosp3			;       YES - continue with SP 3
 check_dive_autosp2a:
-	decf	lo,W						; -1 -> WREG
-	cpfsgt	xC+0						; Compare with depth
-	bra		check_dive_autosp3			; lower depth, do not switch
+	decf	lo,W						; SP change depth -1 -> WREG
+	cpfsgt	curr_depth					; current depth > change depth - 1 ?
+	bra		check_dive_autosp3			; NO  - continue with SP 3
 	; auto switch to SP2
-	movff	char_I_setpoint_cbar+1,char_I_const_ppO2	; Use SetPoint
-	rcall	xmit_sp_set_flag
-	bsf		sp2_switched				; Set flag
+	movff	char_I_setpoint_cbar+1,char_I_const_ppO2 ; YES - use SP
+	rcall	xmit_sp_set_flag			;     - send SP to external devices
+	bsf		sp2_switched				;     - set SP 2 used flag
 check_dive_autosp3:
 	; Check SP3
-	btfsc	sp3_switched				;=1: This setpoint has been autoselected already
-	bra		check_dive_autosp4			; Skip check
-	movff	char_I_setpoint_change+2,lo	; Get depth in m
-	tstfsz	lo							; =0?
-	bra		check_dive_autosp3a			; No, continue
-	bra		check_dive_autosp4			; Skip check
+	btfsc	sp3_switched				; SP 3 used so far?
+	bra		check_dive_autosp4			; YES - continue with SP 4
+	movff	char_I_setpoint_change+2,lo	; NO  - get depth in m
+	tstfsz	lo							;     - SP change depth = 0 ?
+	bra		check_dive_autosp3a			;       NO  - continue
+	bra		check_dive_autosp4			;       YES - continue with SP 4
 check_dive_autosp3a:
-	decf	lo,W						; -1 -> WREG
-	cpfsgt	xC+0						; Compare with depth
-	bra		check_dive_autosp4			; lower depth, do not switch
+	decf	lo,W						; SP change depth -1 -> WREG
+	cpfsgt	curr_depth					; current depth > change depth - 1 ?
+	bra		check_dive_autosp4			; NO  - continue with SP 4
 	; auto switch to SP3
-	movff	char_I_setpoint_cbar+2,char_I_const_ppO2	; Use SetPoint
-	rcall	xmit_sp_set_flag
-	bsf		sp3_switched				; Set flag
+	movff	char_I_setpoint_cbar+2,char_I_const_ppO2 ; YES - use SP
+	rcall	xmit_sp_set_flag			;     - send SP to external devices
+	bsf		sp3_switched				;     - set SP 3 used flag
 check_dive_autosp4:
 	; Check SP4
-	btfsc	sp4_switched				;=1: This setpoint has been autoselected already
-	bra		check_dive_autosp5			; Skip check
-	movff	char_I_setpoint_change+3,lo ; Get depth in m
-	tstfsz	lo							; =0?
-	bra		check_dive_autosp4a			; No, continue
-	bra		check_dive_autosp5			; Skip check
+	btfsc	sp4_switched				; SP 4 used so far?
+	bra		check_dive_autosp5			; YES - continue with SP 5
+	movff	char_I_setpoint_change+3,lo ; NO  - get depth in m
+	tstfsz	lo							;     - SP change depth = 0 ?
+	bra		check_dive_autosp4a			;       NO  - continue
+	bra		check_dive_autosp5			;        YES - continue with SP 5
 check_dive_autosp4a:
-	decf	lo,W						; -1 -> WREG
-	cpfsgt	xC+0						; Compare with depth
-	bra		check_dive_autosp5			; lower depth, do not switch
+	decf	lo,W						; SP change depth -1 -> WREG
+	cpfsgt	curr_depth					; current depth > change depth - 1 ?
+	bra		check_dive_autosp5			; NO  - continue with SP 5
 	; auto switch to SP4
-	movff	char_I_setpoint_cbar+3,char_I_const_ppO2 ; Use SetPoint
-	rcall	xmit_sp_set_flag
-	bsf		sp4_switched				; Set flag
+	movff	char_I_setpoint_cbar+3,char_I_const_ppO2 ; YES - use SP
+	rcall	xmit_sp_set_flag			;     - send SP to external devices
+	bsf		sp4_switched				;     - set SP 4 used flag
 check_dive_autosp5:
 	; Check SP5
-	btfsc	sp5_switched				;=1: This setpoint has been autoselected already
-	bra		check_dive_autosp6			; Skip check
-	movff	char_I_setpoint_change+4,lo	; Get depth in m
-	tstfsz	lo							; =0?
-	bra		check_dive_autosp5a			; No, continue
-	bra		check_dive_autosp6			; Skip check
+	btfsc	sp5_switched				; SP 5 used so far?
+	bra		check_dive_autosp6			; YES - done
+	movff	char_I_setpoint_change+4,lo	; NO  - get depth in m
+	tstfsz	lo							;     - SP change depth = 0 ?
+	bra		check_dive_autosp5a			;       NO  - continue
+	bra		check_dive_autosp6			;       YES - done
 check_dive_autosp5a:
-	decf	lo,W						; -1 -> WREG
-	cpfsgt	xC+0						; Compare with depth
-	bra		check_dive_autosp6			; lower depth, do not switch
+	decf	lo,W						; SP change depth -1 -> WREG
+	cpfsgt	curr_depth					; current depth > change depth - 1 ?
+	bra		check_dive_autosp6			; NO  - done
 	; auto switch to SP5
-	movff	char_I_setpoint_cbar+4,char_I_const_ppO2 ; Use SetPoint
-	rcall	xmit_sp_set_flag
-	bsf		sp5_switched				; Set flag
+	movff	char_I_setpoint_cbar+4,char_I_const_ppO2 ; YES - use SP
+	rcall	xmit_sp_set_flag			;     - send SP to external devices
+	bsf		sp5_switched				;     - set SP 5 used flag
 check_dive_autosp6:
 	return
 
 xmit_sp_set_flag:
 	movff	char_I_const_ppO2,WREG
-	call	transmit_setpoint			; Transmit current setpoint from WREG (in cbar) to external electronics
-	bsf		setpoint_changed			; Set flag (for profile)
-	bsf		event_occured				; Set event flag
+	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
+	bsf		setpoint_changed			; set flag (for profile)
+	bsf		event_occured				; set event flag
 	return
 
 set_logbook_marker:
 	bcf		FLAG_set_marker				; clear flag
-	movlw	d'6'						; set type of Alarm (manual marker)
-	movwf	AlarmType					; copy to Alarm Register
-	bsf		event_occured				; Set event flag
+	movlw	d'6'						; set type of alarm (manual marker)
+	movwf	AlarmType					; copy to alarm register
+	bsf		event_occured				; set event flag
 	return
 
 ;=============================================================================
-; Setup everything to enter divemode.
+; Setup everything to enter dive mode
 ;
+	global	dive_boot_oc_bail
+dive_boot_oc_bail:
+	; copy opt_gas_types into backup (for "lost gas" feature)
+	movff	opt_gas_type+0,opt_gas_type_backup+0		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	movff	opt_gas_type+1,opt_gas_type_backup+1		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	movff	opt_gas_type+2,opt_gas_type_backup+2		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	movff	opt_gas_type+3,opt_gas_type_backup+3		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	movff	opt_gas_type+4,opt_gas_type_backup+4		; 0=Disabled, 1=First, 2=Travel, 3=Deco
+	; done
+	return
+
+	global	dive_boot_oc
 dive_boot_oc:
-	rcall	get_first_gas_to_WREG		; Gets first gas (1-5) into WREG
+	; set-up registers
+	rcall	get_first_gas_to_WREG		; get first gas (1-5) into WREG
 	rcall	setup_gas_registers			; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5)
 	rcall	deco_setup_oc_gases			; set-up of gas list for deco calculations (with WREG = gas 1-5)
 	return
 
+	global	dive_boot_cc
 dive_boot_cc:
-	bcf		is_bailout					; =1: Bailout
-	bcf		setpoint_fallback			; =1: Fallback to SP1 due to external O2 sensor failure
-	bcf		blinking_setpoint			; Reset blinking SP flag
-
+	; copy opt_dil_types into backup (for "lost diluent" feature)
+	movff	opt_dil_type+0,opt_dil_type_backup+0		; 0=Disabled, 1=First, 2=Normal
+	movff	opt_dil_type+1,opt_dil_type_backup+1		; 0=Disabled, 1=First, 2=Normal
+	movff	opt_dil_type+2,opt_dil_type_backup+2		; 0=Disabled, 1=First, 2=Normal
+	movff	opt_dil_type+3,opt_dil_type_backup+3		; 0=Disabled, 1=First, 2=Normal
+	movff	opt_dil_type+4,opt_dil_type_backup+4		; 0=Disabled, 1=First, 2=Normal
+	; clear flags
+	bcf		FLAG_bailout_mode			; =1: bailout
+	bcf		setpoint_fallback			; =1: fallback to SP1 due to external O2 sensor failure
+	; set-up registers
+	rcall	get_first_dil_to_WREG		; get first diluent (1-5) into WREG
+	rcall	setup_dil_registers			; set-up of diluent parameters for currently breathed diluent (with WREG = current diluent 1-5)
+	rcall	deco_setup_cc_diluents		; set-up of diluent list for deco calculations (with WREG = current diluent 1-5)
+	; done
+	return
+
+dive_boot_cc_part2:
 	; revoke sensors from usage if they do not have a valid calibration
 	bsf		use_O2_sensor1
 	bsf		use_O2_sensor2
@@ -2061,108 +2235,120 @@
 	bcf		use_O2_sensor2
 	btfss	sensor3_calibrated_ok
 	bcf		use_O2_sensor3
-
+	; check for external HUD/ppO2 Monitor
 	btfss	optical_input				; do we have an optical input?
-	bra	dive_boot_cc_0				; No
-	; Copy (initial) valid flags from HUD/ppO2 Monitor
+	bra		dive_boot_cc_part2_1		; NO
+	; copy (initial) valid flags from HUD/ppO2 Monitor
 	btfsc	sensor1_active
-	bsf	use_O2_sensor1
-    	btfsc	sensor2_active
-	bsf	use_O2_sensor2
+	bsf		use_O2_sensor1
+	btfsc	sensor2_active
+	bsf		use_O2_sensor2
 	btfsc	sensor3_active
-	bsf	use_O2_sensor3
-
-dive_boot_cc_0:
+	bsf		use_O2_sensor3
+dive_boot_cc_part2_1:
 	; In pSCR mode, only settings 0 (calculated ppO2) and 1 (ppO2 from sensors) are defined.
-	; In case we still have 3 (auto SP) selected out of previous ccr mode, we reset to 0.
+	; In case we still have 3 (auto SP) selected out of previous CCR mode, we reset to 0.
 	btfss	FLAG_pscr_mode
-	bra		dive_boot_cc_1
+	bra		dive_boot_cc_part2_2
 	movff	opt_ccr_mode,WREG			; =0: Fixed SP (CCR) / calculated SP (pSCR), =1: Sensor, =2: Auto SP
 	sublw	.2							; opt_ccr_mode = 1 (Auto SP)?
-	bnz		dive_boot_cc_1
+	bnz		dive_boot_cc_part2_2
 	movlw	.0
 	movff	WREG,opt_ccr_mode
-
-dive_boot_cc_1:
+dive_boot_cc_part2_2:
 	bsf		setpoint_changed			; set flag (for profile)
-	bcf		sp2_switched				; =1: This setpoint has been auto-selected already
-	bcf		sp3_switched				; =1: This setpoint has been auto-selected already
-	bcf		sp4_switched				; =1: This setpoint has been auto-selected already
-	bcf		sp5_switched				; =1: This setpoint has been auto-selected already
-
-	rcall	get_first_dil_to_WREG		; get first gas (1-5) into WREG
-	rcall	setup_dil_registers			; set-up of gas parameters for currently breathed gas (with WREG = current gas 1-5)
-	rcall	deco_setup_cc_diluents		; set-up of gas list for deco calculations (with WREG = current gas 1-5)
-
+	bcf		sp2_switched				; =1: this setpoint has been auto-selected already
+	bcf		sp3_switched				; =1: this setpoint has been auto-selected already
+	bcf		sp4_switched				; =1: this setpoint has been auto-selected already
+	bcf		sp5_switched				; =1: this setpoint has been auto-selected already
 	; Start with SP1 (CCR) or 0 (pSCR) as default.
 	; If in sensor mode, this value will be overwritten by calc_deko_divemode_sensor
 	clrf	WREG						; preload WREG with setpoint value 0 for pSCR calculated
-	btfss	FLAG_ccr_mode				; are we in CCR mode?
-	bra		dive_boot_cc_2				; NO  - keep preloaded value
+	btfsc	FLAG_ccr_mode				; are we in CCR mode?
 	movff	char_I_setpoint_cbar+0,WREG	; YES - get value of setpoint 1
-dive_boot_cc_2:
 	movff	WREG,char_I_const_ppO2		; write setpoint to deco engine
 	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
 	goto	calc_deko_divemode_sensor	; read & process sensor data (and return)
 
+
 diveloop_boot:
+
+	; do the basic initialization
 	call	restart_set_modes_and_flags
 
-	call	I2C_sleep_accelerometer		; stop accelerometer
-	call	I2C_sleep_compass			; stop compass
+	; stop accelerometer and compass
+	call	I2C_sleep_accelerometer
+	call	I2C_sleep_compass
+
+	; reset max pressure aka max depth
+	clrf	WREG
+	movff	WREG,max_pressure+0	
+	movff	WREG,max_pressure+1
+
+	; initialize press needs to zero and invalid (not yet computed) state
+	clrf	WREG						; set WREG to 0
+ IFDEF _cave_mode
+	movff	WREG,char_I_backtrack_time	; clear backtracking time (index to char_I_backtrack_depth)
+	movff	WREG,char_I_backtrack_depth	; prime first entry with depth 0
+ ENDIF
+	bsf		WREG,int_is_zero			; set zero flag
+	bsf		WREG,int_invalid_flag		; set invalid flag (additionally)
+	banksel	int_O_ascent_pres_need		; select bank with shared output vars
+	movwf	int_O_ascent_pres_need+1	; Set flags for tank pressure needs = 0 before p2_deco.c
+	movwf	int_O_ascent_pres_need+3	; can do it. If this is not done here and the gas needs
+	movwf	int_O_ascent_pres_need+5	; custom view is shown before p2_deco.c completes the first
+	movwf	int_O_ascent_pres_need+7	; deco calculation, some rubbish numbers from last dive or
+	movwf	int_O_ascent_pres_need+9	; simulation may be shown
+	banksel	common						; back to bank common
+
+	; configure the deco engine
+	clrf	hi
+	bsf		hi,DECO_Z_FACTOR_FLAG		; enable Z factor mode by default
+	TSTOSS	opt_ZfactorUse				; shall use Z factor mode?
+	bcf		hi,DECO_Z_FACTOR_FLAG		; NO - disable again
+ IFDEF _rx_functions
+	bsf		hi,DECO_TR_FUNCTIONS		; enable TR mode by default
+	btfss	FLAG_tr_enabled				; shall use TR mode?
+	bcf		hi,DECO_TR_FUNCTIONS		; NO - disable again
+ ENDIF
+	movff	hi,char_O_main_status		; bank-safe copy to deco engine
+
+	movff	char_O_deco_status,lo		; bank-safe read
+	bsf		lo,DECO_STATUS_0_FLAG		; set init-  | ATTENTION: The deco engine must be started in init state! If omitted, it may
+	bsf		lo,DECO_STATUS_1_FLAG		;     state, |            enter an infinite loop at some point in time and brick the OSTC!
+	bcf		lo,DECO_PLAN_FLAG			; normal plan mode,
+	bcf		lo,DECO_VOLUME_FLAG			; disable gas volume calculation, and
+	bcf		lo,DECO_ASCENT_FLAG			; disable delayed ascent calculation
+	movff	lo,char_O_deco_status		; bank-safe copy back to deco engine
 
 	clrf	WREG
-	movff	WREG,max_pressure+0			; clear some variables
-	movff	WREG,max_pressure+1
-
-	; init in invalid data state
-	clrf	WREG						; set WREG to 0
-	bsf		WREG,int_invalid_flag		; set invalid flag
-	bsf		WREG,int_is_zero			; set zero flag
-	movff	WREG,int_O_tank_pres_need+1	; Set flags for tank pressure needs = 0 before p2_deco.c
-	movff	WREG,int_O_tank_pres_need+3	; can do it. If this is not done here and the gas needs
-	movff	WREG,int_O_tank_pres_need+5	; custom view is shown before p2_deco.c completes the first
-	movff	WREG,int_O_tank_pres_need+7	; deco calculation, some rubbish numbers from last dive of
-	movff	WREG,int_O_tank_pres_need+9	; simulation may be shown
-
-	; configure the deco engine:
-	movff	char_O_deco_status,WREG		; bank-safe copy
-	bsf		WREG,DECO_STATUS_0_FLAG		; configure init ...
-	bsf		WREG,DECO_STATUS_1_FLAG		; ... state,
-	bcf		WREG,DECO_PLAN_FLAG			; normal plan mode,
-	bsf		WREG,DECO_CNS_FLAG			; enable CNS calculation (CNS at end of dive),
-	bcf		WREG,DECO_VOLUME_FLAG		; disable gas volume calculation, and
-	bcf		WREG,DECO_ASCENT_FLAG		; disable delayed ascent calculation
-	movff	WREG,char_O_deco_status		; bank-safe copy back
-
-	clrf	WREG
-	movff	WREG,char_O_main_status		; reset char_O_main_status
-
-	movlw	deco_distance
-	movff	WREG,char_I_deco_distance
-	movff	opt_last_stop,char_I_depth_last_deco
-	movff	opt_GF_low,char_I_GF_Low_percentage
-	movff	opt_GF_high,char_I_GF_High_percentage
-
-	bcf		use_agf						; Start with normal GF set
-	bcf		divemode_menu				; clear divemode menu flag
-
-	bcf		alternative_divelayout		; Start with default layout
-
+	movff	WREG,char_O_deco_warnings	; clear any deco warnings remaining from last dive
+	movff	WREG,char_O_deco_info		; clear any deco infos    remaining from last dive
+
+	movlw	deco_distance				; load distance between actual depth and depth used for deco calculation
+	movff	WREG,char_I_deco_distance	; write distance to the deco engine
+
+	movff	opt_last_stop,char_I_depth_last_deco	; write last stop depth to deco engine
+	movff	opt_GF_low,char_I_GF_Low_percentage		; write GF low  to deco engine
+	movff	opt_GF_high,char_I_GF_High_percentage	; write GF high to deco engine
+
+	bcf		onesectoggle				; clear toggle bit for calculation phasing
+	bcf		use_agf						; start with normal GF set
+	bcf		divemode_menu				; clear dive mode menu flag
+	bcf		alternative_divelayout		; start with default layout
 	bcf		blinking_depth_prev			; clear flag for blinking depth
-	bcf		blinking_depth_warning		; clear flag for blinking depth
 	bcf		blinking_depth_toggle		; clear flag for blinking depth
+	bcf		blinking_depth_warning		; clear flag for blinking depth as warning
+	bcf		blinking_depth_attention	; clear flag for blinking depth as attention
+	bcf		max_depth_greater_100m		; clear flag for last max/avg depth was > 100 m
 
 	movlw	d'1'
 	movwf	apnoe_max_pressure+0
 	clrf	apnoe_max_pressure+1
 ;	clrf	apnoe_surface_mins
 ;	clrf	apnoe_surface_secs
-	clrf	apnoe_mins
-	clrf	divemins+0
-	clrf	divemins+1
-
-	; Copy date and time for logbook
+
+	; copy date and time for logbook
 	movff	year,start_year
 	movff	month,start_month
 	movff	day,start_day
@@ -2171,146 +2357,187 @@
 
 	movff	int_O_CNS_fraction+0,CNS_start+0 ; save CNS value at beginning of dive
 	movff	int_O_CNS_fraction+1,WREG		 ; get high byte to WREG
-	bcf	WREG,int_warning_flag			 ; clear warning   flag
-	bcf	WREG,int_attention_flag			 ; clear attention flag
+	bcf		WREG,int_warning_flag			 ; clear warning   flag
+	bcf		WREG,int_attention_flag			 ; clear attention flag
 	movff	WREG,CNS_start+1				 ; move high byte on
 	movff	int_O_gradient_factor+0,GF_start ; save GF value at beginning of dive (only lower byte used for value)
 
-	bcf		no_more_divesecs				 ; =1: do no longer show seconds in divemode
+	bcf		no_more_divesecs			 ; =1: do no longer show seconds in dive mode
 	bcf		divemode_menu_active
 	clrf	menupos1
-	clrf	menupos2						 ; Reset to zero (Zero=no premenu or simulator task)
-	bsf		sensors_agree					 ; init of sensors disagree warning system
-
-	btfsc	FLAG_ccr_mode
-	bra		diveloop_boot_cc
-	btfsc	FLAG_pscr_mode
-	bra		diveloop_boot_cc
-	rcall	dive_boot_oc
-	bra		diveloop_boot_cont
-
-diveloop_boot_cc:
-	rcall	dive_boot_cc
-
-diveloop_boot_cont:
-	; Copy opt_dil_types into backup (For "lost gas" feature)
-	movff	opt_dil_type+0,opt_dil_type_backup+0					; 0=Disabled, 1=First, 2=Normal
-	movff	opt_dil_type+1,opt_dil_type_backup+1					; 0=Disabled, 1=First, 2=Normal
-	movff	opt_dil_type+2,opt_dil_type_backup+2					; 0=Disabled, 1=First, 2=Normal
-	movff	opt_dil_type+3,opt_dil_type_backup+3					; 0=Disabled, 1=First, 2=Normal
-	movff	opt_dil_type+4,opt_dil_type_backup+4					; 0=Disabled, 1=First, 2=Normal
-	; Copy opt_gas_types into backup (For "lost gas" feature)
-	movff	opt_gas_type+0,opt_gas_type_backup+0					; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	movff	opt_gas_type+1,opt_gas_type_backup+1					; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	movff	opt_gas_type+2,opt_gas_type_backup+2					; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	movff	opt_gas_type+3,opt_gas_type_backup+3					; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	movff	opt_gas_type+4,opt_gas_type_backup+4						; 0=Disabled, 1=First, 2=Travel, 3=Deco
-	; Also copy change depths into backup (For "lost gas" feature)
-	movff	char_I_dil_change+0,opt_dil_change_backup+0				; Gas change depths Diluents
-	movff	char_I_dil_change+1,opt_dil_change_backup+1				; Gas change depths Diluents
-	movff	char_I_dil_change+2,opt_dil_change_backup+2				; Gas change depths Diluents
-	movff	char_I_dil_change+3,opt_dil_change_backup+3				; Gas change depths Diluents
-	movff	char_I_dil_change+4,opt_dil_change_backup+4				; Gas change depths Diluents
-	; Also copy change depths into backup (For "lost gas" feature)
-	movff	opt_OC_bail_gas_change+0,opt_OC_bail_gas_change_backup+0; Gas change depths OC/Bailout
-	movff	opt_OC_bail_gas_change+1,opt_OC_bail_gas_change_backup+1; Gas change depths OC/Bailout
-	movff	opt_OC_bail_gas_change+2,opt_OC_bail_gas_change_backup+2; Gas change depths OC/Bailout
-	movff	opt_OC_bail_gas_change+3,opt_OC_bail_gas_change_backup+3; Gas change depths OC/Bailout
-	movff	opt_OC_bail_gas_change+4,opt_OC_bail_gas_change_backup+4; Gas change depths OC/Bailout
-
-	clrf	WREG
-	movff	WREG,better_gas_number		; clear better gas register
-
-	bcf		show_safety_stop			; =1: Show the safety stop
-	clrf	safety_stop_countdown		; Clear count-down
-
-	clrf	samplesecs
+	clrf	menupos2					 ; reset to zero (Zero=no pre-menu or simulator task)
+	bsf		sensors_agree				 ; init of sensors disagree warning system
+
+	bcf		show_safety_stop			; =1: show the safety stop
+	clrf	safety_stop_countdown		; clear count-down
+
+	clrf	samplesecs					; timer for data logging
 	clrf	apnoe_timeout_counter		; timeout in minutes
 	clrf	timeout_counter1+0			; takes care of the timeout (low  byte)
 	clrf	timeout_counter1+1			; takes care of the timeout (high byte)
 	clrf	AlarmType					; Clear all alarms
 	bcf		event_occured				; clear flag
-	clrf	average_depth_hold_total+0
+	clrf	average_divesecs_total+0	; clear non-resettable time accumulator
+	clrf	average_divesecs_total+1
+	clrf	average_depth_hold_total+0	; clear non-resettable average depth
 	clrf	average_depth_hold_total+1
 	clrf	average_depth_hold_total+2
-	clrf	average_depth_hold_total+3	; Clear Non-Resettable Average
-	rcall	reset_average1				; Reset the resettable average depth
-	bcf		decostop_active
-	bcf		better_gas_available		; =1: A better gas is available and a gas change is advised in divemode
-	call	ghostwriter_short_header	; Write short header with divenumber into profile memory
+	clrf	average_depth_hold_total+3
+	call	reset_average				; reset the resettable average depth
+
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; TR functions enabled?
+	bra		diveloop_boot_0				; NO  - skip TR function initialization
+										; YES - initialize TR function variables
+	banksel	int_O_sac_rate
+	clrf	int_O_sac_rate+0			; clear low byte      of SAC rate
+	clrf	int_O_pressure_need+0		; clear low byte      of 1st pressure need    value
+	clrf	int_O_pressure_need+2		; clear low byte      of 2nd pressure need    value
+	banksel	int_IO_pressure_value
+	clrf	int_IO_pressure_value+0		; clear low byte      of 1st pressure reading value
+	clrf	int_IO_pressure_value+2		; clear low byte      of 2nd pressure reading value
+	clrf	int_I_pressure_drop+0		; clear low byte      of 1st pressure drop    value
+	clrf	int_I_pressure_drop+2		; clear low byte      of 2nd pressure drop    value
+	clrf	char_I_pressure_gas+0		; clear gas selection of 1st pressure reading
+	clrf	char_I_pressure_gas+1		; clear gas selection of 2nd pressure reading
+	clrf	char_I_pressure_age+0		; clear age           of 1st pressure reading
+	clrf	char_I_pressure_age+1		; clear age           of 2nd pressure reading
+	clrf	char_I_pressure_stat+0		; clear status        of 1st pressure reading
+	clrf	char_I_pressure_stat+1		; clear status        of 2nd pressure reading
+	clrf	WREG						; clear WREG
+	bsf		WREG,int_not_avail_flag		; set   WREG to coding for integer numbers -> data not available
+	banksel	int_O_sac_rate
+	movwf	int_O_sac_rate+1			; copy to high byte     of SAC rate
+	movwf	int_O_pressure_need+1		; copy to high byte     of 1st pressure need    value
+	movwf	int_O_pressure_need+3		; copy to high byte     of 1st pressure need    value
+	banksel	int_IO_pressure_value
+	movwf	int_IO_pressure_value+1		; copy to high byte     of 1st pressure reading value
+	movwf	int_IO_pressure_value+3		; copy to high byte     of 2nd pressure reading value
+	movwf	int_I_pressure_drop+1		; copy to high byte     of 1st pressure drop    value
+	movwf	int_I_pressure_drop+3		; copy to high byte     of 1st pressure drop    value
+	banksel	gas__last_1st				; select bank with vars for pressure drop calculation
+	setf	gas__last_1st				; invalidate last gas of 1st reading
+	setf	gas__last_2nd				; invalidate last gas of  2nd reading
+	banksel	common						; back to bank common
+ ENDIF
+
+diveloop_boot_0:
+	bcf		decostop_active				; clear flag for being in deco
+	setf	best_gas_number				; initialize best gas     as not computed yet (255)
+	setf	best_dil_number				; initialize best diluent as not computed yet (255)
+	bcf		better_gas_available		; =1: a better gas     is available and a gas change is advised
+	bcf		better_dil_available		; =1: a better diluent is available and a gas change is advised
+
+	rcall	dive_boot_oc_bail			; basic settings required for all modes
+
+	btfsc	FLAG_oc_mode				; in OC mode?
+	rcall	dive_boot_oc				; YES - add OC mode settings
+
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	rcall	dive_boot_cc				; YES - add CC mode settings
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	rcall	dive_boot_cc_part2			; YES - add CC sensor and SP settings
+
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	rcall	dive_boot_cc				; YES - add CC mode settings
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	rcall	dive_boot_cc_part2			; YES - add CC sensor and SP settings
+
+	call	ghostwriter_short_header	; write short header with dive number into profile memory
 
 	btfsc	simulatormode_active
 	bra		diveloop_boot_1
-	; Normal mode = Surface pressure is the pressure 30mn before dive.
-	SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface	;copy surfacepressure to deco routine
-	SAFE_2BYTE_COPY last_surfpressure_30min, last_surfpressure	;copy surfacepressure to last_surfpressure for correct depth
+
+	; normal mode = surface pressure is the pressure 30 minutes before dive
+	SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface	;copy surface pressure to deco routine
+	SAFE_2BYTE_COPY last_surfpressure_30min, last_surfpressure	;copy surface pressure to last_surfpressure for correct depth
 	bra		diveloop_boot_2
 
 diveloop_boot_1:
-	; Simulator mode: Surface pressure is 1bar.
-	movlw	LOW .1000
-	movff	WREG,int_I_pres_surface+0	; LOW copy surface pressure to deco routine
+	; simulator mode: set surface pressure to 1 bar because simulated depths are also based on 1 bar surface pressure
+	movlw	LOW  .1000
+	movff	WREG,int_I_pres_surface+0	; LOW  copy surface pressure to deco routine
 	movlw	HIGH .1000
 	movff	WREG,int_I_pres_surface+1	; HIGH copy surface pressure to deco routine
 
 diveloop_boot_2:
-	SAFE_2BYTE_COPY temperature,minimum_temperature ; Reset Min-Temp registers
+	SAFE_2BYTE_COPY temperature,minimum_temperature ; reset minimum temperature registers
 
 	call	init_recording_params		; set up all the divisors
 
-	bsf		ccr_diluent_setup			; For CCR mode (Required to have better gas working)
-	btfsc	FLAG_ccr_mode				; =1: CCR mode (Fixed ppO2 or Sensor) active
-	bra		divemode_boot2
+	bsf		FLAG_diluent_setup			; for CCR mode (required to have better gas working)
+	btfsc	FLAG_ccr_mode				; =1: CCR mode (fixed ppO2 or Sensor) active
+	bra		diveloop_boot_3
 	btfsc	FLAG_pscr_mode
-	bra		divemode_boot2
-	bcf		ccr_diluent_setup			; For OC mode (Required to have better gas working)
-
-divemode_boot2:
+	bra		diveloop_boot_3
+	bcf		FLAG_diluent_setup			; for OC mode (required to have better gas working)
+
+diveloop_boot_3:
 	bcf		LEDg						; switch off green LED / release reset to RX circuitry
-	bcf		LEDr						; switch off red LED
+	bcf		LEDr						; switch off red   LED
 	bcf		realdive
-	btfss	simulatormode_active		; do not disable in simulator mode!					
-	call	disable_rs232				; Disable RS232
-	btfsc	enable_screen_dumps			; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	call	enable_rs232				; Also sets to speed_normal ...
-	; Reset divetime seconds
-	movlw	.2							; Start at 2seconds
-	movwf	total_divetime_seconds+0
+	btfss	simulatormode_active		; in simulator mode?
+	call	disable_rs232				; NO - disable RS232
+
+ IFDEF _screendump
+	btfsc	enable_screen_dumps			; =1: ignore vin_usb, wait for "l" command (screen dump)
+	call	enable_rs232				; also sets to speed_normal
+ ENDIF
+
+	; reset dive time seconds
+;	movlw	.2							; start at 2 seconds
+;	movwf	total_divetime_seconds+0
+;	clrf	total_divetime_seconds+1
+;	movwf	divesecs
+;	movwf	apnoe_secs
+;	bsf		divemode2					; displayed dive time is running (dive time starts HERE)
+
+	; clear the timers (start dive times at zero)
+	clrf	total_divetime_seconds+0
 	clrf	total_divetime_seconds+1
-	movwf	divesecs
-	movwf	apnoe_secs
-	bsf		divemode2					; displayed divetime is running (Divetime starts HERE)
-	return								; Done with divemode boot
-
+	clrf	divesecs
+	clrf	divemins+0
+	clrf	divemins+1
+	clrf	apnoe_secs
+	clrf	apnoe_mins
+
+	; divemode2 flag will be set by pressure & timeout evaluation in function set_dive_modes
+
+	return								; done with dive mode boot
+
+
+;=============================================================================
 
 divemode_check_for_warnings:
-	movlw	.1							; One warning at a time in alt. layout mode
+	movlw	.1							; one message at a time in alternative layout
 	btfss	alternative_divelayout
-	movlw	.2							; Two warnings at a time in default layout mode
-	cpfsgt	warning_counter				; only one (or two) warnings active?
-	bra		divemode_check_for_warnings1 ; Yes, update every second
-
-	btfss	secs,0						; Every two seconds...
+	movlw	.2							; two messages at a time in default layout
+	cpfsgt	message_counter				; only one (or two) messages active?
+	bra		divemode_check_for_warnings1; YES - update every second
+
+	btfss	secs,0						; every two seconds...
 	return
-	btfss	secs,1						; Every four seconds...
+	btfss	secs,1						; every four seconds...
 	return
 
 divemode_check_for_warnings1:
-	bcf		warning_active				; Clear flag
-	clrf	warning_counter				; Clear counter
-
-	; warnings sorted by severity, highest severity first
-
-	; Warnings for all modes
-	call	check_warn_battery			; Check if the battery level should be displayed/warned
-	call	check_divetimeout			; Not actually a warning. Check and show the divemode timeout
-
-	btfsc	FLAG_apnoe_mode				; Done for Apnoe or Gauge mode
-	bra		divemode_check_for_warnings2
-	btfsc	FLAG_gauge_mode				; Done for Apnoe or Gauge mode
-	bra		divemode_check_for_warnings2
-
-	; Warnings only in deco modes
+	bcf		message_advice				; clear flag for messages of level advice
+	bcf		message_attention			; clear flag for messages of level attention
+	bcf		message_warning				; clear flag for messages of level warning
+	clrf	message_counter				; clear message counter
+
+	; messages sorted by severity: highest severity warnings first, then attentions, advices and last info
+
+	; warnings for all modes
+	call	check_warn_battery			; check if the battery level should be displayed/warned
+	call	check_divetimeout			; check and show the dive mode timeout (not actually a warning)
+
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		divemode_check_for_warnings2; YES
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		divemode_check_for_warnings2; YES
+
+	; warnings applicable only in deco modes
 	rcall	check_ppO2					; check ppO2 and displays warning, if required
 
 	btfss	sensors_agree				; are the sensor values within the threshold range?
@@ -2318,118 +2545,133 @@
 	btfsc	sensors_agree				; are the sensor values within the threshold range?
 	bcf		sensor_warning				; YES - revoke memorized sensor warning
 
-	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
-	btfsc	WREG,outside_warning_lock	; are we outside of the ZH-L16 model?
-	rcall	warn_outside				; YES
+	rcall	check_outside				; check of ZHL16 model violation
 
 	rcall	check_IBCD					; check for IBCD attention or warning
 
-	btfsc	decostop_active				; In deco mode?
-	rcall	check_and_store_gf_violation; Yes, sets warnings, if required
-
-	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
-	btfsc	WREG,mbubble_warning_lock	; do we have a microbubbles warning?
-	rcall	warn_mbubbles				; YES
+	rcall	check_OC_gas_avail			; check if a breathable OC gas is available
+
+	btfsc	decostop_active				; in deco mode?
+	rcall	check_and_store_gf_violation; YES - sets warnings, if required
+
+	rcall	check_mbubbles				; check for micro bubbles
 
 	rcall	check_cns_violation			; Check CNS value and display it, if required
 
-	;btfsc	decostop_active				; In deco mode?
-	rcall	check_gas_needs				; show gas needs warning if any gas need is > threshold
-
-	rcall	check_eod_cns_violation		; Check CNS values for end-of-dive and display warning, if required
-
-	call	TFT_display_ftts			; Show @+x time
-
-	btfsc	use_agf						; In aGF mode?
-	rcall	warn_agf					; Yes, show a warning for it
-
-	btfsc	setpoint_fallback			; =1: Fallback to SP1 due to external O2 sensor failure
-	rcall	warn_fallback				; Show the warning
+	rcall	check_gas_needs_ascent		; show gas needs warning if any gas need for ascent is > threshold
+
+	rcall	check_eod_cns_violation		; check CNS values for end-of-dive and display warning, if required
+
+	rcall	check_display_ftts			; show @+x time
+
+ IFDEF _cave_mode
+	btfsc	FLAG_cave_mode				; cave mode enabled?
+	rcall	check_cavemode				; YES - check cave mode status
+ ENDIF
+
+	btfsc	use_agf						; in aGF mode?
+	rcall	warn_agf					; YES - show memo
+
+	btfsc	setpoint_fallback			; fallback to SP1 due to external O2 sensor failure?
+	rcall	warn_fallback				; YES - show a warning
+
+	btfsc	better_dil_available		; is a better diluent available?
+	rcall	advice_gas_change			; YES - display an advice
+	btfsc	better_gas_available		; is a better gas     available?
+	rcall	advice_gas_change			; YES - display an advice
 
 divemode_check_for_warnings2:
-; Display the warning icon?
-	btfsc	warning_active				; Any warning active?
-	bsf		FLAG_TFT_divemode_warning	; Yes
-	btfss	warning_active				; Any warning active?
-	bsf		FLAG_TFT_divemode_warning_clear ; No, clear warning icon
-
-; Setup warning_page number
-	incf	warning_page,F
-	movf	warning_page,W
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled					; TR functions enabled?
+	bra		divemode_check_for_warnings3	; NO  - skip
+	call	check_tr_functions				; YES - check transmitter functions
+	call	check_tr_messages				;     - check SAC attention and switch advice
+ ENDIF
+
+divemode_check_for_warnings3:
+	; Display the attention or warning icon?
+	btfsc	message_advice					; any message of level advice?
+	bsf		FLAG_TFT_divemode_warning		; YES
+	btfsc	message_attention				; any message of level attention?
+	bsf		FLAG_TFT_divemode_warning		; YES
+	btfsc	message_warning					; any message of level warning?
+	bsf		FLAG_TFT_divemode_warning		; YES
+	btfss	FLAG_TFT_divemode_warning		; any message of above levels?
+	bsf		FLAG_TFT_divemode_warning_clear ; NO - clear warning icon
+
+	; Setup message page number
+	incf	message_page,F
+	movf	message_page,W
 	bcf		STATUS,C
-	btfss	alternative_divelayout
-	rlcf	warning_page,W				; *2 (But only in standard layout mode)
-	cpfsgt	warning_counter				; > warning_counter
-	clrf	warning_page				; No, clear
-
-; Clear both rows of warnings if there is nothing to show at all
-	tstfsz	warning_counter				; any warnings?
-	bra		divemode_check_for_warnings3 ; YES - look if second row needs to be cleared
-	bsf		FLAG_TFT_dive_warning_text_clear ; Set flag
+	btfss	alternative_divelayout			; in alternative layout?
+	rlcf	message_page,W					; NO - *2
+	cpfsgt	message_counter					; > message_counter?
+	clrf	message_page					; NO - clear
+
+	; Clear both rows of messages if there is nothing to show at all
+	tstfsz	message_counter					; any messages?
+	bra		divemode_check_for_warnings4	; YES - look if second row needs to be cleared
+	bsf		FLAG_TFT_dive_warning_text_clear; set flag
 	return
-divemode_check_for_warnings3:
-
-
-; Clear 2nd row of warnings if there is nothing to show (on this page)
-	btfss	second_row_warning			; =1: The second row contains a warning
-	bsf		FLAG_TFT_dive_warning_text_clr2	; Set flag for 2nd row
-	return								; Done.
+
+divemode_check_for_warnings4:
+	; Clear 2nd row of messages if there is nothing to show (on this page)
+	btfss	second_row_warning				; =1: the second row contains a warning
+	bsf		FLAG_TFT_dive_warning_text_clr2	; set flag for 2nd row
+	return									; done
 
 	global	check_warn_battery
 check_warn_battery:
 	movff	batt_percent,lo
 	movlw	battery_show_level+1
-	cpfslt	lo
-	return								; No Display, no warning
+	cpfslt	lo							; battery percentage ok?
+	return								; YES - no display, no warning
 	; Display Battery, but warn?
 	movff	batt_percent,lo
 	movlw	color_code_battery_low+1
-	cpfsgt	lo
-	bsf		warning_active				; Set Warning flag
-
-	movlw	.4
-	cpfseq	menupos3					; battery shown in Custom View 4?
-	bra		check_warn_battery2			; No
-	return								; Yes, do not show twice (in custom view and in warning area)
+	cpfsgt	lo							; battery percent below warning threshold?
+	bsf		message_warning				; YES - set warning flag
+	btfsc	alternative_divelayout		; in alternative layout?
+	bra		check_warn_battery2			; YES - show warning
+	movlw	index_clock_batt_surfpress	; NO  - index of custom view clock, battery and surface pressure
+	cpfseq	menupos3					;     - battery shown in custom view?
+	bra		check_warn_battery2			;       NO  - show warning
+	return								;       YES - do not show twice (in custom view and in message area)
 check_warn_battery2:
-	incf	warning_counter,F			; increase counter
-	goto	TFT_update_batt_percent_divemode ; Show percent (And return)
+	incf	message_counter,F			;       increase counter
+	goto	TFT_update_batt_percent_divemode ;  show percent (and return)
 
 check_divetimeout:
-	btfsc	divemode2
-	return								; displayed divetime is not running
-	incf	warning_counter,F			; increase counter
-	goto	TFT_divetimeout				; Show timeout counter (and return)
-
+	btfsc	divemode2					; dive time running?
+	return								; YES - do nothing
+	incf	message_counter,F			; increase counter
+	goto	TFT_divetimeout				; show timeout counter (and return)
 
 check_ppO2:
-	btfsc	FLAG_ccr_mode				; are we in CCR mode?
-	bra		check_ppO2_loop				; YES
-	btfsc	FLAG_pscr_mode				; are we in pSCR mode?
-	bra		check_ppO2_loop				; YES
-	bra		check_ppO2_oc_1				; NO  - neither CCR nor pSCR
-check_ppO2_loop:
-	btfsc	is_bailout					; in bailout?
-	bra		check_ppO2_oc_1				; YES - continue with OC
-	movff	int_O_pure_ppO2+1,hi		; NO  - get upper part of int_O_pure_ppO2
-	btfsc	hi,int_warning_flag			;       ppO2 of the pure diluent to low or high?
-	rcall	check_ppo2_display				;       YES - show warning and return on next line
-	btfsc	hi,int_attention_flag		;       ppO2 of the pure diluent close to setpoint?
-	rcall	check_ppo2_display				;       YES - show warning and return on next line
-	bra		check_ppO2_oc_2				;             skip attention threshold test on breathed ppO2
-check_ppO2_oc_1:
-	movff	int_O_breathed_ppO2+1,WREG	; get upper part of int_O_breathed_ppO2
-	btfsc	WREG,int_attention_flag		; breathed ppO2 just above attention threshold?
-	bra		check_ppo2_display			; YES - show ppO2
-check_ppO2_oc_2:
-	movff	int_O_breathed_ppO2+1,WREG	; get upper part of int_O_breathed_ppO2 (perhaps again)
-	btfsc	WREG,int_low_flag			; breathed ppO2 to low?
+	btfsc	FLAG_oc_mode				; are we in OC mode?
+	bra		check_ppO2_1				; YES - continue with breathed gas
+	btfsc	FLAG_bailout_mode			; NO  - in bailout?
+	bra		check_ppO2_1				;       YES - continue with breathed gas
+	; CCR / pSCR mode - checks on pure diluent
+	movff	int_O_pure_ppO2+0,lo		; get value and attention/warning flags for the pure diluent
+	movff	int_O_pure_ppO2+1,hi		;
+	btfsc	hi,int_warning_flag			; ppO2 of the pure diluent to low or high?
+	rcall	check_ppO2_dw				; YES - show warning and return on next line
+	btfsc	hi,int_attention_flag		; ppO2 of the pure diluent in attention state?
+	rcall	check_ppO2_da				; YES - show attention and return on next line
+	; all modes - checks on breathed gas (OC or from loop)
+check_ppO2_1:
+	movff	int_O_breathed_ppO2+0,lo	; get value and attention/warning flags for the breathed gas
+	movff	int_O_breathed_ppO2+1,hi	; get warnings for breathed gas
+	btfsc	hi,int_attention_flag		; breathed ppO2 in attention state (when in loop mode, no attention will be generated)?
+	bra		check_ppo2_display_a		; YES - set attention flag and show ppO2
+	btfsc	hi,int_low_flag				; breathed ppO2 to low?
 	bra		check_ppO2_low				; YES - record the warning and show ppO2
-	btfsc	WREG,int_high_flag			; breathed ppO2 to high?
+	btfsc	hi,int_high_flag			; breathed ppO2 to high?
 	bra		check_ppO2_high				; YES - record the warning and show ppO2
 	TSTOSS	opt_showppo2				; show ppO2 anyhow? (0 = no, 1 = show always)
-	return								; NO  - no warnings, no show
-	bra		check_ppo2_display			; YES - just show ppO2
+	return								; NO  - no warnings, no show - done
+	bra		check_ppO2_common_2			; YES - but only when in OC or bailout...
 check_ppO2_low:
 	movlw	d'4'						; set type of alarm (ppO2 low)
 	bra		check_ppO2_common			; continue with common part
@@ -2437,37 +2679,47 @@
 	movlw	d'5'						; set type of alarm (ppO2 high)
 check_ppO2_common:
 	movwf	AlarmType					; copy alarm type to alarm register
-	bsf		event_occured				; set event flag
-	bsf		warning_active				; set warning flag
-	btfsc	is_bailout					; are we in bailout?
-	bra		check_ppo2_display			; YES - skip CCR/pSCR checks
-	btfsc	FLAG_ccr_mode				; are we in CCR mode?
-	return								; YES - no extra warning required
-	btfsc	FLAG_pscr_mode				; are we in pSCR mode?
-	return								; YES - no extra warning required
-check_ppo2_display:						; display warning if ppO2 is not already shown in custom view
-	movlw	.9
-	cpfseq	menupos3					; ppO2 shown in Custom View 9?
-	bra		check_ppO2_a				; No
-	return								; Yes, do not show twice (in custom view and in warning area)
-check_ppO2_a:
-	movlw	.11
-	cpfseq	menupos3					; ppO2 shown in Custom View 11?
-	bra		check_ppO2_b				; No
-	return								; Yes, do not show twice (in custom view and in warning area)
+	bsf		event_occured				; set event   flag
+	bsf		message_warning				; show warning sign
+check_ppO2_common_2:
+	btfsc	FLAG_oc_mode				; are we in OC mode?
+	bra		check_ppo2_display			; YES
+	btfsc	FLAG_bailout_mode			; are we in bailout mode?
+	bra		check_ppo2_display			; YES
+	return								; NO  - in loop mode, ppO2 is already shown via setpoint display
+check_ppo2_display_a:
+	bsf		message_attention			; show attention sign
+check_ppo2_display:
+	btfsc	alternative_divelayout		; in alternative layout?
+	bra		check_ppO2_d				; YES - show warning
+	movlw	index_ppo2_ead_end_cns		; NO  - index of custom view ppO2, EAD/END and CNS)
+	cpfseq	menupos3					;       ppO2 shown?
+	bra		check_ppO2_b				;       NO
+	return								;       YES - do not show twice (in custom view and in warning area)
 check_ppO2_b:
-	movlw	.12
-	cpfseq	menupos3					; ppO2 shown in Custom View 12?
-	bra		check_ppO2_c				; No
-	return								; Yes, do not show twice (in custom view and in warning area)
-check_ppO2_c:
-	movlw	.10
-	cpfseq	menupos3					; ppO2 shown in Custom View 10?
-	bra		check_ppO2_d				; No
-	return								; Yes, do not show twice (in custom view and in warning area)
+	movlw	index_pscr_info				; index of custom view with pSCR data
+	cpfseq	menupos3					; ppO2 shown?
+	bra		check_ppO2_d				; NO  - show warning
+	return								; YES - do not show twice (in custom view and in warning area)
+check_ppO2_dw:
+	bsf		message_warning				; show warning sign
+check_ppO2_da:
+	bsf		message_attention			; show attention sign (no problem if a warning sign is set as well, as it will take priority)
 check_ppO2_d:
-	incf	warning_counter,F			; increase counter
-	goto	TFT_display_ppo2			; show breathed gas or diluent ppO2 warning (and return)
+	incf	message_counter,F			; increase counter
+	goto	TFT_display_ppo2_warning	; show breathed gas or diluent ppO2 warning (and return)
+
+
+check_display_ftts:
+	movff	char_I_extra_time,lo		; get extra time
+	tstfsz	lo							; extra time > 0 ?
+	bra		check_display_ftts_1		; YES - continue checking bailout condition
+	return								; NO  - done
+check_display_ftts_1:
+	btfsc	FLAG_bailout_mode			; in bailout mode?
+	return								; YES - in bailout no fTTS will be computed, so nothing to display
+	incf	message_counter,F			; NO  - increase counter
+	goto	TFT_display_ftts			;     - show @+x time
 
 
 	global	check_cns_violation
@@ -2475,32 +2727,35 @@
 	; Check if CNS should be displayed
 	movff	int_O_CNS_fraction+1,WREG	; get high byte
 	btfsc	WREG,int_warning_flag		; warning flag set?
-	bra		check_cns_violation2		; Yes - issue warning
-	btfsc	WREG,int_attention_flag		; attention flag set?
-	bra		display_cns_violation		; YES - just display CNS
-	return								; No  - no display, no warning
-check_cns_violation2:
-	bsf		warning_active				; Set Warning flag
-display_cns_violation:					; Show CNS if not shown in the custom view
-	movlw	.11
-	cpfseq	menupos3					; CNS shown in Custom View?
-	bra		display_cns_violation2		; No
-	return								; Yes, do not show twice (in custom view and in warning area)
-display_cns_violation2:
-	movlw	.8
-	cpfseq	menupos3					; CNS shown through Custom View 8 right now?
-	bra		display_cns_violation3		; No
-	return								; Yes, do not show twice (in custom view and in warning area)
-display_cns_violation3:
-	incf	warning_counter,F			; increase counter
-	goto	TFT_display_cns				; Show CNS (and return)
+	bra		check_cns_violation_1		; YES - issue warning
+	btfsc	WREG,int_attention_flag		; NO  - attention flag set?
+	bra		check_cns_violation_2		;       YES - issue attention
+	return								;       NO  - done
+check_cns_violation_1:
+	bsf		message_warning				; show warning sign
+check_cns_violation_2:
+	bsf		message_attention			; show attention sign
+	btfsc	alternative_divelayout		; in alternative layout?
+	bra		check_cns_violation_4		; YES - show attention
+	movlw	index_ppo2_ead_end_cns		; NO  - index of custom view ppO2, EAD/END and CNS
+	cpfseq	menupos3					;     - CNS shown?
+	bra		check_cns_violation_3		;       NO
+	return								;       YES - do not show twice (in custom view and in warning area)
+check_cns_violation_3:
+	movlw	index_CNS					; index of custom view with CNS values
+	cpfseq	menupos3					; CNS shown?
+	bra		check_cns_violation_4		; NO
+	return								; YES - do not show twice (in custom view and in warning area)
+check_cns_violation_4:
+	incf	message_counter,F			; increase counter
+	goto	TFT_display_cns				; show CNS (and return)
 
 
 	global	check_eod_cns_violation		; check end-of-dive CNS values
 check_eod_cns_violation:
 	movff	int_O_CNS_fraction+1,WREG	; get high-byte of current CNS value
 	btfsc	WREG,int_warning_flag		; current CNS value in warning state?
-	return								; YES - inhibit eod warning if current CNS is already in warning
+	return								; YES - inhibit end-of-dive warning if current CNS is already in warning
 	movff	int_O_normal_CNS_fraction+1,WREG
 	btfsc	WREG,int_invalid_flag		; flag for invalid value set?
 	bra		check_eod_cns_violation1	; YES - continue with checking the other CNS value
@@ -2511,16 +2766,18 @@
 	btfsc	WREG,int_invalid_flag		; flag for invalid value set?
 	return								; YES - done with CNS checking
 	btfsc	WREG,int_warning_flag		; NO  - flag for warning set?
-	bra		check_eod_cns_violation2	;       Yes - issue warning
+	bra		check_eod_cns_violation2	;       YES - issue warning
 	return								;       NO  - done with CNS checking
-check_eod_cns_violation2:				; YES - issue warning
-	bsf		warning_active				; set Warning flag
-	movlw	.8							; issue textual warning if CNS values are not shown in the custom view right now
-	cpfseq	menupos3					; CNS values shown through Custom View 8 right now?
-	bra		display_eod_cns_violation	; NO  - issue textual warning
-	return								; YES - do not show twice (in custom view and in warning area)
+check_eod_cns_violation2:				; issue warning (actually only on attention level)
+	bsf		message_attention			; show attention sign
+	btfsc	alternative_divelayout		; in alternative layout?
+	bra		display_eod_cns_violation	; YES - show warning
+	movlw	index_CNS					; NO  - index of custom view with CNS values
+	cpfseq	menupos3					;     - CNS values shown?
+	bra		display_eod_cns_violation	;       NO  - issue textual warning
+	return								;       YES - do not show twice (in custom view and in warning area)
 display_eod_cns_violation:
-	incf	warning_counter,F			; increase counter
+	incf	message_counter,F			; increase counter
 	goto	TFT_display_eod_cns			; issue CNS at end-of-dive warning (and return)
 
 
@@ -2532,7 +2789,7 @@
 	movlw	d'2'							; YES - set type of alarm
 	movwf	AlarmType						;		copy to alarm register
 	bsf		event_occured					;		set event   flag
-	bsf		warning_active					;		set warning flag
+	bsf		message_warning					;		set warning flag
 	bra		check_and_store_gf_violation3	;		show gf warning
 check_and_store_gf_violation2:
 	btfsc	WREG,int_attention_flag			; check if the attention flag is set
@@ -2543,56 +2800,268 @@
 	btfss	WREG,IBCD_warning				;			 is the IBCD warning flag set?
 	bra		check_and_store_gf_violation4	;			 NO  - continue checking for deco info
 check_and_store_gf_violation3:				;			 YES - show gf
-	bsf		warning_active					; set Warning flag
-	incf	warning_counter,F				; increase counter
+	bsf		message_attention				; show attention sign
+	incf	message_counter,F				; increase counter
 	goto	TFT_warning_gf					; show GF (and return)
 check_and_store_gf_violation4:				; check for deco info
-	btfss	divemode						; in divemode?
+	btfss	divemode						; in dive mode?
 	return									; NO  - done, return
-	movff	char_O_deco_warnings,WREG		; YES - get the deco warnings vector
-	btfss	WREG,deco_flag					;       check if the deco flag is set
-	return									;       NO  - all done, return
-	incf	warning_counter,F				;       YES - increase counter
-	goto	TFT_info_deco					;             show deco info
-
-
-warn_outside:
-	incf	warning_counter,F			; increase counter
-	bsf		warning_active				; Set Warning flag
-	goto	TFT_warning_outside			; show outside warning (and return)
-
-
-	global	warn_mbubbles
-warn_mbubbles:
-	incf	warning_counter,F			; increase counter
-	bsf		warning_active				; Set Warning flag
-	goto	TFT_warning_mbubbles		; show microbubbles warning (and return)
-	
+	btfsc	FLAG_bailout_mode				; YES - in bailout mode?
+	return									;       YES - done, return (deco_decreasing flag is not updated when in bailout mode)
+	movff	char_O_deco_info,WREG			;       NO  - get the deco info vector
+	btfss	WREG,deco_decreasing			;             check if the deco_decreasing flag is set
+	return									;             NO  - done, return
+	incf	message_counter,F				;             YES - increase counter
+	goto	TFT_info_deco					;                 - show deco info
+
+
+check_outside:
+	movff	char_O_deco_warnings,WREG	; bank-safe copy of deco warnings
+	btfss	WREG,outside_warning_lock	; are we outside of the ZH-L16 model?
+	return								; NO  - done
+	incf	message_counter,F			; YES - increase counter
+	bsf		message_attention			;     - show attention sign
+	btfsc	WREG,outside_warning		;     - are we outside the ZH-L16 model right now (-> warning)?
+	bsf		message_warning				;     - set warning flag
+	goto	TFT_warning_outside			;     - show outside-ZHL-model warning/attention (and return)
+
+
+	global	check_mbubbles
+check_mbubbles:
+	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
+	btfsc	WREG,mbubble_warning		; are we in micro bubbling zone right now?
+	bra		check_mbubbles_warn			; YES
+	btfss	WREG,mbubble_warning_lock	; were we in micro bubbling zone?
+	return								; NO  - done
+check_mbubble_att						; YES - attention level
+	incf	message_counter,F			; increase counter
+	bsf		message_attention			; show attention sign
+	goto	TFT_warning_mbubbles		; show micro bubble attention (and return) - TFT_warning_mbubbles switches by itself between attention and warning
+check_mbubbles_warn:					; locked micro bubbles - warning level if at issue, attention level if locked
+	incf	message_counter,F			; increase counter
+	bsf		message_warning				; set warning flag
+	goto	TFT_warning_mbubbles		; show micro bubbles warning (and return)
+
+ IFDEF _cave_mode
+check_cavemode:
+	incf	message_counter,F			; increase counter
+	btfsc	FLAG_dive_turned			; dive turned?
+	goto	TFT_info_dive_turned		; YES - show info that dive is turned
+	btfsc	FLAG_cave_mode_shutdown		; NO  - has cave mode shut down?
+	goto	TFT_warn_cave_shutdown		;       YES - show that cave mode has shut down
+	goto	TFT_info_cave_mode			;       NO  - show that cave mode is active
+ ENDIF
+
 warn_agf:
-	incf	warning_counter,F			; increase counter
-	goto	TFT_warning_agf				; Show aGF warning (and return)
+	incf	message_counter,F			; increase counter
+	goto	TFT_warning_agf				; show aGF warning (and return)
 
 warn_fallback:
-	incf	warning_counter,F			; increase counter
-	bsf		warning_active				; Set Warning flag
-	goto	TFT_warning_fallback		; Show fallback warning (and return)
-
-
-check_gas_needs:
-	banksel	int_O_tank_pres_need
-	movf	int_O_tank_pres_need+1,w	; get               HIGH(pres need of 1st tank)
-	iorwf	int_O_tank_pres_need+3,w	; inclusive or with HIGH(pres need of 2nd tank)
-	iorwf	int_O_tank_pres_need+5,w	; inclusive or with HIGH(pres need of 3rd tank)
-	iorwf	int_O_tank_pres_need+7,w	; inclusive or with HIGH(pres need of 4th tank)
-	iorwf	int_O_tank_pres_need+9,w	; inclusive or with HIGH(pres need of 5th tank)
+	incf	message_counter,F			; increase counter
+	bsf		message_warning				; set warning flag
+	goto	TFT_warning_fallback		; show fallback warning (and return)
+
+
+ IFDEF _rx_functions
+
+check_tr_messages:
+	movff	int_O_sac_rate+1,WREG		; bank-safe copy of current SAC rate
+	btfss	WREG,int_attention_flag		; attention flag set?
+	bra		check_tr_messages2			; NO  - skip
+	btfsc	WREG,int_not_avail_flag		; SAC rate available?
+	bra		check_tr_messages2			; NO  - continue with swap advice
+	bsf		message_attention			; YES - show attention sign
+	btfsc	alternative_divelayout		;     - in alternative layout?
+	bra		check_tr_messages1			;       YES - show attention message
+	movlw	index_pressures_SAC			;       NO  - index of custom view with SAC rate
+	cpfseq	menupos3					;           - SAC rate shown right now?
+	bra		check_tr_messages1			;             NO  - show attention message
+	bra		check_tr_messages2			;             YES - do not show twice, continue with swap advice
+check_tr_messages1:
+	incf	message_counter,F			; increase counter
+	call	TFT_attention_sac			; show SAC attention
+check_tr_messages2:
+	movff	char_O_deco_info,WREG		; bank-safe copy of deco info vector
+	btfss	WREG,ind_double_switch		; swap tank flag set?
+	return								; NO
+	incf	message_counter,F			; YES - increase counter
+	bsf		message_advice				;     - show advice sign
+	goto	TFT_advice_switch			;     - show swap advice
+
+
+#DEFINE show_custview			ul,0		; show pressure readings custom view
+#DEFINE show_transmitter		ul,1		; show transmitter attention
+#DEFINE show_pres_warning		ul,2		; show transmitter pressure warning
+#DEFINE show_pres_attention		ul,3		; show transmitter pressure attention
+
+check_tr_functions:
+	clrf	ul								; set all messages as not shown yet
+	btfsc	alternative_divelayout			; in alternative layout?
+	bra		check_tr_functions_tr1			; YES - continue with checking transmitter 1
+	movlw	index_pressures_SAC				; NO  - index of custom view pressure readings
+	cpfseq	menupos3						;     - pressure readings shown?
+	bra		check_tr_functions_tr1			;       NO  - continue with checking transmitter 1
+	bsf		show_custview					;       YES - suppress redraw by faking it has already been redrawn
+check_tr_functions_tr1:
+	movff	char_I_pressure_stat+0,WREG		; get status of 1st pressure reading
+	rcall	check_tr_functions_helper1		; check for transmitter 1 lost
+	rcall	check_tr_functions_helper2		; check for transmitter 1 low battery
+	movff	int_IO_pressure_value+1,WREG	; get high byte of 1st pressure reading
+	rcall	check_tr_functions_helper3		; check for transmitter 1 pressure warning
+	rcall	check_tr_functions_helper4		; check for transmitter 1 pressure attention
+check_tr_functions_tr2:
+	movff	char_I_pressure_stat+1,WREG		; get status of 2nd pressure reading
+	rcall	check_tr_functions_helper5		; check for transmitter 2 lost
+	rcall	check_tr_functions_helper6		; check for transmitter 2 low battery
+	movff	int_IO_pressure_value+3,WREG	; get high byte of 2nd pressure reading
+	rcall	check_tr_functions_helper7		; check for transmitter 2 pressure warning
+	rcall	check_tr_functions_helper8		; check for transmitter 2 pressure attention
+check_tr_functions_show_xmtr:
+	btfss	show_transmitter				; shall show transmitter message?
+	bra		check_tr_functions_show_warn	; NO  - continue with pressure warning
+	bsf		message_attention				; YES - set flag for attention
+	incf	message_counter,F				;     - increase counter
+	call	TFT_attention_transmitter		;     - show transmitter attention message
+check_tr_functions_show_warn:
+	btfss	show_pres_warning				; shall show pressure warning?
+	bra		check_tr_functions_show_att		; NO  - continue with pressure attention
+	bsf		message_warning					; YES - set flag for warning
+	incf	message_counter,F				;     - increase counter
+	goto	TFT_warning_pres_reading		;     - pressure reading warning message and done then
+check_tr_functions_show_att:
+	btfss	show_pres_attention				; shall show pressure attention?
+	return									; NO  - done
+	bsf		message_attention				; YES - set flag for attention
+	incf	message_counter,F				;     - increase counter
+	goto	TFT_attention_pres_reading		;     - pressure reading warning message and done then
+
+check_tr_functions_helper1:
+	btfsc	WREG,char_transmitter_lost		; transmitter 1 lost?
+	bra		check_tr_functions_helper1a		; YES - show transmitter attention message
+	bcf		transmitter1_lost				; NO  - clear flag for old lost attention
+	return									;     - done
+check_tr_functions_helper1a:
+	bsf		show_transmitter				; show transmitter attention
+	btfsc	transmitter1_lost				; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter1_lost				; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper2:
+	btfsc	WREG,char_transmitter_low_bat	; transmitter 1 low battery?
+	bra		check_tr_functions_helper2a		; YES - show transmitter attention message
+	bcf		transmitter1_battery			; NO  - clear flag for old battery attention
+	return									;     - done
+check_tr_functions_helper2a:
+	bsf		show_transmitter				; show transmitter attention
+	btfsc	transmitter1_battery			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter1_battery			; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper3:
+	btfsc	WREG,int_warning_flag			; transmitter 1 pressure warning?
+	bra		check_tr_functions_helper3a		; YES - show pressure reading message as warning
+	bcf		transmitter1_pres_warn			; NO  - clear flag for old warning
+	return									;     - done
+check_tr_functions_helper3a:
+	bsf		show_pres_warning				; show pressure warning
+	btfsc	transmitter1_pres_warn			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter1_pres_warn			; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper4:
+	btfsc	WREG,int_attention_flag			; transmitter 1 pressure attention?
+	bra		check_tr_functions_helper4a		; YES - show pressure reading message as attention
+	bcf		transmitter1_pres_att			; NO  - clear flag for old attention
+	return									;     - done
+check_tr_functions_helper4a
+	bsf		show_pres_attention				; show pressure attention
+	btfsc	transmitter1_pres_att			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter1_pres_att			; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper5:
+	btfsc	WREG,char_transmitter_lost		; transmitter 2 lost?
+	bra		check_tr_functions_helper5a		; YES - show transmitter attention message
+	bcf		transmitter2_lost				; NO  - clear flag for old lost attention
+	return									;     - done
+check_tr_functions_helper5a:
+	bsf		show_transmitter				; show transmitter attention
+	btfsc	transmitter2_lost				; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter2_lost				; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper6:
+	btfsc	WREG,char_transmitter_low_bat	; transmitter 2 low battery?
+	bra		check_tr_functions_helper6a		; YES - show transmitter attention message
+	bcf		transmitter2_battery			; NO  - clear flag for old battery attention
+	return									;     - done
+check_tr_functions_helper6a:
+	bsf		show_transmitter				; show transmitter attention
+	btfsc	transmitter2_battery			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter2_battery			; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper7:
+	btfsc	WREG,int_warning_flag			; transmitter 2 pressure warning?
+	bra		check_tr_functions_helper7a		; YES - show pressure reading message as warning
+	bcf		transmitter2_pres_warn			; NO  - clear flag for old warning
+	return									;     - done
+check_tr_functions_helper7a:
+	bsf		show_pres_warning				; show pressure warning
+	btfsc	transmitter2_pres_warn			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter2_pres_warn			; YES - memorize it's an old message now
+	bra		check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_helper8:
+	btfsc	WREG,int_attention_flag			; transmitter 2 pressure attention?
+	bra		check_tr_functions_helper8a		; YES - show pressure reading message as attention
+	bcf		transmitter2_pres_att			; NO  - clear flag for old attention
+	return									;     - done
+check_tr_functions_helper8a
+	bsf		show_pres_attention				; show pressure attention
+	btfsc	transmitter2_pres_att			; is it a new message?
+	return									; NO  - do not show the pressure readings custom view again
+	bsf		transmitter2_pres_att			; YES - memorize it's an old message now
+	;bra	check_tr_functions_show_cv		;     - show custom view
+
+check_tr_functions_show_cv:
+	btfsc	show_custview					; is the pressure readings custom view not shown yet shown?
+	return									; NO  - already shown, done
+	bsf		show_custview					; YES - mark as shown
+	btfsc	alternative_divelayout			;     - in alternative layout?
+	call	switch_layout_to_normal			;       YES - switch to normal layout
+	movlw	index_pressures_SAC-1			;       custom view number one below pressure readings
+	movwf	menupos3						;       set custom view number
+	bsf		toggle_customview				;       initiate toggle to desired custom view ->  pressure readings view will be shown
+	return									;       done
+
+ ENDIF
+
+
+check_gas_needs_ascent:
+	banksel	int_O_ascent_pres_need
+	movf	int_O_ascent_pres_need+1,w	; get               high byte from pres need of 1st tank
+	iorwf	int_O_ascent_pres_need+3,w	; inclusive or with high byte from pres need of 2nd tank
+	iorwf	int_O_ascent_pres_need+5,w	; inclusive or with high byte from pres need of 3rd tank
+	iorwf	int_O_ascent_pres_need+7,w	; inclusive or with high byte from pres need of 4th tank
+	iorwf	int_O_ascent_pres_need+9,w	; inclusive or with high byte from pres need of 5th tank
 	banksel	common
 	btfsc	WREG,int_invalid_flag		; check if invalid flag is set
 	return								; YES - no further checking required
-	btfsc	WREG,int_warning_flag		; NO  - check if any gas has a pres_need >= pres_fill
-	bsf		warning_active				; YES - set warning flag
-	btfsc	WREG,int_warning_flag		; NO  - check if any gas has a pres_need >= pres_fill
+	btfsc	WREG,int_warning_flag		; check if any gas has a pres_need >= pres_fill
+	bsf		message_warning				; YES - set warning flag
+	btfsc	WREG,int_warning_flag		; check if any gas has a pres_need >= pres_fill
 	goto	TFT_warning_gas_needs_warn	; Yes - show a warning
-	btfsc	WREG,int_attention_flag		; NO  - check if any gas has a pres_need >= pres_fill * threshold
+	btfsc	WREG,int_attention_flag		; check if any gas has a pres_need >= pres_fill * threshold
+	bsf		message_attention			; YES - set attention flag
+	btfsc	WREG,int_attention_flag		; check if any gas has a pres_need >= pres_fill * threshold
 	goto	TFT_warning_gas_needs_att	; YES - show an attention
 	bcf		gas_needs_attention			; NO  - clear flag for a new attention
 	bcf		gas_needs_warning			;       clear flag for a new warning
@@ -2600,8 +3069,8 @@
 
 
 check_warn_sensors_disagree:
-	incf	warning_counter,F			; increase counter
-	bsf		warning_active				; YES - set Warning flag
+	incf	message_counter,F			; increase counter
+	bsf		message_warning				; YES - set warning flag
 	goto	TFT_warning_sensor_disagree	;       show sensor disagree warning (and return)
 
 
@@ -2611,75 +3080,119 @@
 	movff	char_O_deco_warnings,WREG	; YES - get deco warnings vector
 	btfss	WREG,IBCD_warning			;       IBCD warning flag set?
 	return								;       NO  - return
-	incf	warning_counter,F			;       YES - increase counter
+	incf	message_counter,F			;       YES - increase counter
 	goto	TFT_warning_IBCD			;             write warning to display
 
 
+check_OC_gas_avail:
+	tstfsz	best_gas_number				; is a breathable gas available?
+	return								; > 0 : a breathable gas is available
+	btfsc	FLAG_ccr_mode				; = 0 : problem - in CCR mode?
+	bra		check_OC_gas_avail_1		; YES - real problem
+	btfsc	FLAG_pscr_mode				; NO  - in PSCR mode?
+	bra		check_OC_gas_avail_1		;       YES - real problem
+	return								;       NO  - neither CCR nor pSCR mode, suppress warning
+check_OC_gas_avail_1:
+	btfsc	FLAG_bailout_mode			; in bailout?
+	return								; YES - suppress warning
+	incf	message_counter,F			; NO  - increase counter
+	bsf		message_attention			;       set attention flag
+	goto	TFT_warning_no_BO_gas		;       show message (and return)
+
+
+advice_gas_change:
+	bsf		message_advice				; show advice sign
+	incf	message_counter,F			; increase counter
+	goto	TFT_advice_gas_change
+
+
 	global	restart_deco_engine
 	global	restart_deco_engine_wo_ceiling
 restart_deco_engine:
-	; make bank save copies and set flags for invalid data
+	; invalidate ceiling
 	movff	int_O_ceiling+1,WREG
 	bsf		WREG,char_invalid_flag		; int_O_ceiling has its invalid flag on a char's position!
 	movff	WREG,int_O_ceiling+1
 
 restart_deco_engine_wo_ceiling:
-	; make more bank save copies and set more flags for invalid data
+	; invalidate deco data (stop table data)
 	movff	char_O_deco_gas+0,WREG
 	bsf		WREG,char_invalid_flag
 	movff	WREG,char_O_deco_gas+0
 
+	; invalidate ascent time (normal plan)
 	movff	int_O_ascenttime+1,WREG
 	bsf		WREG,int_invalid_flag
 	movff	WREG,int_O_ascenttime+1
 
-	movff	int_O_alternate_ascenttime+1,WREG
-	bsf		WREG,int_invalid_flag
-	movff	WREG,int_O_alternate_ascenttime+1
-
+	; invalidate CNS at end of dive in normal plan
 	movff	int_O_normal_CNS_fraction+1,WREG
 	bsf		WREG,int_invalid_flag
 	movff	WREG,int_O_normal_CNS_fraction+1
 
+	; restart deco engine
+	movff	char_O_main_status,WREG		; get current main engine configuration
+	bcf		WREG,DECO_COMPLETED_NORM	; eventually clear flag stating completion of normal plan
+	bsf		WREG,DECO_COMPLETED_ALT		; fake we came from alternative plan to force normal plan to be done next
+	movff	WREG,char_O_main_status		; write back new configuration
+	movff	char_O_deco_status,WREG		; get current deco engine status
+	bcf		WREG,DECO_STATUS_0_FLAG		; set status flags to...
+	bcf		WREG,DECO_STATUS_1_FLAG		; ... DECO_STATUS_START
+	movff	WREG,char_O_deco_status		; write back new configuration to restart deco computations
+
+inval_alternative_plan_data:
+	; invalidate ascent time (alternative plan)
+	movff	int_O_alternate_ascenttime+1,WREG
+	bsf		WREG,int_invalid_flag
+	movff	WREG,int_O_alternate_ascenttime+1
+
+	; invalidate CNS at end of dive in alternative plan
 	movff	int_O_alternate_CNS_fraction+1,WREG
 	bsf		WREG,int_invalid_flag
 	movff	WREG,int_O_alternate_CNS_fraction+1
 
-	movff	int_O_tank_pres_need+1,WREG
+	; invalidate ascent gas needs
+	movff	int_O_ascent_pres_need+1,WREG
 	bsf		WREG,int_invalid_flag
-	movff	WREG,int_O_tank_pres_need+1
-
-	; restart deco engine
-	movff	char_O_deco_status,WREG		; get current deco engine configuration
-	bcf		WREG,DECO_STATUS_0_FLAG		; set status flags to...
-	bcf		WREG,DECO_STATUS_1_FLAG		; ... DECO_STATUS_START
-	bsf		WREG,DECO_PLAN_FLAG			; fake we came from alternative plan to force normal plan to be done next
-	movff	WREG,char_O_deco_status		; write back new configuration to restart deco computations
+	movff	WREG,int_O_ascent_pres_need+1
+
+ IFDEF _rx_functions
+	; invalidate pressure needs (TR functions)
+	movff	int_O_pressure_need+1,WREG
+	bsf		WREG,int_not_avail_flag
+	movff	WREG,int_O_pressure_need+1
+	movff	int_O_pressure_need+3,WREG
+	bsf		WREG,int_not_avail_flag
+	movff	WREG,int_O_pressure_need+3
+ ENDIF
+
+	; update display depended on NDL or deco mode
+	bsf		FLAG_TFT_display_ndl_or_deko
 
 	return
 
 ;=============================================================================
-; simulator mode
+; Simulator Mode
 ;
 
 	global	do_demo_divemode
 do_demo_divemode:
-	call	option_save_all					; Save all settings into EEPROM before starting simulation
+	call	TFT_ClearScreen					; blank screen
+	call	option_save_all					; save all settings into EEPROM before starting simulation
 	call	deco_push_tissues_to_vault		; C-code: back-up status of the real tissues
-	banksel	common							; Bank1
-
-	; +++ COMMENTED OUT FOR TESTING PURPOSE ONLY !!! +++
-	; +++ DO NOT COMMENT OUT IN OPERATIONAL USE  !!! +++
-	;
-	bsf		restore_deco_data			; Restore tissue and CNS after simulator use
+	banksel	common							; bank 1
+
+	; +++ COMMENT OUT FOR TESTING PURPOSE ONLY  !!! +++
+	bsf		restore_deco_data				; restore tissue and CNS after simulator use
+	; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++
 
 	bcf		pressure_refresh
-	btfss	pressure_refresh				; Wait for sensor
+	btfss	pressure_refresh				; wait for sensor
 	bra		$-2
 
-	bsf		simulatormode_active			; Set Flag
-	; Compute dive ambient conditions
-	banksel	char_I_bottom_depth
+	bsf		simulatormode_active			; set flag
+
+	banksel	char_I_bottom_depth				; compute dive ambient conditions
 	movf	char_I_bottom_depth,W
 	mullw	.100
 	movff	PRODL,rel_pressure+0
@@ -2690,9 +3203,9 @@
 	movlw	HIGH (.1000)
 	addwfc	PRODH,W
 	movff	WREG,sim_pressure+1
-	banksel common							; Bank1
+	banksel	common							; bank 1
 
 	bsf		divemode
-	goto	diveloop						; Switch into Divemode!
+	goto	diveloop						; switch into dive mode
 
 	END
\ No newline at end of file
--- a/src/divemode.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/divemode.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File divemode.inc								REFACTORED VERSION V2.97
+;   File divemode.inc								REFACTORED VERSION V2.99d
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -15,17 +15,17 @@
 
 
 ; Divemode layout:
-; row=0...239
-; column=0...159 (x2)
+; row    =0...239
+; column =0...159 (x2)
 
 ; Divemode has multiple layouts but basicly splits the screen into 3 rows:
-;   - upper content row: depth, max depth, dive time, etc.
+;   - upper  content row: depth, max depth, dive time, etc.
 ;   - custom content view with selectable views
 ;   - bottom content: temp, gas, ndl, tts, etc.
 
-; I. The upper content row. (0-99)
-;   The top row can be divided 2 areas: 
-;    - header: has the titles (mask)
+; I. The upper content row (0-99)
+;    The top row can be divided 2 areas: 
+;    - header : has the titles (mask)
 ;    - content: has the values
 ;******* Upper content / header row *******
 #DEFINE dm_mask_depth_row						.0
@@ -43,85 +43,85 @@
 ;   DIVEMODE_OFFSET=position below the title row
 ;******* Upper content / content row / 1st col *******
 ; GLOBAL
-#DEFINE dm_offset								.14								; 14
+#DEFINE dm_offset								.14								;  14
 ; Depth
-#DEFINE dm_depth_row							dm_offset						; TOP  - 14 - start position of the detph numbers
+#DEFINE dm_depth_row							dm_offset						; TOP  - 14 - start position of the depth numbers
 #DEFINE dm_depth_column							.0								; LEFT - 0
-#DEFINE dm_depth_bot							dm_depth_row+.61				; 75
-#DEFINE dm_depth_rgt							dm_depth_column+.59				; 59
-#DEFINE dm_depth_dm_row							dm_depth_row+.25				; 39 - if metric and d<100, decimeter shown as: ".5"
-#DEFINE dm_depth_dm_column						dm_depth_column+.40				; 40 - bottom aligned so it has its own position (2nd content line only)
+#DEFINE dm_depth_bot							dm_depth_row+.61				;  75
+#DEFINE dm_depth_rgt							dm_depth_column+.59				;  59
+#DEFINE dm_depth_dm_row							dm_depth_row+.25				;  39 - if metric and d<100, decimeter shown as: ".5"
+#DEFINE dm_depth_dm_column						dm_depth_column+.40				;  40 - bottom aligned so it has its own position (2nd content line only)
 ; Ascend rate
-#DEFINE dm_velocity_text_row					dm_depth_row+.62				; 76
-#DEFINE dm_velocity_text_column					dm_depth_column					; 0
-#DEFINE dm_velocity_text_bot					dm_velocity_text_row+.23		; 99
-#DEFINE dm_velocity_text_rgt					dm_depth_rgt					; 61
+#DEFINE dm_velocity_text_row					dm_depth_row+.62				;  76
+#DEFINE dm_velocity_text_column					dm_depth_column					;   0
+#DEFINE dm_velocity_text_bot					dm_velocity_text_row+.23		;  99
+#DEFINE dm_velocity_text_rgt					dm_depth_rgt					;  61
 ; Ascend/Descend bar
-#DEFINE dm_velobar_top							dm_offset						; 14
-#DEFINE dm_velobar_lft							dm_depth_rgt+.1					; 62
-#DEFINE dm_velobar_bot							dm_offset+.70					; 84
-#DEFINE dm_velobar_rgt							.73								; 73
+#DEFINE dm_velobar_top							dm_offset						;  14
+#DEFINE dm_velobar_lft							dm_depth_rgt+.1					;  62
+#DEFINE dm_velobar_bot							dm_offset+.70					;  84
+#DEFINE dm_velobar_rgt							.73								;  73
 #DEFINE dm_velobar_width						.12
 
 ;******* Upper content / content row / 2nd col *******
-#DEFINE dm_upcnt_2ndcol							.74								; 74
-#DEFINE dm_upcnt_2ndcol_nvsi					.64								; 64
+#DEFINE dm_upcnt_2ndcol							.74								;  74
+#DEFINE dm_upcnt_2ndcol_nvsi					.64								;  64
 ; Max depth
-#DEFINE dm_max_depth_row						dm_offset						; 14
-#DEFINE dm_max_depth_column						dm_upcnt_2ndcol					; 74
-#DEFINE dm_max_depth_column_nvsi				dm_upcnt_2ndcol_nvsi			; 64
-#DEFINE dm_max_depth_bot						dm_max_depth_row+.34			; 48
+#DEFINE dm_max_depth_row						dm_offset						;  14
+#DEFINE dm_max_depth_column						dm_upcnt_2ndcol					;  74
+#DEFINE dm_max_depth_column_nvsi				dm_upcnt_2ndcol_nvsi			;  64
+#DEFINE dm_max_depth_bot						dm_max_depth_row+.34			;  48
 #DEFINE dm_max_depth_rgt						dm_max_depth_column+.36			; 100
-#DEFINE dm_max_depth_dm_row						dm_max_depth_row+.11			; 25
-#DEFINE dm_max_depth_dm_column					dm_max_depth_column+.23			; 87
-#DEFINE dm_max_depth_dm_column_nvsi				dm_max_depth_column_nvsi+.23	; 77
-#DEFINE dm_max_alt_column						.0								; 0
+#DEFINE dm_max_depth_dm_row						dm_max_depth_row+.11			;  25
+#DEFINE dm_max_depth_dm_column					dm_max_depth_column+.23			;  87
+#DEFINE dm_max_depth_dm_column_nvsi				dm_max_depth_column_nvsi+.23	;  77
+#DEFINE dm_max_alt_column						.0								;   0
 #DEFINE dm_max_alt_row							.170							; 170
-#DEFINE dm_max_dm_alt_column					dm_max_alt_column+.60			; 60
+#DEFINE dm_max_dm_alt_column					dm_max_alt_column+.60			;  60
 ; Warning area (combined)
-#DEFINE dm_warning_row							dm_offset+.36					; 50
-#DEFINE dm_warning_column						dm_upcnt_2ndcol					; 74
-#DEFINE dm_warning_bot							dm_warning_row+.49				; 99
+#DEFINE dm_warning_row							dm_offset+.36					;  50
+#DEFINE dm_warning_column						dm_upcnt_2ndcol					;  74
+#DEFINE dm_warning_bot							dm_warning_row+.49				;  99
 #DEFINE dm_warning_rgt							dm_warning_column+.62			; 136
 #DEFINE dm_warning_length						.9								; total string length
 ; Warning row #1
-#DEFINE dm_warning1_row							dm_warning_row					; 36/50
-#DEFINE dm_warning1_column						dm_warning_column				; 64
-#DEFINE dm_warning1_bot							dm_warning1_row+.23				; 59/73
+#DEFINE dm_warning1_row							dm_warning_row					;  50
+#DEFINE dm_warning1_column						dm_warning_column				;  64
+#DEFINE dm_warning1_bot							dm_warning1_row+.23				;  73
 #DEFINE dm_warning1_rgt							dm_warning_rgt					; 136
 ; Warning row #2
-#DEFINE dm_warning2_row							dm_warning_row+.24				; 60/74
-#DEFINE dm_warning2_column						dm_warning_column				; 64
-#DEFINE dm_warning2_bot							dm_warning2_row+.23				; 83/97
+#DEFINE dm_warning2_row							dm_warning_row+.24				;  74
+#DEFINE dm_warning2_column						dm_warning_column				;  64
+#DEFINE dm_warning2_bot							dm_warning2_row+.23				;  97
 #DEFINE dm_warning2_rgt							dm_warning_rgt					; 136
 
 ;******* Upper content / content row / 3rd col *******
 ; Dive time
-#DEFINE dm_divetime_row							dm_offset						; 14
+#DEFINE dm_divetime_row							dm_offset						;  14
 #DEFINE dm_divetime_column						.115							; 115
 #DEFINE dm_divetime_minsonly_column				.111							; 111
-#DEFINE dm_divetime_bot							dm_divetime_row+.34				; 48
+#DEFINE dm_divetime_bot							dm_divetime_row+.34				;  48
 #DEFINE dm_divetime_rgt							.159							; 159
-#DEFINE dm_divetime_secs_row					dm_divetime_row+.11				; 25
+#DEFINE dm_divetime_secs_row					dm_divetime_row+.11				;  25
 #DEFINE dm_divetime_secs_column					dm_divetime_column+.24			; 139
-#DEFINE dm_divetime_alt_row						dm_offset						; 14
-#DEFINE dm_divetime_alt_column					.68								; 68
+#DEFINE dm_divetime_alt_row						dm_offset						;  14
+#DEFINE dm_divetime_alt_column					.68								;  68
 ; Warning icon
-#DEFINE dm_warning_icon_row						dm_offset+.41					; 55
+#DEFINE dm_warning_icon_row						dm_offset+.41					;  55
 #DEFINE dm_warning_icon_column					.137							; 137
-#DEFINE dm_warning_icon_bot						dm_warning_icon_row+.38			; 93
+#DEFINE dm_warning_icon_bot						dm_warning_icon_row+.38			;  93
 #DEFINE dm_warning_icon_rgt						dm_warning_icon_column+.21		; 156
 ; Apnea dive time
-#DEFINE dm_divetime_apnoe_row					dm_offset						; 14
+#DEFINE dm_divetime_apnoe_row					dm_offset						;  14
 #DEFINE dm_divetime_apnoe_column				.103							; 103
-#DEFINE dm_divetime_apnoe_secs_row				dm_divetime_apnoe_row+.11		; 25
+#DEFINE dm_divetime_apnoe_secs_row				dm_divetime_apnoe_row+.11		;  25
 #DEFINE dm_divetime_apnoe_secs_column			dm_divetime_apnoe_column+.36	; 139
 ; Apnea total time
-#DEFINE dm_apnoe_total_divetime_row				dm_divetime_apnoe_row+.50		; 64
+#DEFINE dm_apnoe_total_divetime_row				dm_divetime_apnoe_row+.50		;  64
 #DEFINE dm_apnoe_total_divetime_column			dm_divetime_apnoe_column		; 103
-#DEFINE dm_apnoe_total_divetime_secs_row		dm_apnoe_total_divetime_row+.11	; 75
+#DEFINE dm_apnoe_total_divetime_secs_row		dm_apnoe_total_divetime_row+.11	;  75
 #DEFINE dm_apnoe_total_divetime_secs_col		dm_divetime_apnoe_column+.36	; 139
-#DEFINE dm_total_apnoe_text_row					dm_apnoe_total_divetime_row-.11	; 53
+#DEFINE dm_total_apnoe_text_row					dm_apnoe_total_divetime_row-.11	;  53
 #DEFINE dm_total_apnoe_text_column				.132							; 132
 ; I. End of the upper content row. (0-99)
 
@@ -129,66 +129,84 @@
 #DEFINE dm_sep_1_2_row							dm_offset+.86					; 100
 
 ; II. Custom/selectable content row
-;   The costume view display area is: 101,163,0,159 (t,b,l,r), or 0,101->159,163
-;   1. Stopwatch with avarage depth
-;   2. Decoplan - decompression stops up to 6 stops
-;   3. Time, EAD/END and tissue saturation (graph)
-;   4. GF and aGF pairs
-;   5. Compass
-;   6. HUD - 3 sensor readings
-;   7. Gas list
-;   8. Ceiling (for GF_hi)
-;******* Custom content / Global *******
+;   The custom view display area is: 101,163,0,159 (t,b,l,r), or 0,101->159,163
+
+;******* Custom View: Global *******
 #DEFINE dm_customview_row						dm_offset+.87					; 101
-#DEFINE dm_customview_column					.0								; 0
+#DEFINE dm_customview_column					.0								;   0
 #DEFINE dm_customview_bot						dm_customview_row+.62			; 163
 #DEFINE dm_customview_rgt						.159							; 159
 
-;******* Custom content / #1 - Avg depth, stopwatch and avg depth *******
-; Title
+;******* Custom View: Avg depth, stopwatch and avg depth *******
 #DEFINE dm_custom_avr_stop_title_row			dm_customview_row+.1			; 102
-#DEFINE dm_custom_avr_stop_title_column1		.2								; 2
-#DEFINE dm_custom_avr_stop_title_column2		.57								; 57
-#DEFINE dm_custom_avr_stop_title_column3		.110							; 110
-; Values
 #DEFINE dm_custom_avr_stop_row					dm_customview_row+.16			; 117
-#DEFINE dm_custom_avr_stop_column1				.0								; 0
-#DEFINE dm_custom_avr_stop_column2				.54								; 54
+#DEFINE dm_custom_avr_stop_column1				.0								;   0
+#DEFINE dm_custom_avr_stop_column2				.54								;  54
 #DEFINE dm_custom_avr_stop_column3				.118							; 118
 
-;******* Custom content / #2 - Decompressions stops *******
+;******* Custom View: Decompressions stops *******
 ; Title
 #DEFINE dm_custom_decoplan_title_row			dm_customview_row				; 101
-#DEFINE dm_custom_decoplan_title_column			.65								; 65
+#DEFINE dm_custom_decoplan_title_column			.65								;  65
 ; 1st col
 #DEFINE dm_cust_dstop_2nd_stop_row				dm_customview_row+.14			; 115
-#DEFINE dm_cust_dstop_2nd_stop_column			.0								; 0
+#DEFINE dm_cust_dstop_2nd_stop_column			.0								;   0
 #DEFINE dm_cust_dstop_3rd_stop_row				dm_customview_row+.37			; 138
-#DEFINE dm_cust_dstop_3rd_stop_column			dm_cust_dstop_2nd_stop_column	; 0
+#DEFINE dm_cust_dstop_3rd_stop_column			dm_cust_dstop_2nd_stop_column	;   0
 ; 2nd col
-#DEFINE dm_cust_dstop_4th_stop_row				dm_cust_dstop_2nd_stop_row		; 116
-#DEFINE dm_cust_dstop_4th_stop_column			.56								; 56
-#DEFINE dm_cust_dstop_5th_stop_row				dm_cust_dstop_3rd_stop_row		; 140
-#DEFINE dm_cust_dstop_5th_stop_column			dm_cust_dstop_4th_stop_column	; 56
+#DEFINE dm_cust_dstop_4th_stop_row				dm_cust_dstop_2nd_stop_row		; 115
+#DEFINE dm_cust_dstop_4th_stop_column			.56								;  56
+#DEFINE dm_cust_dstop_5th_stop_row				dm_cust_dstop_3rd_stop_row		; 138
+#DEFINE dm_cust_dstop_5th_stop_column			dm_cust_dstop_4th_stop_column	;  56
 ; 3rd col
-#DEFINE dm_cust_dstop_6th_stop_row				dm_cust_dstop_2nd_stop_row		; 116
+#DEFINE dm_cust_dstop_6th_stop_row				dm_cust_dstop_2nd_stop_row		; 115
 #DEFINE dm_cust_dstop_6th_stop_column			.111							; 111
-#DEFINE dm_cust_dstop_7th_stop_row				dm_cust_dstop_3rd_stop_row		; 140
+#DEFINE dm_cust_dstop_7th_stop_row				dm_cust_dstop_3rd_stop_row		; 138
 #DEFINE dm_cust_dstop_7th_stop_column			dm_cust_dstop_6th_stop_column	; 111
 
-;******* Custom content / #3 - Time, EAD/END and tissue saturation *******
+;******* Custom View: Time, Battery, Surface Pressure *******
 ; Clock
 #DEFINE dm_custom_clock_title_row				dm_customview_row+.1			; 102
 #DEFINE dm_custom_clock_row						dm_customview_row+.16			; 117
-#DEFINE dm_custom_clock_column					.0								; 0
-#DEFINE dm_custom_endtime_row					dm_custom_clock_row+.23			; 140 - not used
-#DEFINE dm_custom_endtime_column				dm_custom_clock_column			; 0   - not used
-; EAD/AND
+#DEFINE dm_custom_clock_column					.0								;   0
+; Battery
+#DEFINE dm_custom_battery_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_battery_volt_row				dm_customview_row+.16			; 117
+#DEFINE dm_custom_battery_percent_row			dm_custom_ead_row+.23			; 140
+#DEFINE dm_custom_battery_column				.62								;  62
+; Surface Pressure
+#DEFINE dm_custom_surfpres_title_row			dm_customview_row+.1			; 102
+#DEFINE dm_custom_surfpres_row					dm_customview_row+.16			; 117
+#DEFINE dm_custom_surfpres_column				.95								;  95
+
+;****** Custom View: ppO2, EAD/ENDS and CNS *******
+; ppO2
+#DEFINE dm_custom_ppo2_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_ppo2_row						dm_customview_row+.18			; 119
+#DEFINE dm_custom_ppo2_column					.2								;   2
+; EAD/END
 #DEFINE dm_custom_eadend_title_row				dm_customview_row+.1			; 102
 #DEFINE dm_custom_ead_row						dm_customview_row+.16			; 117
-#DEFINE dm_custom_ead_column					.50								; 50
+#DEFINE dm_custom_ead_column					.50								;  50
 #DEFINE dm_custom_end_row						dm_custom_ead_row+.23			; 140
-#DEFINE dm_custom_end_column					dm_custom_ead_column			; 50
+#DEFINE dm_custom_end_column					dm_custom_ead_column			;  50
+; CNS
+#DEFINE dm_custom_cns_title_row					dm_customview_row+.1			; 102
+#DEFINE dm_custom_cns_row						dm_customview_row+.18			; 119
+#DEFINE dm_custom_cns_column					.115							; 115
+
+;****** Custom View: tripple CNS *******
+#DEFINE dm_custom_cns3_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_cns3_row						dm_customview_row+.16			; 117
+#DEFINE dm_custom_cns3_column1					.8								;   8
+#DEFINE dm_custom_cns3_column2					.62								;  62
+#DEFINE dm_custom_cns3_column3					.115							; 115
+
+;****** Custom View: Ceiling, Tissues, (current GF)
+; Ceiling
+#DEFINE dm_custom_ceiling_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_ceiling_row					dm_customview_row+.18			; 119
+#DEFINE dm_custom_ceiling_column				.62								;  62
 ; Tissue title
 #DEFINE dm_custom_tissue_title_row				dm_customview_row+.1			; 102
 #DEFINE dm_custom_tissue_title_column			.120							; 120
@@ -201,100 +219,72 @@
 #DEFINE dm_custom_tissue_diagram_top			dm_customview_row+.16			; 117
 #DEFINE dm_custom_tissue_diagram_bottom			dm_custom_tissue_diagram_top+.43; 160
 #DEFINE dm_custom_tissue_diagram_left			.116							; 116
-#DEFINE dm_custom_tissue_diagram_frame_spacing	.8								; 8
+#DEFINE dm_custom_tissue_diagram_frame_spacing	.8								;   8
 
-;******* Custom content / #4 - GF-lo/hi, aGF-lo/hi, current GF value *******
+;******* Custom View: GF-lo/hi, aGF-lo/hi, current GF value *******
 ; Title
 #DEFINE dm_custom_gf_title_row					dm_customview_row+.1			; 102
-#DEFINE dm_custom_gf_title_col1					.8								; 8
-#DEFINE dm_custom_gf_title_col2					.62								; 62
-#DEFINE dm_custom_gf_title_col3					.115							; 115
-; GF
 #DEFINE dm_custom_gf_row						dm_customview_row+.18			; 119
-#DEFINE dm_custom_gf_column						.0								; 0
-; aGF
-#DEFINE dm_custom_agf_row						dm_custom_gf_row				; 119
-#DEFINE dm_custom_agf_column					.60								; 60
-; Current GF
-#DEFINE dm_custom_currentgf_row					dm_custom_gf_row				; 119
-#DEFINE dm_custom_currentgf_column				.118							; 118
+#DEFINE dm_custom_gf_column1					.0								;   0
+#DEFINE dm_custom_gf_column2					.60								;  60
+#DEFINE dm_custom_gf_column3					.118							; 118
 
-;******* Custom content / #5 - Compass *******
+;******* Custom View: Compass *******
 ; Title
 #DEFINE dm_custom_compass_mask_row				dm_customview_row				; 101
-#DEFINE dm_custom_compass_mask_column			.65								; 65
+#DEFINE dm_custom_compass_mask_column			.65								;  65
 ; Head and arrows
 #DEFINE dm_custom_compass_head_row				dm_customview_row+.39			; 140
-#DEFINE dm_custom_compass_head_column			.62								; 62
-#DEFINE dm_custom_compass_ldir_column			.5								; 5
+#DEFINE dm_custom_compass_head_column			.62								;  62
+#DEFINE dm_custom_compass_ldir_column			.5								;   5
 #DEFINE dm_custom_compass_rdir_column			.140							; 140
 ; Ruler
 #DEFINE dm_custom_compass_graph_row				dm_customview_row				; 101
-#DEFINE dm_custom_compass_graph_height			.33								; 33
-#DEFINE dm_custom_compass_tick_height			.3								; 3
+#DEFINE dm_custom_compass_graph_height			.33								;  33
+#DEFINE dm_custom_compass_tick_height			.3								;   3
 #DEFINE dm_custom_compass_tick_top_top			dm_custom_compass_graph_row+.1	; 102
 #DEFINE dm_custom_compass_tick_top_bot			dm_custom_compass_graph_row+.4	; 105
 #DEFINE dm_custom_compass_label_row				dm_custom_compass_graph_row+.6	; 107
-#DEFINE dm_custom_compass_label_height			.24								; 24
+#DEFINE dm_custom_compass_label_height			.24								;  24
 #DEFINE dm_custom_compass_tick_bot_top			dm_custom_compass_graph_row+.30	; 131
 #DEFINE dm_custom_compass_tick_bot_bot			dm_custom_compass_graph_row+.33	; 134
 
-;******* Custom content / #6 - HUD / O2 sensor values *******
-#DEFINE dm_custom_hud_row						dm_customview_row+.1			; 102
-#DEFINE dm_custom_hud_column1					.10								; 10
-#DEFINE dm_custom_hud_column2					.65								; 65
-#DEFINE dm_custom_hud_column3					.120							; 120
-#DEFINE dm_custom_hud_data_row					dm_customview_row+.16			; 117
-#DEFINE dm_custom_hud_sensor1_column			.6								; 6
-#DEFINE dm_custom_hud_sensor2_column			.62								; 62
+;******* Custom View: O2 Sensor Values *******
+#DEFINE dm_custom_hud_title_row					dm_customview_row+.1			; 102
+#DEFINE dm_custom_hud_row						dm_customview_row+.16			; 117
+#DEFINE dm_custom_hud_sensor1_column			.6								;   6
+#DEFINE dm_custom_hud_sensor2_column			.62								;  62
 #DEFINE dm_custom_hud_sensor3_column			.118							; 118
 
-;******* Custom content / #7 - Gas list *******
-; Title
-#DEFINE dm_custom_dyn_gas_mask_row				dm_customview_row				; 101
-#DEFINE dm_custom_dyn_gas_mask_column			.59								; 59
-; col #1
-#DEFINE dm_custom_dyn_gas_row1					dm_customview_row+.14			; 115
-#DEFINE dm_custom_dyn_gas_column1				.0								; 0
-; col #2
-#DEFINE dm_custom_dyn_gas_row2					dm_customview_row+.37			; 138
-#DEFINE dm_custom_dyn_gas_column2				.80								; 80
+;******* Custom View: Gas Needs *******
+#DEFINE dm_custom_gas_mask_row					dm_customview_row				; 101
+#DEFINE dm_custom_gas_row1						dm_customview_row+.14			; 115
+#DEFINE dm_custom_gas_row2						dm_customview_row+.37			; 138
+#DEFINE dm_custom_gas_column_title				.29								;  29
+#DEFINE dm_custom_gas_column1					.5								;   5
+#DEFINE dm_custom_gas_column2					.85								;  85
 
-;******* Custom content / #8 - Ceiling value for GF_hi *******
-; Title
-#DEFINE dm_custom_ceiling_text_row				dm_customview_row+.1			; 102
-#DEFINE dm_custom_ceiling_text_column			.68								; 66
-#DEFINE dm_custom_ceiling_ppo2_column			.8								; 8
-#DEFINE dm_custom_ceiling_ppo2_col_dil			.0								; 0
-
-; Value
-#DEFINE dm_custom_ceiling_value_row				dm_customview_row+.18			; 119
-#DEFINE dm_custom_ceiling_value_column			.66								; 64
-#DEFINE dm_custom_ceiling_ppo2_val_col			.2								; 2
+; ******* Custom View: Tank Pressures *******
+#DEFINE dm_custom_tankdata_mask_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_tankdata_row					dm_customview_row+.16			; 117
+#DEFINE dm_custom_tankdata_pres1_col			.2								;   2
+#DEFINE dm_custom_tankdata_pres2_col			.115							; 115
+#DEFINE dm_custom_tankdata_SAC_col				.56								;  56
 
-;******* Custom content / #10 - Sensor check view *******
-; Title
-#DEFINE dm_custom_s_check_text_row				dm_customview_row+.1			; 102
-#DEFINE dm_custom_s_check_text_column			.50								; 50
-#DEFINE dm_custom_ppO2_text_column				.115							; 115
-#DEFINE dm_custom_ppDil_text_column				.2								; 2
-; Value
-#DEFINE dm_custom_s_check_ppo2_o2_column		.108							; 108
-#DEFINE dm_custom_s_check_ppo2_dil_col			.8								; 8
-#DEFINE dm_custom_s_check_value_row				dm_customview_row+.18			; 119
-	
-;******* Custom content / #12 - PSCR Info *******
-; Title
-#DEFINE dm_custom_pscr_text_row					dm_customview_row+.1			; 102
-#DEFINE dm_custom_pscr_text_drop_column			.55
-#DEFINE dm_custom_pscr_text_ratio_column		.105
-; Value
-#DEFINE dm_custom_pscr_drop_column				.66
-#DEFINE dm_custom_pscr_drop_row					dm_customview_row+.18
-#DEFINE dm_custom_pscr_ratio_column				.110
-#DEFINE dm_custom_pscr_ratio_row				dm_customview_row+.18
+;******* Custom View: Sensor Check *******
+#DEFINE dm_custom_s_check_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_s_check_row					dm_customview_row+.18			; 119
+#DEFINE dm_custom_s_check_title_column			.50								;  50
+#DEFINE dm_custom_ppO2_column					.115							; 115
+#DEFINE dm_custom_ppDil_column					.2								;   2
 
-; II. End of the custom content row. (101-163)
+;******* Custom View: PSCR Info *******
+#DEFINE dm_custom_pscr_title_row				dm_customview_row+.1			; 102
+#DEFINE dm_custom_pscr_row						dm_customview_row+.18			; 119
+#DEFINE dm_custom_pscr_drop_column				.55								;  55
+#DEFINE dm_custom_pscr_ratio_column				.105							; 105
+
+; II. End of the custom content row (101-163)
 
 ; 1px space between the 2nd and 3rd content rows
 #DEFINE dm_sep_2_3_row							dm_offset+.150					; 164
@@ -304,83 +294,83 @@
 ; simulator menu, active/dil gas, decostop, Apnea surface time and max depth
 ;  The content row contains 2 columns:
 ;   - temperature, gas names
-;  - NDL/TTS, DecoStop
+;   - NDL/TTS, DecoStop
 #DEFINE dm_3rdrow_top							dm_offset+.151					; 165
 #DEFINE dm_3rdrow_bot							.239							; 239
-#DEFINE dm_3rdrow_lft							.0								; 0
+#DEFINE dm_3rdrow_lft							.0								;   0
 #DEFINE dm_3rdrow_rgt							.159							; 159
 
 ;******* Bottom content / 1st col *******
 ; Temperature
 #DEFINE dm_temp_row								dm_3rdrow_top-.4				; 161
-#DEFINE dm_temp_column							.0								; 0
+#DEFINE dm_temp_column							.0								;   0
 ; Simulation text
-#DEFINE dm_simtext_row							dm_3rdrow_top					; 165
-#DEFINE dm_simtext_column						.35								; 35
+#DEFINE dm_simtext_row							dm_3rdrow_top+.18				; 183
+#DEFINE dm_simtext_column						.36								;  35
 ; Diluent gas
 #DEFINE dm_active_dil_row						dm_3rdrow_top+.19				; 185
-#DEFINE dm_active_dil_column					.0								; 0
+#DEFINE dm_active_dil_column					.0								;   0
 ; active gas for OC, blinking better gas, setpoint or bailout for CCR
 #DEFINE dm_active_gas_row						.208							; 208
-#DEFINE dm_active_gas_column					.0								; 0
+#DEFINE dm_active_gas_column					.0								;   0
 
 ;******* Bottom content / 2nd col *******
 ; Next deco stop for TTS
 #DEFINE dm_decostop_1st_stop_row				dm_3rdrow_top					; 165
-#DEFINE dm_decostop_1st_stop_column				.82								; 82
+#DEFINE dm_decostop_1st_stop_column				.82								;  82
 ; Safety Stop
 #DEFINE dm_safetystop_row						dm_3rdrow_top					; 165
 #DEFINE dm_safetystop_column					.118							; 118
 #DEFINE dm_safetystop_bot						dm_safetystop_row+.31			; 196
 #DEFINE dm_safetystop_text_row					dm_safetystop_row+.1			; 166
-#DEFINE dm_safetystop_text_column				.80								; 80 - for the 4char "Stop"!!!
+#DEFINE dm_safetystop_text_column				.80								;  80 for the 4 chars "Stop"
 ; TTS
-#DEFINE dm_tts_value_row						dm_3rdrow_top+.32;				; 197 (pre: 207)
+#DEFINE dm_tts_value_row						dm_3rdrow_top+.32;				; 197
 #DEFINE dm_tts_value_column						.118							; 118
-#DEFINE dm_tts_text_row							dm_tts_value_row+.5				; 202 (pre: 211)
-#DEFINE dm_tts_text_column						.85								; 85
+#DEFINE dm_tts_text_row							dm_tts_value_row+.5				; 202
+#DEFINE dm_tts_text_column						.85								;  85
 ; NDL - the same position as TTS
 #DEFINE dm_ndl_value_row						dm_tts_value_row				; 197
 #DEFINE dm_ndl_value_column						dm_tts_value_column				; 118
 #DEFINE dm_ndl_text_row							dm_tts_text_row					; 202
-#DEFINE dm_ndl_text_column						dm_tts_text_column				; 85
+#DEFINE dm_ndl_text_column						dm_tts_text_column				;  85
 ; FTTS (only modded screen)
 #DEFINE dm_ftts_value_row						dm_3rdrow_top+.64				; 215
-#DEFINE dm_ftts_value_column					.97								; 97
+#DEFINE dm_ftts_value_column					.97								;  97
 ; Grid line (only modded screen)
 #DEFINE dm_gassep_row							dm_sep_2_3_row					; 164
-#DEFINE dm_gassep_bot							.239							; .239
-#DEFINE dm_gassep_column						.78								; .78
+#DEFINE dm_gassep_bot							.239							; 239
+#DEFINE dm_gassep_column						.78								;  78
 
 ;******* Bottom content / Apnea mode *******;
-#DEFINE dm_apnoe_surface_time_text_row			.190							; 190
-#DEFINE dm_apnoe_surface_time_text_col			.30								; 30
-#DEFINE dm_apnoe_surface_time_row				.204							; 204
-#DEFINE dm_apnoe_surface_time_column			.15								; 15
-#DEFINE dm_apnoe_last_max_depth_text_row		.190							; 190
+#DEFINE dm_apnoe_surface_time_text_row			.192							; 192
+#DEFINE dm_apnoe_surface_time_text_col			.30								;  30
+#DEFINE dm_apnoe_surface_time_row				.207							; 207
+#DEFINE dm_apnoe_surface_time_column			.15								;  15
+#DEFINE dm_apnoe_last_max_depth_text_row		.192							; 192
 #DEFINE dm_apnoe_last_max_depth_text_col		.100							; 100
-#DEFINE dm_apnoe_last_max_depth_row				.204							; 204
+#DEFINE dm_apnoe_last_max_depth_row				.207							; 207
 #DEFINE dm_apnoe_last_max_depth_column			.100							; 100
 
 
-; IV. The last set of parameters are for the menus displayed in dive mode
+; IV. The last set of parameters is for the menus displayed in dive mode
 ; Divemode menu
-#DEFINE dm_menu_row								.164							; 164 Upper row -- the frame's top line is the separator
-#DEFINE dm_menu_lower							.239							; 239 Lower border
-#DEFINE dm_menu_left							.0								; 0   Left
-#DEFINE dm_menu_right							.159							; 159 Right
+#DEFINE dm_menu_row								.164							; 164 upper row, the frame's top line is the separator
+#DEFINE dm_menu_lower							.239							; 239 lower border
+#DEFINE dm_menu_left							.0								;   0 left
+#DEFINE dm_menu_right							.159							; 159 right
 
 #DEFINE dm_menu_item1_row						dm_menu_row+.1					; 165
-#DEFINE dm_menu_item1_column					.9								; 9
+#DEFINE dm_menu_item1_column					.9								;   9
 #DEFINE dm_menu_item2_row						dm_menu_item1_row+.24			; 189
-#DEFINE dm_menu_item2_column					dm_menu_item1_column			; 9
+#DEFINE dm_menu_item2_column					dm_menu_item1_column			;   9
 #DEFINE dm_menu_item3_row						dm_menu_item2_row+.24			; 213
-#DEFINE dm_menu_item3_column					dm_menu_item1_column			; 9
+#DEFINE dm_menu_item3_column					dm_menu_item1_column			;   9
 
 #DEFINE dm_menu_item4_row						dm_menu_row+.1					; 165
-#DEFINE dm_menu_item4_column					.89								; 89
+#DEFINE dm_menu_item4_column					.89								;  89
 #DEFINE dm_menu_item5_row						dm_menu_item4_row+.24			; 189
-#DEFINE dm_menu_item5_column					dm_menu_item4_column			; 89
+#DEFINE dm_menu_item5_column					dm_menu_item4_column			;  89
 #DEFINE dm_menu_item6_row						dm_menu_item5_row+.24			; 213
-#DEFINE dm_menu_item6_column					dm_menu_item4_column			; 89
+#DEFINE dm_menu_item6_column					dm_menu_item4_column			;  89
 
--- a/src/eeprom_rs232.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/eeprom_rs232.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File eeprom_rs232.asm												V2.98
+;   File eeprom_rs232.asm												V2.99a
 ;
 ;   Internal EEPROM, RS232
 ;
@@ -25,8 +25,8 @@
 	endm
 
 ;=============================================================================
-eeprom	code	0xF00000+0x10
-; Skip SERIAL number. Should not be overwritten.
+eeprom		code	0xF00000+0x10
+; skip SERIAL number - it should not be overwritten
 
 	global	eeprom_serial_save
 	global	eeprom_opt_backup
@@ -35,50 +35,24 @@
 eeprom_opt_backup	res 0x3E
 
 ;=============================================================================
-basic	CODE
+ee_rs232		CODE
 
 	global	write_int_eeprom_1
 write_int_eeprom_1:
 	movwf	EEADR
-;	bra		write_eeprom				; writes and "returns" after write
-	
-;=============================================================================
-; writes into internal eeprom
-; Input:   EEADRH:EEADR = EEPROM address.
-;          EEDATA = byte to write.
-; Trashed: WREG.
-	global	write_eeprom
-write_eeprom:
-	bcf	EECON1,EEPGD
-	bcf	EECON1,CFGS
-	bsf	EECON1,WREN
-
-	bcf	INTCON,GIE					; Disable interrupts for the next 5 instructions
-	movlw	0x55
-	movwf	EECON2
-	movlw	0xAA
-	movwf	EECON2
-	bsf	EECON1,WR
-	bsf	INTCON,GIE					; ...but the flag for the ISR routines were still set, so they will interrupt now!
-
-write_eep2:
-	btfsc	EECON1,WR
-	bra	write_eep2					; wait about 4ms...
-	bcf	EECON1,WREN
-	return
-
+	bra		write_eeprom				; writes and "returns" after write
 
 
 	global read_int_eeprom_1
 read_int_eeprom_1:
 	movwf	EEADR
-;	bra		read_eeprom					; reads and "returns" after write
+	bra		read_eeprom					; reads and "returns" after write
 
 ;=============================================================================
-; reads from internal eeprom
-; Input:   EEADRH:EEADR = EEPROM address.
-; Output:  EEDATA.
-; Trashed: NONE.
+; reads from internal EEPROM
+; Input:   EEADRH:EEADR = EEPROM address
+; Output:  EEDATA
+; Trashed: NONE
 	global	read_eeprom
 read_eeprom:
 	bcf		EECON1,EEPGD
@@ -86,6 +60,32 @@
 	bsf		EECON1,RD
 	return
 
+;=============================================================================
+; writes into internal EEPROM
+; Input:   EEADRH:EEADR = EEPROM address
+;          EEDATA = byte to write
+; Trashed: WREG
+	global	write_eeprom
+write_eeprom:
+	bcf		EECON1,EEPGD
+	bcf		EECON1,CFGS
+	bsf		EECON1,WREN
+
+	bcf		INTCON,GIE					; disable interrupts for the next 5 instructions
+	movlw	0x55
+	movwf	EECON2
+	movlw	0xAA
+	movwf	EECON2
+	bsf		EECON1,WR
+	bsf		INTCON,GIE					; ...but the flag for the ISR routines were still set, so they will interrupt now!
+
+write_eep2:
+	btfsc	EECON1,WR
+	bra		write_eep2					; wait about 4ms...
+	bcf		EECON1,WREN
+	return
+
+
 	global	disable_ir_s8
 disable_ir_s8:
 	banksel	TXSTA2
@@ -93,8 +93,8 @@
 	clrf	RCSTA2
 	banksel	common
 	bcf		ir_power					; IR off
-	bcf		mcp_power					; Power-down instrumentation amp
-	bsf		s8_npower					; Power-down S8 HUD
+	bcf		mcp_power					; power-down instrumentation amp
+	bsf		s8_npower					; power-down S8 HUD
 	return
 
 
@@ -102,28 +102,28 @@
 enable_ir_s8:
 ;init serial port2 (TRISG2)
 	btfsc	analog_o2_input
-	bra		enable_s8					; Start S8
+	bra		enable_s8					; start S8
 
 	banksel	BAUDCON2
 	movlw	b'00100000'					; BRG16=0			; inverted for IR
 	movwf	BAUDCON2
 	movlw	b'00100000'					; BRGH=0, SYNC=0
 	movwf	TXSTA2
-	movlw	.102						; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16MHz
+	movlw	.102						; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16 MHz
 	movwf	SPBRG2
 	movlw	b'10010000'
 	movwf	RCSTA2
 	banksel	common
-	bsf		ir_power					; Power-up IR
+	bsf		ir_power					; power-up IR
 	btfss	ir_power
 	bra		$-6
 	return
 
 enable_s8:
 	; Check for Digital/Analog
-	bsf		s8_npower					; Power-down S8 HUD
-	WAITMS	d'1'						; Very short delay
-	bsf		mcp_power					; Power-up instrumentation amp
+	bsf		s8_npower					; power-down S8 HUD
+	WAITMS	d'1'						; very short delay
+	bsf		mcp_power					; power-up instrumentation amp
 	btfss	mcp_power
 	bra		$-6
 	banksel	TXSTA2
@@ -132,21 +132,21 @@
 	banksel	common
 
 	; It may be digital, check for voltage when isolator is powered
-	bcf		s8_npower					; Power S8 HUD
-	WAITMS	d'1'						; Very short delay
+	bcf		s8_npower					; power S8 HUD
+	WAITMS	d'1'						; very short delay
 
 	btfsc	PORTG,2						; RX2=1?
-	bra	enable_s8_2						; Yes, digital
+	bra	enable_s8_2						; YES - digital
 	WAITMS	d'30'
 	btfsc	PORTG,2						; RX2=1?
-	bra		enable_s8_2					; Yes, digital
+	bra		enable_s8_2					; YES - digital
 
 	; Not found, set to analog (fail-safe)
 
 enable_s8_analog:
 	; S8 Analog
-	bsf		s8_npower					; Power-down S8 HUD
-	bcf		s8_digital					; Clear flag
+	bsf		s8_npower					; power-down S8 HUD
+	bcf		s8_digital					; clear flag
 	return
 
 enable_s8_2:							; S8 Digital
@@ -155,24 +155,24 @@
 	movwf	BAUDCON2
 	movlw	b'00100000'					; BRGH=0, SYNC=0
 	movwf	TXSTA2
-	movlw	.25							; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16MHz
+	movlw	.25							; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16 MHz
 	movwf	SPBRG2
 	movlw	b'10010000'
 	movwf	RCSTA2
 	banksel	common
-	bsf		s8_digital					; Set flag
+	bsf		s8_digital					; set flag
 	return
 
 ;=============================================================================
 
 	global	enable_rs232
 enable_rs232:
-	call	speed_normal				; 16MHz
+	call	speed_normal				; 16 MHz
 enable_rs232_2:
 	movlw	T2CON_NORMAL
 	cpfseq	T2CON
-	bra		enable_rs232_2				; Wait until speed is normal
-	bcf		PORTE,0						; Start comms
+	bra		enable_rs232_2				; wait until speed is normal
+	bcf		PORTE,0						; start comms
 ;init serial port1 (TRISC6/7)
 	movlw	b'00100100'					; BRGH=1, SYNC=0
 	movwf	TXSTA1
@@ -186,42 +186,43 @@
 	clrf	RCSTA1
 	clrf	TXSTA1						; UART disable
 	bcf		PORTC,6						; TX hard to GND
-	bsf		PORTE,0						; Stop comms
+	bsf		PORTE,0						; stop comms
 	return
 
 
 	global	rs232_wait_tx
 rs232_wait_tx:
 	btfss	TXSTA1,TRMT					; RS232 Busy?
-	bra		rs232_wait_tx				; yes, wait...
+	bra		rs232_wait_tx				; YES - wait...
 
 	btfss	ble_available				; ble available?
-	return								; No, done.
+	return								; NO - done
 
-	btfsc	NRTS						; Wait for Bluetooth module
-	bra		rs232_wait_tx				; yes, wait...
-	return								; Done.
+	btfsc	NRTS						; wait for Bluetooth module
+	bra		rs232_wait_tx				; YES - wait...
+	return								; done
 
 
 	global	rs232_wait_tx2
 rs232_wait_tx2:
 	banksel	TXSTA2
 rs232_wait_tx2_1:
-	btfss	TXSTA2,TRMT					; RS232 Busy?
-	bra		rs232_wait_tx2_1			; yes, wait...
+	btfss	TXSTA2,TRMT					; RS232 busy?
+	bra		rs232_wait_tx2_1			; YES - wait...
 	banksel	common
-	return								; Done.
+	return								; done
 
 	global	rs232_get_byte
 rs232_get_byte:
 	bcf		rs232_receive_overflow		; clear flag
-	movlw	.10
-	movwf	uart1_temp
+	clrf	uart1_temp					; set uart1_temp to .10 without using WREG: first clear to 0, then...
+	bsf		uart1_temp,1				; set bit 1 (value 2),
+	bsf		uart1_temp,3				; and bit 3 (value 8).
 	clrf	uart2_temp
 	clrf	uart3_temp
 rs232_get_byte2:
 	btfsc	PIR1,RCIF					; data arrived?
-	return								; Yes
+	return								; YES
 	decfsz	uart3_temp,F
 	bra		rs232_get_byte2
 	decfsz	uart2_temp,F
@@ -231,7 +232,7 @@
 										; timeout occurred (about 400ms)
 	bsf		rs232_receive_overflow		; set flag
 rs232_get_byte3:
-	bcf		RCSTA1,CREN					; Clear receiver status
+	bcf		RCSTA1,CREN					; clear receiver status
 	bsf		RCSTA1,CREN
 	return								; and return anyway
 
@@ -239,12 +240,10 @@
 
 	global	do_logoffset_common_write
 do_logoffset_common_write:
-	; TODO: limit [lo:hi] to 9999 ? may arrive here as >= 10000 because of +10 increment option 
-	; SIMPLER WAY: return without writing to eeprom if hi == 0x27 -> 0x2700 = 9984, this is within 
-	; the save range for a +10 increment, shall do it...
-	; mH
-
-	movff	lo,EEDATA
+	movlw	0x26
+	cpfslt	hi								; is offset < 0x26?? (decimal 9983 at max, hence save for another +10) ?
+	return									; NO  - abort
+	movff	lo,EEDATA						; YES - proceed writing offset to EEPROM
 	write_int_eeprom 0x0D
 	movff	hi,EEDATA
 	write_int_eeprom 0x0E
@@ -256,7 +255,7 @@
 	read_int_eeprom 0x0D
 	movff	EEDATA,lo
 	read_int_eeprom 0x0E
-	movff	EEDATA,hi						; Existing logbook offset into lo:hi
+	movff	EEDATA,hi						; existing logbook offset into lo:hi
 	return
 
 
@@ -335,8 +334,8 @@
 	movff	POSTINC1,EEDATA
 	call	write_eeprom					; EEDATA into EEPROM@EEADR
 	incf	EEADR,F
-	decfsz	lo,F							; All done?
-	bra		vault_decodata_into_eeprom2		; No
+	decfsz	lo,F							; all done?
+	bra		vault_decodata_into_eeprom2		; NO
 	clrf	EEADRH
 	return
 
@@ -386,13 +385,13 @@
 	movwf	EEADR
 	movlw	.128
 	movwf	lo
-	lfsr	FSR1,0x700						; pres_tissue_N2+0, 32*4Byte Float = 128Bytes
+	lfsr	FSR1,0x700						; pres_tissue_N2+0, 32*4Byte Float = 128 Bytes
 restore_decodata_from_eeprom2:
 	call	read_eeprom						; EEPROM@EEADR into EEDATA
 	movff	EEDATA,POSTINC1
 	incf	EEADR,F
-	decfsz	lo,F							; All done?
-	bra		restore_decodata_from_eeprom2	; No
+	decfsz	lo,F							; all done?
+	bra		restore_decodata_from_eeprom2	; NO
 	clrf	EEADRH
 	return
 
@@ -400,7 +399,7 @@
 	global	reset_battery_internal_only
 reset_battery_internal_only:
 	clrf	EEADRH
-	clrf	EEDATA							; Delete to zero
+	clrf	EEDATA							; delete to zero
 	write_int_eeprom 0x07
 	write_int_eeprom 0x08
 	write_int_eeprom 0x09
@@ -422,15 +421,15 @@
 
 	global	eeprom_reset_logbook_pointers
 eeprom_reset_logbook_pointers:
-	clrf	EEADRH							; Make sure to select EEPROM bank 0
+	clrf	EEADRH							; make sure to select EEPROM bank 0
 	clrf	EEDATA
 	write_int_eeprom .4
 	write_int_eeprom .5
 	write_int_eeprom .6
-	write_int_eeprom .2						; Also, delete total dive counter
+	write_int_eeprom .2						; also delete total dive counter
 	write_int_eeprom .3
 	write_int_eeprom .16
-	write_int_eeprom .17					; And the backup counter, too
+	write_int_eeprom .17					; ...and the backup counter, too
 	return
 
 	END
--- a/src/external_flash.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/external_flash.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File external_flash.asm											## V2.98
+;   File external_flash.asm											## V2.98c
 ;
 ;   External flash
 ;
@@ -12,7 +12,8 @@
 	#include "hwos.inc"
 	#include "wait.inc"
 
-basic	CODE
+ext_flash		CODE
+
 ;=============================================================================
 
 	global	incf_ext_flash_address_p1
--- a/src/gaslist.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/gaslist.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File gaslist.asm												## V2.98
+;   File gaslist.asm								REFACTORED VERSION V2.99e
 ;
 ;   Managing OSTC gas list
 ;
@@ -9,378 +9,589 @@
 ; HISTORY
 ;   2011-08-11 : [jDG] Creation.
 
-#include "hwos.inc"						; Mandatory header
+#include "hwos.inc"						; mandatory header
 #include "convert.inc"
 #include "math.inc"						; div16x16 for MOD calculations
 #include "strings.inc"
 #include "tft.inc"
 #include "tft_outputs.inc"
 #include "shared_definitions.h"
+#include "wait.inc"
+
+ IFDEF _rx_functions
+#include "rx_ops.inc"
+ ENDIF
 
 	extern	convert_mbar_to_feet
 	extern	customview_show_mix
+	extern	tSetup_GasDepth
 	extern	tGasDisabled
 	extern	tDilDisabled
+	extern	tLiter
+	extern	tbar10
 	extern	tbar
 
-gui		CODE
+gaslist		CODE
 
 ;=============================================================================
-; Append gas description to current string.
+; Helper Functions for divemenu_tree.asm
+;
+; They need to be put in a different file than
+; where the MENU_DYNAMIC macros uses them.
+
+	global	do_toggle_gf_label
+do_toggle_gf_label:
+	movff	char_I_deco_model,WREG		; 0 = ZH-L16, 1 = ZH-L16-GF
+	decfsz	WREG,W						; toggle GF only in GF modes - in GF mode?
+	bra		do_toggle_gf_label_1		; NO - print in disabled color
+	movff	opt_enable_aGF,WREG			; =1: aGF can be selected underwater
+	decfsz	WREG,W						; aGF enabled?
+	bra		do_toggle_gf_label_1		; NO - print in disabled color
+	bra		do_toggle_gf_label_2		; YES to both - print in standard color
+do_toggle_gf_label_1:
+	call	TFT_disabled_color
+do_toggle_gf_label_2:
+	STRCAT_TEXT tDivemenu_ToggleGF
+	return
+
+
+ IFDEF _cave_mode
+	global	do_turn_dive_label
+do_turn_dive_label:
+	btfss	FLAG_cave_mode				; in cave mode?
+	call	TFT_disabled_color			; NO  - print in disabled color
+	btfsc	FLAG_dive_turned			; dive already turned?
+	call	TFT_attention_color			; YES - print in attention color
+	STRCAT_TEXT tDivemenu_TurnDive		; output label
+	return
+ ENDIF
+
+
+	global	do_toggle_max_pres_diff_label
+do_toggle_max_pres_diff_label:
+	movff	opt_TR_mode,WREG			; get TR mode
+	xorlw	.2							; compare with 2 (ind.double)
+	tstfsz	WREG						; equal?
+	call	TFT_disabled_color			; NO - print in disabled color
+	STRCAT_TEXT tTrMaxDeltaP			; output label
+	movff	char_I_max_pres_diff,lo
+	output_99
+	STRCAT_TEXT	tbar					; " bar"
+	return
+
+	global	gaslist_copy_dil_to_oc
+gaslist_copy_dil_to_oc:
+;
+;  Memory Map:
+;  -----------------------------------------
+;  opt_gas_O2_ratio				res 5
+;  opt_dil_O2_ratio				res 5
+;  opt_gas_He_ratio				res 5
+;  opt_dil_He_ratio				res 5
+;  opt_gas_type					res 5
+;  opt_dil_type					res 5
+;  opt_gas_change				res 5
+;  opt_dil_change				res 5
+;
+;  char_I_tank_size				res 10
+;  char_I_tank_pres_fill		res 10
+;
+	bcf		aux_flag					; clear aux_flag by default
+	movf	gaslist_gas,W				; copy current gas or diluent number to WREG
+	btfss	FLAG_diluent_setup			; in CCR menus?
+	bra		gaslist_copy_dil_to_oc_1	; NO  - gaslist_gas is already pointing to an OC gas
+	addlw	-.5							; YES - subtract offset between diluents and gases
+	movwf	gaslist_gas					;     - let gaslist_gas point to the corresponding OC gas
+	bsf		aux_flag					;     - remember we came from a CCR menu
+	bcf		FLAG_diluent_setup			;     - pretend we came from an OC gas menu
+gaslist_copy_dil_to_oc_1:
+	lfsr	FSR0,opt_dil_O2_ratio		; load base address of diluents settings, ASM variables
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of gas      settings, ASM variables
+	movff	PLUSW0,PLUSW1				; copy O2 ratio
+	addlw	.10							; add offset from O2 ratios to He ratios
+	movff	PLUSW0,PLUSW1				; copy He ratio
+	addlw	.10							; add offset from He ratios to types
+	movff	PLUSW0,PLUSW1				; copy type
+	addlw	.10							; add offset from type to change depth
+	movff	PLUSW0,PLUSW1				; copy change depth
+	addlw	-.30						; wind back to initial gas number
+	lfsr	FSR0,char_I_tank_size+5		; load base address of diluents settings, shared variables
+	lfsr	FSR1,char_I_tank_size+0		; load base address of gas      settings, shared variables
+	movff	PLUSW0,PLUSW1				; copy tank size
+	addlw	.10							; add offset from tank sizes to pressure budget
+	movff	PLUSW0,PLUSW1				; copy pressure budget
+	call	gaslist_cleanup_list		; make sure that there will be just one first gas
+	btfss	aux_flag					; did we came from a CCR menu?
+	return								; NO  - done
+	bsf		FLAG_diluent_setup			; YES - restore proper origin again
+	movlw	.5							;     - offset between OC gases and diluents
+	addwf	gaslist_gas,F				;     - let gaslist_gas point to the diluent again
+	WIN_BOX_BLACK .30,.239,.0,.159		;     - create some visual effect to show activity
+	WAITMS	.200						;     - pause for 200 ms
+	return								;     - done
+
+
+;=============================================================================
+; Append gas description to current string
+;
 ; Input:  PRODL : gas number (0..4)
-;         FSR2  : Current string position.
-; Output: Text appended into buffer pointed by FSR2.
+;         FSR2  : Current string position
+; Output: Text appended into buffer pointed by FSR2
 
 	global	gaslist_strcat_gas
-gaslist_strcat_gas:
-	rcall	gaslist_setgas				; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents)
-	; Retrieve gas definition:
-gaslist_strcat_gas_0:
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_O2_ratio		; Read opt_gas_O2_ratio[WREG]
-	movff	PLUSW1,lo					; O2 ratio
-	;movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_He_ratio		; Read opt_gas_He_ratio[WREG]
-	movff	PLUSW1,hi					; He ratio
-	goto	customview_show_mix			; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN
+	global	gaslist_strcat_gas_WREG
+gaslist_strcat_gas:						; entry point with gas/dil in PRODL (0-4) and FLAG_diluent_setup
+	movff	PRODL,gaslist_gas			; get current menu item (0-4)
+	movlw	.5							; offset between gases and diluents
+	btfsc	FLAG_diluent_setup			; in CCR menus?
+	addwf	gaslist_gas,F				; YES - add the offset
+	movf	gaslist_gas,W				; copy to WREG
+gaslist_strcat_gas_WREG:				; entry point with gas/dil in WREG (0-9)
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movff	PLUSW1,lo					; read O2 ratio
+	lfsr	FSR1,opt_gas_He_ratio		; load base address of opt_gas_He_ratio
+	movff	PLUSW1,hi					; read He ratio
+	goto	customview_show_mix			; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN
 
 ;=============================================================================
-; Append current mix to current string (For divemode)
-; Input: FSR2 : Current string position.
-; Output: Text appended into buffer pointed by FSR2.
+; Append current mix to current string (for divemode)
+;
+; Input:  FSR2 : Current string position
+; Output: Text appended into buffer pointed by FSR2
+
 	global	gaslist_strcat_gas6
-gaslist_strcat_gas6:					; Show current O2/He mix
+gaslist_strcat_gas6:					; show current O2/He mix
 	STRCAT_TEXT tGas
 	STRCAT	": "
-	movff	gas6_O2_ratio,lo
-	movff	gas6_He_ratio,hi
-	goto	customview_show_mix			; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN
+	movff	gas6_O2_ratio,hi			; TFT_color_code_gaslist needs O2 ratio in hi
+	call	TFT_color_code_gaslist		; color-code according to O2 ratio and depth
+	movff	gas6_O2_ratio,lo			; customview_show_mix needs O2 ratio in lo
+	movff	gas6_He_ratio,hi			;                   ... and He ratio in hi
+	goto	customview_show_mix			; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and return
+;=============================================================================
+; Helper functions for menu_tree
 
+	global	gaslist_GasDepth
+gaslist_GasDepth:
+	movf	gaslist_gas,W				; load gas/dil index into WREG (0-9)
+	lfsr	FSR1,opt_gas_change			; load base address of change depths
+	tstfsz	PLUSW1						; change depth = 0 ?
+	bra		gaslist_GasDepth_1			; NO
+	lfsr	FSR1,opt_gas_type			; YES - load base address of opt_gas_type
+	tstfsz	PLUSW1						;     - type = disabled ?
+	call	TFT_attention_color			;       NO  - print in attention color (yellow)
+gaslist_GasDepth_1:
+	STRCAT_TEXT tSetup_GasDepth
+	return
 
 	global	gaslist_show_type
 gaslist_show_type:
 	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movff	PLUSW1,lo					; lo holds gas type
+	lfsr	FSR1,opt_gas_type			; load base address of opt_gas_type
+	movff	PLUSW1,lo					; read gas type
 	STRCAT_TEXT tType
-	lfsr	FSR1,tGasDisabled			; Base text number
-	btfsc	ccr_diluent_setup			; In CCR setup?
-	lfsr	FSR1,tDilDisabled			; Base text number
+	lfsr	FSR1,tGasDisabled			; load base address of gas type labels
+	btfsc	FLAG_diluent_setup			; in CCR setup?
+	lfsr	FSR1,tDilDisabled			; YES - load base address of diluent type labels
 	movff	lo,WREG						; 0-3
 	rlncf	WREG						; x2
-	addwf	FSR1L,F
+	addwf	FSR1L,F						; adjust address pointer to required text
 	movlw	.0
 	addwfc	FSR1H,F
-	call	strcat_text
+	call	strcat_text					; copy label text
 	return
 
+
 	global	gaslist_toggle_type
 gaslist_toggle_type:
 	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movff	PLUSW1,lo					; lo holds gas type
-	incf	lo,F						; 0-3/0-2
-	btfsc	ccr_diluent_setup			; In CCR setup?
-	bra		gaslist_toggle_type2		; Yes
-	btfsc	lo,2						; >3?
-	clrf	lo							; Clear to zero
-	movff	lo,PLUSW1					; Copy back result
+	lfsr	FSR1,opt_gas_type			; load base address of opt_gas_type
+	movff	PLUSW1,lo					; read gas type
+	incf	lo,F						; increment type
+	btfsc	FLAG_diluent_setup			; in CCR setup?
+	bra		gaslist_toggle_type2		; YES - diluents
+	btfsc	lo,2						; NO  - gases, type index > 3 ?
+	clrf	lo							;       YES - clear to zero
+	movff	lo,PLUSW1					;     - copy back result
 	return
 gaslist_toggle_type2:
 	movlw	.3
-	cpfslt	lo							; >2?
-	clrf	lo							; Clear to zero
-	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; Copy back result
-	return
-
-	global	gaslist_setSP
-gaslist_setSP:
-	movff	PRODL,gaslist_gas			; 0-4
+	cpfslt	lo							; index > 2 ?
+	clrf	lo							; YES - clear to zero
+	movf	gaslist_gas,W				; restore gaslist_gas in WREG
+	movff	lo,PLUSW1					; copy back result
 	return
 
 
 	global	gaslist_strcat_setpoint
 	global	gaslist_strcat_setpoint_0
-gaslist_strcat_setpoint:
-	call	gaslist_setSP
-gaslist_strcat_setpoint_0:
+gaslist_strcat_setpoint:				; entry point with setpoint index in PRODL
+	movff	PRODL,gaslist_gas			; get current menu item (0-4)
+gaslist_strcat_setpoint_0:				; entry point with setpoint index in gaslist_gas
 	bsf		leftbind
-	btfsc	short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	bra		gaslist_strcat_setpoint2	; Short version
-	STRCAT_TEXT tSP
-	incf	gaslist_gas,W
+	btfsc	short_gas_decriptions		; shall use short versions of gaslist_strcat_setpoint?
+	bra		gaslist_strcat_setpoint2	; YES - use short version
+	STRCAT_TEXT tSP						; "SP"
+	incf	gaslist_gas,W				; (0-4) -> (1-5) into WREG
 	movwf	lo
-	output_8
+	output_8							; print SP number
 	bcf		leftbind
 	PUTC	":"
-gaslist_strcat_setpoint2:				; Short version
+gaslist_strcat_setpoint2:				; short version
 	btfsc	divemode
 	bra		gaslist_strcat_setpoint4	; no "*" in divemode
-	movf	gaslist_gas,W				; Number-1 into WREG
-	bnz		gaslist_strcat_setpoint3	; Not SP1
-	PUTC	"*"
-	bra		gaslist_strcat_setpoint4
-gaslist_strcat_setpoint3:
-	PUTC	" "
+	movf	gaslist_gas,W				; (0-4) into WREG
+	bnz		gaslist_strcat_setpoint3	; SP index = 0 ?
+	PUTC	"*"							; YES - print *
+	bra		gaslist_strcat_setpoint4	;     - continue with cbar value
+gaslist_strcat_setpoint3:				; NO
+	PUTC	" "							;     - print a space
 gaslist_strcat_setpoint4:
-	movf	gaslist_gas,W
-	lfsr	FSR1,char_I_setpoint_cbar
-	movf	PLUSW1,W
+	movf	gaslist_gas,W				; (0-4) into WREG
+	lfsr	FSR1,char_I_setpoint_cbar	; load base address of setpoint cbar values
+	movf	PLUSW1,W					; read cbar value
 	movwf	lo
 	clrf	hi
 	bsf		leftbind
-	output_16dp d'3'
-	btfsc	divemode
-	bra		gaslist_strcat_setpoint5	; Skip text in divemode
-	STRCAT_TEXT tbar
+	output_16dp d'3'					; print as X.XX
+	btfsc	divemode					; in divemode?
+	bra		gaslist_strcat_setpoint5	; YES - skip text in divemode
+	STRCAT_TEXT tbar					; NO  - print "bar"
 gaslist_strcat_setpoint5:
-	PUTC	" "
-	; Read switch depth
-	movf	gaslist_gas,W
-	lfsr	FSR1,char_I_setpoint_change
-	movff	PLUSW1,lo
+	PUTC	" "							; print a space
+	movf	gaslist_gas,W				; (0-4) into WREG
+	lfsr	FSR1,char_I_setpoint_change	; load base address of switch depths
+	movff	PLUSW1,lo					; read switch depth into lo
+	bra		gaslist_strcat_depth		; print depth in meters or ft
 
-	bsf		ccr_diluent_setup			; inhibit output of "----" for depth 
-	call	gaslist_strcat_5
-	bcf		ccr_diluent_setup
-	return
 
 ;----------------------------------------------------------------------------
-; Append gas description to current string.
-; Input:  PRODL : gas number (0..4)
-;         FSR2  : Current string position.
-; Output: Text appended into buffer pointed by FSR2.
+; Append gas description to current string
+;
+; Prints gas number, * if first, = if deco gas, gas composition and change depth,
+; including fancy color-coding
 ;
-; NOTE: used in the menu-tree for the MENU_CALLBACK entry.
-
-gaslist_strcat_gas_better:				; Yes, check if this is a "better gas"
-	bcf		win_invert
-	movff	better_gas_number,WREG		; get better gas number into WREG
-	decf	WREG,W						; better_gas_number = better_gas_number -1
-	btfsc	ccr_diluent_setup			; in CCR menus?
-	addlw	.5							; Yes, offset to gases 5-9
-	cpfseq	gaslist_gas					; 0-4 for OC/Bailout, 5-9 for Diluents
-	return
-	call	TFT_attention_color			; show in yellow
-	bsf	win_invert						; And invert
-	return
+; Input:  PRODL gas number (0..4)
+;         FSR2  current string position
+; Output: text appended to buffer pointed by FSR2
+;
+; NOTE: used in the menu-tree for the MENU_CALLBACK entry
 
-	global	gaslist_strcat_gas_mod
-gaslist_strcat_gas_mod:
-	rcall	gaslist_setgas				; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents)
-	bsf		space_gas_decriptions		; add a space in front for gas numbers < 10 for alignment
-	;bra	gaslist_gastitle
-
+	global	gaslist_strcat_gas_cd
 	global	gaslist_gastitle
-gaslist_gastitle:
-	btfsc	short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	bra		gaslist_gastitle1			; Short version
-	STRCAT_TEXT tGas
-	incf	gaslist_gas,W
+gaslist_strcat_gas_cd:					; entry point with gas in PRODL (0-4) and usage of FLAG_diluent_setup
+	movff	PRODL,gaslist_gas			; get current menu item (0-4)
+	movlw	.5							; offset between gases and diluents
+	btfsc	FLAG_diluent_setup			; in diluent menus?
+	addwf	gaslist_gas,F				; YES - add the offset
+gaslist_gastitle:						; entry point with gas/dil in gaslist_gas (0-4 for gases, 5-9 for diluents)
+	bcf		win_invert					; clear flag for inverted output by default
+	btfsc	short_gas_decriptions		; shall use short versions of gaslist_strcat_gas_cd?
+	bra		gaslist_gastitle1			; YES - use short version
+	incf	gaslist_gas,W				; (0-9) -> (1-10) into WREG
 	movwf	lo
-	btfss	space_gas_decriptions		; add a space in front for gas numbers < 10 for alignment?
-	bra		gaslist_gastitle0			; NO
-	bcf		space_gas_decriptions		; YES - clear flag again
-	movlw	.10							;       load a 10
-	cpfslt	lo							;       gas# < 10 ?
-	bra		gaslist_gastitle0			;       NO
-	PUTC	" "							;       YES - add a space
+	movlw	.6							; diluents start with 6
+	cpfslt	lo							; gas number < 6 ?
+	bra		gaslist_gastitle_dil		; NO  - it's a diluent
+	STRCAT_TEXT tGas					; YES - it's a gas
+	bra		gaslist_gastitle0
+gaslist_gastitle_dil:
+	STRCAT_TEXT tDil
+	movlw	.5							; offset between gases and diluents
+	subwf	lo,F						; subtract offset from diluent number (6-10) -> (1-5)
 gaslist_gastitle0:
 	bsf		leftbind
-	output_8
+	output_8							; print gas/dil number (1-5)
 	bcf		leftbind
 	PUTC	":"
-gaslist_gastitle1:
-	lfsr	FSR1,opt_gas_type
-	btfsc	divemode
-	bra		gaslist_gastitle3			; no "*" in divemode
-	movf	gaslist_gas,W
-	decf	PLUSW1,W					; Type-1 into WREG
-	bnz		gaslist_gastitle2			; Not "First"
-	PUTC	"*"
-	bra		gaslist_gastitle3
+gaslist_gastitle1:						; short version of gaslist_strcat_gas_cd
+	btfsc	divemode					; in divemode?
+	bra		gaslist_gastitle3			; YES - no "*" and "=" in front of gas composition, no highlighting for transmitters paired
+
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; NO  - TR functions enabled?
+	bra		gaslist_gastitle2			;       NO  - continue with gas type
+	lfsr	FSR1,opt_transmitter_id_1	;       YES - load base address of transmitter ID table
+	movf	gaslist_gas,W				;           - (0-4 for OC/Bailout, 5-9 for Diluents)
+	rlncf	WREG,W						;           - index x2 because IDs are 2 byte
+	tstfsz	PLUSW1						;           - transmitter ID low byte <> 0 ?
+	bsf		win_invert					;             YES - flag transmitter paired by inverting output
+	incf	WREG,W						;           - increment index
+	tstfsz	PLUSW1						;           - transmitter ID high byte <> 0 ?
+	bsf		win_invert					;             YES - flag transmitter paired by inverting output
+ ENDIF
+
 gaslist_gastitle2:
-	PUTC	" "
+	rcall	gaslist_strcat_gas_type		; print "*" for first gas/dil, "=" for a deco gas or " " else
 gaslist_gastitle3:
 	call	TFT_standard_color
-	btfsc	divemode					; In divemode?
-	rcall	gaslist_strcat_gas_better	; Yes, check if this is a "better gas"
-	movf	gaslist_gas,W				; (0-4 for OC/Bailout, 5-9 for Diluents)
-	movf	PLUSW1,W
-	bnz		gaslist_strcat_3
-	call	TFT_disabled_color
-	bra		gaslist_strcat_4			; no MOD-check and red color for disabled gases
-gaslist_strcat_3:
-	rcall	gaslist_strcat_gas_0
-	PUTC	" "
-	; Read switch depth
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents-5
-	movlw	.4
-	cpfsgt	gaslist_gas					; >4? (-> Diluents)
-	lfsr	FSR1,opt_OC_bail_gas_change	; Setup OC Gases
-
-	movf	gaslist_gas,W				; (0-4 for OC/Bailout, 5-9 for Diluents)
-	movff	PLUSW1,lo
-	rcall	gaslist_calc_mod			; Compute MOD into WREG
-	cpfsgt	lo							; within MOD range?
-	bra		gaslist_strcat_5			; YES
-	call	TFT_warnings_color			; NO  - turn red
-	bra		gaslist_strcat_5			; skip gaslist_strcat_gas_0 here
-gaslist_strcat_4:
-	rcall	gaslist_strcat_gas_0
-	PUTC	" "
-	; Dummy code, needs some cleanup someday...
-	; Read switch depth
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents-5
-	movlw	.4
-	cpfsgt	gaslist_gas					; >4? (-> Diluents)
-	lfsr	FSR1,opt_OC_bail_gas_change	; Setup OC Gases
-	movf	gaslist_gas,W				; (0-4 for OC/Bailout, 5-9 for Diluents)
-	movff	PLUSW1,lo
-	rcall	gaslist_calc_mod			; Compute MOD into WREG
-gaslist_strcat_5:
-	PUTC	" "
-	TSTOSS	opt_units					; 0=Meter, 1=Feet
-	bra		gaslist_strcat_3_metric
-;gaslist_strcat_3_imperial:
-	btfsc	ccr_diluent_setup			; =1: Setting up Diluents ("Gas6-10")
-	bra		gaslist_imperial_non_travel
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movff	PLUSW1,up					; up holds gas type
-	movlw	.2							; 2=Travel
-	cpfseq	up							; compare gas type with type 2=Travel
-	bra		gaslist_imperial_non_travel	; Non-Travel Gas
-	bra		gaslist_strcat_depth_travel	; Show "---" instead of "0m"...
-gaslist_imperial_non_travel:
+	btfsc	divemode					; in divemode?
+	rcall	gaslist_strcat_gas_better	; YES - check if this is a "better gas"
+	lfsr	FSR1,opt_gas_type			; load base address of gas types
+	movf	gaslist_gas,W				; load index into WREG (0-4 for gases, 5-9 for diluents)
+	movf	PLUSW1,W					; read gas/dil type into WREG
+	bnz		gaslist_gastitle4			; type = disabled? NO  - keep color
+	call	TFT_disabled_color			;                  YES - switch color to disabled
+	bra		gaslist_gastitle5			;                      - skip ppO2 check for disabled gases
+gaslist_gastitle4:
+	btfss	divemode					; in divemode?
+	bra		gaslist_gastitle5			; NO  - no ppO2 check if not in divemode
+	lfsr	FSR1,opt_gas_O2_ratio		; YES - load base address of opt_gas_O2_ratio
+	movf	gaslist_gas,W				;     - load index into WREG (0-4 for gases, 5-9 for diluents)
+	movff	PLUSW1,hi					;     - read O2 ratio into hi
+	call	TFT_color_code_gaslist		;     - set color according to ppO2 limits
+gaslist_gastitle5:
+	movf	gaslist_gas,W				; copy gas/dil index to WREG (0-9)
+	rcall	gaslist_strcat_gas_WREG		; print gas composition
+	btfss	divemode					; in divemode?
+	bra		gaslist_gastitle6			; NO  - continue printing a space
+	rcall	gaslist_strcat_gas_type		; YES - print "*" for first gas/dil, "=" for a deco gas, or a space else
+	bra		gaslist_gastitle7			;     - continue with change depth
+gaslist_gastitle6:
+	PUTC	" "							; print a space
+gaslist_gastitle7:
+	lfsr	FSR1,opt_gas_change			; load base address of change depths
+	movf	gaslist_gas,W				; load gas/dil index into WREG (0-9)
+	movff	PLUSW1,lo					; read change depth into lo
+gaslist_strcat_depth:					; entry point for general printing of depths with value in meters in lo
+	TSTOSS	opt_units					; check depth units
+	bra		gaslist_strcat_depth_metric	; 0 - use Meters
+gaslist_strcat_depth_imperial:			; 1 - use Feet
 	movf	lo,W
 	mullw	.100						; convert meters to mbar
 	movff	PRODL,lo
 	movff	PRODH,hi
 	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	bsf		leftbind
-	output_16_3							; limit to 999 and display only (0-999)
-	STRCAT_TEXT tFeets					; "ft"
+	;bsf	leftbind
+	output_16_3							; limit to 999 and display only 0-999
+	STRCAT_TEXT tFeets					; append "ft"	REMARK: still one char to long for space available in divemode menu!
+	return
+gaslist_strcat_depth_metric:
+	PUTC	" "							; print a space
+	output_99
+	STRCAT_TEXT tMeters					; "m"
 	return
-gaslist_strcat_3_metric:
-	btfsc	ccr_diluent_setup			; =1: Setting up Diluents ("Gas6-10")
-	bra		gaslist_metric_non_travel
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movff	PLUSW1,up					; up holds gas type
-	movlw	.2							; 2=Travel
-	cpfseq	up							; compare gas type with type 2=Travel
-	bra		gaslist_metric_non_travel	; Non-Travel Gas
-gaslist_strcat_depth_travel:			; Show "---" instead of "0m"...
-	STRCAT	"---"
-	return
-gaslist_metric_non_travel:
-	output_99
-	STRCAT_TEXT	tMeters					; "m"
+
+gaslist_strcat_gas_better:				; color-code output if this is the best gas/diluent
+	btfss	better_gas_hint				; shall better gas hints be given?
+	return								; NO - return
+	movf	best_gas_number,W			; get best gas number into WREG
+	btfsc	FLAG_diluent_setup			; in CCR (pSCR) menus?
+	movf	best_dil_number,W			; YES - overwrite with best diluent number
+	tstfsz	WREG						; is a best gas/dil available?
+	bra		gaslist_strcat_gas_better1	; YES - proceed
+	return								; NO  - return
+gaslist_strcat_gas_better1:
+	decf	WREG,W						; (1-5) -> (0-4)
+	btfsc	FLAG_diluent_setup			; in diluent menus?
+	addlw	.5							; YES - add offset between gases and diluents (0-4) -> (5-9)
+	cpfseq	gaslist_gas					; compare with given gas/dil (0-4 for OC bailout gases, 5-9 for diluents)
+	return								; not equal - return
+	bsf		win_invert					;     equal - invert
+	movlw	color_green					;           - select green color (gas is something "good")
+	goto	TFT_set_color				;           - activate color and return
+
+gaslist_strcat_gas_type:
+	lfsr	FSR1,opt_gas_type			; load base address of gas types
+	movf	gaslist_gas,W				; load index to WREG (0-4 for gases, 5-9 for diluents)
+	decf	PLUSW1,W					; read gas/dil type into WREG and...
+										; ...decrement by 1  (-1 for disabled,  0 for first,  1 for travel/normal, 2 for deco)
+	bnz		gaslist_strcat_gas_type_1	; type = first? NO  - continue with checking for deco gas
+	PUTC	"*"							;               YES - print "*" for first
+	return								;                   - done
+gaslist_strcat_gas_type_1:
+	decf	WREG,W						; decrement gas type (-2 for disabled, -1 for first,  0 for travel/normal, 1 for deco)
+	decf	WREG,W						; decrement gas type (-3 for disabled, -2 for first, -1 for travel/normal, 0 for deco)
+	bnz		gaslist_strcat_gas_type_2	; type = deco? NO  - neither first nor deco
+	PUTC	"="							;              YES - print "=" for a deco gas
+	return								;                   - done
+gaslist_strcat_gas_type_2:
+	PUTC	" "							; neither first nor deco, print a space
 	return
 
 ;----------------------------------------------------------------------------
-; Store current menu item, and display gas description later.
-; Input: PRODL : gas number (0..4)
-; NOTE: used in the menu-tree for the MENU_CALLBACK entry.
+; Housekeeping for the gas/dil settings, e.g. making sure there is one FIRST only
+;
+; Input:  gaslist_gas  last edited gas/dil (0-9)
+
+	global	gaslist_cleanup_list
+gaslist_cleanup_list:
+	lfsr	FSR1,opt_gas_type			; load base address of opt_gas_type
+	movlw	.5							; offset between gases and diluents
+	btfsc	FLAG_diluent_setup			; in CCR-Menu?
+	subwf	gaslist_gas,F				; YES - subtract offset from gaslist_gas: (5-9) -> (0-4)
+gaslist_cleanup_list0:
+	bcf		ignore_last_edited_gas
+gaslist_cleanup_list1:
+	clrf	lo							; counter for number of "firsts" found
+	movlw	.5							; initialize hi as loop counter for checking 5 gases/diluents
+	movwf	hi
+gaslist_cleanup_list2:					; loop body
+	decf	hi,W						; WREG = current gas/dil (0-4)
+	btfsc	FLAG_diluent_setup			; in CCR-Menu?
+	addlw	.5							; YES - add offset from gases to diluents -> (5-9)
+	movff	PLUSW1,WREG					; read type into WREG
+	decfsz	WREG						; is type = first (ex type code 1)?
+	bra		gaslist_cleanup_list3		; NO  - done with this gas/dil
+	incf	lo,F						; YES - increment number of "firsts" found
+	btfss	ignore_last_edited_gas		;     - shall we ignore the last edited gas/dil?
+	bra		gaslist_cleanup_list2b		;       NO  - continue remembering the "last first" gas/dil (do a shortcut)
+	decf	hi,W						;       YES - get the current gas/dil as (0-4)
+	cpfseq	gaslist_gas					;           - is this the last edited gas/dil?
+gaslist_cleanup_list2b:
+	movff	hi,up						;             (NO) - remember the last "first gas" found
+gaslist_cleanup_list3:
+	decfsz	hi,F						; decrement loop counter
+	bra		gaslist_cleanup_list2		; loop counter became 0 ? NO  - loop
+	tstfsz	lo							;                         YES - any first gas/dil at all?
+	bra		gaslist_cleanup_list4		;                               YES - at least one first gas/dil existing
+	btfsc	FLAG_diluent_setup			;                               NO  - in CCR-Menu?
+	lfsr	FSR1,opt_dil_type			;                                     YES - load base address of opt_gas_type
+	movlw	.1							;                                   - load coding for first gas
+	movwf	INDF1						;                                   - make gas/dil 1 the first gas
+	return								;                                   - done
+gaslist_cleanup_list4:
+	movlw	.1
+	cpfsgt	lo							; more then one "first gas" found?
+	return								; NO  - done
+	decf	up,W						; YES - WREG = last found "first gas" - 1 (0-4)
+	cpfseq	gaslist_gas					;     - is this the last edited gas/dil?
+	bra		gaslist_cleanup_list4b		;       NO  - disable it
+	bsf		ignore_last_edited_gas		;       YES - do not disable last edited gas, search again but ignore the last edited gas
+	bra		gaslist_cleanup_list1		;           - loop until only one "first" is left over
+gaslist_cleanup_list4b:
+	btfsc	FLAG_diluent_setup			; in CCR-Menu?
+	addlw	.5							; YES - adjust offset
+	clrf	PLUSW1						; disable gas
+	bra		gaslist_cleanup_list0		; redo from start until only one "first" is left over
+	return
+
+;----------------------------------------------------------------------------
+; Tank Settings
+;
+; Inputs: char_I_tank_size       size of the tank,                     using unit text tLiter ("l")
+;         char_I_tank_pres_fill  fill pressure in multiples of 10 bar, using unit text tbar10 ("0 bar")
 
-	global	gaslist_setgas
-gaslist_setgas:
-	movff	PRODL,gaslist_gas
-	movlw	.5
-	btfsc	ccr_diluent_setup			; in CCR menus?
-	addwf	gaslist_gas,F				; Yes, offset to gases 5-9
+	global	gaslist_tank_size_pres
+gaslist_tank_size_pres:					; dynamic title: xx l, xx0 bar
+	lfsr	FSR1,char_I_tank_size		; load base address of char_I_tank_size
+	movf	gaslist_gas,W				; load index (0-9)
+	movff	PLUSW1,lo					; read char_I_tank_size[WREG] into lo
+	lfsr	FSR1,char_I_tank_pres_fill	; load base address of char_I_tank_pres_fill
+	movff	PLUSW1,hi					; read char_I_tank_pres_fill[WREG] into hi
+	STRCAT	"     "						; print 5 leading spaces for alignment
+	output_8							; print tank size
+	STRCAT_TEXT tLiter					; print unit (" l")
+	movff	hi,lo						; copy fill pressure into lo
+	output_8							; print fill pressure (it is stored in multiples of 10 bar)
+	STRCAT_TEXT tbar10					; print unit ("0 bar")
+	return
+
+	global	gaslist_tank_size
+gaslist_tank_size:						; adjust char_I_tank_size between min_tank_size and max_tank_size
+	lfsr	FSR1,char_I_tank_size		; load base address of char_I_tank_size
+	movf	gaslist_gas,W				; load index (0-9)
+	movff	PLUSW1,lo					; read char_I_tank_size[WREG] into lo
+	incf	lo,F						; increment tank size by 1 liter
+	movlw	max_tank_size				; load max. allowed value into WREG
+	cpfsgt	lo							; tank size <= max value?
+	bra		gaslist_tank_size_1			; YES - new value can be used
+	movlw	min_tank_size				; NO  - wrap-around to min value
+	movwf	lo							;     - and write to lo
+gaslist_tank_size_1:
+	movf	gaslist_gas,W				; re-load index
+	movff	lo,PLUSW1					; write back tank size to char_I_tank_size[WREG]
+	return
+
+	global	gaslist_tank_pres
+gaslist_tank_pres:						; adjust char_I_tank_pres_fill between 5(0) and 29(0) bar
+	lfsr	FSR1,char_I_tank_pres_fill	; load base address of char_I_tank_pres_fill
+	movf	gaslist_gas,W				; load index (0-9)
+	movff	PLUSW1,lo					; read char_I_tank_pres_fill[WREG] into lo
+	incf	lo,F						; increment fill press by by 1(0) bar
+	movlw	max_fill_press				; load max. allowed value into WREG
+	cpfsgt	lo							; press <= max value?
+	bra		gaslist_tank_pres_1			; YES - new value can be used
+	movlw	min_fill_press				; NO  - wrap-around to min value
+	movwf	lo							;     - and write to lo
+gaslist_tank_pres_1:
+	movf	gaslist_gas,W				; re-load index
+	movff	lo,PLUSW1					; write back tank size to char_I_tank_pres_fill[WREG]
+	return
+
+;----------------------------------------------------------------------------
+; Transmitter functions
+
+ IFDEF _rx_functions
+
+	global	gaslist_tank_id_pres
+gaslist_tank_id_pres:					; dynamic title: shows ID and pressure from transmitter with ID opt_transmitter_id[gaslist_gas]
+										;                When changing layout, adapt output position TFT_menu_tank_pres!
+	STRCAT	"  ID: "					; print header
+	; get ID							;
+	lfsr	FSR1,opt_transmitter_id_1	; load base address of opt_transmitter_id
+	movf	gaslist_gas,W				; load index (0-9)
+	rlncf	WREG,W						; multiply by 2 because IDs are 2 byte in size
+	movff	PLUSW1,lo					; copy opt_transmitter_id+0[gaslist_gas] to lo
+	incf	WREG,W						; increment index
+	movff	PLUSW1,hi					; copy opt_transmitter_id+1[gaslist_gas] to hi
+	; check if a transmitter is paired to this tank
+	tstfsz	hi							; high byte of ID <> 0 ?
+	bra		gaslist_tank_id_pres_1		; YES - a transmitter is paired to the tank
+	tstfsz	lo							; low  byte of ID <> 0 ?
+	bra		gaslist_tank_id_pres_1		; YES - a transmitter is paired to the tank
+	; no transmitter paired
+	STRCAT	"----"						;
+	bcf		menu_update_tank_pres		; stop imprinting of tank pressure updates
+	return
+gaslist_tank_id_pres_1:
+	; show ID
+	movf	hi,W						; copy high byte of ID to WREG
+	output_hex							; print it
+	movf	lo,W						; copy low  byte of ID to WREG
+	output_hex							; print it
+	bsf		menu_update_tank_pres		; start imprinting of tank pressure updates
 	return
 
 
-	global	gaslist_cleanup_list		; Takes care that only one gas can be first and first has 0m change depth
-gaslist_cleanup_list:
-	bcf		ignore_last_edited_gas
-	movlw	.0
-	btfsc	ccr_diluent_setup			; In CCR-Menu?
-	addlw	.5							; Yes, adjust offset
-	subwf	gaslist_gas,F
-gaslist_cleanup_list1:
-	clrf	lo
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movlw	.5							; Check 5 gases
-	movwf	hi
-gaslist_cleanup_list2:
-	decf	hi,w						; 0-4
-	btfsc	ccr_diluent_setup			; In CCR-Menu?
-	addlw	.5							; Yes, adjust offset
-	movff	PLUSW1,WREG					; read gas type
-	decfsz	WREG						; is gas = first (ex 1)?
-	bra		gaslist_cleanup_list3		; NO
-	incf	lo,F						; YES - count "first gases"
-	btfss	ignore_last_edited_gas		; If we are not in the second-pass mode
-	bra		gaslist_cleanup_list2b
-	decf	hi,w						; 0-4
-	cpfseq	gaslist_gas					; Do not disable last edited gas
-gaslist_cleanup_list2b:
-	movff	hi,up						; Keep the last "first gas" found
-gaslist_cleanup_list3:
-	decfsz	hi,F
-	bra		gaslist_cleanup_list2		; Loop
-	tstfsz	lo							; No gas active?
-	bra		gaslist_cleanup_list4		; No, at least one is active
-	btfsc	ccr_diluent_setup			; In CCR-Menu?
-	bra		gaslist_cleanup_list3a		; Yes.
-	; make gas1 first and zero
-	movlw	.1							; First
-	movwf	up
-	movwf	INDF1
-	bra	gaslist_cleanup_list5			; Set change depth to zero
-gaslist_cleanup_list3a:
-	movlw	.5
-	addwf	FSR1L,F
-	movlw	.0
-	addwfc	FSR1H,F						; Setup to Diluents
-	; make dil1 first and zero
-	movlw	.1							; First
-	movwf	up
-	movwf	INDF1
-	bra		gaslist_cleanup_list5		; Set change depth to zero
-gaslist_cleanup_list4:
-	movlw	.1
-	cpfsgt	lo							; More then one "first gas"?
-	bra		gaslist_cleanup_list5		; No, done.
-	; More then one Gas is "first gas"
-	; Disable last found "first gas" but keep it's change depth
-	decf	up,W						; 0-4
-	cpfseq	gaslist_gas					; Do not disable last edited gas
-	bra		gaslist_cleanup_list4b
-	; Do not disable last edited gas
-	; search again but ignore last edited gas
-	bsf		ignore_last_edited_gas
-	bra		gaslist_cleanup_list1		; Loop until only one "first gas" is left
-gaslist_cleanup_list4b:
-	btfsc	ccr_diluent_setup			; In CCR-Menu?
-	addlw	.5							; Yes, adjust offset
-	clrf	PLUSW1						; Disable gas
-	bra		gaslist_cleanup_list		; Loop until only one "first gas" is left
-gaslist_cleanup_list5:
-	; Read switch depth
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents-5
-	btfss	ccr_diluent_setup			; In CCR-Menu?
-	lfsr	FSR1,opt_OC_bail_gas_change	; No, setup OC Gases
-	decf	up,W
-	btfsc	ccr_diluent_setup			; In CCR-Menu?
-	addlw	.5							; Yes, adjust offset
-	clrf	PLUSW1						; Set First gas to zero m
-	return
+	global	gaslist_tank_pairing
+gaslist_tank_pairing:
+	incf	pairing_slot,F				; goto next RX data slot
+	btfsc	pairing_slot,3				; slot = 8?
+	bra		gaslist_tank_pairing_none	; YES - offer unpairing
+	movf	pairing_slot,W				; NO  - copy slot to WREG
+	call	get_transmitter_id_by_slot	; WREG = slot (0-7) -> hi:lo = transmitter ID
+	tstfsz	hi							; transmitter found (probe on high byte)?
+	bra		gaslist_tank_pairing_common	; YES - select this transmitter
+	tstfsz	hi							; transmitter found (probe on low byte)?
+	bra		gaslist_tank_pairing_common	; YES - select this transmitter
+	bra		gaslist_tank_pairing		; NO  - try next slot
+gaslist_tank_pairing_common:
+	lfsr	FSR1,opt_transmitter_id_1	; load base address of opt_transmitter_id
+	movf	gaslist_gas,W				; load index into WREG (0-9)
+	rlncf	WREG,W						; multiply by 2 because IDs are 2 byte in size
+	movff	lo,PLUSW1					; copy lo to opt_transmitter_id+0[gaslist_gas]
+	incf	WREG,W						; increment index
+	movff	hi,PLUSW1					; copy hi to opt_transmitter_id+1[gaslist_gas]
+	return								; done
+gaslist_tank_pairing_none:
+	setf	pairing_slot				; prime slot number with 255 aka -1
+	clrf	hi							; adjust "no transmitter" ID
+	clrf	lo							; adjust "no transmitter" ID
+	bra		gaslist_tank_pairing_common	; continue with common part
+
+ ENDIF
 
 ;----------------------------------------------------------------------------
 ; Increment/Decrement O2 ratio
 
 	global	gaslist_pO2
 gaslist_pO2:
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_He_ratio		; Read opt_gas_He_ratio[WREG]
-	movff	PLUSW1,hi					; hi holds He ratio
-	lfsr	FSR1,opt_gas_O2_ratio		; Read opt_gas_O2_ratio[WREG]
-	movff	PLUSW1,lo					; lo holds O2 ratio
+	movf	gaslist_gas,W				; load index (0-9)
+	lfsr	FSR1,opt_gas_He_ratio		; load base address of opt_gas_He_ratio
+	movff	PLUSW1,hi					; read He ratio into hi
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movff	PLUSW1,lo					; read O2 ratio into lo
 
 	incf	lo,F						; O2++
 	movf	hi,W						; get He ratio into WREG
@@ -389,24 +600,23 @@
 	movlw	.101						;
 	cpfslt	up							; O2 + He < 101?
 	decf	lo,F						; O2-- (revoke ++)
-	movf	gaslist_gas,W
+	movf	gaslist_gas,W				; re-load index
 	movff	lo,PLUSW1					; write back O2 ratio to opt_gas_O2_ratio[WREG]
 	return
 
 	global	gaslist_mO2
 gaslist_mO2:
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_O2_ratio		; Read opt_gas_O2_ratio[WREG]
-	movff	PLUSW1,lo					; lo holds O2 ratio
+	movf	gaslist_gas,W				; load index (0-9)
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movff	PLUSW1,lo					; read O2 ratio into lo
 
 	decf	lo,F						; O2--
 	movlw	gaslist_min_o2				; get minimum allowed O2 ratio
 	cpfslt	lo							; current O2 ratio below allowed minimum?
 	bra		gaslist_mO2_1				; NO
-	movlw	gaslist_min_o2				; YES - load minimum
-	movwf	lo							;       write minimum to current O2 ratio
+	movwf	lo							; YES - copy minimum O2 ratio to lo
 gaslist_mO2_1:
-	movf	gaslist_gas,W
+	movf	gaslist_gas,W				; re-load index
 	movff	lo,PLUSW1					; write back O2 ratio to opt_gas_O2_ratio[WREG]
 	return
 
@@ -415,11 +625,11 @@
 
 	global	gaslist_pHe
 gaslist_pHe:
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_O2_ratio		; Read opt_gas_O2_ratio[WREG]
-	movff	PLUSW1,lo					; lo holds O2 ratio
-	lfsr	FSR1,opt_gas_He_ratio		; Read opt_gas_He_ratio[WREG]
-	movff	PLUSW1,hi					; hi holds He ratio
+	movf	gaslist_gas,W				; load index (0-9)
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movff	PLUSW1,lo					; read O2 ratio into lo
+	lfsr	FSR1,opt_gas_He_ratio		; load base address of opt_gas_He_ratio
+	movff	PLUSW1,hi					; read He ratio into hi
 
 	incf	hi,F						; He++
 	movf	hi,W						; get He ratio into WREG
@@ -428,21 +638,21 @@
 	movlw	.101						;
 	cpfslt	up							; O2 + He < 101?
 	decf	hi,F						; He-- (revoke ++)
-	movf	gaslist_gas,W
+	movf	gaslist_gas,W				; re-load index
 	movff	hi,PLUSW1					; write back He ratio to opt_gas_He_ratio[WREG]
 	return
 
 	global	gaslist_mHe
 gaslist_mHe:
-	movf	gaslist_gas,W
-	lfsr	FSR1,opt_gas_He_ratio		; Read opt_gas_He_ratio[WREG]
-	movff	PLUSW1,hi					; hi holds He ratio
+	movf	gaslist_gas,W				; load index (0-9)
+	lfsr	FSR1,opt_gas_He_ratio		; load base address of opt_gas_He_ratio
+	movff	PLUSW1,hi					; read He ratio into hi
 
 	decf	hi,F						; He--
 	bnn		gaslist_mHe_1				; He ratio negative?
-	clrf	hi							; YES - set He to 0
+	clrf	hi							; YES - set He ratio to 0
 gaslist_mHe_1:
-	movf	gaslist_gas,W
+	movf	gaslist_gas,W				; re-load index
 	movff	hi,PLUSW1					; write back He ratio to opt_gas_He_ratio[WREG]
 	return
 
@@ -451,46 +661,35 @@
 
 	global	gaslist_pDepth
 gaslist_pDepth:
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents-5
-	movlw	.4
-	cpfsgt	gaslist_gas					; >4? (-> Diluents)
-	lfsr	FSR1,opt_OC_bail_gas_change	; Setup OC Gases
-	movf	gaslist_gas,W
-	movff	PLUSW1,lo					; Read char_I_deco_gas_change[WREG]
-	incf	lo,F
-	movlw	gaslist_max_change_depth
-	cpfsgt	lo
-	bra		gaslist_pDepth_1
-	movlw	gaslist_max_change_depth
-	movwf	lo
+	lfsr	FSR1,opt_gas_change			; load base address of opt_gas_change
+	movf	gaslist_gas,W				; load index (0-4)
+	movff	PLUSW1,lo					; read switch depth into lo
+	incf	lo,F						; increment switch depth
+	movlw	gaslist_max_change_depth	; get max change depth
+	cpfsgt	lo							; above max change depth?
+	bra		gaslist_pDepth_1			; NO
+	movwf	lo							; YES - revert to max change depth
 gaslist_pDepth_1:
-	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; Write back to char_I_deco_gas_change[WREG]
+	movf	gaslist_gas,W				; re-load index
+	movff	lo,PLUSW1					; write back switch depth
 	return
 
 	global	gaslist_mDepth
 gaslist_mDepth:
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents-5
-	movlw	.4
-	cpfsgt	gaslist_gas					; >4? (-> Diluents)
-	lfsr	FSR1,opt_OC_bail_gas_change	; Setup OC Gases
-
-	movf	gaslist_gas,W
-	movff	PLUSW1,lo					; Read char_I_deco_gas_change[WREG]
-
-	decf	lo,F
-	btfsc	STATUS,N
-	clrf	lo
-
-	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; And write back to char_I_deco_gas_change[WREG]
+	lfsr	FSR1,opt_gas_change			; load base address of opt_gas_change
+	movf	gaslist_gas,W				; load index (0-4)
+	movff	PLUSW1,lo					; read switch depth into lo
+	decf	lo,F						; decrement switch depth
+	btfsc	STATUS,N					; did depth became negative?
+	clrf	lo							; YES - reset to zero
+	movff	lo,PLUSW1					; write back switch depth
 	return
 
 	global	gaslist_spplus
 gaslist_spplus:
 	movf	gaslist_gas,W
 	lfsr	FSR1,char_I_setpoint_cbar
-	movff	PLUSW1,lo					; Read char_I_setpoint_cbar[WREG]
+	movff	PLUSW1,lo					; read setpoint
 	movlw	gaslist_sp_stepsize
 	addwf	lo,F
 	movlw	gaslist_sp_max
@@ -500,165 +699,129 @@
 	movwf	lo
 gaslist_spplus2:
 	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; Write back to char_I_setpoint_cbar
+	movff	lo,PLUSW1					; write back setpoint
 	return
 
 	global	gaslist_spdepthplus
 gaslist_spdepthplus:
-	movf	gaslist_gas,W
-	bz		gaslist_spdepthplus3		; Setpoint 1 is always 0m
-	lfsr	FSR1,char_I_setpoint_change
-	movff	PLUSW1,lo					; Read char_I_deco_gas_change[WREG]
-	incf	lo,F
-	movlw	gaslist_max_change_depth
-	cpfsgt	lo
-	bra		gaslist_spdepthplus_1
-	movlw	gaslist_max_change_depth
-	movwf	lo
+	movf	gaslist_gas,W				; get setpoint number (0-4)
+	bz		gaslist_spdepthplus2		; setpoint number = 0? YES - force depth to always be 0m
+	lfsr	FSR1,char_I_setpoint_change	; load base address of char_I_setpoint_change
+	movff	PLUSW1,lo					; read setpoint depth into lo
+	incf	lo,F						; increment depth
+	movlw	gaslist_max_change_depth	; get max. depth
+	cpfsgt	lo							; switch depth > max. depth?
+	bra		gaslist_spdepthplus_1		; NO
+	movwf	lo							; YES - copy to lo
 gaslist_spdepthplus_1:
-	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; Write back to char_I_deco_gas_change[WREG]
-	return
-
-gaslist_spdepthplus3:
-	movlw	.0
-	movff	WREG,char_I_setpoint_change+0	; Reset to 0m
+	movf	gaslist_gas,W				; re-load index
+	movff	lo,PLUSW1					; write back setpoint depth
 	return
 
 	global	gaslist_spdepthminus
 gaslist_spdepthminus:
-	movf	gaslist_gas,W
-	bz		gaslist_spdepthplus3		; Setpoint 1 is always 0m
-	lfsr	FSR1,char_I_setpoint_change
-	movff	PLUSW1,lo					; Read char_I_deco_gas_change[WREG]
-	decf	lo,F
-	btfsc	STATUS,N
-	clrf	lo
-	movf	gaslist_gas,W
-	movff	lo,PLUSW1					; Write back to char_I_deco_gas_change[WREG]
+	movf	gaslist_gas,W				; get setpoint number (0-4)
+	bz		gaslist_spdepthminus2		; setpoint number = 0? YES - force depth to always be 0m
+	lfsr	FSR1,char_I_setpoint_change	; load base address of char_I_setpoint_change
+	movff	PLUSW1,lo					; read setpoint depth into lo
+	decf	lo,F						; decrement switch depth
+	btfsc	STATUS,N					; did depth became negative?
+	clrf	lo							; YES - reset to zero
+	movff	lo,PLUSW1					; write back setpoint depth
 	return
 
+gaslist_spdepthplus2:
+gaslist_spdepthminus2:
+	movlw	.0
+	movff	WREG,char_I_setpoint_change+0	; hard reset to 0m
+	return
+
+
 ;----------------------------------------------------------------------------
-; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 Ratio.
+; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 ratio
 ;
 ; Input:  gaslist_gas                   = current gas index.
 ;         opt_gas_O2_ratio[gaslist_gas] = current O2 ratio
 ; Output: WREG                          = MOD [m]
 ;
 gaslist_calc_mod:
-	movf	gaslist_gas,W				; get gas number (0...5)
-	lfsr	FSR1,opt_gas_O2_ratio		; read opt_gas_O2_ratio[WREG]
-	movf	PLUSW1,W
-
-	btfsc	divemode					; in divemode?
-	bra		gaslist_calc_mod_divemode	; YES
-
-	; Pamb max = ppO2 Max / O2 ratio
-	movwf	xB+0
-
-	movf	gaslist_gas,W				; get gas number (0...5)
-	lfsr	FSR1,opt_gas_type			; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents
-	movff	PLUSW1,xA+0					; xA+0 used as temp here -> holds type
-
-	movff	char_I_ppO2_max_deco,xB+1	; xB+1 used as temp here
-	movlw	.3
-	cpfseq	xA+0						; Deco?
-	movff	char_I_ppO2_max,xB+1		; No, overwrite with travel/bottom max
-	movf	xB+1,W						; Result in WREG
-
-	clrf	xB+1						; Clear for div16x16
-	mullw	.10
-	movff	PRODL,xA+0
+	movf	gaslist_gas,W				; load index (0...9)
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movff	PLUSW1,xB+0					; read O2 ratio into xB+0
+	lfsr	FSR1,opt_gas_type			; load base address of opt_gas_type
+	movff	PLUSW1,xA+0					; read gas/dil type into xA+0 (used as temp here)
+	movff	char_I_ppO2_max_deco,xB+1	; get max ppO2 for deco into xB+1 (used as temp here)
+	movlw	.3							; type code for deco gases
+	cpfseq	xA+0						; is it a deco gas?
+	movff	char_I_ppO2_max,xB+1		; NO - overwrite ppO2 max with none-deco max
+	movf	xB+1,W						; copy resulting ppO2 max into WREG
+	clrf	xB+1						; clear xB+1 for div16x16 operation
+	mullw	.10							; multiply ppO2 max value with 10
+	movff	PRODL,xA+0					; copy result to xA
 	movff	PRODH,xA+1
-	call	div16x16
-
-	; Prof = Pamb - 1 bar
-	movf	xC+0,W
-	addlw	-.10
-	return
-
-gaslist_calc_mod_divemode:
-	movwf	hi							; Copy O2%
-	call	TFT_color_code_gaslist		; Color-code current row in Gaslist (%O2 in hi), char_I_ppO2_max/char_I_ppO2_max_deco as threshold
-	return
+	call	div16x16					; xC = xA / xB with xA as remainder
+	movf	xC+0,W						; copy result to WREG
+	addlw	-.10						; subtract 10 cbar
+	return								; return with final result in WREG
 
 ;----------------------------------------------------------------------------
 
 	global	gaslist_ppo2
 gaslist_ppo2:
 	STRCAT_TEXT tppO2					; ppO2:
-	movf	gaslist_gas,W
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents
-	btfss	ccr_diluent_setup			; In CCR-Menu?
-	lfsr	FSR1,opt_OC_bail_gas_change	; No, setup OC/Bailout Gases
-	movf	PLUSW1,W
-	mullw	.10							; PROD=Depth in mbar/10 (100 = 1.00 bar)
-	movlw	.100
+	lfsr	FSR1,opt_gas_change			; load base address of opt_gas_change
+	movf	gaslist_gas,W				; load index (0-9)
+	movf	PLUSW1,W					; read change depth into WREG
+	mullw	.10							; PROD = depth in mbar/10 (100 = 1.00 bar)
+	movlw	.100						; add 1 bar
 	addwf	PRODL,F
 	movlw	.0
-	addwfc	PRODH,F						; add 1bar
-	movff	PRODL,xA+0
+	addwfc	PRODH,F
+	movff	PRODL,xA+0					; copy result to xA
 	movff	PRODH,xA+1
-	movf	gaslist_gas,W				; Read current gas O2 ratio
-	lfsr	FSR1,opt_dil_O2_ratio-.5	; Read dil_gas_O2_ratio[WREG]
-	btfss	ccr_diluent_setup			; In CCR-Menu?
-	lfsr	FSR1,opt_gas_O2_ratio		; No, read opt_gas_O2_ratio[WREG]
-	movff	PLUSW1,xB+0
-	clrf	xB+1
-	call	mult16x16					; char_I_O2_ratio * (p_amb/10)
-	movff	xC+0,xA+0
+	lfsr	FSR1,opt_gas_O2_ratio		; load base address of opt_gas_O2_ratio
+	movf	gaslist_gas,W				; load index (0-9)
+	movff	PLUSW1,xB+0					; read O2 ratio into xB+0
+	clrf	xB+1						; clear xB+1
+	call	mult16x16					; calculate char_I_O2_ratio * (p_amb/10)
+	movff	xC+0,xA+0					; copy result to xA
 	movff	xC+1,xA+1
-	movlw	d'100'
+	movlw	d'100'						; load 100 to xB
 	movwf	xB+0
 	clrf	xB+1
-	call	div16x16					; xC=(char_I_O2_ratio * p_amb/10)/100
-	; Check very high ppO2 manually
-	tstfsz	xC+2						; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
-	bra		gaslist_ppo2_2				; Yes, display fixed Value!
-	movff	xC+0,lo
+	call	div16x16					; xC = xA / xB = (char_I_O2_ratio * p_amb/10)/100
+	; check for very high ppO2
+	tstfsz	xC+2						; xC+2 remains from mult16x16, xC+2 > 0 (-> ppO2 is > 6.55 bar) ?
+	bra		gaslist_ppo2_1				; YES - display a fixed max value
+	movff	xC+0,lo						; copy result to lo, hi
 	movff	xC+1,hi
 	bcf		ignore_digit4
 	bsf		leftbind
-	output_16dp d'3'					; x.xx
-	STRCAT_TEXT tbar					; bar
+	output_16dp d'3'					; print ppO2 as x.xx
+	STRCAT_TEXT tbar					; print "bar"
 	return
-gaslist_ppo2_2:
+gaslist_ppo2_1:
 	STRCAT	">6.6"
 	return
 
 	global	gaslist_MOD_END
 gaslist_MOD_END:
-	rcall	gaslist_calc_mod			; Compute MOD into WREG
-	movwf	lo							; Copy to lo
-	STRCAT_TEXT tMOD					; MOD:
-	TSTOSS	opt_units					; 0=Meters, 1=Feets
-	bra		gaslist_MOD_metric
-	;gaslist_MOD_imperial:
-	movf	lo,W
-	mullw	.100						; convert meters to mbar
-	movff	PRODL,lo
-	movff	PRODH,hi
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	bsf		leftbind
-	output_16_3							; limit to 999 and display only (0-999)
-	STRCAT_TEXT tFeets					; "ft"
-	bra		gaslist_MOD_common
-gaslist_MOD_metric:
-	output_8
-	STRCAT_TEXT tMeters					; m
-gaslist_MOD_common:
-	PUTC	"/"
-	STRCAT_TEXT tEND					; END:
-	rcall	gaslist_calc_mod			; Output: WREG = MOD [m]
-	addlw	.10							; MOD=MOD+10m
+	STRCAT_TEXT tMOD					; print "MOD:"
+	rcall	gaslist_calc_mod			; compute MOD into WREG
+	movwf	lo							; copy result to lo
+	call	gaslist_strcat_depth		; print depth in meters or feet as configured
+	PUTC	"/"							; print "/"
+	STRCAT_TEXT tEND					; print "END:"
+	rcall	gaslist_calc_mod			; compute MOD into WREG
+	addlw	.10							; compute MOD = MOD + 10m
 	movwf	xB+0
 	clrf	xB+1
 	movlw	d'100'
 	movwf	xA+0
-	movf	gaslist_gas,W				; get gas number (0...5)
-	lfsr	FSR1,opt_gas_He_ratio		; read opt_gas_O2_ratio[WREG]
-	movf	PLUSW1,W					; He value in %
-	subwf	xA+0,F						; xA+0 = 100 - He Value in %
+	lfsr	FSR1,opt_gas_He_ratio		; load base address of opt_gas_He_ratio
+	movf	gaslist_gas,W				; load index (0...9)
+	movf	PLUSW1,W					; read He ration into WREG
+	subwf	xA+0,F						; xA+0 = 100 - He ratio in %
 	clrf	xA+1
 	call	mult16x16					; xA*xB=xC
 	movff	xC+0,xA+0
@@ -666,61 +829,36 @@
 	movlw	d'100'
 	movwf	xB+0
 	clrf	xB+1
-	call	div16x16					; xA/xB=xC with xA as remainder
+	call	div16x16					; xC = xA / xB with xA as remainder
 	;									; xC:2 = ((MOD+10) * 100 - HE Value in %) / 100
-	movlw	d'10'
-	subwf	xC+0,F						; Subtract 10m...
-	movff	xC+0,lo
-	;; END 8Bit only
-	;movlw	d'0'
-	;subwfb	xC+1,F
-	;movff	xC+1,hi
-	TSTOSS	opt_units					; 0=Meter, 1=Feet
-	bra		gaslist_END_metric
-	;gaslist_END_imperial:
-	movf	lo,W
-	mullw	.100						; convert meters to mbar
-	movff	PRODL,lo
-	movff	PRODH,hi
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	bsf		leftbind
-	output_16_3							; limit to 999 and display only (0-999)
-	STRCAT_TEXT tFeets					; "ft"
-	return
-gaslist_END_metric:
-	output_8
-	STRCAT_TEXT tMeters					; m
+	movlw	d'10'						; subtract 10 m
+	subwf	xC+0,F						; ...
+	movff	xC+0,lo						; copy result to lo
+	bra		gaslist_strcat_depth		; print depth in meters or feet as configured and return
+
+
+	global	gaslist_reset_mod_title
+gaslist_reset_mod_title:
+	STRCAT_TEXT tDepthReset
+	rcall	gaslist_calc_mod			; compute MOD into WREG
+	movwf	lo							; copy result to lo
+	lfsr	FSR1,opt_gas_change			; load base address of opt_gas_change
+	movf	gaslist_gas,W				; load index (0-9)
+	movf	PLUSW1,W					; read change depth into WREG
+	cpfslt	lo							; change depth > MOD ?
+	bra		gaslist_strcat_depth		; NO  - return
+	call	TFT_warnings_color			; YES - use red color
+	bra		gaslist_strcat_depth		;     - return
+
+
+	global	gaslist_reset_mod
+gaslist_reset_mod:
+	rcall	gaslist_calc_mod			; compute MOD into WREG
+	movwf	lo							; copy result to lo
+	lfsr	FSR1,opt_gas_change			; load base address of opt_gas_change
+	movf	gaslist_gas,W				; load index (0-9)
+	movff	lo,PLUSW1					; write back new change depth
 	return
 
 ;----------------------------------------------------------------------------
-	global	gaslist_reset_mod_title
-gaslist_reset_mod_title:
-	STRCAT_TEXT tDepthReset
-
-gaslist_reset_mod_title2:
-	rcall	gaslist_calc_mod			; Compute MOD into WREG
-	movwf	lo							; Copy to lo
-
-	movf	gaslist_gas,W				; Compare to switch depth
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents
-	btfss	ccr_diluent_setup			; In CCR-Menu?
-	lfsr	FSR1,opt_OC_bail_gas_change	; No, setup OC Gases
-	movf	PLUSW1,W
-	cpfslt	lo
-	bra		gaslist_strcat_5			; and return...
-	call	TFT_warnings_color			; turn red if bigger !
-	bra		gaslist_strcat_5			; and return...
-
-;----------------------------------------------------------------------------
-	global	gaslist_reset_mod
-gaslist_reset_mod:
-	rcall	gaslist_calc_mod			; Compute MOD, it is returned in WREG
-	movwf	lo							; buffer MOD to lo
-	movf	gaslist_gas,W				; Read current gas O2 ratio
-	lfsr	FSR1,char_I_dil_change-.5	; Setup Diluents
-	btfss	ccr_diluent_setup			; In CCR-Menu?
-	lfsr	FSR1,opt_OC_bail_gas_change	; NO - setup OC Gases
-	movff	lo,PLUSW1					; write back new change depth
-	return
-;----------------------------------------------------------------------------
 	END
--- a/src/gaslist.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/gaslist.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File gaslist.inc
+;   File gaslist.inc													V2.99c
 ;
 ;   Interface to OSTC gas list management.
 ;
@@ -11,30 +11,49 @@
 
 	; Utils
 	extern	gaslist_strcat_gas
-	extern	gaslist_strcat_gas_mod
+	extern	gaslist_strcat_gas_WREG
+	extern	gaslist_strcat_gas_cd
 	extern	gaslist_strcat_setpoint
 
-	;Setpoint Setup
+	extern	do_toggle_gf_label
+	extern	do_toggle_max_pres_diff_label
+	extern	gaslist_copy_dil_to_oc
+
+	; Setpoint Setup
 	extern	gaslist_spplus
 	extern	gaslist_spdepthplus
 	extern	gaslist_spdepthminus
-	extern	gaslist_setSP
 
-	; Select currently edited gas
-	extern	gaslist_setgas
+	; Select currently edited Gas
 	extern	gaslist_gastitle
 
-	; Main gaslist menu
-	extern	gaslist_pO2, gaslist_mO2
-	extern	gaslist_pHe, gaslist_mHe
+	; Main Gaslist Menu
+	extern	gaslist_pO2
+	extern	gaslist_mO2
+	extern	gaslist_pHe
+	extern	gaslist_mHe
+	extern	gaslist_GasDepth
 	extern	gaslist_show_type
 	extern	gaslist_toggle_type
-	extern	gaslist_cleanup_list		; Takes care that only one gas can be first and first has 0m change depth
+	extern	gaslist_cleanup_list
 
-	; Depth submennu
+	; Depth Sub-Menu
 	extern	gaslist_pDepth
 	extern	gaslist_mDepth
 	extern	gaslist_MOD_END
 	extern	gaslist_ppo2
 	extern	gaslist_reset_mod_title
 	extern	gaslist_reset_mod
+
+	; Tank Sub-Menu
+	extern	gaslist_tank_size_pres
+	extern	gaslist_tank_size
+	extern	gaslist_tank_pres
+ IFDEF _rx_functions
+	extern	gaslist_tank_id_pres
+	extern	gaslist_tank_pairing
+ ENDIF
+
+ IFDEF _cave_mode
+	extern	do_turn_dive_label
+ ENDIF
\ No newline at end of file
--- a/src/ghostwriter.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/ghostwriter.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File ghostwriter.asm							REFACTORED VERSION 2.98
+;   File ghostwriter.asm							REFACTORED VERSION V2.99a
 ;
 ;   Ghostwriter (Log profile recorder)
 ;
@@ -20,10 +20,12 @@
 #include "divemode.inc"
 #include "rtc.inc"
 
+	extern	deco_pull_tissues_from_vault
+
 
 	;---- Private local variables -------------------------------------------------
 
-	CBLOCK	local2						; max size is 16 Byte !!!
+	CBLOCK	local3						; max size is 16 Byte !!!
 		divisor_temperature				; divisor used to time the sampling of dive data
 		divisor_deco					; divisor used to time the sampling of dive data
 		divisor_gf						; divisor used to time the sampling of dive data
@@ -40,7 +42,7 @@
 ;=============================================================================
 
 
-	global	init_recording_params		; Initialize profile recording parameters
+	global	init_recording_params		; initialize profile recording parameters
 init_recording_params:
 	movff	samplingrate,samplesecs_value; to avoid EEPROM access in the ISR
 	movlw	div_temperature
@@ -57,7 +59,7 @@
 	movwf	divisor_cns
 	movlw	div_tank
 	movwf	divisor_tank
-	btfss	FLAG_apnoe_mode				; In Apnoe mode?
+	btfss	FLAG_apnoe_mode				; in Apnoe mode?
 	bra		init_recording_params_1		; NO
 	movlw	samplingrate_apnoe			; YES - overwrite some parameters in Apnoe mode
 	movwf	samplesecs_value			;       to avoid EEPROM access in the ISR
@@ -66,7 +68,7 @@
 	bra		init_recording_params_2		; YES
 	btfsc	FLAG_pscr_mode				; in pSCR mode?
 	bra		init_recording_params_2		; YES
-	; in OC Mode, disable ppO2 logging
+	; in all modes but CCR and pSCR, disable ppO2 logging
 	movlw	.0
 	movwf	divisor_ppo2_sensors
 init_recording_params_2:
@@ -78,97 +80,97 @@
 	bcf		store_sample				; clear flag
 
 	ifndef __DEBUG
-		btfsc	simulatormode_active	; Are we in simulator mode?
-		return							; Yes, discard everything
+		btfsc	simulatormode_active	; are we in simulator mode?
+		return							; YES - discard everything
 	endif
 
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	return								; Yes, discard everything
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	return								; YES - discard everything
 
 	SAFE_2BYTE_COPY rel_pressure, lo
 	movf	lo,W						; store depth with every sample
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 	movf	hi,W
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 
-; First, find out how many bytes will append to this sample....
+; First, find out how many bytes will be appended to this sample set
 	clrf	ProfileFlagByte				; clear number of bytes to append
 
 ; Check Extended informations
-	decfsz	divisor_temperature,W		; Check divisor
+	decfsz	divisor_temperature,W		; check divisor
 	bra		check_extended1
 	movlw	infolength_temperature
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended1:
-	decfsz	divisor_deco,W				; Check divisor
+	decfsz	divisor_deco,W				; check divisor
 	bra		check_extended2
 	movlw	infolength_deco
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended2:
-	decfsz	divisor_gf,W				; Check divisor
+	decfsz	divisor_gf,W				; check divisor
 	bra		check_extended3
 	movlw	infolength_gf
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended3:
-	decfsz	divisor_ppo2_sensors,W		; Check divisor
+	decfsz	divisor_ppo2_sensors,W		; check divisor
 	bra		check_extended4
 	movlw	infolength_ppo2_sensors
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended4:
-	decfsz	divisor_decoplan,W			; Check divisor
+	decfsz	divisor_decoplan,W			; check divisor
 	bra		check_extended5
 	movlw	infolength_decoplan
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended5:
-	decfsz	divisor_cns,W				; Check divisor
+	decfsz	divisor_cns,W				; check divisor
 	bra		check_extended6
 	movlw	infolength_cns
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended6:
-	decfsz	divisor_tank,W				; Check divisor
+	decfsz	divisor_tank,W				; check divisor
 	bra		check_extended7
 	movlw	infolength_tank
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 check_extended7:
 
 ; Second, check global event flag
-	btfss	event_occured				; Check global event flag
-	bra		store_dive_data3			; No Event
+	btfss	event_occured				; check global event flag
+	bra		store_dive_data3			; no event
 
-	incf	ProfileFlagByte,F			; add one byte (The EventByte1)
+	incf	ProfileFlagByte,F			; add one byte (the EventByte1)
 
 	clrf	EventByte1					; reset EventByte1
 	clrf	EventByte2					; reset EventByte2
 
-	movf	AlarmType,W					; Type of Alarm Bit 0-3
-	addwf	EventByte1,F				; Copy to EventByte1 Bit 0-3
-	clrf	AlarmType					; Reset AlarmType
+	movf	AlarmType,W					; type of Alarm Bit 0-3
+	addwf	EventByte1,F				; copy to EventByte1 Bit 0-3
+	clrf	AlarmType					; reset AlarmType
 
 ; Third, check events and add additional bytes
-	btfss	gas6_changed				; Check flag
+	btfss	gas6_changed				; check flag
 	bra		check_event2
-	movlw	d'2'						; Information length
+	movlw	d'2'						; information length
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
-	bsf		EventByte1,4				; Also set Flag in EventByte1!
+	bsf		EventByte1,4				; also set Flag in EventByte1!
 check_event2:
-	btfss	stored_gas_changed			; Check flag
+	btfss	stored_gas_changed			; check flag
 	bra		check_event3
-	movlw	d'1'						; Information length
+	movlw	d'1'						; information length
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
-	bsf		EventByte1,5				; Also set Flag in EventByte1!
+	bsf		EventByte1,5				; also set Flag in EventByte1!
 check_event3:
-	btfss	setpoint_changed			; Check flag
+	btfss	setpoint_changed			; check flag
 	bra		check_event4
-	movlw	d'1'						; Information length
+	movlw	d'1'						; information length
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
-	bsf		EventByte1,6				; Also set Flag in EventByte1!
+	bsf		EventByte1,6				; also set Flag in EventByte1!
 check_event4:
 	btfss	bailoutgas_event			; =1: bailout was selected or a gas change during bailout
 	bra		check_event5
-	movlw	d'2'						; Information length
+	movlw	d'2'						; information length
 	addwf	ProfileFlagByte,F			; add to ProfileFlagByte
 	bsf		EventByte2,0				; set flag in EventByte2!
-	bsf		EventByte1,7				; =1: Another EventByte1 is available
+	bsf		EventByte1,7				; =1: another EventByte1 is available
 
 check_event5:
 	; more events?
@@ -177,85 +179,89 @@
 	btfsc	EventByte1,7				; =1: Another EventByte1 is available
 	incf	ProfileFlagByte,F			; add one byte (The EventByte2)
 
-	btfsc	event_occured				; Check global event flag
-	bsf		ProfileFlagByte,7			; Set EventByte1 Flag in ProfileFlagByte
+	btfsc	event_occured				; check global event flag
+	bsf		ProfileFlagByte,7			; set EventByte1 flag in ProfileFlagByte
 
-	movf	ProfileFlagByte,W			; finally, write ProfileFlagByte!
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	ProfileFlagByte,W			; finally, write ProfileFlagByte
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 
-	btfss	event_occured				; Check global event flag (again)
-	bra		store_dive_data4			; No Event
+	btfss	event_occured				; check global event flag (again)
+	bra		store_dive_data4			; no event
 
 ; Store the EventByte(s) + additional bytes now
 	movf	EventByte1,W
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 
-	movf	EventByte2,W				; Write second event byte...
-	btfsc	EventByte1,7				; =1: Another EventByte1 is available
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	EventByte2,W				; write second event byte...
+	btfsc	EventByte1,7				; =1: another EventByte1 is available
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 
-	btfss	gas6_changed				; Check flag
+	btfss	gas6_changed				; check flag
 	bra		store_dive_data3b
 	movff	char_I_O2_ratio,WREG		; store gas 6 o2 ratio
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 	movff	char_I_He_ratio,WREG		; store gas 6 He ratio
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	bcf		gas6_changed				; Clear this event
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
+	bcf		gas6_changed				; clear this event
 store_dive_data3b:
-	btfss	stored_gas_changed			; Check flag
+	btfss	stored_gas_changed			; check flag
 	bra		store_dive_data3c
-	movf	active_gas,W				; Store active gas
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	bcf		stored_gas_changed			; Clear this event
+	movf	active_dil,W				; store active diluent (default, may be overwritten soon)
+	btfsc	FLAG_oc_mode				; in OC mode?
+	movf	active_gas,W				; YES - store active gas
+	btfsc	FLAG_bailout_mode			; in bailout?
+	movf	active_gas,W				; YES - store active OC = bailout gas
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
+	bcf		stored_gas_changed			; clear this event
 store_dive_data3c:
-	btfss	setpoint_changed			; Check flag
+	btfss	setpoint_changed			; check flag
 	bra		store_dive_data3d
 	movff	char_I_const_ppO2,WREG		; store setpoint
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	bcf		setpoint_changed			; Clear this event
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
+	bcf		setpoint_changed			; clear this event
 store_dive_data3d:
-	btfss	bailoutgas_event			; Check flag
+	btfss	bailoutgas_event			; check flag
 	bra		store_dive_data4
 	movff	char_I_O2_ratio,WREG		; store O2 ratio of bailout gas
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 	movff	char_I_He_ratio,WREG		; store He ratio of bailout gas
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	bcf		bailoutgas_event			; Clear this event
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
+	bcf		bailoutgas_event			; clear this event
 
 store_dive_data4:
-; Store extended informations
-	decfsz	divisor_temperature,F		; Check divisor
+; Store extended information
+	decfsz	divisor_temperature,F		; check divisor
 	bra		store_extended1	
 	rcall	store_dive_temperature
 store_extended1:
-	decfsz	divisor_deco,F				; Check divisor
+	decfsz	divisor_deco,F				; check divisor
 	bra		store_extended2	
 	rcall	store_dive_decodata
 store_extended2:
-	decfsz	divisor_gf,F				; Check divisor
+	decfsz	divisor_gf,F				; check divisor
 	bra		store_extended3
 	rcall	store_dive_gf
 store_extended3:
-	decfsz	divisor_ppo2_sensors,F		; Check divisor
+	decfsz	divisor_ppo2_sensors,F		; check divisor
 	bra		store_extended4
 	rcall	store_dive_ppO2_sensors
 store_extended4:
-	decfsz	divisor_decoplan,F			; Check divisor
+	decfsz	divisor_decoplan,F			; check divisor
 	bra		store_extended5
 	rcall	store_dive_decoplan
 store_extended5:
-	decfsz	divisor_cns,F				; Check divisor
+	decfsz	divisor_cns,F				; check divisor
 	bra		store_extended6
 	rcall	store_dive_cns
 store_extended6:
-	decfsz	divisor_tank,F				; Check divisor
+	decfsz	divisor_tank,F				; check divisor
 	bra		store_extended7
 	rcall	store_dive_tank
 store_extended7:
 
 ; The next block is required to take care of "store never"
-	btfsc	divisor_temperature,7		; Test highest Bit (Register must have been zero before the "decfsz" command!)
-	clrf	divisor_temperature			; And clear register again, so it will never reach zero...
+	btfsc	divisor_temperature,7		; test highest bit (register must have been zero before the "decfsz" command!)
+	clrf	divisor_temperature			; and clear register again, so it will never reach zero...
 	btfsc	divisor_deco,7
 	clrf	divisor_deco
 	btfsc	divisor_gf,7
@@ -270,25 +276,26 @@
 	clrf	divisor_tank
 
 store_dive_data5:
-	bcf		event_occured				; Clear the global event flag
+	bcf		event_occured				; clear the global event flag
 	clrf	EventByte1					; reset EventByte1
 	clrf	EventByte2					; reset EventByte2
-	return								; Done. (Sample with all informations written to external flash)
+	return								; done (sample with all informations written to external flash)
 
 store_dive_cns:
 	movff	int_O_CNS_fraction+0,WREG
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 	movff	int_O_CNS_fraction+1,WREG
-	bcf	WREG,int_warning_flag			 ; clear warning   flag
-	bcf	WREG,int_attention_flag			 ; clear attention flag
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	bcf		WREG,int_warning_flag		; clear warning   flag
+	bcf		WREG,int_attention_flag		; clear attention flag
+	rcall	ghostwrite_byte_profile		; WREG -> profile in ext. flash
 	movlw	div_cns
-	movwf	divisor_cns					; Reload divisor from CF
+	movwf	divisor_cns					; reload divisor from CF
 	return
 
 store_dive_tank:
+	; OSTC TR tank pressure logging
 	movlw	div_tank
-	movwf	divisor_tank				; Reload divisor from CF
+	movwf	divisor_tank				; reload divisor from CF
 	return
 
 store_dive_decoplan:
@@ -298,143 +305,143 @@
 	movwf	lo
 store_dive_decoplan_loop:
 	movf	POSTINC1,W
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	decfsz	lo,F
 	bra		store_dive_decoplan_loop
 	movlw	div_decoplan
-	movwf	divisor_decoplan			; Reload divisor from CF
+	movwf	divisor_decoplan				; reload divisor from CF
 	return
 
 store_dive_ppO2_sensors:
-	movf	o2_ppo2_sensor1,W			; Sensor1 ppO2 (in 0.01bar steps)
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	SAFE_2BYTE_COPY o2_mv_sensor1,lo	; o2_mv_sensor may be modified via ISR during the two writes here...
-	movf	lo,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	movf	hi,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	o2_ppo2_sensor1,W				; Sensor1 ppO2 (in 0.01 bar steps)
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	SAFE_2BYTE_COPY o2_mv_sensor1,lo		; o2_mv_sensor may be modified via ISR during the two writes here...
+	movf	lo,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movf	hi,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movf	o2_ppo2_sensor2,W			; Sensor2 ppO2 (in 0.01bar steps)
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	SAFE_2BYTE_COPY o2_mv_sensor2,lo	; o2_mv_sensor may be modified via ISR during the two writes here...
-	movf	lo,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	movf	hi,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	o2_ppo2_sensor2,W				; Sensor2 ppO2 (in 0.01 bar steps)
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	SAFE_2BYTE_COPY o2_mv_sensor2,lo		; o2_mv_sensor may be modified via ISR during the two writes here...
+	movf	lo,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movf	hi,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movf	o2_ppo2_sensor3,W			; Sensor3 ppO2 (in 0.01bar steps)
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	SAFE_2BYTE_COPY o2_mv_sensor3,lo	; o2_mv_sensor may be modified via ISR during the two writes here...
-	movf	lo,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	movf	hi,W						; in 0.1mV steps
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	o2_ppo2_sensor3,W				; Sensor3 ppO2 (in 0.01 bar steps)
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	SAFE_2BYTE_COPY o2_mv_sensor3,lo		; o2_mv_sensor may be modified via ISR during the two writes here...
+	movf	lo,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movf	hi,W							; in 0.1 mV steps
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
 	movlw	div_ppo2_sensors
-	movwf	divisor_ppo2_sensors		; Reload divisor
+	movwf	divisor_ppo2_sensors			; reload divisor
 	return
 
 store_dive_gf:
-	movff	int_O_gradient_factor+0,WREG; gradient factor absolute (range is limited to 255, only lower byte used for value)
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movff	int_O_gradient_factor+0,WREG	; gradient factor absolute (range is limited to 255, only lower byte used for value)
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	div_gf
-	movwf	divisor_gf					; Reload divisor
+	movwf	divisor_gf						; reload divisor
 	return
 
 store_dive_decodata:
 	; Check if deco stops are necessary
-	movff	char_O_first_deco_depth,WREG; get ceiling
-	tstfsz	WREG						; ceiling < 0m (aka in deco) ?
-	bra		store_dive_decodata_deco	; YES
+	movff	char_O_first_deco_depth,WREG	; get ceiling
+	tstfsz	WREG							; ceiling < 0 m (aka in deco) ?
+	bra		store_dive_decodata_deco		; YES
 	; NO - within NDL
-	clrf	WREG						; =0: no stop dive
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	movff	char_O_nullzeit,WREG		; remaining NDL time
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	clrf	WREG							; =0: no stop dive
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movff	char_O_nullzeit,WREG			; remaining NDL time
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	bra		store_dive_decodata_common
 store_dive_decodata_deco:
 	; YES - in deco
-	movff	char_O_first_deco_depth,WREG; ceiling in m
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
-	movff	char_O_first_deco_time,WREG	; length of first stop in minutes
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movff	char_O_first_deco_depth,WREG	; ceiling in m
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movff	char_O_first_deco_time,WREG		; length of first stop in minutes
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 store_dive_decodata_common:
 	movlw	div_deco
-	movwf	divisor_deco				; Reload divisor
+	movwf	divisor_deco					; Reload divisor
 	return
 
 store_dive_temperature:
 	SAFE_2BYTE_COPY temperature,lo
-	movf	lo,W						; append temperature to current sample!
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	movf	lo,W							; append temperature to current sample!
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movf	hi,W
-	rcall	ghostwrite_byte_profile		; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	div_temperature
-	movwf	divisor_temperature			; Reload divisor
+	movwf	divisor_temperature				; reload divisor
 	return
 
 ghostwrite_byte_header:
-	goto	write_byte_ext_flash_plus_header ; (This call will also delete the 4kB TOC entry first)
+	goto	write_byte_ext_flash_plus_header ; (this call will also delete the 4kB TOC entry first)
 	; returns...
 
 ghostwrite_byte_profile:
-	goto	write_byte_ext_flash_plus	; writes byte and increases address with banking at 0x200000
+	goto	write_byte_ext_flash_plus		; writes byte and increases address with banking at 0x200000
 	; returns...
 
 	global	ghostwriter_end_dive
 ghostwriter_end_dive:
 	movff	ext_flash_address+0,ext_flash_log_pointer+0
 	movff	ext_flash_address+1,ext_flash_log_pointer+1
-	movff	ext_flash_address+2,ext_flash_log_pointer+2	; Save end-of-profile pointer to store in header
+	movff	ext_flash_address+2,ext_flash_log_pointer+2	; save end-of-profile pointer to store in header
 
-	movff	menupos3,customview_divemode ; store last custom view
+	movff	menupos3,customview_divemode	; store last custom view
 
-	btfss	realdive					; dive longer then one minute
-	goto	ghostwriter_end_dive_common	; No, discard everything
+	btfss	realdive						; dive longer then one minute
+	goto	ghostwriter_end_dive_common		; NO - discard everything
 
 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc...
-	ifndef __DEBUG
-		btfsc	simulatormode_active			; Are we in simulator mode?
-		goto	ghostwriter_end_dive_common_sim	; Yes, discard everything
-	endif
+  ifndef __DEBUG
+	btfsc	simulatormode_active			; are we in simulator mode?
+	goto	ghostwriter_end_dive_common_sim	; YES - discard everything
+  endif
 
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	goto	ghostwriter_end_dive_common	; Yes, discard everything
+	btfsc	FLAG_apnoe_mode					; in Apnoe mode?
+	goto	ghostwriter_end_dive_common		; YES - discard everything
 
-	; Dive finished (and longer then one minute)
+	; Dive finished (and longer than one minute)
 
-	btfsc	FLAG_apnoe_mode				; Calc max. depth (again) for very short apnoe dives
+	btfsc	FLAG_apnoe_mode					; calc max. depth (again) for very short apnoe dives
 	call	apnoe_calc_maxdepth
 
 	; calculate desaturation time
-	movff	last_surfpressure_30min+0,int_I_pres_surface+0	; Pass surface to desat routine !
+	movff	last_surfpressure_30min+0,int_I_pres_surface+0	; pass surface to desat routine !
 	movff	last_surfpressure_30min+1,int_I_pres_surface+1
 
 	call	deco_calc_dive_interval_1min	; calculate deco in surface mode
 	call	deco_calc_desaturation_time		; calculate desaturation time
 	banksel	common							; select ram bank 1
 
-	movlw	0xFD							; .... End-of-Profile Bytes
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. Flash
+	movlw	0xFD							; .... End-of-Profile bytes
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	0xFD
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. Flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movff	ext_flash_address+0,ext_flash_log_pointer+0
 	movff	ext_flash_address+1,ext_flash_log_pointer+1
-	movff	ext_flash_address+2,ext_flash_log_pointer+2	; Save end-of-profile pointer to store in header
+	movff	ext_flash_address+2,ext_flash_log_pointer+2	; save end-of-profile pointer to store in header
 
 	; Set to first address again to store dive length ext_flash_dive_counter:3
-	rcall	ghostwriter_load_pointer		; Load ext_flash_address:3 from EEPROM .4-.6
+	rcall	ghostwriter_load_pointer		; load ext_flash_address:3 from EEPROM .4-.6
 
-	incf_ext_flash_address_0x20	d'6'		; Skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header
+	incf_ext_flash_address_0x20 d'6'		; skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header
 	; Store dive length
 	movf	ext_flash_dive_counter+0,W
-	call	write_byte_ext_flash_plus_nodel	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
+	call	write_byte_ext_flash_plus_nodel	; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
 	movf	ext_flash_dive_counter+1,W
-	call	write_byte_ext_flash_plus_nodel	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
+	call	write_byte_ext_flash_plus_nodel	; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
 	movf	ext_flash_dive_counter+2,W
-	call	write_byte_ext_flash_plus_nodel	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
+	call	write_byte_ext_flash_plus_nodel	; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase) and does NOT delete 4kB page
 
-; profile recording done.
+; profile recording done
 
 	; Load total number of dives
 	read_int_eeprom .2
@@ -471,66 +478,67 @@
 
 ; Now, write header
 
-	movlw	0xFA							; Header start
-	rcall	ghostwrite_byte_header			; (This call will also delete the 4kB TOC entry first)
+	movlw	0xFA							; header start
+	rcall	ghostwrite_byte_header			; (this call will also delete the 4kB TOC entry first)
 	movlw	0xFA
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; store pointer to begin of dive profile
 	read_int_eeprom .4
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	read_int_eeprom .5
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	read_int_eeprom .6
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; store pointer to end of dive profile
 	movf	ext_flash_log_pointer+0,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	ext_flash_log_pointer+1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	ext_flash_log_pointer+2,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; write rest of header
-	movlw	logbook_profile_version			; Defined in hwos.inc
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movlw	logbook_profile_version			; defined in hwos.inc
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Store dive length
 	movf	ext_flash_dive_counter+0,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	ext_flash_dive_counter+1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	ext_flash_dive_counter+2,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
-	movff	start_year,WREG					; Date
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	start_month,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	start_day,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	start_hours,WREG				; Start of dive time
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	start_mins,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	lfsr	FSR0,start_year					; load base address of start-of-dive data
+	movf	POSTINC0,W						; year
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; month
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; day
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; hour
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; minute
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
-	btfss	FLAG_apnoe_mode					; Store apnoe max or normal max (Which is only max from the last descent)
-	bra		end_dive1						; Store normal depth
+	btfss	FLAG_apnoe_mode					; store apnoe max or normal max (which is only max from the last descent)
+	bra		end_dive1						; store normal depth
 
 	movff	apnoe_max_pressure+0,lo
 	movff	apnoe_max_pressure+1,hi
 	call	adjust_depth_with_salinity		; computes salinity setting into lo:hi [mbar]
 	movff	lo,apnoe_max_pressure+0
 	movff	hi,apnoe_max_pressure+1
-	
-	movf	apnoe_max_pressure+0,W			; Max. depth
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movf	apnoe_max_pressure+1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+
+	movf	lo,W							; max. depth, low   byte
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	hi,W							; max. depth, high byte
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	bra		end_dive2						; skip normal max. depth
 
 end_dive1:
@@ -540,133 +548,81 @@
 	movff	lo,max_pressure+0
 	movff	hi,max_pressure+1
 
-	movff	max_pressure+0,WREG				; Max. depth
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	max_pressure+1,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movf	lo,W							; max. depth, low  byte
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	hi,W							; max. depth, high byte
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 end_dive2:
 	movf	divemins+0,W					; dive time minutes
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	divemins+1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	divesecs,W						; dive time seconds
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	minimum_temperature+0,WREG		; minimum temperature
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	minimum_temperature+1,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	last_surfpressure_30min+0,WREG	; air pressure before dive
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	last_surfpressure_30min+1,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	int_O_desaturation_time+0,WREG	; desaturation time in minutes
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	int_O_desaturation_time+1,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
-	btfss	FLAG_ccr_mode					; In CCR mode...
-	bra		end_dive_oc_gaslist				; No, write OC gases
-	; Write Diluents...
-	movff	opt_dil_O2_ratio+0,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_dil_He_ratio+0,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	char_I_dil_change+0,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_dil_type+0,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2=Normal
+	btfsc	FLAG_ccr_mode					; in CCR mode?
+	bra		end_dive_dil_gaslist			; YES - write diluent gas list
+	btfsc	FLAG_pscr_mode					; in pSCR mode?
+	bra		end_dive_dil_gaslist			; YES - write diluent gas list
 
-	movff	opt_dil_O2_ratio+1,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_dil_He_ratio+1,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	char_I_dil_change+1,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_dil_type+1,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2=Normal
+end_dive_oc_gaslist:						; write OC gases
+	lfsr	FSR0,opt_gas_O2_ratio-.1		; set base address to (opt_gas_O2_ratio - 1) because of pre-increment statement
+	bra		end_dive_gaslist				; write all 5 OC gases
 
-	movff	opt_dil_O2_ratio+2,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_dil_He_ratio+2,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	char_I_dil_change+2,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_dil_type+2,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2=Normal
-
-	movff	opt_dil_O2_ratio+3,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_dil_He_ratio+3,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	char_I_dil_change+3,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_dil_type+3,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2=Normal
+end_dive_dil_gaslist:						; write diluents
+	lfsr	FSR0,opt_dil_O2_ratio-.1		; set base address to (opt_dil_O2_ratio - 1) because of pre-increment statement
+	;bra	end_dive_gaslist				; write all 5 diluents
 
-	movff	opt_dil_O2_ratio+4,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_dil_He_ratio+4,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	char_I_dil_change+4,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_dil_type+4,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2=Normal
-	bra		end_dive_oc_cc_common
-
-end_dive_oc_gaslist:						; OC Gases...
-	movff	opt_gas_O2_ratio+0,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_gas_He_ratio+0,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	opt_OC_bail_gas_change+0,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_gas_type+0,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2= Travel, 3= Deco
-
-	movff	opt_gas_O2_ratio+1,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_gas_He_ratio+1,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	opt_OC_bail_gas_change+1,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_gas_type+1,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2= Travel, 3= Deco
-
-	movff	opt_gas_O2_ratio+2,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_gas_He_ratio+2,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	opt_OC_bail_gas_change+2,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_gas_type+2,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2= Travel, 3= Deco
-
-	movff	opt_gas_O2_ratio+3,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_gas_He_ratio+3,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	opt_OC_bail_gas_change+3,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_gas_type+3,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2= Travel, 3= Deco
-
-	movff	opt_gas_O2_ratio+4,WREG
-	rcall	ghostwrite_byte_header			; %O2
-	movff	opt_gas_He_ratio+4,WREG
-	rcall	ghostwrite_byte_header			; %He
-	movff	opt_OC_bail_gas_change+4,WREG
-	rcall	ghostwrite_byte_header			; Configured change depth in m
-	movff	opt_gas_type+4,WREG
-	rcall	ghostwrite_byte_header			; 0=Disabled, 1=First, 2= Travel, 3= Deco
-;	bra	 end_dive_oc_cc_common
+end_dive_gaslist:							; helper function for writing gas list entries
+;
+;   Memory Map:
+;   -------------------------
+;   opt_gas_O2_ratio	res 5
+;   opt_dil_O2_ratio	res 5
+;   opt_gas_He_ratio	res 5
+;   opt_dil_He_ratio	res 5
+;   opt_gas_type		res 5
+;   opt_dil_type		res 5
+;   opt_gas_change		res 5
+;   opt_dil_change		res 5
+;
+	movlw	.5								; 5 gases to store
+	movwf	lo								; use lo as counter
+end_dive_gaslist_loop:
+	movf	PREINC0,W						; increment base address and get O2 ratio into WREG
+	rcall	ghostwrite_byte_header			; store data
+	movlw	.10								; offset for H2 ratios
+	movf	PLUSW0,W						; get H2 ratio into WREG
+	rcall	ghostwrite_byte_header			; store data
+	movlw	.30								; offset for change depths
+	movf	PLUSW0,W						; get change depth into WREG
+	rcall	ghostwrite_byte_header			; store data
+	movlw	.20								; offset for types
+	movf	PLUSW0,W						; get type into WREG
+	rcall	ghostwrite_byte_header			; store data
+	decfsz	lo								; decrement counter, did it became 0 ?
+	bra		end_dive_gaslist_loop			; NO  - loop
+	;bra	end_dive_oc_cc_common			; YES - done
 
 end_dive_oc_cc_common:
-	movlw	softwareversion_x				; Firmware version
+	movlw	softwareversion_x				; firmware version
 	rcall	ghostwrite_byte_header
 	movlw	softwareversion_y
 	rcall	ghostwrite_byte_header
-	movf	batt_voltage+0,W				; Battery voltage 
+	movf	batt_voltage+0,W				; battery voltage
 	rcall	ghostwrite_byte_header
 	movf	batt_voltage+1,W
 	rcall	ghostwrite_byte_header
@@ -674,92 +630,85 @@
 	movf	samplingrate,W					; Sampling rate
 	btfsc	FLAG_apnoe_mode					; Apnoe mode?
 	movlw	samplingrate_apnoe				; Apnoe sampling rate
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; CNS at beginning of dive
 	movff	CNS_start+0,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	CNS_start+1,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	; Gradient factor
 	movff	GF_start,WREG
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	int_O_gradient_factor+0,WREG	; value limited to 255, only lower byte in use
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Logbook offset
 	call	do_logoffset_common_read		; Read into lo:hi
 	movf	lo,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movf	hi,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Battery info at Byte 59
 	movf	batt_percent,W					; 0-100
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	; Store 5 Setpoints
-	movff	char_I_setpoint_cbar+0,WREG
-	rcall	ghostwrite_byte_header			; Setpoint in cbar
-	movff	char_I_setpoint_change+0,WREG
-	rcall	ghostwrite_byte_header			; Change depth
-	movff	char_I_setpoint_cbar+1,WREG
-	rcall	ghostwrite_byte_header			; Setpoint in cbar
-	movff	char_I_setpoint_change+1,WREG
-	rcall	ghostwrite_byte_header			; Change depth
-	movff	char_I_setpoint_cbar+2,WREG
-	rcall	ghostwrite_byte_header			; Setpoint in cbar
-	movff	char_I_setpoint_change+2,WREG
-	rcall	ghostwrite_byte_header			; Change depth
-	movff	char_I_setpoint_cbar+3,WREG
-	rcall	ghostwrite_byte_header			; Setpoint in cbar
-	movff	char_I_setpoint_change+3,WREG
-	rcall	ghostwrite_byte_header			; Change depth
-	movff	char_I_setpoint_cbar+4,WREG
-	rcall	ghostwrite_byte_header			; Setpoint in cbar
-	movff	char_I_setpoint_change+4,WREG
-	rcall	ghostwrite_byte_header			; Change depth
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+
+	; Store the setpoints
+	lfsr	FSR0,char_I_setpoint_cbar		; base address of ppO2 values
+	lfsr	FSR1,char_I_setpoint_change		; base address of change depths
+	movlw	.5								; 5 setpoints to store
+	movwf	lo								; use lo as counter
+end_dive_sp_loop:
+	movf	POSTINC0,W						; get   ppO2 value
+	rcall	ghostwrite_byte_header			; store ppO2 value
+	movf	POSTINC1,W						; get   change depth
+	rcall	ghostwrite_byte_header			; store change depth
+	decfsz	lo								; decrement counter, did it became 0 ?
+	bra		end_dive_sp_loop				; NO  - loop
 
-	movff	opt_salinity,WREG				; Salinity (0-4%)
-	rcall	ghostwrite_byte_header			; Store Salinity to Dive
-
-	movff	int_O_CNS_fraction+0,WREG		; copy into bank1
-	rcall	ghostwrite_byte_header			; Stores CNS%
-	movff	int_O_CNS_fraction+1,WREG		; copy into bank1
-	bcf	WREG,int_warning_flag			 ; clear warning   flag
-	bcf	WREG,int_attention_flag			 ; clear attention flag
-	rcall	ghostwrite_byte_header			; Stores CNS%
+	; Store further data
+	movff	opt_salinity,WREG				; salinity (0-4%)
+	rcall	ghostwrite_byte_header			; store salinity
 
-	movff	avg_rel_pressure_total+0,WREG	; Average Depth
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	avg_rel_pressure_total+1,WREG	; Average Depth
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movff	int_O_CNS_fraction+0,WREG		; CNS value, low  byte
+	rcall	ghostwrite_byte_header			; store CNS%
+	movff	int_O_CNS_fraction+1,WREG		; CNS value, high byte
+	bcf		WREG,int_warning_flag			; clear warning   flag
+	bcf		WREG,int_attention_flag			; clear attention flag
+	rcall	ghostwrite_byte_header			; store CNS%
 
-	movff	total_divetime_seconds+0,WREG	; Total dive time (Regardless of start_dive_threshold)
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	total_divetime_seconds+1,WREG	; Total dive time (Regardless of start_dive_threshold)
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movff	avg_rel_pressure_total+0,WREG	; average depth
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movff	avg_rel_pressure_total+1,WREG	; average depth
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+
+	movff	total_divetime_seconds+0,WREG	; total dive time (regardless of start_dive_threshold)
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movff	total_divetime_seconds+1,WREG	; total dive time (regardless of start_dive_threshold)
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	movff	char_I_GF_Low_percentage,WREG	; GF_lo
 	movff	char_I_deco_model,lo
 	decfsz	lo,F							; jump over next line if char_I_deco_model == 1
-	movff	char_I_saturation_multiplier,WREG ; Saturation Multiplier
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movff	char_I_saturation_multiplier,WREG ; saturation multiplier
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	movff	char_I_GF_High_percentage,WREG	; GF_hi
 	movff	char_I_deco_model,lo
 	decfsz	lo,F							; jump over next line if char_I_deco_model == 1
-	movff	char_I_desaturation_multiplier,WREG ; Desaturation Multiplier
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movff	char_I_desaturation_multiplier,WREG ; desaturation multiplier
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	movff	char_I_deco_model,WREG			; 0 = ZH-L16, 1 = ZH-L16-GF
 	rcall	ghostwrite_byte_header			; writes byte and increases address (no banking)
 
 	read_int_eeprom .2
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_header			; Total dive counter, low
+	rcall	ghostwrite_byte_header			; total dive counter, low
 	read_int_eeprom .3
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_header			; Total dive counter, high
+	rcall	ghostwrite_byte_header			; total dive counter, high
 
 	movff	opt_dive_mode,WREG
 	rcall	ghostwrite_byte_header			; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
@@ -771,18 +720,18 @@
 end_dive_store_tissues_N2:
 	movf	POSTINC1,W
 	bcf		WREG,7							; clear flag bit for ongassing/offgassing
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	decfsz	lo,F
-	bra		end_dive_store_tissues_N2		; No
+	bra		end_dive_store_tissues_N2		; NO
 
 	movlw	.64
 	movwf	lo
-	lfsr	FSR1,0x700						; pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes
+	lfsr	FSR1,0x700						; pres_tissue_N2+0 ; 16*4 Byte Float = 64 Bytes
 end_dive_store_tissues_N2_2:
 	movf	POSTINC1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	decfsz	lo,F
-	bra		end_dive_store_tissues_N2_2		; No
+	bra		end_dive_store_tissues_N2_2		; NO
 
 	movlw	.16
 	movwf	lo
@@ -790,57 +739,58 @@
 end_dive_store_tissues_He:
 	movf	POSTINC1,W
 	bcf		WREG,7							; clear flag bit for ongassing/offgassing
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	decfsz	lo,F
-	bra		end_dive_store_tissues_He		; No
+	bra		end_dive_store_tissues_He		; NO
 
 	movlw	.64
 	movwf	lo
-	lfsr	FSR1,0x740						; pres_tissue_He+0 ; 16*4Byte Float = 64Bytes
+	lfsr	FSR1,0x740						; pres_tissue_He+0 ; 16*4 Byte Float = 64 Bytes
 end_dive_store_tissues_He_2:
 	movf	POSTINC1,W
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	decfsz	lo,F
-	bra		end_dive_store_tissues_He_2		; No
+	bra		end_dive_store_tissues_He_2		; NO
 
 	; Some deco stuff
 	movff	char_I_depth_last_deco,WREG		; last stop [m]
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movff	char_I_deco_distance,WREG		; assumed distance to shown stop
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Last HUD data
-	movff	hud_battery_mv+0,WREG			; Last HUD battery value
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	hud_battery_mv+1,WREG			; Last HUD battery value
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	hud_status_byte,WREG			; Last HUD status
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	movff	hud_battery_mv+0,WREG			; last HUD battery value
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movff	hud_battery_mv+1,WREG			; last HUD battery value
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movff	hud_status_byte,WREG			; last HUD status
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Battery gauge registers [nAs]
-	movff	battery_gauge+0,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	battery_gauge+1,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	battery_gauge+2,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	battery_gauge+3,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	battery_gauge+4,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
-	movff	battery_gauge+5,WREG			; Battery gauge register
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	lfsr	FSR0,battery_gauge				; load base address of battery gauge register
+	movf	POSTINC0,W						; get byte 0
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; get byte 1
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; get byte 2
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; get byte 3
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; get byte 4
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
+	movf	POSTINC0,W						; get byte 5
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
 	; Header stop
 	movlw	0xFB
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 	movlw	0xFB
-	rcall	ghostwrite_byte_header			; WREG -> Header in ext. flash
+	rcall	ghostwrite_byte_header			; WREG -> header in ext. flash
 
-	call	divemode_store_statistics		; Store/update statistics for this unit
+	call	divemode_store_statistics		; store/update statistics for this unit
 
 	clrf	surface_interval+0
-	clrf	surface_interval+1				; Clear surface interval timer
+	clrf	surface_interval+1				; clear surface interval timer
 
 ghostwriter_end_dive_common:
 ; Update ext_flash_log_pointer into EEPROM
@@ -855,31 +805,31 @@
 	bcf		simulatormode_active			; if we were in simulator mode
 
 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc...
-	ifndef __DEBUG
-		extern	deco_pull_tissues_from_vault
-		btfsc	restore_deco_data				; Restore decodata?
-		call	deco_pull_tissues_from_vault
-		banksel common							; Bank1
-	endif
+  ifndef __DEBUG
+	btfsc	restore_deco_data					; restore decodata?
+	call	deco_pull_tissues_from_vault
+	banksel	common								; bank 1
+  endif
 	call	update_battery_registers			; update battery registers into EEPROM
 	goto	surfloop							; and return to surface loop
 
+
 ghostwriter_end_dive_common_sim:
-	tstfsz	surface_interval+0					; Was interval zero?
-	bra		ghostwriter_end_dive_common_sim2	; No
-	tstfsz	surface_interval+1					; Was interval zero?
-	bra		ghostwriter_end_dive_common_sim2	; No
-	bra		ghostwriter_end_dive_common			; Yes, done.
-
+	tstfsz	surface_interval+0					; was interval zero?
+	bra		ghostwriter_end_dive_common_sim2	; NO
+	tstfsz	surface_interval+1					; was interval zero?
+	bra		ghostwriter_end_dive_common_sim2	; NO
+	bra		ghostwriter_end_dive_common			; YES - done
 ghostwriter_end_dive_common_sim2:
 	movf	divemins+0,W
 	addwf	surface_interval+0,F
 	movf	divemins+1,W
-	addwfc	surface_interval+1				; Add simulated dive time to surface interval
+	addwfc	surface_interval+1					; add simulated dive time to surface interval
 	bra		ghostwriter_end_dive_common
 
-ghostwriter_load_pointer:					; Load ext_flash_address:3 from EEPROM .4-.6
-	clrf	EEADRH							; Make sure to select EEPROM bank 0
+
+ghostwriter_load_pointer:						; load ext_flash_address:3 from EEPROM .4-.6
+	clrf	EEADRH								; make sure to select EEPROM bank 0
 	read_int_eeprom	.4
 	movff	EEDATA,ext_flash_address+0
 	read_int_eeprom	.5
@@ -888,44 +838,44 @@
 	movff	EEDATA,ext_flash_address+2
 	return
 
-ghostwriter_short_header_init:				; Proceed one page forward
+ghostwriter_short_header_init:					; proceed one page forward
 	clrf	EEDATA
-	write_int_eeprom .4						; ext_flash_address+0 = 0
+	write_int_eeprom .4							; ext_flash_address+0 = 0
 	movlw	.16
 	addwf	ext_flash_address+1,F
 	movlw	.0
 	addwfc	ext_flash_address+2,F
 	movlw	0x20
-	cpfseq	ext_flash_address+2				; at address 0x200000?
-	bra		ghostwriter_short_header_init2	; No
-	clrf	ext_flash_address+2				; Yes, rollover to 0x000000
+	cpfseq	ext_flash_address+2					; at address 0x200000?
+	bra		ghostwriter_short_header_init2		; NO
+	clrf	ext_flash_address+2					; YES - rollover to 0x000000
 ghostwriter_short_header_init2:
 	movlw	0xF0
-	andwf	ext_flash_address+1,F			; keep higher nibble, set lower nibble to 0
+	andwf	ext_flash_address+1,F				; keep higher nibble, set lower nibble to 0
 
 	movff	ext_flash_address+1,EEDATA
-	write_int_eeprom .5						; Write new pointer
+	write_int_eeprom .5							; write new pointer
 	movff	ext_flash_address+2,EEDATA
-	write_int_eeprom .6						; Write new pointer
-	bra		ghostwriter_short_header2		; Done.
+	write_int_eeprom .6							; write new pointer
+	bra		ghostwriter_short_header2			; Done
 
 	global	ghostwriter_short_header
-ghostwriter_short_header:					; Write short header with dive number into profile memory
+ghostwriter_short_header:						; write short header with dive number into profile memory
 	; load pointer for profile storing into RAM (Updated in EEPROM after the dive)
-	rcall	ghostwriter_load_pointer		; Load ext_flash_address:3 from EEPROM .4-.6
+	rcall	ghostwriter_load_pointer			; load ext_flash_address:3 from EEPROM .4-.6
 
 	; The following code is used to write a clean new dive after the previous hasn't been
 	; stored correctly. e.g. after a battery fail during the dive
-	call	ext_flash_byte_read_plus_0x20	; Into ext_flash_rw
+	call	ext_flash_byte_read_plus_0x20		; into ext_flash_rw
 	incfsz	ext_flash_rw,F
-	bra		ghostwriter_short_header_init	; Not 0xFF -> init page
-	call	ext_flash_byte_read_plus_0x20	; Into ext_flash_rw
+	bra		ghostwriter_short_header_init		; not 0xFF -> init page
+	call	ext_flash_byte_read_plus_0x20		; into ext_flash_rw
 	incfsz	ext_flash_rw,F
-	bra		ghostwriter_short_header_init	; Not 0xFF -> init page
+	bra		ghostwriter_short_header_init		; not 0xFF -> init page
 
 ghostwriter_short_header2:
 	; All ok, reload the pointer and start
-	rcall	ghostwriter_load_pointer		; Load ext_flash_address:3 from EEPROM .4-.6
+	rcall	ghostwriter_load_pointer			; load ext_flash_address:3 from EEPROM .4-.6
 
 	; Clear dive length counter
 	clrf	ext_flash_dive_counter+0
@@ -934,20 +884,20 @@
 
 	; Write short header with dive number into profile memory
 	movlw	0xFA
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 	movlw	0xFA
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 	; Load total number of dives (low byte only)
 	read_int_eeprom .2
-	incf	EEDATA,W						;+1	
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	incf	EEDATA,W							; +1
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 	read_int_eeprom .3
 	movf	EEDATA,W
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 	movlw	0xFA
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 	movlw	0xFA
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile				; WREG -> profile in ext. flash
 
 	; Keep room for dive length ext_flash_dive_counter:3 (Stored at the end of the dive)
 	; Writing 0xFF three times here is mandatory
@@ -956,82 +906,82 @@
 	; - fixes an issue when we are at exactly 0xXXX000 here...
 
 	movlw	0xFF
-	call	write_byte_ext_flash_plus_nocnt	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase)
+	call	write_byte_ext_flash_plus_nocnt		; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase)
 	movlw	0xFF
-	call	write_byte_ext_flash_plus_nocnt	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase)
+	call	write_byte_ext_flash_plus_nocnt		; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase)
 	movlw	0xFF
-	call	write_byte_ext_flash_plus_nocnt	; WREG -> Profile in ext. flash (No ext_flash_dive_counter:3 increase)
+	call	write_byte_ext_flash_plus_nocnt		; WREG -> profile in ext. flash (No ext_flash_dive_counter:3 increase)
 
-	movf	samplingrate,W					; Sampling rate
-	btfsc	FLAG_apnoe_mode					; Apnoe mode?
-	movlw	samplingrate_apnoe				; Apnoe sampling rate
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movf	samplingrate,W					; sampling rate
+	btfsc	FLAG_apnoe_mode					; apnoe mode?
+	movlw	samplingrate_apnoe				; apnoe sampling rate
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movlw	.7								; Number of divisors
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.7								; number of divisors
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movlw	.0								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.0								; type
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_temperature
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_temperature					; Divisor temperature
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_temperature					; divisor temperature
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
 	movlw	.1								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_deco
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_deco						; Divisor deco data
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_deco						; divisor deco data
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movlw	.2								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.2								; type
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_gf
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_gf							; Divisor gf
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_gf							; divisor gf
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movlw	.3								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.3								; type
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_ppo2_sensors
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_ppo2_sensors				; Divisor ppO2
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_ppo2_sensors				; divisor ppO2
 	btfss	FLAG_ccr_mode					; =1: CCR mode (Fixed ppO2 or Sensor) active
-	movlw	.0								; No ppO2 data in OC mode
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.0								; no ppO2 data in OC mode
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
-	movlw	.4								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	movlw	.4								; type
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_decoplan
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_decoplan					; Divisor debug
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_decoplan					; divisor debug
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
 	movlw	.5								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_cns
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_cns							; Divisor CNS
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_cns							; divisor CNS
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
 	movlw	.6								; Type
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 	movlw	infolength_tank
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
-	movlw	div_tank						; Divisor Tank
-	rcall	ghostwrite_byte_profile			; WREG -> Profile in ext. flash
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
+	movlw	div_tank						; divisor tank
+	rcall	ghostwrite_byte_profile			; WREG -> profile in ext. flash
 
 	return
 
-divemode_store_statistics:					; Store/update statistics for this unit
+divemode_store_statistics:					; store/update statistics for this unit
 	call	vault_decodata_into_eeprom		; update deco data
-	call	do_logoffset_common_read		; Existing logbook offset into lo:hi
+	call	do_logoffset_common_read		; existing logbook offset into lo:hi
 
 	tstfsz	lo								; lo=0?
-	bra		change_logbook_offset1			; No, adjust offset	
+	bra		change_logbook_offset1			; NO - adjust offset
 	tstfsz	hi								; hi=0?
-	bra		change_logbook_offset1			; No, adjust offset
-	bra		change_logbook_offset2			; lo=0 and hi=0 -> skip Offset routine
+	bra		change_logbook_offset1			; NO - adjust offset
+	bra		change_logbook_offset2			; lo=0 and hi=0 -> skip offset routine
 
 change_logbook_offset1:
 	movlw	d'1'
--- a/src/hwos.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/hwos.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,149 +1,153 @@
 ;=============================================================================
 ;
-;   File hwos.asm
+;   File hwos.asm														V2.98c
 ;
 ;   Definition of the hwOS dive computer platform.
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;   2011-05-24 : [jDG] Cleanups from initial Matthias code.
-;   2011-06-24 : [MH]  Added clock speeds.
+;   2011-05-24 : [jDG] Cleanups from initial Matthias code
+;   2011-06-24 : [MH]  Added clock speeds
+
+
 #include "hwos.inc"
 
 ;=============================================================================
 ;----------------------------- CONFIG ---------------------------------
-    CONFIG	RETEN = OFF          ;Disabled - Controlled by SRETEN bit
-    CONFIG	SOSCSEL = HIGH       ;High Power SOSC circuit selected
-    CONFIG  XINST = OFF          ;Code won't excute in extended mode...
-    CONFIG	FOSC = INTIO2        ;Internal RC oscillator, no clock-out
-    CONFIG	PLLCFG = OFF
-    CONFIG	IESO = OFF           ;Disabled
-    CONFIG	PWRTEN = OFF         ;Disabled, because incompatible with ICD3 (Ri-400)
-    CONFIG	BOREN = ON           ;Controlled with SBOREN bit
-    CONFIG	BORV = 2             ;2.0V
-    CONFIG	BORPWR = MEDIUM      ;BORMV set to medium power level
-    CONFIG	WDTEN = ON           ;WDT controlled by SWDTEN bit setting
-    CONFIG	WDTPS = 128          ;1:128
-    CONFIG	RTCOSC = SOSCREF     ;RTCC uses SOSC
-    CONFIG	MCLRE = ON           ;MCLR Enabled, RG5 Disabled
-    CONFIG	CCP2MX = PORTBE      ;RE7-Microcontroller Mode/RB3-All other modes
+	CONFIG	RETEN = OFF			; disabled - controlled by SRETEN bit
+	CONFIG	SOSCSEL = HIGH		; High Power SOSC circuit selected
+	CONFIG	XINST = OFF			; code won't execute in extended mode
+	CONFIG	FOSC = INTIO2		; internal RC oscillator, no clock-out
+	CONFIG	PLLCFG = OFF
+	CONFIG	IESO = OFF			; disabled
+	CONFIG	PWRTEN = OFF		; disabled, because incompatible with ICD3 (Ri-400)
+	CONFIG	BOREN = ON			; controlled with SBOREN bit
+	CONFIG	BORV = 2			; 2.0V
+	CONFIG	BORPWR = MEDIUM		; BORMV set to medium power level
+	CONFIG	WDTEN = ON			; WDT controlled by SWDTEN bit setting
+	CONFIG	WDTPS = 128			; 1:128
+	CONFIG	RTCOSC = SOSCREF	; RTCC uses SOSC
+	CONFIG	MCLRE = ON			; MCLR Enabled, RG5 Disabled
+	CONFIG	CCP2MX = PORTBE		; RE7-microcontroller mode/RB3-all other modes
+
+hwos		CODE
+
 ;=============================================================================
-boot    CODE
-    global init_ostc
 
+	global	init_ostc
 init_ostc:
-	banksel common              ; Bank1
-;init oscillator
+	banksel	common				; bank 1
+; init oscillator
 	movlw	b'01110010'
-	movwf	OSCCON				; 16MHz INTOSC
+	movwf	OSCCON				; 16 MHz INTOSC
 	movlw	b'00001000'
-	movwf	OSCCON2				; Secondary Oscillator running
+	movwf	OSCCON2				; secondary oscillator running
 	movlw	b'00000000'
-	movwf	OSCTUNE				; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
-	bcf		RCON,SBOREN			; Bown-Out off
-	bcf		RCON,IPEN			; Priority Interrupts off
-    clrf    CM1CON              ; Disable
-    banksel WDTCON
-    movlw   b'10000000'
-    movwf   WDTCON              ; Setup Watchdog 
+	movwf	OSCTUNE				; 4x PLL disable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz)
+	bcf		RCON,SBOREN			; bown-out off
+	bcf		RCON,IPEN			; priority interrupts off
+	clrf	CM1CON				; disable
+	banksel	WDTCON
+	movlw	b'10000000'
+	movwf	WDTCON				; setup watchdog
 
 ; I/O Ports
-	banksel 0xF16				; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
+	banksel	0xF16				; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM
 
-	clrf	REFOCON				; No reference oscillator active on REFO pin
-	clrf	ODCON1				; Disable Open Drain capability
-	clrf	ODCON2				; Disable Open Drain capability
-	clrf	ODCON3				; Disable Open Drain capability
-    clrf    CM2CON              ; Disable
-    clrf    CM3CON              ; Disable
+	clrf	REFOCON				; no reference oscillator active on REFO pin
+	clrf	ODCON1				; disable open drain capability
+	clrf	ODCON2				; disable open drain capability
+	clrf	ODCON3				; disable open drain capability
+	clrf	CM2CON				; disable
+	clrf	CM3CON				; disable
 
-	movlw	b'11000000'			; ANSEL, AN7 and AN6 -> Analog inputs, PORTA is digital.
+	movlw	b'11000000'			; ANSEL, AN7 and AN6 -> Analog inputs, PORTA is digital
 	movwf	ANCON0
-	movlw	b'00000111'			; ANSEL, AN8, AN9, AN10 -> Analog in
+	movlw	b'00000111'			; ANSEL, AN8, AN9, AN10 -> Analog input
 	movwf	ANCON1
 	movlw	b'00000010'			; ANSEL, AN17 -> Analog input
 	movwf	ANCON2
 
-	banksel common
+	banksel	common
 
-;	movlw	b'00000000'			; 1= Input -> Data TFT_high
+;	movlw	b'00000000'			; 1= input -> Data TFT_high
 	clrf	TRISA
-;	movlw	b'00000000'			; Init port
+;	movlw	b'00000000'			; init port
 	clrf	PORTA
 
-	movlw	b'00000011'			; 1= Input, (RB0, RB1) -> Switches, RB2 -> Power_MCP, RB3 -> s8_npower, RB4 -> LED_green, RB5 -> /TFT_POWER
+	movlw	b'00000011'			; 1= input, (RB0, RB1) -> switches, RB2 -> Power_MCP, RB3 -> s8_npower, RB4 -> LED_green/rx_nreset, RB5 -> /TFT_POWER
 	movwf	TRISB
-	movlw	b'00101000'			; Init port
+	movlw	b'00111000'			; init port, rx_nreset=1 -> hard reset RX
 	movwf	PORTB
 
-    movlw	b'10011010'			; 1= Input, (RC0, RC1) -> SOSC, RC2 -> TFT_LED_PWM, (RC3,RC4) -> I²C, RC5 -> MOSI_MS5541, (RC6, RC7) -> UART1
+	movlw	b'10011010'			; 1= input, (RC0, RC1) -> SOSC, RC2 -> TFT_LED_PWM, (RC3,RC4) -> I²C, RC5 -> MOSI_MS5541, (RC6, RC7) -> UART1
 	movwf	TRISC
-;	movlw	b'00000000'			; Init port
+;	movlw	b'00000000'			; init port
 	clrf	PORTC
 
-	movlw	b'00100000'			; 1= Input, RD0 -> TFT_NCS, RD1 -> TFT_RS, RD2 -> TFT_NWR, RD3 -> TFT_RD, RD4 -> MOSI_Flash, RD5 -> MISO_Flash, RD6 -> CLK_Flash, RD7 -> TFT_NRESET
+	movlw	b'00100000'			; 1= input, RD0 -> TFT_NCS, RD1 -> TFT_RS, RD2 -> TFT_NWR, RD3 -> TFT_RD, RD4 -> MOSI_Flash, RD5 -> MISO_Flash, RD6 -> CLK_Flash, RD7 -> TFT_NRESET
 	movwf	TRISD
-;	movlw	b'00000000'			; Init port
+;	movlw	b'00000000'			; init port
 	clrf	PORTD
 
-;	movlw	b'00000000'			; 1= Input, RE1 -> Power_IR, RE2 -> CS_MCP, RE3 -> LED_blue, RE4 -> power_sw1, RE5 -> Set to 1 for cR hardware
+;	movlw	b'00000000'			; 1= input, RE1 -> Power_IR, RE2 -> CS_MCP, RE3 -> LED_blue, RE4 -> power_sw1, RE5 -> Set to 1 for cR hardware
 	clrf	TRISE
-	movlw	b'00110001'			; Init port
+	movlw	b'00110001'			; init port
 	movwf	PORTE
 
-	movlw	b'01111110'			; 1= Input, (RF1, RF2, RF3, RF4, RF5) -> Analog
+	movlw	b'01111110'			; 1= input, (RF1, RF2, RF3, RF4, RF5) -> Analog
 	movwf	TRISF
-;	movlw	b'00000000'			; Init port
+;	movlw	b'00000000'			; init port
 	clrf	PORTF
 
-	movlw	b'00001110'			; 1= Input, <7:6> not implemented, RG0 -> TX3_PIEZO_CFG, RG2 -> RX2, RG3 -> AN17_RSSI, RG4 -> SOSC_OUT, RG5 -> /RESET
+	movlw	b'00001110'			; 1= input, <7:6> not implemented, RG0 -> TX3_PIEZO_CFG, RG2 -> RX2, RG3 -> AN17_RSSI, RG4 -> SOSC_OUT, RG5 -> /RESET
 	movwf	TRISG
-	movlw	b'00000001'			; Init port
+	movlw	b'00000001'			; init port
 	movwf	PORTG
 
-;	movlw	b'00000000'			; 1= Input -> Data TFT_low
+;	movlw	b'00000000'			; 1= input -> Data TFT_low
 	clrf	TRISH
-;	movlw	b'00000000'			; Init port
+;	movlw	b'00000000'			; init port
 	clrf	PORTH
 
-	movlw	b'10011011'			; 1= Input, RJ4 -> vusb_in, RJ5 -> power_sw2,  RJ6 -> CLK_MS5541, RJ7 -> MISO_MS5541
+	movlw	b'10011011'			; 1= input, RJ4 -> vusb_in, RJ5 -> power_sw2,  RJ6 -> CLK_MS5541, RJ7 -> MISO_MS5541
 	movwf	TRISJ
-	movlw	b'00100000'			; Init port
+	movlw	b'00100000'			; init port
 	movwf	PORTJ
 
 
 ; Timer 0
-	movlw	b'00000001'				; Timer0 with 1:4 prescaler
+	movlw	b'00000001'			; timer0 with 1:4 prescaler
 	movwf	T0CON
 
 ; Timer 1 - Button hold-down timer
-	movlw	b'10001100'             ; 32768Hz clock source, 1:1 Prescaler -> ; 30,51757813µs/bit in TMR1L:TMR1H
+	movlw	b'10001100'			; 32768Hz clock source, 1:1 prescaler -> ; 30.51757813 µs/bit in TMR1L:TMR1H
 	movwf	T1CON
 
-	banksel 0xF16				; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
+	banksel 0xF16				; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM
 
 ; RTCC
-	movlw 	0x55
-	movwf 	EECON2
-	movlw 	0xAA
-	movwf 	EECON2
-	bsf 	RTCCFG,RTCWREN		; Unlock sequence for RTCWREN
+	movlw	0x55
+	movwf	EECON2
+	movlw	0xAA
+	movwf	EECON2
+	bsf 	RTCCFG,RTCWREN		; unlock sequence for RTCWREN
 	bsf		RTCCFG,RTCPTR1
 	bsf		RTCCFG,RTCPTR0
-	bsf		RTCCFG,RTCEN		; Module enable
-	bsf		RTCCFG,RTCOE		; Output enable
-	movlw	b'00000100'			; 32768Hz SOCS on RTCC pin (PORTG,4) Bit7-5: Pullups for Port D, E and J
+	bsf		RTCCFG,RTCEN		; module enable
+	bsf		RTCCFG,RTCOE		; output enable
+	movlw	b'00000100'			; 32768 Hz SOCS on RTCC pin (PORTG,4) Bit7-5: pullups for Port D, E and J
 	movwf	PADCFG1
 	movlw	b'11000100'
 	movwf	ALRMCFG				; 1 second alarm
 	movlw	d'1'
-	movwf	ALRMRPT				; Alarm repeat counter
-	movlw 	0x55
-	movwf 	EECON2
-	movlw 	0xAA
-	movwf 	EECON2
-	bcf 	RTCCFG,RTCWREN		; Lock sequence for RTCWREN
+	movwf	ALRMRPT				; alarm repeat counter
+	movlw	0x55
+	movwf	EECON2
+	movlw	0xAA
+	movwf	EECON2
+	bcf		RTCCFG,RTCWREN		; lock sequence for RTCWREN
 
 	banksel common
 ; A/D Converter
@@ -151,37 +155,37 @@
 	movwf	ADCON0
 	movlw	b'00100000'			; 2.048V Vref+
 	movwf	ADCON1
-	movlw	b'10001101'			; Right justified
+	movlw	b'10001101'			; right aligned
 	movwf	ADCON2
 
 
-;init serial port1 (TRISC6/7)
+; init serial port1 (TRISC6/7)
 	movlw	b'00001000'			; BRG16=1
 	movwf	BAUDCON1
-	movlw 	.34					; SPBRGH:SPBRG = .34  : 114285 BAUD @ 16MHz (+0,79% Error to 115200 BAUD)
-	movwf 	SPBRG1				; SPBRGH:SPBRG = .207 :  19230 BAUD @ 16MHz (-0,16% Error to 19200 BAUD)
+	movlw	.34					; SPBRGH:SPBRG = .34  : 114285 BAUD @ 16MHz (+0.79% Error to 115200 BAUD)
+	movwf	SPBRG1				; SPBRGH:SPBRG = .207 :  19230 BAUD @ 16MHz (-0.16% Error to  19200 BAUD)
 	clrf	SPBRGH1				;
 
 	clrf	RCSTA1
-	clrf	TXSTA1					; UART disable
-    bcf     PORTC,6                 ; TX hard to GND
+	clrf	TXSTA1				; UART disable
+	bcf		PORTC,6				; TX hard to GND
 
-;init serial port2 (TRISG2)
-    banksel BAUDCON2
-	movlw	b'00100000'			; BRG16=0           ; inverted for IR
+; init serial port2 (TRISG2)
+	banksel	BAUDCON2
+	movlw	b'00100000'			; BRG16=0		; inverted for IR
 	movwf	BAUDCON2
-	movlw 	b'00100000'			; BRGH=0, SYNC=0
-	movwf 	TXSTA2
-	movlw 	.102                ; SPBRGH:SPBRG = .102  : 2403 BAUD @ 16MHz
-	movwf 	SPBRG2
+	movlw	b'00100000'			; BRGH=0, SYNC=0
+	movwf	TXSTA2
+	movlw	.102				; SPBRGH:SPBRG = .102  : 2403 BAUD @ 16MHz
+	movwf	SPBRG2
 	clrf	SPBRGH2
-	movlw 	b'10010000'
-	movwf 	RCSTA2
-    banksel common
+	movlw	b'10010000'
+	movwf	RCSTA2
+	banksel	common
 
 ; Timer3 for IR-RX Timeout
-	clrf	T3GCON				; Reset Timer3 Gate Control register
-	movlw	b'10001001'			; 1:1 Prescaler -> 2seconds@32768Hz, synced
+	clrf	T3GCON				; reset Timer3 gate control register
+	movlw	b'10001001'			; 1:1 prescaler -> 2 seconds@32768Hz, synced
 ; 30,51757813µs/bit in TMR3L:TMR3H
 	movwf	T3CON
 
@@ -196,54 +200,54 @@
 ; -> 16MHz  Bit clock @64MHz mode (Fastest)
 
 ; MSSP1 Module: I2C Master
-    movlw	b'00101000'		; I2C Master Mode
+	movlw	b'00101000'			; I2C master mode
 	movwf	SSP1CON1
 ;	movlw	b'00000000'
 	clrf	SSP1CON2
 	movlw	0x27
-	movwf	SSP1ADD			; 100kHz @ 16MHz Fosc
+	movwf	SSP1ADD				; 100kHz @ 16MHz Fosc
 
 ; PWM Module(s)
 ; PWM1 for LED dimming
 	movlw	b'00001100'
 	movwf	CCP1CON
 	movlw	b'00000001'
-	movwf	PSTR1CON			; Pulse steering disabled
+	movwf	PSTR1CON			; pulse steering disabled
 	movlw	d'255'
-	movwf	PR2					; Period
-	; 255 is max brightness (300mW)
-	clrf	CCPR1L				; Duty cycle
-	clrf	CCPR1H				; Duty cycle
+	movwf	PR2					; period
+	; 255 is max brightness (300 mW)
+	clrf	CCPR1L				; duty cycle
+	clrf	CCPR1H				; duty cycle
 	movlw	T2CON_NORMAL
 	movwf	T2CON
 
 ; Timer5 for ISR-independent wait routines
-	clrf	T5GCON				; Reset Timer5 Gate Control register
-	movlw	b'10001001'			; 1:1 Prescaler -> 2seconds@32768Hz, synced
+	clrf	T5GCON				; reset Timer5 gate control register
+	movlw	b'10001001'			; 1:1 prescaler -> 2 seconds@32768Hz, synced
 ; 30,51757813µs/bit in TMR5L:TMR5H
 	movwf	T5CON
 
 ; Timer7 for 62,5ms Interrupt (Sensor states)
-	banksel 0xF16				; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
-	clrf	T7GCON				; Reset Timer7 Gate Control register
-	movlw	b'10001001'			; 1:1 Prescaler -> 2seconds@32768Hz, synced
+	banksel 0xF16				; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM
+	clrf	T7GCON				; reset Timer7 gate control register
+	movlw	b'10001001'			; 1:1 prescaler -> 2 seconds@32768Hz, synced
 	movwf	T7CON
 	clrf	TMR7L
 	movlw	.248
 	movwf	TMR7H				; -> Rollover after 2048 cycles -> 62,5ms
 
-	banksel common
+	banksel	common
 ; Interrupts
 	movlw	b'11010000'
 	movwf	INTCON
-	movlw	b'00001000'			; BIT7=1: Pullup for PORTB disabled
+	movlw	b'00001000'			; BIT7=1: pullup for PORTB disabled
 	movwf	INTCON2
 	movlw	b'00000000'
 	movwf	INTCON3
 	movlw	b'00000001'			; Bit0: TMR1
 	movwf	PIE1
 	movlw	b'00000010'			; Bit1: TMR3
-	movwf	PIE2			
+	movwf	PIE2
 	movlw	b'00000000'			; Bit1: TMR5
 	movwf	PIE5
 	movlw	b'00100001'			; Bit0: RTCC, Bit5: UART2
@@ -251,16 +255,17 @@
 	movlw	b'00001000'			; Bit3: TMR7
 	movwf	PIE5
 
-        bsf     power_sw1
-        btfss   power_sw1
-        bra     $-4
-        bsf     power_sw2
-        btfss   power_sw2
-        bra     $-4
+	bsf		power_sw1
+	btfss	power_sw1
+	bra		$-4
+	bsf		power_sw2
+	btfss	power_sw2
+	bra		$-4
 
 	movlw	d'2'
-	movff   WREG,speed_setting		; Normal
+	movff	WREG,speed_setting		; normal
 
+	bcf		active_reset_ostc_rx	; start RX from RESET
 
 	return
 
@@ -268,23 +273,23 @@
 	global	speed_eco
 speed_eco:
 	movlw	d'1'
-	movff	WREG,speed_setting		; Bank-independent
+	movff	WREG,speed_setting		; bank-independent
 	; Done in ISR
 	return
 ;=============================================================================
 	global	speed_normal
 speed_normal:
 	movlw	d'2'
-	movff	WREG,speed_setting		; Bank-independent
+	movff	WREG,speed_setting		; bank-independent
 	; Done in ISR
 	return
 ;=============================================================================
 	global	speed_fastest
 speed_fastest:
 	movlw	d'3'
-	movff	WREG,speed_setting		; Bank-independent
+	movff	WREG,speed_setting		; bank-independent
 	; Done in ISR
 	return
 ;=============================================================================
 
-    END
\ No newline at end of file
+	END
\ No newline at end of file
--- a/src/hwos.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/hwos.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,53 +1,94 @@
 ;=============================================================================
 ;
-;   File hwos.inc									REFACTORED VERSION V2.97 SP1
+;   File hwos.inc									REFACTORED VERSION V2.99e
 ;
 ;   OSTC Platform definitions
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;   2011-05-24 : [jDG] Cleanups from initial Matthias code.
-
+;   2011-05-24 : [jDG] Cleanups from initial Matthias code
 ;=============================================================================
 
-	LIST	P=18F87K22		; change also: Configure->SelectDevice from Mplab
+; Low Level Settings
+	LIST	P=18F87K22		; compiler  settings, if changed, change also: Configure -> SelectDevice in MPLAB
+#include <p18f87k22.inc>	; processor definitions
+#include <ports.inc>		; Portmap   definitions
 
-;#DEFINE __DEBUG
+
+; Debug Mode
+;#DEFINE __DEBUG			; if defined, compile firmware in debug mode
 
-;#DEFINE french_italian		; If defined, use french and italian instead of english and german
+; Conditional Compiles (note: not all options will fit at the same time)
+#DEFINE _screendump			; if defined, compile screen dump  into firmware (default:     included  )
+#DEFINE _rx_functions		; if defined, compile RX (OSTC TR) into firmware (default:     included *)
+;#DEFINE _ostc_logo			; if defined, compile OSTC logo    into firmware (default: not included  )
+;#DEFINE _cave_mode			; if defined, compile cave mode    into firmware (default: not included *)   ## OPTION IS UNDER CONSTRUCTION ##
+;
+;                             * option needs to be included / excluded in p2_deco.c, too!
 
-#include <p18f87k22.inc>
-#include <ports.inc>		; Portmap
 
-; Firmware definition
-#DEFINE softwareversion_x		.2			; Software version  XX.YY
-#DEFINE softwareversion_y		.98			; Software version  XX.YY
-#DEFINE softwareversion_beta	.0			; 0= release, 1=beta, 2=SP1, 3=SP2, ...
+; Language Selection
+#DEFINE none					0			; no language selected
+#DEFINE en						1			; English
+#DEFINE de						2			; German
+#DEFINE fr						3			; French
+#DEFINE it						4			; Italian
+
+#DEFINE _language_1				en			; first or single language - must be set to en, de, fr, or it, defaults to en
+#DEFINE _language_2				none		; second language or none
+
 
-; Firmware version will appear in "Change Firmware" style
-#DEFINE firmware_expire_year	.19
-#DEFINE firmware_expire_month	.8
-#DEFINE firmware_expire_day	.27
+; Firmware Version
+#DEFINE softwareversion_x		.2			; Software Version, major               (1 -   9)
+#DEFINE softwareversion_y		.99			; Software Version, minor               (1 -  99)
+#DEFINE softwareversion_beta	.0			; 0= Release, 1= Beta-1, 2= Beta-2, ... (0 - 255)
 
+; Firmware Expiration Date, will cause version to be displayed in "Update Firmware" style after the following date:
+#DEFINE firmware_expire_year	.18
+#DEFINE firmware_expire_month	.12
+#DEFINE firmware_expire_day		.31
+
+; Magic Cookie Definition
 #DEFINE comm_service_key		0xABCDEF
 
+; Logo Address Vectors
+#DEFINE hw_logo_block			0x01E000	; color image data for heinrichsweikamp logo
+#DEFINE usb_ble_logo_block		0x01EEDE	; color image data for USB or BLE logo
+
+
 ;-----------------------------EEPROM DATA ------------------------------------
 ; Automatic reset of all options when this is changed:
-#define eeprom_opt_serial		0x0006		; Version 0.6
+#DEFINE eeprom_opt_serial		0x0008		; Version 0.8
 ;-----------------------------------------------------------------------------
 
 #DEFINE CCP1CON_VALUE					b'00001100'	; PWM1 for LED dimming
-#DEFINE T2CON_ECO						b'00000100'	; 1:1 Postscaler, 1:1 Prescaler, Timer 2 start -> 980Hz (Good compromise of no-flicker and efficiency)
-#DEFINE T2CON_NORMAL					b'00001110'
-#DEFINE T2CON_FASTEST					b'00001110'	; 1:2 Postscaler, 1:16 Prescaler, Timer 2 start -> 1960Hz (no-flicker)
+#DEFINE T2CON_ECO						b'01111110'	;
+#DEFINE T2CON_NORMAL					b'01111110'	;
+#DEFINE T2CON_FASTEST					b'01111110'	;
+
+; Divemode Custom View Indexes - Attention: these numbers need to be in line with the jump tables in customview.asm!
+#DEFINE index_avr_stopwatch				 .1			; average depth and stopwatch
+#DEFINE index_compass_dm				 .2			; compass
+#DEFINE index_ppo2_sensors				 .3			; ppO2 sensors
+#DEFINE index_sensor_check				 .4			; sensor check
+#DEFINE index_pscr_info					 .5			; pSCR data
+#DEFINE index_pressures_SAC				 .6			; tank pressure and SAC rate
+#DEFINE index_gas_needs_ascent			 .7			; gas needs for ascent / cave return
+#DEFINE index_decoplan					 .8			; deco plan
+#DEFINE index_ceiling_GF_tissue			 .9			; ceiling, current GF and tissues
+#DEFINE index_CNS						.10			; CNS values
+#DEFINE index_ppo2_ead_end_cns			.11			; ppO2, END/EAD and CNS
+#DEFINE index_gf_factors				.12			; GF factors
+#DEFINE index_clock_batt_surfpress		.13			; clock, battery and surface pressure
+#DEFINE index_cv_dm_max					.13			; highest index in use in dive mode custom view
 
 ; Timing for button hold-down flags
-#DEFINE TMR1H_VALUE_FIRST				.255-.128	; in steps of 7,8125ms -> 1s
-#DEFINE TMR1H_VALUE_CONT				.255-.32	; in steps of 7,8125ms -> 0.25s
-#DEFINE TMR1H_VALUE_CONT_DIVE			.255-.64	; in steps of 7,8125ms -> 0.5s
+#DEFINE TMR1H_VALUE_FIRST				.255-.128	; in steps of 7.8125 ms -> 1    s
+#DEFINE TMR1H_VALUE_CONT				.255-.32	; in steps of 7.8125 ms -> 0.25 s
+#DEFINE TMR1H_VALUE_CONT_DIVE			.255-.64	; in steps of 7.8125 ms -> 0.5  s
 
-; Color Definitions: 8Bit RGB b'RRRGGGBB'
+; Color Definitions: 8 bit RGB b'RRRGGGBB'
 #DEFINE color_red						b'11100000'	; (7,0,0)
 #DEFINE color_dark_red					b'10000101'	; (4,1,1)
 #DEFINE color_violet					b'11101011'	; (7,2,3)
@@ -70,25 +111,25 @@
 #DEFINE FT_MEDIUM						.2			; not used
 #DEFINE FT_LARGE						.3			; not used
 
-; External O2 cell input parameters
-#DEFINE min_mv							.80			; = 8mV
-#DEFINE max_mv							.2500		; = 250mV
-#DEFINE ignore_mv						.3500		; = 350mV (to suppress ghost readings for long, open cables)
+; External O2 cell input Parameters
+#DEFINE min_mv							.80			; =   8 mV
+#DEFINE max_mv							.2500		; = 250 mV
+#DEFINE ignore_mv						.3500		; = 350 mV (to suppress ghost readings for long, open cables)
 
-; Profile recording parameters
+; Profile Recording Parameters
 #DEFINE logbook_profile_version			0x24
 #DEFINE samplingrate_apnoe				.1			; [seconds]
 
-; Warning: Divisors must be <.16 !
-#DEFINE div_temperature					.6			; x samplingrate [s]
-#DEFINE div_deco						.6			; x samplingrate [s]
-#DEFINE div_gf							.12			; x samplingrate [s]
-#DEFINE div_ppo2_sensors				.2			; x samplingrate [s]
-#DEFINE div_decoplan					.12			; x samplingrate [s]
-#DEFINE div_cns							.12			; x samplingrate [s]
-#DEFINE div_tank						.0			; x samplingrate [s]
+; Attention: Divisors must be < 16 !
+#DEFINE div_temperature					.6			; x sampling rate [s]
+#DEFINE div_deco						.6			; x sampling rate [s]
+#DEFINE div_gf							.12			; x sampling rate [s]
+#DEFINE div_ppo2_sensors				.2			; x sampling rate [s]
+#DEFINE div_decoplan					.12			; x sampling rate [s]
+#DEFINE div_cns							.12			; x sampling rate [s]
+#DEFINE div_tank						.0			; x sampling rate [s]
 
-; Warning: Information lengths must be <.16 !
+; Attention: Information Lengths must be < 16 !
 #DEFINE infolength_temperature			.2			; [byte]
 #DEFINE infolength_deco					.2			; [byte]
 #DEFINE infolength_gf					.1			; [byte]
@@ -97,82 +138,91 @@
 #DEFINE infolength_cns					.2			; [byte]
 #DEFINE infolength_tank					.0			; [byte]
 
-; "Better Gas" behavior
-; better_gas_window <= minimum_change_depth !
-; minimum_change_depth >=5 !
-#DEFINE minimum_change_depth			.3			; [m]
-#DEFINE better_gas_window_neg			.3			; [m] (Depth above change depth)
-#DEFINE better_gas_window_pos			.1			; [m] (Depth below change depth, if ppO2<opt_ppO2_max)
+; RX Functions (no conditional compile because defines are used in options_table)
+#DEFINE rx_packet_overdue_timeout		.60			; [seconds]
+#DEFINE max_pres_diff_min				.5			; [bar] minimum selectable pressure difference for ind.double mode
+#DEFINE max_pres_diff_max				.50			; [bar] maximum selectable pressure difference for ind.double mode
 
-; Dive mode limits and thresholds
+; Gas Needs Settings
+#DEFINE min_tank_size					.1			; [liter]
+#DEFINE max_tank_size					.40			; [liter]
+#DEFINE min_fill_press					.5			; [0 bar] value is in multiples of 10 bar
+#DEFINE max_fill_press					.29			; [0 bar] value is in multiples of 10 bar, no 300 bar due to too far beyond ideal gas laws
+
+
+;; "Better Gas" Behavior
+;#DEFINE minimum_change_depth			.2			; [m]
+
+; Dive Mode Limits and Thresholds
 #DEFINE start_dive_threshold			.100		; [cm]
 #DEFINE high_altitude_dive_threshold	.300		; [cm]
 #DEFINE apnoe_timeout					.15			; [min]
 #DEFINE divemode_menuview_timeout		.10			; [s]
 #DEFINE divemode_menu_timeout			.30			; [s]
 
-#DEFINE ppo2_warning_low_lowest			.16			; [cbar] (Min.    value) for minimum on OC
-#DEFINE ppo2_warning_low_default		.19			; [cbar] (Default value) for minimum on OC
-#DEFINE ppo2_warning_low_highest		.21			; [cbar] (Max.    value) for minimum on OC
+#DEFINE ppo2_warning_low_lowest			.15			; [cbar] (min.    value) for minimum on OC
+#DEFINE ppo2_warning_low_default		.17			; [cbar] (default value) for minimum on OC
+#DEFINE ppo2_warning_low_highest		.21			; [cbar] (max.    value) for minimum on OC
 
-#DEFINE ppo2_warning_loop_lowest		.20			; [cbar] (Min.    value) for minimum on loop
-#DEFINE ppo2_warning_loop_default		.40			; [cbar] (Default Value) for minimum on loop
-#DEFINE ppo2_warning_loop_highest		.60			; [cbar] (Max.    value) for minimum on loop
+#DEFINE ppo2_warning_loop_lowest		.20			; [cbar] (min.    value) for minimum on loop
+#DEFINE ppo2_warning_loop_default		.40			; [cbar] (default Value) for minimum on loop
+#DEFINE ppo2_warning_loop_highest		.60			; [cbar] (max.    value) for minimum on loop
 
-#DEFINE ppo2_warning_high_lowest		.120		; [cbar] (Min.    value) for maximum in none-deco phase
-#DEFINE ppo2_warning_high_default		.140		; [cbar] (Default value) for maximum in none-deco phase
-#DEFINE ppo2_warning_high_highest		.160		; [cbar] (Max.    value) for maximum in none-deco phase
+#DEFINE ppo2_warning_high_lowest		.120		; [cbar] (min.    value) for maximum in none-deco phase
+#DEFINE ppo2_warning_high_default		.140		; [cbar] (default value) for maximum in none-deco phase
+#DEFINE ppo2_warning_high_highest		.160		; [cbar] (max.    value) for maximum in none-deco phase
 
-#DEFINE ppo2_warning_deco_lowest		.120		; [cbar] (Min.    value) for maximum in deco phase
-#DEFINE ppo2_warning_deco_default		.160		; [cbar] (Default Value) for maximum in deco phase
-#DEFINE ppo2_warning_deco_highest		.160		; [cbar] (Max.    value) for maximum in deco phase
+#DEFINE ppo2_warning_deco_lowest		.120		; [cbar] (min.    value) for maximum in deco phase
+#DEFINE ppo2_warning_deco_default		.160		; [cbar] (default Value) for maximum in deco phase
+#DEFINE ppo2_warning_deco_highest		.160		; [cbar] (max.    value) for maximum in deco phase
 
 #DEFINE depth_warn_mbar					.13000		; [mbar]
 #DEFINE wake_up_from_sleep				.1160		; [mbar]
 #DEFINE simulator_timeout				.15			; [s]
 
-#DEFINE sensor_voting_logic_threshold	.10			; Threshold in 0.01bar
+#DEFINE sensor_voting_logic_threshold	.10			; threshold in 0.01 bar
 
-; Surface mode limits and thresholds
+; Surface Mode Limits and Thresholds
 #DEFINE high_altitude_threshold			.880		; [mbar]
 #DEFINE max_surfpressure				.1080		; [mbar]
-#DEFINE timeout_surfacemode				.90			; [s]
+#DEFINE timeout_surfacemode				.240		; [s]		; ex 90 seconds
 #DEFINE timeout_calibrate_menu			.240		; [s]
+#DEFINE timeout_tanksetup_menu			.240		; [s]
 #DEFINE timeout_ccr_surface				.240		; [s]
 
-; Decomodel paramters
+; Deco-Model Parameters
 #DEFINE deco_distance					.10			; [dm]
 
-; Color-code parameters for the divemode
+; Color-Code Parameters for the Dive Mode
 #DEFINE color_code_velocity_warn_high	.11			; [m/min]
 #DEFINE color_code_velocity_attn_high	.10			; [m/min]
 #DEFINE velocity_display_threshold_1	.3			; [m/min]
 
-; Battery thresholds
-#DEFINE lithium_36v_empty				.2400		; [mV] Saft 3,6V LS14500 AA - threshold for battery percent display
-#DEFINE lithium_36v_low					.2000		; [mV] (Must be bigger then aa_15v_high!)
-#DEFINE aa_15v_high						.1550		; [mV] Energizer 1,5V E2 AA
-#DEFINE aa_15v_low						.1100		; [mV] According to Energizer Datasheet EBC-4201R, Page 2
+; Battery Thresholds
+#DEFINE lithium_36v_empty				.2400		; [mV] Saft 3.6 V LS14500 AA - threshold for battery percent display
+#DEFINE lithium_36v_low					.2000		; [mV] (must be bigger than aa_15v_high!)
+#DEFINE aa_15v_high						.1550		; [mV] Energizer 1.5 V E2 AA
+#DEFINE aa_15v_low						.1100		; [mV] according to Energizer data sheet EBC-4201R, page 2
 #DEFINE color_code_battery_low			.10			; [%]
 #DEFINE battery_show_level				.24			; [%]
 
-; 3,6V battery sensing data points at 70mA load
+; 3.6 Volt Battery sensing Data Points at 70 mA Load
 #DEFINE lithium_36v_75					.3000		; [mV]
 #DEFINE lithium_36v_50					.2900		; [mV]
 #DEFINE lithium_36v_25					.2600		; [mV]
 #DEFINE lithium_36v_10					.2500		; [mV]
-	
-; Capacity for 2.4Ah Saft LS14500 and 0.8Ah Panasonic UR14500P
+
+; Capacity for 2.4 Ah Saft LS14500 and 0.8 Ah Panasonic UR14500P
 ; battery_gauge:6 is nAs
 ; devide through 65536
-;    a) devide through 364 -> Result is in percent of a 2.4Ah Battery
-; or b) devide through 121 -> Result is in percent of a 0.8Ah Battery
+;    a) devide through 364 -> result is in percent of a 2.4 Ah battery
+; or b) devide through 121 -> result is in percent of a 0.8 Ah battery
 
-; For internal battery gauging
+; internal Battery Gauging
 #DEFINE internal_saft_capacity			.364
 #DEFINE internal_panasonic_capacity		.121
 
-; For gauge IC	
+; Gauge IC
 #DEFINE saft_capacity					.281		; 2.4Ah/0.085mAh/100 [%]
 #DEFINE saft_offset						.37300		; 65536-(2.4Ah/0.085mAh)
 
@@ -194,7 +244,7 @@
 #DEFINE current_ir_receiver				.139
 #DEFINE current_compass					.28
 
-; Brightness thresholds (between zero (off) and 255 (max. power))
+; Brightness Thresholds (between zero (off) and 255 (max. power))
 #DEFINE ambient_light_max_high_36V		.170
 #DEFINE ambient_light_max_high_cr		.240
 #DEFINE ambient_light_max_high_15V		.140
@@ -204,164 +254,175 @@
 #DEFINE ambient_light_max_eco			.70
 #DEFINE ambient_light_min_eco			.10			; must be the lowest value!
 
-; IR Link timeout
-#DEFINE ir_timeout_value				.64			; multiples of 62,5ms
+; IR Link Timeout
+#DEFINE ir_timeout_value				.64			; multiples of 62.5 ms
 
-; Sp control constants
+; Setpoint Control
 #DEFINE surface_sp						.50			; in cbar
 
-; Gaslist hard-coded limits
-#DEFINE gaslist_min_o2					.5					; Minimum O2 [%]
-#DEFINE gaslist_max_He					.100-gaslist_min_o2	; Maximum He [%]
+; Gaslist hard-coded Limits
+#DEFINE gaslist_min_o2					.6					; minimum O2 [%]
+#DEFINE gaslist_max_He					.100-gaslist_min_o2	; maximum He [%]
+#DEFINE gaslist_max_change_depth		.99			; max. change depth [m]
+#DEFINE gaslist_sp_stepsize				.10			; steps for setpoint setup [cbar]
+#DEFINE gaslist_sp_max					.160		; max. setpoint [cbar]
+#DEFINE gaslist_sp_min					.50			; min. setpoint [cbar]
 
-#DEFINE gaslist_max_change_depth		.99			; Max. change depth [m]
-#DEFINE gaslist_sp_stepsize				.10			; Steps for Setpoint Setup [cbar]
-#DEFINE gaslist_sp_max					.160		; Max. Setpoint [cbar]
-#DEFINE gaslist_sp_min					.50			; Min. Setpoint [cbar]
-
-; Compass display
+; Compass Display
 #DEFINE compass_fast_treshold			.9			; show new heading instantly if new and old > compass_fast_treshold
 #DEFINE compass_averaging				.10			; numbers of extra averaging
 
-; Bit Masks	for communication with p2_deco.c - char_O_deco_status
-#define DECO_STATUS_MASK				.3
 
-; Bit Flags for communication with p2_deco.c - char_O_deco_status
-#define DECO_STATUS_0_FLAG				.0
-#define DECO_STATUS_1_FLAG				.1
-#define DECO_MODE_LOOP_FLAG				.2
-#define DECO_MODE_PSCR_FLAG				.3
-#define DECO_PLAN_FLAG					.4
-#define DECO_CNS_FLAG					.5
-#define DECO_VOLUME_FLAG				.6
-#define DECO_ASCENT_FLAG				.7
-
-; Bit Flags for communication with p2_deco.c - char_O_main_status
-;										.0			; unused
-;										.1			; unused
+; Bit Flags for Communication with p2_deco.c - char_O_main_status
+#DEFINE DECO_COMPLETED_NORM				.0			; the calculation of a normal       deco plan has just been completed
+#DEFINE DECO_COMPLETED_ALT				.1			; the calculation of an alternative deco plan has just been completed
 ;       DECO_MODE_LOOP_FLAG				.2			; defined below, also used for char_O_main_status
 ;       DECO_MODE_PSCR_FLAG				.3			; defined below, also used for char_O_main_status
-#define DECO_GASCHANGE_OVRD				.4
-;										.5			; unused
-#define DECO_BOTTOM_FLAG				.6
-;										.7			; unused
+#DEFINE DECO_Z_FACTOR_FLAG				.4			; =1: figure in Z factor when converting gas volumes <-> pressures
+#DEFINE DECO_CAVE_MODE					.5			; =1: compute ascent and gas needs using backtracking data
+#DEFINE DECO_BOTTOM_FLAG				.6			; =1: compute with bottom time (deco calculator), =0: with extra time (dive mode)
+#DEFINE DECO_TR_FUNCTIONS				.7			; =1: compute TR functions (pressure readings)
 
-; Bit Values for communication with p2_deco.c
-#define DECO_STATUS_INIT				.3
-#define DECO_MODE_LOOP					.4
-#define DECO_MODE_PSCR					.8
-#define DECO_PLAN_ALTERNATE				.16
-#define DECO_CNS_CALCULATE				.32
-#define DECO_VOLUME_CALCULATE			.64
-#define DECO_ASCENT_DELAYED				.128
+; Bit Flags for Communication with p2_deco.c - char_O_deco_status
+#DEFINE DECO_STATUS_0_FLAG				.0
+#DEFINE DECO_STATUS_1_FLAG				.1
+#DEFINE DECO_MODE_LOOP_FLAG				.2
+#DEFINE DECO_MODE_PSCR_FLAG				.3
+#DEFINE DECO_PLAN_FLAG					.4
+#DEFINE DECO_BAILOUT_FLAG				.5			; =1: do a bailout calculation, i.e. allow gas switches before first deco stop
+#DEFINE DECO_VOLUME_FLAG				.6
+#DEFINE DECO_ASCENT_FLAG				.7
 
-; Bit Flags for char_O_deco_warnings
-#define IBCD_warning					.0
-#define IBCD_warning_lock				.1
-#define mbubble_warning					.2
-#define mbubble_warning_lock			.3
-#define outside_warning					.4
-#define outside_warning_lock			.5
-#define stoptable_overflow				.6
-#define deco_flag						.7
+; Bit Flags for Communication with p2_deco.c - char_O_deco_warnings
+#DEFINE IBCD_warning					.0
+#DEFINE IBCD_warning_lock				.1
+#DEFINE mbubble_warning					.2
+#DEFINE mbubble_warning_lock			.3
+#DEFINE outside_warning					.4
+#DEFINE outside_warning_lock			.5
+#DEFINE outside_attention				.6
+#DEFINE stoptable_overflow				.7
 
-; Bit Flags for status on CHARs
-#define char_invalid_flag				.7
+; Bit Flags for Communication with p2_deco.c - char_O_deco_info
+#DEFINE deco_flag						.0			; =1: in deco mode, deco ppO2 levels permitted
+#DEFINE ind_double_switch				.1			; =1: switch to other tank advice active
+#DEFINE deco_steady						.2			; =1: fTTS is = TTS (not updated when in bailout mode)
+#DEFINE deco_decreasing					.3			; =1: fTTS is < TTS (not updated when in bailout mode)
+#DEFINE deco_ceiling					.4			; =1: ceiling depth > 0
+#DEFINE gas_needs_cave					.5			; =1: indicated gas needs are calculated in cave mode
 
-; Bit Flags for status on INTs
-#define int_invalid_flag				.2
-#define int_not_yet_computed			.3
-#define int_is_zero						.3
-#define int_low_flag					.4
-#define int_high_flag					.5
-#define int_attention_flag				.6
-#define int_warning_flag				.7
+; Bit Flags for Status on Variables of Type char
+#DEFINE char_transmitter_lost			.6
+#DEFINE char_invalid_flag				.7
+#DEFINE char_transmitter_low_bat		.7
+
+; Bit Flags for Status on Variables of Type int (Flags are placed in the upper byte)
+#DEFINE int_invalid_flag				.2
+#DEFINE int_not_yet_computed			.3
+#DEFINE int_is_zero						.3
+#DEFINE int_low_flag					.4
+#DEFINE int_not_avail_flag				.4
+#DEFINE int_high_flag					.5
+#DEFINE int_outdated_flag				.5
+#DEFINE int_attention_flag				.6
+#DEFINE int_warning_flag				.7
 
 ;-----------------------------------------------------------------------------
 ; Flags
 
-; Hardware defines
-#DEFINE battery_gauge_available	hardware_flag,0		; =1: OSTC has rechargeable battery with battery management chip
-#DEFINE ambient_sensor			hardware_flag,1		; =1: OSTC has an ambient light sensor
-#DEFINE analog_o2_input			hardware_flag,2		; =1: OSTC has analog inputs and S8 digital
-#DEFINE optical_input			hardware_flag,3		; =1: OSTC has an digital optical input
-#DEFINE ble_available			hardware_flag,4		; =1: OSTC has an BLE module
-#DEFINE ostc_rx_present			hardware_flag,5		; =1: OSTC RX circuity present
-;								hardware_flag,6		; unused
-;								hardware_flag,7		; unused
+; Hardware Descriptor 1
+#DEFINE battery_gauge_available	hardware_flag1,0	; =1: OSTC has rechargeable battery with battery management chip
+#DEFINE ambient_sensor			hardware_flag1,1	; =1: OSTC has an ambient light sensor
+#DEFINE analog_o2_input			hardware_flag1,2	; =1: OSTC has analog inputs and S8 digital
+#DEFINE optical_input			hardware_flag1,3	; =1: OSTC has an digital optical input
+#DEFINE ble_available			hardware_flag1,4	; =1: OSTC has an BLE module
+#DEFINE ostc_rx_present			hardware_flag1,5	; =1: OSTC has RX circuity
+;								hardware_flag1,6	; --- unused
+;								hardware_flag1,7	; --- unused
 
+; Hardware Descriptor 2
+#DEFINE screen_type				hardware_flag2,0	; =1: display 1, =0; display 0
+#DEFINE compass_type			hardware_flag2,1	; =1: compass 1, =0: compass 0
+#DEFINE compass_type2			hardware_flag2,2	; =1: compass 2, =0: compass 0 or 1
+#DEFINE analog_switches			hardware_flag2,3	; =1: analog switches available
+;								hardware_flag2,4	; --- unused
+;								hardware_flag2,5	; --- unused
+;								hardware_flag2,6	; --- unused
+;								hardware_flag2,7	; --- unused
+
+; Control of numerical Output
 #DEFINE leftbind				cvt_flags+0,0
 #DEFINE ignore_digit3			cvt_flags+0,1
 #DEFINE ignore_digit4			cvt_flags+0,2
 #DEFINE ignore_digit5			cvt_flags+0,3
-#DEFINE enable_screen_dumps		cvt_flags+0,4		; =1: Ignore vin_usb, wait for "l" command (Screen dump
-#DEFINE screen_type				cvt_flags+0,5		; =1: display1, =0; display0
-#DEFINE compass_type			cvt_flags+0,6		; =1: compass1, =0: compass0
-#DEFINE analog_switches			cvt_flags+0,7		; =1: Analog switches available
+;								cvt_flags+0,4		; --- unused
+;								cvt_flags+0,5		; --- unused
+;								cvt_flags+0,6		; --- unused
+;								cvt_flags+0,7		; --- unused
 
-#define pre_zero_flag			cvt_flags+1,0
-#define all_zeros_flag			cvt_flags+1,1
-#define DP_done					cvt_flags+1,2
-#define DP_done2				cvt_flags+1,3
-#define show_last3				cvt_flags+1,4
-#define leading_zeros			cvt_flags+1,5
-#define show_last4				cvt_flags+1,6
-#DEFINE compass_type2			cvt_flags+1,7		; =1: Compass2, =0: Compass1 or compass0
-
+#DEFINE pre_zero_flag			cvt_flags+1,0
+#DEFINE all_zeros_flag			cvt_flags+1,1
+#DEFINE DP_done					cvt_flags+1,2
+#DEFINE DP_done2				cvt_flags+1,3
+#DEFINE show_last3				cvt_flags+1,4
+#DEFINE leading_zeros			cvt_flags+1,5
+#DEFINE show_last4				cvt_flags+1,6
+;								cvt_flags+1,7		; --- unused
 
 ; HUD Status Byte
-#DEFINE hud_connection_ok		hud_status_byte,0	; =1 -> HUD connection ok
-;								hud_status_byte,1	; =1 -> HUD is calibrated
-;								hud_status_byte,2	; =1 -> HUD Battery is low (<3000mV)
-#DEFINE sensor1_active			hud_status_byte,3	; =1: Sensor1 is active
-#DEFINE sensor2_active			hud_status_byte,4	; =1: Sensor2 is active
-#DEFINE sensor3_active			hud_status_byte,5	; =1: Sensor3 is active
-;								hud_status_byte,6	; unused in stand-alone HUD
-;								hud_status_byte,7	; unused in stand-alone HUD
+#DEFINE hud_connection_ok		hud_status_byte,0	; =1 HUD connection ok
+;								hud_status_byte,1	; =1 HUD is calibrated
+;								hud_status_byte,2	; =1 HUD battery is low (<3000mV)
+#DEFINE sensor1_active			hud_status_byte,3	; =1: sensor 1 is active
+#DEFINE sensor2_active			hud_status_byte,4	; =1: sensor 2 is active
+#DEFINE sensor3_active			hud_status_byte,5	; =1: sensor 3 is active
+;								hud_status_byte,6	; --- unused in stand-alone HUD
+;								hud_status_byte,7	; --- unused in stand-alone HUD
 
+; General Flags
 #DEFINE switch_left				flag1,0				; =1: left  button was pressed
 #DEFINE switch_right			flag1,1				; =1: right button was pressed
-#DEFINE neg_flag				flag1,2				;     e.g. sub16 (sub_c = sub_a - sub_b)
-#DEFINE pressure_refresh		flag1,3				; =1: A new pressure/temperature is available
-#DEFINE sleepmode				flag1,4				; =1: in Sleepmode
+#DEFINE neg_flag				flag1,2				; =1: result is negative, e.g. by sub16 (sub_c = sub_a - sub_b)
+#DEFINE pressure_refresh		flag1,3				; =1: s new pressure/temperature is available
+#DEFINE sleepmode				flag1,4				; =1: in sleep mode
 #DEFINE tft_is_dimming			flag1,5				; =1: the TFT is dimming, ignore light sensor
 #DEFINE display_velocity		flag1,6				; =1: show velocity
 #DEFINE no_sensor_int			flag1,7				; =1: block any further access to pressure sensor
 
-#DEFINE rs232_receive_overflow	flag2,0				; =1: a RS232 timeout overflow occoured
-#DEFINE stored_gas_changed		flag2,1				; =1: Stored Gas changed
+#DEFINE rs232_receive_overflow	flag2,0				; =1: a RS232 timeout overflow occurred
+#DEFINE stored_gas_changed		flag2,1				; =1: stored Gas changed
 #DEFINE high_altitude_mode		flag2,2				; =1: unit was manually turned on with ambient pressure <880mbar
-#DEFINE FLAG_apnoe_mode			flag2,3				; =1: Apnoe mode selected
+#DEFINE FLAG_apnoe_mode			flag2,3				; =1: apnoe mode selected
 #DEFINE restore_deco_data		flag2,4				; =1: restore deco data (After simulation)
-#DEFINE premenu					flag2,5				; =1: Premenu/Divemenu selected
+#DEFINE premenu					flag2,5				; =1: pre-menu/dive menu selected
 #DEFINE menubit					flag2,6				;     menu
 #DEFINE simulatormode_active	flag2,7				; =1: simulator mode active, override pressure sensor readings
 
-#DEFINE divemode_menu			flag3,0				; =1: divemode menu is shown
-#DEFINE onesecupdate			flag3,1				; =1: after any second
-#DEFINE twosecupdate			flag3,2				; =1: new two-second update
+#DEFINE divemode_menu			flag3,0				; =1: dive mode menu is shown
+#DEFINE onesecupdate			flag3,1				; =1: set any new second
+#DEFINE onesectoggle			flag3,2				;     used for phasing every-2-seconds tasks
 #DEFINE toggle_customview		flag3,3				; =1: next customview
-#DEFINE oneminupdate			flag3,4				; =1: after any minute
-#DEFINE divemode				flag3,5				; =1: in Divemode
-#DEFINE battery_is_36v			flag3,6				; =1: 3,6V Battery is in use
-#DEFINE warning_active			flag3,7				; =1: a warning is active in divemode or surfacemode
+#DEFINE oneminupdate			flag3,4				; =1: set any new minute
+#DEFINE divemode				flag3,5				; =1: in dive mode
+#DEFINE battery_is_36v			flag3,6				; =1: a 3.6 Volt battery is in use
+#DEFINE message_warning			flag3,7				; =1: a warning is active in dive mode or surface mode
 
 #DEFINE better_gas_available	flag4,0				; =1: a better gas is available
 #DEFINE blinking_better_gas		flag4,1				; =1: gas is blinking
-#DEFINE menuview				flag4,2				; =1: a menuview is shown in divemode (e.g. "Menu?")
+#DEFINE menuview				flag4,2				; =1: a menu view is shown in dive mode (e.g. "Menu?")
 #DEFINE quarter_second_update	flag4,3				; =1: a new 1/4 second has begun
 #DEFINE divemode_gaschange		flag4,4				; =1: the gas will change very soon
 #DEFINE decostop_active			flag4,5				; =1: decompression stop shown
-#DEFINE depth_greater_100m		flag4,6				; =1: current depth > 100m
-#DEFINE realdive				flag4,7				; =1: a real dive during divemode
+#DEFINE depth_greater_100m		flag4,6				; =1: current depth > 100 meters
+#DEFINE realdive				flag4,7				; =1: a real dive during dive mode
 
 #DEFINE dive_warning_displayed	flag5,0				; =1: the warning sign is shown
 #DEFINE reset_average_depth		flag5,1				; =1: reset the average depth
 #DEFINE store_sample			flag5,2				; =1: store a new sample
 #DEFINE divemode2				flag5,3				; =1: dive longer than one minute
-#DEFINE FLAG_active_descent		flag5,4				;     used in Apnoe mode
-#DEFINE event_occured			flag5,5				; =1: an event occured, store it!
-#DEFINE divemode_menu_active	flag5,6				; =1: the divemode menu is shown
+#DEFINE FLAG_active_descent		flag5,4				;     used in apnoe mode
+#DEFINE event_occured			flag5,5				; =1: an event occurred, store it!
+#DEFINE divemode_menu_active	flag5,6				; =1: the dive mode menu is shown
 #DEFINE temp_changed			flag5,7				; =1: the temperature changed
 
 #DEFINE gas6_changed			flag6,0				; =1: gas 6 has been selected/changed underwater
@@ -370,112 +431,154 @@
 #DEFINE setpoint_changed		flag6,3				; =1: setpoint has been changed
 #DEFINE second_row_warning		flag6,4				; =1: the second row contains a warning
 #DEFINE FLAG_ccr_mode			flag6,5				; =1: CCR mode (fixed ppO2 or sensor) active
-#DEFINE FLAG_back_to_loop		flag6,6				; =1: a switchback from bailout to loop occured
+#DEFINE FLAG_back_to_loop		flag6,6				; =1: a switchback from bailout to loop occurred
 #DEFINE FLAG_set_marker			flag6,7				; =1: set a marker in the logbook
 
-;								flag7,0				; unused
-#DEFINE no_more_divesecs		flag7,1				; =1: Do no longer show seconds in divemode
-#DEFINE FLAG_gauge_mode			flag7,2				; =1: In Gauge mode
-#DEFINE ignore_last_edited_gas	flag7,3				;     Used in gaslist_cleanup_list
-#DEFINE ccr_diluent_setup		flag7,4				; =1: Setting up Diluents ("Gas6-10")
-#DEFINE space_gas_decriptions	flag7,5				; =1: add a space in front of gas numbers < 9 for alignment
-#DEFINE short_gas_decriptions	flag7,6				; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-#DEFINE max_depth_greater_100m	flag7,7				; =1: Max. Depth > 100m
+#DEFINE better_gas_hint			flag7,0				; =1: mark a gas in yellow when it is a better gas
+#DEFINE no_more_divesecs		flag7,1				; =1: do no longer show seconds in dive mode
+#DEFINE FLAG_gauge_mode			flag7,2				; =1: in Gauge mode
+#DEFINE ignore_last_edited_gas	flag7,3				;     used in gaslist_cleanup_list
+#DEFINE FLAG_diluent_setup		flag7,4				; =1: setting up Diluents ("Gas6-10")
+ IFDEF _rx_functions
+#DEFINE FLAG_pairing_mode		flag7,5				; =1: in transmitter-to-tank pairing menu
+ ENDIF
+#DEFINE short_gas_decriptions	flag7,6				; =1: use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+#DEFINE max_depth_greater_100m	flag7,7				; =1: max. depth > 100 meters
 
-#DEFINE is_bailout				flag8,0				; =1: Bailout
-#DEFINE is_bailout_menu			flag8,1				; =1: Bailout
-#DEFINE toggle_gf				flag8,2				; =1: Toggle GF/aGF
-#DEFINE use_agf					flag8,3				; =1: Use aGF (instead of GF)
-#DEFINE battery_removed_in_usb	flag8,4				; =1: The battery has been removed in USB (probably not used for anything useful)
-#DEFINE adc_running				flag8,5				; =1: The ADC is in use
+#DEFINE FLAG_bailout_mode		flag8,0				; =1: in bailout mode
+#DEFINE is_bailout_menu			flag8,1				; =1: in bailout menu
+#DEFINE toggle_gf				flag8,2				; =1: toggle GF/aGF
+#DEFINE use_agf					flag8,3				; =1: use aGF (instead of GF)
+#DEFINE battery_removed_in_usb	flag8,4				; =1: the battery has been removed in USB (probably not used for anything useful)
+#DEFINE adc_running				flag8,5				; =1: the ADC is in use
 #DEFINE comm_service_enabled	flag8,6				; =1: COMM Service mode unlocked
-#DEFINE compass_enabled			flag8,7				; =1: The compass and accelerometer chip is active
+#DEFINE compass_enabled			flag8,7				; =1: the compass and accelerometer chip is active
 
-#DEFINE compass_fast_mode		flag9,0				; =1: The compass is in fast mode
-#DEFINE in_color_menu			flag9,1				; =1: In the color scheme menu
-#DEFINE bailoutgas_event		flag9,2				; =1: bailout was selected or a gaschange during bailout
-#DEFINE win_invert				flag9,3				; =1: Invert font output
-#DEFINE show_safety_stop		flag9,4				; =1: Show the safety stop
-#DEFINE safety_stop_active		flag9,5				; =1: The safety stop is currently displayed
-#DEFINE new_s8_data_available	flag9,6				; =1: New data frame received
-#DEFINE print_compass_label		flag9,7				; =1: print the graphical comapss label
+#DEFINE compass_fast_mode		flag9,0				; =1: the compass is in fast mode
+#DEFINE in_color_menu			flag9,1				; =1: in the color scheme menu
+#DEFINE bailoutgas_event		flag9,2				; =1: bailout was selected or a gas change during bailout
+#DEFINE win_invert				flag9,3				; =1: invert font output
+#DEFINE show_safety_stop		flag9,4				; =1: show the safety stop
+#DEFINE safety_stop_active		flag9,5				; =1: the safety stop is currently displayed
+#DEFINE new_s8_data_available	flag9,6				; =1: new data frame received
+#DEFINE print_compass_label		flag9,7				; =1: print the graphical compass label
 
-#DEFINE s8_digital				flag10,0			; =1: Digital I/O
-#DEFINE menu_show_sensors2		flag10,1			; =1: Update mV data in calibration menu
-#DEFINE use_O2_sensor1			flag10,2			; =1: Use this sensor
-#DEFINE use_O2_sensor2			flag10,3			; =1: Use this sensor
-#DEFINE use_O2_sensor3			flag10,4			; =1: Use this sensor
-#DEFINE setpoint_fallback		flag10,5			; =1: Fallback to SP1 due to external O2 sensor failure
-#DEFINE blinking_setpoint		flag10,6			; =1: SP is blinking
-#DEFINE flip_screen				flag10,7			; =1: Screen is flipped by 180°
+#DEFINE s8_digital				flag10,0			; =1: digital I/O
+#DEFINE menu_update_sensor_mv	flag10,1			; =1: update mV data in calibration menu
+#DEFINE use_O2_sensor1			flag10,2			; =1: use this sensor
+#DEFINE use_O2_sensor2			flag10,3			; =1: use this sensor
+#DEFINE use_O2_sensor3			flag10,4			; =1: use this sensor
+#DEFINE setpoint_fallback		flag10,5			; =1: fall-back to SP1 due to external O2 sensor failure
+ IFDEF _screendump
+#DEFINE enable_screen_dumps		flag10,6			; =1: ignore vin_usb, wait for "l" command (screen dump)
+ ELSE
+#DEFINE disable_comm_mode		flag10,6			; =1: ignore vin_usb
+ ENDIF
+#DEFINE flip_screen				flag10,7			; =1: screen is flipped by 180°
 
-#DEFINE sensor1_calibrated_ok	flag11,0			; =1: This sensor has been calibrated ok
-#DEFINE sensor2_calibrated_ok	flag11,1			; =1: This sensor has been calibrated ok
-#DEFINE sensor3_calibrated_ok	flag11,2			; =1: This sensor has been calibrated ok
-#DEFINE voting_logic_sensor1	flag11,3			; =1: This sensor is within the voting logic threshold
-#DEFINE voting_logic_sensor2	flag11,4			; =1: This sensor is within the voting logic threshold
-#DEFINE voting_logic_sensor3	flag11,5			; =1: This sensor is within the voting logic threshold
-#DEFINE cc_active				flag11,6			; =1: Constant Current active (cR Hardware)
-#DEFINE cv_active				flag11,7			; =1: Constant Voltage active (cR Hardware)
+; flag11,* are not cleared on (re-)start
+#DEFINE sensor1_calibrated_ok	flag11,0			; =1: this sensor has been calibrated ok
+#DEFINE sensor2_calibrated_ok	flag11,1			; =1: this sensor has been calibrated ok
+#DEFINE sensor3_calibrated_ok	flag11,2			; =1: this sensor has been calibrated ok
+#DEFINE voting_logic_sensor1	flag11,3			; =1: this sensor is within the voting logic threshold
+#DEFINE voting_logic_sensor2	flag11,4			; =1: this sensor is within the voting logic threshold
+#DEFINE voting_logic_sensor3	flag11,5			; =1: this sensor is within the voting logic threshold
+#DEFINE cc_active				flag11,6			; =1: constant current active (cR hardware)
+#DEFINE cv_active				flag11,7			; =1: constant voltage active (cR hardware)
 
-#DEFINE neg_flag_velocity		flag12,0			; neg_flag backup for velocity logic
-#DEFINE compass_bearing_eq		flag12,1			; bearing is in direction? do not show << or >> 
-#DEFINE compass_bearing_lft		flag12,2			; bearing is to the left/<< if set, otherwise to the right/>>
-#DEFINE compass_bearing_vis		flag12,3			; bearing is visible? (either ahead or behind/-180°)
-#DEFINE compass_bearing_ahd		flag12,4			; bearing is ahead or behind?
-#DEFINE blinking_depth_warning	flag12,5			; set by the color_depth. =1: warning color
-#DEFINE blinking_depth_prev		flag12,6			; set by the TFT_depth.   =1: prev display had warning color
-#DEFINE blinking_depth_toggle	flag12,7			; toggle to blink
+#DEFINE neg_flag_velocity		flag12,0			;     neg_flag backup for velocity logic
+#DEFINE compass_bearing_eq		flag12,1			; =1: bearing is in direction, do not show << or >> 
+#DEFINE compass_bearing_lft		flag12,2			; =1: bearing is to the left/<<, =0: to the right/>>
+#DEFINE compass_bearing_vis		flag12,3			; =1: bearing is visible (either ahead or behind/-180°)
+#DEFINE compass_bearing_ahd		flag12,4			; =1: bearing is ahead,   =0: behind
+#DEFINE blinking_depth_warning	flag12,5			; =1: warning color, set by the color_depth
+#DEFINE blinking_depth_prev		flag12,6			; =1: prev display had warning color, set by the TFT_depth
+#DEFINE blinking_depth_toggle	flag12,7			;     toggle controlling blinking
 
-#DEFINE compass_bearing_set		flag13,0			; bearing set
-#DEFINE analog_sw1_pressed		flag13,1			; =1: Analog switch 1 pressed
-#DEFINE analog_sw2_pressed		flag13,2			; =1: Analog switch 2 pressed
-#DEFINE sp2_switched			flag13,3			; =1: This setpoint has been autoselected already
-#DEFINE sp3_switched			flag13,4			; =1: This setpoint has been autoselected already
-#DEFINE sp4_switched			flag13,5			; =1: This setpoint has been autoselected already
-#DEFINE sp5_switched			flag13,6			; =1: This setpoint has been autoselected already
+; flag13,* are not cleared on (re-)start
+#DEFINE compass_bearing_set		flag13,0			; =1: compass bearing is set
+#DEFINE analog_sw1_pressed		flag13,1			; =1: analog switch 1 pressed
+#DEFINE analog_sw2_pressed		flag13,2			; =1: analog switch 2 pressed
+#DEFINE sp2_switched			flag13,3			; =1: this setpoint has been auto-selected already
+#DEFINE sp3_switched			flag13,4			; =1: this setpoint has been auto-selected already
+#DEFINE sp4_switched			flag13,5			; =1: this setpoint has been auto-selected already
+#DEFINE sp5_switched			flag13,6			; =1: this setpoint has been auto-selected already
 #DEFINE use_old_batt_flag		flag13,7			; =1: load old battery information after power-on reset
 
-#DEFINE FLAG_pscr_mode			flag14,0			; =1: OSTC is in PSCR mode
+#DEFINE FLAG_pscr_mode			flag14,0			; =1: OSTC is in pSCR mode
 #DEFINE deep_sleep				flag14,1			; =1: OSTC is in deep sleep (ignore buttons, etc)
 #DEFINE sensors_agree			flag14,2			; =1: the ppO2 of all sensors are within the threshold range
 #DEFINE gas_needs_attention		flag14,3			; =1: the gas needs attention      has been raised before
 #DEFINE gas_needs_warning		flag14,4			; =1: the gas needs warning        has been raised before
 #DEFINE sensor_warning			flag14,5			; =1: the sensors disagree warning has been raised before
-#DEFINE alternative_divelayout	flag14,6			; =1: the alternative divelayout is used (aka Blind Mode)
-#DEFINE i2c_error_flag			flag14,7			; =1: an I2C error occured
+#DEFINE alternative_divelayout	flag14,6			; =1: the alternative dive layout is used (aka "blind mode")
+#DEFINE i2c_error_flag			flag14,7			; =1: an I2C error occurred
+
+#DEFINE better_dil_available	flag15,0			; =1: a better diluent is available
+#DEFINE blinking_better_dil		flag15,1			; =1: diluent is blinking
+#DEFINE FLAG_oc_mode			flag15,2			; =1: OC mode active
+#DEFINE message_attention		flag15,3			; =1: an attention is active in divem ode or surface mode
+#DEFINE message_advice			flag15,4			; =1: an advice    is active in divem ode
+#DEFINE blinking_depth_attention flag15,5			; =1: attention color, set by the color_depth
+#DEFINE aux_flag				flag15,6			;     provided for local boolean storage
+#DEFINE FLAG_tr_enabled			flag15,7			; =1: TR (pressure transmitter) functions enabled
 
-#define aa_antialias			aa_flags,0			; used by aa_wordprocessor
-#define aa_color_quart			aa_flags,1			; used by aa_wordprocessor
-#define aa_color_half			aa_flags,2			; used by aa_wordprocessor
-;								aa_flags,3			; unused
-;								aa_flags,4			; unused
-;								aa_flags,5			; unused
-;								aa_flags,6			; unused
-;								aa_flags,7			; unused
+ IFDEF _cave_mode
+#DEFINE FLAG_cave_mode			flag16,0			; =1: in cave mode
+#DEFINE FLAG_cave_mode_shutdown	flag16,1			; =1: cave mode has shut down due to bracktrack memory full
+#DEFINE FLAG_dive_turned		flag16,2			; =1: dive is turned
+#DEFINE toggle_turn_dive		flag16,3			; =1: toggle dive turned status
+#DEFINE gas_needs_mode_last		flag16,4			; =1: last reported gas needs where computed in cave mode
+ ENDIF
+ IFDEF _rx_functions
+#DEFINE menu_update_tank_pres	flag16,5			; =1: update tank pressure data in menu mode
+ ENDIF
+#DEFINE redraw_custview_mask	flag16,6			; =1: request to redraw the custom view mask
+;								flag16,7			; --- unused
+
+ IFDEF _rx_functions
+#DEFINE transmitter1_lost		flag17,0			; =1: transmitter 1 lost               is an old message
+#DEFINE transmitter1_battery	flag17,1			; =1: transmitter 1 battery low        is an old message
+#DEFINE transmitter1_pres_warn	flag17,2			; =1: transmitter 1 pressure warning   is an old message
+#DEFINE transmitter1_pres_att	flag17,3			; =1: transmitter 1 pressure attention is an old message
+#DEFINE transmitter2_lost		flag17,4			; =1: transmitter 2 lost               is an old message
+#DEFINE transmitter2_battery	flag17,5			; =1: transmitter 2 battery low        is an old message
+#DEFINE transmitter2_pres_warn	flag17,6			; =1: transmitter 2 pressure warning   is an old message
+#DEFINE transmitter2_pres_att	flag17,7			; =1: transmitter 2 pressure attention is an old message
+ ENDIF
+
+; Low-Level Display Control
+#DEFINE aa_antialias			aa_flags,0			;     used by aa_wordprocessor
+#DEFINE aa_color_quart			aa_flags,1			;     used by aa_wordprocessor
+#DEFINE aa_color_half			aa_flags,2			;     used by aa_wordprocessor
+#DEFINE use_custom_colors		aa_flags,3			; =1: override default pixel colors, used by color_image
+;								aa_flags,4			; --- unused
+;								aa_flags,5			; --- unused
+;								aa_flags,6			; --- unused
+;								aa_flags,7			; --- unused
 
 
-; Update flags in divemode, =1: Update the screen
-#DEFINE FLAG_TFT_divemode_mask				tft_update_flags+0,0
-#DEFINE FLAG_TFT_display_ndl_mask			tft_update_flags+0,1
-#DEFINE FLAG_TFT_depth						tft_update_flags+0,2
-#DEFINE FLAG_TFT_divemins					tft_update_flags+0,3
-#DEFINE FLAG_TFT_show_safety_stop			tft_update_flags+0,4
-#DEFINE FLAG_TFT_display_ndl				tft_update_flags+0,5
-#DEFINE FLAG_TFT_display_deko_mask			tft_update_flags+0,6
-#DEFINE FLAG_TFT_display_deko				tft_update_flags+0,7
-#DEFINE FLAG_TFT_display_tts				tft_update_flags+1,0
-#DEFINE FLAG_TFT_temp_divemode				tft_update_flags+1,1
-#DEFINE FLAG_TFT_divemode_warning			tft_update_flags+1,2
-#DEFINE FLAG_TFT_divemode_warning_clear		tft_update_flags+1,3
-#DEFINE FLAG_TFT_active_gas_divemode		tft_update_flags+1,4
-#DEFINE FLAG_TFT_clear_safety_stop			tft_update_flags+1,5
-#DEFINE FLAG_TFT_max_depth					tft_update_flags+1,6
-#DEFINE FLAG_TFT_divemode_mask_alt			tft_update_flags+1,7
-#DEFINE FLAG_TFT_dive_warning_text_clear	tft_update_flags+2,0
-#DEFINE FLAG_TFT_dive_warning_text_clr2		tft_update_flags+2,1
-#DEFINE FLAG_TFT_max_depth_alt				tft_update_flags+2,2
-#DEFINE FLAG_TFT_big_deco_alt				tft_update_flags+2,3
+; Display Update Flags in Dive Mode
+#DEFINE FLAG_TFT_divemode_mask				tft_update_flags+0,0	; =1: update the display
+#DEFINE FLAG_TFT_display_ndl_mask			tft_update_flags+0,1	; =1: update the display
+#DEFINE FLAG_TFT_depth						tft_update_flags+0,2	; =1: update the display
+#DEFINE FLAG_TFT_divemins					tft_update_flags+0,3	; =1: update the display
+#DEFINE FLAG_TFT_show_safety_stop			tft_update_flags+0,4	; =1: update the display
+#DEFINE FLAG_TFT_display_ndl				tft_update_flags+0,5	; =1: update the display
+#DEFINE FLAG_TFT_display_deko_mask			tft_update_flags+0,6	; =1: update the display
+#DEFINE FLAG_TFT_display_deko				tft_update_flags+0,7	; =1: update the display
+#DEFINE FLAG_TFT_display_tts				tft_update_flags+1,0	; =1: update the display
+#DEFINE FLAG_TFT_temp_divemode				tft_update_flags+1,1	; =1: update the display
+#DEFINE FLAG_TFT_divemode_warning			tft_update_flags+1,2	; =1: update the display
+#DEFINE FLAG_TFT_divemode_warning_clear		tft_update_flags+1,3	; =1: update the display
+#DEFINE FLAG_TFT_active_gas_divemode		tft_update_flags+1,4	; =1: update the display
+#DEFINE FLAG_TFT_clear_safety_stop			tft_update_flags+1,5	; =1: update the display
+#DEFINE FLAG_TFT_max_depth					tft_update_flags+1,6	; =1: update the display
+#DEFINE FLAG_TFT_divemode_mask_alt			tft_update_flags+1,7	; =1: update the display
+#DEFINE FLAG_TFT_dive_warning_text_clear	tft_update_flags+2,0	; =1: update the display
+#DEFINE FLAG_TFT_dive_warning_text_clr2		tft_update_flags+2,1	; =1: update the display
+#DEFINE FLAG_TFT_big_deco_alt				tft_update_flags+2,2	; =1: update the display
+#DEFINE FLAG_TFT_display_ndl_or_deko		tft_update_flags+2,3	; =1: update the display
 ;											tft_update_flags+2,4	; unused
 ;											tft_update_flags+2,5	; unused
 ;											tft_update_flags+2,6	; unused
@@ -485,18 +588,18 @@
 ;---------------------------- Macros ------------------------------------
 
 TSTOSS	macro opt_reg		; TeST Option Skip if not Zero
-	movff	opt_reg,WREG
-	tstfsz	WREG,A
-	bra		$+4
-	endm
+	movff	opt_reg,WREG	; Attention: destroys WREG!
+	tstfsz	WREG,A			; Attention: the following command must be a
+	bra		$+4				;            plain machine command, do not let
+	endm					;            follow a macro!
 
-;---------------------------- C-code Routines ----------------------------
+;---------------------------- C-Code Routines ----------------------------
 
 	extern	deco_calc_desaturation_time
 	extern	deco_calc_hauptroutine
+	extern	deco_calc_dive_interval
 	extern	deco_calc_dive_interval_1min
 	extern	deco_calc_dive_interval_10min
-	extern	deco_calc_dive_interval
 	extern	deco_clear_tissue
 	extern	deco_pull_tissues_from_vault
 	extern	deco_push_tissues_to_vault
@@ -504,20 +607,21 @@
 
 ;---------------------------- Bank0 DATA ------------------------------------
 isr_backup	equ			0x60
-isr_backup	udata_ovr	isr_backup			; Reserved space for interupt data
- 
-;---- Backup for general registers
+isr_backup	udata_ovr	isr_backup			; reserved space for interrupt data
+
+
+;---- Backup for general Registers
 isr_prod						res 2
 
-;---- MS5541 subroutines
+;---- MS5541 Subroutines
 amb_pressure					res 2
 temperature						res 2
 
-C1								res 2		; Decoded calibration data
+C1								res 2		; decoded calibration data
 C2								res 2
 C3								res 2
-C4								res 2		; Here: C4-250
-C5								res 2		; Here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760)
+C4								res 2		; here: C4-250
+C5								res 2		; here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760)
 C6								res 2
 D1								res 2		; raw pressure
 D2								res 2		; raw temperature
@@ -525,16 +629,16 @@
 xdT2							res 2
 OFF								res 2
 SENS							res 2
-dLSB							res 1		; Pressure sensor interface 
+dLSB							res 1		; pressure sensor interface 
 dMSB							res 1
 clock_count						res 1
-sensor_state_counter			res 1		; counts to eight for state maschine
+sensor_state_counter			res 1		; counts to eight for state machine
 amb_pressure_avg				res 2
 temperature_avg					res 2
 minimum_temperature				res 2		; minimum temperature
 last_temperature				res 2
 last_pressure					res 2
-last_pressure_velocity			res 2		; For velocity
+last_pressure_velocity			res 2		; for velocity
 last_surfpressure				res 2
 last_surfpressure_15min			res 2
 last_surfpressure_30min			res 2
@@ -544,27 +648,27 @@
 avg_rel_pressure				res 2
 avg_rel_pressure_total			res 2
 
-;---- Data for ISR math subroutines
+;---- Data for ISR Math Subroutines
 isr_xC							res 4
 isr_xA							res 2
 isr_xB							res 2
 
-;---- Data for ISR routines
+;---- Data for ISR Routines
 isr1_temp						res 1		; ISR temp variable, used in ms5541.asm, isr_rtcc, isr_battery_gauge
 isr2_temp						res 1		; ISR temp variable, used isr_battery_gauge
 
-;---- Display brightness
-max_CCPR1L						res 1		; Max. brightness value for CCPR1L
+;---- Display Brightness
+max_CCPR1L						res 1		; max. brightness value for CCPR1L
 
-; Battery gauge (nAs, nC)
-battery_gauge					res 6		; 48Bit -> 78Ah max...
+;---- Battery Gauge (nAs, nC)
+battery_gauge					res 6		; 48 bit -> 78 Ah max
 
-; IR/S8-Link
+;---- IR/S8-Link
 ir_s8_buffer					res .18		; temporally used in get_calibration_data for the raw (packed) calibration data
 ir_s8_counter					res 1
-ir_s8_timeout					res 1		; Timeout for valid data
+ir_s8_timeout					res 1		; timeout for valid data
 
-; Compass raw data
+;---- Compass raw Data
 compass_DX						res 2
 compass_DY						res 2
 compass_DZ						res 2
@@ -573,7 +677,7 @@
 accel_DY						res 2
 accel_DZ						res 2
 
-; Compass FILTERED data
+;---- Compass filtered Data
 compass_DX_f					res 2
 compass_DY_f					res 2
 compass_DZ_f					res 2
@@ -582,28 +686,29 @@
 accel_DY_f						res 2
 accel_DZ_f						res 2
 
-; Compass calibration data
+;---- Compass Calibration Data
 compass_CX_f					res 2
 compass_CY_f					res 2
 compass_CZ_f					res 2
 
-; Compass more data
-compass_heading					res 2		; Corrected heading (in 1°) : -180 .. 180
-compass_heading_old				res 2		; Old heading (For smoother display)
-compass_heading_shown			res 2		; Displayed heading
-;compass_roll					res 2		; Rotation around the X axis
-;compass_pitch					res 2		; Rotation around the Y axis
-
-compass_a						res 2		; Tmp data for Q15 arithmetics
+;---- Compass more Data
+compass_heading					res 2		; corrected heading (in 1°) : -180 .. 180
+compass_heading_old				res 2		; old heading (For smoother display)
+compass_heading_shown			res 2		; displayed heading
+;compass_roll					res 2		; rotation around the X axis
+;compass_pitch					res 2		; rotation around the Y axis
+compass_a						res 2		; tmp data for Q15 arithmetics
 compass_b						res 2
 compass_r						res 3
 
+;---- Data for Logging
 CNS_start						res 2		; CNS value at beginning of dive
-GF_start						res 1		; GF value at beginning of dive
+GF_start						res 1		; GF  value at beginning of dive
 
-speed_setting					res 1		; =1: Eco, =2: Normal, =3: Fastest
+;---- CPU mode
+speed_setting					res 1		; =1: eco, =2: normal, =3: fastest
 
-;---- Data for graphical compass
+;---- Data for graphical Compass
 xRD								res 2		; virtual compass ruler offset
 xRDr							res 2		; virtual compass ruler offset - right end
 xRD180							res 2		; virtual compass ruler offset for the -180 marker
@@ -640,15 +745,21 @@
 flag12							res 1
 flag13							res 1
 flag14							res 1
-hardware_flag					res 1		; hardware descriptor flag
+flag15							res 1
+flag16							res 1
+flag17							res 1
+hardware_flag1					res 1		; hardware descriptor flags 1
+hardware_flag2					res 1		; hardware descriptor flags 2
 tft_update_flags				res 3
 
 ;---- Interface to Data Conversion &
 ;---- Output Functions, as well as
 ;---- General-Purpose Temp Storage
-lo								res 1
-hi								res 1
-up								res 1
+lo								res 1		; nickname for "low"    | Attention: do not change the
+hi								res 1		; nickname for "high"   | relative positioning of these
+up								res 1		; nickname for "upper"  | variables, lo will also be used
+ex								res 1		; nickname for "extra"  | as base address for a 8, 16 and
+ul								res 1		; nickname for "ultra"  | 32 bit buffer
 ignore_digits					res 1
 
 ;---- Interface to Graphic Functions
@@ -663,31 +774,38 @@
 
 ;---- Interface to Math Functions
 divA							res 2
-divB							res 1
 xC								res 4
 xA								res 2
 xB								res 2
 sub_c							res 2
 sub_a							res 2
 sub_b							res 2
+math_loop						res 1		; internal variable used for loops
 
 ;---- Misc.
 timeout_counter1				res 2		; timeout for dive operations
 timeout_counter2				res 1		; timeout for menu operations
 batt_voltage					res 2		; battery voltage in mV
 batt_percent					res 1		; battery in percent (1-100)
-warning_counter					res 1		; counts amount of warning in divemode
-warning_page					res 1		; current # of warning page
+message_counter					res 1		; counts amount of messages
+message_page					res 1		; current # of message page
+pairing_slot					res 1		; slot number, used in transmitter pairing
+
 
 ;---- Dive Mode / General
 divemins						res 2
 divesecs						res 1
 total_divetime_seconds			res 2
-average_divesecs				res 2		; for the resettable stopwatch
+average_divesecs				res 2		; time accumulator for the resettable stopwatch / average depth
+average_divesecs_total			res 2		; time accumulator for the total average depth
+curr_depth						res 1		; current depth in meters
+amb_press_10					res 2		; ambient pressure divided by 10
 safety_stop_countdown			res 1		; counts seconds of safety stop
 gaslist_gas						res 1		; used for transfer between gaslist.asm and menu_tree.asm
-active_gas						res 1		; the currently breathed gas (1-5)
-;active_gas_type				res 1		; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents	
+best_gas_number					res 1		; number of the "best gas": 0= none found, 1-5= gases 1-5, 255= not computed
+best_dil_number					res 1		; number of the "best dil": 0= none found, 1-5= dils  1-5, 255= not computed
+active_gas						res 1		; the currently used OC/bailout gas (1-5)
+active_dil						res 1		; the currently used diluent (1-5)
 
 ;---- Dive Mode / Apnoe
 apnoe_surface_mins				res 1
@@ -715,13 +833,13 @@
 o2_mv_sensor1					res 2		; in 0.1mV steps
 o2_mv_sensor2					res 2		; in 0.1mV steps
 o2_mv_sensor3					res 2		; in 0.1mV steps
-o2_ppo2_sensor1					res 1		; Sensor1 ppO2 (in 0.01bar steps)
-o2_ppo2_sensor2					res 1		; Sensor2 ppO2 (in 0.01bar steps)
-o2_ppo2_sensor3					res 1		; Sensor3 ppO2 (in 0.01bar steps)
+o2_ppo2_sensor1					res 1		; sensor 1 ppO2 (in 0.01 bar steps)
+o2_ppo2_sensor2					res 1		; sensor 2 ppO2 (in 0.01 bar steps)
+o2_ppo2_sensor3					res 1		; sensor 3 ppO2 (in 0.01 bar steps)
 hud_status_byte					res 1
 
 
-;========================= privte Variables ===================================
+;========================= private Variables ===================================
 ;        do not access from outside of the respective source files!
 
 ;---- aa_wordprocessor.asm
@@ -760,10 +878,10 @@
 i2c_temp2						res 1		; temporary data
 
 ;---- menu_processor.asm
-menupos1						res 1		; logbook and divemode menu
+menupos1						res 1		; logbook and dive mode menu
 menupos2						res 1		; used for dive mode simulator and pre-menu
-menupos3						res 1		; used for Customviews
-menupos4						res 1		; used for divemode menu
+menupos3						res 1		; used for custom views
+menupos4						res 1		; used for dive mode menu
 menu_flags						res 1		; flags for menu entries
 menu_item						res 1		; index of the current item
 start_item						res 1		; index of the first item (scrolling)
@@ -792,19 +910,23 @@
 save_height						res 1
 save_left						res 1
 save_width						res 1
-ds_line							res 1		; current line (0..239)
-ds_column						res 1		; current columnx2 (0..159)
-ds_pixel						res 2		; current pixel color
-ds_count						res 1		; repetition count
 tft_temp1						res 1
 tft_temp2						res 1
 tft_temp3						res 1
 tft_temp4						res 1
 
+ IFDEF _screendump
+;---- Screendump Function
+ds_line							res 1		; current line (0..239)     (dump screen function)
+ds_column						res 1		; current columnx2 (0..159) (dump screen function)
+ds_pixel						res 2		; current pixel color       (dump screen function)
+ds_count						res 1		; repetition count          (dump screen function)
+ ENDIF
+
 ;---- wait.asm
 wait_counter					res 1
 
-; ==> 187 bytes used - 21 bytes free
+; ==> 202 bytes used - 6 bytes free
 
 
 ;============================ LOCAL DATA ======================================
@@ -818,7 +940,7 @@
 ;	sleepmode		sleepmode.asm		(unused)			(unused)
 ;	surfmode		surfmode.asm*		(unused)			(unused)
 ;	simulator		simulator.asm		(unused)			(unused)
-;	divemode		divemode.asm		ghostwriter.asm		(unused)
+;	divemode		divemode.asm		divemode.asm		ghostwriter.asm
 ;	logbook			logboock.asm		logbook.asm			logbook.asm
 ;
 ; * assigned to this slot, but currently no local memory used
@@ -840,26 +962,24 @@
 common2		equ			0xA00	; Alias for "banksel common2"
 common2		udata_ovr	common2	; Bank 10 general variables
 
-s8_rawdata_sensor1				res 3		; 24bit A/D raw data from S8 HUD sensor 1
-s8_rawdata_sensor2				res 3		; 24bit A/D raw data from S8 HUD sensor 2
-s8_rawdata_sensor3				res 3		; 24bit A/D raw data from S8 HUD sensor 3
+s8_rawdata_sensor1				res 3		; 24 bit A/D raw data from S8 HUD sensor 1
+s8_rawdata_sensor2				res 3		; 24 bit A/D raw data from S8 HUD sensor 2
+s8_rawdata_sensor3				res 3		; 24 bit A/D raw data from S8 HUD sensor 3
 hud_battery_mv					res 2		; hud/ppo2 monitor battery voltage in mV
 
-start_day						res 1		; At start of dive (For logbook)
-start_month						res 1		; At start of dive (For logbook)
-start_year						res 1		; At start of dive (For logbook)
-start_hours						res 1		; At start of dive (For logbook)
-start_mins						res 1		; At start of dive (For logbook)
+start_year						res 1		; at start of dive (for logbook)          | ATTENTION: do not change the position of these
+start_month						res 1		; at start of dive (for logbook)          |            variables relative to each other!
+start_day						res 1		; at start of dive (for logbook)          |
+start_hours						res 1		; at start of dive (for logbook)          |
+start_mins						res 1		; at start of dive (for logbook)          |
 
-opt_gas_type_backup				res 5		; 0=Disabled, 1=First, 2=Travel, 3=Deco			* need to be in same bank
-opt_dil_type_backup				res 5		; 0=Disabled, 1=First, 2=Normal					+ need to be in same bank
-opt_OC_bail_gas_change_backup	res 5		; Gas change depths OC/Bailout					*
-opt_dil_change_backup			res 5		; Gas change depths Diluents					+
+opt_gas_type_backup				res 5		; 0=Disabled, 1=First, 2=Travel, 3=Deco   | ATTENTION: do not change the position of these
+opt_dil_type_backup				res 5		; 0=Disabled, 1=First, 2=Normal           |            arrays relative to each other!
 
 internal_battery_capacity		res 2		; For internal battery gauging
 battery_capacity				res 2		; For battery gauge IC
 battery_offset					res 2		; For battery gauge IC
-battery_type					res 1		; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah
+battery_type					res 1		; =0:1.5V, =1:3.6V Saft, =2:LiIon 3.7V/0.8Ah, =3:LiIon 3.7V/3.1Ah, =4: LiIon 3.7V/2.3Ah
 battery_acumulated_charge		res 2		; Raw values in battery gauge IC
 gauge_status_byte				res 1		; Gauge IC status byte
 
@@ -868,22 +988,18 @@
 analog_counter					res 1		; for averaging
 analog_sw1						res 1		; analog value for switch 1
 analog_sw2						res 1		; analog value for switch 2
-button_polarity					res 1		; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only)
+button_polarity					res 1		; 0xFF (both normal), 0x00 (both inverted), 0x01 (left inverted only), 0x02 (right inverted only)
 
 uptime							res 4		; Uptime [s]
 lastdive_time					res 4		; Time since last dive [s]
 lastdive_duration				res 3		; mins:2 and secs
 lastdive_maxdepth				res 2		; in mbar
 
-rx_buffer						res .48		; Buffer for RX data (Slots 0-7)
-rx_firmware						res 2		; The RX firmware version xx.yy
-
 customview_surfmode				res 1		; storage to remember last selected custom view in surface mode
 customview_divemode				res 1		; storage to remember last selected custom view in dive mode
 
 ambient_light					res 2		; ambient_light level
-better_gas_number				res 1		; number (1-5) of the "better gas" in divemode, =0: no better gas available
-old_velocity					res 4		; Stores the last 4 speeds (8 seconds) in m/min
+old_velocity					res 4		; stores the last 4 speeds (8 seconds) in m/min
 
 menustack						res 5		; menu stack from menu_processor.asm
 
@@ -891,44 +1007,64 @@
 gas6_He_ratio					res 1		; gas6 He ratio
 gas6_temp						res 1		; temp used in divemenu_tree.asm
 
-; ==> 134 bytes used - 122 bytes free
+ IFDEF _rx_functions
+; Data exchange
+rx_buffer						res .48		; Buffer for RX data (slots 0-7)
+rx_firmware						res 2		; RX firmware version xx.yy
+
+; Variables for SAC Calculation on Pressure Readings 1 & 2
+pres_accu_1st					res 4		; accumulator for pressure drop    in 1/160 bar  | ATTENTION: do not
+pres_accu_2nd					res 4		; accumulator for pressure drop    in 1/160 bar  |            change the
+time_accu_1st					res 1		; accumulator for reading ages     in seconds    |            position
+gas__last_1st					res 1		; last gas assignment                            |            of these
+time_accu_2nd					res 1		; accumulator for reading ages     in seconds    |            variables
+gas__last_2nd					res 1		; last gas assignment                            |            relative
+pres_last_1st					res 2		; last pressure reading pressure   in 1/160 bar  |            to each
+pres_last_2nd					res 2		; last pressure reading pressure   in 1/160 bar  |            other!
+time_last_1st					res 2		; last pressure reading time       in seconds    |
+time_last_2nd					res 2		; last pressure reading time       in seconds    |
+ ENDIF
+
+; ==> 138 bytes used - 118 bytes free
 
 
-;---------------------------- Bank 2 general purpose buffer -------------------
+;----------------------- Bank 2 General Purpose Buffer -------------------------
 ; Reserved for general purpose buffer (strings, images, etc).
 ; NOTE: Needs to be aligned with a bank (LOW(buffer)==0).
 
 buffer		udata_ovr	0x200
 
-buffer							res	.256
+buffer							res	.256	; used for string assembly / display output
 
 
-;---------------------------- Bank 14 for options table -----------------------
+;---------------------- Bank 14 Options Table ---------------------------------
 opt_table	equ			0xE00
 opt_table	udata_ovr	opt_table
 
 ;---- Dive Options
-opt_gas_O2_ratio				res 5		; Needed because deco gaslist use N2
-opt_dil_O2_ratio				res 5		; Must be in line with opt_gas_O2_ratio
-opt_gas_He_ratio				res 5		; He ratio Gas1-5
-opt_dil_He_ratio				res 5		; Must be in line with opt_gas_He_ratio
-opt_gas_type					res 5		; 0=Disabled, 1=First, 2=Travel, 3=Deco
-opt_dil_type					res 5		; 0=Disabled, 1=First, 2=Normal ; Must be in line with opt_gas_type
-opt_dive_mode					res 1		; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
-opt_ccr_mode					res 1		; =0: Fixed SP, =1: Sensor
-opt_OC_bail_gas_change			res 5		; Gas change depths OC/Bailout
+opt_gas_O2_ratio				res 5		; O2 ratios of OC/bailout gases                              | ATTENTION:
+opt_dil_O2_ratio				res 5		; O2 ratios of diluents                                      | keep relative
+opt_gas_He_ratio				res 5		; He ratios of OC/bailout gases                              | positioning of
+opt_dil_He_ratio				res 5		; He ratios of diluents                                      | all arrays in
+opt_gas_type					res 5		; OC/bailout gas type: O=Disabled, 1=First, 2=Travel, 3=Deco | this block!
+opt_dil_type					res 5		;            dil type: 0=Disabled, 1=First, 2=Normal         |
+opt_gas_change					res 5		; change depths for OC/Bailout gases                         |
+opt_dil_change					res 5		; change depths for diluents                                 |
+
+opt_dive_mode					res 1		; main dive/deco mode: =0: OC, =1: CC, =2: Gauge, =3: Apnea, =4: pSCR
+opt_ccr_mode					res 1		; CCR/pSCR sub   mode: =0: fixed/calculated SP, =1: sensor, =2: auto SP
 
 ;---- Managing Settings
 opt_brightness					res 1		; =0: Eco, =1:Medium, =2:Full
 opt_salinity					res 1		; 0-5%
-#DEFINE opt_name_length			.60			; Custom text string 5 rows with 12 chars
+#DEFINE opt_name_length			.60			; custom text string 5 rows with 12 chars
 opt_name						res opt_name_length
-opt_language					res 1		; Current language. 0=EN, 1=DE, 2=FR, 3=SP
+opt_language					res 1		; current language: 0=EN, 1=DE, 2=FR, 3=SP
 opt_units						res 1		; 0:m/°C, 1:ft/°F
 opt_dateformat					res 1		; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
 opt_last_stop					res 1		; =3:3m, =4:4m, =5:5m, =6:6m
-opt_aGF_high					res 1		; Alternative GF HIGH
-opt_aGF_low						res 1		; Alternative GF LOW
+opt_aGF_high					res 1		; alternative GF HIGH
+opt_aGF_low						res 1		; alternative GF LOW
 opt_GF_high						res 1		; GF HIGH
 opt_GF_low						res 1		; GF LOW
 opt_enable_aGF					res 1		; =1: aGF can be selected underwater
@@ -936,16 +1072,16 @@
 opt_sampling_rate				res 1		; =1: 10s, =0: 2s
 opt_dive_color_scheme			res 1		; 0-3
 opt_pressure_adjust				res 1		; SIGNED char (two's complement), -20/+20mbar max.
-opt_enable_safetystop			res 1		; =1: A safety stop is shown
+opt_enable_safetystop			res 1		; =1: a safety stop is shown
 opt_calibration_O2_ratio		res 1		; %O2 of calibration gas
-opt_x_s1						res	2		; calibration factor (Not stored in EEPROM)
-opt_x_s2						res	2		; calibration factor (Not stored in EEPROM)
-opt_x_s3						res	2		; calibration factor (Not stored in EEPROM)
+opt_x_s1						res 2		; calibration factor (Not stored in EEPROM)
+opt_x_s2						res 2		; calibration factor (Not stored in EEPROM)
+opt_x_s3						res 2		; calibration factor (Not stored in EEPROM)
 opt_sensor_fallback				res 1		; NOT USED ANY MORE, KEPT FOR COMPATIBILITY WITH EEPROM IMAGE
-opt_flip_screen					res 1		; =1: Flip the screen
-opt_cR_button_left				res 1		; Left button sensitivity (cR hardware)
-opt_cR_button_right				res 1		; Right button sensitivity (cR hardware)
-opt_modwarning					res 1		; =1:do a red blinking warning, =0:default behaviour
+opt_flip_screen					res 1		; =1: flip the screen
+opt_cR_button_left				res 1		; left button sensitivity (cR hardware)
+opt_cR_button_right				res 1		; right button sensitivity (cR hardware)
+opt_modwarning					res 1		; =1:do a red blinking warning, =0:default behavior
 opt_vsitextv2					res 1		; =1:use the depth dependent ascend rate limits
 opt_vsigraph					res 1		; =1:draw the graphical VSI bar
 opt_showppo2					res 1		; =1:always show the ppO2 value in the warning position
@@ -954,7 +1090,7 @@
 opt_safety_stop_start			res 1		; [cbar]
 opt_safety_stop_end				res 1		; [cbar]
 opt_safety_stop_reset			res 1		; [cbar]
-opt_diveTimeout					res 1		; Timeout for Divemode [min]
+opt_diveTimeout					res 1		; timeout for dive mode [min]
 opt_sim_setpoint_number			res 1		; setpoint to use for deco calculation
 opt_calc_asc_gasvolume			res 1		; calculate OC gas volume needs for ascent
 opt_sim_use_aGF					res 1		; =0: use GF, =1: use aGF for deco calculation
@@ -963,5 +1099,26 @@
 opt_desat_multiplier_gf			res 1		; Buhlmann safety factor for GF deco
 opt_sat_multiplier_non_gf		res 1		; Buhlmann safety factor for NON-GF deco
 opt_desat_multiplier_non_gf		res 1		; Buhlmann safety factor for NON-GF deco
+opt_ZfactorUse					res 1		; =1: figure in compression factor Z when converting gas volume <-> gas pressure
+opt_ZfactorTemp					res 1		; temperature setpoint for compression factor Z
+opt_2ndDepthDisp				res 1		; =1: show average depth instead of max depth
+
+; RX functions - no conditional compilation because used in options_table
+opt_transmitter_id_1			res 2		; 16 bit transmitter ID for Gas 1
+opt_transmitter_id_2			res 2		; 16 bit transmitter ID for Gas 2
+opt_transmitter_id_3			res 2		; 16 bit transmitter ID for Gas 3
+opt_transmitter_id_4			res 2		; 16 bit transmitter ID for Gas 4
+opt_transmitter_id_5			res 2		; 16 bit transmitter ID for Gas 5
+opt_transmitter_id_6			res 2		; 16 bit transmitter ID for Dil 1
+opt_transmitter_id_7			res 2		; 16 bit transmitter ID for Dil 2
+opt_transmitter_id_8			res 2		; 16 bit transmitter ID for Dil 3
+opt_transmitter_id_9			res 2		; 16 bit transmitter ID for Dil 4
+opt_transmitter_id_10			res 2		; 16 bit transmitter ID for Dil 5
+opt_TR_mode						res 1		; TR functions - mode
+opt_TR_1st_pres					res 1		; TR functions - 1st pressure assignment
+opt_TR_2nd_pres					res 1		; TR functions - 2nd pressure assignment
+opt_TR_Bail_pres				res 1		; TR functions - bailout pressure assignment
+
+; ==> 173 bytes used - 85 bytes free
 
 ;-----------------------------------------------------------------------------
--- a/src/i2c.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/i2c.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File i2c.asm														V2.98
+;   File i2c.asm														V2.99c
 ;
 ;   I2C Interface
 ;
@@ -69,24 +69,24 @@
 	bsf		i2c_error_flag				; set error flag
 	return
 
-I2CReset:								; Something went wrong (Slave holds SDA low?)
+I2CReset:								; something went wrong (slave holds SDA low?)
 	clrf	SSP1CON1					; wake-up slave and reset entire module
 	clrf	SSP1CON2
 	clrf	SSP1STAT
 	bcf		TRISC,3						; SCL OUTPUT
-	bsf		TRISC,4						; SDA Input
+	bsf		TRISC,4						; SDA input
 	bcf		PORTC,3
 	movlw	d'9'
 	movwf	i2c_temp1					; clock-out 9 clock cycles manually
 I2CReset_1:
-	bsf		PORTC,3						; SCL=1
+	bsf		PORTC,3						; SCL = 1
 	nop
 	nop
 	nop
 	nop
-	btfsc	PORTC,4						; SDA=1?
-	bra		I2CReset_2					; =1, SDA has been released from slave
-	bcf		PORTC,3						; SCL=0
+	btfsc	PORTC,4						; SDA = 1 ?
+	bra		I2CReset_2					; YES - =1, SDA has been released from slave
+	bcf		PORTC,3						; NO  - set SCL = 0
 	nop
 	nop
 	bcf		PORTC,3
@@ -96,8 +96,8 @@
 	bra		I2CReset_1					; check for nine clock cycles
 I2CReset_2:
 	bsf		TRISC,3						; SCL Input
-	clrf	SSP1CON1					; setup I²C Mode
-	WAITMS	d'10'						; Reset-Timeout for I2C devices
+	clrf	SSP1CON1					; setup I²C mode
+	WAITMS	d'10'						; reset-timeout for I2C devices
 	movlw	b'00000000'					; with slew rate control
 	movwf	SSP1STAT
 	movlw	b'00101000'
@@ -111,32 +111,32 @@
 I2C_TX:
 	movwf	SSP1BUF
 	rcall	WaitMSSP
-	bra		I2C_WaitforACK				; Returns...
+	bra		I2C_WaitforACK				; returns...
 
-I2C_TwoBytesRX_div16:					; Get two bytes and divide lo:hi/16 (signed)
-	rcall	I2C_OneByteRX				; Get one byte
-	movff	SSP1BUF,hi					; Data Byte
-	rcall	I2C_OneByteRX				; Get one byte
-	movff	SSP1BUF,lo					; Data Byte
+I2C_TwoBytesRX_div16:					; get two bytes and divide lo:hi/16 (signed)
+	rcall	I2C_OneByteRX				; get one byte
+	movff	SSP1BUF,hi					; data byte
+	rcall	I2C_OneByteRX				; get one byte
+	movff	SSP1BUF,lo					; data byte
 I2C_TwoBytesRX_div16_2:					; divide lo:hi/16 (signed) only
 	bcf		STATUS,C
-	btfsc	hi,7						; Copy sign bit to carry
+	btfsc	hi,7						; copy sign bit to carry
 	bsf		STATUS,C
 	rrcf	hi							; /2
 	rrcf	lo
 I2C_TwoBytesRX_div8_2:					; divide lo:hi/8 (signed) only
 	bcf		STATUS,C
-	btfsc	hi,7						; Copy sign bit to carry
+	btfsc	hi,7						; copy sign bit to carry
 	bsf		STATUS,C
 	rrcf	hi							; /4
 	rrcf	lo
 	bcf		STATUS,C
-	btfsc	hi,7						; Copy sign bit to carry
+	btfsc	hi,7						; copy sign bit to carry
 	bsf		STATUS,C
 	rrcf	hi							; /8
 	rrcf	lo
 	bcf		STATUS,C
-	btfsc	hi,7						; Copy sign bit to carry
+	btfsc	hi,7						; copy sign bit to carry
 	bsf		STATUS,C
 	rrcf	hi							; /16
 	rrcf	lo
@@ -144,46 +144,46 @@
 
 	global	I2C_RX_accelerometer
 I2C_RX_accelerometer:
-	btfsc	compass_type2					; compass2
-	bra		I2C_RX_accelerometer_compass2	; yes
-	btfsc	compass_type					; compass1?
-	bra		I2C_RX_accelerometer_compass1	; yes
+	btfsc	compass_type2					; compass2 ?
+	bra		I2C_RX_accelerometer_compass2	; YES
+	btfsc	compass_type					; compass1 ?
+	bra		I2C_RX_accelerometer_compass1	; YES
 I2C_RX_accelerometer_compass0:
-	bsf		SSP1CON2,SEN				; Start condition
+	bsf		SSP1CON2,SEN				; start condition
 	rcall	WaitMSSP
 	movlw	0x38						; address
 	rcall	I2C_TX
 	movlw	0x00
 	rcall	I2C_TX
-	bsf		SSP1CON2,RSEN				; Repeated start condition (!)
+	bsf		SSP1CON2,RSEN				; repeated start condition
 	rcall	WaitMSSP
 	movlw	0x39						; address
 	rcall	I2C_TX
 
-	rcall	I2C_OneByteRX				; Get Status Byte
+	rcall	I2C_OneByteRX				; get status byte
 	movf	SSP1BUF,W
 
 	; Non-flipped screen:
 	; Chip orientation on the PCB requires
-	; Original = Corrected
+	; Original = corrected
 	; x = -x
 	; y = -y
 	; z = -z
 
 	; Flipped screen:
 	; Chip orientation on the PCB requires
-	; Original = Corrected
+	; Original = corrected
 	; x = x
 	; y = y
 	; z = -z
 
-	rcall	I2C_TwoBytesRX_div16		; Get two bytes and divide /16 (signed)
+	rcall	I2C_TwoBytesRX_div16		; get two bytes and divide /16 (signed)
 	btfsc	flip_screen					; 180° rotation ?
-	bra		I2C_RX_accelerometer2		; Yes
-	comf	hi							; 16bit sign change.
+	bra		I2C_RX_accelerometer2		; YES
+	comf	hi							; 16 bit sign change
 	negf	lo
-	btfsc	STATUS,C					; Carry to propagate ?
-	incf	hi,F						; YES: do it.
+	btfsc	STATUS,C					; carry to propagate ?
+	incf	hi,F						; YES - do it
 I2C_RX_accelerometer2:
 	movff	lo,accel_DX+0
 	movff	hi,accel_DX+1				; Copy result
@@ -983,7 +983,7 @@
 	movff	sub_c+1,xA+1
 	movff	battery_capacity+0,xB+0
 	movff	battery_capacity+1,xB+1
-	call	div16x16					; xA/xB=xC with xA+0 as remainder, uses divB as temp variable
+	call	div16x16					; xC = xA / xB with xA as remainder
 	movff	xC+0,batt_percent
 	return
 
@@ -1036,15 +1036,23 @@
 	bra		WaitMSSP					; (and return)
 
 
+;-----------------------------------------------------------------------------
+; Transmitter Functions
+
+ IFDEF _rx_functions
+
 	global	I2C_probe_OSTC_rx
 I2C_probe_OSTC_rx:
+	movlw	.5
+	movwf	lo_temp
+I2C_probe_OSTC_rx_1:
 	bsf		SSP1CON2,SEN				; Start condition
 	rcall	WaitMSSP
 	movlw	0x50						; Address byte + Write bit
 	movwf	SSP1BUF						; control byte
 	rcall	WaitMSSP
 	btfss	SSP1CON2,ACKSTAT			; ACK?
-	bsf		ostc_rx_present				; ACK send. OSTC_RX present!
+	bsf		ostc_rx_present				; ACK sent - OSTC_RX present!
 	bsf		SSP1CON2,PEN				; Stop condition
 	rcall	WaitMSSP
 	btfss	ostc_rx_present				; Do we have the RX?
@@ -1075,7 +1083,7 @@
 	rcall	WaitMSSP
 
 	; last byte in read from RX circuity always with a NACK!
-	bsf	SSP1CON2, RCEN					; Enable receive mode
+	bsf		SSP1CON2, RCEN				; Enable receive mode
 	rcall	WaitMSSP
 	movff	SSP1BUF,rx_firmware+1
 	bsf		SSP1CON2,ACKDT
@@ -1083,7 +1091,35 @@
 	rcall	WaitMSSP
 	bcf		SSP1CON2,ACKDT				; Reset ACKDT flag
 	bsf		SSP1CON2,PEN				; Stop condition
-	bra		WaitMSSP ;(and return)
+	rcall	WaitMSSP
+
+	; test for RX part not being ready during this read
+	movff	rx_firmware+1,i2c_temp1
+	movlw	.147
+	cpfseq	i2c_temp1
+	bra		I2C_probe_OSTC_rx_2			; not equal
+	movff	rx_firmware+0,i2c_temp1
+	movlw	.27
+	cpfseq	i2c_temp1
+	bra		I2C_probe_OSTC_rx_2			; not equal
+	bsf		active_reset_ostc_rx
+	WAITMS	.5
+	bcf		active_reset_ostc_rx
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	WAITMS	.250
+	clrf	i2c_temp1
+	decfsz	lo_temp,F					; try max. 5 times
+	bra		I2C_probe_OSTC_rx_1
+	bcf		ostc_rx_present				; Clear flag. Something is wrong
+I2C_probe_OSTC_rx_2:
+	clrf	i2c_temp1
+	return
 
 
 	global	I2C_get_tankdata
@@ -1216,4 +1252,6 @@
 	retlw	.0							; All ok
 	retlw	.255						; an error occurred
 
+ ENDIF
+
 	END
--- a/src/i2c.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/i2c.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File i2c.inc
+;   File i2c.inc														V2.99c
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -8,13 +8,19 @@
 ; HISTORY
 ;  2012-10-24 : [mH] Creation
 
-    extern  I2C_RX_accelerometer
-    extern  I2C_init_accelerometer
-    extern  I2C_sleep_accelerometer
-    extern  I2C_init_compass
-    extern  I2C_sleep_compass
-    extern  I2C_RX_compass
-    extern  lt2942_get_voltage              ; Read battery voltage registers
-    extern  lt2942_get_accumulated_charge   ; Get battery gauge registers
-    extern  lt2942_init                     ; Init
-    extern  lt2942_get_status               ; Get status
\ No newline at end of file
+	extern	I2C_RX_accelerometer
+	extern	I2C_init_accelerometer
+	extern	I2C_sleep_accelerometer
+	extern	I2C_init_compass
+	extern	I2C_sleep_compass
+	extern	I2C_RX_compass
+	extern	lt2942_get_voltage				; read battery voltage registers
+	extern	lt2942_get_accumulated_charge	; get battery gauge registers
+	extern	lt2942_init						; init
+	extern	lt2942_get_status				; get status
+
+ IFDEF _rx_functions
+	extern	I2C_probe_OSTC_rx				; set ostc_rx_present bit if present
+	extern	I2C_get_tankdata				; get the tank data
+	extern	I2C_update_OSTC_rx				; load new firmware into RX processor
+ ENDIF
--- a/src/icons.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/icons.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File icons.asm
+;   File icons.asm														V2.99c
 ;
 ;   Tables for all OSTC icons.
 ;
@@ -9,16 +9,24 @@
 ; HISTORY
 ;  2011-05-24 : [jDG] Creation with icons for demo menus.
 
-icons_data   CODE
+#include "hwos.inc"					; Mandatory header
+
+icons_data	CODE
 
-; Dive mode warning icon
+;=============================================================================
+
+; dive mode warning icon
 	global	dive_warning2_block
-#include "../src/Icons/dive_warning2.inc"	;45x39 px
+#include "../src/Icons/dive_warning2.inc"	; 45x39 px
+
 ; small warning icon
 ;	global	warning_block
-;#include "../src/Icons/warning.inc"       ;25x22 px
+;#include "../src/Icons/warning.inc"		; 25x22 px
+
+ IFDEF _ostc_logo
 	global	ostc_logo_block
-; OSTC scribble
-#include "../src/Icons/ostc_logo.inc"    ;220x61 px
+; OSTC logo
+#include "../src/Icons/ostc_logo.inc"		; 220x61 px
+ ENDIF
 
-        END
+	END
--- a/src/isr.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/isr.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File isr.asm									REFACTORED VERSION V2.98
+;   File isr.asm									REFACTORED VERSION V2.99d
 ;
 ;   INTERUPT subroutines
 ;
@@ -19,7 +19,7 @@
 
 	extern	start
 
-isr_high	CODE	0x0008				; High Priority Interrupts
+isr_high	CODE	0x0008				; high priority interrupts
 	bra		HighInt
 	nop
 	nop
@@ -29,68 +29,68 @@
 	nop
 	bra		HighInt
 
-isr_low		CODE	0x00018				; Low Priority Interrupts
+isr_low		CODE	0x00018				; low priority interrupts
 ;	*** low priority interrupts not used
-	retfie	FAST						; Restores BSR, STATUS and WREG
+	retfie	FAST						; restores BSR, STATUS and WREG
 
 HighInt:
 	movff	PRODL,isr_prod+0
 	movff	PRODH,isr_prod+1
 
 	; Buttons
-	btfsc	PIR1,TMR1IF					; Timer1 INT (Button hold-down Timer)
+	btfsc	PIR1,TMR1IF					; timer 1 INT (button hold-down timer)
 	rcall	timer1int
-	btfsc	INTCON,INT0IF				; Buttons
+	btfsc	INTCON,INT0IF				; buttons
 	rcall	isr_switch_right
-	btfsc	INTCON3,INT1IF				; Buttons
+	btfsc	INTCON3,INT1IF				; buttons
 	rcall	isr_switch_left
 
 	; IR/S8 link timer int
-	btfsc	PIR3,RC2IF					; UART2
-	rcall	isr_uart2					; IR/S8-Link
-	btfsc	PIR2,TMR3IF					; Timer 3
-	rcall	isr_timer3					; IR-Link Timeout
+	btfsc	PIR3,RC2IF					; UART 2
+	rcall	isr_uart2					; IR/S8 link
+	btfsc	PIR2,TMR3IF					; timer 3
+	rcall	isr_timer3					; IR-Link timeout
 
 	; Pressure sensor and others
-	btfsc	PIR5,TMR7IF					; Timer 7
-	rcall	isr_tmr7					; Every 62,5ms
+	btfsc	PIR5,TMR7IF					; timer 7
+	rcall	isr_tmr7					; every 62.5ms
 
 	; RTCC
-	btfsc	PIR3,RTCCIF					; Real-time-clock interrupt
-	rcall	isr_rtcc					; May return in bank common!
+	btfsc	PIR3,RTCCIF					; real-time-clock interrupt
+	rcall	isr_rtcc					; may return in bank common!
 
 	movff	isr_prod+1,PRODH
 	movff	isr_prod+0,PRODL
-	retfie	FAST						; Restores BSR, STATUS and WREG
+	retfie	FAST						; restores BSR, STATUS and WREG
 
 isr_set_speed_to_normal:
 	; Set speed to normal
 	movlw	b'01110010'
-	movwf	OSCCON						; 16MHz INTOSC
+	movwf	OSCCON						; 16 MHz INTOSC
 	movlw	b'00000000'
-	movwf	OSCTUNE						; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
-	movlw	b'00001101'					; 1:2 Postscaler, 1:4 Prescaler, Timer 2 start -> 1960Hz (no-flicker)
+	movwf	OSCTUNE						; 4x PLL disable (bit 6) - only works with 8 or 16 MHz (=32 or 64 MHz)
+	movlw	T2CON_NORMAL
 	movwf	T2CON
 	btfss	OSCCON,HFIOFS
-	bra		$-2							; Wait until clock is stable
+	bra		$-2							; wait until clock is stable
 	return
 
-isr_dimm_tft:							; Adjust until max_CCPR1L=CCPR1L !
+isr_dimm_tft:							; adjust until max_CCPR1L=CCPR1L
 	banksel	common
-	btfsc	tft_is_dimming				; Ignore while dimming
+	btfsc	tft_is_dimming				; ignore while dimming
 	return
 	banksel	isr_backup
 	movf	max_CCPR1L,W
-	cpfsgt	CCPR1L						; CCPR1L>max_CCPR1L?
-	bra		isr_dimm_tft2				; No, dimm up
+	cpfsgt	CCPR1L						; CCPR1L > max_CCPR1L ?
+	bra		isr_dimm_tft2				; NO - dimm up
 	; dimm down
 	decf	CCPR1L,F					; -1
 	return
 isr_dimm_tft2:
 	movf	max_CCPR1L,W
 	sublw	ambient_light_min_eco
-	cpfsgt	CCPR1L						; CCPR1L>max_CCPR1L-ambient_light_min_eco?
-	bra		isr_dimm_tft3				; No, dimm up slow
+	cpfsgt	CCPR1L						; CCPR1L > max_CCPR1L-ambient_light_min_eco ?
+	bra		isr_dimm_tft3				; NO - dimm up slow
 	; dimm up faster
 	movlw	.10
 	addwf	CCPR1L,F
@@ -100,21 +100,21 @@
 	nop
 	nop									; block flash here
 
-isr_restore	CODE	0x00080				; Restore first flash page from EEPROM
+isr_restore	CODE	0x00080				; restore first flash page from EEPROM
 restore_flash_0x00080:
 	goto	restore_flash
 
-isr_routines							;	CODE
+isr_routines							; CODE
 ;=============================================================================
 
-isr_uart2:								; IR/S8-Link
+isr_uart2:								; IR/S8 link
 	banksel	RCREG2
 	movf	RCREG2,W
-	bcf		RCSTA2,CREN					; Clear receiver status
+	bcf		RCSTA2,CREN					; clear receiver status
 	bsf		RCSTA2,CREN
 	banksel	isr_backup
-	incf	ir_s8_counter,F				; Increase counter
-	movff	ir_s8_counter,isr1_temp		; Copy
+	incf	ir_s8_counter,F				; increase counter
+	movff	ir_s8_counter,isr1_temp		; copy
 	dcfsnz	isr1_temp,F
 	movwf	ir_s8_buffer+.0
 	dcfsnz	isr1_temp,F
@@ -152,31 +152,31 @@
 	dcfsnz	isr1_temp,F
 	movwf	ir_s8_buffer+.17
 
-	clrf	TMR3L						; Preload timer
+	clrf	TMR3L						; preload timer
 	movlw	.253
 	movwf	TMR3H
-	bsf		T3CON,TMR3ON				; (Re)Start Timeout counter
+	bsf		T3CON,TMR3ON				; (re)start timeout counter
 	return
 
-isr_timer3:								; IR/S8-Link Timeout
-	bcf		T3CON,TMR3ON				; Stop Timer3
-	banksel	isr_backup					; Select Bank0 for ISR data.
+isr_timer3:								; IR/S8 link timeout
+	bcf		T3CON,TMR3ON				; stop timer 3
+	banksel	isr_backup					; select bank 0 for ISR data
 	movlw	.15
-	cpfseq	ir_s8_counter				; Got exact 15bytes?
-	bra		isr_timer3_1				; No, test for 16bytes
-	bra		isr_timer3_ir				; Got 15 bytes, compute local checksum
+	cpfseq	ir_s8_counter				; got exactly 15 bytes?
+	bra		isr_timer3_1				; NO  - test for 16bytes
+	bra		isr_timer3_ir				; YES - got 15 bytes, compute local checksum
 isr_timer3_1:
 	movlw	.16
-	cpfseq	ir_s8_counter				; Got exact 16bytes?
-	bra		isr_timer3_2				; No, test for 17bytes
-	tstfsz	ir_s8_buffer+.15			; Last byte=0x00
-	bra		isr_timer3_exit				; No, exit
-	bra		isr_timer3_ir				; Got 16 bytes, compute local checksum
+	cpfseq	ir_s8_counter				; got exactly 16 bytes?
+	bra		isr_timer3_2				; NO - test for 17 bytes
+	tstfsz	ir_s8_buffer+.15			; YES - last byte = 0x00 ?
+	bra		isr_timer3_exit				;       No  - exit
+	bra		isr_timer3_ir				;       YES - got 16 bytes, compute local checksum
 isr_timer3_2:
 	movlw	.17
-	cpfseq	ir_s8_counter				; Got exact 17bytes?
-	bra		isr_timer3_exit				; No, exit
-	bra		isr_timer3_s8				; S8 data
+	cpfseq	ir_s8_counter				; got exactly 17 bytes?
+	bra		isr_timer3_exit				; NO  - exit
+	bra		isr_timer3_s8				; YES - S8 data
 
 isr_timer3_ir:							; IR input
 	movff	ir_s8_buffer+.0,PRODL
@@ -208,11 +208,11 @@
 
 	; Compare checksum
 	movf	ir_s8_buffer+.13,W
-	cpfseq	PRODL						; Checksum ok?
-	bra		isr_timer3_exit				; No, exit
+	cpfseq	PRODL						; checksum ok?
+	bra		isr_timer3_exit				; NO - exit
 	movf	ir_s8_buffer+.14,W
-	cpfseq	PRODH						; Checksum ok?
-	bra		isr_timer3_exit				; No, exit
+	cpfseq	PRODH						; checksum ok?
+	bra		isr_timer3_exit				; NO - exit
 
 	; Checksum OK, copy results
 	movff	ir_s8_buffer+.1,hud_status_byte
@@ -228,16 +228,16 @@
 	movff	ir_s8_buffer+.11,hud_battery_mv+0
 	movff	ir_s8_buffer+.12,hud_battery_mv+1
 
-	movlw	ir_timeout_value			; multiples of 62,5ms
-	movwf	ir_s8_timeout				; Reload timeout
+	movlw	ir_timeout_value			; multiples of 62.5 ms
+	movwf	ir_s8_timeout				; reload timeout
 
 	banksel	hud_status_byte
-	bsf		hud_connection_ok			; Set manually for hwHUD w/o the HUD module...
-	banksel	isr_backup					; Select Bank0 for ISR data.
+	bsf		hud_connection_ok			; set manually for hwHUD w/o the HUD module...
+	banksel	isr_backup					; select bank 0 for ISR data
 
 isr_timer3_exit:
-	clrf	ir_s8_counter				; Clear pointer
-	bcf		PIR2,TMR3IF					; Clear flag
+	clrf	ir_s8_counter				; clear pointer
+	bcf		PIR2,TMR3IF					; clear flag
 	return
 
 isr_timer3_checksum:
@@ -280,11 +280,11 @@
 
 	; Compare checksum
 	movf	ir_s8_buffer+.15,W
-	cpfseq	PRODL						; Checksum ok?
-	bra		isr_timer3_exit				; No, exit
+	cpfseq	PRODL						; checksum ok?
+	bra		isr_timer3_exit				; NO - exit
 	movf	ir_s8_buffer+.16,W
-	cpfseq	PRODH						; Checksum ok?
-	bra		isr_timer3_exit				; No, exit
+	cpfseq	PRODH						; checksum ok?
+	bra		isr_timer3_exit				; NO - exit
 
 	; Checksum OK, copy results
 	movff	ir_s8_buffer+.3,hud_status_byte
@@ -292,8 +292,8 @@
 	movff	ir_s8_buffer+.14,hud_battery_mv+1
 
 	banksel	common
-	btfsc	new_s8_data_available		; =1: Old data already processed?
-	bra		isr_timer3_skip				; No, skip copying new results
+	btfsc	new_s8_data_available		; =1: old data already processed?
+	bra		isr_timer3_skip				; NO - skip copying new results
 
 	movff	ir_s8_buffer+.6,s8_rawdata_sensor1+2
 	movff	ir_s8_buffer+.5,s8_rawdata_sensor1+1
@@ -309,21 +309,21 @@
 
 isr_timer3_skip:
 	banksel	ir_s8_timeout
-	movlw	ir_timeout_value			; multiples of 62,5ms
-	movwf	ir_s8_timeout				; Reload timeout
-	bra		isr_timer3_exit				; Exit
+	movlw	ir_timeout_value			; multiples of 62.5ms
+	movwf	ir_s8_timeout				; reload timeout
+	bra		isr_timer3_exit				; exit
 
 
 ;=============================================================================
 
-isr_tmr7:								; each 62,5ms
+isr_tmr7:								; each 62.5ms
 	bcf		PIR5,TMR7IF					; clear flag
-	banksel	0xF16						; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
+	banksel	0xF16						; addresses F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM
 	movlw	.248
-	movwf	TMR7H						; -> Rollover after 2048 cycles -> 62,5ms
+	movwf	TMR7H						; rollover after 2048 cycles -> 62.5ms
 
 	banksel	common
-	call	get_analog_switches			; Get analog readings
+	call	get_analog_switches			; get analog readings
 	btfss	INTCON3,INT1IE
 	bra		isr_tmr7_a
 	btfsc	analog_sw2_pressed
@@ -336,31 +336,31 @@
 	rcall	isr_switch_right
 isr_tmr7_b:
 	banksel	common
-	btfss	no_sensor_int				; No sensor interrupt (because it's addressed during sleep)
-	bra		isr_tmr7_c					; No, continue
-	banksel	isr_backup					; Back to Bank0 ISR data
+	btfss	no_sensor_int				; sensor interrupt (because it's addressed during sleep)?
+	bra		isr_tmr7_c					; NO  - continue
+	banksel	isr_backup					; YES - back to bank 0 ISR data
 	return
 isr_tmr7_c:
 	banksel	isr_backup
-	movf	max_CCPR1L,W				; Dimm value
+	movf	max_CCPR1L,W				; dimm value
 	cpfseq	CCPR1L						; = current PWM value?
-	rcall	isr_dimm_tft				; No, adjust until max_CCPR1L=CCPR1L !
+	rcall	isr_dimm_tft				; NO - adjust until max_CCPR1L=CCPR1L
 
 	banksel	isr_backup
-	decfsz	ir_s8_timeout,F				; IR Data still valid?
-	bra		isr_tmr7_2					; Yes, continue
+	decfsz	ir_s8_timeout,F				; IR data still valid?
+	bra		isr_tmr7_2					; YES - continue
 	; timeout, clear IR-Data
 
-	movlw	ir_timeout_value			; multiples of 62,5ms
-	movwf	ir_s8_timeout				; Reload timeout
+	movlw	ir_timeout_value			; multiples of 62.5ms
+	movwf	ir_s8_timeout				; reload timeout
 
 	banksel	common
 	btfss	analog_o2_input
-	bra		isr_tmr7_1a					; Always with normal ostc3 hardware
+	bra		isr_tmr7_1a					; always with normal ostc3 hardware
 	btfss	s8_digital
 	bra		isr_tmr7_2					; only when digital
 isr_tmr7_1a:
-	clrf	o2_mv_sensor1+0				; S8/IR timeout clears all analog input readings to zero -> Fallback will be triggered when sensor mode was used
+	clrf	o2_mv_sensor1+0				; S8/IR timeout clears all analog input readings to zero -> fallback will be triggered when sensor mode was used
 	clrf	o2_mv_sensor1+1
 	clrf	o2_mv_sensor2+0
 	clrf	o2_mv_sensor2+1
@@ -380,58 +380,58 @@
 
 isr_tmr7_2:
 	banksel	common
-	btfss	no_sensor_int				; No sensor interrupt (because it's addressed during sleep)
-	bra		isr_sensor_state2			; No, continue
-	banksel	isr_backup					; Back to Bank0 ISR data
+	btfss	no_sensor_int				; sensor interrupt (because it's addressed during sleep)?
+	bra		isr_sensor_state2			; NO  - continue
+	banksel	isr_backup					; YES - back to Bank0 ISR data
 	return
 
 isr_sensor_state2:
 	banksel	common
 	movff	sensor_state_counter,WREG
 	btfss	WREG,0						; every 1/4 second
-	bsf		quarter_second_update		; Set flag
-	banksel	isr_backup					; Back to Bank0 ISR data
+	bsf		quarter_second_update		; set flag
+	banksel	isr_backup					; back to Bank0 ISR data
 	movlw	d'2'
-	cpfseq	speed_setting				; Set to normal in case it's not already in normal speed mode
+	cpfseq	speed_setting				; set to normal in case it's not already in normal speed mode
 	rcall	isr_set_speed_to_normal
 
 	incf	sensor_state_counter,F		; counts to eight for state machine
 
-; State 1: Clear flags and average registers, get temperature (51us) and start pressure integration (73,5us)
-; State 2: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
-; State 3: Get temperature (51us) and start pressure integration (73,5us)
-; State 4: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
-; State 5: Get temperature (51us) and start pressure integration (73,5us)
-; State 6: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
-; State 7: Get temperature (51us) and start pressure integration (73,5us)
-; State 8: Get pressure (51us), start temperature integration (73,5us), calculate temperature compensated pressure (233us) and build average for half-second update of tempperature and pressure
+; State 1: Clear flags and average registers, get temperature (51 us) and start pressure integration (73.5 us)
+; State 2: Get pressure    (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us)
+; State 3: Get temperature (51 us) and start pressure integration (73.5 us)
+; State 4: Get pressure    (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us)
+; State 5: Get temperature (51 us) and start pressure integration (73.5 us)
+; State 6: Get pressure    (51 us), start temperature integration (73.5 us) and calculate temperature compensated pressure (233 us)
+; State 7: Get temperature (51 us) and start pressure integration (73.5 us)
+; State 8: Get pressure    (51 us), start temperature integration (73.5 us),    calculate temperature compensated pressure (233 us) and build average for half-second update of temperature and pressure
 
 	movff	sensor_state_counter,WREG		; WREG used as temp here...
 	dcfsnz	WREG,F
-	bra		sensor_int_state1_plus_restart	; Do State 1
+	bra		sensor_int_state1_plus_restart	; do State 1
 	dcfsnz	WREG,F
-	bra		sensor_int_state2				; Do State 2
+	bra		sensor_int_state2				; do State 2
 	dcfsnz	WREG,F
-	bra		sensor_int_state1				; Do State 3
+	bra		sensor_int_state1				; do State 3
 	dcfsnz	WREG,F
-	bra		sensor_int_state2				; Do State 4
+	bra		sensor_int_state2				; do State 4
 	dcfsnz	WREG,F
-	bra		sensor_int_state1				; Do State 5
+	bra		sensor_int_state1				; do State 5
 	dcfsnz	WREG,F
-	bra		sensor_int_state2				; Do State 6
+	bra		sensor_int_state2				; do State 6
 	dcfsnz	WREG,F
-	bra		sensor_int_state1				; Do State 7
-;	bra		sensor_int2_plus_average		; Do State 8
+	bra		sensor_int_state1				; do State 7
+;	bra		sensor_int2_plus_average		; do State 8
 ;sensor_int2_plus_average:
 	; First, do state2:
-	call	get_pressure_value			; State2: Get pressure (51us)
-	call	get_temperature_start		; and start temperature integration (73,5us)
-	call	calculate_compensation		; calculate temperature compensated pressure (27us)
+	call	get_pressure_value			; state 2: get pressure (51 us)
+	call	get_temperature_start		; and start temperature integration (73.5 us)
+	call	calculate_compensation		; calculate temperature compensated pressure (27 us)
 ; Build average
-	bcf		STATUS,C					; clear carry bit.
+	bcf		STATUS,C					; clear carry bit
 	rrcf	amb_pressure_avg+1			; amb_pressure sum / 2
 	rrcf	amb_pressure_avg+0
-	bcf		STATUS,C					; clear carry bit, twice.
+	bcf		STATUS,C					; clear carry bit, twice
 	rrcf	amb_pressure_avg+1			; amb_pressure sum / 4
 	rrcf	amb_pressure_avg+0
 
@@ -439,82 +439,81 @@
 	movff	amb_pressure_avg+0,amb_pressure+0
 
 	bcf		STATUS,C
-	btfsc	temperature_avg+1,7			; Copy sign bit to carry
+	btfsc	temperature_avg+1,7			; copy sign bit to carry
 	bsf		STATUS,C
-	rrcf	temperature_avg+1			; Signed temperature /2
+	rrcf	temperature_avg+1			; signed temperature /2
 	rrcf	temperature_avg+0
 	bcf		STATUS,C
-	btfsc	temperature_avg+1,7			; Copy sign bit to carry
+	btfsc	temperature_avg+1,7			; copy sign bit to carry
 	bsf		STATUS,C
-	rrcf	temperature_avg+1			; Signed temperature /4
+	rrcf	temperature_avg+1			; signed temperature /4
 	rrcf	temperature_avg+0
 
 	movff	temperature_avg+1,temperature+1		; copy into actual register
 	movff	temperature_avg+0,temperature+0
 
-	banksel	common						; flag1 is in Bank1
-	bcf		temp_changed				; Clear flag for temperature update
-	bcf		pressure_refresh			; Clear flag for pressure update
-	banksel	isr_backup					; Back to Bank0 ISR data
+	banksel	common						; flag1 is in bank 1
+	bcf		temp_changed				; clear flag for temperature update
+	bcf		pressure_refresh			; clear flag for pressure update
+	banksel	isr_backup					; back to bank 0 ISR data
 
 	; Temp changed?
 	movf	temperature+0,W
 	cpfseq	last_temperature+0
-	bra		isr_sensor_state2_2			; Yes
+	bra		isr_sensor_state2_2			; YES
 	movf	temperature+1,W
 	cpfseq	last_temperature+1
-	bra		isr_sensor_state2_2			; Yes
+	bra		isr_sensor_state2_2			; YES
 
 	bra		isr_sensor_state2_3			; no change
 
 isr_sensor_state2_2:
-	banksel	common						; flag1 is in Bank1
-	bsf		temp_changed				; Yes
-	banksel	isr_backup					; Back to Bank0 ISR data
+	banksel	common						; flag1 is in bank 1
+	bsf		temp_changed				; YES
+	banksel	isr_backup					; back to bank 0 ISR data
 isr_sensor_state2_3:
-	movff	temperature+0,last_temperature+0	; Copy for compare
+	movff	temperature+0,last_temperature+0	; copy for compare
 	movff	temperature+1,last_temperature+1
 
 	movf	amb_pressure+0,W
 	cpfseq	last_pressure+0
-	bra		isr_sensor_state2_4			; Yes
+	bra		isr_sensor_state2_4			; YES
 	movf	amb_pressure+1,W
 	cpfseq	last_pressure+1
-	bra		isr_sensor_state2_4			; Yes
+	bra		isr_sensor_state2_4			; YES
 
-	bra		isr_sensor_state2_5			; No change
+	bra		isr_sensor_state2_5			; no change
 isr_sensor_state2_4:
-	banksel	common						; flag1 is in Bank1
-	bsf		pressure_refresh			; Yes
-	banksel	isr_backup					; Back to Bank0 ISR data
+	banksel	common						; flag1 is in bank 1
+	bsf		pressure_refresh			; YES
+	banksel	isr_backup					; back to bank 0 ISR data
 isr_sensor_state2_5:
-	movff	amb_pressure+0,last_pressure+0	; Copy for compare
+	movff	amb_pressure+0,last_pressure+0	; copy for compare
 	movff	amb_pressure+1,last_pressure+1
 
-	clrf	sensor_state_counter		; Then reset State counter
-	banksel	common						; flag2 is in Bank1
+	clrf	sensor_state_counter		; reset state counter
+	banksel	common						; flag2 is in bank 1
 	btfss	simulatormode_active		; are we in simulator mode?
-	bra		comp_air_pressure			; no
-	; Always set pressure_refresh flag in simulator mode
-	bsf		pressure_refresh			; Yes
-	banksel	isr_backup					; Back to Bank0 ISR data
-	movlw	LOW  d'1000'				; yes, so simulate 1000mbar surface pressure
+	bra		comp_air_pressure			; NO
+	bsf		pressure_refresh			; always set pressure_refresh flag in simulator mode
+	banksel	isr_backup					; back to bank 0 ISR data
+	movlw	LOW  d'1000'				; simulate 1000 mbar surface pressure
 	movwf	last_surfpressure+0
 	movlw	HIGH d'1000'
 	movwf	last_surfpressure+1
 
 comp_air_pressure:
-	banksel	isr_backup					; Back to Bank0 ISR data
+	banksel	isr_backup					; back to bank 0 ISR data
 	movf	last_surfpressure+0,W		; compensate air pressure
 	subwf	amb_pressure+0,W
-	movwf	rel_pressure+0				; rel_pressure stores depth!
+	movwf	rel_pressure+0				; rel_pressure stores depth
 
 	movf	last_surfpressure+1,W
 	subwfb	amb_pressure+1,W
 	movwf	rel_pressure+1
-	btfss	STATUS,N					; result is below zero?
-	bra		sensor_int_state_exit
-	clrf	rel_pressure+0				; Yes, do not display negative depths
+	btfss	STATUS,N					; is result below zero?
+	bra		sensor_int_state_exit		; NO
+	clrf	rel_pressure+0				; YES - do not display negative depths
 	clrf	rel_pressure+1				; e.g. when surface air pressure dropped during the dive
 	bra		sensor_int_state_exit
 
@@ -525,63 +524,63 @@
 	clrf	temperature_avg+1
 
 sensor_int_state1:
-	call	get_temperature_value		; State 1: Get temperature
-	call	get_pressure_start			; and start pressure integration.
+	call	get_temperature_value		; state 1: get temperature...
+	call	get_pressure_start			; ...and start pressure integration
 	bra		sensor_int_state_exit
 
 sensor_int_state2:
-	call	get_pressure_value			; State2: Get pressure (51us)
-	call	get_temperature_start		; and start temperature integration (73,5us)
-	call	calculate_compensation		; calculate temperature compensated pressure (233us)
+	call	get_pressure_value			; state 2: get pressure (51 us)...
+	call	get_temperature_start		; ...and start temperature integration (73.5 us)
+	call	calculate_compensation		; .. and calculate temperature compensated pressure (233 us)
 	;bra	sensor_int_state_exit
 
 sensor_int_state_exit:
-	rcall	isr_restore_clock			; Restore clock
+	rcall	isr_restore_clock			; restore clock
 	return
 
 ;=============================================================================
 
 isr_rtcc:								; each second
 	bcf		PIR3,RTCCIF					; clear flag
-	banksel	0xF16						; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
+	banksel	0xF16						; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM
 	bsf		RTCCFG,RTCPTR1
 	bsf		RTCCFG,RTCPTR0				; year
-	movff	RTCVALL,year				; format is BCD!
+	movff	RTCVALL,year				; format is BCD
 	movff	RTCVALH,day					; dummy read
-	movff	RTCVALL,day					; format is BCD!
-	movff	RTCVALH,month				; format is BCD!
-	movff	RTCVALL,hours				; format is BCD!
-	movff	RTCVALH,secs				; format is BCD!
-	movff	RTCVALL,secs				; format is BCD!
-	movff	RTCVALH,mins				; format is BCD!
-	banksel	isr_backup					; Back to Bank0 ISR data
+	movff	RTCVALL,day					; format is BCD
+	movff	RTCVALH,month				; format is BCD
+	movff	RTCVALL,hours				; format is BCD
+	movff	RTCVALH,secs				; format is BCD
+	movff	RTCVALL,secs				; format is BCD
+	movff	RTCVALH,mins				; format is BCD
+	banksel	isr_backup					; back to bank 0 ISR data
 
 	; Convert BCD to DEC and set registers
 	movff	mins, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,mins
 	movff	secs, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,secs
 	movff	hours, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,hours
 	movff	month, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,month
 	movff	day, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,day
 	movff	year, isr1_temp
-	rcall	isr_rtcc_convert			; Converts to dec with result in WREG
+	rcall	isr_rtcc_convert			; converts to dec with result in WREG
 	movff	WREG,year
 
 	; Place once/second tasks for ISR here (Be sure of the right bank!)
-	banksel	common						; flag1 is in Bank1
-	btfss	sleepmode					; in Sleepmode?
-	call	get_ambient_level			; No, get ambient light level and set max_CCPR1L
+	banksel	common						; flag1 is in bank 1
+	btfss	sleepmode					; in sleepmode?
+	call	get_ambient_level			; NO - get ambient light level and set max_CCPR1L
 
-	rcall	isr_battery_gauge			; Add amount of battery consumption to battery_gauge:6
+	rcall	isr_battery_gauge			; add amount of battery consumption to battery_gauge:6
 
 	; update uptime
 	banksel	uptime+0
@@ -591,30 +590,30 @@
 	addwfc	uptime+2,F
 	addwfc	uptime+3,F
 
-	banksel	common						; flag1 is in Bank1
-	bsf		onesecupdate				; A new second has begun
+	banksel	common						; flag1 is in bank 1
+	bsf		onesecupdate				; a new second has begun
 	btfsc	divemode					; in divemode?
-	rcall	isr_divemode_1sec			; Yes, do some divemode stuff in bank common
+	rcall	isr_divemode_1sec			; YES - do some divemode stuff in bank common
 
 	btfss	divemode					; in divemode?
-	rcall	isr_update_lastdive_time	; No, update the lastdive timer
+	rcall	isr_update_lastdive_time	; NO - update the last dive timer
 
 	tstfsz	secs						; secs == 0 ?
-	return								; No, Done.
+	return								; NO - done
 
-	bsf		oneminupdate				; A new minute has begun
+	bsf		oneminupdate				; a new minute has begun
 
-	btfss	divemode					; In Divemode?
-	rcall	check_nofly_desat_time		; No, so increase interval
+	btfss	divemode					; in Divemode?
+	rcall	check_nofly_desat_time		; NO - so increase interval
 
 	; Check if a new hour has just begun
-	tstfsz	mins						; mins == 0?
-	bra		isr_rtcc2					; No
-	bsf		onehourupdate				; Yes, set flag
+	tstfsz	mins						; mins == 0 ?
+	bra		isr_rtcc2					; NP
+	bsf		onehourupdate				; YES - set flag
 
 isr_rtcc2:
-	banksel	isr_backup					; Back to Bank0 ISR data
-	return								; Done.
+	banksel	isr_backup					; back to bank 0 ISR data
+	return								; done
 
 isr_update_lastdive_time:				; called every second when not in divemode
 	; update uptime
@@ -628,17 +627,17 @@
 	return
 
 isr_battery_gauge:
-	banksel	isr_backup					; Bank0 ISR data
-	movlw	current_sleepmode			; 100µA/3600 -> nAs	(Sleepmode current)
-	movwf	isr1_temp					; Store value (low byte)
-	clrf	isr2_temp					; High byte
+	banksel	isr_backup					; bank 0 ISR data
+	movlw	current_sleepmode			; 100µA/3600 -> nAs (sleepmode current)
+	movwf	isr1_temp					; store value (low byte)
+	clrf	isr2_temp					; high byte
 
-	banksel	common						; flag1 is in Bank1
-	btfss	sleepmode					; in Sleepmode?
-	rcall	isr_battery_gauge2			; No, compute current consumption value into isr1_temp and isr2_temp
+	banksel	common						; flag1 is in bank 1
+	btfss	sleepmode					; in sleepmode?
+	rcall	isr_battery_gauge2			; NO - compute current consumption value into isr1_temp and isr2_temp
 
-	banksel	isr_backup					; Bank0 ISR data
-	movf	isr1_temp,W					; 48Bit add of isr1_temp and isr2_temp into battery_gauge:6
+	banksel	isr_backup					; bank 0 ISR data
+	movf	isr1_temp,W					; 48 Bit add of isr1_temp and isr2_temp into battery_gauge:6
 	addwf	battery_gauge+0,F
 	movf	isr2_temp,W
 	addwfc	battery_gauge+1,F
@@ -653,9 +652,9 @@
 	; set consumption rate in nAs for an one second interval
 	; Example:
 	; movlw	LOW  .55556					; 0,2A/3600*1e9s = nAs
-	; movwf	isr1_temp					; Low byte
+	; movwf	isr1_temp					; low byte
 	; movlw	HIGH .55556					; 0,2A/3600*1e9s = nAs
-	; movwf	isr2_temp					; High byte
+	; movwf	isr2_temp					; high byte
 
 	; Current consumption for LED backlight is 47*CCPR1L+272
 	movf	CCPR1L,W
@@ -668,7 +667,7 @@
 	movff	PRODH,isr2_temp				; isr1_temp and isr2_temp hold value for backlight
 
 	; Add current for CPU and GPU 
-	; speed_setting=1: ECO (3,1mA -> 861nAs), =2: NORMAL (5,50mA -> 1528nAs) or =3: FASTEST (8,04mA -> 2233nAs)
+	; speed_setting=1: ECO (3.1mA -> 861nAs), =2: NORMAL (5.50mA -> 1528nAs) or =3: FASTEST (8.04mA -> 2233nAs)
 	banksel	isr_backup					; Bank0 ISR data
 	movlw	.1
 	cpfseq	speed_setting
@@ -695,7 +694,7 @@
 isr_battery_gauge5:
 	; Add current if IR receiver is on
 	btfss	ir_power					; IR enabled?
-	bra		isr_battery_gauge6			; no
+	bra		isr_battery_gauge6			; NO
 	movlw	LOW  current_ir_receiver
 	addwf	isr1_temp,F
 	movlw	HIGH current_ir_receiver
@@ -703,7 +702,7 @@
 isr_battery_gauge6:
 	; Add current for compass/accelerometer
 	btfss	compass_enabled				; compass active?
-	bra		isr_battery_gauge7			; no
+	bra		isr_battery_gauge7			; NO
 	movlw	LOW  current_compass
 	addwf	isr1_temp,F
 	movlw	HIGH current_compass
@@ -714,23 +713,20 @@
 isr_divemode_1sec:
 	incf	samplesecs,F				; "samplingrate" diving seconds done 
 	decf	samplesecs_value,W			; holds "samplingrate" value (minus 1 into WREG)
-	cpfsgt	samplesecs					; Done?
-	bra		isr_divemode_1sec2			; no
+	cpfsgt	samplesecs					; done?
+	bra		isr_divemode_1sec2			; NO
 
 	clrf	samplesecs					; clear counter...
 	bsf		store_sample				; ...and set bit for profile storage
 isr_divemode_1sec2:
-	; Increase re-setable average depth divetime counter
-	infsnz	average_divesecs+0,F		; increase stopwatch registers
-	incf	average_divesecs+1,F		; increase stopwatch registers
-	; Increase total divetime (Regardless of start_dive_threshold)
+	; increase total divetime (regardless of start_dive_threshold)
 	infsnz	total_divetime_seconds+0,F
-	incf	total_divetime_seconds+1,F	; Total dive time (Regardless of start_dive_threshold)
+	incf	total_divetime_seconds+1,F	; total dive time (regardless of start_dive_threshold)
 
 	btfss	divemode2					; displayed divetime is running?
-	return								; No (e.g. too shallow)
+	return								; NO (e.g. too shallow)
 
-	; increase divetime registers (Displayed dive time)
+	; increase divetime registers (displayed dive time)
 	incf	divesecs,F
 	movlw	d'59'
 	cpfsgt	divesecs
@@ -742,13 +738,13 @@
 	incf	divemins+1,F				; increase divemins
 
 isr_divemode_1sec2a:
-	btfss	FLAG_apnoe_mode				; Are we in Apnoe mode?
-	return								; No
+	btfss	FLAG_apnoe_mode				; are we in apnoe mode?
+	return								; NO
 
 	incf	apnoe_secs,F				; increase descent registers
 	movlw	d'59'
 	cpfsgt	apnoe_secs					; full minute?
-	return								; No
+	return								; NO
 	clrf	apnoe_secs
 	incf	apnoe_mins,F				; increase descent mins
 	return
@@ -769,82 +765,82 @@
 ;=============================================================================
 
 isr_switch_right:
-	bcf		INTCON,INT0IE				; Disable INT0
-	banksel	common						; flag1 is in Bank1
+	bcf		INTCON,INT0IE				; disable INT0
+	banksel	common						; flag1 is in bank 1
 	btfss	flip_screen					; 180° flipped?
-	bsf		switch_right				; Set flag
+	bsf		switch_right				; set flag
 	btfsc	flip_screen					; 180° flipped?
-	bsf		switch_left					; Set flag
-	bra		isr_switch_common			; Continue...
+	bsf		switch_left					; set flag
+	bra		isr_switch_common			; continue...
 
 isr_switch_left:
-	bcf		INTCON3,INT1IE				; Disable INT1
-	banksel	common						; flag1 is in Bank1
+	bcf		INTCON3,INT1IE				; disable INT1
+	banksel	common						; flag1 is in bank 1
 	btfss	flip_screen					; 180° flipped?
-	bsf		switch_left					; Set flag
+	bsf		switch_left					; set flag
 	btfsc	flip_screen					; 180° flipped?
-	bsf		switch_right				; Set flag
+	bsf		switch_right				; set flag
 isr_switch_common:
 	; load timer1 for first press
 	clrf	TMR1L
-	movlw	TMR1H_VALUE_FIRST			; in steps of 7,8125ms
+	movlw	TMR1H_VALUE_FIRST			; in steps of 7.8125 ms
 	movwf	TMR1H
-	bsf		T1CON,TMR1ON				; Start Timer 1
-	banksel	isr_backup					; Select Bank0 for ISR data.
-	bcf		INTCON3,INT1IF				; Clear flag
-	bcf		INTCON,INT0IF				; Clear flag
+	bsf		T1CON,TMR1ON				; start timer 1
+	banksel	isr_backup					; select bank 0 for ISR data
+	bcf		INTCON3,INT1IF				; clear flag
+	bcf		INTCON,INT0IF				; clear flag
 	return
 
 timer1int:
-	bcf		PIR1,TMR1IF					; Clear flag
-	banksel	common						; flag1 is in Bank1
-	bcf		INTCON,INT0IF				; Clear flag
-	bcf		INTCON3,INT1IF				; Clear flag
+	bcf		PIR1,TMR1IF					; clear flag
+	banksel	common						; flag1 is in bank 1
+	bcf		INTCON,INT0IF				; clear flag
+	bcf		INTCON3,INT1IF				; clear flag
 	; digital
-	btfss	switch_left1				; Left button hold-down?
-	bra		timer1int_left				; Yes
-	btfss	switch_right2				; Right button hold-down?
-	bra		timer1int_right				; Yes
+	btfss	switch_left1				; left button hold-down?
+	bra		timer1int_left				; YES
+	btfss	switch_right2				; right button hold-down?
+	bra		timer1int_right				; YES
 
 	; Analog
-	btfsc	analog_sw2_pressed			; Left button hold-down?
-	bra		timer1int_left				; Yes
-	btfsc	analog_sw1_pressed			; Right button hold-down?
-	bra		timer1int_right				; Yes
+	btfsc	analog_sw2_pressed			; left button hold-down?
+	bra		timer1int_left				; YES
+	btfsc	analog_sw1_pressed			; right button hold-down?
+	bra		timer1int_right				; YES
 
 	; No button hold-down, stop Timer 1
-	bcf		T1CON,TMR1ON				; Stop Timer 1
-	bsf		INTCON,INT0IE				; Enable INT0
-	bsf		INTCON3,INT1IE				; Enable INT1
+	bcf		T1CON,TMR1ON				; stop timer 1
+	bsf		INTCON,INT0IE				; enable INT0
+	bsf		INTCON3,INT1IE				; enable INT1
 	return
 
 timer1int_left:
 	btfss	flip_screen					; 180° flipped?
-	bsf		switch_left					; (Re-)Set flag
+	bsf		switch_left					; (re-)set flag
 	btfsc	flip_screen					; 180° flipped?
-	bsf		switch_right				; (Re-)Set flag
-	bra		timer1int_common			; Continue
+	bsf		switch_right				; (re-)set flag
+	bra		timer1int_common			; continue
 timer1int_right:
 	btfss	flip_screen					; 180° flipped?
-	bsf		switch_right				; Set flag
+	bsf		switch_right				; set flag
 	btfsc	flip_screen					; 180° flipped?
-	bsf		switch_left					; Set flag
+	bsf		switch_left					; set flag
 timer1int_common:
 	; load timer1 for next press
 	clrf	TMR1L
-	movlw	TMR1H_VALUE_CONT			; Surface mode
+	movlw	TMR1H_VALUE_CONT			; surface mode
 	btfsc	divemode
-	movlw	TMR1H_VALUE_CONT_DIVE		; Dive mode
+	movlw	TMR1H_VALUE_CONT_DIVE		; sive mode
 	movwf	TMR1H
-	return								; Return from timer1int with timer1 kept running
+	return								; return from timer1int with timer1 kept running
 
 ;=============================================================================
 
 check_nofly_desat_time:					; called every minute when not in divemode
 	banksel	int_O_desaturation_time
-	movf	int_O_desaturation_time+0,W	; Is Desat null ?
+	movf	int_O_desaturation_time+0,W	; is Desat null ?
 	iorwf	int_O_desaturation_time+1,W
-	bz		check_nofly_desat_time_1	; yes...
+	bz		check_nofly_desat_time_1	; YES
 
 	; int_O_desaturation_time is only computed while in start, surface mode, menue_tree or ghostwriter.
 	; So the ISR may clock surface_interval past the actual surface interval time. But TFT_surface_lastdive
@@ -855,13 +851,13 @@
 	banksel	common
 	infsnz	surface_interval+0,F
 	incf	surface_interval+1,F
-	return								; Done
+	return								; done
 
 check_nofly_desat_time_1:
 	banksel	common
 	clrf	surface_interval+0
-	clrf	surface_interval+1			; Clear surface interval timer
-	return								; Done.
+	clrf	surface_interval+1			; clear surface interval timer
+	return								; done
 
 ;=============================================================================
 
@@ -872,9 +868,9 @@
 	bra		isr_restore_speed2
 	; Reset to eco
 	movlw	b'00000000'
-	movwf	OSCTUNE						; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
+	movwf	OSCTUNE						; 4x PLL Ddsable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz)
 	movlw	b'00110010'
-	movwf	OSCCON						; 1MHz INTOSC
+	movwf	OSCCON						; 1 MHz INTOSC
 	movlw	T2CON_ECO
 	movwf	T2CON
 	bra		isr_restore_exit
@@ -884,19 +880,19 @@
 	bra		isr_restore_speed3
 	; Reset to normal
 	movlw	b'01110010'
-	movwf	OSCCON						; 16MHz INTOSC
+	movwf	OSCCON						; 16 MHz INTOSC
 	movlw	b'00000000'
-	movwf	OSCTUNE						; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
+	movwf	OSCTUNE						; 4x PLL disable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz)
 	movlw	T2CON_NORMAL
 	movwf	T2CON
 	bra		isr_restore_exit
 
 isr_restore_speed3:
 	; Reset to fastest
-	movlw	b'01110010'					; 16MHz INTOSC
+	movlw	b'01110010'					; 16 MHz INTOSC
 	movwf	OSCCON
 	movlw	b'01000000'
-	movwf	OSCTUNE						; 4x PLL Enable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
+	movwf	OSCTUNE						; 4x PLL enable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz)
 	movlw	T2CON_FASTEST
 	movwf	T2CON
 	;bra	isr_restore_exit
@@ -907,7 +903,7 @@
 	return
 
 
-restore_flash:							; Restore first flash page from eeprom
+restore_flash:							; restore first flash page from EEPROM
 	banksel	common
 	; Start address in internal flash
 	movlw	0x00
@@ -915,36 +911,36 @@
 	movwf	TBLPTRH
 	movwf	TBLPTRU
 
-	movlw	b'10010100'					; Setup erase
-	rcall	Write						; Write!
+	movlw	b'10010100'					; setup erase
+	rcall	Write						; write
 
 	movlw	.128
-	movwf	lo							; Byte counter
+	movwf	lo							; byte counter
 	clrf	EEADR
 	movlw	.3
-	movwf	EEADRH						; Setup backup address
+	movwf	EEADRH						; setup backup address
 
-	TBLRD*-								; Dummy read to be in 128 byte block
+	TBLRD*-								; dummy read to be in 128 byte block
 restore_flash_loop:
 	call	read_eeprom
 	incf	EEADR,F
 	movff	EEDATA,TABLAT				; put 1 byte
-	tblwt+*								; Table Write with Pre-Increment
-	decfsz	lo,F						; 128byte done?
-	bra		restore_flash_loop			; No
+	tblwt+*								; table write with pre-increment
+	decfsz	lo,F						; 128 bytes done?
+	bra		restore_flash_loop			; NO - loop
 
-	movlw	b'10000100'					; Setup writes
-	rcall	Write						; Write!
+	movlw	b'10000100'					; setup writes
+	rcall	Write						; write
 
-	reset								; Done, reset CPU
+	reset								; done, reset CPU
 
 Write:
-	movwf	EECON1						; Type of memory to write in
+	movwf	EECON1						; type of memory to write in
 	movlw	0x55
 	movwf	EECON2
 	movlw	0xAA
 	movwf	EECON2
-	bsf		EECON1,WR					; Write
+	bsf		EECON1,WR					; write
 	nop
 	nop
 	return
--- a/src/isr.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/isr.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -8,13 +8,13 @@
 ; HISTORY
 ;  2011-08-06 : [mH] moving from OSTC code
 
-SAFE_2BYTE_COPY MACRO  from, to
-        local   retry
+SAFE_2BYTE_COPY MACRO from,to
+	local	retry
 retry:
-        movff   from+1,WREG             ; High byte in W.
-        movff   WREG,to+1               ; and destination.
-        movff   from+0,to+0             ; Copy low byte.
-        movff   from+1,TABLAT           ; another bank-safe read.
-        xorwf   TABLAT,W                ; High byte changed ?
-        bnz     retry
-        ENDM
+	movff	from+1,WREG				; high byte in WREG, ...
+	movff	WREG,to+1				; ... and destination
+	movff	from+0,to+0				; copy low byte
+	movff	from+1,TABLAT			; another bank-safe read
+	xorwf	TABLAT,W				; did the high byte changed?
+	bnz		retry					; YES - retry
+	ENDM
--- a/src/logbook.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/logbook.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File logbook.asm								REFACTORED VERSION V2.98
+;   File logbook.asm								REFACTORED VERSION V2.99e
 ;
 ;   Logbook
 ;
@@ -12,7 +12,7 @@
 ;=============================================================================
 
 
-#include "hwos.inc"						; Mandatory header
+#include "hwos.inc"						; mandatory header
 #include "tft.inc"
 #include "external_flash.inc"
 #include "math.inc"
@@ -99,15 +99,15 @@
 ;									logbook_flags,7	; unused
 
 ; Logbook Coordinates
-#DEFINE logbook_list_left			.10				; Column of dive# in list
-#DEFINE logbook_row_offset			.28				; Distance between rows of list
-#DEFINE logbook_row_number			.6				; Amount of rows in the list
+#DEFINE logbook_list_left			.10				; column of dive# in list
+#DEFINE logbook_row_offset			.28				; distance between rows of list
+#DEFINE logbook_row_number			.6				; amount of rows in the list
 
 ; Profile display
-#DEFINE profile_height_pixels		.157			; Amount of pixels height for profile display
-#DEFINE profile_width_pixels		.156			; Amount of pixels width for profile display
-#DEFINE profile_left				.1				; Left border
-#DEFINE profile_top					.65				; Top border
+#DEFINE profile_height_pixels		.157			; amount of pixels height for profile display
+#DEFINE profile_width_pixels		.156			; amount of pixels width for profile display
+#DEFINE profile_left				.1				; left border
+#DEFINE profile_top					.65				; top border
 
 ; "Bailout"
 #DEFINE logbook_bailout_column		.124
@@ -225,7 +225,7 @@
 	movwf	ext_flash_address+0
 	endm
 
-logbook		code
+logbook		CODE
 
 ;=============================================================================
 
@@ -235,7 +235,7 @@
 
 	WIN_LEFT logbook_list_left-.8
 	WIN_FONT FT_SMALL
-;	bcf		win_invert								; Reset invert flag
+;	bcf		win_invert								; reset invert flag
 	call	TFT_standard_color
 
 	movff	menupos1,lo
@@ -266,18 +266,18 @@
 logbook:
 	clrf	logbook_flags
 	clrf	CCP1CON									; stop PWM
-	bcf		PORTC,2									; Pull PWM out to GND
+	bcf		PORTC,2									; pull PWM out to GND
 	call	TFT_boot
 ;	call	TFT_standard_color
-	clrf	menupos3								; Here: used rows on current logbook-page
-	clrf	logbook_page_number						; Here: # of current displayed page
+	clrf	menupos3								; here: used rows on current logbook-page
+	clrf	logbook_page_number						; here: # of current displayed page
 	clrf	logbook_divenumber						; # of dive in list during search
 	clrf	logbook_temp
 	clrf	logbook_temp_backup
-	clrf	timeout_counter2						; For timeout
+	clrf	timeout_counter2						; for timeout
 	movlw	logbook_row_number
-	movwf	menupos1								; Here: stores current position on display (logbook_row_number-x)
-	read_int_eeprom .2								; Get low-byte of total dives
+	movwf	menupos1								; here: stores current position on display (logbook_row_number-x)
+	read_int_eeprom .2								; get low-byte of total dives
 	movff	EEDATA,logbook_max_dive_counter
 
 ;-----------------------------------------------------------------------------	
@@ -295,13 +295,13 @@
 ;	call	speed_fastest
 	incf	logbook_temp,F							; increase dive counter
 	incf	logbook_temp,W							; = 0x..FF ?
-	bz		logbook_reset							; Yes: FF --> loop.
+	bz		logbook_reset							; YES -  FF --> loop
 
 	; Set ext_flash_address:3 to TOC entry of this dive
 	; 1st: 200000h-200FFFh -> logbook_max_dive_counter=0
 	; 2nd: 201000h-201FFFh -> logbook_max_dive_counter=1
 	; 3rd: 202000h-202FFFh -> logbook_max_dive_counter=2
-	; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (And hi>0...)
+	; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (and hi>0...)
 
 	decf	logbook_max_dive_counter,F				; -1
 
@@ -317,52 +317,52 @@
 	addwfc	ext_flash_address+2,F
 	; pointer at the first 0xFA of header
 
-	call	ext_flash_byte_read						; Reads one byte@ext_flash_address:3 into WREG and ext_flash_rw
+	call	ext_flash_byte_read						; reads one byte@ext_flash_address:3 into WREG and ext_flash_rw
 	movwf	ext_flash_rw
 	movlw	0xFA
 	cpfseq	ext_flash_rw							; 0xFA found?
-	bra		logbook3b								; No, abort
+	bra		logbook3b								; NO - abort
 
 	incf	logbook_divenumber,F					; new header found, increase logbook_divenumber
-	bra		logbook4								; Done with searching, display the header!
+	bra		logbook4								; done with searching, display the header
 
 logbook3b:
-	btfss	logbook_page_not_empty					; Was there at least one dive?
-	bra		exit_logbook							; Not a single header was found, leave logbook.
+	btfss	logbook_page_not_empty					; was there at least one dive?
+	bra		exit_logbook							; not a single header was found, leave logbook
 	bra		logbook_display_loop2
 
 logbook_reset:
-	tstfsz	logbook_divenumber						; Was there at least one dive?
+	tstfsz	logbook_divenumber						; was there at least one dive?
 	bra		logbook_reset2
-	bra		logbook3b								; No, Nothing to do
+	bra		logbook3b								; NO - nothing to do
 
 logbook_reset2:
-	bsf		all_dives_shown							; Yes
-	bra		logbook_display_loop2					; Continue
+	bsf		all_dives_shown							; YES
+	bra		logbook_display_loop2					; continue
 
 logbook4:
-	btfsc	all_dives_shown							; All dives displayed?
-	bra		logbook_display_loop2					; Yes, but display first page again.
+	btfsc	all_dives_shown							; all dives displayed?
+	bra		logbook_display_loop2					; YES - display first page again
 
 	call	display_listdive						; display short header for list on current list position
 
 	movlw	logbook_row_number
 	cpfseq	menupos1								; first dive on list (top place)?
-	bra		logbook_display_loop1					; no, so skip saving of address
+	bra		logbook_display_loop1					; NO - skip saving of address
 
 	; store all registers required to rebuilt the current logbook page after the detail/profile view
-	movff	logbook_divenumber,logbook_divenumber_temp	; # of dive in list of the current page
-	movff	logbook_max_dive_counter,logbook_max_dive_counter_temp	; backup Counter
+	movff	logbook_divenumber,logbook_divenumber_temp				; # of dive in list of the current page
+	movff	logbook_max_dive_counter,logbook_max_dive_counter_temp	; backup counter
 	movff	logbook_temp,logbook_temp_backup		; amount of dives drawn until now
 
 
 logbook_display_loop1:
-	decfsz	menupos1,F								; List full?
-	bra		logbook2								; no, search another dive for our current logbook page
+	decfsz	menupos1,F								; list full?
+	bra		logbook2								; NO - search another dive for our current logbook page
 
 logbook_display_loop2:
-	btfss	logbook_page_not_empty					; Was there one dive at all?
-	bra		logbook									; Yes, so reload the first page
+	btfss	logbook_page_not_empty					; was there one dive at all?
+	bra		logbook									; YES - so reload the first page
 
 	; TFT_mask...
 
@@ -373,23 +373,23 @@
 	WIN_TOP		logbook_row_offset*(logbook_row_number+.1)
 	STRCPY_TEXT_PRINT tExit							; "Exit"
 
-	movlw	d'1'									; Set cursor to position 1...
+	movlw	d'1'									; set cursor to position 1...
 	btfsc	return_from_profileview					; .. unless we are returning from a detail/profile view
 	movf	logbook_menupos_temp,W					; load last cursor position again
 	movwf	menupos1								; and set menupos1 byte
-	bcf		return_from_profileview					; Do this only once while the page is loaded again!
+	bcf		return_from_profileview					; do this only once while the page is loaded again
 
-	bcf		logbook_page_not_empty					; Obviously the current page is NOT empty
+	bcf		logbook_page_not_empty					; obviously the current page is NOT empty
 
-	movlw	d'7'									; Set cursor to position 7...
-	btfsc	keep_cursor_new_page					; ... if we came from the "new Page" line
+	movlw	d'7'									; set cursor to position 7...
+	btfsc	keep_cursor_new_page					; ... if we came from the "new page" line
 	movwf	menupos1								; and set menupos1 byte
 	bcf		keep_cursor_new_page
 
-	call	TFT_logbook_cursor						; Show the cursor
+	call	TFT_logbook_cursor						; show the cursor
 
-	call	logbook_preloop_tasks					; Clear some flags and set to Speed_eco
-	call	menu_processor_bottom_line				; Show bottom line
+	call	logbook_preloop_tasks					; clear some flags and set to Speed_eco
+	call	menu_processor_bottom_line				; show bottom line
 
 logbook_loop:
 	btfsc	switch_left								; SET/MENU?
@@ -397,15 +397,15 @@
 	btfsc	switch_right							; ENTER?
 	bra		display_profile_or_exit					; view details/profile or exit logbook
 
-	rcall	log_screendump_and_onesecond			; Check if we need to make a screen-shot and check for new second
-	btfsc	sleepmode								; Timeout?
-	bra		exit_logbook							; Yes
-	bra		logbook_loop							; Wait for something to do
+	rcall	log_screendump_and_onesecond			; check if we need to make a screen-shot and check for new second
+	btfsc	sleepmode								; timeout?
+	bra		exit_logbook							; YES
+	bra		logbook_loop							; NO  - wait for something to do
 
 display_profile_or_exit:
 	movlw	logbook_row_number+.2					; exit?
 	cpfseq	menupos1
-	bra		display_profile_or_exit2				; No, check for "Next Page"
+	bra		display_profile_or_exit2				; NO - check for "Next Page"
 
 exit_logbook:
 ;	call	TFT_DisplayOff
@@ -413,19 +413,19 @@
 	goto	do_main_menu2							; jump-back to menu_tree.asm
 
 display_profile_or_exit2:
-	movlw	logbook_row_number+.1					; Next page?
+	movlw	logbook_row_number+.1					; next page?
 	cpfseq	menupos1
-	bra		display_profile							; No, show details/profile
-	goto	next_logbook2							; Next page!
+	bra		display_profile							; NO - show details/profile
+	goto	next_logbook2							; next page
 
 display_profile:
-	bcf		is_bailout
-	bcf		gas6_changed							; Clear event flags
+	bcf		FLAG_bailout_mode
+	bcf		gas6_changed							; clear event flags
 ;	call	speed_fastest
 	movff	menupos1,logbook_menupos_temp			; store current cursor position
 	bsf		return_from_profileview					; tweak search routine to exit after found
 
-	movf	logbook_page_number,W					; Number of page
+	movf	logbook_page_number,W					; number of page
 	mullw	logbook_row_number
 	movf	PRODL,W
 	addwf	menupos1,W								; page * logbook_row_number + menupos1 =
@@ -434,14 +434,14 @@
 display_profile2:
 ;	call	speed_fastest
 	clrf	CCP1CON									; stop PWM
-	bcf		PORTC,2									; Pull PWM out to GND
+	bcf		PORTC,2									; pull PWM out to GND
 	call	TFT_boot
-;	call	TFT_ClearScreen							; Clear screen
-; Set ext_flash pointer to "#divenumber-oldest" dive
+;	call	TFT_ClearScreen							; clear screen
+; set ext_flash pointer to "#divenumber-oldest" dive
 ; compute read_int_eeprom .2 - divenumber
-; Read required header data for profile display
+; read required header data for profile display
 ; look in header for pointer to begin of dive profile (Byte 2-4)
-; Set pointer (ext_flash_log_pointer:3) to this address, start drawing
+; set pointer (ext_flash_log_pointer:3) to this address, start drawing
 
 	decf	divenumber,F							;-1
 	read_int_eeprom .2
@@ -469,22 +469,22 @@
 
 	; Now, show profile
 	LOG_POINT_TO log_samplingrate
-	call	ext_flash_byte_read						; Read sampling rate
+	call	ext_flash_byte_read						; read sampling rate
 	movff	ext_flash_rw,samplesecs_value			; needed later...
 
 	LOG_POINT_TO .2
-	call	ext_flash_byte_read_plus				; Read start address of profile
+	call	ext_flash_byte_read_plus				; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+0
-	call	ext_flash_byte_read_plus				; Read start address of profile
+	call	ext_flash_byte_read_plus				; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+1
-	call	ext_flash_byte_read_plus				; Read start address of profile
+	call	ext_flash_byte_read_plus				; read start address of profile
 	movff	ext_flash_rw,ext_flash_log_pointer+2
 
 	clrf	logbook_sample_counter+0
 	clrf	logbook_sample_counter+1				; holds amount of read samples
 
 	call	TFT_standard_color
-	call	logbook_show_divenumber					; Show the dive number in medium font
+	call	logbook_show_divenumber					; show the dive number in medium font
 
 	WIN_SMALL logbook_date_column, logbook_date_row
 	LOG_POINT_TO log_date
@@ -499,9 +499,9 @@
 
 	WIN_SMALL log_divetime_value_column,logbook_date_row	; align with surrounding data
 	LOG_POINT_TO log_divemode
-	call	ext_flash_byte_read_plus				; 0=OC, 1=CC, 2=Gauge, 3=Apnea into ext_flash_rw
-	movff	ext_flash_rw,lo
-	call	TFT_display_decotype_surface1			; "strcat_print"s divemode (OC, CC, APNEA or GAUGE)
+	call	ext_flash_byte_read_plus				; read dive mode
+	movff	ext_flash_rw,lo							; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR
+	call	TFT_display_decotype_surface1			; "strcat_print"s divemode (OC, CC, Gauge, Apnea or pSCR)
 
 	WIN_SMALL logbook_time_column, logbook_time_row
 	LOG_POINT_TO log_time
@@ -513,13 +513,13 @@
 	PUTC	':'
 	movff	hi,lo
 	output_99x										; minute
-	STRCAT_PRINT ""									; Display 1st row of details
+	STRCAT_PRINT ""									; display 1st row of details
 
 	LOG_POINT_TO	log_profile_version
-	call	ext_flash_byte_read_plus				; Profile version
+	call	ext_flash_byte_read_plus				; profile version
 	movlw	0x24
-	cpfslt	ext_flash_rw							; <0x24?
-	bra		log_skip_extra_icon						; Yes, skip
+	cpfslt	ext_flash_rw							; < 0x24 ?
+	bra		log_skip_extra_icon						; YES -  skip
 
 	WIN_SMALL logbook_time_column-.8, logbook_time_row
 	STRCPY_PRINT 0x94								; "End of dive" icon
@@ -535,7 +535,7 @@
 	movlw	profile_height_pixels					; pixel height available for profile
 	movwf	xB+0
 	clrf	xB+1
-	call	div16x16								; does xA/xB=xC
+	call	div16x16								; xC = xA / xB with xA as remainder
 	movff	xC+0,y_scale+0							; holds LOW  byte of y-scale (mbar/pixel!)
 	movff	xC+1,y_scale+1							; holds HIGH byte of y-scale (mbar/pixel!)
 	infsnz	y_scale+0,F								; increase one, because there may be a remainder
@@ -549,17 +549,17 @@
 	movwf	xC+2
 	clrf	xC+3
 
-	movff	lo,xB+0									; Max. Depth in mbar
-	movff	hi,xB+1									; Max. Depth in mbar
+	movff	lo,xB+0									; max. Depth in mbar
+	movff	hi,xB+1									; max. Depth in mbar
 	call	div32x16								; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 
 	movff	xC+0,x_scale+0
 	movff	xC+1,x_scale+1							; = Pixels/10m (For scale, draw any xx rows a scale-line)
 
 	movf	x_scale+0,W
-	iorwf	x_scale+1,W								; x_scale:2 = Null?
-	bnz		display_profile_offset4					; No, continue
-	incf	x_scale+1,F								; Yes, make x_scale+1>1 to make "display_profile2e" working
+	iorwf	x_scale+1,W								; x_scale:2 = Null ?
+	bnz		display_profile_offset4					; NO  - continue
+	incf	x_scale+1,F								; YES - make x_scale+1>1 to make "display_profile2e" working
 
 display_profile_offset4:
 	WIN_SMALL log_max_value_column,log_max_value_row
@@ -580,14 +580,14 @@
 	STRCAT_TEXT_PRINT tMeters
 
 display_profile_offset4_common:
-	call	ext_flash_byte_read_plus				; divetime in minutes	
+	call	ext_flash_byte_read_plus				; divetime in minutes
 	movff	ext_flash_rw,lo
 	call	ext_flash_byte_read_plus
 	movff	ext_flash_rw,hi							; divetime in minutes
 
 	movff	lo,xA+0									; calculate x-scale for profile display
 	movff	hi,xA+1									; calculate total diveseconds first
-	movlw	d'60'									; 60seconds are one minute...
+	movlw	d'60'									; 60 seconds are one minute
 	movwf	xB+0
 	clrf	xB+1
 	call	mult16x16								; result is in xC:2 !
@@ -599,7 +599,7 @@
 	movwf	xA+0
 	movlw	HIGH d'600'
 	movwf	xA+1									; a vertical line every 600 seconds
-	movff	samplesecs_value,xB+0					; Copy sampling rate
+	movff	samplesecs_value,xB+0					; copy sampling rate
 	clrf	xB+1
 	call	div16x16								; xA/xB=xC with xA as remainder
 	movff	xC+0,vertical_interval+0
@@ -609,9 +609,9 @@
 	; Restore divetime in minutes:
 	; get real sample time
 	LOG_POINT_TO log_total_seconds
-	call	ext_flash_byte_read_plus				; Total sample time in seconds
+	call	ext_flash_byte_read_plus				; total sample time in seconds
 	movff	ext_flash_rw,xC+0
-	call	ext_flash_byte_read_plus				; Total sample time in seconds
+	call	ext_flash_byte_read_plus				; total sample time in seconds
 	movff	ext_flash_rw,xC+1
 
 	PUTC	':'
@@ -623,16 +623,16 @@
 	movlw	profile_width_pixels					; pix width available
 	movwf	xB+0
 	clrf	xB+1
-	call	div16x16								; xA/xB=xC
+	call	div16x16								; xC = xA / xB with xA as remainder
 	movff	xC+0,xA+0
 	movff	xC+1,xA+1
-	movf	samplesecs_value,W						; divide through sample interval!
+	movf	samplesecs_value,W						; divide through sample interval
 	movwf	xB+0
 	clrf	xB+1
-	call	div16x16								; xA/xB=xC
+	call	div16x16								; xC = xA / xB with xA as remainder
 	movff	xC+0,profile_temp1+0					; store value (use any #xC sample, skip xC-1) into temp registers
 	movff	xC+1,profile_temp1+1					; store value (use any #xC sample, skip xC-1) into temp registers
-	infsnz	profile_temp1+0,F						; Increase by one, there might be a remainder
+	infsnz	profile_temp1+0,F						; increase by one, there might be a remainder
 	incf	profile_temp1+1,F
 
 	bsf		leftbind
@@ -640,53 +640,53 @@
 	call	TFT_standard_color
 	STRCAT_PRINT ""
 
-	call	ext_flash_byte_read_plus				; Read min. Temperature
+	call	ext_flash_byte_read_plus				; read min. temperature
 	movff	ext_flash_rw,logbook_min_tp+0
-	call	ext_flash_byte_read_plus				; Read min. Temperature
+	call	ext_flash_byte_read_plus				; read min. temperature
 	movff	ext_flash_rw,logbook_min_tp+1
 
 	; Set pointer to Gas 1 Type.
 	LOG_POINT_TO	log_gas1+.3
-	call	ext_flash_byte_read_plus				; read Gas Type
-	decfsz	ext_flash_rw,W							; =1 (="First")?
-	bra		logbook_find_first_gas2					; No.
+	call	ext_flash_byte_read_plus				; read gas type
+	decfsz	ext_flash_rw,W							; = 1 (= "First") ?
+	bra		logbook_find_first_gas2					; NO
 	movlw	.1
 	movwf	ext_flash_rw
 	bra		logbook_find_first_gas_done
 logbook_find_first_gas2:
 	; Set pointer to Gas 2 Type.
 	LOG_POINT_TO log_gas2+.3
-	call	ext_flash_byte_read_plus				; read Gas Type
-	decfsz	ext_flash_rw,W							; =1 (="First")?
-	bra		logbook_find_first_gas3					; No.
+	call	ext_flash_byte_read_plus				; read gas type
+	decfsz	ext_flash_rw,W							; = 1 (= "First") ?
+	bra		logbook_find_first_gas3					; NO
 	movlw	.2
 	movwf	ext_flash_rw
 	bra		logbook_find_first_gas_done
 logbook_find_first_gas3:
 	; Set pointer to Gas 3 Type.
 	LOG_POINT_TO log_gas3+.3
-	call	ext_flash_byte_read_plus				; read Gas Type
-	decfsz	ext_flash_rw,W							; =1 (="First")?
-	bra		logbook_find_first_gas4					; No.
+	call	ext_flash_byte_read_plus				; read gas type
+	decfsz	ext_flash_rw,W							; = 1 (= "First") ?
+	bra		logbook_find_first_gas4					; NO
 	movlw	.3
 	movwf	ext_flash_rw
 	bra		logbook_find_first_gas_done
 logbook_find_first_gas4:
 	; Set pointer to Gas 4 Type.
 	LOG_POINT_TO log_gas4+.3
-	call	ext_flash_byte_read_plus				; read Gas Type
-	decfsz	ext_flash_rw,W							; =1 (="First")?
-	bra		logbook_find_first_gas5					; No.
+	call	ext_flash_byte_read_plus				; read gas type
+	decfsz	ext_flash_rw,W							; = 1 (= "First") ?
+	bra		logbook_find_first_gas5					; NO
 	movlw	.4
 	movwf	ext_flash_rw
 	bra		logbook_find_first_gas_done
 logbook_find_first_gas5:
-	movlw	.5										; Must be Gas5
+	movlw	.5										; must be Gas 5
 	movwf	ext_flash_rw
 logbook_find_first_gas_done:
 	movff	ext_flash_rw,backup_color1				; keep copy to restore color
 	movff	ext_flash_rw,WREG						; copy gas number to WREG for color coding
-	call	TFT_color_code_gas						; Back to normal profile color.
+	call	TFT_color_code_gas						; back to normal profile color
 	; Pointer is now trashed!
 
 	; Point to profile portion of this dive
@@ -694,16 +694,16 @@
 	movff	ext_flash_log_pointer+1,ext_flash_address+1
 	movff	ext_flash_log_pointer+2,ext_flash_address+2
 
-	incf_ext_flash_address_0x20 d'2'				; Skip 0xFA 0xFA
-	call	ext_flash_byte_read_plus_0x20			; Read low byte of total dives into ext_flash_rw (at the time the dive was made)
+	incf_ext_flash_address_0x20 d'2'				; skip 0xFA 0xFA
+	call	ext_flash_byte_read_plus_0x20			; read low byte of total dives into ext_flash_rw (at the time the dive was made)
 
 	; Load total number of dives (low byte only)
 	read_int_eeprom .2
 	incf	EEDATA,W								; +1
-	bsf		STATUS,C								; Set borrow
+	bsf		STATUS,C								; set borrow
 	subfwb	divenumber,W							; total dives - dive# to show - 1 = low byte of total dives (at the time the dive was made)
 	cpfseq	ext_flash_rw							; # of dive in logbook (Must be equal with low byte in short header)
-	bra		display_profile_no_profile				; Not equal, no profile for this dive available!
+	bra		display_profile_no_profile				; not equal, no profile for this dive available
 
 	; Skip rest of short header: 3 Bytes
 	; Skip length of profile data: 3 Bytes
@@ -711,84 +711,84 @@
 	; Skip number of divisors: 1Byte
 	incf_ext_flash_address_0x20 d'8'
 
-; Divisor temp
+; divisor temp
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
 	movf	ext_flash_rw,W
-	movwf	divisor_temperature						; Store divisor
-	movwf	count_temperature						; Store to tp° counter too.
-; Divisor Deco
+	movwf	divisor_temperature						; store divisor
+	movwf	count_temperature						; store to tp° counter, too
+; divisor deco
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
 	movf	ext_flash_rw,W
-	movwf	divisor_deco							; Store divisor
-	movwf	count_deco								; Store as temp, too
-; Divisor GF
+	movwf	divisor_deco							; store divisor
+	movwf	count_deco								; store as temp, too
+; divisor GF
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
-	movff	ext_flash_rw,divisor_gf					; Store divisor
-; Divisor ppO2 Sensors
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
+	movff	ext_flash_rw,divisor_gf					; store divisor
+; divisor ppO2 sensors
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
-	movff	ext_flash_rw,divisor_ppo2_sensors		; Store divisor
-; Divisor decoplan
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
+	movff	ext_flash_rw,divisor_ppo2_sensors		; store divisor
+; divisor decoplan
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
-	movff	ext_flash_rw,divisor_decoplan			; Store divisor
-; Divisor CNS
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
+	movff	ext_flash_rw,divisor_decoplan			; store divisor
+; divisor CNS
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
-	movff	ext_flash_rw,divisor_cns				; Store divisor
-; Divisor Tank data
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
+	movff	ext_flash_rw,divisor_cns				; store divisor
+; divisor tank data
 	incf_ext_flash_address_0x20 d'2'
-;	call	ext_flash_byte_read_plus_0x20			; Read information type
-;	call	ext_flash_byte_read_plus_0x20			; Read information Length
-	call	ext_flash_byte_read_plus_0x20			; Read information Divisor
-	movff	ext_flash_rw,divisor_tank				; Store divisor
+;	call	ext_flash_byte_read_plus_0x20			; read information type
+;	call	ext_flash_byte_read_plus_0x20			; read information length
+	call	ext_flash_byte_read_plus_0x20			; read information divisor
+	movff	ext_flash_rw,divisor_tank				; store divisor
 
-	; Start Profile display
+	; Start profile display
 	movlw	color_deepblue
-	call	TFT_set_color							; Make this configurable?
+	call	TFT_set_color
 	; Draw a frame around profile area
 	WIN_FRAME_COLOR16 profile_top-1,profile_top+profile_height_pixels+1,profile_left-1,profile_left+profile_width_pixels+1
 
 	movlw	profile_top
 	movwf	win_top
 	movlw	profile_left
-	movwf	win_leftx2								; Left border (0-159)
+	movwf	win_leftx2								; left border (0-159)
 	movlw	d'1'
 	movwf	win_height
 	movlw	profile_width_pixels+.1
-	movwf	win_width+0								; Right border (0-159)
+	movwf	win_width+0								; right border (0-159)
 	clrf	win_width+1
-	bra		display_profile2f						; No 0m line
+	bra		display_profile2f						; no 0m line
 display_profile2e:
-	call	TFT_box									; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2
+	call	TFT_box									; inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2
 display_profile2f:
-	movf	win_top,W								; Get row
-	addwf	x_scale+0,W								; Add line interval distance to win_top
-	tstfsz	x_scale+1								; >255?
-	movlw	d'255'									; Yes, make win_top>239 -> Abort here
-	btfsc	STATUS,C								; A Cary from the addwf above?
-	movlw	d'255'									; Yes, make win_top>239 -> Abort here
-	movwf	win_top									; Result in win_top again
-	movlw	profile_top+profile_height_pixels+.1	; Limit
-	cpfsgt	win_top									; >239?
-	bra		display_profile2e						; No, draw another line
+	movf	win_top,W								; get row
+	addwf	x_scale+0,W								; add line interval distance to win_top
+	tstfsz	x_scale+1								; > 255 ?
+	movlw	d'255'									; YES - make win_top>239 -> abort here
+	btfsc	STATUS,C								; a carry from the addwf above?
+	movlw	d'255'									; YES - make win_top>239 -> abort here
+	movwf	win_top									; result in win_top again
+	movlw	profile_top+profile_height_pixels+.1	; limit
+	cpfsgt	win_top									; > 239 ?
+	bra		display_profile2e						; NO - draw another line
 
-	clrf	gaslist_gas						; here: used as counter for depth readings
+	clrf	gaslist_gas								; here: used as counter for depth readings
 	movlw	profile_width_pixels+profile_left-.1
 	movwf	ignore_digits							; here: used as counter for x-pixels
 	bcf		end_of_profile							; clear flag
@@ -796,23 +796,23 @@
 	movlw	profile_left+.1
 	movwf	logbook_pixel_x_pos						; here: used as colum x2 (Start at Colum 5)
 
-	movlw	profile_top+.1							; Zero-m row
+	movlw	profile_top+.1							; zero-m row
 	movwf	fill_between_rows
-	movwf	logbook_last_tp							; Initialize for Tp° curve too.
+	movwf	logbook_last_tp							; initialize for Tp° curve, too
 
-	movlw	LOW(-.100)								; Initialize max tp° to -10.0 °C.
+	movlw	LOW(-.100)								; initialize max tp° to -10.0 °C
 	movwf	logbook_max_tp+0
 	movlw	HIGH 0xFFFF & (-.100)
 	movwf	logbook_max_tp+1
 
-	setf	logbook_cur_tp+0						; Initialize Tp°, before the first recorded point.
+	setf	logbook_cur_tp+0						; initialize Tp°, before the first recorded point
 	setf	logbook_cur_tp+1
-	clrf	logbook_last_tp							; Also reset previous Y for Tp°
-	clrf	logbook_ceiling							; Ceiling = 0, correct value for no ceiling.
+	clrf	logbook_last_tp							; also reset previous Y for Tp°
+	clrf	logbook_ceiling							; Ceiling = 0, correct value for no ceiling
 	movlw	profile_top+.1
-	movwf	logbook_min_temp_pos					; Initialize for displaying the lowest temperature
+	movwf	logbook_min_temp_pos					; initialize for displaying the lowest temperature
 	movlw	profile_top+profile_height_pixels
-	movwf	logbook_max_temp_pos					; Initialize for displaying the highest temperature
+	movwf	logbook_max_temp_pos					; initialize for displaying the highest temperature
 
 	movlw	profile_left
 	movwf	win_leftx2
@@ -835,77 +835,77 @@
 	call	pixel_write_col320
 
 	movff	profile_temp1+0,profile_temp2+0
-	movff	profile_temp1+1,profile_temp2+1			; 16Bit x-scaler
+	movff	profile_temp1+1,profile_temp2+1			; 16bit x-scaler
 	incf	profile_temp2+1,F
-	tstfsz	profile_temp2+0							; Must not be Zero
-	bra		profile_display_loop2					; Not Zero!
-	incf	profile_temp2+0,F						; Zero, Increase!
+	tstfsz	profile_temp2+0							; must not be zero
+	bra		profile_display_loop2					; not Zero
+	incf	profile_temp2+0,F						; zero, increase
 
 profile_display_loop2:
 	rcall	profile_view_get_depth					; reads depth, temp and profile data
 
 	btfsc	end_of_profile							; end-of profile reached?
-	bra		profile_display_loop_done				; Yes, skip all remaining pixels
+	bra		profile_display_loop_done				; YES - skip all remaining pixels
 
 
 	;---- Draw Ceiling curve, if any ---------------------------------------------
 	movf	divisor_deco,W
 	bz		profile_display_skip_deco
 
-	movf	logbook_ceiling,W						; Any deco ceiling ?
+	movf	logbook_ceiling,W						; any deco ceiling?
 	bz		profile_display_skip_deco
 
-	mullw	.100									; Yes: convert to mbar
+	mullw	.100									; YES - convert to mbar
 	movff	PRODL,sub_a+0
 	movff	PRODH,sub_a+1
-	movff	logbook_cur_depth+0,sub_b+0				; Compare with UNSIGNED current depth (16bits)
+	movff	logbook_cur_depth+0,sub_b+0				; compare with UNSIGNED current depth (16bits)
 	movff	logbook_cur_depth+1,sub_b+1
 	call	subU16									; set (or not) neg_flag
 
-	movlw	color_dark_green						; Dark green if Ok,
+	movlw	color_dark_green						; dark green if ok
 	btfss	neg_flag
-	movlw	color_dark_red							; Or dark red if ceiling overflown.
+	movlw	color_dark_red							; dark red if ceiling is violated
 	call	TFT_set_color
 
 	movff	PRODL,xA+0
 	movff	PRODH,xA+1
 	movff	y_scale+0,xB+0							; divide pressure in mbar/quant for row offset
 	movff	y_scale+1,xB+1
-	call	div16x16								; xA/xB=xC
+	call	div16x16								; xC = xA / xB with xA as remainder
 
-	movlw	profile_top+.1							; Starts right after the top line.
+	movlw	profile_top+.1							; starts right after the top line
 	movwf	win_top
-	movff	logbook_pixel_x_pos,win_leftx2			; Left border (0-159)
+	movff	logbook_pixel_x_pos,win_leftx2			; left border (0-159)
 	movff	xC+0,win_height
-	call	half_vertical_line						; Inputs: win_top, win_leftx2, win_height, win_color1, win_color2
+	call	half_vertical_line						; inputs: win_top, win_leftx2, win_height, win_color1, win_color2
 
 profile_display_skip_deco:
 	;---- Draw Tp° curve, if any ---------------------------------------------
 	movf	divisor_temperature,W
 	bz		profile_display_skip_temp
 
-	movf	logbook_cur_tp+0,W						; Did we had already a valid Tp°C record ?
+	movf	logbook_cur_tp+0,W						; did we had already a valid Tp°C record?
 	andwf	logbook_cur_tp+1,W
 	incf	WREG
-	bz		profile_display_skip_temp				; No: just skip drawing.
+	bz		profile_display_skip_temp				; NO - just skip drawing.
 
 	movlw	LOW  (((profile_height_pixels-.10)*.256)/.370)	 ; fixed tp° scale: (-2 .. +35°C * scale256 )/153pix
 	movwf	xB+0
 	movlw	HIGH (((profile_height_pixels-.10)*.256)/.370)
 	movwf	xB+1
 
-	movf	logbook_cur_tp+0,W						; Current Tp° - (-2.0°C) == Tp° + 20.
-	addlw	LOW(.20)								; Low byte.
+	movf	logbook_cur_tp+0,W						; current Tp° - (-2.0°C) == Tp° + 20
+	addlw	LOW(.20)								; low byte
 	movwf	xA+0
 	movf	logbook_cur_tp+1,W
-	btfsc	STATUS,C								; Propagate carry, if any
+	btfsc	STATUS,C								; propagate carry, if any
 	incf	WREG
 	movwf	xA+1
 	call	mult16x16								; xA*xB=xC
 
 	; scale: divide by 256, ie. take just high byte.
 	movf	xC+1,W
-	sublw	profile_top+profile_height_pixels-.10	; Upside-down: Y = .75 + (.153 - result)
+	sublw	profile_top+profile_height_pixels-.10	; upside-down: Y = .75 + (.153 - result)
 	movwf	xC+0
 
 	; Check limits
@@ -917,10 +917,10 @@
 	movlw	color_orange
 	call	TFT_set_color
 
-	movf	logbook_last_tp,W						; do we have a valid previous value ?
-	bz		profile_display_temp_1					; No: skip the vertical line.
+	movf	logbook_last_tp,W						; do we have a valid previous value?
+	bz		profile_display_temp_1					; NO - skip the vertical line.
 	movwf	xC+1
-	call	profile_display_fill					; In this column between this row (xC+0) and the last row (xC+1)
+	call	profile_display_fill					; in this column between this row (xC+0) and the last row (xC+1)
 profile_display_temp_1:
 	movf	xC+0,W									; current row
 	cpfsgt	logbook_min_temp_pos					; check limit
@@ -929,7 +929,7 @@
 	movwf	logbook_max_temp_pos					; highest row in the temp graph
 
 	movff	xC+0,logbook_last_tp
-	PIXEL_WRITE logbook_pixel_x_pos,xC+0			; Set col(0..159) x row (0..239), put a current color pixel.
+	PIXEL_WRITE logbook_pixel_x_pos,xC+0			; set col(0..159) x row (0..239), put a current color pixel
 
 profile_display_skip_temp:
 	;---- Draw depth curve ---------------------------------------------------
@@ -937,26 +937,26 @@
 	movff	y_scale+1,xB+1
 	movff	logbook_cur_depth+0,xA+0
 	movff	logbook_cur_depth+1,xA+1
-	call	div16x16								; xA/xB=xC
+	call	div16x16								; xC = xA / xB with xA as remainder
 	movlw	profile_top+.1
 	addwf	xC+0,F									; add 75 pixel offset to result
 
-	btfsc	STATUS,C								; Ignore potential profile errors
+	btfsc	STATUS,C								; ignore potential profile errors
 	movff	fill_between_rows,xC+0
 
 	movff	backup_color1,WREG						; copy gas number to WREG for color-coding
-	call	TFT_color_code_gas						; Back to normal profile color.
+	call	TFT_color_code_gas						; back to normal profile color.
 
 	movff	fill_between_rows,xC+1
-	call	profile_display_fill					; In this column between this row (xC+0) and the last row (xC+1)
-	movff	xC+0,fill_between_rows					; Store last row for fill routine
+	call	profile_display_fill					; in this column between this row (xC+0) and the last row (xC+1)
+	movff	xC+0,fill_between_rows					; store last row for fill routine
 
-	PIXEL_WRITE logbook_pixel_x_pos,xC+0			; Set col(0..159) x row (0..239), put a std color pixel.
-	incf	logbook_pixel_x_pos,F					; Next column
+	PIXEL_WRITE logbook_pixel_x_pos,xC+0			; set col(0..159) x row (0..239), put a std color pixel
+	incf	logbook_pixel_x_pos,F					; next column
 
 	;---- Draw Marker square , if any ----------------------------------------
-	btfss	log_marker_found						; Any marker to draw?
-	bra		profile_display_skip_marker				; No
+	btfss	log_marker_found						; any marker to draw?
+	bra		profile_display_skip_marker				; NO
 
 	; tiny "m"
 	incf	fill_between_rows,W						; increase row (Y)
@@ -977,7 +977,7 @@
 	WIN_FONT FT_TINY
 	lfsr	FSR2,buffer
 	STRCPY_PRINT "m"
-	bcf		log_marker_found						; Clear flag
+	bcf		log_marker_found						; clear flag
 
 	movlw	profile_left
 	movwf	win_leftx2
@@ -996,7 +996,7 @@
 	movf	divisor_cns,W
 	bz		profile_display_skip_cns
 	;
-	; TODO HERE 
+	; add further code here...
 	;
 profile_display_skip_cns:
 
@@ -1004,60 +1004,60 @@
 	movf	divisor_gf,W
 	bz		profile_display_skip_gf
 	;
-	; TODO HERE 
+	; add further code here...
 	;
 profile_display_skip_gf:
 
-	;---- All curves done.
+	;---- All curves done
 
-profile_display_skip_loop1:							; skips readings!
+profile_display_skip_loop1:							; skips readings
 	dcfsnz	profile_temp2+0,F
-	bra		profile_display_loop3					; check 16bit....
+	bra		profile_display_loop3					; check 16bit
 
 	rcall	profile_view_get_depth					; reads depth, temp and profile data
 
 	btfsc	end_of_profile							; end-of profile reached?
-	bra		profile_display_loop_done				; Yes, skip all remaining pixels
+	bra		profile_display_loop_done				; YES - skip all remaining pixels
 
 	bra		profile_display_skip_loop1
 
 profile_display_loop3:
 	decfsz	profile_temp2+1,F						; 16 bit x-scaler test
-	bra		profile_display_skip_loop1				; skips readings!
+	bra		profile_display_skip_loop1				; skips readings
 
 	decfsz	ignore_digits,F							; counts drawn x-pixels to zero
-	bra		profile_display_loop					; Not ready yet
-	; Done.
+	bra		profile_display_loop					; not ready yet
+	; done
 
-display_profile_no_profile:							; No profile available for this dive!
+display_profile_no_profile:							; no profile available for this dive
 
 profile_display_loop_done:
-	btfss	is_bailout								; Bailout during the dive?
-	bra		profile_display_loop_done_nobail		; No
-	; Yes, show "Bailout"
+	btfss	FLAG_bailout_mode						; bailout during the dive?
+	bra		profile_display_loop_done_nobail		; NO
+													; YES - show "Bailout"
 	movlw	color_pink
 	call	TFT_set_color
 	WIN_TINY logbook_bailout_column,logbook_bailout_row
-	STRCPY_TEXT_PRINT tDiveBailout					; Bailout
+	STRCPY_TEXT_PRINT tDiveBailout					; bailout
 profile_display_loop_done_nobail:
 	btfss	gas6_changed							; Gas6
-	bra		profile_display_loop_done_nogas6		; No
+	bra		profile_display_loop_done_nogas6		; NO
 	; Yes, show "Gas 6!"
 	movlw	color_pink
 	call	TFT_set_color
 	WIN_TINY logbook_bailout_column,logbook_bailout_row-.15
-	STRCPY_TEXT tGas								; Gas
+	STRCPY_TEXT tGas								; gas
 	STRCAT_PRINT " 6!"
 
 profile_display_loop_done_nogas6:
-	decf	divenumber,F							;-1
+	decf	divenumber,F							; -1
 	read_int_eeprom .2
 	movf	EEDATA,W
 	bcf		STATUS,C
-	subfwb	divenumber,W							; max. dives (low value) - divenumber
+	subfwb	divenumber,W							; max. dives (low value) - dive number
 	movwf	lo										; result
-	incf	divenumber,F							;+1
-	; Set ext_flash_address:3 to TOC entry of this dive
+	incf	divenumber,F							; +1
+	; set ext_flash_address:3 to TOC entry of this dive
 	; 1st: 200000h-200FFFh -> lo=0
 	; 2nd: 201000h-201FFFh -> lo=1
 	; 3rd: 202000h-202FFFh -> lo=2
@@ -1080,7 +1080,7 @@
 	cpfslt	win_leftx2								; limit left border to 130
 	movwf	win_leftx2
 	WIN_FONT FT_TINY
-	movlw	color_orange							; Use same color as tp° curve
+	movlw	color_orange							; use same color as tp° curve
 	call	TFT_set_color
 
 	movff	logbook_min_tp+0,lo
@@ -1092,8 +1092,8 @@
 ;logbook_show_temp_imperial:
 	call	TFT_convert_signed_16bit				; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
 	call	convert_celsius_to_fahrenheit			; convert value in lo:hi from Celsius to Fahrenheit
-	lfsr	FSR2,buffer								; Overwrite "-"
-	bsf		ignore_digit5							; Full degrees only
+	lfsr	FSR2,buffer								; overwrite "-"
+	bsf		ignore_digit5							; full degrees only
 	output_16
 	STRCAT_TEXT_PRINT tLogTunitF
 	; Now, the max. temperature
@@ -1121,7 +1121,7 @@
 	; Now, the max. temperature
 	movlw	.15
 	subwf	logbook_max_temp_pos,W
-	movwf	win_top		; Y position at max temperature
+	movwf	win_top									; Y position at max temperature
 	movff	logbook_max_tp+0,lo
 	movff	logbook_max_tp+1,hi
 	lfsr	FSR2,buffer
@@ -1142,64 +1142,59 @@
 	bsf		leftbind
 
 	WIN_TINY log_gas_column1, log_gas_row
-	movlw	.1										; Color for Gas 1
+	movlw	.1										; color for gas 1
 	call	log_show_gas
 
 	WIN_TINY log_gas_column2, log_gas_row
-	movlw	.2										; Color for Gas 2
+	movlw	.2										; color for gas 2
 	call	log_show_gas
 
 	WIN_TINY log_gas_column3, log_gas_row
-	movlw	.3										; Color for Gas 3
+	movlw	.3										; color for gas 3
 	call	log_show_gas
 
 	WIN_TINY log_gas_column4, log_gas_row
-	movlw	.4										; Color for Gas 4
+	movlw	.4										; color for gas 4
 	call	log_show_gas
 
 	WIN_TINY log_gas_column5, log_gas_row
-	movlw	.5										; Color for Gas 5
+	movlw	.5										; color for gas 5
 	call	log_show_gas
 
 	bcf		leftbind
 
-	rcall	logbook_preloop_tasks					; Clear some flags and set to Speed_eco
+	rcall	logbook_preloop_tasks					; clear some flags and set to Speed_eco
 display_profile_loop:
 	btfsc	switch_right
-	bra		logbook_page2							; Show more information
+	bra		logbook_page2							; show more information
 	btfsc	switch_left
 	bra		exit_profileview						; back to list
 
-	rcall	log_screendump_and_onesecond			; Check if we need to make a screen-shot and check for new second
-	btfsc	sleepmode								; Timeout?
+	rcall	log_screendump_and_onesecond			; check if we need to make a screen-shot and check for new second
+	btfsc	sleepmode								; timeout?
 	bra		exit_profileview						; back to list
 	bra		display_profile_loop					; wait for something to do
 
 	global	log_screendump_and_onesecond
-log_screendump_and_onesecond:						; Check if we need to make a screen-shot and check for new second
+log_screendump_and_onesecond:						; check if we need to make a screen-shot and check for new second
 	btfsc	onesecupdate
-	call	timeout_surfmode						; Timeout
+	call	timeout_surfmode						; timeout
 	btfsc	onesecupdate
-	call	set_dive_modes							; Check, if divemode must be entered
+	call	set_dive_modes							; check if divemode needs to be entered
 	bcf		onesecupdate							; one second update
 	btfsc	divemode
-	goto	restart									; Enter divemode if required
+	goto	restart									; enter divemode if required
 
-	btfsc	enable_screen_dumps						; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	bra		log_screendump_and_onesecond2
+ IFDEF _screendump
+	btfsc	enable_screen_dumps						; screendump enabled?
+	call	TFT_dump_screen_check					; YES - check if requested and do it
+ ENDIF
+
 	btfsc	vusb_in									; USB plugged in?
-	call	comm_mode								; Start COMM mode
+	goto	comm_mode								; YES - start COMM mode and return
+
 	return
-log_screendump_and_onesecond2:
-	btfss	vusb_in									; USB (still) plugged in?
-	bcf		enable_screen_dumps						; No, clear flag
-	call	rs232_get_byte
-	btfsc	rs232_receive_overflow
-	return
-	movlw	"l"
-	cpfseq	RCREG1
-	return
-	goto	TFT_dump_screen							; Dump the screen contents and return
+
 
 ;=============================================================================
 ; Draw a vertical line between xC+1 and xC+0, at current X position.
@@ -1210,11 +1205,11 @@
 profile_display_fill:
 	; First, check if xC+0 > fill_between_rows or xC+0 < aponoe_mins
 	movf	xC+0,W
-	cpfseq	xC+1									; xC+0 = apone_mins?
-	bra		profile_display_fill2					; No!
+	cpfseq	xC+1									; xC+0 = apone_mins ?
+	bra		profile_display_fill2					; NO
 	return
 
-profile_display_fill2:	
+profile_display_fill2:
 	; Make sure to init X position.
 	movf	logbook_pixel_x_pos,W
 	mullw	2
@@ -1224,26 +1219,26 @@
 	call	pixel_write_col320
 
 	movf	xC+0,W
-	cpfsgt	xC+1									; fill_between_rows > xC+0?
-	bra		profile_display_fill_up					; Yes!
+	cpfsgt	xC+1									; fill_between_rows > xC+0 ?
+	bra		profile_display_fill_up					; YES
 
-profile_display_fill_down2:							; Loop
+profile_display_fill_down2:							; loop
 	decf	xC+1,F
 
-	HALF_PIXEL_WRITE xC+1							; Updates just row (0..239)
+	HALF_PIXEL_WRITE xC+1							; updates just row (0..239)
 
 	movf	xC+0,W
-	cpfseq	xC+1									; Loop until xC+1 = xC+0
+	cpfseq	xC+1									; loop until xC+1 = xC+0
 	bra		profile_display_fill_down2
 	return											; fill_between_rows and xC+0 are untouched
 
-profile_display_fill_up:							; Fill upwards from xC+0 to apone_mins!
+profile_display_fill_up:							; fill upwards from xC+0 to apone_mins!
 	incf	xC+1,F
 
-	HALF_PIXEL_WRITE xC+1							; Updates just row (0..239)
+	HALF_PIXEL_WRITE xC+1							; updates just row (0..239)
 
 	movf	xC+0,W
-	cpfseq	xC+1									; Loop until xC+1 = fill_between_rows
+	cpfseq	xC+1									; loop until xC+1 = fill_between_rows
 	bra		profile_display_fill_up
 	return											; fill_between_rows and xC+0 are untouched
 
@@ -1252,7 +1247,7 @@
 
 profile_view_get_depth:
 	infsnz	logbook_sample_counter+0,F
-	incf	logbook_sample_counter+1,F				; Count read pixels
+	incf	logbook_sample_counter+1,F				; count read pixels
 
 	movf	logbook_sample_counter+0,W
 	cpfseq	vertical_interval+0
@@ -1266,16 +1261,16 @@
 
 	; Vertical lines...
 	movlw	color_deepblue
-	call	TFT_set_color							; Make this configurable?
+	call	TFT_set_color
 	movlw	profile_top+.1
 	movwf	win_top
 	incf	logbook_pixel_x_pos,W					; draw one line to right to make sure it's the background of the profile
-	movwf	win_leftx2								; Left border (0-159)
+	movwf	win_leftx2								; left border (0-159)
 	movlw	profile_height_pixels
 	movwf	win_height
 	movlw	profile_height_pixels
-	movwf	win_width								; "Window" height
-	call	half_horizontal_line					; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2
+	movwf	win_width								; "window" height
+	call	half_horizontal_line					; inputs: win_top, win_leftx2, win_width, win_color1, win_color2
 
 profile_view_get_depth_no_line:
 	call	ext_flash_byte_read_plus_0x20			; read depth first
@@ -1283,30 +1278,30 @@
 	call	ext_flash_byte_read_plus_0x20			; read depth first
 	movff	ext_flash_rw,logbook_cur_depth+1		; high value
 	call	ext_flash_byte_read_plus_0x20			; read Profile Flag Byte
-	movff	ext_flash_rw,gaslist_gas			; store Profile Flag Byte
+	movff	ext_flash_rw,gaslist_gas				; store Profile Flag Byte
 
 	bcf		event_occured							; clear flag
 	btfsc	gaslist_gas,7
-	bsf		event_occured							; We also have an Event byte!
-	bcf		gaslist_gas,7						; Clear Event Byte Flag (If any)
+	bsf		event_occured							; we also have an event byte
+	bcf		gaslist_gas,7							; clear event byte flag (if any)
 	; gaslist_gas now holds the number of additional bytes to ignore (0-127)
-	movlw	0xFD									; end of profile bytes?
+	movlw	0xFD									; end of profile bytes ?
 	cpfseq	logbook_cur_depth+0
 	bra		profile_view_get_depth_new1				; no 1st. 0xFD
 	cpfseq	logbook_cur_depth+1
 	bra		profile_view_get_depth_new1				; no 2nd. 0xFD
-	bsf		end_of_profile							; End found! Set Flag! Skip remaining pixels!
+	bsf		end_of_profile							; end found - set flag, skip remaining pixels
 	return
 
 profile_view_get_depth_new1:
-	btfsc	event_occured							; Was there an event attached to this sample?
-	rcall	profile_view_get_depth_events			; Yes, get information about this event(s)
+	btfsc	event_occured							; was there an event attached to this sample?
+	rcall	profile_view_get_depth_events			; YES - get information about this event(s)
 
-	;---- Read Tp°, if any AND divisor reached AND bytes available -----------
-	movf	divisor_temperature,W					; Is Tp° divisor null ?
-	bz		profile_view_get_depth_no_tp			; Yes: no Tp° curve.
-	decf	count_temperature,F						; Decrement tp° counter
-	bnz		profile_view_get_depth_no_tp			; No temperature this time
+	;---- read Tp°, if any AND divisor reached AND bytes available -----------
+	movf	divisor_temperature,W					; is Tp° divisor null ?
+	bz		profile_view_get_depth_no_tp			; YES - no Tp° curve
+	decf	count_temperature,F						; decrement tp° counter
+	bnz		profile_view_get_depth_no_tp			; no temperature this time
 
 	call	ext_flash_byte_read_plus_0x20			; Tp° low
 	decf	gaslist_gas,F
@@ -1314,10 +1309,10 @@
 	call	ext_flash_byte_read_plus_0x20			; Tp° high
 	decf	gaslist_gas,F
 	movff	ext_flash_rw,logbook_cur_tp+1
-	movff	divisor_temperature,count_temperature	; Restart counter.
+	movff	divisor_temperature,count_temperature	; restart counter
 
 	; Compute Tp° max on the fly...
-	movff	logbook_cur_tp+0,sub_a+0				; Compare cur_tp > max_tp ?
+	movff	logbook_cur_tp+0,sub_a+0				; compare cur_tp > max_tp ?
 	movff	logbook_cur_tp+1,sub_a+1
 	movff	logbook_max_tp+0,sub_b+0
 	movff	logbook_max_tp+1,sub_b+1
@@ -1326,8 +1321,8 @@
 	bra		profile_view_get_depth_no_tp
 
 	; store max. temp only below start_dive_threshold (1,0m)
-	tstfsz	logbook_cur_depth+1						; > 2,56m?
-	bra		profile_view_compute_max_temp			; Yes, include in max. temp measurement
+	tstfsz	logbook_cur_depth+1						; > 2,56m ?
+	bra		profile_view_compute_max_temp			; YES - include in max. temp measurement
 	movlw	start_dive_threshold					; 1,0m
 	cpfsgt	logbook_cur_depth+0						; low value
 	bra		profile_view_get_depth_no_tp			; above 1,0m, ignore temp
@@ -1336,7 +1331,7 @@
 	movff	logbook_cur_tp+0,logbook_max_tp+0
 	movff	logbook_cur_tp+1,logbook_max_tp+1
 
-	;---- Read deco, if any AND divisor=0 AND bytes available ----------------
+	;---- read deco, if any AND divisor=0 AND bytes available ----------------
 profile_view_get_depth_no_tp:
 	movf	divisor_deco,W
 	bz		profile_view_get_depth_no_deco
@@ -1346,95 +1341,97 @@
 	call	ext_flash_byte_read_plus_0x20
 	decf	gaslist_gas,F
 	movff	ext_flash_rw,logbook_ceiling
-	movff	divisor_deco,count_deco					; Restart counter.
-	call	ext_flash_byte_read_plus_0x20			; Skip stop length
+	movff	divisor_deco,count_deco					; restart counter
+	call	ext_flash_byte_read_plus_0x20			; skip stop length
 	decf	gaslist_gas,F
 
-	;---- Read GF, if any AND divisor=0 AND bytes available ------------------
+	;---- read GF, if any AND divisor=0 AND bytes available ------------------
 profile_view_get_depth_no_deco:
 	; Then skip remaining bytes...
-	movf	gaslist_gas,W						; number of additional bytes to ignore (0-127)
-	tstfsz	gaslist_gas						; Anything to skip?
-	call	incf_ext_flash_address0_0x20			; Yes, increases bytes in ext_flash_address:3 with 0x200000 bank switching
+	movf	gaslist_gas,W							; number of additional bytes to ignore (0-127)
+	tstfsz	gaslist_gas								; anything to skip?
+	call	incf_ext_flash_address0_0x20			; YES - increases bytes in ext_flash_address:3 with 0x200000 bank switching
 	return
 
 profile_view_get_depth_events:
-	clrf	EventByte2								; Clear EventByte2
-	call	ext_flash_byte_read_plus_0x20			; Read Event byte
+	clrf	EventByte2								; clear EventByte2
+	call	ext_flash_byte_read_plus_0x20			; read event byte
 	movff	ext_flash_rw,EventByte1					; store EventByte1
-	decf	gaslist_gas,F						; reduce counter
+	decf	gaslist_gas,F							; reduce counter
 
-	btfss	EventByte1,7							; Another Event byte?
-	bra		profile_no_second_eventbyte				; No
-	call	ext_flash_byte_read_plus_0x20			; Read Event byte2
-	movff	ext_flash_rw,EventByte2						; store EventByte2
-	decf	gaslist_gas,F						; reduce counter
-	bcf		EventByte1,7							; Clear flag
+	btfss	EventByte1,7							; another event byte?
+	bra		profile_no_second_eventbyte				; NO
+	call	ext_flash_byte_read_plus_0x20			; read  EventByte2
+	movff	ext_flash_rw,EventByte2					; store EventByte2
+	decf	gaslist_gas,F							; reduce counter
+	bcf		EventByte1,7							; clear flag
 
 profile_no_second_eventbyte:
 	; Check event flags in the EventBytes
-	btfsc	EventByte1,4							; Manual Gas Changed?
-	rcall	logbook_event1							; Yes!
-	btfsc	EventByte1,5							; Stored Gas Changed?
-	rcall	logbook_event4							; Yes!
-	btfsc	EventByte1,6							; Setpoint Change?
-	rcall	logbook_event3							; Yes!
-	btfsc	EventByte2,0							; Bailout?
-	rcall	logbook_event2							; Yes!
+	btfsc	EventByte1,4							; manual gas changed?
+	rcall	logbook_event1							; YES
+	btfsc	EventByte1,5							; stored gas changed?
+	rcall	logbook_event4							; YES
+	btfsc	EventByte1,6							; setpoint change?
+	rcall	logbook_event3							; YES
+	btfsc	EventByte2,0							; bailout?
+	rcall	logbook_event2							; YES
 	; Any Alarm?
-	bcf		EventByte1,4							; Clear bits already tested
+	bcf		EventByte1,4							; clear bits already tested
 	bcf		EventByte1,5
 	bcf		EventByte1,6
 	movlw	.6										; manual marker?
 	cpfseq	EventByte1
-	return											; No, return
-	bsf		log_marker_found						; Manual marker! Draw small yellow rectangle here
+	return											; NO - return
+	bsf		log_marker_found						; manual marker, draw small yellow rectangle here
 	return
 
-logbook_event4:										; Stored Gas changed!
-	call	ext_flash_byte_read_plus_0x20			; Read Gas#
-	decf	gaslist_gas,F						; reduce counter
+logbook_event4:										; stored gas changed
+	call	ext_flash_byte_read_plus_0x20			; read Gas#
+	decf	gaslist_gas,F							; reduce counter
 	movff	ext_flash_rw,backup_color1
-	movff	ext_flash_rw,WREG							; copy gas number to WREG for color-coding
-	call	TFT_color_code_gas						; Change profile color according to gas number
+	movff	ext_flash_rw,WREG						; copy gas number to WREG for color-coding
+	call	TFT_color_code_gas						; change profile color according to gas number
 	return
 
-logbook_event1:										; Gas 6 used
+logbook_event1:										; gas 6 used
 	bsf		gas6_changed
-	movlw	.6										; Use Gas6 color
+	movlw	.6										; use Gas6 color
 	movwf	backup_color1
 	call	TFT_color_code_gas						; set profile color
-	incf_ext_flash_address_0x20 .2					; Skip two bytes
-	decf	gaslist_gas,F						; reduce counter
-	decf	gaslist_gas,F						; reduce counter
+	incf_ext_flash_address_0x20 .2					; skip two bytes
+	decf	gaslist_gas,F							; reduce counter
+	decf	gaslist_gas,F							; reduce counter
 	return
 
-logbook_event2:										; Bailout
-	bsf		is_bailout								; Set flag
-	movff	backup_color1,backup_color2	; Backup last gas color in case we return to CCR
-	movlw	.6										; Use Gas6 color
+logbook_event2:										; bailout
+	bsf		FLAG_bailout_mode						; set flag
+	movff	backup_color1,backup_color2				; backup last gas color in case we return to CCR
+	movlw	.6										; use Gas6 color
 	movwf	backup_color1
-	call	TFT_color_code_gas						; Use Gas6 color
-	incf_ext_flash_address_0x20 .2					; Skip two bytes
-	decf	gaslist_gas,F						; reduce counter
-	decf	gaslist_gas,F						; reduce counter
+	call	TFT_color_code_gas						; use Gas6 color
+	incf_ext_flash_address_0x20 .2					; skip two bytes
+	decf	gaslist_gas,F							; reduce counter
+	decf	gaslist_gas,F							; reduce counter
 	return
 
-logbook_event3:										; Setpoint change
-	incf_ext_flash_address_0x20 .1					; Skip one byte
-	decf	gaslist_gas,F						; reduce counter
-	btfss	is_bailout								; Are we in bailout?
-	return											; No, return
+logbook_event3:										; setpoint change
+	incf_ext_flash_address_0x20 .1					; skip one byte
+	decf	gaslist_gas,F							; reduce counter
+	btfss	FLAG_bailout_mode						; are we in bailout?
+	return											; NO - return
 	; We were in bailout before, restore profile color
-	movff	backup_color2,backup_color1				; Restore color
+	movff	backup_color2,backup_color1				; restore color
 	movff	backup_color2,WREG						; copy gas number to WREG for color-coding
-	call	TFT_color_code_gas						; Back to normal profile color
+	call	TFT_color_code_gas						; back to normal profile color
 	return
 
+; ------------------------------------------------------------------------
+
 exit_profileview:
 ;	call	speed_fastest
 	bcf		sleepmode
-	clrf	gaslist_gas						; restore all registers to build same page again
+	clrf	gaslist_gas								; restore all registers to build same page again
 	movff	logbook_divenumber_temp,logbook_divenumber
 	movff	logbook_max_dive_counter_temp,logbook_max_dive_counter
 	movff	logbook_temp_backup,logbook_temp
@@ -1447,7 +1444,7 @@
 ;	call	TFT_DisplayOff
 	call	TFT_boot
 	clrf	CCP1CON									; stop PWM
-	bcf		PORTC,2									; Pull PWM out to GND
+	bcf		PORTC,2									; pull PWM out to GND
 	call	TFT_boot
 ;	call	TFT_ClearScreen							; clear details/profile
 	goto	logbook2								; start search
@@ -1459,9 +1456,9 @@
 	movlw	logbook_row_number
 	movwf	menupos1
 	incf	logbook_page_number,F					; start new screen
-	bsf		keep_cursor_new_page					; Keep cursor on "next page"
+	bsf		keep_cursor_new_page					; keep cursor on "next page"
 	clrf	CCP1CON									; stop PWM
-	bcf		PORTC,2									; Pull PWM out to GND
+	bcf		PORTC,2									; pull PWM out to GND
 	call	TFT_boot
 ;	call	TFT_ClearScreen
 	goto	logbook2								; start search
@@ -1469,8 +1466,8 @@
 next_logbook3:
 	incf	menupos1,F								; +1
 	movlw	logbook_row_number+.2
-	cpfsgt	menupos1								; =logbook_row_number+.3?
-	bra		next_logbook3a							; No
+	cpfsgt	menupos1								; = logbook_row_number+.3 ?
+	bra		next_logbook3a							; NO
 	movlw	.1
 	movwf	menupos1
 	bra		next_logbook3b
@@ -1478,13 +1475,13 @@
 next_logbook3a:
 	incf	menupos3,W								; last entry in current page +1
 	cpfseq	menupos1								; same as cursor pos.?
-	bra		next_logbook3b							; No
-	movlw	logbook_row_number+.1					; Yes, ...
-	movwf	menupos1								; ... jump directly to "next page" if page is not full
+	bra		next_logbook3b							; NO
+	movlw	logbook_row_number+.1					; YES - 
+	movwf	menupos1								;     - jump directly to "next page" if page is not full
 
 	movlw	logbook_row_number
-	cpfseq	menupos3								; Last dive was row logbook_row_number?
-	bsf		all_dives_shown							; No, set flag to load first page again (full reset)
+	cpfseq	menupos3								; last dive was row logbook_row_number?
+	bsf		all_dives_shown							; NO - set flag to load first page again (full reset)
 
 next_logbook3b:
 	clrf	timeout_counter2
@@ -1493,7 +1490,7 @@
 	goto	logbook_loop
 
 display_listdive:
-	bsf		logbook_page_not_empty					; Page not empty
+	bsf		logbook_page_not_empty					; page not empty
 	incf	menupos3,F
 
 	bsf		leftbind
@@ -1505,16 +1502,16 @@
 	movff	PRODL,win_top
 
 	lfsr	FSR2,buffer
-	call	do_logoffset_common_read				; Read into lo:hi
-	tstfsz	lo										; lo=0?
-	bra		display_listdive1						; No, adjust offset
-	tstfsz	hi										; hi=0?
-	bra		display_listdive1						; No, adjust offset
-	bra		display_listdive1b						; Display now
+	call	do_logoffset_common_read				; read into lo:hi
+	tstfsz	lo										; lo = 0 ?
+	bra		display_listdive1						; NO - adjust offset
+	tstfsz	hi										; hi = 0 ?
+	bra		display_listdive1						; NO - adjust offset
+	bra		display_listdive1b						; display now
 
 display_listdive1:
 	; Check limit (lo:hi must be <1000)
-	movlw	LOW		d'1000'							; Compare to 1000
+	movlw	LOW		d'1000'							; compare to 1000
 	subwf	lo,W
 	movlw	HIGH	d'1000'
 	subwfb	hi,W
@@ -1538,16 +1535,16 @@
 	output_16_3										; displays only last three figures from a 16Bit value (0-999), # of dive
 	PUTC	' '
 	;display_listdive2:
-	LOG_POINT_TO log_date+1							; Point to month
+	LOG_POINT_TO log_date+1							; point to month
 	call	ext_flash_byte_read_plus				; read month
-	movff	ext_flash_rw,hi								; month
+	movff	ext_flash_rw,hi							; month
 	call	ext_flash_byte_read_plus				; read day
-	movff	ext_flash_rw,lo								; day
+	movff	ext_flash_rw,lo							; day
 	call	TFT_convert_date_short					; converts into "DD/MM" or "MM/DD" or "MM/DD" into buffer
 	PUTC	' '
 
-	LOG_POINT_TO log_max_depth						; Point to max. depth
-	call	ext_flash_byte_read_plus				; max. Depth
+	LOG_POINT_TO log_max_depth						; point to max. depth
+	call	ext_flash_byte_read_plus				; max. depth
 	movff	ext_flash_rw,lo
 	call	ext_flash_byte_read_plus
 	movff	ext_flash_rw,hi
@@ -1576,21 +1573,23 @@
 	movff	ext_flash_rw,lo							; read divetime minutes
 	call	ext_flash_byte_read_plus
 	movff	ext_flash_rw,hi
-	output_16_3										; Divetime minutes (0-999min)
+	output_16_3										; divetime minutes (0-999min)
 	STRCAT_TEXT tMinutes
 	clrf	WREG
 	movff	WREG,buffer+.21							; limit to 21 chars
-	STRCAT_PRINT ""									; Display header-row in list
+	STRCAT_PRINT ""									; display header-row in list
 	return
 
+; ------------------------------------------------------------------
+
 logbook_show_divenumber:
-	call	do_logoffset_common_read				; Read into lo:hi
-	tstfsz	lo										; lo=0?
-	bra		logbook_show_divenumber2				; No, adjust offset
-	tstfsz	hi										; hi=0?
-	bra		logbook_show_divenumber2				; No, adjust offset
-	movff	divenumber,lo							; lo=0 and hi=0 -> skip Offset routine
-	bra		logbook_show_divenumber3				; Display now
+	call	do_logoffset_common_read				; read into lo:hi
+	tstfsz	lo										; lo = 0 ?
+	bra		logbook_show_divenumber2				; NO - adjust offset
+	tstfsz	hi										; hi = 0 ?
+	bra		logbook_show_divenumber2				; NO - adjust offset
+	movff	divenumber,lo							; lo = 0 and hi = 0 -> skip offset routine
+	bra		logbook_show_divenumber3				; display now
 
 logbook_show_divenumber2:
 	infsnz	lo,F
@@ -1611,9 +1610,10 @@
 	STRCAT_PRINT ""
 	return
 
+; -------------------------------------------------------------------
 
-logbook_page2:										; Show more info
-	rcall	log_details_header						; Shows number, time/date and basic dive info
+logbook_page2:										; show more info
+	rcall	log_details_header						; shows number, time/date and basic dive info
 
 	; Deco model
 	WIN_SMALL .5,.65
@@ -1627,7 +1627,7 @@
 	LOG_POINT_TO log_gf_lo
 	WIN_SMALL .5,.90
 	STRCPY_TEXT tGF
-	call	ext_flash_byte_read_plus				; Read GF lo
+	call	ext_flash_byte_read_plus				; read GF lo
 	movff	ext_flash_rw,lo
 	output_8
 	STRCAT	"%/"
@@ -1637,12 +1637,12 @@
 	STRCAT_PRINT "ZH-L16"
 	LOG_POINT_TO log_sat_mult
 	WIN_SMALL .5,.90
-	call	ext_flash_byte_read_plus				; Read sat_mult
+	call	ext_flash_byte_read_plus				; read sat_mult
 	movff	ext_flash_rw,lo
 	output_8
 	STRCAT	"%/"
 logbook_decomodel_common:
-	call	ext_flash_byte_read_plus				; Read desat_mult or GF_hi
+	call	ext_flash_byte_read_plus				; read desat_mult or GF_hi
 	movff	ext_flash_rw,lo
 	output_8
 	STRCAT_PRINT "%"
@@ -1655,17 +1655,17 @@
 	movff	ext_flash_rw,lo
 	call	ext_flash_byte_read_plus				; read cns high
 	movff	ext_flash_rw,hi
-	bcf	hi,int_warning_flag					; clear warning   flag (fix for cases were the flags already got stored to ext. Flash)
-	bcf	hi,int_attention_flag					; clear attention flag (fix for cases were the flags already got stored to ext. Flash)
+	bcf		hi,int_warning_flag						; clear warning   flag (fix for cases were the flags already got stored to EEPROM)
+	bcf		hi,int_attention_flag					; clear attention flag (fix for cases were the flags already got stored to EEPROM)
 	output_16
 	LOG_POINT_TO log_cns_end
 	STRCAT	"->"
 	call	ext_flash_byte_read_plus				; read CNS low
 	movff	ext_flash_rw,lo
 	call	ext_flash_byte_read_plus				; read CNS high
-	bcf	hi,int_warning_flag					; clear warning   flag (fix for cases were the flags already got stored to ext. Flash)
-	bcf	hi,int_attention_flag					; clear attention flag (fix for cases were the flags already got stored to ext. Flash)
 	movff	ext_flash_rw,hi
+	bcf		hi,int_warning_flag						; clear warning   flag (fix for cases were the flags already got stored to EEPROM)
+	bcf		hi,int_attention_flag					; clear attention flag (fix for cases were the flags already got stored to EEPROM)
 	output_16
 	STRCAT_PRINT "%"
 
@@ -1696,8 +1696,8 @@
 	; Last deco
 	LOG_POINT_TO log_last_stop
 	WIN_SMALL .5,.190
-	STRCPY_TEXT tLastDecostop
-	call	ext_flash_byte_read_plus				; Read last stop
+	STRCPY_TEXT tLastDecostopSurf
+	call	ext_flash_byte_read_plus				; read last stop
 	movff	ext_flash_rw,lo
 	output_8
 	STRCAT_PRINT "m"
@@ -1716,10 +1716,10 @@
 	bsf		neg_flag								; set flag for 2.15 or newer
 	movlw	.1
 	cpfsgt	lo										; >1?
-	bcf		neg_flag								; No, clear flag
+	bcf		neg_flag								; NO - clear flag
 	movlw	.9
 	cpfslt	lo										; <9 ?
-	bcf		neg_flag								; No, clear flag (When unit was upgraded from hwOS Sport (10.xx))
+	bcf		neg_flag								; NO - clear flag (When unit was upgraded from hwOS Sport (10.xx))
 	bsf		leftbind
 	output_8
 	PUTC	"."
@@ -1727,7 +1727,7 @@
 	movff	ext_flash_rw,lo
 	movlw	.14
 	cpfsgt	lo										; >14 ?
-	bcf		neg_flag								; No, clear flag
+	bcf		neg_flag								; NO - clear flag
 	output_99x
 	STRCAT_PRINT ""
 
@@ -1736,7 +1736,7 @@
 
 	; Battery percent (for dives with 2.15 or newer)
 	WIN_SMALL .110,.140
-	LOG_POINT_TO log_batt_info						; Battery percent
+	LOG_POINT_TO log_batt_info						; battery percent
 	call	ext_flash_byte_read_plus				; read battery low
 	movff	ext_flash_rw,lo
 	output_8
@@ -1748,7 +1748,7 @@
 	WIN_SMALL .110,.90
 	STRCAT_PRINT "Batt:"
 	WIN_SMALL .110,.115
-	LOG_POINT_TO log_battery						; Battery voltage...
+	LOG_POINT_TO log_battery						; battery voltage
 	call	ext_flash_byte_read_plus				; read battery low
 	movff	ext_flash_rw,lo
 	call	ext_flash_byte_read_plus				; read battery high
@@ -1765,7 +1765,7 @@
 	WIN_SMALL .110,.165
 	lfsr	FSR2,buffer
 	bsf		leftbind
-	output_16										; Air pressure before dive
+	output_16										; air pressure before dive
 	STRCAT_TEXT tMBAR
 	clrf	WREG
 	movff	WREG,buffer+7							; limit to 7 chars
@@ -1775,21 +1775,21 @@
 	call	TFT_set_color
 	WIN_FRAME_COLOR16 .63,.220,.107,.159			; Top, Bottom, Left, Right
 
-	rcall	logbook_preloop_tasks					; Clear some flags and set to Speed_eco
+	rcall	logbook_preloop_tasks					; clear some flags and set to Speed_eco
 display_details_loop:
 	btfsc	switch_right
-	bra		logbook_page3							; Details, 2nd page
+	bra		logbook_page3							; details, 2nd page
 	btfsc	switch_left
 	bra		exit_profileview						; back to list
-	rcall	log_screendump_and_onesecond			; Check if we need to make a screenshot and check for new second
-	btfsc	sleepmode								; Timeout?
+	rcall	log_screendump_and_onesecond			; check if we need to make a screenshot and check for new second
+	btfsc	sleepmode								; timeout?
 	bra		exit_profileview						; back to list
 	bra		display_details_loop					; wait for something to do
 
 	global	logbook_preloop_tasks
 logbook_preloop_tasks:
-	movlw	CCP1CON_VALUE							; See hwos.inc
-	movwf	CCP1CON									; Power-on backlight
+	movlw	CCP1CON_VALUE							; see hwos.inc
+	movwf	CCP1CON									; power-on backlight
 	call	TFT_standard_color
 	bcf		sleepmode								; clear some flags
 	bcf		switch_right
@@ -1798,30 +1798,30 @@
 	goto	speed_normal							; and return
 
 
-logbook_page3:										; Show even more info +++
-	rcall	log_details_header						; Shows number, time/date and basic dive info
+logbook_page3:										; show even more info
+	rcall	log_details_header						; shows number, time/date and basic dive info
 	LOG_POINT_TO log_gas1
 	bcf		log_show_gas_short						; do the long version of log_show_gas
 	bcf		leftbind
 
 	WIN_SMALL .5,.90
-	movlw	.1										; Color for Gas 1
+	movlw	.1										; color for gas 1
 	rcall	log_show_gas
 
 	WIN_SMALL .5,.115
-	movlw	.2										; Color for Gas 2
+	movlw	.2										; color for gas 2
 	rcall	log_show_gas
 
 	WIN_SMALL .5,.140
-	movlw	.3										; Color for Gas 3
+	movlw	.3										; color for gas 3
 	rcall	log_show_gas
 
 	WIN_SMALL .5,.165
-	movlw	.4										; Color for Gas 4
+	movlw	.4										; color for gas 4
 	rcall	log_show_gas
 
 	WIN_SMALL .5,.190
-	movlw	.5										; Color for Gas 5
+	movlw	.5										; color for gas 5
 	rcall	log_show_gas
 
 	; OC/CC Gas List
@@ -1838,26 +1838,26 @@
 logbook_page3b:
 	movlw	color_lightblue
 	call	TFT_set_color
-	WIN_FRAME_COLOR16 .63,.220,.2,.90				; Top, Bottom, Left, Right
+	WIN_FRAME_COLOR16 .63,.220,.2,.90+.24			; Top, Bottom, Left, Right (added .24 to the right as extra space needed for gas typ markings)
 
-	rcall	logbook_preloop_tasks					; Clear some flags and set to Speed_eco
+	rcall	logbook_preloop_tasks					; clear some flags and set to Speed_eco
 display_details2_loop:
 	btfsc	switch_right
-	goto	logbook_page4							; Show more info
+	goto	logbook_page4							; show more info
 	btfsc	switch_left
 	bra		exit_profileview						; back to list
-	rcall	log_screendump_and_onesecond			; Check if we need to make a screen shot and check for new second
-	btfsc	sleepmode								; Timeout?
+	rcall	log_screendump_and_onesecond			; check if we need to make a screen shot and check for new second
+	btfsc	sleepmode								; timeout?
 	bra		exit_profileview						; back to list
 	bra		display_details2_loop					; wait for something to do
 
-logbook_page4:										; Show even more info in CC mode
+logbook_page4:										; show even more info in CC mode
 	LOG_POINT_TO log_divemode
 	call	ext_flash_byte_read						; 0=OC, 1=CC, 2=Gauge, 3=Apnea into WREG and ext_flash_rw 
 	decfsz	ext_flash_rw,w							; =1 (CC)? 
 	goto	display_profile2						; no 
 
-	rcall	log_details_header						; Shows number, time/date and basic dive info
+	rcall	log_details_header						; shows number, time/date and basic dive info
 	; Setpoint list
 	LOG_POINT_TO log_sp1
 	WIN_SMALL .5,.65
@@ -1879,14 +1879,14 @@
 	call	TFT_set_color
 	WIN_FRAME_COLOR16 .63,.220,.2,.112				; Top, Bottom, Left, Right
 
-	rcall	logbook_preloop_tasks					; Clear some flags and set to Speed_eco
+	rcall	logbook_preloop_tasks					; clear some flags and set to Speed_eco
 display_details3_loop:
 	btfsc	switch_right
-	goto	display_profile2						; Show the profile view again
+	goto	display_profile2						; show the profile view again
 	btfsc	switch_left
 	bra		exit_profileview						; back to list
-	rcall	log_screendump_and_onesecond			; Check if we need to make a screenshot and check for new second
-	btfsc	sleepmode								; Timeout?
+	rcall	log_screendump_and_onesecond			; check if we need to make a screenshot and check for new second
+	btfsc	sleepmode								; timeout?
 	bra		exit_profileview						; back to list
 	bra		display_details3_loop					; wait for something to do
 
@@ -1895,11 +1895,11 @@
 	clrf	CCP1CON									; stop PWM
 	bcf		PORTC,2									; Pull PWM out to GND
 	call	TFT_boot
-;	call	TFT_ClearScreen							; Clear screen
+;	call	TFT_ClearScreen							; clear screen
 
 ; Set ext_flash pointer to "#divenumber-oldest" dive
 ; compute read_int_eeprom .2 - divenumber
-; Read required header data for profile display
+; read required header data for profile display
 ; look in header for pointer to begin of diveprofile (Byte 2-4)
 ; Set pointer (ext_flash_log_pointer:3) to this address, start drawing
 
@@ -1907,9 +1907,9 @@
 	read_int_eeprom .2
 	movf	EEDATA,W
 	bcf		STATUS,C
-	subfwb	divenumber,W							; max. dives (low value) - divenumber
+	subfwb	divenumber,W							; max. dives (low value) - dive number
 	movwf	lo										; result
-	incf	divenumber,F							;+1
+	incf	divenumber,F							; +1
 	; Set ext_flash_address:3 to TOC entry of this dive
 	; 1st: 200000h-200FFFh -> lo=0
 	; 2nd: 201000h-201FFFh -> lo=1
@@ -1991,15 +1991,16 @@
 	STRCAT_PRINT "s"
 ;	; Dive mode
 ;	LOG_POINT_TO log_divemode
-;	call	ext_flash_byte_read_plus				; Read divemode
+;	call	ext_flash_byte_read_plus				; read divemode
 ;	movff	ext_flash_rw,lo
 ;	call	TFT_display_decotype_surface1			; "strcat_print"s divemode (OC, CC, APNEA or GAUGE)
 	return
 
+; ----------------------------------------------------------------
 
 log_show_sp:
 	lfsr	FSR2,buffer
-	call	ext_flash_byte_read_plus				; Read setpoint
+	call	ext_flash_byte_read_plus				; read setpoint
 	movff	ext_flash_rw,lo
 	clrf	hi
 	bsf		leftbind
@@ -2017,11 +2018,13 @@
 	movff	PRODL,lo
 	movff	PRODH,hi
 	call	convert_mbar_to_feet					; convert value in lo:hi from mbar to feet
-	output_16
+	output_16_3
+	PUTC	" "
 	STRCAT_TEXT tFeets								; "ft"
 	bra		log_show_sp_common
 log_show_sp_metric:
 	output_8
+	PUTC	" "
 	STRCAT_TEXT tMeters								; "m"
 log_show_sp_common:
 	STRCAT_PRINT ""
@@ -2037,27 +2040,51 @@
 	movff	ext_flash_rw,hi
 	call	customview_show_mix						; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
 	call	ext_flash_byte_read_plus				; read change depth
+	movff	ext_flash_rw,up
+	call	ext_flash_byte_read_plus				; read gas type - just to increment the pointer
+	movff	ext_flash_rw,ex
 
 	btfsc	log_show_gas_short						; shall we do the short version?
 	bra		log_show_gas_common						; YES
-	; long version
-	movff	ext_flash_rw,lo							; process change depth
+													; NO  - do the long version
+	PUTC	" "										; put one space between gas composition and gas type marking
+	tstfsz	ex										; gas disabled?
+	bra		log_show_gas_1							; NO  - next check
+	PUTC	"x"										; YES - mark with "x"
+	bra		log_show_gas_4							;     - continue with change depth
+log_show_gas_1:
+	decfsz	ex,F									; now: -1 disabled, 0 first, 1 travel, 2 deco -> first?
+	bra		log_show_gas_2							; NO  - next check
+	PUTC	"*"										; YES - mark with "*"
+	bra		log_show_gas_4							;     - continue with change depth
+log_show_gas_2:
+	decf	ex,F									; now: -2 disabled, -1 first,  0 travel, 1 deco
+	decfsz	ex,F									; now: -3 disabled, -2 first, -1 travel, 0 deco -> deco?
+	bra		log_show_gas_3							; NO  - nothing to mark
+	PUTC	"="										; YES - mark with "="
+	bra		log_show_gas_4							;     - continue with change depth
+log_show_gas_3:
+	PUTC	" "										; print a space in absence of any other marking
+log_show_gas_4:
+	PUTC	" "										; put one space between gas type marking and change depth
 	TSTOSS	opt_units								; 0=Meter, 1=Feet
 	bra		log_show_gas_metric
-	movf	lo,W
+	movf	up,W
 	mullw	.100									; convert meters to mbar
 	movff	PRODL,lo
 	movff	PRODH,hi
 	call	convert_mbar_to_feet					; convert value in lo:hi from mbar to feet
-	output_16
+	output_16_3										; limit to 999 and display only 0-999
 	STRCAT_TEXT tFeets								; "ft"
 	bra		log_show_gas_common
 log_show_gas_metric:
+	movff	up,lo
 	output_8
 	STRCAT_TEXT tMeters								; "m"
 log_show_gas_common:
-	call	ext_flash_byte_read_plus				; read gas type - just to increment the pointer
 	STRCAT_PRINT ""
 	return
 
+; ----------------------------------------------------------------
+
 	END
\ No newline at end of file
--- a/src/math.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/math.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File math.asm
+;   File math.asm									REFACTORED VERSION V2.99d
 ;
 ;   Math subroutines
 ;
@@ -10,316 +10,265 @@
 ;  2011-08-03 : [mH] moving from OSTC code
 
 
-#include    "hwos.inc"                  ; Mandatory header
+#include "hwos.inc"					; mandatory header
 
-basic   CODE
+math		CODE
+
 ;=============================================================================
-	global	convert_time
-convert_time:							; converts hi:lo in minutes to hours (hi) and minutes (lo)
-	movff	lo,xA+0						; divide by 60...
-	movff	hi,xA+1						; 
-	movlw	d'60'						; 
-	movwf	xB+0						; 
+
+	global	convert_time				; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
+										; also usable for conversion of seconds to minutes and seconds
+										; trashes xA, xB, xC
+convert_time:
+	movff	lo,xA+0						; copy hi:lo to xA
+	movff	hi,xA+1						;
+	movlw	d'60'						; set divisor to 60
+	movwf	xB+0						; write 60 to xB
 	clrf	xB+1						; 
-	rcall	div16x16					; xA/xB=xC with xA as remainder
-	movff	xC+0,hi						; Hours
-	movff	xA+0,lo						; =remaining minutes (0.....59)
-	return
-
-	global	div16
-div16:
-; divA=divA/2^divB (divB: 8Bit only!)
-	bcf		STATUS,C
-	rrcf	divA+1
-	rrcf	divA+0
-	decfsz	divB
-	bra		div16
+	rcall	div16x16					; xC = xA / xB with xA as remainder
+	movff	xC+1,up						; result    is hours   / minutes, copy to up (high byte)
+	movff	xC+0,hi						; result    is hours   / minutes, copy to hi (low  byte)
+	movff	xA+0,lo						; remainder is minutes / seconds, copy to lo
 	return
 
-	global	sub16
-sub16:
-;  sub_c = sub_a - sub_b (with signed values)
-	bcf		neg_flag
-	movf   	sub_b+0, W             	; Get Value to be subtracted
-	subwf  	sub_a+0, W             	; Do the High Byte
-	movwf  	sub_c+0
-	movf   	sub_b+1, W              ; Get the Value to be Subbed
-	subwfb 	sub_a+1, W
-	movwf  	sub_c+1
+
+	global	div16						; divA:2 = divA:2 / 2^WREG
+										; trashes WREG
+div16:
+	bcf		STATUS,C					; clear carry
+	rrcf	divA+1						; rotate right high byte, carry into MSB, LSB into carry
+	rrcf	divA+0						; rotate right low  byte, carry into MSB, LSB into carry
+	decfsz	WREG						; decrement counter, done?
+	bra		div16						; NO  - loop
+	return								; YES - done
 
-	btfss	STATUS,N                ; Negativ result ?
-	return							; NO: result positive done.
 
-	bsf		neg_flag				; MARK result negative
-
-    comf    sub_c+1                 ; 16bit sign change.
-    negf    sub_c+0
-    btfsc   STATUS,C                ; Carry to propagate ?
-    incf    sub_c+1,F               ; YES: do it.
+	global	mult16						; xA:2 = xA:2 * 2^WREG
+										; trashes WREG
+mult16:
+	bcf		STATUS,C					; clear carry
+	rlcf	divA+0,F					; rotate left low  byte, carry into LSB, MSB into carry
+	rlcf	divA+1,F					; rotate left high byte, carry into LSB, MSB into carry
+	decfsz	WREG						; decrement counter, done?
+	bra		mult16						; NO  - loop
+	return								; YES - done
 
-    return        
 
-	global	subU16
-subU16:
-;  sub_c = sub_a - sub_b (with UNSIGNED values)
-	bcf		neg_flag
-	movf   	sub_b+0, W             	; Get Value to be subtracted
-	subwf  	sub_a+0, W             	; Do the High Byte
-	movwf  	sub_c+0
-	movf   	sub_b+1, W              ; Get the Value to be Subbed
-	subwfb 	sub_a+1, W
-	movwf  	sub_c+1
-	btfsc	STATUS,C                ; Borrow to propagate ? (B == /CARRY)
-	return							; NO: result positive done.
-	bsf		neg_flag				; MARK result negative
-    comf    sub_c+1                 ; 16bit sign change.
-    negf    sub_c+0
-    btfsc   STATUS,C                ; Carry to propagate ?
-    incf    sub_c+1,F               ; YES: do it.
-    return        
+	global	sub16						; sub_c:2 = sub_a:2 - sub_b:2   with SIGNED values
+										; sets neg_flag if result is < 0
+										; trashes WREG
+sub16:
+	bcf		neg_flag					; clear flag which will indicate if result is negative
+	movf	sub_b+0,W					; get value to be subtracted, low byte
+	subwf	sub_a+0,W					; execute subtraction on low byte
+	movwf	sub_c+0						; copy result to output variable, low byte
+	movf	sub_b+1,W					; get value to be subtracted, high byte
+	subwfb	sub_a+1,W					; execute subtraction on high byte, considering borrow flag
+	movwf	sub_c+1						; copy result to output variable, high byte
+	btfss	STATUS,N					; result negative ?
+	return								; NO  - result positive, done
+	bsf		neg_flag					; YES - set flag
+	comf	sub_c+1						;     - do a 16 bit sign change
+	negf	sub_c+0						;
+	btfsc	STATUS,C					;     - carry to be propagated ?
+	incf	sub_c+1,F					;       YES - do it
+	return								;     - done
+
 
-	global	mult16x16
-mult16x16:		;xA*xB=xC
-	clrf    xC+2        	  ;  Clear the High-Order Bits
-	clrf    xC+3
-	movf    xA, w               ;  Do the "L" Multiplication first
-	mulwf   xB
-	movf    PRODL, w            ;  Save result
-	movwf   xC
-	movf    PRODH, w
-	movwf   xC+1
-	movf    xA, w               ;  Do the "I" Multiplication
-	mulwf   xB+1
-	movf    PRODL, w            ;  Save the Most Significant Byte First
-	addwf   xC+1, f
-	movf    PRODH, w
-	addwfc  xC+2, f    	 		 ;  Add to the Last Result
-	movf    xA+1, w               ;  Do the "O" Multiplication
-	mulwf   xB
-	movf    PRODL, w            ;  Add the Lower Byte Next
-	addwf   xC+1, f
-	movf    PRODH, w            ;  Add the High Byte First
-	addwfc  xC+2, f
-	btfsc   STATUS, C           ;  Add the Carry
-	incf    xC+3, f
-	movf    xA+1, w               ;  Do the "F" Multiplication
-	mulwf   xB+1
-	movf    PRODL, w
-	addwf   xC+2, f
-	movf    PRODH, w
-	addwfc  xC+3, f
-	return
+	global	subU16						; sub_c:2 = sub_a:2 - sub_b:2   with UNSIGNED values
+										; sets neg_flag if result is < 0
+										; trashes WREG
+subU16:
+	bcf		neg_flag					; clear flag which will indicate if result is negative
+	movf	sub_b+0,W					; get Value to be subtracted, low byte
+	subwf	sub_a+0,W					; execute subtraction on low byte
+	movwf	sub_c+0						; copy result to output variable, low byte
+	movf	sub_b+1,W					; get value to be subtracted, high byte
+	subwfb	sub_a+1,W					; execute subtraction on high byte, considering borrow flag
+	movwf	sub_c+1						; copy result to output variable, high byte
+	btfsc	STATUS,C					; borrow to propagate (B == /CARRY) ?
+	return								; NO  - result positive, done
+	bsf		neg_flag					; YES - set flag
+	comf	sub_c+1						;     - do a 16 bit sign change
+	negf	sub_c+0						;
+	btfsc	STATUS,C					;     - carry to be propagated ?
+	incf	sub_c+1,F					;       YES - do it
+	return								;     - done
+
 
-	global	div16x16
-div16x16:						;xA/xB=xC with xA+0 as remainder 	
-								;uses divB as temp variable
-		clrf	xC+0
-		clrf	xC+1
-        MOVF    xB+0,W       	; Check for zero
-        IORWF   xB+1,W     		; 
-        BTFSC   STATUS,Z        ; Check for zero
-        RETLW   H'FF'           ; return 0xFF if illegal
-        MOVLW   1               ; Start count at 1
-        MOVWF   divB	       ; Clear Count
-div16x16_1:
-    	BTFSC   xB+1,7     		; High bit set ?
-        bra	    div16x16_2      ; Yes then continue
-        INCF    divB,F     		; Increment count
-
-		bcf		STATUS,C
-		rlcf	xB+0,F
-		rlcf	xB+1,F
-        bra	    div16x16_1
-div16x16_2:
-								; Shift result left
-		bcf		STATUS,C
-		rlcf	xC+0,F
-		rlcf	xC+1,F
-
- 			; Reduce Divisor		
-
-        MOVF    xB,W         ; Get low byte of subtrahend
-        SUBWF   xA,F         ; Subtract DST(low) - SRC(low)
-        MOVF    xB+1,W       ; Now get high byte of subtrahend
-        BTFSS   STATUS,C     ; If there was a borrow, rather than
-        INCF    xB+1,W       ; decrement high byte of dst we inc src
-        SUBWF   xA+1,F       ; Subtract the high byte and we're done
+	global	mult16x16					; xC:4 = xA:2 * xB:2   with UNSIGNED values
+										; trashes PRODL, PRODH, WREG
+mult16x16:
+	clrf	xC+2						; clear the high-order bits
+	clrf	xC+3
+	;
+	movf	xA+0,W						; do the "L" multiplication
+	mulwf	xB+0
+	movff	PRODL,xC+0					; copy result to xC
+	movff	PRODH,xC+1
+	;
+	movf	xA+0,W						; do the "I" multiplication
+	mulwf	xB+1
+	movf	PRODL,W						; get the product's low byte...
+	addwf	xC+1,F						; ... and add it to xC+1
+	movf	PRODH,W						; get the product's high byte...
+	addwfc	xC+2,F						; ... and add it to xC+2 obeying carry bit from xC+1
+	;
+	movf	xA+1,W						; do the "O" multiplication
+	mulwf	xB+0
+	movf	PRODL,W						;  get the product's low byte...
+	addwf	xC+1,F						; ... and add it to xC+1
+	movf	PRODH,W						; get the product's high byte...
+	addwfc	xC+2,F						; ... and add it to xC+2 obeying carry bit from xC+1
+	clrf	WREG						; clear WREG...
+	addwfc	xC+3,F						; ... add add it to xC+3 obeying carry bit from xC+2 (can only happen in "O" multiplication)
+	;
+	movf	xA+1,W						; do the "F" multiplication
+	mulwf	xB+1
+	movf	PRODL,W						;   get the product's low byte...
+	addwf	xC+2,F						; ... and add it to xC+2
+	movf	PRODH,W						; get the product's high byte...
+	addwfc	xC+3,F						; ... and add it to xC+3 obeying carry bit from xC+2
+	return
 
 
-        BTFSC   STATUS, C       ; Did it reduce?        
-        bra	    div16x16_3      ; No, so it was less than
-
-		movf	xB+0,W			; Reverse subtraction
-		addwf	xA+0,F
-		movf	xB+1,W
-		addwfc	xA+1,F
-
-        bra	    div16x16_4      ; Continue the process
+	global	div16x16					; xC:2 = xA:2 / xB:2 with xA as remainder
+										; trashes WREG
+div16x16:
+	movlw		.16						; process 16 bits ...
+	movwf		math_loop				; ... initialize loop counter
+	movff		xA+0,xC+0				; copy xA to xC
+	movff		xA+1,xC+1				; ...
+	clrf		xA+0					; clear xA, will now be used to hold the remainder
+	clrf		xA+1					; ...
+div16x16_1:
+	bcf			STATUS,C				; clear carry flag to shift in a zero bit
+	rlcf		xC+0,F					; shift left xC
+	rlcf		xC+1,F					; ... shifting MSB out of xC...
+	rlcf		xA+0,F					; ... and into LSB of     xA
+	rlcf		xA+1,F					; ...
+	btfsc		STATUS,C				; did the remainder overflow (carry set)?
+	bra			div16x16_2				; YES - directly generate a result bit = 1
+	movf		xB+0,W					; NO  - compute remainder - divisor = xA - xB, trash result to WREG
+	subwf		xA+0,W					;     - ...
+	movf		xB+1,W					;     - ...
+	subwfb		xA+1,W					;     - ...
+	btfss		STATUS,C				;     - remainder < divisor (-> borrow flag set, equals carry flag cleared) ?
+	bra			div16x16_3				;       YES - result bit = 0, keep LSB of xC+0 being 0
+div16x16_2:
+	bsf			xC+0,0					;       NO  - result bit = 1, set  LSB of xC+0 to 1
+	movf		xB+0,W					;           - subtract divisor from remainder "for real": xA = xA - xB
+	subwf		xA+0,F					;           - ...
+	movf		xB+1,W					;           - ...
+	subwfb		xA+1,F					;           - ...
 div16x16_3:
-	     BSF     xC+0,0        	; Yes it did, this gets a 1 bit
-div16x16_4:
-	     DECF    divB,F 		    ; Decrement N_COUNT
-        BTFSC   STATUS,Z        ; If its not zero then continue
-        return
+	decfsz		math_loop,F				; decrement loop counter, all bits done?
+	bra			div16x16_1				; NO  - loop
+	return								; YES - done
 
-		bcf		STATUS,C
-		rrcf	xB+1,F
-		rrcf	xB+0,F
-
-        bra    div16x16_2              ; Next bit.
 
-	global	div32x16
-div32x16:  ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	; Setup
-	movlw		.32		; setup shift counter
-	movwf		divB
-	movff		xC+3,xA+1		; move ACCb to ACCf
-	movff		xC+2,xA+0
-	movff		xC+1,sub_a+1	; move ACCc to ACCe
-	movff		xC+0,sub_a+0
-	clrf		xC+3
-	clrf		xC+2
-	clrf		xC+1
-	clrf		xC+0
-	clrf		sub_b+1
-	clrf		sub_b+0
+	global	div32x16					; xC:4 = xC:4 / xB:2 with xA as remainder
+										; trashes WREG
+div32x16:
+	movlw		.32						; process 32 bits ...
+	movwf		math_loop				; ... initialize loop counter
+	clrf		xA+0					; clear xA, will be used to hold the remainder
+	clrf		xA+1					; ...
+div32x16_1:
+	bcf			STATUS,C				; clear carry flag to shift in a zero bit
+	rlcf		xC+0,F					; shift left xC
+	rlcf		xC+1,F					; ...
+	rlcf		xC+2,F					; ...
+	rlcf		xC+3,F					; ... shifting MSB out of xC...
+	rlcf		xA+0,F					; ... and into LSB of     xA
+	rlcf		xA+1,F					; ...
+	btfsc		STATUS,C				; did the remainder overflow (carry set)?
+	bra			div32x16_2				; YES - directly generate a result bit = 1
+	movf		xB+0,W					; NO  - compute remainder - divisor = xA - xB, trash result to WREG
+	subwf		xA+0,W					;     - ...
+	movf		xB+1,W					;     - ...
+	subwfb		xA+1,W					;     - ...
+	btfss		STATUS,C				;     - remainder < divisor (-> borrow flag set, equals carry flag cleared) ?
+	bra			div32x16_3				;       YES - result bit = 0, keep LSB of xC+0 being 0
 div32x16_2:
-	bcf			STATUS,C
-	rlcf		sub_a+0,F
-	rlcf		sub_a+1,F
-	rlcf		xA+0,F
-	rlcf		xA+1,F
-	rlcf		sub_b+0,F
-	rlcf		sub_b+1,F
-	movf		xB+1,W
-	subwf		sub_b+1,W	; check if a>d
-	btfss		STATUS,Z
-	bra			div32x16_3
-	movf		xB+0,W
-	subwf		sub_b+0,W	; if msb equal then check lsb
+	bsf			xC+0,0					;       NO  - result bit = 1, set  LSB of xC+0 to 1
+	movf		xB+0,W					;           - subtract divisor from remainder "for real": xA = xA - xB
+	subwf		xA+0,F					;           - ...
+	movf		xB+1,W					;           - ...
+	subwfb		xA+1,F					;           - ...
 div32x16_3:
-	btfss		STATUS,C	; carry set if d>a
-	bra			div32x16_4
-	movf		xB+0,W		; d-a into d
-	subwf		sub_b+0,F
-	btfss		STATUS,C
-	decf		sub_b+1,F
-	movf		xB+1,W
-	subwf		sub_b+1,F
-	bsf			STATUS,C	; shift a 1 into b (result)
-div32x16_4:
-	rlcf		xC+0,F
-	rlcf		xC+1,F
-	rlcf		xC+2,F
-	rlcf		xC+3,F
-	decfsz		divB,F	; loop until all bits checked
-	bra			div32x16_2
+	decfsz		math_loop,F				; decrement loop counter, all bits done?
+	bra			div32x16_1				; NO  - loop
+	return								; YES - done
+
+
+;=============================================================================
+
+; ISR math functions
+
+	global	isr_shift_C31				; 24 bit shift, repeated WREG times, dedicated to a specific usage:
+										; Because less than 8 bits are shifted and only C[2:1] is needed,
+										; we don't care what bit is inserted.
+isr_shift_C31:
+	rrcf	isr_xC+3,F					; shift three bytes
+	rrcf	isr_xC+2,F
+	rrcf	isr_xC+1,F
+	decfsz	WREG						; decrement loop counter, done?
+	bra		isr_shift_C31				; NO  - loop
+	return								; YES - done
+
+
+	global	isr_unsigned_mult16x16		; isr_xC = isr_xA * _isr_xB   with UNSIGNED values
+										; trashes PRODL, PRODH, WREG
+isr_unsigned_mult16x16:
+	movf	isr_xA+0,W					; multiply a[0] * b[0]
+	mulwf	isr_xB+0
+	movff	PRODL,isr_xC+0				; store product to c[1]:c[0]
+	movff	PRODH,isr_xC+1
+	;
+	movf	isr_xA+1,W					; multiply a[1] * b[1]
+	mulwf	isr_xB+1
+	movff	PRODL, isr_xC+2				; store product to  c[3]:c[2]
+	movff	PRODH, isr_xC+3
+	;
+	movf	isr_xA+0,W					; multiply a[0] * b[1]
+	mulwf	isr_xB+1
+	movf	PRODL,W						; add cross product to c[3]:c[2]:c[1]
+	addwf	isr_xC+1,F
+	movf	PRODH,W
+	addwfc	isr_xC+2,F					; propagate carry
+	clrf	WREG
+	addwfc	isr_xC+3,F					; propagate carry
+	;
+	movf	isr_xA+1,W					; multiply a[1] * b[0]
+	mulwf	isr_xB+0
+	movf	PRODL,W						; add cross product
+	addwf	isr_xC+1,F
+	movf	PRODH,W
+	addwfc	isr_xC+2,F					; propagate carry
+	clrf	WREG
+	addwfc	isr_xC+3,F					; propagate carry
 	return
 
-;;=============================================================================
-;; u16 * u16 --> 32bit multiply (xA * xB --> xC)
-;; Used in interupt service routines, to compute temperature and pressure.
-;;
-;	global	isr_mult16x16
-;isr_mult16x16:
-;	clrf    isr_xC+2        	  ;  Clear the High-Order Bits
-;	clrf    isr_xC+3
-;	movf    isr_xA, w               ;  Do the "L" Multiplication first
-;	mulwf   isr_xB
-;	movf    PRODL, w            ;  Save result
-;	movwf   isr_xC+0
-;	movf    PRODH, w
-;	movwf   isr_xC+1
-;	movf    isr_xA+0, w               ;  Do the "I" Multiplication
-;	mulwf   isr_xB+1
-;	movf    PRODL, w            ;  Save the Most Significant Byte First
-;	addwf   isr_xC+1, f
-;	movf    PRODH, w
-;	addwfc  isr_xC+2, f    	 		 ;  Add to the Last Result
-;	movf    isr_xA+1, w               ;  Do the "O" Multiplication
-;	mulwf   isr_xB
-;	movf    PRODL, w            ;  Add the Lower Byte Next
-;	addwf   isr_xC+1, f
-;	movf    PRODH, w            ;  Add the High Byte First
-;	addwfc  isr_xC+2, f
-;	btfsc   STATUS, C           ;  Add the Carry
-;	incf    isr_xC+3, f
-;	movf    isr_xA+1, w               ;  Do the "F" Multiplication
-;	mulwf   isr_xB+1
-;	movf    PRODL, w
-;	addwf   isr_xC+2, f
-;	movf    PRODH, w
-;	addwfc  isr_xC+3, f
-;	return
 
-;=============================================================================
-; 24bit shift, repeted WREG times.
-; Because we shift less than 8bits, and keep only C[2:1], we don't care what
-; bit is inserted...
-;
-	global	isr_shift_C31
-isr_shift_C31:
-	rrcf    isr_xC+3,F                  ; Shift the three bytes...
-	rrcf    isr_xC+2,F
-	rrcf    isr_xC+1,F
-	decfsz  WREG
-	bra     isr_shift_C31
+	global	isr_signed_mult16x16		; isr_xC = isr_xA * _isr_xB   with SIGNED values
+										; trashes PRODL, PRODH, WREG
+isr_signed_mult16x16:
+	rcall	isr_unsigned_mult16x16		; do an unsigned multiplication first
+	;									; manage sign extension of operand B
+	btfss	isr_xB+1,7					; is B negative ?
+	bra		isr_signed_mult_checkA		; NO  - continue checking operand A
+	movf	isr_xA+0,W					; Yes - add -65536 * A
+	subwf	isr_xC+2,F
+	movf	isr_xA+1,W
+	subwfb	isr_xC+3,F
+isr_signed_mult_checkA					; manage sign extension of operand B
+	btfss	isr_xA+1,7					; is A negative ?
+	return								; NO  - done
+	movf	isr_xB+0,W					; Yes - add -65536 * B
+	subwf	isr_xC+2,F
+	movf	isr_xB+1,W
+	subwfb	isr_xC+3,F
 	return
 
-;=============================================================================
-; s16 * s16 --> 32bit multiply (xA * xB --> xC)
-; Signed multiplication.
-; Code from... the Pic18F documentation ;-)
-	global	isr_unsigned_mult16x16
-isr_unsigned_mult16x16:
-        MOVF    isr_xA+0, W             ; Lowest is simply a[0] * b[0]
-        MULWF   isr_xB+0
-        MOVFF   PRODL, isr_xC+0
-        MOVFF   PRODH, isr_xC+1
-        ;
-        MOVF    isr_xA+1, W             ; And highest a[1] * b[1]
-        MULWF   isr_xB+1
-        MOVFF   PRODL, isr_xC+2
-        MOVFF   PRODH, isr_xC+3
-        ;
-        MOVF    isr_xA+0, W             ; Intermediates do propagate:
-        MULWF   isr_xB+1
-        MOVF    PRODL, W
-        ADDWF   isr_xC+1, F             ; Add cross products
-        MOVF    PRODH, W
-        ADDWFC  isr_xC+2, F             ; with propagated carry
-        CLRF    WREG
-        ADDWFC  isr_xC+3, F             ; on the three bytes.
-        ;
-        MOVF    isr_xA+1, W             ; And the second one, similarly.
-        MULWF   isr_xB+0
-        MOVF    PRODL, W
-        ADDWF   isr_xC+1, F             ; Add cross products
-        MOVF    PRODH, W
-        ADDWFC  isr_xC+2, F
-        CLRF    WREG
-        ADDWFC  isr_xC+3, F
-        return
-
-	global	isr_signed_mult16x16
-isr_signed_mult16x16:
-        rcall   isr_unsigned_mult16x16
-
-        ; Manage sign extension of operand B
-        BTFSS   isr_xB+1,7              ; Is B negatif ?
-        BRA     isr_signed_mult_checkA  ; No: check ARG1
-        MOVF    isr_xA+0, W             ; Yes: add -65536 * A
-        SUBWF   isr_xC+2, F
-        MOVF    isr_xA+1, W
-        SUBWFB  isr_xC+3, F
-        ; And of operand A
-isr_signed_mult_checkA
-        BTFSS   isr_xA+1, 7             ; Is A negatif ?
-        RETURN                          ; No: done
-        MOVF    isr_xB+0, W
-        SUBWF   isr_xC+2, F
-        MOVF    isr_xB+1, W
-        SUBWFB  isr_xC+3, F
-        RETURN
-
- END
\ No newline at end of file
+	END
\ No newline at end of file
--- a/src/math.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/math.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File math.inc
+;   File math.inc									REFACTORED VERSION V2.99d
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -8,14 +8,38 @@
 ; HISTORY
 ;  2011-08-03 : [mH] moving from OSTC code
 
-	extern	convert_time
-	extern	div16
-	extern	sub16
-	extern	subU16
-	extern	mult16x16
-	extern	div16x16
-	extern	div32x16
-;	extern	isr_mult16x16
-	extern	isr_shift_C31
-	extern	isr_unsigned_mult16x16
-	extern	isr_signed_mult16x16
+	extern	convert_time			; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
+									; also usable for conversion of seconds to minutes and seconds
+									; trashes xA, xB, xC
+
+	extern	div16					; divA:2 = divA:2 / 2^WREG
+									; trashes WREG
+
+	extern	mult16					; divA:2 = divA:2 * 2^WREG
+									; trashes WREG
+
+	extern	sub16					; sub_c:2 = sub_a:2 - sub_b:2	with SIGNED   values
+									; sets neg_flag if result is < 0
+									; trashes WREG
+
+	extern	subU16					; sub_c:2 = sub_a:2 - sub_b:2	with UNSIGNED values
+									; sets neg_flag if result is < 0
+									; trashes WREG
+
+	extern	mult16x16				; xC:4 = xA:2 * xB:2			with UNSIGNED values
+									; trashes PRODL, PRODH, WREG
+
+	extern	div16x16				; xC:2 = xA:2 / xB:2 with xA as remainder
+									; trashes xB, WREG
+
+	extern	div32x16				; xC:4 = xC:4 / xB:2 with xA as remainder
+									; trashes WREG
+
+	extern	isr_shift_C31			; 24 bit shift, repeated WREG times,
+									; dedicated to a specific usage
+
+	extern	isr_unsigned_mult16x16	; isr_xC = isr_xA * _isr_xB		with UNSIGNED values
+									; trashes PRODL, PRODH, WREG
+
+	extern	isr_signed_mult16x16	; isr_xC = isr_xA * _isr_xB		with SIGNED values
+									; trashes PRODL, PRODH, WREG
--- a/src/mcp.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/mcp.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -13,16 +13,14 @@
 #include "hwos.inc"
 #include "wait.inc"
 
-mcp code
+mcp	code
 
-    global  mcp_sleep
+	global	mcp_sleep
 mcp_sleep:
-    bcf     INTCON3,INT3IE          ; Disable INT3
-    bcf     mcp_power               ; RX off
-    btfsc   mcp_power
-    bra     $-4
-    return
+	bcf		INTCON3,INT3IE			; disable INT3
+	bcf		mcp_power				; RX off
+	btfsc	mcp_power
+	bra		$-4
+	return
 
-
-
-        END
+	END
--- a/src/mcp.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/mcp.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -8,5 +8,5 @@
 ; HISTORY
 ;  2012-09-03 : [mH] creation
 
-  extern  mcp_sleep               ; Power down RX
+	extern	mcp_sleep				; power down RX
 
--- a/src/menu_processor.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/menu_processor.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File menu_processor.asm							REFACTORED VERSION V2.98
+;   File menu_processor.asm							REFACTORED VERSION V2.99d
 ;
 ;   Routines to handle all hwOS graphic/text menus.
 ;
@@ -10,8 +10,8 @@
 ;   2012-11-02 : [jDG] Cleanup for hwOS: removed icons. Added scrolling.
 ;                But need a font with lower/upper alpha chars...
 
+#include "hwos.inc"
 #include "convert.inc"
-#include "hwos.inc"
 #include "strings.inc"
 #include "tft.inc"
 #include "varargs.inc"
@@ -22,16 +22,17 @@
 #include "tft_outputs.inc"
 #include "eeprom_rs232.inc"
 #include "adc_lightsensor.inc"
+#include "i2c.inc"
 
 
-;NOTE: should be identical in .inc and .asm !
-#define MENU_LINES_MAX			.7			; Number of lines per screen?
-#define MENU_TITLE_FONT			WIN_STD		; Font should contains lower/UPPER alpha
-#define MENU_LINE_FONT			WIN_SMALL	; Font should contains lower/UPPER alpha
-#define MENU_LEFT				.20			; Position of first menu item
-#define MENU_HEIGHT				.27			; Spacing between menu lines.
-#define MENU_VCENTER			.125		; Position on screen.
-#define MENU_LINE_MAX_LENGTH	.20			; Length in characters
+; NOTE: needs to be identical in .inc and .asm !
+#define MENU_LINES_MAX			.7			; number of lines per screen?
+#define MENU_TITLE_FONT			WIN_STD		; font needs to contain lower and UPPER chars
+#define MENU_LINE_FONT			WIN_SMALL	; font needs to contain lower and UPPER chars
+#define MENU_LEFT				.20			; position of first menu item
+#define MENU_HEIGHT				.27			; spacing between menu lines
+#define MENU_VCENTER			.125		; position on screen
+#define MENU_LINE_MAX_LENGTH	.20			; length in characters
 #define option_item				proc_item
 
 ; Other needed references
@@ -46,7 +47,7 @@
 	extern	TFT_fillup_with_spaces
 
 
-basic	CODE
+menu_proc		CODE
 
 ;=============================================================================
 ; menu handler.
@@ -54,36 +55,36 @@
 ; Input:    TBLPTR = addr of menu block.
 	global	menu_processor
 menu_processor:
-	banksel	common							; Bank1
-	btfss	divemode						; Not in divemode
-	call	speed_fastest					; Make it quick !
+	banksel	common							; bank 1
+	btfss	divemode						; in divemode?
+	call	speed_fastest					; NO - make it quick
 	;---- Read menu block ------------------------------------------------
-	VARARGS_BEGIN							; Read inline PROM data
-	clrf	STKPTR							; Never return, anyway...
-	VARARGS_GET8	item_max				; Get number of items
-	VARARGS_GET8	menu_flags				; Get flags
-	VARARGS_GET24	menu_title				; Get pointer to menu title
-	VARARGS_GET8	menu_center				; Vertical position
-	movff	TBLPTRL, menu_block+0			; Save base address for menu_read_item
+	VARARGS_BEGIN							; read inline PROM data
+	clrf	STKPTR							; never return from here
+	VARARGS_GET8	item_max				; get number of items
+	VARARGS_GET8	menu_flags				; get flags
+	VARARGS_GET24	menu_title				; get pointer to menu title
+	VARARGS_GET8	menu_center				; vertical position
+	movff	TBLPTRL, menu_block+0			; save base address for menu_read_item
 	movff	TBLPTRH, menu_block+1
 	movff	TBLPTRU, menu_block+2
-	btfss	divemode						; In divemode?
-	bra		menu_processor0					; No
-	; Required for menus with less entries then the calling menu but not so nice when setting up gas 6.... mH
+	btfss	divemode						; in divemode?
+	bra		menu_processor0					; NO
+	; Required for menus with less entries than the calling menu but not so nice when setting up gas 6.... mH
 	movlw	.1
 	cpfsgt	menupos1						; only if menupos1 = 1...
-	call	TFT_clear_divemode_menu			; ... Clear the menu!
+	call	TFT_clear_divemode_menu			; ... clear the menu!
 	; Draw one frame around the divemode menu
 	call	TFT_divemask_color
 	WIN_FRAME_COLOR16 dm_menu_row, dm_menu_lower, dm_menu_left ,dm_menu_right	; top, bottom, left, right
 	call	TFT_standard_color
 
-	bra		menu_processor1					; Yes, skip some lines here
+	bra		menu_processor1					; skip next code segment in divemode
 
 menu_processor0:
 	;---- draw menu title ------------------------------------------------
 	clrf	CCP1CON							; stop PWM
-	bcf		PORTC,2							; Pull PWM out to GND
+	bcf		PORTC,2							; pull PWM out to GND
 	call	TFT_ClearScreen
 	rcall	menu_processor_title
 	rcall	menu_processor_bottom_line
@@ -95,50 +96,57 @@
 	;---- Select menu type -----------------------------------------------
 	bra		menu_vertical
 
-	global	menu_processor_bottom_line
+
+;=============================================================================
+; draw menu bottom line
+;
+	global	menu_processor_bottom_line,menu_processor_bottom_line_comm
 menu_processor_bottom_line:
 	;---- Draw bottom line -----------------------------------------------
 	TEXT_TINY .5,         .240-.16, tNext
 	TEXT_TINY .160-.6*.6, .240-.16, tEnter
 	WIN_COLOR color_greenish
-	; Serial and Firmware Version
-	WIN_TINY .57,.240-.16
+menu_processor_bottom_line_comm:	
+	; Serial Number and Firmware Version
+	WIN_TINY .32,.240-.16
 	STRCPY	"#"
 	call	TFT_cat_serial
 	STRCAT	" v"
 	call	TFT_cat_firmware
+	STRCAT	" "
+	call	TFT_cat_beta_release
 	STRCAT_PRINT ""
 	call	TFT_standard_color
 	bcf		win_invert
 	return
 
 ;=============================================================================
-; (re-)draw menu title.
+; (re-)draw menu title
 ;
 menu_processor_title:
-	WIN_BOX_BLACK   .2,.23,.0,.159			; Clear Menu title
-	MENU_TITLE_FONT .0, .2					; Menu title positioning
-	btfss	menu_flags,0					; Static or dynamic title ?
-	bra		menu_processor_static_title
-	rcall	menu_processor_call_title		; add gas, detail and color.
+	WIN_BOX_BLACK   .2,.23,.0,.159			; clear menu title
+	MENU_TITLE_FONT .0, .2					; menu title positioning
+	btfss	menu_flags,0					; static or dynamic title?
+	bra		menu_processor_static_title		; static  title
+	rcall	menu_processor_call_title		; dynamic title - add gas, detail and color
 	bra		menu_processor_title_1
 
 menu_processor_static_title:
-	movff	menu_title+0,FSR1L				; Just copy string.
+	movff	menu_title+0,FSR1L				; just copy string
 	movff	menu_title+1,FSR1H
 	call	strcpy_text
 
 menu_processor_title_1:
 	WIN_COLOR color_greenish
-	movf	FSR2L,W							; Get title length
-	mullw	.9								; Convert to half pixels
-	bcf		STATUS,C						; Clear carry
+	movf	FSR2L,W							; get title length
+	mullw	.9								; convert to half pixels
+	bcf		STATUS,C						; clear carry
 	rrcf	PRODL							; /2
-	movf	PRODL,W							; Back to WREG
+	movf	PRODL,W							; back to WREG
 	sublw	.80								; 80 - width
-	movwf	win_leftx2						; Aligned to center.
-	movlw	.0
-	movff	WREG,buffer+.17					; limit to 17chars (Std font max.)
+	movwf	win_leftx2						; aligned to center
+	movlw	.0								; string termination code
+	movff	WREG,buffer+.17					; limit to 17 chars (std font max.)
 	call	aa_wordprocessor
 	call	TFT_standard_color
 	return
@@ -147,13 +155,14 @@
 ; Call dynamic proc for menu title:
 
 menu_processor_call_title:
-	movff	menu_title+2,PCLATU				; Just execute computed goto.
+	movff	menu_title+2,PCLATU				; execute computed goto
 	movff	menu_title+1,PCLATH
 	movf	menu_title+0,W
 	movwf	PCL
 
 ;=============================================================================
-; Restart with first icon/line selected.
+; Restart with first icon/line selected
+;
 	global	menu_processor_reset
 menu_processor_reset:
 	banksel	menustack
@@ -195,13 +204,13 @@
 
 ;---- Execute menu selection -------------------------------------------------
 do_menu_item:
-	bcf		switch_right					; Avoid loops.
-	call	speed_normal					; Back to normal speed.
-	movf	selected_item,W					; Reread proc address from table.
-	rcall	menu_read_item					; (destroy PROD)
-	movff	selected_item,PRODL				; Pass along selected line
-	rcall	menu_processor_push				; Remember where we get from. (clears selected_item)
-	movff	proc_item+2,PCLATU				; Then execute computed goto.
+	bcf		switch_right					; avoid loops
+	call	speed_normal					; back to normal speed
+	movf	selected_item,W					; reread proc address from table
+	rcall	menu_read_item					; (destroys PROD)
+	movff	selected_item,PRODL				; pass along selected line
+	rcall	menu_processor_push				; remember where we got from (clears selected_item)
+	movff	proc_item+2,PCLATU				; then execute computed goto
 	movff	proc_item+1,PCLATH
 	movf	proc_item+0,W
 	movwf	PCL
@@ -209,14 +218,13 @@
 ;=============================================================================
 ; Get current item from table.
 ;
-; Input : Item number in WREG, menu_block.
-;
-; Output: icon_large, text_item, proc_item 16bits pointers.
+; Input  : Item number in WREG, menu_block.
+; Output : icon_large, text_item, proc_item 16bits pointers.
+; Trashed: PROD, WREG
 ;
-; Trashed: PROD, WREG
 menu_read_item:
-	mullw	.10								; 10 bytes per item.
-	movf	PRODL,W							; Then do a 24bits add
+	mullw	.10								; 10 bytes per item
+	movf	PRODL,W							; then do a 24 bits add
 	addwf	menu_block+0,W					; with menu_block, and
 	movwf	TBLPTRL							; setup TBLPTR
 	movf	PRODH,W
@@ -225,41 +233,41 @@
 	movlw	0
 	addwfc	menu_block+2,W
 	movwf	TBLPTRU
-	VARARGS_GET8	value_type				; Read 10 bytes of item data
+	VARARGS_GET8	value_type				; read 10 bytes of item data
 	VARARGS_GET24	dynamic_item
 	VARARGS_GET24	proc_item
-	VARARGS_GET8	WREG					; Skip dummy byte
+	VARARGS_GET8	WREG					; skip dummy byte
 	VARARGS_GET16	text_item
 
 	return
 
 ;=============================================================================
-; Vertical menu : set of line/value to choose from.
-; Entry point to update lines already shown.
+; Vertical menu - set of line/value to choose from,
+;                 entry point to update lines already shown
 ;
 	global	menu_vertical
 menu_vertical:
-	btfss	divemode						; Not in divemode
-	clrf	timeout_counter2				; Reset timeout
+	btfss	divemode						; in divemode?
+	clrf	timeout_counter2				; NO - reset timeout
 
 menu_vertical_2:
-	rcall	menu_draw_lines					; Always re-draw whole menu
-	movlw	CCP1CON_VALUE					; See hwos.inc
-	btfss	divemode						; Not in divemode
-	movwf	CCP1CON							; Power-on backlight
+	rcall	menu_draw_lines					; always re-draw whole menu
+	movlw	CCP1CON_VALUE					; see hwos.inc
+	btfss	divemode						; in divemode?
+	movwf	CCP1CON							; NO - power-on backlight
 
 menu_vertical_1:
-	movf	selected_item,W					; Get current item data
+	movf	selected_item,W					; get current item data
 	rcall	menu_read_item
-	movf	proc_item+0,W					; Check if pro address is NULL ?
+	movf	proc_item+0,W					; check if proc address is NULL
 	iorwf	proc_item+1,W
-	bz		next_line_menu					; YES: not selectable !
-	btfss	divemode						; Not in divemode
-	rcall	menu_draw_selected_line
-	btfsc	in_color_menu					; =1: In the color scheme menu
-	call	TFT_show_color_schemes			; Yes, update the color schemes
-	btfss	settime_setdate					; In the Set Time or Set Date menu?
-	bra		menu_line_loop_pre2				; no, skip all following
+	bz		next_line_menu					; YES - not selectable
+	btfss	divemode						; in divemode?
+	rcall	menu_draw_selected_line			; NO
+	btfsc	in_color_menu					; in the color scheme menu?
+	call	TFT_show_color_schemes			; YES - update the color schemes
+	btfss	settime_setdate					; in the set time or set date menu?
+	bra		menu_line_loop_pre2				; NO - skip all following
 	movff	month,lo						; new month
 	dcfsnz	lo,F
 	movlw	.31
@@ -286,92 +294,97 @@
 	dcfsnz	lo,F
 	movlw	.31
 	cpfsgt	day								; day ok?
-	bra		menu_line_loop_pre1				; OK!
-	movlw	.1								; not OK, set to 1st
+	bra		menu_line_loop_pre1				; YES
+	movlw	.1								; NO  - set to 1st
 	movwf	day
 
 menu_line_loop_pre1:
-	btfsc	switch_right					; Enter pressed?
-	call	rtc_set_rtc						; Yes, update mins,sec,hours,day,month and year to RTC module
-	call	TFT_show_time_date_menu			; Update clock
+	btfsc	switch_right					; enter pressed?
+	call	rtc_set_rtc						; YES - update mins,sec,hours,day,month and year to RTC module
+	call	TFT_show_time_date_menu			; update clock
 
 menu_line_loop_pre2:
 	bcf		switch_right
 	bcf		switch_left
-	btfss	divemode						; Not in divemode
-	call	speed_normal
+	btfss	divemode						; in divemode?
+	call	speed_normal					; NO
 
 menu_line_loop_pre3:
-	btfsc	divemode						; In divemode?
-	goto	divemode_option0_return			; Yes, return to it
+	btfsc	divemode						; in divemode?
+	goto	divemode_option0_return			; Yes - return to it
 
 menu_line_loop:
 	btfsc	switch_right
-	bra		do_line_menu					; Type dependent
+	bra		do_line_menu					; type dependent
 	btfsc	switch_left
 	bra		next_line_menu
 	btfss	quarter_second_update			; 1/4 second?
-	bra		menu_line_loop1					; Not yet...
-	btfsc	menu_show_sensors2				; In the "Calibrate" menu?
-	call	TFT_menu_calibrate				; Yes, update mV data
-	bcf		quarter_second_update			; Clear flag
+	bra		menu_line_loop1					; NO - not yet...
+	btfsc	menu_update_sensor_mv			; in the "Calibrate" menu?
+	call	TFT_menu_calibrate				; YES - update mV data
+	bcf		quarter_second_update			; clear flag
 
 menu_line_loop1:
-	btfss	onesecupdate					; New second
-	bra		menu_line_loop2					; not yet...
+	btfss	onesecupdate					; new second?
+	bra		menu_line_loop2					; NO - not yet...
+
+ IFDEF _rx_functions
+	btfsc	FLAG_tr_enabled					; TR functions enabled?
+	call	I2C_get_tankdata				; YES - get new tank data
+	btfsc	menu_update_tank_pres			; in tank setup menu?
+	call	TFT_menu_tank_pres				; YES - update tank press
+ ENDIF
+
 	call	timeout_surfmode				; timeout on timeout_counter2
-	call	set_dive_modes					; check, if divemode must be entered
+	call	set_dive_modes					; check if divemode must be entered
 	call	get_battery_voltage				; gets battery voltage
-	btfsc	settime_setdate					; In the Set Time or Set Date menu?
-	call	TFT_show_time_date_menu			; Yes, update clock
+	btfsc	settime_setdate					; in the set time or set date menu?
+	call	TFT_show_time_date_menu			; YES - update clock
 	bcf		onesecupdate					; one second updates done
 
 menu_line_loop2:
-	btfsc	sleepmode						; Timeout?
-	goto	restart							; Yes, back to surfacemode
+	btfsc	sleepmode						; timeout?
+	goto	restart							; YES - back to surfacemode
 	btfsc	divemode
-	goto	restart							; Enter divemode if required
-	btfsc	enable_screen_dumps				; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	bra		menu_line_loop3
+	goto	restart							; enter divemode if required
+
+ IFDEF _screendump
+	btfsc	enable_screen_dumps				; screendump enabled?
+	call	TFT_dump_screen_check			; YES - check if requested and do it
+ ELSE
+	btfsc	disable_comm_mode				; COMM mode disabled (happens during new battery procedure)?
+	bra	menu_line_loop					; YES - loop
+ ENDIF
+
 	btfsc	vusb_in							; USB plugged in?
-	call	comm_mode						; Start COMM mode
-	bra		menu_line_loop4
-menu_line_loop3:
-	btfss	vusb_in							; USB (still) plugged in?
-	bcf		enable_screen_dumps				; No, clear flag
-	call	rs232_get_byte
-	btfsc	rs232_receive_overflow
-	bra		menu_line_loop4
-	movlw	"l"
-	cpfseq	RCREG1
-	bra		menu_line_loop4
-	call	TFT_dump_screen					; Dump the screen contents
-menu_line_loop4:
-	bra		menu_line_loop
+	call	comm_mode						; YES - start COMM mode
+
+	bra		menu_line_loop					; loop
+
 
 ;---- Move to menu's next line
 next_line_menu:
 	btfss	divemode						; not in divemode
 	call	speed_fastest
-	bcf		switch_left						; Avoid looping.
-	incf	selected_item,F					; Select next item.
-	movf	selected_item,W					; Index == max ?
+	bcf		switch_left						; avoid looping
+	incf	selected_item,F					; select next item
+	movf	selected_item,W					; index == max ?
 	cpfseq	item_max
-	bra		menu_vertical_1					; NO: redraw cursor.
-	clrf	selected_item					; YES: restart for item 0.
-	bra	menu_vertical_1						; Then redraw cursor.
+	bra		menu_vertical_1					; NO  - redraw cursor
+	clrf	selected_item					; YES - restart for item 0
+	bra		menu_vertical_1					; then redraw cursor
 
 	global	do_line_menu
 do_line_menu:
-	btfss	divemode						; not in divemode
-	call	speed_fastest
-;	bcf		switch_right					; Avoid looping.
-	decf	menupos1,W						; menu_processor needs 0-5...
+	btfss	divemode						; in divemode?
+	call	speed_fastest					; NO
+;	bcf		switch_right					; avoid looping
+	decf	menupos1,W						; menu_processor needs 0-5
 	btfsc	divemode						; only in divemode
 	movwf	selected_item
-	movf	selected_item,W					; Read selected descriptor
+	movf	selected_item,W					; read selected descriptor
 	rcall	menu_read_item
-	movf	value_type,W					; Switch on data type
+	movf	value_type,W					; switch on data type
 	bz		menu_do_line_call				; CALL
 	dcfsnz	WREG
 	bra		menu_do_line_call				; STRING: do as call
@@ -379,22 +392,22 @@
 	bra		menu_do_line_option				; OPTION
 	dcfsnz	WREG
 	bra		menu_do_line_call				; DYNAMIC: do as call
-	bra		menu_line_loop_pre3				; else do nothing...
+	bra		menu_line_loop_pre3				; else do nothing
 
 ;---- CALL
 menu_do_line_call:
-	rcall	do_menu_item					; Same as icon menu: calculated goto.
-	rcall	menu_processor_pop				; Back to same line,
-	bra		menu_vertical					; Then continue into menu...
+	rcall	do_menu_item					; same as icon menu: calculated goto
+	rcall	menu_processor_pop				; back to same line,
+	bra		menu_vertical					; then continue into menu...
 
 ;---- Call option specific increment subroutine
 menu_do_line_option:
-	movff	option_item+0,FSR0L				; Get option handle
+	movff	option_item+0,FSR0L				; get option handle
 	movff	option_item+1,FSR0H
 	call	option_inc						; increment
-	movff	selected_item,PRODL				; Pass selection to callback.
+	movff	selected_item,PRODL				; pass selection to callback.
 	rcall	menu_text_call
-	bra		menu_vertical_2					; redraw all lines...
+	bra		menu_vertical_2					; redraw all lines
 
 ;-----------------------------------------------------------------------------
 
@@ -404,15 +417,15 @@
 	movlw	dm_menu_item1_column
 	movff	WREG,win_leftx2
 	clrf	start_item
-	movff	item_max,menupos4				; Copy item_max for divemode cursor routine
+	movff	item_max,menupos4				; copy item_max for divemode cursor routine
 	bra		menu_draw_lines_2
 
 menu_draw_lines:
 	btfsc	divemode						; in divemode?
-	bra		menu_draw_lines_divemode		; Yes
-	btfsc	menu_flags,0					; Dynamic title ?
-	rcall	menu_processor_title			; YES: redraw it then.
-	MENU_LINE_FONT MENU_LEFT, 0				; Init start position/font
+	bra		menu_draw_lines_divemode		; YES
+	btfsc	menu_flags,0					; Dynamic title?
+	rcall	menu_processor_title			; YES - redraw it then
+	MENU_LINE_FONT MENU_LEFT, 0				; init start position/font
 	movff	menu_center,win_top				; computed in menu block.
 
 	; Does the menu have more than 6 lines ?
@@ -423,20 +436,20 @@
 	bra		menu_draw_lines_2
 
 menu_draw_long_menu:
-	movf	selected_item,W					; Start at selected-6
+	movf	selected_item,W					; start at selected-6
 	addlw	-(MENU_LINES_MAX-1)
-	btfsc	STATUS,N						; This is <0 ?
-	clrf	WREG							; YES: start from top instead.
+	btfsc	STATUS,N						; is this < 0 ?
+	clrf	WREG							; YES - start from top instead
 	movwf	start_item
 
 menu_draw_lines_2:
 	movff	start_item, menu_item
 
 menu_draw_lines_1:
-	call	TFT_standard_color				; Restore color after disabled lines.
+	call	TFT_standard_color				; restore color after disabled lines
 	movf	menu_item,W
 	rcall	menu_read_item
-	movf	value_type,W					; Switch on data type
+	movf	value_type,W					; switch on data type
 	bz		menu_draw_line_call
 	dcfsnz	WREG
 	bra		menu_draw_line_string
@@ -447,97 +460,98 @@
 	bra		menu_draw_line_none
 
 menu_draw_line_string:
-	movff	text_item+0,TBLPTRL				; Read not-translated string from PROM.
+	movff	text_item+0,TBLPTRL				; read not-translated string from PROM
 	movff	text_item+1,TBLPTRH
-	call	strcpy_prom						; Copy in buffer
+	call	strcpy_prom						; copy in buffer
 	bra		menu_draw_line_none
 
 menu_draw_line_call:
-	movff	text_item+0,FSR1L				; Read string from PROM.
+	movff	text_item+0,FSR1L				; read string from PROM
 	movff	text_item+1,FSR1H
-	call	strcpy_text						; Copy in buffer
+	call	strcpy_text						; copy in buffer
 	bra		menu_draw_line_none
 
 menu_draw_line_option:
-	movff	text_item+0,FSR1L				; Read string from PROM.
+	movff	text_item+0,FSR1L				; read string from PROM
 	movff	text_item+1,FSR1H
-	call	strcpy_text						; Copy in buffer
-	movff	option_item+0,FSR0L				; Retrieve option handle.
+	call	strcpy_text						; copy in buffer
+	movff	option_item+0,FSR0L				; retrieve option handle
 	movff	option_item+1,FSR0H
-	btfss	settime_setdate					; Not in Time/Date menu...
+	btfss	settime_setdate					; not in Time/Date menu
 	call	option_draw
 	bra		menu_draw_line_none
 
 menu_draw_line_dynamic:
 	lfsr	FSR2,buffer
-	movff	menu_item,PRODL					; Pass item to callback.
-	rcall	menu_text_call					; Push return address.
+	movff	menu_item,PRODL					; pass item to callback
+	rcall	menu_text_call					; push return address
 	bra		menu_draw_line_none
 
 ; Computed goto to pointer inside dynamic_item:
 menu_text_call:
-	movf	dynamic_item+0,W				; Check if callback is NULL
+	movf	dynamic_item+0,W				; check if callback is NULL
 	iorwf	dynamic_item+1,W
 	iorwf	dynamic_item+2,W
 	btfsc	STATUS,Z
-	return									; YES: don't call it.
-	movff	dynamic_item+2,PCLATU			; Prepare...
+	return									; YES - don't call it
+	movff	dynamic_item+2,PCLATU			; prepare...
 	movff	dynamic_item+1,PCLATH
 	movf	dynamic_item+0,W
-	movwf	PCL								; And jump !
+	movwf	PCL								; ...and jump
 
 menu_draw_line_none:
-	btfsc	divemode						; In divemode?
-	bra	menu_draw_line_none_divemode		; Yes
+	btfsc	divemode						; in divemode?
+	bra	menu_draw_line_none_divemode		; YES
 	movlw	MENU_LINE_MAX_LENGTH
-	call	TFT_fillup_with_spaces			; Fillup FSR2 with spaces (Total string length in #WREG)
+	call	TFT_fillup_with_spaces			; fill up FSR2 with spaces (Total string length in #WREG)
 	clrf	WREG
-	movff	WREG,buffer+MENU_LINE_MAX_LENGTH ; No - make sure won't be longer than MENU_LINE_MAX_LENGTH ch
+	movff	WREG,buffer+MENU_LINE_MAX_LENGTH ; NO - make sure won't be longer than MENU_LINE_MAX_LENGTH ch
 	call	aa_wordprocessor
-	movlw	MENU_HEIGHT						; No, Move to next line
+	bcf		win_invert						; clear flag for inverted output by default
+	movlw	MENU_HEIGHT						; NO - move to next line
 	addwf	win_top,F
 	incf	menu_item,F						; inc loop counter
-	movf	start_item,W					; First line (scrolled)
+	movf	start_item,W					; first line (scrolled)
 	subwf	menu_item,W						; current - first
-	xorlw	MENU_LINES_MAX					; Already done 6 lines ?
+	xorlw	MENU_LINES_MAX					; already done 6 lines?
 	btfsc	STATUS,Z
 	return									; YES
 menu_draw_line_none2:
-	movf	menu_item,W						; Done item_max lines ?
+	movf	menu_item,W						; done item_max lines?
 	xorwf	item_max,W
 	btfss	STATUS,Z
-	bra	menu_draw_lines_1					; No: loop...
+	bra	menu_draw_lines_1					; NO - loop...
 	return
 
 menu_draw_line_none_divemode:
 	movlw	.10
-	call	TFT_fillup_with_spaces			; Fill up FSR2 with spaces (Total string length in #WREG)
+	call	TFT_fillup_with_spaces			; fill up FSR2 with spaces (Total string length in #WREG)
 	clrf	WREG
 	movff	WREG,buffer+.10
-	call	aa_wordprocessor				; Draw the line!
+	call	aa_wordprocessor				; draw the line
 	banksel	common
-	bcf		win_invert						; Reset invert flag
+	bcf		win_invert						; reset invert flag
 	banksel	win_top
 	movlw	.24								; divemode menu spacing
 	addwf	win_top,F
 	incf	menu_item,F						; inc loop counter
 	movlw	.3
-	cpfseq	menu_item						; At pos 4?
-	bra		menu_draw_line_none2			; No
+	cpfseq	menu_item						; at pos 4?
+	bra		menu_draw_line_none2			; NO
 	movlw	dm_menu_item4_row
-	movff	WREG,win_top					; Reset row
+	movff	WREG,win_top					; reset row
 	movlw	dm_menu_item4_column
-	movff	WREG,win_leftx2					; New column
-	bra		menu_draw_line_none2			; Done.
+	movff	WREG,win_leftx2					; new column
+	bra		menu_draw_line_none2			; done
 
 ;-----------------------------------------------------------------------------
 ; Put a mark in front of the current line
 menu_draw_selected_line:
-	clrf	timeout_counter2				; Reset timeout
-	WIN_BOX_BLACK .34,.221,MENU_LEFT-8,MENU_LEFT-2 ; Clear left column
+	clrf	timeout_counter2				; reset timeout
+	WIN_BOX_BLACK .34,.221,MENU_LEFT-8,MENU_LEFT-2 ; clear left column
 	call	TFT_standard_color
-	WIN_SMALL MENU_LEFT-8, 0				; Arrow symbol only in small font
-	movf	start_item,W					; First line (scrolled)
+	WIN_SMALL MENU_LEFT-8, 0				; arrow symbol only in small font
+	movf	start_item,W					; first line (scrolled)
 	subwf	selected_item,W					; selected - first
 	mullw	MENU_HEIGHT						; 30 pixel by line
 	movf	PRODL,W							; result
--- a/src/menu_tree.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/menu_tree.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File menu_tree.asm								REFACTORED VERSION V2.98
+;   File menu_tree.asm								REFACTORED VERSION V2.99e
 ;
 ;   OSTC menus
 ;
@@ -9,7 +9,7 @@
 ; HISTORY
 ;   2011-07-11 : [jDG] Creation.
 
-#include "hwos.inc"						; Mandatory header
+#include "hwos.inc"						; mandatory header
 #include "gaslist.inc"
 #include "menu_processor.inc"
 #include "start.inc"
@@ -18,7 +18,7 @@
 #include "tft.inc"
 #include "eeprom_rs232.inc"
 #include "external_flash.inc"
-#include "shared_definitions.h"			; Mailbox from/to p2_deco.c
+#include "shared_definitions.h"			; mailbox from/to p2_deco.c
 #include "isr.inc"
 #include "ghostwriter.inc"
 #include "adc_lightsensor.inc"
@@ -39,15 +39,16 @@
 	extern	rtc_set_rtc
 	extern	surfloop
 	extern	oColorSetDive
+	extern	option_cleanup_oCCRMode
 
 
-gui	CODE
+menu_tree	CODE
 
 ;=============================================================================
 ; Main Menu
 
 do_return_main_menu:
-	call	menu_processor_double_pop		; drop exit line and back to last line
+	call	menu_processor_double_pop	; drop exit line and back to last line
 	bra		do_main_menu_common
 
 	global	do_main_menu
@@ -79,7 +80,8 @@
 	call	menu_processor_double_pop	; drop exit line and back to last line
 
 do_ccr_menu:
-	bcf		menu_show_sensors2			; stop imprinting of live sensor values
+	bcf		menu_update_sensor_mv		; stop imprinting of live sensor values
+	call	option_cleanup_oCCRMode		; in pSCR mode, revert AutoSP (2) to calculated SP (0)
 
 	btfsc	analog_o2_input
 	bra		do_ccr_menu_cR
@@ -94,7 +96,7 @@
 		MENU_CALL		tFixedSetpoints,			do_fixed_setpoints
 		MENU_CALL		tPSCRMenu,					do_PSCR_menu
 		MENU_OPTION		tCCmaxFracO2,				oCCmaxFracO2,			0
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
 
@@ -106,7 +108,7 @@
 		MENU_CALL		tFixedSetpoints,			do_fixed_setpoints
 		MENU_CALL		tPSCRMenu,					do_PSCR_menu
 		MENU_OPTION		tCCmaxFracO2,				oCCmaxFracO2,			0
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
 ; COMMENTED OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu
@@ -117,13 +119,13 @@
 ;		MENU_CALL		tFixedSetpoints,			do_fixed_setpoints
 ;		MENU_CALL		tPSCRMenu,					do_PSCR_menu
 ;		MENU_OPTION		tCCmaxFracO2,				oCCmaxFracO2,			0
-;		MENU_CALL		tExit,						do_return_main_menu
+;		MENU_CALL		tBack,						do_return_main_menu
 ;	MENU_END
 
 
 do_calibrate_menu:
-	call	enable_ir_s8				; Enable IR/S8-Port
-	bsf		menu_show_sensors2			; start imprinting of live sensor values
+	call	enable_ir_s8				; enable IR/S8-Port
+	bsf		menu_update_sensor_mv		; start imprinting of live sensor values
 
 do_calibrate_menu2:
 	MENU_BEGIN	tCalibrateMenu, .6
@@ -132,30 +134,31 @@
 		MENU_CALL		tDiveHudMask3,				0
 		MENU_OPTION		tCalibrationGas,oCalGasO2,	0
 		MENU_CALL		tCalibrate,					do_calibrate_mix
-		MENU_CALL		tExit,						do_return_ccr_menu
+		MENU_CALL		tBack,						do_return_ccr_menu
 	MENU_END
 
 
 do_calibrate_mix:
-	call	calibrate_mix				; Calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected
-	WAITMS	d'250'						; Wait for HUD v3
+	call	calibrate_mix				; calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected
+	WAITMS	d'250'						; wait for HUD v3
 	movlw	.9
 	movff	WREG,customview_surfmode	; show sensor mV custom view after restart
-	goto	restart						; Restart into surface mode
+	goto	restart						; restart into surface mode
 
 
 do_diluent_setup:
-	bsf		ccr_diluent_setup			; =1: Setting up Diluents ("Gas6-10")
-	bcf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	call	gaslist_cleanup_list		; Takes care that only one gas can be first and first has 0m change depth
+	bsf		FLAG_diluent_setup			; setting up diluents
+	bcf		short_gas_decriptions		; do not use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bcf		better_gas_hint				; do not mark the best gas/diluent (to be used in dive mode only)
+	call	gaslist_cleanup_list		; take care that only one gas can be first
 
 	MENU_BEGIN	tDiluentSetup, .6
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_CALL		tExit,						do_return_ccr_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_CALL		tBack,						do_return_ccr_menu
 	MENU_END
 
 
@@ -163,7 +166,8 @@
 	call	menu_processor_double_pop	; drop exit line and back to last line
 
 do_fixed_setpoints:
-	bcf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
+	bcf		short_gas_decriptions		; =1: use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bcf		better_gas_hint				; do not mark the best gas/diluent (to be used in dive mode only)
 
 	MENU_BEGIN	tFixedSetpoints, .6
 		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_edit_sp_menu
@@ -171,27 +175,27 @@
 		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_edit_sp_menu
 		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_edit_sp_menu
 		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_edit_sp_menu
-		MENU_CALL		tExit,						do_return_ccr_menu
+		MENU_CALL		tBack,						do_return_ccr_menu
 	MENU_END
 
 
 do_edit_sp_menu:
-	call	gaslist_setSP				; Save current item.
+	movff	PRODL,gaslist_gas			; get menu item we came from (0-4)
 
 	MENU_BEGIN	tFixedSetpoints, .5
 		MENU_DYNAMIC	gaslist_strcat_setpoint_0,	0
 		MENU_CALL		tSPPlus,					gaslist_spplus
 		MENU_CALL		tDepthPlus,					gaslist_spdepthplus
 		MENU_CALL		tDepthMinus,				gaslist_spdepthminus
-		MENU_CALL		tExit,						do_return_fixed_setpoints
+		MENU_CALL		tBack,						do_return_fixed_setpoints
 	MENU_END
 
 
 do_PSCR_menu:
-	MENU_BEGIN	tPSCRMenu, .3			; PSCR Menu
+	MENU_BEGIN	tPSCRMenu, .3			; pSCR Menu
 		MENU_OPTION		tPSCR_O2_drop,				oPSCR_drop,				0
 		MENU_OPTION		tPSCR_lungratio,			oPSCR_lungratio,		0
-		MENU_CALL		tExit,						do_return_ccr_menu
+		MENU_CALL		tBack,						do_return_ccr_menu
 	MENU_END
 
 ;=============================================================================
@@ -200,45 +204,53 @@
 do_return_gas_menu:
 	call	menu_processor_double_pop	; drop exit line and back to last line
 
-	btfsc	ccr_diluent_setup			; Return to CCR-Menu?
-	bra		do_diluent_setup			; Yes.
+	btfsc	FLAG_diluent_setup			; return to CCR-Menu?
+	bra		do_diluent_setup			; YES
 
 do_gas_menu:
-	bcf		ccr_diluent_setup			; =1: Setting up Diluents ("Gas6-10")
-	bcf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	call	gaslist_cleanup_list		; Takes care that only one gas can be first and first has 0m change depth
+	bcf		FLAG_diluent_setup			; not setting up diluents
+	bcf		short_gas_decriptions		; do not use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bcf		better_gas_hint				; do not mark the best gas/diluent (to be used in dive mode only)
+	call	gaslist_cleanup_list		; takes care that only one gas can be first
 
 	MENU_BEGIN	tGaslist, .6
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_DYNAMIC	gaslist_strcat_gas_mod,		do_edit_gas_menu
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_DYNAMIC	gaslist_strcat_gas_cd,		do_edit_gas_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
 
 do_return_edit_gas_menu:
+ IFDEF _rx_functions
+	bcf		menu_update_tank_pres		; stop imprinting of tank pressure updates
+	bcf		FLAG_pairing_mode			; not in pairing menu any more (back to normal timeout)
+ ENDIF
 	call	menu_processor_pop			; drop exit line and ...
 do_abort_gas_depth_menu:
 	call	menu_processor_pop			; back to last line
 	bra		do_edit_gas_menu_common
+do_edit_gas_menu:
+	movff	PRODL,gaslist_gas			; get menu item we came from (0-4)
+	movlw	.5							; offset between gases and diluents
+	btfsc	FLAG_diluent_setup			; in CCR menu?
+	addwf	gaslist_gas,F				; YES - add the offset
 
-do_edit_gas_menu:
-	call	gaslist_setgas				; set gaslist_gas
-
-do_edit_gas_menu_common:				; keep current gas
-	MENU_BEGIN	tGasEdit, .6
+do_edit_gas_menu_common:
+	MENU_BEGIN	tGasEdit, .7
 		MENU_DYNAMIC	gaslist_gastitle,			0
 		MENU_DYNAMIC	gaslist_MOD_END,			0
 		MENU_DYNAMIC	gaslist_show_type,			gaslist_toggle_type
-		MENU_CALL		tSetup_mix,					do_setup_mix
-		MENU_CALL		tGasDepth,					do_gas_depth_menu
-		MENU_CALL		tExit,						do_return_gas_menu
+		MENU_CALL		tSetup_GasMix,				do_setup_mix_menu
+		MENU_DYNAMIC	gaslist_GasDepth,			do_setup_depth_menu
+		MENU_CALL		tSetup_Tank,				do_setup_tank_menu
+		MENU_CALL		tBack,						do_return_gas_menu
 	MENU_END
 
 
-do_setup_mix:
+do_setup_mix_menu:
 	MENU_BEGIN	tGasEdit, .7
 		MENU_DYNAMIC	gaslist_gastitle,			0
 		MENU_DYNAMIC	gaslist_MOD_END,			0
@@ -246,19 +258,46 @@
 		MENU_CALL		tO2Minus,					gaslist_mO2
 		MENU_CALL		tHePlus,					gaslist_pHe
 		MENU_CALL		tHeMinus,					gaslist_mHe
-		MENU_CALL		tExit,						do_return_edit_gas_menu
+		MENU_CALL		tBack,						do_return_edit_gas_menu
+	MENU_END
+
+
+do_setup_tank_menu:
+ IFDEF _rx_functions
+	btfsc	FLAG_tr_enabled				; TR functions enabled?
+	bra		do_setup_tank_menu_rx		; YES
+ ENDIF
+
+	MENU_BEGIN	tSetup_Tank, .6
+		MENU_DYNAMIC	gaslist_gastitle,			0
+		MENU_DYNAMIC	gaslist_tank_size_pres,		0
+		MENU_CALL		tTankSize,					gaslist_tank_size
+		MENU_CALL		tTankUsablePress,			gaslist_tank_pres
+		MENU_CALL		tCopyDilToOC,				gaslist_copy_dil_to_oc
+		MENU_CALL		tBack,						do_return_edit_gas_menu
 	MENU_END
 
 
-do_gas_depth_menu:
-	movff	gaslist_gas,WREG
-	lfsr	FSR1,opt_gas_type			; Read opt_gas_type[WREG]
-	movff	PLUSW1,lo					; Used as temp
-	movlw	.3							; 3=Deco
-	btfsc	ccr_diluent_setup			; =1: Setting up Diluents ("Gas6-10")
-	movlw	.2							; 2=Normal
-	cpfseq	lo
-	bra		do_abort_gas_depth_menu		; Non-Deco gas or "Normal" Diluent, abort!
+ IFDEF _rx_functions
+
+do_setup_tank_menu_rx:
+	setf	pairing_slot				; prime slot number with 255 aka -1, used in pairing function
+	bsf		FLAG_pairing_mode			; in pairing menu (longer timeout)
+
+	MENU_BEGIN	tSetup_Tank, .7
+		MENU_DYNAMIC	gaslist_gastitle,			0
+		MENU_DYNAMIC	gaslist_tank_id_pres,		0					; when changing position, adopt TFT_menu_tank_pres!
+		MENU_DYNAMIC	gaslist_tank_size_pres,		0
+		MENU_CALL		tTankPairing,				gaslist_tank_pairing
+		MENU_CALL		tTankSize,					gaslist_tank_size
+		MENU_CALL		tTankUsablePress,			gaslist_tank_pres
+		MENU_CALL		tBack,						do_return_edit_gas_menu
+	MENU_END
+
+ ENDIF
+
+
+do_setup_depth_menu:
 
 	MENU_BEGIN	tGasEdit, .7
 		MENU_DYNAMIC	gaslist_gastitle,			0
@@ -267,12 +306,12 @@
 		MENU_CALL		tDepthPlus,					gaslist_pDepth
 		MENU_CALL		tDepthMinus,				gaslist_mDepth
 		MENU_DYNAMIC	gaslist_reset_mod_title,	gaslist_reset_mod
-		MENU_CALL		tExit,						do_return_edit_gas_menu
+		MENU_CALL		tBack,						do_return_edit_gas_menu
 	MENU_END
 
 
 ;=============================================================================
-; Simulator menus
+; Simulator Menus
 
 do_return_planner_menu:
 	call	menu_processor_pop			; drop exit line and ...
@@ -286,15 +325,32 @@
 	; to have correct simulator results after mode changes without prior excursion to surfacemode
 	call	option_save_all
 	call	restart_set_modes_and_flags
-	; Reset dive time/depth to default values
+	; reset dive time/depth to default values
 	lfsr	FSR0,odiveInterval
 	call	option_reset
 	lfsr	FSR0,obottomTime
 	call	option_reset
 	lfsr	FSR0,obottomDepth
 	call	option_reset
+	lfsr	FSR0,oSimAGF
+	call	option_reset
 
 do_planner_common:
+	movff	opt_dive_mode,WREG			; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_planner_common_ccr		; YES - use CCR version
+
+	MENU_BEGIN	tPlan, .7
+		MENU_OPTION		tIntvl,						odiveInterval,			0
+		MENU_OPTION		tBtDep,						obottomDepth,			0
+		MENU_CALL		tInter,						do_demo_divemode
+		MENU_OPTION		tBtTm,						obottomTime,			0
+		MENU_OPTION		tuseAGF,					oSimAGF,				0
+		MENU_CALL		tDeco,						do_demo_planner
+		MENU_CALL		tBack,						do_return_main_menu
+	MENU_END
+
+do_planner_common_ccr:
 	MENU_BEGIN	tPlan, .7
 		MENU_OPTION		tIntvl,						odiveInterval,			0
 		MENU_OPTION		tBtDep,						obottomDepth,			0
@@ -302,20 +358,19 @@
 		MENU_OPTION		tBtTm,						obottomTime,			0
 		MENU_CALL		tDecoSetup,					do_planner_config
 		MENU_CALL		tDeco,						do_demo_planner
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
-
 do_planner_config:
 	MENU_BEGIN	tPlan, .3
 		MENU_OPTION		tSelectSetpoint,			oSimSetpoint,			0
 		MENU_OPTION		tuseAGF,					oSimAGF,				0
-		MENU_CALL		tExit,						do_return_planner_menu
+		MENU_CALL		tBack,						do_return_planner_menu
 	MENU_END
 
 
 ;=============================================================================
-; Divemode menu
+; Divemode Menu
 
 do_return_divemode_menu:
 	call	menu_processor_double_pop	; drop exit line and back to last line
@@ -326,9 +381,9 @@
 		MENU_OPTION		tDkMode,					oDecoMode,				0
 		MENU_CALL		tppO2settings,				do_ppo2_menu
 		MENU_OPTION		tsafetystopmenu,			oSafetyStop,			0
+		MENU_CALL		tDecoparameters,			do_decoparameters_menu
 		MENU_CALL		t2ndDecoPlanMenu,			do_2nd_deco_plan_menu
-		MENU_CALL		tDecoparameters,			do_decoparameters_menu
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
 
@@ -339,7 +394,7 @@
 		MENU_DYNAMIC	divesets_ppo2_min,			do_toggle_ppo2_min
 		MENU_DYNAMIC	divesets_ppo2_min_cc,		do_toggle_ppo2_min_cc
 		MENU_OPTION		tShowppO2,					oShowppO2,				0
-		MENU_CALL		tExit,						do_return_divemode_menu
+		MENU_CALL		tBack,						do_return_divemode_menu
 	MENU_END
 
 
@@ -349,71 +404,55 @@
 do_decoparameters_menu:
 	movff	char_I_deco_model,lo		; 0 = ZH-L16, 1 = ZH-L16-GF
 	tstfsz	lo
-	bra		do_decoparameters_menugf	; <> 0 -> GF menu!
+	bra		do_decoparameters_menu_gf	; <> 0 -> GF menu!
 	; NON-GF menu
-	MENU_BEGIN	tDecoparameters, .4
+	MENU_BEGIN	tDecoparameters, .6
+		MENU_OPTION		tSetBotUse,					obottom_usage,			0
+		MENU_OPTION		tSetDecoUse,				odeco_usage,			0
 		MENU_OPTION		tSaturationMult,			osatmult,				0
 		MENU_OPTION		tDesaturationMult,			odesatmult,				0
-		MENU_OPTION		tLastDecostop,				oLastDeco,				0
-		MENU_CALL		tExit,						do_return_divemode_menu
+		MENU_CALL		tMore,						do_decoparameters_menu_more
+		MENU_CALL		tBack,						do_return_divemode_menu
 	MENU_END
 
-do_decoparameters_menugf:
+do_decoparameters_menu_gf:
 	; GF menu
 	MENU_BEGIN	tDecoparameters, .7
-		MENU_OPTION		tGF_low,					oGF_low,				0
-		MENU_OPTION		tGF_high,					oGF_high,				0
-		MENU_CALL		taGFMenu,					do_aGF_menu
+		MENU_OPTION		tSetBotUse,					obottom_usage,			0
+		MENU_OPTION		tSetDecoUse,				odeco_usage,			0
+		MENU_CALL		tGFMenu,					do_GF_menu
 		MENU_OPTION		tSaturationMult,			osatmultgf,				0
 		MENU_OPTION		tDesaturationMult,			odesatmultgf,			0
-		MENU_OPTION		tLastDecostop,				oLastDeco,				0
-		MENU_CALL		tExit,						do_return_divemode_menu
+		MENU_CALL		tMore,						do_decoparameters_menu_more
+		MENU_CALL		tBack,						do_return_divemode_menu
 	MENU_END
 
 
-do_return_2nd_deco_plan_menu:
-	call	menu_processor_double_pop	; drop exit line and back to last line
-
-do_2nd_deco_plan_menu
-	MENU_BEGIN	t2ndDecoPlanMenu, .7
-		MENU_OPTION		tFTTSMenu,					oExtraTime,				0
-		MENU_OPTION		tCalcAscGas,				oCalcAscGas,			0
-		MENU_OPTION		tSetBotUse,					obottom_usage,			0
-		MENU_OPTION		tSetDecoUse,				odeco_usage,			0
-		MENU_CALL		tTankSizes,					do_tank_sizes_menu
-		MENU_CALL		tTankFillPress,				do_tank_fill_press_menu
-		MENU_CALL		tExit,						do_return_divemode_menu
+do_decoparameters_menu_more:
+	MENU_BEGIN	tDecoparameters, .4
+		MENU_OPTION		tLastDecostop,				oLastDeco,				0
+		MENU_OPTION		tAscentSpeed,				oAscentSpeed,			0
+		MENU_OPTION		tGasChangeTime,				oGasChangeTime,			0
+		MENU_CALL		tBack,						do_return_decoparameters_menu
 	MENU_END
 
 
-do_tank_sizes_menu:
-	MENU_BEGIN	tTankSizes, .6
-		MENU_OPTION		tGas1,						oTankSize1,				0
-		MENU_OPTION		tGas2,						oTankSize2,				0
-		MENU_OPTION		tGas3,						oTankSize3,				0
-		MENU_OPTION		tGas4,						oTankSize4,				0
-		MENU_OPTION		tGas5,						oTankSize5,				0
-		MENU_CALL		tExit,						do_return_2nd_deco_plan_menu
+do_2nd_deco_plan_menu:
+	MENU_BEGIN	t2ndDecoPlanMenu, .3
+		MENU_OPTION		tFTTSMenu,					oExtraTime,				0
+		MENU_OPTION		tCalcAscGas,				oCalcAscGas,			0
+		MENU_CALL		tBack,						do_return_divemode_menu
 	MENU_END
 
 
-do_tank_fill_press_menu:
-	MENU_BEGIN	tTankFillPress, .6
-		MENU_OPTION		tGas1,						oTankFillPres1,			0
-		MENU_OPTION		tGas2,						oTankFillPres2,			0
-		MENU_OPTION		tGas3,						oTankFillPres3,			0
-		MENU_OPTION		tGas4,						oTankFillPres4,			0
-		MENU_OPTION		tGas5,						oTankFillPres5,			0
-		MENU_CALL		tExit,						do_return_2nd_deco_plan_menu
-	MENU_END
-
-
-do_aGF_menu:
-	MENU_BEGIN	taGFMenu, .4
+do_GF_menu:
+	MENU_BEGIN	tGFMenu, .6
+		MENU_OPTION		tGF_low,					oGF_low,				0
+		MENU_OPTION		tGF_high,					oGF_high,				0
 		MENU_OPTION		taGF_enable,				oEnable_aGF,			0
 		MENU_OPTION		taGF_low,					oaGF_low,				0
 		MENU_OPTION		taGF_high,					oaGF_high,				0
-		MENU_CALL		tExit,						do_return_decoparameters_menu
+		MENU_CALL		tBack,						do_return_decoparameters_menu
 	MENU_END
 
 
@@ -426,40 +465,143 @@
 
 do_return_settings:
 	call	menu_processor_double_pop	; drop exit line and back to last line
+ IFDEF _rx_mode
+	bcf		FLAG_tr_enabled				; clear TR functions flag by default
+	movff	opt_TR_mode,WREG			; get TR functions mode
+	tstfsz	WREG						; TR functions enabled?
+	bsf		FLAG_tr_enabled				; YES
+ ENDIF
 
 do_settings_menu:
 	btfsc	ble_available				; ble available?
 	bra		do_settings_menu_ble		; YES
 
-	MENU_BEGIN	tSystSets, .6
+	MENU_BEGIN	tSystSets, .5
 		MENU_CALL		tInfoMenu,					do_info_menu
 		MENU_CALL		tSetTimeDate,				do_date_time_menu
 		MENU_CALL		tDispSets,					do_dispsets_menu
-		MENU_OPTION		tLanguage,					oLanguage,				0
 		MENU_CALL		tMore,						do_settings_menu_more
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
 do_settings_menu_ble:
-	MENU_BEGIN	tSystSets, .7
+ IFDEF _rx_functions
+	btfsc	ostc_rx_present				; RX model?
+	bra		do_settings_menu_rx			; YES
+ ENDIF
+
+	MENU_BEGIN	tSystSets, .6
 		MENU_CALL		tInfoMenu,					do_info_menu
 		MENU_CALL		tBleTitle,					comm_mode0
 		MENU_CALL		tSetTimeDate,				do_date_time_menu
 		MENU_CALL		tDispSets,					do_dispsets_menu
-		MENU_OPTION		tLanguage,					oLanguage,				0
 		MENU_CALL		tMore,						do_settings_menu_more
-		MENU_CALL		tExit,						do_return_main_menu
+		MENU_CALL		tBack,						do_return_main_menu
 	MENU_END
 
+ IFDEF _rx_functions
+do_settings_menu_rx:
+	MENU_BEGIN	tSystSets, .7
+		MENU_CALL		tInfoMenu,					do_info_menu
+		MENU_CALL		tBleTitle,					comm_mode0
+		MENU_CALL		tTrSettings,				do_settings_menu_TR
+		MENU_CALL		tSetTimeDate,				do_date_time_menu
+		MENU_CALL		tDispSets,					do_dispsets_menu
+		MENU_CALL		tMore,						do_settings_menu_more
+		MENU_CALL		tBack,						do_return_main_menu
+	MENU_END
+ ENDIF
+
+
 do_info_menu:
+ IFDEF _rx_functions
+	btfsc	ostc_rx_present				; TR model?
+	bra		do_info_menu_TR				; YES
+ ENDIF
+
 	MENU_BEGIN	tInfoMenu, .6
 		MENU_DYNAMIC	info_menu_serial,			0
 		MENU_DYNAMIC	info_menu_firmware,			0
 		MENU_DYNAMIC	info_menu_battery_volts,	0
 		MENU_DYNAMIC	info_menu_uptime,			0
 		MENU_DYNAMIC	info_menu_total_dives,		0
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tBack,						do_return_settings
+	MENU_END
+
+ IFDEF _rx_functions
+do_info_menu_TR:
+	MENU_BEGIN	tInfoMenu, .7
+		MENU_DYNAMIC	info_menu_serial,			0
+		MENU_DYNAMIC	info_menu_firmware,			0
+		MENU_DYNAMIC	info_menu_firmware_rx,		0
+		MENU_DYNAMIC	info_menu_total_dives,		0
+		MENU_DYNAMIC	info_menu_battery_volts,	0
+		MENU_DYNAMIC	info_menu_uptime,			0
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
+ ENDIF
+
+
+ IFDEF _rx_functions
+do_settings_menu_TR:
+	movff	opt_dive_mode,WREG			; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	incf	WREG,W						; add 1
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_settings_menu_TR_MaxDelta; YES - OC
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_settings_menu_TR_BailPres; YES - CCR
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_settings_menu_TR_MaxDelta; YES - Gauge
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_settings_menu_TR_abort	; YES - Apnea, abort
+	dcfsnz	WREG,W						; subtract one, became zero?
+	bra		do_settings_menu_TR_both	; YES - pSCR
+do_settings_menu_TR_abort:
+	call	menu_processor_pop			; drop last menu selection
+	bra		do_settings_menu			; back to last menu
+
+do_settings_menu_TR_MaxDelta:			; menu with oTrMaxDeltaPres
+	MENU_BEGIN	tTrSettings, .5
+		MENU_OPTION		tTrMode,					oTrMode,				0
+		MENU_OPTION		tTr1stPres,					oTr1stPres,				0
+		MENU_OPTION		tTr2ndPres,					oTr2ndPres,				0
+		MENU_DYNAMIC	do_toggle_max_pres_diff_label,do_toggle_max_pres_diff
+		MENU_CALL		tBack,						do_return_settings
+	MENU_END
+
+do_settings_menu_TR_BailPres:			; menu with oTrBailPres
+	MENU_BEGIN	tTrSettings, .5
+		MENU_OPTION		tTrMode,					oTrMode,				0
+		MENU_OPTION		tTr1stPres,					oTr1stPres,				0
+		MENU_OPTION		tTr2ndPres,					oTr2ndPres,				0
+		MENU_OPTION		tTrBailPres,				oTrBailPres,			0
+		MENU_CALL		tBack,						do_return_settings
+	MENU_END
+
+do_settings_menu_TR_both:				; menu with oTrBailPres and oTrMaxDeltaPres
+	MENU_BEGIN	tTrSettings, .6
+		MENU_OPTION		tTrMode,					oTrMode,				0
+		MENU_OPTION		tTr1stPres,					oTr1stPres,				0
+		MENU_OPTION		tTr2ndPres,					oTr2ndPres,				0
+		MENU_OPTION		tTrBailPres,				oTrBailPres,			0
+		MENU_DYNAMIC	do_toggle_max_pres_diff_label,do_toggle_max_pres_diff
+		MENU_CALL		tBack,						do_return_settings
+	MENU_END
+
+
+do_toggle_max_pres_diff:				; add 5 bar, with hard-coded max.
+	movff	char_I_max_pres_diff,lo		; get current value
+	movlw	.5							; load increment
+	addwf	lo,F						; add increment
+	movlw	max_pres_diff_max			; load maximum value
+	cpfsgt	lo							; above maximum value?
+	bra		do_toggle_max_pres_diff_1	; NO  - store new value
+	movlw	max_pres_diff_min			; YES - load minimum value
+	movwf	lo							;     - into lo
+do_toggle_max_pres_diff_1:
+	movff	lo,char_I_max_pres_diff		; write back new value
+	return								; done
+ ENDIF
 
 
 do_return_settings_more_deeper:			; entry point for returns from reset sub-menu
@@ -477,46 +619,46 @@
 	MENU_BEGIN	tSystSets, .6													; in all of this 3 menus
 		MENU_CALL		tCompassMenu,				do_compass_menu				; need to stay together
 		MENU_CALL		tLogOffset,					do_log_offset_menu			; on this menu level in
-		MENU_OPTION		tAltMode,					oAltMode,				0	; oder to not mass up the
+		MENU_OPTION		tAltMode,					oAltMode,				0	; oder to not mess up the
 		MENU_OPTION		tDvSalinity,				oDiveSalinity,			0	; menu stack on doing the
 		MENU_CALL		tResetMenu,					do_reset_menu				; do_return_settings !
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
 
 
 do_return_settings_menu_more_pz:
 	call	TFT_ClearScreen
-	call	piezo_config				; Configure buttons
+	call	piezo_config				; configure buttons
 	call	menu_processor_double_pop	; drop exit line and back to last line
 
 do_settings_menu_more_piezo:
 	MENU_BEGIN	tSystSets, .7
-		MENU_CALL		tCompassMenu,				do_compass_menu
-		MENU_CALL		tLogOffset,					do_log_offset_menu
+		MENU_CALL		tCompassMenu,				do_compass_menu				; see above
+		MENU_CALL		tLogOffset,					do_log_offset_menu			;
 		MENU_OPTION		tAltMode,					oAltMode,				0
 		MENU_OPTION		tDvSalinity,				oDiveSalinity,			0
-		MENU_CALL		tResetMenu,					do_reset_menu
-		MENU_CALL		tMore,						do_settings_piezo_menu
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tResetMenu,					do_reset_menu				;
+		MENU_CALL		tMore,						do_settings_piezo_menu		;
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
 
-do_settings_menu_more_ostc3p:			; Menu with BLE feature
+do_settings_menu_more_ostc3p:			; menu with BLE feature
 	MENU_BEGIN	tSystSets, .6
-		MENU_CALL		tCompassMenu,				do_compass_menu
-		MENU_CALL		tLogOffset,					do_log_offset_menu
+		MENU_CALL		tCompassMenu,				do_compass_menu				; see above
+		MENU_CALL		tLogOffset,					do_log_offset_menu			;
 		MENU_OPTION		tAltMode,					oAltMode,				0
 		MENU_OPTION		tDvSalinity,				oDiveSalinity,			0
-		MENU_CALL		tResetMenu,					do_reset_menu
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tResetMenu,					do_reset_menu				;
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
 
 
 do_settings_piezo_menu:
 	; Menu with features only available in piezo button hardware
 	MENU_BEGIN	tSystSets, .3
-		MENU_OPTION		tButtonleft,				ocR_button_left,		0		; left button sensitivity
+		MENU_OPTION		tButtonleft,				ocR_button_left,		0		; left  button sensitivity
 		MENU_OPTION		tButtonright,				ocR_button_right,		0		; right button sensitivity
-		MENU_CALL		tExit,						do_return_settings_menu_more_pz
+		MENU_CALL		tBack,						do_return_settings_menu_more_pz
 	MENU_END
 
 
@@ -527,64 +669,63 @@
 		MENU_DYNAMIC	menu_cal_x,					0
 		MENU_DYNAMIC	menu_cal_y,					0
 		MENU_DYNAMIC	menu_cal_z,					0
-		MENU_CALL		tExit,						do_return_settings_more
+		MENU_CALL		tBack,						do_return_settings_more
 	MENU_END
 
 
 ;=============================================================================
-; Reset and confirmation menu.
+; Reset and confirmation menu
 
 do_reset_menu:
 	MENU_BEGIN	tResetMenu, .6
-		MENU_CALL		tExit,						do_return_settings_more
-		MENU_CALL		tReboot,					do_reset_menu2			; Confirm
-		MENU_CALL		tResetDeco,					do_reset_menu3			; Confirm
-		MENU_CALL		tResetSettings,				do_reset_menu4			; Confirm
-		MENU_CALL		tResetLogbook,				do_reset_menu5			; Confirm
-		MENU_CALL		tResetBattery,				do_new_battery_menu		; Confirm
+		MENU_CALL		tBack,						do_return_settings_more
+		MENU_CALL		tReboot,					do_reset_menu2			; confirm
+		MENU_CALL		tResetDeco,					do_reset_menu3			; confirm
+		MENU_CALL		tResetSettings,				do_reset_menu4			; confirm
+		MENU_CALL		tResetLogbook,				do_reset_menu5			; confirm
+		MENU_CALL		tResetBattery,				do_new_battery_menu		; confirm
 	MENU_END
 
 do_reset_menu2:
 	MENU_BEGIN	tResetMenu2, .2
 		MENU_CALL		tAbort,						do_return_settings_more_deeper
-		MENU_CALL		tReboot,					do_reboot				; Reboot
+		MENU_CALL		tReboot,					do_reboot				; reboot
 	MENU_END
 
 do_reset_menu3:
 	MENU_BEGIN	tResetMenu2, .2
 		MENU_CALL		tAbort,						do_return_settings_more_deeper
-		MENU_CALL		tResetDeco,					do_reset_deco			; Reset Deco
+		MENU_CALL		tResetDeco,					do_reset_deco			; reset deco
 	MENU_END
 
 do_reset_menu4:
 	MENU_BEGIN	tResetMenu2, .2
 		MENU_CALL		tAbort,						do_return_settings_more_deeper
-		MENU_CALL		tResetSettings,				do_reset_settings		; Reset all settings
+		MENU_CALL		tResetSettings,				do_reset_settings		; reset all settings
 	MENU_END
 
 do_reset_menu5:
 	MENU_BEGIN	tResetMenu2, .2
 		MENU_CALL		tAbort,						do_return_settings_more_deeper
-		MENU_CALL		tResetLogbook,				do_reset_logbook		; Reset logbook
+		MENU_CALL		tResetLogbook,				do_reset_logbook		; reset logbook
 	MENU_END
 
 
 do_reset_logbook:
-	clrf	EEADRH						; Make sure to select EEPROM bank 0
+	clrf	EEADRH						; make sure to select EEPROM bank 0
 	clrf	EEDATA
 	read_int_eeprom  .2
 	write_int_eeprom .16
 	read_int_eeprom  .3
-	write_int_eeprom .17				; Copy number of dives
+	write_int_eeprom .17				; copy number of dives
 	clrf	EEDATA
 	write_int_eeprom .2
-	write_int_eeprom .3					; Clear total dives
+	write_int_eeprom .3					; clear total dives
 	write_int_eeprom .4
 	write_int_eeprom .5
-	write_int_eeprom .6					; Reset logbook pointers
-	call	ext_flash_erase_logbook		; And complete logbook (!)
-
-	goto	do_return_settings_more_deeper
+	write_int_eeprom .6					; reset logbook pointers
+	call	ext_flash_erase_logbook		; and complete logbook
+	bra		do_return_settings_more_deeper
 
 
 do_reset_deco:
@@ -595,18 +736,16 @@
 	call	deco_calc_dive_interval_1min; calculate deco in surface mode
 	call	deco_calc_desaturation_time	; calculate desaturation and no-fly time
 	banksel	common
-
-	goto	do_return_settings_more_deeper
+	bra		do_return_settings_more_deeper
 
 
 do_reset_settings:
-	call	TFT_ClearScreen				; Clear screen
-	banksel	common						; (probably not needed)
-	call	option_reset_all			; Reset all options to factory default.
-	goto	restart						; Restart into surfacemode
+	call	TFT_ClearScreen				; clear screen
+	call	option_reset_all			; reset all options to factory default
+	goto	restart						; restart into surfacemode
 
 do_reboot:
-	call	ext_flash_enable_protection	; Enables write protection
+	call	ext_flash_enable_protection	; enables write protection
 	reset
 
 
@@ -615,7 +754,7 @@
 		MENU_CALL		tSetTime,					do_time_menu
 		MENU_CALL		tSetDate,					do_date_menu
 		MENU_OPTION		tDateFormat,oDateFormat,	0
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
 
 
@@ -626,7 +765,7 @@
 		MENU_OPTION		tSetDay,					oSetDay,				0
 		MENU_OPTION		tSetMonth,					oSetMonth,				0
 		MENU_OPTION		tSetYear,					oSetYear,				0
-		MENU_CALL		tExit,						do_return_settings_deeper
+		MENU_CALL		tBack,						do_return_settings_deeper
 	MENU_END
 
 
@@ -643,11 +782,11 @@
 		MENU_OPTION		tSetHours,					oSetHours,				0
 		MENU_OPTION		tSetMinutes,				oSetMinutes,			0
 		MENU_CALL		tSetSeconds,				do_reset_seconds
-		MENU_CALL		tExit,						do_return_settings_deeper
+		MENU_CALL		tBack,						do_return_settings_deeper
 	MENU_END
 
 
-do_toggle_ppo2_max:						; add 0.1bar, with hard-coded max.
+do_toggle_ppo2_max:						; add 0.1 bar, with hard-coded max.
 	movff	char_I_ppO2_max,lo			; banksafe
 	movlw	.10
 	addwf	lo,F
@@ -660,7 +799,7 @@
 	movff	lo,char_I_ppO2_max
 	return
 
-do_toggle_ppo2_max_deco:				; add 0.1bar, with hard-coded max.
+do_toggle_ppo2_max_deco:				; add 0.1 bar, with hard-coded max.
 	movff	char_I_ppO2_max_deco,lo		; banksafe
 	movlw	.10
 	addwf	lo,F
@@ -673,7 +812,7 @@
 	movff	lo,char_I_ppO2_max_deco
 	return
 
-do_toggle_ppo2_min:						; sub 0.1bar, with hard-coded min.
+do_toggle_ppo2_min:						; sub 0.1 bar, with hard-coded min.
 	movff	char_I_ppO2_min,lo			; banksafe
 	incf	lo,F
 	movlw	ppo2_warning_low_highest
@@ -685,7 +824,7 @@
 	movff	lo,char_I_ppO2_min
 	return
 
-do_toggle_ppo2_min_cc:					; sub 0.1bar, with hard-coded min.
+do_toggle_ppo2_min_cc:					; sub 0.1 bar, with hard-coded min.
 	movff	char_I_ppO2_min_loop,lo		; banksafe
 	incf	lo,F
 	movlw	ppo2_warning_loop_highest
@@ -706,60 +845,75 @@
 		MENU_CALL		tLogOffsetp10,				do_logoffset_plus10
 		MENU_CALL		tLogOffsetm1,				do_logoffset_minus1
 		MENU_CALL		tLogOffsetm10,				do_logoffset_minus10
-		MENU_CALL		tExit,						do_return_settings_more
+		MENU_CALL		tBack,						do_return_settings_more
 	MENU_END
 
 
 do_logoffset_minus1:
-	call	do_logoffset_common_read	; Read into lo:hi
+	call	do_logoffset_common_read	; read into lo:hi
 	movlw	.1
 	subwf	lo
 	movlw	.0
 	subwfb	hi
-	btfss	hi,7						; <0?
-	goto	do_logoffset_common_write	; Store and return
+	btfss	hi,7						; < 0 ?
+	bra		do_logoffset_exit			; store and return
 	clrf	lo
 	clrf	hi
-	goto	do_logoffset_common_write	; Store and return
+	bra		do_logoffset_exit			; store and return
 
 do_logoffset_minus10:
-	call	do_logoffset_common_read	; Read into lo:hi
+	call	do_logoffset_common_read	; read into lo:hi
 	movlw	.10
 	subwf	lo
 	movlw	.0
 	subwfb	hi
-	btfss	hi,7						; <0?
-	goto	do_logoffset_common_write	; Store and return
+	btfss	hi,7						; < 0 ?
+	bra		do_logoffset_exit			; store and return
 	clrf	lo
 	clrf	hi
-	goto	do_logoffset_common_write	; Store and return
+	bra		do_logoffset_exit			; store and return
 
 do_logoffset_plus1:
-	call	do_logoffset_common_read	; Read into lo:hi
+	call	do_logoffset_common_read	; read into lo:hi
 	infsnz	lo,F
 	incf	hi,F
-	goto	do_logoffset_common_write	; Store and return
+	bra		do_logoffset_exit			; store and return
 
 do_logoffset_plus10:
-	call	do_logoffset_common_read	; Read into lo:hi
+	call	do_logoffset_common_read	; read into lo:hi
 	movlw	.10
 	addwf	lo
 	movlw	.0
 	addwfc	hi
-	goto	do_logoffset_common_write	; Store and return
+do_logoffset_exit:
+	goto	do_logoffset_common_write	; store and return
 
 do_return_dispsets_menu:
 	bcf		in_color_menu
 	call	menu_processor_double_pop	; drop exit line and back to last line
 
 do_dispsets_menu:
-	MENU_BEGIN	tDispSets, .5
+
+ IF _language_2!=none
+	MENU_BEGIN	tDispSets, .7
 		MENU_OPTION		tBright,					oBrightness,			0
+		MENU_OPTION		tLanguage,					oLanguage,				0
+		MENU_OPTION		tUnits,						oUnits,					0
 		MENU_CALL		tColorScheme,				do_color_scheme
 		MENU_OPTION		tFlip,						oFlipScreen,			0
 		MENU_CALL		tMore,						do_dispsets_menu_more
-		MENU_CALL		tExit,						do_return_settings
+		MENU_CALL		tBack,						do_return_settings
 	MENU_END
+ ELSE
+	MENU_BEGIN	tDispSets, .6
+		MENU_OPTION		tBright,					oBrightness,			0
+		MENU_OPTION		tUnits,						oUnits,					0
+		MENU_CALL		tColorScheme,				do_color_scheme
+		MENU_OPTION		tFlip,						oFlipScreen,			0
+		MENU_CALL		tMore,						do_dispsets_menu_more
+		MENU_CALL		tBack,						do_return_settings
+	MENU_END
+ ENDIF
 
 
 do_dispsets_menu_more:
@@ -769,8 +923,8 @@
 		MENU_OPTION		tVSItext2,					oVSItextv2,				0
 		MENU_OPTION		tVSIgraph,					oVSIgraph,				0
 		MENU_OPTION		tTimeoutDive,				oDiveTimeout,			0
-		MENU_OPTION		tUnits,						oUnits,					0
-		MENU_CALL		tExit,						do_return_dispsets_menu
+		MENU_OPTION		t2ndDepth,					o2ndDepthDisp,			0
+		MENU_CALL		tBack,						do_return_dispsets_menu
 	MENU_END
 
 
@@ -779,7 +933,7 @@
 
 	MENU_BEGIN	tColorScheme, .2
 		MENU_OPTION		tColorSetDive,				oColorSetDive,			0
-		MENU_CALL		tExit,						do_return_dispsets_menu
+		MENU_CALL		tBack,						do_return_dispsets_menu
 	MENU_END
 
 
@@ -793,13 +947,19 @@
 
 	global	do_new_battery_select
 do_new_battery_select:
-	bsf		enable_screen_dumps			; To prevent exiting into COMM mode immediately
-	call	TFT_boot					; Initialize TFT (includes clear screen)
-	call	TFT_Display_FadeIn			; Show splash
+
+ IFDEF _screendump
+	bsf		enable_screen_dumps			; to prevent exiting into COMM mode immediately
+ ELSE
+	bsf		disable_comm_mode			; to prevent exiting into COMM mode immediately
+ ENDIF
+
+	call	TFT_boot					; initialize TFT (includes clear screen)
+	call	TFT_Display_FadeIn			; show splash
 	movlw	.100
 	movwf	batt_percent				; make sure to reset batt_percent
 
-	; Default (In cases of timeout or USB): Use old battery
+	; Default (in cases of timeout or USB): use old battery
 	clrf	EEADRH
 	read_int_eeprom 0x07
 	movff	EEDATA,battery_gauge+0
@@ -814,9 +974,9 @@
 	read_int_eeprom 0x0C
 	movff	EEDATA,battery_gauge+5
 
-	call	menu_processor_reset		; restart from first icon.
+	call	menu_processor_reset		; restart from first item
 
-	; hardware_flag:
+	; hardware_flag1:
 	; 3: 0x0A or 0x13 (2016)
 	; cR: 0x05
 	; 2 with BLE: 0x11
@@ -824,27 +984,27 @@
 	; 3 with BLE: 0x1A 
 
 	movlw	0x0A
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_AA
 	movlw	0x13
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_AA_16650
 	movlw	0x12
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_AA
 	movlw	0x1A
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_AA
 	movlw	0x11
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_18650
 	movlw	0x05
-	cpfseq	hardware_flag
+	cpfseq	hardware_flag1
 	bra		$+4
 	bra		menu_new_battery_18650
 	bra		use_old_batteries			; any unsupported value
@@ -880,15 +1040,15 @@
 use_old_prior_209:
 	clrf	EEADRH
 	read_int_eeprom 0x0F				; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah
-	incfsz	EEDATA,F					; Was 0xFF?
-	return								; No, done.
+	incfsz	EEDATA,F					; was 0xFF?
+	return								; NO - done
 
-	call	lt2942_get_status			; Check for gauge IC
+	call	lt2942_get_status			; check for gauge IC
 	movlw	.3							; Assume a 18650
 	btfss	battery_gauge_available		; cR/2 hardware?
-	movlw	.1							; Assume a Saft
+	movlw	.1							; assume a Saft
 	movwf	EEDATA
-	write_int_eeprom 0x0F				; Store the new battery type into EEPROM
+	write_int_eeprom 0x0F				; store the new battery type into EEPROM
 	return
 
 
@@ -910,28 +1070,33 @@
 	read_int_eeprom 0x0F
 	movff	EEDATA,battery_type			; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah
 
-	rcall	setup_new_saft				; Any other value
-	incf	EEDATA,F					; 1 ... 5
+	rcall	setup_new_saft				; any other value
+	incf	EEDATA,F					; 1...5
 	dcfsnz	EEDATA,F
-	rcall	setup_new_15v				;=0
+	rcall	setup_new_15v				; =0
 	dcfsnz	EEDATA,F
-	rcall	setup_new_saft				;=1
+	rcall	setup_new_saft				; =1
 	dcfsnz	EEDATA,F
-	rcall	setup_new_panasonic			;=2
+	rcall	setup_new_panasonic			; =2
 	dcfsnz	EEDATA,F
-	rcall	setup_new_18650				;=3
+	rcall	setup_new_18650				; =3
 	dcfsnz	EEDATA,F
-	rcall	setup_new_16650				;=4
+	rcall	setup_new_16650				; =4
 
 	bcf		use_old_batt_flag			; clear flag
-	goto	surfloop					; Jump to Surfaceloop!
+
+ IFNDEF _screendump
+	bcf	disable_comm_mode			; re-enable COMM mode again
+ ENDIF
+
+	goto	surfloop					; jump to surface loop
 
 
 setup_new_15v:
 	bsf		charge_disable
 	bcf		TRISE,2
 	movlw	.100
-	movwf	batt_percent				; To have 1,5V batteries right after firmware update
+	movwf	batt_percent				; to have 1.5V batteries right after firmware update
 	movlw	.0
 	movff	WREG,battery_type
 	return
@@ -960,7 +1125,7 @@
 
 
 setup_new_panasonic:
-	banksel battery_capacity
+	banksel	battery_capacity
 	movlw	LOW		internal_panasonic_capacity
 	movwf	internal_battery_capacity+0
 	movlw	HIGH	internal_panasonic_capacity
@@ -1023,21 +1188,28 @@
 
 use_16650_battery:
 	rcall	setup_new_16650
-	bra		use_new_36V_2
+	bra		use_batt_exit
 use_18650_battery:
 	rcall	setup_new_18650
-	bra		use_new_36V_2
+	bra		use_batt_exit
 use_new_36V_batteries:
 	rcall	setup_new_saft
-	bra		use_new_36V_2
+	bra		use_batt_exit
 use_new_15V_batteries:
 	rcall	setup_new_15v
-use_new_36V_2:
-	call	reset_battery_pointer		; Resets battery pointer 0x07-0x0C and battery_gauge:5
-	goto	surfloop					; Jump to Surface loop!
+use_batt_exit:
+	call	reset_battery_pointer		; resets battery pointer 0x07-0x0C and battery_gauge:5
+use_batt_exit1:
+
+ IFNDEF _screendump
+	bcf	disable_comm_mode			; re-enable COMM mode again
+ ENDIF
+
+	goto	surfloop					; jump to surface loop
+
 use_36V_rechargeable:
 	rcall	setup_new_panasonic
 	call	reset_battery_internal_only
-	goto	surfloop					; Jump to Surface loop!
+	bra		use_batt_exit1				; jump to surface loop
 
 	END
\ No newline at end of file
--- a/src/ms5541.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/ms5541.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File ms5541.asm
+;   File ms5541.asm														V2.98c
 ;
 ;   Sensor subroutines
 ;
@@ -9,241 +9,241 @@
 ; HISTORY
 ;  2011-08-03 : [mH] moving from OSTC code
 
-#include    "hwos.inc"                  ; Mandatory header
-#include 	"math.inc"					; Math routines
+#include	"hwos.inc"					; Mandatory header
+#include	"math.inc"					; Math routines
 
-sensors     CODE
+ms5541		CODE
 
 ;=============================================================================
 ; Expose internal variables, to ease debug:
-    global D1, D2
-    global C1, C2, C3, C4, C5, C6
-    global xdT, xdT2, OFF, SENS, amb_pressure_avg, temperature_avg
+	global	D1, D2
+	global	C1, C2, C3, C4, C5, C6
+	global	xdT, xdT2, OFF, SENS, amb_pressure_avg, temperature_avg
 
 ;=============================================================================
 	global calculate_compensation
 calculate_compensation:
-	; xdT = D2 - C5    (s16 range -11.400 .. +12.350)
-	movf   C5+0,W                       ;  Get Value to be subtracted
-	subwf  D2+0,W             	        ;  Do the Low Byte
-	movwf  xdT+0
-	movf   C5+1,W                       ;  Then the high byte.
-	subwfb D2+1,W
-	movwf  xdT+1
+	; xdT = D2 - C5	(s16 range -11.400 .. +12.350)
+	movf	C5+0,W						; Get Value to be subtracted
+	subwf	D2+0,W			 			; Do the Low Byte
+	movwf	xdT+0
+	movf	C5+1,W						; Then the high byte.
+	subwfb	D2+1,W
+	movwf	xdT+1
 
-    ; Second order temperature calculation
-    ; xdT/128 is in range -89..+96, hence signed 8bit. dT/128 = (2*dT)/256
-    rlcf    xdT+0,W                     ; put hit bit in carry.
-    rlcf    xdT+1,W                     ; inject in high byte.
-    movwf   isr_xA+0                    ; and put result in low byte.
-    clrf    isr_xA+1
-    btfsc   xdT+1,7                     ; If dT < 0
-    setf    isr_xA+1                    ; then signextend to -1
-	movff	isr_xA+0,isr_xB+0           ; copy A to B
+	; Second order temperature calculation
+	; xdT/128 is in range -89..+96, hence signed 8bit. dT/128 = (2*dT)/256
+	rlcf	xdT+0,W						; put hit bit in carry.
+	rlcf	xdT+1,W						; inject in high byte.
+	movwf	isr_xA+0					; and put result in low byte.
+	clrf	isr_xA+1
+	btfsc	xdT+1,7						; If dT < 0
+	setf	isr_xA+1					; then signextend to -1
+	movff	isr_xA+0,isr_xB+0			; copy A to B
 	movff	isr_xA+1,isr_xB+1
-	call	isr_signed_mult16x16        ; dT*dT --> xC (32 bits)
+	call	isr_signed_mult16x16		; dT*dT --> xC (32 bits)
 
 	; dT >= 0: divide by 8, ie. 3 shifts rights.
 	; dT <  0: divide by 2, ie. 1 shifts rights.
-    movlw   .3
-	btfss	xdT+1,7                     ; Was dT negative ?
-	movlw   .1
+	movlw	.3
+	btfss	xdT+1,7						 ; Was dT negative ?
+	movlw	.1
 calc_loop_1:
-    bcf     STATUS,C                    ;dT^2 is positive, so injected zeros.
-    rrcf    isr_xC+1,F
-    rrcf    isr_xC+0,F
-    decfsz  WREG
-    bra     calc_loop_1
+	bcf		STATUS,C						; dT^2 is positive, so injected zeros.
+	rrcf	isr_xC+1,F
+	rrcf	isr_xC+0,F
+	decfsz	WREG
+	bra		calc_loop_1
 
-    movf    isr_xC+0,W                  ; dT2 = dT - (dT/128)*(dT/128)/(2 ...or... 8)
-	subwf   xdT+0,W
-	movwf   xdT2+0
-	movf    isr_xC+1,W
-	subwfb  xdT+1,W
-	movwf   xdT2+1
+	movf	isr_xC+0,W					; dT2 = dT - (dT/128)*(dT/128)/(2 ...or... 8)
+	subwf	xdT+0,W
+	movwf	xdT2+0
+	movf	isr_xC+1,W
+	subwfb	xdT+1,W
+	movwf	xdT2+1
+
+	; Calculate OFF = C2 + ((C4-250)*dT2)/2^12 + 10000
+	; (range +9.246 .. +18.887)
+	movff	C4+0,isr_xA+0				; C4 - 250 --> A
+	movff	C4+1,isr_xA+1
+	movff	xdT2+0,isr_xB+0				; dT2 --> B
+	movff	xdT2+1,isr_xB+1
+	call	isr_signed_mult16x16
 
-    ; Calculate OFF = C2 + ((C4-250)*dT2)/2^12 + 10000
-    ; (range +9.246 .. +18.887)
-    movff   C4+0,isr_xA+0               ; C4 - 250 --> A
-    movff   C4+1,isr_xA+1
-	movff   xdT2+0,isr_xB+0             ; dT2 --> B
-	movff   xdT2+1,isr_xB+1
-	call    isr_signed_mult16x16
+	movlw	.12-.8						; A 12bit shift = 1 byte + 4 bits.
+	call	isr_shift_C31
 
-    movlw   .12-.8                      ; A 12bit shift = 1 byte + 4 bits.
-    call    isr_shift_C31
+	movlw	LOW(.10000)					; Add 10000
+	addwf	isr_xC+1,F
+	movlw	HIGH(.10000)
+	addwfc	isr_xC+2,F
 
-    movlw   LOW(.10000)                 ; Add 10000
-    addwf   isr_xC+1,F
-    movlw   HIGH(.10000)
-    addwfc  isr_xC+2,F
-    
-    movf    C2+0,W                      ; Add C2, and save into OFF
-	addwf   isr_xC+1,W
-	movwf   OFF+0
+	movf	C2+0,W						; Add C2, and save into OFF
+	addwf	isr_xC+1,W
+	movwf	OFF+0
 	movf	C2+1,W
-	addwfc  isr_xC+2,W
-	movwf   OFF+1
+	addwfc	isr_xC+2,W
+	movwf	OFF+1
+
+	; Calculate SENS = C1/2 + ((C3+200)*dT)/2^13 + 3000
+	movlw	LOW(.200)					; C3+200 --> A
+	addwf	C3+0,W
+	movwf	isr_xA+0
+	movlw	HIGH(.200)
+	addwfc	C3+1,W
+	movwf	isr_xA+1
+										; B still contains dT2
+	call	isr_signed_mult16x16		; A*B --> C
+	movlw	.13-.8						; A 13bit shift = 1 byte + 5 bits.
+	call	isr_shift_C31
 
-    ; Calculate SENS = C1/2 + ((C3+200)*dT)/2^13 + 3000
-    movlw   LOW(.200)                   ; C3+200 --> A
-    addwf   C3+0,W
-    movwf   isr_xA+0
-    movlw   HIGH(.200)
-    addwfc  C3+1,W
-    movwf   isr_xA+1
-                                        ; B still contains dT2
-	call    isr_signed_mult16x16        ; A*B --> C
-    movlw   .13-.8                      ; A 13bit shift = 1 byte + 5 bits.
-    call    isr_shift_C31
-    
-    bcf     STATUS,C                    ; SENS = C1 / 2
-    rrcf    C1+1,W
-    movwf   SENS+1
-    rrcf    C1+0,W
-    movwf   SENS+0
+	bcf		STATUS,C					; SENS = C1 / 2
+	rrcf	C1+1,W
+	movwf	SENS+1
+	rrcf	C1+0,W
+	movwf	SENS+0
+
+	movlw	LOW(.3000)					; Add 3000
+	addwf	isr_xC+1,F
+	movlw	HIGH(.3000)
+	addwfc	isr_xC+2,F
 
-    movlw   LOW(.3000)                  ; Add 3000
-    addwf   isr_xC+1,F
-    movlw   HIGH(.3000)
-    addwfc  isr_xC+2,F
+	movf	isr_xC+1,W					; And sum into SENS
+	addwf	SENS+0,F
+	movf	isr_xC+2,W
+	addwfc  SENS+1,F
 
-    movf    isr_xC+1,W                  ; And sum into SENS
-    addwf   SENS+0,F
-    movf    isr_xC+2,W
-    addwfc  SENS+1,F
+	; calculate amb_pressure = (sens * (d1-off))/2^12 + 1000
+	movf	OFF+0,W						; d1-off --> a
+	subwf	D1+0,W
+	movwf	isr_xA+0
+	movf	OFF+1,W
+	subwfb	D1+1,W
+	movwf	isr_xA+1
 
-    ; calculate amb_pressure = (sens * (d1-off))/2^12 + 1000
-    movf    OFF+0,W                      ; d1-off --> a
-    subwf   D1+0,W
-    movwf   isr_xA+0
-    movf    OFF+1,W
-    subwfb  D1+1,W
-    movwf   isr_xA+1
+	movff	SENS+0,isr_xB+0				; sens --> b
+	movff	SENS+1,isr_xB+1
+	call	isr_signed_mult16x16
+	movlw	.12-.8						; a 12bit shift = 1 byte + 4 bits.
+	call	isr_shift_C31
 
-	movff   SENS+0,isr_xB+0             ; sens --> b
-	movff   SENS+1,isr_xB+1
-	call    isr_signed_mult16x16
-    movlw   .12-.8                      ; a 12bit shift = 1 byte + 4 bits.
-    call    isr_shift_C31
+	movlw	LOW(.1000)					; add 1000
+	addwf	isr_xC+1,F
+	movlw	HIGH(.1000)
+	addwfc	isr_xC+2,F
 
-    movlw   LOW(.1000)                  ; add 1000
-    addwf   isr_xC+1,F
-    movlw   HIGH(.1000)
-    addwfc  isr_xC+2,F
+	; Add opt_pressure_adjust to result (SIGNED!)
+	movff	opt_pressure_adjust,isr_xC+0
 
-    ; Add opt_pressure_adjust to result (SIGNED!)
-    movff   opt_pressure_adjust,isr_xC+0
-
-    btfss   isr_xC+0,7              ; <0?
-    bra     pressure_extra_add      ; No
-    ; Yes
-    comf    isr_xC+0,F
-    incf    isr_xC+0,F
-    ; Check for max. of 20mbar
-    movlw   .22
-    cpfslt  isr_xC+0
-    clrf    isr_xC+0
-    ; Subtract
-    movf    isr_xC+0,W
-    subwf   isr_xC+1,F
-    movlw   .0
-    subwfb  isr_xC+2,F
-    bra     pressure_extra_common
+	btfss	isr_xC+0,7					; < 0 ?
+	bra		pressure_extra_add				; No
+	; Yes
+	comf	isr_xC+0,F
+	incf	isr_xC+0,F
+	; Check for max. of 20mbar
+	movlw	.22
+	cpfslt	isr_xC+0
+	clrf	isr_xC+0
+	; Subtract
+	movf	isr_xC+0,W
+	subwf	isr_xC+1,F
+	movlw	.0
+	subwfb	isr_xC+2,F
+	bra		pressure_extra_common
 
 pressure_extra_add:
-    ; Check for max. of 20mbar
-    movlw   .21
-    cpfslt  isr_xC+0
-    clrf    isr_xC+0
-    ; Add
-    movf    isr_xC+0,W
-    addwf   isr_xC+1,F
-    movlw   .0
-    addwfc  isr_xC+2,F
+	; Check for max. of 20mbar
+	movlw	.21
+	cpfslt	isr_xC+0
+	clrf	isr_xC+0
+	; Add
+	movf	isr_xC+0,W
+	addwf	isr_xC+1,F
+	movlw	.0
+	addwfc	isr_xC+2,F
 
 pressure_extra_common:
-	banksel	common                      ; flag2 is in bank 1
+	banksel	common						; flag2 is in bank 1
 	btfss	simulatormode_active		; are we in simulator mode?
 	bra		calc_compensation_2			; no
 
-    banksel isr_xC+2
-    movlw   .5
-    cpfsgt  isr_xC+2                    ; >1280mbar ?
-    bra     pressure_extra_common2      ; No
-    ; Yes, reset sim_pressure:2 to 1000mbar (End of sim)
-    movlw   LOW     .1000
-    movwf   sim_pressure+0
-    movlw   HIGH    .1000
-    movwf   sim_pressure+1
+	banksel	isr_xC+2
+	movlw	.5
+	cpfsgt	isr_xC+2					; > 1280 mbar ?
+	bra		pressure_extra_common2		; No
+	; Yes, reset sim_pressure:2 to 1000mbar (End of sim)
+	movlw	LOW  .1000
+	movwf	sim_pressure+0
+	movlw	HIGH .1000
+	movwf	sim_pressure+1
 
 pressure_extra_common2:
-	movff	sim_pressure+0,isr_xC+1	    ; override readings with simulator values
+	movff	sim_pressure+0,isr_xC+1		; override readings with simulator values
 	movff	sim_pressure+1,isr_xC+2
-	
+
 calc_compensation_2:
 	banksel	isr_backup
-    movf    isr_xC+1,W                  ; Then sum_up to pressure averaging buffer.
-    addwf   amb_pressure_avg+0,F
-    movf    isr_xC+2,W
-    addwfc  amb_pressure_avg+1,F
+	movf	isr_xC+1,W					; Then sum_up to pressure averaging buffer.
+	addwf	amb_pressure_avg+0,F
+	movf	isr_xC+2,W
+	addwfc	amb_pressure_avg+1,F
 
-    ; calculate temp = 200 + dT*(C6+100)/2^11
-    movlw   LOW(.100)                   ; C6 + 100 --> A
-    addwf   C6+0,W
-    movwf   isr_xA+0
-    movlw   HIGH(.100)
-    addwfc  C6+1,W
-    movwf   isr_xA+1
+	; calculate temp = 200 + dT*(C6+100)/2^11
+	movlw	LOW(.100)					; C6 + 100 --> A
+	addwf	C6+0,W
+	movwf	isr_xA+0
+	movlw	HIGH(.100)
+	addwfc	C6+1,W
+	movwf	isr_xA+1
 
-    movff   xdT2+0,isr_xB+0             ; dT2 --> B
-    movff   xdT2+1,isr_xB+1
-	call    isr_signed_mult16x16        ; A*B
-    movlw   .11-.8                      ; A 12bit shift = 1 byte + 3 bits.
-    call    isr_shift_C31
+	movff	xdT2+0,isr_xB+0				; dT2 --> B
+	movff	xdT2+1,isr_xB+1
+	call	isr_signed_mult16x16		; A*B
+	movlw	.11-.8						; A 12 bit shift = 1 byte + 3 bits
+	call	isr_shift_C31
 
-    movlw   LOW(.200)                   ; Add 200
-    addwf   isr_xC+1,F
-    movlw   HIGH(.200)
-    addwfc  isr_xC+2,F
+	movlw	LOW(.200)					; Add 200
+	addwf	isr_xC+1,F
+	movlw	HIGH(.200)
+	addwfc	isr_xC+2,F
 
-    ; Add opt_temperature_adjust to result (SIGNED!)
-    movff   opt_temperature_adjust,isr_xC+0
+	; Add opt_temperature_adjust to result (SIGNED!)
+	movff	opt_temperature_adjust,isr_xC+0
 
-    btfss   isr_xC+0,7              ; <0?
-    bra     temperature_extra_add      ; No
-    ; Yes
-    comf    isr_xC+0,F
-    incf    isr_xC+0,F
-    ; Check for max. of 2.0°C
-    movlw   .22
-    cpfslt  isr_xC+0
-    clrf    isr_xC+0
-    ; Subtract
-    movf    isr_xC+0,W
-    subwf   isr_xC+1,F
-    movlw   .0
-    subwfb  isr_xC+2,F
-    bra     temperature_extra_common
+	btfss	isr_xC+0,7					; < 0 ?
+	bra		temperature_extra_add		; No
+	; Yes
+	comf	isr_xC+0,F
+	incf	isr_xC+0,F
+	; Check for max. of 2.0°C
+	movlw	.22
+	cpfslt	isr_xC+0
+	clrf	isr_xC+0
+	; Subtract
+	movf	isr_xC+0,W
+	subwf	isr_xC+1,F
+	movlw	.0
+	subwfb	isr_xC+2,F
+	bra		temperature_extra_common
 
 temperature_extra_add:
-    ; Check for max. of 2.0°C
-    movlw   .21
-    cpfslt  isr_xC+0
-    clrf    isr_xC+0
-    ; Add
-    movf    isr_xC+0,W
-    addwf   isr_xC+1,F
-    movlw   .0
-    addwfc  isr_xC+2,F
+	; Check for max. of 2.0°C
+	movlw	.21
+	cpfslt	isr_xC+0
+	clrf	isr_xC+0
+	; Add
+	movf	isr_xC+0,W
+	addwf	isr_xC+1,F
+	movlw	.0
+	addwfc	isr_xC+2,F
 temperature_extra_common:
 
-    movf    isr_xC+1,W
-    addwf   temperature_avg+0,F
-    movf    isr_xC+2,W
-    addwfc  temperature_avg+1,F
+	movf	isr_xC+1,W
+	addwf	temperature_avg+0,F
+	movf	isr_xC+2,W
+	addwfc	temperature_avg+1,F
 
-	return			                    ; Done.
+	return								; Done.
 
 ;=============================================================================
 	global	get_pressure_start
@@ -258,8 +258,8 @@
 
 	global get_pressure_value
 get_pressure_value:
-	btfsc	MS5541_miso				; Conversion done?
-	return							; No, Return
+	btfsc	MS5541_miso					; Conversion done?
+	return								; No, Return
 	rcall	get_2bytes_MS5541
 	movff	dMSB,D1+1	
 	movff	dLSB,D1+0
@@ -274,8 +274,8 @@
 
 	global	get_temperature_value
 get_temperature_value:
-	btfsc	MS5541_miso				; Conversion done?
-	return							; No, Return
+	btfsc	MS5541_miso					; Conversion done?
+	return								; No, Return
 	rcall	get_2bytes_MS5541
 	movff	dMSB,D2+1
 	movff	dLSB,D2+0
@@ -285,11 +285,11 @@
 	global	get_calibration_data
 get_calibration_data:
 	banksel	common
-	bsf		no_sensor_int			; disable sensor interrupts
-    banksel isr_backup              ; Back to Bank0 ISR data
+	bsf		no_sensor_int				; disable sensor interrupts
+	banksel isr_backup					; Back to Bank0 ISR data
 
 	rcall	reset_MS5541
-	movlw	b'01010100'	;+3*high as start and 1+low as stop!
+	movlw	b'01010100'					;+3*high as start and 1+low as stop!
 	movwf	isr1_temp
 	movlw	d'13'
 	rcall	send_data_MS5541
@@ -297,7 +297,7 @@
 	movff	dMSB,ir_s8_buffer+1	
 	movff	dLSB,ir_s8_buffer+0
 
-	movlw	b'01011000'	;+3*high as start and 1+low as stop!
+	movlw	b'01011000'					;+3*high as start and 1+low as stop!
 	movwf	isr1_temp
 	movlw	d'13'
 	rcall	send_data_MS5541
@@ -305,7 +305,7 @@
 	movff	dMSB,ir_s8_buffer+3	
 	movff	dLSB,ir_s8_buffer+2
 
-	movlw	b'01100100'	;+3*high as start and 1+low as stop!
+	movlw	b'01100100'					;+3*high as start and 1+low as stop!
 	movwf	isr1_temp
 	movlw	d'13'
 	rcall	send_data_MS5541
@@ -313,7 +313,7 @@
 	movff	dMSB,ir_s8_buffer+5	
 	movff	dLSB,ir_s8_buffer+4
 
-	movlw	b'01101000'	;+3*high as start and 1+low as stop!
+	movlw	b'01101000'					;+3*high as start and 1+low as stop!
 	movwf	isr1_temp
 	movlw	d'13'
 	rcall	send_data_MS5541
@@ -405,7 +405,7 @@
 	bsf		C3+1,1
 	btfsc	ir_s8_buffer+5,6
 	bsf		C3+1,0
-	
+
 ; calculate C4 (16Bit)	
 	movff	ir_s8_buffer+7,C4+0
 	bsf		STATUS,C
@@ -417,14 +417,14 @@
 	bsf		C4+1,0
 
 ; C4=C4-250
-	movlw   LOW(-.250)                  ; C4 - 250 --> C4
+	movlw	LOW(-.250)					; C4 - 250 --> C4
 	addwf	C4+0,W
-	movwf   C4+0
-	movlw   -1                          ; HIGH(- .250) is not understood...
-	addwfc  C4+1,W
-	movwf   C4+1
-	
-; calculate C5 (16Bit)		
+	movwf	C4+0
+	movlw	-1							; HIGH(- .250) is not understood...
+	addwfc	C4+1,W
+	movwf	C4+1
+
+; calculate C5 (16Bit)
 	movff	ir_s8_buffer+4,C5+0
 	bcf		C5+0,6
 	btfsc	ir_s8_buffer+2,0
@@ -442,46 +442,46 @@
 	btfsc	ir_s8_buffer+2,5
 	bsf		C5+1,3
 
-    ; calculate C5 = UT1
-    ; C5 = 8*C5 + 10000 (u16 range 10.000 .. +42.760)
+	; calculate C5 = UT1
+	; C5 = 8*C5 + 10000 (u16 range 10.000 .. +42.760)
 	clrf	isr_xA+1
 	movlw	d'8'
 	movwf	isr_xA+0
 	movff	C5+0,isr_xB+0
 	movff	C5+1,isr_xB+1
-	call	isr_unsigned_mult16x16      ;isr_xA*isr_xB=isr_xC
-    movff   isr_xC+0,C5+0
-    movff   isr_xC+1,C5+1
-	movlw   LOW		d'10000'
-	addwf   C5+0,F
-	movlw   HIGH 	d'10000'
-	addwfc  C5+1,F    ; = 8*C5 + 10000
+	call	isr_unsigned_mult16x16		;isr_xA*isr_xB=isr_xC
+	movff	isr_xC+0,C5+0
+	movff	isr_xC+1,C5+1
+	movlw	LOW  d'10000'
+	addwf	C5+0,F
+	movlw	HIGH d'10000'
+	addwfc	C5+1,F	; = 8*C5 + 10000
 
-; calculate C6 (16Bit)		
+; calculate C6 (16Bit)
 	clrf	C6+1
 	movff	ir_s8_buffer+6,C6+0
 	bcf		C6+0,7
 
 	banksel	common
-	bcf		no_sensor_int		; enable sensor interrupts
-	bcf		pressure_refresh 		; Clear flag
-    banksel isr_backup              ; Back to Bank0 ISR data
+	bcf		no_sensor_int				; enable sensor interrupts
+	bcf		pressure_refresh 			; Clear flag
+	banksel	isr_backup					; Back to Bank0 ISR data
 
-	clrf		sensor_state_counter			; Then reset State counter
+	clrf	sensor_state_counter		; Then reset State counter
 
 	return
 
 ;=============================================================================
 reset_MS5541_one:
 	bsf		MS5541_mosi
-    bra    send_clk_pulse  ; Send one high-low sequence on MS5541_clk  -> and return
+	bra		send_clk_pulse				; Send one high-low sequence on MS5541_clk  -> and return
 
 reset_MS5541_zero:
 	bcf		MS5541_mosi
-    bra    send_clk_pulse  ; Send one high-low sequence on MS5541_clk  -> and return
+	bra		send_clk_pulse				; Send one high-low sequence on MS5541_clk  -> and return
 
 reset_MS5541:
-	rcall	reset_MS5541_one			;0
+	rcall	reset_MS5541_one			; 0
 	rcall	reset_MS5541_zero
 	rcall	reset_MS5541_one
 	rcall	reset_MS5541_zero
@@ -496,12 +496,12 @@
 	rcall	reset_MS5541_one
 	rcall	reset_MS5541_zero
 	rcall	reset_MS5541_one
-	rcall	reset_MS5541_zero			;15
-	rcall	reset_MS5541_zero	
-	rcall	reset_MS5541_zero	
-	rcall	reset_MS5541_zero	
-	rcall	reset_MS5541_zero	
-	rcall	reset_MS5541_zero			;20
+	rcall	reset_MS5541_zero			; 15
+	rcall	reset_MS5541_zero
+	rcall	reset_MS5541_zero
+	rcall	reset_MS5541_zero
+	rcall	reset_MS5541_zero
+	rcall	reset_MS5541_zero			; 20
 	return
 
 get_2bytes_MS5541:
@@ -514,11 +514,11 @@
 	movwf	clock_count
 	rcall	recieve_loop
 	movff	isr1_temp,dLSB
-    bra    send_clk_pulse  ; Send one high-low sequence on MS5541_clk  -> and return
+	bra		send_clk_pulse				; Send one high-low sequence on MS5541_clk  -> and return
 	;return
 
 recieve_loop:
-    rcall   send_clk_pulse  ; Send one high-low sequence on MS5541_clk
+	rcall   send_clk_pulse				; Send one high-low sequence on MS5541_clk
 	btfss	MS5541_miso	;MSB first
 	bcf		STATUS,C
 	btfsc	MS5541_miso	;MSB first
@@ -541,29 +541,29 @@
 	nop
 	nop
 	nop
-    return
+	return
 
 send_data_MS5541:
-	movwf	clock_count     ; From WREG
+	movwf	clock_count	 ; From WREG
 	; send three startbits first
 	bcf		MS5541_clk
 	nop
 	nop
 	bsf		MS5541_mosi
 	movlw	d'3'
-	subwf	clock_count,F	; total bit counter
-    rcall   send_clk_pulse  ; Send one high-low sequence on MS5541_clk
-    rcall   send_clk_pulse  ; Send one high-low sequence on MS5541_clk
-    rcall   send_clk_pulse  ; Send one high-low sequence on MS5541_clk
+	subwf	clock_count,F				; total bit counter
+	rcall   send_clk_pulse				; Send one high-low sequence on MS5541_clk
+	rcall   send_clk_pulse				; Send one high-low sequence on MS5541_clk
+	rcall   send_clk_pulse				; Send one high-low sequence on MS5541_clk
 	; now send 8 bytes from isr_temp1 and fill-up with zeros
 send_data_MS5541_2:
 	bcf		MS5541_clk
 	nop
 	nop
 
-	btfss	isr1_temp,7	;MSB first
+	btfss	isr1_temp,7					; MSB first
 	bcf		MS5541_mosi
-	btfsc	isr1_temp,7	;MSB first
+	btfsc	isr1_temp,7					; MSB first
 	bsf		MS5541_mosi
 
 	bsf		MS5541_clk
@@ -583,4 +583,4 @@
 	bcf		MS5541_clk
 	return
 
-        END
\ No newline at end of file
+	END
\ No newline at end of file
--- a/src/ms5541.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/ms5541.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -13,4 +13,4 @@
 	extern	get_pressure_value
 	extern	get_temperature_start
 	extern	get_temperature_value
-	extern 	get_calibration_data
+	extern	get_calibration_data
--- a/src/option_table.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/option_table.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,8 +1,8 @@
 ;=============================================================================
 ;
-;   File option_table.asm							REFACTORED VERSION V2.98
+;   File option_table.asm							REFACTORED VERSION V2.99e
 ;
-;   The option table
+;   The Option Table
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
@@ -10,7 +10,7 @@
 ;   2014-08-03 : mH creation
 ;
 
-#include "hwos.inc"					; Mandatory header
+#include "hwos.inc"					; Mandatory Header
 #include "eeprom_rs232.inc"
 
 ;=============================================================================
@@ -20,7 +20,7 @@
 
 OPTION_UINT8	MACRO lbl, min, max, default, unit, eeprom, register
 		global	lbl
-lbl:	db		0, default			; Type0 = INT8
+lbl:	db		0, default			; type0 = INT8
 		db		1, min
 		db		max, eeprom
 		dw		unit
@@ -29,7 +29,7 @@
 
 OPTION_UINT8p2	MACRO lbl, min, max, default, unit, eeprom, register
 		global	lbl
-lbl:	db		0, default			; Type0 = INT8
+lbl:	db		0, default			; type0 = INT8
 		db		2, min
 		db		max, eeprom
 		dw		unit
@@ -38,7 +38,7 @@
 
 OPTION_UINT8p3	MACRO lbl, min, max, default, unit, eeprom, register
 		global	lbl
-lbl:	db		0, default			; Type0 = INT8
+lbl:	db		0, default			; type0 = INT8
 		db		3, min
 		db		max, eeprom
 		dw		unit
@@ -47,7 +47,7 @@
 
 OPTION_UINT8p5	MACRO lbl, min, max, default, unit, eeprom, register
 		global	lbl
-lbl:	db		0, default			; Type0 = INT8
+lbl:	db		0, default			; type0 = INT8
 		db		.5, min
 		db		max, eeprom
 		dw		unit
@@ -56,7 +56,7 @@
 
 OPTION_UINT8p10	MACRO lbl, min, max, default, unit, eeprom, register
 		global	lbl
-lbl:	db		0, default			; Type0 = INT8
+lbl:	db		0, default			; type0 = INT8
 		db		.10, min
 		db		max, eeprom
 		dw		unit
@@ -66,10 +66,10 @@
 OPTION_ENUM8	MACRO lbl, max, default, tValue, eeprom, register
 		global	lbl
 		extern	tValue
-lbl:	db		1, default			; Type1 = ENUM
+lbl:	db		1, default			; type1 = ENUM
 		db		LOW(tValue), HIGH(tValue)
 		db		max, eeprom
-		dw		0					; No unit
+		dw		0					; no unit
 		dw		register
 		ENDM
 
@@ -80,21 +80,20 @@
 
 OPTION_STRING	MACRO lbl, length, defText, eeprom, register
 		global	lbl
-lbl:	db		2, LOW(defText)		; Type2 = STRING
+lbl:	db		2, LOW(defText)		; type2 = STRING
 		db		HIGH(defText), 0
 		db		length, eeprom
-		dw		0					; No unit
+		dw		0					; no unit
 		dw		register
 		ENDM
 
 
 ;=============================================================================
-	extern	tPercent, tMeters, tMinutes, tGasDisabled, tbar
-	extern	char_I_deco_gas_change, char_I_setpoint_change, char_I_setpoint_cbar, char_I_dil_change
+	extern	tPercent, tMeters, tMinutes, tGasDisabled, tbar, tNo, tTrModeOff, tTrPresNone, tDefName, tblank, tLogTunitC
+	extern	char_I_setpoint_change, char_I_setpoint_cbar
 	extern	char_I_dive_interval, char_I_bottom_time, char_I_bottom_depth
 	extern	char_I_deco_model
 	extern	char_I_extra_time
-	extern	tDefName, tblank
 	extern	char_I_bottom_usage, char_I_deco_usage, tLitersMinute
 	extern	char_I_PSCR_drop, char_I_PSCR_lungratio
 	extern	char_I_tank_size, char_I_tank_pres_fill, tLiter, tbar10
@@ -102,22 +101,28 @@
 	extern	char_I_altitude_wait
 	extern	char_I_ppO2_max, char_I_ppO2_min, char_I_ppO2_max_deco, char_I_ppO2_min_loop
 	extern	char_I_ascent_speed, tMeterMinute
-	extern	char_I_gas_change_time, tmin
+	extern	char_I_gas_change_time
+	extern	char_I_max_pres_diff
+
 
-; Option table
-;	OPTION_UINT8	Label,				min,			max,		  default, text-string, EEPROM location, RAM location
+;	Option Table - Format:
+;	----------------------
+;	OPTION_UINT8	Label,				min,			max,		  default, unit text,	EEPROM location, RAM location
+;	OPTION_ENUM8	Label,				number of enums				  default, unit text,	EEPROM location, RAM location	; number of enums = 2, 3, ..., default starts with 0
+;	OPTION_BOOL		Label,											  default,				EEPROM location, RAM location
 
 #DEFINE notext		.0		; no text-string associated
 #DEFINE volatile	-1		; do not store to EEPROM
 
+
 	global	option_table_begin
 option_table_begin:
 ;=============================================================================
 ; Manage Decoplaner & Dive parameters
 	OPTION_UINT8p10	odiveInterval,		.0,				.240,			.0,		tMinutes,	volatile,	char_I_dive_interval
-	OPTION_UINT8p2	obottomTime,		.1,				.60,			.5,		tMinutes,	volatile,	char_I_bottom_time
+	OPTION_UINT8p2	obottomTime,		.2,				.60,			.10,	tMinutes,	volatile,	char_I_bottom_time
 	OPTION_UINT8p3	obottomDepth,		.12,			.120,			.21,	tMeters,	volatile,	char_I_bottom_depth
-	OPTION_ENUM8	oDiveMode,			.5,								.0,		tDvOC,			.8,		opt_dive_mode					; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR 
+	OPTION_ENUM8	oDiveMode,			.5,								.0,		tDvOC,			.8,		opt_dive_mode					; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
 	OPTION_ENUM8	oDecoMode,			.2,								.1,		tZHL16,			.9,		char_I_deco_model				; 0 = ZH-L16, 1 = ZH-L16-GF
 	;																							.10										; in use, see below
 	OPTION_UINT8	oLastDeco,			.3,				.6,				.3,		tMeters,		.11,	opt_last_stop
@@ -138,12 +143,7 @@
 	OPTION_ENUM8	oBrightness,		.3,								.0,		tEco,			.23,	opt_brightness					; =0: Eco, =1:Medium, =2:Full
 	OPTION_UINT8	oDiveSalinity,		.0,				.4,				.0,		tPercent,		.24,	opt_salinity					; 0-4%
 	OPTION_ENUM8	oCCRMode,			.3,								.0,		tCCRModeFixedSP,.25,	opt_ccr_mode					; =0: Fixed SP, =1: Sensor, =2: Auto SP
-
-	IFNDEF	french_italian
-	OPTION_ENUM8	oLanguage,			.2,								.0,		tEnglish,		.26,	opt_language					; 0=EN, 1=DE
-	ELSE
-	OPTION_ENUM8	oLanguage,			.2,								.0,		tFrench,		.26,	opt_language					; 0=FR, 1=IT
-	ENDIF
+	OPTION_ENUM8	oLanguage,			.2,								.0,		tLang1,			.26,	opt_language					; language selection
 	OPTION_ENUM8	oDateFormat,		.3,								.1,		tDateformat,	.27,	opt_dateformat					; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
 	OPTION_ENUM8	oUnits,				.2,								.0,		tMetric,		.28,	opt_units						; 0=Meter, 1=Feet
 
@@ -173,11 +173,11 @@
 	OPTION_UINT8	oGas4He,			.0,				gaslist_max_He,	.0,		tPercent,		.47,	opt_gas_He_ratio+3
 	OPTION_UINT8	oGas5O2,			gaslist_min_o2,	.100,			.21,	tPercent,		.48,	opt_gas_O2_ratio+4
 	OPTION_UINT8	oGas5He,			.0,				gaslist_max_He,	.0,		tPercent,		.49,	opt_gas_He_ratio+4
-	OPTION_UINT8	oGas1Depth,			.0,	gaslist_max_change_depth,	.0,		tMeters,		.50,	opt_OC_bail_gas_change+0
-	OPTION_UINT8	oGas2Depth,			.0,	gaslist_max_change_depth,	.0,		tMeters,		.51,	opt_OC_bail_gas_change+1
-	OPTION_UINT8	oGas3Depth,			.0,	gaslist_max_change_depth,	.0,		tMeters,		.52,	opt_OC_bail_gas_change+2
-	OPTION_UINT8	oGas4Depth,			.0,	gaslist_max_change_depth,	.0,		tMeters,		.53,	opt_OC_bail_gas_change+3
-	OPTION_UINT8	oGas5Depth,			.0,	gaslist_max_change_depth,	.0,		tMeters,		.54,	opt_OC_bail_gas_change+4
+	OPTION_UINT8	oGas1Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.50,	opt_gas_change+0
+	OPTION_UINT8	oGas2Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.51,	opt_gas_change+1
+	OPTION_UINT8	oGas3Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.52,	opt_gas_change+2
+	OPTION_UINT8	oGas4Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.53,	opt_gas_change+3
+	OPTION_UINT8	oGas5Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.54,	opt_gas_change+4
 	OPTION_UINT8	oDil1O2,			gaslist_min_o2,	.100,			.21,	tPercent,		.55,	opt_dil_O2_ratio+0
 	OPTION_UINT8	oDil1He,			.0,				gaslist_max_He,	.0,		tPercent,		.56,	opt_dil_He_ratio+0
 	OPTION_UINT8	oDil2O2,			gaslist_min_o2,	.100,			.21,	tPercent,		.57,	opt_dil_O2_ratio+1
@@ -203,11 +203,11 @@
 	OPTION_ENUM8	oDil3,				.2,								.0,		tDilDisabled,	.77,	opt_dil_type+2
 	OPTION_ENUM8	oDil4,				.2,								.0,		tDilDisabled,	.78,	opt_dil_type+3
 	OPTION_ENUM8	oDil5,				.2,								.0,		tDilDisabled,	.79,	opt_dil_type+4
-	OPTION_UINT8	oDil1Depth,			.0,				.99,			.0,		tMeters,		.80,	char_I_dil_change+0
-	OPTION_UINT8	oDil2Depth,			.0,				.99,			.0,		tMeters,		.81,	char_I_dil_change+1
-	OPTION_UINT8	oDil3Depth,			.0,				.99,			.0,		tMeters,		.82,	char_I_dil_change+2
-	OPTION_UINT8	oDil4Depth,			.0,				.99,			.0,		tMeters,		.83,	char_I_dil_change+3
-	OPTION_UINT8	oDil5Depth,			.0,				.99,			.0,		tMeters,		.84,	char_I_dil_change+4
+	OPTION_UINT8	oDil1Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.80,	opt_dil_change+0
+	OPTION_UINT8	oDil2Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.81,	opt_dil_change+1
+	OPTION_UINT8	oDil3Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.82,	opt_dil_change+2
+	OPTION_UINT8	oDil4Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.83,	opt_dil_change+3
+	OPTION_UINT8	oDil5Depth,			.0,	gaslist_max_change_depth,	.56,	tMeters,		.84,	opt_dil_change+4
 
 ;=============================================================================
 ; opt_name from 85 to 145
@@ -215,10 +215,10 @@
 
 ;=============================================================================
 ; Misc
-	OPTION_ENUM8	oColorSetDive,		.4,								.0,		tColorSetName0,	.146,	opt_dive_color_scheme			; Color scheme divemode
+	OPTION_ENUM8	oColorSetDive,		.4,								.0,		tColorSetName0,	.146,	opt_dive_color_scheme			; color scheme divemode
 	OPTION_UINT8	oPressureAdjust,	.0,				.255,			.0,		notext,			.147,	opt_pressure_adjust				; SIGNED int (-20/+20mbar max.)
 	OPTION_BOOL		oSafetyStop,		.0,														.148,	opt_enable_safetystop			; =1: A safety stop is shown
-	OPTION_UINT8	oCalGasO2,			.21,			.100,			.21,	tPercent,		.149,	opt_calibration_O2_ratio		; Calibration gas %O2 (Do not move in EEPROM, must stay at .149!)
+	OPTION_UINT8	oCalGasO2,			.21,			.100,			.21,	tPercent,		.149,	opt_calibration_O2_ratio		; calibration gas %O2 (Do not move in EEPROM, must stay at .149!)
 	OPTION_BOOL		oFlipScreen,		.0,														.151,	opt_flip_screen					; =1: Flip the screen
 	OPTION_UINT8p10	ocR_button_left,	.20,			.80,			.40,	tPercent,		.152,	opt_cR_button_left				; left button sensitivity
 	OPTION_UINT8p10	ocR_button_right,	.20,			.80,			.40,	tPercent,		.153,	opt_cR_button_right				; right button sensitivity
@@ -233,38 +233,84 @@
 	OPTION_UINT8	oSafetyStopStart,	.21,			.61,			.51,	notext,			.162,	opt_safety_stop_start			; [cbar], default 510mbar, min 210mbar, max 610mbar
 	OPTION_UINT8	oSafetyStopEnd,		.19,			.39,			.29,	notext,			.163,	opt_safety_stop_end				; [cbar], default 290mbar, min 190mbar, max 390mbar
 	OPTION_UINT8	oSafetyStopReset,	.81,			.151,			.101,	notext,			.164,	opt_safety_stop_reset			; [cbar], default 1010mbar, min 810mbar, max 1510mbar
-	OPTION_UINT8	oDiveTimeout,		.1,				.20,			.5,		tMinutes,		.168,	opt_diveTimeout					; Timeout for divemode in minutes
-	OPTION_UINT8	oPSCR_drop,			.0,				.15,			.4,		tPercent,		.169,	char_I_PSCR_drop				; PSCR Drop [%]
-	OPTION_UINT8	oPSCR_lungratio,	.5,				.20,			.10,	tPercent,		.170,	char_I_PSCR_lungratio			; PSCR Lung Ratio [1/x]
+	OPTION_UINT8	oDiveTimeout,		.1,				.20,			.5,		tMinutes,		.168,	opt_diveTimeout					; timeout for divemode in minutes
+	OPTION_UINT8	oPSCR_drop,			.0,				.15,			.4,		tPercent,		.169,	char_I_PSCR_drop				; pSCR Drop [%]
+	OPTION_UINT8	oPSCR_lungratio,	.5,				.20,			.10,	tPercent,		.170,	char_I_PSCR_lungratio			; pSCR Lung Ratio [1/x]
 ;																								.171									; in use, see below
 ;																								.172									; in use, see below
-	OPTION_UINT8	oTankSize1,			.1,				.40,			.11,	tLiter,			.173,	char_I_tank_size+0				; size of OC gas tank 1
-	OPTION_UINT8	oTankSize2,			.1,				.40,			.11,	tLiter,			.174,	char_I_tank_size+1				; size of OC gas tank 2
-	OPTION_UINT8	oTankSize3,			.1,				.40,			.11,	tLiter,			.175,	char_I_tank_size+2				; size of OC gas tank 3
-	OPTION_UINT8	oTankSize4,			.1,				.40,			.11,	tLiter,			.176,	char_I_tank_size+3				; size of OC gas tank 4
-	OPTION_UINT8	oTankSize5,			.1,				.40,			.11,	tLiter,			.177,	char_I_tank_size+4				; size of OC gas tank 5
-	OPTION_UINT8	oTankFillPres1,		.5,				.29,			.20,	tbar10,			.178,	char_I_tank_pres_fill+0			; fill press of OC gas tank 1
-	OPTION_UINT8	oTankFillPres2,		.5,				.29,			.20,	tbar10,			.179,	char_I_tank_pres_fill+1			; fill press of OC gas tank 2
-	OPTION_UINT8	oTankFillPres3,		.5,				.29,			.20,	tbar10,			.180,	char_I_tank_pres_fill+2			; fill press of OC gas tank 3
-	OPTION_UINT8	oTankFillPres4,		.5,				.29,			.20,	tbar10,			.181,	char_I_tank_pres_fill+3			; fill press of OC gas tank 4
-	OPTION_UINT8	oTankFillPres5,		.5,				.29,			.20,	tbar10,			.182,	char_I_tank_pres_fill+4			; fill press of OC gas tank 5
+	OPTION_UINT8	oTankSize1,			min_tank_size,	max_tank_size,	.11,	tLiter,			.173,	char_I_tank_size+0				; size of OC gas tank 1, in liters
+	OPTION_UINT8	oTankSize2,			min_tank_size,	max_tank_size,	.11,	tLiter,			.174,	char_I_tank_size+1				; size of OC gas tank 2, in liters
+	OPTION_UINT8	oTankSize3,			min_tank_size,	max_tank_size,	.11,	tLiter,			.175,	char_I_tank_size+2				; size of OC gas tank 3, in liters
+	OPTION_UINT8	oTankSize4,			min_tank_size,	max_tank_size,	.11,	tLiter,			.176,	char_I_tank_size+3				; size of OC gas tank 4, in liters
+	OPTION_UINT8	oTankSize5,			min_tank_size,	max_tank_size,	.11,	tLiter,			.177,	char_I_tank_size+4				; size of OC gas tank 5, in liters
+	OPTION_UINT8	oTankFillPres1,		min_fill_press,	max_fill_press,	.20,	tbar10,			.178,	char_I_tank_pres_fill+0			; fill press of OC gas tank 1, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres2,		min_fill_press,	max_fill_press,	.20,	tbar10,			.179,	char_I_tank_pres_fill+1			; fill press of OC gas tank 2, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres3,		min_fill_press,	max_fill_press,	.20,	tbar10,			.180,	char_I_tank_pres_fill+2			; fill press of OC gas tank 3, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres4,		min_fill_press,	max_fill_press,	.20,	tbar10,			.181,	char_I_tank_pres_fill+3			; fill press of OC gas tank 4, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres5,		min_fill_press,	max_fill_press,	.20,	tbar10,			.182,	char_I_tank_pres_fill+4			; fill press of OC gas tank 5, in multiples of 10 bars
 	OPTION_UINT8	oCCmaxFracO2,		.80,			.100,			.90,	tPercent,		.183,	char_I_cc_max_frac_o2			; max. O2 % in Loop
 	OPTION_UINT8	oSimSetpoint,		.1,				.5,				.1,		tblank,			.184,	opt_sim_setpoint_number			; setpoint to use for deco calculation
-	OPTION_BOOL		oCalcAscGas,		.0,														.185,	opt_calc_asc_gasvolume			; calculate OC gas volume needs for ascent
+ IFDEF _cave_mode
+	OPTION_ENUM8	oCalcAscGas,		.3,								.0,		tNo,			.185,	opt_calc_asc_gasvolume			; calculate OC gas volume needs for ascent
+ ELSE
+	OPTION_ENUM8	oCalcAscGas,		.2,								.0,		tNo,			.185,	opt_calc_asc_gasvolume			; calculate OC gas volume needs for ascent
+ ENDIF
 	OPTION_BOOL		oSimAGF,			.0,													volatile,	opt_sim_use_aGF					; use GF (no) or aGF (yes) for deco calculation
 	OPTION_ENUM8	oAltMode,			.4,								.0,		tAltModeFly,	.186,	char_I_altitude_wait			; 0=no-fly, 1=1000m, 2=2000m, 3=3000m
 	OPTION_BOOL		oEnable_IBCD,		.0,														.187,	opt_enable_IBCD					; =1: IBCD warning activated
-	OPTION_UINT8	oAscentSpeed,		.5,				.10,			.10,	tMeterMinute,	.188,	char_I_ascent_speed				; ascent speed - Attention: proper operation with other values than the default of 10m/min has not been validated yet! Do not deviate from the default until further notice!
-	OPTION_UINT8	oGasChangeTime,		.0,				.3,				.1,		tmin,			.189,	char_I_gas_change_time			; (extra) time at a stop to change the gas
+	OPTION_UINT8	oAscentSpeed,		.5,				.10,			.10,	tMeterMinute,	.188,	char_I_ascent_speed				; ascent speed
+	OPTION_UINT8	oGasChangeTime,		.0,				.3,				.1,		tMinutes,		.189,	char_I_gas_change_time			; (extra) time at a stop to change the gas
 	OPTION_UINT8p5	osatmult,			.100,			.140,			.110,	tPercent,		.190,	opt_sat_multiplier_non_gf		; for NON-GF Mode
 	OPTION_UINT8p5	odesatmult,			.60,			.100,			.90,	tPercent,		.191,	opt_desat_multiplier_non_gf		; for NON-GF Mode
+	OPTION_UINT8	oTransID1_0,		.0,				.255,			.0,		notext,			.192,	opt_transmitter_id_1+0			; ID of transmitter for gas 1 (LOW)
+	OPTION_UINT8	oTransID1_1,		.0,				.255,			.0,		notext,			.193,	opt_transmitter_id_1+1			; ID of transmitter for gas 1 (HIGH)
+	OPTION_UINT8	oTransID2_0,		.0,				.255,			.0,		notext,			.194,	opt_transmitter_id_2+0			; ID of transmitter for gas 2 (LOW)
+	OPTION_UINT8	oTransID2_1,		.0,				.255,			.0,		notext,			.195,	opt_transmitter_id_2+1			; ID of transmitter for gas 2 (HIGH)
+	OPTION_UINT8	oTransID3_0,		.0,				.255,			.0,		notext,			.196,	opt_transmitter_id_3+0			; ID of transmitter for gas 3 (LOW)
+	OPTION_UINT8	oTransID3_1,		.0,				.255,			.0,		notext,			.197,	opt_transmitter_id_3+1			; ID of transmitter for gas 3 (HIGH)
+	OPTION_UINT8	oTransID4_0,		.0,				.255,			.0,		notext,			.198,	opt_transmitter_id_4+0			; ID of transmitter for gas 4 (LOW)
+	OPTION_UINT8	oTransID4_1,		.0,				.255,			.0,		notext,			.199,	opt_transmitter_id_4+1			; ID of transmitter for gas 4 (HIGH)
+	OPTION_UINT8	oTransID5_0,		.0,				.255,			.0,		notext,			.200,	opt_transmitter_id_5+0			; ID of transmitter for gas 5 (LOW)
+	OPTION_UINT8	oTransID5_1,		.0,				.255,			.0,		notext,			.201,	opt_transmitter_id_5+1			; ID of transmitter for gas 5 (HIGH)
+	OPTION_UINT8	oTransID6_0,		.0,				.255,			.0,		notext,			.202,	opt_transmitter_id_6+0			; ID of transmitter for dil 1 (LOW)
+	OPTION_UINT8	oTransID6_1,		.0,				.255,			.0,		notext,			.203,	opt_transmitter_id_6+1			; ID of transmitter for dil 1 (HIGH)
+	OPTION_UINT8	oTransID7_0,		.0,				.255,			.0,		notext,			.204,	opt_transmitter_id_7+0			; ID of transmitter for dil 2 (LOW)
+	OPTION_UINT8	oTransID7_1,		.0,				.255,			.0,		notext,			.205,	opt_transmitter_id_7+1			; ID of transmitter for dil 2 (HIGH)
+	OPTION_UINT8	oTransID8_0,		.0,				.255,			.0,		notext,			.206,	opt_transmitter_id_8+0			; ID of transmitter for dil 3 (LOW)
+	OPTION_UINT8	oTransID8_1,		.0,				.255,			.0,		notext,			.207,	opt_transmitter_id_8+1			; ID of transmitter for dil 3 (HIGH)
+	OPTION_UINT8	oTransID9_0,		.0,				.255,			.0,		notext,			.208,	opt_transmitter_id_9+0			; ID of transmitter for dil 4 (LOW)
+	OPTION_UINT8	oTransID9_1,		.0,				.255,			.0,		notext,			.209,	opt_transmitter_id_9+1			; ID of transmitter for dil 4 (HIGH)
+	OPTION_UINT8	oTransID10_0,		.0,				.255,			.0,		notext,			.210,	opt_transmitter_id_10+0			; ID of transmitter for dil 5 (LOW)
+	OPTION_UINT8	oTransID10_1,		.0,				.255,			.0,		notext,			.211,	opt_transmitter_id_10+1			; ID of transmitter for dil 5 (HIGH)
+	OPTION_UINT8	oTankSize6,			min_tank_size,	max_tank_size,	.11,	tLiter,			.212,	char_I_tank_size+5				; size of DIL gas tank 1, in liters
+	OPTION_UINT8	oTankSize7,			min_tank_size,	max_tank_size,	.11,	tLiter,			.213,	char_I_tank_size+6				; size of DIL gas tank 2, in liters
+	OPTION_UINT8	oTankSize8,			min_tank_size,	max_tank_size,	.11,	tLiter,			.214,	char_I_tank_size+7				; size of DIL gas tank 3, in liters
+	OPTION_UINT8	oTankSize9,			min_tank_size,	max_tank_size,	.11,	tLiter,			.215,	char_I_tank_size+8				; size of DIL gas tank 4, in liters
+	OPTION_UINT8	oTankSize10,		min_tank_size,	max_tank_size,	.11,	tLiter,			.216,	char_I_tank_size+9				; size of DIL gas tank 5, in liters
+	OPTION_UINT8	oTankFillPres6,		min_fill_press,	max_fill_press,	.20,	tbar10,			.217,	char_I_tank_pres_fill+5			; fill press of DIL gas tank 1, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres7,		min_fill_press,	max_fill_press,	.20,	tbar10,			.218,	char_I_tank_pres_fill+6			; fill press of DIL gas tank 2, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres8,		min_fill_press,	max_fill_press,	.20,	tbar10,			.219,	char_I_tank_pres_fill+7			; fill press of DIL gas tank 3, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres9,		min_fill_press,	max_fill_press,	.20,	tbar10,			.220,	char_I_tank_pres_fill+8			; fill press of DIL gas tank 4, in multiples of 10 bars
+	OPTION_UINT8	oTankFillPres10,	min_fill_press,	max_fill_press,	.20,	tbar10,			.221,	char_I_tank_pres_fill+9			; fill press of DIL gas tank 5, in multiples of 10 bars
+	OPTION_ENUM8	oTrMode,			.4,								.1,		tTrModeOff,		.222,	opt_TR_mode						; TR functions - mode
+	OPTION_ENUM8	oTr1stPres,			.15,							.1,		tTrPresNone,	.223,	opt_TR_1st_pres					; TR functions - 1st pressure assignment
+	OPTION_ENUM8	oTr2ndPres,			.15,							.0,		tTrPresNone,	.224,	opt_TR_2nd_pres					; TR functions - 2nd pressure assignment
+	OPTION_ENUM8	oTrBailPres,		.15,							.1,		tTrPresNone,	.225,	opt_TR_Bail_pres				; TR functions - bailout pressure assignment
+	OPTION_UINT8p5	oTrMaxDeltaPres,	max_pres_diff_min,max_pres_diff_max,.5,	tbar,			.226,	char_I_max_pres_diff			; TR functions - maximum delta pressure in independent double mode
+	OPTION_BOOL		oRealGasFactorUse,	.0,														.227,	opt_ZfactorUse					; =1: figure in compression factor Z when converting gas volume <-> gas pressure [future option, not used yet]
+	OPTION_UINT8p5	oRealGasFactorTemp,	.0,				.30,			.15,	tLogTunitC,		.228,	opt_ZfactorTemp					; temperature setpoint for compression factor Z
+	OPTION_ENUM8	o2ndDepthDisp,		.2,								.0,		tMaxDepth,		.229,	opt_2ndDepthDisp				; =1: show average depth instead of max depth
+	;	+-----------------------+
+	;	| add new options here! |
+	;	+-----------------------+
 
 ; ppO2 warnings, sorted by ppO2 levels
-	OPTION_UINT8p10	oPPO2Min,		ppo2_warning_low_lowest,	ppo2_warning_low_highest,	ppo2_warning_low_default,	notext,	.16,	char_I_ppO2_min		; ppO2 min on OC
-	OPTION_UINT8p10	oPPO2MinCC,		ppo2_warning_loop_lowest,	ppo2_warning_loop_highest,	ppo2_warning_loop_default,	notext,	.172,	char_I_ppO2_min_loop	; ppO2 min on Loop
-	OPTION_UINT8p10	oPPO2Max,		ppo2_warning_high_lowest,	ppo2_warning_high_highest,	ppo2_warning_high_default,	notext,	.10,	char_I_ppO2_max		; ppO2 max when not in deco
+	OPTION_UINT8p10	oPPO2Min,		ppo2_warning_low_lowest,	ppo2_warning_low_highest,	ppo2_warning_low_default,	notext,	.16,	char_I_ppO2_min			; ppO2 min on OC   and for pure diluent in CCR
+	OPTION_UINT8p10	oPPO2MinCC,		ppo2_warning_loop_lowest,	ppo2_warning_loop_highest,	ppo2_warning_loop_default,	notext,	.172,	char_I_ppO2_min_loop	; ppO2 min on Loop and for pure diluent in pSCR
+	OPTION_UINT8p10	oPPO2Max,		ppo2_warning_high_lowest,	ppo2_warning_high_highest,	ppo2_warning_high_default,	notext,	.10,	char_I_ppO2_max			; ppO2 max when not in deco
 	OPTION_UINT8p10	oPPO2MaxDeco,	ppo2_warning_deco_lowest,	ppo2_warning_deco_highest,	ppo2_warning_deco_default,	notext,	.171,	char_I_ppO2_max_deco	; ppO2 max when in deco
 
+
 ;=============================================================================
 ; Set Time/Set Date (RAM only)
 	OPTION_UINT8	oSetHours,			.0,				.23,			.0,		.0,			volatile,	hours
--- a/src/options.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/options.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File options.asm								REFACTORED VERSION V2.97
+;   File options.asm								REFACTORED VERSION V2.99e
 ;
 ;   Manage all options data.
 ;
@@ -9,79 +9,67 @@
 ; HISTORY
 ;   2011-07-12 : [jDG] Creation.
 ;
-; RATIONALS:
-;
-;   Provides a centralized file with 
 
-#include "hwos.inc"							; Mandatory header
+#include "hwos.inc"							; mandatory header
 #include "strings.inc"
 #include "convert.inc"
 #include "ghostwriter.inc"
 #include "eeprom_rs232.inc"
 #include "external_flash.inc"
 #include "wait.inc"
+#include "shared_definitions.h"
 
 	extern	write_eeprom
 	extern	read_eeprom
 	extern	eeprom_serial_save,eeprom_opt_backup
 	extern	option_table_begin,option_table_end
 
-	global	option_reset_all				; Reset all options to factory default.
-	global	option_check_all				; Check all option and reset option if out of min/max boundary
-	global	option_reset					; Reset FSR0 option to factory default.
-	global	option_save_all					; Save options to EEPROM.
-	global	option_restore_all				; Restore options from EEPROM.
-	global	option_inc						; Increment FSR0 option.
-	global	option_draw						; STRCAT FRS0 option.
-
-
-gui		CODE								; Appends to other GUI segment
+options		CODE
 
 ;=============================================================================
-; Reset all options to factory defaults.
+; Reset all options to factory defaults
 ;
 ; INPUT:  none
 ; OUTPUT: none
 ; TRASH:  TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2
-
+;
+	global	option_reset_all				; reset all options to factory default
 option_reset_all:
 	clrf	EEADRH
 	read_int_eeprom .2
-	tstfsz	EEDATA							; Total dives=0?
-	bra		option_reset_all2				; No, skip resetting logbook
+	tstfsz	EEDATA							; number of total dives = 0 ?
+	bra		option_reset_all2				; NO - skip resetting logbook
 	read_int_eeprom .3
-	tstfsz	EEDATA							; Total dives=0?
-	bra		option_reset_all2				; No, skip resetting logbook
+	tstfsz	EEDATA							; number of total dives = 0 ?
+	bra		option_reset_all2				; NO - skip resetting logbook
 
 	clrf	EEDATA
 	write_int_eeprom .4
 	write_int_eeprom .5
 	write_int_eeprom .6
-	write_int_eeprom .2						; Also, delete total dive counter
+	write_int_eeprom .2						; delete total dive counter, too
 	write_int_eeprom .3
-	call	ext_flash_erase_logbook			; And complete logbook (!)
+	call	ext_flash_erase_logbook			; complete logbook
 
 option_reset_all2:
 	clrf	lo
 	clrf	hi
-	call	do_logoffset_common_write		; reset Logbook offset
-
-	; Point to option table begin
-	movlw	LOW(option_table_begin)
+	call	do_logoffset_common_write		; reset logbook offset
+	movlw	LOW(option_table_begin)			; point to option table begin
 	movwf	FSR0L
 	movlw	HIGH(option_table_begin)
 	movwf	FSR0H
 option_reset_all_1:
-	movlw	LOW(option_table_end)
-	cpfseq	FSR0L
-	bra		option_reset_all_2				; Not yet done...
-	movlw	HIGH(option_table_end)
-	cpfseq	FSR0H
-	bra		option_reset_all_2				; Not yet done...
-	return									; All done.
+	movlw	LOW(option_table_end)			; get low byte of end of table address
+	cpfseq	FSR0L							; does it equal the current pointer position?
+	bra		option_reset_all_2				; NO - more options to process
+	movlw	HIGH(option_table_end)			; get high byte of end of table address
+	cpfseq	FSR0H							; does it equal the current pointer position?
+	bra		option_reset_all_2				; NO - more options to process
+	return									; YES to both - end of option table reached, done
 option_reset_all_2:
-	rcall	option_reset					; Reset one option.
-	bra		option_reset_all_1				; and loop.
+	rcall	option_reset					; reset one option...
+	bra		option_reset_all_1				; ... and loop
 
 ;=============================================================================
 ; Check all option and reset option if out of min/max boundary
@@ -89,36 +77,38 @@
 ; INPUT:  none
 ; OUTPUT: none
 ; TRASH:  TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2
+;
+	global	option_check_all				; check all option and reset option if out of min/max boundary
 option_check_all:
-	; Point to option table begin
-	movlw	LOW(option_table_begin)
+	movlw	LOW(option_table_begin)			; point to option table begin
 	movwf	FSR0L
 	movlw	HIGH(option_table_begin)
 	movwf	FSR0H
 
 option_check_all_1:
-	movlw	LOW(option_table_end)
-	cpfseq	FSR0L
-	bra		option_check_all_2				; Not yet done...
-	movlw	HIGH(option_table_end)
-	cpfseq	FSR0H
-	bra		option_check_all_2				; Not yet done...
-	return									; All done.
+	movlw	LOW(option_table_end)			; get low byte of end of table address
+	cpfseq	FSR0L							; does it equal the current pointer position?
+	bra		option_check_all_2				; NO - more options to process
+	movlw	HIGH(option_table_end)			; get high byte of end of table address
+	cpfseq	FSR0H							; does it equal the current pointer position?
+	bra		option_check_all_2				; NO - more options to process
+	return									; YES to both - end of option table reached, done
 option_check_all_2:
-	rcall	option_check					; check one option.
-	bra		option_check_all_1				; and loop
+	rcall	option_check					; check one option...
+	bra		option_check_all_1				; ... and loop
 
 ;=============================================================================
 ; Read option handle
 ; INPUT:  FSR0 = option handle
 ; OUTPUT: FSR1 = address of variable.
 ; TRASH:  TBLPTR, TABLAT, WREG, FSR0, FSR1
+;
 option_read:
 	movff	FSR0L,TBLPTRL
-	movlw	HIGH(option_table_begin)		; Get 8 high bits.
-	andlw	0xF0							; Keep only the 4 highest ones.
-	iorwf	FSR0H,W							; Cat with the known 4 lower ones.
-	movwf	TBLPTRH							; And we have the high byte.
+	movlw	HIGH(option_table_begin)		; get 8 high bits.
+	andlw	0xF0							; keep only the 4 highest ones
+	iorwf	FSR0H,W							; cat with the known 4 lower ones
+	movwf	TBLPTRH							; we have the high byte
 	movlw	UPPER(option_table_begin)
 	movwf	TBLPTRU
 
@@ -143,7 +133,7 @@
 	movff	TABLAT,FSR1L
 	tblrd*+
 	movff	TABLAT,FSR1H
-	movff	TBLPTRL,FSR0L					; Advance handle too, for reset_all
+	movff	TBLPTRL,FSR0L					; advance handle, too, for reset_all
 	movff	TBLPTRH,FSR0H
 	return
 
@@ -158,75 +148,69 @@
 	rcall	option_read
 
 	; Switch on type
-	movf	opt_type,W						; Type == STRING ?
-	xorlw	2
-	bz		option_check_string				; String: Do not reset strings
-
-	movf	opt_type,W						; Type == ENUM8 ?
-	xorlw	1
-	bz		option_check_enum8				; ENUM8: Check if lower then max. value only
-
-	tstfsz	opt_min							; opt_min=0?
-	bra		option_check_both				; no
-	bra		option_check_enum8				; Check max only
+	movf	opt_type,W						; get option type
+	xorlw	2								; type == STRING ?
+	bz		option_check_string				; YES
+	movf	opt_type,W						; get option type (again)
+	xorlw	1								; type == ENUM8 ?
+	bz		option_check_enum8				; YES - check if lower then max. value only
+											; NO to all - must be integer then
+	tstfsz	opt_min							; opt_min = 0 ?
+	bra		option_check_both				; NO - check it
+	bra		option_check_enum8				; check max only
 
 option_check_both:
-	decf	opt_min,W
-	cpfsgt	INDF1							; bigger then opt_min-1?
-	bra		option_check_reset				; No, reset option
-option_check_enum8:							; ENUM8: Check max only
-	infsnz	opt_max,W						; Max = 255?
-	return									; Yes, ignore max. test
-	cpfslt	INDF1							; smaller then opt_max+1?
-	bra		option_check_reset				; No, reset option
-	return									; in range, return
+	decf	opt_min,W						; check against minimum value
+	cpfsgt	INDF1							; bigger then opt_min - 1 ?
+	bra		option_check_reset				; NO - reset option
+option_check_enum8:							; check against maximum value
+	infsnz	opt_max,W						; max = 255?
+	return									; YES - ignore the max. test
+	cpfslt	INDF1							; NO  - smaller then opt_max + 1 ?
+	bra		option_check_reset				;       NO  - reset option
+	return									;       YES - in range, return
 
 option_check_reset:
 	movff	opt_default,INDF1				; reset option to default
-	return									; Done.
+	return									; done
 
 option_check_string:
 	return
 
 ;=============================================================================
-; Reset an option to its default value.
+; Reset an option to its default value
 ; INPUT:  FSR0 = option handle
 ; OUTPUT: none
 ; TRASH:  TBLPTR, TABLAT, WREG, FSR1, FSR2
 ;
+	global	option_reset					; reset FSR0 option to factory default
 option_reset:
 	; Read type, default and register from table
-	rcall	option_read
-
-	; Switch on type
-	movf	opt_type,W						; Type == STRING ?
-	xorlw	2
-	bz		opt_reset_string				; YES: special copy
-
-	movff	opt_default,INDF1				; NO: just a 8bit indirect copy
+	rcall	option_read						; read option data
+	movf	opt_type,W						; get option type
+	xorlw	2								; Type == STRING ?
+	bz		opt_reset_string				; YES - special copy
+	movff	opt_default,INDF1				; NO  - just a 8 bit indirect copy
 	return
-
 opt_reset_string:
-	movff	FSR1L,FSR2L						; set string destination address.
-	movff	FSR1H,FSR2H
-
-	movff	opt_default+0,FSR1L				; Get handle to multi-lingual text in FSR1
-	movff	opt_default+1,FSR1H
-
+	movff	FSR1L,FSR2L						; set string destination address
+	movff	FSR1H,FSR2H						; ...
+	movff	opt_default+0,FSR1L				; get handle to multi-lingual text in FSR1
+	movff	opt_default+1,FSR1H				; ...
 	movff	TBLPTRL,opt_backup_tbl+0		; TBLPTR trashed by text routine...
-	movff	TBLPTRH,opt_backup_tbl+1
-	movff	TBLPTRU,opt_backup_tbl+2
-
-	call	strcat_text						; Copy translated text to FSR2
-
-	movff	opt_backup_tbl+0,TBLPTRL
-	movff	opt_backup_tbl+1,TBLPTRH
-	movff	opt_backup_tbl+2,TBLPTRU
+	movff	TBLPTRH,opt_backup_tbl+1		; ...
+	movff	TBLPTRU,opt_backup_tbl+2		; ...
+	call	strcat_text						; copy translated text to FSR2
+	movff	opt_backup_tbl+0,TBLPTRL		; restore TBLPTR
+	movff	opt_backup_tbl+1,TBLPTRH		; ...
+	movff	opt_backup_tbl+2,TBLPTRU		; ...
 
 	return
 
 ;=============================================================================
 ; Save all options to EEPROM
+;
+	global	option_save_all					; save options to EEPROM
 option_save_all:
 	;---- Save option serial into EEPROM to detect reset and new version
 	movlw	LOW(eeprom_serial_save)
@@ -250,53 +234,49 @@
 option_save_all_1:
 	movlw	LOW(option_table_end)
 	cpfseq	FSR0L
-	bra		option_save_all_2				; Not yet done...
+	bra		option_save_all_2				; not yet done...
 	movlw	HIGH(option_table_end)
 	cpfseq	FSR0H
-	bra		option_save_all_2				; Not yet done...
-	return									; All done.
+	bra		option_save_all_2				; not yet done...
+	return									; all done
 option_save_all_2:
-	rcall	option_save						; Save one option.
-	bra		option_save_all_1				; and loop.
+	rcall	option_save						; save one option...
+	bra		option_save_all_1				; ...and loop
+
 
 	global	option_save
 option_save:
 	rcall	option_read
-	incf	opt_eeprom,W					; Should we save it ?
+	incf	opt_eeprom,W					; should we save it ?
 	btfsc	STATUS,Z						; EEPROM address is FFh ?
-	return									; YES: nothing to do.
-
-	movf	opt_eeprom,W					; Compute backup address in EEPROM
-	addlw	LOW(eeprom_opt_backup)			; Add offset
+	return									; YES - nothing to do
+	movf	opt_eeprom,W					; compute backup address in EEPROM
+	addlw	LOW(eeprom_opt_backup)			; add offset
 	movwf	EEADR
 	movlw	HIGH(eeprom_opt_backup)
-	btfsc	STATUS,C						; >256
-	addlw	.1								; Yes: +1
+	btfsc	STATUS,C						; > 256 ?
+	addlw	.1								; YES - +1
 	movwf	EEADRH
-
-	movf	opt_type,W						; Option type is string ?
-	xorlw	2
-	bz		option_save_string
-
-	; One byte to save to EEPROM
-	movff	INDF1,EEDATA
-	btfss	EEADRH,1						; EEADR:EEADRH < 512?
-	call	write_eeprom					; Yes, write
+	movf	opt_type,W						; get option type
+	xorlw	2								; option type is string ?
+	bz		option_save_string				; YES
+	movff	INDF1,EEDATA					; one byte to be saved to EEPROM
+	btfss	EEADRH,1						; EEADR:EEADRH < 512 ?
+	call	write_eeprom					; YES - write
+	return
+option_save_string:
+	movff	POSTINC1,EEDATA					; write one byte
+	btfss	EEADRH,1						; EEADR:EEADRH < 512 ?
+	call	write_eeprom					; Yes - write
+	infsnz	EEADR,F
+	incf	EEADRH,F
+	decfsz	opt_max							; decrement string length
+	bra		option_save_string				; loop while not finished
 	return
 
-option_save_string:
-	movff	POSTINC1,EEDATA					; Write one byte
-	btfss	EEADRH,1						; EEADR:EEADRH < 512?
-	call	write_eeprom					; Yes, write
-	infsnz	EEADR,F
-	incf	EEADRH,F
-
-	decfsz	opt_max							; Decrement string length
-	bra		option_save_string				; And loop while not finished
-
-	return
 ;=============================================================================
 
+	global	option_restore_all				; restore options from EEPROM
 option_restore_all:
 	;---- Read option serial from EEPROM
 	movlw	LOW(eeprom_serial_save)
@@ -306,16 +286,16 @@
 	call	read_eeprom
 	movlw	LOW(eeprom_opt_serial)
 	xorwf	EEDATA,W
-	bnz		option_restore_bad				; Auto reset if changed.
+	bnz		option_restore_bad				; auto reset if changed
 	incf	EEADR,F
 	call	read_eeprom
 	movlw	HIGH(eeprom_opt_serial)
 	xorwf	EEDATA,W
-	bz		option_restore_ok				; Auto reset if changed.
+	bz		option_restore_ok				; auto reset if changed
 
 option_restore_bad:
-	call	option_reset_all				; Reset RAM contains
-	goto	option_save_all					; Then save to EEPROM
+	call	option_reset_all				; reset RAM contains
+	goto	option_save_all					; then save to EEPROM
 
 	;---- Proper restore
 option_restore_ok:
@@ -327,58 +307,54 @@
 option_restore_all_1:
 	movlw	LOW(option_table_end)
 	cpfseq	FSR0L
-	bra		option_restore_all_2			; Not yet done...
+	bra		option_restore_all_2			; not yet done...
 	movlw	HIGH(option_table_end)
 	cpfseq	FSR0H
-	bra		option_restore_all_2			; Not yet done...
-	return									; All done.
+	bra		option_restore_all_2			; not yet done...
+	return									; all done
 option_restore_all_2:
-	rcall	option_restore					; Restore one option.
-	bra		option_restore_all_1			; and loop.
+	rcall	option_restore					; Restore one option
+	bra		option_restore_all_1			; and loop
 
 option_restore:
 	rcall	option_read
-	incf	opt_eeprom,W					; Should we save it ?
+	incf	opt_eeprom,W					; shall we save it ?
 	btfsc	STATUS,Z						; EEPROM address is FFh ?
-	return									; YES: nothing to do.
-
-	movf	opt_eeprom,W					; Compute backup address in EEPROM
-	addlw	LOW(eeprom_opt_backup)			; Add offset
+	return									; YES - nothing to do.
+	movf	opt_eeprom,W					; compute backup address in EEPROM
+	addlw	LOW(eeprom_opt_backup)			; add offset
 	movwf	EEADR
 	movlw	HIGH(eeprom_opt_backup)
-	btfsc	STATUS,C						; >256
-	addlw	.1								; Yes: +1
+	btfsc	STATUS,C						; > 256 ?
+	addlw	.1								; YES - +1
 	movwf	EEADRH
-
-	movf	opt_type,W						; Option type is string ?
-	xorlw	2
-	bz		option_restore_string
-
-	; Read one byte from EEPROM
-	call	read_eeprom
-	movff	EEDATA, INDF1					; And restore option register.
+	movf	opt_type,W						; get option type
+	xorlw	2								; Option type is string?
+	bz		option_restore_string			; YES
+	call	read_eeprom						; read one byte from EEPROM
+	movff	EEDATA, INDF1					; restore option register
 	return
-
 option_restore_string:
-	call	read_eeprom						; Read one byte, and
-	movff	EEDATA,POSTINC1					; restore it
+	call	read_eeprom						; read one byte, and...
+	movff	EEDATA,POSTINC1					; ... restore it
 	infsnz	EEADR,F
 	incf	EEADRH,F
-
-	decfsz	opt_max							; Decrement string length
-	bra		option_restore_string			; And loop while not finished
+	decfsz	opt_max							; decrement string length
+	bra		option_restore_string			; loop while not finished
 	return
 
 ;=============================================================================
-; Increment an option, based on type, and boundary.
+; Increment an option, based on type, and boundary
 ; INPUT:  FSR0 = option handle
 ; OUTPUT: none
 ; TRASH:  TBLPTR, TABLAT, WREG, FSR0, FSR1
+;
+	global	option_inc						; increment FSR0 option
 option_inc:
-	; Read type, default and register from table
+	; read type, default and register from table
 	rcall	option_read
 
-	; Switch on type
+	; switch on type
 	movf	opt_type,W
 	bz		option_inc_uint8
 	dcfsnz	WREG
@@ -386,51 +362,144 @@
 	dcfsnz	WREG
 	bra		option_inc_string
 
-option_inc_uint8:							; Defaults type too...
+option_inc_uint8:							; default type too...
 	movf	INDF1,W
 	addwf	opt_inc,W
 	cpfslt	opt_max
-	bra		option_inc_1
+	bra		option_inc_uint8_0
 	movf	opt_min,W
-option_inc_1:
+option_inc_uint8_0:
 	movwf	INDF1
-
-	; Now some rather crude hack into this routine to unify CCR & pSCR mode setting:
-	movlw	.25								; EEPROM address of option oCCRMode
-	cpfseq	opt_eeprom						; skip next line if we deal with this option right now
-	bra		option_inc_2
-	btfsc	FLAG_pscr_mode					; skip next line if we are not in PSCR mode
-	bcf		opt_ccr_mode,1					; in pSCR mode, opt_ccr_mode may only be 0 or 1
-
-option_inc_2:
+option_inc_uint8_1:
 	; Now some rather crude hack into this routine to make CCR Calibration more convenient:
 	movlw	.149							; EEPROM address of option CalGasO2 
-	cpfseq	opt_eeprom						; skip next line if we deal with this option right now
+	cpfseq	opt_eeprom						; editing CalGasO2 right now?
+	return									; NO - done (or bra option_inc_uint8_2)
+	movff	opt_dive_mode,WREG				; YES - get dive mode: 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR
+	decfsz	WREG,W							;     - in CCR mode?
+	return									;       NO  - done
+	movlw	.26								;       YES -
+	cpfseq	INDF1							;           - option value = 26 ?
+	return									;             NO  - done
+	movlw	.95								;             YES - advance it to 95
+	movwf	INDF1							;                 - store it
 	return
 
-	btfsc	FLAG_pscr_mode					; skip next line if we are not in PSCR mode 
-	return
-	movlw	.26
-	cpfseq	INDF1							; skip next line if current option value is = 26
-	return
-	movlw	.95								; current option value =26, advance it to 95 
-	movwf	INDF1
-	return
-
-
-option_inc_enum8:							; Always +1
+option_inc_enum8:							; always +1
 	incf	INDF1,W
 	cpfsgt	opt_max
 	clrf	WREG
 	movwf	INDF1
+option_inc_enum8_1:
+	; Now some rather crude hack into this routine to unify CCR & pSCR mode setting
+	movlw	.25								; EEPROM address of option oCCRMode
+	cpfseq	opt_eeprom						; editing oCCRMode right now?
+	bra		option_inc_enum8_2				; NO  - check next option
+	btfsc	analog_o2_input					; YES - does hosting OSTC have an analog interface?
+	bra		option_inc_enum8_1a				;       YES - setting 'sensor' allowed
+	btfsc	optical_input					;       does hosting OSTC have an optical interface?
+	bra		option_inc_enum8_1a				;       YES - setting 'sensor' allowed
+	movf	INDF1,W							;       NO to both - get mode (=0: fixed SP, =1: Sensor, =2: AutoSP)
+	xorlw	.1								;                  - in sensor mode?
+	bnz		option_inc_enum8_1a				;                    NO  - continue with next check
+	incf	INDF1,F							;                    YES - advance option value to AutoSP
+option_inc_enum8_1a:
+	movff	opt_dive_mode,WREG				; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	xorlw	.4								; in pSCR mode?
+	bnz		option_inc_enum8_1_exit			; NO  - done
+	bcf		INDF1,1							; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP)
+option_inc_enum8_1_exit:
+	return									; done
+option_inc_enum8_2:
+											; (unused)
+option_inc_enum8_3:
+
+ IFDEF _rx_functions
+	global	option_cleanup_oTrMode_CCR		; embedded clean-up entry-point
+	global	option_cleanup_oTrMode_no_CCR	; embedded clean-up entry-point
+	; Now some rather crude hack to correct opt_TR_mode in dependency of opt_dive_mode
+	movlw	.8								; EEPROM address of option opt_dive_mode
+	cpfseq	opt_eeprom						; editing opt_dive_mode right now?
+	bra		option_inc_enum8_4				; NO  - check next option
+	movff	opt_dive_mode,WREG				; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	decfsz	WREG,W							;       dive mode = 1 CCR?
+	bra		option_inc_enum8_3a				;       NO  - in any other mode
+option_cleanup_oTrMode_CCR:					; entry point from cleanup during restart
+	movff	opt_TR_mode,WREG				;       YES - get TR mode
+	xorlw	.2								;           - mode = 2 (ind.double)?
+	bnz		option_inc_enum8_3_exit			;             NO  - done
+	bra		option_inc_enum8_3_reset		;             YES - revert mode to 1 (on)
+option_inc_enum8_3a:						; any mode other than CCR
+option_cleanup_oTrMode_no_CCR:				; entry point from cleanup during restart
+	movff	opt_TR_mode,WREG				; get TR mode
+	xorlw	.3								; mode = 3 (CCR Dil+O2)?
+	bnz		option_inc_enum8_3_exit			; NO  - done
+option_inc_enum8_3_reset:					; YES - revert to mode 1 (on)
+	movlw	.1								; load coding of mode "on"
+	movff	WREG,opt_TR_mode				; write to option
+option_inc_enum8_3_exit:
+	return									; done
+option_inc_enum8_4:
+	; Now some rather crude hack to advance opt_TR_mode in dependency of opt_dive_mode
+	movlw	.222							; EEPROM address of option opt_TR_mode
+	cpfseq	opt_eeprom						; editing opt_TR_mode right now?
+	bra		option_inc_enum8_5				; NO  - check next option
+	movff	opt_dive_mode,WREG				; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	decfsz	WREG,W							;       dive mode = 1 CCR?
+	bra		option_inc_enum8_4a				;       NO  - in any other mode
+	movf	INDF1,W							;       YES - get option value (TR mode)
+	xorlw	.2								;           - mode = 2 (ind.double)?
+	bnz		option_inc_enum8_4_exit			;             NO  - done
+	incf	INDF1,F							;             YES - advance option value to 3 (CCR Dil+O2)
+	bra		option_inc_enum8_4_exit			;                 - done
+option_inc_enum8_4a:						; any mode other than CCR
+	movf	INDF1,W							; get option value (TR mode)
+	xorlw	.3								; mode = 3 (CCR Dil+O2)?
+	bnz		option_inc_enum8_4_exit			; NO  - done
+	clrf	INDF1							; YES - advance option value to 0 "off"
+option_inc_enum8_4_exit:
+	return									; done
+ ENDIF
+
+option_inc_enum8_5:
 	return
 
 
-option_inc_string:							; No editing yet...
+option_inc_string:							; no editing available
 	return
 
+
+	global	option_cleanup_oCCRMode
+	global	option_cleanup_oCCRMode_pSCR
+	global	option_cleanup_oCCRMode_CCR
+option_cleanup_oCCRMode:					; in pSCR mode, revert AutoSP (2) to calculated SP (0), in pSCR and CCR revert Sensor to fixed SP if no sensor interface available
+	banksel	opt_dive_mode					; select options bank
+	movf	opt_dive_mode,W					; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR
+	xorlw	.4								; in pSCR mode?
+	bnz		option_cleanup_oCCRMode_CCR		; NO  - check if sensor is available on hosting OSTC
+option_cleanup_oCCRMode_pSCR:				; jump-in from start.asm if known to be in pSCR mode
+	banksel	opt_ccr_mode					; select options bank
+	bcf		opt_ccr_mode,1					; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP)
+option_cleanup_oCCRMode_CCR:				; continue from above & jump-in from start.asm if known to be in CCR mode
+	banksel	common							; flags are located in bank common
+	btfsc	analog_o2_input					; does hosting OSTC have an analog interface?
+	bra		option_cleanup_oCCRMode_exit	; YES - setting 'sensor' allowed
+	btfsc	optical_input					; does hosting OSTC have an optical interface?
+	bra		option_cleanup_oCCRMode_exit	; YES - setting 'sensor' allowed
+	banksel	opt_ccr_mode					; NO to both - select options bank
+	movf	opt_ccr_mode,W					;            - get CCR mode
+	xorlw	.1								;            - CCR mode = sensor?
+	bnz		option_cleanup_oCCRMode_exit	;              NO  - ok
+	clrf	opt_ccr_mode					;            - YES - set CCR mode to fixed SP (0)
+option_cleanup_oCCRMode_exit:
+	banksel	common							; back to bank common
+	return									; done
+
+
 ;=============================================================================
-; Strcat option into FSR2 buffer.
+; Strcat option into FSR2 buffer
+;
+	global	option_draw						; STRCAT FRS0 option
 option_draw:
 	; Read type, default and register from table
 	rcall	option_read
@@ -442,27 +511,30 @@
 	bra		option_draw_enum8
 	dcfsnz	WREG
 	bra		option_draw_string
-	return									; Unknown: return...
+	return									; unknown, return
+option_draw_string:
+	movff	POSTINC1,POSTINC2
+	decfsz	opt_max
+	bra		option_draw_string
+	return
+
 
 option_draw_uint8:
-	movff	INDF1,lo						; Draw value.
+	movff	INDF1,lo						; draw value
 	bsf		leftbind
 	output_8
 	bcf		leftbind
-	clrf	INDF2							; Make sure to close string...
-
-	movf	opt_unit+0,W					; Is there a unit to append ?
+	clrf	INDF2							; make sure to close string
+	movf	opt_unit+0,W					; is there a unit to append?
 	iorwf	opt_unit+1,W
-	rcall	option_draw_unit
-
-	movf	opt_default,W					; Default value
-	cpfseq	lo								; Current value
-	bra		option_draw_uint8_2				; Not default, add *
-	return									; Default, Done.
+	rcall	option_draw_unit				; YES
+	movf	opt_default,W					; get default value
+	cpfseq	lo								; compare with current value, equal?
+	bra		option_draw_uint8_2				; NO  - not default, add *
+	return									; YES - default, done
 option_draw_uint8_2:
-	PUTC	"*"
-	return									; Done.
-
+	PUTC	"*"								; print "*"
+	return									; done
 option_draw_unit:
 	movff	opt_unit+0,FSR1L
 	movff	opt_unit+1,FSR1H
@@ -471,21 +543,16 @@
 
 ;---- Draw an enumerated value (set of translated strings)
 option_draw_enum8:
-	movf	INDF1,W							; Get current value.
-	cpfsgt	opt_max							; Bound value
+	movf	INDF1,W							; get current value
+	cpfsgt	opt_max							; bound value
 	clrf	WREG
 	addwf	WREG							; *= 2
-	addwf	opt_inc,W						; Base text + 2 * value
+	addwf	opt_inc,W						; base text + 2 * value
 	movwf	FSR1L
 	movlw	.0
-	addwfc	opt_min,W						; Propagate carry
-	movwf	FSR1H							; Into FSR1
+	addwfc	opt_min,W						; propagate carry...
+	movwf	FSR1H							; ...into FSR1
 	goto	strcat_text
 
-option_draw_string:
-	movff	POSTINC1,POSTINC2
-	decfsz	opt_max
-	bra		option_draw_string
-	return
 
 	END
\ No newline at end of file
--- a/src/p2_deco.c	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/p2_deco.c	Thu Nov 22 19:47:26 2018 +0100
@@ -1,5 +1,5 @@
 // ***************************************************************************
-// p2_deco.c                                         REFACTORED VERSION V2.97 SP1
+// p2_deco.c                                         REFACTORED VERSION V2.99e
 //
 //  Created on: 12.05.2009
 //  Author: heinrichs weikamp, contributions by Ralph Lembcke and others
@@ -8,7 +8,7 @@
 
 //////////////////////////////////////////////////////////////////////////////
 // OSTC - diving computer code
-// Copyright (C) 2011 HeinrichsWeikamp GbR
+// Copyright (C) 2018 HeinrichsWeikamp GmbH
 //
 //    This program is free software: you can redistribute it and/or modify
 //    it under the terms of the GNU General Public License as published by
@@ -74,28 +74,36 @@
 //
 // Literature:
 // Buhlmann, Albert: Tauchmedizin; 4. Auflage [2002];
-// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Schroeder, Kai & Reith, Steffen; 2000; Saettigungsvorgaenge beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
 // Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
 // Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
 // Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
 // Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
-//
+
+
+// *********************************************************************************************************************************
 //
-
-// *********************
-// ** I N C L U D E S **
-// *********************
-#include <math.h>
-
-// ***********************************************
-// ** V A R I A B L E S   D E F I N I T I O N S **
-// ***********************************************
-
+//                                                     I N C L U D E S
+//
+// *********************************************************************************************************************************
+
+#include	<math.h>
 #include	"p2_definitions.h"
 #define		TEST_MAIN
 #include	"shared_definitions.h"
 
 
+// *********************************************************************************************************************************
+//
+//                                         C O N S T A N T S   D E F I N I T I O N S
+//
+// *********************************************************************************************************************************
+
+// conditional compiles
+#define		_rx_functions						// if defined, compile transmitter functions   (default:     included *)
+//#define	_cave_mode							// if defined, compile cave mode into firmware (default: not included *)   ## OPTION IS UNDER CONSTRUCTION ##
+												// * option needs to be included / excluded in hwos.inc, too!
+
 // ambient pressure at different mountain heights
 #define P_ambient_1000m					0.880	// [bar]  based on 990 hPa and 20°C at sea level, 15°C at altitude
 #define P_ambient_2000m					0.782	// [bar]
@@ -108,99 +116,160 @@
 												//        0.135 bar safety margin
 
 // constants and factors
-#define ppWater							0.0627	// water vapor partial pressure in the lungs
+#define ppWater							0.06270	// water vapor partial pressure in the lungs
 #define METER_TO_BAR					0.09985	// conversion factor
 #define BAR_TO_METER					10.0150	// conversion factor (1.0/METER_TO_BAR)
-#define SURFACE_DESAT_FACTOR			0.7042	// surface desaturation safety factor
+#define SURFACE_DESAT_FACTOR			0.70420	// surface desaturation safety factor
 #define HYST							1.0E-06	// threshold for tissue graphics on-gassing / off-gassing visualization
 
+
 // thresholds
-#define GF_WARNING_THRESHOLD			100		// threshold for GF   warning (attention threshold is current GF_high)
 #define CNS_WARNING_THRESHOLD			100		// threshold for CNS  warning
 #define CNS_ATTENTION_THRESHOLD			 70		// threshold for CNS  attention
-#define ppO2_ATTENTION_THRESHOLD		130		// threshold for ppO2 attention (thresholds for warnings come by options_table.asm)
 #define ppO2_GAP_TO_SETPOINT			 10		// gap between setpoint and max. ppO2 of the pure diluent [cbar]
-#define GAS_NEEDS_ATTENTION_THRESHOLD	0.70	// threshold for gas needs attention
-
-// deco engine states and modes - char_O_deco_status
-#define DECO_STATUS_MASK				0x03
-#define DECO_STATUS_START				0x00
-#define DECO_STATUS_FINISHED			0x00
-#define DECO_STATUS_STOPS				0x01 
-#define DECO_STATUS_RESULTS				0x02
-#define DECO_STATUS_INIT				0x03
-
-#define DECO_MODE_MASK					0x0C
-#define DECO_MODE_LOOP					0x04
+#define GAS_NEEDS_ATTENTION_THRESHOLD	0.70	// threshold for gas needs attention [1.00 = 100%] 
+#define PRESSURE_LIMIT_WARNING			200		// threshold for pressure reading warning  : 20.0 bar
+#define PRESSURE_LIMIT_ATTENTION		500		// threshold for pressure reading attention: 50.0 bar
+#define O2_CONSUMPTION_LIMIT_ATTENTION	 20		// threshold for O2 "SAC"         attention:  2.0 l/min
+
+// deco engine states and modes - char_O_main_status: controls current tissue and deco status calculation (as-is situation)
+#define DECO_COMPLETED_NORM				0x01	// the calculation of a normal       deco plan has just been completed
+#define DECO_COMPLETED_ALT				0x02	// the calculation of an alternative deco plan has just been completed
+//#define DECO_MODE_MASK				0x0C	// mask for mode selection ==> current diving mode
+//#define DECO_MODE_LOOP				0x04	// see below
+//#define DECO_MODE_CCR					0x04	// see below
+//#define DECO_MODE_PSCR				0x08	// see below
+
+#define DECO_USE_Z_FACTOR				0x10	// =1: figure in Z factor when converting gas volumes <-> pressures
+#define DECO_CAVE_MODE					0x20	// =1: activate ascent gas needs calculation under cave constraints
+#define DECO_BOTTOM_CALCULATE			0x40	// =1: switch to deco calculator interface
+#define DECO_TR_FUNCTIONS				0x80	// =1: activate TR functions (pressure reading) processing
+
+// deco engine states and modes - char_O_deco_status: controls deco plan calculation (to-be scenario)
+#define DECO_STATUS_MASK				0x03	// bit mask for values below
+#define DECO_STATUS_START				0x00	// value commands the start of a new deco calculation cycle
+#define DECO_STATUS_FINISHED			0x00	// value indicates completion of deco calculation
+#define DECO_STATUS_STOPS				0x01	// value indicated calculation is ongoing, currently calculating the stops
+#define DECO_STATUS_RESULTS				0x02	// value indicates calculation is ongoing, currently calculating the results
+#define DECO_STATUS_INIT				0x03	// value to be set once for the first invocation at the begin of a new dive
+
+#define DECO_MODE_MASK					0x0C	// mask for mode selection ==> diving mode during ascent
+#define DECO_MODE_LOOP					0x04	// =1: CCR (DECO_MODE_PSCR needs to be cleared) or pSCR mode
 #define DECO_MODE_CCR					0x04	// to be used with == operator in combination with DECO_MODE_MASK only!
-#define DECO_MODE_PSCR					0x08
-
-#define DECO_PLAN_ALTERNATE				0x10
-#define DECO_CNS_CALCULATE				0x20
-#define DECO_VOLUME_CALCULATE			0x40
-#define DECO_ASCENT_DELAYED				0x80
-
-// deco engine states and modes - char_O_main_status
-//#define DECO_MODE_MASK				0x0C
-//#define DECO_MODE_LOOP				0x04
-//#define DECO_MODE_CCR					0x04	// to be used with == operator in combination with DECO_MODE_MASK only!
-//#define DECO_MODE_PSCR				0x08
-#define DECO_GASCHANGE_OVRD				0x10
-#define DECO_BOTTOM_CALCULATE			0x40
-
-// deco engine states and modes - tissue_increment
+#define DECO_MODE_PSCR					0x08	// =1: pSCR mode (DECO_MODE_LOOP needs to be set, too)
+
+#define DECO_PLAN_ALTERNATE				0x10	// =1: calculate the 2nd (alternative) deco plan
+#define DECO_BAILOUT_MODE				0x20	// =1: do a bailout calculation, i.e. allow gas switches before first deco stop
+#define DECO_VOLUME_CALCULATE			0x40	// =1: calculate ascent gas needs
+#define DECO_ASCENT_DELAYED				0x80	// =1: calculate a delayed ascent (fTTS)
+
+// deco engine warnings - char_O_deco_warnings
+#define DECO_WARNING_IBCD				0x01	// IBCD occurring now
+#define DECO_WARNING_IBCD_lock			0x02	// IBCD has occurred during the dive
+#define DECO_WARNING_MBUBBLES			0x04	// micro bubbles likely to develop now
+#define DECO_WARNING_MBUBBLES_lock		0x08	// ditto, but sometime during the dive
+#define DECO_WARNING_OUTSIDE			0x10	// tissue pressures outside the Buhlmann model now
+#define DECO_WARNING_OUTSIDE_lock		0x20	// tissue pressures outside the model sometime during the dive
+#define DECO_ATTENTION_OUTSIDE			0x40	// tissue pressures are very close to the Buhlmann limit
+#define DECO_WARNING_STOPTABLE_OVERFLOW	0x80	// internal error: no more space in the deco stops table
+
+// deco engine status (char_O_deco_info)
+#define DECO_FLAG						0x01	// =1: deco ppO2 levels are permitted
+#define IND_DOUBLE_SWITCH_FLAG			0x02	// =1: switch to other tank advice active
+#define DECO_STEADY						0x04	// =1: fTTS = TTS (not updated when in bailout mode)
+#define DECO_DECREASING					0x08	// =1: fTTS < TTS (not updated when in bailout mode)
+#define DECO_CEILING					0x10	// =1: ceiling depth > 0
+#define GAS_NEEDS_CAVE					0x20	// =1: indicated gas needs are calculated in cave mode
+
+// deco engine control - tissue_increment
 #define TIME_MASK						0x7F	// (127 decimal, bits 0-6 set)
 #define TISSUE_FLAG						0x80	// (128 decimal, bit   7  set)
 
-// deco engine warnings
-#define	DECO_WARNING_IBCD				0x01
-#define	DECO_WARNING_IBCD_lock			0x02
-#define	DECO_WARNING_MBUBBLES			0x04
-#define	DECO_WARNING_MBUBBLES_lock		0x08
-#define	DECO_WARNING_OUTSIDE			0x10
-#define	DECO_WARNING_OUTSIDE_lock		0x20
-#define DECO_WARNING_STOPTABLE_OVERFLOW	0x40
-#define DECO_FLAG						0x80
 
 // flags used with integer numbers
-#define INT_FLAG_INVALID				0x0400
-#define INT_FLAG_ZERO					0x0800
-#define INT_FLAG_LOW					0x1000
-#define	INT_FLAG_HIGH					0x2000
-#define INT_FLAG_ATTENTION				0x4000
-#define	INT_FLAG_WARNING				0x8000
-
-
-
-// *************************
-// ** P R O T O T Y P E S **
-// *************************
-
-static void calc_hauptroutine(void);
-static void calc_hauptroutine_data_input(void);
-static void calc_hauptroutine_calc_deco(void);
-static void calc_alveolar_pressures(void);
-static void calc_tissues(void);
-static void calc_NDL_time(void);
-static void calc_ascenttime(void);
-static void calc_CNS_increment(void);
-static void calc_desaturation_time(void);
-static void calc_ascent_to_first_stop(void);
-static void calc_limit(PARAMETER float GF_current);
-static void calc_interval(PARAMETER unsigned char time_increment);
-
-static void gas_find_current(void);
-static void gas_set_ratios(void);
-static void convert_CNS_for_display(void);
-static void convert_sim_CNS_for_display(void);
-static void publish_deco_table(void);
-static void clear_deco_table(void);
-static void clear_tissue(void);
-
-static unsigned char calc_nextdecodepth(void);
-static unsigned char gas_find_better(void);
+#define INT_FLAG_INVALID				0x0400	// =1: value not valid
+#define INT_FLAG_ZERO					0x0800	// =1: value is zero
+#define INT_FLAG_LOW					0x1000	// =1: value is below a lower warning threshold
+#define INT_FLAG_NOT_AVAIL				0x1000	// =1: value is not available (not computed)
+#define INT_FLAG_HIGH					0x2000	// =1: value is above an upper warning threshold
+#define INT_FLAG_OUTDATED				0x2000	// =1: value has not been updated for too long
+#define INT_FLAG_ATTENTION				0x4000	// =1: value exceeds the attention threshold
+#define INT_FLAG_WARNING				0x8000	// =1: value exceeds the warning threshold
+#define INT_FLAG_OUT_OF_RANGE			0x8000	// =1: value exceeds presentable range
+
+
+
+// *********************************************************************************************************************************
+//
+//                                                  ** P R O T O T Y P E S **
+//
+//                              The Functions are listed in sequence of intended usage / application.
+//
+// *********************************************************************************************************************************
+
+// Functions used in surface mode
+static void			 calc_interval(PARAMETER unsigned char time_increment);
+														// Calculates the tissue off-gassing under surface conditions.
+static void			 calc_desaturation_time(void);		// Calculates the desaturation and no-fly times.
+static void			 clear_tissue(void);				// Resets all tissues to surface pressure equilibrium state.
+
+// Main entry point in dive mode
+static void			 calc_hauptroutine(void);			// Sequences all calculations for the real tissues and the deco calculation.
+
+// Functions dedicated to the real tissues
+static void			 calc_hauptroutine_data_input(void);// Initializes environment data and sets gas ratios for the real tissues.
+
+// Functions combined for real tissues & deco calculations
+static void			 calc_alveolar_pressures(void);		// Computes the partial pressures from the gas ratios and many more parameters,
+														// needs either calc_hauptroutine_data_input() be called beforehand or
+														// gas_find_current()/gas_find_better() and gas_set_ratios().
+static void			 calc_tissues(void);				// Updates the tissues   dependent on the partial pressures of N2 and He.
+static void			 calc_CNS(void);					// Updates the CNS value dependent on the partial pressure  of the O2.
+static void			 calc_limit(PARAMETER float GF_current);
+														// Calculates ceiling, current GF (supersaturation) and some more data.
+
+// Functions dedicated to deco calculations
+static void			 clear_deco_table(void);			// Clears the deco stops table, invoked at the start of each calculation cycle.
+static void			 gas_find_current(void);			// Sets the first gas used for deco calculation, invoked at start of cycle, too.
+static unsigned char gas_find_better(void);				// Checks for, and eventually switches to, a better gas.
+static void			 gas_set_ratios(void);				// Sets the gas ratios for use in deco calculation (simulated tissues),
+														// needs to be called after each gas change (gas_find_current/_better).
+static void			 calc_NDL_time(void);				// Calculates remaining NDL time.
+static void			 find_NDL_gas_changes(void);		// Finds the gas changes in an OC bailout ascent that is within NDL
+static void			 calc_ascent_to_first_stop(void);	// Calculates ascent to the first deco stop.
+static void			 calc_hauptroutine_calc_deco(void);	// Calculates the subsequent ascent until reaching surface.
+static unsigned char calc_nextdecodepth(void);			// Calculates the depth of the next required deco stop.
 static unsigned char update_deco_table(PARAMETER unsigned char time_increment);
-
+														// Enters a new stop or extends an existing stop in the deco stops table.
+static void			 calc_ascenttime(void);				// Calculates the ascent time from current depth and deco stop times.
+static void			 gas_volumes(void);					// Calculates required gas volumes and pressures from the data in stops table.
+
+// Functions for results reporting
+static void			 publish_deco_table(void);			// Copies the internal deco stops table to the export interface.
+static void			 convert_CNS_for_display(void);		// Converts the current     CNS value from float to integer.
+static void			 convert_sim_CNS_for_display(void);	// Converts the end-of-dive CNS value from float to integer.
+static void			 convert_GF_for_display(void);		// Converts leading tissue supersaturation value from float to integer, 1.0 = 100%.
+static void			 convert_ceiling_for_display(void);	// Converts ceiling from float to integer in mbar relative pressure.
+
+
+// internal helper functions
+static unsigned short tmr5(void);						// Reads a hardware timer which is used for preemptive scheduling.
+static void			 read_Buhlmann_coefficients(void);	// Reads the a and b coefficients from a ROM table.
+static void			 read_Buhlmann_times(PARAMETER char period);
+														// Reads pre-computed tissue increment factors from a ROM table.
+static void			 read_Buhlmann_ht(void);			// Reads the half-times from a ROM table.
+static void			 adopt_Buhlmann_coefficients(void);	// Computes average a and b coefficient by the N2/He tissue ratio.
+static void			 temp_tissue_safety(void);			// Applies safety margins to the tissue increments.
+static void			 push_tissues_to_vault(void);		// Stores the state of the real tissues during simulator runs.
+static void			 pull_tissues_from_vault(void);		// Restores the state of the real tissues after a simulator run.
+
+
+
+// *********************************************************************************************************************************
+//
+//                                         V A R I A B L E S   D E F I N I T I O N S
+//
+// *********************************************************************************************************************************
 
 //---- Bank 5 parameters -----------------------------------------------------
 #ifndef UNIX
@@ -209,45 +278,56 @@
 
 // general deco parameters
 
-static float			GF_low;							// initialized from deco parameters, constant during all computations
-static float			GF_high;						// initialized from deco parameters, constant during all computations
-static float			GF_delta;						// initialized from deco parameters, constant during all computations
+static float			GF_low;							// initialized from deco parameters
+static float			GF_high;						// initialized from deco parameters
+static float			GF_delta;						// initialized from deco parameters
+
 static float			locked_GF_step_norm;			// GF_delta / low_depth_norm in normal plan
 static float			locked_GF_step_alt;				// GF_delta / low_depth_alt  in alternative plan
 
-static float			low_depth_norm;					// Depth of deepest stop in normal plan
-static float			low_depth_alt;					// Depth of deepest stop in alternative plan
-
-static float			float_ascent_speed;				// ascent speed from options_table (1.0 .. 10.0 m/min)
+static float			low_depth_norm;					// depth of deepest stop in normal plan
+static float			low_depth_alt;					// depth of deepest stop in alternative plan
+
+static float			float_ascent_speed;				// ascent speed from options_table (5.0 .. 10.0 m/min)
 static float			float_deco_distance;			// additional depth below stop depth for tissue, CNS and gas volume calculation
 static float			float_saturation_multiplier;	// safety factor for on-gassing rates
 static float			float_desaturation_multiplier;	// safety factor for off-gassing rates
 
+static unsigned char	split_N2_He[NUM_COMP];			// used for calculating the desaturation time
+
 // real context: what we are doing now
 
-static float			ceiling;						// minimum tolerated relative pressure (i.e. without surface pressue)
 static float			CNS_fraction;					// current CNS (1.00 = 100%)
 
-static unsigned short	deco_tissue_vector;				// 16 bit vector to memories all tissues that are in decompression
-static unsigned short	IBCD_tissue_vector;				// 16 bit vector to memories all tissues that experience IBCD
+static unsigned short	deco_tissue_vector;				// 16 bit vector to memorize all tissues that are in decompression
+static unsigned short	IBCD_tissue_vector;				// 16 bit vector to memorize all tissues that experience IBCD
+
+static float			pres_respiration_sac;			// current depth in absolute pressure, used in SAC calculation
+static float			float_sac;						// used in SAC calculation
+static unsigned int		max_sac_rate;					// used in SAC calculation to determine SAC rate attention
+
 
 // simulation context: used to predict ascent
 
-static float			sim_ceiling;					// minimum tolerated relative pressure (i.e. without surface pressue)
-static float			sim_CNS_fraction;				// CNS increase during predicted ascent, 0.01 = 1%
-
-static unsigned int		int_sim_CNS_fraction;			// CNS increase during predicted ascent, in %
+static float			sim_CNS_fraction;				// CNS after predicted ascent, 0.01 = 1%, as float
+
+static unsigned int		int_sim_CNS_fraction;			// CNS after predicted ascent,    1 = 1%, as integer
 
 static unsigned char	sim_depth_limit;				// depth of next stop in meters, used in deco calculations
-static unsigned char	split_N2_He[NUM_COMP];			// used for calculating the desaturation time
-static unsigned char	NDL_lead_tissue;				// used to cache tissue to start with calculating NDL
-
+static unsigned char	NDL_lead_tissue;				// used to cache the tissue to start with when calculating the NDL
+
+
+// result values from calculation functions
+
+static float			ceiling;						// minimum tolerated relative pressure (i.e. without surface pressure)
+static float			lead_supersat;					// supersaturation of the leading tissue, 1.0 = 100%
+static unsigned char	lead_number;					// number of the leading tissue
 
 // stops table
 
-static unsigned char	internal_deco_depth[NUM_STOPS];	// depth of the stop
-static unsigned char	internal_deco_time[NUM_STOPS];	// duration of the stop
-static unsigned char	internal_deco_gas[NUM_STOPS];	// gas used at the stop
+static unsigned char	internal_deco_depth[NUM_STOPS];	// depths of the stops
+static unsigned char	internal_deco_time[NUM_STOPS];	// durations of the stops
+static unsigned char	internal_deco_gas[NUM_STOPS];	// gases used on the stops
 
 
 // transfer variables between calc_desaturation_time() and calc_desaturation_time_helper()
@@ -259,12 +339,15 @@
 static unsigned int		int_time;						// time it takes for the compartment to reach the target pressure
 
 
-// transfer variables between gas_volumes() and gas_volumes_helper()
+// transfer variables between gas_volumes() and gas_volumes_helper_1/_2()
 
 static float			float_depth;					// depth of the stop or half-way point
 static float			float_time;						// duration of the stop or ascent phase
+static unsigned char	char_usage;						// gas usage in l/min
+static unsigned char	gas_num;						// number of the gas/tank
 static float			volume;							// computed volume of gas
-static unsigned char	usage;							// gas usage in l/min
+static unsigned int		int_volume;						// required gas volume in liter
+static unsigned int		int_pres_need;					// required gas volume in bar
 
 
 // auxiliary variables for data buffering
@@ -272,9 +355,11 @@
 static float			N2_equilibrium;					// used for N2 tissue graphics scaling
 static float			temp_tissue;					// auxiliary variable to buffer tissue pressures
 static float			float_pSCR_factor;				// pre-computed factor for pSCR ppO2 drop calculation
-
-
-// 35 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char)
+static float			calc_pres_tissue_N2;			// auxiliary variable to buffer tissue N2 pressure
+static float			calc_pres_tissue_He;			// auxiliary variable to buffer tissue He pressure
+static float 			pres_tissue;					// auxiliary variable to buffer total tissue pressure
+
+// 11 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char)
 
 
 //---- Bank 6 parameters -----------------------------------------------------
@@ -293,13 +378,13 @@
 
 static float			pres_surface;					// absolute pressure at the surface
 
-static unsigned char	bottom_depth;					// bottom depth in meters, used by CNS and gas needs calculation
-
-static float			pres_respiration;				// current depth in absolute pressure
-static float			O2_ratio;						// real breathed gas oxygen ratio
-static float			N2_ratio;						// real breathed gas nitrogen ratio
-static float			He_ratio;						// real breathed gas helium ratio
-static float			pSCR_drop;						// real ppO2 drop in pSCR loop
+static unsigned char	char_bottom_depth;				// bottom depth in meters, used by ascent time and gas needs calculation
+
+static float			real_pres_respiration;			// current real depth in absolute pressure
+static float			real_O2_ratio;					// real breathed gas oxygen ratio
+static float			real_N2_ratio;					// real breathed gas nitrogen ratio
+static float			real_He_ratio;					// real breathed gas helium ratio
+static float			real_pSCR_drop;					// real ppO2 drop in pSCR loop
 
 static float			sim_pres_respiration;			// simulated current depth in abs.pressure, used for deco calculations
 static float			sim_O2_ratio;					// simulated breathed gas oxygen ratio
@@ -307,19 +392,17 @@
 static float			sim_He_ratio;					// simulated breathed gas helium ratio
 static float			sim_pSCR_drop;					// simulated ppO2 drop in pSCR loop
 
+
+// result values from calculation functions
+
 static float			O2_ppO2;						// ppO2 - calculated for pure oxygen at current depth
-static float			OC_ppO2;						// ppO2 - calculated for breathed in OC mode
-static float			pSCR_ppO2;						// ppO2 - calculated for breathed from pSCR loop
+static float			OC_ppO2;						// ppO2 - calculated for breathing in OC   mode
+static float			pSCR_ppO2;						// ppO2 - calculated for breathing in pSCR mode
 
 static float			ppO2;							// partial pressure of breathed oxygen
 static float			ppN2;							// partial pressure of breathed nitrogen
 static float			ppHe;							// partial pressure of breathed helium
 
-
-// Result values from calculation functions
-
-static float			CNS_fraction_inc;				// increment of CNS load, 0.01 = 1%
-
 static unsigned char	char_ppO2;						// partial pressure of breathed oxygen, as integer 100 = 1.00 bar
 static unsigned char	NDL_time;						// time in minutes until reaching NDL
 static unsigned int		ascent_time;					// time in minutes needed for the ascent
@@ -333,18 +416,17 @@
 static float			var_He_b;						// Buhlmann b, for current He tissue
 static float			var_N2_e;						// exposition, for current N2 tissue
 static float			var_He_e;						// exposition, for current He tissue
-static float			var_N2_ht;						// half-time for current N2 tissue
-static float			var_He_ht;						// half-time for current N2 tissue
-
-
-// Gas switch history
-
-static unsigned char	sim_gas_first_used;				// Number of first used gas, for bottom segment
-static unsigned char	sim_gas_last_used;				// number of last  used gas
-static unsigned char	sim_gas_last_depth;				// change depth of last used gas
-
-
-// Vault to back-up & restore tissue data
+static float			var_N2_ht;						// half-time,  for current N2 tissue
+static float			var_He_ht;						// half-time,  for current He tissue
+
+
+// gas in use
+
+static unsigned char	sim_gas_current;				// number       of the currently used gas
+static unsigned char	sim_gas_current_depth;			// change depth of the currently used gas
+
+
+// vault to back-up & restore tissue data
 
 static float			pres_tissue_N2_vault[NUM_COMP];	// stores the nitrogen tissue pressures
 static float			pres_tissue_He_vault[NUM_COMP];	// stores the helium tissue pressures
@@ -375,7 +457,7 @@
 #ifndef UNIX
 #   pragma udata overlay bank8=0x800
 
-static char				md_pi_subst[256];				// Overlay C-code data stack here, too.
+static char				md_pi_subst[256];				// overlay C-code data stack here, too
 
 #   define C_STACK md_pi_subst
 #endif
@@ -388,14 +470,14 @@
 #endif
 
 
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-////////////////              THE LOOKUP TABLES               ////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
+// *********************************************************************************************************************************
+//
+//                                               L O O K - U P   T A B L E S
+//
+// *********************************************************************************************************************************
 
 #ifndef UNIX
-#   pragma romdata Buhlmann_tables = 0x1DD00  // Needs to be in UPPER bank.
+#   pragma romdata Buhlmann_tables = 0x1DD00  // needs to be in the UPPER bank
 #endif
 
 rom const float Buhlmann_ab[4*16] = {
@@ -508,23 +590,19 @@
 //-------------------------------------
 };
 
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-////////////////               THE SUBROUTINES                ////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
+
+// *********************************************************************************************************************************
 //
-// all new in v.102
+//                                                 H E L P E R   F U N C T I O N S
+//
+// *********************************************************************************************************************************
+
+
 // moved from 0x0D000 to 0x0C000 in v.108
 #ifndef UNIX
 #	pragma code p2_deco = 0x0C000
 #endif
 
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-////////////////             U T I L I T I E S                ////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
 
 //////////////////////////////////////////////////////////////////////////////
 // Bump to blue-screen when an assert is wrong
@@ -534,6 +612,7 @@
 }
 #endif
 
+
 //////////////////////////////////////////////////////////////////////////////
 // When calling C code from ASM context, the data stack pointer and
 // frames should be reset. Bank8 is used by stack
@@ -546,60 +625,61 @@
 		void fillDataStack(void)
 		{
 			_asm
-				LFSR    1,C_STACK
-				MOVLW   0xCC
-		loop:	MOVWF   POSTINC1,0
-				TSTFSZ  FSR1L,0
-				BRA     loop
-
-				LFSR    1,C_STACK
-				LFSR    2,C_STACK
+				LFSR	1,C_STACK
+				MOVLW	0xCC
+		loop:	MOVWF	POSTINC1,0
+				TSTFSZ	FSR1L,0
+				BRA		loop
+
+				LFSR	1,C_STACK
+				LFSR	2,C_STACK
 			_endasm
 		}
 #	else
 #		define	RESET_C_STACK	\
 		_asm					\
-			LFSR	1, C_STACK	\
-			LFSR	2, C_STACK	\
+			LFSR	1,C_STACK	\
+			LFSR	2,C_STACK	\
 		_endasm
 #	endif
 #endif
 
+
 //////////////////////////////////////////////////////////////////////////////
-// Fast subroutine to read timer 5.
-// Note: result is in 1/32 of milliseconds (30,51757813 us/bit to be precise)
+// Fast subroutine to read timer 5
+// Note: result is in 1/32 of milliseconds (30.51757813 us/bit to be precise)
 static unsigned short tmr5(void)
 {
 #ifndef CROSS_COMPILE
 	_asm
 		movff	0xf7c,PRODL		// TMR5L
 		movff	0xf7d,PRODH		// TMR5H
-	_endasm						// result in PRODH:PRODL.
+	_endasm						// result in PRODH:PRODL
 #else
 	return 0;
 #endif
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-// read Buhlmann tables A and B for compartment ci
+// read Buhlmann coefficients a and b for compartment ci
 //
 static void read_Buhlmann_coefficients(void)
 {
 #ifndef CROSS_COMPILE
-	// Note: we don't use far rom pointer, because the
-	//       24 bits is too complex, hence we have to set
-	//       the UPPER page ourself...
-	//       --> Set zero if tables are moved to lower pages !
+	// Note: We don't use far ROM pointer, because handling
+	//       24 bit is too complex, hence we have to set the
+	//       UPPER page ourself...
+	//       -> Set to zero if tables are moved to lower pages!
 	_asm
-		movlw 1
-		movwf TBLPTRU,0
+		movlw	1
+		movwf	TBLPTRU,0
 	_endasm
 #endif
 
 	assert( ci < NUM_COMP );
 
-	// Use an interleaved array (AoS) to access coefficients with a
-	// single addressing.
+	// use an interleaved array (AoS) to access coefficients with a single addressing
 	{
 		overlay rom const float* ptr = &Buhlmann_ab[4*ci];
 		var_N2_a = *ptr++;
@@ -609,21 +689,22 @@
 	}
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-// read Buhlmann tables for compartment ci
-// If period == 0 : 2sec interval
-//              1 : 1 min interval
-//              2 : 10 min interval.
+// read Buhlmann increments for compartment ci
+// If period == 0 :  2 sec interval
+//              1 :  1 min interval
+//              2 : 10 min interval
 static void read_Buhlmann_times(PARAMETER char period)
 {
 #ifndef CROSS_COMPILE
-	// Note: we don't use far rom pointer, because the
-	//       24 bits is to complex, hence we have to set
-	//       the UPPER page ourself...
-	//       --> Set zero if tables are moved to lower pages!
+	// Note: We don't use far ROM pointer, because handling
+	//       24 bit is to complex, hence we have to set the
+	//       UPPER page ourself...
+	//       -> set to zero if tables are moved to lower pages!
 	_asm
-		movlw 1
-		movwf TBLPTRU,0
+		movlw	1
+		movwf	TBLPTRU,0
 	_endasm
 #endif
 
@@ -661,20 +742,21 @@
 	}
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-// read Buhlmann tables for compartment ci
+// read Buhlmann half-times for compartment ci
 //
 static void read_Buhlmann_ht(void)
 {
 
 #ifndef CROSS_COMPILE
-	// Note: we don't use far rom pointer, because the
-	//       24 bits is to complex, hence we have to set
-	//       the UPPER page ourself...
-	//       --> Set zero if tables are moved to lower pages !
+	// Note: We don't use far ROM pointer, because handling
+	//       24 bit is to complex, hence we have to set the
+	//       UPPER page ourself...
+	//       -> Set to zero if tables are moved to lower pages!
 	_asm
-		movlw 1
-		movwf TBLPTRU,0
+		movlw	1
+		movwf	TBLPTRU,0
 	_endasm
 #endif
 
@@ -685,15 +767,28 @@
 		var_He_ht = *ptr++;
 	}
 
-	assert( 4.0    <= var_N2_ht && var_N2_ht <= 635.0 );
+	assert( 4.0    <= var_N2_ht && var_N2_ht <= 635.0  );
 	assert( 1.5099 <= var_He_ht && var_He_ht <= 240.03 );
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-////////////////      THE JUMP-IN CODE for the asm code       ////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
+// compute adopted Buhlmann coefficients
+//
+static void adopt_Buhlmann_coefficients(void)
+{
+	// adopt a and b coefficients to current N2/He ratio inside the tissue
+	var_N2_a = (var_N2_a * calc_pres_tissue_N2 + var_He_a * calc_pres_tissue_He) / pres_tissue;
+	var_N2_b = (var_N2_b * calc_pres_tissue_N2 + var_He_b * calc_pres_tissue_He) / pres_tissue;
+}
+
+
+// *********************************************************************************************************************************
+//
+//                                                J U M P  I N   F U N C T I O N S
+//
+// *********************************************************************************************************************************
+
 
 //////////////////////////////////////////////////////////////////////////////
 // deco_calc_hauptroutine
@@ -735,7 +830,7 @@
 //
 // called from: simulator.asm
 //
-// Updates tissues and CNS value for char_I_dive_interval minutes on Air
+// Updates tissues and CNS value for char_I_dive_interval minutes on air
 // at ambient pressure and calculates resulting GF factor and ceiling for
 // a GF-high of 100% (ceiling and GF factor not used by simulator.asm)
 //
@@ -754,7 +849,7 @@
 //              menu_tree.asm
 //              ghostwriter.asm
 //
-// Updates tissues and CNS value for 1 minute on Air at ambient pressure and
+// Updates tissues and CNS value for 1 minute on air at ambient pressure and
 // calculates resulting GF factor and ceiling for a GF-high of 100% (ceiling
 // is not used by *.asm files).
 //
@@ -766,11 +861,11 @@
 
 
 //////////////////////////////////////////////////////////////////////////////
-// deco_calc_dive_interval_1min
+// deco_calc_dive_interval_10min
 //
 // called from: sleepmode.asm
 //
-// Updates tissues and CNS value for 10 minutes on Air at ambient pressure and
+// Updates tissues and CNS value for 10 minutes on air at ambient pressure and
 // calculates resulting GF factor and ceiling for a GF-high of 100% (ceiling
 // is not used by sleepmode.asm).
 //
@@ -824,37 +919,36 @@
 	pull_tissues_from_vault();
 }
 
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-////////////////                THE FUNCTIONS                 ////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
+
+// *********************************************************************************************************************************
+//
+//                                                    M A I N   F U N C T I O N S
+//
+// *********************************************************************************************************************************
 
 
 //////////////////////////////////////////////////////////////////////////////
 // calc_nextdecodepth
 //
-// new in v.102
-//
 // INPUT, changing during dive:
-//      sim_pres_respiration : current depth in absolute pressure
+//        sim_pres_respiration     : current depth in absolute pressure
 //
 // INPUT, fixed during dive:
-//      pres_surface
-//      GF_delta
-//      GF_high
-//      GF_low
-//      char_I_depth_last_deco
+//        pres_surface
+//        GF_delta
+//        GF_high
+//        GF_low
+//        char_I_depth_last_deco
 //
 // MODIFIED
-//      locked_GF_step_norm/_alt : used for GF model
-//      low_depth_norm/_alt      : used for GF model
+//        locked_GF_step_norm/_alt : used for GF model
+//        low_depth_norm/_alt      : used for GF model
 //
 // OUTPUT
-//      sim_depth_limit : depth of next stop in meters        (if RETURN == true )
-//                        depth we can ascent to without stop (if RETURN == false)
+//        sim_depth_limit          : depth of next stop in meters     (if RETURN == true )
+//                                   next possible depth without stop (if RETURN == false)
 //
-// RETURN TRUE if a stop is needed.
+// RETURN TRUE if a stop is needed, else false
 //
 static unsigned char calc_nextdecodepth(void)
 {
@@ -867,9 +961,8 @@
 	overlay float min_depth = (depth > float_ascent_speed) ? (depth - float_ascent_speed) : 0.0;
 
 
-	// allow for 200mbar of weather dependent surface pressure change
-	assert( depth >= -0.2 );
-
+	// target the simulated tissues
+	tissue_increment = 0;
 
 	//---- check if a stop is needed for deco reasons ----------------------------
 
@@ -889,18 +982,18 @@
 		calc_limit(GF_low);
 
 		// check if we can surface directly
-		if( sim_ceiling <= 0.0 )
+		if( ceiling <= 0.0 )
 		{
 			min_depth = 0.0;		// set minimum depth to 0 meters = surface
-			goto no_deco_stop;		// done.
+			goto no_deco_stop;		// done
 		}
 
 		// convert minimum depth we can ascent to from relative pressure to depth in meters
-		limit_depth = sim_ceiling * BAR_TO_METER;
+		limit_depth = ceiling * BAR_TO_METER;
 
 		// recall low_depth dependent on current plan
 		low_depth = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? low_depth_alt : low_depth_norm;
-		
+
 		// Store the deepest point needing a deco stop as the LOW reference for GF.
 		// NOTE: following stops will be validated using this LOW-HIGH GF scale,
 		//       so if we want to keep coherency, we should not validate this stop
@@ -925,7 +1018,7 @@
 		}
 		else
 		{
-			// recall locked_GF_step dependent on current plan
+			// recall locked_GF_step dependent of current plan
 			locked_GF_step = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? locked_GF_step_alt : locked_GF_step_norm;
 		}
 
@@ -933,10 +1026,10 @@
 		if( limit_depth < min_depth ) goto no_deco_stop;
 
 
-		// if program execution passes here, we need a deco stop
-
-		// Round to multiple of 3 meters
-		first_stop = 3 * (unsigned char)(0.9995 + limit_depth * 0.333333);
+		//---- if program execution passes here, we need a deco stop --------------------------------
+
+		// round to multiple of 3 meters (limit depth is in meters of depth)
+		first_stop = 3 * (unsigned char)(0.4999 + limit_depth * 0.333333);
 
 		// check a constraint
 		assert( first_stop < 128 );
@@ -947,9 +1040,9 @@
 		// We have a stop candidate.
 		// But maybe ascending to the next stop will diminish the constraint,
 		// because the GF might decrease more than the pressure gradient...
-		while(first_stop > 0)
+		while( first_stop > 0 )
 		{
-			// Next depth
+			// next depth
 			overlay unsigned char next_stop;
 
 			// invalidate this stop if we can ascent one more minute without going above minimum required deco depth
@@ -965,7 +1058,8 @@
 			else                                                calc_limit(GF_high - next_stop * locked_GF_step);
 
 			// check if ascent to the next stop candidate is possible
-			if( sim_ceiling * BAR_TO_METER >= next_stop ) goto deco_stop_found;	// no - ascent to next_stop forbidden
+			if( ceiling * BAR_TO_METER >= next_stop )
+				goto deco_stop_found;					// no - ascent to next_stop forbidden
 
 			// else, validate that stop and loop...
 			first_stop = next_stop;
@@ -994,13 +1088,13 @@
 		calc_limit(1.0);
 
 		// check if we can surface directly
-		if (sim_ceiling >= 0)
+		if( ceiling >= 0 )
 		{
 			// no - set flag for stop needed to 'yes'
 			need_stop = 1;
 
 			// convert stop depth in relative pressure to stop index
-			limit_depth = sim_ceiling * BAR_TO_METER / 3;
+			limit_depth = ceiling * BAR_TO_METER / 3.0;
 
 			// convert stop index to depth in meters, rounded to multiple of 3 meters
 			sim_depth_limit = 3 * (short)(limit_depth + 0.99);
@@ -1018,22 +1112,23 @@
 		}
 	}
 
-	// After the first deco stop, gas changes are only done at deco stops now!
+	// ---- After the first deco stop, gas changes are only done at deco stops now! -----------------------
 
 	// check if a stop is found and there is a better gas to switch to
-	if( need_stop )
+	if( need_stop         )
 	if( gas_find_better() )
 	{
 		// set the new calculation ratios for N2, He and O2
 		gas_set_ratios();
 
 		// prime the deco stop with the gas change time
-		update_deco_table(char_I_gas_change_time); 
+		update_deco_table(char_I_gas_change_time);
 	}
 
 	return need_stop;
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
 // publish_deco_table
 //
@@ -1050,32 +1145,33 @@
 	char_O_first_deco_depth = internal_deco_depth[0];
 	char_O_first_deco_time  = internal_deco_time [0];
 
-	for(x=0; x<NUM_STOPS; x++)
+	for( x = 0; x < NUM_STOPS; x++ )
 	{
 		char_O_deco_depth[x] = internal_deco_depth[x];
 		char_O_deco_time [x] = internal_deco_time [x];
 		char_O_deco_gas  [x] = internal_deco_gas  [x];
 	}
 
-	//Now fill the char_O_deco_time_for_log array
-	//---- First: search the first non-null depth
-	for(x=(NUM_STOPS-1); x != 0; --x)
+	// Now fill the char_O_deco_time_for_log array
+	// ---- First: search the first non-null depth
+	for( x = (NUM_STOPS-1); x != 0; --x )
 		if( internal_deco_depth[x] != 0 ) break;
 
 	//---- Second: copy to output table (in reverse order)
-	for(y=0; y<NUM_STOPS; y++, --x)
+	for( y = 0; y < NUM_STOPS; y++, --x )
 	{
 		char_O_deco_time_for_log[y] = internal_deco_time [x];
 
-		// Stop only once the last transfer is done.
+		// Stop when the last transfer is done.
 		if( x == 0 ) break;
 	}
 
 	//---- Third: fill table with null until end
-	for(y++; y<NUM_STOPS; y++)
+	for( y++; y < NUM_STOPS; y++ )
 		char_O_deco_time_for_log[y] = 0;
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
 // temp_tissue_safety
 //
@@ -1093,140 +1189,149 @@
 }
 
 
-
 //////////////////////////////////////////////////////////////////////////////
 // Find current gas in the list (if any) and get its change depth
 //
-// Input:  char_I_current_gas : 1..5 or 6
+// Input:  char_I_current_gas    : 1..5 or 6
 //
-// Output: sim_gas_last_used  : 1..6 or 0 if it is the gas set as FIRST
-//         sim_gas_last_depth : change depth in meters or 0 if it is the gas set as FIRST
+// Output: sim_gas_current       : 1..6 or 0 for the manually configured gas/dil
+//         sim_gas_current_depth : change depth (MOD) of the gas/dil in meters
 //
 static void gas_find_current(void)
 {
 	assert( 1 <= char_I_current_gas && char_I_current_gas <= 6 );
 
-	if( char_I_current_gas <= NUM_GAS )					// Gas 1-5
+	if( char_I_current_gas <= NUM_GAS )			// gas/diluent 1-5
 	{
-		sim_gas_last_used  = sim_gas_first_used = char_I_current_gas;
-		sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1];	// > 0 for OC deco gases,
-																			// > 0 for first & normal diluents,
-																			// = 0 else
+		sim_gas_current       = char_I_current_gas;
+		sim_gas_current_depth = char_I_deco_gas_change[sim_gas_current-1];
 	}
 	else
 	{
-		sim_gas_last_used  = sim_gas_first_used = 0;		// Gas 6 (the manually set one) has number 0 here
-		sim_gas_last_depth                      = 0;		// handle it as a travel/normal gas
+		sim_gas_current       = 0;
+		sim_gas_current_depth = char_I_gas6_depth;
 	}
 }
 
 
 //////////////////////////////////////////////////////////////////////////////
-// Find the deco gas with the shallowest change depth beyond current depth
+// Find the deco gas with the shallowest change depth below or at the current depth
 //
-// INPUT   sim_depth_limit          : current depth in meters
-//         char_I_deco_gas_change[] : change depths of the deco gases
-//         sim_gas_last_depth       : change depth of the currently used gas, 0 if on the gas set as FIRST
+// INPUT    sim_depth_limit          : current depth in meters
+//          sim_gas_current          : number of the currently used gas/dil
+//          sim_gas_current_depth    : change depth of the currently used gas/dil
+//          char_I_deco_gas_type[]   : types         of the gases/dils
+//          char_I_deco_gas_change[] : change depths of the gases/dils
 //
-// OUTPUT  sim_gas_last_depth       : switch depth            - only if return value is true
-//         sim_gas_last_used        : index of the gas (1..5) - only if return value is true
+// MODIFIED sim_gas_current          : index of the gas (1..5) - only if return value is true
+//          sim_gas_current_depth    : switch depth            - only if return value is true
 //
 // RETURNS TRUE if a better gas is available
 //
 static unsigned char gas_find_better(void)
 {
 	overlay unsigned char switch_depth = 255;
-	overlay unsigned char switch_gas   = 0;
+	overlay unsigned char switch_gas   =   0;
 	overlay unsigned char j;
 
-
-	// no automatic gas changes in CCR mode and - as of now - in pSCR mode
-	if( char_O_deco_status & DECO_MODE_LOOP ) return 0;
-
-	// Loop over all deco gases to find the shallowest one below or at current depth.
-	for(j=0; j<NUM_GAS; ++j)
+	// no automatic gas changes in CCR mode
+	if( (char_O_deco_status & DECO_MODE_MASK) == DECO_MODE_CCR ) return 0;
+
+	// loop over all deco gases to find the shallowest one below or at current depth
+	for( j = 0; j < NUM_GAS; ++j )
 	{
-		// Is this the gas we are already breathing?
-		// If yes, skip this gas.
-		if( j+1 == sim_gas_last_used ) continue;
-
-		// Is the change depth of the gas shallower than the current depth?
-		// If yes, skip this gas as it is not to be used yet.
-		// Remark: this check will also skip all disabled gases and the gas set
-		//         as 'first' because these have their change depth set to 0.
-		if( sim_depth_limit > char_I_deco_gas_change[j] ) continue;
-
-		// Is the change depth of the gas deeper or equal than the change depth of the
-		// gas we are currently one?
-		// If yes, skip this gas as it is not better than the current one.
-		// Remark: if there is more than one gas with the same change depth,
-		//         the last one from the list will be taken.
-		if( sim_gas_last_depth && (char_I_deco_gas_change[j] >= sim_gas_last_depth) ) continue;
-
-		// Is the change depth of the gas shallower or equal to the change depth
-		// of the best gas found so far, or is it the first better gas found?
-		// If yes, we have a better gas
+		// Is this gas not the one we are already breathing?
+		if( j+1 != sim_gas_current )
+
+		// Is this -                      an (active) deco gas,
+		//         - or if in deco phase, any gas but disabled
+		//         - or if in bailout,    any gas but disabled,
+		//         - or if in pSCR mode,  any gas but disabled?
+		if(   (                                               ( char_I_deco_gas_type[j] == 3 ) )
+		   || ( ( char_O_deco_info   & DECO_FLAG         ) && ( char_I_deco_gas_type[j] != 0 ) )
+		   || ( ( char_O_deco_status & DECO_BAILOUT_MODE ) && ( char_I_deco_gas_type[j] != 0 ) )
+		   || ( ( char_O_main_status & DECO_MODE_PSCR    ) && ( char_I_deco_gas_type[j] != 0 ) ) )
+
+		// Is the change depth of the this gas deeper than or
+		// at least equal to the current depth?
+		if( char_I_deco_gas_change[j] >= sim_depth_limit )
+
+		// Is the change depth of this gas shallower than the
+		// change depth of the gas we are currently on?
+		if( char_I_deco_gas_change[j] < sim_gas_current_depth )
+
+		// Is the change depth of this gas shallower than the change
+		// depth of the best gas found so far, or is it the first
+		// better gas found?
 		if( char_I_deco_gas_change[j] < switch_depth )
+
+		// If there is a yes to all these questions, we have a better gas!
 		{
 			switch_gas   = j+1;							// remember this gas (1..5)
 			switch_depth = char_I_deco_gas_change[j];	// remember its change depth
 		}
+
 	}	// continue looping through all gases to eventually find an even better gas
 
 	// has a better gas been found?
 	if( switch_gas )
 	{
-		// yes
-		sim_gas_last_used  = switch_gas;				// report the index of the better
-		sim_gas_last_depth = switch_depth;				// report its change depth
-
-		assert( sim_gas_last_depth < switch_depth );
-
-		return 1;										// signal a better gas was found
+		// YES - set the better gas as the new gas
+		sim_gas_current       = switch_gas;
+
+		// set its change depth as the last used change depth
+		sim_gas_current_depth = switch_depth;
+
+		assert( sim_gas_current_depth < switch_depth );
+
+		// signal a better gas was found
+		return 1;
 	}
 	else
 	{
-		return 0;										// signal no better gas was found
+		// NO - signal no better gas was found
+		return 0;
 	}
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-// Set calc_N2/He/O2_ratios by sim_gas_last_used
+// Set calc_N2/He/O2_ratios by sim_gas_current
 //
-// Input:  sim_gas_last_used          : index of gas to use
-//         N2_ratio, He_ratio         : if gas =    0 (the manually set gas)
-//         char_I_deco_O2/He_ratio[]  : if gas = 1..5 (the configured gases)
+// Input:  sim_gas_current              : index of gas to use
+//         real_O2_ratio, real_He_ratio : if gas =    0 (the manually set gas)
+//         char_I_deco_O2/He_ratio[]    : if gas = 1..5 (the configured gases)
 //
-// Output: sim_N2_ratio, sim_He_ratio : ratios of the inert gases
-//         sim_pSCR_drop              : ppO2 drop in pSCR loop
+// Output: sim_N2_ratio, sim_He_ratio   : ratios of the inert gases
+//         sim_pSCR_drop                : ppO2 drop in pSCR loop
 //
 static void gas_set_ratios(void)
 {
 	overlay float sim_IG_ratio;
 
-	assert( 0 <= sim_gas_last_used <= NUM_GAS );
+	assert( 0 <= sim_gas_current <= NUM_GAS );
 
 
 	// get gas ratios
-	if( sim_gas_last_used == 0 )
+	if( sim_gas_current == 0 )
 	{
-		sim_O2_ratio = O2_ratio;
-		sim_He_ratio = He_ratio;
+		sim_O2_ratio = real_O2_ratio;
+		sim_He_ratio = real_He_ratio;
 	}
 	else
 	{
-		sim_O2_ratio = 0.01 * char_I_deco_O2_ratio[sim_gas_last_used-1];
-		sim_He_ratio = 0.01 * char_I_deco_He_ratio[sim_gas_last_used-1];
+		sim_O2_ratio = 0.01 * char_I_deco_O2_ratio[sim_gas_current-1];
+		sim_He_ratio = 0.01 * char_I_deco_He_ratio[sim_gas_current-1];
 	}
 
 	// inert gas ratio (local helper variable)
-	sim_IG_ratio     = 1.00 - sim_O2_ratio;
+	sim_IG_ratio  = 1.00 - sim_O2_ratio;
 
 	// N2 ratio
-	sim_N2_ratio     = sim_IG_ratio - sim_He_ratio;
+	sim_N2_ratio  = sim_IG_ratio - sim_He_ratio;
 
 	// ppO2 drop in pSCR loop
-	sim_pSCR_drop    = sim_IG_ratio * float_pSCR_factor;
+	sim_pSCR_drop = sim_IG_ratio * float_pSCR_factor;
 
 
 	assert( 0.0 <=  sim_N2_ratio && sim_N2_ratio  <= 0.95 );
@@ -1234,30 +1339,30 @@
 	assert(        (sim_N2_ratio +  sim_He_ratio) <= 0.95 );
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
-// Compute respired ppN2 and ppHe
+// Compute respired ppO2, ppN2 and ppHe
 //
-// Input:  tissue_increment       : selector for targeting simulated or real tissues
-//         char_O_main_status     : breathing mode for real      tissues
-//         char_O_deco_status     : breathing mode for simulated tissues
-//         (sim_)O2_ratio         : (simulated) O2 ratio breathed
-//         (sim_)N2_ratio         : (simulated) N2 ratio breathed
-//         (sim_)He_ratio         : (simulated) He ratio breathed
-//         (sim_)pres_respiration : (simulated) respiration pressure
-//         char_I_const_ppO2      : ppO2 reported from sensors or setpoint
-//         char_I_PSCR_drop       : pSCR parameter
-//         char_I_PSCR_lungratio  : pSCR parameter
-//         pres_surface           : surface pressure
-//         float_deco_distance    : safety factor
-//         ppWater                : water-vapor pressure inside respiratory tract
+// Input:  tissue_increment           : selector for targeting simulated or real tissues
+//         char_O_main_status         : breathing mode for real      tissues
+//         char_O_deco_status         : breathing mode for simulated tissues
+//         sim_/real_O2_ratio         : (simulated) O2 ratio breathed
+//         sim_/real_N2_ratio         : (simulated) N2 ratio breathed
+//         sim_/real_He_ratio         : (simulated) He ratio breathed
+//         sim_/real_pres_respiration : (simulated) respiration pressure [bar]
+//         sim_/real_pSCR_drop        : (simulated) pSCR O2 drop
+//         pres_surface               : surface pressure [bar]
+//         char_I_const_ppO2          : ppO2 reported from sensors or setpoint [cbar]
+//         float_deco_distance        : safety factor, additional depth below stop depth [bar]
+//         ppWater                    : water-vapor pressure inside respiratory tract [bar]
 //
-// Output: ppN2                   : respired N2 partial pressure
-//         ppHe                   : respired He partial pressure
-//         char_ppO2              : breathed ppO2 in %, to be used for CNS calculation
+// Output: ppN2                       : respired N2 partial pressure
+//         ppHe                       : respired He partial pressure
+//         char_ppO2                  : breathed ppO2 in %, used in CNS calculation
 //
 void calc_alveolar_pressures(void)
 {
-	overlay float pres_diluent;
+	overlay float calc_pres_respiration;
 	overlay float calc_O2_ratio;
 	overlay float calc_N2_ratio;
 	overlay float calc_He_ratio;
@@ -1266,14 +1371,14 @@
 	overlay unsigned char status;
 
 
-	assert( 0.00 <= N2_ratio && N2_ratio <= 1.00 );
-	assert( 0.00 <= He_ratio && He_ratio <= 1.00 );
-	assert( (N2_ratio + He_ratio) <= 1.00 );
-	assert( 0.800 < pres_respiration && pres_respiration < 14.0 );
-
-	assert( 0.00 <= sim_N2_ratio && N2_ratio <= 1.00 );
-	assert( 0.00 <= sim_He_ratio && He_ratio <= 1.00 );
-	assert( (sim_N2_ratio + sim_He_ratio) <= 1.00 );
+	assert( 0.00 <= real_N2_ratio && real_N2_ratio <= 1.00 );
+	assert( 0.00 <= real_He_ratio && real_He_ratio <= 1.00 );
+	assert(        (real_N2_ratio + real_He_ratio) <= 1.00 );
+	assert( 0.800 < real_pres_respiration && real_pres_respiration < 14.0 );
+
+	assert( 0.00 <= sim_N2_ratio && real_N2_ratio <= 1.00 );
+	assert( 0.00 <= sim_He_ratio && real_He_ratio <= 1.00 );
+	assert(         (sim_N2_ratio + sim_He_ratio) <= 1.00 );
 	assert( 0.800 < sim_pres_respiration && sim_pres_respiration < 14.0 );
 
 
@@ -1281,35 +1386,32 @@
 	if( tissue_increment & TISSUE_FLAG )
 	{
 		//---- real tissues -----------------------------------------------------------
-		status         = char_O_main_status;
-		pres_diluent   = pres_respiration;
-		calc_pSCR_drop = pSCR_drop;
-
-		calc_O2_ratio  = O2_ratio;
-		calc_N2_ratio  = N2_ratio;
-		calc_He_ratio  = He_ratio;
+		status                = char_O_main_status;
+		calc_pres_respiration = real_pres_respiration;
+		calc_pSCR_drop        = real_pSCR_drop;
+
+		calc_O2_ratio         = real_O2_ratio;
+		calc_N2_ratio         = real_N2_ratio;
+		calc_He_ratio         = real_He_ratio;
 	}
 	else
 	{
 		//---- simulated tissues ------------------------------------------------------
-		status         = char_O_deco_status;
-		pres_diluent   = sim_pres_respiration;
-		calc_pSCR_drop = sim_pSCR_drop;
-
-		calc_O2_ratio  = sim_O2_ratio;
-		calc_N2_ratio  = sim_N2_ratio;
-		calc_He_ratio  = sim_He_ratio;
-
-		// take deco offset into account, but not at surface
-		if( pres_diluent > pres_surface ) pres_diluent += float_deco_distance;
+		status                = char_O_deco_status;
+		calc_pres_respiration = sim_pres_respiration;
+		calc_pSCR_drop        = sim_pSCR_drop;
+
+		calc_O2_ratio         = sim_O2_ratio;
+		calc_N2_ratio         = sim_N2_ratio;
+		calc_He_ratio         = sim_He_ratio;
 	}
 
 	//---- OC, CCR and Bailout Mode Gas Calculations -----------------------------------
 
 	// calculate ppO2 of pure oxygen
-	O2_ppO2 = (pres_diluent - ppWater);
-
-	// capture failure condition in case pres_respiration is < ppWater (should never happen...)
+	O2_ppO2 = calc_pres_respiration - ppWater;
+
+	// capture failure condition in case real_pres_respiration is < ppWater (should never happen...)
 	if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0;
 
 	// calculate ppO2 of the pure gas (OC, diluent)
@@ -1326,19 +1428,19 @@
 	if( status & DECO_MODE_LOOP )
 	{
 		overlay float const_ppO2;
+		overlay float   max_ppO2;
 
 		// get the current sensor reading (CCR / pSCR if fitted) or the fixed setpoint (CCR) / a zero (pSCR)
 		const_ppO2 = 0.01 * char_I_const_ppO2;
 
 		// Limit the setpoint to the maximum physically possible ppO2. This prevents for
 		// example calculating with a setpoint of 1.3 bar in only 2 meters of depth.
-		// Additionally, if limiting occurs, the ppO2 can be further reduced to account
-		// for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2.
-
-		if( const_ppO2 > pres_diluent )		// no ppWater subtracted here to give some margin for
-		{									// sensors delivering data a little bit over target
-			const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (pres_diluent - ppWater);
-		}
+		// Additionally, the ppO2 can be further reduced to account for exhaled inert gases
+		// accumulating in the loop by the user-adjustable setting char_I_cc_max_frac_o2.
+		// (ppWater is neglected here)
+		max_ppO2 = 0.01 * char_I_cc_max_frac_o2 * calc_pres_respiration;
+
+		if( const_ppO2 > max_ppO2 ) const_ppO2 = max_ppO2;
 
 		// check which kind of loop we are on
 		if( status & DECO_MODE_PSCR )
@@ -1354,33 +1456,36 @@
 		{
 			//---- CCR Mode ---------------------------------------------------------------------------
 
-			// derive breathed ppO2 from (char_I_)const_ppO2,
-			// which holds sensor reading or fixed setpoint
+			// derive breathed ppO2 from (char_I_)const_ppO2, which holds sensor reading or selected setpoint
 			ppO2 = const_ppO2;
 		}
 
-		// adjust diluent pressure (ppN2 + ppHe) for change
-		// in ppO2 due to setpoint (CCR) or drop (pSCR)
-		pres_diluent -= ppO2;
-		pres_diluent /= calc_N2_ratio + calc_He_ratio;
-
-		// capture all failure conditions, including div/0
-		// in case diluent is pure O2
-		if( (pres_diluent < 0.0) || (calc_O2_ratio > 99.5) )
+		// adjust overall gas pressure for change in ppO2 due to setpoint (CCR) or drop (pSCR),
+		// capture potential failure conditions first:
+		if(    ( calc_pres_respiration <  ppO2 )     // sensor reading or selected setpoint is higher than ambient pressure
+		    || ( calc_O2_ratio         > 0.995 ) )   // diluent is pure O2, i.e. calc_N2_ratio + calc_He_ratio = 0 yielding a div/0
 		{
-			pres_diluent = 0.0;
-			ppO2         = OC_ppO2;
+			// failure condition present, set predetermined result
+			calc_pres_respiration = 0.0;
+		}
+		else
+		{
+			// no failure conditions present, equation can be executed
+			calc_pres_respiration -= ppO2;
+			calc_pres_respiration /= calc_N2_ratio + calc_He_ratio;
 		}
 	}
 	else
-	{	//---- OC mode ---------------------------------------------------------------------------------
+	{
+		//---- OC mode ---------------------------------------------------------------------------------
 
 		// breathed ppO2 is ppO2 of pure gas
 		ppO2 = OC_ppO2;
 	}
 
 
-	// derive char_ppO2 in [cbar], used for calculating CNS%
+	//---- derive char_ppO2 in [cbar], used for calculating CNS% ---------------------------------------
+
 	if      ( ppO2 <  0.01  ) char_ppO2  =   0;
 	else if ( ppO2 >= 2.545 ) char_ppO2  = 255;
 	else                      char_ppO2  = (unsigned char)(100 * ppO2 + 0.5);
@@ -1388,31 +1493,44 @@
 
 	//---- calculate ppN2 and ppHe ---------------------------------------------------------------------
 
-	if( pres_diluent > ppWater )
+	// add deco safety distance when working on simulated tissues
+	if( !(tissue_increment & TISSUE_FLAG) ) calc_pres_respiration += float_deco_distance;
+
+	// compute ppN2 and ppHe, capture potential failure conditions first:
+	if( calc_pres_respiration > ppWater )
 	{
-		ppN2 = calc_N2_ratio * (pres_diluent - ppWater);
-		ppHe = calc_He_ratio * (pres_diluent - ppWater);
+		// subtract water vapor pressure
+		calc_pres_respiration -= ppWater;
+
+		// calculate partial pressures
+		ppN2 = calc_N2_ratio * calc_pres_respiration;
+		ppHe = calc_He_ratio * calc_pres_respiration;
 	}
 	else
 	{
+		// calculated respired pressure is < water vapor pressure, thus set ppN2 and ppHe to 0
 		ppN2 = 0.0;
 		ppHe = 0.0;
 	}
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
 // clear_tissue
 //
 // optimized in v.101 (var_N2_a)
 //
-// preload tissues with standard pressure for the given ambient pressure.
+// Reset all tissues to surface pressure equilibrium state.
 //
 static void clear_tissue(void)
 {
-	pres_respiration = 0.001  * int_I_pres_respiration;
-	N2_equilibrium   = 0.7902 * (pres_respiration - ppWater);
-
-	for(ci=0; ci<NUM_COMP; ci++)
+	// safety limit to prevent improper initialization values
+	if( int_I_pres_respiration < 500) int_I_pres_respiration = 500;		// min. respiration pressure = 500 mbar
+
+	real_pres_respiration = 0.001  * int_I_pres_respiration;
+	N2_equilibrium        = 0.7902 * (real_pres_respiration - ppWater);
+
+	for( ci = 0; ci < NUM_COMP; ci++ )
 	{
 		// cycle through the 16 Buhlmann N2 tissues
 		pres_tissue_N2[ci]              = N2_equilibrium;	// initialize data for "real" tissue
@@ -1428,8 +1546,9 @@
 	int_O_CNS_fraction = int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = 0;
 
 
-	// reset any warnings
+	// reset any warnings and status data
 	char_O_deco_warnings		= 0;
+	char_O_deco_status			= 0;
 
 	// reset some more vars to their defaults
 	char_O_nullzeit				= 240;
@@ -1452,34 +1571,27 @@
 	overlay unsigned int int_ppO2_min;
 	overlay unsigned int int_ppO2_max;
 	overlay unsigned int int_ppO2_max_dil;
+	overlay unsigned int int_ppO2_max_max;
 	overlay float        EAD;
 	overlay float        END;
 
 
 	//--- Set-up Part --------------------------------------------------------------------------------
 
+	// clear flags indicating a calculation has been completed
+	char_O_main_status &= ~( DECO_COMPLETED_NORM + DECO_COMPLETED_ALT );
+
 	// twosectimer:
 	// calc_hauptroutine is now invoked every second to speed up the deco planning.
 	// Because the tissue and CNS calculations are based on a two seconds period, a
-	// toggle-timer is used by the respective routines to skip every 2nd invocation.
-	twosectimer = (twosectimer) ? 0 : 1;			// toggle the toggle-timer
-
-
-	// set up normal tissue updating or "fast forward" updating for simulator sim+5' function
-	// and deco calculator bottom time calculation
-	if( char_I_sim_advance_time > 0 )
+	// toggle-timer is used to skip every 2nd invocation.
+	twosectimer = (twosectimer) ? 0 : 1;
+
+	// do initializations that need to be done only once at the beginning of a dive
+	if( (char_O_deco_status & DECO_STATUS_MASK) == DECO_STATUS_INIT )
 	{
-		// configure char_I_sim_advance_time minutes of tissue updating
-		tissue_increment = char_I_sim_advance_time	// given number of minutes, limited to 127
-						 | TISSUE_FLAG;				// set flag for updating the "real" tissues & CNS
-
-		char_I_sim_advance_time = 0;				// clear "mailbox"
-	}
-	else
-	{
-		// configure 2 seconds of tissue updating
-		tissue_increment = 0						// encoding for 2 seconds update
-						 | TISSUE_FLAG;				// set flag for updating the "real" tissues & CNS
+		// compute a factor that will be used later on in pSCR calculations
+		float_pSCR_factor = 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio;
 	}
 
 
@@ -1488,35 +1600,48 @@
 	// acquire current environment data
 	calc_hauptroutine_data_input();
 
-	// calculate ppN2 and ppHe
+	// target the real tissues with 2 second increments by default
+	tissue_increment = TISSUE_FLAG | 0;
+
+	// calculate ppO2, ppN2 and ppHe
 	calc_alveolar_pressures();
 
 	// All deco code is invoked every second. But as the tissue and CNS updates are based
-	// on 2 seconds periods, each update is done only on each 2nd second.
-	// In case a "fast forward" of the tissues is commanded, the 2-seconds rule is over raided.
-	// To distribute computational load, updating of tissues and CNS is done in alternation.
-	if( twosectimer || (tissue_increment & TIME_MASK) )
+	// on 2 seconds periods, each update is done only on each 2nd second. In case a "fast
+	// forward" of the tissues is commanded, the 2-seconds rule is over-raided.
+	if( twosectimer || char_I_sim_advance_time )
 	{
+		// Set up normal tissue updating or "fast forward" updating for simulator
+		// sim+5' function and deco calculator bottom time calculation.
+		if( char_I_sim_advance_time > 0 )
+		{
+			// configure "fast forward" tissue updating
+			tissue_increment = TISSUE_FLAG | char_I_sim_advance_time;
+
+			// clear the "mailbox"
+			char_I_sim_advance_time = 0;
+		}
+
 		// calculate the real tissues
 		calc_tissues();
 
-		// calculate ceiling (at GF_high) and current GF
-		calc_limit(GF_high);
-	}
-
-	if( !twosectimer || (tissue_increment & TIME_MASK) )
-	{
-		// calculate CNS value increment for the real tissues
-		calc_CNS_increment();
-
-		// increment CNS value of the real tissues
-		CNS_fraction += CNS_fraction_inc;
-
-		// compute integer copy of CNS value for display purpose
+		// update the CNS value for the real tissues
+		calc_CNS();
+
+		// calculate ceiling (at GF_high or 100%) and leading tissue supersaturation
+		if( char_I_deco_model ) calc_limit(GF_high);		// GF factors enabled
+		else                    calc_limit(  1.0  );		// classic Buhlmann
+
+		// convert ceiling from float to integer for export [mbar relative pressure]
+		convert_ceiling_for_display();
+
+		// convert leading tissue supersaturation value from float to integer for export [%]
+		convert_GF_for_display();
+
+		// convert CNS value from float to integer for export
 		convert_CNS_for_display();
 	}
 
-
 	//---- Calculate and Export EAD and END ------------------------------------------------------
 
 	// calculate EAD (Equivalent Air Depth): equivalent depth for the same N2 level with plain air
@@ -1525,7 +1650,7 @@
 	// calculate END (Equivalent Narcotic Depth): here O2 is treated as narcotic, too
 	// Source cited: The Physiology and Medicine of Diving by Peter Bennett and David Elliott,
 	//               4th edition, 1993, W.B.Saunders Company Ltd, London.
-	END = (pres_respiration - ppHe - pres_surface) * BAR_TO_METER;
+	END = (real_pres_respiration - ppHe - pres_surface) * BAR_TO_METER;
 
 	// export EAD
 	if( (EAD < 0.0) || (EAD > 245.5) ) char_O_EAD = 0;
@@ -1539,31 +1664,49 @@
 	//---- Compute ppO2 Values in [cbar] ---------------------------------------------------------
 
 	// pure oxygen ppO2
-	if		( O2_ppO2       <  0.01  ) int_O_O2_ppO2       =   0;
+	     if ( O2_ppO2       <  0.01  ) int_O_O2_ppO2       =   0;
 	else if ( O2_ppO2       >= 9.995 ) int_O_O2_ppO2       = 999;
 	else                               int_O_O2_ppO2       = (unsigned int)(100 *   O2_ppO2 + 0.5);
-	
+
 	// pure gas ppO2
-	if      ( OC_ppO2       <  0.01  ) int_O_pure_ppO2     =   0;
+	     if ( OC_ppO2       <  0.01  ) int_O_pure_ppO2     =   0;
 	else if ( OC_ppO2       >= 9.995 ) int_O_pure_ppO2     = 999;
 	else                               int_O_pure_ppO2     = (unsigned int)(100 *   OC_ppO2 + 0.5);
-	
+
 	// calculated pSCR ppO2
-	if		( pSCR_ppO2     <  0.01  ) int_O_pSCR_ppO2     =   0;
+	     if ( pSCR_ppO2     <  0.01  ) int_O_pSCR_ppO2     =   0;
 	else if ( pSCR_ppO2     >= 9.995 ) int_O_pSCR_ppO2     = 999;
 	else                               int_O_pSCR_ppO2     = (unsigned int)(100 * pSCR_ppO2 + 0.5);
 
 	// breathed ppO2
-	if		( ppO2          <  0.01  ) int_O_breathed_ppO2 =   0;
+	     if ( ppO2          <  0.01  ) int_O_breathed_ppO2 =   0;
 	else if ( ppO2          >= 9.995 ) int_O_breathed_ppO2 = 999;
 	else                               int_O_breathed_ppO2 = (unsigned int)(100 *      ppO2 + 0.5);
 
 
+	//---- Set/Reset Deco Mode --------------------------------------------------------------------
+
+	// Set the deco mode flag if:
+	// - breathing an OC deco gas (gas type 3), or
+	// - breathing a gas or diluent that officially is disabled (type 0), or
+	// - if nearby or above the deepest deco stop (nearby means 1 meter below, the additional 0.9 serves rounding effects)
+	if  (    ( char_I_current_gas_type == 3                                                                           )
+	      || ( char_I_current_gas_type == 0                                                                           )
+	      || ( (unsigned char)((real_pres_respiration - pres_surface) * BAR_TO_METER - 1.9) < char_O_first_deco_depth )
+		)
+			char_O_deco_info |=  DECO_FLAG;
+	else
+			char_O_deco_info &= ~DECO_FLAG;
+
+
 	//---- Compute ppO2 Warnings ------------------------------------------------------------------
 
 	// compute conditional min/max values
-	int_ppO2_min = (char_O_main_status   & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min;
-	int_ppO2_max = (char_O_deco_warnings & DECO_FLAG     ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max;
+	int_ppO2_min = (char_O_main_status & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min;
+	int_ppO2_max = (char_O_deco_info   & DECO_FLAG     ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max;
+
+	// get biggest of char_I_ppO2_max / char_I_ppO2_max_deco
+	int_ppO2_max_max = ( char_I_ppO2_max_deco > char_I_ppO2_max ) ? char_I_ppO2_max_deco : char_I_ppO2_max;
 
 	// default value for the upper diluent ppO2 warning threshold is the normal upper warning threshold
 	int_ppO2_max_dil = int_ppO2_max;
@@ -1574,7 +1717,7 @@
 		overlay unsigned int max_dil;
 
 		//  The upper diluent ppO2 threshold is ppO2_GAP_TO_SETPOINT below the setpoint...
-		// (the condition protects from negative numbers which would cause a wrap-around)
+		// (the condition protects from negative numbers which would cause a wrap-around in unsigned integers)
 		max_dil = (char_I_const_ppO2 > ppO2_GAP_TO_SETPOINT) ? (unsigned int)(char_I_const_ppO2 - ppO2_GAP_TO_SETPOINT) : 0;
 
 		// ...but never above int_ppO2_max.
@@ -1585,160 +1728,374 @@
 	}
 
 	// check for safe range of pure oxygen
-	if		( int_O_O2_ppO2       >=           int_ppO2_max     ) int_O_O2_ppO2       |= INT_FLAG_WARNING + INT_FLAG_HIGH;
+	     if ( int_O_O2_ppO2       >=               int_ppO2_max     ) int_O_O2_ppO2       |= INT_FLAG_WARNING + INT_FLAG_HIGH;
 
 	// check for safe range of breathed gas
-	if		( int_O_breathed_ppO2 <=           int_ppO2_min     ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW;
-	else if ( int_O_breathed_ppO2 >=           int_ppO2_max     ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH;
-	else if ( char_O_main_status  &            DECO_MODE_LOOP   ) ; // no attention generated in loop modes
-	else if ( int_O_breathed_ppO2 >=   ppO2_ATTENTION_THRESHOLD ) int_O_breathed_ppO2 |= INT_FLAG_ATTENTION;
+	     if ( int_O_breathed_ppO2 <=               int_ppO2_min     ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW;
+	else if ( int_O_breathed_ppO2 >=               int_ppO2_max_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH;
+	else if ( char_O_deco_info    &                DECO_FLAG        ) ; // no attention generated in deco mode
+	else if ( char_O_main_status  &                DECO_MODE_LOOP   ) ; // no attention generated in loop modes
+	else if ( int_O_breathed_ppO2 >= (unsigned int)char_I_ppO2_max  ) int_O_breathed_ppO2 |= INT_FLAG_ATTENTION;
 
 	// check for safe range of pure diluent
-	if		( int_O_pure_ppO2 <= (unsigned int)char_I_ppO2_min  ) int_O_pure_ppO2     |= INT_FLAG_WARNING + INT_FLAG_LOW;
-	else if ( int_O_pure_ppO2 >=               int_ppO2_max     ) int_O_pure_ppO2     |= INT_FLAG_WARNING + INT_FLAG_HIGH;
-	else if ( int_O_pure_ppO2 >=               int_ppO2_max_dil ) int_O_pure_ppO2     |= INT_FLAG_ATTENTION;
+	     if ( int_O_pure_ppO2     <= (unsigned int)char_I_ppO2_min  ) int_O_pure_ppO2     |= INT_FLAG_WARNING + INT_FLAG_LOW;
+	else if ( int_O_pure_ppO2     >=               int_ppO2_max     ) int_O_pure_ppO2     |= INT_FLAG_WARNING + INT_FLAG_HIGH;
+	else if ( int_O_pure_ppO2     >=               int_ppO2_max_dil ) int_O_pure_ppO2     |= INT_FLAG_ATTENTION;
 
 	// check for safe range of calculated pSCR loop gas
-	if		( int_O_pSCR_ppO2 <=               int_ppO2_min     ) int_O_pSCR_ppO2     |= INT_FLAG_WARNING + INT_FLAG_LOW;
-	else if ( int_O_pSCR_ppO2 >=               int_ppO2_max     ) int_O_pSCR_ppO2     |= INT_FLAG_WARNING + INT_FLAG_HIGH;
-
-
-	// done with the real tissues
-
-
-
-	//---- Toggle between Calculation for NDL (bottom time),  -------------------------------------
-	//---- Deco Stops, more Deco Stops and Results Gathering  -------------------------------------
-
-
-	// all following operations target the simulated tissues, so clear flag in bit 7
-	tissue_increment = 0;
-
-	// branch to the code for the current phase the deco calculations are in
+	     if ( int_O_pSCR_ppO2     <=               int_ppO2_min     ) int_O_pSCR_ppO2     |= INT_FLAG_WARNING + INT_FLAG_LOW;
+	else if ( int_O_pSCR_ppO2     >=               int_ppO2_max     ) int_O_pSCR_ppO2     |= INT_FLAG_WARNING + INT_FLAG_HIGH;
+
+
+#ifdef _rx_functions
+
+	//---- Process Pressure Readings (OSTC TR only) -----------------------------------------------
+
+	// only for OSTC TR model with TR functions enabled
+	if( char_O_main_status & DECO_TR_FUNCTIONS )
+	{
+		// pressure warnings for reading 1, but only if enabled and pressure value available
+		if( (char_I_pressure_gas[0] > 0) && !(int_IO_pressure_value[0] & INT_FLAG_NOT_AVAIL) )
+		{
+			overlay unsigned int pressure_value = int_IO_pressure_value[0] & ~INT_FLAG_OUTDATED;
+
+			if( (char_I_pressure_gas[0] < 6 ) && !(int_O_pressure_need[0] & INT_FLAG_NOT_AVAIL) )
+			{
+				// not a dil and need available: warning & attention by need
+				     if( pressure_value <= int_O_pressure_need[0])
+				         int_IO_pressure_value[0] |= INT_FLAG_WARNING;
+				else if( pressure_value <= int_O_pressure_need[0] + int_O_pressure_need[0] / 2 )
+				         int_IO_pressure_value[0] |= INT_FLAG_ATTENTION;
+			}
+			else
+			{
+				// a dil or need not available: warning & attention by fixed thresholds
+				if     ( pressure_value <= PRESSURE_LIMIT_WARNING   ) int_IO_pressure_value[0] |= INT_FLAG_WARNING;
+				else if( pressure_value <= PRESSURE_LIMIT_ATTENTION ) int_IO_pressure_value[0] |= INT_FLAG_ATTENTION;
+			}
+		}
+
+		// pressure warnings for reading 2, but only if enabled and pressure value available
+		if( (char_I_pressure_gas[1] > 0) && !(int_IO_pressure_value[1] & INT_FLAG_NOT_AVAIL) )
+		{
+			overlay unsigned int pressure_value = int_IO_pressure_value[1] & ~INT_FLAG_OUTDATED;
+
+			if( (char_I_pressure_gas[1] < 6 ) && !(int_O_pressure_need[1] & INT_FLAG_NOT_AVAIL) )
+			{
+				// not a dil and need available: warning & attention by need
+				     if( pressure_value <= int_O_pressure_need[1])
+				         int_IO_pressure_value[1] |= INT_FLAG_WARNING;
+				else if( pressure_value <= int_O_pressure_need[1] + int_O_pressure_need[1] / 2 )
+				         int_IO_pressure_value[1] |= INT_FLAG_ATTENTION;
+			}
+			else
+			{
+				// a dil or need not available: warning & attention by fixed thresholds
+				     if( pressure_value <= PRESSURE_LIMIT_WARNING   ) int_IO_pressure_value[1] |= INT_FLAG_WARNING;
+				else if( pressure_value <= PRESSURE_LIMIT_ATTENTION ) int_IO_pressure_value[1] |= INT_FLAG_ATTENTION;
+			}
+		}
+
+		//--- SAC Calculation ---------------------------------------------------------------------
+		//
+		// char_I_SAC_mode =0: disabled
+		//                 =1: SAC from 1st reading
+		//                 =2: SAC from 2nd reading
+		//                 =3: SAC from higher one of both pressure drops (independent double mode)
+		//                 =4: SAC (O2 usage) from 2nd reading without real_pres_respiration term
+
+		// set SAC rate to not available by default
+		int_O_sac_rate = 0 + INT_FLAG_NOT_AVAIL;
+
+		// get a copy of the current absolute pressure
+		pres_respiration_sac = real_pres_respiration;
+
+		// set threshold for SAC rate attention
+		max_sac_rate = (char_O_deco_info & DECO_FLAG) ? char_I_deco_usage : char_I_bottom_usage;
+
+		// char_I_deco_usage / char_I_bottom_usage are in l/min, max_sac_rate is in 0.1 l/min
+		max_sac_rate *= 10;
+
+
+		// pre-process SAC mode 3 (independent double)
+		if( char_I_SAC_mode == 3 )
+		{
+			overlay unsigned char  reading1_gas;
+			overlay unsigned char  reading2_gas;
+			overlay unsigned char  reading1_tanksize;
+			overlay unsigned char  reading2_tanksize;
+			overlay unsigned short reading1_press;
+			overlay unsigned short reading2_press;
+			overlay unsigned short reading1_drop;
+			overlay unsigned short reading2_drop;
+
+			// get gas numbers (1-10) of both readings
+			reading1_gas = char_I_pressure_gas[0];
+			reading2_gas = char_I_pressure_gas[1];
+
+			// default to no SAC calculation
+			char_I_SAC_mode = 0;
+
+			// clear switch advice by default
+			char_O_deco_info &= ~IND_DOUBLE_SWITCH_FLAG;
+
+			// check if both readings are configured and available
+			if(  reading1_gas                                    )
+			if(  reading2_gas                                    )
+			if( !(int_IO_pressure_value[0] & INT_FLAG_NOT_AVAIL) )
+			if( !(int_IO_pressure_value[1] & INT_FLAG_NOT_AVAIL) )
+			if( !(int_I_pressure_drop[0]   & INT_FLAG_NOT_AVAIL) )
+			if( !(int_I_pressure_drop[1]   & INT_FLAG_NOT_AVAIL) )
+			{
+				// get tank pressures, stripping flags
+				reading1_press = int_IO_pressure_value[0] & 0x0FFF;			// in 0.1 bar
+				reading2_press = int_IO_pressure_value[1] & 0x0FFF;			// in 0.1 bar
+
+				// get pressure drops as integers, stripping flags and shifting right
+				// to avoid an overflow when multiplying with the tank size later on
+				reading1_drop = (int_I_pressure_drop[0] & 0x0FFF) >> 2;
+				reading2_drop = (int_I_pressure_drop[1] & 0x0FFF) >> 2;
+
+				// get tank sizes
+				reading1_tanksize = char_I_tank_size[reading1_gas-1];
+				reading2_tanksize = char_I_tank_size[reading2_gas-1];
+
+				// set mode to calculate SAC on the reading with the higher absolute drop
+				char_I_SAC_mode = (reading1_drop * reading1_tanksize > reading2_drop * reading2_tanksize) ? 1 : 2;
+
+				// compute switch advice if pressure (in 0.1 bar) of tank breathed from is
+				// more than char_I_max_pres_diff (in bar) below pressure of the other tank.
+				if( char_I_SAC_mode == 1 )
+				{
+					// breathing from reading 1, switch advice if pressure on reading 1 lower than on 2
+					if( (reading1_press + 10*char_I_max_pres_diff) <= reading2_press )
+						char_O_deco_info |= IND_DOUBLE_SWITCH_FLAG;
+				}
+				else
+				{
+					// breathing from reading 2, switch advice if pressure on reading 2 lower than on 1
+					if( (reading2_press + 10*char_I_max_pres_diff) <= reading1_press )
+						char_O_deco_info |= IND_DOUBLE_SWITCH_FLAG;
+				}
+			}
+		}
+
+
+		// pre-process SAC mode 4 (O2 usage by reading 2)
+		if( char_I_SAC_mode == 4 )
+		{
+			// O2 usage on CCR is independent from absolute pressure
+			pres_respiration_sac = 1.0;
+
+			// O2 pressure drop is measured via reading 2
+			char_I_SAC_mode = 2;
+
+			// reconfigure max SAC rate to O2 consumption attention threshold
+			max_sac_rate = O2_CONSUMPTION_LIMIT_ATTENTION;
+		}
+
+
+		// calculate SAC - modes 1 & 2
+		if( (char_I_SAC_mode == 1) || (char_I_SAC_mode == 2) )
+		{
+			overlay unsigned char reading_index;
+			overlay unsigned char reading_gas;
+			overlay unsigned char reading_tanksize;
+			overlay float         reading_drop;
+
+			// set index: char_I_SAC_mode = 1 -> reading one, index 0
+			//                            = 2 ->         two,       1
+			reading_index = char_I_SAC_mode - 1;
+
+			// get gas number (1-10)
+			reading_gas = char_I_pressure_gas[reading_index];
+
+			// check if reading is configured and available
+			if(  reading_gas                                               )
+			if( !(int_I_pressure_drop[reading_index] & INT_FLAG_NOT_AVAIL) )
+			{
+				// get tank size (in liter)
+				reading_tanksize = char_I_tank_size[reading_gas-1];
+
+				// get pressure drop as float, stripping flags (in 1/5120 bar/sec)
+				reading_drop = (float)(int_I_pressure_drop[reading_index] & 0x0FFF);
+
+				// check if pressure drop is within range
+				if( !(int_I_pressure_drop[reading_index] & INT_FLAG_OUT_OF_RANGE) )
+				{
+					// calculate SAC,   10 is factor to have result in 0.1 liter/min
+					//                  60 is factor for 60 seconds per 1 minute,
+					//                5120 accounts for reading_drop being in 1/5120 bar/sec
+					//                10*60/5120 = 60/512 = 15/128
+					float_sac = reading_drop * 15/128 * reading_tanksize / pres_respiration_sac;
+
+					// limit result to 999 (99.9 liter/min)
+					if ( float_sac >= 998.5 )
+					{
+						int_O_sac_rate = 999 + INT_FLAG_ATTENTION;
+					}
+					else
+					{
+						// convert float to integer
+						int_O_sac_rate = (unsigned short)(float_sac + 0.5);
+
+						// set attention flag if exceeding SAC threshold, but only if pressure drop is not outdated
+						if( !(int_I_pressure_drop[reading_index] & INT_FLAG_OUTDATED) )
+						if( int_O_sac_rate >= max_sac_rate )
+						{
+							int_O_sac_rate |= INT_FLAG_ATTENTION;
+						}
+					}
+				}
+				else
+				{
+					// pressure drop is out of range, so SAC will be set out of range, too
+					int_O_sac_rate = 999 + INT_FLAG_ATTENTION;
+				}
+
+				// copy outdated flag from int_I_pressure_drop to int_O_sac_rate
+				if( int_I_pressure_drop[reading_index] & INT_FLAG_OUTDATED )
+				{
+					int_O_sac_rate |= INT_FLAG_OUTDATED;
+				}
+			}
+		}
+	} // TR functions
+
+#endif
+
+
+	//---- End of Computations for the real Tissues -----------------------------------------------
+	//
+	//=============================================================================================
+	//
+	//---- Begin of Computations for Ascent and Decompression -------------------------------------
+
+	// branch to the code for the current phase the deco calculations are in, i.e.
+	// toggle between calculating NDL (remaining bottom time), deco stops, and results
 	switch( char_O_deco_status & DECO_STATUS_MASK )
 	{
 		overlay unsigned char i;
 
+	default:
+
 	case DECO_STATUS_INIT: //---- At surface: Start a new dive ---------------------
 
-		// clear the internal stops table from remains lasting from the last dive
+		// clear the internal stops table from remains lasting from the previous dive or deco calculator run
 		clear_deco_table();
 
 		// publish the cleared stops table to the display functions
 		publish_deco_table();
 
 		// clear the gas needs table
-		for(i=0; i<NUM_GAS; ++i)
+		for( i = 0; i < NUM_GAS; ++i )
 		{
-			int_O_gas_volumes[i]    = 0;
-			int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO;
+			int_O_ascent_volumes[i]   = 0;
+			int_O_ascent_pres_need[i] = 0 + INT_FLAG_ZERO;
 		}
 
-		// initialize the balancing between N2 and He for later no-fly time calculation
-		for(i=0; i<NUM_COMP; ++i)
-		{
-			split_N2_He[i] = 90;	// assumes 90% of total tissue pressure will be needed for N2
-		}
-		
-		// ** UNDER CONSTRUCTION - temporary code only **
-		char_I_gas_change_time = 1;		// TODO: validate proper operation before enabling this options-table parameter		
-		char_I_ascent_speed    = 10;	// TODO: validate proper operation before enabling this options-table parameter,
-										//       caution: values < 10 may have an impact on the deco calculation run-times!
+		// safety limits to prevent eventual infinite looping (bricking the OSTC)
+		if( char_I_ascent_speed            <  5 ) char_I_ascent_speed            =  5;	// min.  5 m/min
+		if( char_I_deco_distance           > 20 ) char_I_deco_distance           = 20;	// max. 20 dm (= 2 m)
+		if( char_I_desaturation_multiplier < 50 ) char_I_desaturation_multiplier = 50;	// min. 50 %
 
 		// initialize values that are constant during the course of the dive
-		float_ascent_speed            = 1.00  * char_I_ascent_speed;
-		float_desaturation_multiplier = 0.01  * char_I_desaturation_multiplier;
-		float_saturation_multiplier   = 0.01  * char_I_saturation_multiplier;
-		float_deco_distance           = 0.01  * char_I_deco_distance;
+		float_ascent_speed            = 1.00 * char_I_ascent_speed;						// in meter/minute
+		float_deco_distance           = 0.01 * char_I_deco_distance;					// in bar
+		float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier;			// as factor, 1.0 = 100%
+		float_saturation_multiplier   = 0.01 * char_I_saturation_multiplier;			// as factor, 1.0 = 100%
 
 		// initialize values that will be recalculated later on periodically
-		char_O_nullzeit               = 0;	// reset NDL time for the normal plan
-		char_O_alternate_nullzeit     = 0;	// reset NDL time for the alternative plan
-		int_O_ascenttime              = 0;	// reset ascent time for the normal plan
-		int_O_alternate_ascenttime    = 0;	// reset ascent time for the alternative plan
-		char_O_deco_warnings          = 0;	// reset all deco warnings
-		deco_tissue_vector            = 0;	// reset tissue deco vector
-		IBCD_tissue_vector            = 0;	// reset tissue IBCD vector
-		NDL_lead_tissue               = 0;	// reset first tissue to look at during NDL calculation
+		char_O_nullzeit               = 0;		// reset NDL time for the normal plan
+		char_O_alternate_nullzeit     = 0;		// reset NDL time for the alternative plan
+		int_O_ascenttime              = 0;		// reset ascent time for the normal plan
+		int_O_alternate_ascenttime    = 0;		// reset ascent time for the alternative plan
+		char_O_deco_warnings          = 0;		// reset all deco warnings
+		char_O_deco_info              = 0;		// reset all deco infos
+		deco_tissue_vector            = 0;		// reset tissue deco vector
+		IBCD_tissue_vector            = 0;		// reset tissue IBCD vector
+		NDL_lead_tissue               = 0;		// reset first tissue to look at during NDL calculation
 
 		// tag desaturation time as invalid (it will not be computed during a dive)
 		int_O_desaturation_time       = 65535;
 
+		// initialize values for first stop depth and GF slope
+		low_depth_norm                = 0.0;	// reset depth of first stop in normal      plan
+		locked_GF_step_norm           = 0.0;	// reset GF slope            in normal      plan
+		low_depth_alt                 = 0.0;	// reset depth of first stop in alternative plan
+		locked_GF_step_alt            = 0.0;	// reset GF slope            in alternative plan
+
 		// initialize CNS values
-		int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = int_O_CNS_fraction;
-
-		// Values that should be reset just once for the full real dive.
-		// This is used to record the lowest stop for the whole dive,
-		// including ACCROSS all simulated ascents.
-		low_depth_norm      = low_depth_alt      = 0.0;
-		locked_GF_step_norm = locked_GF_step_alt = 0.0;
+		int_O_normal_CNS_fraction     = int_O_alternate_CNS_fraction = int_O_CNS_fraction;
 
 		//
 		// --> code execution continues in state DECO_STATUS_START
 		//
 
-	case DECO_STATUS_START: //---- Bottom Time & initial Ascent --------------------
-	default:
+	case DECO_STATUS_START: //---- Start a new deco calculation cycle --------------
 
 		// clear the internal(!) stops table
 		clear_deco_table();
-		
+
 		// initialize the simulated tissues with the current state of the real tissues
-		for(i=0; i<NUM_COMP; i++)
+		for( i = 0; i < NUM_COMP; i++ )
 		{
 			sim_pres_tissue_N2[i] = pres_tissue_N2[i];
 			sim_pres_tissue_He[i] = pres_tissue_He[i];
 		}
 
+		// initialize the simulated CNS value with the current CNS of the real tissues
+		sim_CNS_fraction = CNS_fraction;
+
+		// initialize the simulated depth with the current depth (in absolute pressure)
+		sim_pres_respiration = real_pres_respiration;
+
 		// Lookup the current gas and store it also as the first gas used.
-		// This gas will be used for the bottom segment of the dive and for
-		// the period of delayed ascent when calculating fTTS or bailout.
+		// This gas will be used until gas_find_better() is invoked and finds
+		// a better gas to switch to.
 		gas_find_current();
 
-		// setup the calculation ratio's for N2, He and O2 (sim_N2/He/O2_ratio)
+		// Setup the calculation ratio's for N2, He and O2 (sim_N2/He/_O2_ratio).
+		// These ratios will be used and remain valid to use until a gas switch
+		// is done. Thus, if a call to gas_find_better() has found a better gas,
+		// gas_set_ratios() needs to be called again.
 		gas_set_ratios();
 
-		// initialize depth in absolute pressure, it is needed by
-		// - calc_alveolar_pressures(),
-		// - calc_ascent_to_first_stop(), and
-		// - calc_hauptroutine_calc_deco()
-		sim_pres_respiration = pres_respiration;
-
-		// calculate ppN2 and ppHe from sim_N2/He_ratio (<- tissue_increment has been set to 0)
-		calc_alveolar_pressures();
-
-		// calculate the effect of extended bottom time due to delayed ascent
+		// Calculate the effect of extended bottom time due to delayed ascent,
+		// if requested.
 		if( char_O_deco_status & DECO_ASCENT_DELAYED )
 		{
 			// program interval on simulated tissues (flag bit 7 = 0)
 			tissue_increment = char_I_extra_time;
 
+			// calculate ppO2, ppN2 and ppHe from sim_N2/real_He_ratio
+			calc_alveolar_pressures();
+
 			// update the tissues
 			calc_tissues();
+
+			// update the CNS value
+			calc_CNS();
 		}
 
-		// calculate if we are within no decompression limit (NDL)
+		// Calculate the remaining no decompression limit (NDL) time. calc_NDL_time()
+		// is very fast in detecting if being beyond NDL, so there is enough time left
+		// in this phase to do the initial ascent calculation if found to be outside NDL.
 		calc_NDL_time();
 
-		// Calculate the initial ascent if in deco. calc_NDL_time() is very fast
-		// in detecting being beyond NDL, so there is enough time left in this
-		// phase to do the initial ascent calculation.
 		if( NDL_time == 0 )
 		{
-			//--- in deco --------------------------------------------------------
-
-			// calculate ascent to first stop
+			// calculate ascent to first stop using the set ascent rate,
+			// re-calculating the tissues and limits every minute along the ascent.
 			calc_ascent_to_first_stop();
 
-			// continue with calculating the stops
-			char_O_deco_status &= ~DECO_STATUS_MASK;	// clear status bits and set status bits for
-			char_O_deco_status |=  DECO_STATUS_STOPS;	// calculation of stops on next invocation
+			// continue in next cycle(s) with calculating the initial ascent and stops
+			char_O_deco_status &= ~DECO_STATUS_MASK;
+			char_O_deco_status |=  DECO_STATUS_STOPS;
 		}
 		else
 		{
-			//--- within NDL -----------------------------------------------------
-
-			// continue with gathering all results
+			// within NDL - continue in next cycle with gathering all results
 			char_O_deco_status &= ~DECO_STATUS_MASK;
 			char_O_deco_status |=  DECO_STATUS_RESULTS;
 		}
@@ -1751,138 +2108,159 @@
 		// calculate the stops
 		calc_hauptroutine_calc_deco();
 
-		// calc_hauptroutine_calc_deco iterates in this phase as long as it is
+		// calc_hauptroutine_calc_deco() iterates in this phase as long as it is
 		// calculating the stops. Once done, it will set the status to doing the
 		// results gathering.
 
 		break;
 
 
-	case DECO_STATUS_RESULTS: //--- Gathering of all Results -----------------------
-
-		// if in normal plan, publish the stops table to the display functions
-		if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) ) publish_deco_table();
-
-		// The current depth is needed by calc_CNS_planning() and gas_volumes().
-		// As it may be needed in different code blocks below but we don't want
-		// it to be in the code multiple times, it's done here on stockpile.
-		bottom_depth = (unsigned char)((pres_respiration - pres_surface) * BAR_TO_METER);
-
-		// Calculate the ascent time.
-		// When within NDL, potential gas switches will be treated as done "on the fly".
-		calc_ascenttime();
+	case DECO_STATUS_RESULTS: //--- Gather Results ---------------------------------
+
+		// if in normal plan, publish the stops table
+		if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) )
+		{
+			// publish the stops table to the display functions
+			publish_deco_table();
+
+			// When entering deco and the ceiling depth becomes > 0 but the
+			// deco calculation reveals no distinct deco stop yet because
+			// the deco obligation will vanish during the ascent, create an
+			// artificial stop to signal that expedite surfacing ("popping
+			// up") is not allowed anymore.
+			if( char_O_first_deco_depth == 0 )		// simulation  reveals no stop required
+			if( int_O_ceiling           >  0 )		// real status reveals a ceiling
+			{
+				// set a pro forma stop at 3 meters
+				char_O_first_deco_depth = 3;
+
+				// set a stop time of 0 minute, this will be displayed as "..'"
+				char_O_first_deco_time  = 0;
+			}
+		}
+
+		// The current depth is needed by calc_ascenttime() and gas_volumes(). As we
+		// don't want it to be calculated multiple times, it's done here on stockpile.
+		char_bottom_depth = (unsigned char)((real_pres_respiration - pres_surface) * BAR_TO_METER + 0.5);
 
 		// results to publish depend whether within NDL or in deco
 		if( NDL_time )
 		{
 			//---- within NDL ----------------------------------------------
 
-			// Calculate the initial ascent (not yet done when within NDL) - 
-			// just to get potential gas switches into the stops table for use
-			// by gas_volumes(). The stops table can be polluted by now because
-			// the clean table has already been published to the display
-			// functions before.
-			calc_ascent_to_first_stop();
-
 			// check which plan we are on
 			if( char_O_deco_status & DECO_PLAN_ALTERNATE )
 			{
 				//---- alternate dive plan ---------------------------------
 
-				// As we are in no stop, CNS at end of dive is more or less
-				// the same CNS as we have right now. It's so simple that we
-				// don't check if it requested to be computed or not...
-				int_O_alternate_CNS_fraction = int_O_CNS_fraction;
-
 				// output NDL time
 				char_O_alternate_nullzeit  = NDL_time;
 
 				// clear ascent time
 				int_O_alternate_ascenttime = 0;
+
+				// As we are in no stop, CNS at end of dive is more or less
+				// the same CNS as we have right now.
+				int_O_alternate_CNS_fraction = int_O_CNS_fraction;
 			}
 			else
 			{
 				//---- normal dive plan ------------------------------------
 
-				// As we are in no stop, CNS at end of dive is more or less
-				// the same CNS as we have right now. It's so simple that we
-				// don't check if it requested to be computed or not...
-				int_O_normal_CNS_fraction = int_O_CNS_fraction;
-
 				// output NDL time
 				char_O_nullzeit = NDL_time;
 
 				// clear ascent time
 				int_O_ascenttime = 0;
+
+				// As we are in no stop, CNS at end of dive is more or less
+				// the same CNS as we have right now.
+				int_O_normal_CNS_fraction = int_O_CNS_fraction;
 			}
 		} // NDL
 		else
 		{
 			//---- in DECO -------------------------------------------------
 
+			// calculate the ascent time
+			calc_ascenttime();
+
 			// check which plan we are on
 			if( char_O_deco_status & DECO_PLAN_ALTERNATE )
 			{
 				//---- alternative plan ----------------------------------------------------
 
-				// clear NDL time
-				char_O_alternate_nullzeit  = 0;
-
-				// output ascent time
+				// clear the NDL time
+				char_O_alternate_nullzeit = 0;
+
+				// export the ascent time
 				int_O_alternate_ascenttime = ascent_time;
 
-				// shall the CNS at the end of the dive be calculated?
-				if( char_O_deco_status & DECO_CNS_CALCULATE )
-				{
-					// calculate the CNS for the predicted ascent, result in sim_CNS_fraction
-					calc_CNS_planning();
-
-					// add current CNS value
-					sim_CNS_fraction += CNS_fraction;
-
-					// convert to integer value
-					convert_sim_CNS_for_display();
-
-					// export result
-					int_O_alternate_CNS_fraction = int_sim_CNS_fraction;
-				}
+				// convert the CNS value to integer for export
+				convert_sim_CNS_for_display();
+
+				// export the integer CNS value
+				int_O_alternate_CNS_fraction = int_sim_CNS_fraction;
 
 			} // alternative plan
 			else
 			{
 				//---- normal plan ---------------------------------------------------------
 
-				// clear NDL time
+				// clear the NDL time
 				char_O_nullzeit  = 0;
 
-				// output ascent time
+				// export the ascent time
 				int_O_ascenttime = ascent_time;
 
-				// shall the CNS at the end of the dive be calculated?
-				if( char_O_deco_status & DECO_CNS_CALCULATE )
-				{
-					// calculate the CNS for the predicted ascent, result in sim_CNS_fraction
-					calc_CNS_planning();
-
-					// add current CNS value
-					sim_CNS_fraction += CNS_fraction;
-
-					// convert to integer value
-					convert_sim_CNS_for_display();
-
-					// export result
-					int_O_normal_CNS_fraction = int_sim_CNS_fraction;
-				}
+				// convert the CNS value to integer for export
+				convert_sim_CNS_for_display();
+
+				// export the integer CNS value
+				int_O_normal_CNS_fraction = int_sim_CNS_fraction;
 
 			} // normal plan
-		} // DECO
-
-		// if requested, calculate the required gas volumes and tank pressures at the end of the dive
-		if( char_O_deco_status & DECO_VOLUME_CALCULATE ) gas_volumes();
-
-		// signal that the computation cycle is finished
+		} // NDL / DECO
+
+
+		// Check if deco obligation is steady or decreasing. This works only when an alternative plan is enabled and
+		// if it is not a bailout plan, thus DECO_BAILOUT_MODE must not be set while doing the DECO_PLAN_ALTERNATE.
+		if( (char_O_deco_status & DECO_PLAN_ALTERNATE) && !(char_O_deco_status & DECO_BAILOUT_MODE) )
+		{
+			// Set DECO_DECREASING flag when fTTS < TTS and DECO_STEADY flag when fTTS = TTS.
+			     if ( int_O_alternate_ascenttime <  int_O_ascenttime ) char_O_deco_info |= DECO_DECREASING;
+			else if ( int_O_alternate_ascenttime == int_O_ascenttime ) char_O_deco_info |= DECO_STEADY;
+		}
+
+		// Clear DECO_DECREASING flag when fTTS >= TTS and DECO_STEADY flag when fTTS > TTS.
+		// This works in any planning mode combination.
+		     if ( int_O_alternate_ascenttime >  int_O_ascenttime ) char_O_deco_info &= ~(DECO_DECREASING + DECO_STEADY);
+		else if ( int_O_alternate_ascenttime == int_O_ascenttime ) char_O_deco_info &= ~(DECO_DECREASING              );
+
+		// If requested, calculate the required gas volumes and tank pressures at the end of the dive.
+		if( char_O_deco_status & DECO_VOLUME_CALCULATE )
+		{
+			// When in bailout mode and within NDL, find the gas changes along the ascent and put
+			// them into the stops table for use by gas_volumes(). The stops table can be "polluted"
+			// by now because the table has already been published in "clean" state before.
+			if( (NDL_time) && ( char_O_deco_status & DECO_BAILOUT_MODE ) )
+			{
+				// find the gas changes and put them into the stops table
+				find_NDL_gas_changes();
+			}
+
+			// calculate the required gas volumes and tank pressures
+			gas_volumes();
+		}
+
+		// set the computation cycle to finished
 		char_O_deco_status &= ~DECO_STATUS_MASK;
 
+		// set flag indicating that deco calculation has been completed
+		if( char_O_deco_status & DECO_PLAN_ALTERNATE ) char_O_main_status |= DECO_COMPLETED_ALT;
+		else                                           char_O_main_status |= DECO_COMPLETED_NORM;
+
+
 		break;
 
 	} // switch
@@ -1898,9 +2276,18 @@
 {
 	overlay float IG_ratio;
 
+	// safety limits to prevent eventual infinite looping (bricking the OSTC)
+	if( int_I_pres_surface     < 500) int_I_pres_surface     = 500;		// min. surface     pressure = 500 mbar
+	if( int_I_pres_respiration < 500) int_I_pres_respiration = 500;		// min. respiration pressure = 500 mbar
+
+	// safe-guard further parameters to protect the tissue-flag
+	if( char_I_sim_advance_time > 127 ) char_I_sim_advance_time = 127;
+	if( char_I_extra_time       > 127 ) char_I_extra_time       = 127;
+	if( char_I_gas_change_time  >  99 ) char_I_gas_change_time  =  99;
+
 	// get the current pressures
-	pres_surface     = 0.001  * int_I_pres_surface;
-	pres_respiration = 0.001  * int_I_pres_respiration;
+	pres_surface          = 0.001  * int_I_pres_surface;
+	real_pres_respiration = 0.001  * int_I_pres_respiration;
 
 	// N2 tissue pressure at surface equilibrium, used for tissue graphics scaling
 	N2_equilibrium   = 0.7902 * (pres_surface - ppWater);
@@ -1911,60 +2298,57 @@
 	GF_delta = GF_high - GF_low;
 
 	// get the currently breathed gas mixture
-	O2_ratio = 0.01 * char_I_O2_ratio;
-	He_ratio = 0.01 * char_I_He_ratio;
+	real_O2_ratio = 0.01 * char_I_O2_ratio;
+	real_He_ratio = 0.01 * char_I_He_ratio;
 
 	// inert gas ratio (local helper variable)
-	IG_ratio = 1.00 - O2_ratio;
+	IG_ratio = 1.00 - real_O2_ratio;
 
 	// N2 ratio
-	N2_ratio = IG_ratio - He_ratio;
-
-	// precomputed values for ppO2 drop in pSCR loop
-	float_pSCR_factor = 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio;
-	pSCR_drop         = IG_ratio * float_pSCR_factor;
+	real_N2_ratio  = IG_ratio - real_He_ratio;
+
+	// compute values for ppO2 drop in pSCR loop
+	real_pSCR_drop = IG_ratio * float_pSCR_factor;
 }
 
 
 //////////////////////////////////////////////////////////////////////////////
-// Compute stops.
+// Compute stops
 //
-// Note: because this can be very long, break on 16 iterations, and set state
-//       to DECO_STATUS_FINISHED when finished, or to DECO_STATUS_STOPS when
-//       needing to continue.
-// Note: because each iteration might be very long too (~ 66 ms in 1.84beta),
-//       break the loop when elapsed time exceeds 512 milliseconds.
+// Note: because this can be very long, break on 16 iterations, or after
+//       512 ms, whichever comes first. Set state to DECO_STATUS_RESULTS
+//       when finished, or keep DECO_STATUS_STOPS when needing to continue.
 //
 void calc_hauptroutine_calc_deco(void)
 {
 	overlay unsigned char loop;
 
-
-	for(loop = 0; loop < 16; ++loop)
+	for( loop = 0; loop < 16; ++loop )
 	{
-		// limit loops to 512ms, using timer 5
+		// limit execution time to 512 ms using timer 5
 		if( tmr5() & (512*32) ) break;
 
 		// calc_nextdecodepth()
 		//
 		// INPUT  sim_pres_respiration : current depth in absolute pressure
-		// OUTPUT sim_depth_limit      : depth of next stop in meters
-		// RETURN true if a stop is needed
+		// OUTPUT sim_depth_limit      : depth of next stop in meters      (if RETURN = true)
+		//                               next depth without need of a stop (if RETURN = false)
+		// RETURN true if a stop is needed, else false
 		//
 		// The function manages gas changes by itself, including priming
 		// the deco stop with the configured gas change time.
 		//
 		if( calc_nextdecodepth() )
 		{
-			if( sim_depth_limit == 0 ) goto Surface;	// this check should not bee needed as in
-														// this case the RETURN value will be false
-
-			//---- stop required at sim_depth_limit -------------------------------------
+			// this check should not be needed as in this case the RETURN value will be false
+			if( sim_depth_limit == 0 ) goto Surface;
+
+			//---- stop required at sim_depth_limit ----------------------
 
 			// convert stop depth in meters to absolute pressure
 			sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface;
 
-			// add one minute to the current stop, or add a new stop,
+			// Add one minute to the current stop, or add a new stop,
 			// or abort deco calculation if the deco table is full.
 			if( !update_deco_table(1) ) goto Surface;
 		}
@@ -1987,128 +2371,177 @@
 			}
 		}
 
-
-		//---- as one minute as passed now, update the tissues ----------------------
-
-		// program 1 minute interval on simulated tissues (Flagbit 7 = 0)
+		//---- as one minute as passed now, update the tissues -----------
+
+		// program 1 minute interval on simulated tissues
 		tissue_increment = 1;
 
-		// compute current ppN2 and ppHe
+		// compute current ppO2, ppN2 and ppHe
 		calc_alveolar_pressures();
 
 		// update the tissues
 		calc_tissues();
+
+		// update the CNS value
+		calc_CNS();
 	}
 }
 
 
 //////////////////////////////////////////////////////////////////////////////
-// Calculate ascent to first deco stop.
+// Find gas changes on an NDL ascent
+//
+// This function is a variant of calc_ascent_to_first_stop() to be used solely
+// for finding the gas changes in an OC bailout ascent that is within NDL.
+//
+// Input    : char_bottom_depth : depth at which the ascent starts, in meters
+//
+// Output   : gas change stops put into stops table
+//
+// Destroyed: sim_depth_limit
+//            sim_gas_current
+//            sim_gas_current_depth
 //
+void find_NDL_gas_changes(void)
+{
+	overlay unsigned char old_depth_limit;
+
+	// set gas to start with
+	gas_find_current();
+
+	// loop in ascending until reaching a depth of 3 meters, no gas switches considered thereafter
+	for( sim_depth_limit = char_bottom_depth; sim_depth_limit >= 3; )
+	{
+		// memorize the depth we came from
+		old_depth_limit = sim_depth_limit;
+
+		// ascent - initially in steps of 10 m, then slowing down to 1 m steps to not miss a O2 gas
+		if( sim_depth_limit > 10 ) sim_depth_limit -= 10;
+		else                       sim_depth_limit -=  1;
+
+		// check if there is a better gas to switch to
+		if( gas_find_better() )
+		{
+			// adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from
+			sim_depth_limit = (sim_gas_current_depth < old_depth_limit) ? sim_gas_current_depth : old_depth_limit;
+
+			// create a stop for the gas change in the stops table
+			update_deco_table(char_I_gas_change_time);
+		}
+	} // for()
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Calculate ascent to first deco stop
 //
-// Modified: sim_pres_respiration : current depth in ascent and deco simulation, in bar absolute pressure
+// Modified : sim_pres_respiration : current depth in ascent and deco simulation, in bar absolute pressure
+//
+// Output   : sim_depth_limit      : depth in meters of the 1st stop, if a stop is found
+//
+// Destroyed: tissue_increment     : tissue and update period selector
 //
 void calc_ascent_to_first_stop(void)
 {
-	overlay unsigned char fast      = 1;	// 1 = 1 minute steps,  0 = 2 seconds steps
-	overlay unsigned char gaschange = 0;	// 1 = do a gas change, 0 = no better gas available
-
-
-	//---- Loop until first deco stop or surface is reached ----------
+	overlay float         old_pres_respiration;
+	overlay unsigned char fast = 1;					// 0: 2 seconds step, 1: 1 minute step
+
+	// target the simulated tissues
+	tissue_increment = 0;
+
+	// loop until first deco stop or the surface is reached
 	for(;;)
 	{
-		// depth in absolute pressure we came from
-		overlay float old_deco = sim_pres_respiration;
+		// memorize depth in absolute pressure we came from
+		old_pres_respiration = sim_pres_respiration;
 
 		// try ascending 1 full minute (fast) or 2 seconds (!fast)
-		if	( fast ) sim_pres_respiration -=  float_ascent_speed       * METER_TO_BAR;	// 1 min at float_ascent_speed ( 5 .. 10  m/min)
-		else         sim_pres_respiration -= (float_ascent_speed/30.0) * METER_TO_BAR;	// 2 sec at float_ascent_speed (17 .. 33 cm/min)
+		if( fast ) sim_pres_respiration -=          float_ascent_speed * METER_TO_BAR;	// 1 min at float_ascent_speed ( 5 .. 10  m)
+		else       sim_pres_respiration -= 0.0333 * float_ascent_speed * METER_TO_BAR;	// 2 sec at float_ascent_speed (17 .. 33 cm)
 
 		// but don't go over surface
 		if( sim_pres_respiration < pres_surface ) sim_pres_respiration = pres_surface;
 
-		// compute current ceiling of the simulated tissues
-		if   ( char_I_deco_model != 0 ) calc_limit(GF_low);
-		else                            calc_limit(1.0);
-
-		// did we overshoot the first deco stop?
-		if( sim_pres_respiration < (sim_ceiling + pres_surface) )
+		// compute ceiling of the simulated tissues
+		if( char_I_deco_model != 0 ) calc_limit(GF_low);
+		else                         calc_limit(1.0);
+
+		// did we overshoot the ceiling?
+		if( sim_pres_respiration < (ceiling + pres_surface) )
 		{
-			// YES - back to last depth below first stop
-			sim_pres_respiration = old_deco;
+			// YES - back to memorized depth
+			sim_pres_respiration = old_pres_respiration;
 
 			// switch to 2 seconds ascent if not yet in, else done
 			if( fast )
 			{
-				fast = 0;				// retry with 2 seconds ascent steps
+				fast = 0;		// ascent with 2 seconds ascent steps
 				continue;
 			}
 			else
 			{
-				break;					// done...
+				break;			// done, stop required
 			}
 		}
 
-		// If code execution passes along here, we did not overshoot the first stop.
-
-		// did we reach the surface? if yes, done!
+		// if code execution passes along here, we did not overshoot the ceiling
+
+		// did we reach the surface? If yes, deco has vanished, no stop required, done.
 		if( sim_pres_respiration == pres_surface ) break;
 
 		// depth in meters where we are now (no round-up)
 		sim_depth_limit = (unsigned char)((sim_pres_respiration - pres_surface) * BAR_TO_METER);
 
-		// Check if there is a better gas to switch to, but only in alternative plan mode
-		// or if override is set. If yes, introduce a stop for the gas change.
-		if( (char_O_deco_status & DECO_PLAN_ALTERNATE) || (char_O_main_status & DECO_GASCHANGE_OVRD) )
+		// program interval on simulated tissues:
+		// fast = 1 -> 1 minute,
+		// fast = 0 -> 2 seconds
+		tissue_increment = fast;
+
+		// Check if there is a better gas to switch to, but only if bailout mode is enabled.
+		// If yes, introduce a stop for the gas change.
+		if( char_O_deco_status & DECO_BAILOUT_MODE )
 		if( gas_find_better() )
 		{
-			// depth in meters we came from
-			overlay unsigned char old_depth_limit = (unsigned char)((old_deco - pres_surface) * BAR_TO_METER);			
-
-			// adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from
-			sim_depth_limit = (sim_gas_last_depth < old_depth_limit) ? sim_gas_last_depth : old_depth_limit;
-
-			// create a stop for the gas change
-			update_deco_table(char_I_gas_change_time);
+			overlay unsigned char old_depth_limit;
 
 			// set the new calculation values for N2, He and O2
 			gas_set_ratios();
 
-			// signal to create a stop for the gas change and update the tissues
-			gaschange = char_I_gas_change_time;
-
-			// Adjust the depth for the tissue update to the stop depth. In case of fast mode, this
-			// imposes that the ascent from the 'old_deco' depth to this stop took 1 minute although
-			// we might have only ascended one or two meters...
+			// add gas change time: a gas change time of
+			//    0 minutes will keep the 1 minute / 2 seconds interval selection,
+			// >= 1 minute  will add the the 1 minute interval but overrule a 2 seconds interval.
+			tissue_increment += char_I_gas_change_time;
+
+			// depth in meters we came from
+			old_depth_limit = (unsigned char)((old_pres_respiration - pres_surface) * BAR_TO_METER);
+
+			// adjust sim_depth_limit to the gas change depth, but not deeper than the depth we came from
+			sim_depth_limit = (sim_gas_current_depth < old_depth_limit) ? sim_gas_current_depth : old_depth_limit;
+
+			// Adjust the depth for the tissue update to the current depth. In case of fast mode,
+			// this imposes that the ascent from the 'old_pres_respiration' depth to this depth
+			// took one minute although we might have only ascended one or two meters...
 			sim_pres_respiration = sim_depth_limit * METER_TO_BAR + pres_surface;
+
+			// create a stop for the gas change in the stops table
+			update_deco_table(char_I_gas_change_time);
 		}
 
-		// Did one minute pass by and/or do we have a gas change?
-		// Remark: The 2 seconds ascent iterations towards the first deco stop in !fast speed may take
-		// up to 28 seconds in total - for this rough half of a minute no tissue updates will be computed.
-		// Well, it could be done by setting tissue_increment = 0 in !fast condition and making calls to
-		// calc_alveolar_pressures() and calc_tissues() - see code commented out below.
-		if( fast || gaschange )
+		// omit the 2 seconds interval updates (do only updates for >= 1 minute)
+		// It's a trade-off between computational effort and accuracy...
+		if( tissue_increment )
 		{
-			// program interval on simulated tissues (flag bit 7 = 0)
-			tissue_increment = fast + gaschange;
-
-			// clear gas change signal
-			gaschange = 0;
-	//	}
-	//	else
-	//	{
-	//		// program 2 seconds interval on simulated tissues (flag bit 7 = 0)
-	//		tissue_increment = 0;
-	//	}
-	//	{
-			// compute ppN2/ppHe for current depth from sim_pres_respiration
+			// compute ppO2, ppN2 and ppHe for current depth from sim_pres_respiration
 			calc_alveolar_pressures();
-			
+
 			// update the tissues
 			calc_tissues();
+
+			// update the CNS value
+			calc_CNS();
 		}
-	}
+
+	} // for()
 }
 
 
@@ -2139,7 +2572,7 @@
 	assert( 0.00 <= ppHe && ppHe < 12.6 );  // 90% He at 130m
 
 
-	for (ci=0;ci<NUM_COMP;ci++)				// iterate through all compartments
+	for( ci=0; ci < NUM_COMP; ci++ )		// iterate through all compartments
 	{
 		i = tissue_increment & TIME_MASK;	// extract number of minutes to do    (if i > 0)
 											// or if one 2 second period is to do (if i = 0)
@@ -2230,8 +2663,8 @@
 			{
 				deco_tissue_vector &= ~(1 << ci);		// tag tissue as not being in decompression
 
-				if(		((temp_tissue_N2 > 0.0) && (temp_tissue_He < 0.0))		// check for counter diffusion
-					||	((temp_tissue_N2 < 0.0) && (temp_tissue_He > 0.0)) )
+				if(    ((temp_tissue_N2 > 0.0) && (temp_tissue_He < 0.0))		// check for counter diffusion
+				    || ((temp_tissue_N2 < 0.0) && (temp_tissue_He > 0.0)) )
 				{
 					IBCD_tissue_vector |= (1 << ci);	// tag tissue as experiencing mentionable IBCD
 				}
@@ -2240,7 +2673,7 @@
 
 			// keep the saturating / desaturating flags from last invocation
 			char_O_tissue_N2_saturation[ci] &= 128;
-			char_O_tissue_He_saturation[ci]	&= 128;
+			char_O_tissue_He_saturation[ci] &= 128;
 
 			// flip the flags applying a hysteresis of HYST (actual value: see #define of HYST)
 				 if( temp_tissue_N2 > +HYST ) char_O_tissue_N2_saturation[ci] = 128; // set flag for tissue pressure is increasing
@@ -2252,7 +2685,7 @@
 
 			// For N2 tissue display purpose:
 			// Scale tissue press so that saturation in 70m on AIR gives a value of approx. 80.
-			// The surface steady-state tissue loading of [0.7902 * (pres_respiration - ppWater)] bar
+			// The surface steady-state tissue loading of [0.7902 * (real_pres_respiration - ppWater)] bar
 			// gives then a 10. If N2 is completely washed out of the tissue, result will be 0.
 			// This scaling is adapted to the capabilities of the tissue graphics in the custom views.
 			temp_tissue = (pres_tissue_N2[ci] / N2_equilibrium) * 10;
@@ -2271,19 +2704,13 @@
 			temp_tissue = pres_tissue_He[ci] * 7.7;
 
 			// limit to 127 to leave space for sat/desat flag
-			if (temp_tissue > 127) temp_tissue = 127; 
+			if (temp_tissue > 127) temp_tissue = 127;
 
 			// export as integer
 			char_O_tissue_He_saturation[ci] += (unsigned char)temp_tissue;
 		} //if
 
 	} // for
-
-
-	// set   deco flag if we are in deco and at least one of the real tissues is off-gassing
-	// clear deco flag if all of the real tissues are on-gassing
-	if      ( (char_O_nullzeit == 0) &&  deco_tissue_vector ) char_O_deco_warnings |=  DECO_FLAG;
-	else if (                           !deco_tissue_vector ) char_O_deco_warnings &= ~DECO_FLAG; 
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -2295,36 +2722,33 @@
 //        pres_tissue_N2/_He     : tissue pressures (used in real      tissues context)
 //
 // Output:
-//        sim_ceiling            : ceiling in bar  relative pressure (only in simulated tissues context)
-//        ceiling                : ceiling in bar  relative pressure (only in real      tissues context)
-//        int_O_ceiling          : ceiling in mbar relative pressure (only in real      tissues context)
-//        int_O_gradient_factor  : gradient factor in %              (only in real      tissues context)
+//        lead_supersat          : supersaturation of the leading tissue, 1.0 = 100%
+//        ceiling                : ceiling in bar relative pressure
 //
 // Modified:
 //        char_O_deco_warnings   : for IBCD, microbubbles and outside warning (only in real tissues context)
 //
 static void calc_limit(PARAMETER float GF_parameter)
 {
-	overlay float lead_tissue_limit = 0.0;
-	overlay float lead_supersat     = 0.0;
-
-	overlay unsigned char lead_tissue_no = 0;
-
+	overlay float         lead_tissue_limit = 0.0;
+
+
+	// set leading tissue number to not yet computed
+	lead_number = 0;
+
+	// initialize leading tissue supersaturation value to null
+	lead_supersat  = 0.0;
 
 	// check context
 	if( tissue_increment & TISSUE_FLAG )
 	{
 		// clear IBCD, microbubbles and outside warning flags (locked warnings will be preserved)
-		char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE);
+		char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE + DECO_ATTENTION_OUTSIDE );
 	}
 
-
 	// loop over all tissues
-	for(ci=0; ci<NUM_COMP; ci++)
+	for( ci = 0; ci < NUM_COMP; ci++ )
 	{
-		overlay float calc_pres_tissue_N2;
-		overlay float calc_pres_tissue_He;
-		overlay float pres_tissue;
 		overlay float pres_min;
 
 		// get the tissue pressures
@@ -2347,9 +2771,8 @@
 		// get the coefficients for tissue ci
 		read_Buhlmann_coefficients();
 
-		// adapt the coefficients according to the N2/He ratio in the tissue
-		var_N2_a = (var_N2_a * calc_pres_tissue_N2 + var_He_a * calc_pres_tissue_He) / pres_tissue;
-		var_N2_b = (var_N2_b * calc_pres_tissue_N2 + var_He_b * calc_pres_tissue_He) / pres_tissue;
+		// adopt a and b coefficients to current N2/He ratio inside the tissue
+		adopt_Buhlmann_coefficients();
 
 		// calculate minimum ambient pressure that the tissue can withstand according to straight Buhlmann
 		pres_min = (pres_tissue - var_N2_a) * var_N2_b;
@@ -2358,10 +2781,10 @@
 		if( tissue_increment & TISSUE_FLAG )
 		{
 			overlay float supersat;
-			overlay float threshold;
-
-			// calculate current supersaturation value (1.0 = 100%) of this tissue
-			supersat = (pres_tissue - pres_respiration) / (pres_tissue - pres_min);
+			overlay float limit_warning;
+
+			// calculate current supersaturation value (1.0 = 100%) of this tissue according to straight Buhlmann
+			supersat = (pres_tissue - real_pres_respiration) / (pres_tissue - pres_min);
 
 			// check if tissue is in supersaturation
 			if( supersat > 0.0 )
@@ -2369,42 +2792,22 @@
 				// memorize highest supersaturation found
 				if( supersat > lead_supersat ) lead_supersat = supersat;
 
-				// set a threshold value for the microbubbles and outside warnings
-				// ToDo: finalize the definition of the threshold
-				threshold = 0.02 * ci + 0.9;
-
-				// check if this tissue is likely to develop microbubbles
-				// and/or if this tissue is outside of the Buhlmann model
-				if( ci <= 5 )
-				{
-					if( supersat >= threshold )
-					{
-						char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock);
-
-						if( supersat >= 1.0 )
-						{
-							char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock);
-						}
-					}
-				}
-				else // ci > 5
-				{
-					if( supersat >= 1.0 )
-					{
-						char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock);
-
-						if( supersat >= threshold )
-						{
-							char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock);
-						}
-					}
-				}
+				// limit value for micro bubbles and outside warnings
+				limit_warning = 0.02 * ci + 0.9;
+
+				// micro bubbles warning: supersaturation >= limit_warning  OR  >= 1.0
+				if( (supersat >= limit_warning) || (supersat >= 1.0) )
+					char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock);
+
+				// outside warning: supersaturation >= limit_warning  AND >= 1.0
+				if( (supersat >= limit_warning) && (supersat >= 1.0) )
+					char_O_deco_warnings |= (DECO_WARNING_OUTSIDE  + DECO_WARNING_OUTSIDE_lock );
 			}
 		}
 
 		// Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected.
-		// Note: the correction factor depends both on GF and b, so that can change who is the
-		//       leading gas...
+		// Note: the correction factor depends both on GF and b, so that can change which is the
+		//       leading tissue...            (this equation [1] is the inverse of equation [2])
 		if( char_I_deco_model != 0 ) pres_min =   ( pres_tissue        - (var_N2_a     * GF_parameter) )
 		                                        / ( 1.0 - GF_parameter + (GF_parameter / var_N2_b    ) );
 
@@ -2412,71 +2815,36 @@
 		if( pres_min > lead_tissue_limit )
 		{
 			lead_tissue_limit = pres_min;
-			lead_tissue_no    = ci;
+			lead_number       = ci;
 		}
 	} // for
 
 
-	// compile outputs
+	// compute ceiling for the real tissues in bar relative pressure
+	ceiling = lead_tissue_limit - pres_surface;
+
+
+	// next in real tissue context only
 	if( tissue_increment & TISSUE_FLAG )
 	{
-		//--- real tissues -----------------------------------------------------
-
-		// check if leading tissue is in IBCD condition
-		if(    (IBCD_tissue_vector & (1 << lead_tissue_no))
-		    && ((pres_tissue_N2[lead_tissue_no] + pres_tissue_He[lead_tissue_no]) > pres_respiration) )
+		// check if the leading tissue is in IBCD condition
+		if(    (IBCD_tissue_vector & (1 << lead_number))
+		    && ((pres_tissue_N2[lead_number] + pres_tissue_He[lead_number]) > real_pres_respiration) )
 		{
-			// leading tissue is in IBCD condition and in super-saturation, so issue a warning.
+			// leading tissue is in IBCD condition and in super-saturation, so issue a warning
 			char_O_deco_warnings |= (DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock);
 		}
-
-
-		// compute ceiling in bar relative pressure
-		ceiling = lead_tissue_limit - pres_surface;
-
-		// convert ceiling to int_O_ceiling in mbar
-		if      ( ceiling <=  0 ) int_O_ceiling = 0;
-		else if ( ceiling >  16 ) int_O_ceiling = 16000;
-	// Compatibility version
-	//	else                      int_O_ceiling = (short)(ceiling * 1000);
-
-	// New version: Rounds up to next 10 cm so that the ceiling disappears on the display only when the
-	// ceiling limit is really zero. This will coincident then with TTS switching back to NDL time.
-		else                      int_O_ceiling = (short)(ceiling * 1000 + 9);
-
-
-		// convert highest supersaturation found to int_O_gradient_factor in % (1.0 = 100%)
-		// limit to 255 because of constraints in ghostwriter code
-		if     ( lead_supersat <= 0.0   ) int_O_gradient_factor = 0;
-		else if( lead_supersat >  2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING;
-		else
-		{
-			int_O_gradient_factor = (unsigned int)(100 * lead_supersat + 0.5);
-
-			if      ( int_O_gradient_factor >= GF_WARNING_THRESHOLD      )
-				int_O_gradient_factor |= INT_FLAG_WARNING;
-
-			else if ( int_O_gradient_factor >= char_I_GF_High_percentage )
-				int_O_gradient_factor |= INT_FLAG_ATTENTION;
-		}
-	}
-	else
-	{
-		//--- simulated tissues ------------------------------------------------
-		
-		// compute ceiling for the simulated tissues in bar relative pressure
-		sim_ceiling = lead_tissue_limit - pres_surface;
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////
 // calc_NDL_time
 //
-// calculates the remaining bottom time
+// calculation of the remaining bottom time (NDL: no decompression limit)
 //
-// NOTE: Erik Baker's closed formula works for Nitroxes. Trimix adds a second
+// NOTE: Erik Baker's closed formula works for Nitrox. Trimix adds a second
 //       exponential term to the M-value equation, making it impossible to
-//       invert... So we have to make a fast-simu until we find a better way.
+//       invert. So we have to solve the problem with an iterative approach.
 //
 // Input:  ppN2
 //         ppHe
@@ -2492,28 +2860,27 @@
 	// initialize NDL_time to 240 minutes
 	NDL_time = 240;
 
-	for(i=0; i<NUM_COMP; i++)
+	for( i = 0; i < NUM_COMP; i++ )
 	{
-		overlay float calc_pres_tissue_N2;
-		overlay float calc_pres_tissue_He;
-		overlay float pres_tissue;
-
-		overlay unsigned char NDL_tissue;
-		overlay unsigned char period = 10;		// start with 10 minute periods
-
-
-		// check lead tissue from last NDL computation first
+		overlay unsigned char period		= 10;		// start with iterations of 10 minutes
+		overlay unsigned char NDL_tissue;				// loop variable
+		overlay float         GF_factor;				// gradient factor to be applied
+		overlay float         next_pres_tissue;			// auxiliary variable to cache a calculation result
+
+
+		// select gradient factor to use
+		GF_factor = (char_I_deco_model != 0) ? GF_high : 1.0;
+
+		// the fastest way to find out if already being beyond NDL is to start with
+		// the tissue that was the leading one during the last NDL computation...
 		ci = i + NDL_lead_tissue;
 
 		// wrap around after the 16th tissue
 		if( ci >= NUM_COMP ) ci -= NUM_COMP;
 
-		// read Buhlmann a and b coefficients for tissue ci
-		read_Buhlmann_coefficients();
-
-		// read the loading factors for 10 minute periods
+		// read the loading factors for 10 minute iterations
 		read_Buhlmann_times(2);
-		
+
 		// get the tissue pressures for N2 and He
 		calc_pres_tissue_N2 = sim_pres_tissue_N2[ci];
 		calc_pres_tissue_He = sim_pres_tissue_He[ci];
@@ -2521,72 +2888,73 @@
 		// calculate the total pressure tissue
 		pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He;
 
-
-		// simulate an increasing bottom time and check when we hit the NDL ------------------------
-		for( NDL_tissue = 0; NDL_tissue < NDL_time; )	// not needed to simulate for longer than the already found NDL
+		// Simulate an increasing bottom time and check when we hit the NDL.
+		// It is not needed to simulate for longer than the already found NDL.
+		for( NDL_tissue = 0; NDL_tissue < NDL_time; )
 		{
-			overlay float var_a;
-			overlay float var_b;
 			overlay float pres_limit;
 			overlay float delta_pres_tissue_N2;
 			overlay float delta_pres_tissue_He;
 
 
+			// read Buhlmann a and b coefficients for tissue ci, they need to be re-read on each
+			// iteration because adopt_Buhlmann_coefficients() twiddles with the N2 coefficients
+			read_Buhlmann_coefficients();
+
 			// adopt a and b coefficients to current N2/He ratio inside the tissue
-			var_a = (var_N2_a * calc_pres_tissue_N2 + var_He_a * calc_pres_tissue_He) / pres_tissue;
-			var_b = (var_N2_b * calc_pres_tissue_N2 + var_He_b * calc_pres_tissue_He) / pres_tissue;
-
-			// compute pressure limit for tissues under surface pressure conditions
-			pres_limit = (var_a + pres_surface / var_b);
-
-			// adopt pressure limit when using the GF extension
-			if (char_I_deco_model != 0 ) pres_limit = GF_high * (pres_limit - pres_surface) + pres_surface;
-
-			//---- Check if this tissue is already beyond the NDL
+			adopt_Buhlmann_coefficients();
+
+			// compute the maximum tissue pressure allowed to be exposed to an ambient pressure equaling
+			// the surface pressure                   (this equation [2] is the inverse of equation [1])
+			pres_limit = (1.0 - GF_factor + GF_factor / var_N2_b) * pres_surface + GF_factor * var_N2_a;
+
+			// check if this tissue is already beyond the NDL
 			if( pres_tissue > pres_limit)
 			{
-				// NO - finish the outer loop,
+				// beyond NDL - finish the outer loop, ...
 				i = NUM_COMP;
 
-				// and finish the inner loop
+				// ... and finish the inner loop
 				break;
 			}
 
-			// compute delta to tissue pressures in 10 or 1 minutes of time ahead
+			// compute tissue pressure deltas for 10 or 1 minute of time ahead
 			delta_pres_tissue_N2 = (ppN2 - calc_pres_tissue_N2) * var_N2_e;
 			delta_pres_tissue_He = (ppHe - calc_pres_tissue_He) * var_He_e;
 
 			// apply safety factors to the pressure deltas
-			// NDL can be computed while ascending, so we have to check if we are saturating or desaturating
+			// NDL can be computed while ascending, so we have to check if the tissues is saturating or desaturating
 			if( delta_pres_tissue_N2 > 0.0 ) delta_pres_tissue_N2 *= float_saturation_multiplier;
 			else                             delta_pres_tissue_N2 *= float_desaturation_multiplier;
 
 			if( delta_pres_tissue_He > 0.0 ) delta_pres_tissue_He *= float_saturation_multiplier;
 			else                             delta_pres_tissue_He *= float_saturation_multiplier;
 
-			// Simulate off-gassing while going to surface
-			// TODO !
+			// simulate off-gassing while going to surface - well, maybe some day we'll do that...
 			// delta_pres_tissue_N2 -= exp( ... ascent time ... ppN2...)
 			// delta_pres_tissue_He -= exp( ... ascent time ... ppHe...)
 
-			// within NDL now, but still within in 10 or 1 minutes from now?
-			if( pres_tissue + delta_pres_tissue_N2 + delta_pres_tissue_He <= pres_limit )
+			// calculate tissue pressure for given time ahead
+			next_pres_tissue = pres_tissue + delta_pres_tissue_N2 + delta_pres_tissue_He;
+
+			// within NDL now, but still within NDL in 10 or 1 minute from now?
+			if( next_pres_tissue <= pres_limit )
 			{
-				// YES - apply the pressure deltas to tissues
+				// YES - apply the pressure deltas to the tissues
 				calc_pres_tissue_N2 += delta_pres_tissue_N2;
 				calc_pres_tissue_He += delta_pres_tissue_He;
-				
+
 				// update the overall tissue pressure
-				pres_tissue = calc_pres_tissue_N2 + calc_pres_tissue_He;
+				pres_tissue = next_pres_tissue;
 
 				// increment the NDL
 				NDL_tissue += period;
 
-				// do next loop
+				// do next iteration
 				continue;
 			}
 
-			// NO - if delta pressures were for 10 minutes of time ahead, try with 1 minute ahead
+			// NO - if delta pressures were for 10 minutes of time ahead, continue with trying for 1 minute ahead
 			if( period == 10 )
 			{
 				// reduce period to 1 minute
@@ -2595,21 +2963,16 @@
 				// read the loading factors for 1 minute periods
 				read_Buhlmann_times(1);
 
-				// do next loop
+				// do next iteration
 				continue;
 			}
 
-			// NO - not even within NDL in just one more minute, so make a linear approx for the last minute
-			// (make a meaningful rounding of NDL, but ONLY if positive: negative casted to unsigned is bad)
-			if( pres_limit > pres_tissue )
-				NDL_tissue += (unsigned char)(0.5 +    (pres_limit           - pres_tissue         )
-			                                  / (delta_pres_tissue_N2 + delta_pres_tissue_He) );
-
-			// finish the inner loop
+			// less than a full minute of NDL time left, so finish the inner loop
 			break;
-		}
-
-		// is the current NDL short than the shortest so far?
+
+		} // inner for-loop simulating increasing bottom time
+
+		// is the current NDL shorter than the shortest so far?
 		if ( NDL_tissue < NDL_time )
 		{
 			// keep the current's tissue NDL as the new shortest NDL
@@ -2619,64 +2982,76 @@
 			new_NDL_lead_tissue = ci;
 		}
 		
-		// if NDL is > 0 the outer loop will continues with the next tissue
-		// if NDL found to be overrun, outer loop will be terminated through i = NUM_COMP statement
-	}
+		// If NDL is > 0 the outer loop will continues with the next tissue.
+		// If NDL found to be overrun, outer loop will be terminated by means of the i = NUM_COMP statement.
+
+	} // outer for-loop iterating over all tissues
 
 	// store the NDL dominating tissue for to start with in the next NDL calculation
 	NDL_lead_tissue = new_NDL_lead_tissue;
 }
 
+
 //////////////////////////////////////////////////////////////////////////////
 // calc_ascenttime
 //
-// Sum up ascent from bottom to surface at float_ascent_speed,
-// but 1 minute per meter for the final ascent, and all stops.
+// Sum up ascent from bottom to surface at float_ascent_speed, slowing down to
+// 1 minute per meter for the final ascent when in deco, and all stop times.
 //
 // Input:  char_I_depth_last_deco
-//         pres_respiration
-//         pres_surface
-//         float_ascent_speed
+//         char_I_ascent_speed
+//         char_bottom_depth
 //         internal_deco_depth[]
+//         internal_deco_time[]
 //
 // Output: ascent_time
 //
 static void calc_ascenttime(void)
 {
-	overlay unsigned char x;
-
-
-	// preset final ascent
-	overlay float final  = (float)char_I_depth_last_deco;
-
-	// calculate depth
-	overlay float ascent = (pres_respiration - pres_surface) * BAR_TO_METER;
-
-	// check if we are already in final ascent
-	if (ascent <= final)
+	overlay unsigned char x;		// loop counter
+	overlay unsigned char ascent;	// meters to go from bottom to last stop
+	overlay unsigned char final;	// meters to go from last stop to surface
+
+
+	// check if there are stops
+	if( internal_deco_depth[0] )
 	{
-		// yes - all ascent is final ascent
-		final  = ascent;
-		ascent = 0.0;
+		// stops / in deco
+
+		// check if already at last stop depth or shallower
+		if( char_bottom_depth <= char_I_depth_last_deco)
+		{
+			// YES
+			ascent = 0;
+			final  = char_bottom_depth;
+		}
+		else
+		{
+			// NO
+			ascent = char_bottom_depth - char_I_depth_last_deco;
+			final  = char_I_depth_last_deco;
+		}
 	}
 	else
 	{
-		// no - subtract final ascent part from overall ascent
-		ascent -= final;
-
-		// compute time for ascent part without final ascent
-		ascent /= float_ascent_speed;
+		// no stops / within NDL
+		ascent = char_bottom_depth;
+		final  = 0;
 	}
 
-	// add 1 minute for each meter of final ascent
-	ascent += final;
-
-	// convert to integer
-	ascent_time = (unsigned short)(ascent + 0.5);
+
+	// initialize ascent time
+	ascent_time = 0;
+
+	// time for the ascent part (bottom to last stop), if existing
+	if( ascent ) ascent_time += ascent / char_I_ascent_speed + 1;
+
+	// add time for the final ascent (last stop to surface) at 1 min/m
+	ascent_time += final;
 
 	// add all stop times
-	for(x=0; x<NUM_STOPS && internal_deco_depth[x]; x++)
-		ascent_time += (unsigned short)internal_deco_time[x];
+	for( x=0; x < NUM_STOPS && internal_deco_depth[x]; x++ )
+		ascent_time += internal_deco_time[x];
 
 	// limit result to display max.
 	if( ascent_time > 999) ascent_time = 999;
@@ -2694,11 +3069,11 @@
 {
 	overlay unsigned char x;
 
-	for(x=0; x<NUM_STOPS; ++x)
+	for( x = 0; x < NUM_STOPS; ++x )
 	{
 		internal_deco_time [x] = 0;
 		internal_deco_depth[x] = 0;
-        internal_deco_gas[x]   = 0;
+		internal_deco_gas[x]   = 0;
 	}
 
 	// clear stop table overflow warning
@@ -2712,11 +3087,11 @@
 //
 // It is possible to create stops with a duration of 0 minutes, e.g. to
 // note a gas change "on the fly" while ascending. Therefore the criteria
-// to have reached the end of the list needs always to be depth == 0.
+// to have reached the end of the list is depth == 0.
 //
-// Input:   sim_depth_limit  : stop's depth, in meters.
-//          sim_gas_last_used : gas used at stop, as index 1..5 or 0 for gas 6
-//          PARAMETER time_increment    : number of minutes to add to the stop
+// Input:   sim_depth_limit       : stop's depth, in meters
+//          sim_gas_current       : gas used at stop, as index 1..5 or 0 for gas 6
+//          time_increment        : number of minutes to add to the stop
 //
 // Updated: internal_deco_depth[] : depth    (in meters)  of each stop
 //          internal_deco_time [] : time     (in minutes) of each stop
@@ -2726,26 +3101,25 @@
 {
 	overlay unsigned char x;
 
-	assert( sim_depth_limit > 0 );		// No stop at surface...
+	assert( sim_depth_limit > 0 );		// no stop at surface
 
 	// loop through internal deco table
-	for(x=0; x<NUM_STOPS; ++x)
+	for( x = 0; x < NUM_STOPS; ++x )
 	{
-                // In case the first deco stop is to be placed deeper than previously recorded
-        // stops for gas changes during the initial ascent (this may happen because the
-        // deco stops are placed at the next deeper multiple of 3 meters instead of the
-        // real stop's depth), relocate the deco stop to the depth of the last gas change.
-        // The resulting combined stop's duration will be the sum of the configured gas
-        // change time plus the duration of the deco stop itself.
-        if( internal_deco_depth[x] && (sim_depth_limit > internal_deco_depth[x]) )
-            sim_depth_limit = internal_deco_depth[x]; 
-        
+		// In case the first deco stop is to be placed deeper than previously recorded
+		// stops for gas changes during the initial ascent (this may happen because the
+		// deco stops are placed at the next deeper multiple of 3 meters instead of the
+		// real stop's depth), relocate the deco stop to the depth of the last gas change.
+		// The resulting combined stop's duration will be the sum of the configured gas
+		// change time plus the duration of the deco stop itself.
+		if( internal_deco_depth[x] && (sim_depth_limit > internal_deco_depth[x]) )
+			sim_depth_limit = internal_deco_depth[x];
+
 		// Is there already a stop entry for our current depth?
 		if( internal_deco_depth[x] == sim_depth_limit )
 		{
 			// Yes - increment stop time if possible
 			// Stop time entries are limited to 99 minutes because of display constraints.
-			// Else a limit of 254 would account because of constrains in calc_CNS_planning().
 			if( internal_deco_time[x] < (100 - time_increment) )
 			{
 				internal_deco_time[x] += time_increment;	// increment stop time
@@ -2760,7 +3134,7 @@
 		{
 			internal_deco_time[x]  = time_increment;		// initialize entry with first stop's time,
 			internal_deco_depth[x] = sim_depth_limit;		// ... depth, and
-			internal_deco_gas[x]   = sim_gas_last_used;		// ... gas
+			internal_deco_gas[x]   = sim_gas_current;		// ... gas
 			return 1;										// return with status 'success'
 		}
 	}
@@ -2778,16 +3152,13 @@
 //////////////////////////////////////////////////////////////////////////////
 // calc_desaturation_time
 //
-// Inputs:  int_I_pres_surface, ppWater, char_I_desaturation_multiplier
-// Outputs: int_O_desaturation_time, int_O_nofly_time
-//
 // Helper function
 //
-void calc_desaturation_time_helper(void)
+static void calc_desaturation_time_helper(void)
 {
 	if( pres_actual > pres_target )		// check if actual pressure is higher then target pressure
 	{									// YES - compute remaining time
-		overlay	float pres_ratio;
+		overlay float pres_ratio;
 
 		pres_ratio = pres_actual / pres_target;
 
@@ -2795,7 +3166,7 @@
 		// Main purpose is to avoid confusion, because the times do not clock down in
 		// one minute steps any more but get constantly re-computed according to current
 		// ambient pressure and may therefor make steps of several minutes forwards and
-		// backwards as ambient pressure rises and falls.
+		// backwards as ambient pressure rises/falls and N2/He ratio is being adjusted.
 		int_time = (unsigned int)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 );
 	}
 	else
@@ -2805,22 +3176,31 @@
 }
 
 /////////////////////////////////////////////////////////////////////////////
-// Main function
+// calc_desaturation_time
+//
+// Inputs:  int_I_pres_surface, ppWater, char_I_desaturation_multiplier
+// Outputs: int_O_desaturation_time, int_O_nofly_time
+//
+// Calculate the time needed for the tissues to equilibrate with surface pressure
 //
 void calc_desaturation_time(void)
 {
-	assert( 800 < int_I_pres_surface             && int_I_pres_surface             < 1100 );
-	assert( 0   < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 );
+	assert( 800 < int_I_pres_surface             && int_I_pres_surface             <  1100 );
+	assert( 0   < char_I_desaturation_multiplier && char_I_desaturation_multiplier <=  100 );
+
+
+	// safety limit to prevent eventual infinite looping (bricking the OSTC)
+	if( int_I_pres_surface < 500) int_I_pres_surface = 500;
 
 	// fraction of inert gases in respired air
-	N2_ratio       = 0.7902;
-	He_ratio       = 0.0;
+	real_N2_ratio  = 0.7902;
+	real_He_ratio  = 0.0;
 
 	// surface pressure in bar
 	pres_surface   = 0.001    * int_I_pres_surface;
 
 	// partial pressure of N2 in respired air
-	N2_equilibrium = N2_ratio * (pres_surface - ppWater);
+	N2_equilibrium = real_N2_ratio * (pres_surface - ppWater);
 
 	// pre-computed term for later use: 10 [Min] * 0.01 [%] * 0.6931 [=log(2)] * ...
 	desat_factor   = 0.06931  * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR;
@@ -2830,7 +3210,7 @@
 	int_O_nofly_time        = 0;
 
 
-	for(ci=NUM_COMP; ci>0;)
+	for( ci = NUM_COMP; ci > 0; )
 	{
 		overlay float        pres_tissue_max;
 		overlay float        P_ambient_altitude;
@@ -2872,9 +3252,9 @@
 
 		// N2: actual amount of tissue pressure above equilibrium.
 		pres_actual = pres_tissue_N2[ci] - N2_equilibrium;
-		
+
 		// N2: half-time of the current tissue
-		var_ht      = var_N2_ht;
+		var_ht = var_N2_ht;
 
 		// Calculate desaturation time for N2 in tissue.
 		// Desaturated state is defined as residual tissue pressure <= 1.05 x ppN2 respired
@@ -2906,6 +3286,9 @@
 		// no-fly time
 		//
 
+		// initialize split_N2_He in case there was a hard reboot / memory clear.
+		if( split_N2_He[ci] == 0 ) split_N2_He[ci] = 90;
+
 		// initialize search direction
 		search_direction = 0;
 
@@ -2915,7 +3298,7 @@
 			pres_actual = pres_tissue_N2[ci] - N2_equilibrium;
 
 			// N2: half-time of the current tissue
-			var_ht      = var_N2_ht;
+			var_ht = var_N2_ht;
 
 			// Calculate no-fly time for N2 in the tissue.
 			// Flying is permitted when the N2 pressure fits into the assigned fraction above equilibrium.
@@ -2927,7 +3310,7 @@
 				int_O_nofly_time = 288;					// NO  - set no-fly time to 288 * 10 min = 48 h
 				break;									// done for this compartment
 			}
-			else 
+			else
 			{
 				calc_desaturation_time_helper();
 				nofly_N2 = int_time;
@@ -2966,7 +3349,7 @@
 				// check if the search direction has changed, which means we are beyond the
 				// optimum now, or if we are at the upper stop limit of split_N2_He
 				if( (search_direction < 0) || (split_N2_He[ci] == 99) )
-				{	
+				{
 					// Either the just completed iteration was more close to the optimum or the one before
 					// was, so we take the best (i.e. shortest) time of both as the final no-fly time.
 					int_O_nofly_time = (nofly_N2 < nofly_last) ? nofly_N2 : nofly_last;
@@ -2997,7 +3380,7 @@
 
 				// decrease the N2 fraction of the split and set search direction towards less N2
 				split_N2_He[ci]  -=  1;
-				search_direction  = -1;	
+				search_direction  = -1;
 			}
 
 		} // for(;;)
@@ -3015,17 +3398,19 @@
 	if( int_O_nofly_time        > 5999 ) int_O_nofly_time        = 5999;
 
 
-	// Clear the microbubbles warning when the current gradient factor is < GF_WARNING_THRESHOLD.
-	// As the locked warning will stay set, this will cause the warning be be displayed in attention
-	// color instead of warning color.
-	if( int_O_gradient_factor < GF_WARNING_THRESHOLD )
+	// Clear the microbubbles warning when the current gradient factor is < 100%.
+	// The current gradient factor is calculated by calc_interval() while not in diving mode.
+	// As the locked warning will stay set, this will cause the warning be be displayed in
+	// attention color instead of warning color.
+	if( int_O_gradient_factor < 100 )
 		char_O_deco_warnings &= ~DECO_WARNING_MBUBBLES;
 
 	// clear some warnings when the desaturation time has become zero
 	if( int_O_desaturation_time == 0 )
-		char_O_deco_warnings &= ~(   DECO_WARNING_IBCD     + DECO_WARNING_IBCD_lock
-		                           + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock
-		                           + DECO_WARNING_OUTSIDE  + DECO_WARNING_OUTSIDE_lock  );
+	    char_O_deco_warnings &= ~(   DECO_WARNING_IBCD     + DECO_WARNING_IBCD_lock
+	                               + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock
+	                               + DECO_WARNING_OUTSIDE  + DECO_WARNING_OUTSIDE_lock
+	                               + DECO_ATTENTION_OUTSIDE                             );
 
 }
 
@@ -3039,26 +3424,30 @@
 // Input:    int_I_pres_surface : surface pressure in mbar
 //           time_interval      : time interval in minutes, must be limited to 254 at max
 //
-// Modified: tissue pressures
-//           CNS value
-//           ceiling and current GF
+// Modified: tissue pressures   : N2 and He pressures of the tissues
+//           CNS_fraction       : current CNS value
+//           ceiling            : minimum allowed depth in mbar relative pressure
+//           lead_supersat      : supersaturation of the leading tissue
+//           int_O_gradient_factor : current GF factor
 //
 static void calc_interval(PARAMETER unsigned char time_interval)
 {
 	overlay unsigned char time;
 
-
 	assert( 800 <  int_I_pres_surface             && int_I_pres_surface             <  1100 );
-	assert( 100 <= char_I_saturation_multiplier   && char_I_saturation_multiplier   <  200  );
-	assert( 0   <  char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100  );
-
+	assert( 100 <= char_I_saturation_multiplier   && char_I_saturation_multiplier   <   200 );
+	assert(   0 <  char_I_desaturation_multiplier && char_I_desaturation_multiplier <=  100 );
+
+
+	// safety limit to prevent eventual infinite looping (bricking the OSTC)
+	if( int_I_pres_surface < 500) int_I_pres_surface = 500;		// min. surface pressure = 500 mbar
 
 	// setup input data for deco routines
-	pres_respiration = pres_surface = 0.001 * int_I_pres_surface ;
-
-	N2_ratio       = 0.7902;									// according to Buhlmann
-	N2_equilibrium = N2_ratio * (pres_surface     - ppWater);	// used for N2 tissue graphics scaling
-	ppN2           = N2_ratio * (pres_respiration - ppWater);
+	real_pres_respiration = pres_surface = 0.001 * int_I_pres_surface;
+
+	real_N2_ratio  = 0.7902;											// according to Buhlmann
+	N2_equilibrium = real_N2_ratio * (pres_surface          - ppWater);	// used for N2 tissue graphics scaling
+	ppN2           = real_N2_ratio * (real_pres_respiration - ppWater);
 	ppHe           = 0.0;
 
 	float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR;
@@ -3075,7 +3464,7 @@
 	if( time > 127)
 	{
 		// do a full 127 minutes on the real tissues
-		tissue_increment = 127 | TISSUE_FLAG;
+		tissue_increment = TISSUE_FLAG | 127;
 		calc_tissues();
 
 		// determine the remaining part
@@ -3083,9 +3472,9 @@
 	}
 
 	// program the remaining part (or full part if not exceeding 127 minutes)
-	tissue_increment = time | TISSUE_FLAG;
-
-	// update the N2 and He pressures in the tissues for the remaining part of the time interval
+	tissue_increment = TISSUE_FLAG | time;
+
+	// update the N2 and He pressures in the tissues
 	calc_tissues();
 
 
@@ -3095,7 +3484,7 @@
 
 	time = time_interval;
 
-	while ( time )
+	while( time )
 	{
 		if( time > 9 )
 		{
@@ -3112,32 +3501,37 @@
 	// compute integer copy of CNS value
 	convert_CNS_for_display();
 
-
-	// calculate ceiling (for a GF high of 100%) and gradient factor
+	// calculate GF value (for a GF high of 100%)
 	calc_limit(1.0);
+
+	// compute integer copy of GF value
+	convert_GF_for_display();
 }
 
 
 //////////////////////////////////////////////////////////////////////////////
-// calc_CNS_increment
+// calc_CNS
 //
-// Input:  char_ppO2        : current ppO2 [decibars]
-//         tissue_increment : time increment and tissue selector
+// Input:    char_ppO2        : current ppO2 [decibars]
+//           tissue_increment : time increment and tissue selector
 //
-// Output: CNS_fraction_inc : increment of the CNS value
+// Modified:     CNS_fraction   accumulated CNS (real      tissue context)
+//           sim_CNS_fraction : accumulated CNS (simulated tissue context)
 //
-void calc_CNS_increment(void)
+static void calc_CNS(void)
 {
-	overlay float time_factor = 1.0;	// default is 2sec
+	overlay float CNS_fraction_inc;			// increment of CNS load, 0.01 = 1%
+	overlay float time_factor;				// factor for time increment
 
 	assert( char_ppO2 > 15 );
 
-	// adjust time factor if minute-based stepping is commanded, mask out flag bit
-	if( tissue_increment & TIME_MASK ) time_factor = 30.0 * (float)(tissue_increment & TIME_MASK);
+	// adjust time factor to 2 seconds (factor = 1.0) or minute-based interval (factor = N * 30.0)
+	if( tissue_increment & TIME_MASK ) time_factor = (float)(tissue_increment & TIME_MASK) * 30.0;
+	else                               time_factor =                                          1.0;
 
 	//------------------------------------------------------------------------
-	// Don't increase CNS below 0.5 bar, but keep it steady.
-	if      (char_ppO2 <  50) CNS_fraction_inc = 0.0;		// no CNS increase below 0.5 bar ppO2
+	// No CNS increase below 0.5 bar ppO2
+	     if (char_ppO2 <  50) CNS_fraction_inc = 0.0;
 	//------------------------------------------------------------------------
 	// Below (and including) 1.60 bar
 	else if (char_ppO2 <  61) CNS_fraction_inc = time_factor/(-533.07 * char_ppO2 + 54000.0);
@@ -3152,178 +3546,19 @@
 	// J Appl Physiol 92: 248--256, 2002, doi:10.1152/japplphysiol.00434.2001
 	// Formula (A1) based on value for 1.55 and c=20
 	// example calculation: Sqrt((1.7/1.55)^20)*0.000404
-	else if (char_ppO2 < 172) CNS_fraction_inc = time_factor*0.00102;
-	else if (char_ppO2 < 177) CNS_fraction_inc = time_factor*0.00136;
-	else if (char_ppO2 < 182) CNS_fraction_inc = time_factor*0.00180;
-	else if (char_ppO2 < 187) CNS_fraction_inc = time_factor*0.00237;
-	else if (char_ppO2 < 192) CNS_fraction_inc = time_factor*0.00310;
-	else if (char_ppO2 < 198) CNS_fraction_inc = time_factor*0.00401;
-	else if (char_ppO2 < 203) CNS_fraction_inc = time_factor*0.00517;
-	else if (char_ppO2 < 233) CNS_fraction_inc = time_factor*0.0209;
-	else                      CNS_fraction_inc = time_factor*0.0482; // value for 2.5 bar, used for 2.33 bar and above
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// calc_CNS_planning
-//
-// Compute CNS increase during predicted ascent
-//
-// Input:   internal_deco_time[], internal_deco_depth[], internal_deco_gas[]
-// Output:  sim_CNS_fraction
-//
-void calc_CNS_planning(void)
-{
-	// null sim_CNS_fraction
-	sim_CNS_fraction = 0.0;
-
-	//---- CCR mode : do the full TTS at once ---------------------------------
-
-	if( ((char_O_deco_status & DECO_MODE_MASK) == DECO_MODE_CCR) )
-	{
-		overlay unsigned short t;						// needs 16 bits here !
-
-		// get current ppO2 from sensors or setpoint
-		char_ppO2 = char_I_const_ppO2;
-
-		// calculate CNS% for the period of additional staying at bottom depth (fTTS / delayed ascent)
-		if( char_O_deco_status & DECO_ASCENT_DELAYED)
-		{
-			tissue_increment = char_I_extra_time;		// must be limited to 127, is limited by range of char_I_extra_time
-			calc_CNS_increment();						// calculate the CNS increment
-			sim_CNS_fraction += CNS_fraction_inc;		// sum up
-		}
-
-		// get the ascent time dependent on the current plan +++
-		t = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? int_O_alternate_ascenttime : int_O_ascenttime;
-
-		// start simulating CNS% in chunks of 127 minutes
-		tissue_increment = 127;
-
-		while( t > 127 )
-		{
-			t -= 127;									// tissue_increment is limited to 127 minutes because of flag in bit 7
-			calc_CNS_increment();						// calculate CNS in chunks of full 127 minutes
-			sim_CNS_fraction += CNS_fraction_inc;		// sum up
-		}
-
-		tissue_increment = (char)t;						// get the remaining minutes <= 127
-		calc_CNS_increment();							// calculate CNS for the remaining minutes
-		sim_CNS_fraction += CNS_fraction_inc;			// sum up
-	}
-	else //---- OC mode and pSCR without sensors: have to follow all gas switches... -----
-	{
-		overlay float float_actual_ppO2;
-		overlay float abs_pres;
-
-		overlay unsigned char stop_depth;
-		overlay unsigned char last_gas;
-		overlay unsigned char i;						// stop table index
-
-
-		// retrieve bottom gas: 1-5 for the configured gases or 0 for the manually set gas
-		last_gas = sim_gas_last_used = sim_gas_first_used;
-
-		// get the calc_N2/He/O2_ratios of the bottom gas
-		gas_set_ratios();
-
-		// calculate absolute pressure
-		abs_pres = pres_surface + bottom_depth * METER_TO_BAR;
-
-		// calculate OC ppO2 (ppWater omitted here on purpose)
-		float_actual_ppO2 = abs_pres * sim_O2_ratio;
-
-		// correct ppO2 in case of pSCR mode by drop
-		if( char_O_deco_status & DECO_MODE_PSCR ) float_actual_ppO2 -= sim_pSCR_drop;
-
-		// convert ppO2 from float to char
-		if      ( float_actual_ppO2 < 0.0   ) char_ppO2 =   0;
-		else if ( float_actual_ppO2 > 2.545 ) char_ppO2 = 255;
-		else                                  char_ppO2 = (unsigned char)(100 * float_actual_ppO2 + 0.5);
-
-
-		// simulate extended bottom time (fTTS) / delay before ascent (bailout) if configured
-		if( char_O_deco_status & DECO_ASCENT_DELAYED )
-		{
-			tissue_increment  = char_I_extra_time;	// must be limited to 127, is limited by range of char_I_extra_time
-			calc_CNS_increment();					// calculate the CNS increment
-			sim_CNS_fraction += CNS_fraction_inc;	// sum up
-		}
-
-
-		// For simplicity reason (non-linearity of the relation between ppO2 and CNS increments), the
-		// whole ascent is calculated with bottom ppO2. This errs, but it does so to the safe side.
-
-		// calculate ascent time (integer division and generous round-up)
-		tissue_increment = bottom_depth / char_I_ascent_speed + 1;
-
-		// ** commented out - not needed when char_I_ascent_speed is limited to a minimum
-		// **                 of 2.something, it is indeed limited to a minimum of 5.
-		//
-		// // limit tissue_increment to 127 minutes
-		// if( tissue_increment > 127 ) tissue_increment = 127;
-
-		// simulate the CNS increase
-		calc_CNS_increment();						// calculate the CNS increment
-		sim_CNS_fraction += CNS_fraction_inc;		// sum up
-
-
-		//---- Stops ---------------------------------------------------------
-		
-		for(i=0; i<NUM_STOPS; ++i)
-		{
-			// get the depth of the stop
-			stop_depth = internal_deco_depth[i];
-
-			// did we reach the last entry (depth = 0)? if yes, done
-			if (stop_depth == 0) break;
-
-			// get the duration of the stop and the gas breathed
-			tissue_increment  = internal_deco_time[i];
-			sim_gas_last_used = internal_deco_gas[i];
-
-			// do we have a gas switch?
-			if( sim_gas_last_used != last_gas )
-			{
-				// yes - get new calculation ratios
-				gas_set_ratios();
-
-				// remember new gas as last gas
-				last_gas = sim_gas_last_used;
-			}
-
-			// calculate absolute pressure at stop depth
-			abs_pres = pres_surface + stop_depth * METER_TO_BAR;
-
-			// calculate OC ppO2 (ppWater omitted here on purpose)
-			float_actual_ppO2 = abs_pres * sim_O2_ratio;
-
-			// correct ppO2 in case of pSCR mode by drop
-			if( char_O_deco_status & DECO_MODE_PSCR ) float_actual_ppO2 -= sim_pSCR_drop;
-
-			// convert ppO2 from float to char
-			if      ( float_actual_ppO2 < 0.0   ) char_ppO2 =   0;
-			else if ( float_actual_ppO2 > 2.545 ) char_ppO2 = 255;
-			else                                  char_ppO2 = (unsigned char)(100 * float_actual_ppO2 + 0.5);
-
-			// ** Currently, stop times per stop entry are limited to 99 minutes in update_deco_table(),
-			// ** so the following code block is not needed at times.
-			//
-			// // tissue_increment is limited to 127 when fed to calc_CNS_increment(),
-			// // so if the stop is longer than 127 minutes (but not longer than 254 minutes!)
-			// // we need to calculate the CNS in two chunks.
-			// if( tissue_increment > 127)
-			// {
-			//		tissue_increment -= 127;				// subtract full 127 minutes and do the "remaining" minutes first
-			//		calc_CNS_increment();					// calculate the CNS increment
-			//		sim_CNS_fraction += CNS_fraction_inc;	// sum up
-			//		tissue_increment  = 127;				// catch up with the previously subtracted full 127 minutes
-			// }
-
-			// calculate CNS% for the stop
-			calc_CNS_increment();					// calculate the CNS increment
-			sim_CNS_fraction += CNS_fraction_inc;	// sum up
-		}
-	}
+	else if (char_ppO2 < 172) CNS_fraction_inc = time_factor * 0.00102;
+	else if (char_ppO2 < 177) CNS_fraction_inc = time_factor * 0.00136;
+	else if (char_ppO2 < 182) CNS_fraction_inc = time_factor * 0.00180;
+	else if (char_ppO2 < 187) CNS_fraction_inc = time_factor * 0.00237;
+	else if (char_ppO2 < 192) CNS_fraction_inc = time_factor * 0.00310;
+	else if (char_ppO2 < 198) CNS_fraction_inc = time_factor * 0.00401;
+	else if (char_ppO2 < 203) CNS_fraction_inc = time_factor * 0.00517;
+	else if (char_ppO2 < 233) CNS_fraction_inc = time_factor * 0.02090;
+	else                      CNS_fraction_inc = time_factor * 0.04820; // value for 2.5 bar, used for 2.33 bar and above
+
+	// update the CNS accumulator
+	if( tissue_increment & TISSUE_FLAG )     CNS_fraction += CNS_fraction_inc;	// real tissues
+	else                                 sim_CNS_fraction += CNS_fraction_inc;	// simulated tissues
 }
 
 
@@ -3332,37 +3567,71 @@
 //
 // calculates volumes and required tank fill pressures for each gas.
 //
-// Input:	bottom_depth			depth of the bottom segment
+// Input:	char_bottom_depth		depth of the bottom segment
 //			char_I_bottom_time		duration of the bottom segment
 //			char_I_extra_time		extra bottom time for fTTS / delayed ascent
 //			float_ascent_speed		ascent speed, in meters/minute
-//			sim_gas_first_used		the bottom gas (1-5 for configured gases, 0 for the manual gas)
 //			internal_deco_depth[]	depth of the stops
 //			internal_deco_time[]	duration of the stops
 //			internal_deco_gas[]		gas breathed at the stops
+//			NDL_time				remaining NDL time, used to adjust speed of final ascent
 //			char_I_bottom_usage		gas consumption during bottom part and initial ascent, in liters/minute
 //			char_I_deco_usage		gas consumption during stops and following ascents, in liters/minute
 //			char_I_tank_size[]		size of the tanks for gas 1-5, in liters
 //			char_I_tank_pres_fill[]	fill pressure of the tanks
 //
-// Output:	int_O_gas_volumes[]		amount of gas needed, in liters
-//			int_O_tank_pres_need[]	in bar, + flags for fast evaluation by dive mode warnings:
+// Output:	int_O_ascent_volumes[]	 amount of gas needed, in liters
+//			int_O_ascent_pres_need[] in bar, + flags for fast evaluation by dive mode warnings:
 //											  2^15: pres_need >= pres_fill
 //											  2^14: pres_need >= press_fill * GAS_NEEDS_ATTENTION_THRESHOLD
 //											  2^11: pres_need == 0
-//											  2^10: pres_need invalid
+//											  2^10: pres_need is invalid
 //
-void gas_volumes_helper(void)
+static void gas_volumes_helper_1(void)
 {
 	// Calculate the gas volume needed at a given depth, time and usage (SAC rate).
 	// We use 1.0 for the surface pressure to have stable results when used through
 	// the deco calculator (simulation mode).
-	volume = (float_depth * METER_TO_BAR + 1.0) * float_time * usage;
+	volume = (float_depth * METER_TO_BAR + 1.0) * float_time * char_usage;
 
 	return;
 }
 
-void gas_volumes(void)
+static void gas_volume_helper_2(void)
+{
+	// Convert a gas volume in liters given as a float into an integer number
+	// and computes the equivalent tank pressure in bar, including all flags.
+
+	if( volume >= 65534.5 )
+	{
+		int_volume    = 65535;
+		int_pres_need = 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill
+	}
+	else
+	{
+		overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[gas_num];
+
+		// No distinct rounding done here because volumes are not accurate to the single liter anyhow
+
+		// convert gas volumes to integers
+		int_volume    = (unsigned short)volume;
+
+		// compute how much pressure in the tank will be needed [in bar]  (integer-division)
+		int_pres_need = (unsigned short)(int_volume / char_I_tank_size[gas_num]);
+
+		// limit to 999 bar because of display constraints
+		if( int_pres_need > 999 ) int_pres_need = 999;
+
+		// set flags for fast evaluation by divemode check_for_warnings
+		if     ( int_pres_need ==                                              0 ) int_pres_need |= INT_FLAG_ZERO;
+		else if( int_pres_need >=                                 tank_pres_fill ) int_pres_need |= INT_FLAG_WARNING;
+		else if( int_pres_need >= GAS_NEEDS_ATTENTION_THRESHOLD * tank_pres_fill ) int_pres_need |= INT_FLAG_ATTENTION;
+	}
+
+	return;
+}
+
+static void gas_volumes(void)
 {
 	overlay float volumes[NUM_GAS];
 
@@ -3373,11 +3642,10 @@
 	overlay unsigned char stop_depth_last;
 	overlay unsigned char i;
 
-
 	//---- initialization ----------------------------------------------------
 
 	// null the volume accumulators
-	for(i=0; i<NUM_GAS; ++i) volumes[i] = 0.0;
+	for( gas_num = 0; gas_num < NUM_GAS; ++gas_num ) volumes[gas_num] = 0.0;
 
 	// quit for CCR and pSCR mode
 	if( char_O_deco_status & DECO_MODE_LOOP ) goto done;
@@ -3385,22 +3653,23 @@
 
 	//---- bottom demand -----------------------------------------------------
 
-	// sim_gas_first_used : gas used during bottom segment (0, 1-5)
-	// bottom_depth: depth of the bottom segment
-
-	assert(0 <= sim_gas_first_used && sim_gas_first_used <= NUM_GAS);
+	// sim_gas_current  : gas used during bottom segment (0, 1-5)
+	// char_bottom_depth: depth of the bottom segment
 
 	// get the gas used during bottom segment
-	stop_gas_last = stop_gas = sim_gas_first_used;
+	gas_find_current();
+
+	// initialize variables
+	stop_gas_last = stop_gas = sim_gas_current;
 
 	// set the usage (SAC rate) to bottom usage rate for bottom part and initial ascent
-	usage = char_I_bottom_usage;
+	char_usage = char_I_bottom_usage;
 
 	// volumes are only calculated for gases 1-5, but not the manually configured one
 	if( stop_gas )
 	{
 		// set the bottom depth
-		float_depth = (float)bottom_depth;
+		float_depth = (float)char_bottom_depth;
 
 		// calculate either bottom segment or just the fTTS/bailout delayed part
 		if( char_O_main_status & DECO_BOTTOM_CALCULATE )
@@ -3415,7 +3684,7 @@
 		}
 
 		// calculate gas demand
-		gas_volumes_helper();
+		gas_volumes_helper_1();
 
 		// take result
 		volumes[stop_gas-1] = volume;
@@ -3427,10 +3696,10 @@
 	//---- initial ascent demand ---------------------------------------------
 
 	// stop_gas                : gas from bottom segment
-	// bottom_depth            : depth of the bottom segment
+	// char_bottom_depth       : depth of the bottom segment
 	// internal_deco_depth[i=0]: depth of the first stop, may be 0 if no stop exists
 
-	// get the data of the first stop	
+	// get the data of the first stop
 	stop_depth = internal_deco_depth[i];
 	stop_time  = internal_deco_time[i];
 
@@ -3438,7 +3707,7 @@
 	if( stop_gas )
 	{
 		// compute distance between bottom and first stop
-		float_depth = (float)bottom_depth - (float)stop_depth;
+		float_depth = (float)(char_bottom_depth - stop_depth);
 
 		// initial ascent exists only if ascent distance is > 0
 		if( float_depth > 0.0 )
@@ -3447,10 +3716,10 @@
 			float_time = float_depth / float_ascent_speed;
 
 			// compute average depth between bottom and first stop
-			float_depth = (float)bottom_depth - float_depth * 0.5;
+			float_depth = (float)char_bottom_depth - float_depth * 0.5;
 
 			// calculate gas demand
-			gas_volumes_helper();
+			gas_volumes_helper_1();
 
 			// add result
 			volumes[stop_gas-1] += volume;
@@ -3459,7 +3728,7 @@
 
 	// switch the usage (SAC rate) to deco usage rate
 	// for stops, intermediate and final ascent
-	usage = char_I_deco_usage;
+	char_usage = char_I_deco_usage;
 
 	// is there a (first) stop? if yes, goto stops processing
 	if( stop_depth ) goto stops;
@@ -3469,7 +3738,7 @@
 	float_depth = 5.0;
 
 	// calculate gas demand
-	gas_volumes_helper();
+	gas_volumes_helper_1();
 
 	// add result
 	volumes[stop_gas-1] += volume;
@@ -3526,7 +3795,7 @@
 		float_depth = (float)stop_depth_last - float_depth * 0.5;
 
 		// calculate gas demand
-		gas_volumes_helper();
+		gas_volumes_helper_1();
 
 		// add result
 		volumes[stop_gas_last-1] += volume;
@@ -3541,18 +3810,18 @@
 
 	// get the next gas
 	stop_gas = internal_deco_gas[i];
-    
-    // in case of end-of-table, keep the last gas
-    if( !stop_gas ) stop_gas = stop_gas_last;
-    
-	// do we we have a gas change?
+
+	// in case of end-of-table, keep the last gas
+	if( !stop_gas ) stop_gas = stop_gas_last;
+
+	// do we have a gas change?
 	if( stop_gas_last && (stop_gas != stop_gas_last) )
 	{
 		// yes - spend an additional char_I_gas_change_time on the old gas
 		float_time = (float)char_I_gas_change_time;
 
 		// calculate gas demand
-		gas_volumes_helper();
+		gas_volumes_helper_1();
 
 		// add result
 		volumes[stop_gas_last-1] += volume;
@@ -3565,7 +3834,7 @@
 		float_time = (float)stop_time;
 
 		// calculate gas demand
-		gas_volumes_helper();
+		gas_volumes_helper_1();
 
 		// add result to last gas
 		volumes[stop_gas-1] += volume;
@@ -3581,17 +3850,26 @@
 	// float_depth: depth of last stop
 	// stop_gas   : gas from last stop (0 or 1-5)
 
-	// volumes are only calculated for gases 1-5, but not the manually configured one	
+	// volumes are only calculated for gases 1-5, but not the manually configured one
 	if( stop_gas )
 	{
-		// set ascent time according to an ascent speed of 1 meter per minute
-		float_time = float_depth;
+		// set ascent time dependent on deco status
+		if( NDL_time )
+		{
+			// within NDL - ascent with float_ascent_speed
+			float_time = float_depth / float_ascent_speed;
+		}
+		else
+		{
+			// in deco - reduce ascent speed to 1 meter per minute
+			float_time = float_depth;
+		}
 
 		// set half-way depth
 		float_depth *= 0.5;
 
 		// calculate gas demand
-		gas_volumes_helper();
+		gas_volumes_helper_1();
 
 		// add result
 		volumes[stop_gas-1] += volume;
@@ -3601,89 +3879,155 @@
 	//---- convert results for the assembler interface -----------------------------
 done:
 
-	for(i=0; i<NUM_GAS; ++i)
+#ifdef _rx_functions
+	// only for OSTC TR model with TR functions enabled
+	if( char_O_main_status & DECO_TR_FUNCTIONS )
+	{
+		// invalidate pressure needs to pressure readings
+		int_O_pressure_need[0] = 0 + INT_FLAG_NOT_AVAIL;
+		int_O_pressure_need[1] = 0 + INT_FLAG_NOT_AVAIL;
+	}
+#endif
+
+	for( gas_num = 0; gas_num < NUM_GAS; ++gas_num )
 	{
-		if( volumes[i] >= 65534.5 )
-		{
-			int_O_gas_volumes[i]	= 65535;
-			int_O_tank_pres_need[i]	= 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill
-		}
-		else
+		volume = volumes[gas_num];
+
+		// compute int_volume and int_pres_need from volume and gas_num
+		gas_volume_helper_2();
+
+		// set invalid flag if there is an overflow in the stops table
+		if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW )
+			int_pres_need |= INT_FLAG_INVALID;
+
+		// copy result data to ASM interface
+		int_O_ascent_volumes[gas_num]   = int_volume;
+		int_O_ascent_pres_need[gas_num] = int_pres_need;
+
+#ifdef _rx_functions
+		// only for OSTC TR model with TR functions enabled
+		if( char_O_main_status & DECO_TR_FUNCTIONS )
 		{
-			overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[i];
-
-			// No distinct rounding done here because volumes are not accurate to the single liter anyhow
-
-			// convert gas volumes to integers
-			int_O_gas_volumes[i]     = (unsigned short)volumes[i];
-
-			// compute how much pressure in the tank will be needed [in bar]  (integer-division)
-			int_O_tank_pres_need[i]  = (unsigned short)(int_O_gas_volumes[i] / char_I_tank_size[i]);
-
-			// limit to 999 bar because of display constraints
-			if( int_O_tank_pres_need[i] > 999 ) int_O_tank_pres_need[i] = 999;
-
-			// set flags for fast evaluation by divemode check for warnings
-			if     ( int_O_tank_pres_need[i] == 0 )
+			// char_I_pressure_gas[] uses gas numbers 1-10, gas_num runs from 0 to 4
+			overlay unsigned char gas = gas_num + 1;
+
+			// check if the current gas is configured on pressure reading 1 or 2
+			if( (gas == char_I_pressure_gas[0]) || (gas == char_I_pressure_gas[1]) )
 			{
-				// set flag for 0 bar
-				int_O_tank_pres_need[i] |= INT_FLAG_ZERO;
-			}
-			else if( int_O_tank_pres_need[i] >= tank_pres_fill )
-			{
-				// set warning flag
-				int_O_tank_pres_need[i] |= INT_FLAG_WARNING;
-
+				// strip all flags from int_pres_need
+				int_pres_need &= 1023;
+
+				// limit to 400 bar and multiply by 10 to get result in 0.1 bar
+				int_pres_need = (int_pres_need > 400) ? (4000 | INT_FLAG_OUT_OF_RANGE) : (10 * int_pres_need);
+
+				// tag as not available if there is an overflow in the stops table
+				if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW )
+					int_pres_need |= INT_FLAG_NOT_AVAIL;
+
+				// copy to result vars (in both readings the same gas could be configured)
+				if( gas == char_I_pressure_gas[0] ) int_O_pressure_need[0] = int_pres_need;
+				if( gas == char_I_pressure_gas[1] ) int_O_pressure_need[1] = int_pres_need;
 			}
-			else if( int_O_tank_pres_need[i] >= tank_pres_fill * GAS_NEEDS_ATTENTION_THRESHOLD )
-			{
-				// set pre-warning flag
-				int_O_tank_pres_need[i] |= INT_FLAG_ATTENTION;
-			}
-
-			// set invalid flag if there is an overflow in the stops table
-			if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW )
-				int_O_tank_pres_need[i] |= INT_FLAG_INVALID;
-			
-		} // if( volumes[i] )
+		} // TR functions
+#endif
+
 	} // for
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
-void convert_CNS_for_display(void)
+static void convert_CNS_for_display(void)
 {
-	if		( CNS_fraction <  0.01  ) int_O_CNS_fraction = 0;
-	else if ( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING;
+	     if( CNS_fraction <  0.010 ) int_O_CNS_fraction = 0;
+	else if( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING;
 	else
 	{
 		// convert float to integer
 		int_O_CNS_fraction = (unsigned short)(100 * CNS_fraction + 0.5);
 
-		// set warnings
-		if		( int_O_CNS_fraction >= CNS_WARNING_THRESHOLD   ) int_O_CNS_fraction |= INT_FLAG_WARNING;
-		else if	( int_O_CNS_fraction >= CNS_ATTENTION_THRESHOLD ) int_O_CNS_fraction |= INT_FLAG_ATTENTION;
+		// set warning & attention flags
+		     if( int_O_CNS_fraction >= CNS_WARNING_THRESHOLD   ) int_O_CNS_fraction |= INT_FLAG_WARNING;
+		else if( int_O_CNS_fraction >= CNS_ATTENTION_THRESHOLD ) int_O_CNS_fraction |= INT_FLAG_ATTENTION;
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////
 
-void convert_sim_CNS_for_display(void)
+static void convert_sim_CNS_for_display(void)
 {
-	if		( sim_CNS_fraction <  0.01  ) int_sim_CNS_fraction = 0;
-	else if ( sim_CNS_fraction >= 9.985 ) int_sim_CNS_fraction = 999 + INT_FLAG_WARNING;
+	     if( sim_CNS_fraction <  0.010 ) int_sim_CNS_fraction = 0;
+	else if( sim_CNS_fraction >= 9.985 ) int_sim_CNS_fraction = 999 + INT_FLAG_WARNING;
 	else
 	{
 		// convert float to integer
 		int_sim_CNS_fraction = (unsigned short)(100 * sim_CNS_fraction + 0.5);
 
-		// set warning flag if CNS is >= 100%
+		// set warning & attention flags
 		if      ( int_sim_CNS_fraction >= CNS_WARNING_THRESHOLD    ) int_sim_CNS_fraction |= INT_FLAG_WARNING;
 		else if ( int_sim_CNS_fraction >= CNS_ATTENTION_THRESHOLD  ) int_sim_CNS_fraction |= INT_FLAG_ATTENTION;
-
-		// set invalid flag if there is an overflow in the stops table
-		if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) int_sim_CNS_fraction |= INT_FLAG_INVALID;
 	}
+
+	// set invalid flag if there is an overflow in the stops table
+	if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) int_sim_CNS_fraction |= INT_FLAG_INVALID;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+static void convert_GF_for_display(void)
+{
+	// convert supersaturation of the leading tissue to int_O_gradient_factor in % (1.0 = 100%)
+	// limit to 255 because of constraints in ghostwriter code
+	     if( lead_supersat <= 0.000 ) int_O_gradient_factor = 0;
+	else if( lead_supersat >  2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING;
+	else
+	{
+		int_O_gradient_factor = (unsigned int)(100 * lead_supersat + 0.5);
+
+		if( char_I_deco_model != 0 )
+		{
+			// GF factors enabled
+			if( int_O_gradient_factor >= char_I_GF_High_percentage )
+			{
+				int_O_gradient_factor |= INT_FLAG_ATTENTION;		// make GF factor shown in yellow
+				char_O_deco_warnings  |= DECO_ATTENTION_OUTSIDE;	// make depth blink     in yellow
+			}
+
+			if( int_O_gradient_factor >= 100 )
+				int_O_gradient_factor |= INT_FLAG_WARNING;			// make GF factor shown in red
+		}
+		else
+		{
+			// straight Buhlmann
+			     if ( int_O_gradient_factor >= 100 )
+				int_O_gradient_factor |= INT_FLAG_WARNING;			// make GF factor shown in red
+
+			else if ( int_O_gradient_factor >=  90 )
+			{
+				int_O_gradient_factor |= INT_FLAG_ATTENTION;		// make GF factor shown in yellow
+				char_O_deco_warnings  |= DECO_ATTENTION_OUTSIDE;	// make depth blink     in yellow
+			}
+		}
+	}
+
+	// export also the number of the leading tissue
+	char_O_lead_number = lead_number;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+static void convert_ceiling_for_display(void)
+{
+	// Convert ceiling to int_O_ceiling in mbar relative pressure.
+	// Round up to next 10 cm so that the ceiling disappears only
+	// when the ceiling limit is really zero. This will coincident
+	// with TTS switching back to NDL time.
+	     if( ceiling <=  0.0 ) int_O_ceiling = 0;
+	else if( ceiling >  16.0 ) int_O_ceiling = 16000;
+	else                       int_O_ceiling = (short)(ceiling * 1000 + 9);
+
+	// set/reset ceiling flag
+	if( int_O_ceiling ) char_O_deco_info |=  DECO_CEILING;
+	else                char_O_deco_info &= ~DECO_CEILING;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -3694,21 +4038,21 @@
 //            tissues and related data when entering / leaving simulation mode!
 //
 
-void push_tissues_to_vault(void)
+static void push_tissues_to_vault(void)
 {
 	overlay unsigned char x;
 
 	cns_vault_float      = CNS_fraction;
 	deco_warnings_vault  = char_O_deco_warnings;
 
-	for (x=0;x<NUM_COMP;x++)
+	for( x = 0; x < NUM_COMP; x++ )
 	{
 		pres_tissue_N2_vault[x] = pres_tissue_N2[x];
 		pres_tissue_He_vault[x] = pres_tissue_He[x];
 	}
 }
 
-void pull_tissues_from_vault(void)
+static void pull_tissues_from_vault(void)
 {
 	overlay unsigned char x;
 
@@ -3717,10 +4061,7 @@
 
 	convert_CNS_for_display();
 
-	locked_GF_step_norm  = GF_delta / low_depth_norm;
-	locked_GF_step_alt   = GF_delta / low_depth_alt;
-	
-	for (x=0; x<NUM_COMP; x++)
+	for( x = 0; x < NUM_COMP; x++ )
 	{
 		pres_tissue_N2[x] = pres_tissue_N2_vault[x];
 		pres_tissue_He[x] = pres_tissue_He_vault[x];
--- a/src/p2_definitions.h	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/p2_definitions.h	Thu Nov 22 19:47:26 2018 +0100
@@ -1,8 +1,8 @@
-// *********************************************************
-// ** Common definitions for the OSTC decompression code  **
-// *********************************************************
+// ****************************************************************************
+// **          Common definitions for the OSTC decompression code            **
+// ****************************************************************************
 
-//									REFACTORED VERSION	V2.97
+//													REFACTORED VERSION	V2.99d
 
 //////////////////////////////////////////////////////////////////////////////
 // OSTC - diving computer code
@@ -25,20 +25,18 @@
 
 
 
-// *************************
-// ** P R O T O T Y P E S **
-// *************************
+// ***********************************************
+// **         P R O T O T Y P E S               **
+// ***********************************************
 
 extern void deco_calc_hauptroutine(void);
 extern void deco_clear_tissue(void);
+extern void deco_calc_dive_interval(void);
 extern void deco_calc_dive_interval_1min(void);
-extern void deco_calc_dive_interval(void);
+extern void deco_calc_dive_interval_10min(void);
 extern void deco_calc_desaturation_time(void);
-extern void calc_CNS_fraction(void);
-extern void calc_CNS_planning(void);
-extern void push_tissues_to_vault(void);
-extern void pull_tissues_from_vault(void);
-extern void gas_volumes(void);
+extern void deco_push_tissues_to_vault(void);
+extern void deco_pull_tissues_from_vault(void);
 
 
 // ***********************************************
--- a/src/ports.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/ports.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File ports.inc
+;   File ports.inc														V2.98b
 ;
 ;   Portmap
 ;
@@ -15,74 +15,75 @@
 ; TRIS=b'00000000'
 
 ; PORTB
-#DEFINE	switch_left1	PORTB,1	; Switch
-#DEFINE	switch_right2	PORTB,0	; Switch
-#DEFINE mcp_power		PORTB,2	; RX Power supply
-#DEFINE	s8_npower		PORTB,3	; Powers S8 Bulkhead (inverted)
-#DEFINE	LEDg			PORTB,4	; LED green / active_reset_ostc_rx (<- Do no longer use this LED unless for debugging)
-#DEFINE	tft_power		PORTB,5 ; via P-MOSFET (Inverted)
-#DEFINE	icsp_clk		PORTB,6	; ICSP
-#DEFINE	icsp_dat		PORTB,7	; ICSP
+#DEFINE	switch_left1	PORTB,1			; switch
+#DEFINE	switch_right2	PORTB,0			; switch
+#DEFINE	mcp_power		PORTB,2			; RX power supply
+#DEFINE	s8_npower		PORTB,3			; power supply for S8 bulkhead (inverted)
+#DEFINE	LEDg			PORTB,4			; LED green / active_reset_ostc_rx (<- do no longer use this LED unless for debugging)
+#DEFINE	active_reset_ostc_rx PORTB,4	; set to 1 to hold RX circuity in reset
+#DEFINE	tft_power		PORTB,5			; via P-MOSFET (inverted)
+#DEFINE	icsp_clk		PORTB,6			; ICSP
+#DEFINE	icsp_dat		PORTB,7			; ICSP
 ; TRIS=b'00001011'
 
 ; PORTC
-#DEFINE	SOSC_RC0		PORTC,0	; SOSC
-#DEFINE	SOSC_RC1		PORTC,1	; SOSC
-#DEFINE	TFT_PWM			PORTC,2	; TFT Backlight
-#DEFINE	I2C_RC3			PORTC,3	; I²C
-#DEFINE	I2C_RC4			PORTC,4	; I²C
-#DEFINE	MS5541_mosi		PORTC,5	; MS5541
-#DEFINE	uart1_RC6		PORTC,6	; UART1 (USB/BLE)
-#DEFINE	uart1_RC7		PORTC,7	; UART1 (USB/BLE)
+#DEFINE	SOSC_RC0		PORTC,0			; SOSC
+#DEFINE	SOSC_RC1		PORTC,1			; SOSC
+#DEFINE	TFT_PWM			PORTC,2			; TFT backlight
+#DEFINE	I2C_RC3			PORTC,3			; I²C
+#DEFINE	I2C_RC4			PORTC,4			; I²C
+#DEFINE	MS5541_mosi		PORTC,5			; MS5541
+#DEFINE	uart1_RC6		PORTC,6			; UART1 (USB/BLE)
+#DEFINE	uart1_RC7		PORTC,7			; UART1 (USB/BLE)
 ; TRIS=b'10011010'
 
 ; PORTD
-#DEFINE	tft_cs			PORTD,0	; /CS
-#DEFINE	tft_rs			PORTD,1	; RS
-#DEFINE	tft_nwr			PORTD,2	; /WR
-#DEFINE	tft_rd			PORTD,3 ; RD
-#DEFINE	flash_mosi		PORTD,4	; MOSI
-#DEFINE	flash_miso		PORTD,5	; MISO
-#DEFINE	flash_clk		PORTD,6	; CLK
-#DEFINE	tft_nreset		PORTD,7	; /RESET
+#DEFINE	tft_cs			PORTD,0			; /CS
+#DEFINE	tft_rs			PORTD,1			; RS
+#DEFINE	tft_nwr			PORTD,2			; /WR
+#DEFINE	tft_rd			PORTD,3			; RD
+#DEFINE	flash_mosi		PORTD,4			; MOSI
+#DEFINE	flash_miso		PORTD,5			; MISO
+#DEFINE	flash_clk		PORTD,6			; CLK
+#DEFINE	tft_nreset		PORTD,7			; /RESET
 ; TRIS=b'00100000'
 
 ; PORTE
-#DEFINE	RE0_unused		PORTE,0	; unused
-#DEFINE	ir_power		PORTE,1	; Power supply for IR
-#DEFINE	charge_disable		PORTE,2	; ex. mcp_ncs (RX /CS) (Available from hardware rev x.x only)
-#DEFINE	LEDr			PORTE,3	; LED red
-#DEFINE	power_sw2		PORTE,4	; Power supply for switch1 circuit
-#DEFINE	RE5_unused		PORTE,5	; unused
-#DEFINE	lightsen_power		PORTE,6	; Power supply for lightsensor
-#DEFINE	flash_ncs		PORTE,7	; /CS
+#DEFINE	RE0_unused		PORTE,0			; unused
+#DEFINE	ir_power		PORTE,1			; power supply for IR
+#DEFINE	charge_disable	PORTE,2			; ex. mcp_ncs (RX /CS) (Available from hardware rev x.x only)
+#DEFINE	LEDr			PORTE,3			; LED red
+#DEFINE	power_sw2		PORTE,4			; power supply for switch1 circuit
+#DEFINE	RE5_unused		PORTE,5			; unused
+#DEFINE	lightsen_power	PORTE,6			; power supply for lightsensor
+#DEFINE	flash_ncs		PORTE,7			; /CS
 ; TRIS=b'00000000'
 
 ; PORTF
 ; RF1 (AN6, Batt_analog) and RF2 (AN7, Lightsensor)
 ; TRIS=b'01111110'
-#DEFINE NRTS            PORTF,6 ; I
-#DEFINE NCTS            PORTF,7 ; 0
+#DEFINE	NRTS			PORTF,6			; I
+#DEFINE	NCTS			PORTF,7			; 0
 
-; PORTG  
-#DEFINE TX3_PIEZO_CFG   PORTG,0
-#DEFINE	RG1_blocked_by_RS232_2	PORTG,1	; unused
-#DEFINE	tsop_rx			PORTG,2	; IR (RX2)
+; PORTG
+#DEFINE	TX3_PIEZO_CFG	PORTG,0
+#DEFINE	RG1_blocked_by_RS232_2 PORTG,1	; unused
+#DEFINE	tsop_rx			PORTG,2			; IR (RX2)
 ; RG3 (AN17, RSSI RX)
 ; RG4 (32768Hz Clock out)
-#DEFINE	RG5_unused		PORTG,5	; /MCLR
-#DEFINE	RG6_unused		PORTG,6	; unavailable
-#DEFINE	RG7_unused		PORTG,7	; unavailable
+#DEFINE	RG5_unused		PORTG,5			; /MCLR
+#DEFINE	RG6_unused		PORTG,6			; unavailable
+#DEFINE	RG7_unused		PORTG,7			; unavailable
 ; TRIS=b'10001111'
 
 ; PORTJ
-#DEFINE	RJ0_unused		PORTJ,0	; unused
-#DEFINE	RJ1_unused		PORTJ,1	; unused
-#DEFINE	CHRG_OUT		PORTJ,2	; CHRG_OUT
-#DEFINE	CHRG_IN 		PORTJ,3	; CHRG_IN
-#DEFINE	vusb_in			PORTJ,4	; external power supply detect, USB enumerated
-#DEFINE	power_sw1		PORTJ,5	; Power supply for switch2 circuit
-#DEFINE	MS5541_clk		PORTJ,6	; MS5541
-#DEFINE	MS5541_miso		PORTJ,7	; MS5541
+#DEFINE	RJ0_unused		PORTJ,0			; unused
+#DEFINE	RJ1_unused		PORTJ,1			; unused
+#DEFINE	CHRG_OUT		PORTJ,2			; CHRG_OUT
+#DEFINE	CHRG_IN 		PORTJ,3			; CHRG_IN
+#DEFINE	vusb_in			PORTJ,4			; external power supply detect, USB enumerated
+#DEFINE	power_sw1		PORTJ,5			; power supply for switch2 circuit
+#DEFINE	MS5541_clk		PORTJ,6			; MS5541
+#DEFINE	MS5541_miso		PORTJ,7			; MS5541
 ; TRIS=b'10010000'
 
--- a/src/rtc.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/rtc.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File rtc.asm													## V2.98
+;   File rtc.asm													## V2.98c
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -11,7 +11,7 @@
 #include "hwos.inc"
 #include "math.inc"
 
-sensors		CODE
+rtc		CODE
 
 ;=============================================================================
 
@@ -23,11 +23,11 @@
 	movwf	mins
 	movlw	.12
 	movwf	hours
-	movlw	.1
+	movlw	.2
 	movwf	day
-	movlw	.8
+	movlw	.12
 	movwf	month
-	movlw	.18
+	movlw	.17
 	movwf	year
 ;	rcall	rtc_set_rtc			; writes mins,sec,hours,day,month and year to rtc module
 ;	return
@@ -39,9 +39,9 @@
 	movwf	EECON2
 	movlw	0xAA
 	movwf	EECON2
-	bsf	RTCCFG,RTCWREN		; Unlock sequence for RTCWREN
-	bsf	RTCCFG,RTCPTR1
-	bsf	RTCCFG,RTCPTR0		; year
+	bsf		RTCCFG,RTCWREN		; Unlock sequence for RTCWREN
+	bsf		RTCCFG,RTCPTR1
+	bsf		RTCCFG,RTCPTR0		; year
 	movff	year,WREG
 	rcall	rtc_dec2bcd			; IN: WREG in decimal, OUT: WREG in BCD, also sets to bank16h!
 	movwf	RTCVALL				; year
@@ -68,7 +68,7 @@
 	movwf	EECON2
 	movlw	0xAA
 	movwf	EECON2
-	bcf	RTCCFG,RTCWREN		; Lock sequence for RTCWREN
+	bcf		RTCCFG,RTCWREN		; Lock sequence for RTCWREN
 	banksel	common
 	return
 
--- a/src/rtc.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/rtc.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -9,4 +9,4 @@
 ;  2011-08-08 : [mH] moving from OSTC code
 
 	extern	rtc_init
-	extern 	rtc_set_rtc
+	extern	rtc_set_rtc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rx_ops.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -0,0 +1,591 @@
+;=============================================================================
+;
+;   File rx_ops.asm														V2.99c
+;
+;   RX (Tank Pressure Transmitter) Routines.
+;
+;   Copyright (c) 2018, heinrichs weikamp, all right reserved.
+;=============================================================================
+
+#include "hwos.inc"						; mandatory header
+#include "shared_definitions.h"			; mailbox to p2_deco.c
+#include "i2c.inc"
+#include "math.inc"
+#include "isr.inc"
+
+	extern	get_first_gas_to_WREG
+	extern	get_first_dil_to_WREG
+
+
+; SAC calculation averaging settings
+#DEFINE time_accu_target_OC			.60	; [s] target time accumulator filling level in OC  modes
+#DEFINE time_accu_target_CCR		.180; [s] target time accumulator filling level in CCR mode
+
+
+rx_ops	CODE
+
+ IFDEF _rx_functions
+
+;=============================================================================
+; Get configured pressure readings
+;
+; input : opt_TR_1st_pres            - selector for first  pressure reading, in normal  mode
+;         opt_TR_Bail_pres           - selector for first  pressure reading, in bailout mode
+;         opt_TR_2nd_pres            - selector for second pressure reading, all modes
+;
+; output: int_IO_pressure_value+0/+2 - pressure in 0.1 bar, low byte
+;         int_IO_pressure_value+1/+3 - pressure in 0.1 bar, high byte, including data not available flag
+;         char_I_pressure_gas  +0/+1 - associated gas (1-5) / diluent (6-10)
+;         char_I_pressure_age  +0/+1 - age of data in seconds (max 60)
+;         char_I_pressure_stat +0/+1 - status data
+;
+	global	get_pressure_readings
+get_pressure_readings:
+	call	I2C_get_tankdata			; get raw pressure data
+get_pressure_readings_1:
+	movff	opt_TR_1st_pres,ul			; 1st pressure to read
+	btfsc	FLAG_bailout_mode			; in bailout mode?
+	movff	opt_TR_Bail_pres,ul			; YES - replace with assigned bailout selection
+	tstfsz	ul							; disabled?
+	bra		get_pressure_readings_1a	; NO  - get received pressure data
+	rcall	get_pressure_readings_H1	; YES - set pressure data to not available
+	bra		get_pressure_readings_1c	;     - continue with copying to result vars
+get_pressure_readings_1a:
+	movlw	.11							; first code for "special" pressures
+	cpfslt	ul							; opt_TR_1st_pres < 11 ?
+	rcall	get_pressure_readings_H2	; NO  - pre-process measurement selection
+	rcall	get_pressure_readings_H3	; get transmitter ID
+	rcall	get_pres_by_transmitter_id	; get data from transmitter with ID in hi:lo into hi:lo (pressure) and up (status)
+get_pressure_readings_1c:
+	movff	lo,int_IO_pressure_value+0	; copy pressure, low  byte
+	movff	hi,int_IO_pressure_value+1	; copy pressure, high byte
+	movff	ul,char_I_pressure_gas+0	; copy associated gas number
+	movff	up,char_I_pressure_age+0	; copy age of data
+	movff	ex,char_I_pressure_stat+0	; copy status data
+get_pressure_readings_2:
+	movff	opt_TR_2nd_pres,ul			; 2nd pressure to read
+	tstfsz	ul							; disabled?
+	bra		get_pressure_readings_2a	; NO  - get received pressure data
+	rcall	get_pressure_readings_H1	; YES - set pressure data to not available
+	bra		get_pressure_readings_2c	;     - continue with copying to result vars
+get_pressure_readings_2a:
+	movlw	.11							; first code for "special" pressures
+	cpfslt	ul							; opt_TR_2nd_pres < 11 ?
+	rcall	get_pressure_readings_H2	; NO  - pre-process measurement selection
+	btfss	ul,7						; gas selector >= 127 (special treatment)?
+	bra		get_pressure_readings_2b	; NO  - proceed reading a pressure
+	rcall	get_pressure_readings_H1	; YES - set pressure data to not available
+	bra		get_pressure_readings_2c	;     - continue wit copying to output data
+get_pressure_readings_2b:
+	rcall	get_pressure_readings_H3	; get transmitter ID
+	rcall	get_pres_by_transmitter_id	; get data from transmitter with ID in hi:lo into hi:lo (pressure) and up (status)
+get_pressure_readings_2c:
+	movff	lo,int_IO_pressure_value+2	; copy pressure, low  byte
+	movff	hi,int_IO_pressure_value+3	; copy pressure, high byte
+	movff	ul,char_I_pressure_gas+1	; copy associated gas number
+	movff	up,char_I_pressure_age+1	; copy age of data
+	movff	ex,char_I_pressure_stat+1	; copy status data
+	return
+
+get_pressure_readings_H1:
+	clrf	lo							; set pressure to 0 (low  byte)
+	clrf	hi							; set pressure to 0 (high byte)
+	clrf	up							; set age      to 0
+	clrf	ex							; set status   to 0
+	bsf		hi,int_not_avail_flag		; set flag for data not available
+	return
+
+get_pressure_readings_H2:
+	movlw	.11
+	subwf	ul,F
+	bnz		get_pressure_readings_H2a
+	call	get_first_gas_to_WREG		; ul = 11 -> ul = (get_first_gas_to_WREG)
+	movwf	ul
+	return
+get_pressure_readings_H2a:
+	decfsz	ul,F
+	bra		get_pressure_readings_H2b
+	movff	active_gas,ul				; ul = 12 -> ul = active_gas
+	return
+get_pressure_readings_H2b:
+	decfsz	ul,F
+	bra		get_pressure_readings_H2c
+	call	get_first_dil_to_WREG		; ul = 13 -> ul = (get_first_dil_to_WREG) + 5
+	movwf	ul
+	movlw	.5
+	addwf	ul,F
+	return
+get_pressure_readings_H2c:
+	decfsz	ul,F
+	bra		get_pressure_readings_H2d
+	movff	active_dil,ul				; ul = 14 -> ul = active_dil + 5
+	movlw	.5
+	addwf	ul,F
+	return
+get_pressure_readings_H2d:
+	movlw	.1
+	movwf	ul							; ul >= 15 -> should not happen, default to ul = 1
+	return
+
+get_pressure_readings_H3:
+	lfsr	FSR1,opt_transmitter_id_1	; load base address of transmitter ID array
+	decf	ul,W						; (1-10) -> (0-9)
+	mullw	.2							; IDs are 2 byte in size
+	movf	PRODL,W						; WREG is index now
+	movff	PLUSW1,lo					; get transmitter ID (low byte)
+	incf	WREG,W						; increment index
+	movff	PLUSW1,hi					; get transmitter ID (high byte)
+	return
+
+
+;=============================================================================
+; Get data from transmitter with ID in (hi:lo)
+;
+; input:       hi:lo = transmitter ID
+;
+; output:      hi:lo = pressure in 0.1 bar    if return code =   0, else 0 + int_not_avail_flag
+;              up    = packet age             if return code =   0, else 0
+;              ex    = status data            if return code =   0, else 0
+;
+; return code:   0 transmitter found
+;              254 illegal transmitter ID
+;              255 transmitter not found
+;
+; RX slot data: Byte 0         : transmitter ID high byte
+;                    1         : transmitter ID low  byte
+;                    2 (-> hi) : pressure in 0.1 bar, high byte
+;                    3 (-> lo) : pressure in 0.1 bar, low  byte
+;                    4 (-> ex) : status data:
+;                                bit 2..0: battery  status
+;                                    5..3: sequence counter
+;                                       6: =1 if pressure changed      (usage in RX slot data)
+;                                          =1 if transmitter not found (usage in output  data)
+;                                       7: =1 if pressure sensed       (usage in RX slot data)
+;                                          =1 if low battery (< 3.0V)  (usage in output  data)
+;                    5 (-> up) : age of data in seconds, 0 if slot is unused
+;
+	global	get_pres_by_transmitter_id
+get_pres_by_transmitter_id:
+	; hi:lo zero?
+	tstfsz	hi							; hi <> zero ?
+	bra		output_pressure_1			; YES - search transmitter
+	tstfsz	lo							; lo <> zero ?
+	bra		output_pressure_1			; YES - search transmitter
+	movlw	.254						; NO to both - set return code for invalid transmitter ID
+	bra		output_pressure_6			;            - clear result vars, set data as not available and return
+output_pressure_1:
+	lfsr	FSR1,rx_buffer				; load base address of RX buffer
+	movlw	.8							; 8 RX slots to look at
+	movwf	up							; up will be the loop counter
+output_pressure_2:
+	movf	POSTINC1,W					; get high byte of received transmitter ID
+	cpfseq	hi							; match?
+	bra		output_pressure_3			; NO  - check next slot
+	movf	POSTINC1,W					; get low byte byte received transmitter ID
+	cpfseq	lo							; match?
+	bra		output_pressure_4			; NO  - check next slot
+	; transmitter found, gather data	; YES - transmitter found, copy:
+	movff	POSTINC1,hi					;     - pressure high byte,
+	movff	POSTINC1,lo					;     - pressure low byte,
+	movff	POSTINC1,ex					;     - status byte, and
+	movff	POSTINC1,up					;     - packet age.
+	movlw	rx_packet_overdue_timeout	;     - load overdue time
+	subwf	up,W						;     - subtract overdue time from packet age
+	btfss	STATUS,N					;     - result negative (packet younger than overdue time)?
+	bsf		hi,int_outdated_flag		;       NO - set outdated flag
+	bcf		ex,char_transmitter_lost	;     - clear transmitter lost flag
+	bsf		ex,char_transmitter_low_bat	;     - set low battery warning by default
+	btfsc	ex,1						;     - bit 1 of battery voltage set?
+	bcf		ex,char_transmitter_low_bat	;     - YES - revoke low battery warning
+	btfsc	ex,2						;     - bit 2 of battery voltage set?
+	bcf		ex,char_transmitter_low_bat	;     - YES - revoke low battery warning
+	;bsf	ex,char_transmitter_low_bat	;                                          DEBUG CODE TO FAKE A LOW BAT WARNING
+	retlw	.0							;     - return with success code 0
+output_pressure_3:
+	movf	POSTINC1,W					; dummy read to advance FSR0 to byte 2 position
+output_pressure_4:
+	dcfsnz	up,F						; decrement loop counter, last slot searched?
+	bra		output_pressure_5			; YES - return with error code
+	movf	POSTINC1,W					; NO  - dummy reads to advance FSR0 to byte 3 (any other code would not be more compact...)
+	movf	POSTINC1,W					;     -                            ... byte 4
+	movf	POSTINC1,W					;     -                            ... byte 5
+	movf	POSTINC1,W					;     -                            ... byte 6 = first byte of next slot
+	bra		output_pressure_2			;     - loop
+output_pressure_5:
+	movlw	.255						; return code for transmitter not found
+	clrf	ex							; clear ex (status data)
+	bsf		ex,char_transmitter_lost	; set transmitter status to lost
+	bra		output_pressure_7
+output_pressure_6:
+	clrf	ex							; clear ex (status data)
+output_pressure_7:
+	clrf	lo							; clear lo (pressure, low  byte)
+	clrf	hi							; clear hi (pressure, high byte)
+	clrf	up							; clear up (age of data)
+	bsf		hi,int_not_avail_flag		; set flag for data not available
+	return								; done
+
+
+;=============================================================================
+; Get transmitter ID in given slot
+;
+; input    : WREG  = slot (0-7)
+; output   : hi:lo = transmitter ID
+;
+	global	get_transmitter_id_by_slot
+get_transmitter_id_by_slot:
+	lfsr	FSR1,rx_buffer				; load base address of RX buffer
+	mullw	.6							; multiply WREG with 6 because each slot is 6 bytes in size
+	movf	PRODL,W						; get result into WREG to be used as index (product is 42 at max)
+	movff	PLUSW1,hi					; read transmitter ID high byte
+	incf	WREG,W						; increment index
+	movff	PLUSW1,lo					; read transmitter ID low  byte
+	return
+
+
+;=============================================================================
+; Compute average pressure drop from 1st / 2nd reading
+;
+; Memory Map:
+; ------------------------------------------------------------------------------------
+;
+; pres_accu_1st				res 4		; accumulator for pressure drop      in 1/(160 * 2^16) bar
+; pres_accu_2nd				res 4		; accumulator for pressure drop      in 1/(160 * 2^16) bar
+; time_accu_1st				res 1		; accumulator for reading  periods   in seconds
+; gas__last_1st				res 1		; last gas assignment
+; time_accu_2nd				res 1		; accumulator for reading  periods   in seconds
+; gas__last_2nd				res 1		; last gas assignment
+; pres_last_1st				res 2		; last pressure   reading  pressure  in 1/160 bar
+; pres_last_2nd				res 2		; last pressure   reading  pressure  in 1/160 bar
+; time_last_1st				res 2		; last pressure   reading  time      in seconds
+; time_last_2nd				res 2		; last pressure   reading  time      in seconds
+;
+; int_IO_pressure_value [1] res 2		; current pressure reading           in 1/10   bar
+; int_IO_pressure_value [2] res 2		; current pressure reading           in 1/10   bar
+; int_I_pressure_drop   [1] res 2		; calculated average pressure drop   in 1/5120 bar/sec
+; int_I_pressure_drop   [2] res 2		; calculated average pressure drop   in 1/5120 bar/sec
+
+; relative positioning of 16 bit ASM variables
+#DEFINE offset_FSR1_time_accu	.0		; offset  0 == base address of 1st/2nd
+#DEFINE offset_FSR1_gas__last	.1		; offset  1 to base address of 1st/2nd
+#DEFINE offset_FSR1_pres_last	.4		; offset  4 ...
+#DEFINE offset_FSR1_time_last	.8		; offset  8 ...
+
+; relative positioning of shared integer variables
+#DEFINE offset_FSR2_press_curr	.0		; offset 0 == base address of 1st/2nd
+#DEFINE offset_FSR2_press_drop	.4		; offset 4 to base address of 1st/2nd
+
+
+calc_pres_drop_1st:
+	; set up base addresses
+	lfsr	FSR0,pres_accu_1st-1		; load base address - 1 of pressure accumulator
+	lfsr	FSR1,time_accu_1st			; load base address     of other ASM  variables
+	lfsr	FSR2,int_IO_pressure_value+0; load base address     of the shared variables
+
+	; get the currently assigned gas into lo
+	movff	char_I_pressure_gas+0,lo
+
+	; get the age of the current reading into hi
+	movff	char_I_pressure_age+0,hi
+
+	; continue with common part
+	bra		calc_pres_drop_common
+
+calc_pres_drop_2nd:
+	; set up base addresses
+	lfsr	FSR0,pres_accu_2nd-1		; load base address - 1 of pressure accumulator
+	lfsr	FSR1,time_accu_2nd			; load base address     of other ASM  variables
+	lfsr	FSR2,int_IO_pressure_value+2; load base address     of the shared variables
+
+	; get the currently assigned gas into lo
+	movff	char_I_pressure_gas+1,lo
+
+	; get the age of the current reading into hi
+	movff	char_I_pressure_age+1,hi
+
+calc_pres_drop_common:
+	; load the pressure accumulator into xC - FSR0 has been initialized to base address -1
+	movff	PREINC0,xC+0				; copy  pressure accumulator to xC, lowest  byte
+	movff	PREINC0,xC+1				; copy  pressure accumulator to xC, second  byte
+	movff	PREINC0,xC+2				; copy  pressure accumulator to xC, third   byte
+	movff	PREINC0,xC+3				; copy  pressure accumulator to xC, highest byte
+
+	; check if the assigned gas has changed
+	movlw	offset_FSR1_gas__last		; load index of last assigned gas
+	movf	PLUSW1,W					; copy last gas to WREG
+	cpfseq	lo							; is current gas = last gas ?
+	bra		calc_pres_drop_reset		; NO  - reset everything
+
+	; check if the pressure reading is activated at all
+	tstfsz	lo							; is there no gas (0=off) assigned to the reading?
+	bra		calc_pres_drop_common_1		; NO  - continue
+	bra		calc_pres_drop_reset		; YES - reset everything
+
+calc_pres_drop_common_1:
+	; load the time accumulator into xB
+	movff	INDF1,xB+0					; load  time accumulator, low  byte (had been stored)
+	clrf	xB+1						; clear time accumulator, high byte (will be reset to 0 each round)
+
+	; get the current pressure value into divA - after copying, FSR2 will have been restored to initial address
+	movff	POSTINC2,divA+0				; copy current pressure value to divA, low  byte
+	movff	POSTDEC2,divA+1				; copy current pressure value to divA, high byte
+
+	; check if the current pressure value is available and not outdated
+	bsf		aux_flag					; set the current pressure value as not available or outdated by default
+	btfsc	divA+1,int_not_avail_flag	; current pressure value not available?
+	bra		calc_pres_drop_common_2		; YES - skip updating the accumulators with new data
+	btfsc	divA+1,int_outdated_flag	; current pressure outdated?
+	bra		calc_pres_drop_common_2		; YES - skip updating the accumulators with new data
+	bcf		aux_flag					; NO to both - set current pressure value as available and up-to-date
+
+	; check if a new reading has been received
+	movlw	.2							; capture new reading at an age of 2 (age 1 sometimes slips through...)
+	subwf	hi,W						; subtract capture-age from reading age, dump result to WREG
+	bnz		calc_pres_drop_common_2		; result <> 0 ? YES - skip updating the accumulators
+
+	; multiply the current pressure with 16 (pre-scaling), this will also remove the flags
+	movlw	.4							; multiply with 16 = 2^4
+	call	mult16						; divA = divA * 2^WREG
+
+	; get the last pressure value and store the current pressure as the new last pressure value
+	movlw	offset_FSR1_pres_last+0		; load index of last pressure value,                       low  byte
+	movff	PLUSW1,sub_b+0				; copy last pressure value to sub_b,                       low  byte
+	movff	divA+0,PLUSW1				; store current pressure value as new last pressure value, low  byte
+	movlw	offset_FSR1_pres_last+1		; load index of last pressure value,                       high byte
+	movff	PLUSW1,sub_b+1				; copy last pressure value to sub_b,                       high byte
+	movff	divA+1,PLUSW1				; store current pressure value as new last pressure value, high byte
+
+	; add the last pressure value to the pressure accumulator: pres_accu (xC) += pres_last (sub_b) * 2^16
+	movf	sub_b+0,W					; copy          pres_last (sub_b) to WREG, low     byte
+	addwf	xC+2,F						; add to        pres_accu (xC),            third   byte
+	movf	sub_b+1,W					; copy          pres_last (sub_b) to WREG, high    byte
+	addwfc	xC+3,F						; add to        pres_accu (xC),            highest byte
+
+	; subtract the current pressure from the pressure accumulator: pres_accu (xC) -= pres_curr (divA) * 2^16
+	; -> effectively, the pressure drop during the last measurement period has been added now
+	bcf		neg_flag					; clear neg_flag by default
+	movf	divA+0,W					; copy          pres_curr (divA) to WREG, low     byte
+	subwf	xC+2,F						; subtract from pres_accu (xC),           third   byte
+	movf	divA+1,W					; copy          pres_curr (divA) to WREG, high    byte
+	subwfb	xC+3,F						; subtract from pres_accu (xC),           highest byte
+	btfss	STATUS,C					; did the accumulator under-run (result negative)?
+	bsf		neg_flag					; YES - memorize this
+
+	; get the current time into lo
+	SAFE_2BYTE_COPY total_divetime_seconds,lo	; get current total dive time into lo:2
+
+	; get the last pressure time and store the current time as the new last pressure time
+	movlw	offset_FSR1_time_last+0		; load index of last pressure time,             low  byte
+	movff	PLUSW1,sub_b+0				; copy last pressure time to sub_b,             low  byte
+	movff	lo+0,PLUSW1					; store current time as new last pressure time, low  byte
+	movlw	offset_FSR1_time_last+1		; load index of last pressure time,             high byte
+	movff	PLUSW1,sub_b+1				; copy last pressure time to sub_b,             high byte
+	movff	lo+1,PLUSW1					; store current time as new last pressure time, high byte
+
+	; did the pressure accumulator under-run before because the current pressure is higher than the accumulator value was?
+	; we can not check & abort earlier because the current time needs to be stored along with the current pressure
+	btfsc	neg_flag					; did the pressure accumulator under-run?
+	bra		calc_pres_drop_restart		; YES - reset both accumulators and set average pressure drop to not available
+
+	; add the current time to the time accumulator: time_accu (xB) += time_curr (lo)
+	movf	lo+0,W						; copy   time_curr (lo) to WREG,  low  byte
+	addwf	xB+0,F						; add to time_accu (xB),          low  byte
+	movf	lo+1,W						; copy   time_curr (lo) to WREG,  high byte
+	addwfc	xB+1,F						; add to time_accu (xB),          high_byte
+
+	; subtract the last pressure time from time accumulator: time_accu (xB) -= time_last (sub_b)
+	movf	sub_b+0,W					; copy          time_last (sub_b) to WREG, low  byte
+	subwf	xB+0,F						; subtract from time_accu (xB),            low  byte
+	movf	sub_b+1,W					; copy          time_last (sub_b) to WREG, high byte
+	subwfb	xB+1,F						; subtract from time_accu (xB),            high byte
+	btfss	STATUS,C					; did the accumulator under-run (result negative) because of a wrap-around of the current time?
+	bra		calc_pres_drop_restart		; YES - reset both accumulators and set average pressure drop to not available
+
+	; check if the time accumulator (xB) is or has become too large
+	; this will happen if the last valid pressure reading is older than (256 - time_accu target) seconds
+	tstfsz	xB+1						; is the time accumulator < 256 [seconds], i.e. high byte = 0 ?
+	bra		calc_pres_drop_restart		; NO  - reset both accumulators and set average pressure drop to not available
+
+calc_pres_drop_common_2:
+	; check if the time accumulator is or has become zero to avoid a div/0
+	; as long as no valid pressure value is available, the time accumulator will stay at 0 and the pressure drop calculation kept in reset
+	movf	xB+0,W						; copy time accumulator low byte to WREG, does it set the zero flag?
+	bz		calc_pres_drop_restart		; YES - reset both accumulators and set average pressure drop to not available
+
+	; duplicate pressure and time accumulators to other variables because xC and xB will get destroyed in div32x16 operation
+	movff	xC+0,lo+0					; duplicate pres_accu to lo, lowest  byte
+	movff	xC+1,lo+1					; duplicate pres_accu to lo, second  byte
+	movff	xC+2,lo+2					; duplicate pres_accu to lo, third   byte
+	movff	xC+3,lo+3					; duplicate pres_accu to lo, highest byte
+	movff	xB+0,divA+0					; duplicate time_accu to divA,  low  byte
+	movff	xB+1,divA+1					; duplicate time_accu to divA,  high byte
+
+	; calculate average pressure drop: pres_drop (xC) = pres_accu (xC) / time_accu (xB)
+	call	div32x16					; xC = xC / xB, xC is average pressure drop in 1/(160 * 2^16) bar/sec
+
+	; is the time accumulator above target level? (only the low byte needs to be evaluated)?
+	incf	ul,W						; load the target threshold, +1 (incf) transforms cpfslt from < to <= operation
+	cpfslt	divA+0						; is the time accumulator > target threshold ?
+	rcall	calc_pres_drop_reduce_accus	; YES - do an accumulator reduction
+
+	; do an additional half-rate (every 2nd second) accumulator reduction
+	btfsc	total_divetime_seconds+0,0	; are we on an even second?
+	rcall	calc_pres_drop_reduce_accus	; YES - do an additional accumulator reduction
+
+	; store pressure accumulator (lo:4) - FSR0 was left pointing to address of highest byte
+	movff	lo+3,POSTDEC0				; store pressure accumulator, highest byte
+	movff	lo+2,POSTDEC0				; store pressure accumulator, third   byte
+	movff	lo+1,POSTDEC0				; store pressure accumulator, second  byte
+	movff	lo+0,POSTDEC0				; store pressure accumulator, lowest  byte
+
+	; store the time accumulator
+	movff	divA+0,INDF1				; store time accumulator (only the low byte will be stored)
+
+	; check if the average pressure drop for transfer to p2deco needs to be limited
+	tstfsz	xC+3						; check if the highest byte is all zero
+	bra		calc_pres_drop_limit		; NO  - limit output
+	btfsc	xC+2,7						; check if the highest bit of the third byte is zero
+	bra		calc_pres_drop_limit		; NO  - limit output
+
+	; pick and adjust the bytes from pres_drop for transfer to p2deco
+	movff	xC+1,divA+0					; pick second byte of average pressure drop for transfer to p2deco as low  byte
+	movff	xC+2,divA+1					; pick third  byte of average pressure drop for transfer to p2deco as high byte
+	movlw	.3							; divide by 8 = 2^3
+	call	div16						; divA = divA / 2^WREG
+	bra		calc_pres_drop_common_3
+
+calc_pres_drop_limit:
+	; limit output to 0x0FFF
+	movlw	LOW  0x0FFF					; set output to 0x0FFF
+	movwf	divA+0						; ...
+	movlw	HIGH 0x0FFF					; ...
+	movwf	divA+1						; ...
+	bsf		divA+1,int_warning_flag		; set warning flag indicating out-of-range
+
+calc_pres_drop_common_3:
+	; set the average pressure drop as not available if the last pressure reading is outdated or not available
+	btfsc	aux_flag					; is the last pressure reading outdated or not available?
+	bsf		divA+1,int_not_avail_flag	; YES - set pressure drop to not available, too
+
+	; set the average pressure drop as outdated if time_accu (divA) < (target threshold / 2)
+	rrncf	ul,W						; load time accumulator target value / 2 into WREG
+	decf	WREG,W						; subtract 1 to transform cpfsgt from > to >= operation
+	cpfsgt	INDF1						; time accumulator < (target threshold / 2) ?
+	bsf		divA+1,int_outdated_flag	; YES - set outdated flag
+
+	; write average pressure drop to p2deco interface
+	movlw	offset_FSR2_press_drop+0	; load index of average pressure drop, low  byte
+	movff	divA+0,PLUSW2				; store         average pressure drop, low  byte
+	movlw	offset_FSR2_press_drop+1	; load index of average pressure drop, high byte
+	movff	divA+1,PLUSW2				; store         average pressure drop, high byte
+
+	; done
+	return
+
+
+calc_pres_drop_reduce_accus:
+	; subtract 1 second from the time accumulator: time_accu (divA) -= 1 (only the low byte needs to be processed)
+	decf	divA+0,F					; decrement low byte of time_accu
+
+	; subtract average pressure drop per second from pressure accumulator: press_accu (lo) -= press_drop (xC)
+	movf	xC+0,W						; copy          press_drop(xC) to WREG, lowest  byte
+	subwf	lo+0,F						; subtract from pres_accu,              lowest  byte
+	movf	xC+1,W						; copy          press_drop(xC) to WREG, second  byte
+	subwfb	lo+1,F						; subtract from pres_accu,              second  byte
+	movf	xC+2,W						; copy          press_drop(xC) to WREG, third   byte
+	subwfb	lo+2,F						; subtract from pres_accu,              third   byte
+	movf	xC+3,W						; copy          press_drop(xC) to WREG, highest byte
+	subwfb	lo+3,F						; subtract from pres_accu,              highest byte
+	btfsc	STATUS,C					; did the buffer under-run (result negative)?
+	return								; NO  - done
+	clrf	lo+0						; YES - clear pressure accumulator, lowest  byte
+	clrf	lo+1						;     - clear pressure accumulator, second  byte
+	clrf	lo+2						;     - clear pressure accumulator, third   byte
+	clrf	lo+3						;     - clear pressure accumulator, highest byte
+	return								;     - done
+
+calc_pres_drop_reset:
+	; store the current gas as the last gas
+	movlw	offset_FSR1_gas__last		; load index of            last gas
+	movff	lo,PLUSW1					; store current gas as new last gas
+
+	; clear last pressure value
+	movlw	offset_FSR1_pres_last+0		; load index of last pressure value, low  byte
+	clrf	PLUSW1						; clear         last pressure value, low  byte
+	movlw	offset_FSR1_pres_last+1		; load index of last pressure value, high byte
+	clrf	PLUSW1						; clear         last pressure value, high byte
+
+	; clear last pressure time
+	movlw	offset_FSR1_time_last+0		; load index of last pressure time, low  byte
+	clrf	PLUSW1						; clear         last pressure time, low  byte
+	movlw	offset_FSR1_time_last+1		; load index of last pressure time, high byte
+	clrf	PLUSW1						; clear         last pressure time, high byte
+
+calc_pres_drop_restart:
+	; clear pressure accumulator - FSR0 was left pointing to address of highest byte
+	clrf	POSTDEC0					; clear pressure accumulator, highest byte
+	clrf	POSTDEC0					; clear pressure accumulator, third   byte
+	clrf	POSTDEC0					; clear pressure accumulator, second  byte
+	clrf	POSTDEC0					; clear pressure accumulator, lowest  byte
+
+	; clear time accumulator
+	clrf	INDF1						; clear time accumulator
+
+	; clear pressure drop and set it to not available
+	movlw	offset_FSR2_press_drop+0	; load index of average  pressure drop, low  byte
+	clrf	PLUSW2						; clear         average  pressure drop, low  byte
+	movlw	offset_FSR2_press_drop+1	; load index of average  pressure drop, high byte
+	clrf	PLUSW2						; clear         average  pressure drop, high byte
+	bsf		PLUSW2,int_not_avail_flag	;               set flag for data not available
+
+	return								; done
+
+
+;=============================================================================
+; set up SAC calculation dependent on TR mode
+;
+	global	configure_sac_calculation
+configure_sac_calculation:
+	movlw	time_accu_target_OC			; load time accumulator target value for OC as default
+	movwf	ul							; store it in ul
+	movff	opt_TR_mode,WREG			; get TR mode
+	dcfsnz	WREG,W						; TR mode = 1 (on)?
+	bra		configure_sac_calculation_1	; YES
+	dcfsnz	WREG,W						; TR mode = 2 (ind.double)?
+	bra		configure_sac_calculation_2	; YES
+	dcfsnz	WREG,W						; TR mode = 3 (CCR Dil+O2)?
+	bra		configure_sac_calculation_3	; YES
+	bra		configure_sac_calculation_4	; NO to all - was disabled then (or invalid)
+
+configure_sac_calculation_1:			; TR mode 1: calculate SAC on 1st reading
+	rcall	calc_pres_drop_1st			; calculate pressure  drop on 1st reading
+	movlw	.1							; select SAC mode 1:   SAC on 1st reading
+	bra		configure_sac_calculation_5	; goto exit
+
+configure_sac_calculation_2:			; TR mode 2: independent double
+	rcall	calc_pres_drop_1st			; calculate pressure  drop on 1st reading
+	rcall	calc_pres_drop_2nd			; calculate pressure  drop on 2nd reading
+	movlw	.3							; select SAC mode 3: SAC on higher of both readings
+	bra		configure_sac_calculation_5	; goto exit
+
+configure_sac_calculation_3:			; TR mode 3: CCR Dil+O2
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		configure_sac_calculation_1	; YES - handle alike TR mode 1
+	movlw	time_accu_target_CCR		; load time accumulator target value for CCR mode
+	movwf	ul							; store it in ul
+	rcall	calc_pres_drop_2nd			; calculate pressure drop on 2nd reading
+	movlw	.4							; select SAC mode 4:  SAC on 2nd reading, O2 usage
+	bra		configure_sac_calculation_5	; goto exit
+
+configure_sac_calculation_4:
+	clrf	WREG						; select SAC mode 0 (disabled)
+
+configure_sac_calculation_5:
+	movff	WREG,char_I_SAC_mode		; write SAC mode selection
+	return
+
+;=============================================================================
+
+ ENDIF
+
+	END
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rx_ops.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -0,0 +1,12 @@
+;=============================================================================
+;
+;   File rx_ops.inc														V2.98c
+;
+;
+;   Copyright (c) 2018, heinrichs weikamp, all right reserved.
+;=============================================================================
+
+	extern	get_pressure_readings
+	extern	get_pres_by_transmitter_id
+	extern	get_transmitter_id_by_slot
+	extern	configure_sac_calculation
--- a/src/shared_definitions.h	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/shared_definitions.h	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 ;
-;    shared_definitions.h							REFACTORED VERSION	V2.97
+;    shared_definitions.h							REFACTORED VERSION V2.99e
 ;
 ;    Declare variables used both in C and ASM code
 ;
@@ -17,7 +17,7 @@
 ;    You should have received a copy of the GNU General Public License
 ;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ;
-;    Copyright (c) 2010, JD Gascuel.
+;    Copyright (c) 2010, JD Gascuel
 ;=============================================================================
 ; RATIONAL
 ;
@@ -31,7 +31,7 @@
 ; (with suitable macros) to make sure they have the same size in both language.
 ;
 ; HISTORY
-;  2011-01-20: [jDG] Creation.
+;  2011-01-20: [jDG] Creation
 ;
 ; NOTE
 ;
@@ -46,30 +46,30 @@
 
 #ifdef __18CXX
 	//------------------------------------------------------------------------
-	// C-style declarations:
-#   ifndef TEST_MAIN
-#       define VAR_UCHAR(n)      extern unsigned  char n
-#       define TAB_UCHAR(n,size) extern unsigned  char n[size]
-#       define VAR_UINT(n)       extern unsigned short n
-#       define TAB_UINT(n,size)  extern unsigned short n[size]
-#   else
-#       define VAR_UCHAR(n)      unsigned  char n
-#       define TAB_UCHAR(n,size) unsigned  char n[size]
-#       define VAR_UINT(n)       unsigned short n
-#       define TAB_UINT(n,size)  unsigned short n[size]
-#   endif
+	// C-Style Declarations:
+#	ifndef TEST_MAIN
+#		define VAR_UCHAR(n)			extern unsigned char n
+#		define TAB_UCHAR(n,size)	extern unsigned char n[size]
+#		define VAR_UINT(n)			extern unsigned short n
+#		define TAB_UINT(n,size)		extern unsigned short n[size]
+#	else
+#		define VAR_UCHAR(n)			unsigned char n
+#		define TAB_UCHAR(n,size)	unsigned char n[size]
+#		define VAR_UINT(n)			unsigned short n
+#		define TAB_UINT(n,size)		unsigned short n[size]
+#	endif
 #else
 	;-------------------------------------------------------------------------
-	; ASM-style declarations:
-#define VAR_UCHAR(n)       n    res     1
-#define TAB_UCHAR(n,size)  n    res     size
-#define VAR_UINT(n)        n    res     2
-#define TAB_UINT(n,size)   n    res     2*size
+	; ASM-Style Declarations:
+#define VAR_UCHAR(n)		n	res 1
+#define TAB_UCHAR(n,size)	n	res size
+#define VAR_UINT(n)			n	res 2
+#define TAB_UINT(n,size)	n	res 2*size
 #endif
 
 
 #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    Define model dimensions.
+    Define Model Dimensions
     NUM_COMP  is the number of compartiments in the Bühlmann ZH-L16 model, ie 16.
     NUM_STOPS is the maximum number of stops computed by decoplanning. 
               Note that the deepest stop is roughly limited to 3m * NUM_STOPS
@@ -78,20 +78,22 @@
                    and not reported in TTS summing.
     NUM_GAS   is the number of (potentially) active gas considered during
               ascent simulation.
+    NUM_SP    is the number of setpoints
 #endif
-#define NUM_COMP    0x10
-#define NUM_STOPS   0x20
-#define NUM_GAS     5
+#define NUM_COMP	0x10
+#define NUM_STOPS	0x20
+#define NUM_GAS		5
+#define NUM_SP		5
 
 
 #ifdef __18CXX
 	//---- BANK 3 DATA -------------------------------------------------------
-	// Gather all data C-code --> ASM-code
-	// Memory usage: 41 Bytes left
+	// Gather all Data C-Code --> ASM-Code
+	// Memory usage: 202 Byte used, 54 Byte free
 #   pragma udata overlay bank3=0x300
 #else
-	; In ASM, put the same bank, in overlay mode, at the same address
-bank3   udata_ovr  0x300
+	; in ASM, put the same bank, in overlay mode, at the same address
+bank3	udata_ovr	0x300
 #endif
 
 VAR_UINT  (int_O_desaturation_time);				// time until tissues desaturated to 5% remains, in minutes
@@ -104,13 +106,17 @@
 VAR_UINT  (int_O_normal_CNS_fraction);				// CNS% at end of dive in normal dive plan
 VAR_UINT  (int_O_alternate_CNS_fraction);			// CNS% at end of dive in alternative plan
 
-VAR_UINT  (int_O_gradient_factor);					// current gradient factor in %
+VAR_UINT  (int_O_gradient_factor);					// current gradient factor in %, 100% = on M-line of straight Buhlmann
+
+VAR_UCHAR (char_O_lead_number);						// number of the leading tissue
 
 VAR_UCHAR (char_O_nullzeit);						// remaining NDL time in minutes
 VAR_UCHAR (char_O_alternate_nullzeit);				// remaining NDL time for the alternative dive plan
 
 VAR_UCHAR (char_O_main_status);						// setup of the deco engine regarding the real tissue   computations
 VAR_UCHAR (char_O_deco_status);						// setup of the deco engine regarding the decompression computations
+VAR_UCHAR (char_O_deco_warnings);					// vector of warnings generated by the deco engine
+VAR_UCHAR (char_O_deco_info);						// vector of infos    generated by the deco engine
 
 VAR_UCHAR (char_O_EAD);								// equivalent air      depth (EAD) of breathed gas
 VAR_UCHAR (char_O_END);								// equivalent narcosis depth (END) of breathed gas
@@ -118,43 +124,46 @@
 VAR_UCHAR (char_O_first_deco_depth);				// depth of first stop (deco or gas change)
 VAR_UCHAR (char_O_first_deco_time) ;				// duration of first stop
 
-TAB_UCHAR (char_O_deco_depth, NUM_STOPS);			// stops table: depth, ...
-TAB_UCHAR (char_O_deco_time,  NUM_STOPS);			// ... duration, and
-TAB_UCHAR (char_O_deco_gas,   NUM_STOPS);			// ... gas breathed
+TAB_UCHAR (char_O_deco_depth, NUM_STOPS);			// stops table: depth, ...                       | ATTENTION: do not re-arrange these
+TAB_UCHAR (char_O_deco_time,  NUM_STOPS);			// ... duration, and                             |            three arrays relative
+TAB_UCHAR (char_O_deco_gas,   NUM_STOPS);			// ... gas breathed                              |            to each other!
 
 TAB_UCHAR (char_O_deco_time_for_log, NUM_STOPS);	// variant of the stops table for logging purpose
 
 TAB_UCHAR (char_O_tissue_N2_saturation, NUM_COMP);	// nitrogen tissue pressures for display purpose
 TAB_UCHAR (char_O_tissue_He_saturation, NUM_COMP);	// helium   tissue pressures for display purpose
 
-VAR_UCHAR (char_O_deco_warnings);					// vector of warnings generated by the deco engine
+TAB_UINT  (int_O_ascent_volumes,   NUM_GAS);		// gas volumes needed for ascent in liters
+TAB_UINT  (int_O_ascent_pres_need, NUM_GAS);		// tank pressures needed for ascent in bar
 
-TAB_UINT  (int_O_gas_volumes,    NUM_GAS);			// gas volumes    needed in liters
-TAB_UINT  (int_O_tank_pres_need, NUM_GAS);			// tank pressures needed in bar
-VAR_UINT  (int_O_ceiling);							// ultimate ascent bound in mbar relative pressure
+VAR_UINT  (int_O_ceiling);							// ascent boundary in mbar relative pressure, calculated at GF-high
 
 VAR_UINT  (int_O_O2_ppO2);							// ppO2 of pure O2 at current depth
 VAR_UINT  (int_O_pure_ppO2);						// ppO2 of the current gas or dil if breathed pure
 VAR_UINT  (int_O_pSCR_ppO2);						// ppO2 calculated in pSCR loop
 VAR_UINT  (int_O_breathed_ppO2);					// ppO2 actually breathed (= char_O_pure_ppO2 if in OC)
 
+TAB_UINT  (int_O_pressure_need, 2);					// pressure reading, need by deco calculations, in 0.1   bar
+VAR_UINT  (int_O_sac_rate);							// SAC rate in 0.1 liter/minute
+
 
 #ifdef __18CXX
 	//---- BANK 4 DATA -------------------------------------------------------
-	// Gather all data ASM-code --> C-code
-	// Memory usage: 183 bytes left
+	// Gather all Data ASM-Code --> C-Code
+	// Memory usage: 86 Byte used, 170 byte free
 #   pragma udata overlay bank4=0x400
 #else
-	; In ASM, put the same bank, in overlay mode, at the same address
-bank4   udata_ovr  0x400
+	; in ASM, put the same bank, in overlay mode, at the same address
+bank4	udata_ovr	0x400
 #endif
 
 VAR_UINT  (int_I_pres_respiration);				// absolute pressure breathed
 VAR_UINT  (int_I_pres_surface);					// absolute pressure at surface
 
 VAR_UCHAR (char_I_current_gas);					// number of gas currently breathed (1..5 for configured gases, 6 for the manual gas)
-VAR_UCHAR (char_I_He_ratio);					// helium   ratio of the currently breathed gas
-VAR_UCHAR (char_I_O2_ratio);					// oxygen   ratio of the currently breathed gas
+VAR_UCHAR (char_I_current_gas_type);			// type of current gas: (0=Disabled), 1=First, 2=Travel/Normal, 3=Deco/-
+VAR_UCHAR (char_I_He_ratio);					// helium ratio of the currently breathed gas
+VAR_UCHAR (char_I_O2_ratio);					// oxygen ratio of the currently breathed gas
 
 VAR_UCHAR (char_I_saturation_multiplier);		// safety factor, 100 = no conservatism, 150 = 50% faster saturation
 VAR_UCHAR (char_I_desaturation_multiplier);		// safety factor, 100 = no conservatism,  66 = 50% slower desaturation 
@@ -172,20 +181,20 @@
 
 VAR_UCHAR (char_I_dive_interval);				// duration of surface break before next dive in minutes, used in simulation
 VAR_UCHAR (char_I_sim_advance_time);			// 'fast forward' of dive time, used in simulation (+5 min function)
+VAR_UCHAR (char_I_extra_time);					// extra bottom time for fTTs and delayed ascent calculation in minutes
 
 VAR_UCHAR (char_I_const_ppO2);					// ppO2 reported from sensors or by setpoint
 
-TAB_UCHAR (char_I_deco_gas_change,NUM_GAS);		// change depths of the OC gases
-TAB_UCHAR (char_I_dil_change,     NUM_GAS);		// change depths of the diluent gases. Attention: must be placed after char_I_deco_gas_change!	Remark: not used by C code, only by ASM code
-
-TAB_UCHAR (char_I_setpoint_change,NUM_GAS);		// change depth for the setpoints in meter
-TAB_UCHAR (char_I_setpoint_cbar,  NUM_GAS);		// setpoints in cbar
+TAB_UCHAR (char_I_setpoint_cbar,  NUM_SP);		// setpoints in cbar                        | ATTENTION: do not change the position of these
+TAB_UCHAR (char_I_setpoint_change,NUM_SP);		// change depth for the setpoints in meter  |            two arrays relative to each other!
 
-TAB_UCHAR (char_I_deco_O2_ratio,  NUM_GAS);		// oxygen ratios of the configured gases, used for deco calculations
-TAB_UCHAR (char_I_deco_He_ratio,  NUM_GAS);		// helium ratios of the configured gases, used for deco calculations
+TAB_UCHAR (char_I_deco_O2_ratio,  NUM_GAS);		// oxygen ratios of the configured gases, used for deco calc. | ATTENTION: do not change the
+TAB_UCHAR (char_I_deco_He_ratio,  NUM_GAS);		// helium ratios of the configured gases, used for deco calc. |            position of these
+TAB_UCHAR (char_I_deco_gas_type,  NUM_GAS);		// type          of the configured gases, used for deco calc. |            arrays relative to
+TAB_UCHAR (char_I_deco_gas_change,NUM_GAS);		// change depths of the configured gases, used for deco calc. |            each other!
 
-TAB_UCHAR (char_I_tank_size,      NUM_GAS);		// tank sizes, used for pressure needs calculation
-TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS);		// tank fill pressures, used for generating warnings
+TAB_UCHAR (char_I_tank_size,      NUM_GAS * 2);	// tank sizes, used for pressure needs and SAC calculations
+TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS * 2);	// tank fill pressures (in multiples of 10 bar), used to generate warnings
 
 VAR_UCHAR (char_I_cc_max_frac_o2);				// limiter for maximum O2% in loop
 VAR_UCHAR (char_I_PSCR_drop);					// pSCR parameter drop [%]
@@ -196,7 +205,7 @@
 VAR_UCHAR (char_I_bottom_usage);				// gas consumption during bottom part and initial ascent   in liters/minute
 VAR_UCHAR (char_I_deco_usage);					// gas consumption during deco stops and following ascents in liters/minute
 
-VAR_UCHAR (char_I_extra_time);					// extra bottom time for fTTs and delayed ascent calculation in minutes
+VAR_UCHAR (char_I_gas6_depth);					// change depth (MOD) of the manually configured gas in meters
 
 VAR_UCHAR (char_I_ppO2_max);					// warning threshold for maximum ppO2 during working phase of the dive
 VAR_UCHAR (char_I_ppO2_max_deco);				// warning threshold for maximum ppO2 during deco phase of the dive
@@ -205,3 +214,28 @@
 
 VAR_UCHAR (char_I_ascent_speed);				// ascent speed in meters/minute
 VAR_UCHAR (char_I_gas_change_time);				// extra time spent during a stop for doing a gas change, in minutes
+
+VAR_UCHAR (char_I_SAC_mode);					// SAC calculation mode
+VAR_UCHAR (char_I_max_pres_diff);				// maximum pressure difference for independent double mode
+
+TAB_UINT  (int_IO_pressure_value,2);			// pressure reading, measured pressure,         in 0.1   bar       | ATTENTION: do not change the position
+TAB_UINT  (int_I_pressure_drop, 2);				// pressure reading, average pressure drop,     in 1/160 bar/sec   | of these arrays relative to each other!
+
+TAB_UCHAR (char_I_pressure_gas, 2);				// pressure reading, associated gas (1-5) / diluent (6-10), 0 if off
+TAB_UCHAR (char_I_pressure_age, 2);				// pressure reading, age of data
+TAB_UCHAR (char_I_pressure_stat,2);				// pressure reading, transmitter status data
+
+VAR_UCHAR (char_I_backtrack_time);				// index (in minutes) of backtrack entries in char_I_backtrack_depth
+
+
+#ifdef __18CXX
+	//---- BANK 11 DATA -------------------------------------------------------
+	// Backtracking Data ASM-Code --> C-Code
+	// Memory usage: 256 Byte used, 0 byte free
+#   pragma udata overlay bank11=0xB00
+#else
+	; in ASM, put the same bank, in overlay mode, at the same address
+bank11	udata_ovr	0xB00
+#endif
+
+TAB_UCHAR (char_I_backtrack_depth, 0x100);		// recorded depths for backtracking in cave mode
--- a/src/simulator.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/simulator.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File simulator.asm								REFACTORED VERSION V2.98
+;   File simulator.asm								REFACTORED VERSION V2.99e
 ;
 ;   Decoplan interface to C model code.
 ;
@@ -23,23 +23,18 @@
 #include "gaslist.inc"
 #include "isr.inc"
 
-gui		CODE
-
 	extern deco_clear_tissue
 	extern deco_push_tissues_to_vault
 	extern deco_calc_dive_interval
 	extern deco_calc_hauptroutine
 	extern deco_pull_tissues_from_vault
 	extern TFT_display_decotype_surface1
-	extern get_first_dil_to_WREG
-	extern get_first_gas_to_WREG
-	extern setup_dil_registers
-	extern setup_gas_registers
-	extern deco_setup_cc_diluents
-	extern deco_setup_oc_gases
 	extern log_screendump_and_onesecond
 	extern logbook_preloop_tasks
 	extern do_return_demo_planner
+	extern dive_boot_oc_bail
+	extern dive_boot_oc
+	extern dive_boot_cc
 
 
 ;---- Private local variables -------------------------------------------------
@@ -47,8 +42,8 @@
 	CBLOCK local1				; max size is 16 Byte !!!
 		decoplan_index			; within each page
 		decoplan_gindex			; global index
-		decoplan_last			; Depth of last stop (CF#29)
-		decoplan_flags			; Various private flags.
+		decoplan_last			; depth of last stop (CF#29)
+		decoplan_flags			; various private flags
 		decoplan_page			; page number
 		decoplan_warnings		; deco engine warnings
 		gas_counter				; counter for looping through the gases
@@ -60,39 +55,35 @@
 #define decoplan_last_ceiling_shown	decoplan_flags,0
 #define decoplan_abort				decoplan_flags,1
 
+
+simulator		CODE
+
+
 ;---- Demo deco planner ------------------------------------------------------
 
 	global	do_demo_planner
 do_demo_planner:
-	btfsc	FLAG_gauge_mode				; =1: In Gauge mode
-	goto	do_return_demo_planner
-	btfsc	FLAG_apnoe_mode				; =1: In Apnea mode
-	goto	do_return_demo_planner
-	bcf		decoplan_abort				; initialize (clear) abort flag
-	bcf		is_bailout					; clear bailout condition (may have remained set from last invocation)
+	btfsc	FLAG_gauge_mode					; in gauge mode?
+	bra		do_demo_planner_exit			; YES - abort
+	btfsc	FLAG_apnoe_mode					; in Apnea mode?
+	bra		do_demo_planner_exit			; YES - abort
+	bcf		decoplan_abort					; initialize (clear) abort flag
+	bcf		FLAG_bailout_mode				; clear bailout condition (may have remained set from last invocation)
 	rcall	deco_planer
-	btfss	decoplan_abort				; skip recall deco_show_plan if calculations were aborted
+	btfss	decoplan_abort					; skip recall deco_show_plan if calculations were aborted
 	rcall	deco_show_plan
+do_demo_planner_exit:
 	goto	do_return_demo_planner
 
 
-	global	deco_setup
 deco_setup:
-	btfsc	FLAG_ccr_mode
-	bra		deco_setup_cc
-	btfsc	FLAG_pscr_mode
-	bra		deco_setup_cc
-deco_setup_oc:
-	call	get_first_gas_to_WREG			; gets first gas (1-5) into WREG
-	call	setup_gas_registers				; with WREG=Gas 1-5
-	call	deco_setup_oc_gases				; setup OC/Bailout Gases and configure for OC deco calculation
-	bra		deco_setup_cont
-deco_setup_cc:
-	call	get_first_dil_to_WREG			; gets first gas (1-5) into WREG
-	call	setup_dil_registers				; with WREG=Gas 1-5
-	call	deco_setup_cc_diluents			; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation
-deco_setup_cont:
-	; use ambient conditions for simulation
+	call	dive_boot_oc_bail				; basic setup for all modes
+	btfsc	FLAG_oc_mode					; in OC mode?
+	call	dive_boot_oc					; YES - set up OC mode
+	btfss	FLAG_oc_mode					; in OC mode?
+	call	dive_boot_cc					; NO - set up CCR/pSCR mode
+
+	; use ambient conditions for deco calculation
 	SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface	; copy surface pressure to deco routine
 
 	movlw	deco_distance
@@ -103,17 +94,15 @@
 	movff	opt_GF_high,char_I_GF_High_percentage
 
 	; overwrite GF if aGF is wanted
-	bsf		use_agf
-	TSTOSS	opt_sim_use_aGF
-	bcf		use_agf
+	bsf		use_agf							; set flag to use alternative GF factors by default
+	TSTOSS	opt_sim_use_aGF					; shall use alternative GF factors?
+	bcf		use_agf							; NO - clear flag again
 
-	btfsc	use_agf							; =1: Use aGF
+	btfsc	use_agf							; =1: use aGF
 	movff	opt_aGF_low,char_I_GF_Low_percentage
-	btfsc	use_agf							; =1: Use aGF
+	btfsc	use_agf							; =1: use aGF
 	movff	opt_aGF_high,char_I_GF_High_percentage
 
-	bcf		is_bailout
-
 	; setup char_I_const_ppO2 for CC modes
 	clrf	WREG
 	btfsc	FLAG_pscr_mode
@@ -131,25 +120,29 @@
 ;
 		global	deco_planer
 deco_planer:
-	call	speed_fastest					; Quick !
+	call	speed_fastest					; quick!
+	call	TFT_ClearScreen					; clear screen to show that calculator is starting up
 	call	deco_push_tissues_to_vault		; C-code: back-up state of the real tissues
 	banksel	common
-	rcall	deco_setup						; Setup all model parameters.
+	rcall	deco_setup						; setup all model parameters
 
 ;---- Specific settings ------------------------------------------------------
 
 	; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent
-	movff	char_O_deco_status,WREG			; bank-safe copy
-	bcf		WREG,DECO_PLAN_FLAG				; normal plan mode,
-	bsf		WREG,DECO_CNS_FLAG				; enable CNS calculation (CNS at end of dive),
-	bsf		WREG,DECO_VOLUME_FLAG			; enable gas volume calculation, and
-	bcf		WREG,DECO_ASCENT_FLAG			; disable delayed ascent calculation
-	movff	WREG,char_O_deco_status			; bank-safe copy back
+	movff	char_O_deco_status,lo			; bank-safe copy
+	bcf		lo,DECO_PLAN_FLAG				; normal plan mode,
+	bsf		lo,DECO_VOLUME_FLAG				; enable gas volume calculation, and
+	bcf		lo,DECO_ASCENT_FLAG				; disable delayed ascent calculation
+	movff	lo,char_O_deco_status			; bank-safe copy back
 
 	; configure the deco engine for total-dive gas volume calculation
-	movff	char_O_main_status,WREG			; bank-safe copy
-	bsf		WREG,DECO_BOTTOM_FLAG			; set bottom flag
-	movff	WREG,char_O_main_status			; bank-safe copy back
+	movff	char_O_main_status,hi			; bank-safe copy
+	bcf		hi,DECO_TR_FUNCTIONS			; execution of TR functions is not needed in deco calculator mode
+	bsf		hi,DECO_BOTTOM_FLAG				; set bottom flag
+	bsf		hi,DECO_Z_FACTOR_FLAG			; enable use of Z factor by default
+	TSTOSS	opt_ZfactorUse					; shall use Z factor?
+	bcf		hi,DECO_Z_FACTOR_FLAG			; NO - disable again
+	movff	hi,char_O_main_status			; bank-safe copy back
 
 deco_planer_redo:
 	; show deco calculation is in progress
@@ -160,66 +153,65 @@
 	WIN_SMALL	.1,.215
 	STRCPY_TEXT_PRINT tAbort
 
-	; configure the deco engine for restart:
-	movff	char_O_deco_status,WREG			; bank-safe copy
-	bsf		WREG,DECO_STATUS_0_FLAG			; configure init ...
-	bsf		WREG,DECO_STATUS_1_FLAG			; ... state,
-	movff	WREG,char_O_deco_status			; bank-safe copy back
+	; configure the deco engine for initialization
+	movff	char_O_deco_status,lo			; bank-safe copy
+	bsf		lo,DECO_STATUS_0_FLAG			; configure init ...
+	bsf		lo,DECO_STATUS_1_FLAG			; ... state,
+	movff	lo,char_O_deco_status			; bank-safe copy back
 
-;---- Add delay at surface, if needed ----------------------------------------
+;---- add delay at surface, if requested -------------------------------------
 	banksel	char_I_dive_interval
 	tstfsz	char_I_dive_interval
 	call	deco_calc_dive_interval
 
 ;---- Dive loop --------------------------------------------------------------
-	; Compute dive ambient conditions
+	; compute dive ambient conditions
 	banksel	char_I_bottom_depth
 	movf	char_I_bottom_depth,W
 	mullw	.100
-	movlw	LOW(.1000)
+	movlw	LOW (.1000)
 	addwf	PRODL,W
 	movwf	int_I_pres_respiration+0
 	movlw	HIGH(.1000)
 	addwfc	PRODH,W
 	movwf	int_I_pres_respiration+1
-	banksel common
+	banksel	common
 
 	movff	char_I_bottom_time,char_I_sim_advance_time
 
-	clrf	TMR5L
-	clrf	TMR5H							; 30,51757813µs/bit in TMR5L:TMR5H
+	clrf	TMR5L							; restart timer used to preempt stops calculation
+	clrf	TMR5H							;
 
-	call	deco_calc_hauptroutine			; C-code: initialization + complete bottom time part
+	call	deco_calc_hauptroutine			; initialization, complete bottom time part and initial ascent
 	banksel	common
 
-;---- BAILOUT: Switch to OC gases for ascent cycles --------------------------
-	btfss	is_bailout						; Doing a bailout deco plan ?
-	bra	 deco_planer_finishing				; NO  - keep gases
-											; YES - switch to OC gas 
+	btfss	FLAG_bailout_mode				; doing a bailout deco plan?
+	bra		deco_planer_loop				; NO  - keep gases and go on
+											; YES - switch to OC gas and restart deco plan
 
-	; reconfigure the deco engine for delayed ascent mode
+;---- BAILOUT: Switch to OC gases for ascent -----------------------------------
+
+	; reconfigure the deco engine for delayed ascent & bailout mode and start a new calculation cycle
 	movff	char_O_deco_status,lo			; bank-safe copy
 	bsf		lo,DECO_ASCENT_FLAG				; set flag for delayed ascent calculation
+	bsf		lo,DECO_BAILOUT_FLAG			; set bailout mode flag to allow gas changes on initial ascent
+	bcf		lo,DECO_STATUS_0_FLAG			; configure start of a new...
+	bcf		lo,DECO_STATUS_1_FLAG			; ... deco calculation cycle
 	movff	lo,char_O_deco_status			; bank-safe copy back
 
-	; configure the deco engine for delayed ascent part gas volume calculation
-	movff	char_O_main_status,WREG			; bank-safe copy
-	bcf		WREG,DECO_BOTTOM_FLAG			; set bottom flag
-	movff	WREG,char_O_main_status			; bank-safe copy back
+	; reconfigure the deco engine for bailout ascent needs
+	movff	char_O_main_status,hi			; bank-safe copy
+	bcf		hi,DECO_BOTTOM_FLAG				; clear bottom flag
+	movff	hi,char_O_main_status			; bank-safe copy back
 
 	; reconfigure gas settings to OC gases
-	call	get_first_gas_to_WREG			; get first gas (1-5) into WREG
-	call	setup_gas_registers				; With WREG=Gas 1-5 (or 6, not applicable here)
-	call	deco_setup_oc_gases				; With WREG=Gas 1-5 (or 6, not applicable here)
-
-	; set the gas change override flag to allow gas changes before deco stops as done in alternative plan
-	movff	char_O_main_status,lo			; bank-safe copy
-	bsf		lo,DECO_GASCHANGE_OVRD			; set flag for gas change override
-	movff	lo,char_O_main_status			; bank-safe copy back
+	call	dive_boot_oc					; configure deco engine for OC mode
 
 ;---- Wait until status reaches zero -------------------------------------------
-deco_planer_finishing:
-	call	deco_calc_hauptroutine			; C-code: Simulate more dive time to trigger the deco calculations
+deco_planer_loop:
+	clrf	TMR5L							; restart timer used to preempt stops calculation
+	clrf	TMR5H							;
+	call	deco_calc_hauptroutine			; simulate more dive time to trigger the deco calculations
 	banksel	common
 
 	btfss	switch_left						; check if left button was pressed
@@ -227,11 +219,9 @@
 	bsf		decoplan_abort					; YES - set abort flag so that deco_show_plan will not be called
 	bra		deco_planer_finishing_2			;       do some clean-up and return
 deco_planer_finishing_1:
-	movff	char_O_deco_status,lo			; working copy of char_O_deco_status in bank common
-	movlw	DECO_STATUS_MASK				; bit mask for deco status bit set
-	andwf	lo,W							; mask out bits showing state of computation
-	tstfsz	WREG							; check if a compute cycle is finished (bits 1 and 0 == 0)
-	bra		deco_planer_finishing			; NO - needs more computation cycles
+	movff	char_O_main_status,hi			; working copy of char_O_main_status in bank common
+	btfss	hi,DECO_COMPLETED_NORM			; calculations completed?
+	bra		deco_planer_loop				; NO - needs more computation cycles
 
 ;---- Done: add CNS from decoplan, and restore tissues
 deco_planer_finishing_2:
@@ -263,13 +253,13 @@
 
 	lfsr	FSR2,buffer
 
-	TSTOSS	opt_units					; 0=Meters, 1=Feets
+	TSTOSS	opt_units					; 0=Meter, 1=Feet
 	bra		deco_plan_show_nstd_stop_metric
 
-	movff	hi,up						; backup hi (minutes)
-	WIN_LEFT .85
+	movff	hi,ul						; back-up hi (minutes)
+	WIN_LEFT .80
 	movf	lo,W						; lo = m
-	mullw	.100						; PRODL:PRODH = mbar
+	mullw	.100						; PRODL:PRODH = hPa
 	movff	PRODL,lo
 	movff	PRODH,hi
 	; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops...
@@ -292,76 +282,62 @@
 	call	div32x16					; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	movff	xC+0,lo
 	movff	xC+1,hi						; restore lo and hi with updated value
-	bsf		leftbind
-	bsf		ignore_digit4				; Only full feet
+	bsf		ignore_digit4				; only full feet
 	output_16
-	bcf		leftbind
-	STRCAT_PRINT "ft "
-	movff	up,hi						; restore hi (minutes)
+	STRCAT_PRINT "ft"
+	movff	ul,hi						; restore hi (minutes)
 	bra		deco_plan_show_nstd_stop_common
 
 deco_plan_show_nstd_stop_metric:
-	WIN_LEFT .90
-	bsf	leftbind
-	output_8							; outputs into Postinc2!
-	bcf	leftbind
-	STRCAT_PRINT "m "
+	WIN_LEFT .85
+	output_8							; outputs into postinc2
+	STRCAT_PRINT "m"
 
 deco_plan_show_nstd_stop_common:
 	;---- Print duration -------------------------------------------------
 	WIN_LEFT .135
 	lfsr	FSR2,buffer
-
-	movf	lo,W						; Swap hi & lo
 	movff	hi,lo
-	movwf	hi
-
-	output_8							; Allow up to 240'
-	clrf	WREG
-	movff	WREG,buffer+.3				; limit to 2 chars
-	STRCAT_PRINT ""
-
-	movf	lo,W						; Swap back hi & lo
-	movff	hi,lo
-	movwf	hi
+	output_99							; stop entries are 99 min max.
+	STRCAT_PRINT "'"
 
 	;---------------------------------------------------------------------
-	; Draw the bar graph used for deco stops (deco plan in simulator or dive).
+	; Draw the bar graph used for deco stops (deco plan in simulator or dive)
 	incf	win_top,F
 	movlw	.19
 	movwf	win_height
 	movlw	.118
 	movwf	win_leftx2					; column left (0-159)
 	movlw	.16
-	movwf	win_width+0					; column max width.
+	movwf	win_width+0					; column max width
 	clrf	win_width+1
 
-	; Draw used area (hi = minutes):
-	movlw	.16							; Limit length (16min)
-	cpfslt	hi
-	movwf	hi
-	movff	hi,win_bargraph				; Active width, the rest is cleared.
+	; Draw used area (lo = minutes):
+	movlw	.16							; limit length to max. column width
+	cpfslt	lo
+	movwf	lo
+	movff	lo,win_bargraph				; active width, the rest is cleared
 	call	TFT_box
 
 	; Restore win_top
 	call	TFT_standard_color
-	decf	win_top,F					; Restore win_top
+	decf	win_top,F					; restore win_top
 	return
 
 ;-----------------------------------------------------------------------------
 ; Clear unused area below last stop
 ; Inputs: win_top : last used area...
 deco_plan_show_clear_bottom:
-	movf	win_top,W					; Get back from bank0
-	sublw	.239						; No: bottom row in planning
+	movf	win_top,W					; get back from bank0
+	sublw	.239						; bottom row in planning
 	movwf	win_height
 
-	WIN_LEFT .85						; Full dive menu width
+	WIN_LEFT .85						; full dive menu width
 	movlw	.159-.85+.1
 	movwf	win_width+0
 	clrf	win_width+1
 
-	clrf	win_color1					; Fill with black
+	clrf	win_color1					; fill with black
 	clrf	win_color2
 
 	goto	TFT_box						; and return
@@ -372,9 +348,9 @@
 ;         decoplan_page = page number.
 ;
 deco_show_plan_page:
-	bcf	 win_invert						; Reset invert flag
+	bcf		win_invert					; reset invert flag
 
-	;---- Is there deco stops ? ------------------------------------------
+	;---- Are there deco stops ? ------------------------------------------
 	movff	char_O_first_deco_depth,WREG
 	iorwf	WREG
 	bnz		deco_plan_show_1
@@ -382,15 +358,25 @@
 	;---- No Deco --------------------------------------------------------
 	call	TFT_standard_color
 	TEXT_SMALL .80, .0, tNoDeco
+
+	; output of remaining NDL time
+	WIN_SMALL	.80, .50				; same line as bottom time
+	movff	char_O_nullzeit,lo			; remaining NDL at end of bottom time
+	output_8
+	PUTC	"'"
+	PUTC	" "
+	STRCAT_TEXT_PRINT tNDLleft			; "left"
+
 	bsf		decoplan_last_ceiling_shown
 	return
 
 deco_plan_show_1:
-	lfsr	FSR0,char_O_deco_depth		; Initialize indexed addressing.
+	lfsr	FSR0,char_O_deco_depth		; initialize indexed addressing
 	lfsr	FSR1,char_O_deco_time
 
-	clrf	decoplan_index				; Start with index = 0
-	clrf	win_top						; and row = 0
+	clrf	decoplan_index				; start with index = 0
+	movlw	.24
+	movwf	win_top						; and row = 0 at position 24
 
 	; Read stop parameters, indexed by decoplan_index and decoplan_page
 	movf	decoplan_page,W				; decoplan_gindex = 6*decoplan_page + decoplan_index
@@ -399,18 +385,18 @@
 	addwf	PRODL,W
 	movwf	decoplan_gindex				; --> decoplan_gindex
 
-	bcf		decoplan_last_ceiling_shown	; Not finished yet...
+	bcf		decoplan_last_ceiling_shown	; not done yet...
 
 deco_plan_show_2:
-	btfsc	decoplan_gindex,5			; Reached table length (32) ?
-	bra		deco_plan_show_99			; YES: finished...
+	btfsc	decoplan_gindex,5			; reached table length (32) ?
+	bra		deco_plan_show_99			; YES - done
 
 	; Read stop parameters, indexed by decoplan_index
 	movf	decoplan_gindex,W			; index
 	movff	PLUSW0,lo					; char_O_deco_depth[gindex]
 	movff	PLUSW1,hi					; char_O_deco_time [gindex]
 	movf	lo,W
-	bz		deco_plan_show_99			; depth == 0 : finished.
+	bz		deco_plan_show_99			; depth == 0 : done
 
 	; Display the stop line
 	rcall	deco_plan_show_stop
@@ -424,23 +410,23 @@
 	; Max number of lines/page reached ?
 	movlw	.8							; 8 lines/page in deco plan
 	cpfseq	decoplan_index
-	bra		deco_plan_show_2			; NO: loop
+	bra		deco_plan_show_2			; NO - loop
 
 	; Check if next stop is end-of-list ?
 	movf	decoplan_gindex,W
 	movf	PLUSW0,W					; char_O_deco_depth[gindex]
-	bz		deco_plan_show_99			; End of list...
+	bz		deco_plan_show_99			; end of list
 
 	; Display the message "more..."
-	rcall	deco_plan_show_clear_bottom	; Clear from next line
+	rcall	deco_plan_show_clear_bottom	; clear from next line
 
 	call	TFT_standard_color
 	TEXT_SMALL .88, .220, tMore
 	return
 
 deco_plan_show_99:
-	bsf		decoplan_last_ceiling_shown ; Nothing more in table to display.
-	rcall	deco_plan_show_clear_bottom ; Clear from next line
+	bsf		decoplan_last_ceiling_shown ; nothing more in table to display
+	rcall	deco_plan_show_clear_bottom ; clear from next line
 	return
 
 ;-----------------------------------------------------------------------------
@@ -451,17 +437,17 @@
 	clrf	decoplan_page
 	call	TFT_ClearScreen
 	WIN_COLOR color_greenish
-	btfsc	is_bailout
+	btfsc	FLAG_bailout_mode
 	bra		deco_show_plan_bail_title
 	TEXT_SMALL .1,.1, tDivePlan
 	bra		deco_show_plan2
-deco_show_plan_bail_title:	
-		TEXT_SMALL .1,.1, tDiveBailout
+deco_show_plan_bail_title:
+	TEXT_SMALL .1,.1, tDiveBailout
 deco_show_plan2:
 	call	TFT_standard_color
 	;---- Display Plan Parameters
 	WIN_SMALL .0,.25
-	STRCPY	"Int:"
+	STRCPY	"Int.:"
 	movff	char_I_dive_interval,lo
 	bsf		leftbind
 	output_8
@@ -470,17 +456,17 @@
 	WIN_SMALL .0,.50
 	STRCPY_TEXT tBtTm_short
 	movff	char_I_bottom_time,lo
-	bsf	leftbind
+	bsf		leftbind
 	output_8
-	bcf	leftbind
+	bcf		leftbind
 	STRCAT_PRINT "'"
 	WIN_SMALL .0,.75
 	STRCPY_TEXT tDepth
 	PUTC	":"
 	movff	char_I_bottom_depth,lo
-	bsf	leftbind
+	bsf		leftbind
 	output_8
-	bcf	leftbind
+	bcf		leftbind
 	STRCAT_PRINT "m"
 	WIN_SMALL .0,.105								; set position for warnings or sat/dsat factors
 
@@ -507,7 +493,7 @@
 	WIN_SMALL .25,.105
 	movff	char_I_saturation_multiplier,lo
 	output_8
-	STRCAT "/"
+	STRCAT	"/"
 	movff	char_I_desaturation_multiplier,lo
 	output_8
 	STRCAT_PRINT ""
@@ -515,20 +501,20 @@
 deco_show_plan_m1:
 	call	TFT_standard_color				; clean-up from warnings
 
-	;---- Get Model
+	;---- get Model
 	movff	char_I_deco_model,WREG
 	iorwf	WREG
-	bz	 deco_show_plan_m2
+	bz		deco_show_plan_m2
 
 	;---- Display GF low/high values
 	WIN_SMALL .0,.130
 	STRCAT_PRINT "GF:"
 	WIN_SMALL .25,.130
 	movff	char_I_GF_Low_percentage,lo
-	output_99x
+	output_8
 	STRCAT	"/"
 	movff	char_I_GF_High_percentage,lo
-	output_99x
+	output_8
 	STRCAT_PRINT ""
 
 deco_show_plan_m2:
@@ -564,14 +550,14 @@
 	STRCPY_TEXT tCNS2						; "CNS:"
 	movff	int_O_CNS_fraction+0,lo
 	movff	int_O_CNS_fraction+1,hi
-	call	TFT_color_code_cns				; Color-code CNS output
+	call	TFT_color_code_cns				; color-code CNS output
 	bsf		leftbind
 	output_16_3								; limit to 999 and display only (0-999)
 	bcf		leftbind
 	STRCAT	"%\x92"							; "->"
 	movff	int_O_normal_CNS_fraction+0,lo
 	movff	int_O_normal_CNS_fraction+1,hi
-	call	TFT_color_code_cns				; Color-code CNS output
+	call	TFT_color_code_cns				; color-code CNS output
 	bsf		leftbind
 	output_16_3								; limit to 999 and display only (0-999)
 	bcf		leftbind
@@ -590,22 +576,22 @@
 	btfsc	switch_right
 	bra		deco_show_plan_3
 	btfsc	switch_left
-	return									; Return to simulator menu
-	call	log_screendump_and_onesecond	; Check if we need to make a screen shot and check for new second
-	btfsc	sleepmode						; Timeout?
+	return									; return to simulator menu
+	call	log_screendump_and_onesecond	; check if we need to make a screen shot and check for new second
+	btfsc	sleepmode						; timeout?
 	goto	restart
 	bra		deco_show_plan_2
 
 deco_show_plan_3:
 	btfss	decoplan_last_ceiling_shown
 	bra		deco_show_plan_1
-	; All stops shown
+	; all stops shown
 
-;---- In CCR and pSCR mode, compute a BAILOUT deco plan -----------------------
+;----in CCR and pSCR mode, compute a BAILOUT deco plan -----------------------
 	movff	char_O_deco_status,WREG			; get deco calculation status
 	btfss	WREG,DECO_MODE_LOOP_FLAG		; check if in CCR or pSCR mode
 	bra		simulator_show_decoplan5_0		; NO  - normal OC mode: just display
-	bsf		is_bailout						; YES - redo 2nd deco-plan in bailout mode
+	bsf		FLAG_bailout_mode				; YES - redo 2nd deco-plan in bailout mode
 	rcall	deco_planer_redo				;       redo plan computation
 
 	btfss	decoplan_abort					; shall we abort?
@@ -613,42 +599,44 @@
 	return									; YES
 
 
-;---- In OC+BAIL modes, show the gas usage special page -----------------------
+;---- in OC+BAIL modes, show the gas usage special page -----------------------
 simulator_show_decoplan5_0:
 	; Clear the complete stop result column:
 	WIN_BOX_BLACK .0, .239, .80, .159		; top, bottom, left, right
 
 	movlw	.25
-	movwf	row_pos							; Row for gas list is .25+.25
-	clrf	gas_counter						; Gas counter
-	lfsr	FSR0,int_O_gas_volumes			; Initialize indexed addressing.
+	movwf	row_pos							; row for gas list is .25+.25
+	clrf	gas_counter						; gas counter
+	lfsr	FSR0,int_O_ascent_volumes		; initialize indexed addressing
 
-	WIN_LEFT .80							; Set column
+	WIN_LEFT .80							; set column
 	call	TFT_standard_color
 
+	bcf		FLAG_diluent_setup				; steer gaslist_strcat_gas to use OC gases
+
 simulator_show_decoplan5_loop:
-	movff	gas_counter,PRODL				; Copy to PRODL first
-	incf	gas_counter,F					; Increment gas #
+	movff	gas_counter,PRODL				; copy to PRODL first
+	incf	gas_counter,F					; increment gas #
 
 	movff	gas_counter,WREG				; copy current gas to WREG for color-coding
 	call	TFT_color_code_gas				; set output color according to gas (1-5)
 
 	lfsr	FSR2,buffer
 	bsf		short_gas_decriptions
-	bsf		divemode						; Tweak "customview_show_mix:"
-	call	gaslist_strcat_gas				; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
-	bcf		divemode						; Tweak "customview_show_mix:"
+	bsf		divemode						; tweak "customview_show_mix:"
+	call	gaslist_strcat_gas				; input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
+	bcf		divemode						; tweak "customview_show_mix:"
 
 	movlw	.25
-	addwf	row_pos,F						; Increase row position
-	movff	row_pos,win_top					; Set Row
+	addwf	row_pos,F						; increase row position
+	movff	row_pos,win_top					; set row
 
-	movff	POSTINC0,lo						; Read (16bit) result, low first,
-	movff	POSTINC0,hi						; then high.
+	movff	POSTINC0,lo						; read (16bit) result, low first,
+	movff	POSTINC0,hi						; then high
 
 	movf	lo,W
 	andwf	hi,W
-	incf	WREG							; > 65535? 
+	incf	WREG							; > 65535 ?
 	bnz		simulator_show_decoplan5_1		; NO
 	STRCAT_PRINT ">65500"					; YES
 	bra		simulator_show_decoplan5_2
@@ -656,27 +644,25 @@
 simulator_show_decoplan5_1:
 	PUTC	":"
 	bsf		leftbind
-	output_16								; No decimal anymore.
+	output_16								; no decimal anymore
 	bcf		leftbind
 	STRCAT_PRINT ""
 
 	; Loop for all 5 gas
 simulator_show_decoplan5_2:
 	movlw	d'5'							; list all five gases
-	cpfseq	gas_counter						; All gases shown?
-	bra		simulator_show_decoplan5_loop	; No
+	cpfseq	gas_counter						; all gases shown?
+	bra		simulator_show_decoplan5_loop	; NO - loop
 
 	WIN_COLOR color_greenish
 
-	movlw	.30
-	addwf	row_pos,F						; Increase row position
-	movff	row_pos,win_top					; Set Row
-	STRCPY_TEXT_PRINT tBarLiter				; "Bar Liter"
-
 	WIN_SMALL .80,.25
 	STRCPY_TEXT tGasUsage					; "Gas Usage"
 	STRCAT_PRINT ":"
 
+	WIN_SMALL .120,.175
+	STRCPY_TEXT_PRINT tLiterLong			; "Liter"
+
 	call	TFT_standard_color
 	call	logbook_preloop_tasks
 
@@ -689,13 +675,12 @@
 simulator_show_decoplan5_3a:
 	btfss	switch_left
 	bra		simulator_show_decoplan5_4
-	bcf		is_bailout						; Back to normal
-	bcf		ccr_diluent_setup				; init for OC/Bailout
-	return									; Return to simulator menu
+	bcf		FLAG_bailout_mode				; back to normal
+	return									; return to simulator menu
 
 simulator_show_decoplan5_4:
-	call	log_screendump_and_onesecond	; Check if we need to make a screen shot and check for new second
-	btfsc	sleepmode						; Timeout?
+	call	log_screendump_and_onesecond	; check if we need to make a screen shot and check for new second
+	btfsc	sleepmode						; timeout?
 	goto	restart
 	bra		simulator_show_decoplan5_3
 
--- a/src/sleepmode.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/sleepmode.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File sleepmode.asm											Version 2.98
+;   File sleepmode.asm											Version 2.99e
 ;
 ;   Sleepmode
 ;
@@ -40,19 +40,23 @@
 	ENDC								; used: 5 byte, remaining: 11 byte
 
 
-gui	CODE
+slmode		CODE
 
 ;==============================================================================
 
 	global	sleeploop
-sleeploop:									; enter sleepmode!
+sleeploop:									; enter sleep mode
 	call	disable_ir_s8					; IR/S8 off
 	call	mcp_sleep
 	bcf		LEDg
 	bcf		LEDr
 	call	TFT_Display_FadeOut
 	call	TFT_DisplayOff					; display off
-	bcf		enable_screen_dumps				; =1: Ignore vin_usb, wait for "l" command (Screen dump)
+
+ IFDEF _screendump
+	bcf		enable_screen_dumps				; =1: Ignore vin_usb, wait for "l" command (screen dump)
+ ENDIF
+
 	call	disable_rs232					; USB off
 	call	vault_decodata_into_eeprom		; store deco data
 	call	ext_flash_enable_protection		; enable write protection for external flash
@@ -63,15 +67,15 @@
 	clrf	sm_timer2
 	clrf	sm_timer3
 	call	speed_normal
-	bsf		no_sensor_int					; No sensor interrupt
-	clrf	ADCON0							; Power-Down ADC Module
+	bsf		no_sensor_int					; inhibit sensor interrupts
+	clrf	ADCON0							; power-down ADC module
 
 sleeploop_pre:
-	bcf		deep_sleep						; Normal sleepmode
+	bcf		deep_sleep						; normal sleep mode
 	call	I2C_sleep_accelerometer
 	call	I2C_sleep_compass
-	btfss	analog_switches
-	bra		sleeploop_loop					; no analog switches
+	btfss	analog_switches					; OSTC with analog switches?
+	bra		sleeploop_loop					; NO - no analog switches
 
 	bsf		power_sw1
 	btfss	power_sw1
@@ -79,19 +83,19 @@
 	bsf		power_sw2
 	btfss	power_sw2
 	bra		$-4
-	movlw	.4								; Wait for button circuity
-	movwf	sm_temp1			; Used as temp
-	bcf	onesecupdate
+	movlw	.4								; wait for button circuity
+	movwf	sm_temp1						; used as temp
+	bcf		onesecupdate
 
 sleeploop_pre1:
 	rcall	sleepmode_sleep
-	btfss	onesecupdate					; Wait 1 second
+	btfss	onesecupdate					; wait 1 second
 	bra		sleeploop_pre1
 	bcf		onesecupdate
 	decfsz	sm_temp1,F
 	bra		sleeploop_pre1
-	movlw	.32								; Wait for button circuity
-	movwf	sm_temp1			; Used as temp
+	movlw	.32								; wait for button circuity
+	movwf	sm_temp1						; used as temp
 
 sleeploop_pre2:	
 	call	get_analog_switches
@@ -106,33 +110,33 @@
 	bcf		switch_right
 	bcf		analog_sw2_pressed
 	bcf		analog_sw1_pressed
-	bsf		PIE1,0							; (Re)Start Timer 1 Interrupt
-	bsf		PIE2,1							; (Re)Start Timer 2 Interrupt
-	bsf		PIE5,3							; (Re)Start Timer 7 Interrupt
-	bsf		INTCON,4						; (Re)Start INT0 Interrupt
-	bsf		INTCON3,3						; (Re)Start INT1 Interrupt
+	bsf		PIE1,0							; (re)start timer 1 interrupt
+	bsf		PIE2,1							; (re)start timer 2 interrupt
+	bsf		PIE5,3							; (re)start timer 7 interrupt
+	bsf		INTCON,4						; (re)start INT0 interrupt
+	bsf		INTCON3,3						; (re)start INT1 interrupt
 
 sleeploop_loop:
 	btfsc	onesecupdate					; one second in sleep?
 	rcall	onesec_sleep					; check switches, check pressure sensor, etc.
 
 	btfss	sleepmode						; wake up? (This bit will be set in other routines)
-	goto	restart							; yes
+	goto	restart							; YES
 
-	btfsc	deep_sleep						; Enter deep sleep?
-	bra		deepsleep						; Yes
+	btfsc	deep_sleep						; enter deep sleep?
+	bra		deepsleep						; YES
 
 no_deepsleep:
-	rcall	sleepmode_sleep					; Wait at least 35ms (every 62,5ms Timer7 wakeup)
+	rcall	sleepmode_sleep					; wait at least 35 ms (every 62.5ms timer7 wakeup)
 
 	; Any button pressed in sleep?
-;	btfsc	switch_left	
+;	btfsc	switch_left
 ;	rcall	onesec_sleep1a
 ;	btfsc	switch_right
 ;	rcall	onesec_sleep1a
 ;
-;	btfss	sleepmode						; wake up? (This bit will be set in other routines)
-;	goto	restart							; yes
+;	btfss	sleepmode						; wake up? (this bit will be set in other routines)
+;	goto	restart							; YES
 
 	bra		sleeploop_loop					; do loop until something happens
 
@@ -140,39 +144,39 @@
 	btfss	analog_switches
 	bra		no_deepsleep					; no analog switches, no deep sleep required
 
-	bcf		PIE1,0							; Stop Timer 1 Interrupt
-	bcf		PIE2,1							; Stop Timer 2 Interrupt
-	bcf		PIE5,3							; Stop Timer 7 Interrupt
-	bcf		INTCON,4						; Stop INT0 Interrupt
-	bcf		INTCON3,3						; Stop INT1 Interrupt
+	bcf		PIE1,0							; stop timer 1 interrupt
+	bcf		PIE2,1							; stop timer 2 interrupt
+	bcf		PIE5,3							; stop timer 7 interrupt
+	bcf		INTCON,4						; stop INT0 interrupt
+	bcf		INTCON3,3						; stop INT1 interrupt
 	bcf		power_sw1
 	bcf		power_sw2
-	rcall	deepsleep_get_accel				; Read accelerometer into WREG
-	movwf	sm_temp1			; Store init value
+	rcall	deepsleep_get_accel				; read accelerometer into WREG
+	movwf	sm_temp1						; store init value
 
 deepsleep_loop:
 	btfsc	onesecupdate					; one second in sleep?
-	rcall	onesec_deepsleep				; check accelerometer
+	rcall	onesec_deepsleep				; YES - check accelerometer
 
 	btfsc	onesecupdate					; one second in sleep?
-	rcall	onesec_sleep					; check switches, check pressure sensor, etc.
+	rcall	onesec_sleep					; YES - check switches, check pressure sensor, etc.
 
 	rcall	sleepmode_sleep
 
-	btfss	deep_sleep						; Enter normal sleepmode?
+	btfss	deep_sleep						; enter normal sleep mode?
 	bra		sleeploop_pre					; Yes
 
 	bra		deepsleep_loop					; do loop until something happens
 
 onesec_deepsleep:
-	rcall	deepsleep_get_accel				; Read accelerometer into WREG
-	subwf	sm_temp1,W			; sm_temp1 - accel_DZ+0 -> WREG
-	btfsc	STATUS,N						; Result negative?
-	negf	WREG							; Yes, negate it
-	movwf	sm_temp2			; change of acceleration in Z-axis
-	movlw	.50								; Threshold (mg)
-	cpfslt	sm_temp2			; bigger then the threshold?
-	bcf		deep_sleep						; Yes!
+	rcall	deepsleep_get_accel				; read accelerometer into WREG
+	subwf	sm_temp1,W						; sm_temp1 - accel_DZ+0 -> WREG
+	btfsc	STATUS,N						; result negative?
+	negf	WREG							; YES - negate it
+	movwf	sm_temp2						; change of acceleration in Z-axis
+	movlw	.50								; threshold (mg)
+	cpfslt	sm_temp2						; bigger then the threshold?
+	bcf		deep_sleep						; YES
 
 ;	extern	piezo_config_tx
 ;	movff	sm_temp1,WREG
@@ -187,7 +191,7 @@
 deepsleep_get_accel:
 	call	I2C_init_compass				; required for compass1
 	call	I2C_init_accelerometer			; required for compass2
-	call	I2C_RX_accelerometer			; read Accelerometer
+	call	I2C_RX_accelerometer			; read accelerometer
 	call	I2C_sleep_compass				; required for compass1
 	call	I2C_sleep_accelerometer			; required for compass2
 	movff	accel_DZ+0,WREG
@@ -201,10 +205,10 @@
 
 onemin_sleep:
 	btfsc	onehourupdate					; one hour in sleep?
-	rcall	onehour_sleep					; Yes
+	rcall	onehour_sleep					; YES
 
 	btfsc	battery_gauge_available
-	call	get_battery_voltage				; Check for charger
+	call	get_battery_voltage				; check for charger
 
 	;---- update tissues and CNS every 10 minutes when gradient factor is 0 (no supersaturation in any tissue any more)
 	movff	int_O_gradient_factor+0,WREG	; get gradient factor, only the lower byte is used for the value
@@ -269,10 +273,10 @@
 
 onesec_sleep:
 	btfsc	oneminupdate					; one minute in sleep?
-	rcall	onemin_sleep					; do one-minute tasks, e.g. calculate desaturation
+	rcall	onemin_sleep					; YES - do one-minute tasks, e.g. calculate desaturation
 
 	btfsc	battery_gauge_available
-	call	get_battery_voltage				; Check for charger
+	call	get_battery_voltage				; check for charger
 
 	incf	sm_timer1,F						; counts to #test_pressure_in_sleep (10)
 	movlw	d'10'
@@ -287,73 +291,65 @@
 	movlw	HIGH wake_up_from_sleep
 	movwf	sub_a+1							; power on if ambient pressure is greater threshold
 	SAFE_2BYTE_COPY amb_pressure, sub_b
-	call	subU16							; Is (1160mbar - averaged(amb_pressure)) < 0 ?
-	btfsc	neg_flag						; Wake up from Sleep?
-	bra		onesec_sleep1a					; Yes, skip button checks, wake up!
+	call	subU16							; is (1160mbar - averaged(amb_pressure)) < 0 ?
+	btfsc	neg_flag						; wake up from sleep?
+	bra		onesec_sleep1a					; YES - skip button checks, wake up!
 
 	btfsc	battery_gauge_available
-	bra		onesec_sleep1					; No wake-up with cR hardware
+	bra		onesec_sleep1					; no wake-up with cR hardware
 	btfsc	vusb_in							; USB plugged in?
-	bra		onesec_sleep1a					; Yes, skip button checks, wake up!
+	bra		onesec_sleep1a					; YES - skip button checks, wake up
 
 onesec_sleep1:
-	bcf	onesecupdate						; all done.
-	; Check switches
-	btfsc	switch_left
-	bra		onesec_sleep1a
-	btfsc	switch_right
-	bra		onesec_sleep1a
+	bcf		onesecupdate					; clear flag
+	btfsc	switch_left						; left switch pressed?
+	bra		onesec_sleep1a					; YES
+	btfsc	switch_right					; right switch pressed?
+	bra		onesec_sleep1a					; YES
+	return									; NO to both - done
 
-; No button pressed
-;	bcf		INTCON,INT0IF					; Clear flag
-;	bcf		INTCON3,INT1IF					; Clear flag
-
-	return
-
-onesec_sleep1a:								; At least one button pressed or amb_pressure > wake_up_from_sleep
-;	bcf		INTCON,INT0IF					; Clear flag
-;	bcf		INTCON3,INT1IF					; Clear flag
-	bcf		sleepmode						; wake up!
+onesec_sleep1a:								; at least one button pressed or amb_pressure -> wake_up_from_sleep
+	bcf		sleepmode						; wake up
 	SAFE_2BYTE_COPY last_surfpressure_30min, amb_pressure	; copy for compatibility
 	movlw	.0
-	movff	WREG,sensor_state_counter		; Reset sensor state counter
+	movff	WREG,sensor_state_counter		; reset sensor state counter
 	bcf		no_sensor_int					; normal sensor interrupt mode
 	return
 
-pressuretest_sleep_fast:					; Get pressure without averaging (Faster to save some power in sleep mode)
-	banksel	isr_backup						; Back to Bank0 ISR data
-	clrf	amb_pressure_avg+0				; pressure average registers
+pressuretest_sleep_fast:					; get pressure without averaging (faster to save some power in sleep mode)
+	banksel	isr_backup						; back to Bank0 ISR data
+	clrf	amb_pressure_avg+0				; clear pressure average registers
 	clrf	amb_pressure_avg+1
-	clrf	temperature_avg+0
+	clrf	temperature_avg+0				; clear temperature average registers
 	clrf	temperature_avg+1
-	call	get_temperature_start			; and start temperature integration (73,5us)
+	call	get_temperature_start			; start temperature integration (73.5 us)
 	banksel	common
-	rcall	sleepmode_sleep					; Wait at least 35ms (every 62,5ms Timer7 wakeup)
-	rcall	sleepmode_sleep					; Wait at least 35ms (every 62,5ms Timer7 wakeup)
-	banksel	isr_backup						; Back to Bank0 ISR data
-	call	get_temperature_value			; State 1: Get temperature
-	call	get_pressure_start				; Start pressure integration.
+	rcall	sleepmode_sleep					; wait at least 35 ms (every 62.5 ms timer7 wakeup)
+	rcall	sleepmode_sleep					; wait at least 35 ms (every 62.5 ms timer7 wakeup)
+	banksel	isr_backup						; back to Bank0 ISR data
+	call	get_temperature_value			; state 1: get temperature
+	call	get_pressure_start				; start pressure integration
 	banksel	common
-	rcall	sleepmode_sleep					; Wait at least 35ms (every 62,5ms Timer7 wakeup)
-	rcall	sleepmode_sleep					; Wait at least 35ms (every 62,5ms Timer7 wakeup)
-	banksel	isr_backup						; Back to Bank0 ISR data
-	call	get_pressure_value				; State2: Get pressure (51us)
-	call	calculate_compensation			; calculate temperature compensated pressure (27us)
+	rcall	sleepmode_sleep					; wait at least 35 ms (every 62.5 ms timer7 wakeup)
+	rcall	sleepmode_sleep					; wait at least 35 ms (every 62.5 ms timer7 wakeup)
+	banksel	isr_backup						; back to bank0 ISR data
+	call	get_pressure_value				; state2: get pressure (51 us)
+	call	calculate_compensation			; calculate temperature compensated pressure (27 us)
 	banksel	common
 	SAFE_2BYTE_COPY amb_pressure_avg, amb_pressure	; copy for compatibility
 	return
 
 sleepmode_sleep:
-	banksel 0xF16							; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
-	clrf	T7GCON							; Reset Timer7 Gate Control register
-	movlw	b'10001101'						; 1:1 Prescaler -> 2seconds@32768Hz, not synced
+	banksel 0xF16							; addresses F16h through F5Fh are also used by SFRs, but are not part of the access RAM
+	clrf	T7GCON							; reset timer7 gate control register
+	movlw	b'10001101'						; 1:1 prescaler -> 2 seconds @ 32768 Hz, not synced
 	movwf	T7CON
 	sleep
 	sleep
-	clrf	T7GCON							; Reset Timer7 Gate Control register
-	movlw	b'10001001'						; 1:1 Prescaler -> 2seconds@32768Hz, synced
+	clrf	T7GCON							; reset timer7 gate control register
+	movlw	b'10001001'						; 1:1 prescaler ->  2 seconds @ 32768Hz, synced
 	movwf	T7CON
-	banksel	common							; Bank1
+	banksel	common							; back to bank1
 	return
 
  END
\ No newline at end of file
--- a/src/sleepmode.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/sleepmode.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -8,4 +8,4 @@
 ; HISTORY
 ;  2011-08-12 : [mH] moving from OSTC code
 
- extern sleeploop
+	extern	sleeploop
--- a/src/start.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/start.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File start.asm									REFACTORED VERSION	V2.98
+;   File start.asm									REFACTORED VERSION	V2.99e
 ;
 ;   Startup subroutines
 ;
@@ -9,10 +9,10 @@
 ; HISTORY
 ;  2011-08-06 : [mH] moving from OSTC code
 
-#include "hwos.inc"							; Mandatory header
+#include "hwos.inc"							; mandatory header
 #include "ms5541.inc"
 #include "isr.inc"
-#include "shared_definitions.h"				; Mailbox from/to p2_deco.c
+#include "shared_definitions.h"				; mailbox from/to p2_deco.c
 #include "eeprom_rs232.inc"
 #include "math.inc"
 #include "tft.inc"
@@ -28,9 +28,7 @@
 
 	extern	init_ostc
 	extern	option_restore_all
-	extern	deco_setup
 	extern	restore_decodata_from_eeprom
-	extern	color_image
 	extern	oPressureAdjust
 	extern	option_reset
 	extern	option_save
@@ -39,36 +37,48 @@
 	extern	do_new_battery_select
 	extern	use_old_batteries
 	extern	use_old_prior_209
+	extern	get_first_gas_to_WREG
+	extern	get_first_dil_to_WREG
+	extern	option_cleanup_oCCRMode_pSCR
+	extern	option_cleanup_oCCRMode_CCR
+
+ IFDEF _rx_functions
+	extern	option_cleanup_oTrMode_CCR
+	extern	option_cleanup_oTrMode_no_CCR
+ ENDIF
+
 
 ;=============================================================================
-; Reset vector: What to do on device wake-up and hard reset.
+; Reset Vector: entry point on device wake-up and hard reset
 ;
 reset_v code 0x00000
 
 ;	goto	start
-	goto	0x1FF00							; Bootloader
+	goto	0x1FF00							; bootloader
 
-	ORG		0x00004							; Needed for second-level bootloader
+	ORG		0x00004							; needed for second-level bootloader
 	goto	start
 
 ;=============================================================================
 
-boot	CODE
+boot		CODE
+
+;=============================================================================
 
 	global	start
 start:
-	lfsr	FSR0,0x000						; Clear rambank 0-14
+	lfsr	FSR0,0x000						; clear ram-banks 0-14
 clear_rambank:
 	clrf	POSTINC0
 	movlw	0x0F
-	cpfseq	FSR0H							; Bank 14 done?
-	bra		clear_rambank					; clear...
+	cpfseq	FSR0H							; bank 14 done?
+	bra		clear_rambank					; NO - loop
 
-	call	init_ostc
+	call	init_ostc						; initialize hardware (ports, timers, etc.)
 
-	; Get button type from Bootloader-Info
+	; get button type from Bootloader-Info
 	movlw	.16
-	movff	WREG,analog_counter				; init averaging
+	movff	WREG,analog_counter				; initialize averaging
 	bsf		analog_switches
 	movlw	0x7C
 	movwf	TBLPTRL
@@ -76,7 +86,7 @@
 	movwf	TBLPTRH
 	movlw	0x01
 	movwf	TBLPTRU
-	TBLRD*+									; Reads 0x07 for analog buttons
+	TBLRD*+									; reads 0x07 for analog buttons
 	movlw	0x07
 	cpfseq	TABLAT
 	bcf		analog_switches
@@ -86,23 +96,23 @@
 	movwf	EEADR
 	movlw	HIGH .897
 	movwf	EEADRH
-	call	read_eeprom						; EEDATA into EEPROM@EEADR
-	clrf	EEADRH							; Reset EEADRH
-	movff	EEDATA,button_polarity			; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) 
+	call	read_eeprom						; EEDATA into EEPROM @ EEADR
+	clrf	EEADRH							; reset EEADRH
+	movff	EEDATA,button_polarity			; 0xFF (both normal), 0x00 (both inverted), 0x01 (left inverted only), 0x02 (right inverted only)
 
-	; Air pressure compensation	after reset
+	; air pressure compensation after reset
 	call	get_calibration_data			; get calibration data from pressure sensor
 	banksel	common							; get_calibration_data uses isr_backup
 
 	call	TFT_DisplayOff					; turn off display
 	bsf		LEDr							; turn on  red LED
 	bcf		pressure_refresh
-	; First pass will not have valid temperature!
-	btfss	pressure_refresh				; Air pressure compensation
+	; first pass will not have valid temperature
+	btfss	pressure_refresh				; air pressure compensation
 	bra		$-2
-	; Second pass
+	; second pass
 	bcf		pressure_refresh
-	btfss	pressure_refresh				; Air pressure compensation
+	btfss	pressure_refresh				; air pressure compensation
 	bra		$-2
 	bcf		LEDr
 
@@ -120,10 +130,10 @@
 	movff	last_surfpressure+0,sub_b+0
 	movff	last_surfpressure+1,sub_b+1
 	call	subU16							; sub_c = sub_a - sub_b
-	btfss	neg_flag						; Is 1080mbar < amb_pressure ?
-	bra		start_copy_pressure				; NO: current air pressure is lower then "allowed" air pressure, ok!
+	btfss	neg_flag						; is 1080 mbar < amb_pressure ?
+	bra		start_copy_pressure				; NO - current air pressure is lower then "allowed" air pressure, ok
 
-	; not ok! Overwrite with max. "allowed" air pressure
+	; not ok - overwrite with max. "allowed" air pressure
 	movlw	LOW  max_surfpressure
 	movff	WREG,last_surfpressure+0		; max. "allowed" air pressure in mbar
 	movlw	HIGH max_surfpressure
@@ -142,9 +152,7 @@
 	movff	int_I_pres_respiration+0,int_I_pres_surface+0	; surface pressure
 	movff	int_I_pres_respiration+1,int_I_pres_surface+1
 
-	call	deco_setup						; set up all model parameters (code located in simulator.asm)
-
-	call	deco_clear_tissue				; Set all tissues to Pamb * N2_ratio (code located in p2_deco.c)
+	call	deco_clear_tissue				; set all tissues to Pamb * N2_ratio (code located in p2_deco.c)
 	banksel	common							; back to bank 1, needed after every return from C code
 
 	call	rtc_init						; init clock
@@ -155,8 +163,8 @@
 	clrf	EEADRH
 	movlw	0xAA
 	cpfseq	EEDATA							; =0xAA
-	bra		no_deco_restore					; No
-	call	restore_decodata_from_eeprom	; Reload deco data and date/time from eeprom
+	bra		no_deco_restore					; NO
+	call	restore_decodata_from_eeprom	; reload deco data and date/time from eeprom
 no_deco_restore:
 	call	deco_calc_dive_interval_1min	; calculate deco in surface mode
 	call	deco_calc_desaturation_time		; calculate desaturation and no-fly time
@@ -164,32 +172,57 @@
 
 	bcf		menubit							; clear menu flag
 
-	; Check for Power-on reset here
+	; check for power-on reset here
 
 	; *****************************************************************************
 	; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return"
 	; *****************************************************************************
 
 	; Try to migrate the old battery status from firmware 2.09 or earlier..
-	btfsc	RCON,POR						; Was this a power-on reset?
-	call	use_old_prior_209				; No
+	btfsc	RCON,POR						; was this a power-on reset?
+	call	use_old_prior_209				; NO
 
 	bcf		use_old_batt_flag
-	btfsc	RCON,POR						; Was this a power-on reset?
-	bsf		use_old_batt_flag				; No
+	btfsc	RCON,POR						; was this a power-on reset?
+	bsf		use_old_batt_flag				; NO
  
-	call	lt2942_get_status				; Check for gauge IC
+	call	lt2942_get_status				; check for gauge IC
 	btfss	battery_gauge_available			; cR or 2 hardware?
-	bra		power_on_return2				; no
+	bra		check_firmware_new				; NO  - skip next
+	movlw	.30								; YES - reset button sensitivity
+	movff	WREG,opt_cR_button_right
+	movff	WREG,opt_cR_button_left			; reset on power-on reset
+	call	piezo_config					; configure buttons
+	call	piezo_config					; configure buttons (2 times)
+
+check_firmware_new:
+	call	TFT_boot						; initialize TFT (includes clear screen)
+	clrf	CCPR1L							; backlight off
+
+	WIN_TOP  .40
+	WIN_LEFT .10
+	TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block ; show heinrichsweikamp logo
 
-	movlw	.30
-	movff	WREG,opt_cR_button_right
-	movff	WREG,opt_cR_button_left			; Reset on power-on reset
-	call	piezo_config					; Yes, configure buttons
-	call	piezo_config					; Yes, configure buttons (2 times)
+	call	TFT_standard_color
+
+	WIN_SMALL .20,.100
+	STRCPY_PRINT "Update successful!"		; hard coded since language switch does not work here
 
-power_on_return2:
-; check firmware and reset Custom Functions after an update
+	WIN_SMALL .20,.140
+	STRCPY	"New Firmware: "
+	call	TFT_cat_firmware				; show firmware version x.y and color-code if outdated
+	STRCAT_PRINT ""							; finalize output
+	bcf		win_invert						; reset inverted output if firmware is outdated
+	call	TFT_standard_color				; reset color           if firmware is outdated
+
+	WIN_SMALL .60,.180
+	call	TFT_cat_beta_release			; if it is a beta version, show "BETA" + issue, else "Release"
+	STRCAT_PRINT ""							; finalize output
+	call	TFT_standard_color				; reset color
+
+	call	TFT_Display_FadeIn				; display resulting surface screen
+
+	; check if a new firmware was loaded, if yes reset Custom Function oPressureAdjust
 	movlw	d'1'
 	movwf	EEADR							; =1
 	movwf	EEADRH							; =1
@@ -198,53 +231,25 @@
 	incf	EEADR,F							; set to 0x102
 	call	read_eeprom						; read current version y
 	movff	EEDATA,hi
-	clrf	EEADRH							; Reset EEADRH
+	clrf	EEADRH							; reset EEADRH
 
 	movlw	softwareversion_x
-	cpfseq	lo							; compare version x
-	bra		check_firmware_new				; is not equal -> reset CF and store new version in EEPROM
+	cpfseq	lo								; compare version x
+	bra		check_firmware_new4				; is not equal -> reset CF and store new version in EEPROM
 
 	movlw	softwareversion_y
-	cpfseq	hi							; compare version y
-	bra		check_firmware_new				; is not equal -> reset CF and store new version in EEPROM
-	bra		restart							; x and y are equal -> do not reset cf
+	cpfseq	hi								; compare version y
+	bra		check_firmware_new4				; is not equal -> reset CF and store new version in EEPROM
+	bra		check_firmware_new5				; x and y are equal -> do not reset CF
 
-check_firmware_new:
-	call	TFT_boot						; Initialize TFT (includes clear screen)
-	clrf	CCPR1L							; Backlight off
-	WIN_TOP  .50
-	WIN_LEFT .10
-	movlw	LOW   0x1E000
-	movwf	TBLPTRL
-	movlw	HIGH  0x1E000
-	movwf	TBLPTRH
-	movlw	UPPER 0x1E000
-	movwf	TBLPTRU
-	call	color_image						; Show logo
-	call	TFT_standard_color
-	WIN_SMALL .10,.100
-	STRCPY_PRINT "Update successful!"		; Hard coded since language switch does not work here
-	WIN_SMALL .10,.140
-	STRCPY	"New Firmware: "
-	movlw	softwareversion_x
-	movwf	lo
-	bsf		leftbind
-	output_8
-	PUTC	"."
-	movlw	softwareversion_y
-	movwf	lo
-	output_99x
-	bcf		leftbind
-	STRCAT_PRINT ""							; Print second row
-	call	TFT_Display_FadeIn				; Display resulting surface screen.
-
-
+check_firmware_new4:
 	; place "after-update reset" here...
 	lfsr	FSR0,oPressureAdjust
-	call	option_reset					; Reset FSR0 option to factory default.
+	call	option_reset					; reset oPressureAdjust to factory default
 	lfsr	FSR0,oPressureAdjust
-	call	option_save						; Save in EEPROM
+	call	option_save						; save new value of oPressureAdjust in EEPROM
 
+check_firmware_new5:
 	rcall	backup_flash_page				; backup the first 128 bytes from flash to EEPROM
 
 	movlw	d'1'							; store current version in EEPROM
@@ -252,35 +257,34 @@
 	movwf	EEADRH							; =1
 	movlw	softwareversion_x
 	movwf	EEDATA
-	call	write_eeprom					; write version x
+	call	write_eeprom					; write version, major number
 	incf	EEADR,F							; set to 0x102
 	movlw	softwareversion_y
 	movwf	EEDATA
-	call	write_eeprom					; write version y
-	clrf	EEADRH							; Reset EEADRH
+	call	write_eeprom					; write version, minor number
+	clrf	EEADRH							; reset EEADRH
 
-	movlw	.7
-	movwf	lo
-check_firmware_new2:
-	; Wait 1 second
-	bcf		onesecupdate
-	btfss	onesecupdate
-	bra		$-2
-	decfsz	lo,F							; Wait 10 seconds...
-	bra		check_firmware_new2
+	; wait 10 seconds
+	movlw	.10								; load loop counter
+check_firmware_new6:
+	call	wait_1s							; wait (about) 1 second
+	decfsz	WREG,W							; YES - decrement loop counter, did it became zero?
+	bra		check_firmware_new6				;       NO  - loop
+	;bra	restart							;       YES - proceed with restart
+
 
 	global	restart
 restart:
-	clrf	STKPTR							; Never return from here
+	clrf	STKPTR							; never return from here
 	clrf	CCP1CON							; stop PWM
-	bcf		PORTC,2							; Pull PWM out to GND
+	bcf		PORTC,2							; pull PWM out to GND
 
-	btfsc	menubit							; Return from Menu/COMM mode or timeout?
-	call	option_save_all					; Yes, save all settings into EEPROM
+	btfsc	menubit							; return from Menu/COMM mode or timeout?
+	call	option_save_all					; YES - save all settings into EEPROM
 
-	call	option_restore_all				; Restore everything from EEPROM into RAM
-	call	option_check_all				; Check all options (and reset if not within their min/max boundaries)
-	call	option_save_all					; Save all settings into EEPROM after they have been checked
+	call	option_restore_all				; restore everything from EEPROM into RAM
+	call	option_check_all				; check all options (and reset if not within their min/max boundaries)
+	call	option_save_all					; save all settings into EEPROM after they have been checked
 
 	clrf	flag1							; clear all flags
 	clrf	flag2
@@ -292,73 +296,102 @@
 	clrf	flag8
 	clrf	flag9
 	clrf	flag10
-	; Do not clear flag11 (Sensor calibration and charger status)
+	; do not clear flag11 (sensor calibration and charger status)
 	clrf	flag12
-	; Do not clear flag13 (Important hardware flags)
+	; do not clear flag13 (important hardware flags)
 	clrf	flag14
-	clrf	hardware_flag					; hardware descriptor flag
+	clrf	flag15
+	clrf	flag16
+	clrf	flag17
+
+	clrf	cvt_flags
+
+	clrf	tft_update_flags+0
+	clrf	tft_update_flags+1
+	clrf	tft_update_flags+2
+
+	clrf	hardware_flag1					; hardware descriptor 1
+	;		hardware_flag2					; hardware descriptor 2 - do not clear here!
 
 	bsf		tft_is_dimming					; TFT is dimming up (soon), ignore ambient sensor!
 
-	; configure hardware_flag byte
-	bsf		ambient_sensor					; Set flag
-	bsf		optical_input					; Set flag
+	; configure hardware descriptor 1
+	bcf		tft_power						; inverted, here needed for I2C_probe_OSTC_rx, to wake-up RX circuity
+	bsf		ambient_sensor					; set flag
+	bsf		optical_input					; set flag
 
-	call	lt2942_get_status				; Check for gauge IC
+	call	lt2942_get_status				; check for gauge IC
 	btfss	battery_gauge_available			; cR/2 hardware?
-	bra		restart2						; No
-
-	call	lt2942_init						; Yes, init battery gauge IC
-	bcf		optical_input					; Clear flag
+	bra		restart2						; NO
+	call	lt2942_init						; YES - initialize battery gauge IC
+	bcf		optical_input					; clear flag
 
 	banksel	0xF16
-	bcf		ANCON0,7						; AN7 Digital input
-	banksel common
-	bcf		lightsen_power					; Power-down ambient light sensor
-	bcf		ambient_sensor					; Clear flag
+	bcf		ANCON0,7						; AN7 digital input
+	banksel	common
+	bcf		lightsen_power					; power-down ambient light sensor
+	bcf		ambient_sensor					; clear flag
 	nop
-	btfss	PORTF,2							; Light sensor available?
-	bsf		ambient_sensor					; Yes.
+	btfss	PORTF,2							; light sensor available?
+	bsf		ambient_sensor					; YES
 	banksel	0xF16
-	bsf		ANCON0,7						; AN7 Analog again
+	bsf		ANCON0,7						; AN7 analog again
 	banksel	common
-	bsf		lightsen_power					; Power-up ambient light sensor again
+	bsf		lightsen_power					; power-up ambient light sensor again
 
 restart2:
 	btfsc	vusb_in
 	bra		restart3						; USB (and powered on)
-	bcf		PORTE,0							; Start comms
+	bcf		PORTE,0							; start comms
 	WAITMS	d'1'
 	btfss	vusb_in
 	bra		restart3						; USB (and powered off)
-	bsf		ble_available					; ble available
+	bsf		ble_available					; BLE available
 
 restart3:
-	bsf		PORTE,0							; Stop comms
-	btfsc	ble_available					; ble available?
-	bra		restart4						; Yes, can't be a cR
-	btfss	battery_gauge_available			; Rechargeable
-	bra		restart4						; No, can't be a cR
-	bsf		analog_o2_input					; Set flag for analog
+	bsf		PORTE,0							; stop comms
+	btfsc	ble_available					; BLE available?
+	bra		restart4						; YES - can't be a cR
+	btfss	battery_gauge_available			; rechargeable?
+	bra		restart4						; NO  - can't be a cR
+	bsf		analog_o2_input					; set flag for analog
 
-	; The hardware_flag is now:
+restart4:
+ IFDEF _rx_functions
+	WAITMS	d'200'
+	call	I2C_probe_OSTC_rx				; set ostc_rx_present flag if this is an OSTC TR model
+
+	; The hardware descriptor is now:
 	; 0x11: 2 with BLE
-	; 0x13: 2 with BLE & ambient
+	; 0x13: +/2 with BLE & ambient
 	; 0x05: cR
 	; 0x0A: 3
 	; 0x1A: 3 with BLE
+	; 0x33: 2 TR
 
-restart4:
-	; Select high altitude (Fly) mode?
+	btfss	ostc_rx_present					; OSTC TR detected?
+	bra		restart5						; NO
+	movff	opt_TR_mode,WREG				; YES - get user-selected TR mode
+	tstfsz	WREG							;       TR functions switched on?
+	bsf		FLAG_tr_enabled					;       YES - switch on displays and calculation functions
+ ENDIF
+
+	; configure hardware descriptor 2
+	; flag  screen_type                  will be configured on each call of TFT_boot
+	; flags compass_type & compass_type2 will be configured on each call of I2C_init_compass
+	; flag  analog_switches              will be configured directly after hard start (in start:)
+
+restart5:
+	; Select high altitude (fly) mode?
 	movff	last_surfpressure_30min+0,sub_b+0
 	movff	last_surfpressure_30min+1,sub_b+1
 	movlw	HIGH high_altitude_threshold
 	movwf	sub_a+1
-	movlw	LOW  high_altitude_threshold	; hard-wired 880mbar
+	movlw	LOW  high_altitude_threshold	; hard-wired 880 hPa
 	movwf	sub_a+0
 	call	subU16							; sub_c = sub_a - sub_b
-	btfss	neg_flag						; result negative (ambient > 880mbar)?
-	bsf		high_altitude_mode				; NO - set flag!
+	btfss	neg_flag						; result negative (ambient > 880 hPa)?
+	bsf		high_altitude_mode				; NO - set flag
 
 	btfss	analog_o2_input
 	bsf		TRISB,3
@@ -366,25 +399,25 @@
 	bsf		TRISG,0
 	call	ext_flash_disable_protection	; disable write protection for external flash
 
-	bsf		flip_screen						; flip 180°
-	TSTOSS	opt_flip_screen					; =1: Flip the screen
-	bcf		flip_screen						; normal orientation
+	bsf		flip_screen						; select screen flip 180°
+	TSTOSS	opt_flip_screen					; shall actually flip? (=1: flip the screen)
+	bcf		flip_screen						; NO - revert to normal orientation
 
 	btfsc	use_old_batt_flag				; =1: load old battery information after power-on reset
-	goto	use_old_batteries				; returns to "surfloop"!
+	goto	use_old_batteries				; returns to surface loop
 
 	btfsc	RCON,POR						; was this a power-on reset?
-	goto	surfloop						; jump to surface loop!
+	goto	surfloop						; YES - jump to surface loop
 	bsf		RCON,POR						; set bit for next detection
 	; Things to do after a power-on reset
-	goto	do_new_battery_select			; returns to "surfloop"!
+	goto	do_new_battery_select			; returns to surface loop
 
 ;=============================================================================
 ; Setup all flags and parameters for divemode and simulator computations.
 ;
 	global	restart_set_modes_and_flags
-restart_set_modes_and_flags:				; "Call"ed from divemode, as well!
-	call	option_restore_all				; Restore everything from EEPROM
+restart_set_modes_and_flags:				; "Call"ed from dive mode as well
+	call	option_restore_all				; restore everything from EEPROM
 
 	; Setup sampling rate
 	movlw	.2
@@ -395,13 +428,31 @@
 	movwf	samplingrate
 
 restart_set_modes_and_flags1:
-	bcf		twosecupdate					; to have divemode routines in sync
+	bcf		FLAG_gauge_mode
 	bcf		FLAG_apnoe_mode
-	bcf		FLAG_ccr_mode					; =1: CCR mode (Fixed ppO2 or Sensor) active
-	bcf		FLAG_gauge_mode					; =1: In Gauge mode
+	bcf		FLAG_oc_mode
+	bcf		FLAG_ccr_mode
 	bcf		FLAG_pscr_mode
+	bcf		FLAG_bailout_mode
 	call	disable_ir_s8					; IR off
 
+ IFDEF _cave_mode
+	bsf		FLAG_cave_mode					; enable cave mode by default
+	movff	opt_calc_asc_gasvolume,WREG		; get gas needs calculation mode (0=off, 1=on, 2=cave mode)
+	xorlw	.2								; coding for cave mode
+	tstfsz	WREG							; cave mode enabled?
+	bcf		FLAG_cave_mode					; NO - disable cave mode again
+	bcf		FLAG_cave_mode_shutdown			; clear flag for cave mode shutdown
+	bcf		FLAG_dive_turned				; clear flag for dive turned
+	bcf		gas_needs_mode_last				; set last gas calculation results as direct ascent needs
+ ENDIF
+
+	; Initialize active_gas and active_dil for surface mode pressure display
+	call	get_first_gas_to_WREG
+	movwf	active_gas
+	call	get_first_dil_to_WREG
+	movwf	active_dil
+
 	; Setup char_I_saturation_multiplier and char_I_desaturation_multiplier
 	movff	opt_sat_multiplier_gf,char_I_saturation_multiplier
 	movff	opt_desat_multiplier_gf,char_I_desaturation_multiplier
@@ -417,30 +468,23 @@
 	bra		restart_set_modes_and_flags2
 
 	; OC Mode
+	bsf		FLAG_oc_mode					; =1: OC mode active
+ IFDEF _rx_functions
+	call	option_cleanup_oTrMode_no_CCR	; revert TR mode from 'CCR Dil+O2' to 'on'
+ ENDIF
 	return
 
 restart_set_modes_and_flags2:
 	decfsz	lo,F
 	bra		restart_set_modes_and_flags3
 
-	; CC Mode
-	btfsc	analog_o2_input					; cR?
-	bra		restart_set_modes_and_flags2b	; Yes, skip mode check
-	btfsc	optical_input					; 3
-	bra		restart_set_modes_and_flags2b	; Yes, skip mode check
-
-	; Make sure Sensor is not selected
-	; opt_ccr_mode must be <> 1 (=0: Fixed SP, =1: Sensor, =2: Auto SP (CCR only))
-	banksel	opt_ccr_mode
-	movlw	.1
-	cpfseq	opt_ccr_mode					; = Sensor?
-	bra		restart_set_modes_and_flags2b	; No
-	clrf	opt_ccr_mode					; Yes, reset to Fixed SP
-
-restart_set_modes_and_flags2b:
-	banksel	common
+	; CCR Mode
 	bsf		FLAG_ccr_mode					; =1: CCR mode (Fixed SP, Auto SP or Sensor) active
-	call	enable_ir_s8					; Enable IR/S8-Port
+	call	option_cleanup_oCCRMode_CCR		; revert CCR mode 'Sensor' to 'fixed SP' if no sensor interface available
+ IFDEF _rx_functions
+	call	option_cleanup_oTrMode_CCR		; revert TR mode from 'ind.double' to 'on'
+ ENDIF
+	call	enable_ir_s8					; enable IR/S8 port
 	return
 
 restart_set_modes_and_flags3:
@@ -448,41 +492,35 @@
 	bra		restart_set_modes_and_flags4
 
 	; Gauge Mode
-	bsf		FLAG_gauge_mode					; =1: In Gauge mode
+	bsf		FLAG_gauge_mode					; =1: in gauge mode
+ IFDEF _rx_functions
+	call	option_cleanup_oTrMode_no_CCR	; revert TR mode from 'CCR Dil+O2' to 'on'
+ ENDIF
 	return
 
 restart_set_modes_and_flags4:
 	decfsz	lo,F
 	bra		restart_set_modes_and_flags5
+
 	; Apnea Mode
-	bsf		FLAG_apnoe_mode
-	return									; start in Surfacemode
+	bsf		FLAG_apnoe_mode					; =1: in Apnea mode
+ IFDEF _rx_functions
+	call	option_cleanup_oTrMode_no_CCR	; revert TR mode from 'CCR Dil+O2' to 'on'
+ ENDIF
+	return									; start in surface mode
 
 restart_set_modes_and_flags5:
-	; PSCR Mode
-	btfsc	analog_o2_input					; cR?
-	bra		restart_set_modes_and_flags5b	; Yes, skip mode check
-	btfsc	optical_input					; 3
-	bra		restart_set_modes_and_flags5b	; Yes, skip mode check
-
-	; Make sure Sensor is not selected
-	; opt_ccr_mode must be <> 1 (=0: calculated ppO2, =1: Sensor, =2: Auto SP - not valid in pSCR, too)
-	banksel	opt_ccr_mode
-	movlw	.1
-	cpfseq	opt_ccr_mode					; = Sensor?
-	bra		restart_set_modes_and_flags5b	; No
-	clrf	opt_ccr_mode					; Yes, reset to calculated ppO2
-
-restart_set_modes_and_flags5b:
-	banksel	opt_ccr_mode
-	bcf		opt_ccr_mode,1					; in pSCR mode only calculated or Sensor, not 2 = Auto SP allowed
-	banksel	common
-	bsf		FLAG_pscr_mode
-	call	enable_ir_s8					; Enable IR/S8-Port
-	return									; start in Surfacemode
+	; pSCR Mode
+	bsf		FLAG_pscr_mode					; set pSCR mode flag
+	call	option_cleanup_oCCRMode_pSCR	; in pSCR mode, revert AutoSP (2) to calculated SP (0), additionally revert Sensor to fixed SP if no sensor interface available
+ IFDEF _rx_functions
+	call	option_cleanup_oTrMode_no_CCR	; revert TR mode from 'CCR Dil+O2' to 'on'
+ ENDIF
+	call	enable_ir_s8					; enable IR/S8 port
+	return									; start in surface mode
 
 
-; backup the first 128bytes from flash to EEPROM
+; backup the first 128 bytes from flash to EEPROM
 backup_flash_page:
 	; Start address in internal flash
 	movlw	0x00
@@ -491,20 +529,20 @@
 	movwf	TBLPTRU
 
 	movlw	.128
-	movwf	lo								; Byte counter
+	movwf	lo								; byte counter
 	clrf	EEADR
 	movlw	.3
-	movwf	EEADRH							; Setup backup address
+	movwf	EEADRH							; setup backup address
 
-	TBLRD*-									; Dummy read to be in 128 byte block
+	TBLRD*-									; dummy read to be in 128 byte block
 backup_flash_loop:
-	tblrd+*									; Table Read with Pre-Increment
+	tblrd+*									; table read with pre-increment
 	movff	TABLAT,EEDATA					; put 1 byte
 	call	write_eeprom					; save it in EEPROM
 	incf	EEADR,F
-	decfsz	lo,F							; 128byte done?
-	bra		backup_flash_loop				; No
-	clrf	EEADRH							; Reset EEADRH
-	return									; Done.
+	decfsz	lo,F							; 128 byte done?
+	bra		backup_flash_loop				; NO - loop
+	clrf	EEADRH							; reset EEADRH
+	return									; done
 
 	END
\ No newline at end of file
--- a/src/strings.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/strings.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,217 +1,231 @@
 ;=============================================================================
 ;
-;   File strings.asm									Version 2.92 = 2.26
+;   File strings.asm													V2.99c
 ;
 ;   Implementation code various string functions.
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;  2010-12-02 : [jDG] Creation...
+;  2010-12-02 : [jDG] Creation
 ;
 ; See strings.inc for doc and public calling macros.
 
 #include "hwos.inc"
 #include "varargs.inc"
 
-        extern  aa_wordprocessor
+	extern	aa_wordprocessor
+
+strings		CODE
 
-basic   CODE
 ;=============================================================================
-; Variants that call word_processor at the end:
-        global  strcpy_block_print
+; Variants that call word_processor at the end
+
+	global	strcpy_block_print
 strcpy_block_print:
-        lfsr    FSR2, buffer
-        global  strcat_block_print
+	lfsr	FSR2,buffer
+	global	strcat_block_print
 strcat_block_print:
-        clrf    PRODL,A
-        bra     strings_common
+	clrf	PRODL,A
+	bra		strings_common
+
 
-; Variants that do not call word_processor at end:
-        global  strcpy_block
+; Variants that do not call word_processor at end
+
+	global	strcpy_block
 strcpy_block:
-        lfsr    FSR2, buffer
-        global  strcat_block
+	lfsr	FSR2,buffer
+	global	strcat_block
 strcat_block:
-        setf    PRODL,A
-        
-; Common part: append the string from PROM return address:
-strings_common:
-        VARARGS_BEGIN
+	setf	PRODL,A
+
+
+; Common part: append the string from PROM return address
 
-        rcall   strcat_prom
+strings_common:
+	VARARGS_BEGIN
+		rcall	strcat_prom
+		VARARGS_ALIGN
+	VARARGS_END
 
-        VARARGS_ALIGN
-        VARARGS_END
-		
-		btfsc   PRODL,0,A               ; Should we print afterward ?
-		return                          ; NO: then return straight away.
-		goto    aa_wordprocessor        ; ELSE: print it...
+	btfsc	PRODL,0,A				; ahall we print afterwards?
+	return							; NO  - then return straight away
+	goto	aa_wordprocessor        ; YES - print it...
 
 ;=============================================================================
-; Copy multi-lingual text from FSR1 12bit pointers, to buffer.
+; Copy multi-lingual text from FSR1 12 bit pointer to buffer
 ;
-; Input: FSR1 = 12bit pointer to multi-lingual text.
-; Output: FSR2 points to closing null byte in buffer.
-; Trashed: TBLPTR, TABLAT.
-        global  strcpy_text
+; Input:   FSR1 = 12 bit pointer to multi-lingual text
+; Output:  FSR2 pointing to closing null byte in buffer
+; Trashed: TBLPTR, TABLAT
+
+	global	strcpy_text
 strcpy_text:
-        rcall   text_get_tblptr
-        bra     strcpy_prom
+	rcall	text_get_tblptr
+	bra		strcpy_prom
 
-; Copy then print multi-lingual text from FSR1 12bit pointers, to buffer.
+; Copy and print multi-lingual text from FSR1 12 bit pointer to buffer
 ;
-; Input: FSR1 = 12bit pointer to multi-lingual text.
-; Output: FSR2 points to closing null byte in buffer.
-; Trashed: TBLPTR, TABLAT.
-        global  strcpy_text_print
+; Input:   FSR1 = 12 bit pointer to multi-lingual text
+; Output:  FSR2 pointing to closing null byte in buffer
+; Trashed: TBLPTR, TABLAT
+
+	global	strcpy_text_print
 strcpy_text_print:
-        rcall   text_get_tblptr
-        bra     strcpy_prom_print
+	rcall	text_get_tblptr
+	bra		strcpy_prom_print
 
-; Append multi-lingual text from FSR1 12bit pointers, to buffer at FRS2.
+; Append multi-lingual text from FSR1 12 bit pointers to buffer at FRS2
 ;
-; Input: FSR1 = 12bit pointer to multi-lingual text.
-;        FSR2 = Current position in buffer.
-; Output: FSR2 points to closing null byte in buffer.
-; Trashed: TBLPTR, TABLAT.
-        global  strcat_text
+; Input:  FSR1 = 12 bit pointer to multi-lingual text
+;         FSR2 = current position in buffer
+; Output: FSR2 pointing to closing null byte in buffer
+; Trashed: TBLPTR, TABLAT
+
+	global	strcat_text
 strcat_text:
-        rcall   text_get_tblptr
-        bra     strcat_prom
+	rcall	text_get_tblptr
+	bra		strcat_prom
 
-; Append then print multi-lingual text from FSR1 12bit pointers, to buffer at FRS2.
+; Append and print multi-lingual text from FSR1 12 bit pointers to buffer at FRS2
 ;
-; Input: FSR1 = 12bit pointer to multi-lingual text.
-;        FSR2 = Current position in buffer.
-; Output: FSR2 points to closing null byte in buffer.
-; Trashed: TBLPTR, TABLAT.
-        global  strcat_text_print
+; Input:   FSR1 = 12 bit pointer to multi-lingual text
+;          FSR2 = current position in buffer
+; Output:  FSR2 pointing to closing null byte in buffer
+; Trashed: TBLPTR, TABLAT
+
+	global	strcat_text_print
 strcat_text_print:
-        rcall   text_get_tblptr
-        bra     strcat_prom_print
+	rcall	text_get_tblptr
+	bra	strcat_prom_print
 
 ;=============================================================================
-; Get pointer to multilingual texl in TBLPTR
+; Get pointer to multilingual text in TBLPTR
 ;
-; Input:  FSR1 = 12bits of text handle.
-;         opt_language = current language.
-; Output: TBLPTR = 24bits of PROM address.
-;
-        global  text_get_tblptr
+; Input:  FSR1         = 12 bit text handle
+;         opt_language = current language
+; Output: TBLPTR       = 24 bit PROM address
+
+	global	text_get_tblptr
 text_get_tblptr:
-        extern  text_1_base
-        movlw   UPPER(text_1_base)		; Complete 12bits to 24bits address.
-        movwf   TBLPTRU
-        movlw   HIGH(text_1_base)
-        andlw   0xF0
-        iorwf   FSR1H,W
-        movwf   TBLPTRH
-        movff   FSR1L,TBLPTRL
-
+	extern	text_1_base
+	movlw	UPPER(text_1_base)		; complete 12 bit address to 24 bit address
+	movwf	TBLPTRU
+	movlw	HIGH(text_1_base)
+	andlw	0xF0
+	iorwf	FSR1H,W
+	movwf	TBLPTRH
+	movff	FSR1L,TBLPTRL
 
-		movff   opt_language,WREG       ; Get lang
-		bz      text_get_lang1        	; 0 == English
-		dcfsnz  WREG                    ; 1 == German
-		bra     text_get_lang2
-; Other ??? Keep language 1
+ IF _language_2!=none
+	movff	opt_language,WREG		; get language selection
+	bz		text_get_lang1			; 0: language 1
+	dcfsnz	WREG
+	bra		text_get_lang2			; 1: language 2
+ ENDIF
 
-; Read 2-byte pointer to string
-text_get_lang1:
-        tblrd*+
-        movff   TABLAT,WREG
-        tblrd*+
-        movff   WREG,TBLPTRL
-        movff   TABLAT,TBLPTRH
-        return
+text_get_lang1:						; read 2-byte pointer to string
+	tblrd*+
+	movff	TABLAT,WREG
+	tblrd*+
+	movff	WREG,TBLPTRL
+	movff	TABLAT,TBLPTRH
+	return
 
-; Add correction for German table:
-text_get_lang2:
-       extern  text_2_base
-       movlw   LOW(text_2_base)
-       addwf   TBLPTRL
-       movlw   HIGH(text_2_base)
-       addwfc  TBLPTRH
-       movlw   UPPER(text_2_base)
-       addwfc  TBLPTRU
+ IF _language_2!=none
+text_get_lang2:						; add offset for second language
+	extern	text_2_base
+	movlw	LOW(text_2_base)
+	addwf	TBLPTRL
+	movlw	HIGH(text_2_base)
+	addwfc	TBLPTRH
+	movlw	UPPER(text_2_base)
+	addwfc	TBLPTRU
 
-       movlw   LOW(text_1_base)
-       subwf   TBLPTRL
-       movlw   HIGH(text_1_base)
-       subwfb  TBLPTRH
-       movlw   UPPER(text_1_base)
-       subwfb  TBLPTRU
-       bra     text_get_lang1
-        
+	movlw	LOW(text_1_base)
+	subwf	TBLPTRL
+	movlw	HIGH(text_1_base)
+	subwfb	TBLPTRH
+	movlw	UPPER(text_1_base)
+	subwfb	TBLPTRU
+	bra		text_get_lang1
+ ENDIF
+
 ;=============================================================================
-; Copy a null-terminated string from TBLPTR to buffer.
+; Copy a null-terminated string from TBLPTR to buffer
 ;
-; Input:  TBLPTR : string pointer into PROM.
-; Output: string in buffer, FSR2 pointer on the closing null byte.
+; Input:  TBLPTR : string pointer into PROM
+; Output: string in buffer, FSR2 pointing to the closing null byte
 ;
-        global  strcpy_prom
+	global	strcpy_prom
 strcpy_prom:
-        lfsr    FSR2,buffer
+	lfsr	FSR2,buffer
+	;bra	strcat_prom
 
-; Append a null-terminated string from TBLPTR to buffer.
+; Append a null-terminated string from TBLPTR to buffer
 ;
-; Input:  TBLPTR : string pointer into PROM.
-;         FRS2   : current character position.
-; Output: string in buffer, FSR2 pointer on the closing null byte.
+; Input:  TBLPTR : string pointer into PROM
+;         FRS2   : current character position
+; Output: string in buffer, FSR2 pointing to the closing null byte
 ;
-        global  strcat_prom
+	global	strcat_prom
 strcat_prom:
-        tblrd*+
-        movf    TABLAT,W
-        movwf   POSTINC2
-        bnz     strcat_prom
-        movf    POSTDEC2,W               ; rewind one char in string buffer.
-        return
+	tblrd*+
+	movf	TABLAT,W
+	movwf	POSTINC2
+	bnz		strcat_prom
+	movf	POSTDEC2,W				; step back one char
+	return
 
 ;=============================================================================
 ; Variant that calls word processor right-away...
-        global  strcpy_prom_print
-        global  strcat_prom_print
 
+	global	strcpy_prom_print
+	global	strcat_prom_print
 strcpy_prom_print:
-        lfsr    FSR2,buffer
+	lfsr	FSR2,buffer
 strcat_prom_print:
-        rcall   strcat_prom
-        goto    aa_wordprocessor
+	rcall	strcat_prom
+	goto	aa_wordprocessor
 
 ;=============================================================================
 
-        global      start_tiny_block
+	global	start_tiny_block
 start_tiny_block:
-        clrf        WREG
-        bra         start_common
+	clrf	WREG
+	movff	WREG, win_font			; needs a bank-safe move here !
+	bra		start_common
 
-        global      start_small_block
+	global	start_small_block
 start_small_block:
-        movlw       1
-        bra         start_common
+	movlw	1
+	movff	WREG, win_font			; needs a bank-safe move here !
+	bra		start_common
 
-        global      start_std_block
+	global	start_std_block
 start_std_block:
-        movlw       2
-        bra         start_common
+	movlw	2
+	movff	WREG, win_font			; needs a bank-safe move here !
+	bra		start_common
 
-        global      start_medium_block
+	global	start_medium_block
 start_medium_block:
-        movlw       3
-        bra         start_common
+	movlw	3
+	movff	WREG, win_font			; needs a bank-safe move here !
+	bra		start_common
 
-        global      start_large_block
+	global	start_large_block
 start_large_block:
-        movlw       4
-;        bra         start_common
+	movlw	4
+	movff	WREG, win_font			; needs a bank-safe move here !
+	;bra	start_common
+
 start_common:
-        movff       WREG, win_font      ; Need a bank-safe move here !
-        VARARGS_BEGIN
-            VARARGS_GET8    win_leftx2
-            VARARGS_GET8    win_top
-        VARARGS_END
-        lfsr    FSR2,buffer             ; point to buffer here
-        return
+	VARARGS_BEGIN
+		VARARGS_GET8	win_leftx2
+		VARARGS_GET8	win_top
+	VARARGS_END
+	lfsr	FSR2,buffer				; point to buffer
+	return
 
-        END
\ No newline at end of file
+	END
\ No newline at end of file
--- a/src/strings.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/strings.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -2,184 +2,192 @@
 ;
 ;   File strings.asm
 ;
-;   Implementation code various string functions.
+;   Implementation code various string functions
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;   2010-12-02 : [jDG] Creation...
+;   2010-12-02 : [jDG] Creation
 ;
 
 ;=============================================================================
-; Copy a short embebed string at start of the string buffer (letter)
-; Input:    (nothing)
-; Output:   chars are copied into letter, starting at the beginning.
-;           FSR2 point to the first unused char (the NULL termination).
-;           
-; Trashed:  WREG, TBLPTR, TABLAT, PRODL
-; Note:     This are all bank-safe call.
+; Copy a short embedded string to the start of the string buffer
+; Input  : string after macro name
+; Output : chars are copied to the start of the string buffer
+;          FSR2 points to the first unused char containing the NULL termination
+; Trashed: WREG, TBLPTR, TABLAT, PRODL
+; Note   : uses bank-safe calls only
 ;
-        extern  strcpy_block
-STRCPY  macro   string
-        call    strcpy_block
-        DB  string, 0
-        endm
+	extern	strcpy_block
+STRCPY macro string
+	call	strcpy_block
+	DB		string, 0
+	endm
 
 ;=============================================================================
-; A variant of STRCPY that appends chars to the current FSR2 pointer.
-; Input/Output/Trashed : see STRCPY.
-        extern  strcat_block
-STRCAT  macro   string
-        call    strcat_block
-        DB  string, 0
-        endm
+; A variant of STRCPY that appends chars in the string buffer at the current
+; FSR2 pointer position
+; Input/Output/Trashed: see STRCPY
+;
+	extern	strcat_block
+STRCAT macro string
+	call	strcat_block
+	DB		string, 0
+	endm
 
 ;=============================================================================
 ; A variant of STRCAT when there is just on char to output
-; Input/Output/Trashed : none.
-PUTC    macro   char
-        movlw   char
-        movwf   POSTINC2
-        endm
+; Input/Output/Trashed: see STRCPY
+;
+PUTC macro	char
+	movlw	char
+	movwf	POSTINC2
+	endm
 
 ;=============================================================================
-; A variant of STRCPY that send the string to the word processor afterwards.
-; Input/Output: see STRCPY.
-; Trashed: See STRCPY + word_processor. In particular, switch RAM to Bank1 
+; A variant of STRCPY that sends the string to the word processor afterwards
+; Input/Output: see STRCPY
+; Trashed     : see STRCPY + word_processor. In particular, switches RAM to Bank1
 ;
-        extern  strcpy_block_print
-STRCPY_PRINT    macro string
-        call    strcpy_block_print
-        DB  string, 0
-        endm
+	extern  strcpy_block_print
+STRCPY_PRINT macro string
+	call	strcpy_block_print
+	DB		string, 0
+	endm
 
-; Trashed: See STRCPY + word_processor. In particular, switch RAM to Bank1 
-        extern  strcat_block_print
-STRCAT_PRINT    macro string
-        call    strcat_block_print
-        DB  string, 0
-        endm
+;=============================================================================
+; A variant of STRCAT that sends the string to the word processor afterwards
+; Input/Output: see STRCAT
+; Trashed     : see STRCPY + word_processor. In particular, switches RAM to Bank1
+;
+	extern	strcat_block_print
+STRCAT_PRINT macro string
+	call	strcat_block_print
+	DB		string, 0
+	endm
 
 ;=============================================================================
 ; Subroutines to operate on strings from PROM code
 ;
-; Input:  TBLPTR : string pointer into PROM.
-; Output: string in buffer, FSR2 pointer on the closing null byte.
+; Input  : TBLPTR : string pointer into PROM
+; Trashed: FSR1
+; Output : string in buffer, FSR2 pointer on the closing null byte
 
-        extern  strcpy_prom, strcat_prom
-        extern  strcpy_prom_print, strcat_prom_print
+	extern	strcpy_prom,       strcat_prom
+	extern	strcpy_prom_print, strcat_prom_print
 
 ;=============================================================================
 ; Subroutines and macros to operate on multilingual text
 ;
-        extern  strcpy_text
-STRCPY_TEXT macro   txt
-        extern  txt
-        lfsr    FSR1, txt
-        call    strcpy_text
-        endm
+	extern	strcpy_text
+STRCPY_TEXT macro txt
+	extern	txt
+	lfsr	FSR1, txt
+	call	strcpy_text
+	endm
 
-        extern  strcpy_text_print
-STRCPY_TEXT_PRINT macro   txt
-        extern  txt
-        lfsr    FSR1, txt
-        call    strcpy_text_print
-        endm
+	extern	strcpy_text_print
+STRCPY_TEXT_PRINT macro txt
+	extern	txt
+	lfsr	FSR1, txt
+	call	strcpy_text_print
+	endm
 
-        extern  strcat_text
-STRCAT_TEXT macro   txt
-        extern  txt
-        lfsr    FSR1, txt
-        call    strcat_text
-        endm
+	extern	strcat_text
+STRCAT_TEXT macro txt
+	extern	txt
+	lfsr	FSR1, txt
+	call	strcat_text
+	endm
 
-        extern  strcat_text_print
-STRCAT_TEXT_PRINT macro   txt
-        extern  txt
-        lfsr    FSR1, txt
-        call    strcat_text_print
-        endm
+	extern	strcat_text_print
+STRCAT_TEXT_PRINT macro txt
+	extern	txt
+	lfsr	FSR1, txt
+	call	strcat_text_print
+	endm
 
 ;=============================================================================
-; A shortcut for the macros WIN_TOP + WIN_LEFT + WIN_FONT.
-; The idea is to replace a 4x6=24 bytes sequence by a more compact 6bytes one.
+; A shortcut for the macros WIN_TOP + WIN_LEFT + WIN_FONT
+; The idea is to replace a 4x6=24 bytes sequence by a more compact 6 bytes one.
 ;
 ; Trashed: TBLPTR, TABLAT, WREG.
-; Note:    This are all bank-safe call.
-        extern  start_tiny_block
+; Note   : uses bank-safe calls only
+;
+	extern	start_tiny_block
 WIN_TINY macro x, y
-        call    start_tiny_block
-        DB      x, y
-        endm
+	call	start_tiny_block
+	DB		x, y
+	endm
 
-        extern  start_small_block
+	extern	start_small_block
 WIN_SMALL macro x, y
-        call    start_small_block
-        DB      x, y
-        endm
+	call	start_small_block
+	DB		x, y
+	endm
 
-        extern  start_std_block
+	extern	start_std_block
 WIN_STD macro x, y
-        call    start_std_block
-        DB      x, y
-        endm
+	call	start_std_block
+	DB		x, y
+	endm
 
-        extern  start_medium_block
-WIN_MEDIUM   macro   x, y
-        call    start_medium_block
-        DB      x, y
-        endm
+	extern	start_medium_block
+WIN_MEDIUM macro x, y
+	call	start_medium_block
+	DB		x, y
+	endm
 
-       extern  start_large_block
-WIN_LARGE   macro   x, y
-       call    start_large_block
-       DB      x, y
-       endm
+	extern	start_large_block
+WIN_LARGE macro x, y
+	call	start_large_block
+	DB		x, y
+	endm
 
 ;=============================================================================
-; Shortcuts for compact display programmings.
-TEXT_TINY macro   x, y, txt
-        WIN_TINY   x,y
-        STRCPY_TEXT_PRINT txt
-        endm
+; Shortcuts for compact display programmings
+;
+TEXT_TINY macro x, y, txt
+	WIN_TINY x,y
+	STRCPY_TEXT_PRINT txt
+	endm
 
-TEXT_SMALL  macro   x, y, txt
-        WIN_SMALL   x,y
-        STRCPY_TEXT_PRINT txt
-        endm
+TEXT_SMALL macro x, y, txt
+	WIN_SMALL x,y
+	STRCPY_TEXT_PRINT txt
+	endm
 
-TEXT_SMALL_INVERT  macro   x, y, txt
-        WIN_SMALL_INVERT   x,y
-        STRCPY_TEXT_PRINT txt
-        endm
+TEXT_SMALL_INVERT macro x, y, txt
+	WIN_SMALL_INVERT x,y
+	STRCPY_TEXT_PRINT txt
+	endm
 
-TEXT_MEDIUM  macro   x, y, txt
-        WIN_MEDIUM   x,y
-        STRCPY_TEXT_PRINT txt
-        endm
+TEXT_MEDIUM macro x, y, txt
+	WIN_MEDIUM x,y
+	STRCPY_TEXT_PRINT txt
+	endm
 
-TEXT_LARGE  macro   x, y, txt
-        WIN_LARGE   x,y
-        STRCPY_TEXT_PRINT txt
-        endm
+TEXT_LARGE macro x, y, txt
+	WIN_LARGE x,y
+	STRCPY_TEXT_PRINT txt
+	endm
 
-STRING_TINY macro   x, y, string
-        WIN_SMALL   x,y
-        STRCPY_PRINT string
-        endm
+STRING_TINY macro x, y, string
+	WIN_SMALL x,y
+	STRCPY_PRINT string
+	endm
 
-STRING_SMALL  macro   x, y, string
-        WIN_SMALL   x,y
-        STRCPY_PRINT string
-        endm
+STRING_SMALL macro x, y, string
+	WIN_SMALL x,y
+	STRCPY_PRINT string
+	endm
 
-STRING_MEDIUM  macro   x, y, string
-        WIN_MEDIUM   x,y
-        STRCPY_PRINT string
-        endm
+STRING_MEDIUM macro x, y, string
+	WIN_MEDIUM x,y
+	STRCPY_PRINT string
+	endm
 
-STRING_LARGE  macro   x, y, string
-        WIN_LARGE   x,y
-        STRCPY_PRINT string
-        endm
-
+STRING_LARGE macro x, y, string
+	WIN_LARGE x,y
+	STRCPY_PRINT string
+	endm
--- a/src/surfmode.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/surfmode.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File surfmode.asm								REFACTORED VERSION	V2.97 SP1
+;   File surfmode.asm								REFACTORED VERSION	V2.99e
 ;
 ;   Surfacemode
 ;
@@ -29,15 +29,28 @@
 #include "eeprom_rs232.inc"
 #include "calibrate.inc"
 
+ IFDEF _rx_functions
+#include "rx_ops.inc"
+ ENDIF
+
 	extern	do_main_menu
-	extern	color_image
+	extern	TFT_sensor_mV
+	extern	TFT_surface_compass_heading
+	extern	check_cns_violation
+	extern	check_warn_battery
+	extern	check_and_store_gf_violation
+	extern	check_mbubbles
+
+ IFDEF _osct_logo
+	extern	ostc_logo_block
+ ENDIF
 
 
 	;---- Private local variables -------------------------------------------------
 
-		CBLOCK	local1						; max size is 16 Byte !!!
-											; currently not used
-		ENDC								; used: 0 byte, remaining: 16 byte
+	CBLOCK	local1					; max size is 16 Byte !!!
+									; currently not used
+	ENDC							; used: 0 byte, remaining: 16 byte
 
 
 #DEFINE menu_pos_row		.215
@@ -45,56 +58,63 @@
 #DEFINE view_row			.215
 #DEFINE view_column			.124
 
-gui	CODE
+sfmode		CODE
 
 ;=============================================================================
 ; Boot tasks for all modes
+
 	global	surfloop
 surfloop:
 	call	speed_normal
-	bcf		no_sensor_int			; Normal pressure mode
+	bcf		no_sensor_int			; normal pressure mode
 
 	bcf		LEDr
 
 	clrf	CCP1CON					; stop PWM
-	bcf		PORTC,2					; Pull PWM output to GND
-	call	TFT_boot				; Initialize TFT (includes clear screen)
+	bcf		PORTC,2					; pull PWM output to GND
+	call	TFT_boot				; initialize TFT (includes clear screen)
 	bcf		restore_deco_data
 
-	WIN_TOP	 .50
+	WIN_TOP  .40
 	WIN_LEFT .10
-	movlw	LOW   0x1E000
-	movwf	TBLPTRL
-	movlw	HIGH  0x1E000
-	movwf	TBLPTRH
-	movlw	UPPER 0x1E000
-	movwf	TBLPTRU
-	call	color_image				; Show logo
+	TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block	; show heinrichsweikamp logo
 
-	WIN_TOP	 .100
+ IFDEF _ostc_logo
+	WIN_TOP  .100
 	WIN_LEFT .34
-	extern	ostc_logo_block
-	movlw	LOW   ostc_logo_block
-	movwf	TBLPTRL
-	movlw	HIGH  ostc_logo_block	; &0xFFFF
-	movwf	TBLPTRH
-	movlw	UPPER ostc_logo_block
-	movwf	TBLPTRU
-	call	color_image
-	call	TFT_Display_FadeIn		; Show splash
-	call	TFT_serial				; Show serial and firmware version
+	TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block	; show OSTC logo
+ ELSE
+	WIN_COLOR color_white
+	WIN_STD .30,.90					; column, row
+	STRCPY_PRINT "Open Source"		; show OSTC banner text, line 1
+	WIN_STD .20,.130				; column, row
+	STRCPY_PRINT "Tauch-Computer"	; show OSTC banner text, line 2
+ ENDIF
+
+	WIN_COLOR color_white
+	WIN_SMALL .35,.180
+	PUTC	"v"						; print v
+	call	TFT_cat_firmware		; print  x.y
+	PUTC	" "						; print     _ 
+	call	TFT_cat_beta_release	; print      BetaZ or Release
+	STRCAT_PRINT ""					; finalize output
+	bcf		win_invert				; clean up eventual color-coding
+	call	TFT_standard_color		; ditto
+
+	call	TFT_Display_FadeIn		; show splash
 
 	;---- Do any useful initializes that takes time -------------------------
-	call	restart_set_modes_and_flags	; Sets deco mode flags
+
+	call	restart_set_modes_and_flags ; sets deco mode flags
 	bcf		pressure_refresh
-	call	I2C_init_compass
-	call	I2C_init_accelerometer
+	call	I2C_sleep_compass
+	call	I2C_sleep_accelerometer
 	clrf	ext_flash_address+0
 	clrf	ext_flash_address+1
 	clrf	ext_flash_address+2
 
 	movlw	surface_sp				; in cbar
-	call	transmit_setpoint		; Transmit current setpoint from WREG (in cbar) to external electronics
+	call	transmit_setpoint		; transmit current setpoint from WREG (in cbar) to external electronics
 
 	clrf	timeout_counter2
 ;	clrf	timeout_counter3		; not used / required [rl]
@@ -102,27 +122,23 @@
 	bcf		premenu
 	clrf	last_pressure+0
 	clrf	last_pressure+1
-	bcf		is_bailout				; =1: Bailout
-	bcf		ccr_diluent_setup		; Use OC gases for gaslist routine
+	bcf		FLAG_bailout_mode		; =1: Bailout
+	bcf		FLAG_diluent_setup		; use OC gases for gaslist routine
 
-	bcf		simulatormode_active	; Quit simulator mode (if active)
+	bcf		simulatormode_active	; quit simulator mode (if active)
+
+	call	wait_1s					; wait <= 1 second
+	call	wait_1s					; wait    1 second
+	call	wait_1s					; wait    1 second
 
 	;---- Fade to standard surface view --------------------------------------
-	; Wait 1 second
-	bcf		onesecupdate
-	btfss	onesecupdate
-	bra		$-2
-	; Wait 1 second
-	bcf		onesecupdate
-	btfss	onesecupdate
-	bra		$-2
 
-	call	TFT_Display_FadeOut		; Go to black screen
-	call	TFT_ClearScreen			; Then change everything
-	WIN_TOP	 .0
+	call	TFT_Display_FadeOut		; go to black screen
+	call	TFT_ClearScreen			; then change everything
+	WIN_TOP  .0
 	WIN_LEFT .0
 	WIN_FONT FT_SMALL
-	bcf		win_invert				; Reset invert flag
+	bcf		win_invert				; reset invert flag
 
 	WIN_COLOR			color_lightblue
 	WIN_SMALL			menu_pos_column,menu_pos_row
@@ -132,34 +148,37 @@
 	call				TFT_standard_color
 
 ; Logo
-	WIN_TOP	 .0
+ IFDEF _ostc_logo
+	WIN_TOP  .0
 	WIN_LEFT .70
-	movlw	LOW   ostc_logo_block
-	movwf	TBLPTRL
-	movlw	HIGH  ostc_logo_block		; &0xFFFF
-	movwf	TBLPTRH
-	movlw	UPPER ostc_logo_block
-	movwf	TBLPTRU
-	call	color_image
+	TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ; show OSTC logo
+ ELSE
+	WIN_COLOR color_white
+	WIN_STD .100,.0
+	STRCPY_PRINT "OSTC"					; show "OSTC"
+	WIN_COLOR color_cyan
+	WIN_TINY .140,.0
+	STRCPY_PRINT "hwOS"					; show "hwOS"
+	WIN_TINY .139,.12
+	STRCPY_PRINT "tech"					; show "tech"
+ ENDIF
 
 	call	TFT_clock					; display time
 	call	update_surfloop60
 	call	get_battery_voltage			; get battery voltage
 	call	TFT_update_batt_voltage		; display battery voltage
 	call	TFT_update_surf_press		; display surface pressure
-	call	TFT_temp_surfmode			; Displays temperature
+	call	TFT_temp_surfmode			; display temperature
 	call	TFT_display_decotype_surface
 	call	calc_deko_divemode_sensor
 
-	movff	opt_dive_mode,lo			; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
-	tstfsz	lo
-	bra		surfloop_no_oc				; Not OC
-	call	TFT_show_OC_startgas_surface; Show first gas and "OSTC2-like" active gases
-surfloop_no_oc:
-	movff	customview_surfmode,menupos3; Reload last customview
-	call	surf_customview_mask		; Update #menupos3 view
+	TSTOSS	opt_dive_mode				; in OC ? (0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR)
+	call	TFT_show_OC_startgas_surface; YES - show first gas and "OSTC2-like" active gases
 
-	call	TFT_Display_FadeIn			; Display resulting surface screen.
+	movff	customview_surfmode,menupos3; reload last custom view
+	call	surf_customview_mask		; redraw last custom view
+
+	call	TFT_Display_FadeIn			; display resulting surface screen
 
 	bcf		switch_left
 	bcf		switch_right
@@ -169,8 +188,8 @@
 	movff	last_surfpressure_30min+1,int_I_pres_respiration+1		; 30min old values
 	movff	last_surfpressure_30min+0,int_I_pres_surface+0			; copy surface air pressure to deco routine
 	movff	last_surfpressure_30min+1,int_I_pres_surface+1			; 30min old values
-	movff	last_surfpressure_30min+0,last_surfpressure+0			; Use 30min old airpressure
-	movff	last_surfpressure_30min+1,last_surfpressure+1			; Use 30min old airpressure
+	movff	last_surfpressure_30min+0,last_surfpressure+0			; use 30min old air pressure
+	movff	last_surfpressure_30min+1,last_surfpressure+1			; use 30min old air pressure
 
 	movff	opt_GF_low,char_I_GF_Low_percentage
 	movff	opt_GF_high,char_I_GF_High_percentage
@@ -182,114 +201,113 @@
 	call	deco_calc_desaturation_time ; calculate desaturation time
 	banksel	common
 
-	btfsc	enable_screen_dumps			; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	call	enable_rs232				; Also sets to speed_normal ...
+ IFDEF _screendump
+	btfsc	enable_screen_dumps			; =1: ignore vin_usb, wait for "l" command (Screen dump)
+	call	enable_rs232				; also sets to speed_normal
+ ENDIF
 
 surfloop_loop:
 	btfss	onesecupdate				; do every second tasks?
-	bra		surfloop_loop2				; no, loop
+	bra		surfloop_loop2				; NO - loop
 
-; One Second tasks for all modes
+	; one second tasks for all modes
 	call	speed_normal
 	;call	TFT_debug_output
 	call	TFT_clock					; update clock
-	call	timeout_surfmode			; check timeout 
+	call	timeout_surfmode			; check timeout
 	call	get_battery_voltage			; get battery voltage
 	call	TFT_update_batt_voltage		; display battery voltage
-	call	set_dive_modes				; tests if depth>threshold
-	btfss	secs,0						; Every two seconds...
-	call	TFT_temp_surfmode			; Displays temperature
-	btfss	secs,0						; Every two seconds...
+	call	set_dive_modes				; tests if depth > threshold
+	btfss	secs,0						; every two seconds...
+	call	TFT_temp_surfmode			; ... displays temperature
+	btfss	secs,0						; every two seconds...
 	call	surfmode_check_for_warnings ; ... check for warnings (and display/update) them
 	bcf		onesecupdate				; every second tasks done
 
-surfloop_loop2:	
-; Tasks approx. every 50ms for all modes
+ IFDEF _rx_functions
+	btfss	FLAG_tr_enabled				; YES - TR functions enabled?
+	bra		surfloop_loop2				; NO  - skip tank pressure part
+	call	get_pressure_readings		; YES - get pressure readings
+	call	TFT_surface_tank_pres		;     - update first gas/diluent pressure
+	movlw	.10							;     - number of tank data custom view
+	cpfseq	menupos3					;     - in tank data custom view?
+	bra		surfloop_loop2				;       NO  - skip
+	call	TFT_surface_tankdata		;       YES - update tank data custom view
+ ENDIF
+
+surfloop_loop2:
+	; tasks approx. every 50 ms for all modes
 	call	test_switches_surfmode		; check switches
-	call	TFT_debug_output
+	;call	TFT_debug_output
 
-; One minute tasks for all modes
+	; one minute tasks for all modes
 	btfsc	oneminupdate				; do every minute tasks
 	call	update_surfloop60			; yes, e.g. update time and date
 
-; Mode tasks
-	btfsc	divemode					; Divemode active?
-	goto	diveloop					; Yes, switch into Divemode!
+	; mode tasks
+	btfsc	divemode					; divemode active?
+	goto	diveloop					; YES - switch into divemode!
 
-	btfsc	menubit						; Menu?
-	goto	do_main_menu				; Menu!
+	btfsc	menubit						; shall enter menu?
+	goto	do_main_menu				; YES - enter menu
 
 	btfsc	pressure_refresh			; new pressure available?
 	call	TFT_update_surf_press		; display surface pressure
 	bcf		pressure_refresh			; until new pressure is available
 
-; Updates every 1/4 second
+	; updates every 1/4 second
 	btfss	quarter_second_update
 	bra		surfloop_loop2b
 
 	bcf		quarter_second_update
 
-	; Update Sensors
+	; update sensors
 	call	calc_deko_divemode_sensor
 
-	btfsc	FLAG_ccr_mode				; In CCR mode?
-	bra		surfloop_loop2a1			; Yes.
-	btfss	FLAG_pscr_mode				; In PSCR mode?
-	bra		surfloop_loop2a				; No, skip
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	bra		surfloop_loop2a1			; YES
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	bra		surfloop_loop2a1			; YES
+	bra		surfloop_loop2a				; NO  to both
 
 surfloop_loop2a1:
-	movff	opt_ccr_mode,WREG			; =0: Fixed SP, =1: Sensor,  =2: Auto SP
-	sublw	.1							; opt_ccr_mode = 1 (Sensor)?
-	bnz		surfloop_loop2a				; No, skip
+	movff	opt_ccr_mode,WREG			; =0: fixed SP, =1: sensor,  =2: auto SP
+	decfsz	WREG						; opt_ccr_mode = 1 (sensor)?
+	bra		surfloop_loop2a				; NO - skip sensor readings
 
 	call	TFT_surface_sensor			; ...update sensor data in surface mode
-	call	TFT_sensor_surface_warning	; Show a warning arrow-down behind sensor readings when sensor is end-of-life
+	call	TFT_sensor_surface_warning	; show a warning arrow-down behind sensor readings when sensor is end-of-life
 	movlw	.9 
-	cpfseq	menupos3					; in Sensor mV surface custom view? 
-	bra		surfloop_loop2a				; No
-	extern	TFT_sensor_mV 
-	call	TFT_sensor_mV				; Yes, update mV readings (Each 1/4 second and not each second as in customview.asm)
+	cpfseq	menupos3					; in sensor mV surface custom view? 
+	bra		surfloop_loop2a				; NO
+	call	TFT_sensor_mV				; YES - update mV readings (Each 1/4 second and not each second as in customview.asm)
 
 surfloop_loop2a:
 	movlw	.6
 	cpfseq	menupos3					; in compass view?
-	bra		surfloop_loop2b				; No
-	extern	TFT_surface_compass_heading
-	call	TFT_surface_compass_heading	; Yes, update compass heading value
+	bra		surfloop_loop2b				; NO
+	call	TFT_surface_compass_heading	; YES - update compass heading value
 
 surfloop_loop2b:
-	btfsc	toggle_customview			; Next view?
-	call	surf_customview_toggle		; Yes, show next customview (and delete this flag)
+	btfsc	toggle_customview			; next view?
+	call	surf_customview_toggle		; YES - show next customview (and delete this flag)
 
-	btfsc	enable_screen_dumps			; =1: Ignore vin_usb, wait for "l" command (Screen dump)
-	bra		surfloop_loop3
-
-	;btfsc	vusb_in						; USB plugged in?
-	;call	comm_mode					; Start COMM mode
-
-	bra		surfloop_loop4
+ IFDEF _screendump
+	btfsc	enable_screen_dumps			; screendump enabled?
+	call	TFT_dump_screen_check		; YES - check if requested and do it
+ ENDIF
 
-surfloop_loop3:
-	btfss	vusb_in						; USB (still) plugged in?
-	bcf		enable_screen_dumps			; No, clear flag
-	call	rs232_get_byte
-	btfsc	rs232_receive_overflow
-	bra		surfloop_loop4
-	movlw	"l"
-	cpfseq	RCREG1
-	bra		surfloop_loop4
-	call	TFT_dump_screen				; Dump the screen contents
+	;btfsc	vusb_in						; USB plugged in?       | commented out - do not start COMM mode when charging in surface mode
+	;call	comm_mode					; YES - start COMM mode |
 
-surfloop_loop4:
-	btfss	sleepmode					; shall we go into sleepmode?
-	bra		surfloop_loop				; NO  - loop in surfacemode
-	movff	menupos3,customview_surfmode; YES - save last customview
-	goto	sleeploop					;       switch into sleepmode
-
+	btfss	sleepmode					; shall we go into sleep mode?
+	bra		surfloop_loop				; NO  - loop in surface mode
+	movff	menupos3,customview_surfmode; YES - save last custom view
+	goto	sleeploop					;       switch into sleep mode
 
 update_surfloop60:
-; One minute tasks for all modes
-	call	TFT_date					; Update date
+	; one minute tasks for all modes
+	call	TFT_date					; update date
 
 	call	deco_calc_dive_interval_1min; calculate deco in surface mode. int_I_pres_surface gets updated by
 	call	deco_calc_desaturation_time	; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar
@@ -297,15 +315,15 @@
 
 	; update tissue diagram if it is on display
 	movlw	.5							; number of tissue custom view
-	cpfseq	menupos3					; is this the current customview?
+	cpfseq	menupos3					; is this the current custom view?
 	bra		update_surfloop60_1			; NO
 	call	TFT_standard_color			; YES - set standard color
 	call	TFT_surface_tissues			;       show tissue diagram
 
 update_surfloop60_1:
 	; update last dive info if it is on display
-	movlw	.8							; number of the last dive info customview
-	cpfseq	menupos3					; is this the current customview?
+	movlw	.8							; number of the last dive info custom view
+	cpfseq	menupos3					; is this the current custom view?
 	bra		update_surfloop60_2			; NO
 	call	TFT_standard_color			; YES - set standard color
 	call	TFT_surface_lastdive		;       show last dive infos
@@ -314,106 +332,100 @@
 	bcf		oneminupdate
 	return
 
-	extern  check_cns_violation,check_warn_battery,check_and_store_gf_violation
 surfmode_check_for_warnings:
-	bcf		warning_active				; Clear flag
-	clrf	warning_counter				; Clear counter
+	bcf		message_attention			; clear flag for messages of level attention
+	bcf		message_warning				; clear flag for messages of level warning
+	clrf	message_counter				; clear message counter
 
-	; Warnings for all modes
-	call	check_warn_battery			; Check if the battery level should be displayed/warned
+	; warnings for all modes
+	call	check_warn_battery			; check if the battery level should be displayed/warned
 
-	btfsc	FLAG_apnoe_mode				; Done for Apnoe or Gauge mode
+	btfsc	FLAG_apnoe_mode				; done for Apnoe or Gauge mode
 	bra		surfmode_check_for_warnings2
-	btfsc	FLAG_gauge_mode				; Done for Apnoe or Gauge mode
+	btfsc	FLAG_gauge_mode				; done for Apnoe or Gauge mode
 	bra		surfmode_check_for_warnings2
 
-	; Warnings only in deco modes
-	rcall	surfmode_check_for_desat	; Check if desat time should be shown
-	rcall	surfmode_check_for_nofly	; Check if nofly time should be shown
-	call	check_cns_violation			; Check CNS value and display it, if required
-	call	check_and_store_gf_violation; Check GF value and display it, if required
-
-	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
-	btfsc	WREG,mbubble_warning_lock	; do we have a microbubbles warning?
-	extern	warn_mbubbles
-	call	warn_mbubbles				; YES
+	; warnings only in deco modes
+	rcall	surfmode_check_for_desat	; check if desat time should be shown
+	rcall	surfmode_check_for_nofly	; check if nofly time should be shown
+	call	check_cns_violation			; check CNS value and display it, if required
+	call	check_and_store_gf_violation; check GF value and display it, if required
+	call	check_mbubbles				; check for micro bubbles
 
 surfmode_check_for_warnings2:
-	; Setup warning_page number
-	incf	warning_page,F
+	; setup message page number
+	incf	message_page,F
 	bcf		STATUS,C
-	rlcf	warning_page,W				; *2
-	cpfsgt  warning_counter				; > warning_counter
-	clrf	warning_page				; No, clear
+	rlcf	message_page,W				; *2
+	cpfsgt	message_counter				; > message_counter?
+	clrf	message_page				; NO - clear
 
-	; Clear both rows of warnings if there is nothing to show at all
-	tstfsz	warning_counter				; any warnings?
+	; clear both rows of warnings if there is nothing to show at all
+	tstfsz	message_counter				; any warnings?
 	bra		surfmode_check_for_warnings3; YES - look if second row needs to be cleared
 	call	TFT_clear_warning_text		; NO  - clear complete warnings area
 	return
 
 surfmode_check_for_warnings3:
-	; Clear 2nd row of warnings if there is nothing to show (on this page)
+	; clear 2nd row of warnings if there is nothing to show (on this page)
 	btfss	second_row_warning				; =1: The second row contains a warning
-	call	TFT_clear_warning_text_2nd_row	; No, clear this row
+	call	TFT_clear_warning_text_2nd_row	; NO - clear this row
 	return									; Done.
 
 surfmode_check_for_desat:
 	banksel	int_O_desaturation_time
-	movf	int_O_desaturation_time+0,W	; is nofly-time null ?
+	movf	int_O_desaturation_time+0,W
 	iorwf	int_O_desaturation_time+1,W
 	banksel	common
-	bnz		surfmode_check_for_desat_1	; NO
-	return
+	bnz		surfmode_check_for_desat_1	; is the desat-time > 0 ?
+	return								; NO
 surfmode_check_for_desat_1:				; YES
-	incf	warning_counter,F			; increase counter
+	incf	message_counter,F			; increase counter
 	call	TFT_desaturation_time		; show desaturation time
 	return
 
 surfmode_check_for_nofly:
 	banksel	int_O_nofly_time
-	movf	int_O_nofly_time+0,W		; is nofly-time null ?
+	movf	int_O_nofly_time+0,W
 	iorwf	int_O_nofly_time+1,W
 	banksel	common
-	bnz		surfmode_check_for_nofly_1	; No...
-	return
+	bnz		surfmode_check_for_nofly_1	; is the nofly-time > 0 ?
+	return								; NO
 surfmode_check_for_nofly_1:				; YES
-	incf	warning_counter,F			; increase counter
+	incf	message_counter,F			; increase counter
 	call	TFT_nofly_time				; show nofly-time
 	return
 
 
 ;=============================================================================
 
-test_switches_surfmode:					; checks switches in surfacemode
+test_switches_surfmode:					; check switches in surfacemode
 	btfsc	switch_right
 	bra		test_switches_surfmode2
 	btfsc	switch_left
 	bra		test_switches_surfmode3
-	; No button pressed
+	; no button pressed
 	return
 
 test_switches_surfmode3:
 	movlw	.6
 	cpfseq	menupos3					; in compass view?
-	bra	 test_switches_surfmode3a		; No
+	bra		test_switches_surfmode3a	; NO
 
-	btfsc	premenu						; already shown "Bearing"
-	bra		test_switches_surfmode3b	; Yes, remove it
-
-	extern	TFT_surf_set_bearing
-	call	TFT_surf_set_bearing		; Yes.
+	btfsc	premenu						; "Bearing" already shown?
+	bra		test_switches_surfmode3b	; YES - remove it
+	call	TFT_surf_set_bearing		; NO  - show it
 	bcf		switch_left
 	return
 
 test_switches_surfmode3a:
 	bcf		switch_left
 	bcf		compass_bearing_set			; clear bearing on entering menu
-	bsf		menubit						; Enter Menu!
+	bsf		menubit						; enter the main menu
 	return
 
 test_switches_surfmode3b:
-	; Clear "Heading?"
+	; clear "Bearing"
 	WIN_BOX_BLACK	.158,.190, .15, .99	; top, bottom, left, right
 	bcf		premenu
 	bcf		switch_left
@@ -422,10 +434,10 @@
 test_switches_surfmode2:
 	movlw	.6
 	cpfseq	menupos3					; in compass view?
-	bra		test_switches_surfmode2a	; No
+	bra		test_switches_surfmode2a	; NO
 	btfss	premenu						; "Heading?" shown?
-	bra		test_switches_surfmode2a	; No
-	; Set new heading
+	bra		test_switches_surfmode2a	; NO
+	; set new heading
 	bcf		premenu
 	bsf		compass_bearing_set
 	movff	compass_heading_shown+0,compass_bearing+0
@@ -442,22 +454,26 @@
 
 	global	timeout_surfmode
 timeout_surfmode:
-	movlw	timeout_surfacemode			; [s] Default timeout
-	btfsc	menu_show_sensors2			; In the "Calibrate" menu?
-	movlw	timeout_calibrate_menu		; [s] CCR Calibrate Menu timeout
-	btfsc	menubit						; in Menu?
-	bra		timeout_testmode			; No, done.
-	; Must be in surface mode
-	btfss	FLAG_ccr_mode				; =1: CCR mode (Fixed ppO2 or Sensor) active
-	bra		timeout_testmode			; No, not CCR
-	movlw	timeout_ccr_surface			; [s] CCR Surface mode timeout
+	movlw	timeout_surfacemode			; load default timeout
+	btfsc	menu_update_sensor_mv		; in the "Calibrate" menu?
+	movlw	timeout_calibrate_menu		; YES - replace with CCR Calibrate Menu timeout
+ IFDEF _rx_functions
+	btfsc	FLAG_pairing_mode			; in the "Setup Tank" menu?
+	movlw	timeout_tanksetup_menu		; YES - replace with Tank Setup Menu timeout
+ ENDIF
+	btfsc	menubit						; in menu?
+	bra		timeout_testmode			; NO - done
+	; must be in surface mode
+	btfss	FLAG_ccr_mode				; in CCR mode? (fixed ppO2 or sensor)
+	bra		timeout_testmode			; NO  - not CCR
+	movlw	timeout_ccr_surface			; YES - replace with CCR surface mode timeout
 
 	global	timeout_testmode
 timeout_testmode:
 	incf	timeout_counter2,F			; increase timeout counter
-	cpfsgt	timeout_counter2			; Compare with timeout limit
+	cpfsgt	timeout_counter2			; compare with timeout limit
 	return								; return, no timeout
-	bsf		sleepmode					; Set Flag
-	return								; Return
+	bsf		sleepmode					; set flag
+	return								; return
 
 	END
\ No newline at end of file
--- a/src/text_english.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_english.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,369 +1,466 @@
 ;=============================================================================
 ;
-;    File text_english.asm							REFACTORED VERSION V2.95
+;	File text_english.asm							REFACTORED VERSION V2.99e
 ;
-;    English texts reference file.
+;	English texts reference file.
 ;
-;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;	Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 
 ; Basic texts
-	TCODE	tNo,        	"No"           		; No
-	TCODE	tYes,       	"Yes"          		; Yes = No + 1
-	TCODE	tblank,			" "					; (a single space character)	## NEW (layout)
-	
+	TCODE	tNo,				"No"					; 0 No		keep order, enum!
+	TCODE	tYes,				"Yes"					; 1 Yes
+ IFDEF _cave_mode
+	TCODE	tCave,				"Cave"					; 2 Cave
+ ENDIF
+
+	TCODE	tblank,				" "						; (a single space character)
+
 ; Surface-mode texts
-    TCODE   tBeta,      	  "beta"   			; beta
-    TCODE   tMenu,			  "<Menu" 			; <Menu
-    TCODE   tView,      	  "View>"      		; View>
-    TCODE   tHeading,   	  "Heading:"   		; Heading:
-    TCODE   tLastDive,		  "Last Dive"		; Last Dive (Max 10 chars)
-    TCODE   tSensorMilliVolt, "CCR Sensors mV" 	; CCR Sensors mV
+	TCODE	tMenu,				"<Menu"					; <Menu
+	TCODE	tView,				"View>"					; View>
+	TCODE	tHeading,			"Heading:"				; Heading:
+	TCODE	tLastDive,			"Last Dive"				; Last Dive (Max 10 chars)
+	TCODE	tSensorMilliVolt,	"Sensors mV"			; Sensors mV
 
-; Divemode Menu
-    TCODE   tDivemenu_Gaslist,  "Gaslist"       ; Gaslist
-    TCODE   tDivemenu_ResetAvg, "Reset Avg."    ; Reset Avg.
-    TCODE   tDivemenu_Setpoint, "Setpoint"      ; Setpoint
-    TCODE   tDivemenu_UseSensor,"use Sensor"    ; Use Sensor
-    TCODE   tDivemenu_ToggleGF, "Toggle GF"     ; Toggle GF
-    TCODE   tDivemenu_Marker,   "Set Marker"    ; Set Marker
-    TCODE   tDivemenu_LostGas,  "Lost Gas"      ; Lost Gas
+; Divemode menu
+	TCODE	tDivemenu_Gaslist,	"Gaslist"				; Gaslist  (OC)
+	TCODE	tDivemenu_Diluent,	"Diluents"				; Diluents (CCR)
+	TCODE	tDivemenu_Premix,	"Premix"				; Premix   (pSCR)
+	TCODE	tDivemenu_ResetAvg,	"Reset Avg."			; Reset Avg.
+	TCODE	tDivemenu_Avg_Mkr,	"Avg/Marker"			; Reset Avg., Set Marker (and Turn Dive)
+	TCODE	tDivemenu_Setpoint,	"Setpoint"				; Setpoint
+	TCODE	tDivemenu_UseSensor,"use Sensor"			; Use Sensor
+	TCODE	tDivemenu_ToggleGF,	"Toggle GF"				; Toggle GF
+	TCODE	tDivemenu_Marker,	"Set Marker"			; Set Marker
+	TCODE	tDivemenu_LostGas,	"Lost Gas"				; Lost Gas
+ IFDEF _cave_mode
+	TCODE	tDivemenu_TurnDive,	"Turn Dive"				; Turn Dive
+ ENDIF
 
 ; Main menu
-    TCODE   tNext,      	"<Next"        		; <Next
-    TCODE   tEnter,     	"Enter>"       		; Enter>
-
-    TCODE   tMainMenu,  	"Main Menu"    		; MainMenu
-    TCODE   tLogbook,   	"Logbook"       	; Logbook
-    TCODE   tGasSetup,  	"OC Gas Setup"  	; OC Gas Setup
-    TCODE   tSetTime,   	"Set Time"			; Set Time
-    TCODE	tSetDate,		"Set Date"			; Set Date
-    TCODE	tSetTimeDate,	"Set Time & Date"	; Set Time & Date
-    TCODE   tDispSets,  	"Display Settings" 	; Display Settings
-    TCODE   tExit,      	"Exit"          	; Exit
-	TCODE	tResetMenu, 	"Reset Menu"		; Reset Menu
-	TCODE	tDiveModeMenu,	"Deco Setup"		; Deco Setup					## MODIFIED (consistent naming)
-	TCODE	tInfoMenu,		"Information"		; Information
-	TCODE   tCCRSetup,  	"CCR/pSCR Setup" 	; CCR/pSCR Setup				## MODIFIED (consistent naming)
-    TCODE   tDiluentSetup,	"Diluent Setup"   	; Diluent Setup
-	TCODE   tFixedSetpoints,"CCR Setpoints" 	; Fixed Setpoints for CCR		## MODIFIED (consistent naming)
-	TCODE   tCCRSensor, 	"Sensor"   			; CCR/pSCR Sensor				## MODIFIED (consistent naming)
-    TCODE   tCalibrateMenu, "Calibration"   	; Calibration
-    TCODE   tCalibrationGas,"Cal. Gas O2:"  	; Cal. Gas O2:
-    TCODE   tCalibrate, 	"Calibrate"    		; Calibrate
-	TCODE	tBack,			 "back..."			;								## NEW 
+	TCODE	tNext,				"<Next"					; <Next
+	TCODE	tEnter,				"Enter>"				; Enter>
+	TCODE	tMainMenu,			"Main Menu"				; MainMenu
+	TCODE	tLogbook,			"Logbook"				; Logbook
+	TCODE	tGasSetup,			"OC Gas Setup"			; OC Gas Setup
+	TCODE	tSetTime,			"Set Time"				; Set Time
+	TCODE	tSetDate,			"Set Date"				; Set Date
+	TCODE	tSetTimeDate,		"Set Time & Date"		; Set Time & Date
+	TCODE	tDispSets,			"Display Settings"		; Display Settings
+	TCODE	tExit,				"Exit"					; Exit
+	TCODE	tResetMenu,			"Reset Menu"			; Reset Menu
+	TCODE	tDiveModeMenu,		"Deco Setup"			; Deco Setup
+	TCODE	tInfoMenu,			"Information"			; Information
+	TCODE	tTrSettings,		"Pressure Display"		; Pressure Display
+	TCODE	tTrMode,			"Mode: "				; Mode
+	TCODE	tTr1stPres,			"1.Pres.: "				; 1st Pressure
+	TCODE	tTr2ndPres,			"2.Pres.: "				; 2nd Pressure
+	TCODE	tTrBailPres,		"1.B/O  : "				; Bailout Pressure
+	TCODE	tTrMaxDeltaP,		"max deltaP: "			; independent double max diffenerce
+	TCODE	tCCRSetup,			"CCR/pSCR Setup"		; CCR/pSCR Setup
+	TCODE	tDiluentSetup,		"Diluent Setup"			; Diluent Setup
+	TCODE	tFixedSetpoints,	"CCR Setpoints"			; Fixed Setpoints for CCR
+	TCODE	tCCRSensor,			"Sensor"				; CCR/pSCR Sensor
+	TCODE	tCalibrateMenu,		"Calibration"			; Calibration
+	TCODE	tCalibrationGas,	"Cal. Gas O2:"			; Cal. Gas O2:
+	TCODE	tCalibrate,			"Calibrate"				; Calibrate
+	TCODE	tBack,				"back"
 
 ; Gas menu
-    TCODE   tGaslist,   	"OC Gas List"
-    TCODE   tGaslistCC, 	"CC Diluents"
-    TCODE   tGasEdit,   	"Edit Gas"
-    TCODE   tType,      	"Type: "
-    TCODE   tGasDisabled,	"Disabled"  		; Disabled
-    TCODE   tGasFirst,   	"First"     		; First
-    TCODE   tGasTravel,  	"Travel"    		; Travel
-    TCODE   tGasDeco,    	"Deco"      		; Deco
-    TCODE   tDilDisabled,	"Disabled"  		; Disabled
-    TCODE   tDilFirst,   	"First"     		; First
-    TCODE   tDilNorm,   	"Normal"     		; Normal
-    TCODE   tAir,       	"Air  "         	; Enum: values must follow (5 chars)
-    TCODE   tO2,        	"O2   "         	; tAir + 5
-    TCODE   tO2Plus,    	"O2 +"
-    TCODE   tO2Minus,   	"O2 -"
-    TCODE   tHePlus,    	"He +"
-    TCODE   tHeMinus,   	"He -"
-    TCODE   tMOD,       	"MOD:"
-    TCODE   tEAD,       	"EAD:"
-    TCODE   tGasDepth,  	"Change depth"
-    TCODE   tDepthPlus, 	"Depth +"
-    TCODE   tDepthMinus,	"Depth -"
-    TCODE   tDepthReset,	"Reset to MOD:"
-    TCODE   tSetup_mix, 	"Setup Mix"
-	TCODE   tCCRMode,   	"Mode:"             ; Mode:							## MODIFIED (layout)
-    TCODE   tCCRModeFixedSP,"Fixed SP"  	; Fixed for CCR / Calc.for pSCR	## MODIFIED (layout)
-    TCODE   tCCRModeSensor,	"Sensor"          	; Sensor
-    TCODE   tCCRModeAutoSP,	"Auto SP"         	; Auto SP
-    TCODE   tSP,            "SP"                ; SP (SetPoint)
-    TCODE   tSPPlus,    	"ppO2+"             ; pO2+
-    TCODE   tSensorFallback,"Fallback:"         ; Fallback:
-	TCODE	tCalculated,	"calculated"		; calculated
-    TCODE   tppO2,      	"ppO2:"             ; ppO2:
-    TCODE   tppO2O2,		"ppO2(O2)"			; ppO2(O2)
-    TCODE   tppO2Dil,		"ppO2(Dil)"			; ppO2(Dil)
-	TCODE   tppO2Mix,		"ppO2(Mix)"			; ppO2(Mix)
-	
+	TCODE	tGaslist,			"OC Gas List"
+	TCODE	tGaslistCC,			"CC Diluents"
+	TCODE	tGasEdit,			"Edit Gas"
+	TCODE	tType,				"Type: "
+	TCODE	tGasDisabled,		"Disabled"				; Disabled
+	TCODE	tGasFirst,			"First"					; First
+	TCODE	tGasTravel,			"Travel"				; Travel
+	TCODE	tGasDeco,			"Deco"					; Deco
+	TCODE	tDilDisabled,		"Disabled"				; Disabled
+	TCODE	tDilFirst,			"First"					; First
+	TCODE	tDilNorm,			"Normal"				; Normal
+	TCODE	tAir,				"Air  "					; Enum: values must follow (5 chars)
+	TCODE	tO2,				"O2   "					; tAir + 5
+	TCODE	tO2Plus,			"O2 +"
+	TCODE	tO2Minus,			"O2 -"
+	TCODE	tHePlus,			"He +"
+	TCODE	tHeMinus,			"He -"
+	TCODE	tMOD,				"MOD :"
+	TCODE	tEAD,				"EAD:"
+	TCODE	tSetup_GasDepth,	"Setup Depth"
+	TCODE	tDepthPlus,			"Depth +"
+	TCODE	tDepthMinus,		"Depth -"
+	TCODE	tDepthReset,		"Reset to MOD:"
+	TCODE	tSetup_GasMix,		"Setup Mix"
+	TCODE	tCCRMode,			"Mode:"					; Mode:
+	TCODE	tCCRModeFixedSP,	"Fixed SP/Calc."		; 0 Fixed for CCR / Calc.for pSCR
+	TCODE	tCCRModeSensor,		"Sensor"				; 1 Sensor
+	TCODE	tCCRModeAutoSP,		"Auto SP"				; 2 Auto SP
+	TCODE	tSP,				"SP"					; SP (SetPoint)
+	TCODE	tSPPlus,			"ppO2+"					; pO2+
+	TCODE	tSensorFallback,	"Fallback:"				; Fallback:
+	TCODE	tCalculated,		"calculated"			; calculated
+	TCODE	tppO2,				"ppO2:"					; ppO2:
+	TCODE	tppO2O2,			"ppO2(O2)"				; ppO2(O2)
+	TCODE	tppO2Dil,			"ppO2(Dil)"				; ppO2(Dil)
+	TCODE	tppO2Mix,			"ppO2(Mix)"				; ppO2(Mix)
+
 ; New batteries menu
-	TCODE   tNewBattTitle,	"New Battery?"
-	TCODE	tNewBattOld,	"Keep old"
+	TCODE	tNewBattTitle,		"New Battery?"
+	TCODE	tNewBattOld,		"Keep old"
 	TCODE	tNewBattNew36,		"New 3.6V Saft  (T1)"
 	TCODE	tNewBattNew15,		"New 1.5V AA    (T0)"
 	TCODE	tNewBattAccu,		"3.6V LiIon AA  (T2)"
-	TCODE	tNew18650,		"Internal 18650 (T3)"
-	TCODE	tNew16650,		"Internal 16650 (T4)"
+	TCODE	tNew18650,			"Internal 18650 (T3)"
+	TCODE	tNew16650,			"Internal 16650 (T4)"
+
+; Gaslist Management
+	TCODE	tGas,				"Gas"					; Gas
+	TCODE	tDil,				"Dil"					; Diluent
+	TCODE	tGasErr,			"Err"					; Err (3 chars)
 
-; Gaslist management
-    TCODE   tGas,       	"Gas"				; Gas
-    TCODE   tGasErr,    	"Err"           	; Err  (3 chars)
-        
-; Communication Menu
-	TCODE	tUsbTitle,		"USB Mode"
-    TCODE   tBleTitle,  	"Bluetooth Mode"
-	TCODE	tUsbStarting,  	"Starting..."
-	TCODE	tUsbStartDone, 	"Done."
-	TCODE	tUsbServiceMode,"Service mode enabled"
-	TCODE	tUsbClosed,		"Port closed"
-	TCODE	tUsbExit,		"Exited"
-	TCODE	tUsbDownloadMode,"Download mode enabled"
-    TCODE   tUsbLlBld,      "Low-level Bootloader"
+; Communication menu
+	TCODE	tUsbTitle,			"USB Mode"
+	TCODE	tBleTitle,			"Bluetooth Mode"
+	TCODE	tUsbStarting,		"Starting..."
+	TCODE	tUsbStartDone,		"Done."
+	TCODE	tUsbServiceMode,	"Service mode enabled"
+	TCODE	tUsbClosed,			"Port closed"
+	TCODE	tUsbExit,			"Exited"
+	TCODE	tUsbDownloadMode,	"Download mode enabled"
+	TCODE	tUsbLlBld,			"Low-level Bootloader"
 
-; Dive Settings
-    TCODE   tDvMode,    	"Dive Mode:"
-    TCODE   tDvOC,      	"OC"				; keep order, enum from here...
-    TCODE   tDvCCR,		"CCR"
-    TCODE   tDvGauge,   	"Gauge"
-    TCODE   tDvApnea,   	"Apnea"
-    TCODE   tDvPSCR,		"pSCR"				; ...up to here!
-    TCODE   tDvCC,      	"CC"
-    TCODE   tDkMode,    	"Decotype:ZH-L16"	;								## MODIFIED (memory needs)
-    TCODE   tZHL16,     	" "					; keep order, enum from here...	## MODIFIED (memory needs)
-    TCODE   tZHL16GF,   	"+GF"				; ...up to here!				## MODIFIED (memory needs)
-    TCODE   tPPO2Max,   	"Max     :"			;								## MODIFIED (layout)
-    TCODE   tPPO2DECO,		"Max Deco:"			;								## MODIFIED (layout)
-    TCODE   tPPO2MIN,   	"Min     :"			;								## MODIFIED (layout)
-	TCODE	tPPO2MINCC, 	"Min Loop:"			; 								## NEW ppO2 min cc
-    TCODE   tLastDecostop, 	"Last Deco:"
-    TCODE   tDecoparameters,"Deco Parameters"
-    TCODE   tGF_low,    	"GF low :"			; 								## MODIFIED (layout)
-    TCODE   tGF_high,   	"GF high:"
-    TCODE   tSaturationMult,  "Saturation  :"	; 								## MODIFIED (layout)
-    TCODE   tDesaturationMult,"Desaturation:"
-	TCODE   tFTTSMenu,  	"fTTS/fB/O:"		; Future TTS / Ascent Delay		## MODIFIED (layout)
-    TCODE   taGFMenu,   	"Alternative GF"    ; Alternative GF
-    TCODE   taGF_low,   	"aGF low :"         ; aGF low						## MODIFIED (layout)
-    TCODE   taGF_high,  	"aGF high:"         ; aGF high
-    TCODE   taGF_enable,	"aGF selectable:"   ; aGF Selectable
-    TCODE   tDiveaGF_active,"aGF!"              ; aGF!
-    TCODE   tppO2settings,	"ppO2 Settings"     ; ppO2 Settings
-    TCODE   tsafetystopmenu,"Safety Stop:"		; Safety Stop:
-	TCODE   tGasUsage,  	"Gas Usage"         ; Gas Usage
-    TCODE   tSetBotUse, 	"Bottom Gas: "      ; Bottom Gas: (space)
-    TCODE   tSetDecoUse,	"Deco   Gas: "      ; Deco   Gas: (space)			## MODIFIED (layout)
-	TCODE	tCalcAscGas,	 "Calc.Gas (B/O):"	;								## NEW bailout gas needs
-	TCODE	tTankSizes,		 "Tank Sizes"		;								## NEW bailout gas needs
-	TCODE   tLiter,			 " l"				;								## NEW bailout gas needs 
-	TCODE	tBarLiter,		"Liter"
-	TCODE	tTankFillPress,	 "Tank Press Budget";
-	TCODE	tGas1,			 "Gas 1:"			;								## NEW bailout gas needs
-	TCODE	tGas2,			 "Gas 2:"			;								## NEW bailout gas needs
-	TCODE	tGas3,			 "Gas 3:"			;								## NEW bailout gas needs
-	TCODE	tGas4,			 "Gas 4:"			;								## NEW bailout gas needs
-	TCODE	tGas5,			 "Gas 5:"			;								## NEW bailout gas needs
-	TCODE	tCCmaxFracO2,	 "Loop %O2 max.:"	;								## NEW CCR max ppO2 limiter
-	TCODE	t2ndDecoPlanMenu,"2nd Deco Plan"	;								## NEW deco engine
+; Dive settings
+	TCODE	tDvMode,			"Dive Mode: "
+	TCODE	tDvOC,				"OC"					; 0      - keep order, enum!
+	TCODE	tDvCCR,				"CCR"					; 1
+	TCODE	tDvGauge,			"Gauge"					; 2
+	TCODE	tDvApnea,			"Apnea"					; 3
+	TCODE	tDvPSCR,			"pSCR"					; 4
+	TCODE	tDvCC,				"CC"
+	TCODE	tDkMode,			"Decotype: ZH-L16"
+	TCODE	tZHL16,				" "						; 0      - keep order, enum!
+	TCODE	tZHL16GF,			"+GF"					; 1
+	TCODE	tPPO2Max,			"Max     :"
+	TCODE	tPPO2DECO,			"Max Deco:"
+	TCODE	tPPO2MIN,			"Min     :"
+	TCODE	tPPO2MINCC,			"Min Loop:"
+	TCODE	tLastDecostop,		"Last Deco   : "		; last deco stop depth
+	TCODE	tAscentSpeed,		"Ascent Speed: "		; Ascent Speed
+	TCODE	tGasChangeTime,		"Gas Change  :+"		; additional Gas Change Time
+	TCODE	tDecoparameters,	"Deco Parameters"
+	TCODE	tGF_low,			"GF  low :"
+	TCODE	tGF_high,			"GF  high:"
+	TCODE	tSaturationMult,	"Saturation  : "
+	TCODE	tDesaturationMult,	"Desaturation: "
+	TCODE	tFTTSMenu,			"fTTS/Delay:"			; Future TTS / Ascent Delay
+	TCODE	tLastDecostopSurf,	"Last Deco :"			; last deco stop depth Surface Custom View
+	TCODE	tGFMenu,			"GF Settings"			; GF Settings
+	TCODE	taGF_low,			"aGF low :"				; aGF low
+	TCODE	taGF_high,			"aGF high:"				; aGF high
+	TCODE	taGF_enable,		"aGF selectable:"		; aGF Selectable
+	TCODE	tDiveaGF_active,	"using aGF"				; using aGF
+	TCODE	tppO2settings,		"ppO2 Settings"			; ppO2 Settings
+	TCODE	tsafetystopmenu,	"Safety Stop: "			; Safety Stop:
+	TCODE	tGasUsage,			"Gas Usage"				; Gas Usage
+	TCODE	tSetBotUse,			"Bottom Gas: "			; Bottom Gas: (space)
+	TCODE	tSetDecoUse,		"Deco   Gas: "			; Deco   Gas: (space)
+	TCODE	tCalcAscGas,		"Calc.Gas (B/O):"
+	TCODE	tSetup_Tank,		"Setup Tank"			; Setup Tank
+	TCODE	tTankSize,			"Tank  Size"			; Tank Sizes
+	TCODE	tTankUsablePress,	"Turn Pres/Asc.Need"	; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars)
+	TCODE	tCopyDilToOC,		"Copy  Dil.-> OC"		; copy diluent settings to OC gas
+	TCODE	tTankPairing,		"Select Transmitter"	; select Transmitter
+	TCODE	tLiter,				" l"					; Liter as l
+	TCODE	tLiterLong,			"Liter"					; Liter as Liter
+	TCODE	tCCmaxFracO2,		"Loop %O2 max.:"
+	TCODE	t2ndDecoPlanMenu,	"2nd Deco Plan"
 
-; Display Settings
-    TCODE   tBright,    	"Brightness:"
-    TCODE   tEco,       	"Eco"
-    TCODE   tMedium,    	"Medium"
-    TCODE   tHigh,      	"High"
-    TCODE   tDvSalinity,	"Salinity: "       	; Salinity						## MODIFIED (layout)
-	TCODE   tShowppO2,  	"Always show ppO2:"	; Always show ppO2:
-    TCODE   tFlip,      	"Rotate Screen:"    ; Rotate Screen
-    TCODE   tMODwarning,	"MOD  Warning  :"	; MOD warning					## MODIFIED (layout)
-	TCODE	tIBCDwarning,	"IBCD Warning  :"	; IBCD Warning					## NEW IBCD
-    TCODE   tTimeoutDive,	"Dive Timeout:"		; Dive Timeout					## MODIFIED (layout)
-	
-; VSI display Settings
-    TCODE   tVSItext2,  	"Variable Speed:"   ; Variable speed:				## MODIFIED (layout)
-    TCODE   tVSIgraph,  	"Speed    Graph:"   ; Speed graph:					## MODIFIED (layout)
+ IFDEF _rx_functions
+	TCODE	tTrModeOff,			"off"					;  0 off		keep order, enum!
+	TCODE	tTrModeOn,			"on"					;  1 on
+	TCODE	tTrModeIndDouble,	"indep.Double"			;  2 independent double
+	TCODE	tTrModeCCR,			"CCR Dil+O2"			;  3 CCR diluent and O2
+	TCODE	tTrPresNone,		"none"					;  0 none		keep order, enum!
+	TCODE	tTrPresGas1,		"Gas 1"					;  1 Gas 1
+	TCODE	tTrPresGas2,		"Gas 2"					;  2 Gas 2
+	TCODE	tTrPresGas3,		"Gas 3"					;  3 Gas 3
+	TCODE	tTrPresGas4,		"Gas 4"					;  4 Gas 4
+	TCODE	tTrPresGas5,		"Gas 5"					;  5 Gas 5
+	TCODE	tTrPresDil1,		"Dil 1"					;  6 Dil 1
+	TCODE	tTrPresDil2,		"Dil 2"					;  7 Dil 2
+	TCODE	tTrPresDil3,		"Dil 3"					;  8 Dil 3
+	TCODE	tTrPresDil4,		"Dil 4"					;  9 Dil 4
+	TCODE	tTrPresDil5,		"Dil 5"					; 10 Dil 5
+	TCODE	tTrPresFirstGas,	"First Gas"				; 11 first  Gas
+	TCODE	tTrPresActiveGas,	"active Gas"			; 12 active Gas
+	TCODE	tTrPresFirstDil,	"First Dil"				; 13 first  Dil
+	TCODE	tTrPresActiveDil,	"active Dil"			; 14 active Dil
+ ELSE
+ 	TCODE	tTrModeOff,			""						; dummy target for entry in option table
+	TCODE	tTrPresNone,		""						; dummy target for entry in option table
+ ENDIF
 
-; Setup Menu
-    TCODE   tSystSets,  	"Settings"
-    TCODE   tLanguage,  	"Language:"
-    TCODE   tEnglish,   	"English"
-    TCODE   tGerman,    	"German"
-    TCODE   tFrench,    	"French"
-    TCODE   tItalian,   	"Italian"
-    TCODE   tCompassMenu,	"Compass calibration"
-    TCODE   tCompassGain,	"Compass Gain:"
-    TCODE   tCalX,	 		"Cal X:"			; Cal X
-    TCODE   tCalY,	 		"Cal Y:"			; Cal Y
-    TCODE   tCalZ,	 		"Cal Z:"			; Cal Z
+; Display settings
+	TCODE	tBright,			"Brightness:"
+	TCODE	tEco,				"Eco"
+	TCODE	tMedium,			"Medium"
+	TCODE	tHigh,				"High"
+	TCODE	tDvSalinity,		"Salinity:  "			; Salinity
+	TCODE	tShowppO2,			"Always show ppO2:"		; Always show ppO2:
+	TCODE	tFlip,				"Rotate Screen:"		; Rotate Screen
+	TCODE	tMODwarning,		"MOD  Warning  :"		; MOD warning
+	TCODE	tIBCDwarning,		"IBCD Warning  :"		; IBCD Warning
+	TCODE	t2ndDepth,			"2nd Depth:"			; 2nd depth display content (10 chars max)
+	TCODE	tTimeoutDive,		"Dive Timeout:"			; Dive Timeout
+
+; VSI display settings
+	TCODE	tVSItext2,			"Variable Speed:"		; Variable speed:
+	TCODE	tVSIgraph,			"Speed Graph   :"		; Speed graph:
 
-    TCODE   tUnits,     	"Units:"
-    TCODE   tMetric,     	" m/°C"            	; Enum menu
-    TCODE   tImperial,   	"ft/°F"
-
-    TCODE   tDefName,   	"HW OSTC"
-
-    TCODE   tButtonleft,	"Left button:"		; Left button
-    TCODE   tButtonright,	"Right button:"    	; Right button
-
-	TCODE	tAltMode,		"Waiting Time:"		;								## NEW no fly altitude
-	TCODE	tAltModeFly,	"Flying"			;								## NEW no fly altitude
-	TCODE	tAltMode1000,	"1000m"				;								## NEW no fly altitude
-	TCODE	tAltMode2000,	"2000m"				;								## NEW no fly altitude
-	TCODE	tAltMode3000,	"3000m"				;								## NEW no fly altitude
+; Setup menu
+	TCODE	tSystSets,			"Settings"
+	TCODE	tCompassMenu,		"Compass Calibration"
+	TCODE	tCompassGain,		"Compass Gain:"
+	TCODE	tCalX,				"Cal X:"				; Cal X
+	TCODE	tCalY,				"Cal Y:"				; Cal Y
+	TCODE	tCalZ,				"Cal Z:"				; Cal Z
+	TCODE	tUnits,				"Units: "
+	TCODE	tMetric,			" m/°C"					; 0   - keep order, enum!
+	TCODE	tImperial,			"ft/°F"					; 1
+								;         111         111         111         111         111
+						;123456789012123456789012123456789012123456789012123456789012
+	TCODE	tDefName,			"HW OSTC"		; 5 rows by 12 chars each
+	TCODE	tButtonleft,		"Left  button:"			; Left button
+	TCODE	tButtonright,		"Right button:"			; Right button
+	TCODE	tAltMode,			"Waiting Time:"
+	TCODE	tAltModeFly,		"Flying"
+	TCODE	tAltMode1000,		"1000m"
+	TCODE	tAltMode2000,		"2000m"
+	TCODE	tAltMode3000,		"3000m"
 
 ; Units for all menu
-    TCODE   tMeters,    	"m"
-	TCODE	tFeets,			"ft"
-	TCODE	tFeets1,		"f"
-    TCODE   tMinutes,   	"'"
-    TCODE   tPercent,   	"%"
-    TCODE   tLitersMinute, 	"l/min"
-	TCODE	tbar,			" bar"				; bar							## MODIFIED (layout)
-	TCODE	tbar10,			"0 bar"				; bar							## NEW 2.95
-	TCODE	tMeterMinute,	"m/min"				; meter per minute				## ascent speed
-	TCODE	tmin,			"min"				; minutes
+	TCODE	tMeters,			"m"
+	TCODE	tFeets,				"ft"
+	TCODE	tFeets1,			"f"
+	TCODE	tMinutes,			"'"
+	TCODE	tPercent,			"%"
+	TCODE	tLitersMinute,		"l/min"
+	TCODE	tbar,				" bar"					; bar
+	TCODE	tbar10,				"0 bar"					; xx0 bar
+	TCODE	tMeterMinute,		"m/'"					; meter per minute
 
 ; Date
-	TCODE	tDateFormat, 	"Date:"
-	TCODE	tDateformat, 	"MMDDYY"
-	TCODE	tDateformat1,	"DDMMYY"
-	TCODE	tDateformat2,	"YYMMDD"
+	TCODE	tDateFormat,		"Format: "
+	TCODE	tDateformat,		"MMDDYY"
+	TCODE	tDateformat1,		"DDMMYY"
+	TCODE	tDateformat2,		"YYMMDD"
 
 ; Simulator menu
-    TCODE   tInter, 		"Start Simulator"	; Start Simulator
-    TCODE   tPlan,  		"Simulator"			; Simulator
+	TCODE	tInter,				"Start Simulator"		; Start Simulator
+	TCODE	tPlan,				"Simulator"				; Simulator
 
 ; Decoplanner submenu
-    TCODE   tBtTm,  		"Bot.Time : "		; Bot. Time: (10 chars)			## MODIFIED (layout)
-    TCODE   tBtTm_short,	"Time:"             ; Bot. Time: (max. 6 chars)
-    TCODE   tBtDep, 		"Bot.Depth: "		; Max Depth: (10 chars)			## MODIFIED (layout)
-    TCODE   tIntvl, 		"Interval : "		; Interval : (10 chars)
-	TCODE	tDecoSetup,		"Calculator Setup"	;								## NEW (layout)
-	TCODE   tDeco,  		"Start Calculator"  ; Calculate Deco				## MODIFIED (layout)
-    TCODE   tDivePlan,  	"Dive Plan:"        ; Dive Plan:
-    TCODE   tNoDeco,    	"No Deco"           ; No Deco
-    TCODE   tMore,      	"More..."           ; More...
-	TCODE	tSelectSetpoint,"CCR Setpoint: "	;								## NEW deco calculator enhancement
-	TCODE	tuseAGF,		"use aGF: "			;								## NEW deco calculator enhancement
-	TCODE	tCalculating,	"Calculating..."	;								## NEW deco calculator enhancement
+	TCODE	tBtTm,				"Bot.Time : "			; Bot. Time: (10 chars)
+	TCODE	tBtTm_short,		"Time:"					; Bot. Time: (max. 6 chars)
+	TCODE	tBtDep,				"Bot.Depth: "			; Max Depth: (10 chars)
+	TCODE	tIntvl,				"Interval : "			; Interval : (10 chars)
+	TCODE	tDecoSetup,			"Calculator Setup"
+	TCODE	tDeco,				"Start Calculator"		; Calculate Deco
+	TCODE	tDivePlan,			"Dive Plan:"			; Dive Plan:
+	TCODE	tNoDeco,			"No Deco"				; No Deco
+	TCODE	tMore,				"more"					; more
+	TCODE	tSelectSetpoint,	"Setpoint : "
+	TCODE	tuseAGF,			"use aGF  : "
+	TCODE	tCalculating,		"Calculating..."
+	TCODE	tNDLleft,			"left"					; time left within NDL
 
 ; Information menu
-    TCODE   tFirmware,  	"Firmware: "        ; Firmware: (space)
-    TCODE   tSerial,    	"Serial  : "        ; Serial  : (space)
-    TCODE   tTotalDives,	"Total Dives: "	    ; Total Dives:
-    TCODE   tBatteryV,  	"Battery : "        ; Battery:						## MODIFIED	## info - added one space
-    TCODE   tUptime,		"Uptime  : "    	; Uptime:						## MODIFIED	## info - added two spaces
-   
+	TCODE	tFirmware,			"Firmware: "			; Firmware: (space)
+	TCODE	tFirmware_rx,		"RX Ver  : "			; RX Ver  : (space)
+	TCODE	tSerial,			"Serial  : "			; Serial  : (space)
+	TCODE	tTotalDives,		"Total Dives: "			; Total Dives:
+	TCODE	tBatteryV,			"Battery : "			; Battery:
+	TCODE	tUptime,			"Uptime  : "			; Uptime:
+
 ; Divemode screen
-    TCODE   tNDL,       	"NDL"
-    TCODE   tTTS,   		"TTS"
-	TCODE	tVelMetric,	 	"m/min"
-	TCODE	tVelImperial,	"ft/m "
-	TCODE	tGasSelect,  	"Select Gas"		; Select Gas
-	TCODE	tSelectAir,	 	"Air "     			; Air
-	TCODE	tSelectO2,	 	"O2  "				; O2
-    TCODE   tSelectNx,   	"Nx"				; Nx
-    TCODE   tSelectTx,   	"Tx"				; Tx
-    TCODE   tDepth,      	"Depth"				; Depth
-    TCODE   tMaxDepth,   	"Max. Depth"		; Max. Depth - max 10chars!
-    TCODE   tDivetime,   	"Divetime"			; Divetime
-    TCODE   tDiveHudMask1,  "Sensor 1"
-    TCODE   tDiveHudMask2,  "Sensor 2"
-    TCODE   tDiveHudMask3,  "Sensor 3"
-    TCODE   tDiveTotalAvg,  "Total Avg"
-    TCODE   tDiveStopwatch, "Stopwatch"
-    TCODE   tDiveStopAvg,   "Stopped Avg"   	; 11chars max
-    TCODE   tApnoeTotal,    " Total"        	; Total (Six chars, right alligned)
-    TCODE   tApnoeMax,      "Last Descent"  	; Last descent
-    TCODE   tApnoeSurface,  "Surface Time"  	; Surface Time
-    TCODE   tDiveDecoplan,  "Decoplan"      	; Decoplan
-    TCODE   tDiveClock,     "Clock"         	; Clock
-    TCODE   tDiveEAD_END,   "EAD/END"       	; EAD/END
-    TCODE   tDiveTissues,   "Tissues"       	; Tissues
-    TCODE   tEND,           "END:"          	; END:
-    TCODE   tHe,            "He"            	; He
-    TCODE   tN2,            "N2"            	; N2
-    TCODE   tDiveBailout,   "Bailout"       	; Bailout
-    TCODE   tGFactors,      "GF Values"     	; GF Values
-    TCODE   taGFactors,     "aGF Values"    	; aGF Values
-    TCODE   tGFInfo,        "Current GF"    	; GF Info
-    TCODE   tCeiling,       "Ceiling"       	; Ceiling
-    TCODE   tDiveSafetyStop,"Stop"          	; Stop (Four chars, right alligned)
-    TCODE   tDiveFallback,  "Fallback!"     	; Fallback! (max. nine chars)
-	TCODE	tDecoInfo,		"Deco Zone"			; Deco info
-    TCODE   tSensorCheck,   "Sensor Check"  	; Sensor Check
-    TCODE   tdil,	    	"Dil:"	    		; Diluent ppO2 Warning
-	TCODE	tmix,			"Mix:"				; Pre-Mix ppO2 Warning
-	TCODE	tSensorDisagree,"Sensors<>"			; Sensors disagree Warning		## NEW voting logic
-	TCODE	tGasNeedsWarn,	"Gas Needs"			;								## NEW bailout gas needs
-	TCODE	tGasNeedsBar,	"Gas Needs (bar)"	;								## NEW bailout gas needs
-	TCODE	tCNSsurf,		"CNS Surf."			;								## NEW CNS at end-of-dive
-	TCODE	tCNSfTTS,		"CNS fTTS"			;								## NEW CNS at end-of-dive
-	TCODE	tCNSBO,			"CNS B/O"			;								## NEW CNS at end-of-dive
-	TCODE	tCNSnow,		"CNS now"			;								## NEW CNS at end-of-dive
-	TCODE	tCNSeod,		"CNS final"			;								## NEW CNS at end-of-dive
-	TCODE	tIBCD,			"IBCD N2He"			;								## NEW IBCD
-	TCODE	tMicroBubbles,	"M.Bubbles"			;								## NEW microbubbles
-	TCODE	tCNS,			"CNS: "				;								## V2.95 optics
+	TCODE	tNDL,				"NDL"					; 3 chars max
+	TCODE	tTTS,				"TTS"
+	TCODE	tVelMetric,			"m/min"
+	TCODE	tVelImperial,		"ft/m "
+	TCODE	tGasSelect,			"Select Gas"			; Select Gas
+	TCODE	tSelectAir,			"Air "					; Air
+	TCODE	tSelectO2,			"O2  "					; O2
+	TCODE	tSelectNx,			"Nx"					; Nx
+	TCODE	tSelectTx,			"Tx"					; Tx
+	TCODE	tDepth,				"Depth"					; Depth
+	TCODE	tMaxDepth,			"Max.Depth"				; Max. Depth    - max 10chars!
+	TCODE	tAvgDepth,			"Average"				; average Depth - max 10chars!
+	TCODE	tDivetime,			"Divetime"				; Divetime
+	TCODE	tDiveHudMask1,		"Sensor 1"
+	TCODE	tDiveHudMask2,		"Sensor 2"
+	TCODE	tDiveHudMask3,		"Sensor 3"
+	TCODE	tDiveTotalAvg,		"Total Avg"
+	TCODE	tDiveStopwatch,		"Stopwatch"
+	TCODE	tDiveStopAvg,		"Stopped Avg"			; 11 chars max
+	TCODE	tApnoeTotal,		" Total"				; Total (six chars, right aligned)
+	TCODE	tApnoeMax,			"Last Descent"			; Last descent
+	TCODE	tApnoeSurface,		"Surface Time"			; Surface Time
+	TCODE	tTime,				"Time of Day"			; Time
+	TCODE	tSurface,			"Surface"				; Surface (max 12 chars)
+	TCODE	tDiveDecoplan,		"Decoplan"				; Decoplan
+;	TCODE	tDiveClock,			"Clock"					; Clock
+	TCODE	tDiveEAD_END,		"EAD/END"				; EAD/END
+	TCODE	tDiveTissues,		"Tissues"				; Tissues
+	TCODE	tEND,				"END:"					; END:
+	TCODE	tHe,				"He"					; He
+	TCODE	tN2,				"N2"					; N2
+	TCODE	tDiveBailout,		"Bailout"				; Bailout
+	TCODE	tGFactors,			"GF Values"				; GF Values
+	TCODE	taGFactors,			"aGF Values"			; aGF Values
+	TCODE	tGFInfo,			"Current GF"			; GF Info
+	TCODE	tCeiling,			"Ceiling"				; Ceiling
+	TCODE	tDiveSafetyStop,	"Stop"					; Stop (four chars, right aligned)
+	TCODE	tDiveFallback,		"Fallback!"				; Fallback! (max. nine chars)
+	TCODE	tDecoInfo,			"Deco Zone"				; Deco info
+	TCODE	tSensorCheck,		"Sensor Check"			; Sensor Check
+	TCODE	tdil,				"Dil:"					; Diluent ppO2 Warning
+	TCODE	tmix,				"Mix:"					; Pre-Mix ppO2 Warning
+	TCODE	tSensorDisagree,	"Sensors<>"				; Sensors disagree Warning
+	TCODE	tGasNeedsWarn,		"Gas Needs"
+	TCODE	tGasNeedsAscent,	"Gas Needs Ascent"
+	TCODE	tCNSsurf,			"CNS Surf."
+	TCODE	tCNSfTTS,			"CNS fTTS"
+	TCODE	tCNSBO,				"CNS B/O"
+	TCODE	tCNSnow,			"CNS now"
+	TCODE	tCNSeod,			"CNS final"
+	TCODE	tIBCD,				"IBCD N2He"
+	TCODE	tnoBOgas,			"-B/O-Gas-"
+	TCODE	tMicroBubbles,		"M.Bubbles"
+	TCODE	tCNS,				"CNS: "
+	TCODE	tgaschange,			"Change?"				; better gas found
+	TCODE	tNeed,				"Need "					; gas need (5 chars)
+	TCODE	tBattery,			"Battery"				; Battery
+ IFDEF _rx_functions
+	TCODE	tTransmitter,		"Pres XMTR"				; pressure transmitter
+	TCODE	tPressure,			"Tank Pres"				; tank pressure
+	TCODE	tSAC,				"SAC"					; SAC, must be 3 chars!
+	TCODE	tswap,				"Swap Tank"				; swap tank (max. 9 chars)
+ ENDIF
+ IFDEF _cave_mode
+	TCODE	tGasNeedsCaveMode,	"Gas Needs Cave Mode"	; title for gas needs custom view
+	TCODE	tDiveTurned,		"Dv.turned"				; dive is turned      (max. 9 char)
+	TCODE	tCaveMode,			"Cave Mode"				; cave mode activated (max. 9 char)
+	TCODE	tCaveModeShutdown,	"X-Cave-X"				; cave mode shut down (max. 9 char)
+ ENDIF
+
 
 ; Divemode menu
-    TCODE   tDivePreMenu,   "Menu?"         	; Menu?
-    TCODE   tSetHeading,    "Bearing"       	; Bearing (Max. seven chars)
+	TCODE	tDivePreMenu,		"Menu?"					; Menu?
+	TCODE	tSetHeading,		"Course"				; set bearing (max. 6 chars)
 
 ; Simulator menu
-	TCODE	tQuitSim,	 	"Quit?"            	; Quit Simulation?
+	TCODE	tQuitSim,			"Quit"					; Quit Simulation
 
 ; Logbook
-	TCODE	tCNS2,			"CNS:"
-	TCODE	tAVG,			"Avg:"
-	TCODE	tGF,			"GF:"
-	TCODE	tSAT,			"Sat:"				; Sat:
+	TCODE	tCNS2,				"CNS:"
+	TCODE	tAVG,				"Avg:"
+	TCODE	tGF,				"GF:"
+	TCODE	tSAT,				"Sat:"
 
 ; Logbook units
-	TCODE	tLogTunitC,		"°C"	
-	TCODE	tLogTunitF,		"°F"
-	TCODE	tKGL,			"kg/l"
-	TCODE	tMBAR,			"mbar"
+	TCODE	tLogTunitC,			"°C"
+	TCODE	tLogTunitF,			"°F"
+	TCODE	tKGL,				"kg/l"
+	TCODE	tMBAR,				"hPa"
 
 ; Logbook menu
-	TCODE	tNextLog, 		"Next Page"
+	TCODE	tNextLog,			"Next Page"
 
 ; Reset menu
-	TCODE	tReboot,		"Reboot"			; Reboot
-	TCODE	tResetMenu2,	"Are you sure?"		; Are you sure?
-	TCODE	tAbort,     	"Abort"             ; Abort
-	TCODE	tResetSettings, "Reset all" 		; Reset all
-	TCODE	tResetDeco,		"Reset Deco"		; Reset Deco
-    TCODE	tResetBattery,	"Reset Battery"		; Reset Battery
-    TCODE	tResetLogbook,	"Reset Logbook"		; Reset Logbook
+	TCODE	tReboot,			"Reboot"				; Reboot
+	TCODE	tResetMenu2,		"Are you sure?"			; Are you sure?
+	TCODE	tAbort,				"Abort"					; Abort
+	TCODE	tResetSettings,		"Reset Settings"		; Reset Settings
+	TCODE	tResetDeco,			"Reset Deco"			; Reset Deco
+	TCODE	tResetBattery,		"Reset Battery"			; Reset Battery
+	TCODE	tResetLogbook,		"Reset Logbook"			; Reset Logbook
 
 ; Set Time Menu/Set Date Menu
-	TCODE	tSetHours,		"Set Hours"			; Set Hours
-	TCODE	tSetMinutes,	"Set Minutes"		; Set Minutes
-	TCODE	tSetSeconds,	"Clear Seconds"		; Clear seconds
-	TCODE	tSetDay,		"Set Day"			; Set Day
-	TCODE	tSetMonth,		"Set Month"			; Set Month
-	TCODE	tSetYear,		"Set Year"			; Set Year
+	TCODE	tSetHours,			"Set Hours"				; Set Hours
+	TCODE	tSetMinutes,		"Set Minutes"			; Set Minutes
+	TCODE	tSetSeconds,		"Clear Seconds"			; Clear seconds
+	TCODE	tSetDay,			"Set Day"				; Set Day
+	TCODE	tSetMonth,			"Set Month"				; Set Month
+	TCODE	tSetYear,			"Set Year"				; Set Year
 
 ; Logbook Offset Menu
-	TCODE	tLogOffset,		"Logbook offset"	; Logbook offset
-	TCODE	tLogOffsetp1,	"+1"				; +1
-	TCODE	tLogOffsetp10,	"+10"				; +10
-	TCODE	tLogOffsetm1,	"-1"				; -1
-	TCODE	tLogOffsetm10,	"-10"				; -10
+	TCODE	tLogOffset,			"Logbook Offset"		; Logbook offset
+	TCODE	tLogOffsetp1,		"+1"					; +1
+	TCODE	tLogOffsetp10,		"+10"					; +10
+	TCODE	tLogOffsetm1,		"-1"					; -1
+	TCODE	tLogOffsetm10,		"-10"					; -10
 
-; Compass directions
-    TCODE   tN,             "N "                ; N(orth),	 338°- 22°
-    TCODE   tNE,            "NE"                ; North-East, 23°- 67°
-    TCODE   tE,             "E "                ; E(east),	  68°-112°
-    TCODE   tSE,            "SE"                ; South-East,113°-157°
-    TCODE   tS,             "S "                ; S(outh),	 158°-202°
-    TCODE   tSW,            "SW"                ; South-West,203°-247°
-    TCODE   tW,             "W "                ; W(West),	 248°-292°
-    TCODE   tNW,            "NW"                ; North-West,293°-337°
+; Compass Directions
+	TCODE	tN,					"N "					; N(orth),    338°- 22°
+	TCODE	tNE,				"NE"					; North-East,  23°- 67°
+	TCODE	tE,					"E "					; E(east),     68°-112°
+	TCODE	tSE,				"SE"					; South-East, 113°-157°
+	TCODE	tS,					"S "					; S(outh),    158°-202°
+	TCODE	tSW,				"SW"					; South-West, 203°-247°
+	TCODE	tW,					"W "					; W(West),    248°-292°
+	TCODE	tNW,				"NW"					; North-West, 293°-337°
 
 ; Color Scheme menu
-    TCODE   tColorScheme,   "Colour scheme"     ; Colour scheme
-    TCODE   tColorSetDive,  "Divemode:"         ; Divemode:
-    TCODE   tColorSetName0, "Standard"          ; Standard
-    TCODE   tColorSetName1, "Red"               ; Red
-    TCODE   tColorSetName2, "Green"             ; Green
-    TCODE   tColorSetName3, "Blue"              ; Blue
-    
-; PSCR Menu and Settings
-	TCODE   tPSCRMenu,	    "pSCR Setup"		; PSCR Menu						## MODIFIED (consistient naming)
-    TCODE   tPSCR_O2_drop,  "O2 drop:"			; O2 drop
-    TCODE   tPSCR_lungratio,"Lung ratio:"		; lung ratio
+	TCODE	tColorScheme,		"Colour Scheme"			; Colour Scheme
+	TCODE	tColorSetDive,		"Divemode:"				; Divemode:
+	TCODE	tColorSetName0,		"Standard"				; Standard
+	TCODE	tColorSetName1,		"Red"					; Red
+	TCODE	tColorSetName2,		"Green"					; Green
+	TCODE	tColorSetName3,		"Blue"					; Blue
+
+; pSCR Menu and Settings
+	TCODE	tPSCRMenu,			"pSCR Setup"			; PSCR Menu
+	TCODE	tPSCR_O2_drop,		"O2 Drop    "			; O2 drop
+	TCODE	tPSCR_lungratio,	"Lung Ratio "			; lung ratio
+	TCODE	tBackToLoop,		"goto loop"				; back to loop (10 chars max)	### new
+
+
+; Language selection
+ IF _language_2!=none
+	TCODE	tLanguage,			"Language: "			; used in menu_tree
+ ENDIF
+
+ IF _language_1==en
+	TCODE	tLang1,				"English"				; tLang1 is 1st language, enum context
+ ELSE
+ IF _language_1==de
+	TCODE	tLang1,				"German"
+ ELSE
+ IF _language_1==fr
+	TCODE	tLang1,				"French"
+ ELSE
+ IF _language_1==it
+	TCODE	tLang1,				"Italian"
+ ELSE
+	TCODE	tLang1,				""						; dummy target for options table
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+ IF _language_2==en
+	TCODE	tLang2,				"English"				; tLang2 is 2nd language, enum context
+ ELSE
+ IF _language_2==de
+	TCODE	tLang2,				"German"
+ ELSE
+ IF _language_2==fr
+	TCODE	tLang2,				"French"
+ ELSE
+ IF _language_2==it
+	TCODE	tLang2,				"Italian"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
--- a/src/text_french.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_french.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,369 +1,463 @@
-;=============================================================================   >> OCTC3 V1.13b > ClaudeDive update proposed. 
+;=============================================================================
 ;
-;    File text_french.asm							REFACTORED VERSION V2.95   
+;	File text_french.asm							REFACTORED VERSION V2.99e
 ;
-;    French texts translation file. 
+;	French texts translation file. 
 ;
-;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;	Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 
 ; Basic texts
-	TCODE	tNo,		"Non"					; No
-	TCODE	tYes,		"Oui"					; Yes = No + 1
-	TCODE	tblank,		" "						; (a single space character)	## NEW (layout)
+	TCODE	tNo,				"Non"					; 0 No
+	TCODE	tYes,				"Oui"					; 1 Yes
+ IFDEF _cave_mode
+	TCODE	tCave,				"Cave"					; 2 Cave
+ ENDIF
+
+	TCODE	tblank,				" "						; (a single space character)
 
 ; Surface-mode texts
-	TCODE   tBeta,      "bêta"					; beta
-	TCODE	tMenu,		"<Menu"					; <Menu
-	TCODE   tView,      "Vues>"					; View>
-    TCODE   tHeading,   "Cap:"					; Heading:
-    TCODE   tLastDive,	"Dern.Plong"			; Last Dive (Max 10 chars)
-    TCODE   tSensorMilliVolt, "Cellules CCR mV"	; CCR Sensors mV
+	TCODE	tMenu,				"<Menu"					; <Menu
+	TCODE	tView,				"Vues>"					; View>
+	TCODE	tHeading,			"Cap:"					; Heading:
+	TCODE	tLastDive,			"Dern.Plong"			; Last Dive (Max 10 chars)
+	TCODE	tSensorMilliVolt,	"Cellules mV"			; Sensors mV
 
 ; Divemode Menu
-    TCODE   tDivemenu_Gaslist,  "Liste Gaz"     ; Gas List
-    TCODE   tDivemenu_ResetAvg, "RaZChrono"     ; Reset Avg.
-    TCODE   tDivemenu_Setpoint, "Setpoint"      ; Setpoint
-    TCODE   tDivemenu_UseSensor,"Cellules"      ; Use Sensor
-    TCODE   tDivemenu_ToggleGF, "Bascul.GF"     ; Toggle GF
-    TCODE   tDivemenu_Marker,   "Repère"        ; Set Marker
-    TCODE   tDivemenu_LostGas,  "Gaz Perdu"     ; Lost Gas
+	TCODE	tDivemenu_Gaslist,	"Liste Gaz"				; Gas List (OC)
+	TCODE	tDivemenu_Diluent,	"Liste Dil"				; Diluents (CCR)
+	TCODE	tDivemenu_Premix,	"Liste Mix"				; Premix   (pSCR)
+	TCODE	tDivemenu_ResetAvg,	"RaZChrono"				; Reset Avg.
+	TCODE	tDivemenu_Avg_Mkr,	"Avg/Marker"			; Reset Avg., Set Marker (and Turn Dive)	## pending translation
+	TCODE	tDivemenu_Setpoint,	"Setpoint"				; Setpoint
+	TCODE	tDivemenu_UseSensor,"Cellules"				; Use Sensor
+	TCODE	tDivemenu_ToggleGF,	"Bascul.GF"				; Toggle GF
+	TCODE	tDivemenu_Marker,	"Repère"				; Set Marker
+	TCODE	tDivemenu_LostGas,	"Gaz Perdu"				; Lost Gas
+ IFDEF _cave_mode
+	TCODE	tDivemenu_TurnDive,	"Turn Dive"				; Turn Dive
+ ENDIF
 
 ; Main menu
-    TCODE   tNext,      "<Suivant"				; <Next
-    TCODE   tEnter,     "Entrer>"				; Enter>
-
-    TCODE   tMainMenu,  "Menu Principal"		; Main Menu
-    TCODE   tLogbook,   "Carnet de Plongée"		; Logbook
-    TCODE   tGasSetup,  "Paramètres Gaz OC"		; OC Gas Setup
-    TCODE   tSetTime,   "Réglage Heure"			; Set Time
-	TCODE	tSetDate,	"Réglage Date"			; Set Date
-	TCODE	tSetTimeDate,"Date & Heure"			; Set Time & Date
-    TCODE   tDispSets,  "Préfér. Réglages"		; Display Settings
-    TCODE   tExit,      "Retour"				; Exit
-    TCODE	tResetMenu, "Menu RaZ"				; Reset Menu
-	TCODE	tDiveModeMenu,"Menu Déco"			; Deco Mode
-	TCODE	tInfoMenu,	"Informations"			; Information
-    TCODE   tCCRSetup,  "Paramètres CCR"		; CCR Setup
-    TCODE   tDiluentSetup,"Liste Diluants"		; Diluent Setup
-    TCODE   tFixedSetpoints,"Setpoints Fixes"	; Fixed Setpoints
-    TCODE   tCCRSensor, "Cellules CCR"			; CCR Sensor
-    TCODE   tCalibrateMenu, "Calibration"		; Calibration
-    TCODE   tCalibrationGas, "Cal. Gaz O2:"		; Cal. Gas O2:
-    TCODE   tCalibrate, "Calibrate"				; Calibrate
-	TCODE	tBack, "retour..."					; back...						## NEW 
+	TCODE	tNext,				"<Suivant"				; <Next
+	TCODE	tEnter,				"Entrer>"				; Enter>
+	TCODE	tMainMenu,			"Menu Principal"		; Main Menu
+	TCODE	tLogbook,			"Carnet de Plongée"		; Logbook
+	TCODE	tGasSetup,			"Paramètres Gaz OC"		; OC Gas Setup
+	TCODE	tSetTime,			"Réglage Heure"			; Set Time
+	TCODE	tSetDate,			"Réglage Date"			; Set Date
+	TCODE	tSetTimeDate,		"Date & Heure"			; Set Time & Date
+	TCODE	tDispSets,			"Préfér. Réglages"		; Display Settings
+	TCODE	tExit,				"Retour"				; Exit
+	TCODE	tResetMenu,			"Menu RaZ"				; Reset Menu
+	TCODE	tDiveModeMenu,		"Menu Déco"				; Deco Mode
+	TCODE	tInfoMenu,			"Informations"			; Information
+	TCODE	tTrSettings,		"Pressure Display"		; Pressure Display					## pending translation
+	TCODE	tTrMode,			"Mode: "				; Mode
+	TCODE	tTr1stPres,			"1.Pres.: "				; 1st Pressure
+	TCODE	tTr2ndPres,			"2.Pres.: "				; 2nd Pressure
+	TCODE	tTrBailPres,		"1.B/O  : "				; Bailout Pressure
+	TCODE	tTrMaxDeltaP,		"max deltaP: "			; independent double max diffenerce	## pending translation
+	TCODE	tCCRSetup,			"Paramètres CCR"		; CCR Setup
+	TCODE	tDiluentSetup,		"Liste Diluant"			; Diluent Setup
+	TCODE	tFixedSetpoints,	"Setpoints Fixes"		; Fixed Setpoints
+	TCODE	tCCRSensor,			"Cellules CCR"			; CCR Sensor
+	TCODE	tCalibrateMenu,		"Calibration"			; Calibration
+	TCODE	tCalibrationGas,	"Cal. Gaz O2:"			; Cal. Gas O2:
+	TCODE	tCalibrate,			"Calibrate"				; Calibrate
+	TCODE	tBack,				"retour"				; back
 
 ; Gas menu
-    TCODE   tGaslist,   "Liste Gaz OC"			; OC Gas List
-    TCODE   tGaslistCC, "Liste Gaz CC"			; CC Diluents
-    TCODE   tGasEdit,   "Préférence Gaz"		; Edit Gas
-    TCODE   tType,      "Type: "
-    TCODE   tGasDisabled,"Désactivé"			; Disabled
-    TCODE   tGasFirst,   "Premier"				; First
-    TCODE   tGasTravel,  "Travel"				; Travel
-    TCODE   tGasDeco,    "Déco"					; Deco
-    TCODE   tDilDisabled,"Désactivé"			; Disabled
-    TCODE   tDilFirst,   "Premier"				; First
-    TCODE   tDilNorm,   "Normal"				; Normal
-    TCODE   tAir,       "Air  "					; Enum: values must follows (5 chars)
-    TCODE   tO2,        "O2   "					; tAir + 5
-    TCODE   tO2Plus,    "O2 +"
-    TCODE   tO2Minus,   "O2 -"
-    TCODE   tHePlus,    "He +"
-    TCODE   tHeMinus,   "He -"
-    TCODE   tMOD,       "MOD:"
-    TCODE   tEAD,       "EAD:"
-    TCODE   tGasDepth,  "Prof. Changement"		; Change Depth
-    TCODE   tDepthPlus, "Prof. +"
-    TCODE   tDepthMinus,"Prof. -"
-    TCODE   tDepthReset,"MOD par défaut:"
-    TCODE   tSetup_mix, "Config. Gaz"			; Setup mix
-    TCODE   tCCRMode,   "Mode CCR:"				; CCR Mode:
-    TCODE   tCCRModeFixedSP,  "SP Fixe"			; Fixed SP
-    TCODE   tCCRModeSensor,   "Cellule"			; Sensor
-    TCODE   tCCRModeAutoSP,   "SP Auto"			; Auto SP
-    TCODE   tSP,            "SP"				; SP (SetPoint)
-    TCODE   tSPPlus,    "PpO2+"					; pO2+
-    TCODE   tSensorFallback, "Fallback:"		; Fallback:
-	TCODE	tCalculated,	"calculé"			; calculated
-    TCODE   tppO2,      "PpO2:"					; ppO2:
-    TCODE   tppO2O2,	"PpO2(O2)"				; ppO2(O2)
-    TCODE   tppO2Dil,	"PpO2(Dil)"				; ppO2(Dil)
-	TCODE   tppO2Mix,	"PpO2(Mix)"				; ppO2(Mix)
-	
+	TCODE	tGaslist,			"Liste Gaz OC"			; OC Gas List
+	TCODE	tGaslistCC,			"Liste Gaz CC"			; CC Diluents
+	TCODE	tGasEdit,			"Préférence Gaz"		; Edit Gas
+	TCODE	tType,				"Type: "
+	TCODE	tGasDisabled,		"Désactivé"				; Disabled
+	TCODE	tGasFirst,			"Premier"				; First
+	TCODE	tGasTravel,			"Travel"				; Travel
+	TCODE	tGasDeco,			"Déco"					; Deco
+	TCODE	tDilDisabled,		"Désactivé"				; Disabled
+	TCODE	tDilFirst,			"Premier"				; First
+	TCODE	tDilNorm,			"Normal"				; Normal
+	TCODE	tAir,				"Air  "					; Enum: values must follows (5 chars)
+	TCODE	tO2,				"O2   "					; tAir + 5
+	TCODE	tO2Plus,			"O2 +"
+	TCODE	tO2Minus,			"O2 -"
+	TCODE	tHePlus,			"He +"
+	TCODE	tHeMinus,			"He -"
+	TCODE	tMOD,				"MOD :"
+	TCODE	tEAD,				"EAD:"
+	TCODE	tSetup_GasDepth,	"Config. Changement"	; Change Depth
+	TCODE	tDepthPlus,			"Prof. +"
+	TCODE	tDepthMinus,		"Prof. -"
+	TCODE	tDepthReset,		"MOD par défaut:"
+	TCODE	tSetup_GasMix,		"Config. Gaz"			; Setup mix
+	TCODE	tCCRMode,			"Mode CCR:"				; CCR Mode:
+	TCODE	tCCRModeFixedSP,	"SP Fixe"				; Fixed SP
+	TCODE	tCCRModeSensor,		"Cellule"				; Sensor
+	TCODE	tCCRModeAutoSP,		"SP Auto"				; Auto SP
+	TCODE	tSP,				"SP"					; SP (SetPoint)
+	TCODE	tSPPlus,			"PpO2+"					; pO2+
+	TCODE	tSensorFallback,	"Fallback:"				; Fallback:
+	TCODE	tCalculated,		"calculé"				; calculated
+	TCODE	tppO2,				"PpO2:"					; ppO2:
+	TCODE	tppO2O2,			"PpO2(O2)"				; ppO2(O2)
+	TCODE	tppO2Dil,			"PpO2(Dil)"				; ppO2(Dil)
+	TCODE	tppO2Mix,			"PpO2(Mix)"				; ppO2(Mix)
+
 ; New batteries menu
-	TCODE   tNewBattTitle,      "Nouvelle Batterie?"
+	TCODE	tNewBattTitle,		"Nouvelle Batterie?"
 	TCODE	tNewBattOld,		"Conserver"
 	TCODE	tNewBattNew36,		"Réinit.3,6V Saft(T1)"  ; New 3,6V
 	TCODE	tNewBattNew15,		"Réinit.1,5V AA  (T0)"  ; New 1,5V
 	TCODE	tNewBattAccu,		"3,6V LiIon AA   (T2)"
-	TCODE	tNew18650,		"Internal 18650  (T3)"
-	TCODE	tNew16650,		"Internal 16650  (T4)"
-	
+	TCODE	tNew18650,			"Internal 18650  (T3)"
+	TCODE	tNew16650,			"Internal 16650  (T4)"
+
 ; Gaslist management
-    TCODE   tGas,       "Gaz"					; Gas
-    TCODE   tGasErr,    "Err"					; Err  (3 chars)
+	TCODE	tGas,				"Gaz"					; Gas
+	TCODE	tDil,				"Dil"					; Diluent
+	TCODE	tGasErr,			"Err"					; Err (3 chars)
 
 ; Communication Menu
-	TCODE	tUsbTitle,		"Mode USB"
-    TCODE   tBleTitle,      "Mode Bluetooth"
-	TCODE	tUsbStarting,  	"Début..."
-	TCODE	tUsbStartDone, 	"Ok."
-	TCODE	tUsbServiceMode,"Mode Maintenance"
-	TCODE	tUsbClosed,		"Port Fermé"
-	TCODE	tUsbExit,		"Terminé"
-	TCODE	tUsbDownloadMode,"Mode Téléchargement"
-    TCODE   tUsbLlBld,      "Chargeur Bas-Niv."
+	TCODE	tUsbTitle,			"Mode USB"
+	TCODE	tBleTitle,			"Mode Bluetooth"
+	TCODE	tUsbStarting,		"Début..."
+	TCODE	tUsbStartDone,		"Ok."
+	TCODE	tUsbServiceMode,	"Mode Maintenance"
+	TCODE	tUsbClosed,			"Port Fermé"
+	TCODE	tUsbExit,			"Terminé"
+	TCODE	tUsbDownloadMode,	"Mode Téléchargement"
+	TCODE	tUsbLlBld,			"Chargeur Bas-Niv."
 
 ; Dive Settings
-    TCODE   tDvMode,    "Mode:"
-    TCODE   tDvOC,      "OC"
-	TCODE	tDvCCR,		"CCR"
-    TCODE   tDvGauge,   "Gauge"
-    TCODE   tDvApnea,   "Apnée"
-    TCODE   tDvPSCR,	"pSCR"
-    TCODE   tDvCC,      "CC"
-    TCODE   tDkMode,    "Modèle:ZH-L16"			;								## MODIFIED (memory)
-    TCODE   tZHL16,     " "						;								## MODIFIED (memory)
-    TCODE   tZHL16GF,   "+GF"					;								## MODIFIED (memory)
-    TCODE   tPPO2Max,   "PpO2 Max :"
-    TCODE   tPPO2DECO,	"PpO2 Déco:"
-    TCODE   tPPO2MIN,   "PpO2 Min :"
-    TCODE   tPPO2MINCC, 	"Min Loop :"			; 								## NEW ppO2 min cc
-    TCODE   tLastDecostop, "Dern.Palier:"
-    TCODE   tDecoparameters, "Paramètres Déco"
-    TCODE   tGF_low,    "GF Bas:"
-    TCODE   tGF_high,   "GF Haut:"
-    TCODE   tSaturationMult,    "Saturation:"
-    TCODE   tDesaturationMult,  "Désaturation:"
-    TCODE   tFTTSMenu,  "fDTR/fB/O:"			; Future TTS
-    TCODE   taGFMenu,   "GF Alternatif"			; Alternative GF
-    TCODE   taGF_low,   "aGF Bas:"				; aGF Low
-    TCODE   taGF_high,  "aGF Haut:"				; aGF High
-    TCODE   taGF_enable,"aGF Possible:"			; aGF Selectable
-    TCODE   tDiveaGF_active,"aGF!"				; aGF!
-    TCODE   tppO2settings,"Menu PpO2"			; ppO2 Settings (max. 18 chars)
-    TCODE   tsafetystopmenu,"Palier Sécurité:"	; Safety Stop: (max. 16 chars)
-	TCODE   tGasUsage,  	"Usage Gaz"			; Gas Usage
-    TCODE   tSetBotUse, 	"Gaz Fond: "		; Bottom Gas: (space)
-    TCODE   tSetDecoUse,	"Gaz Déco: "		; Deco   Gas: (space)			## MODIFIED (layout)
-	TCODE	tCalcAscGas,	 "Calc.Gaz (B/O):"	;								## NEW bailout gas needs
-	TCODE	tTankSizes,		 "Volumes Blocs"	; Tank Sizes					## NEW bailout gas needs
-	TCODE   tLiter,			 " l"				;								## NEW bailout gas needs 
-	TCODE	tBarLiter,		"Litre"
-	TCODE	tTankFillPress,	 "Pressions Blocs"	; Tank Press Budget				## NEW bailout gas needs
-	TCODE	tGas1,			 "Gaz 1:"			;								## NEW bailout gas needs
-	TCODE	tGas2,			 "Gaz 2:"			;								## NEW bailout gas needs
-	TCODE	tGas3,			 "Gaz 3:"			;								## NEW bailout gas needs
-	TCODE	tGas4,			 "Gaz 4:"			;								## NEW bailout gas needs
-	TCODE	tGas5,			 "Gaz 5:"			;								## NEW bailout gas needs
-	TCODE	tCCmaxFracO2,	 "Loop %O2 max.:"	;								## NEW CCR max ppO2 limiter
-	TCODE	t2ndDecoPlanMenu,"Suite Menu Déco"	; 2nd Deco Plan					## NEW deco engine
+	TCODE	tDvMode,			"Mode: "
+	TCODE	tDvOC,				"OC"
+	TCODE	tDvCCR,				"CCR"
+	TCODE	tDvGauge,			"Gauge"
+	TCODE	tDvApnea,			"Apnée"
+	TCODE	tDvPSCR,			"pSCR"
+	TCODE	tDvCC,				"CC"
+	TCODE	tDkMode,			"Modèle: ZH-L16"
+	TCODE	tZHL16,				" "
+	TCODE	tZHL16GF,			"+GF"
+	TCODE	tPPO2Max,			"PpO2 Max :"
+	TCODE	tPPO2DECO,			"PpO2 Déco:"
+	TCODE	tPPO2MIN,			"PpO2 Min :"
+	TCODE	tPPO2MINCC,			"Min Loop :"
+	TCODE	tLastDecostop,		"Dern.Palier : "
+	TCODE	tAscentSpeed,		"Ascent Speed: "		; Ascent Speed							## pending translation
+	TCODE	tGasChangeTime,		"Gas Change  :+"		; additional Gas Change Time			## pending translation
+	TCODE	tDecoparameters,	"Paramètres Déco"
+	TCODE	tGF_low,			"GF  Bas :"
+	TCODE	tGF_high,			"GF  Haut:"
+	TCODE	tSaturationMult,	"Saturation  : "
+	TCODE	tDesaturationMult,	"Désaturation: "
+	TCODE	tFTTSMenu,			"Future DTR:"			; Future TTS
+	TCODE	tLastDecostopSurf,	"Dern.Palier:"			; last deco stop depth Surface Custom View
+	TCODE	tGFMenu,			"Menu GF"				; GF Settings
+	TCODE	taGF_low,			"aGF Bas :"				; aGF Low
+	TCODE	taGF_high,			"aGF Haut:"				; aGF High
+	TCODE	taGF_enable,		"aGF Possible:"			; aGF Selectable
+	TCODE	tDiveaGF_active,	"using aGF"				; using aGF								## pending translation
+	TCODE	tppO2settings,		"Menu PpO2"				; ppO2 Settings (max. 18 chars)
+	TCODE	tsafetystopmenu,	"Palier Sécurité:"		; Safety Stop: (max. 16 chars)
+	TCODE	tGasUsage,			"Usage Gaz"				; Gas Usage
+	TCODE	tSetBotUse,			"Gaz Fond: "			; Bottom Gas: (space)
+	TCODE	tSetDecoUse,		"Gaz Déco: "			; Deco   Gas: (space)
+	TCODE	tCalcAscGas,		"Calc.Gaz (B/O):"
+	TCODE	tSetup_Tank,		"Config. Blocs"			; Setup Tank
+	TCODE	tTankSize,			"Volume   Bloc"			; Tank Sizes
+	TCODE	tTankUsablePress,	"Pression Ascent"		; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars)	## pending translation
+	TCODE	tCopyDilToOC,		"Copy  Dil.-> OC"		; copy diluent settings to OC gas		## pending translation
+	TCODE	tTankPairing,		"Config. Transmitter"	; select Transmitter					## pending translation
+	TCODE	tLiter,				" l"					; Liter as l
+	TCODE	tLiterLong,			"Liter"					; Liter as Liter
+	TCODE	tCCmaxFracO2,		"Loop %O2 max.:"		;
+	TCODE	t2ndDecoPlanMenu,	"Suite Menu Déco"		; 2nd Deco Plan
+
+ IFDEF _rx_functions
+	TCODE	tTrModeOff,			"off"					; off									## pending translation
+	TCODE	tTrModeOn,			"on"					; on									## pending translation
+	TCODE	tTrModeIndDouble,	"indep.Double"			; independent double					## pending translation
+	TCODE	tTrModeCCR,			"CCR Dil+O2"			; CCR diluent and O2
+	TCODE	tTrPresNone,		"none"					; none  (big enum group follows)		## pending translation
+	TCODE	tTrPresGas1,		"Gas 1"					; Gas 1
+	TCODE	tTrPresGas2,		"Gas 2"					; Gas 2
+	TCODE	tTrPresGas3,		"Gas 3"					; Gas 3
+	TCODE	tTrPresGas4,		"Gas 4"					; Gas 4
+	TCODE	tTrPresGas5,		"Gas 5"					; Gas 5
+	TCODE	tTrPresDil1,		"Dil 1"					; Dil 1
+	TCODE	tTrPresDil2,		"Dil 2"					; Dil 2
+	TCODE	tTrPresDil3,		"Dil 3"					; Dil 3
+	TCODE	tTrPresDil4,		"Dil 4"					; Dil 4
+	TCODE	tTrPresDil5,		"Dil 5"					; Dil 5
+	TCODE	tTrPresFirstGas,	"First Gas"				; first  Gas							## pending translation
+	TCODE	tTrPresActiveGas,	"active Gas"			; active Gas							## pending translation
+	TCODE	tTrPresFirstDil,	"First Dil"				; first  Dil							## pending translation
+	TCODE	tTrPresActiveDil,	"active Dil"			; active Dil							## pending translation
+ ELSE
+ 	TCODE	tTrModeOff,			""						; dummy target for entry in option table
+	TCODE	tTrPresNone,		""						; dummy target for entry in option table
+ ENDIF
 
 ; Display Settings
-    TCODE   tBright,    "Luminosité:"
-    TCODE   tEco,       "Eco"
-    TCODE   tMedium,    "Moyenne"
-    TCODE   tHigh,      "Haute"
-    TCODE   tDvSalinity,"Salinité:"				; Salinity
-    TCODE   tShowppO2,  "Afficher PpO2:"		; Always show ppO2:
-    TCODE   tFlip,      "Pivoter l'écran:"		; Rotate Screen
-    TCODE   tMODwarning,"Alerte MOD:"			; MOD warning
-	TCODE	tIBCDwarning,"Alerte CDI:"			; IBCD Warning					## NEW IBCD
-    TCODE   tTimeoutDive,"Fin Plongée:"			; Dive Timeout
+	TCODE	tBright,			"Luminosité:"
+	TCODE	tEco,				"Eco"
+	TCODE	tMedium,			"Moyenne"
+	TCODE	tHigh,				"Haute"
+	TCODE	tDvSalinity,		"Salinité:  "			; Salinity
+	TCODE	tShowppO2,			"Afficher PpO2:"		; Always show ppO2:
+	TCODE	tFlip,				"Pivoter l'écran:"		; Rotate Screen
+	TCODE	tMODwarning,		"Alerte MOD:"			; MOD warning
+	TCODE	tIBCDwarning,		"Alerte CDI:"			; IBCD Warning
+	TCODE	t2ndDepth,			"2.Prof.:"				; 2nd depth display content (10 chars max)
+	TCODE	tTimeoutDive,		"Fin Plongée:"			; Dive Timeout
 
 ; VSI display Settings
-    TCODE   tVSItext2,  "Vitesse Variable:"		; Variable speed:
-    TCODE   tVSIgraph,  "Graph. Vitesse:"		; Speed graph:
+	TCODE	tVSItext2,			"Vitesse Variable:"		; Variable speed:
+	TCODE	tVSIgraph,			"Graph.  Vitesse :"		; Speed graph:
 
 ; Setup Menu
-    TCODE   tSystSets,  "Réglages"
-    TCODE   tLanguage,  "Langue:"
-    TCODE   tEnglish,   "Anglais"
-    TCODE   tGerman,    "Allemand"
-    TCODE   tFrench,    "Français"
-    TCODE   tItalian,   "Italien"
-    TCODE   tCompassMenu,"Calibration Compas"	; Compass Calibration
-    TCODE   tCompassGain,"Sensibilité:"			; Compass Gain:
-    TCODE   tCalX,	 "Cal X:"					; Cal X
-    TCODE   tCalY,	 "Cal Y:"					; Cal Y
-    TCODE   tCalZ,	 "Cal Z:"					; Cal Z
-
-    TCODE   tUnits,     "Unités:"
-    TCODE   tMetric,     " m/°C"				; Enum menu
-    TCODE   tImperial,   "ft/°F"
-
-    TCODE   tDefName,   "HW OSTC"
-
-    TCODE   tButtonleft,"Bouton gauche:"		; Left button
-    TCODE   tButtonright,"Bouton droit:"		; Right button
+	TCODE	tSystSets,			"Réglages"
+	TCODE	tCompassMenu,		"Calibration Compas"	; Compass Calibration
+	TCODE	tCompassGain,		"Sensibilité:"			; Compass Gain:
+	TCODE	tCalX,				"Cal X:"				; Cal X
+	TCODE	tCalY,				"Cal Y:"				; Cal Y
+	TCODE	tCalZ,				"Cal Z:"				; Cal Z
+	TCODE	tUnits,				"Unités:"
+	TCODE	tMetric,			" m/°C"					; Enum menu
+	TCODE	tImperial,			"ft/°F"
+	TCODE	tDefName,			"HW OSTC"
+	TCODE	tButtonleft,		"Bouton gauche:"		; Left button
+	TCODE	tButtonright,		"Bouton droit :"		; Right button
+	TCODE	tAltMode,			"Temps Attente:"		; Waiting Time
+	TCODE	tAltModeFly,		"Avion"					; Flying
+	TCODE	tAltMode1000,		"1000m"
+	TCODE	tAltMode2000,		"2000m"
+	TCODE	tAltMode3000,		"3000m"
 
-	TCODE	tAltMode,	"Temps Attente"			;								## NEW no fly altitude
-	TCODE	tAltModeFly,	"Avion "			;								## NEW no fly altitude
-	TCODE	tAltMode1000,	"1000 m"			;								## NEW no fly altitude
-	TCODE	tAltMode2000,	"2000 m"			;								## NEW no fly altitude
-	TCODE	tAltMode3000,	"3000 m"			;								## NEW no fly altitude
-	
 ; Units for all menu
-    TCODE   tMeters,    "m"
-	TCODE	tFeets,		"ft"
-	TCODE	tFeets1,	"f"
-    TCODE   tMinutes,   "'"
-    TCODE   tPercent,   "%"
-    TCODE   tLitersMinute, "l/min"
-	TCODE	tbar,		"bar"					; bar
-	TCODE	tbar10,		"0 bar"					; bar							## NEW 2.95
-	TCODE	tMeterMinute,  "m/min"				; meter per minute				## ascent speed
-	TCODE	tmin,		"min"					; minutes
-	
+	TCODE	tMeters,			"m"
+	TCODE	tFeets,				"ft"
+	TCODE	tFeets1,			"f"
+	TCODE	tMinutes,			"'"
+	TCODE	tPercent,			"%"
+	TCODE	tLitersMinute,		"l/min"
+	TCODE	tbar,				"bar"					; bar
+	TCODE	tbar10,				"0 bar"					; xx0 bar
+	TCODE	tMeterMinute,		"m/'"					; meter per minute
+
 ; Date
-	TCODE	tDateFormat, "Date:"
-	TCODE	tDateformat, "MMJJAA"
-	TCODE	tDateformat1,"JJMMAA"
-	TCODE	tDateformat2,"AAMMJJ"
+	TCODE	tDateFormat,		"Date: "
+	TCODE	tDateformat,		"MMJJAA"
+	TCODE	tDateformat1,		"JJMMAA"
+	TCODE	tDateformat2,		"AAMMJJ"
 
 ; Simulator menu
-    TCODE   tInter, 	"Lancer Simulation"		; Start Simulator
-    TCODE   tPlan,  	"Simulateur"			; Simulator
+	TCODE	tInter,				"Lancer Simulation"		; Start Simulator
+	TCODE	tPlan,				"Simulateur"			; Simulator
 
 ; Decoplanner submenu
-    TCODE   tBtTm,  	"Temps Fond:"			; Bot. Time: (10 chars)
-    TCODE   tBtTm_short,"Temps:"				; Bot. Time: (max. 6 chars)
-    TCODE   tBtDep, 	"Prof. Max:"			; Max Depth: (10 chars)
-    TCODE   tIntvl, 	"Intervalle:"			; Interval :  (10 chars)
-	TCODE	tDecoSetup,	"Réglage Ordinateur"		;								## NEW (layout)
-    TCODE   tDeco,  	"Calcul Déco"			; Calculate Deco
-    TCODE   tDivePlan,  "Runtime:"				; Dive Plan:
-    TCODE   tNoDeco,    "Pas de Déco"			; No Deco
-    TCODE   tMore,      "Suite..."				; More...
-	TCODE	tSelectSetpoint,"Setpoint CCR: "	;								## NEW deco calculator enhancement
-	TCODE	tuseAGF,	"aGF Permis:"			;								## NEW deco calculator enhancement
-	TCODE	tCalculating,	"Calcul en cours"	; Calculating...				## NEW deco calculator enhancement
+	TCODE	tBtTm,				"Temps Fond:"			; Bot. Time: (10 chars)
+	TCODE	tBtTm_short,		"Temps:"				; Bot. Time: (max. 6 chars)
+	TCODE	tBtDep,				"Prof. Max :"			; Max Depth: (10 chars)
+	TCODE	tIntvl,				"Intervalle:"			; Interval : (10 chars)
+	TCODE	tDecoSetup,			"Réglage Ordinateur"	; Calculator Setup
+	TCODE	tDeco,				"Calcul Déco"			; Calculate Deco
+	TCODE	tDivePlan,			"Runtime:"				; Dive Plan:
+	TCODE	tNoDeco,			"Pas de Déco"			; No Deco
+	TCODE	tMore,				"Suite"					; More
+	TCODE	tSelectSetpoint,	"Setpoint  :"
+	TCODE	tuseAGF,			"aGF Permis:"			; use aGF
+	TCODE	tCalculating,		"Calcul en cours"		; Calculating
+	TCODE	tNDLleft,			"left"					; time left within NDL					## pending translation
 
 ; Information menu
-    TCODE   tFirmware,  "Logiciel:"			; Firmware: (space)
-    TCODE   tSerial,    "N° Série:"			; Serial  : (space)
-	TCODE	tTotalDives,"Nbre Plongées:"		; Total Dives: (space)
-    TCODE   tBatteryV,  "Batterie:"			; Battery:
-    TCODE   tUptime,	"Mise a Jour:"				; Uptime: 
+	TCODE	tFirmware,			"Logiciel: "			; Firmware: (space)
+	TCODE	tFirmware_rx,		"RX Ver  : "			; RX Ver  : (space)
+	TCODE	tSerial,			"N. Série: "			; Serial  : (space)
+	TCODE	tTotalDives,		"Nbre Plongées:"		; Total Dives: (space)
+	TCODE	tBatteryV,			"Batterie: "			; Battery:
+	TCODE	tUptime,			"Mise a Jour:"			; Uptime:
 
 ; Divemode screen
-    TCODE   tNDL,       "NDL"
-    TCODE   tTTS,       "DTR"
-	TCODE	tVelMetric,	 "m/min"
-	TCODE	tVelImperial,"ft/m "
-	TCODE	tGasSelect,  "Activer Gaz"			; Select Gas
-	TCODE	tSelectAir,	 "Air "					; Air
-	TCODE	tSelectO2,	 "O2  "					; O2
-    TCODE   tSelectNx,   "Nx"					; Nx
-    TCODE   tSelectTx,   "Tx"					; Tx
-    TCODE   tDepth,      "Prof."				; Depth
-    TCODE   tMaxDepth,   "Prof. Max."			; Max. Depth - max 10chars!
-    TCODE   tDivetime,   "Durée"				; Divetime
-    TCODE   tDiveHudMask1,   "cell. 1"
-    TCODE   tDiveHudMask2,   "cell. 2"
-    TCODE   tDiveHudMask3,   "cell. 3"
-    TCODE   tDiveTotalAvg,  "Prof. Moy."
-    TCODE   tDiveStopwatch, "Chrono"
-    TCODE   tDiveStopAvg,   "P.Moy.Chron"		; 11chars max
-    TCODE   tApnoeTotal,    "Totale"			; Total (Six chars, right alligned)
-    TCODE   tApnoeMax,      "Dern.Plongée"		; Last Descend
-    TCODE   tApnoeSurface,  "Tps Surface"		; Surface Time
-    TCODE   tDiveDecoplan,  "Runtime"			; Decoplan
-    TCODE   tDiveClock,     "Heure"				; Clock
-    TCODE   tDiveEAD_END,   "EAD/END"			; EAD/END
-    TCODE   tDiveTissues,   "Tissus"			; Tissues
-    TCODE   tEND,           "END:"				; END:
-    TCODE   tHe,            "He"				; He
-    TCODE   tN2,            "N2"				; N2
-    TCODE   tDiveBailout,   "Bailout"			; Bailout
-    TCODE   tGFactors,      "Valeurs GF"		; GF Values
-    TCODE   taGFactors,     "Valeurs aGF"		; aGF Values
-    TCODE   tGFInfo,        "   GF Info"		; GF Info
-    TCODE   tCeiling,       "Plafond"			; Ceiling
-    TCODE   tDiveSafetyStop,"Stop"				; Stop (Four chars, right alligned)
-    TCODE   tDiveFallback,  "Fallback!"			; Fallback! (max. nine chars)
-	TCODE	tDecoInfo,		"Zone Déco"			; Deco info
-    TCODE   tSensorCheck,   "Ctrl Cell. "		; Sensor Check
-    TCODE   tdil,	    	"Dil:"				; Diluent ppO2 Warning
-	TCODE	tmix,			"Mix:"				; Pre-Mix ppO2 Warning
-	TCODE	tSensorDisagree,"Sensors<>"			; Sensors disagree Warning		## NEW voting logic
-	TCODE	tGasNeedsWarn,	"Gas Needs"			;								## NEW bailout gas needs
-	TCODE	tGasNeedsBar,	"Besoins Gaz (bar)"	;								## NEW bailout gas needs
-	TCODE	tCNSsurf,		"SNC Surf."			; CNS Surf.						## NEW CNS at end-of-dive
-	TCODE	tCNSfTTS,		"SNC fDTR"			; CNS fTTS						## NEW CNS at end-of-dive
-	TCODE	tCNSBO,			"SNC B/O"			; CNS B/O						## NEW CNS at end-of-dive
-	TCODE	tCNSnow,		"SNC actuel"		; CNS now						## NEW CNS at end-of-dive
-	TCODE	tCNSeod,		"SNC final"			; CNS fin						## NEW CNS at end-of-dive
-	TCODE	tIBCD,			"CDI N2He"			; IBCD N2He						## NEW IBCD
-	TCODE	tMicroBubbles,	"M.Bulles "			;								## NEW microbubbles
-	TCODE	tCNS,			"SNC: "				;								## V2.95 optics
-	
+	TCODE	tNDL,				"NDL"					; 3 chars max
+	TCODE	tTTS,				"DTR"
+	TCODE	tVelMetric,			"m/min"
+	TCODE	tVelImperial,		"ft/m "
+	TCODE	tGasSelect,			"Activer Gaz"			; Select Gas
+	TCODE	tSelectAir,			"Air "					; Air
+	TCODE	tSelectO2,			"O2  "					; O2
+	TCODE	tSelectNx,			"Nx"					; Nx
+	TCODE	tSelectTx,			"Tx"					; Tx
+	TCODE	tDepth,				"Prof."					; Depth
+	TCODE	tMaxDepth,			"Prof. Max."			; Max. Depth    - max 10chars!
+	TCODE	tAvgDepth,			"Prof. Moy."			; average Depth - max 10chars!
+	TCODE	tDivetime,			"Durée"					; Divetime
+	TCODE	tDiveHudMask1,		"cell. 1"
+	TCODE	tDiveHudMask2,		"cell. 2"
+	TCODE	tDiveHudMask3,		"cell. 3"
+	TCODE	tDiveTotalAvg,		"Prof. Moy."
+	TCODE	tDiveStopwatch,		"Chrono"
+	TCODE	tDiveStopAvg,		"P.Moy.Chron"			; 11 chars max
+	TCODE	tApnoeTotal,		"Totale"				; Total (six chars, right aligned)
+	TCODE	tApnoeMax,			"Dern.Plongée"			; Last Descend
+	TCODE	tApnoeSurface,		"Tps.Surface"			; Surface Time
+	TCODE	tTime,				"Time"					; Time							## pending translation
+	TCODE	tSurface,			"Surface"				; Surface (max 12 chars)		## pending translation
+	TCODE	tDiveDecoplan,		"Runtime"				; Decoplan
+;	TCODE	tDiveClock,			"Heure"					; Clock
+	TCODE	tDiveEAD_END,		"EAD/END"				; EAD/END
+	TCODE	tDiveTissues,		"Tissus"				; Tissues
+	TCODE	tEND,				"END:"					; END:
+	TCODE	tHe,				"He"					; He
+	TCODE	tN2,				"N2"					; N2
+	TCODE	tDiveBailout,		"Bailout"				; Bailout
+	TCODE	tGFactors,			"Valeurs GF"			; GF Values
+	TCODE	taGFactors,			"Valeurs aGF"			; aGF Values
+	TCODE	tGFInfo,			"   GF Info"			; GF Info
+	TCODE	tCeiling,			"Plafond"				; Ceiling
+	TCODE	tDiveSafetyStop,	"Stop"					; Stop (four chars, right aligned)
+	TCODE	tDiveFallback,		"Fallback!"				; Fallback! (max. nine chars)
+	TCODE	tDecoInfo,			"Zone Déco"				; Deco info
+	TCODE	tSensorCheck,		"Ctrl Cell. "			; Sensor Check
+	TCODE	tdil,				"Dil:"					; Diluent ppO2 Warning
+	TCODE	tmix,				"Mix:"					; Pre-Mix ppO2 Warning
+	TCODE	tSensorDisagree,	"Sensors<>"				; Sensors disagree Warning
+	TCODE	tGasNeedsWarn,		"Gas Needs"				;
+	TCODE	tGasNeedsAscent,	"Besoins Gaz Ascent"	;								## pending translation
+	TCODE	tCNSsurf,			"SNC Surf."				; CNS Surf.
+	TCODE	tCNSfTTS,			"SNC fDTR"				; CNS fTTS
+	TCODE	tCNSBO,				"SNC B/O"				; CNS B/O
+	TCODE	tCNSnow,			"SNC actuel"			; CNS now
+	TCODE	tCNSeod,			"SNC final"				; CNS fin
+	TCODE	tIBCD,				"CDI N2He"				; IBCD N2He
+	TCODE	tnoBOgas,			"-B/O-Gaz-"				;
+	TCODE	tMicroBubbles,		"M.Bulles "				;
+	TCODE	tCNS,				"SNC: "					;
+	TCODE	tgaschange,			"Change?"				; better gas found				## pending translation
+	TCODE	tNeed,				"Need "					; gas need (5 chars)			## pending translation
+	TCODE	tBattery,			"Batterie"				; Battery
+ IFDEF _rx_functions
+	TCODE	tTransmitter,		"P.Transm."				; pressure transmitter			## pending translation
+	TCODE	tPressure,			"Pres Bloc"				; tank pressure
+	TCODE	tSAC,				"SAC"					; SAC, must be 3 chars!
+	TCODE	tswap,				"Swap Tank"				; swap tank (max. 9 chars)		## pending translation
+ ENDIF
+ IFDEF _cave_mode
+	TCODE	tGasNeedsCaveMode,	"Besoins Gaz Cave Mode"	; title for gas needs custom view
+	TCODE	tDiveTurned,		"Dv.turned"				; dive is turned      (max. 9 char)	## pending translation
+	TCODE	tCaveMode,			"Cave Mode"				; cave mode activated (max. 9 char)
+	TCODE	tCaveModeShutdown,	"X-Cave-X"				; cave mode shut down (max. 9 char)
+ ENDIF
+
 ; Divemode menu
-	TCODE   tDivePreMenu,   "Menu ?"			; Menu?
-    TCODE   tSetHeading,    "Cap"				; Bearing (Max. seven chars)
+	TCODE	tDivePreMenu,		"Menu?"					; Menu?
+	TCODE	tSetHeading,		"Cap"					; Bearing (max. 6 chars)
 
 ; Simulator menu
-	TCODE	tQuitSim,	 "Fin ?"				; Quit Simulation?
+	TCODE	tQuitSim,			"Fin"					; Quit Simulation
 
 ; Logbook
-	TCODE	tCNS2,		"SNC:"
-	TCODE	tAVG,		"Moy:"
-	TCODE	tGF,		"GF:"
-	TCODE	tSAT,		"Sat:"					; Sat:
+	TCODE	tCNS2,				"SNC:"
+	TCODE	tAVG,				"Moy:"
+	TCODE	tGF,				"GF:"
+	TCODE	tSAT,				"Sat:"
 
 ; Logbook units
-	TCODE	tLogTunitC,	"°C"	
-	TCODE	tLogTunitF,	"°F"
-	TCODE	tKGL,		"kg/l"
-	TCODE	tMBAR,		"mbar"
+	TCODE	tLogTunitC,			"°C"
+	TCODE	tLogTunitF,			"°F"
+	TCODE	tKGL,				"kg/l"
+	TCODE	tMBAR,				"hPa"
 
 ; Logbook menu
-	TCODE	tNextLog, 	"Page Suivante"
-	
+	TCODE	tNextLog,			"Page Suivante"
+
 ; Reset menu
-	TCODE	tReboot,	"Redémarrage"			;Reboot
-	TCODE	tResetMenu2,"Confirmer ?"			;Are You Sure?
-	TCODE	tAbort,     "Quitter"				;Abort
-	TCODE	tResetSettings, "RaZ Complète"		;Reset All
-	TCODE	tResetDeco,	"RaZ Déco"				;Reset Deco
-    TCODE	tResetBattery,	"RaZ Batterie"		;Reset Battery
-    TCODE	tResetLogbook,	"RaZ Carnet"		;Reset Logbook
+	TCODE	tReboot,			"Redémarrage"			; Reboot
+	TCODE	tResetMenu2,		"Confirmer?"			; Are You Sure?
+	TCODE	tAbort,				"Quitter"				; Abort
+	TCODE	tResetSettings,		"RaZ Settings"			; Reset Settings				## pending translation
+	TCODE	tResetDeco,			"RaZ Déco"				; Reset Deco
+	TCODE	tResetBattery,		"RaZ Batterie"			; Reset Battery
+	TCODE	tResetLogbook,		"RaZ Carnet"			; Reset Logbook
 
 ; Set Time Menu/Set Date Menu
-	TCODE	tSetHours,	"Ajust. Heures"			; Set Hours
-	TCODE	tSetMinutes,"Ajust. Minutes"		; Set Minutes
-	TCODE	tSetSeconds,"RaZ Secondes"			; Clear Seconds
-	TCODE	tSetDay,	"Ajust. Jours"			; Set Day
-	TCODE	tSetMonth,	"Ajust. Mois"			; Set Month
-	TCODE	tSetYear,	"Ajust. Année"			; Set Year
+	TCODE	tSetHours,			"Ajust. Heures"			; Set Hours
+	TCODE	tSetMinutes,		"Ajust. Minutes"		; Set Minutes
+	TCODE	tSetSeconds,		"RaZ Secondes"			; Clear Seconds
+	TCODE	tSetDay,			"Ajust. Jours"			; Set Day
+	TCODE	tSetMonth,			"Ajust. Mois"			; Set Month
+	TCODE	tSetYear,			"Ajust. Année"			; Set Year
 
 ; Logbook Offset Menu
-	TCODE	tLogOffset,		"N° 1ère plongée"	; Logbook offset (Max. 15 Chars!)
-	TCODE	tLogOffsetp1,	"+1"				; +1
-	TCODE	tLogOffsetp10,	"+10"				; +10
-	TCODE	tLogOffsetm1,	"-1"				; -1
-	TCODE	tLogOffsetm10,	"-10"				; -10
+	TCODE	tLogOffset,			"N° 1ère plongée"		; Logbook offset (Max. 15 Chars!)
+	TCODE	tLogOffsetp1,		"+1"					; +1
+	TCODE	tLogOffsetp10,		"+10"					; +10
+	TCODE	tLogOffsetm1,		"-1"					; -1
+	TCODE	tLogOffsetm10,		"-10"					; -10
 
 ; Compass directions
-    TCODE   tN,             "N "                ; N(orth),338°-22°
-    TCODE   tNE,            "NE"                ; North-East,23°-67°
-    TCODE   tE,             "E "                ; E(east),68°-112°
-    TCODE   tSE,            "SE"                ; South-East,113°-157°
-    TCODE   tS,             "S "                ; S(outh),157°-202°
-    TCODE   tSW,            "SO"                ; South-West,203°-247°
-    TCODE   tW,             "O "                ; W(West),248°-292°
-    TCODE   tNW,            "NO"                ; North-West,293°-337°
+	TCODE	tN,					"N "					; N(orth),    338°-22°
+	TCODE	tNE,				"NE"					; North-East,  23°-67°
+	TCODE	tE,					"E "					; E(east),     68°-112°
+	TCODE	tSE,				"SE"					; South-East, 113°-157°
+	TCODE	tS,					"S "					; S(outh),    157°-202°
+	TCODE	tSW,				"SO"					; South-West, 203°-247°
+	TCODE	tW,					"O "					; W(West),    248°-292°
+	TCODE	tNW,				"NO"					; North-West, 293°-337°
 
 ; Color Scheme menu
-    TCODE   tColorScheme,   "Jeu de Couleurs"   ; Colour scheme
-    TCODE   tColorSetDive,  "Mode Plongée:"     ; Divemode:
-    TCODE   tColorSetName0, "Blanc"             ; White
-    TCODE   tColorSetName1, "Rouge"             ; Red
-    TCODE   tColorSetName2, "Vert"              ; Green
-    TCODE   tColorSetName3, "Bleu"              ; Blue
+	TCODE	tColorScheme,		"Jeu de Couleurs"		; Colour scheme
+	TCODE	tColorSetDive,		"Mode Plongée:"			; Divemode:
+	TCODE	tColorSetName0,		"Blanc"					; White
+	TCODE	tColorSetName1,		"Rouge"					; Red
+	TCODE	tColorSetName2,		"Vert"					; Green
+	TCODE	tColorSetName3,		"Bleu"					; Blue
 
 ; PSCR Menu and Settings
-    TCODE   tPSCRMenu,	    "Menu PSCR"			; PSCR Menu
-    TCODE   tPSCR_O2_drop,  "O2 drop:"			; O2 drop
-    TCODE   tPSCR_lungratio,"Lung ratio:"		; lung ratio
+	TCODE	tPSCRMenu,			"Menu pSCR"				; PSCR Menu
+	TCODE	tPSCR_O2_drop,		"O2 Drop    "			; O2 drop
+	TCODE	tPSCR_lungratio,	"Lung Ratio "			; lung ratio
+	TCODE	tBackToLoop,		"goto loop"				; back to loop (10 chars max)	### new
+
+
+; Language selection
+ IF _language_2!=none
+	TCODE	tLanguage,			"Langue: "				; used in menu_tree
+ ENDIF
+
+ IF _language_1==en
+	TCODE	tLang1,				"Anglais"				; tLang1 is 1st language, enum context
+ ELSE
+ IF _language_1==de
+	TCODE	tLang1,				"Allemand"
+ ELSE
+ IF _language_1==fr
+	TCODE	tLang1,				"Français"
+ ELSE
+ IF _language_1==it
+	TCODE	tLang1,				"Italien"
+ ELSE
+	TCODE	tLang1,				""						; dummy target for options table
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+ IF _language_2==en
+	TCODE	tLang2,				"Anglais"
+ ELSE
+ IF _language_2==de
+	TCODE	tLang2,				"Allemand"				; tLang2 is 2nd language, enum context
+ ELSE
+ IF _language_2==fr
+	TCODE	tLang2,				"Français"
+ ELSE
+ IF _language_2==it
+	TCODE	tLang2,				"Italien"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
--- a/src/text_german.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_german.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,334 +1,388 @@
 ;=============================================================================
 ;
-;    File text_german.asm							REFACTORED VERSIOn V2.95
+;	File text_german.asm							REFACTORED VERSIOn V2.99e
 ;
-;    German texts translation file.
+;	German texts translation file.
 ;
-;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;	Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 
 ; Basic texts
-	TCODE	tNo,    			"Nein"              	; No
-	TCODE	tYes,   			"Ja"                	; Yes = No + 1
+	TCODE	tNo,				"Nein"					; 0 No
+	TCODE	tYes,				"Ja"					; 1 Yes
+ IFDEF _cave_mode
+	TCODE	tCave,				"Höhle"					; 2 Höhle
+ ENDIF
+
 	TCODE	tblank,				" "						; (a single space character)
-	
+
 ; Surface-mode texts
-    TCODE   tBeta,      		"beta"          		; beta
-	TCODE	tMenu,				"<Menü"     			; <Menu
-    TCODE   tView,      		"View>"         		; View>
-    TCODE   tHeading,   		"Kurs:"         		; Heading:
-    TCODE   tLastDive,			"Letzter TG"			; Last Dive (Max 10 chars)
-    TCODE   tSensorMilliVolt, 	"CCR Sensoren mV"		; CCR Sensors mV
+	TCODE	tMenu,				"<Menü"					; <Menu
+	TCODE	tView,				"View>"					; View>
+	TCODE	tHeading,			"Kurs:"					; Heading:
+	TCODE	tLastDive,			"Letzter TG"			; Last Dive (Max 10 chars)
+	TCODE	tSensorMilliVolt,	"Sensoren mV"			; Sensors mV
 
-; Divemode Menu
-    TCODE   tDivemenu_Gaslist,  "Gasliste"    			; Gaslist
-    TCODE   tDivemenu_ResetAvg, "Stoppuhr"    			; Reset Avg.
-    TCODE   tDivemenu_Setpoint, "Setpoint"      		; Setpoint
-    TCODE   tDivemenu_UseSensor,"akt. Sensor"    		; Use Sensor
-    TCODE   tDivemenu_ToggleGF, "Toggle GF"     		; Toggle GF
-    TCODE   tDivemenu_Marker,   "Markierung"    		; Set Marker
-    TCODE   tDivemenu_LostGas,  "Gasverlust"    		; Lost Gas
+; Divemode Menu - 10 chars max!
+	TCODE	tDivemenu_Gaslist,	"Gasliste"				; Gaslist (OC)
+	TCODE	tDivemenu_Diluent,	"Diluents"				; Diluent (CCR)
+	TCODE	tDivemenu_Premix,	"Premix"				; Premix  (pSCR)
+	TCODE	tDivemenu_ResetAvg,	"Stoppuhr"				; Reset Avg.
+	TCODE	tDivemenu_Avg_Mkr,	"Uhr/Marker"			; Reset Avg., Set Marker (and Turn Dive)
+	TCODE	tDivemenu_Setpoint,	"Setpoint"				; Setpoint
+	TCODE	tDivemenu_UseSensor,"akt.Sensor"			; Use Sensor
+	TCODE	tDivemenu_ToggleGF,	"Toggle GF"				; Toggle GF
+	TCODE	tDivemenu_Marker,	"Markierung"			; Set Marker
+	TCODE	tDivemenu_LostGas,	"Gasverlust"			; Lost Gas
+ IFDEF _cave_mode
+	TCODE	tDivemenu_TurnDive,	"Rückweg"				; Turn Dive
+ ENDIF
 
 ; Main menu
-    TCODE   tNext,      		"<Weiter"     			; <Next
-    TCODE   tEnter,     		"Enter>"        		; Enter>
-
-    TCODE   tMainMenu,  		"Hauptmenü"     		; MainMenu
-    TCODE   tLogbook,   		"Logbuch"       		; Logbook
-    TCODE   tGasSetup,  		"OC Gas Setup"  		; OC Gas Setup
-    TCODE   tSetTime,   		"Zeit  stellen"			; Set Time
+	TCODE	tNext,				"<Weiter"				; <Next
+	TCODE	tEnter,				"Enter>"				; Enter>
+	TCODE	tMainMenu,			"Hauptmenü"				; MainMenu
+	TCODE	tLogbook,			"Logbuch"				; Logbook
+	TCODE	tGasSetup,			"OC Gas Setup"			; OC Gas Setup
+	TCODE	tSetTime,			"Zeit  stellen"			; Set Time
 	TCODE	tSetDate,			"Datum stellen"			; Set Date
 	TCODE	tSetTimeDate,		"Datum & Uhrzeit"		; Set Time & Date
-    TCODE   tDispSets,  		"Anzeige" 				; Display Settings
-    TCODE   tExit,      		"Ende"          		; Exit
-	TCODE	tResetMenu, 		"Reset Menü"			; Reset Menu
+	TCODE	tDispSets,			"Anzeige"				; Display Settings
+	TCODE	tExit,				"Ende"					; Exit
+	TCODE	tResetMenu,			"Reset Menü"			; Reset Menu
 	TCODE	tDiveModeMenu,		"Deko Einstellung"		; Deco Mode
 	TCODE	tInfoMenu,			"Informationen"			; Information
-    TCODE   tCCRSetup,  		"CCR/pSCR Menü"     	; CCR Setup
-    TCODE   tDiluentSetup,		"Diluent Menü"   		; Diluent Setup
-    TCODE   tFixedSetpoints,	"CCR Setpoints" 		; Fixed Setpoints
-    TCODE   tCCRSensor, 		"Sensor"    			; CCR/pSCR Sensor
-    TCODE   tCalibrateMenu, 	"Kalibrierung"   		; Calibration
-    TCODE   tCalibrationGas, 	"Kal. Gas O2:"  		; Cal. Gas O2:
-    TCODE   tCalibrate, 		"Kalibrieren"     		; Calibrate
-	TCODE	tBack,			 	"zurück..."
+	TCODE	tTrSettings,		"Druckanzeige"			; Pressure Display
+	TCODE	tTrMode,			"Modus: "				; Mode
+	TCODE	tTr1stPres,			"1.Druck: "				; 1st Pressure
+	TCODE	tTr2ndPres,			"2.Druck: "				; 2nd Pressure
+	TCODE	tTrBailPres,		"1.B/O  : "				; Bailout Pressure
+	TCODE	tTrMaxDeltaP,		"max Diff.: "			; independent double max diffenerce
+	TCODE	tCCRSetup,			"CCR/pSCR Menü"			; CCR/pSCR Setup
+	TCODE	tDiluentSetup,		"Diluent Menü"			; Diluent Setup
+	TCODE	tFixedSetpoints,	"CCR Setpoints"			; Fixed Setpoints
+	TCODE	tCCRSensor,			"Sensor"				; CCR/pSCR Sensor
+	TCODE	tCalibrateMenu,		"Kalibrierung"			; Calibration
+	TCODE	tCalibrationGas,	"Kal. Gas O2:"			; Cal. Gas O2:
+	TCODE	tCalibrate,			"Kalibrieren"			; Calibrate
+	TCODE	tBack,				"zurück"
 
 ; Gas menu
-    TCODE   tGaslist,   		"OC Gas Liste"
-    TCODE   tGaslistCC, 		"CC Gas Liste"  		; CC Diluents
-    TCODE   tGasEdit,   		"Gas einstellen"
-    TCODE   tType,      		"Typ: "
-    TCODE   tGasDisabled,		"Deaktiviert"  			; Disabled
-    TCODE   tGasFirst,   		"Start"        			; First
-    TCODE   tGasTravel,  		"Reise"        			; Travel
-    TCODE   tGasDeco,    		"Deko"         			; Deco
-    TCODE   tDilDisabled,		"Deaktiviert"  			; Disabled
-    TCODE   tDilFirst,   		"Start"        			; First
-    TCODE   tDilNorm,   		"Normal"        		; Normal
-    TCODE   tAir,       		"Luft "         		; Enum: values must follows (5 chars)
-    TCODE   tO2,        		"O2   "         		; tAir + 5
-    TCODE   tO2Plus,    		"O2 +"
-    TCODE   tO2Minus,   		"O2 -"
-    TCODE   tHePlus,    		"He +"
-    TCODE   tHeMinus,   		"He -"
-    TCODE   tMOD,       		"MOD:"
-    TCODE   tEAD,       		"EAD:"
-    TCODE   tGasDepth,  		"Wechseltiefe"
-    TCODE   tDepthPlus, 		"Tiefe +"
-    TCODE   tDepthMinus,		"Tiefe -"
-    TCODE   tDepthReset,		"Reset auf MOD:"
-    TCODE   tSetup_mix, 		"Mix Einstellen"
-    TCODE   tCCRMode,   		"Modus:"             	; Mode:
-    TCODE   tCCRModeFixedSP,  	"Feste SP"   		; Fixed SP
-    TCODE   tCCRModeSensor,   	"Sensor"          		; Sensor
-    TCODE   tCCRModeAutoSP,   	"Auto SP"         		; Auto SP
-    TCODE   tSP,            	"SP"                	; SP (SetPoint)
-    TCODE   tSPPlus,    		"ppO2+"                 ; pO2+
-    TCODE   tSensorFallback, 	"Fallback:"        		; Fallback:
+	TCODE	tGaslist,			"OC Gas Liste"
+	TCODE	tGaslistCC,			"CC Gas Liste"			; CC Diluents
+	TCODE	tGasEdit,			"Gas einstellen"
+	TCODE	tType,				"Type: "
+	TCODE	tGasDisabled,		"Deaktiviert"			; Disabled
+	TCODE	tGasFirst,			"Start"					; First
+	TCODE	tGasTravel,			"Reise"					; Travel
+	TCODE	tGasDeco,			"Deko"					; Deco
+	TCODE	tDilDisabled,		"Deaktiviert"			; Disabled
+	TCODE	tDilFirst,			"Start"					; First
+	TCODE	tDilNorm,			"Normal"				; Normal
+	TCODE	tAir,				"Luft "					; Enum: values must follows (5 chars)
+	TCODE	tO2,				"O2   "					; tAir + 5
+	TCODE	tO2Plus,			"O2 +"
+	TCODE	tO2Minus,			"O2 -"
+	TCODE	tHePlus,			"He +"
+	TCODE	tHeMinus,			"He -"
+	TCODE	tMOD,				"MOD :"
+	TCODE	tEAD,				"EAD:"
+	TCODE	tSetup_GasDepth,	"Wechseltiefe"
+	TCODE	tDepthPlus,			"Tiefe +"
+	TCODE	tDepthMinus,		"Tiefe -"
+	TCODE	tDepthReset,		"Reset auf MOD:"
+	TCODE	tSetup_GasMix,		"Mix  Einstellen"
+	TCODE	tCCRMode,			"Modus:"				; Mode:
+	TCODE	tCCRModeFixedSP,	"fixeSP/Berech."		; Fixed SP
+	TCODE	tCCRModeSensor,		"Sensor"				; Sensor
+	TCODE	tCCRModeAutoSP,		"Auto SP"				; Auto SP
+	TCODE	tSP,				"SP"					; SP (SetPoint)
+	TCODE	tSPPlus,			"ppO2+"					; pO2+
+	TCODE	tSensorFallback,	"Fallback:"				; Fallback:
 	TCODE	tCalculated,		"berechnet"				; calculated
-    TCODE   tppO2,      		"ppO2:"                 ; ppO2:
-    TCODE   tppO2O2,			"ppO2(O2)"				; ppO2(O2)
-    TCODE   tppO2Dil,			"ppO2(Dil)"				; ppO2(Dil)
-	TCODE   tppO2Mix,			"ppO2(Mix)"				; ppO2(Mix)
+	TCODE	tppO2,				"ppO2:"					; ppO2:
+	TCODE	tppO2O2,			"ppO2(O2)"				; ppO2(O2)
+	TCODE	tppO2Dil,			"ppO2(Dil)"				; ppO2(Dil)
+	TCODE	tppO2Mix,			"ppO2(Mix)"				; ppO2(Mix)
 
 ; New batteries menu
-	TCODE   tNewBattTitle,      "Neue Batterie?"
-	TCODE	tNewBattOld,		"Behalte alte"
+	TCODE	tNewBattTitle,		"Neue Batterie?"
+	TCODE	tNewBattOld,		"behalte alte"
 	TCODE	tNewBattNew36,		"Neue 3,6V Saft (T1)"
 	TCODE	tNewBattNew15,		"Neue 1,5V AA   (T0)"
 	TCODE	tNewBattAccu,		"3,6V AA Akku   (T2)"
-	TCODE	tNew18650,		"Interne 18650  (T3)"
-	TCODE	tNew16650,		"Interne 16650  (T4)"
+	TCODE	tNew18650,			"Interne 18650  (T3)"
+	TCODE	tNew16650,			"Interne 16650  (T4)"
 
 ; Gaslist management
-    TCODE   tGas,       		"Gas"           		; Gas
-    TCODE   tGasErr,    		"Err"           		; Err  (3 chars)
+	TCODE	tGas,				"Gas"					; Gas
+	TCODE	tDil,				"Dil"					; Diluent
+	TCODE	tGasErr,			"Err"					; Err (3 chars)
 
 ; Communication Menu
 	TCODE	tUsbTitle,			"USB Modus"
-    TCODE   tBleTitle,  		"Bluetooth Modus"
-	TCODE	tUsbStarting,  		"Starte....."
-	TCODE	tUsbStartDone, 		"Fertig."
-	TCODE	tUsbServiceMode, 	"Servicemodus aktiv"
+	TCODE	tBleTitle,			"Bluetooth Modus"
+	TCODE	tUsbStarting,		"Starte..."
+	TCODE	tUsbStartDone,		"Fertig."
+	TCODE	tUsbServiceMode,	"Servicemodus aktiv"
 	TCODE	tUsbClosed,			"Abgebrochen"
 	TCODE	tUsbExit,			"Beendet"
-	TCODE	tUsbDownloadMode, 	"Downloadmodus aktiv"
-    TCODE   tUsbLlBld,      	"Low-Level Bootloader"
+	TCODE	tUsbDownloadMode,	"Downloadmodus aktiv"
+	TCODE	tUsbLlBld,			"Low-Level Bootloader"
 
 ; Dive Settings
-    TCODE   tDvMode,    		"Betrieb:"
-    TCODE   tDvOC,      		"OC"
+	TCODE	tDvMode,			"Betrieb : "
+	TCODE	tDvOC,				"OC"
 	TCODE	tDvCCR,				"CCR"
-    TCODE   tDvGauge,   		"Gauge"
-    TCODE   tDvApnea,   		"Apnoe"
-    TCODE   tDvPSCR,			"pSCR"
-    TCODE   tDvCC,      		"CC"
-    TCODE   tDkMode,    		"Decotyp:ZH-L16"		;								## MODIFIED (memory needs)
-    TCODE   tZHL16,     		" "						; keep order, enum from here...	## MODIFIED (memory needs)
-    TCODE   tZHL16GF,   		"+GF"					; ...up to here!				## MODIFIED (memory needs)
-    TCODE   tPPO2Max,   		"Max.     :"
-    TCODE   tPPO2DECO,			"Max. Deko:"
-    TCODE   tPPO2MIN,   		"Min.     :"
-	TCODE	tPPO2MINCC, 		"Min. Loop:"
-	TCODE   tLastDecostop, 		"Letzt.Stopp:"
-    TCODE   tDecoparameters, 	"Deko Parameter"
-    TCODE   tGF_low,    		"GF low :"
-    TCODE   tGF_high,   		"GF high:"
-    TCODE   tSaturationMult,    "Sättigung   :"
-    TCODE   tDesaturationMult,  "Entsättigung:"
-    TCODE   tFTTSMenu,  		"fTTS/fB/O:"	        ; Future TTS
-    TCODE   taGFMenu,   		"Alternativ-GF"         ; Alternative GF
-    TCODE   taGF_low,   		"aGF low :"             ; aGF low
-    TCODE   taGF_high,  		"aGF high:"             ; aGF high
-    TCODE   taGF_enable,		"aGF wählbar:"        	; aGF Selectable
-    TCODE   tDiveaGF_active,	"aGF aktiv"      		; aGF Active
-    TCODE   tppO2settings,		"ppO2 Parameter"   		; ppO2 Settings
-    TCODE   tsafetystopmenu,	"Sicherheitsstop:"      ; Safety Stop:
-	TCODE   tGasUsage,  		"Verbrauch"         	; Gas Usage
-    TCODE   tSetBotUse, 		"Reise Gas: "      		; Bottom Gas: (space)
-    TCODE   tSetDecoUse,		"Deko  Gas: "      		; Deco   Gas: (space)
-	TCODE	tCalcAscGas,	 	"Gasmenge(B/O):"
-	TCODE	tTankSizes,		 	"Tank Größen"
-	TCODE   tLiter,			 	" l"
-	TCODE	tBarLiter,			"Liter"
-	TCODE	tTankFillPress,	 	"Tank Nutzmenge"
-	TCODE	tGas1,			 	"Gas 1:"
-	TCODE	tGas2,				"Gas 2:"
-	TCODE	tGas3,			 	"Gas 3:"
-	TCODE	tGas4,			 	"Gas 4:"
-	TCODE	tGas5,				"Gas 5:"
+	TCODE	tDvGauge,			"Gauge"
+	TCODE	tDvApnea,			"Apnoe"
+	TCODE	tDvPSCR,			"pSCR"
+	TCODE	tDvCC,				"CC"
+	TCODE	tDkMode,			"Decotype: ZH-L16"
+	TCODE	tZHL16,				" "						; keep order, enum from here...
+	TCODE	tZHL16GF,			"+GF"					; ...up to here!
+	TCODE	tPPO2Max,			"Max.     :"
+	TCODE	tPPO2DECO,			"Max. Deko:"
+	TCODE	tPPO2MIN,			"Min.     :"
+	TCODE	tPPO2MINCC,			"Min. Loop:"
+	TCODE	tLastDecostop,		"Letzt.Stop : "
+	TCODE	tAscentSpeed,		"Auf.Geschw.: "			; Ascent Speed
+	TCODE	tGasChangeTime,		"Gaswechsel :+"			; additional Gas Change Time
+	TCODE	tDecoparameters,	"Deko Parameter"
+	TCODE	tGF_low,			"GF  low :"
+	TCODE	tGF_high,			"GF  high:"
+	TCODE	tSaturationMult,	"Sättigung   : "
+	TCODE	tDesaturationMult,	"Entsättigung: "
+	TCODE	tFTTSMenu,			"fTTS/Verz.:"			; Future TTS
+	TCODE	tLastDecostopSurf,	"Letzt.Stop:"			; last deco stop surface custom view
+	TCODE	tGFMenu,			"GF Parameter"			; GF Settings
+	TCODE	taGF_low,			"aGF low :"				; aGF low
+	TCODE	taGF_high,			"aGF high:"				; aGF high
+	TCODE	taGF_enable,		"aGF wählbar:"			; aGF Selectable
+	TCODE	tDiveaGF_active,	"aGF aktiv"				; using aGF
+	TCODE	tppO2settings,		"ppO2 Parameter"		; ppO2 Settings
+	TCODE	tsafetystopmenu,	"Sicherheitsstop:"		; Safety Stop:
+	TCODE	tGasUsage,			"Gasbedarf"				; Gas Usage
+	TCODE	tSetBotUse,			"Reise Gas: "			; Bottom Gas: (space)
+	TCODE	tSetDecoUse,		"Deko  Gas: "			; Deco	Gas: (space)
+	TCODE	tCalcAscGas,		"Gasmenge(B/O):"
+	TCODE	tSetup_Tank,		"Tank Einstellen"		; Setup Tank
+	TCODE	tTankSize,			"Tank Größe"
+	TCODE	tTankUsablePress,	"Umkehrdruck (Aufst)"	; Tank Pressure Budget for Ascent (turn pressure) (max 19 chars)
+	TCODE	tCopyDilToOC,		"Kopiere Dil.-> OC"		; copy diluent settings to OC gas
+	TCODE	tTankPairing,		"Sender wählen"			; select Transmitter
+	TCODE	tLiter,				" l"
+	TCODE	tLiterLong,			"Liter"
 	TCODE	tCCmaxFracO2,		"Loop %O2 max.:"
 	TCODE	t2ndDecoPlanMenu,	"2.Deko Plan"
-	
+
+ IFDEF _rx_functions
+	TCODE	tTrModeOff,			"aus"					; off
+	TCODE	tTrModeOn,			"ein"					; on
+	TCODE	tTrModeIndDouble,	"unabh.Doppel"			; independent double
+	TCODE	tTrModeCCR,			"CCR Dil+O2"			; CCR diluent and O2
+	TCODE	tTrPresNone,		"keiner"				; none  (big enum group follows)
+	TCODE	tTrPresGas1,		"Gas 1"					; Gas 1
+	TCODE	tTrPresGas2,		"Gas 2"					; Gas 2
+	TCODE	tTrPresGas3,		"Gas 3"					; Gas 3
+	TCODE	tTrPresGas4,		"Gas 4"					; Gas 4
+	TCODE	tTrPresGas5,		"Gas 5"					; Gas 5
+	TCODE	tTrPresDil1,		"Dil 1"					; Dil 1
+	TCODE	tTrPresDil2,		"Dil 2"					; Dil 2
+	TCODE	tTrPresDil3,		"Dil 3"					; Dil 3
+	TCODE	tTrPresDil4,		"Dil 4"					; Dil 4
+	TCODE	tTrPresDil5,		"Dil 5"					; Dil 5
+	TCODE	tTrPresFirstGas,	"erstes Gas"			; first  Gas
+	TCODE	tTrPresActiveGas,	"aktives Gas"			; active Gas
+	TCODE	tTrPresFirstDil,	"erstes Dil"			; first  Dil
+	TCODE	tTrPresActiveDil,	"aktives Dil"			; active Dil
+ ELSE
+ 	TCODE	tTrModeOff,			""						; dummy target for entry in option table
+	TCODE	tTrPresNone,		""						; dummy target for entry in option table
+ ENDIF
+
 ; Display Settings
-    TCODE   tBright,    		"Helligkeit:"
-    TCODE   tEco,       		"Eco"
-    TCODE   tMedium,    		"Mittel"
-    TCODE   tHigh,      		"Hoch"
-    TCODE   tDvSalinity,		"Salinität: "			; Salinity
-	TCODE   tShowppO2,  		"Ständig zeigen:"		; Always show ppO2:
-    TCODE   tFlip,      		"Anzeige drehen:"		; Rotate Screen
-    TCODE   tMODwarning,		"MOD  Warnung:"			; MOD warning
-	TCODE	tIBCDwarning,		"IBCD Warnung:"			; IBCD Warning	
-    TCODE   tTimeoutDive,		"TG-Ende nach:"			; Dive Timeout
+	TCODE	tBright,			"Helligkeit:"
+	TCODE	tEco,				"Eco"
+	TCODE	tMedium,			"Mittel"
+	TCODE	tHigh,				"Hoch"
+	TCODE	tDvSalinity,		"Salinität: "			; Salinity
+	TCODE	tShowppO2,			"ständig zeigen:"		; Always show ppO2:
+	TCODE	tFlip,				"Anzeige drehen:"		; Rotate Screen
+	TCODE	tMODwarning,		"MOD  Warnung:"			; MOD warning
+	TCODE	tIBCDwarning,		"IBCD Warnung:"			; IBCD Warning
+	TCODE	t2ndDepth,			"2.Tiefe:"				; 2nd depth display content (10 chars max)
+	TCODE	tTimeoutDive,		"TG-Ende nach:"			; Dive Timeout
 
 ; VSI display Settings
-    TCODE   tVSItext2,  		"Variable Geschw.:"     ; Variable speed:
-    TCODE   tVSIgraph,  		"Geschw.  Grafik :"		; Speed graph:
+	TCODE	tVSItext2,			"Variable Geschw.:"		; Variable speed:
+	TCODE	tVSIgraph,			"Geschw.  Grafik :"		; Speed graph:
 
 ; Setup Menu
-    TCODE   tSystSets,  		"Konfiguration"
-    TCODE   tLanguage,  		"Sprache:"
-    TCODE   tEnglish,   		"Englisch"
-    TCODE   tGerman,    		"Deutsch"
-    TCODE   tFrench,    		"Französisch"
-    TCODE   tItalian,   		"Italienisch"
-    TCODE   tCompassMenu,		"Kompass-Kalibrierung"  ; Compass calibration
-    TCODE   tCompassGain,		"Empfindlichkeit:"      ; Compass gain:
-    TCODE   tCalX,	 			"Kal. X:"				; Cal X
-    TCODE   tCalY,	 			"Kal. Y:"				; Cal Y
-    TCODE   tCalZ,	 			"Kal. Z:"				; Cal Z
-
-    TCODE   tUnits,     		"Einheiten:"
-    TCODE   tMetric,     		" m/°C"            		; Enum menu
-    TCODE   tImperial,   		"ft/°F"
-
-    TCODE   tDefName,   		"HW OSTC"
-
-    TCODE   tButtonleft,		"Taster links :"      	; Left button
-    TCODE   tButtonright,		"Taster rechts:"    	; Right button
-
+	TCODE	tSystSets,			"Konfiguration"
+	TCODE	tCompassMenu,		"Kompass-Kalibrierung"	; Compass calibration
+	TCODE	tCompassGain,		"Empfindlichkeit:"		; Compass gain:
+	TCODE	tCalX,				"Kal. X:"				; Cal X
+	TCODE	tCalY,				"Kal. Y:"				; Cal Y
+	TCODE	tCalZ,				"Kal. Z:"				; Cal Z
+	TCODE	tUnits,				"Einheiten: "
+	TCODE	tMetric,			" m/°C"					; Enum menu
+	TCODE	tImperial,			"ft/°F"
+	TCODE	tDefName,			"HW OSTC"
+	TCODE	tButtonleft,		"Taster links :"		; Left button
+	TCODE	tButtonright,		"Taster rechts:"		; Right button
 	TCODE	tAltMode,			"Wartezeit:"
 	TCODE	tAltModeFly,		"Fliegen"
 	TCODE	tAltMode1000,		"1000m"
 	TCODE	tAltMode2000,		"2000m"
 	TCODE	tAltMode3000,		"3000m"
-	
+
 ; Units for all menu
-    TCODE   tMeters,    		"m"
+	TCODE	tMeters,			"m"
 	TCODE	tFeets,				"ft"
 	TCODE	tFeets1,			"f"
-    TCODE   tMinutes,  			"'"
-    TCODE   tPercent,   		"%"
-    TCODE   tLitersMinute, 		"l/min"
+	TCODE	tMinutes,			"'"
+	TCODE	tPercent,			"%"
+	TCODE	tLitersMinute,		"l/min"
 	TCODE	tbar,				" bar"					; bar
-	TCODE	tbar10,				"0 bar"					; bar							## NEW 2.95
-	TCODE	tMeterMinute,		"m/min"					; meter per minute				## ascent speed
-	TCODE	tmin,				"min"					; minutes
+	TCODE	tbar10,				"0 bar"					; xx0 bar
+	TCODE	tMeterMinute,		"m/'"					; meter per minute
 
 ; Date
-	TCODE	tDateFormat, 		"Datum:"
-	TCODE	tDateformat, 		"MMTTJJ"
+	TCODE	tDateFormat,		"Format: "
+	TCODE	tDateformat,		"MMTTJJ"
 	TCODE	tDateformat1,		"TTMMJJ"
 	TCODE	tDateformat2,		"JJMMTT"
 
 ; Simulator menu
-    TCODE   tInter, 			"Start Simulator"  		; Start Simulator
-    TCODE   tPlan,  			"Simulator"        		; Simulator
+	TCODE	tInter,				"Start Simulator"		; Start Simulator
+	TCODE	tPlan,				"Simulator"				; Simulator
 
 ; Decoplanner submenu
-    TCODE   tBtTm,  			"Grundzeit:"        	; Bot. Time: (10 chars)
-    TCODE   tBtTm_short,		"Zeit:"             	; Bot. Time: (max. 6 chars)
-    TCODE   tMxDep, 			"Tiefe    :"        	; Max Depth: (10 chars)
-    TCODE   tIntvl, 			"Intervall:"        	; Interval : (10 chars)
-	TCODE	tDecoSetup, 		"Deko Parameter"
-    TCODE   tDeco,  			"Deko Berechnung"    	; Calculate Deco
-    TCODE   tDivePlan,  		"Tauchplan:"        	; Dive Plan:
-    TCODE   tNoDeco,    		"Keine Deko"        	; No Deco
-    TCODE   tMore,      		"Mehr..."           	; More...
-	TCODE	tSelectSetpoint,	"CCR Setpoint: "
-	TCODE	tuseAGF,		"Benutze aGF : "
+	TCODE	tBtTm,				"Grundzeit:"			; Bot. Time: (10 chars)
+	TCODE	tBtTm_short,		"Zeit:"					; Bot. Time: (max. 6 chars)
+	TCODE	tBtDep,				"Tiefe    :"			; Max Depth: (10 chars)
+	TCODE	tIntvl,				"Intervall:"			; Interval : (10 chars)
+	TCODE	tDecoSetup,			"Deko Parameter"
+	TCODE	tDeco,				"Deko Berechnung"		; Calculate Deco
+	TCODE	tDivePlan,			"Tauchplan:"			; Dive Plan:
+	TCODE	tNoDeco,			"Keine Deko"			; No Deco
+	TCODE	tMore,				"mehr"					; More
+	TCODE	tSelectSetpoint,	"Setpoint   :"
+	TCODE	tuseAGF,			"Benutze aGF:"
 	TCODE	tCalculating,		"Berechnung läuft..."
+	TCODE	tNDLleft,			"übrig"					; time left within NDL
 
 ; Information menu
-    TCODE   tFirmware,  		"Firmware: "        	; Firmware: (space)
-    TCODE   tSerial,    		"Seriennr: "        	; Serial  : (space)	## MODIFIED	## info - removed dot
+	TCODE	tFirmware,			"Firmware: "			; Firmware: (space)
+	TCODE	tFirmware_rx,		"RX Ver  : "			; RX Ver  : (space)
+	TCODE	tSerial,			"Seriennr: "			; Serial  : (space)
 	TCODE	tTotalDives,		"Anzahl TG: "			; Total Dives:
-    TCODE   tBatteryV,  		"Batterie: "        	; Battery:
-    TCODE   tUptime,			"Laufzeit: "	    	; Uptime: 
+	TCODE	tBatteryV,			"Batterie: "			; Battery:
+	TCODE	tUptime,			"Laufzeit: "			; Uptime:
 
 ; Divemode screen
-    TCODE   tNDL,       		" NZ"
-    TCODE   tTTS,   			"TTS"
-	TCODE	tVelMetric,	 		"m/min"
+	TCODE	tNDL,				" NZ"					; 3 chars max
+	TCODE	tTTS,				"TTS"
+	TCODE	tVelMetric,			"m/min"
 	TCODE	tVelImperial,		"ft/m "
-	TCODE	tGasSelect,  		"Wähle Gas"       		; Select Gas
-	TCODE	tSelectAir,	 		"Air "     				; Air
-	TCODE	tSelectO2,	 		"O2  "             		; O2
-    TCODE   tSelectNx,   		"Nx"               		; Nx
-    TCODE   tSelectTx,   		"Tx"               		; Tx
-    TCODE   tDepth,      		"Tiefe"            		; Depth
-    TCODE   tMaxDepth,   		"Max. Tiefe"       		; Max. Depth - max 10chars!
-    TCODE   tDivetime,   		"    Zeit"         	; Divetime
-    TCODE   tDiveHudMask1,  	"Sensor 1"
-    TCODE   tDiveHudMask2,  	"Sensor 2"
-    TCODE   tDiveHudMask3,  	"Sensor 3"
-    TCODE   tDiveTotalAvg,  	"Durchschn.1"   
-    TCODE   tDiveStopwatch, 	"Stoppuhr"
-    TCODE   tDiveStopAvg,   	"Durchschn.2"   		; 11chars max
-    TCODE   tApnoeTotal,    	" Total"        		; Total (Six chars, right alligned)
-    TCODE   tApnoeMax,      	"  Letzter TG"  		; Last descend
-    TCODE   tApnoeSurface,  	"Oberflächenzeit"  		; Surface Time
-    TCODE   tDiveDecoplan,  	"Dekoplan"      		; Decoplan
-    TCODE   tDiveClock,     	"Uhr"           		; Clock
-    TCODE   tDiveEAD_END,   	"EAD/END"       		; EAD/END
-    TCODE   tDiveTissues,   	"Gewebe"        		; Tissues
-    TCODE   tEND,           	"END:"          		; END:
-    TCODE   tHe,            	"He"            		; He
-    TCODE   tN2,            	"N2"            		; N2
-    TCODE   tDiveBailout,   	"Bailout"       		; Bailout
-    TCODE   tGFactors,      	"GF Werte"     			; GF Values
-    TCODE   taGFactors,     	"aGF Werte"    			; aGF Values
-    TCODE   tGFInfo,        	"GF jetzt"       		; GF Info
-    TCODE   tCeiling,       	"Ceiling"       		; Ceiling
-    TCODE   tDiveSafetyStop,	"Stop"         			; Stop (Four chars, right alligned)
-    TCODE   tDiveFallback,  	"Fallback!"     		; Fallback! (max. nine chars)
+	TCODE	tGasSelect,			"Wähle Gas"				; Select Gas
+	TCODE	tSelectAir,			"Luft"					; Air
+	TCODE	tSelectO2,			"O2  "					; O2
+	TCODE	tSelectNx,			"Nx"					; Nx
+	TCODE	tSelectTx,			"Tx"					; Tx
+	TCODE	tDepth,				"Tiefe"					; Depth
+	TCODE	tMaxDepth,			"Max. Tiefe"			; Max. Depth    - max 10chars!
+	TCODE	tAvgDepth,			"Durchschn."			; average Depth - max 10chars!
+	TCODE	tDivetime,			"      Zeit"			; Divetime
+	TCODE	tDiveHudMask1,		"Sensor 1"
+	TCODE	tDiveHudMask2,		"Sensor 2"
+	TCODE	tDiveHudMask3,		"Sensor 3"
+	TCODE	tDiveTotalAvg,		"Durchschn.1"
+	TCODE	tDiveStopwatch,		"Stoppuhr"
+	TCODE	tDiveStopAvg,		"Durchschn.2"			; 11 chars max
+	TCODE	tApnoeTotal,		" Total"				; Total (six chars, right aligned)
+	TCODE	tApnoeMax,			"  Letzter TG"			; Last descend
+	TCODE	tApnoeSurface,		"Oberflächenzeit"		; Surface Time
+	TCODE	tTime,				"Uhrzeit"				; Time
+	TCODE	tSurface,			"Oberfläche"			; Surface (max 12 chars)
+	TCODE	tDiveDecoplan,		"Dekoplan"				; Decoplan
+;	TCODE	tDiveClock,			"Uhr"					; Clock
+	TCODE	tDiveEAD_END,		"EAD/END"				; EAD/END
+	TCODE	tDiveTissues,		"Gewebe"				; Tissues
+	TCODE	tEND,				"END:"					; END:
+	TCODE	tHe,				"He"					; He
+	TCODE	tN2,				"N2"					; N2
+	TCODE	tDiveBailout,		"Bailout"				; Bailout
+	TCODE	tGFactors,			"GF Werte"				; GF Values
+	TCODE	taGFactors,			"aGF Werte"				; aGF Values
+	TCODE	tGFInfo,			"GF jetzt"				; GF Info
+	TCODE	tCeiling,			"Ceiling"				; Ceiling
+	TCODE	tDiveSafetyStop,	"Stop"					; Stop (four chars, right aligned)
+	TCODE	tDiveFallback,		"Fallback!"				; Fallback! (max. nine chars)
 	TCODE	tDecoInfo,			"Deko Zone"				; Deco info
-    TCODE   tSensorCheck,   	"Sensor Test"   		; Sensor Check
-    TCODE   tdil,	    		"Dil:"	    			; Diluent ppO2 Warning
+	TCODE	tSensorCheck,		"Sensor Test"			; Sensor Check
+	TCODE	tdil,				"Dil:"					; Diluent ppO2 Warning
 	TCODE	tmix,				"Mix:"					; Pre-Mix ppO2 Warning
 	TCODE	tSensorDisagree,	"Sensoren!"				; Sensors disagree Warning
 	TCODE	tGasNeedsWarn,		"Gasbedarf"
-	TCODE	tGasNeedsBar,		"Gas Bedarf (bar)"
+	TCODE	tGasNeedsAscent,	"Gas Bedarf Aufstieg"
 	TCODE	tCNSsurf,			"ZNS Oberfl."
 	TCODE	tCNSfTTS,			"ZNS fTTS"
 	TCODE	tCNSBO,				"ZNS B/O"
 	TCODE	tCNSnow,			"ZNS jetzt"
 	TCODE	tCNSeod,			"ZNS Ende"
 	TCODE	tIBCD,				"IBCD N2He"
+	TCODE	tnoBOgas,			"-B/O-Gas-"
 	TCODE	tMicroBubbles,		"M.Blasen"
 	TCODE	tCNS,				"CNS: "
-	
+	TCODE	tgaschange,			"wechseln?"				; better gas found
+	TCODE	tNeed,				"Bedf."					; gas need (5 chars)
+	TCODE	tBattery,			"Batterie"				; Battery
+ IFDEF _rx_functions
+	TCODE	tTransmitter,		"TR Sender"				; pressure transmitter
+	TCODE	tPressure,			"Fl.Druck"				; tank pressure
+	TCODE	tSAC,				"AMV"					; SAC, must be 3 chars!
+	TCODE	tswap,				"wechseln"				; switch tank (max. 9 chars)
+ ENDIF
+ IFDEF _cave_mode
+	TCODE	tGasNeedsCaveMode,	"Gas Bedarf Höhlen-Modus"; title for gas needs custom view
+	TCODE	tDiveTurned,		"Rückweg"				; dive is turned      (max. 9 char)
+	TCODE	tCaveMode,			"Höhle"					; cave mode activated (max. 9 char)
+	TCODE	tCaveModeShutdown,	"X-Höhle-X"				; cave mode shut down (max. 9 char)
+ ENDIF
+
+
 ; Divemode menu
-    TCODE   tDivePreMenu,   	"Menü?"         		; Menu?
-    TCODE   tSetHeading,    	"Peilung"       		; Bearing (Max. seven chars)
+	TCODE	tDivePreMenu,		"Menü?"					; Menu?
+	TCODE	tSetHeading,		"Kurs"					; set bearing (max. 6 chars)
 
 ; Simulator menu
-	TCODE	tQuitSim,	 		"Ende?"            		; Quit Simulation?
+	TCODE	tQuitSim,			"Ende"					; Quit Simulation
 
 ; Logbook
 	TCODE	tCNS2,				"ZNS:"
-	TCODE	tAVG,				"Mittel:"
+	TCODE	tAVG,				"Mit:"
 	TCODE	tGF,				"GF:"
-	TCODE	tSAT,				"Sät:"					; Sat:
+	TCODE	tSAT,				"Sät:"
 
 ; Logbook units
-	TCODE	tLogTunitC,			"°C"	
+	TCODE	tLogTunitC,			"°C"
 	TCODE	tLogTunitF,			"°F"
 	TCODE	tKGL,				"kg/l"
-	TCODE	tMBAR,				"mbar"
+	TCODE	tMBAR,				"hPa"
 
 ; Logbook menu
-	TCODE	tNextLog, 			"Nächste Seite"
+	TCODE	tNextLog,			"Nächste Seite"
 
 ; Reset menu
-	TCODE	tReboot,			"Neu starten"			;Reboot
-	TCODE	tResetMenu2,		"Sind Sie sicher?"		;Are you sure?
-	TCODE	tAbort,     		"Abbrechen"             ;Abort
-	TCODE	tResetSettings, 	"Alles zurücksetzen"	;Reset all
-	TCODE	tResetDeco,			"Deko  zurücksetzen"	;Reset Deco
-    TCODE	tResetBattery,		"neue Batterie"			;Reset Battery
-    TCODE	tResetLogbook,		"Logbuch löschen"		;Reset Logbook
+	TCODE	tReboot,			"Neu starten"			; Reboot
+	TCODE	tResetMenu2,		"Sind Sie sicher?"		; Are you sure?
+	TCODE	tAbort,				"Abbrechen"				; Abort
+	TCODE	tResetSettings,		"Reset Einstellungen"	; Reset Settings (max. 19 chars)
+	TCODE	tResetDeco,			"Reset Deko"			; Reset Deco
+	TCODE	tResetBattery,		"neue Batterie"			; Reset Battery
+	TCODE	tResetLogbook,		"Logbuch löschen"		; Reset Logbook
 
 ; Set Time Menu/Set Date Menu
 	TCODE	tSetHours,			"Stunden einst."		; Set Hours
@@ -346,24 +400,65 @@
 	TCODE	tLogOffsetm10,		"-10"					; -10
 
 ; Compass directions
-    TCODE   tN,             	"N "                	; N(orth),338°-22°
-    TCODE   tNE,            	"NO"               		; North-East,23°-67°
-    TCODE   tE,             	"O "                	; E(east),68°-112°
-    TCODE   tSE,            	"SO"                	; South-East,113°-157°
-    TCODE   tS,             	"S "                	; S(outh),157°-202°
-    TCODE   tSW,            	"SW"                	; South-West,203°-247°
-    TCODE   tW,             	"W "                	; W(West),248°-292°
-    TCODE   tNW,            	"NW"                	; North-West,293°-337°
+	TCODE	tN,					"N "					; N(orth),    338°-22°
+	TCODE	tNE,				"NO"					; North-East,  23°-67°
+	TCODE	tE,					"O "					; E(east),     68°-112°
+	TCODE	tSE,				"SO"					; South-East, 113°-157°
+	TCODE	tS,					"S "					; S(outh),    157°-202°
+	TCODE	tSW,				"SW"					; South-West, 203°-247°
+	TCODE	tW,					"W "					; W(West),    248°-292°
+	TCODE	tNW,				"NW"					; North-West, 293°-337°
 
 ; Color Scheme menu
-    TCODE   tColorScheme,   	"Farbschema"        	; Colour Scheme
-    TCODE   tColorSetDive,  	"Tauchmodus:"       	; Divemode:
-    TCODE   tColorSetName0, 	"Standard"         		; Standard
-    TCODE   tColorSetName1, 	"Rot"               	; Red
-    TCODE   tColorSetName2, 	"Grün"              	; Green
-    TCODE   tColorSetName3, 	"Blau"              	; Blue
-    
-; PSCR Menu and Settings
-    TCODE   tPSCRMenu,	    	"pSCR Menü"				; PSCR Menu
-    TCODE   tPSCR_O2_drop,  	"O2 Abfall     :"		; O2 drop
-    TCODE   tPSCR_lungratio,	"Lungenverhält.:"		; lung ratio
+	TCODE	tColorScheme,		"Farbschema"			; Colour Scheme
+	TCODE	tColorSetDive,		"Tauchmodus:"			; Divemode:
+	TCODE	tColorSetName0,		"Standard"				; Standard
+	TCODE	tColorSetName1,		"Rot"					; Red
+	TCODE	tColorSetName2,		"Grün"					; Green
+	TCODE	tColorSetName3,		"Blau"					; Blue
+
+; pSCR Menu and Settings
+	TCODE	tPSCRMenu,			"pSCR Menü"				; PSCR Menu
+	TCODE	tPSCR_O2_drop,		"O2 Abfall  "			; O2 drop
+	TCODE	tPSCR_lungratio,	"L.Verhält. "			; lung ratio
+	TCODE	tBackToLoop,		"auf Loop"				; back to loop (10 chars max)	### new
+
+
+; Language selection
+ IF _language_2!=none
+	TCODE	tLanguage,			"Sprache: "				; used in menu_tree
+ ENDIF
+
+ IF _language_1==en
+	TCODE	tLang1,				"Englisch"				; tLang1 is 1st language, enum context
+ ELSE
+ IF _language_1==de
+	TCODE	tLang1,				"Deutsch"
+ ELSE
+ IF _language_1==fr
+	TCODE	tLang1,				"Französisch"
+ ELSE
+ IF _language_1==it
+	TCODE	tLang1,				"Italienisch"
+ ELSE
+	TCODE	tLang1,				""						; dummy target for options table
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+ IF _language_2==en
+	TCODE	tLang2,				"Englisch"				; tLang2 is 2nd language, enum context
+ ELSE
+ IF _language_2==de
+	TCODE	tLang2,				"Deutsch"
+ ELSE
+ IF _language_2==fr
+	TCODE	tLang2,				"Französisch"
+ ELSE
+ IF _language_2==it
+	TCODE	tLang2,				"Italienisch"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
--- a/src/text_italian.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_italian.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,369 +1,463 @@
 ;=============================================================================
 ;
-;    File text_italian.asm							REFACTORED VERSION V2.95
+;	File text_italian.asm							REFACTORED VERSION V2.99e
 ;
-;    Italian texts translation file.
+;	Italian texts translation file.
 ;
-;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;	Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 
 ; Basic texts
-	TCODE	tNo,        "No"            ; No
-	TCODE	tYes,       "Si"            ; Yes = No + 1
-	TCODE	tblank,			" "					; (a single space character)	## NEW (layout)
+	TCODE	tNo,				"No"					; 0 No
+	TCODE	tYes,				"Si"					; 1 Yes
+ IFDEF _cave_mode
+	TCODE	tCave,				"Cave"					; 2 Cave
+ ENDIF
+
+	TCODE	tblank,				" "						; (a single space character)
 
 ; Surface-mode texts
-    TCODE   tBeta,      "beta"         	; beta
-	TCODE	tMenu,		"<Menu" 		; <Menu
-    TCODE   tView,      "Vedi>"         ; View>
-    TCODE   tHeading,   "Direzione:"    ; Heading:
-    TCODE   tLastDive,	"UltimaImm."	; Last Dive (Max 10 chars)
-    TCODE   tSensorMilliVolt, "Sensori CCR mV" ; CCR Sensors mV
+	TCODE	tMenu,				"<Menu"					; <Menu
+	TCODE	tView,				"Vedi>"					; View>
+	TCODE	tHeading,			"Direzione:"			; Heading:
+	TCODE	tLastDive,			"UltimaImm."			; Last Dive (Max 10 chars)
+	TCODE	tSensorMilliVolt,	"Sensori mV"			; Sensors mV
 
 ; Divemode Menu
-    TCODE   tDivemenu_Gaslist,  "Lista Gas"       ; Gaslist
-    TCODE   tDivemenu_ResetAvg, "AzzeraMed"  ; Reset Avg.
-    TCODE   tDivemenu_Setpoint, "Setpoint"      ; Setpoint
-    TCODE   tDivemenu_UseSensor,"Usa Sensori"    ; Use Sensor
-    TCODE   tDivemenu_ToggleGF, "Alterna GF"     ; Toggle GF
-    TCODE   tDivemenu_Marker,   "Set Marker"    ; Set Marker
-    TCODE   tDivemenu_LostGas,  "Gas perso"    ; Lost Gas
+	TCODE	tDivemenu_Gaslist,	"Lista Gas"				; Gaslist  (OC)
+	TCODE	tDivemenu_Diluent,	"Lista Dil"				; Diluents (CCR)
+	TCODE	tDivemenu_Premix,	"Lista Mix"				; Premix   (pSCR)
+	TCODE	tDivemenu_ResetAvg,	"AzzeraMed"				; Reset Avg.
+	TCODE	tDivemenu_Avg_Mkr,	"Avg/Marker"			; Reset Avg., Set Marker (and Turn Dive)	## pending translation
+	TCODE	tDivemenu_Setpoint,	"Setpoint"				; Setpoint
+	TCODE	tDivemenu_UseSensor,"Usa Sensori"			; Use Sensor
+	TCODE	tDivemenu_ToggleGF,	"Alterna GF"			; Toggle GF
+	TCODE	tDivemenu_Marker,	"Set Marker"			; Set Marker
+	TCODE	tDivemenu_LostGas,	"Gas perso"				; Lost Gas
+ IFDEF _cave_mode
+	TCODE	tDivemenu_TurnDive,	"Turn Dive"				; Turn Dive
+ ENDIF
 
 ; Main menu
-    TCODE   tNext,      "<Prossimo"         ; <Next
-    TCODE   tEnter,     "Enter>"        ; Enter>
-
-    TCODE   tMainMenu,  "Menu Principale"     ; MainMenu
-    TCODE   tLogbook,   "Logbook"       ; Logbook
-    TCODE   tGasSetup,  "Imposta Gas OC"  ; OC Gas Setup
-    TCODE   tSetTime,   "Imposta Ora"		; Set Time
-	TCODE	tSetDate,	"Imposta Data"		; Set Date
-	TCODE	tSetTimeDate,"Imp. Ora e Data"; Set Time & Date
-    TCODE   tDispSets,  "Visualizzazione" ; Display Settings
-    TCODE   tExit,      "Esci"          ; Exit
-	TCODE	tResetMenu, "Resetta Menu"	; Reset Menu
-	TCODE	tDiveModeMenu,"Modalita' Deco"	; Deco Mode
-	TCODE	tInfoMenu,	"Informazioni"	; Information
-    TCODE   tCCRSetup,  "Imposta CCR"     ; CCR Setup
-    TCODE   tDiluentSetup,"Imposta Diluente"   ; Diluent Setup
-    TCODE   tFixedSetpoints,"Setpoints Fissi" ; Fixed Setpoints
-    TCODE   tCCRSensor, "Sensori CCR"    ; CCR Sensor
-    TCODE   tCalibrateMenu, "Calibrazione"   ; Calibration
-    TCODE   tCalibrationGas, "Cal. Gas O2:"  ; Cal. Gas O2:
-    TCODE   tCalibrate, "Calibra"     ; Calibrate
-	TCODE	tBack,			 "back..."			;								## NEW 
+	TCODE	tNext,				"<Prossimo"				; <Next
+	TCODE	tEnter,				"Enter>"				; Enter>
+	TCODE	tMainMenu,			"Menu Principale"		; MainMenu
+	TCODE	tLogbook,			"Logbook"				; Logbook
+	TCODE	tGasSetup,			"Imposta Gas OC"		; OC Gas Setup
+	TCODE	tSetTime,			"Imposta Ora"			; Set Time
+	TCODE	tSetDate,			"Imposta Data"			; Set Date
+	TCODE	tSetTimeDate,		"Imp. Ora e Data"		; Set Time & Date
+	TCODE	tDispSets,			"Visualizzazione"		; Display Settings
+	TCODE	tExit,				"Esci"					; Exit
+	TCODE	tResetMenu,			"Resetta Menu"			; Reset Menu
+	TCODE	tDiveModeMenu,		"Modalita' Deco"		; Deco Mode
+	TCODE	tInfoMenu,			"Informazioni"			; Information
+	TCODE	tTrSettings,		"Pressure Display"		; Pressure Display								## pending translation
+	TCODE	tTrMode,			"Modo: "				; Mode
+	TCODE	tTr1stPres,			"1.Pres.: "				; 1st Pressure
+	TCODE	tTr2ndPres,			"2.Pres.: "				; 2nd Pressure
+	TCODE	tTrBailPres,		"1.B/O  : "				; Bailout Pressure
+	TCODE	tTrMaxDeltaP,		"max deltaP: "			; independent double max diffenerce				## pending translation
+	TCODE	tCCRSetup,			"Imposta CCR"			; CCR Setup
+	TCODE	tDiluentSetup,		"Imposta Diluente"		; Diluent Setup
+	TCODE	tFixedSetpoints,	"Setpoints Fissi"		; Fixed Setpoints
+	TCODE	tCCRSensor,			"Sensori CCR"			; CCR Sensor
+	TCODE	tCalibrateMenu,		"Calibrazione"			; Calibration
+	TCODE	tCalibrationGas,	"Cal. Gas O2:"			; Cal. Gas O2:
+	TCODE	tCalibrate,			"Calibra"				; Calibrate
+	TCODE	tBack,				"back"					; back
 
 ; Gas menu
-    TCODE   tGaslist,   "Lista Gas OC"
-    TCODE   tGaslistCC, "Lista Gas CC"   ; CC Diluents
-    TCODE   tGasEdit,   "Modifica Gas"
-    TCODE   tType,      "Tipo: "
-    TCODE   tGasDisabled,"Disabilitato"  ; Disabled
-    TCODE   tGasFirst,   "Primo"     ; First
-    TCODE   tGasTravel,  "Viaggio"    ; Travel
-    TCODE   tGasDeco,    "Deco"      ; Deco
-    TCODE   tDilDisabled,"Disabilitato"  ; Disabled
-    TCODE   tDilFirst,   "Primo"     ; First
-    TCODE   tDilNorm,   "Normale"     ; Normal
-    TCODE   tAir,       "Aria  "         ; Enum: values must follows (5 chars)
-    TCODE   tO2,        "O2   "         ; tAir + 5
-    TCODE   tO2Plus,    "O2 +"
-    TCODE   tO2Minus,   "O2 -"
-    TCODE   tHePlus,    "He +"
-    TCODE   tHeMinus,   "He -"
-    TCODE   tMOD,       "MOD:"
-    TCODE   tEAD,       "EAD:"
-    TCODE   tGasDepth,  "Cambia profondita'"
-    TCODE   tDepthPlus, "Profondita' +"
-    TCODE   tDepthMinus,"Profondita' -"
-    TCODE   tDepthReset,"Reset a MOD:"
-    TCODE   tSetup_mix, "Imposta Miscela"
-    TCODE   tCCRMode,   "Modo CCR:"             ; CCR Mode:
-    TCODE   tCCRModeFixedSP,  "SP Fissi"        ; Fixed SP
-    TCODE   tCCRModeSensor,   "Sensori"			; Sensor
-    TCODE   tCCRModeAutoSP,   "SP Auto"         ; Auto SP
-    TCODE   tSP,            "SP"                ; SP (SetPoint)
-    TCODE   tSPPlus,    "ppO2+"					; pO2+
-    TCODE   tSensorFallback, "Fallback:"        ; Fallback:
-	TCODE	tCalculated,	"calcolato"		; calculated
-    TCODE   tppO2,      "ppO2:"                 ; ppO2:
-	TCODE   tppO2O2,	"ppO2(O2)"				; ppO2(O2)
-    TCODE   tppO2Dil,	"ppO2(Dil)"				; ppO2(Dil)
-    TCODE   tppO2Mix,	"ppO2(Mix)"				; ppO2(Mix)
-		
+	TCODE	tGaslist,			"Lista Gas OC"
+	TCODE	tGaslistCC,			"Lista Gas CC"			; CC Diluents
+	TCODE	tGasEdit,			"Modifica Gas"
+	TCODE	tType,				"Tipo: "
+	TCODE	tGasDisabled,		"Disabilitato"			; Disabled
+	TCODE	tGasFirst,			"Primo"					; First
+	TCODE	tGasTravel,			"Viaggio"				; Travel
+	TCODE	tGasDeco,			"Deco"					; Deco
+	TCODE	tDilDisabled,		"Disabilitato"			; Disabled
+	TCODE	tDilFirst,			"Primo"					; First
+	TCODE	tDilNorm,			"Normale"				; Normal
+	TCODE	tAir,				"Aria "					; Enum: values must follows (5 chars)
+	TCODE	tO2,				"O2   "					; tAir + 5
+	TCODE	tO2Plus,			"O2 +"
+	TCODE	tO2Minus,			"O2 -"
+	TCODE	tHePlus,			"He +"
+	TCODE	tHeMinus,			"He -"
+	TCODE	tMOD,				"MOD :"
+	TCODE	tEAD,				"EAD:"
+	TCODE	tSetup_GasDepth,	"Cambia profondita'"
+	TCODE	tDepthPlus,			"Profondita' +"
+	TCODE	tDepthMinus,		"Profondita' -"
+	TCODE	tDepthReset,		"Reset a MOD:"
+	TCODE	tSetup_GasMix,		"Cambia Miscela"
+	TCODE	tCCRMode,			"Modo CCR:"				; CCR Mode:
+	TCODE	tCCRModeFixedSP,	"SP Fissi"				; Fixed SP
+	TCODE	tCCRModeSensor,		"Sensori"				; Sensor
+	TCODE	tCCRModeAutoSP,		"SP Auto"				; Auto SP
+	TCODE	tSP,				"SP"					; SP (SetPoint)
+	TCODE	tSPPlus,			"ppO2+"					; pO2+
+	TCODE	tSensorFallback,	"Fallback:"				; Fallback:
+	TCODE	tCalculated,		"calcolato"				; calculated
+	TCODE	tppO2,				"ppO2:"					; ppO2:
+	TCODE	tppO2O2,			"ppO2(O2)"				; ppO2(O2)
+	TCODE	tppO2Dil,			"ppO2(Dil)"				; ppO2(Dil)
+	TCODE	tppO2Mix,			"ppO2(Mix)"				; ppO2(Mix)
+
 ; New battery menu
-	TCODE   tNewBattTitle,      "Nuova Batteria?"
-	TCODE	tNewBattOld,		"Mantieni vecchia"
+	TCODE	tNewBattTitle,		"Nuova Batteria?"
+	TCODE	tNewBattOld,		"Mantieni vecchio"
 	TCODE	tNewBattNew36,		"Nuova 3,6V Saft (T1)"
 	TCODE	tNewBattNew15,		"Nuova 1,5V AA   (T0)"
 	TCODE	tNewBattAccu,		"3,6V AA ricaric.(T2)"
-	TCODE	tNew18650,		"Internal 18650  (T3)"
-	TCODE	tNew16650,		"Internal 16650  (T4)"
+	TCODE	tNew18650,			"Internal 18650  (T3)"
+	TCODE	tNew16650,			"Internal 16650  (T4)"
 
 ; Gaslist management
-    TCODE   tGas,       "Gas"           ; Gas
-    TCODE   tGasErr,    "Err"           ; Err  (3 chars)
+	TCODE	tGas,				"Gas"					; Gas
+	TCODE	tDil,				"Dil"					; Diluent
+	TCODE	tGasErr,			"Err"					; Err (3 chars)
 
 ; Communication Menu
-	TCODE	tUsbTitle,	"Modalita' USB"
-    TCODE   tBleTitle,  "Modalita' Bluetooth"
-	TCODE	tUsbStarting,  "Avvio..."
-	TCODE	tUsbStartDone, "Fatto."
-	TCODE	tUsbServiceMode, "Modo Servizio abil"
-	TCODE	tUsbClosed,		"Porta chiusa"
-	TCODE	tUsbExit,		"Uscita"
-	TCODE	tUsbDownloadMode, "Modo Download abil"
-    TCODE   tUsbLlBld,      "Livello-basso Bootloader"
+	TCODE	tUsbTitle,			"Modalita' USB"
+	TCODE	tBleTitle,			"Modalita' Bluetooth"
+	TCODE	tUsbStarting,		"Avvio..."
+	TCODE	tUsbStartDone,		"Fatto."
+	TCODE	tUsbServiceMode,	"Modo Servizio abil"
+	TCODE	tUsbClosed,			"Porta chiusa"
+	TCODE	tUsbExit,			"Uscita"
+	TCODE	tUsbDownloadMode,	"Modo Download abil"
+	TCODE	tUsbLlBld,			"Livello-basso Bootloader"
 
 ; Dive Settings
-    TCODE   tDvMode,    "Tipo Tuffo:"
-    TCODE   tDvOC,      "OC"
-	TCODE	tDvCCR,		"CCR"
-    TCODE   tDvGauge,   "Gauge"
-    TCODE   tDvApnea,   "Apnea"
-    TCODE   tDvPSCR,	"pSCR"
-    TCODE   tDvCC,      "CC"
-    TCODE   tDkMode,    "Algorit.:ZH-L16"		;								## MODIFIED (memory)
-    TCODE   tZHL16,     " "						;								## MODIFIED (memory)
-    TCODE   tZHL16GF,   "+GF"					;								## MODIFIED (memory)
-    TCODE   tPPO2Max,   "ppO2 Max:"
-    TCODE   tPPO2DECO,	"ppO2 Deco:"
-    TCODE   tPPO2MIN,   "ppO2 Min:"
-	TCODE	tPPO2MINCC, 	"Loop Min:"			; 								## NEW ppO2 min cc
-    TCODE   tLastDecostop, "Ultima Deco:"
-    TCODE   tDecoparameters, "Parametri Deco"
-    TCODE   tGF_low,    "GF Basso:"
-    TCODE   tGF_high,   "GF Alto:"
-    TCODE   tSaturationMult,    "Saturazione:"
-    TCODE   tDesaturationMult,  "Desaturazione:"
-    TCODE   tFTTSMenu,  "fTTS/fB/O:"            ; Future TTS
-    TCODE   taGFMenu,   "GF Alternativo"         ; Alternative GF
-    TCODE   taGF_low,   "aGF Basso:"               ; aGF low
-    TCODE   taGF_high,  "aGF Alto:"              ; aGF high
-    TCODE   taGF_enable,"aGF Selezionabile:"        ; aGF Selectable
-    TCODE   tDiveaGF_active,"aGF!"          ; aGF!
-    TCODE   tppO2settings,"Menu ppO2"        ; ppO2 Settings (max. 18 chars)
-    TCODE   tsafetystopmenu,"Tappa Sicurezza:"       ; Safety Stop: (max. 16 chars)
-	TCODE   tGasUsage,  	"Util.Gas"         ; Gas Usage
-    TCODE   tSetBotUse, 	"Gas Fondo: "      ; Bottom Gas: (space)
-    TCODE   tSetDecoUse,	"Gas Deco : "      ; Deco   Gas: (space)			## MODIFIED (layout)
-	TCODE	tCalcAscGas,	 "Calc.Gas (B/O):"	;								## NEW bailout gas needs
-	TCODE	tTankSizes,		 "Capac. Bombola"		;								## NEW bailout gas needs
-	TCODE   tLiter,			 " l"				;								## NEW bailout gas needs 
-	TCODE	tBarLiter,		"Litri"
-	TCODE	tTankFillPress,	 "Press. Bombola";								## NEW bailout gas needs
-	TCODE	tGas1,			 "Gas 1:"			;								## NEW bailout gas needs
-	TCODE	tGas2,			 "Gas 2:"			;								## NEW bailout gas needs
-	TCODE	tGas3,			 "Gas 3:"			;								## NEW bailout gas needs
-	TCODE	tGas4,			 "Gas 4:"			;								## NEW bailout gas needs
-	TCODE	tGas5,			 "Gas 5:"			;								## NEW bailout gas needs
-	TCODE	tCCmaxFracO2,	 "%O2 max Loop:"	;								## NEW CCR max ppO2 limiter
-	TCODE	t2ndDecoPlanMenu,"2o Piano Deco"	;								## NEW deco engine
+	TCODE	tDvMode,			"Tipo Tuffo:"
+	TCODE	tDvOC,				"OC"
+	TCODE	tDvCCR,				"CCR"
+	TCODE	tDvGauge,			"Gauge"
+	TCODE	tDvApnea,			"Apnea"
+	TCODE	tDvPSCR,			"pSCR"
+	TCODE	tDvCC,				"CC"
+	TCODE	tDkMode,			"Algorit.: ZH-L16"
+	TCODE	tZHL16,				" "
+	TCODE	tZHL16GF,			"+GF"
+	TCODE	tPPO2Max,			"ppO2 Max :"
+	TCODE	tPPO2DECO,			"ppO2 Deco:"
+	TCODE	tPPO2MIN,			"ppO2 Min :"
+	TCODE	tPPO2MINCC,			"Loop Min :"
+	TCODE	tLastDecostop,		"Ultima Deco : "
+	TCODE	tAscentSpeed,		"Ascent Speed: "		; Ascent Speed							## pending translation
+	TCODE	tGasChangeTime,		"Gas Change  :+"		; additional Gas Change Time			## pending translation
+	TCODE	tDecoparameters,	"Parametri Deco"
+	TCODE	tGF_low,			"GF  Basso:"
+	TCODE	tGF_high,			"GF  Alto :"
+	TCODE	tSaturationMult,	"Saturazione  : "
+	TCODE	tDesaturationMult,	"Desaturazione: "
+	TCODE	tFTTSMenu,			"TTS Futuro:"			; Future TTS
+	TCODE	tLastDecostopSurf,	"Ultima Deco:"			; last deco stop surface custom view
+	TCODE	tGFMenu,			"Menu GF"				; GF Settings
+	TCODE	taGF_low,			"aGF Basso:"			; aGF low
+	TCODE	taGF_high,			"aGF Alto :"			; aGF high
+	TCODE	taGF_enable,		"aGF Selezionabile:"	; aGF Selectable
+	TCODE	tDiveaGF_active,	"using aGF"				; using aGF								## pending translation
+	TCODE	tppO2settings,		"Menu ppO2"				; ppO2 Settings (max. 18 chars)
+	TCODE	tsafetystopmenu,	"Tappa Sicurezza:"		; Safety Stop: (max. 16 chars)
+	TCODE	tGasUsage,			"Utilizzo Gas"			; Gas Usage
+	TCODE	tSetBotUse,			"Gas Fondo: "			; Bottom Gas: (space)
+	TCODE	tSetDecoUse,		"Gas Deco : "			; Deco   Gas: (space)
+	TCODE	tCalcAscGas,		"Calc.Gas (B/O):"		;
+	TCODE	tSetup_Tank,		"Imposta Bombola"		; Setup Tank
+	TCODE	tTankSize,			"Capac. Bombola"		; Tank Size
+	TCODE	tTankUsablePress,	"Press. Necess. Asc."	; Tank Press Budget for Ascent (turn pressure)	## pending translation
+	TCODE	tCopyDilToOC,		"Copy Dil->OC"			; copy diluent settings to OC gas		## pending translation
+	TCODE	tTankPairing,		"Cambia Transmitter"	; select Transmitter					## pending translation
+	TCODE	tLiter,				" l"					;
+	TCODE	tLiterLong,			"Litri"					;
+	TCODE	tCCmaxFracO2,		"%O2 max Loop:"			;
+	TCODE	t2ndDecoPlanMenu,	"2o Piano Deco"			; 2nd Deco Plan
+
+ IFDEF _rx_functions
+	TCODE	tTrModeOff,			"off"					; off									## pending translation
+	TCODE	tTrModeOn,			"on"					; on									## pending translation
+	TCODE	tTrModeIndDouble,	"indep.Double"			; independent double					## pending translation
+	TCODE	tTrModeCCR,			"CCR Dil+O2"			; CCR diluent and O2
+	TCODE	tTrPresNone,		"none"					; none  (big enum group follows)		## pending translation
+	TCODE	tTrPresGas1,		"Gas 1"					; Gas 1
+	TCODE	tTrPresGas2,		"Gas 2"					; Gas 2
+	TCODE	tTrPresGas3,		"Gas 3"					; Gas 3
+	TCODE	tTrPresGas4,		"Gas 4"					; Gas 4
+	TCODE	tTrPresGas5,		"Gas 5"					; Gas 5
+	TCODE	tTrPresDil1,		"Dil 1"					; Dil 1
+	TCODE	tTrPresDil2,		"Dil 2"					; Dil 2
+	TCODE	tTrPresDil3,		"Dil 3"					; Dil 3
+	TCODE	tTrPresDil4,		"Dil 4"					; Dil 4
+	TCODE	tTrPresDil5,		"Dil 5"					; Dil 5
+	TCODE	tTrPresFirstGas,	"First Gas"				; first  Gas							## pending translation
+	TCODE	tTrPresActiveGas,	"active Gas"			; active Gas							## pending translation
+	TCODE	tTrPresFirstDil,	"First Dil"				; first  Dil							## pending translation
+	TCODE	tTrPresActiveDil,	"active Dil"			; active Dil							## pending translation
+ ELSE
+ 	TCODE	tTrModeOff,			""						; dummy target for entry in option table
+	TCODE	tTrPresNone,		""						; dummy target for entry in option table
+ ENDIF
 
 ; Display Settings
-    TCODE   tBright,    "Luminosita':"
-    TCODE   tEco,       "Eco"
-    TCODE   tMedium,    "Media"
-    TCODE   tHigh,      "Alta"
-    TCODE   tDvSalinity,"Salinita':"            ; Salinity
-	TCODE   tShowppO2,  "ppO2 Permanente:"     ; Always show ppO2:
-    TCODE   tFlip,      "Ruota schermo:"      ; Rotate Screen
-    TCODE   tMODwarning,"Avvertimento MOD:"          ; MOD warning
-	TCODE	tIBCDwarning,	"Avvertimento IBCD:"	; IBCD Warning					## NEW IBCD
-    TCODE   tTimeoutDive,"Timeout Immsni:"	; Dive Timeout
+	TCODE	tBright,			"Luminosita':"
+	TCODE	tEco,				"Eco"
+	TCODE	tMedium,			"Media"
+	TCODE	tHigh,				"Alta"
+	TCODE	tDvSalinity,		"Salinita': "			; Salinity
+	TCODE	tShowppO2,			"ppO2 Permanente:"		; Always show ppO2:
+	TCODE	tFlip,				"Ruota schermo:"		; Rotate Screen
+	TCODE	tMODwarning,		"Avvertimento MOD:"		; MOD warning
+	TCODE	tIBCDwarning,		"Avvertimento IBCD:"	; IBCD Warning
+	TCODE	t2ndDepth,			"2.Prof.:"				; 2nd depth display content (10 chars max)
+	TCODE	tTimeoutDive,		"Timeout Immsni:"		; Dive Timeout
 
 ; VSI display Settings
-    TCODE   tVSItext2,  "Velox Variabile:"     ; Variable speed:
-    TCODE   tVSIgraph,  "Grafico Velocita':"        ; Speed graph:
+	TCODE	tVSItext2,			"Velox Variabile:"		; Variable speed:
+	TCODE	tVSIgraph,			"Grafico Velocita':"	; Speed graph:
 
 ; Setup Menu
-    TCODE   tSystSets,  "Impostazioni"
-    TCODE   tLanguage,  "Lingua:"
-    TCODE   tEnglish,   "Inglese"
-    TCODE   tGerman,    "Tedesco"
-    TCODE   tFrench,    "Francese"
-    TCODE   tItalian,   "Italiano"
-    TCODE   tCompassMenu,"Calibra Bussola"  ; Compass calibration
-    TCODE   tCompassGain,"Suscettibilita:"  ; Compass gain:
-    TCODE   tCalX,	 "Cal X:"		; Cal X
-    TCODE   tCalY,	 "Cal Y:"		; Cal Y
-    TCODE   tCalZ,	 "Cal Z:"		; Cal Z
-
-    TCODE   tUnits,     "Unita':"
-    TCODE   tMetric,     " m/°C"            ; Enum menu
-    TCODE   tImperial,   "ft/°F"
-
-    TCODE   tDefName,   "HW OSTC"
-
-    TCODE   tButtonleft,"Bottone Sx:"      ; Left button
-    TCODE   tButtonright,"Bottone Dx:"    ; Right button
+	TCODE	tSystSets,			"Impostazioni"
+	TCODE	tCompassMenu,		"Calibra Bussola"		; Compass calibration
+	TCODE	tCompassGain,		"Suscettibilita:"		; Compass gain:
+	TCODE	tCalX,				"Cal X:"				; Cal X
+	TCODE	tCalY,				"Cal Y:"				; Cal Y
+	TCODE	tCalZ,				"Cal Z:"				; Cal Z
+	TCODE	tUnits,				"Unita':"
+	TCODE	tMetric,			" m/°C"					; Enum menu
+	TCODE	tImperial,			"ft/°F"
+	TCODE	tDefName,			"HW OSTC"
+	TCODE	tButtonleft,		"Bottone Sx:"			; Left button
+	TCODE	tButtonright,		"Bottone Dx:"			; Right button
+	TCODE	tAltMode,			"Attesa   :"			; Waiting Time
+	TCODE	tAltModeFly,		"Volo"					; Flying
+	TCODE	tAltMode1000,		"1000m"					;
+	TCODE	tAltMode2000,		"2000m"					;
+	TCODE	tAltMode3000,		"3000m"					;
 
-	TCODE	tAltMode,		"Attesa:"		;								## NEW no fly altitude
-	TCODE	tAltModeFly,	"Volo"			;								## NEW no fly altitude
-	TCODE	tAltMode1000,	"1000m"				;								## NEW no fly altitude
-	TCODE	tAltMode2000,	"2000m"				;								## NEW no fly altitude
-	TCODE	tAltMode3000,	"3000m"				;								## NEW no fly altitude
-	
 ; Units for all menu
-    TCODE   tMeters,    "m"
-	TCODE	tFeets,		"ft"
-	TCODE	tFeets1,	"f"
-    TCODE   tMinutes,   "'"
-    TCODE   tPercent,   "%"
-    TCODE   tLitersMinute, "l/min"
-	TCODE	tbar,		"bar"					; bar
-	TCODE	tbar10,		"0 bar"					; bar							## NEW 2.95
-	TCODE	tMeterMinute, "m/min"				; meter per minute				## NEW ascent speed
-	TCODE	tmin,		"min"					; minutes
-	
+	TCODE	tMeters,			"m"
+	TCODE	tFeets,				"ft"
+	TCODE	tFeets1,			"f"
+	TCODE	tMinutes,			"'"
+	TCODE	tPercent,			"%"
+	TCODE	tLitersMinute,		"l/min"
+	TCODE	tbar,				"bar"					; bar
+	TCODE	tbar10,				"0 bar"					; xx0 bar
+	TCODE	tMeterMinute,		"m/'"					; meter per minute
+
 ; Date
-	TCODE	tDateFormat, "Data:"
-	TCODE	tDateformat, "MMGGAA"
-	TCODE	tDateformat1,"GGMMAA"
-	TCODE	tDateformat2,"AAMMGG"
+	TCODE	tDateFormat,		"Data: "
+	TCODE	tDateformat,		"MMGGAA"
+	TCODE	tDateformat1,		"GGMMAA"
+	TCODE	tDateformat2,		"AAMMGG"
 
 ; Simulator menu
-    TCODE   tInter, 	"Avvia Simulatore"     ; Start Simulator
-    TCODE   tPlan,  	"Simulatore"           ; Simulator
+	TCODE	tInter,				"Avvia Simulatore"		; Start Simulator
+	TCODE	tPlan,				"Simulatore"			; Simulator
 
 ; Decoplanner submenu
-    TCODE   tBtTm,  	"Tempo Fondo :"        ; Bot. Time: (10 chars)
-    TCODE   tBtTm_short,"Tempo:"               ; Bot. Time: (max. 6 chars)
-    TCODE   tBtDep, 	"Profond. Max:"        ; Max Depth: (10 chars)
-    TCODE   tIntvl, 	"Int.Superf. :"        ; Interval : (10 chars)
-	TCODE	tDecoSetup,	"Setta Calcoli"	;									## NEW (layout)
-    TCODE   tDeco,  	"Calcola Deco"         ; Calculate Deco
-    TCODE   tDivePlan,  "Pianificat:"          ; Dive Plan:
-    TCODE   tNoDeco,    "No Deco"              ; No Deco
-    TCODE   tMore,      "Dettagli.."           ; More...
-	TCODE	tSelectSetpoint,"Setpoint CCR: "	;								## NEW deco calculator enhancement
-	TCODE	tuseAGF,		"usa aGF: "			;								## NEW deco calculator enhancement
-	TCODE	tCalculating,	"Calcolando..."	;								## NEW deco calculator enhancement
+	TCODE	tBtTm,				"Tempo Fondo :"			; Bot. Time: (10 chars)
+	TCODE	tBtTm_short,		"Tempo:"				; Bot. Time: (max. 6 chars)
+	TCODE	tBtDep,				"Profond. Max:"			; Max Depth: (10 chars)
+	TCODE	tIntvl,				"Int.Superf. :"			; Interval : (10 chars)
+	TCODE	tDecoSetup,			"Setta Calcoli"			; Deco Setup
+	TCODE	tDeco,				"Calcola Deco"			; Calculate Deco
+	TCODE	tDivePlan,			"Pianificat:"			; Dive Plan:
+	TCODE	tNoDeco,			"No Deco"				; No Deco
+	TCODE	tMore,				"Dettagli"				; More
+	TCODE	tSelectSetpoint,	"Setpoint CCR: "		;
+	TCODE	tuseAGF,			"usa aGF     : "		; use aGF
+	TCODE	tCalculating,		"Calcolando..."			; calculating...
+	TCODE	tNDLleft,			"left"					; time left within NDL					## pending translation
 
 ; Information menu
-    TCODE   tFirmware,  "Firmware: "        ; Firmware: (space)
-    TCODE   tSerial,    "Seriale : "        ; Serial  : (space)
-	TCODE	tTotalDives,"Tot Immersioni:"		; Total Dives:
-    TCODE   tBatteryV,  "Batteria: "        ; Battery:
-    TCODE   tUptime,	"Uptime: "	    ; Uptime: 
+	TCODE	tFirmware,			"Firmware: "			; Firmware: (space)
+	TCODE	tFirmware_rx,		"RX Ver  : "			; RX Ver  : (space)
+	TCODE	tSerial,			"Seriale : "			; Serial  : (space)
+	TCODE	tTotalDives,		"Tot Immersioni:"		; Total Dives:
+	TCODE	tBatteryV,			"Batteria: "			; Battery:
+	TCODE	tUptime,			"Uptime: "				; Uptime: 
 
 ; Divemode screen
-    TCODE   tNDL,       "NDL"
-    TCODE   tTTS,   	"TTS"
-	TCODE	tVelMetric,	 "m/min"
-	TCODE	tVelImperial,"ft/m "
-	TCODE	tGasSelect,  "Selez. Gas"       ; Select Gas
-	TCODE	tSelectAir,	 "Aria"     		; Air
-	TCODE	tSelectO2,	 "O2  "           	; O2
-    TCODE   tSelectNx,   "Nx"               ; Nx
-    TCODE   tSelectTx,   "Tx"               ; Tx
-    TCODE   tDepth,      "Prof."            ; Depth
-    TCODE   tMaxDepth,   "Prof. Max"        ; Max. Depth - max 10chars!
-    TCODE   tDivetime,   "Divetime"         ; Divetime
-    TCODE   tDiveHudMask1,  "Sensore 1"
-    TCODE   tDiveHudMask2,  "Sensore 2"
-    TCODE   tDiveHudMask3,  "Sensore 3"
-    TCODE   tDiveTotalAvg,  "Media"
-    TCODE   tDiveStopwatch, "Cronometro"
-    TCODE   tDiveStopAvg,   "Media Inter"   ; 11chars max
-    TCODE   tApnoeTotal,    "Totale"        ; Total (Six chars, right alligned)
-    TCODE   tApnoeMax,      "Ultima Discesa"  ; Last descend
-    TCODE   tApnoeSurface,  "Tempo Superficie"  ; Surface Time
-    TCODE   tDiveDecoplan,  "Piano Deco"      ; Decoplan
-    TCODE   tDiveClock,     "Orologio"         ; Clock
-    TCODE   tDiveEAD_END,   "EAD/END"       ; EAD/END
-    TCODE   tDiveTissues,   "Tessuti"       ; Tissues
-    TCODE   tEND,           "END:"          ; END:
-    TCODE   tHe,            "He"            ; He
-    TCODE   tN2,            "N2"            ; N2
-    TCODE   tDiveBailout,   "Bailout"       ; Bailout
-    TCODE   tGFactors,      "Valori GF"     ; GF Values
-    TCODE   taGFactors,     "Valori aGF"    ; aGF Values
-    TCODE   tGFInfo,        "Info GF"       ; GF Info
-    TCODE   tCeiling,       "Tetto"       ; Ceiling
-    TCODE   tDiveSafetyStop,"Stop"			; Stop (Four chars, right alligned)
-    TCODE   tDiveFallback,  "Fallback!"     ; Fallback! (max. nine chars)
-	TCODE	tDecoInfo,		"Zona Deco"		; Deco info
-    TCODE   tSensorCheck,   "Testa Sensori"  ; Sensor Check
-    TCODE   tdil,	    "Dil:"	    ; Diluent ppO2 Warning
-	TCODE	tmix,			"Mix:"			; Pre-Mix ppO2 Warning
-    TCODE   tSensorDisagree,"Sensori<>"	    ; Sensors disagree Warning		## NEW voting logic
-    TCODE   tGasNeedsWarn,  "Gas Neces"	    ;					## NEW bailout gas needs
-    TCODE   tGasNeedsBar,   "Gas Necess. (bar)"	;				## NEW bailout gas needs
-    TCODE   tCNSsurf,	    "CNS Surf."	    ;					## NEW CNS at end-of-dive
-    TCODE   tCNSfTTS,	    "CNS fTTS"	    ;					## NEW CNS at end-of-dive
-    TCODE   tCNSBO,	    	"CNS B/O"	    ;					## NEW CNS at end-of-dive
-    TCODE   tCNSnow,	    "CNS ora"	    ;					## NEW CNS at end-of-dive
-    TCODE   tCNSeod,	    "CNS finale"	    ;					## NEW CNS at end-of-dive
-    TCODE   tIBCD,	    	"IBCD N2He"	    ;					## NEW IBCD
-    TCODE   tMicroBubbles,  "M.Bolle"	    ;					## NEW microbubbles
-	TCODE	tCNS,			"CNS: "			;					## V2.95 optics
-	
+	TCODE	tNDL,				"NDL"					; 3 chars max
+	TCODE	tTTS,				"TTS"
+	TCODE	tVelMetric,			"m/min"
+	TCODE	tVelImperial,		"ft/m "
+	TCODE	tGasSelect,			"Selez. Gas"			; Select Gas
+	TCODE	tSelectAir,			"Aria"					; Air
+	TCODE	tSelectO2,			"O2  "					; O2
+	TCODE	tSelectNx,			"Nx"					; Nx
+	TCODE	tSelectTx,			"Tx"					; Tx
+	TCODE	tDepth,				"Prof."					; Depth
+	TCODE	tMaxDepth,			"Prof. Max"				; Max. Depth    - max 10chars!
+	TCODE	tAvgDepth,			"Prof. Med."			; average Depth - max 10chars!
+	TCODE	tDivetime,			"Divetime"				; Divetime
+	TCODE	tDiveHudMask1,		"Sensore1"
+	TCODE	tDiveHudMask2,		"Sensore2"
+	TCODE	tDiveHudMask3,		"Sensore3"
+	TCODE	tDiveTotalAvg,		"Media"
+	TCODE	tDiveStopwatch,		"Cronometro"
+	TCODE	tDiveStopAvg,		"Media Inter"			; 11 chars max
+	TCODE	tApnoeTotal,		"Totale"				; Total (six chars, right aligned)
+	TCODE	tApnoeMax,			"Ultima Discesa"		; Last descend
+	TCODE	tApnoeSurface,		"Tempo Superficie"		; Surface Time
+	TCODE	tTime,				"Time"					; Time							## pending translation
+	TCODE	tSurface,			"Surface"				; Surface (max 12 chars)		## pending translation
+	TCODE	tDiveDecoplan,		"Piano Deco"			; Decoplan
+;	TCODE	tDiveClock,			"Orologio"				; Clock
+	TCODE	tDiveEAD_END,		"EAD/END"				; EAD/END
+	TCODE	tDiveTissues,		"Tessuti"				; Tissues
+	TCODE	tEND,				"END:"					; END:
+	TCODE	tHe,				"He"					; He
+	TCODE	tN2,				"N2"					; N2
+	TCODE	tDiveBailout,		"Bailout"				; Bailout
+	TCODE	tGFactors,			"Valori GF"				; GF Values
+	TCODE	taGFactors,			"Valori aGF"			; aGF Values
+	TCODE	tGFInfo,			"Info GF"				; GF Info
+	TCODE	tCeiling,			"Tetto"					; Ceiling
+	TCODE	tDiveSafetyStop,	"Stop"					; Stop (four chars, right aligned)
+	TCODE	tDiveFallback,		"Fallback!"				; Fallback! (max. nine chars)
+	TCODE	tDecoInfo,			"Zona Deco"				; Deco info
+	TCODE	tSensorCheck,		"Testa Sensori"			; Sensor Check
+	TCODE	tdil,				"Dil:"					; Diluent ppO2 Warning
+	TCODE	tmix,				"Mix:"					; Pre-Mix ppO2 Warning
+	TCODE	tSensorDisagree,	"Sensori<>"				; Sensors disagree Warning
+	TCODE	tGasNeedsWarn,		"Gas Neces"				;
+	TCODE	tGasNeedsAscent,	"Gas Necess. Ascent"	;								## pending translation
+	TCODE	tCNSsurf,			"CNS Surf."				;
+	TCODE	tCNSfTTS,			"CNS fTTS"				;
+	TCODE	tCNSBO,				"CNS B/O"				;
+	TCODE	tCNSnow,			"CNS ora"				;
+	TCODE	tCNSeod,			"CNS finale"			;
+	TCODE	tIBCD,				"IBCD N2He"				;
+	TCODE	tnoBOgas,			"-B/O-Gas-"				;
+	TCODE	tMicroBubbles,		"M.Bolle"				;
+	TCODE	tCNS,				"CNS: "					;
+	TCODE	tgaschange,			"Change?"				; better gas found				## pending translation
+	TCODE	tNeed,				"Need "					; gas need (5 chars)			## pending translation
+	TCODE	tBattery,			"Batteria"				; Battery
+ IFDEF _rx_functions
+	TCODE	tTransmitter,		"P.Transm."				; pressure transmitter			## pending translation
+	TCODE	tPressure,			"P.Bombola"				; tank pressure
+	TCODE	tSAC,				"SAC"					; SAC, must be 3 chars!
+	TCODE	tswap,				"Swap Tank"				; swap tank (max. 9 chars		## pending translation
+ ENDIF
+ IFDEF _cave_mode
+	TCODE	tGasNeedsCaveMode,	"Gas Necess. Cave Mode"	; title for gas needs custom view
+	TCODE	tDiveTurned,		"Dv.turned"				; dive is turned      (max. 9 char)	## pending translation
+	TCODE	tCaveMode,			"Cave Mode"				; cave mode activated (max. 9 char)
+	TCODE	tCaveModeShutdown,	"X-Cave-X"				; cave mode shut down (max. 9 char)
+ ENDIF
+
 ; Divemode menu
-    TCODE   tDivePreMenu,   "Menu?"         ; Menu?
-    TCODE   tSetHeading,    "Salva"        ; Bearing (Max. seven chars)
+	TCODE	tDivePreMenu,		"Menu?"					; Menu?
+	TCODE	tSetHeading,		"Salva"					; Bearing (max. 6 chars)
 
 ; Simulator menu
-	TCODE	tQuitSim,	 "Esci"            ; Quit Simulation?
+	TCODE	tQuitSim,			"Esci"					; Quit Simulation
 
 ; Logbook
-	TCODE	tCNS2,		"CNS:"
-	TCODE	tAVG,		"Media:"
-	TCODE	tGF,		"GF:"
-	TCODE	tSAT,		"Sat:"					; Sat:
+	TCODE	tCNS2,				"CNS:"
+	TCODE	tAVG,				"Media:"
+	TCODE	tGF,				"GF:"
+	TCODE	tSAT,				"Sat:"
 
 ; Logbook units
-	TCODE	tLogTunitC,	"°C"
-	TCODE	tLogTunitF,	"°F"
-	TCODE	tKGL,		"kg/l"
-	TCODE	tMBAR,		"mbar"
+	TCODE	tLogTunitC,			"°C"
+	TCODE	tLogTunitF,			"°F"
+	TCODE	tKGL,				"kg/l"
+	TCODE	tMBAR,				"hPa"
 
 ; Logbook menu
-	TCODE	tNextLog, 	"Pagina Seguente"
+	TCODE	tNextLog,			"Pagina Seguente"
 
 ; Reset menu
-	TCODE	tReboot,	"Riavvio"			;Reboot
-	TCODE	tResetMenu2,"Sei sicuro?"		;Are you sure?
-	TCODE	tAbort,     "Annulla"             ;Abort
-	TCODE	tResetSettings, "Azzera Tutto" 	;Reset all
-	TCODE	tResetDeco,	"Azzera Deco"		;Reset Deco
-    TCODE	tResetBattery,	"Azzera Batteria"		;Reset Battery
-    TCODE	tResetLogbook,	"Azzera Logbook"		;Reset Logbook
+	TCODE	tReboot,			"Riavvio"				; Reboot
+	TCODE	tResetMenu2,		"Sei sicuro?"			; Are you sure?
+	TCODE	tAbort,				"Annulla"				; Abort
+	TCODE	tResetSettings,		"Azzera Settings"		; Reset all				## pending translation
+	TCODE	tResetDeco,			"Azzera Deco"			; Reset Deco
+	TCODE	tResetBattery,		"Azzera Batteria"		; Reset Battery
+	TCODE	tResetLogbook,		"Azzera Logbook"		; Reset Logbook
 
 ; Set Time Menu/Set Date Menu
-	TCODE	tSetHours,	"Imposta Ora"			; Set Hours
-	TCODE	tSetMinutes,"Imposta Minuti"		; Set Minutes
-	TCODE	tSetSeconds,"Azzera Secondi"		; Clear seconds
-	TCODE	tSetDay,	"Imp Giorno"			; Set Day
-	TCODE	tSetMonth,	"Imp Mese"			; Set Month
-	TCODE	tSetYear,	"Imp Anno"			; Set Year
+	TCODE	tSetHours,			"Imposta Ora"			; Set Hours
+	TCODE	tSetMinutes,		"Imposta Minuti"		; Set Minutes
+	TCODE	tSetSeconds,		"Azzera Secondi"		; Clear seconds
+	TCODE	tSetDay,			"Imp Giorno"			; Set Day
+	TCODE	tSetMonth,			"Imp Mese"				; Set Month
+	TCODE	tSetYear,			"Imp Anno"				; Set Year
 
 ; Logbook Offset Menu
-	TCODE	tLogOffset, "Devia Logbook"	; Logbook offset
-	TCODE	tLogOffsetp1,	"+1"				; +1
-	TCODE	tLogOffsetp10,	"+10"				; +10
-	TCODE	tLogOffsetm1,	"-1"				; -1
-	TCODE	tLogOffsetm10,	"-10"				; -10
+	TCODE	tLogOffset,			"Devia Logbook"			; Logbook offset
+	TCODE	tLogOffsetp1,		"+1"					; +1
+	TCODE	tLogOffsetp10,		"+10"					; +10
+	TCODE	tLogOffsetm1,		"-1"					; -1
+	TCODE	tLogOffsetm10,		"-10"					; -10
 
 ; Compass directions
-    TCODE   tN,             "N "                ; N(orth),338°-22°
-    TCODE   tNE,            "NE"                ; North-East,23°-67°
-    TCODE   tE,             "E "                ; E(east),68°-112°
-    TCODE   tSE,            "SE"                ; South-East,113°-157°
-    TCODE   tS,             "S "                ; S(outh),157°-202°
-    TCODE   tSW,            "SO"                ; South-West,203°-247°
-    TCODE   tW,             "O "                ; W(West),248°-292°
-    TCODE   tNW,            "NO"                ; North-West,293°-337°
+	TCODE	tN,					"N "					; N(orth),    338°-22°
+	TCODE	tNE,				"NE"					; North-East,  23°-67°
+	TCODE	tE,					"E "					; E(east),     68°-112°
+	TCODE	tSE,				"SE"					; South-East, 113°-157°
+	TCODE	tS,					"S "					; S(outh),    157°-202°
+	TCODE	tSW,				"SO"					; South-West, 203°-247°
+	TCODE	tW,					"O "					; W(West),    248°-292°
+	TCODE	tNW,				"NO"					; North-West, 293°-337°
 
 ; Color Scheme menu
-    TCODE   tColorScheme,   "Schema colori"  ; Colour scheme
-    TCODE   tColorSetDive,  "Immersione:"       ; Divemode:
-    TCODE   tColorSetName0, "Standard"          ; Standard
-    TCODE   tColorSetName1, "Rosso"             ; Red
-    TCODE   tColorSetName2, "Verde"             ; Green
-    TCODE   tColorSetName3, "Blu"               ; Blue
+	TCODE	tColorScheme,		"Schema colori"			; Colour scheme
+	TCODE	tColorSetDive,		"Immersione:"			; Divemode:
+	TCODE	tColorSetName0,		"Standard"				; Standard
+	TCODE	tColorSetName1,		"Rosso"					; Red
+	TCODE	tColorSetName2,		"Verde"					; Green
+	TCODE	tColorSetName3,		"Blu"					; Blue
+
+	; PSCR Menu and Settings
+	TCODE	tPSCRMenu,			"Menu pSCR"				; pSCR Menu
+	TCODE	tPSCR_O2_drop,		"O2 Drop    "			; O2 drop
+	TCODE	tPSCR_lungratio,	"Lung Ratio "			; lung ratio
+	TCODE	tBackToLoop,		"goto loop"				; back to loop (10 chars max)	### new
+
+
+; Language selection
+ IF _language_2!=none
+	TCODE	tLanguage,			"Lingua: "				; used in menu_tree
+ ENDIF
 
-    ; PSCR Menu and Settings
-    TCODE   tPSCRMenu,	    "Menu PSCR"		; PSCR Menu
-    TCODE   tPSCR_O2_drop,  "O2 drop:"		; O2 drop
-    TCODE   tPSCR_lungratio,"Lung ratio:"	; lung ratio
+ IF _language_1==en
+	TCODE	tLang1,				"Inglese"				; tLang1 is 1st language, enum context
+ ELSE
+ IF _language_1==de
+	TCODE	tLang1,				"Tedesco"
+ ELSE
+ IF _language_1==fr
+	TCODE	tLang1,				"Francese"
+ ELSE
+ IF _language_1==it
+	TCODE	tLang1,				"Italiano"
+ ELSE
+	TCODE	tLang1,				""						; dummy target for options table
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+ IF _language_2==en
+	TCODE	tLang2,				"Inglese"				; tLang2 is 2nd language, enum context
+ ELSE
+ IF _language_2==de
+	TCODE	tLang2,				"Tedesco"
+ ELSE
+ IF _language_2==fr
+	TCODE	tLang2,				"Francese"
+ ELSE
+ IF _language_2==it
+	TCODE	tLang2,				"Italiano"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
--- a/src/text_multilang.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_multilang.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,93 +1,140 @@
 ;=============================================================================
 ;
-;   File text_multilang.asm								Version 2.92 = 2.26
+;   File text_multilang.asm												V2.99c
 ;
 ;   Implementation text in various selectable languages.
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;  2011-06-12 : [jDG] Creation...
+;  2011-06-12 : [jDG] Creation
 
+#include "hwos.inc"
 #include "text_multilang.inc"
-#include "hwos.inc"	    
 
-; Because text are indexed by 12bits value in FSR register, they can't
-; just be anywhere. It is safe to make them start in address 0xHHH000.
-texts       code    0x009000
+; Because text are indexed by 12 bits values in FSR register, they can't
+; just be anywhere. It is safe to make them start at address 0xHHH000.
+texts	code	0x009000
 
 ;=============================================================================
-            global  text_1_base
+	global	text_1_base
 text_1_base:
-    IFNDEF	    french_italian
-	MESSG "hwOS code in English and German!"
 ;---- PASS 1 : generate description block ------------------------------------
-tcode_idx   set     0
-LANG        set     0
-#define     TCODE TCODE_1
-#include    "text_english.inc"
-#undefine   TCODE
+tcode_idx	set		0
+LANG		set		0
+#define		TCODE	TCODE_1
 
-;---- PASS 2 : generate text contens -----------------------------------------
-tcode_idx   set     0
-#define     TCODE TCODE_2
-#include    "text_english.inc"
-#undefine   TCODE
+ IF _language_1==en
+ MESSG		"1st Laguage: English"
+#include	"text_english.inc"
+ ELSE
+ IF _language_1==de
+ MESSG		"1st Laguage: German"
+#include	"text_german.inc"
+ ELSE
+ IF _language_1==fr
+ MESSG		"1st Laguage: French"
+#include	"text_french.inc"
+ ELSE
+ IF _language_1==it
+ MESSG		"1st Laguage: Italian"
+#include	"text_english.inc"
+ ELSE
+ MESSG		"1st Laguage: Default (English)"
+#include	"text_english.inc"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+#undefine	TCODE
+
+;---- PASS 2 : generate text contents ----------------------------------------
+tcode_idx	set		0
+#define		TCODE	TCODE_2
+
+ IF _language_1==en
+#include	"text_english.inc"
+ ELSE
+ IF _language_1==de
+#include	"text_german.inc"
+ ELSE
+ IF _language_1==fr
+#include	"text_french.inc"
+ ELSE
+ IF _language_1==it
+#include	"text_english.inc"
+ ELSE
+#include	"text_english.inc"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+#undefine	TCODE
 
 ;=============================================================================
 
+ IF _language_2!=none
 
-	global  text_2_base
+	global	text_2_base
 text_2_base:
-
 ;---- PASS 1 : generate description block ------------------------------------
-tcode_idx   set     0
-LANG        set     1
-#define     TCODE TCODE_1
-#include    "text_german.inc"
-#undefine   TCODE
+tcode_idx	set		0
+LANG		set		1
+#define		TCODE	TCODE_1
 
-;---- PASS 2 : generate text contens -----------------------------------------
-tcode_idx   set     0
-#define     TCODE TCODE_2
-#include    "text_german.inc"
-#undefine   TCODE
+ IF _language_2==en
+ MESSG		"2nd Laguage: English"
+#include	"text_english.inc"
+ ELSE
+ IF _language_2==de
+ MESSG		"2nd Laguage: German"
+#include	"text_german.inc"
+ ELSE
+ IF _language_2==fr
+ MESSG		"2nd Laguage: French"
+#include	"text_french.inc"
+ ELSE
+ IF _language_2==it
+ MESSG		"2nd Laguage: Italian"
+#include	"text_english.inc"
+ ELSE
+ MESSG		"2nd Laguage: Default (English)"
+#include	"text_english.inc"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+#undefine	TCODE
 
-	ELSE
-	MESSG "hwOS code in French and Italian!"
-;=============================================================================
-;---- PASS 1 : generate description block ------------------------------------
-tcode_idx   set     0
-LANG        set     0
-#define     TCODE TCODE_1
-#include    "text_french.inc"
-#undefine   TCODE
+;---- PASS 2 : generate text contents ----------------------------------------
+tcode_idx	set		0
+#define	TCODE	TCODE_2
 
-;---- PASS 2 : generate text contens -----------------------------------------
-tcode_idx   set     0
-#define     TCODE TCODE_2
-#include    "text_french.inc"
-#undefine   TCODE
+ IF _language_2==en
+#include	"text_english.inc"
+ ELSE
+ IF _language_2==de
+#include	"text_german.inc"
+ ELSE
+ IF _language_2==fr
+#include	"text_french.inc"
+ ELSE
+ IF _language_2==it
+#include	"text_english.inc"
+ ELSE
+#include	"text_english.inc"
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+#undefine	TCODE
+
+ ENDIF
 
 ;=============================================================================
-            global  text_2_base
-text_2_base:
 
-;---- PASS 1 : generate description block ------------------------------------
-tcode_idx   set     0
-LANG        set     1
-#define     TCODE TCODE_1
-#include    "text_italian.inc"
-#undefine   TCODE
-
-;---- PASS 2 : generate text contens -----------------------------------------
-tcode_idx   set     0
-#define     TCODE TCODE_2
-#include    "text_italian.inc"
-#undefine   TCODE
-
-    ENDIF
-   
-;=============================================================================
-
-        END
+	END
--- a/src/text_multilang.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/text_multilang.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -2,87 +2,86 @@
 ;
 ;    File text_multilang.inc
 ;
-;    Implementation text in various selectable languages.
+;    Implementation of texts in various selectable languages
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;  2011-06-12 : [jDG] Creation...
+;  2011-06-12 : [jDG] Creation
 ;
 ; Text definitions (text_french.asm example):
-;	TCODE	tYes,   "Oui"               ; Yes
-;   TCODE   tNo,    "Non"               ; No
-;   TCODE   tLogbk, "Carnet de plongées"  ; Logbook
+;	TCODE	tYes,	"Oui"					; Yes
+;	TCODE	tNo,	"Non"					; No
+;	TCODE	tLogbk,	"Carnet de plongées"	; Logbook
 ;
 ; Text direct usage:
-;   lfsr    FSR1,tYes                   ; Load a 12bit text index
-;   call    strcpy_text                 ; Copy to string buffer.
-;   PUTC    '/'
-;   lfsr    FSR1,tNo
-;   call    strcat_text_print           ; Append, and call word processor.
+;	lfsr	FSR1,tYes						; load a 12 bit text index
+;	call	strcpy_text						; copy to string buffer
+;	PUTC	'/'								; place a single character into the text buffer
+;	lfsr	FSR1,tNo
+;	call	strcat_text_print				; append next text and call word processor to output all text to the screen
 ;
 ; RATIONALS:
 ;  - The macro should define a label so that text files can be reordered
-;    to keep consistency while adding more option (and make translator life easier).
+;    to keep consistency while adding more options (and make translator life easier).
 ;
 ;  - The text positions is keept in menu blocks for the menu processor.
 ;
 ;  - library function take text number from the FSR1 register, because a
-;    lfsr instruction loads a 12bits constant at once.
+;    lfsr instruction loads a 12 bit constant at once.
 ;
 ;=============================================================================
-;
 
-; Pass 1: generate jump table, and define labels.
-TCODE_1 macro   label, text
-tcode_idx set   tcode_idx+1
-    If LANG == 0
-        global  label
+; Pass 1: generate a jump table and define labels
+TCODE_1 macro label, text
+tcode_idx set tcode_idx+1
+	If LANG == 0
+		global	label
 label:
-    Endif
-        dw      t#v(LANG)_#v(tcode_idx)
-        endm
+	Endif
+	dw		t#v(LANG)_#v(tcode_idx)
+	endm
 ;
-; Pass 2: generates string table.
-TCODE_2 macro   label, text
-tcode_idx set   tcode_idx+1
+; Pass 2: generates string table
+TCODE_2 macro label, text
+tcode_idx set tcode_idx+1
 t#v(LANG)_#v(tcode_idx):
-        db      text, 0
-        endm
+	db		text, 0
+	endm
 ;
 ;=============================================================================
-; strcpy_text : copy a multiling text into string buffer.
+; strcpy_text : copy a multiling text into string buffer
 ;
-; Input:   FSR1 :  text index
-; Output:  Buffer: filled with the text.
-;          FSR2:   pointer to end of copied text (the null char).
-; Trashed: WREG.
-        extern  strcpy_text
+; Input  : FSR1    text index
+; Output : Buffer  filled with the text
+;          FSR2    pointer to end of copied text (the null char)
+; Trashed: WREG
+	extern	strcpy_text
 
 ;=============================================================================
-; strcpy_text_print : Same as above, but calls word processor afterward.
+; strcpy_text_print : same as above, but calls word processor afterward
 ;
-; Input:   FSR1 :  text index
-; Output:  Buffer: filled with the text.
-;          FSR2:   pointer to end of copied text (the null char).
-; Trashed: WREG.
-        extern  strcpy_text_print
+; Input  : FSR1    text index
+; Output : Buffer  filled with the text.
+;          FSR2    pointer to end of copied text (the null char)
+; Trashed: WREG
+	extern	strcpy_text_print
 
 ;=============================================================================
-; strcat_text : Append a multiling text to FSR2 pointer.
+; strcat_text : append a multiling text to FSR2 pointer
 ;
-; Input:   FSR1 :  text index
-;          FSR2 :  Current position (in Buffer)
-; Output:  FSR2:   pointer to end of copied text (the null char).
-; Trashed: WREG.
-        extern  strcat_text
+; Input  : FSR1  text index
+;          FSR2  current position (in buffer)
+; Output : FSR2  pointer to end of copied text (the null char)
+; Trashed: WREG
+	extern	strcat_text
 
 ;=============================================================================
-; strcat_text_print : Same as above, but calls word processor afterward.
+; strcat_text_print : aame as above, but calls word processor afterward
 ;
-; Input:   FSR1 :  text index
-;          FSR2 :  Current position (in Buffer)
-; Output:  FSR2:   pointer to end of copied text (the null char).
-; Trashed: WREG.
-        extern  strcat_text_print
+; Input  : FSR1  text index
+;          FSR2  current position (in buffer)
+; Output : FSR2  pointer to end of copied text (the null char)
+; Trashed: WREG
+	extern	strcat_text_print
 
--- a/src/tft.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/tft.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File tft.asm													## V2.97
+;   File tft.asm													## V2.99c
 ;
 ;   Managing the TFT screen
 ;
@@ -61,13 +61,13 @@
 
 Parameter_out	macro high_b, low_b
 				movlw high_b
-				movwf PORTA		; Upper
+				movwf PORTA			; upper
 				movlw low_b
 				rcall TFT_DataWrite
 				endm
 
 
-basic	CODE
+tft		CODE
 
 ;;=============================================================================
 ;; TFT_write_flash_image
@@ -92,70 +92,70 @@
 ;TFT_write_flash_image_addr:
 ;	call	ext_flash_read_block_start
 ;	movff	SSP2BUF,win_width+0
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
-;	btfss	SSP2STAT, BF			; Next byte ready ?
-;	bra		$-2						; NO: wait...
+;	movwf	SSP2BUF					; write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; next byte ready ?
+;	bra		$-2						; NO - wait...
 ;	movff	SSP2BUF,win_width+1
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
-;	btfss	SSP2STAT, BF			; Next byte ready ?
-;	bra		$-2						; NO: wait...
+;	movwf	SSP2BUF					; write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; next byte ready ?
+;	bra		$-2						; NO - wait...
 ;	movff	SSP2BUF,win_height
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
-;	btfss	SSP2STAT, BF			; Next byte ready ?
-;	bra		$-2						; NO: wait...
-;	movff   SSP2BUF,WREG			; drop 4th byte.
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
-;	btfss	SSP2STAT, BF			; Next byte ready ?
-;	bra		$-2						; NO: wait...
+;	movwf	SSP2BUF					; write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; next byte ready ?
+;	bra		$-2						; NO - wait...
+;	movff   SSP2BUF,WREG			; drop 4th byte
+;	movwf	SSP2BUF					; write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; next byte ready ?
+;	bra		$-2						; NO - wait...
 ;
 ;	; Sanity check on header to avoid badly uploaded images.
-;	iorwf	WREG					; Check height < 256
+;	iorwf	WREG					; check height < 256
 ;	bnz		TFT_write_flash_image_failed
-;	movf	win_width+1,W			; Check width < 512
+;	movf	win_width+1,W			; check width < 512
 ;	andlw	0xFE
 ;	bnz		TFT_write_flash_image_failed
 ;
 ;	; Center image on win_top, win_left values
-;	bcf		STATUS,C				; Clear carry
-;	rrcf	win_height,W			; And get height/2
+;	bcf		STATUS,C				; clear carry
+;	rrcf	win_height,W			; and get height/2
 ;	subwf	win_top,F				; top -= height/2
-;	rrcf	win_width+1,W			; Get 9th bit into carry
-;	rrcf	win_width+0,W			; Get width/2 (in 0..320 range)
+;	rrcf	win_width+1,W			; get 9th bit into carry
+;	rrcf	win_width+0,W			; get width/2 (in 0..320 range)
 ;	bcf		STATUS,C
-;	rrcf	WREG,W					; Get width/2 in 0..160 range
+;	rrcf	WREG,W					; get width/2 in 0..160 range
 ;	subwf	win_leftx2,F			; left -= width/2
 ;
-;	rcall	TFT_box_write			; Inputs : win_top, win_leftx2, win_height, win_width(in 1..320 range)
+;	rcall	TFT_box_write			; inputs : win_top, win_leftx2, win_height, win_width (in 1..320 range)
 ;
 ;	; Compute number of pixels to move (result on 17 bits !)
 ;	clrf	TBLPTRU
 ;	movf	win_width+0,W
-;	mulwf	win_height				; Result in PRODL:H
+;	mulwf	win_height				; result in PRODL:H
 ;	movf	win_width+1,W
 ;	bz		TFT_write_flash_image_1	; width > 8bits ?
-;	movf	win_height,W			; YES: add extra
+;	movf	win_height,W			; YES - add extra
 ;	addwf	PRODH,F
-;	rlcf	TBLPTRU					; And carry into upper register.
+;	rlcf	TBLPTRU					; and carry into upper register
 ;TFT_write_flash_image_1:
 ;	incf	PRODH,F					; pre-condition nested loops
 ;	incf	TBLPTRU,F
 ;
 ;	; Write pixels
-;	Index_out 0x22					; Frame Memory Data Write start
-;	RS_H							; Data
+;	Index_out 0x22					; frame memory data write start
+;	RS_H							; data
 ;
 ;TFT_write_flash_image_loop:
-;	btfss	SSP2STAT, BF			; Buffer full?
-;	bra		$-2						; NO: wait...
-;	movff	SSP2BUF,PORTH			; Read lo
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; buffer full?
+;	bra		$-2						; NO - wait...
+;	movff	SSP2BUF,PORTH			; read lo
+;	movwf	SSP2BUF					; write to buffer to initiate new read
 ;
-;	btfss	SSP2STAT, BF			; Buffer full?
-;	bra		$-2						; NO: wait...
-;	movff	SSP2BUF,PORTA			; And read hi
-;	movwf	SSP2BUF					; Write to buffer to initiate new read
+;	btfss	SSP2STAT, BF			; buffer full?
+;	bra		$-2						; NO - wait...
+;	movff	SSP2BUF,PORTA			; and read hi
+;	movwf	SSP2BUF					; write to buffer to initiate new read
 ;	WR_L
-;	WR_H							; Write 1 Pixel
+;	WR_H							; write 1 pixel
 ;
 ;	decfsz	PRODL,F
 ;	bra		TFT_write_flash_image_loop
@@ -164,13 +164,13 @@
 ;	decfsz	TBLPTRU,F
 ;	bra		TFT_write_flash_image_loop
 ;
-;	btfss	SSP2STAT, BF			; Buffer full?
-;	bra		$-2						; No, wait
-;	movf	SSP2BUF,W				; Read dummy byte
+;	btfss	SSP2STAT, BF			; buffer full?
+;	bra		$-2						; NO - wait
+;	movf	SSP2BUF,W				; read dummy byte
 ;
 ;	bsf		flash_ncs				; CS=1
 ;	movlw	0x00					; NOP, to stop window mode
-;	bra		TFT_CmdWrite			; This routine "returns"
+;	bra		TFT_CmdWrite			; this routine "returns"
 ;
 ;	;---- Draw a 4x4 red square in place of missing images...
 ;TFT_write_flash_image_failed:
@@ -191,22 +191,22 @@
 
 	global	TFT_CmdWrite
 TFT_CmdWrite:
-	RS_L							; Command
-	clrf	PORTA					; Upper
+	RS_L							; command
+	clrf	PORTA					; upper
 	bcf		INTCON,GIE
-	movwf	PORTH					; Lower
+	movwf	PORTH					; lower
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	bsf		INTCON,GIE
 	return
 
 	global	TFT_DataWrite
 TFT_DataWrite:
-	RS_H							; Data
+	RS_H							; data
 	bcf		INTCON,GIE
-	movwf 	PORTH					; Lower
+	movwf 	PORTH					; lower
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	bsf		INTCON,GIE
 	return
 
@@ -214,25 +214,25 @@
 
 	global	TFT_ClearScreen
 TFT_ClearScreen:
-	Index_out 0x50					; Window Horizontal Start Address
+	Index_out 0x50					; window horizontal start address
 	Parameter_out 0x00, 0x00		; 0-239
-	Index_out 0x51					; Window Horizontal End Address
+	Index_out 0x51					; window horizontal end   address
 	Parameter_out 0x00, 0xEF		; 0-239
-	Index_out 0x52					; Window Vertical Start Address
+	Index_out 0x52					; window vertical   start address
 	Parameter_out 0x00, 0x00		; 0-319
-	Index_out 0x53					; Window Vertical End Address
+	Index_out 0x53					; window vertical   end   address
 	Parameter_out 0x01, 0x3F		; 0-319
-	Index_out 0x20					; Frame Memory Horizontal Address
+	Index_out 0x20					; frame memory horizontal address
 	Parameter_out 0x00, 0x00		; 0-239
-	Index_out 0x21					; Frame Memory Vertical Address
+	Index_out 0x21					; frame memory vertical   address
 	Parameter_out 0x01, 0x3F		; 0-319
 
-	Index_out 0x22					; Frame Memory Data Write start
+	Index_out 0x22					; frame memory data write start
 
-	RD_H							; Not Read
-	RS_H							; Data
-	NCS_L							; Not CS
-	clrf	PORTH					; Data Lower
+	RD_H							; not read
+	RS_H							; data
+	NCS_L							; not CS
+	clrf	PORTH					; data lower
 
 	movlw	d'10'
 	movwf	tft_temp3
@@ -240,11 +240,11 @@
 	movlw	d'30'
 	movwf	tft_temp2
 TFT_ClearScreen3:
-	clrf	tft_temp1				; 30*10*256=76800 Pixels -> Clear complete 240*320
+	clrf	tft_temp1				; 30*10*256=76800 pixels -> clear complete 240*320
 	bcf		INTCON,GIE
 TFT_ClearScreen4:
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	decfsz	tft_temp1,F
 	bra		TFT_ClearScreen4
 	bsf		INTCON,GIE
@@ -254,7 +254,7 @@
 	bra		TFT_ClearScreen2
 
 	movlw	0x00					; NOP, to stop window mode
-	bra		TFT_CmdWrite			; And return
+	bra		TFT_CmdWrite			; and return
 
 
 ;=============================================================================
@@ -306,7 +306,7 @@
 	WAITMS	d'5'
 	bsf		tft_nreset
 	WAITMS	d'150'
-	bsf		lightsen_power			; Supply power to light sensor
+	bsf		lightsen_power			; supply power to light sensor
 
 	; Data Transfer Synchronization
 	Parameter_out 0x00, 0x00
@@ -319,10 +319,10 @@
 	movwf	TBLPTRH
 	movlw	0x01
 	movwf	TBLPTRU
-	TBLRD*+							; Reads .110 for cR and USB OSTC3, .0 for BLE (2 and 3), and .2 for display1 OSTC
+	TBLRD*+							; reads .110 for cR and USB OSTC3, .0 for BLE (2 and 3), and .2 for display1 OSTC
 	movlw	0x02
 	cpfseq	TABLAT
-	bra		TFT_boot_0				; Display0
+	bra		TFT_boot_0				; display0
 
 TFT_boot_1:
 	; Init through config table...
@@ -350,10 +350,10 @@
 
 	Index_out 0x03
 	btfsc	flip_screen				; 180° rotation ?
-	bra		TFT_boot2				; Yes
+	bra		TFT_boot2				; YES
 
 	btfss	screen_type				; display1?
-	bra		TFT_boot1a				; no
+	bra		TFT_boot1a				; NO
 	Parameter_out 0x10, 0x00		; display1
 	bra		TFT_boot3
 TFT_boot1a:
@@ -361,7 +361,7 @@
 	bra		TFT_boot3
 TFT_boot2:
 	btfss	screen_type				; display1?
-	bra		TFT_boot2a				; no
+	bra		TFT_boot2a				; NO
 	Parameter_out 0x10, 0x30		; display1
 	bra		TFT_boot3
 TFT_boot2a:
@@ -396,26 +396,26 @@
 	TBLRD*+
 	movlw	0xFF
 	cpfseq	TABLAT
-	bra		display0_config_write	; Write Config pair to Display
+	bra		display0_config_write	; write config pair to display
 	; Delay ms or quit (return)
 	TBLRD*+
-	tstfsz	TABLAT					; End of config?
-	bra		$+4						; No
-	return							; Done.
+	tstfsz	TABLAT					; end of config?
+	bra		$+4						; NO
+	return							; YES - done
 	movf	TABLAT,W
-	call	WAITMSX					; Wait WREG milliseconds
-	TBLRD*+							; Dummy read (Third byte of delay command)
-	bra		display0_init_loop		; Loop
+	call	WAITMSX					; wait WREG milliseconds
+	TBLRD*+							; dummy read (Third byte of delay command)
+	bra		display0_init_loop		; loop
 
-display0_config_write:				; With command in WREG
+display0_config_write:				; with command in WREG
 	movf	TABLAT,W
-	rcall	TFT_CmdWrite			; Write command
-	TBLRD*+							; Get config0
+	rcall	TFT_CmdWrite			; write command
+	TBLRD*+							; get config0
 	movff	TABLAT,PORTA
-	TBLRD*+							; Get config1
+	TBLRD*+							; get config1
 	movf	TABLAT,W
-	rcall	TFT_DataWrite			; Write config
-	bra		display0_init_loop		; Loop
+	rcall	TFT_DataWrite			; write config
+	bra		display0_init_loop		; loop
 
 
 ;=============================================================================
@@ -423,23 +423,23 @@
 ;
 ; Trashes: WREG, PRODL
 ; Typical usage:
-;	clrf	CCPR1L					; Backlight off
+;	clrf	CCPR1L					; backlight off
 ;	[draw splash screen]
 ;	call	TFT_DisplayFadeIn
 
 	global	TFT_Display_FadeIn
 TFT_Display_FadeIn:
-	movlw	CCP1CON_VALUE			; See hwos.inc
+	movlw	CCP1CON_VALUE			; see hwos.inc
 	movwf	CCP1CON
-	bsf		tft_is_dimming			; TFT is dimming, ignore ambient sensor!
-	clrf	CCPR1L					; Backlight off - to be sure
+	bsf		tft_is_dimming			; TFT is dimming, ignore ambient sensor
+	clrf	CCPR1L					; backlight off - to be sure
 	movff	max_CCPR1L,PRODL
 TFT_Display_FadeIn_0:
-	incf	CCPR1L,F				; Duty cycle
+	incf	CCPR1L,F				; duty cycle
 	WAITMS	d'2'
 	decfsz	PRODL,F
 	bra		TFT_Display_FadeIn_0 
-	bcf		tft_is_dimming			; dimming done.
+	bcf		tft_is_dimming			; dimming done
 	return
 
 ;=============================================================================
@@ -449,9 +449,9 @@
 	global	TFT_Display_FadeOut
 TFT_Display_FadeOut:
 	movff	max_CCPR1L,PRODL
-	bsf		tft_is_dimming			; TFT is dimming, ignore ambient sensor!
+	bsf		tft_is_dimming			; TFT is dimming, ignore ambient sensor
 TFT_Display_FadeOut_0:
-	movff	PRODL,CCPR1L			; Duty cycle
+	movff	PRODL,CCPR1L			; duty cycle
 	WAITMS	d'1'
 	decfsz	PRODL,F
 	bra		TFT_Display_FadeOut_0 
@@ -460,12 +460,12 @@
 
 ;=============================================================================
 
-	global  box_std_block, box_black_block, box_color_block
+	global	box_std_block, box_black_block, box_color_block
 
-box_std_block:						; Use white color
+box_std_block:						; use white color
 	setf	WREG
 	bra	box_common
-box_black_block:					; Use black color
+box_black_block:					; use black color
 	clrf	WREG
 box_common:
 box_color_block:
@@ -509,7 +509,7 @@
 ;init_pixel_write:
 ;	movf	win_leftx2,W
 ;	mullw	2
-;	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
+;	rcall	pixel_write_col320		; start address vertical (.0 - .319)
 ;	setf	WREG
 ;	bra	TFT_set_color
 
@@ -522,39 +522,39 @@
 pixel_write:
 	movf	win_leftx2,W
 	mullw	2						; win_leftx2 x 2 -> PRODH:PRODL
-	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
-	rcall	half_pixel_write		; Write this half-one.
-	movf	win_leftx2,W			; Address of next one
+	rcall	pixel_write_col320		; start address vertical (.0 - .319)
+	rcall	half_pixel_write		; write this half-one
+	movf	win_leftx2,W			; address of next one
 	mullw	2
 	infsnz	PRODL					; +1
 	incf	PRODH
 	rcall	pixel_write_col320
-	bra		half_pixel_write		; Note: Cmd 0x20 is mandatory, because
+	bra		half_pixel_write		; note: Cmd 0x20 is mandatory, because
 									; of the auto-increment going vertical
 
 	global	pixel_write_col320
 pixel_write_col320:
 	btfsc	screen_type				; display1?
-	bra		pixel_write_col320_d1	; Yes
+	bra		pixel_write_col320_d1	; YES
 	; Display0
 	btfss	flip_screen				; 180° rotation?
-	bra		pixel_write_noflip_H	; No
-	bra		pixel_write_flip_H		; Yes
+	bra		pixel_write_noflip_H	; NO
+	bra		pixel_write_flip_H		; YES
 pixel_write_col320_d1:				; Display1
 	btfsc	flip_screen				; 180° rotation?
-	bra	pixel_write_noflip_H		; Yes for d1
-pixel_write_flip_H:					; Flip d0
-	movf	PRODL,W					; 16bits 319 - PROD --> PROD
+	bra	pixel_write_noflip_H		; YES for d1
+pixel_write_flip_H:					; flip d0
+	movf	PRODL,W					; 16 bits 319 - PROD --> PROD
 	sublw	LOW(.319)				; 319-W --> W
 	movwf	PRODL
 	movf	PRODH,W
-	btfss	STATUS,C				; Borrow = /CARRY
+	btfss	STATUS,C				; borrow = /CARRY
 	incf	WREG
 	sublw	HIGH(.319)
 	movwf	PRODH
 
 pixel_write_noflip_H:
-	Index_out 0x21					; Frame Memory Vertical Address
+	Index_out 0x21					; frame memory vertical address
 	bra		TFT_DataWrite_PROD		; and return...
 
 ;-----------------------------------------------------------------------------
@@ -569,17 +569,17 @@
 half_pixel_write_1:
 	btfss	flip_screen				; 180° rotation?
 	sublw	.239					; 239-Y --> Y
-	mullw	.1						; Copy row to PRODL (PRODH=0)
-	Index_out 0x20					; Frame Memory Horizontal Address
+	mullw	.1						; copy row to PRODL (PRODH=0)
+	Index_out 0x20					; frame memory horizontal address
 	rcall	TFT_DataWrite_PROD
 
-	Index_out 0x22					; Frame Memory Data Write start
-	RS_H							; Data
+	Index_out 0x22					; frame memory data write start
+	RS_H							; data
 	bcf		INTCON,GIE
-	movff	win_color1,PORTA		; Upper
-	movff	win_color2,PORTH		; Lower
+	movff	win_color1,PORTA		; upper
+	movff	win_color2,PORTH		; lower
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	bsf		INTCON,GIE
 	return
 
@@ -590,21 +590,21 @@
 
 	global	half_vertical_line
 half_vertical_line:
-	clrf	TABLAT					; Loop index.
+	clrf	TABLAT					; loop index
 
 half_vertical_line_loop:
-	movf	win_leftx2,W			; Init X position.
+	movf	win_leftx2,W			; init X position
 	mullw	.2
-	movf	TABLAT,W				; Get loop index
-	andlw	.1						; Just low bit
-	xorwf	PRODL,F					; And use it to jitter current X position
-	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
+	movf	TABLAT,W				; get loop index
+	andlw	.1						; just low bit
+	xorwf	PRODL,F					; and use it to jitter current X position
+	rcall	pixel_write_col320		; start address vertical (.0 - .319)
 
-	movf	win_height,W			; Index reached height (Bank0 read) ?
+	movf	win_height,W			; index reached height (bank0 read) ?
 	xorwf	TABLAT,W
-	btfsc	STATUS,Z				; Equals ?
-	return							; Yes: done.
-	movf	win_top,W				; Y = top + index (Bank0 read)
+	btfsc	STATUS,Z				; Equal ?
+	return							; YES - done
+	movf	win_top,W				; Y = top + index (bank0 read)
 	addwf	TABLAT,W
 	rcall	half_pixel_write_1
 	incf	TABLAT,F				; index++
@@ -617,17 +617,17 @@
 
 	global	half_horizontal_line
 half_horizontal_line:
-	clrf	TABLAT					; Loop index.
+	clrf	TABLAT					; loop index
 
 half_horizontal_line_loop:
-	movf	win_leftx2,W			; Init X position.
+	movf	win_leftx2,W			; init X position
 	mullw	.2
-	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
-	movf	win_width,W				; Index reached height (Bank0 read) ?
+	rcall	pixel_write_col320		; start address vertical (.0 - .319)
+	movf	win_width,W				; index reached height (bank0 read) ?
 	xorwf	TABLAT,W
-	btfsc	STATUS,Z				; Equals ?
-	return							; Yes: done.
-	movf	win_top,W				; Y = top + index (Bank0 read)
+	btfsc	STATUS,Z				; equal ?
+	return							; YES - done
+	movf	win_top,W				; Y = top + index (bank0 read)
 	addwf	TABLAT,W
 	rcall	half_pixel_write_1
 	incf	TABLAT,F				; index++
@@ -639,72 +639,72 @@
 
 	global	TFT_DataWrite_PROD
 TFT_DataWrite_PROD:
-;	RD_H							; Keep high
-	RS_H							; Data
+;	RD_H							; keep high
+	RS_H							; data
 	bcf		INTCON,GIE
-	movff	PRODH,PORTA				; Move high byte to PORTA
-	movff	PRODL,PORTH				; Move low byte to PORTH
+	movff	PRODH,PORTA				; move high byte to PORTA
+	movff	PRODL,PORTH				; move low byte to PORTH
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	bsf		INTCON,GIE
 	return
 
 TFT_DataRead_PROD:
-	Index_out 0x22					; Frame Memory Data Read start
+	Index_out 0x22					; frame memory data read start
 TFT_CmdRead_PROD:
-	setf	TRISA					; PortA as input.
-	setf	TRISH					; PortH as input.
-	RS_H							; Data
-	WR_H							; Not write
-	RD_L							; Read!
+	setf	TRISA					; port A as input
+	setf	TRISH					; port H as input
+	RS_H							; data
+	WR_H							; not write
+	RD_L							; read
 	nop
 	nop
 	nop
-	RD_H							; Tick
+	RD_H							; tick
 	nop
 	nop
 	nop
-	RD_L							; Read!
+	RD_L							; read
 	nop
 	;nop
 	;nop
 	movff	PORTA,PRODH
 	movff	PORTH,PRODL
-	RD_H							; Tick
+	RD_H							; tick
 	nop
-	clrf	TRISA					; PortA as output
-	clrf	TRISH					; PortH as output
+	clrf	TRISA					; port A as output
+	clrf	TRISH					; port H as output
 	return
 
 ;=============================================================================
-; Output TFT Window Address commands.
-; Inputs : win_top, win_leftx2, win_height, win_width.
-; Output : PortA/PortH commands.
+; Output TFT Window Address commands
+; Inputs : win_top, win_leftx2, win_height, win_width
+; Output : PortA/PortH commands
 ; Trashed: PROD
 
 	global	TFT_box_write
 TFT_box_write:
-	movf	win_leftx2,W			; Compute left = 2*leftx2 --> PROD
+	movf	win_leftx2,W			; compute left = 2 * leftx2 --> PROD
 	mullw	2
 
 	global	TFT_box_write_16bit_win_left
-TFT_box_write_16bit_win_left:					; With column in PRODL:PRODH
+TFT_box_write_16bit_win_left:					; Wwth column in PRODL:PRODH
 	btfsc	screen_type							; display1?
-	bra		TFT_box_write_16bit_win_left_d1		; Yes
+	bra		TFT_box_write_16bit_win_left_d1		; YES
 	; Display0
 	btfsc	flip_screen							; 180° rotation?
-	bra		DISP_box_flip_H						; Yes
-	bra		TFT_box_write_16bit_win_left_com	; No
+	bra		DISP_box_flip_H						; YES
+	bra		TFT_box_write_16bit_win_left_com	; NO
 TFT_box_write_16bit_win_left_d1:				; Display1
 	btfss	flip_screen							; 180° rotation?
-	bra		DISP_box_flip_H						; No for d1
+	bra		DISP_box_flip_H						; NO for d1
 	; Yes for d1
 TFT_box_write_16bit_win_left_com:
 	;---- Normal horizontal window ---------------------------------------
-	Index_out 0x52					; Window Vertical Start Address
-	rcall	TFT_DataWrite_PROD		; Output left
-	Index_out 0x21					; Frame Memory Vertical Address
-	rcall	TFT_DataWrite_PROD		; Output left
+	Index_out 0x52					; window vertical start address
+	rcall	TFT_DataWrite_PROD		; output left
+	Index_out 0x21					; frame memory vertical address
+	rcall	TFT_DataWrite_PROD		; output left
 
 	movf	win_width+0,W			; right = left + width - 1
 	addwf	PRODL,F
@@ -714,58 +714,58 @@
 	btfss	STATUS,C
 	decf	PRODH,F
 
-	Index_out 0x53					; Window Vertical End Address
+	Index_out 0x53					; window vertical end address
 	rcall	TFT_DataWrite_PROD
 	bra		DISP_box_noflip_H
 
 	;---- Flipped horizontal window --------------------------------------
 DISP_box_flip_H:
-	movf	PRODL,W					; 16bits 319 - PROD --> PROD
-	sublw	LOW(.319)				; 319-W --> W
+	movf	PRODL,W					; 16 bits 319 - PROD --> PROD
+	sublw	LOW(.319)				; 319 - WREG --> WREG
 	movwf	PRODL
 	movf	PRODH,W
-	btfss	STATUS,C				; Borrow = /CARRY
+	btfss	STATUS,C				; borrow = /CARRY
 	incf	WREG
 	sublw	HIGH(.319)
 	movwf	PRODH
 
-	Index_out 0x53					; Window Vertical Start Address
-	rcall	TFT_DataWrite_PROD		; Output left
-	Index_out 0x21					; Frame Memory Vertical Address
-	rcall	TFT_DataWrite_PROD		; Output left
+	Index_out 0x53					; window vertical start address
+	rcall	TFT_DataWrite_PROD		; output left
+	Index_out 0x21					; frame memory vertical address
+	rcall	TFT_DataWrite_PROD		; output left
 
-	movf	win_width+0,W			; 16bits PROD - width --> PROD
+	movf	win_width+0,W			; 16 bits PROD - width --> PROD
 	subwf	PRODL,F					; PRODL - WREG --> PRODL
 	movf	win_width+1,W
 	subwfb	PRODH,F
-	infsnz	PRODL					; PROD+1 --> PROD
+	infsnz	PRODL					; PROD + 1 --> PROD
 	incf	PRODH
 
-	Index_out 0x52					; Window Vertical End Address
+	Index_out 0x52					; window vertical end address
 	rcall	TFT_DataWrite_PROD
 
 DISP_box_noflip_H:
 	btfss	flip_screen				; 180° rotation ?
-	bra		TFT_box_noflip_V		; No.
+	bra		TFT_box_noflip_V		; NO
 
 	;---- Flipped vertical window -----------------------------------------
 	movff	win_top,PRODH			; top --> PRODH (first byte)
 	movf	win_height,W
 	addwf	PRODH,W
 	decf	WREG
-	movwf	PRODL					; top+height-1 --> PRODL (second byte)
+	movwf	PRODL					; top + height - 1 --> PRODL (second byte)
 
-	Index_out 0x50					; Window Horizontal Start Address
+	Index_out 0x50					; window horizontal start address
 	movf	PRODH,W
-	rcall	TFT_DataWrite			; Lower (and tick)
+	rcall	TFT_DataWrite			; lower (and tick)
 
-	Index_out 0x51					; Window Horizontal End Address
+	Index_out 0x51					; window horizontal end address
 	movf	PRODL,W
-	rcall	TFT_DataWrite			; Lower (and tick)
+	rcall	TFT_DataWrite			; lower (and tick)
 
-	Index_out 0x20					; Frame Memory Horizontal Address
+	Index_out 0x20					; frame memory horizontal address
 	movf	PRODH,W
-	bra		TFT_DataWrite			; Lower (and tick) and return
+	bra		TFT_DataWrite			; lower (and tick) and return
 
 TFT_box_noflip_V:
 	;---- Normal vertical window ----------------------------------------
@@ -773,55 +773,55 @@
 	movf	win_height,W
 	addwf	PRODL,W
 	sublw	.240					; 240 - top - height
-	movwf	PRODH					; First byte
+	movwf	PRODH					; first byte
 
 	movf	PRODL,W
-	sublw	.239					; 239-top
-	movwf	PRODL					; --> second byte.
+	sublw	.239					; 239 - top
+	movwf	PRODL					; --> second byte
 
-	Index_out 0x50					; Window Horizontal Start Address
+	Index_out 0x50					; window horizontal start address
 	movf	PRODH,W
-	rcall	TFT_DataWrite			; Lower (and tick)
+	rcall	TFT_DataWrite			; lower (and tick)
 
-	Index_out 0x51					; Window Horizontal End Address
+	Index_out 0x51					; window horizontal end address
 	movf	PRODL,W
-	rcall	TFT_DataWrite			; Lower (and tick)
+	rcall	TFT_DataWrite			; lower (and tick)
 
-	Index_out 0x20					; Frame Memory Horizontal Address
+	Index_out 0x20					; frame memory horizontal address
 	movf	PRODL,W
-	bra		TFT_DataWrite			; Lower (and tick) and return
+	bra		TFT_DataWrite			; lower (and tick) and return
 
 
 ;=============================================================================
-; TFT_frame : draw a frame around current box with current color.
+; TFT_frame : draw a frame around current box with current color
 ; Inputs:  win_top, win_leftx2, win_height, win_width, win_color1, win_color2
 ; Outputs: (none)
 ; Trashed: WREG, PROD, aa_start:2, aa_end:2
 
 	global	TFT_frame
 TFT_frame:
-	movff	win_top,save_top		; Backup everything.
+	movff	win_top,save_top		; backup everything
 	movff	win_height,save_height
 	movff	win_leftx2,save_left
 	movff	win_width,save_width
 
 	;---- TOP line -----------------------------------------------------------
-	movlw	.1						; row ~ height=1
+	movlw	.1						; row ~ height = 1
 	movwf	win_height
 	rcall	TFT_box
 
 	;---- BOTTOM line --------------------------------------------------------
-	movff	save_top,PRODL			; Get back top,
-	movff	save_height,WREG		; and height
-	addwf	PRODL,W					; top+height
-	decf	WREG					; top+height-1
-	movwf	win_top					; top+height-1 --> top
+	movff	save_top,PRODL			; get back top
+	movff	save_height,WREG		; get back height
+	addwf	PRODL,W					; top + height
+	decf	WREG					; top + height - 1
+	movwf	win_top					; top + height - 1 --> top
 	rcall	TFT_box
 
 	;---- LEFT column --------------------------------------------------------
-	movff	save_top,win_top		; Restore top/height.
+	movff	save_top,win_top		; restore top/height
 	movff	save_height,win_height
-	movlw	.1						; column ~ width=1
+	movlw	.1						; column ~ width = 1
 	movwf	win_width+0
 	rcall	TFT_box
 
@@ -839,8 +839,8 @@
 	return
 
 ;=============================================================================
-; TFT_box : fills current box with current color.
-; Inputs:  win_top, win_leftx2, win_height, win_width, win_color1, win_color2
+; TFT_box: fills current box with current color
+; Inputs : win_top, win_leftx2, win_height, win_width, win_color1, win_color2
 ; Outputs: (none)
 ; Trashed: WREG, PROD
 
@@ -850,7 +850,7 @@
 	bcf		STATUS,C
 	rlcf	win_width+0,F
 	rlcf	win_width+1,F			; x2
-	rcall	TFT_box_write			; Setup box
+	rcall	TFT_box_write			; setup box
 
 	global	TFT_box_16bit_win_left
 TFT_box_16bit_win_left:
@@ -859,58 +859,57 @@
 	rrcf	win_width+0,F
 
 	;---- Fill Window --------------------------------------------------------
-	Index_out 0x22					; Frame Memory Data Write start
+	Index_out 0x22					; frame memory data write start
 
-	clrf	PRODH					; Column counter.
-	RS_H							; Data
+	clrf	PRODH					; column counter
+	RS_H							; data
 
-TFT_box2:							; Loop height times
+TFT_box2:							; loop height times
 	movff	win_height,PRODL
 
 TFT_box3:							; loop width times
 	bcf	INTCON,GIE
-	movff	win_color1,PORTA		; Upper
-	movff	win_color2,PORTH		; Lower
+	movff	win_color1,PORTA		; upper
+	movff	win_color2,PORTH		; lower
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 
-;	movff	win_color1,PORTA		; Upper
-;	movff	win_color2,PORTH		; Lower
+;	movff	win_color1,PORTA		; upper
+;	movff	win_color2,PORTH		; lower
 	WR_L
-	WR_H							; Tick
+	WR_H							; tick
 	bsf		INTCON,GIE
 	decfsz	PRODL,F					; row loop finished ?
-	bra		TFT_box3				; No: continue.
+	bra		TFT_box3				; NO - continue
 
 	incf	PRODH,F					; column count ++
 
 	movf	win_bargraph,W			; current column == bargraph ?
 	cpfseq	PRODH
-	bra		TFT_box4				; No: just loop.
-	; Yes: switch to black
-	clrf	win_color1
-	clrf	win_color2
+	bra		TFT_box4				; NO  - just loop
+	clrf	win_color1				; Yes - switch to black
+	clrf	win_color2				;     - ...
 TFT_box4:
 	movf	win_width+0,W			; compare ?
 	xorwf	PRODH,W
-	bnz		TFT_box2				; Loop not finished.
+	bnz		TFT_box2				; Loop not finished
 
 	movlw	0x00					; NOP, to stop window mode
 	rcall	TFT_CmdWrite
 
-	; Reset bargraph mode...
+	; reset bargraph mode...
 	setf	win_bargraph
 	return
 
 ;=============================================================================
-;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB'
+; Converts 8 bit RGB b'RRRGGGBB' into 16 bit RGB b'RRRRRGGGGGGBBBBB'
 
 	global	TFT_set_color
 TFT_set_color:
-	movwf	tft_temp1				; Get 8Bit RGB b'RRRGGGBB'
-	movwf	tft_temp2				; Copy
+	movwf	tft_temp1				; get 8 Bit RGB b'RRRGGGBB'
+	movwf	tft_temp2				; copy
 
-	; Mask Bit 7,6,5,4,3,2
+	; mask bit 7,6,5,4,3,2
 	movlw	b'00000011'
 	andwf	tft_temp2,F
 
@@ -921,10 +920,10 @@
 	movlw	b'10100000'
 	dcfsnz	tft_temp2,F
 	movlw	b'11111000'
-	movwf	tft_temp3				; Blue done.
+	movwf	tft_temp3				; blue done
 
-	movff	tft_temp1,tft_temp2		; Copy
-	; Mask Bit 7,6,5,1,0
+	movff	tft_temp1,tft_temp2		; copy
+	; mask bit 7,6,5,1,0
 	movlw	b'00011100'
 	andwf	tft_temp2,F
 	rrncf	tft_temp2,F
@@ -954,10 +953,10 @@
 	rrcf	tft_temp3,F
 
 	rrcf	tft_temp4,F
-	rrcf	tft_temp3,W				; tft_temp3 (b'GGGBBBBB') done.
-	movwf	win_color2				; Set Color registers...
+	rrcf	tft_temp3,W				; tft_temp3 (b'GGGBBBBB') done
+	movwf	win_color2				; set color registers...
 
-	movff	tft_temp1,tft_temp2		; Copy
+	movff	tft_temp1,tft_temp2		; copy
 	clrf	tft_temp1
 
 	rrcf	tft_temp4,F
@@ -967,9 +966,9 @@
 	rrcf	tft_temp1,F
 
 	rrcf	tft_temp4,F
-	rrcf	tft_temp1,F				; Green done.
+	rrcf	tft_temp1,F				; green done
 
-	; Mask Bit 4,3,2,1,0
+	; mask bit 4,3,2,1,0
 	movlw	b'11100000'
 	andwf	tft_temp2,F
 
@@ -1000,7 +999,7 @@
 	rrcf	tft_temp1,F
 
 	rrcf	tft_temp4,F
-	rrcf	tft_temp1,F	
+	rrcf	tft_temp1,F
 
 	rrcf	tft_temp4,F
 	rrcf	tft_temp1,F
@@ -1009,27 +1008,40 @@
 	rrcf	tft_temp1,F
 
 	rrcf	tft_temp4,F
-	rrcf	tft_temp1,W				; Red done.
-	movwf	win_color1				; Set Color registers...
+	rrcf	tft_temp1,W				; red done
+	movwf	win_color1				; set color registers
 	return
 
 ;=============================================================================
 ; Dump screen contents to the UART
 
+ IFDEF _screendump
+
+	global	TFT_dump_screen_check
 	global	TFT_dump_screen
-TFT_dump_screen:
+TFT_dump_screen_check:
+	btfss	vusb_in					; USB (still) plugged in?
+	bcf		enable_screen_dumps		; NO - clear flag
+	call	rs232_get_byte			; try to read data from RS232
+	btfsc	rs232_receive_overflow	; anything received?
+	return							; NO  - return
+	movlw	"l"						; YES - load coding for screendump command
+	cpfseq	RCREG1					;       screendump command received?
+	return							;       NO  - return
+TFT_dump_screen:					;       YES
 	bsf		no_sensor_int
 	movlw	'l'
-	movwf	TXREG					; Send command echo.
+	movwf	TXREG					; send command echo
 	call	rs232_wait_tx			; wait for UART
+
 	;---- Send DISPLAY box command for the full screen window -------------------
-	Index_out 0x50					; Window Horizontal Start Address
+	Index_out 0x50					; window horizontal start address
 	Parameter_out 0x00, 0x00		; 0-239
-	Index_out 0x51					; Window Horizontal End Address
+	Index_out 0x51					; window horizontal end   address
 	Parameter_out 0x00, 0xEF		; 0-239
-	Index_out 0x52					; Window Vertical Start Address
+	Index_out 0x52					; window vertical   start address
 	Parameter_out 0x00, 0x00		; 0-319
-	Index_out 0x53					; Window Vertical End Address
+	Index_out 0x53					; window vertical   end   address
 	Parameter_out 0x01, 0x3F		; 0-319
 
 	clrf	ds_column
@@ -1037,17 +1049,17 @@
 dump_screen_1:
 	btg		LEDr					; LED activity toggle
 	; Dump even column
-	movlw	.240					; 240 lines, once.
+	movlw	.240					; 240 lines, once
 	movwf	ds_line
 dump_screen_2:
-	Index_out	0x20				; Frame Memory Horizontal Address
+	Index_out	0x20				; frame memory horizontal address
 	movff	ds_line,WREG			; d'0' ... d'239'
-	mullw	.1						; Copy row to PRODH:L
+	mullw	.1						; copy row to PRODH:L
 	rcall	TFT_DataWrite_PROD
 
-	movff	ds_column,WREG			; Init X position.
+	movff	ds_column,WREG			; Init X position
 	mullw	2
-	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
+	rcall	pixel_write_col320		; start address vertical (.0 - .319)
 
 	rcall	TFT_DataRead_PROD		; read pixel
 	rcall	dump_screen_pixel
@@ -1057,21 +1069,21 @@
 	rcall	dump_screen_pixel_flush
 
 	; Dump odd column
-	movlw	.240					; 240 lines, twice.
+	movlw	.240					; 240 lines, twice
 	movwf	ds_line
 dump_screen_3:
-	Index_out	0x20				; Frame Memory Horizontal Address
+	Index_out	0x20				; frame memory horizontal address
 	movff	ds_line,WREG			; d'0' ... d'239'
-	mullw	1						; Copy row to PRODH:L
+	mullw	1						; copy row to PRODH:L
 	rcall	TFT_DataWrite_PROD
 
-	movff	ds_column,WREG			; Init X position.
+	movff	ds_column,WREG			; init X position
 	mullw	2
 	movlw	.1
 	addwf	PRODL,F
 	movlw	0
 	addwfc	PRODH,F					; +1
-	rcall	pixel_write_col320		; Start Address Vertical (.0 - .319)
+	rcall	pixel_write_col320		; start address vertical (.0 - .319)
 
 	rcall	TFT_DataRead_PROD		; read pixel
 	rcall	dump_screen_pixel
@@ -1086,55 +1098,59 @@
 	bra		dump_screen_1
 
 	bcf		no_sensor_int
-	clrf	RCREG1					; Clear receive buffer
-	bcf		RCSTA1,CREN				; Clear receiver status
+	clrf	RCREG1					; clear receive buffer
+	bcf		RCSTA1,CREN				; clear receiver status
 	bsf		RCSTA1,CREN
-	bsf		enable_screen_dumps		; =1: Ignore vin_usb, wait for "l" command (Screen dump)
+	bsf		enable_screen_dumps		; =1: Ignore vin_usb, wait for "l" command (screen dump)
 	return
 
+ ENDIF
+
 
 ;=============================================================================
 ; Pixel compression
 ;
-; Input: PRODH:L = pixel.
+; Input : PRODH:L = pixel
 ; Output: Compressed stream on output.
 ; Compressed format:
-;       0ccccccc    : BLACK pixel, repeated ccccccc+1 times (1..128).
-;       11cccccc    : WHITE pixel, repeated cccccc+1 times (1..64).
-;       10cccccc HIGH LOW : color pixel (H:L) repeated ccccc+1 times (1..64).
+;       0ccccccc          : BLACK pixel,      repeated ccccccc+1 times (1..128)
+;       11cccccc          : WHITE pixel,      repeated  cccccc+1 times (1.. 64)
+;       10cccccc HIGH LOW : color pixel (H:L) repeated   ccccc+1 times (1.. 64)
+
+ IFDEF _screendump
 
 dump_screen_pixel:
-	movf	PRODH,W					; Compare pixel-high
+	movf	PRODH,W					; compare pixel-high
 	xorwf	ds_pixel+1,W
-	bnz		dump_screen_pixel_1		; Different -> dump.
+	bnz		dump_screen_pixel_1		; different -> dump
 
-	movf	PRODL,W					; Compare pixel-low
+	movf	PRODL,W					; compare pixel-low
 	xorwf	ds_pixel+0,W
-	bnz		dump_screen_pixel_1		; Different -> dump.
+	bnz		dump_screen_pixel_1		; different -> dump
 
-	incf	ds_count,F				; Same color: just increment.
+	incf	ds_count,F				; same color: just increment
 	return
 
-dump_screen_pixel_1:				; Send (pixel,count) tuple
-	movf	ds_count,W				; Is count zero ?
-	bz		dump_screen_pixel_2		; Yes: skip sending.
+dump_screen_pixel_1:				; send (pixel,count) tuple
+	movf	ds_count,W				; is count zero ?
+	bz		dump_screen_pixel_2		; YES - skip sending
 
-	movf	ds_pixel+1,W			; This is a BLACK pixel ?
+	movf	ds_pixel+1,W			; is this a BLACK pixel ?
 	iorwf	ds_pixel+0,W
-	bz		dump_screen_pix_black	; YES.
+	bz		dump_screen_pix_black	; YES
 
-	movf	ds_pixel+1,W			; This is a white pixel ?
+	movf	ds_pixel+1,W			; is this a white pixel ?
 	andwf	ds_pixel+0,W
 	incf	WREG
-	bz		dump_screen_pix_white	; YES.
+	bz		dump_screen_pix_white	; YES
 
 	; No: write the pixel itself...
-	movlw	.64						; Max color pixel on a single byte.
-	cpfsgt	ds_count				; Skip if count > 64
+	movlw	.64						; max color pixel on a single byte
+	cpfsgt	ds_count				; skip if count > 64
 	movf	ds_count,W				; W <- min(64,count)
 	subwf	ds_count,F				; ds_count <- ds_count-W
-	decf	WREG					; Save as 0..63
-	iorlw	b'10000000'				; MARK as a color pixel.
+	decf	WREG					; save as 0..63
+	iorlw	b'10000000'				; mark as a color pixel
 
 	movwf	TXREG
 	call	rs232_wait_tx			; wait for UART
@@ -1145,38 +1161,40 @@
 	bra		dump_screen_pixel_1
 
 dump_screen_pixel_2:
-	movff	PRODH,ds_pixel+1		; Save new pixel color
+	movff	PRODH,ds_pixel+1		; save new pixel color
 	movff	PRODL,ds_pixel+0
 	movlw	1
-	movwf	ds_count				; And set count=1.
+	movwf	ds_count				; and set count=1
 	return
 
 dump_screen_pix_black:
-	movlw	.128					; Max black pixel on a single byte.
-	cpfsgt	ds_count				; Skip if count > 128
+	movlw	.128					; max black pixel on a single byte
+	cpfsgt	ds_count				; skip if count > 128
 	movf	ds_count,W				; W <- min(128,count)
 	subwf	ds_count,F				; ds_count <- ds_count-W
-	decf	WREG					; Save as 0..127
+	decf	WREG					; save as 0..127
 dump_screen_pix_3:
 	movwf	TXREG
 	call	rs232_wait_tx
-	bra		dump_screen_pixel_1		; More to dump ?
+	bra		dump_screen_pixel_1		; more to dump ?
 
 dump_screen_pix_white:
-	movlw	.64						; Max white pixel on a single byte.
-	cpfsgt	ds_count				; Skip if count > 64
+	movlw	.64						; max white pixel on a single byte
+	cpfsgt	ds_count				; skip if count > 64
 	movf	ds_count,W				; W <- min(64,count)
 	subwf	ds_count,F				; ds_count <- ds_count-W
 	decf	WREG					; Save as 0..63
-	iorlw	b'11000000'				; MARK as a compressed white.
+	iorlw	b'11000000'				; mark as a compressed white
 	bra		dump_screen_pix_3
 
 dump_screen_pixel_flush:
 	clrf	PRODH
 	clrf	PRODL
-	rcall	dump_screen_pixel_1		; Send it
+	rcall	dump_screen_pixel_1		; send it
 dump_screen_pixel_reset:
-	clrf	ds_count				; But clear count.
+	clrf	ds_count				; clear count
 	return
 
+ ENDIF
+
 	END
--- a/src/tft.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/tft.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File tft.inc
+;   File tft.inc														V2.99c
 ;
 ;   Declaring interfaces to the TFT screen and its Oxxx controler
 ;
@@ -14,185 +14,217 @@
 ;=============================================================================
 
 ; Writes two half-pixels at position (win_top,win_leftx2)
-; Inputs: win_leftx2, win_top, win_color:2
+; Inputs : win_leftx2, win_top, win_color:2
+; Outputs: (none)
 ; Trashed: WREG, PROD
-    extern  pixel_write
+	extern	pixel_write
 
 ;-----------------------------------------------------------------------------
-; Writes one half-pixel at position (win_top,win_leftx2).
-; Inputs: win_leftx2, win_top, win_color:2
+; Writes one half-pixel at position (win_top,win_leftx2)
+; Inputs : win_leftx2, win_top, win_color:2
+; Outputs: (none)
 ; Trashed: WREG, PROD
-    extern  half_pixel_write
+	extern	half_pixel_write
 
 ;-----------------------------------------------------------------------------
-; TFT_frame : draw a frame around current box with current color.
-; Inputs:  win_top, win_leftx2, win_height, win_width, win_color1, win_color2
+; Draws a frame around current box with current color
+; Inputs :  win_top, win_leftx2, win_height, win_width, win_color1, win_color2
 ; Outputs: (none)
 ; Trashed: WREG, PROD, aa_start:2, aa_end:2, win_leftx2, win_width:1
-    extern  TFT_frame
+	extern	TFT_frame
 
 ;-----------------------------------------------------------------------------
-	extern	TFT_DisplayOff              ; Power-off everything (need a boot next)
-    extern  TFT_boot                    ; Initialize screen hardware
-    extern  TFT_Display_FadeIn          ; Smooth lighting
-    extern  TFT_Display_FadeOut         ; Smooth darkening
-    extern  TFT_ClearScreen
-    extern  TFT_box_write
-    extern  TFT_box_write_16bit_win_left; With column in PRODL:PRODH
-    extern  TFT_box
-    extern  TFT_box_16bit_win_left      ; With column in PRODL:PRODH
-    extern  TFT_DataWrite_PROD
-    extern  TFT_set_color
+	extern	TFT_DisplayOff					; Power-off everything (need a boot next)
+	extern	TFT_boot						; Initialize screen hardware
+	extern	TFT_Display_FadeIn				; Smooth lighting
+	extern	TFT_Display_FadeOut				; Smooth darkening
+	extern	TFT_ClearScreen
+	extern	TFT_box_write
+	extern	TFT_box_write_16bit_win_left	; With column in PRODL:PRODH
+	extern	TFT_box
+	extern	TFT_box_16bit_win_left			; With column in PRODL:PRODH
+	extern	TFT_DataWrite_PROD
+	extern	TFT_set_color
 ;	extern	init_pixel_write
 	extern	pixel_write
 	extern	pixel_write_col320
 	extern	half_vertical_line
-	extern  half_horizontal_line
-    extern  TFT_dump_screen
+	extern	half_horizontal_line
+
+ IFDEF _screendump
+	extern	TFT_dump_screen
+	extern	TFT_dump_screen_check
+ ENDIF
 
 ;=============================================================================
-; Low level macros (for aa_wordprocessor and color_processor).
+; Low level macros (for aa_wordprocessor and color_processor)
 ;
-            extern  TFT_CmdWrite
-Index_out	macro low_b
-			movlw low_b
-			call  TFT_CmdWrite
-			endm
+	extern	TFT_CmdWrite
+Index_out		macro	low_b
+					movlw	low_b
+					call	TFT_CmdWrite
+				endm
 
 ;=============================================================================
-; A shortcut for TFT_box and TFT_frame call sequences.
+; A shortcut for TFT_box and TFT_frame call sequences
 ;
-        extern  box_frame_std, box_frame_common, box_frame_color, box_frame_color16
-        extern  box_std_block, box_black_block, box_color_block
+	extern	box_frame_std, box_frame_common, box_frame_color, box_frame_color16
+	extern	box_std_block, box_black_block, box_color_block
 
-; Erase a given screen area.
-WIN_BOX_BLACK macro   top, bottom, left, right
-        call    box_black_block
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Erase a given screen area
+WIN_BOX_BLACK	macro	top, bottom, left, right
+					call	box_black_block
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-; Fill a given screen area with standard color (White).
-WIN_BOX_STD macro   top, bottom, left, right
-        call    box_std_block
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Fill a given screen area with standard color (white)
+WIN_BOX_STD		macro	top, bottom, left, right
+					call	box_std_block
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-; Fill a given screen area with color from WREG (8bits rrrgggbb)
-WIN_BOX_COLOR macro   top, bottom, left, right
-        call    box_color_block
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Fill a given screen area with color from WREG (8 bits rrrgggbb)
+WIN_BOX_COLOR	macro	top, bottom, left, right
+					call	box_color_block
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-; Draw a frame in standard color (White).
-WIN_FRAME_STD macro   top, bottom, left, right
-        call    box_frame_std
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Draw a frame in standard color (white)
+WIN_FRAME_STD	macro	top, bottom, left, right
+					call	box_frame_std
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-; Draw a frame with color from WREG (8bits rrrgggbb)
-WIN_FRAME_COLOR macro   top, bottom, left, right
-        call    box_frame_color
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Draw a frame with color from WREG (8 bits rrrgggbb)
+WIN_FRAME_COLOR	macro	top, bottom, left, right
+					call	box_frame_color
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-; Draw a frame with color from win_color (16bits in TFT format)
-WIN_FRAME_COLOR16 macro   top, bottom, left, right
-        call    box_frame_color16
-        db      top, (bottom)-(top)+1, left, (right)-(left)+1
-        endm
+; Draw a frame with color from win_color (16 bits in TFT format)
+WIN_FRAME_COLOR16 macro	top, bottom, left, right
+					call	box_frame_color16
+					db		top, (bottom)-(top)+1, left, (right)-(left)+1
+				endm
 
-WIN_FONT 	macro	win_font_input
-			movlw	win_font_input
-			movff	WREG,win_font
-			endm
-			
-WIN_TOP 	macro 	win_top_input
-			movlw	win_top_input
-			movff	WREG,win_top
-			endm
+WIN_FONT		macro	win_font_input
+					movlw	win_font_input
+					movff	WREG,win_font
+				endm
+
+WIN_TOP			macro	win_top_input
+					movlw	win_top_input
+					movff	WREG,win_top
+				endm
 
-WIN_HEIGHT 	macro 	h
-			movlw	h
-			movff	WREG,win_height
-			endm
-			
-WIN_LEFT 	macro 	win_left_input
-			movlw	win_left_input
-			movff	WREG,win_leftx2
-			endm
-			
-WIN_WIDTH 	macro 	w
-			movlw	w
-			movff	WREG,win_width
-			endm
+WIN_HEIGHT		macro	h
+					movlw	h
+					movff	WREG,win_height
+				endm
+
+WIN_LEFT		macro	win_left_input
+					movlw	win_left_input
+					movff	WREG,win_leftx2
+				endm
 
-WIN_COLOR	macro 	win_color_input
-			movlw	win_color_input
-			call	TFT_set_color
-			endm
+WIN_WIDTH		macro	w
+					movlw	w
+					movff	WREG,win_width
+				endm
+
+WIN_COLOR		macro	win_color_input
+					movlw	win_color_input
+					call	TFT_set_color
+				endm
 
-;=============================================================================
-; TFT_write_flash_image
-;
-; Inputs:  cx, cy : Image center (in 0..160 x 0..240 range)
-;          image  : flash image header's address
-; Outputs: win_top, win_left, win_height, win_width
-;          image copyed on screen.
-; Trashed: PROD, hi, lo
-; 
-;    extern  TFT_write_flash_image
-;    extern  TFT_write_flash_image_addr
-TFT_WRITE_FLASH_IMAGE macro cx, cy, image
-    If LOW(image) != 0
-        Error "Image "image" mis-aligned"
-    Endif
-    If (UPPER(image) & 0xF0) != 0x30
-        Error "Image "image" not in image flash memory"
-    Endif
-    If (cx < 0) || (cx > 160)
-        Error "Image center's X "cx" not in 0..160 range".
-    Endif
-    If (cy < 0) || (cy > 240)
-        Error "Image center's Y "cy" not in 0..240 range".
-    Endif
-            ; Once we know image is aligned, we can use the compact (4bytes)
-            ; 12bit registers to pass the address:
-            lfsr    FSR2, ((image)>>8) & 0xFFF
-            WIN_LEFT    cx
-            WIN_TOP     cy
-            call    TFT_write_flash_image
-            endm
+;;=============================================================================
+;; TFT_write_flash_image
+;;
+;; Inputs : cx, cy : Image center (in 0..160 x 0..240 range)
+;;          image  : flash image header's address
+;; Outputs: win_top, win_left, win_height, win_width
+;;          image copyed on screen.
+;; Trashed: PROD, hi, lo
+;; 
+;;    extern  TFT_write_flash_image
+;;    extern  TFT_write_flash_image_addr
+;TFT_WRITE_FLASH_IMAGE	macro	cx, cy, image
+;	If LOW(image) != 0
+;		Error "Image "image" mis-aligned"
+;	Endif
+;	If (UPPER(image) & 0xF0) != 0x30
+;		Error "Image "image" not in image flash memory"
+;	Endif
+;	If (cx < 0) || (cx > 160)
+;		Error "Image center's X "cx" not in 0..160 range".
+;	Endif
+;	If (cy < 0) || (cy > 240)
+;		Error "Image center's Y "cy" not in 0..240 range".
+;	Endif
+;		; Once we know image is aligned, we can use the compact (4 bytes)
+;		; 12 bit registers to pass the address:
+;		lfsr	FSR2, ((image)>>8) & 0xFFF
+;		WIN_LEFT cx
+;		WIN_TOP  cy
+;		call	TFT_write_flash_image
+;	endm
 
 ;=============================================================================
 ; TFT_write_prom_image
-;
-TFT_WRITE_PROM_IMAGE    macro   icon
-            extern  icon, color_image
-            movlw   LOW(icon)
-            movwf   TBLPTRL
-            movlw   HIGH(icon)
-            movwf   TBLPTRH
-            movlw   UPPER(icon)
-            movwf   TBLPTRU
-            call    color_image
-            endm
+
+; image referenced by a label
+TFT_WRITE_PROM_IMAGE_BY_LABEL	macro	image_label
+		extern	image_label
+		movlw	LOW   (image_label)
+		movwf	TBLPTRL
+		movlw	HIGH  (image_label)
+		movwf	TBLPTRH
+		movlw	UPPER (image_label)
+		movwf	TBLPTRU
+		extern	color_image
+		call	color_image
+	endm
+
+; image referenced by an address
+TFT_WRITE_PROM_IMAGE_BY_ADDR	macro	image_address
+		movlw	LOW   (image_address)
+		movwf	TBLPTRL
+		movlw	HIGH  (image_address & 0xFFFF)
+		movwf	TBLPTRH
+		movlw	UPPER (image_address)
+		movwf	TBLPTRU
+		extern	color_image
+		call	color_image
+	endm
+
+; custom colors referenced by label
+TFT_WRITE_PROM_IMAGE_CUST_COLOR	macro	colors_label
+		movlw	LOW   (colors_label)
+		movwf	TBLPTRL
+		movlw	HIGH  (colors_label)
+		movwf	TBLPTRH
+		movlw	UPPER (colors_label)
+		movwf	TBLPTRU
+		extern	get_colors
+		call	get_colors
+		bsf		use_custom_colors		; will suppress read-in of the colors that come with the image
+	endm
 
 ;=============================================================================
-; Macro to provides our own interface code.
+; Macro to provide our own interface code
 ;
-PIXEL_WRITE macro   colRegister, rowRegister
-        movff   colRegister,win_leftx2
-        movff   rowRegister,win_top
-        call    pixel_write
-        endm
+PIXEL_WRITE			macro	colRegister,	rowRegister
+						movff	colRegister,win_leftx2
+						movff	rowRegister,win_top
+						call	pixel_write
+					endm
 
-;INIT_PIXEL_WRITE macro colRegister
-;        movff   colRegister,win_leftx2
-;        call    init_pixel_write
-;        endm
+;INIT_PIXEL_WRITE	macro	colRegister
+;						movff	colRegister,win_leftx2
+;						call	init_pixel_write
+;					endm
 
-HALF_PIXEL_WRITE macro rowRegister
-        movff   rowRegister,win_top
-        call    half_pixel_write
-        endm
-	
+HALF_PIXEL_WRITE	macro	rowRegister
+						movff	rowRegister,win_top
+						call	half_pixel_write
+					endm
--- a/src/tft_outputs.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/tft_outputs.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File tft_outputs.asm							REFACTORED VERSION	V2.97 SP1
+;   File tft_outputs.asm							REFACTORED VERSION V2.99e
 ;
 ;   Startup subroutines
 ;
@@ -9,8 +9,8 @@
 ; HISTORY
 ;  2011-08-07 : [mH] moving from OSTC code
 
-#include "hwos.inc"							; Mandatory header
-#include "shared_definitions.h"				; Mailbox from/to p2_deco.c
+#include "hwos.inc"							; mandatory header
+#include "shared_definitions.h"				; mailbox from/to p2_deco.c
 #include "tft.inc"
 #include "start.inc"
 #include "wait.inc"
@@ -29,20 +29,41 @@
 #include "i2c.inc"
 #include "colorschemes.inc"
 #include "calibrate.inc"
-
+#include "gaslist.inc"
+
+ IFDEF _rx_functions
+#include "rx_ops.inc"
+ ENDIF
 
 	extern	aa_wordprocessor
+	extern	get_first_gas_to_WREG
+	extern	get_first_dil_to_WREG
+
+	extern	tFirmware
+	extern	tSerial
+	extern	tTotalDives
+	extern	tBatteryV
+	extern	tUptime
+	extern	tCalX,tCalY,tCalZ
+	extern	tPPO2MIN
+	extern	tPPO2MINCC
+	extern	tPPO2Max
+	extern	tPPO2DECO
+
+ IFDEF _rx_functions
+	extern	tFirmware_rx
+ ENDIF
 
 ;=============================================================================
 
-gui		CODE
+tft_out		CODE
 
 ;=============================================================================
 
 	global	TFT_divemask_color
 TFT_divemask_color:
 	movlw	color_green
-	btfsc	divemode					; in Divemode?
+	btfsc	divemode					; in divemode?
 	rcall	TFT_divemask_color_dive
 	bra		TFT_standard_color0
 
@@ -58,30 +79,42 @@
 	retlw	color_scheme_divemode_mask4	;3
 
 
-	global	TFT_attention_color
+	global	TFT_memo_color
+TFT_memo_color:							; information, values within normal range, things without a need to react upon
+    bra	TFT_standard_color  ; mH (Color schemes!)
+	movlw	color_white
+	bra		TFT_standard_color0
+;TFT_memo_color_dive:
+;	retlw	color_white
+
+	global	TFT_advice_color
+TFT_advice_color:						; advices to do something, but without essential need to actually do it
+	movlw	color_green
+	bra		TFT_standard_color0
+TFT_advice_color_dive:
+	retlw	color_green
+
+	global	TFT_attention_color			; important things to be aware of and things that are developing towards a warning
 TFT_attention_color:
-	movlw	color_yellow				; make this configurable?
+	movlw	color_yellow
 	bra		TFT_standard_color0
 TFT_attention_color_dive:
-	retlw	color_yellow				; make this configurable?
-
-
-	global	TFT_warnings_color
+	retlw	color_yellow
+
+	global	TFT_warnings_color			; important things with immediate need to react upon
 TFT_warnings_color:
-	movlw	color_red					; make this configurable?
+	movlw	color_red
 	bra		TFT_standard_color0
 TFT_warnings_color_dive:
-	retlw	color_red					; make this configurable?
+	retlw	color_red
 
 
 	global	TFT_disabled_color
 TFT_disabled_color:
-	;movlw	color_grey					; Default to OSTC grey (dark blue)
 	movlw	color_lightblue
-	btfsc	divemode					; in Divemode?
+	btfsc	divemode					; in divemode?
 	rcall	TFT_disabled_color_dive		; YES
 	bra		TFT_standard_color0
-
 TFT_disabled_color_dive:
 	movff	opt_dive_color_scheme,WREG	; 0-3
 	incf	WREG
@@ -96,11 +129,10 @@
 
 	global	TFT_standard_color
 TFT_standard_color:
-	setf	WREG						; Default white
-	btfsc	divemode					; in Divemode?
+	setf	WREG						; default white
+	btfsc	divemode					; in divemode?
 	rcall	TFT_standard_color_dive
 	;bra	TFT_standard_color0
-
 TFT_standard_color0:
 	goto	TFT_set_color				; and return...
 
@@ -117,26 +149,47 @@
 	retlw	color_scheme_divemode_std4	;3
 
 
+	global	TFT_color_code_tank_pres_sac
+TFT_color_code_tank_pres_sac:			; color-code a tank pressure or SAC rate, data in hi:lo
+	btfss	hi,int_not_avail_flag		; is the not-available flag set?
+	bra		TFT_color_code_tank_pres_1	; NO
+	bcf		hi,int_not_avail_flag		; YES - clear not-available flag
+TFT_color_code_tank_pres_0:				;       entry point for outdated flag
+	bcf		hi,int_outdated_flag		;       clear outdated  flag (it may be set)
+	bcf		hi,int_warning_flag			;       clear warning   flag (it may be set)
+	bcf		hi,int_attention_flag		;       clear attention flag (it may be set)
+	bra		TFT_disabled_color			;       set to disabled color and return
+TFT_color_code_tank_pres_1:
+	btfsc	hi,int_outdated_flag		; is the outdated flag set?
+	bra		TFT_color_code_tank_pres_0	; YES - handle alike with not-available flag
+TFT_color_code_tank_pres_2:
+	btfss	hi,int_warning_flag			; is the warning flag set?
+	bra		TFT_color_code_tank_pres_3	; NO
+	bcf		hi,int_warning_flag			; YES - clear warning   flag
+	bcf		hi,int_attention_flag		;     - clear attention flag (it may be set)
+	bra		TFT_warnings_color			;     - set to warning color and return
+TFT_color_code_tank_pres_3:
+	btfss	hi,int_attention_flag		; is the attention flag set?
+	bra		TFT_memo_color				; NO  - set to memo color and return
+	bcf		hi,int_attention_flag		; YES - clear attention flag
+	bra		TFT_attention_color			;     - set to attention color and return
+
+
 	global	TFT_color_code_gaslist
-TFT_color_code_gaslist:					; Color-code current row in Gaslist (%O2 in hi) according to current amb_pressure
+TFT_color_code_gaslist:					; color-code current row in gaslist (%O2 in hi) according to current amb_pressure
 ; Check very high ppO2 manually
-	SAFE_2BYTE_COPY amb_pressure,xA
-	movlw	d'10'
-	movwf	xB+0
-	clrf	xB+1
-	call	div16x16					; xC=p_amb/10
-	movff	xC+0,xA+0
-	movff	xC+1,xA+1
+	movff	amb_press_10+0,xA+0
+	movff	amb_press_10+1,xA+1
 	movff	hi,xB+0
 	clrf	xB+1
 	call	mult16x16					; hi * p_amb/10
-; Check if ppO2>6,55bar
-	tstfsz	xC+2						; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
-	bra		TFT_warnings_color			; Yes, warn in warning color
-; Check if ppO2>3,30bar
+; Check if ppO2 > 6.55 bar
+	tstfsz	xC+2						; char_I_O2_ratio * p_amb/10 > 65536, ppO2 > 6.55 bar ?
+	bra		TFT_warnings_color			; YES - warn in warning color
+; Check if ppO2 > 3.30 bar
 	btfsc	xC+1,7
-	bra		TFT_warnings_color			; Yes, warn in warning color
-; Check for low ppo2
+	bra		TFT_warnings_color			; YES - warn in warning color
+; Check for low ppO2
 	movff	xC+0,sub_a+0
 	movff	xC+1,sub_a+1
 	movff	char_I_ppO2_min,WREG
@@ -144,26 +197,35 @@
 	movff	PRODL,sub_b+0
 	movff	PRODH,sub_b+1
 	call	subU16
-	btfsc	neg_flag
-	bra		TFT_warnings_color			; too low -> Warning Color!
-; Check for high ppo2
-	movff	char_O_deco_warnings,WREG	; bank-safe copy of deco warnings
+	btfsc	neg_flag					; lower than ppO2 min?
+	bra		TFT_warnings_color			; YES - set warning color and return
+; Check for high ppO2
+	movff	char_O_deco_info,WREG		; bank-safe copy of deco info vector
 	btfsc	WREG,deco_flag				; are we in deco?
-	bra		TFT_color_code_gaslist_deco	; YES - take deco max
-	movff	char_I_ppO2_max,WREG		; No  - take travel/bottom max
-	bra		TFT_color_code_gaslist_com
-TFT_color_code_gaslist_deco:
-	movff	char_I_ppO2_max_deco,WREG	; ppo2 max for deco
-TFT_color_code_gaslist_com:
+	bra		TFT_color_code_gaslist_deco	; YES - check against ppO2 max deco only
+										; NO  - check against ppO2 max travel/normal and deco
+; Check for ppO2 max travel/normal
+	movff	char_I_ppO2_max,WREG		; ppo2 max for travel/normal
 	mullw	d'100'						; char_I_ppO2_max*100
 	movff	PRODL,sub_b+0
 	movff	PRODH,sub_b+1
-	infsnz	sub_a+0,F
-	incf	sub_a+1,F					; add 1mbar to avoid warning on equal
+	infsnz	sub_b+0,F					; add 1 mbar to avoid warning on equal
+	incf	sub_b+1,F
 	call	subU16						; sub_c = sub_a - sub_b
-	btfss	neg_flag
-	bra		TFT_warnings_color			; too high -> Warning Color!
-	return
+	btfss	neg_flag					; higher than ppO2 max travel/deco?
+	rcall	TFT_attention_color			; YES - set attention color
+; Check for ppO2 max deco
+TFT_color_code_gaslist_deco:
+	movff	char_I_ppO2_max_deco,WREG	; ppo2 max for deco
+	mullw	d'100'						; char_I_ppO2_max_deco*100
+	movff	PRODL,sub_b+0
+	movff	PRODH,sub_b+1
+	infsnz	sub_b+0,F					; add 1 mbar to avoid warning on equal
+	incf	sub_b+1,F
+	call	subU16						; sub_c = sub_a - sub_b
+	btfss	neg_flag					; higher than ppO2 max deco?
+	bra		TFT_warnings_color			; YES - set warning color and return
+	return								; NO  - keep current color
 
 
 TFT_color_code_ceiling:					; color-code the ceiling depth
@@ -172,32 +234,38 @@
 	SAFE_2BYTE_COPY rel_pressure,sub_a	; NO
 	movff	lo,sub_b+0
 	movff	hi,sub_b+1
-	call	subU16						; sub_c = sub_a - sub_b :  sub_c = rel_pressure [cm] - int_O_ceiling [mbar => cm]
+	call	subU16						; sub_c = sub_a - sub_b :  sub_c = rel_pressure [mbar] - int_O_ceiling [mbar]
 	btfsc	neg_flag					; is ceiling > current depth?
-	bra		TFT_warnings_color			; YES - set to warning  color and return
-	bra		TFT_standard_color			; NO  - set to standard color and return
+	bra		TFT_warnings_color			; YES - set to warning color and return
+	bra		TFT_memo_color				; NO  - set to memo    color and return
 TFT_color_code_ceiling_1:
 	bcf		hi,char_invalid_flag		; clear the invalid flag (bit 7 here)
 	bra		TFT_disabled_color			; set to disabled color and return
 
 
-TFT_color_code_stop:					; color-code the stop depth
+TFT_color_code_stop:					; color-code the stop depth: memo      color if below stop depth,
+										;                            attention color if above stop but below ceiling,
+										;                            warning   color if above stop and ceiling
+										;                            (ceiling depth is calculated using current GF)
 	movff	char_O_deco_gas+0,WREG		; get flag for invalid deco data
 	btfsc	WREG,char_invalid_flag		; is the invalid flag set?
-	bra		TFT_disabled_color			; set to disabled color and return
-	SAFE_2BYTE_COPY rel_pressure,xA		; get current pressure in mbar = cm
-	movlw	LOW d'100'
-	movwf	xB+0
-	clrf	xB+1
-	call	div16x16					; xA/xB=xC with xA as remainder: Divide/100 => xC+0 = current depth in meters
-	movff	char_O_first_deco_depth,WREG; get stop depth in m into WREG
-	subwf	xC+0,W						; compute current depth - stop depth
-	btfsc	STATUS,C					; result negative?
-	bra		TFT_standard_color			; NO  - set to standard color and return
-	bra		TFT_warnings_color			; YES - set to warning  color and return
-
-
-TFT_color_code_depth:					; with actual depth as rel_pressure in [mbar] in hi:lo and threshold depth_warn_mbar [mbar], 16Bit
+	bra		TFT_disabled_color			; YES - set to disabled color and return
+	movff	char_O_first_deco_depth,WREG; NO  - get stop depth in m into WREG
+	subwf	curr_depth,W				;     - compute current depth - stop depth
+	btfsc	STATUS,C					;     - result negative?
+	bra		TFT_memo_color				;       NO  - set to memo color and return
+	movff	int_O_ceiling+0,sub_b+0		;       YES - get ceiling depth in mbar
+	movff	int_O_ceiling+1,sub_b+1		;           - ...
+	btfsc	sub_b+1,char_invalid_flag	;           - is the invalid flag set? (bit 7 here)
+	bra		TFT_warnings_color			;             YES - set to warning color and return
+	SAFE_2BYTE_COPY rel_pressure,sub_a	;             NO  - get current depth in mbar
+	call	subU16						;                 - sub_c = sub_a - sub_b :  sub_c = rel_pressure [cm] - int_O_ceiling [mbar => cm]
+	btfsc	neg_flag					;                 - is ceiling > current depth?
+	bra		TFT_warnings_color			;                   YES - set to warning   color and return
+	bra		TFT_attention_color			;                   NO  - set to attention color and return
+
+
+TFT_color_code_depth:					; with actual depth as rel_pressure in [mbar] in hi:lo and threshold depth_warn_mbar [mbar]
 	movff	lo,sub_a+0
 	movff	hi,sub_a+1
 	movlw	LOW  depth_warn_mbar
@@ -212,25 +280,33 @@
 	bra		TFT_color_code_depth_ppO2	; check depth against MOD and return...
 TFT_color_code_depth_std:
 	btfss	neg_flag
-	bra		TFT_warnings_color			; set to warning  color and return
-	bra		TFT_standard_color			; set to standard color and return...
+	bra		TFT_warnings_color			; set to warning color and return
+	bra		TFT_memo_color				; set to memo    color and return...
 TFT_color_code_depth_ppO2:
 	movff	opt_dive_mode,WREG			; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
 	decfsz	WREG,F						; are we in CCR mode?
 	bra		TFT_color_code_depth_no_ccr	; NO  - continue checking for ppO2
-	btfsc	is_bailout					; YES - check if in bailout
-	bra		TFT_color_code_depth_no_ccr	;       YES - continue checking for ppO2
-	bcf		blinking_depth_warning		; reset warning
-	bra		TFT_standard_color			; no color coding, return.
+	btfss	FLAG_bailout_mode			; YES - check if in bailout
+	bra		TFT_color_code_depth_outside;       NO  - continue checking for outside ZHL16 model
 TFT_color_code_depth_no_ccr:
 	movff	int_O_breathed_ppO2+1,WREG	; get upper byte of currently breathed ppO2
 	btfsc	WREG,int_warning_flag		; is the warning flag set?
 	bra		TFT_color_code_depth_warn	; YES - animate in warning design
-	bcf		blinking_depth_warning		; NO  - reset warning
-	bra		TFT_standard_color			;       set standard color and return
+TFT_color_code_depth_outside:
+	movff	char_O_deco_warnings,WREG	; bank-safe copy of deco warnings
+	btfsc	WREG,outside_warning		; are we currently outside of the ZH-L16 model?
+	bra		TFT_color_code_depth_warn	; YES
+	btfsc	WREG,outside_attention		; are we near to outside of the ZH-L16 model?
+	bra		TFT_color_code_depth_att	; YES
+	bcf		blinking_depth_warning		; NO  - terminate warning   blinking
+	bcf		blinking_depth_attention	;     - terminate attention blinking
+	bra		TFT_memo_color				;     - set memo  color and return
 TFT_color_code_depth_warn:
-	bsf		blinking_depth_warning		; set warning
+	bsf		blinking_depth_warning		; activate warning blinking
 	bra		TFT_warnings_color			; set to warning color and return...
+TFT_color_code_depth_att:
+	bsf		blinking_depth_attention	; activate attention blinking
+	bra		TFT_attention_color			; set to attention color and return...
 
 
 	global	TFT_color_code_cns
@@ -238,20 +314,20 @@
 	btfss	hi,int_invalid_flag			; is the invalid flag set?
 	bra		TFT_color_code_cns_1		; NO
 	bcf		hi,int_invalid_flag			; YES - clear invalid flag
-	bcf		hi,int_warning_flag			;       clear warning	flag (it may be set)
+	bcf		hi,int_warning_flag			;       clear warning   flag (it may be set)
 	bcf		hi,int_attention_flag		;       clear attention flag (it may be set)
 	bra		TFT_disabled_color			;       set to disabled color and return
 TFT_color_code_cns_1
 	btfss	hi,int_warning_flag			; is the warning flag set?
 	bra		TFT_color_code_cns_2		; NO
-	bcf		hi,int_warning_flag			; YES - clear warning	flag
-	bcf		hi,int_attention_flag		;	- clear attention flag (it may be set)
-	bra		TFT_warnings_color			;		set to warning color and return
+	bcf		hi,int_warning_flag			; YES - clear warning   flag
+	bcf		hi,int_attention_flag		;     - clear attention flag (it may be set)
+	bra		TFT_warnings_color			;     - set to warning color and return
 TFT_color_code_cns_2:
 	btfss	hi,int_attention_flag		; is the attention flag set?
-	bra		TFT_standard_color			; NO  - set to standard color and return
+	bra		TFT_memo_color				; NO  - set to memo color and return
 	bcf		hi,int_attention_flag		; YES - clear attention flag
-	bra		TFT_attention_color		;	- set to attention color and return
+	bra		TFT_attention_color			;     - set to attention color and return
 
 
 TFT_color_code_gf:
@@ -263,7 +339,7 @@
 	bra		TFT_warnings_color			;       YES - set to warning color and return
 	btfsc	hi,int_attention_flag		;       NO  - is the attention flag set?
 	bra		TFT_attention_color			;             YES - set to attention color and return
-	bra		TFT_standard_color			;             NO  - set to normal    color and return
+	bra		TFT_memo_color				;             NO  - set to memo      color and return
 
 
 TFT_color_code_ppo2:					; color-code ppO2 values (ppO2 in hi:lo [cbar]) by its warning flags
@@ -284,11 +360,11 @@
 TFT_color_code_ppo2_2:
 	bcf		hi,int_high_flag			; clear high warning flag (it may be set)
 	bcf		hi,int_low_flag				; clear low  warning flag (it may be set)
-	bra		TFT_standard_color			; set to standard color and return
+	bra		TFT_memo_color				; set to memo color and return
 
 
 TFT_color_code_ppo2_hud:				; color-code ppO2 values (ppO2 in --:lo [cbar]) by its value
-	movff	char_O_deco_warnings,WREG	; get the deco warnings vector
+	movff	char_O_deco_info,WREG		; get the deco info vector
 	btfss	WREG,deco_flag				; are we in deco?
 	bra		TFT_color_code_ppo2_hud_a	; NO  - load normal max value as threshold
 	movff	char_I_ppO2_max_deco,WREG	; YES - load deco value as threshold
@@ -303,7 +379,7 @@
 	movff	opt_dive_mode,WREG			; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
 	decfsz	WREG,F						; now:  0=CC, 1=Gauge, 2=Apnea, 3=PSCR
 	bra		TFT_color_code_ppo2_hud_nocc; not CCR...
-	btfsc	is_bailout
+	btfsc	FLAG_bailout_mode
 	bra		TFT_color_code_ppo2_hud_nocc; is bailout, hence not loop mode...
 	movff	char_I_ppO2_min_loop,WREG	; ppO2 min loop mode color coding
 	bra		TFT_color_code_ppo2_hud_cont
@@ -311,15 +387,15 @@
 	movff	char_I_ppO2_min,WREG		; PPO2 min for all other modes
 TFT_color_code_ppo2_hud_cont:
 	cpfslt	lo							; lo < char_I_ppO2_min?
-	bra		TFT_standard_color			; NO  - set standard color and return...
-	bra		TFT_warnings_color			; Yes - set warning  color and return
+	bra		TFT_memo_color				; NO  - set memo    color and return...
+	bra		TFT_warnings_color			; Yes - set warning color and return
 
 
 TFT_color_code_battery:					; color-code the battery display, with battery percent in lo
 	movlw	color_code_battery_low		; get warning threshold
 	cpfsgt	lo							; is battery percent < threshold?
-	bra		TFT_warnings_color			; YES - set to warning  color and return
-	bra		TFT_standard_color			; NO  - set to standard color and return
+	bra		TFT_warnings_color			; YES - set to warning color and return
+	bra		TFT_memo_color				; NO  - set to memo    color and return
 
 
 	global	TFT_color_code_gas
@@ -327,31 +403,30 @@
 	movwf	up							; copy gas number (1-6) to up
 	movlw	color_white					; Default color
 	dcfsnz	up,F
-	movlw	color_white					; Color for Gas 1
+	movlw	color_white					; color for gas 1
 	dcfsnz	up,F
-	movlw	color_green					; Color for Gas 2
+	movlw	color_green					; color for gas 2
 	dcfsnz	up,F
-	movlw	color_red					; Color for Gas 3
+	movlw	color_red					; color for gas 3
 	dcfsnz	up,F
-	movlw	color_yellow				; Color for Gas 4
+	movlw	color_yellow				; color for gas 4
 	dcfsnz	up,F
-	movlw	color_cyan					; Color for Gas 5
+	movlw	color_cyan					; color for gas 5
 	dcfsnz	up,F
-	movlw	color_pink					; Color for Gas 6
-	goto	TFT_set_color				; Set Color...
+	movlw	color_pink					; color for gas 6
+	goto	TFT_set_color				; set color...
 
 
 ; ****************************************************************************
 
 	global	TFT_show_OC_startgas_surface
-TFT_show_OC_startgas_surface:			; Show first gas and "OSTC2-like" active gases
+TFT_show_OC_startgas_surface:			; show first gas and "OSTC2-like" active gases
 	; Show first gas
 	WIN_SMALL surf_decotype_column+.1,surf_decotype_row+.30
-	extern	get_first_gas_to_WREG,gaslist_strcat_gas
-	call	get_first_gas_to_WREG		; Gets first gas (1-5) into WREG
+	call	get_first_gas_to_WREG		; get first gas (1-5) into WREG
 	decf	WREG,W						; 1-5 -> 0-4
 	movwf	PRODL
-	call	gaslist_strcat_gas			; Input: PRODL : gas number (0..4), Output: Text appended into buffer pointed by FSR2.
+	call	gaslist_strcat_gas			; input: PRODL : gas number (0..4), Output: Text appended into buffer pointed by FSR2.
 	STRCAT_PRINT ""
 	; Show boxes
 	WIN_TOP	 surf_decotype_row+.30+.25
@@ -362,7 +437,7 @@
 	rcall	TFT_standard_color
 	STRCPY_PRINT "1"
 	decfsz	hi,F						; Type = 1 (First)?
-	bra		DISP_active_gas_surfmode3	; No, skip box
+	bra		DISP_active_gas_surfmode3	; NO - skip box
 	WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left1, surf_decotype_boxes_left1+.8	;top, bottom, left, right
 DISP_active_gas_surfmode3:
 	rcall	TFT_disabled_color
@@ -372,7 +447,7 @@
 	WIN_LEFT surf_decotype_boxes_left2+.1
 	STRCPY_PRINT "2"
 	decfsz	hi,F						; Type = 1 (First)?
-	bra		DISP_active_gas_surfmode4	; No, skip box
+	bra		DISP_active_gas_surfmode4	; NO - skip box
 	WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left2, surf_decotype_boxes_left2+.8	;top, bottom, left, right
 DISP_active_gas_surfmode4:
 	rcall	TFT_disabled_color
@@ -382,7 +457,7 @@
 	WIN_LEFT surf_decotype_boxes_left3+.1
 	STRCPY_PRINT "3"
 	decfsz	hi,F						; Type = 1 (First)?
-	bra		DISP_active_gas_surfmode5	; No, skip box
+	bra		DISP_active_gas_surfmode5	; NO - skip box
 	WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left3, surf_decotype_boxes_left3+.8	;top, bottom, left, right
 DISP_active_gas_surfmode5:
 	rcall	TFT_disabled_color
@@ -392,7 +467,7 @@
 	WIN_LEFT surf_decotype_boxes_left4+.1
 	STRCPY_PRINT "4"
 	decfsz	hi,F						; Type = 1 (First)?
-	bra		DISP_active_gas_surfmode6	; No, skip box
+	bra		DISP_active_gas_surfmode6	; NO - skip box
 	WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left4, surf_decotype_boxes_left4+.8	;top, bottom, left, right
 DISP_active_gas_surfmode6:
 	rcall	TFT_disabled_color
@@ -401,11 +476,12 @@
 	rcall	TFT_standard_color
 	WIN_LEFT surf_decotype_boxes_left5+.1
 	STRCPY_PRINT "5"
-	rcall	TFT_standard_color			; Reset color
-	decfsz	hi,F						; Type = 1 (First)?
-	return								; no, Done.
+	rcall	TFT_standard_color			; reset color
+	decfsz	hi,F						; type = 1 (First)?
+	bra		DISP_active_gas_surfmode7	; NO - done
 	WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left5, surf_decotype_boxes_left5+.8	;top, bottom, left, right
-	return								; Done.
+DISP_active_gas_surfmode7:
+	return								; done
 
 
 	global	TFT_show_color_schemes
@@ -422,54 +498,54 @@
 	; Show some demo screen
 
 	; Depth demo
-	call	TFT_standard_color
-	WIN_MEDIUM	.3,.54
+	call	TFT_memo_color
+	WIN_MEDIUM .3,.54
 	movlw	LOW  .5172
 	movwf	lo
 	movlw	HIGH .5172
 	movwf	hi
 	bsf		leftbind
 	bsf		ignore_digit4
-	output_16							; Full meters in Big font
+	output_16							; full meters in big font
 	bcf		leftbind
-	STRCAT_PRINT ""						; Display full meters
-	WIN_SMALL	.25,.66
-	movlw	LOW	 .5172
+	STRCAT_PRINT ""						; display full meters
+	WIN_SMALL .25,.66
+	movlw	LOW  .5172
 	movwf	lo
-	movlw	HIGH	.5172
+	movlw	HIGH .5172
 	movwf	hi
 	PUTC	"."
 	movlw	d'4'
 	movwf	ignore_digits
-	bsf		ignore_digit5
+	bsf		ignore_digit5				; (flag will be cleared by output_16)
 	output_16dp	d'0'					; .1m in SMALL font
-	STRCAT_PRINT ""						; Display decimeters
+	STRCAT_PRINT ""						; display decimeters
 	WIN_FONT FT_SMALL
 
 	; Max. Depth demo
-	WIN_MEDIUM	.64,.54
+	WIN_MEDIUM .64,.54
 	bsf		ignore_digit4				; no 0.1m
 	bsf		leftbind
-	movlw	LOW	 .6349
+	movlw	LOW  .6349
 	movwf	lo
-	movlw	HIGH	.6349
+	movlw	HIGH .6349
 	movwf	hi
 	output_16
-	STRCAT_PRINT ""						; Display full meters
+	STRCAT_PRINT ""						; display full meters
 	bcf		leftbind
 	; .1m in SMALL font
 	WIN_SMALL .87,.66
 	PUTC	"."
 	movlw	d'4'
 	movwf	ignore_digits
-	bsf		ignore_digit5
+	bsf		ignore_digit5				; (flag will be cleared by output_16)
 	bsf		leftbind
-	movlw	LOW	 .6349
+	movlw	LOW  .6349
 	movwf	lo
-	movlw	HIGH	.6349
+	movlw	HIGH .6349
 	movwf	hi
 	output_16dp	d'0'
-	STRCAT_PRINT ""						; Display decimeters
+	STRCAT_PRINT ""						; display decimeters
 	bcf		leftbind
 
 	; Divetime demo
@@ -477,34 +553,45 @@
 	clrf	hi
 	WIN_MEDIUM .103, .54
 	output_16_3							; limit to 999 and display only (0-999)
-	STRCAT_PRINT ""						; Show minutes in large font
+	STRCAT_PRINT ""						; show minutes in large font
 	WIN_SMALL .139, .66					; left position for two sec figures
 	PUTC	':'
 	bsf		leftbind
 	movff	secs,lo
 	output_99x
 	bcf		leftbind
-	STRCAT_PRINT ""						; Show seconds in small font
+	STRCAT_PRINT ""						; show seconds in small font
 
 	bcf		divemode					; don't stay in divemode
 	return
 
+
 	global	TFT_divemode_mask
-TFT_divemode_mask:						; Displays mask in divemode
+TFT_divemode_mask:						; displays mask in divemode
 	bcf		FLAG_TFT_divemode_mask
 	call	TFT_divemask_color
 	WIN_TINY dm_mask_depth_column,dm_mask_depth_row
 	STRCAT_TEXT_PRINT tDepth
-	WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row
-	TSTOSS	opt_vsigraph				; 0=skip, 1=draw
 	WIN_TINY dm_mask_maxdepth_column_nvsi,dm_mask_maxdepth_row
+	TSTOSS	opt_vsigraph				; graphical VSI bar enabled?
+	bra		TFT_divemode_mask_1			; NO
+	WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row ; YES - adopt position
+TFT_divemode_mask_1:
+	btfsc	FLAG_apnoe_mode				; in Apnea mode?
+	bra		TFT_divemode_mask_2			; YES - draw max depth
+	TSTOSS	opt_2ndDepthDisp			; draw avg depth?
+	bra		TFT_divemode_mask_2			; NO  - draw max depth
+	STRCAT_TEXT_PRINT tAvgDepth			; YES
+	bra		TFT_divemode_mask_3
+TFT_divemode_mask_2:
 	STRCAT_TEXT_PRINT tMaxDepth
+TFT_divemode_mask_3:
 	WIN_TINY dm_mask_divetime_column,dm_mask_divetime_row
 	STRCAT_TEXT_PRINT tDivetime
 	bra		TFT_standard_color			; and return...
 
 	global	TFT_divemode_mask_alternative
-TFT_divemode_mask_alternative:			; Alt. mask for divemode
+TFT_divemode_mask_alternative:			; alt. mask for divemode
 	bcf		FLAG_TFT_divemode_mask_alt
 	call	TFT_divemask_color
 	WIN_TINY dm_mask_depth_column,dm_mask_depth_row
@@ -515,16 +602,16 @@
 
 	global	TFT_draw_gassep_line
 TFT_draw_gassep_line:
-	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
+	btfsc	FLAG_apnoe_mode				; ignore in Apnoe mode
 	return
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
-	bra		TFT_standard_color			; and return...
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
+	bra		TFT_standard_color			; NO  - set standard color and return
 
 ;=========================================================================
 
 	global	TFT_display_velocity
-TFT_display_velocity:					; With divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0
+TFT_display_velocity:					; with divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0
 	bcf		STATUS,C
 	movlw	velocity_display_threshold_1; lowest threshold for display vertical velocity
 	subwf	divA+0,W
@@ -532,24 +619,24 @@
 	bra		TFT_velocity_clear			; lower then threshold. Clear text and graph (If active)
 
 	; We have something to display
-	bsf		display_velocity			; Set flag
+	bsf		display_velocity			; set flag
 	; check if descending: no warning color if descending
-	rcall	TFT_standard_color
-	btfsc	neg_flag_velocity			; Ignore for descent!
-	rcall	TFT_velocity_set_color		; Set color for text and set threshold for graph
-
-	rcall	TFT_velocity_disp			; Show the text
-
-	TSTOSS	opt_vsigraph				; =1: draw the graphical VSI bar
-	bra		TFT_display_velocity_done	; No graph
-
-	btfsc	alternative_divelayout		; Alternative layout?
-	bra		TFT_display_velocity_done	; Yes, no graph! (no room when divetime minutes is three figures)
-
-	btfsc	neg_flag_velocity			; Ignore for descent!
-	rcall	TFT_velocity_graph			; Show the graph
-	btfss	neg_flag_velocity			; Ignore for descent!
-	rcall	TFT_velocity_clear_graph	; Clear the graph for descent
+	rcall	TFT_memo_color
+	btfsc	neg_flag_velocity			; ignore for descent
+	rcall	TFT_velocity_set_color		; set color for text and set threshold for graph
+
+	rcall	TFT_velocity_disp			; show the text
+
+	TSTOSS	opt_vsigraph				; graphical VSI bar enabled?
+	bra		TFT_display_velocity_done	; NO
+
+	btfsc	alternative_divelayout		; alternative layout?
+	bra		TFT_display_velocity_done	; YES - no graph! (no room when divetime minutes is three digits)
+
+	btfsc	neg_flag_velocity			; ignore for descent
+	rcall	TFT_velocity_graph			; show the graph
+	btfss	neg_flag_velocity			; ignore for descent
+	rcall	TFT_velocity_clear_graph	; clear the graph for descent
 
 TFT_display_velocity_done:
 	bra		TFT_standard_color			; and return!
@@ -580,17 +667,6 @@
 	TSTOSS	opt_vsitextv2					; 0=standard, 1=dynamic
 	bra		TFT_velocity_set_color_static	; static ascend rate limit
 
-	; get the actual depth in m
-	SAFE_2BYTE_COPY rel_pressure, lo
-	call	adjust_depth_with_salinity		; computes salinity setting into lo:hi [mbar]
-	movff	hi,xA+1
-	movff	lo,xA+0
-	movlw	LOW		d'100'
-	movwf	xB+0
-	clrf	xB+1							; Devide/100 -> xC+0 = Depth in m
-	call	div16x16						; xA/xB=xC with xA as remainder
-	;movf	xC+0,W							; Depth in m
-
 	; point to speed table
 	movlw	LOW   (TFT_speed_table-.3)
 	movwf	TBLPTRL
@@ -603,35 +679,34 @@
 	TBLRD*+									; 3 dummy reads
 	TBLRD*+
 	TBLRD*+
-
-	TBLRD*+									; Get speed threshold
-	movf	xC+0,W							; Depth in m
-	cpfsgt	TABLAT							; Threshold > current depth ?
-	bra		TFT_velocity_set_color_skip		; No
-
-	TBLRD*+									; Get warning speed threshold
+	TBLRD*+									; get speed threshold
+	movf	curr_depth,W					; current depth in m
+	cpfsgt	TABLAT							; threshold > current depth ?
+	bra		TFT_velocity_set_color_skip		; NO - loop
+
+	TBLRD*+									; get warning speed threshold
 	movf	TABLAT,W
-	movwf	divA+1							; Copy for graph routine
+	movwf	divA+1							; copy for graph routine
 	cpfslt	divA+0							; smaller then actual value (in m/min)?
-	bra	 TFT_warnings_color					; Set Warning color (And return)
-	TBLRD*+									; Get attention speed threshold
+	bra		TFT_warnings_color					; set Warning color (And return)
+	TBLRD*+									; get attention speed threshold
 	movf	TABLAT,W
 	cpfslt	divA+0							; smaller then actual value (in m/min)?
-	bra		TFT_attention_color				; set attention color (and return)
-	bra		TFT_standard_color				; ...and return
+	bra		TFT_attention_color				; NO  - set attention color and return
+	bra		TFT_memo_color					; YES - set memo      color and return
 
 TFT_velocity_set_color_static:
 	movlw	color_code_velocity_warn_high	; in m/min
-	movwf	divA+1							; Copy for graph routine
+	movwf	divA+1							; copy for graph routine
 	cpfslt	divA+0							; smaller then actual value (in m/min)?
-	bra		TFT_warnings_color				; Set Warning color (And return)
+	bra		TFT_warnings_color				; set Warning color (And return)
 	movlw	color_code_velocity_attn_high	; in m/min
 	cpfslt	divA+0							; smaller then actual value (in m/min)?
-	bra		TFT_attention_color				; set attention color (and return)
-	bra		TFT_standard_color				; ...and return
+	bra		TFT_attention_color				; NO  - set attention color and return
+	bra		TFT_memo_color					; YES - set memo      color and return
 
 TFT_velocity_disp:
-	WIN_SMALL	dm_velocity_text_column, dm_velocity_text_row
+	WIN_SMALL dm_velocity_text_column, dm_velocity_text_row
 	TSTOSS	opt_units						; 0=Meters, 1=Feets
 	bra		TFT_velocity_metric
 ;TFT_velocity_imperial:
@@ -639,7 +714,7 @@
 	mullw	.100							; PRODL:PRODH = mbar/min
 	movff	PRODL,lo
 	movff	PRODH,hi
-	call	convert_mbar_to_feet			; convert value in lo:hi from mbar to feet
+	call	convert_mbar_to_feet			; convert value in hi:lo from mbar to feet
 	movlw	'-'
 	btfsc	neg_flag_velocity
 	movlw	'+'
@@ -647,7 +722,7 @@
 	bsf		leftbind
 	output_16
 	bcf		leftbind
-	STRCAT_TEXT_PRINT tVelImperial			; Unit switch
+	STRCAT_TEXT_PRINT tVelImperial			; unit switch
 	return
 
 TFT_velocity_metric:
@@ -657,37 +732,36 @@
 	movlw	'+'
 	movwf	POSTINC2
 	output_99
-	STRCAT_TEXT_PRINT tVelMetric			; Unit switch
+	STRCAT_TEXT_PRINT tVelMetric			; unit switch
 	return
 
 TFT_velocity_graph:							; divA+0 = m/min
 	; divA+0 holding the ascend speed in m/min
-	movff	divA+0,hi						; Copy
+	movff	divA+0,hi						; copy
 	WIN_BOX_BLACK	dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right -> outer frame
-	rcall	TFT_divemask_color_dive			; Color -> WREG
+	rcall	TFT_divemask_color_dive			; color -> WREG
 	WIN_FRAME_COLOR	dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;inner frame
-	rcall	TFT_divemask_color_dive			; Color -> WREG
+	rcall	TFT_divemask_color_dive			; color -> WREG
 	WIN_FRAME_COLOR	dm_velobar_top+.10, dm_velobar_bot-.10, dm_velobar_lft, dm_velobar_rgt ;inner frame
-	rcall	TFT_divemask_color_dive			; Color -> WREG
+	rcall	TFT_divemask_color_dive			; color -> WREG
 	WIN_FRAME_COLOR	dm_velobar_top+.20, dm_velobar_bot-.20, dm_velobar_lft, dm_velobar_rgt ;inner frame
-	rcall	TFT_divemask_color_dive			; Color -> WREG
+	rcall	TFT_divemask_color_dive			; color -> WREG
 	WIN_FRAME_COLOR	dm_velobar_top+.30, dm_velobar_bot-.30, dm_velobar_lft, dm_velobar_rgt ;inner frame
 	
 	movff	divA+1,xA+0						; m/min for warning level (upper two blocks)
 	clrf	xA+1
 	movlw	.5
-	movwf	xB+0							; Threshold for color warning (5 color normal + 2 color warning)
+	movwf	xB+0							; threshold for color warning (5 color normal + 2 color warning)
 	clrf	xB+1
-	call	div16x16						;xA/xB=xC with xA as remainder
+	call	div16x16						; xC = xA / xB with xA as remainder
 	; xC+0 holds step size in m/min (e.g. =3 for 15m/min warning threshold)
-	movff	hi,xA+0							; Velocity in m/min
+	movff	hi,xA+0							; velocity in m/min
 	clrf	xA+1
-	movff	xC+0,xB+0						; Step size
+	movff	xC+0,xB+0						; step size
 	clrf	xB+1
-	call	div16x16						;xA/xB=xC with xA as remainder
-	; xC+0 now holds amount of segments to show
-
-	movff	hi,divA+0						; Copy back for numeric output
+	call	div16x16						; xC = xA / xB with xA as remainder
+											; xC+0 now holds amount of segments to show
+	movff	hi,divA+0						; copy back for numeric output
 	movlw	d'7'
 	cpfslt	xC+0
 	bra		DISP_graph_vel_7
@@ -709,67 +783,70 @@
 	movlw	d'1'
 	cpfslt	xC+0
 	bra		DISP_graph_vel_1
-	bra		DISP_graph_vel_0				; Should not happen...
+	bra		DISP_graph_vel_0			; should not happen...
 
 DISP_graph_vel_7:
-	rcall	TFT_warnings_color_dive		; Color -> WREG
+	rcall	TFT_warnings_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.2, dm_velobar_top+.8, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_6:
-	rcall	TFT_warnings_color_dive		; Color -> WREG
+	rcall	TFT_warnings_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.12, dm_velobar_top+.18, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_5:
-	rcall	TFT_attention_color_dive	; Color -> WREG
+	rcall	TFT_attention_color_dive	; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.22, dm_velobar_top+.28, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_4:
-	rcall	TFT_standard_color_dive		; Color -> WREG
+	rcall	TFT_standard_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.32, dm_velobar_top+.38, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_3:
-	rcall	TFT_standard_color_dive		; Color -> WREG
+	rcall	TFT_standard_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.42, dm_velobar_top+.48, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_2:
-	rcall	TFT_standard_color_dive		; Color -> WREG
+	rcall	TFT_standard_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.52, dm_velobar_top+.58, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_1:
-	rcall	TFT_standard_color_dive		; Color -> WREG
+	rcall	TFT_standard_color_dive		; color -> WREG
 	WIN_BOX_COLOR dm_velobar_top+.62, dm_velobar_top+.68, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right
 DISP_graph_vel_0:
-	return								; Done.
+	return								; done
+
 
 	global	TFT_velocity_clear
 TFT_velocity_clear:
-	btfss	display_velocity			; Velocity was not displayed, do not delete
+	btfss	display_velocity			; velocity was not displayed, do not delete
 	return
-	bcf		display_velocity			; Velocity was displayed, delete velocity now
+	bcf		display_velocity			; velocity was displayed, delete velocity now
 	; Clear Text
 	WIN_BOX_BLACK	dm_velocity_text_row, dm_velocity_text_bot, dm_velocity_text_column, dm_velocity_text_rgt ; top, bottom, left, right
 
-	TSTOSS	opt_vsigraph				; =1: draw the graphical VSI bar
-	return								; No graph to clear
+	TSTOSS	opt_vsigraph				; graphical VSI bar enabled?
+	return								; NO - no graph to clear
 TFT_velocity_clear_graph:
 	; Clear Graph
-	WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right
+	WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt		; top, bottom, left, right
 	return
 
 ;=========================================================================
 
 	global	TFT_clear_decoarea
 TFT_clear_decoarea:
-	WIN_BOX_BLACK	dm_decostop_1st_stop_row, .239, dm_decostop_1st_stop_column, .159 ; top, bottom, left, right
+	WIN_BOX_BLACK	dm_decostop_1st_stop_row, .239, dm_decostop_1st_stop_column, .159	; top, bottom, left, right
 	return
 
 
 	global	TFT_clear_divemode_menu
 TFT_clear_divemode_menu:
-	WIN_BOX_BLACK	dm_menu_row, dm_menu_lower, dm_menu_left, dm_menu_right	; top, bottom, left, right
+	WIN_BOX_BLACK	dm_menu_row-.2, dm_menu_lower, dm_menu_left, dm_menu_right			; top, bottom, left, right - starts 2 pixel higher to completely wipe away the temperature display
 	return
 
 
 	global	TFT_display_ndl_mask
 TFT_display_ndl_mask:
 	bcf		FLAG_TFT_display_ndl_mask
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
-	call	TFT_clear_decoarea			; Clear Dekostop and Dekosum
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	return								; YES - return
+	call	TFT_clear_decoarea			; NO  - clear stop depth and TTS
 	call	TFT_divemask_color
 	WIN_STD dm_ndl_text_column, dm_ndl_text_row
 	STRCPY_TEXT_PRINT tNDL				; NDL
@@ -779,18 +856,18 @@
 	global	TFT_display_tts
 TFT_display_tts:
 	bcf		FLAG_TFT_display_tts
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
-	call	TFT_standard_color
-	movff	int_O_ascenttime+0,lo		; TTS
-	movff	int_O_ascenttime+1,hi		; on 16bits
-	btfss	hi,int_invalid_flag			; is the invalid flag set?
-	bra		TFT_display_tts_1			; NO
-	bcf		hi,int_invalid_flag			; YES - clear flag
-	call	TFT_disabled_color			;       switch to disabled color
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
+	call	TFT_memo_color				; NO  - set memo color
+	movff	int_O_ascenttime+0,lo		;     - TTS
+	movff	int_O_ascenttime+1,hi		;     - on 16 bits
+	btfss	hi,int_invalid_flag			;     - is the invalid flag set?
+	bra		TFT_display_tts_1			;     - NO
+	bcf		hi,int_invalid_flag			;     - YES - clear flag
+	call	TFT_disabled_color			;           - switch to disabled color
 TFT_display_tts_1:
 	WIN_MEDIUM dm_tts_value_column, dm_tts_value_row
-	output_16_3							; Displays only 0...999
+	output_16_3							; display only 0...999
 	STRCAT_PRINT "'"
 	return
 
@@ -798,40 +875,40 @@
 	global	TFT_display_ndl
 TFT_display_ndl:
 	bcf		FLAG_TFT_display_ndl
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
 	WIN_MEDIUM	dm_ndl_value_column, dm_ndl_value_row
-	call	TFT_standard_color
-	movff	char_O_nullzeit,lo			; Get NDL from C-code
+	call	TFT_memo_color
+	movff	char_O_nullzeit,lo			; get NDL from C-code
 	output_8
 	STRCAT_PRINT "'"
 	return
 
 
-	global	TFT_big_deco_alt			; The big deco
+	global	TFT_big_deco_alt			; the big deco
 TFT_big_deco_alt:
 	bcf		FLAG_TFT_big_deco_alt
 
-	btfss	decostop_active				; deco?
-	bra		TFT_big_deco_ndl_alt		; NDL
+	btfss	decostop_active				; deco stop shown?
+	bra		TFT_big_deco_ndl_alt		; NO - show NDL
 
 	; Deco
 	bcf		FLAG_TFT_display_deko
 	call	TFT_divemask_color
 	WIN_STD .70,.165
 	STRCPY_TEXT_PRINT tTTS				; TTS
-	rcall	TFT_standard_color
+	rcall	TFT_memo_color
 
 	; TTS
 	WIN_LARGE	.97,.170
-	movff	int_O_ascenttime+0,lo		; TTS
-	movff	int_O_ascenttime+1,hi		; on 16bits
+	movff	int_O_ascenttime+0,lo		; get the TTS
+	movff	int_O_ascenttime+1,hi		;
 	btfss	hi,int_invalid_flag			; is the invalid flag set?
 	bra		TFT_display_tts_alt_1		; NO
 	bcf		hi,int_invalid_flag			; YES - clear flag
-	call	TFT_disabled_color			;       switch to disabled color
+	call	TFT_disabled_color			;     - switch to disabled color
 TFT_display_tts_alt_1:
-	output_16_3							; Displays only 0...999
+	output_16_3							; display only 0...999
 	STRCAT_PRINT ""
 
 	; 1st Stop
@@ -840,9 +917,9 @@
 	STRCPY_TEXT_PRINT tDiveSafetyStop	; "Stop"
 
 	WIN_LARGE .60,.95
-	call	TFT_color_code_stop			; Color-code Output
-	movff	char_O_first_deco_depth,lo	; stop depth in m
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
+	call	TFT_color_code_stop				; color-code output
+	movff	char_O_first_deco_depth,lo		; stop depth in m
+	rcall	TFT_display_deko_output_depth	; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft)
 	STRCAT_PRINT ""
 
 	; m or ft after the stop depth
@@ -855,28 +932,36 @@
 	STRCAT_TEXT_PRINT tMeters
 TFT_display_tts_alt_1_com:
 	WIN_LARGE .117,.95
-	movff	char_O_first_deco_time,lo	; length of first stop in min
+	movff	char_O_first_deco_time,lo	; get stop time in minutes
+	tstfsz	lo							; stop time = 0 ?
+	bra		TFT_display_tts_alt_2		; NO  - print time
+	STRCAT_PRINT ".."					; YES - special treatment
+	bra		TFT_display_tts_alt_exit
+TFT_display_tts_alt_2:
 	bcf		leftbind
 	output_99
 	STRCAT_PRINT ""
+TFT_display_tts_alt_exit:
 	goto	TFT_standard_color			; and return...
-	
+
+
 TFT_big_deco_ndl_alt:
 	; NDL
 	bcf		FLAG_TFT_display_ndl
 	bcf		decostop_active				; clear flag (again)
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	bra		TFT_big_deco_ndl_alt_1		; YES - skip NDL
 	call	TFT_divemask_color
 	WIN_STD .70,.165
 	STRCPY_TEXT_PRINT tNDL				; NDL
-	call	TFT_standard_color
+	call	TFT_memo_color
 	WIN_LARGE .97,.170
-	call	TFT_standard_color
-	movff	char_O_nullzeit,lo			; Get NDL from C-code
+	movff	char_O_nullzeit,lo			; get NDL from C-code
 	output_8
 	STRCAT_PRINT ""
-
+TFT_big_deco_ndl_alt_1:
 	btfsc	FLAG_TFT_show_safety_stop
-	bra		TFT_show_safety_stop_alt	; Show safety stop (And return)
+	bra		TFT_show_safety_stop_alt	; show safety stop (and return)
 	; Clear any safety stop or Decostop
 TFT_no_more_safety_stop_alt:
 	WIN_BOX_BLACK	dm_customview_row, .150, .0, .159	; top, bottom, left, right
@@ -885,17 +970,17 @@
 
 TFT_show_safety_stop_alt:
 	bcf		FLAG_TFT_show_safety_stop
-	tstfsz	safety_stop_countdown		; Countdown at zero?
-	bra		TFT_show_safety_stop_alt2	; No, show stop
-	bcf		show_safety_stop			; Clear flag
-	btfss	safety_stop_active			; Displayed?
-	return								; No
-	bcf		safety_stop_active			; Clear flag
-	bra		TFT_no_more_safety_stop_alt	; Yes, Clear stop ; and return...
+	tstfsz	safety_stop_countdown		; countdown at zero?
+	bra		TFT_show_safety_stop_alt2	; NO - show stop
+	bcf		show_safety_stop			; clear flag
+	btfss	safety_stop_active			; displayed?
+	return								; NO
+	bcf		safety_stop_active			; YES - clear flag
+	bra		TFT_no_more_safety_stop_alt	;     - clear stop and return
 
 TFT_show_safety_stop_alt2:
-	bsf		safety_stop_active			; Set flag
-	decf	safety_stop_countdown,F		; Reduce countdown
+	bsf		safety_stop_active			; set flag
+	decf	safety_stop_countdown,F		; reduce countdown
 
 	call	TFT_divemask_color
 	WIN_STD	.50,dm_customview_row
@@ -904,7 +989,7 @@
 	WIN_LARGE	.90,.95
 	movff	safety_stop_countdown,lo
 	clrf	hi
-	call	convert_time				; converts hi:lo in seconds to mins (hi) and seconds (lo)
+	call	convert_time				; converts hi:lo in seconds to mins (up:hi) and seconds (lo)
 	movf	hi,W
 	movff	lo,hi
 	movwf	lo							; exchange lo and hi
@@ -919,50 +1004,80 @@
 	output_99x
 	STRCAT_PRINT ""
 	WIN_FONT FT_SMALL
-	goto	TFT_standard_color			; and return...
+	bra		TFT_display_exit_1
 
 
 	global	TFT_divemode_warning
 TFT_divemode_warning:
-	bcf		FLAG_TFT_divemode_warning
-	bsf		dive_warning_displayed				; =1: The warning sign is shown
+	bcf		FLAG_TFT_divemode_warning	; clear job flag
+	bsf		dive_warning_displayed		; set advice/attention/warning sign is shown flag
 	WIN_TOP  dm_warning_icon_row
 	WIN_LEFT dm_warning_icon_column
-	TFT_WRITE_PROM_IMAGE dive_warning2_block	; Show Warning icon
+	btfsc	message_warning				; do we have a warning?
+	bra		TFT_divemode_warning_1		; YES - show warning   sign
+	btfsc	message_attention			; NO  - do we have an attention?
+	bra		TFT_divemode_warning_2		;       YES        - show attention sign
+	bra		TFT_divemode_warning_3		;       NO to both - must be an advice then
+
+dive_warning2_warning_colors:			; custom colors table for dive_warning2 icon - warning
+	db	.4, 0							; #colors, spare
+	dw	0x0000							; color 0x00: outside	black
+	dw	0xff80							; color 0x01: triangle	yellow
+	dw	0xff80							; color 0x02: excl.mark	yellow
+	dw	0xf800							; color 0x03: inside	red
+
+dive_warning2_advice_colors:			; custom colors table for dive_warning2 icon - advice
+	db	.4, 0							; #colors, spare
+	dw	0x0000							; color 0x00: outside	black
+	dw	0xffff							; color 0x01: triangle	white
+	dw	0xffff							; color 0x02: excl.mark	white
+	dw	0x0780							; color 0x03: inside	green
+
+TFT_divemode_warning_1:
+	TFT_WRITE_PROM_IMAGE_CUST_COLOR dive_warning2_warning_colors
+	TFT_WRITE_PROM_IMAGE_BY_LABEL   dive_warning2_block	; output warning   sign (with custom  colors)
 	return
+TFT_divemode_warning_2:
+	TFT_WRITE_PROM_IMAGE_BY_LABEL   dive_warning2_block	; output attention sign (with default colors)
+	return
+TFT_divemode_warning_3:
+	TFT_WRITE_PROM_IMAGE_CUST_COLOR dive_warning2_advice_colors
+	TFT_WRITE_PROM_IMAGE_BY_LABEL   dive_warning2_block	; output advice    sign (with custom  colors)
+	return
+
 
 	global	TFT_divemode_warning_clear
 TFT_divemode_warning_clear:
-	bcf		FLAG_TFT_divemode_warning_clear
-	btfss	dive_warning_displayed				; =1: The warning sign is shown
-	return
-	bcf		dive_warning_displayed				; clear only once
+	bcf		FLAG_TFT_divemode_warning_clear	; clear job flag
+	btfss	dive_warning_displayed			; advice/attention/warning sign is shown?
+	return									; NO
+	bcf		dive_warning_displayed			; YES - clear advice/attention/warning sign and its flag
 	WIN_BOX_BLACK dm_warning_icon_row, dm_warning_icon_bot, dm_warning_icon_column, dm_warning_icon_rgt ; top, bottom, left, right
 	return
 
+
 	global	TFT_display_deko_mask
 TFT_display_deko_mask:
 	bcf		FLAG_TFT_display_deko_mask
-	btfsc	divemode_menu			; Is the dive mode menu shown? 
-	return							; Yes, return
-	rcall	TFT_clear_decoarea		; Clear Dekostop and Dekosum (and NDL in this case)
+	btfsc	divemode_menu			; is the dive mode menu shown? 
+	return							; YES - return
+	rcall	TFT_clear_decoarea		; clear decostop and decosum (and NDL in this case)
 	WIN_STD dm_tts_text_column, dm_tts_text_row
 	call	TFT_divemask_color
 	STRCPY_TEXT_PRINT tTTS			; TTS
-	call	TFT_standard_color
-	bcf		show_safety_stop		; Clear safety stop flag
-	return
-
-
-TFT_display_deko_output_depth:		; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (for ft)
+	bcf		show_safety_stop		; clear safety stop flag
+	bra		TFT_display_exit_1
+
+
+TFT_display_deko_output_depth:		; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft)
 	TSTOSS	opt_units				; 0=m, 1=ft
-	bra	TFT_display_deko_output_metric
+	bra		TFT_display_deko_output_metric
 ;TFT_display_deko_output_imperial:
 	movf	lo,W					; lo = m
 	mullw	.100					; PRODL:PRODH = mbar
 	movff	PRODL,lo
 	movff	PRODH,hi
-; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops...
+	; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops...
 	movff	lo,xA+0
 	movff	hi,xA+1
 	movlw	LOW  d'334'				; 334feet/100m
@@ -985,18 +1100,18 @@
 	bcf		leftbind
 	btfsc	alternative_divelayout
 	bsf		leftbind				; left for alternative layout mode
-	bsf		ignore_digit4			; Only full feet
+	bsf		ignore_digit4			; only full feet
 	output_16
 	btfsc	alternative_divelayout
-	return							; Not for alternative layout mode
-	STRCAT_TEXT	tFeets1
+	return							; not for alternative layout mode
+	STRCAT_TEXT tFeets1
 	return
 
 TFT_display_deko_output_metric:
 	output_99
 	btfsc	alternative_divelayout
-	return							; Not for alternative layout mode
-	STRCAT_TEXT	tMeters
+	return							; not for alternative layout mode
+	STRCAT_TEXT tMeters
 	PUTC	' '
 	return
 
@@ -1004,165 +1119,125 @@
 	global	TFT_display_deko
 TFT_display_deko:
 	bcf		FLAG_TFT_display_deko
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
+	btfsc	divemode_menu					; is the dive mode menu shown?
+	return									; YES - return
 	WIN_MEDIUM dm_decostop_1st_stop_column, dm_decostop_1st_stop_row
-	call	TFT_color_code_stop			; Color-code Output
-	movff	char_O_first_deco_depth,lo	; stop depth in m
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_first_deco_time,lo	; length of first stop in min
-	output_99
+	call	TFT_color_code_stop				; color-code output
+	movff	char_O_first_deco_depth,lo		; stop depth in m
+	rcall	TFT_display_deko_output_depth	; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft)
+	movff	char_O_first_deco_time,lo		; get stop time in minutes
+	tstfsz	lo								; stop time = 0 ?
+	bra		TFT_display_deko_1				; NO  - print minutes
+	STRCAT_PRINT " ..'"						; YES - special treatment
+	bra		TFT_display_exit_1
+TFT_display_deko_1:
+	output_99								; output lo
 	STRCAT_PRINT "'"
-	goto	TFT_standard_color			; and return...
-
-
-	global	TFT_decoplan
-TFT_decoplan:
+TFT_display_exit_1
+	goto	TFT_standard_color				; and return...
+
+
+	global	TFT_decoplan_mask			; mask for deco plan
+TFT_decoplan_mask:
 	call	TFT_divemask_color
-	WIN_TINY	dm_custom_decoplan_title_column, dm_custom_decoplan_title_row
+	WIN_TINY dm_custom_decoplan_title_column, dm_custom_decoplan_title_row
 	STRCPY_TEXT_PRINT tDiveDecoplan
-	call	TFT_standard_color
-	movff	char_O_deco_depth+1,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko2			; Yes
-	; No, clear output and return
-	call	TFT_standard_color
-	WIN_SMALL	dm_cust_dstop_4th_stop_column,dm_cust_dstop_4th_stop_row
-	STRCPY_PRINT "  ---  "
-	WIN_BOX_BLACK dm_cust_dstop_2nd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column	; top, bottom, left, right
-	WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column	; top, bottom, left, right
-	WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159	; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko2:
+	return
+
+	global	TFT_decoplan				; data for deco plan - stops 2 - 7 (stop 1 is shown in the main screen)
+TFT_decoplan:
+	lfsr	FSR0,char_O_deco_depth		; load base address of stops table
+	clrf	ex							; will be used for auxiliary flags
+	call	TFT_memo_color				; set default output color
 	movff	char_O_deco_gas+0,lo		; get flag for invalid deco data
 	btfsc	lo,char_invalid_flag		; is the invalid flag set?
 	call	TFT_disabled_color			; YES - set to disabled color
-	WIN_SMALL	dm_cust_dstop_2nd_stop_column, dm_cust_dstop_2nd_stop_row
-	movff	char_O_deco_depth+1,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+1,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-	movff	char_O_deco_depth+2,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko3			; Yes
-	; No, clear output and return
-	WIN_BOX_BLACK	dm_cust_dstop_3rd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column	; top, bottom, left, right
-	WIN_BOX_BLACK	dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159	; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko3:
-	WIN_SMALL	dm_cust_dstop_3rd_stop_column, dm_cust_dstop_3rd_stop_row
-	movff	char_O_deco_depth+2,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+2,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-	movff	char_O_deco_depth+3,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko4			; Yes
-	; No, clear output and return
-	WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko4:
-	WIN_SMALL	dm_cust_dstop_4th_stop_column, dm_cust_dstop_4th_stop_row
-	movff	char_O_deco_depth+3,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+3,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-
-	movff	char_O_deco_depth+4,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko5			; Yes
-	; No, clear output and return
-	WIN_BOX_BLACK	dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column	; top, bottom, left, right
-	WIN_BOX_BLACK	dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159					 ; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko5:
-	WIN_SMALL	dm_cust_dstop_5th_stop_column, dm_cust_dstop_5th_stop_row
-	movff	char_O_deco_depth+4,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+4,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-	movff	char_O_deco_depth+5,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko6			; Yes
-	; No, clear output and return
-	WIN_BOX_BLACK	dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159		; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko6:
-	WIN_SMALL	dm_cust_dstop_6th_stop_column, dm_cust_dstop_6th_stop_row
-	movff	char_O_deco_depth+5,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+5,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-	movff	char_O_deco_depth+6,lo
-	tstfsz	lo							; Show another stop?
-	bra		TFT_display_deko7			; Yes
-	; No, clear output and return
-	WIN_BOX_BLACK	dm_cust_dstop_7th_stop_row, dm_customview_bot, dm_cust_dstop_7th_stop_column, .159	 ; top, bottom, left, right
-	goto	TFT_standard_color			; and return...
-
-TFT_display_deko7:
-	WIN_SMALL	dm_cust_dstop_7th_stop_column, dm_cust_dstop_7th_stop_row
-	movff	char_O_deco_depth+6,lo		; stop in m
-	bcf		lo,7						; Clear GAS_SWITCH bit
-	rcall	TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft)
-	movff	char_O_deco_time+6,lo		; length of stop in min
-	output_99
-	STRCAT_PRINT "'"
-	goto	TFT_standard_color			; and return...
+	; 2nd stop
+	WIN_SMALL dm_cust_dstop_2nd_stop_column, dm_cust_dstop_2nd_stop_row
+	rcall	TFT_decoplan_helper
+	; 3rd stop
+	WIN_SMALL dm_cust_dstop_3rd_stop_column, dm_cust_dstop_3rd_stop_row
+	rcall	TFT_decoplan_helper
+	; 4th stop
+	bsf		ex,4						; flag we are on 4th screen position
+	WIN_SMALL dm_cust_dstop_4th_stop_column, dm_cust_dstop_4th_stop_row
+	rcall	TFT_decoplan_helper
+	bcf		ex,4						; clear 4th position flag again
+	; 5th stop
+	WIN_SMALL dm_cust_dstop_5th_stop_column, dm_cust_dstop_5th_stop_row
+	rcall	TFT_decoplan_helper
+	; 6th stop
+	WIN_SMALL dm_cust_dstop_6th_stop_column, dm_cust_dstop_6th_stop_row
+	rcall	TFT_decoplan_helper
+	; 7th stop
+	WIN_SMALL dm_cust_dstop_7th_stop_column, dm_cust_dstop_7th_stop_row
+	rcall	TFT_decoplan_helper
+	bra		TFT_display_exit_1			; set standard color and return...
+
+TFT_decoplan_helper:
+	btfsc	ex,0						; no more stops to show?
+	bra		TFT_decoplan_helper_1		; YES - skip checking next entry - it will be empty, too
+	movff	PREINC0,lo					; NO  - advance pointer to get the depth of the 2nd, 3rd, 4th, ... stop
+	tstfsz	lo							;       is the stop depth = 0, i.e. no stop entry?
+	bra		TFT_decoplan_helper_3		;       NO  - show stop data
+TFT_decoplan_helper_1:					; no more stop table entries
+	bsf		ex,0						; flag that there are no more stop table entries
+	btfss	ex,4						; are we on the 4th screen position?
+	bra		TFT_decoplan_helper_2		; NO  - normal handling on this position
+	btfsc	ex,1						; YES - special handling, has any stop been shown?
+	bra		TFT_decoplan_helper_2		;       YES - print normal blanking
+	STRCPY_PRINT "  ---- "				;       NO  - print a "no stops" indication (blanking potential previous content, too)
+	return
+TFT_decoplan_helper_2:					; no more stop table entries, blank potential previous content
+	STRCPY_PRINT "       "				; wipe screen position by printing 7 spaces
+	return
+TFT_decoplan_helper_3:
+	rcall	TFT_display_deko_output_depth ; output depth (stored in lo) to POSTINC2 with "m" or w/o (for ft)
+	movlw	NUM_STOPS					; offset between arrays holding depths and durations
+	movff	PLUSW0,lo					; get duration of the current stop
+	output_99							; output duration to POSTINC2
+	STRCAT_PRINT "'"					; append symbol for minutes and print to screen
+	bsf		ex,1						; flag that a stop was shown
+	return
 
 
 	global	TFT_clear_safety_stop
 TFT_clear_safety_stop:
-	bcf		FLAG_TFT_clear_safety_stop		; clear flag
+	bcf		FLAG_TFT_clear_safety_stop	; clear flag
 	WIN_BOX_BLACK	dm_safetystop_row, dm_safetystop_bot, dm_safetystop_text_column, .159	; top, bottom, left, right
 	return
 
 	global	TFT_show_safety_stop
 TFT_show_safety_stop:
 	bcf		FLAG_TFT_show_safety_stop
-	tstfsz	safety_stop_countdown			; Countdown at zero?
-	bra		TFT_show_safety_stop2			; No, show stop
-	bcf		show_safety_stop				; Clear flag
-	btfss	safety_stop_active				; Displayed?
-	return									; No
-	bcf		safety_stop_active				; Clear flag
-	btfsc	divemode_menu					; Is the dive mode menu shown?
-	return									; Yes, return
-	bra		TFT_clear_safety_stop			; Yes, Clear stop ; and return...
+	tstfsz	safety_stop_countdown		; countdown at zero?
+	bra		TFT_show_safety_stop2		; NO - show stop
+	bcf		show_safety_stop			; clear flag
+	btfss	safety_stop_active			; displayed?
+	return								; NO
+	bcf		safety_stop_active			; clear flag
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
+	bra		TFT_clear_safety_stop		; NO  - clear stop and return...
 TFT_show_safety_stop2:
-	bsf		safety_stop_active				; Set flag
-	decf	safety_stop_countdown,F			; Reduce countdown
-	btfsc	divemode_menu					; Is the dive mode menu shown?
-	return									; Yes, return
+	bsf		safety_stop_active			; set flag
+	decf	safety_stop_countdown,F		; reduce countdown
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
 	;btfsc	menuview
-	;bra	 TFT_show_safety_stop3			; No room when menuview=1...
+	;bra	TFT_show_safety_stop3		; no room when menuview=1...
 	call	TFT_divemask_color
-	WIN_STD	 dm_safetystop_text_column, dm_safetystop_text_row
+	WIN_STD dm_safetystop_text_column, dm_safetystop_text_row
 	STRCPY_TEXT_PRINT tDiveSafetyStop
 TFT_show_safety_stop3:
-	call	TFT_attention_color			 ; show in yellow
+	call	TFT_attention_color			; show in yellow
 	WIN_MEDIUM	dm_safetystop_column, dm_safetystop_row
 	movff	safety_stop_countdown,lo
 	clrf	hi
-	call	convert_time					; converts hi:lo in seconds to mins (hi) and seconds (lo)
+	call	convert_time				; converts hi:lo in seconds to mins (up:hi) and seconds (lo)
 	movf	hi,W
 	movff	lo,hi
-	movwf	lo								; exchange lo and hi
+	movwf	lo							; exchange lo and hi
 	bsf		leftbind
 	output_8
 	bcf		leftbind
@@ -1171,212 +1246,197 @@
 	output_99x
 	STRCAT_PRINT ""
 	WIN_FONT FT_SMALL
-	goto	TFT_standard_color				; and return...
-
-
-	global	TFT_mask_avr_stopwatch			; Show mask for average depth and stopwatch
-TFT_mask_avr_stopwatch:
-	; The mask
+	bra		TFT_display_exit_1
+
+
+	global	TFT_avr_stopwatch_mask		; mask for average depth and stopwatch
+TFT_avr_stopwatch_mask:
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_avr_stop_title_column1,dm_custom_avr_stop_title_row
+	WIN_TINY dm_custom_avr_stop_column1+.2,dm_custom_avr_stop_title_row
+	TSTOSS	opt_2ndDepthDisp			; draw avg depth instead of max depth in main screen?
+	bra		TFT_avr_stopwatch_mask_1	; NO  - draw avg depth in custom view then
+	STRCAT_TEXT_PRINT tMaxDepth			; YES - draw max depth in custom view then
+	bra		TFT_avr_stopwatch_mask_2
+TFT_avr_stopwatch_mask_1:
 	STRCPY_TEXT_PRINT tDiveTotalAvg
-	WIN_TINY dm_custom_avr_stop_title_column2,dm_custom_avr_stop_title_row
+TFT_avr_stopwatch_mask_2:
+	WIN_TINY dm_custom_avr_stop_column2+.3,dm_custom_avr_stop_title_row
 	STRCPY_TEXT_PRINT tDiveStopwatch
-	WIN_TINY dm_custom_avr_stop_title_column3,dm_custom_avr_stop_title_row
+	WIN_TINY dm_custom_avr_stop_column3-.8,dm_custom_avr_stop_title_row
 	STRCPY_TEXT_PRINT tDiveStopAvg
-	goto	TFT_standard_color				; and return...
-
-	global	TFT_update_avr_stopwatch		; Update average depth and stopwatch
-TFT_update_avr_stopwatch:
-	call	TFT_standard_color
-	SAFE_2BYTE_COPY	average_divesecs,lo
-	call	convert_time				; lo=secs, hi=mins
-	WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row
+	bra		TFT_display_exit_1
+
+
+	global	TFT_avr_stopwatch			; data for average depth and stopwatch
+TFT_avr_stopwatch:
+	call	TFT_memo_color
 	bsf		leftbind
-	movf	hi,W
-	movff	lo,hi
-	movwf	lo							; exchange lo and hi
-	output_8
-	PUTC	':'
-	movff	hi,lo
-	output_99x
-	movlw	.5
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
-	clrf	WREG
-	movff	WREG,buffer+.5				; limit to 5 chars
-	STRCAT_PRINT ""
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		TFT_update_avr_stopwatch_metric
-	;TFT_update_avr_stopwatch_imperial
+
+	; total average depth or max depth
+	WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row
+	TSTOSS	opt_2ndDepthDisp			; draw avg depth instead of max depth in main screen?
+	bra		TFT_avr_stopwatch_01		; NO  - draw avg depth in custom view then
+	SAFE_2BYTE_COPY max_pressure,lo		; YES - draw max depth in custom view then
+	bra		TFT_avr_stopwatch_02
+TFT_avr_stopwatch_01:
 	movff	avg_rel_pressure_total+0,lo
 	movff	avg_rel_pressure_total+1,hi
+TFT_avr_stopwatch_02:
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row
-	bsf		leftbind
+	TSTOSS	opt_units						 ; 0=m, 1=ft
+	bra		TFT_update_avr_stopwatch1_metric ; 0 - metric
+	;bra	TFT_update_avr_stopwatch1_imp	 ; 1 - imperial
+TFT_update_avr_stopwatch1_imp:
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
 	output_16							; yxz
-	STRCAT_PRINT " "
-	; Stopped average depth
+	STRCAT	"  "						; wipe out remains from last output
+	clrf	WREG
+	movff	WREG,buffer+.3				; limit string length to 3 digits
+	bra		TFT_update_avr_stopwatch2
+TFT_update_avr_stopwatch1_metric:
+	bsf		ignore_digit5				; no cm (flag will be cleared by output_16)
+	output_16dp .3						; yxz.a
+	PUTC	" "							; wipe out remains from last output
+	clrf	WREG
+	movff	WREG,buffer+.4				; limit string length to 4 = 3 digits + 1 half-size decimal dot
+TFT_update_avr_stopwatch2:
+	STRCAT_PRINT ""
+
+	; stopped average depth
+	WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row
 	movff	avg_rel_pressure+0,lo
 	movff	avg_rel_pressure+1,hi
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row
+	TSTOSS	opt_units						 ; 0=m, 1=ft
+	bra		TFT_update_avr_stopwatch2_metric ; 0 - metric
+	;bra	TFT_update_avr_stopwatch2_imp	 ; 1 - imperial
+TFT_update_avr_stopwatch2_imp:
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
 	output_16							; yxz
-	bcf		leftbind
-	PUTC	" "
+	STRCAT	"  "						; wipe out remains from last output
 	clrf	WREG
-	movff	WREG,buffer+.3				; limit string length to 3
-	STRCAT_PRINT ""
-	return
-
-TFT_update_avr_stopwatch_metric:
-	; Non-resettable average depth
-	movff	avg_rel_pressure_total+0,lo
-	movff	avg_rel_pressure_total+1,hi
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row
-	bsf		ignore_digit5				; no cm
+	movff	WREG,buffer+.3				; limit string length to 3 digits/characters
+	bra		TFT_update_avr_stopwatch3
+TFT_update_avr_stopwatch2_metric:
+	bsf		ignore_digit5				; no cm (flag will be cleared by output_16)
 	output_16dp .3						; yxz.a
+	PUTC	" "							; wipe out remains from last output
 	clrf	WREG
-	movff	WREG,buffer+.4					; limit string length to 4 digits/chars
-	STRCAT_PRINT " "
-	; Stopped average depth
-	movff	avg_rel_pressure+0,lo
-	movff	avg_rel_pressure+1,hi
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row
-	bsf		ignore_digit5				; no cm
-	output_16dp .3						; yxz.a
-	bcf		leftbind
-	bcf		ignore_digit5
-	clrf	WREG
-	movff	WREG,buffer+.4				; limit string length to 4
+	movff	WREG,buffer+.4				; limit string length to 4 = 3 digits + 1 half-size decimal dot
+TFT_update_avr_stopwatch3:
 	STRCAT_PRINT ""
-	return
-
-
-	global	TFT_ceiling_mask			; The ceiling mask
-TFT_ceiling_mask:
-	call	TFT_divemask_color
-	WIN_TINY	dm_custom_ceiling_text_column,dm_custom_ceiling_text_row
-	STRCPY_TEXT_PRINT tCeiling
-	goto	TFT_standard_color			; and return...
-
-	global	TFT_ceiling					; Ceiling
-TFT_ceiling:
-	WIN_MEDIUM dm_custom_ceiling_value_column,dm_custom_ceiling_value_row
-	movff	int_O_ceiling+0,lo
-	movff	int_O_ceiling+1,hi
-	call	TFT_color_code_ceiling		; color-code the output
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	bsf		leftbind
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		TFT_ceiling_metric
-;TFT_ceiling_imperial
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	output_16							; yxz
-	bcf		leftbind
-	STRCAT_PRINT " "
-	goto	TFT_standard_color
-
-TFT_ceiling_metric:
-	bsf	 ignore_digit5					; no cm
-	output_16dp .3						; yxz.a
-	bcf		leftbind
-	bcf		ignore_digit5
-	STRCAT_PRINT " "
-	goto	TFT_standard_color
+
+	; stopped dive time
+	WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row
+TFT_update_stopwatch:					; jump-in point for stopped dive time in compass custom view
+	movff	average_divesecs+0,lo		; average_divesecs is incremented outside ISR
+	movff	average_divesecs+1,hi
+	call	convert_time				; converts hi:lo in seconds to minutes (up:hi) and seconds (lo)
+	movlw	.100						; display layout will change if minutes become >= 100
+	cpfslt	hi							; minutes < 100 ?
+	bra		TFT_update_stopwatch_2		; NO  - display hours:minutes
+	;bra	TFT_update_stopwatch_1		; YES - display minutes:seconds
+TFT_update_stopwatch_1:
+	movf	hi,W						; exchange lo and hi
+	movff	lo,hi						; ...
+	movwf	lo							; ...
+	output_8							; output minutes or hours
+	PUTC	':'
+	movff	hi,lo						; restore lo
+	output_99x							; output seconds or minutes
+	movlw	.5
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	clrf	WREG
+	movff	WREG,buffer+.5				; limit to 5 chars
+	STRCAT_PRINT ""
+	bra		TFT_display_exit_2
+TFT_update_stopwatch_2:
+	movff	hi,lo						; transfer minutes (low  byte) to lo
+	movff	up,hi						; transfer minutes (high byte) to hi
+	call	convert_time				; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
+	bra		TFT_update_stopwatch_1
 
 
 	global	TFT_CNS_mask
 TFT_CNS_mask:
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row
+	WIN_TINY dm_custom_cns3_column1, dm_custom_cns3_title_row
 	STRCPY_TEXT_PRINT tCNSsurf
-	WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row
-	btfsc	FLAG_ccr_mode						; in CCR mode?
-	bra		TFT_CNS_mask_1						; YES - proceed with checking for bailout
-	btfsc	FLAG_pscr_mode						; NO  -	in pSCR mode?
-	bra		TFT_CNS_mask_1						;       YES - proceed with checking for bailout
-	bra		TFT_CNS_mask_2						;       NO  - must be OC then
-TFT_CNS_mask_1:									; in CCR or pSCR mode
-	btfsc	is_bailout							; in bailout?
-	bra		TFT_CNS_mask_2						; YES - print fTTS label (label will be printed, but a fTTS will actually not be calculated)
-	TSTOSS	opt_calc_asc_gasvolume				; NO  - bailout volume calculation requested?
-	bra		TFT_CNS_mask_2						;       NO  - print fTTS label
-	STRCPY_TEXT_PRINT tCNSBO					;       YES - print bailout label
-	bra		TFT_CNS_mask_3
-TFT_CNS_mask_2:									; OC or bailout
-	STRCPY_TEXT_PRINT tCNSfTTS					; print fTTS label
-TFT_CNS_mask_3:
-	WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row
+	WIN_TINY dm_custom_cns3_column2, dm_custom_cns3_title_row
+	btfsc	FLAG_oc_mode				; in OC mode?
+	bra		TFT_CNS_mask_1				; YES - print fTTS label
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		TFT_CNS_mask_1				; YES - print fTTS label (label will be printed, but a fTTS will actually not be calculated)
+	TSTOSS	opt_calc_asc_gasvolume		; bailout volume calculation requested?
+	bra		TFT_CNS_mask_1				; NO  - print fTTS label
+	STRCPY_TEXT_PRINT tCNSBO			; YES - print bailout label
+	bra		TFT_CNS_mask_2
+TFT_CNS_mask_1:							; OC or bailout
+	STRCPY_TEXT_PRINT tCNSfTTS			; print fTTS label
+TFT_CNS_mask_2:
+	WIN_TINY dm_custom_cns3_column3, dm_custom_cns3_title_row
 	STRCPY_TEXT_PRINT tCNSnow
-	goto	TFT_standard_color					; and return...
+	bra		TFT_display_exit_2
+
 
 	global	TFT_CNS
 TFT_CNS:
+	bsf		leftbind
 	; CNS at end of normal dive
-	WIN_STD dm_custom_hud_sensor1_column+.5,dm_custom_hud_data_row
+	WIN_STD dm_custom_cns3_column1+.3,dm_custom_cns3_row
 	movff	int_O_normal_CNS_fraction+0,lo
 	movff	int_O_normal_CNS_fraction+1,hi
 	call	TFT_color_code_cns
-	bsf		leftbind
-	output_16_3									; output as xxx
-	bcf		leftbind
+	output_16_3							; output as xxx
 	STRCAT_PRINT "% "
 	; fTTS / Bailout CNS, if enabled
-	WIN_STD dm_custom_hud_sensor2_column+.2,dm_custom_hud_data_row
-	btfsc	is_bailout							; in bailout?
-	bra		TFT_CNS_3							; YES - show "---"
-	TSTOSS	opt_calc_asc_gasvolume				; NO  - bailout volume calculation requested?
-	bra		TFT_CNS_1							;       NO  - continue checking fTTS extra time
-	btfsc	FLAG_ccr_mode						;       YES - in CCR mode?
-	bra		TFT_CNS_2							;             YES - skip test for fTTS extra time and show CNS%
-	btfsc	FLAG_pscr_mode						;             in pSCR mode?
-	bra		TFT_CNS_2							;             YES - skip test for fTTS extra time and show CNS%
-TFT_CNS_1:										; not in bailout, no volume calculation
-	TSTOSS	char_I_extra_time					; fTTS extra time fTTS configured?
-	bra		TFT_CNS_3							; NO  - show "---"
+	WIN_STD dm_custom_cns3_column2+.2,dm_custom_cns3_row
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		TFT_CNS_3					; YES - show "---"
+	TSTOSS	opt_calc_asc_gasvolume		; NO  - bailout volume calculation requested?
+	bra		TFT_CNS_1					;       NO  - continue checking fTTS extra time
+	btfss	FLAG_oc_mode				;       YES - in OC mode?
+	bra		TFT_CNS_2					;             NO - show CNS%
+TFT_CNS_1:								; not in bailout, no volume calculation, and/or in OC mode
+	TSTOSS	char_I_extra_time			; fTTS extra time configured?
+	bra		TFT_CNS_3					; NO  - show "---"
 TFT_CNS_2:
 	movff	int_O_alternate_CNS_fraction+0,lo	; YES - show CNS%
 	movff	int_O_alternate_CNS_fraction+1,hi
 	call	TFT_color_code_cns
-	bsf		leftbind
-	output_16_3									; output as xxx
-	bcf		leftbind
+	output_16_3							; output as xxx
 	STRCAT_PRINT "% "
 	bra		TFT_CNS_4
 TFT_CNS_3:
-	call	TFT_standard_color
+	call	TFT_memo_color
 	STRCPY_PRINT "---  "
 TFT_CNS_4:
 	; current CNS
-	WIN_STD dm_custom_hud_sensor3_column,dm_custom_hud_data_row
+	WIN_STD dm_custom_cns3_column3+.3,dm_custom_cns3_row
 	movff	int_O_CNS_fraction+0,lo
 	movff	int_O_CNS_fraction+1,hi
 	call	TFT_color_code_cns
-	bsf		leftbind
-	output_16_3									; output as xxx
-	bcf		leftbind
+	output_16_3							; output as xxx
 	STRCAT_PRINT "%"
-	goto	TFT_standard_color					; and return...
-
-
-	global	TFT_hud_mask						; The HUD mask
-TFT_hud_mask:
+TFT_display_exit_2:
+	bcf		leftbind
+	goto	TFT_standard_color			; and return...
+
+
+	global	TFT_ppo2_sensors_mask		; mask for ppO2 sensors
+TFT_ppo2_sensors_mask:
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_hud_column1,dm_custom_hud_row
+	WIN_TINY dm_custom_hud_sensor1_column+.4,dm_custom_hud_title_row
 	STRCPY_TEXT_PRINT tDiveHudMask1
-	WIN_TINY dm_custom_hud_column2,dm_custom_hud_row
+	WIN_TINY dm_custom_hud_sensor2_column+.3,dm_custom_hud_title_row
 	STRCPY_TEXT_PRINT tDiveHudMask2
-	WIN_TINY dm_custom_hud_column3,dm_custom_hud_row
+	WIN_TINY dm_custom_hud_sensor3_column+.2,dm_custom_hud_title_row
 	STRCPY_TEXT_PRINT tDiveHudMask3
-	goto	TFT_standard_color					; and return...
-
-
-	global	TFT_update_ppo2_sensors				; Update Sensor data
-TFT_update_ppo2_sensors:
+	bra		TFT_display_exit_2
+
+
+	global	TFT_ppo2_sensors			; data for ppO2 sensors
+TFT_ppo2_sensors:
 ;
 ; Definition of the output:
 ;
@@ -1384,7 +1444,7 @@
 ; _calibrated    _O2       _logic        _ppo2          Output           Color
 ;    _ok      _sensorX    _sensorX     _sensorX
 ;-----------------------------------------------------------------------------------------------
-;    0          -/-          -/-            -/-         "----"           TFT_standard_color
+;    0          -/-          -/-            -/-         "----"           TFT_memo_color
 ;    1           0           -/-            = 0         o2_ppo2_sensorX  TFT_attention_color
 ;    1           0           -/-            > 0         o2_ppo2_sensorX  TFT_disabled_color
 ;    1           1            0             -/-         o2_ppo2_sensorX  TFT_color_code_ppo2_hud + win_invert
@@ -1393,21 +1453,22 @@
 	bsf		leftbind
 	; sensor 1
 	btfsc	sensor1_calibrated_ok		; valid calibration?
-	bra	TFT_update_hud1b				; yes
-	btfsc	sensor1_active			; valid HUD data for this sensor
-	bra	TFT_update_hud1b				; yes
+	bra		TFT_update_hud1b			; YES
+	btfsc	sensor1_active				; valid HUD data for this sensor
+	bra		TFT_update_hud1b			; YES
+
 	; no valid calibration
-	WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_data_row+.5
-	call	TFT_standard_color
+	WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_row+.5
+	call	TFT_memo_color
 	STRCPY_PRINT "---"
 	bra		TFT_update_hud2a			; continue with sensor 2
 TFT_update_hud1b:
 	; sensor has a valid calibration
-	WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_data_row
+	WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_row
 	movff	o2_ppo2_sensor1,lo			; load ppO2 value into transfer storage for output
 	clrf	hi							; 
 	btfsc	use_O2_sensor1				; in use?
-	bra		TFT_update_hud1d			; yes
+	bra		TFT_update_hud1d			; YES
 	; valid calibration, but not in use
 	tstfsz	o2_ppo2_sensor1				; sensor value = 0?
 	bra		TFT_update_hud1c			; no
@@ -1422,37 +1483,35 @@
 	; sensor has valid calibration and is in use
 	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
 	btfsc	voting_logic_sensor1		; sensor value agrees with other sensor's values?
-	bra		TFT_update_hud1e			; yes
+	bra		TFT_update_hud1e			; YES
 	; valid calibration, in use, but value does not agree with other sensors
 	bsf		win_invert					; invert output
 TFT_update_hud1e:
 	; all coloring is set up now, let's write the value to the display!
-	bsf		leftbind
 	output_16dp .3						; x.xx bar
-	bcf		leftbind
 	STRCAT_PRINT ""
 	bcf		win_invert
 
 TFT_update_hud2a:						; sensor 2
 	btfsc	sensor2_calibrated_ok		; valid calibration?
-	bra		TFT_update_hud2b			; yes
-	btfsc	sensor2_active			; valid HUD data for this sensor
-	bra	TFT_update_hud2b				; yes
+	bra		TFT_update_hud2b			; YES
+	btfsc	sensor2_active				; valid HUD data for this sensor
+	bra		TFT_update_hud2b			; YES
 	; no valid calibration
-	WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_data_row+.5
-	call	TFT_standard_color
+	WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_row+.5
+	call	TFT_memo_color
 	STRCPY_PRINT "---"
 	bra		TFT_update_hud3a			; continue with sensor 3
 TFT_update_hud2b:
 	; sensor has a valid calibration
-	WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_data_row
+	WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_row
 	movff	o2_ppo2_sensor2,lo			; load ppO2 value into transfer storage for output
 	clrf	hi							; 
 	btfsc	use_O2_sensor2				; in use?
-	bra		TFT_update_hud2d			; yes
+	bra		TFT_update_hud2d			; YES
 	; valid calibration, but not in use
 	tstfsz	o2_ppo2_sensor2				; sensor value = 0?
-	bra		TFT_update_hud2c			; no
+	bra		TFT_update_hud2c			; NO
 	; valid calibration, not in use and value = 0
 	call	TFT_attention_color			; output in yellow
 	bra		TFT_update_hud2e
@@ -1464,37 +1523,35 @@
 	; sensor has valid calibration and is in use
 	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
 	btfsc	voting_logic_sensor2		; sensor value agrees with other sensor's vlaues?
-	bra		TFT_update_hud2e			; yes
+	bra		TFT_update_hud2e			; YES
 	; valid calibration, in use, but value does not agree with other sensors
 	bsf		win_invert					; invert output
 TFT_update_hud2e:
 	; all coloring is set up now, let's write the value to the display!
-	bsf		leftbind
 	output_16dp .3						; x.xx bar
-	bcf		leftbind
 	STRCAT_PRINT ""
 	bcf		win_invert
 
 TFT_update_hud3a:						; sensor 3
 	btfsc	sensor3_calibrated_ok		; valid calibration?
-	bra		TFT_update_hud3b			; yes
-	btfsc	sensor3_active			; valid HUD data for this sensor
-    	bra	TFT_update_hud3b				; yes
+	bra		TFT_update_hud3b			; YES
+	btfsc	sensor3_active				; valid HUD data for this sensor
+	bra		TFT_update_hud3b			; YES
 	; no valid calibration
-	WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5
-	call	TFT_standard_color
+	WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_row+.5
+	call	TFT_memo_color
 	STRCPY_PRINT "---"
 	bra		TFT_update_hud4				; done
 TFT_update_hud3b:
 	; sensor has a valid calibration
-	WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_data_row
+	WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_row
 	movff	o2_ppo2_sensor3,lo			; load ppO2 value into transfer storage for output
 	clrf	hi							; 
 	btfsc	use_O2_sensor3				; in use?
-	bra		TFT_update_hud3d			; yes
+	bra		TFT_update_hud3d			; YES
 	; valid calibration, but not in use
 	tstfsz	o2_ppo2_sensor3				; sensor value = 0?
-	bra		TFT_update_hud3c			; no
+	bra		TFT_update_hud3c			; NO
 	; valid calibration, not in use and value = 0
 	call	TFT_attention_color			; output in yellow
 	bra		TFT_update_hud3e
@@ -1505,42 +1562,39 @@
 TFT_update_hud3d:
 	; sensor has valid calibration and is in use
 	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
-	btfsc	voting_logic_sensor3		; sensor value agrees with other sensor's vlaues?
-	bra		TFT_update_hud3e			; yes
+	btfsc	voting_logic_sensor3		; sensor value agrees with other sensor's values?
+	bra		TFT_update_hud3e			; YES
 	; valid calibration, in use, but value does not agree with other sensors
 	bsf		win_invert					; invert output
 TFT_update_hud3e:
 	; all coloring is set up now, let's write the value to the display!
-	bsf		leftbind
 	output_16dp .3						; x.xx bar
-	bcf		leftbind
 	STRCAT_PRINT ""
 	bcf		win_invert
 
 TFT_update_hud4:						; closure
-	bcf		leftbind
-	goto	TFT_standard_color			; and return...
-
-
-	global	TFT_surface_sensor			; Update Sensor data in surface mode
+	bra		TFT_display_exit_3
+
+
+	global	TFT_surface_sensor			; update sensor data in surface mode
 TFT_surface_sensor:
-	movf	hardware_flag,W
+	movf	hardware_flag1,W
 	sublw	0x11						; 2 with BLE
 	btfsc	STATUS,Z
-	return								; Ignore for 0x11
+	return								; ignore for 0x11
 	; show three sensors
 	bsf		leftbind
 	WIN_SMALL surf_hud_sensor1_column,surf_hud_sensor1_row
 	btfsc	sensor1_calibrated_ok
-	bra		TFT_surface_sensor1			; Yes
-	btfsc	sensor1_active			; valid HUD data for this sensor
-    	bra		TFT_surface_sensor1			; Yes
+	bra		TFT_surface_sensor1			; YES
+	btfsc	sensor1_active				; valid HUD data for this sensor
+	bra		TFT_surface_sensor1			; YES
 	call	TFT_standard_color
 	STRCPY_PRINT "--- "
-	bra		TFT_surface_sensor2			; Skip Sensor 1
+	bra		TFT_surface_sensor2			; skip sensor 1
 TFT_surface_sensor1:
 	movff	o2_ppo2_sensor1,lo
-	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
+	call	TFT_color_code_ppo2_hud		; with ppO2 [cbar] in lo
 	clrf	hi
 	bsf		leftbind
 	output_16dp .3						; x.xx bar
@@ -1549,15 +1603,15 @@
 TFT_surface_sensor2:
 	WIN_SMALL surf_hud_sensor2_column,surf_hud_sensor2_row
 	btfsc	sensor2_calibrated_ok
-	bra		TFT_surface_sensor3			; Yes
-	btfsc	sensor2_active			; valid HUD data for this sensor
-    	bra		TFT_surface_sensor3			; Yes
+	bra		TFT_surface_sensor3			; YES
+	btfsc	sensor2_active				; valid HUD data for this sensor
+	bra		TFT_surface_sensor3			; YES
 	call	TFT_standard_color
 	STRCPY_PRINT "--- "
-	bra		TFT_surface_sensor4			; Skip Sensor 2
+	bra		TFT_surface_sensor4			; skip sensor 2
 TFT_surface_sensor3:
 	movff	o2_ppo2_sensor2,lo
-	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
+	call	TFT_color_code_ppo2_hud		; with ppO2 [cbar] in lo
 	clrf	hi
 	bsf		leftbind
 	output_16dp .3						; x.xx bar
@@ -1566,52 +1620,54 @@
 TFT_surface_sensor4:
 	WIN_SMALL surf_hud_sensor3_column,surf_hud_sensor3_row
 	btfsc	sensor3_calibrated_ok
-	bra	TFT_surface_sensor5				; Yes
-	btfsc	sensor3_active			; valid HUD data for this sensor
-    	bra	TFT_surface_sensor5			; Yes
-
+	bra		TFT_surface_sensor5			; YES
+	btfsc	sensor3_active				; valid HUD data for this sensor
+	bra		TFT_surface_sensor5			; YES
 	call	TFT_standard_color
 	STRCPY_PRINT "--- "
-	bra		TFT_surface_sensor6			; Skip Sensor 3
+	bra		TFT_surface_sensor6			; skip sensor 3
 TFT_surface_sensor5:
 	movff	o2_ppo2_sensor3,lo
-	call	TFT_color_code_ppo2_hud		; With ppO2 [cbar] in lo
+	call	TFT_color_code_ppo2_hud		; with ppO2 [cbar] in lo
 	clrf	hi
 	bsf		leftbind
 	output_16dp .3						; x.xx bar
 	bcf		leftbind
 	STRCAT_PRINT ""
 TFT_surface_sensor6:
+TFT_display_exit_3:
 	bcf		leftbind
 	goto	TFT_standard_color			; and return...
 
 
-	global	TFT_sensor_mV 
-TFT_sensor_mV: 
-	call	TFT_standard_color 
+	global	TFT_sensor_mV
+TFT_sensor_mV:
+	call	TFT_standard_color
 	bsf		leftbind
+
 	WIN_SMALL surf_mV_sensor_column,surf_mV_sensor1_row
 	movff	o2_mv_sensor1+0,lo			; in 0.1mV steps
 	movff	o2_mv_sensor1+1,hi			; in 0.1mV steps
 	STRCAT	"1: "
-	output_16dp .4						; xxx.y mV 
-	STRCAT_PRINT "mV "
-	
+	rcall	TFT_sensor_mV_helper
+
 	WIN_SMALL surf_mV_sensor_column,surf_mV_sensor2_row
 	movff	o2_mv_sensor2+0,lo			; in 0.1mV steps
 	movff	o2_mv_sensor2+1,hi			; in 0.1mV steps
 	STRCAT	"2: "
-	output_16dp .4						; xxx.y mV 
-	STRCAT_PRINT "mV "
+	rcall	TFT_sensor_mV_helper
 
 	WIN_SMALL surf_mV_sensor_column,surf_mV_sensor3_row
 	movff	o2_mv_sensor3+0,lo			; in 0.1mV steps
 	movff	o2_mv_sensor3+1,hi			; in 0.1mV steps
 	STRCAT	"3: "
+	rcall	TFT_sensor_mV_helper
+	bra		TFT_display_exit_3
+
+TFT_sensor_mV_helper:
 	output_16dp .4						; xxx.y mV
 	STRCAT_PRINT "mV "
-	bcf		leftbind 
-	goto	TFT_standard_color			; and return...
+	return
 
 
 	global	TFT_sensor_surface_warning
@@ -1620,7 +1676,7 @@
 	btfss	sensor1_calibrated_ok		; do not show end of lifetime arrow if sensor failed calibration at all
 	bra		TFT_sensor_mV2
 	movff	opt_x_s1+1,lo				; into bank1
-	movf	lo,W						; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more 
+	movf	lo,W						; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0.21 any more 
 	bz		TFT_sensor_mV2				; the sensor is not too bad yet for a warning 
 	WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor1_row-.5 
 	STRCPY_PRINT "\xb8"					; mark sensor as being at end of lifetime
@@ -1628,7 +1684,7 @@
 	btfss	sensor2_calibrated_ok		; do not show end of lifetime arrow if sensor failed calibration at all
 	bra		TFT_sensor_mV3
 	movff	opt_x_s2+1,lo				; into bank1
-	movf	lo,W						; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more 
+	movf	lo,W						; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0.21 any more 
 	bz		TFT_sensor_mV3				; the sensor is not too bad yet for a warning 
 	WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor2_row-.5 
 	STRCPY_PRINT "\xb8"					; mark sensor as being at end of lifetime 
@@ -1636,12 +1692,12 @@
 	btfss	sensor3_calibrated_ok		; do not show end of lifetime arrow if sensor failed calibration at all
 	bra		TFT_sensor_mV4
 	movff	opt_x_s3+1,lo				; into bank1
-	movf	lo,W						; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more 
+	movf	lo,W						; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0.21 any more 
 	bz		TFT_sensor_mV4				; the sensor is not too bad yet for a warning 
 	WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor3_row-.5
 	STRCPY_PRINT "\xb8"					; mark sensor as being at end of lifetime 
 TFT_sensor_mV4:
-	goto	TFT_standard_color			; ...and return
+	bra		TFT_display_exit_3
 
 
 	global	TFT_menu_calibrate
@@ -1673,13 +1729,16 @@
 	movff	o2_mv_sensor3+1,hi			; in 0.1mV steps
 	output_16dp .4						; xxx.y mV
 	STRCAT_PRINT "mV  "
-	bcf		leftbind
-	goto	TFT_standard_color			; ...and return
+	bra		TFT_display_exit_3
 
 
 	global	TFT_clock
 TFT_clock:
+ IFDEF _ostc_logo
 	WIN_SMALL surf_clock_column,surf_clock_row
+ ELSE
+	WIN_SMALL surf_clock_column+.7,surf_clock_row
+ ENDIF
 TFT_clock2:								; called from divemode clock
 	call	TFT_standard_color
 	movff	hours,lo
@@ -1716,7 +1775,7 @@
 
 ;=============================================================================
 
-	global	TFT_surface_decosettings	; Show all deco settings
+	global	TFT_surface_decosettings	; show all deco settings
 TFT_surface_decosettings:
 	; Deco Mode
 	call	TFT_standard_color
@@ -1756,7 +1815,7 @@
 	STRCAT_TEXT_PRINT tMinutes
 	; Last Stop
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3)
-	STRCPY_TEXT tLastDecostop
+	STRCPY_TEXT tLastDecostopSurf
 	movff	opt_last_stop,lo
 	output_8
 	STRCAT_TEXT_PRINT tMeters
@@ -1771,7 +1830,6 @@
 
 	global	TFT_debug_output
 TFT_debug_output:
-	return
 	WIN_TINY .80,.0
 	call	TFT_standard_color
 	lfsr	FSR2,buffer
@@ -1783,13 +1841,13 @@
 	STRCAT_PRINT ""
 	return
 
-	global	TFT_divetimeout				; Show timeout counter
+	global	TFT_divetimeout				; show timeout counter
 TFT_divetimeout:
-	call	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
-	call	TFT_standard_color
-	STRCPY	0x94						; "End of dive" icon
+	call	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_memo_color
+	STRCPY	0x94						; "End of dive" symbol
 	movff	opt_diveTimeout,WREG		; in [min]
 	mullw	.60
 	movff	PRODL,sub_a+0
@@ -1799,7 +1857,7 @@
 	call	subU16						; sub_c = sub_a - sub_b (with UNSIGNED values)
 	movff	sub_c+0,lo
 	movff	sub_c+1,hi
-	call	convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
+	call	convert_time				; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
 	movf	hi,W
 	movff	lo,hi
 	movwf	lo							; exchange lo and hi
@@ -1807,78 +1865,62 @@
 	PUTC	':'
 	movff	hi,lo
 	output_99x
-	movlw	dm_warning_length			; Divemode string length
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
 	bcf		win_invert
 	return
 
 	global	TFT_display_ftts
 TFT_display_ftts:
-	movff	char_I_extra_time,lo
-	tstfsz	lo
-	bra		TFT_display_ftts_a
-	return								; char_I_extra_time=0, return.
-TFT_display_ftts_a:
-	movff	int_O_alternate_ascenttime+0,WREG
-	movff	int_O_alternate_ascenttime+1,hi
-	iorwf	hi,W						; int_O_alternate_ascenttime:2 == 0 ?
-	bnz		TFT_display_ftts_b
-	return								; No deco, do nothing
-TFT_display_ftts_b:
-	btfsc	is_bailout					; check if we are in bailout mode
-	return								; YES - in bailout no fTTS will be computed, so nothing to display
-	incf	warning_counter,F			; increase counter
 	call	TFT_warning_set_window		; sets the row and column for the current warning
-	tstfsz	WREG						; is there room for the warning?
-	return								; NO
-	btfsc	FLAG_ccr_mode				; in CCR mode?
-	bra		TFT_display_ftts_1			; YES - print fTTS label
-	btfsc	FLAG_pscr_mode				; NO  - in pSCR mode?
+	tstfsz	WREG						; is there room for the message?
+	return								; NO  - done
+	btfsc	FLAG_oc_mode				; YES - in OC mode?
 	bra		TFT_display_ftts_1			;       YES - print fTTS label
-	bra		TFT_display_ftts_2			;       NO  - must be OC then
-TFT_display_ftts_1:						; in CCR or pSCR mode
-	btfsc	is_bailout					; in bailout?
-	bra		TFT_display_ftts_2			; YES - print fTTS label
-	TSTOSS	opt_calc_asc_gasvolume		; NO  - bailout volume calculation requested?
-	bra		TFT_display_ftts_2			;       NO  - print fTTS label
-	STRCPY	"B/O"						;       YES - print bailout label
-	bra		TFT_display_ftts_3
-TFT_display_ftts_2:						; OC or bailout
+	TSTOSS	opt_calc_asc_gasvolume		;       NO  - bailout volume calculation requested?
+	bra		TFT_display_ftts_1			;             NO  - print fTTS label
+	STRCPY	"B/O"						;             YES - print bailout label
+	bra		TFT_display_ftts_2
+TFT_display_ftts_1:						; OC or CCR/pSCR but no bailout volume calculation
 	STRCPY	"@+"						; print fTTS label
-TFT_display_ftts_3:
-	movff	char_I_extra_time,lo
-	bsf		leftbind
-	output_8
-	PUTC	":"
+TFT_display_ftts_2:
+	movff	char_I_extra_time,lo		; get fTTS delay time
+	bsf		leftbind					; print with alignment to the left
+	output_8							; print fTTS delay time
+	PUTC	":"							; ":"
 	movff	int_O_alternate_ascenttime+0,lo
 	movff	int_O_alternate_ascenttime+1,hi
-	btfss	hi,int_invalid_flag				; is the invalid flag set?
-	bra		TFT_display_ftts1				; NO
-	bcf		hi,int_invalid_flag				; YES - clear flag
-	call	TFT_disabled_color				;       switch to disabled color
-TFT_display_ftts1:
+	call	TFT_memo_color				; set memo color
+	btfss	hi,int_invalid_flag			; is the invalid flag set?
+	bra		TFT_display_ftts_3			; NO  - keep memo color
+	bcf		hi,int_invalid_flag			; YES - clear flag
+	call	TFT_disabled_color			;     - switch to disabled color
+TFT_display_ftts_3:
+	btfsc	hi,int_not_yet_computed		; is the not-computed-yet flag set?
+	bra		TFT_display_ftts_4			; YES - show dashes
 	movf	lo,W
-	iorwf	hi,W							; extra_ascenttime == 0 ?
-	bz		TFT_display_ftts2				; YES - show dashes
-	btfsc	hi,int_not_yet_computed			; is the not-computed-yet flag set?
-	bra		TFT_display_ftts2				; YES
-	output_16								; NO
-	bcf		leftbind
-	PUTC	"'"
-	movlw	dm_warning_length				; Divemode string length
-	call	TFT_fillup_with_spaces			; Fillup FSR2 with spaces (Total string length in #WREG)
+	iorwf	hi,W						; extra_ascenttime = 0 ?
+	bz		TFT_display_ftts_5			; YES - show "NDL"
+	movff	char_O_deco_info,up			; get deco info vector
+	btfsc	up,deco_steady				; fTTS = TTS ?
+	call	TFT_advice_color			; YES - set to advice color (green)
+	btfsc	up,deco_decreasing			; fTTS < TTS ?
+	call	TFT_advice_color			; YES - set to advice color (green)
+	output_16							; NO  - show ascent time
+	PUTC	"'"							;     - minutes symbol
+	bra		TFT_display_ftts_6
+TFT_display_ftts_4:
+	STRCAT	"---"						; "---" for not computed
+	bra		TFT_display_ftts_6
+TFT_display_ftts_5:
+	STRCAT_TEXT tNDL					; "NDL"
+TFT_display_ftts_6:
+	movlw	dm_warning_length			; dive mode string length
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	bcf		win_invert
-	goto	TFT_standard_color				; ...and return
-TFT_display_ftts2:
-	STRCAT	"---"
-	bcf		leftbind
-	movlw	dm_warning_length				; Divemode string length
-	call	TFT_fillup_with_spaces			; Fillup FSR2 with spaces (Total string length in #WREG)
-	STRCAT_PRINT ""
-	bcf		win_invert
-	goto	TFT_standard_color				; ...and return
+	bcf		leftbind					; clear left alignment
+	goto	TFT_standard_color			; ...and return
 
 
 ;=============================================================================
@@ -1896,19 +1938,28 @@
 TFT_temp_surfmode_common:
 	STRCAT_PRINT ""
 	WIN_SMALL surf_temp_column,surf_temp_row
+	call	TFT_memo_color
 	bra		TFT_temp_common
 
 
 	global	TFT_temp_divemode
 TFT_temp_divemode:
 	bcf		FLAG_TFT_temp_divemode
-	btfsc	divemode_menu					; Is the dive mode menu shown?
-	return									; Yes, no update of temperature now
-	btfsc	blinking_better_gas				; blinking better Gas?
-	return									; Yes, no update of temperature now
-	WIN_SMALL	dm_temp_column,dm_temp_row
+	btfsc	divemode_menu					; is the dive mode menu shown?
+	return									; YES - no update of temperature now
+	btfsc	blinking_better_gas				; blinking better gas?
+	return									; YES - no update of temperature now
+	btfsc	blinking_better_dil				; blinking better diluent?
+	return									; YES - no update of temperature now
+	WIN_SMALL dm_temp_column,dm_temp_row
+	call	TFT_memo_color
+	btfsc	alternative_divelayout			; in alternative layout?
+	bra		TFT_temp_common					; YES - proceed with temperature
+	movlw	index_compass_dm				; NO  - index of compass custom view
+	cpfseq	menupos3						;     - compass shown in custom view?
+	bra		TFT_temp_common					;       NO  - proceed with temperature
+	bra		TFT_update_stopwatch			;       YES - show resettable dive time instead of temperature
 TFT_temp_common:
-	call	TFT_standard_color
 	SAFE_2BYTE_COPY temperature,lo			; get current temperature
 	TSTOSS	opt_units						; 0=°C, 1=°F
 	bra		TFT_temp_common_1
@@ -1917,7 +1968,7 @@
 	rcall	TFT_convert_signed_16bit		; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
 	btfsc	neg_flag						; is the temperature negative?
 	bra		TFT_temp_common_2				; YES - the minus sign has already been written
-	; temp is positive, is it less then 10°C? 
+	; temp is positive, is it less than 10°C ?
 	tstfsz	hi
 	bra		TFT_temp_common_1a				; >25.5°C, skip here
 	movlw	.100
@@ -1926,13 +1977,12 @@
 	bsf		leftbind
 	output_16dp	d'4'						; x.y°C
 	bcf		leftbind
-	bra		TFT_temp_common_3				; Done.
+	bra		TFT_temp_common_3				; done
 TFT_temp_common_1a:
 	PUTC	" "								; NO  - write a space instead of the minus sign
 TFT_temp_common_2:
-	bsf		ignore_digit5					; ignore decimal
+	bsf		ignore_digit5					; ignore decimal (flag will be cleared by output_16)
 	output_16_3								; output 0-999 without decimal -> writes ' ' - 99
-	bcf		ignore_digit5
 	movff	buffer+2,lo						; get output from unit position
 	movlw	" "								; load code of the space character
 	cpfseq	lo								; is there a space sign on the unit position? (happens between +1 and -1)
@@ -1962,11 +2012,11 @@
 	call	TFT_standard_color
 
 	movlw	dm_menu_item1_column-.8
-	btfsc	menupos1,2					; >3?
-	movlw	dm_menu_item4_column-.8		; Yes
-	movff	WREG,win_leftx2
-
-	movff	menupos1,lo					; Copy menu position
+	btfsc	menupos1,2					; > 3 ?
+	movlw	dm_menu_item4_column-.8		; YES
+	movwf	win_leftx2
+
+	movff	menupos1,lo					; copy menu position
 	movlw	dm_menu_item6_row
 	dcfsnz	lo,F
 	movlw	dm_menu_item1_row
@@ -1978,33 +2028,45 @@
 	movlw	dm_menu_item4_row
 	dcfsnz	lo,F
 	movlw	dm_menu_item5_row
-	movff	WREG,win_top
+	movwf	win_top
 	movlw	FT_SMALL
-	movff	WREG,win_font
+	movwf	win_font
 	STRCPY_PRINT "\xb7"					; print cursor
 	return
 
+
 	global	TFT_active_gas_divemode
-TFT_active_gas_divemode:				; Display gas/Setpoint
+TFT_active_gas_divemode:				; display gas/setpoint
 	bcf		FLAG_TFT_active_gas_divemode
-	btfsc	divemode_menu				; Is the dive mode menu shown?
-	return								; Yes, return
-	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
-	return
-	btfsc	FLAG_ccr_mode				; in CCR mode?
-	bra		TFT_active_setpoint			; Yes, show setpoint and gas mix
-	btfsc	FLAG_pscr_mode				; in PSCR mode?
-	bra		TFT_active_setpoint			; Yes, show setpoint and gas mix
-	call	TFT_standard_color
-	btfss	better_gas_available		; check if a better gas is available and a gas change is advised in divemode
-	bra		TFT_active_gas_divemode2	; NO  - print in normal rendering
+	btfsc	divemode_menu				; is the dive mode menu shown?
+	return								; YES - return
+	btfsc	FLAG_apnoe_mode				; in apnoe mode?
+	return								; YES - return
+	btfsc	FLAG_gauge_mode				; in gauge mode?
+	return								; YES - return
+	btfss	FLAG_oc_mode				; in OC mode?
+	bra		TFT_active_setpoint			; NO  - show setpoint and gas mix
+	bra		TFT_active_gas_divemode_oc	; YES - show OC gas
+
+TFT_active_setpoint_bail:				; bailout case
+	tstfsz	menupos2					; any option shown?
+	bra		TFT_active_gas_divemode_oc	; YES - do not overwrite with bailout text
+	WIN_SMALL dm_active_dil_column, dm_active_dil_row
+	call	TFT_attention_color			; print plaint in yellow
+	STRCPY_TEXT_PRINT tDiveBailout		; "Bailout"
+TFT_active_gas_divemode_oc:				; common part for OC and bailout
+	movff	int_O_breathed_ppO2+0,lo	; color-code the output of the gas by the ppO2 it yields
+	movff	int_O_breathed_ppO2+1,hi	;
+	call	TFT_color_code_ppo2			; with ppO2 [cbar] in hi:lo
+	btfss	better_gas_available		; check if a better gas is available and a gas change shall be advised
+	bra		TFT_active_gas_print		; NO  - print in normal rendering
 	btg		blinking_better_gas			; YES - toggle blink bit
 	btfss	blinking_better_gas			;       blink now?
-	bra		TFT_active_gas_divemode2	;       NO  - print in normal rendering
+	bra		TFT_active_gas_print		;       NO  - print in normal rendering
 	call	TFT_attention_color			;       YES - blink in yellow
 	bsf		win_invert					;             set invert flag
-TFT_active_gas_divemode2:
-	WIN_STD dm_active_gas_column, dm_active_gas_row
+TFT_active_gas_print:
+	WIN_STD	dm_active_gas_column, dm_active_gas_row
 	movff	char_I_O2_ratio,lo			; lo now stores O2 in %
 	movff	char_I_He_ratio,hi			; hi now stores He in %
 	call	customview_show_mix			; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
@@ -2012,24 +2074,25 @@
 	bcf		win_invert					; reset invert flag
 	goto	TFT_standard_color			; ...and return
 
-TFT_active_setpoint:					; Show setpoint
-	btfsc	is_bailout					; are we in bailout?
+	; in CCR / pSCR mode - and maybe in bailout
+TFT_active_setpoint:					;
+	btfsc	FLAG_bailout_mode			; in bailout?
 	bra		TFT_active_setpoint_bail	; YES - show "Bailout" instead of setpoint
-	movff	int_O_breathed_ppO2+0,lo
+
+	; on the loop
+	movff	int_O_breathed_ppO2+0,lo	; color-code the output by the ppO2 of the loop gas mixture
 	movff	int_O_breathed_ppO2+1,hi
 	call	TFT_color_code_ppo2			; with ppO2 [cbar] in hi:lo
-	btg		blinking_setpoint			; toggle blink bit...
-	btfss	blinking_setpoint			; blink now?
-	bra		TFT_active_setpoint_print	; NO  - print ppO2 with normal rendering
-	btfsc	setpoint_fallback			; YES - check if we are in fallback condition
+	btfss	secs,0						; timebase for blinking effect: on even second?
+	bra		TFT_active_setpoint_print	; YES - print ppO2 with normal rendering
+	btfsc	setpoint_fallback			; NO  - check if we are in fallback condition
 	bra		TFT_active_setpoint_fallb	;       YES - process fallback case
 	movff	int_O_breathed_ppO2+1,WREG	;       NO  - get flags again (have been cleared in hi:lo by TFT_color_code_ppo2 meanwhile)
 	btfss	WREG,int_warning_flag		;             warning flag set?
 	bra		TFT_active_setpoint_print	;             NO  - ppO2 is ok, print ppO2 with normal rendering
 	bra		TFT_active_setpoint_com		;             YES - continue with blinking common part
 TFT_active_setpoint_fallb:				; set up fallback case 
-	movlw	color_yellow				; text in yellow 
-	call	TFT_set_color				; overwrite setting done by TFT_color_code_ppo2 
+	call	TFT_attention_color			; text in yellow 
 TFT_active_setpoint_com:				; blinking common part
 	bsf		win_invert					; set invert flag
 TFT_active_setpoint_print:
@@ -2045,21 +2108,18 @@
 TFT_active_setpoint2_a:
 	STRCAT_PRINT ""
 	bcf		win_invert					; reset invert flag
-	call	TFT_standard_color			; revert to standard color
-	bra		TFT_active_setpoint_diluent ; continue with showing diluent
-TFT_active_setpoint_bail:
-	WIN_SMALL dm_active_gas_column, dm_active_gas_row+.3	; collides with diluent in FT_MEDIUM
-	call	TFT_standard_color
-	STRCPY_TEXT_PRINT tDiveBailout		; Bailout
-TFT_active_setpoint_diluent:
-	btfss	better_gas_available		; check if a better gas is available and a gas change is advised in divemode
+	call	TFT_memo_color				; revert to memo color
+TFT_active_setpoint_diluent:			; diluent gas
+	movff	int_O_pure_ppO2+0,lo		; color-code the output
+	movff	int_O_pure_ppO2+1,hi
+	call	TFT_color_code_ppo2					; with ppO2 [cbar] in hi:lo
+	btfss	better_dil_available				; check if a better diluent is available and a diluent change shall be advised
 	bra		TFT_active_setpoint_diluent_show	; NO  - print in normal rendering
-	btg		blinking_better_gas					; YES - toggle blink bit...
-	btfss	blinking_better_gas					; blink now?
+	btg		blinking_better_dil					; YES - toggle blink bit...
+	btfss	blinking_better_dil					; blink now?
 	bra		TFT_active_setpoint_diluent_show	; NO  - print in normal rendering
-	movlw	color_yellow						; YES - blink in yellow
-	call	TFT_set_color						;       set text color
-	bsf		win_invert							;       set invert flag
+	call	TFT_attention_color					; YES - print in yellow color
+	bsf		win_invert							;     - set invert flag
 TFT_active_setpoint_diluent_show:
 	WIN_SMALL dm_active_dil_column, dm_active_dil_row
 	movff	char_I_O2_ratio,lo			; lo now stores O2 in %
@@ -2067,58 +2127,52 @@
 	call	customview_show_mix			; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
 	STRCAT_PRINT ""
 	bcf		win_invert					; reset invert flag
-	goto	TFT_standard_color			; ...and return
-
-
-	global	TFT_show_mode_divemode
-TFT_show_mode_divemode:
+	call	TFT_memo_color				; set memo color
+	btfsc	menuview					; is the dive options menu shown?
+	return								; YES - do not overwrite it
 	WIN_TINY dm_active_dil_column+.45, dm_active_dil_row+.3
-	btfsc	is_bailout					; in bailout?
-	return								; YES
-	btfsc	FLAG_ccr_mode				; NO  - in CCR mode?
-	bra		TFT_show_mode_divemode_ccr	;		YES	- write CCR label
-	btfsc	FLAG_pscr_mode				;		NO  - in pSCR mode?
-	bra		TFT_show_mode_divemode_pscr	;			  YES - write pSCR label
-	return								;			  NO  - done
-TFT_show_mode_divemode_ccr:
-	call	TFT_standard_color			; set standard color
+	btfsc	FLAG_ccr_mode				; in CCR mode?
+	bra		TFT_active_setpoint_ccr		; YES - write CCR label
+	btfsc	FLAG_pscr_mode				; in pSCR mode?
+	bra		TFT_active_setpoint_pscr	; YES - write pSCR label
+	return								; NO  to both - should not happen, anyhow: done
+TFT_active_setpoint_ccr:
 	STRCPY_TEXT_PRINT tDvCCR			; print "CCR"
 	return								; done
-TFT_show_mode_divemode_pscr:
-	call	TFT_standard_color			; set standard color
+TFT_active_setpoint_pscr:
 	STRCPY_TEXT_PRINT tDvPSCR			; print "PSCR"
-	return
+	return								; done
 
 
 	global	TFT_display_decotype_surface
 TFT_display_decotype_surface:
 	WIN_STD	surf_decotype_column,surf_decotype_row
 	WIN_COLOR color_lightblue
-	movff	opt_dive_mode,lo			; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
+	movff	opt_dive_mode,lo				; 0=OC, 1=CC, 2=Gauge, 3=Apnoe, 4=PSCR
 	tstfsz	lo
 	bra		TFT_display_decotype_surface2
 TFT_display_decotype_surface0:
-	STRCAT_TEXT_PRINT tDvOC				; OC
+	STRCAT_TEXT_PRINT tDvOC					; OC
 	bra		TFT_display_decotype_exit
 TFT_display_decotype_surface2:
 	decfsz	lo,F
 	bra		TFT_display_decotype_surface3
-	STRCAT_TEXT_PRINT tDvCC				; CC
+	STRCAT_TEXT_PRINT tDvCC					; CC
 	call	TFT_standard_color
 	WIN_TINY surf_decotype_column+.18,surf_decotype_row+.12
-	TSTOSS	opt_ccr_mode				; =0: Fixed SP, =1: Sensor, =2: Auto SP
-	bra	 TFT_display_decotype_cc_fixed
+	TSTOSS	opt_ccr_mode					; =0: Fixed SP, =1: Sensor, =2: Auto SP
+	bra		TFT_display_decotype_cc_fixed
 	; Sensor mode or Auto
 	movff	opt_ccr_mode,WREG
 	sublw	.2
 	bz		TFT_display_decotype_cc_auto
-	STRCPY_TEXT tCCRModeSensor				; Sensor
+	STRCPY_TEXT tCCRModeSensor				; sensor
 	bra		TFT_display_decotype_cc_common
 TFT_display_decotype_cc_auto:
 	STRCPY_TEXT tCCRModeAutoSP				; Auto SP
 	bra		TFT_display_decotype_cc_common
 TFT_display_decotype_cc_fixed:
-	STRCPY_TEXT tCCRModeFixedSP				; Fixed SP
+	STRCPY_TEXT tCCRModeFixedSP				; fixed SP
 TFT_display_decotype_cc_common:
 	clrf	WREG
 	movff	WREG,buffer+.8					; limit string length to 8
@@ -2137,109 +2191,110 @@
 	STRCAT_TEXT_PRINT tDvApnea				; Apnea
 	bra		TFT_display_decotype_exit
 TFT_display_decotype_surface5:
-	STRCAT_TEXT_PRINT tDvPSCR				; PSCR
+	STRCAT_TEXT_PRINT tDvPSCR				; pSCR
 TFT_display_decotype_exit:
 	goto	TFT_standard_color				; and return...
 
 
-	global	TFT_display_decotype_surface1	; Used from logbook!
-TFT_display_decotype_surface1:				; Used from logbook!
-	tstfsz	lo
+	global	TFT_display_decotype_surface1
+TFT_display_decotype_surface1:				; used from logbook and from deco calculator (simulator.asm)
+	tstfsz	lo								; lo holds 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR
 	bra		TFT_display_decotype_surface1_2
-	bra		TFT_display_decotype_surface0	;OC
+	bra		TFT_display_decotype_surface0	; OC
 TFT_display_decotype_surface1_2:
 	decfsz	lo,F
 	bra		TFT_display_decotype_surface1_3
-	STRCAT_TEXT_PRINT	tDvCC				; CC (w/o Sensor/Fixed Display)
+	STRCAT_TEXT_PRINT	tDvCC				; CC
+	bra		TFT_display_decotype_exit
 TFT_display_decotype_surface1_3:
 	decfsz	lo,F
 	bra		TFT_display_decotype_surface1_4
-	bra		TFT_display_decotype_surface3_1 ; Gauge
+	bra		TFT_display_decotype_surface3_1	; Gauge
 TFT_display_decotype_surface1_4:
 	decfsz	lo,F
-	bra		TFT_display_decotype_surface4_1 ; Apnea
-	bra		TFT_display_decotype_surface5	; PSCR
+	bra		TFT_display_decotype_surface5	; pSCR
+	bra		TFT_display_decotype_surface4_1	; Apnea
 
 ;=============================================================================
 
-	global	TFT_splist_surfmode			; Show Setpoint list
-	extern	gaslist_strcat_setpoint
+	global	TFT_splist_surfmode			; show setpoint list
 TFT_splist_surfmode:
-	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
+	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bcf		better_gas_hint				; do not mark the best gas/diluent (to be used in dive mode only)
 	;SP 1
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row
 	clrf	PRODL
-	call	gaslist_strcat_setpoint		; Show SP#+1 of PRODL#
+	call	gaslist_strcat_setpoint		; show SP#+1 of PRODL#
 	STRCAT_PRINT ""
 	;SP 2
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)
 	movlw	.1
 	movwf	PRODL
-	call	gaslist_strcat_setpoint		; Show SP#+1 of PRODL#
+	call	gaslist_strcat_setpoint		; show SP#+1 of PRODL#
 	STRCAT_PRINT ""
 	;SP 3
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)
 	movlw	.2
 	movwf	PRODL
-	call	gaslist_strcat_setpoint		; Show SP#+1 of PRODL#
+	call	gaslist_strcat_setpoint		; show SP#+1 of PRODL#
 	STRCAT_PRINT ""
 	;SP 4
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3)
 	movlw	.3
 	movwf	PRODL
-	call	gaslist_strcat_setpoint		; Show SP#+1 of PRODL#
+	call	gaslist_strcat_setpoint		; show SP#+1 of PRODL#
 	STRCAT_PRINT ""
 	;SP 5
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4)
 	movlw	.4
 	movwf	PRODL
-	call	gaslist_strcat_setpoint		; Show SP#+1 of PRODL#
+	call	gaslist_strcat_setpoint		; show SP#+1 of PRODL#
 	STRCAT_PRINT ""
 	bcf		leftbind
 	return
 
 	global	TFT_gaslist_surfmode
-TFT_gaslist_surfmode:					; Displays Gas List
-	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	extern	gaslist_strcat_gas_mod
+TFT_gaslist_surfmode:					; displays gas list
+	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_cd and gaslist_strcat_setpoint
+	bcf		better_gas_hint				; do not mark the best gas/diluent (to be used in dive mode only)
 	;Gas 1
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row
 	clrf	PRODL
-	call	gaslist_strcat_gas_mod		;Append gas description of gas #PRODL (0-4) to current string
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	STRCAT_PRINT ""
 	;Gas 2
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)
 	movlw	.1
 	movwf	PRODL
-	call	gaslist_strcat_gas_mod		;Append gas description of gas #PRODL (0-4) to current string
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	STRCAT_PRINT ""
 	;Gas 3
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)
 	movlw	.2
 	movwf	PRODL
-	call	gaslist_strcat_gas_mod		;Append gas description of gas #PRODL (0-4) to current string
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	STRCAT_PRINT ""
 	;Gas 4
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3)
 	movlw	.3
 	movwf	PRODL
-	call	gaslist_strcat_gas_mod		;Append gas description of gas #PRODL (0-4) to current string
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	STRCAT_PRINT ""
 	;Gas 5
 	WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4)
 	movlw	.4
 	movwf	PRODL
-	call	gaslist_strcat_gas_mod		;Append gas description of gas #PRODL (0-4) to current string
+	call	gaslist_strcat_gas_cd		; append gas description of gas #PRODL (0-4) to current string
 	STRCAT_PRINT ""
 	bcf		leftbind
+	bcf		win_invert					; clear flag for inverted output
 	return
 
 	global	TFT_dillist_surfmode
-TFT_dillist_surfmode:					; Displays Diluent List
-	bsf		short_gas_decriptions		; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint
-	bsf		ccr_diluent_setup			; Use CCR Diluents...
-	rcall	TFT_gaslist_surfmode		; Use OC/BAIL routine
-	bcf		ccr_diluent_setup			; Clear flag
+TFT_dillist_surfmode:					; displays diluent list
+	bsf		FLAG_diluent_setup			; use CCR diluents...
+	rcall	TFT_gaslist_surfmode		; use OC/BAIL routine
+	bcf		FLAG_diluent_setup			; clear flag
 	return
 
 ;==================================================================
@@ -2249,35 +2304,33 @@
 	bcf		FLAG_TFT_depth
 	SAFE_2BYTE_COPY rel_pressure, lo
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	call	TFT_color_code_depth		; Color-code the output
+	call	TFT_color_code_depth		; color-code the output
 	rcall	TFT_depth_blink
 	WIN_LARGE dm_depth_column, dm_depth_row
-
 	TSTOSS	opt_units					; 0=m, 1=ft
 	bra		TFT_depth_metric
 ;TFT_depth_imperial
-	clrf	sub_a+1						; Display 0ft if lower then 30cm
+	clrf	sub_a+1						; display 0ft if lower then 30cm
 	movlw	d'30'
 	movwf	sub_a+0
 	movff	hi,sub_b+1
 	movff	lo,sub_b+0
 	call	subU16						; sub_c = sub_a - sub_b
-	btfss	neg_flag					; Depth lower then 0.4m?
-	bra		depth_less_0.3mtr_feet		; Yes, Show 0ft manually
-
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
+	btfss	neg_flag					; depth lower then 0.4m?
+	bra		depth_less_0.3mtr_feet		; YES - show 0ft manually
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
 	bsf		leftbind
 	output_16							; feet in Big font
 	bcf		leftbind
 	movlw	.3							; limit to three chars
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
-	STRCAT_PRINT ""						; Display feet
-	bcf		win_invert					; Reset invert flag
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""						; display feet
+	bcf		win_invert					; reset invert flag
 	return
 
 depth_less_0.3mtr_feet:
 	STRCAT_PRINT "0  "					; manual zero
-	bcf		win_invert					; Reset invert flag
+	bcf		win_invert					; reset invert flag
 	return
 
 TFT_depth_metric:
@@ -2285,9 +2338,9 @@
 	cpfslt	hi
 	bra		depth_greater_99_84mtr
 
-	btfsc	depth_greater_100m			; Was depth>100m during last call
-	rcall	TFT_clear_depth				; Yes, clear depth area
-	bcf		depth_greater_100m			; Do this once only...
+	btfsc	depth_greater_100m			; was depth > 100m during last call?
+	rcall	TFT_clear_depth				; YES - clear depth area
+	bcf		depth_greater_100m			; do this once only...
 
 	movlw	.039
 	cpfslt	hi
@@ -2301,11 +2354,11 @@
 	movff	lo,sub_b+0
 	incf	sub_b+0,F
 	movlw	d'0'
-	addwfc	sub_b+1,F				; Add 1mbar offset
+	addwfc	sub_b+1,F				; add 1mbar offset
 	call	sub16					; sub_c = sub_a - sub_b
 	movlw	' '
-	btfss	neg_flag				; Depth lower then 10m?
-	movwf	POSTINC2				; Yes, add extra space
+	btfss	neg_flag				; depth lower then 10m?
+	movwf	POSTINC2				; YES - add extra space
 
 	clrf	sub_a+1
 	movlw	d'99'
@@ -2313,12 +2366,12 @@
 	movff	hi,sub_b+1
 	movff	lo,sub_b+0
 	call	subU16					; sub_c = sub_a - sub_b
-	btfss	neg_flag				; Depth lower then 1m?
-	bra		tft_depth2				; Yes, display manual Zero
+	btfss	neg_flag				; depth lower then 1m?
+	bra		tft_depth2				; YES - display manual Zero
 
 	bsf		leftbind
 	bsf		ignore_digit4
-	output_16						; Full meters in Big font
+	output_16						; full meters in big font
 	bcf		leftbind
 	bra		tft_depth3
 
@@ -2326,45 +2379,44 @@
 	STRCAT	"0"						; manual zero
 
 tft_depth3:
-	STRCAT_PRINT ""					; Display full meters
+	STRCAT_PRINT ""					; display full meters
 
 	; .1m in MEDIUM font
 	WIN_MEDIUM	dm_depth_dm_column, dm_depth_dm_row
 
-	; TODO - check if needed, depth should still be in hi:lo
 	SAFE_2BYTE_COPY rel_pressure, lo
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	call	TFT_color_code_depth	; Color-code the output
+	;call	TFT_color_code_depth	; color-code the output - not needed, furthermore: seems to cause problems if not commented out...
 
 	PUTC	"."
-	movlw	HIGH d'30'				; Display 0.0m if lower then 30cm
+	movlw	HIGH d'30'				; display 0.0m if lower then 30cm
 	movwf	sub_a+1
 	movlw	LOW  d'30'
 	movwf	sub_a+0
 	movff	hi,sub_b+1
 	movff	lo,sub_b+0
 	call	subU16					; sub_c = sub_a - sub_b
-	btfss	neg_flag				; Depth lower then 0.3m?
-	bra		depth_less_0.3mtr		; Yes, Show ".0" manually
+	btfss	neg_flag				; depth lower then 0.3m?
+	bra		depth_less_0.3mtr		; YES - show ".0" manually
 
 	movlw	d'4'
 	movwf	ignore_digits
-	bsf		ignore_digit5
-	output_16dp	d'0'
-	STRCAT_PRINT ""					; Display decimeters
-	bcf		win_invert				; Reset invert flag
+	bsf		ignore_digit5			; (flag will be cleared by output_16)
+	output_16dp d'0'
+	STRCAT_PRINT ""					; display decimeters
+	bcf		win_invert				; reset invert flag
 	WIN_FONT FT_SMALL
 	return
 
 depth_less_0.3mtr:
-	STRCAT_PRINT "0"				; Display 0.0m manually
-	bcf		win_invert				; Reset invert flag
+	STRCAT_PRINT "0"				; display 0.0m manually
+	bcf		win_invert				; reset invert flag
 	WIN_FONT FT_SMALL
 	return
 
-depth_greater_99_84mtr:				; Display only in full meters
-	btfss	depth_greater_100m		; Is depth>100m already?
-	rcall	TFT_clear_depth			; No, clear depth area and set flag
+depth_greater_99_84mtr:				; display only in full meters
+	btfss	depth_greater_100m		; is depth > 100m already?
+	rcall	TFT_clear_depth			; NO - clear depth area and set flag
 	call	TFT_color_code_depth
 	; Depth is already in hi:lo
 	; Show depth in Full meters
@@ -2374,14 +2426,14 @@
 	bsf		leftbind
 	output_16
 	bcf		leftbind
-	STRCAT_PRINT ""					; Display full meters only
-	bcf		win_invert				; Reset invert flag
+	STRCAT_PRINT ""					; display full meters only
+	bcf		win_invert				; reset invert flag
 	WIN_FONT FT_SMALL
 	return
 
-TFT_clear_depth:					; No, clear depth area and set flag
+TFT_clear_depth:					; NO - clear depth area and set flag
 	WIN_BOX_BLACK dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt	;top, bottom, left, right
-	bsf		depth_greater_100m		; Set Flag
+	bsf		depth_greater_100m		; set flag
 	return
 
 TFT_depth_blink:
@@ -2389,48 +2441,53 @@
 	return
 
 	; check if previous cycle had the blinking warning or not
-	btfsc	blinking_depth_prev		; did we have warning prev?
-	bra		TFT_depth_blink_prevwarn; Yes
-
-	; No; check if it's set now
+	btfsc	blinking_depth_prev		; did we have warning previously?
+	bra		TFT_depth_blink_prevwarn; YES
+
+	; NO - check if it's set now
 	btfsc	blinking_depth_warning	; do we have warning set now?
-	bra		TFT_depth_blink_warn	; Yes  - so we have warning now but not prev
+	bra		TFT_depth_blink_warn	; Yes  - so we have warning now but not previously
+	btfsc	blinking_depth_attention; do we have attention set now?
+	bra		TFT_depth_blink_warn	; Yes  - so we have attention now but not previously
 
 	; no warning in previous cycle, no warning now, reset all flags
-	bcf		blinking_depth_prev		; reset prev flag
+	bcf		blinking_depth_prev		; reset previous flag
 	bcf		blinking_depth_toggle	; reset toggle
 	bcf		win_invert
-	; all done
-	return
+	return							; all done
 
 TFT_depth_blink_prevwarn:
 	; ...we had warning in previous cycle, check if we still have the warning set
-	btfss	blinking_depth_warning			; do we still have the warning?
-	bra		TFT_depth_blink_prevwarn_nowarn	; No, clear the depth area
-
+	btfsc	blinking_depth_warning			; do we still have the warning?
+	bra		TFT_depth_blink_prevwarn_1		; YES
+	btfss	blinking_depth_attention		; do we still have the attention?
+	bra		TFT_depth_blink_prevwarn_nowarn	; NO - clear the depth area
+TFT_depth_blink_prevwarn_1:
 	; we still have the warning, set previous flag for next cycle...
 	bsf		blinking_depth_prev				; set prev flag
 	; and set toggle and invert if required
 	btfss	blinking_depth_toggle			; do we have the toggle set?
-	bra		TFT_depth_blink_set				; No:  set inverse,	do color_box, set flag
-	bra		TFT_depth_blink_reset			; Yes: clear inverse, do black box, reset flag
+	bra		TFT_depth_blink_set				; NO  - set inverse,   do color_box, set   flag
+	bra		TFT_depth_blink_reset			; Yes - clear inverse, do black box, reset flag
 
 TFT_depth_blink_prevwarn_nowarn:
 	; we had warning, but not now... (e.g. ascended or switched to better gas)
 	; reset the previous cycle flag for the next cycle...
 	bcf		blinking_depth_prev				; reset prev flag
 	; clear it - just in case if we had a blinked before
-	bra		TFT_depth_blink_reset			; Yes: clear inverse, do black box, reset flag
+	bra		TFT_depth_blink_reset			; clear inverse, do black box, reset flag
 
 TFT_depth_blink_warn:
 	; new blinking warning activated (had no warning in previous cycle)
 	bsf		blinking_depth_prev				; set prev flag
 	; set toggle and invert
-	bra		TFT_depth_blink_set
+	;bra	TFT_depth_blink_set
 
 TFT_depth_blink_set:
 	; clear the area with color
-	movlw	color_red						; that should not be hardcoded...
+	call	TFT_attention_color_dive		; default to attention color
+	btfsc	blinking_depth_warning			; in warning mode?
+	call	TFT_warnings_color_dive			; overwrite with warning color
 	WIN_BOX_COLOR dm_depth_row, dm_depth_bot, dm_depth_column, dm_depth_rgt	;top, bottom, left, right
 	;set the invert color
 	bsf		win_invert
@@ -2449,36 +2506,39 @@
 	; if it's still warning...
 	btfsc	blinking_depth_warning
 	call	TFT_warnings_color
+	btfsc	blinking_depth_attention
+	call	TFT_attention_color
 	; all done
 	return
 
 ;=============================================================================
 
 	global	TFT_custom_text
-TFT_custom_text:					; Show the custom text
-	lfsr	FSR0, opt_name			; Source
-	WIN_SMALL surf_customtext_column,surf_customtext_row1 ; First row
-	rcall	TFT_custom_text_2		; Show up to 12 chars and print
-	incfsz	lo,F					; Was lo=255?
-	return							; No, all done.
-	lfsr	FSR0, opt_name+.12		; Source
-	WIN_SMALL surf_customtext_column,surf_customtext_row2 ; Second row
-	rcall	TFT_custom_text_2		; Show up to 12 chars and print
-	incfsz	lo,F					; Was lo=255?
-	return							; No, all done.
-	lfsr	FSR0, opt_name+.24		; Source
-	WIN_SMALL surf_customtext_column,surf_customtext_row3 ; Third row
-	rcall	TFT_custom_text_2		; Show up to 12 chars and print
-	incfsz	lo,F					; Was lo=255?
-	return							; No, all done.
-	lfsr	FSR0, opt_name+.36		; Source
-	WIN_SMALL surf_customtext_column,surf_customtext_row4 ; Forth row
-	rcall	TFT_custom_text_2		; Show up to 12 chars and print
-	incfsz	lo,F					; Was lo=255?
-	return							; No, all done.
-	lfsr	FSR0, opt_name+.48		; Source
-	WIN_SMALL surf_customtext_column,surf_customtext_row5 ; Fifth row
-	bra		TFT_custom_text_2		; Show up to 12 chars and print ; and return...
+TFT_custom_text:					; show the custom text
+	call	TFT_standard_color
+	lfsr	FSR0, opt_name			; source
+	WIN_SMALL surf_customtext_column,surf_customtext_row1 ; 1st row
+	rcall	TFT_custom_text_2		; show up to 12 chars and print
+	incfsz	lo,F					; was lo=255?
+	return							; NO - all done
+	lfsr	FSR0, opt_name+.12		; source
+	WIN_SMALL surf_customtext_column,surf_customtext_row2 ; 2nd row
+	rcall	TFT_custom_text_2		; show up to 12 chars and print
+	incfsz	lo,F					; was lo=255?
+	return							; NO - all done
+	lfsr	FSR0, opt_name+.24		; source
+	WIN_SMALL surf_customtext_column,surf_customtext_row3 ; 3rd row
+	rcall	TFT_custom_text_2		; show up to 12 chars and print
+	incfsz	lo,F					; was lo=255?
+	return							; NO - all done
+	lfsr	FSR0, opt_name+.36		; source
+	WIN_SMALL surf_customtext_column,surf_customtext_row4 ; 4th row
+	rcall	TFT_custom_text_2		; show up to 12 chars and print
+	incfsz	lo,F					; was lo=255?
+	return							; NO - all done
+	lfsr	FSR0, opt_name+.48		; source
+	WIN_SMALL surf_customtext_column,surf_customtext_row5 ; 5th row
+	bra		TFT_custom_text_2		; show up to 12 chars, print and return...
 
 
 TFT_custom_text_2:
@@ -2486,14 +2546,14 @@
 	movlw	.12
 	movwf	lo						; length/line
 TFT_custom_text_3:
-	movf	POSTINC0,W				; Get byte
-	bz		TFT_custom_text_4		; End if NULL
-	movwf	POSTINC2				; NO: copy
-	decfsz	lo,F					; Max length reached ?
-	bra		TFT_custom_text_3		; NO: loop
+	movf	POSTINC0,W				; get byte
+	bz		TFT_custom_text_4		; end if NULL
+	movwf	POSTINC2				; NO - copy
+	decfsz	lo,F					; max length reached ?
+	bra		TFT_custom_text_3		; NO - loop
 	setf	lo						; lo=255 -> more to come
 TFT_custom_text_4:
-	clrf	POSTINC2				; Mark end of string
+	clrf	POSTINC2				; mark end of string
 	goto	aa_wordprocessor		; print and return
 
 
@@ -2501,7 +2561,7 @@
 
 	global	TFT_update_surf_press
 TFT_update_surf_press:
-	WIN_SMALL	surf_press_column,surf_press_row
+	WIN_SMALL surf_press_column+.8,surf_press_row
 	call	TFT_standard_color
 	SAFE_2BYTE_COPY amb_pressure, lo
 	movff	lo,sub_a+0
@@ -2509,15 +2569,15 @@
 	movff	last_surfpressure_30min+0,sub_b+0
 	movff	last_surfpressure_30min+1,sub_b+1
 	call	subU16								; sub_c = sub_a - sub_b
-	btfsc	neg_flag							; Pressure lower?
-	rcall	update_surf_press2					; Yes, test threshold
-	tstfsz	sub_c+1								; >255mbar difference?
-	bra		update_surf_press_common			; Yes, display!
+	btfsc	neg_flag							; pressure lower?
+	rcall	update_surf_press2					; YES - test threshold
+	tstfsz	sub_c+1								; >255 mbar difference?
+	bra		update_surf_press_common			; YES -  display
 	movlw	d'11'								; 10mbar noise suppression
 	subwf	sub_c+0,W
 	btfsc	STATUS,C
-	bra		update_surf_press_common			; Yes, display!
-	SAFE_2BYTE_COPY last_surfpressure_30min, lo	; Overwrite with stable value...
+	bra		update_surf_press_common			; YES - display
+	SAFE_2BYTE_COPY last_surfpressure_30min, lo	; overwrite with stable value...
 update_surf_press_common:
 	movff	lo,int_I_pres_surface+0				; copy displayed value to C code to have pressure displayed
 	movff	hi,int_I_pres_surface+1				; and pressure used for desaturation & no-fly time in sync
@@ -2531,8 +2591,8 @@
 	movff	WREG,buffer+4
 	STRCAT_PRINT ""
 	call	TFT_divemask_color
-	WIN_SMALL	surf_press_column+4*8,surf_press_row
-	STRCPY_TEXT_PRINT tMBAR						; mbar
+	WIN_SMALL	surf_press_column+(4+1)*8,surf_press_row
+	STRCPY_TEXT_PRINT tMBAR						; mbar (hPa)
 	return
 
 update_surf_press2:
@@ -2540,14 +2600,15 @@
 	movff	hi,sub_b+1
 	movff	last_surfpressure_30min+0,sub_a+0
 	movff	last_surfpressure_30min+1,sub_a+1
-	goto	subU16								; sub_c = sub_a - sub_b	; and return...
+	goto	subU16								; sub_c = sub_a - sub_b and return...
 
 ;=============================================================================
 
 	global	TFT_update_batt_voltage
 TFT_update_batt_voltage:
-	movff	batt_percent,lo			; Get battery percent
-	call	TFT_color_code_battery	; Color-code battery percent
+	movff	batt_percent,lo			; get battery percent
+	clrf	hi
+	call	TFT_color_code_battery	; color-code battery percent
 	; Setup charge indicator
 	btfsc	cc_active
 	bsf		win_invert
@@ -2557,18 +2618,25 @@
 	movlw	color_green
 	btfsc	cc_active
 	call	TFT_set_color
-	WIN_TINY batt_percent_column,batt_percent_row
-	bsf		leftbind
-	output_8
-	bcf		leftbind
-	STRCAT	"% "
-	movlw	0x00
-	movff	WREG,buffer+4			; Only "xxx%"
-	STRCAT_PRINT ""
+
+ IFDEF _ostc_logo
+	WIN_TINY  batt_percent_column,batt_percent_row
+ ELSE
+	WIN_SMALL batt_percent_column+.2,batt_percent_row
+ ENDIF
+
+	output_16_3						; display only last three digits from a 16 bit value (0-999)
+	STRCAT_PRINT "% "
 	bcf		win_invert
 	call	TFT_standard_color
+
+ IFDEF _ostc_logo
 	WIN_TINY batt_voltage_column,batt_voltage_row
-	movff	battery_type,lo			; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah
+ ELSE
+	WIN_TINY batt_voltage_column+.15,batt_voltage_row
+ ENDIF
+
+	movff	battery_type,lo			; =0: 1.5V, =1: 3.6V Saft, =2: LiIon 3.7V/0.8Ah, =3: LiIon 3.7V/3.1Ah, =4: LiIon 3.7V/2.3Ah
 	PUTC	"T"
 	bsf		leftbind
 	output_8
@@ -2580,7 +2648,7 @@
 	PUTC	'V'
 	movff	buffer+8,buffer+6
 	movlw	0x00
-	movff	WREG,buffer+7			; Only "x.yV"
+	movff	WREG,buffer+7			; only "x.yV"
 	STRCAT_PRINT ""
 	return
 
@@ -2599,7 +2667,7 @@
 ;	movwf	xB+0
 ;	movlw	HIGH	.152
 ;	movwf	xB+1
-;	call	div32x16		; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+;	call	div32x16				; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 ;	bsf		leftbind
 ;	movff	xC+0,lo
 ;	movff	xC+1,hi
@@ -2613,84 +2681,84 @@
 
 	global	TFT_convert_signed_16bit
 TFT_convert_signed_16bit:
-	bcf		neg_flag				; Positive temperature
-	btfss	hi,7					; Negative temperature ?
-	return							; No, return
-; Yes, negative temperature!
-	bsf		neg_flag				; Negative temperature
-	PUTC	'-'						; Display "-"
-	comf	hi						; Then, 16bit sign changes.
+	bcf		neg_flag				; positive temperature
+	btfss	hi,7					; negative temperature ?
+	return							; NO  - return
+									; YES - negative temperature
+	bsf		neg_flag				; negative temperature
+	PUTC	'-'						; display "-"
+	comf	hi						; 16 bit sign change
 	negf	lo
 	btfsc	STATUS,C
 	incf	hi
-	return							; and return
+	return							; done
 
 ;=============================================================================
 
 	global	TFT_convert_date
-TFT_convert_date:						; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
-	movff	opt_dateformat,WREG			; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
-	movwf	EEDATA						; used as temp here
+TFT_convert_date:					; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+	movff	opt_dateformat,WREG		; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
+	movwf	EEDATA					; used as temp here
 	tstfsz	EEDATA
-	bra		TFT_convert_date_1			; opt_dateformat is 1 or 2
-	; opt_dateformat is 0
-	; use MMDDYY
-	movff	lo,lo_temp					; incoming: lo = day,   hi = month
-	movff	hi,lo						; swap
-	movff	lo_temp,hi					; now:      lo = month, hi = day
+	bra		TFT_convert_date_1		; opt_dateformat is 1 or 2
+									; opt_dateformat is 0
+									; use MMDDYY
+	movff	lo,lo_temp				; incoming: lo = day,   hi = month
+	movff	hi,lo					; swap
+	movff	lo_temp,hi				; now:      lo = month, hi = day
 	bra		TFT_convert_date_common
 
 TFT_convert_date_1:
 	decfsz	EEDATA,F
-	bra		TFT_convert_date_2			; opt_dateformat is 2
-	; opt_dateformat is 1
-	; use DDMMYY
+	bra		TFT_convert_date_2		; opt_dateformat is 2
+									; opt_dateformat is 1
+									; use DDMMYY
 TFT_convert_date_common:
 	bsf		leftbind
-	output_99x							; with lo = month or day   or year
+	output_99x						; with lo = month or day   or year
 	PUTC	'.'
-	movff	hi,lo						; now  lo = day   or month or month
+	movff	hi,lo					; now  lo = day   or month or month
 	output_99x
 	PUTC	'.'
-	movff	up,lo						; now  lo = year  or year  or day
+	movff	up,lo					; now  lo = year  or year  or day
 	output_99x
 	bcf		leftbind
 	return
 
 TFT_convert_date_2:
-	; opt_dateformat is 2
-	; use YYMMDD
-	movff	lo,lo_temp					; incoming: lo = day,  up = year
-	movff	up,lo						; swap
-	movff	lo_temp,up					; now     : lo = year, up = day
+									; opt_dateformat is 2
+									; use YYMMDD
+	movff	lo,lo_temp				; incoming: lo = day,  up = year
+	movff	up,lo					; swap
+	movff	lo_temp,up				; now     : lo = year, up = day
 	bra		TFT_convert_date_common
 
 ;=============================================================================
 
 	global	TFT_convert_date_short
-TFT_convert_date_short:					; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2
-	movff	opt_dateformat,WREG			; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
-	movwf	EEDATA						; used as temp here
+TFT_convert_date_short:				; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2
+	movff	opt_dateformat,WREG		; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD
+	movwf	EEDATA					; used as temp here
 	tstfsz	EEDATA
 	bra		TFT_convert_date_short_1
-	; opt_dateformat is 0
-	; Use MMDD(YY)
+									; opt_dateformat is 0
+									; use MMDD(YY)
 TFT_convert_date_short_0:
-	movff	lo,lo_temp					; incoming: lo = day,   hi = month
-	movff	hi,lo						; swap
-	movff	lo_temp,hi					; now:      lo = month, hi = day
+	movff	lo,lo_temp				; incoming: lo = day,   hi = month
+	movff	hi,lo					; swap
+	movff	lo_temp,hi				; now:      lo = month, hi = day
 	bra		TFT_convert_date_short_common
 
 TFT_convert_date_short_1:
 	decfsz	EEDATA,F
-	bra		TFT_convert_date_short_0	; opt_dateformat is 2 -> use (YY)MMDD
-	; opt_dateformat is 1
-	; use DDMM(YY)
+	bra		TFT_convert_date_short_0 ; opt_dateformat is 2 -> use (YY)MMDD
+									; opt_dateformat is 1
+									; use DDMM(YY)
 TFT_convert_date_short_common:
 	bsf		leftbind
-	output_99x							; with lo = month or day
+	output_99x						; with lo = month or day
 	PUTC	'.'
-	movff	hi,lo						; now  lo = day   or month
+	movff	hi,lo					; now  lo = day   or month
 	output_99x
 	bcf		leftbind
 	return
@@ -2699,7 +2767,7 @@
 
 	global	TFT_date
 TFT_date:
-	WIN_SMALL	surf_date_column,surf_date_row	; Init new Wordprocessor
+	WIN_SMALL	surf_date_column,surf_date_row	; init new wordprocessor
 	call	TFT_standard_color
 	movff	day,lo
 	movff	month,hi
@@ -2712,410 +2780,295 @@
 
 	global	TFT_max_depth_alternative
 TFT_max_depth_alternative:
-	bcf		FLAG_TFT_max_depth_alt
+	bcf		FLAG_TFT_max_depth
 	; The "mask"
 	call	TFT_divemask_color
 	WIN_TINY dm_mask_depth_column, dm_max_alt_row-.14
-	STRCPY_TEXT_PRINT tMaxDepth
-
-	; The max. depth
-	SAFE_2BYTE_COPY max_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	call	TFT_standard_color
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		TFT_max_depth_alt_metric
-;TFT_max_depth_alt_imperial:
+	btfsc	FLAG_apnoe_mode				; in Apnea mode?
+	bra		TFT_max_depth_alternative2	; YES - always draw max depth
+	TSTOSS	opt_2ndDepthDisp			; draw avg depth instead of max depth?
+	bra		TFT_max_depth_alternative2	; NO  - draw max depth
+	STRCAT_TEXT_PRINT tAvgDepth			; YES - print avg depth mask
+	movff	avg_rel_pressure_total+0,lo	;     - get avg depth, low  byte
+	movff	avg_rel_pressure_total+1,hi	;     -                high byte
+	bra		TFT_max_depth_alternative3
+TFT_max_depth_alternative2:
+	STRCAT_TEXT_PRINT tMaxDepth			; print max depth mask
+	SAFE_2BYTE_COPY max_pressure, lo	; get max depth into hi:lo
+TFT_max_depth_alternative3:
+	call	adjust_depth_with_salinity	; compute salinity setting into lo:hi [mbar]
+	call	TFT_memo_color
+	WIN_LARGE dm_max_alt_column,dm_max_alt_row
+	TSTOSS	opt_units					; 0=m or 1=ft?
+	bra		TFT_max_depth_alt_metric	; 0 - use alternative metric   version
+	bra		TFT_max_depth_imperial		; 1 - use common      imperial version
 TFT_max_depth_alt_metric:
-	WIN_LARGE dm_max_alt_column,dm_max_alt_row
-	bsf		ignore_digit4				; no 0.1m
+	movff	hi,sub_b+1					; backup hi in sub_b+1
+	movff	lo,sub_b+0					; backup lo in sub_b+0
+	bsf		ignore_digit4				; no 0.1 m
 	output_16
 	STRCAT_PRINT ""
-
-	WIN_MEDIUM	dm_max_dm_alt_column,dm_max_alt_row+.25
-	SAFE_2BYTE_COPY max_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	PUTC	"."
-	movlw	d'4'
-	movwf	ignore_digits
-	bsf		ignore_digit5
-	bsf		leftbind
-	output_16dp	d'0'
-	STRCAT_PRINT ""						; Display decimeters
-	bcf		leftbind
-	return
+	WIN_MEDIUM dm_max_dm_alt_column,dm_max_alt_row+.25
+	bra		TFT_max_depth_metric3		; continue with normal metric version for decimal
 
 
 	global	TFT_max_depth
 TFT_max_depth:
-	bcf	FLAG_TFT_max_depth
-	btfsc	FLAG_apnoe_mode				; different display in apnoe mode
-	bra		TFT_max_depth_apnoe
+	bcf		FLAG_TFT_max_depth
+	btfsc	FLAG_apnoe_mode				; in Apnoe mode?
+	bra		TFT_max_depth1				; YES - different handling in Apnoe mode
+	TSTOSS	opt_2ndDepthDisp			; draw avg depth instead of max depth?
+	bra		TFT_max_depth2				; NO  - show max depth
+	movff	avg_rel_pressure_total+0,lo	; YES - get avg depth, low  byte
+	movff	avg_rel_pressure_total+1,hi	;     -                high byte
+	bra		TFT_max_depth3
+TFT_max_depth1:
+	btfss	FLAG_active_descent			  ; are we descending?
+	bra		TFT_max_depth2				  ; NO  - show normal max
+	SAFE_2BYTE_COPY apnoe_max_pressure,lo ; YES - get apnoe_max_pressure
+	bra		TFT_max_depth3
 TFT_max_depth2:
-	SAFE_2BYTE_COPY max_pressure, lo
+	SAFE_2BYTE_COPY max_pressure,lo		; get the "normal" max depth
 TFT_max_depth3:
 	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		TFT_max_depth2_metric
-;TFT_max_depth2_imperial:
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	WIN_MEDIUM	dm_max_depth_column, dm_max_depth_row
-	TSTOSS	opt_vsigraph				; 0=skip, 1=draw
-	WIN_MEDIUM	dm_max_depth_column_nvsi, dm_max_depth_row
-	call	TFT_standard_color
-	output_16_3
-	STRCAT_PRINT ""
-	return
-
-TFT_max_depth2_metric:
-	WIN_MEDIUM dm_max_depth_column, dm_max_depth_row
-	TSTOSS	opt_vsigraph				; 0=skip, 1=draw
+	movlw	.039						; load encoding for  99.84 m
+	cpfslt	hi							; is depth to show > 99.84 m ?
+	bra		TFT_max_depth3a				; YES
+	btfss	max_depth_greater_100m		; NO  - was depth > 100 m during last call?
+	bra		TFT_max_depth3c				;       NO
+	bcf		max_depth_greater_100m		;       YES - clear flag, last depth shown now not > 100 m anymore
+	bra		TFT_max_depth3b				;           - clear depth area
+TFT_max_depth3a:
+	btfsc	max_depth_greater_100m		; YES - was depth > 100 m during last call?
+	bra		TFT_max_depth3c				;       YES
+	bsf		max_depth_greater_100m		;       NO  - set flag, last depth shown now > 100 m
+	;bra	TFT_max_depth3b				;           - clear depth area
+TFT_max_depth3b:
+	WIN_BOX_BLACK dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt	; top, bottom, left, right
+TFT_max_depth3c:
+	call	TFT_memo_color				; set output color
 	WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row
-	call	TFT_standard_color
-
-	movlw	.039
-	cpfslt	hi
-	bra		max_depth_greater_99_84mtr
-
-	btfsc	max_depth_greater_100m		; Was depth>100m during last call
-	rcall	TFT_clear_max_depth			; Yes, clear depth area
-	bcf		max_depth_greater_100m		; Do this once only...
-
-	movlw	.039
-	cpfslt	hi
-	bra		max_depth_greater_99_84mtr
-
-	movlw	HIGH	d'1000'
+	TSTOSS	opt_vsigraph				; graphical VSI bar enabled?
+	bra		TFT_max_depth4				; NO
+	WIN_MEDIUM dm_max_depth_column, dm_max_depth_row ; YES - adopt output position
+TFT_max_depth4:
+	TSTOSS	opt_units					; 0=m or 1=ft ?
+	bra		TFT_max_depth_metric		; 0 - use metric   version
+TFT_max_depth_imperial:					; 1 - use imperial version
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
+	output_16_3
+	bra		TFT_max_depth_exit
+TFT_max_depth_metric:
+	btfss	max_depth_greater_100m		; depth to show > 100 m ?
+	bra		TFT_max_depth_metric0		; NO  - show meters and decimeters
+	bsf		ignore_digit4				; YES - show full meters only, i.e. ignore digits 4 and 5
+	bsf		leftbind
+	output_16
+	bra		TFT_max_depth_exit
+TFT_max_depth_metric0:
+	movff	hi,sub_b+1					; copy hi to sub_b+1, will also be used to back-up hi
+	movff	lo,sub_b+0					; copy lo to sub_b+0, will also be used to back-up lo
+
+	movlw	HIGH d'999'
 	movwf	sub_a+1
-	movlw	LOW		d'1000'
+	movlw	LOW  d'999'
 	movwf	sub_a+0
-	movff	hi,sub_b+1
-	movff	lo,sub_b+0
-	incf	sub_b+0,F
-	movlw	d'0'
-	addwfc	sub_b+1,F				; Add 1mbar offset
-	call	sub16					; sub_c = sub_a - sub_b
+	call	sub16						; sub_c = sub_a - sub_b
 	movlw	' '
-	btfss	neg_flag				; Depth lower then 10m?
-	movwf	POSTINC2				; Yes, add extra space
+	btfss	neg_flag					; depth lower than 10m ?
+	movwf	POSTINC2					; YES - add extra space
 
 	clrf	sub_a+1
 	movlw	d'99'
 	movwf	sub_a+0
-	movff	hi,sub_b+1
-	movff	lo,sub_b+0
-	call	subU16					; sub_c = sub_a - sub_b
-	btfss	neg_flag				; Depth lower then 1m?
-	bra		tft_max_depth2			; Yes, display manual Zero
-
-	bsf		ignore_digit4			; no 0.1m
-	bsf		leftbind
-	output_16
-	bra		tft_max_depth3
-
-tft_max_depth2:
-	WIN_MEDIUM dm_max_depth_column, dm_max_depth_row
-	TSTOSS	opt_vsigraph			; 0=skip, 1=draw
-	WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row
-	STRCAT	"0"
-
-tft_max_depth3:
-	call	TFT_standard_color
-	STRCAT_PRINT ""					; Display full meters
-	bcf	 leftbind
-
-	; .1m in SMALL font
-	WIN_SMALL	dm_max_depth_dm_column, dm_max_depth_dm_row
-	TSTOSS	opt_vsigraph			; 0=skip, 1=draw
-	WIN_SMALL	dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row
-
-	SAFE_2BYTE_COPY max_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-
-	PUTC	"."
-
+	call	subU16						; sub_c = sub_a - sub_b
+	btfss	neg_flag					; depth lower than 1m ?
+	bra		TFT_max_depth_metric1		; YES - manually display a zero
+	bsf		ignore_digit4				; NO  - no 0.1 m
+	bsf		leftbind					;     - align left
+	output_16							;     - display full meters
+	bra		TFT_max_depth_metric2
+TFT_max_depth_metric1:
+	STRCAT	"0"							; display a zero
+TFT_max_depth_metric2:
+	STRCAT_PRINT ""
+	; .1 m in SMALL font
+	WIN_SMALL dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row
+	TSTOSS	opt_vsigraph				; graphical VSI bar enabled?
+	bra		TFT_max_depth_metric3		; NO
+	WIN_SMALL dm_max_depth_dm_column, dm_max_depth_dm_row ; YES - adopt position
+TFT_max_depth_metric3:
+	movff	sub_b+1,hi					; restore hi
+	movff	sub_b+0,lo					; restore lo
+	PUTC	"."							; print decimal point
 	movlw	d'4'
 	movwf	ignore_digits
-	bsf		ignore_digit5
+	bsf		ignore_digit5				; no 0.01 m, flag will be cleared by output_16
 	bsf		leftbind
-	output_16dp	d'0'
-	STRCAT_PRINT ""						; Display decimeters
-	bcf		leftbind
-	return
-
-max_depth_greater_99_84mtr:				; Display only in full meters
-	btfss	max_depth_greater_100m		; Is max depth>100m already?
-	rcall	TFT_clear_max_depth			; No, clear max depth area and set flag
-	; Max. Depth is already in hi:lo
-	; Show max. depth in Full meters
-	; That means ignore figure 4 and 5
-	lfsr	FSR2,buffer
-	bsf		ignore_digit4
-	bsf		leftbind
-	output_16
+	output_16dp d'0'
+TFT_max_depth_exit:
+	STRCAT_PRINT ""
 	bcf		leftbind
-	STRCAT_PRINT ""						; Display full meters only
-	WIN_FONT FT_SMALL
-	return
-
-TFT_clear_max_depth:					; No, clear max. depth area and set flag
-	WIN_BOX_BLACK	dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt	;top, bottom, left, right
-	bsf		max_depth_greater_100m		; Set Flag
-	return
-
-
-TFT_max_depth_apnoe:
-	btfss	FLAG_active_descent			; Are we descending?
-	bra		TFT_max_depth2				; Yes, show normal max.
-	SAFE_2BYTE_COPY apnoe_max_pressure, lo
-	bra		TFT_max_depth3				; Show apnoe_max_pressure as max. depth
-
-	global	TFT_display_apnoe_last_max
-TFT_display_apnoe_last_max:
-	call	TFT_divemask_color
-	WIN_TINY dm_apnoe_last_max_depth_text_col, dm_apnoe_last_max_depth_text_row
-	STRCPY_TEXT_PRINT	tApnoeMax
-
-	call	TFT_standard_color
-	SAFE_2BYTE_COPY max_pressure, lo
-	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
-	TSTOSS	opt_units					; 0=m, 1=ft
-	bra		TFT_display_apnoe_last_m_metric
-;TFT_display_apnoe_last_max_imperial
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
-	WIN_MEDIUM	dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row
-	output_16
-	STRCAT_PRINT ""
-	return
-
-TFT_display_apnoe_last_m_metric:
-	WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row
-	bsf		ignore_digit5				; do not display 1cm depth
-	output_16dp d'3'
-	STRCAT_PRINT ""
-	return
+	goto	TFT_standard_color			; and return...
 
 ;=============================================================================
 
 	global	TFT_divemins
 TFT_divemins:
-	bcf	FLAG_TFT_divemins			; Clear flag
+	bcf		FLAG_TFT_divemins		; clear flag
 	movff	divemins+0,lo
 	movff	divemins+1,hi
 
 	; Already showing divemins > 99min
-	btfsc	no_more_divesecs		; Ignore seconds?
-	bra		TFT_divemins2			; Show minutes only
+	btfsc	no_more_divesecs		; ignore seconds?
+	bra		TFT_divemins2			; show minutes only
 
 	tstfsz	hi						; hi = 0?
-	bra	TFT_divemins_clr			; No, show mins only
+	bra		TFT_divemins_clr		; NO - show mins only
 
 	movlw	.99
 	cpfsgt	lo						; bigger than 99?
-	bra		TFT_divemins1			; No show mins:secs
+	bra		TFT_divemins1			; NO - show mins:secs
 
 TFT_divemins_clr:
-	; Yes, remove second display for the rest of the dive and clear seconds
-	bsf		no_more_divesecs		; Set flag
-	; Clear rest of seconds
+									; YES - remove second display for the rest of the dive and clear seconds
+	bsf		no_more_divesecs		;     - set flag
+									;     - clear rest of seconds
 	WIN_BOX_BLACK dm_divetime_row, dm_divetime_bot, dm_divetime_column, dm_divetime_rgt ;top, bottom, left, right
-	bra		TFT_divemins2			; Show minutes only
+	bra		TFT_divemins2			;     - show minutes only
 
 TFT_divemins1:
-	; Print out the minutes, up to 99min, only 2chars !
-	call	TFT_standard_color
+	; Print out the minutes, up to 99 minutes, only 2 chars!
+	call	TFT_memo_color
 	WIN_MEDIUM dm_divetime_column, dm_divetime_row
-	output_99						; displays only last two figures from a 8Bit value (0-99)
-	STRCAT_PRINT ""					; Show minutes in large font
+	output_99						; displays only last two figures from a 8 bit value (0-99)
+	STRCAT_PRINT ""					; show minutes in large font
 
 	; Print out the seconds
-	WIN_SMALL dm_divetime_secs_column, dm_divetime_secs_row			; left position for two sec figures
+	WIN_SMALL dm_divetime_secs_column, dm_divetime_secs_row ; left position for two sec figures
 	PUTC	':'
-	bsf	leftbind
 	movff	divesecs,lo
-	output_99x						; displays only last two figures from a 8Bit value with leading zero (00-99) 
-	bcf	 leftbind
-	STRCAT_PRINT ""					; Show seconds in small font
-	return
+	bsf		leftbind
+	output_99x						; displays only last two figures from a 8 bit value with leading zero (00-99) 
+	bra		TFT_divemins_exit		; and return...
 
 TFT_divemins2:
 	; Full minutes only
-	call	TFT_standard_color
+	call	TFT_memo_color
 	WIN_MEDIUM	dm_divetime_minsonly_column, dm_divetime_row
 	bcf		leftbind
 	output_16_4
-	STRCAT_PRINT ""					; Show minutes in large font
-	return
+	bra		TFT_divemins_exit		; and return...
+
 
 	global	TFT_divemins_alternative
 TFT_divemins_alternative:
-	bcf		FLAG_TFT_divemins		; Clear flag
-	call	TFT_standard_color
+	bcf		FLAG_TFT_divemins		; clear flag
+	call	TFT_memo_color
 	; Print out the minutes (0-999) in large
 	WIN_LARGE dm_divetime_alt_column, dm_divetime_alt_row
 	movff	divemins+0,lo
 	movff	divemins+1,hi
 	output_16_3						; limit to 999 and display only (0-999)
-	STRCAT_PRINT ""					; Show minutes
+	STRCAT_PRINT ""					; show minutes
 	; Print out the seconds in medium
 	WIN_MEDIUM	dm_divetime_alt_column+.60, dm_divetime_alt_row+.25
 	PUTC	":"
+	movff	divesecs,lo
 	bsf		leftbind
-	movff	divesecs,lo
 	output_99x						; displays only last two figures from a 8Bit value with leading zero (00-99) 
+TFT_divemins_exit:
+	STRCAT_PRINT ""
 	bcf		leftbind
-	STRCAT_PRINT ""					; Show seconds in small font
-	return
+	goto	TFT_standard_color		; and return...
 
 ;=============================================================================
 
 	global	TFT_display_apnoe_surface
 TFT_display_apnoe_surface:
+	btfsc	menuview					; is the options menu shown?
+	bra		TFT_display_apnoe_surface_1	; YES - skip title
 	call	TFT_divemask_color
 	WIN_TINY dm_apnoe_surface_time_text_col, dm_apnoe_surface_time_text_row
 	STRCPY_TEXT_PRINT tApnoeSurface
-
-	call	TFT_standard_color
+TFT_display_apnoe_surface_1:
+	call	TFT_memo_color
 	WIN_MEDIUM dm_apnoe_surface_time_column, dm_apnoe_surface_time_row
 	movff	apnoe_surface_mins,lo
 	output_8
 	PUTC	':'
 	movff	apnoe_surface_secs,lo
 	output_99x
-	STRCAT_PRINT ""
-	return
-
-	global	TFT_apnoe_clear_surface
-TFT_apnoe_clear_surface:
-	; Clear Surface timer....
-	WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159	;top, bottom, left, right
-	return
+	bra		TFT_display_apnoe_exit	; and return...
+
+
+	global	TFT_display_apnoe_last_max
+TFT_display_apnoe_last_max:
+	call	TFT_divemask_color
+	WIN_TINY dm_apnoe_last_max_depth_text_col, dm_apnoe_last_max_depth_text_row
+	STRCPY_TEXT_PRINT tApnoeMax
+	call	TFT_memo_color
+	SAFE_2BYTE_COPY max_pressure, lo
+	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
+	TSTOSS	opt_units					; 0=m, 1=ft
+	bra		TFT_display_apnoe_last_m_metric
+TFT_display_apnoe_last_max_imp:
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
+	WIN_MEDIUM	dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row
+	output_16
+	bra		TFT_max_depth_exit
+TFT_display_apnoe_last_m_metric:
+	WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row
+	bsf		ignore_digit5				; do not display 1cm depth (flag will be cleared by output_16)
+	output_16dp d'3'
+	bra		TFT_max_depth_exit
+
 
 	global	TFT_display_apnoe_descent
-TFT_display_apnoe_descent:			; Descent divetime
+TFT_display_apnoe_descent:			; descent divetime
 	movff	apnoe_mins,lo
 	clrf	hi
 	WIN_MEDIUM	dm_divetime_apnoe_column, dm_divetime_apnoe_row
 	output_16_3						; displays only last three figures from a 16Bit value (0-999)
-	call	TFT_standard_color
-	STRCAT_PRINT ""					; Show minutes in large font
-	WIN_SMALL	dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row	; left position for two sec figures
+	call	TFT_memo_color
+	STRCAT_PRINT ""					; show minutes in large font
+	WIN_SMALL	dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row ; left position for two sec figures
 	PUTC	':'
 	bsf		leftbind
 	movff	apnoe_secs,lo
 	output_99x
-	bcf		leftbind
-	STRCAT_PRINT ""					; Show seconds in small font
-
+	STRCAT_PRINT ""					; show seconds in small font
 	call	TFT_divemask_color
 	WIN_TINY dm_total_apnoe_text_column,dm_total_apnoe_text_row
 	STRCPY_TEXT_PRINT tApnoeTotal
-	call	TFT_standard_color
+	call	TFT_memo_color
 	movff	divemins,lo
 	clrf	hi
 	WIN_MEDIUM dm_apnoe_total_divetime_column, dm_apnoe_total_divetime_row
+	bcf		leftbind
 	output_16_3						; displays only last three figures from a 16Bit value (0-999)
-	call	TFT_standard_color
-	STRCAT_PRINT ""					; Show minutes in large font
-	WIN_SMALL	dm_apnoe_total_divetime_secs_col, dm_apnoe_total_divetime_secs_row	; left position for two sec figures
+	call	TFT_memo_color
+	STRCAT_PRINT ""					; show minutes in large font
+	WIN_SMALL	dm_apnoe_total_divetime_secs_col, dm_apnoe_total_divetime_secs_row ; left position for two sec figures
 	PUTC	':'
 	bsf		leftbind
 	movff	divesecs,lo
 	output_99x
+TFT_display_apnoe_exit:
+	STRCAT_PRINT ""
 	bcf		leftbind
-	STRCAT_PRINT ""					; Show seconds in small font
+	goto	TFT_standard_color		; and return...
+
+
+	global	TFT_apnoe_clear_surface
+TFT_apnoe_clear_surface:
+	; clear surface timer (TODO: partly wipes out options menu, too)
+	WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ; top, bottom, left, right
 	return
 
-;=============================================================================
-; Writes ostc #Serial and Firmware version in splash screen
-
-	global	TFT_serial
-TFT_serial:
-	WIN_TINY	.5,.225
-	STRCPY	"OSTC"					; Won't translate that...
-
-	movlw	0x0A
-	cpfseq	hardware_flag
-	bra		TFT_serial2
-	STRCAT	"3 #"
-	bra		TFT_serial_common
-TFT_serial2:
-	movlw	0x05
-	cpfseq	hardware_flag
-	bra		TFT_serial3
-	STRCAT	" cR #"
-	bra		TFT_serial_common
-TFT_serial3:
-	movlw	0x11
-	cpfseq	hardware_flag
-	bra		TFT_serial4
-	STRCAT	"2 #"
-	bra		TFT_serial_common
-TFT_serial4:
-	movlw	0x1A
-	cpfseq	hardware_flag
-	bra		TFT_serial5
-	STRCAT	"3 #"
-;	bra		TFT_serial_common
-TFT_serial5:
-TFT_serial_common:
-	rcall	TFT_cat_serial
-	STRCAT	" v"
-	WIN_COLOR color_greenish
-	rcall	TFT_cat_firmware
-
-	ifdef __DEBUG
-		movlw	color_grey				; Write header in blue when
-		call	TFT_set_color			; compiled in DEBUG mode...
-		STRCAT_PRINT "DEBUG"
-		call	TFT_standard_color
-		bcf		win_invert
-		return
-	else
-		movlw	softwareversion_beta	; =1: Beta, =0: Release, >= 2: Service Pack
-		tstfsz	WREG					; release?
-		bra		TFT_serial_6			; NO
-		bra		TFT_serial_8			; YES
-TFT_serial_6:
-		decfsz	WREG,F					; Beta?
-		bra		TFT_serial_7			; NO
-		STRCAT_PRINT ""					; YES
-		call	TFT_warnings_color		;
-		WIN_LEFT .160-4*9/2				; Right pad
-		STRCPY_TEXT tBeta
-		bra		TFT_serial_8
-TFT_serial_7:
-		STRCAT	" SP"
-		movlw	softwareversion_beta	; STRCAT destroyed WREG
-		decf	WREG,W
-		movwf	lo
-		bsf		leftbind
-		output_8
-		bcf		leftbind
-TFT_serial_8:
-		STRCAT_PRINT ""
-		call	TFT_standard_color
-		bcf		win_invert
-		return
-	endif
-
 
 ;=============================================================================
-; For the Information menu: append firmware x.yy version.
-
-	global	info_menu_firmware
-	extern	tFirmware
-info_menu_firmware:
-	lfsr	FSR1,tFirmware
-	call	strcat_text
-	rcall	TFT_cat_firmware
-	; Show language version
-	IFNDEF		french_italian
-	STRCAT	"_en+de"
-	ELSE
-	STRCAT	"_fr+it"
-	ENDIF
-	bcf		win_invert				; Reset invert flag
-	return
+; append firmware version to current string, including color-coding
 
 	global	TFT_cat_firmware
 TFT_cat_firmware:
@@ -3126,39 +3079,134 @@
 	PUTC	'.'
 	movlw	softwareversion_y
 	movwf	lo
-	output_99x
+	output_8
 	bcf		leftbind
-	; Check firmware date
-	movlw	firmware_expire_year-.1
-	cpfsgt	year					; > threshold?
+	rcall	check_expiry
+	btfss	aux_flag
 	return
-	movlw	firmware_expire_month-.1
-	cpfsgt	month					; > threshold?
+	bsf		win_invert
+	goto	TFT_attention_color
+
+;=============================================================================
+; check if firmware is within expiry period, will return aux_flag set if not
+
+check_expiry:						; check if it is time for a firmware update
+	bsf		aux_flag				; set firmware as expired by default
+	movlw	firmware_expire_year	; start with checking year
+	cpfsgt	year					; current year > expiry year ?
+	bra		check_expiry_Y			; NO  - continue checks
+	return							; YES - expired
+check_expiry_Y:
+	cpfseq	year					; current year = expiry year ?
+	bra		check_expiry_ok			; NO  - must be < then, OK whatever month & day
+	movlw	firmware_expire_month	; YES - continue checking month
+	cpfsgt	month					; current month > expiry month ?
+	bra		check_expiry_M			; NO  - continue checks
+	return							; YES - expired
+check_expiry_M:
+	cpfseq	month					; current month = expiry month ?
+	bra		check_expiry_ok			; NO  - must be < then, OK whatever day
+	movlw	firmware_expire_day		; YES - continue checking day
+	cpfsgt	day						; current day > expiry day ?
+	bra		check_expiry_ok			; NO  - must be <= then, OK
+	return							; YES - expired
+check_expiry_ok:
+	bcf		aux_flag
 	return
-	movlw	firmware_expire_day-.1
-	cpfsgt	day					 ; > threshold?
+
+;=============================================================================
+; append firmware BETA status to current string, including color-coding
+
+	global	TFT_cat_beta_rel
+	global	TFT_cat_beta_release
+TFT_cat_beta_release:				; entry point for printing "Release" / "Beta #"
+	bsf		aux_flag
+	bra		TFT_cat_beta_common
+TFT_cat_beta_rel:					; entry point for printing "Rel." / "B. #"
+	bcf		aux_flag
+TFT_cat_beta_common:
+ IFDEF __DEBUG
+	STRCAT	"DEBUG"
+	goto	TFT_warnings_color
+ ELSE
+	movlw	softwareversion_beta	; =0: release, =1: beta 1, =2: beta 2, ...
+	movwf	lo						; copy to lo
+	tstfsz	lo						; release version?
+	bra		TFT_cat_beta_1			; NO  - must be beta version then
+	btfss	aux_flag				; YES - shall show long version?
+	bra		TFT_cat_beta_2			;       NO  - show short version
+	rcall	check_expiry			;       YES - check  expiry date
+	btfsc	aux_flag				;           - within expiry date?
+	bra		TFT_cat_beta_4			;             NO  - give update cue
+	STRCAT "Release"				;             YES - print "Release"
+	return							;                 - done
+TFT_cat_beta_1:
+	btfss	aux_flag				; shall show long  version?
+	bra		TFT_cat_beta_3			; NO  - show short version
+	STRCAT	"Beta "					; YES - show long  version
+TFT_cat_beta_1a:
+	bsf		leftbind
+	output_8						; print beta version number
+	bcf		leftbind
+	goto	TFT_attention_color		; and return
+TFT_cat_beta_2
+	STRCAT "Rel."					; short version for "Release"
 	return
-
-	; Show in "change firmware" style
-	movlw	color_yellow
-	bcf		win_invert
-	goto	TFT_set_color	; and return...
+TFT_cat_beta_3
+	STRCAT "B."						; short version for "Beta"
+	bra		TFT_cat_beta_1a			; append beta version number
+TFT_cat_beta_4
+	STRCAT "update!"				; print update cue
+	goto	TFT_attention_color		; and return
+ ENDIF
+
+;=============================================================================
+; For the Information menu: firmware version
+
+	global	info_menu_firmware
+info_menu_firmware:
+	lfsr	FSR1,tFirmware
+	call	strcat_text
+	rcall	TFT_cat_firmware
+	PUTC	" "
+	rcall	TFT_cat_beta_rel
+	STRCAT_PRINT ""						; print buffer to screen
+	return
+
+;=============================================================================
+; For the Information menu: firmware version of the RX processor
+
+ IFDEF _rx_functions
+	global	info_menu_firmware_rx
+info_menu_firmware_rx:
+	lfsr	FSR1,tFirmware_rx
+	call	strcat_text
+;	bra		TFT_cat_firmware_rx ;(and return)
+;TFT_cat_firmware_rx:
+	movff	rx_firmware+0,lo
+	bsf		leftbind
+	output_8
+	PUTC	'.'
+	movff	rx_firmware+1,lo
+	output_8
+	bcf		leftbind
+	return
+ ENDIF
 
 ;-----------------------------------------------------------------------------
-; For the Information menu: append serial number 
+; For the Information menu: append serial number
 
 	global	info_menu_serial
-	extern	tSerial
 info_menu_serial:
 	lfsr	FSR1,tSerial
 	call	strcat_text
 	global	TFT_cat_serial
 TFT_cat_serial:
 	clrf	EEADRH
-	clrf	EEADR					; Get Serial number LOW
+	clrf	EEADR					; get serial number LOW
 	call	read_eeprom				; read byte
 	movff	EEDATA,lo
-	incf	EEADR,F					; Get Serial number HIGH
+	incf	EEADR,F					; get serial number HIGH
 	call	read_eeprom				; read byte
 	movff	EEDATA,hi
 
@@ -3168,10 +3216,9 @@
 	return
 
 ;-----------------------------------------------------------------------------
-; For the Information menu: Append total dives
+; For the Information menu: append total dives
 
 	global	info_menu_total_dives
-	extern	tTotalDives
 info_menu_total_dives:
 	lfsr	FSR1,tTotalDives
 	call	strcat_text
@@ -3185,9 +3232,8 @@
 	bcf		leftbind
 	return
 
-; For the Information menu: Append battery voltage
+; For the Information menu: append battery voltage
 	global	info_menu_battery_volts
-	extern	tBatteryV
 info_menu_battery_volts:
 	lfsr	FSR1,tBatteryV
 	call	strcat_text
@@ -3196,15 +3242,14 @@
 	bsf		leftbind
 	output_16dp .2				; x.xxx
 	STRCAT	"V(T"
-	movff	battery_type,lo		; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah
+	movff	battery_type,lo		; =0:1.5V, =1:3.6V Saft, =2:LiIon 3.7V/0.8Ah, =3:LiIon 3.7V/3.1Ah, =4: LiIon 3.7V/2.3Ah
 	output_8
 	bcf		leftbind
 	PUTC	")"
 	return
 
-	; For the Information menu: Append Uptime
+	; For the Information menu: append uptime
 	global	info_menu_uptime
-	extern	tUptime
 info_menu_uptime:
 	lfsr	FSR1,tUptime
 	call	strcat_text
@@ -3215,7 +3260,7 @@
 	movlw	LOW		.3600
 	movwf	xB+0
 	movlw	HIGH	.3600
-	movwf	xB+1			; One day = 3600s
+	movwf	xB+1			; one day = 3600s
 	call	div32x16		; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
 	;xC+0:xC+1 -> Full hours
 	movff	xC+1,xA+1
@@ -3223,49 +3268,39 @@
 	clrf	xB+1
 	movlw	.24
 	movwf	xB+0
-	call	div16x16		; xA/xB=xC with xA+0 as remainder
+	call	div16x16		; xC = xA / xB with xA as remainder
 	movff	xC+0,lo
-	movff	xC+1,hi			; Full days
+	movff	xC+1,hi			; full days
 	bsf		leftbind
 	output_16
 	PUTC	"d"
-	movff	xA+0,lo			; Full hours
+	movff	xA+0,lo			; full hours
 	output_8
 	PUTC	"h"
 	bcf		leftbind
-	return					; Done.
-	
-	extern	tCalX,tCalY,tCalZ
+	return					; done
+
+
 	global	menu_cal_x
 menu_cal_x:
+	lfsr	FSR0,compass_CX_f
 	lfsr	FSR1,tCalX
-	call	strcat_text
-	movff	compass_CX_f+0,lo
-	movff	compass_CX_f+1,hi
-	call	TFT_convert_signed_16bit	; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
-	bsf		leftbind
-	output_16
-	bcf		leftbind
-	return
+	bra		menu_cal_common
 
 	global	menu_cal_y
 menu_cal_y:
+	lfsr	FSR0,compass_CY_f
 	lfsr	FSR1,tCalY
-	call	strcat_text
-	movff	compass_CY_f+0,lo
-	movff	compass_CY_f+1,hi
-	call	TFT_convert_signed_16bit	; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
-	bsf		leftbind
-	output_16
-	bcf		leftbind
-	return
-	
+	bra		menu_cal_common
+
 	global	menu_cal_z
 menu_cal_z:
+	lfsr	FSR0,compass_CZ_f
 	lfsr	FSR1,tCalZ
+menu_cal_common:
 	call	strcat_text
-	movff	compass_CZ_f+0,lo
-	movff	compass_CZ_f+1,hi
+	movff	POSTINC0,lo
+	movff	POSTINC0,hi
 	call	TFT_convert_signed_16bit	; converts lo:hi into signed-short and adds '-' to POSTINC2 if required
 	bsf		leftbind
 	output_16
@@ -3277,7 +3312,6 @@
 ; ppO2 menu
 
 	global	divesets_ppo2_min
-	extern	tPPO2MIN
 divesets_ppo2_min:
 	lfsr	FSR1,tPPO2MIN
 	call	strcat_text
@@ -3286,7 +3320,6 @@
 	bra		divesets_ppo2_common
 
 	global	divesets_ppo2_min_cc
-	extern	tPPO2MINCC
 divesets_ppo2_min_cc:
 	lfsr	FSR1,tPPO2MINCC
 	call	strcat_text
@@ -3295,8 +3328,6 @@
 	bra		divesets_ppo2_common
 
 	global	divesets_ppo2_max
-	extern	tPPO2Max
-	extern	tbar
 divesets_ppo2_max:
 	lfsr	FSR1,tPPO2Max
 	call	strcat_text
@@ -3305,7 +3336,6 @@
 	bra		divesets_ppo2_common
 
 	global	divesets_ppo2_max_deco
-	extern	tPPO2DECO
 divesets_ppo2_max_deco:
 	lfsr	FSR1,tPPO2DECO
 	call	strcat_text
@@ -3314,30 +3344,30 @@
 	;bra	divesets_ppo2_common
 
 divesets_ppo2_common:
-	movwf	up						; Save default value
+	movwf	up						; save default value
 	clrf	hi
 	bsf		leftbind
 	output_16dp d'3'
 	bcf		leftbind
 	lfsr	FSR1,tbar
 	call	strcat_text
-	movf	up,W					; Default value
-	cpfseq	lo						; Current value
-	bra		divesets_ppo2_common2	; Not default, add *
-	return							; Default, Done.
+	movf	up,W					; default value
+	cpfseq	lo						; current value
+	bra		divesets_ppo2_common2	; not default, add *
+	return							; default, done
 divesets_ppo2_common2:
 	PUTC	"*"
-	return							; Done.
+	return							; done
 
 ;=============================================================================
 
 	global	TFT_clear_warning_text
 TFT_clear_warning_text:
 	btfss	divemode							; in divemode?
-	bra		TFT_clear_warning_text2				; No, setup for surface mode
-	bcf		FLAG_TFT_dive_warning_text_clear	; Clear flag
+	bra		TFT_clear_warning_text2				; NO - setup for surface mode
+	bcf		FLAG_TFT_dive_warning_text_clear	; clear flag
 	btfsc	alternative_divelayout
-	bra		TFT_clear_warning_text_2nd_row		; In Alt mode, clear only row 2
+	bra		TFT_clear_warning_text_2nd_row		; in alt. mode, clear only row 2
 	WIN_BOX_BLACK dm_warning_row, dm_warning_bot, dm_warning_column, dm_warning_rgt		; top, bottom, left, right
 	return
 TFT_clear_warning_text2:
@@ -3347,8 +3377,8 @@
 	global	TFT_clear_warning_text_2nd_row
 TFT_clear_warning_text_2nd_row:
 	btfss	divemode							; in divemode?
-	bra		TFT_clear_warning_text_2nd_2		; No, setup for surface mode
-	bcf		FLAG_TFT_dive_warning_text_clr2		; Clear flag
+	bra		TFT_clear_warning_text_2nd_2		; NO - setup for surface mode
+	bcf		FLAG_TFT_dive_warning_text_clr2		; clear flag
 	WIN_BOX_BLACK dm_warning2_row, dm_warning2_bot, dm_warning2_column, dm_warning2_rgt	; top, bottom, left, right
 	return
 TFT_clear_warning_text_2nd_2:
@@ -3356,55 +3386,56 @@
 	return
 
 	global	TFT_fillup_with_spaces
-TFT_fillup_with_spaces:					; Fillup FSR2 with spaces (Total string length in #WREG)
+TFT_fillup_with_spaces:					; fill up FSR2 with spaces (total string length in #WREG)
 	movwf	lo							; save max. string length into lo
-	movf	FSR2L,W						; Get current string length
+	movf	FSR2L,W						; get current string length
 	subwf	lo,F						; lo-WREG
 	btfsc	STATUS,N					; longer then #lo already?
-	return								; Yes, done.
-	tstfsz	lo							; Zero?
-	bra		TFT_fillup_with_spaces2		; No.
-	return								; Yes, done.
+	return								; YES - done
+	tstfsz	lo							; zero?
+	bra		TFT_fillup_with_spaces2		; NO
+	return								; YES - done
 TFT_fillup_with_spaces2:
-	PUTC	" "							; Add one space
-	decfsz	lo,F						; All done?
-	bra		TFT_fillup_with_spaces2		; No, loop
-	return								; Done.
+	PUTC	" "							; add one space
+	decfsz	lo,F						; all done?
+	bra		TFT_fillup_with_spaces2		; NO  - loop
+	return								; YES - done
 
 ;=============================================================================
 
 	global	TFT_desaturation_time
 TFT_desaturation_time:
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_memo_color
 	STRCPY	"Desat:"
 	movff	int_O_desaturation_time+0,lo
 	movff	int_O_desaturation_time+1,hi
-	call	convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
-	bsf		leftbind
+	call	convert_time				; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
+;	bsf		leftbind
 	movf	lo,W
 	movff	hi,lo
 	movwf	hi							; exchange lo and hi...
-	output_8							; Hours
+	output_99x							; hours
 	PUTC	':'
-	movff	hi,lo						; Minutes
+	movff	hi,lo						; minutes
 	output_99x
-	bcf		leftbind
-	movlw	surf_warning_length			; Only use surface string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
-	movlw	.0							; TODO - needed?
-	movff	WREG,buffer+11				; TODO - needed?
+;	bcf		leftbind
+	movlw	surf_warning_length			; only use surface string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+;	movlw	.0							; not needed
+;	movff	WREG,buffer+11				; not needed
 	STRCAT_PRINT ""
-	bcf		win_invert
 	return
 
 
 	global	TFT_nofly_time
 TFT_nofly_time:
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_memo_color
 	movff	char_I_altitude_wait,WREG
 	tstfsz	WREG
 	bra		TFT_nofly_time_1
@@ -3415,93 +3446,197 @@
 TFT_nofly_time_2:
 	movff	int_O_nofly_time+0,lo
 	movff	int_O_nofly_time+1,hi
-	call	convert_time				; converts hi:lo in minutes to hours (hi) and minutes (lo)
-	bsf		leftbind
+	call	convert_time				; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
+;	bsf		leftbind
 	movf	lo,W
 	movff	hi,lo
 	movwf	hi							; exchange lo and hi...
-	output_8							; Hours
+	output_99x							; hours
 	PUTC	':'
-	movff	hi,lo						; Minutes
+	movff	hi,lo						; minutes
 	output_99x
-	bcf		leftbind
-	movlw	surf_warning_length			; Only use surface string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
-	movlw	.0							; TODO - needed?
-	movff	WREG,buffer+11				; TODO - needed?
+;	bcf		leftbind
+	movlw	surf_warning_length			; only use surface string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+;	movlw	.0							; not needed
+;	movff	WREG,buffer+11				; not needed
 	STRCAT_PRINT ""
-	bcf		win_invert
 	return
 
 ;=============================================================================
 
 	global	TFT_warning_agf
 TFT_warning_agf:
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_attention_color
 	STRCPY_TEXT tDiveaGF_active			; "aGF!"
-	movlw	dm_warning_length			; Divemode string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	;bcf	 win_invert
-	;return
-	goto	TFT_standard_color
+	bra		TFT_warn_att_info_exit		; and return...
+
 
 	global	TFT_warning_fallback
-TFT_warning_fallback:					; Show fallback warning
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+TFT_warning_fallback:					; show fallback warning
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_warnings_color
 	STRCPY_TEXT tDiveFallback			; "Fallback!"
-	movlw	dm_warning_length			; Divemode string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""
+	bra		TFT_warn_att_info_exit		; and return...
+
+
+ IFDEF _rx_functions
+
+	global	TFT_advice_switch
+TFT_advice_switch:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_advice_color
+	STRCPY_TEXT tswap					; "Swap Tank"
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""
+	bra		TFT_warn_att_info_exit		; and return...
+
+	global	TFT_attention_transmitter
+TFT_attention_transmitter:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_attention_color
+	STRCPY_TEXT tTransmitter			; "P.Transm."
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
+
+	global	TFT_attention_pres_reading
+	global	TFT_warning_pres_reading
+TFT_attention_pres_reading:				; entry point for attention
+	call	TFT_attention_color			; use attention color
+	bra		TFT_common_pres_reading		; continue with common code
+TFT_warning_pres_reading:				; entry point for warning
+	call	TFT_warnings_color			; use warnings color
+	;bra	TFT_common_pres_reading		; continue with common code
+TFT_common_pres_reading:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO - done
+	STRCPY_TEXT tPressure				; "Tank Pres"
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""
+	bra		TFT_warn_att_info_exit		; and return...
+
+	global	TFT_attention_sac
+TFT_attention_sac:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	movff	int_O_sac_rate+0,lo			; copy SAC rate to hi:lo
+	movff	int_O_sac_rate+1,hi			; ...
+	call	TFT_color_code_tank_pres_sac; color-code the output
+	STRCPY_TEXT tSAC					; "SAC", needs to be exactly 3 chars long
+	STRCAT	": "						; ": "
+	output_16_3							; print as xxx
+	PUTC	" "							; print a dummy char to have string termination at the correct place
+	movff	buffer+.7,buffer+.8			; move decimal digit one position to the right
+	movlw	"."							; load coding of a decimal point
+	movff	WREG,buffer+.7				; place it before decimal digit
+	STRCAT_PRINT ""						; dump buffer to screen
+	bra		TFT_warn_att_info_exit		; and return...
+
+ ENDIF
 
 
 	global	TFT_info_deco
-TFT_info_deco:							; show info when in decompression
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
+TFT_info_deco							; show info when decompression obligation is decreasing
+	rcall	TFT_warning_set_window		; sets the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO  - return
+	call	TFT_advice_color			;       actually it is a memo, but we break the rules here and display in advice color (green)
+	STRCPY_TEXT tDecoInfo				;       write "Deco Zone"
+	movlw	dm_warning_length			;       select divemode string length
+	rcall	TFT_fillup_with_spaces		;       fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""						;       print buffer
+	bra		TFT_warn_att_info_exit		; and return...
+
+
+ IFDEF _cave_mode
+
+	global	TFT_info_cave_mode
+TFT_info_cave_mode:
+	rcall	TFT_warning_set_window		; sets the row and column for the current warning
+	tstfsz	WREG						; is there room for the message?
 	return								; NO  - return
-	movlw	color_green					; YES - select green text color
-	call	TFT_set_color				;       set color
-	STRCPY_TEXT tDecoInfo				;       write "Deco Zone"
-	movlw	dm_warning_length			;       select Divemode string length
-	rcall	TFT_fillup_with_spaces		;       Fillup FSR2 with spaces (Total string length in #WREG)
+	call	TFT_memo_color				; YES - set memo color
+	STRCPY_TEXT tCaveMode				;       write "Cave Mode"
+	movlw	dm_warning_length			;       select divemode string length
+	rcall	TFT_fillup_with_spaces		;       fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""						;       print buffer
-	goto	TFT_standard_color			;       and return...
+	bra		TFT_warn_att_info_exit		; and return...
+
+	global	TFT_info_dive_turned
+TFT_info_dive_turned:
+	rcall	TFT_warning_set_window		; sets the row and column for the current warning
+	tstfsz	WREG						; is there room for the message?
+	return								; NO  - return
+	call	TFT_attention_color			; YES - set attention color
+	STRCPY_TEXT tDiveTurned				;       write "Dv.turned"
+	movlw	dm_warning_length			;       select divemode string length
+	rcall	TFT_fillup_with_spaces		;       fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""						;       print buffer
+	bra		TFT_warn_att_info_exit		; and return...
+
+	global	TFT_warn_cave_shutdown
+TFT_warn_cave_shutdown:
+	rcall	TFT_warning_set_window		; sets the row and column for the current warning
+	tstfsz	WREG						; is there room for the message?
+	return								; NO  - return
+	call	TFT_warnings_color			; YES - set warning color
+	STRCPY_TEXT tCaveModeShutdown		;       write "X-Cave-X"
+	movlw	dm_warning_length			;       select divemode string length
+	rcall	TFT_fillup_with_spaces		;       fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""						;       print buffer
+	bra		TFT_warn_att_info_exit		; and return...
+
+ ENDIF
 
 
 	global	TFT_warning_gf
 TFT_warning_gf:							; GF
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	movff	int_O_gradient_factor+0,lo	; bank-safe copy gradient factor
 	movff	int_O_gradient_factor+1,hi	;
-	call	TFT_color_code_gf			; Color-code Output
+	call	TFT_color_code_gf			; color-code output
 	STRCPY	"GF:  "						; the two spaces are on purpose to align the output with other warnings' outputs
 	bsf		leftbind
 	output_8							; print value of lo only, int_O_gradient_factor is limited to 255
 	PUTC	"%"
-	movlw	dm_warning_length			; Divemode string length
-	btfss	divemode					; In Divemode?
-	movlw	surf_warning_length			; No, use surface string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	btfss	divemode					; in divemode?
+	movlw	surf_warning_length			; NO - use surface string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
 	bcf		leftbind
 	bcf		win_invert
+TFT_warn_att_info_exit:
 	goto	TFT_standard_color			; and return...
 
 
 	global	TFT_warning_mbubbles
 TFT_warning_mbubbles:
 	rcall	TFT_warning_set_window		; sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
+	tstfsz	WREG						; is there room for the message?
 	return								; NO
 	call	TFT_attention_color			; set attention color as default
 	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
@@ -3509,17 +3644,17 @@
 	call	TFT_warnings_color			; YES - reconfigure to warning color
 	STRCPY_TEXT tMicroBubbles
 	movlw	dm_warning_length			; divemode string length
-	btfss	divemode					; in Divemode?
+	btfss	divemode					; in divemode?
 	movlw	surf_warning_length			; NO  - use surface string length
-	rcall	TFT_fillup_with_spaces		; fillup FSR2 with spaces (total string length in #WREG)
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
 
 
 	global	TFT_warning_outside
 TFT_warning_outside:
 	rcall	TFT_warning_set_window		; sets the row and column for the current warning
-	tstfsz	WREG						; is there room for the warning?
+	tstfsz	WREG						; is there room for the message?
 	return								; NO
 	call	TFT_attention_color
 	movff	char_O_deco_warnings,WREG	; bank-safe copy for deco warnings
@@ -3527,105 +3662,135 @@
 	call	TFT_warnings_color			; YES - reconfigure to warning color
 	STRCPY	"X-ZHL16-X"
 	movlw	dm_warning_length			; divemode string length
-	btfss	divemode					; in Divemode?
+	btfss	divemode					; in divemode?
 	movlw	surf_warning_length			; NO  - use surface string length
-	rcall	TFT_fillup_with_spaces		; fillup FSR2 with spaces (total string length in #WREG)
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
 
 
 	global	TFT_warning_gas_needs_warn
 	global	TFT_warning_gas_needs_att
 TFT_warning_gas_needs_warn:
 	rcall	TFT_warning_gas_needs_war_helper
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_warnings_color
 	bra		TFT_warning_gas_needs_com
 TFT_warning_gas_needs_att:
 	rcall	TFT_warning_gas_needs_att_helper
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_attention_color
 TFT_warning_gas_needs_com:
 	STRCPY_TEXT tGasNeedsWarn			; "Gas Needs"
-	movlw	dm_warning_length			; Divemode string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
 
 TFT_warning_gas_needs_war_helper:
-	incf	warning_counter,F			; increase counter
+	incf	message_counter,F			; increase counter
 	btfsc	gas_needs_warning			; is it a new warning?
 	return								; NO  - do not show the gas needs custom view again
-	bsf		gas_needs_warning			; YES - memorise it's an old now
+	bsf		gas_needs_warning			; YES - memorize it's an old now
 	bra		TFT_warning_gas_needs_helper_com
 TFT_warning_gas_needs_att_helper:
-	incf	warning_counter,F			; increase counter
+	incf	message_counter,F			; increase counter
 	btfsc	gas_needs_attention			; is it a new attention?
 	return								; NO  - do not show the gas needs custom view again
-	bsf		gas_needs_attention			; YES - memorise it's an old now
+	bsf		gas_needs_attention			; YES - memorize it's an old now
 TFT_warning_gas_needs_helper_com:
-	movlw	.12							; customview number one below gas needs view
-	movwf	menupos3					; set fake current view number
-	bsf		toggle_customview			; initiate toggle of customview -> gas needs view will be shown
+	btfsc	alternative_divelayout		; in alternative layout?
+	call	switch_layout_to_normal		; YES - switch to normal layout
+	movlw	index_gas_needs_ascent-1	; custom view number one below gas needs view
+	movwf	menupos3					; set custom view number
+	bsf		toggle_customview			; initiate toggle to desired custom view -> gas needs view will be shown
 	return
 
 
 	global	TFT_warning_IBCD
 TFT_warning_IBCD:
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_attention_color			; select attention color as default
 	STRCPY_TEXT tIBCD					; "IBCD N2He"
-	movlw	dm_warning_length			; Divemode string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
+
+
+	global	TFT_warning_no_BO_gas
+TFT_warning_no_BO_gas:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_attention_color			; select attention color as default
+	STRCPY_TEXT tnoBOgas				; "B/O Gas X"
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""
+	bra		TFT_warn_att_info_exit		; and return...
+
+
+	global	TFT_advice_gas_change
+TFT_advice_gas_change:
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_advice_color			; set advice color
+	STRCPY_TEXT tgaschange				; "Change?"
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
+	STRCAT_PRINT ""
+	bra		TFT_warn_att_info_exit		; and return...
 
 
 	global	TFT_warning_sensor_disagree
-TFT_warning_sensor_disagree:			; Show sensor disagree warning
+TFT_warning_sensor_disagree:			; show sensor disagree warning
 	rcall	TFT_warning_sensor_dis_helper
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_warnings_color
 	STRCPY_TEXT tSensorDisagree			; "Sensors<>"
-	movlw	dm_warning_length			; Divemode string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+	bra		TFT_warn_att_info_exit		; and return...
 
 TFT_warning_sensor_dis_helper:
 	btfsc	sensor_warning				; is it a new warning?
 	return								; NO  - do not show the gas needs custom view again
-	bsf		sensor_warning				; YES - memories it's an old warning now
-	clrf	menupos3					; set fake current view number
-	bsf		toggle_customview			; initiate toggle of customview -> sensor view will be shown
+	bsf		sensor_warning				; YES - memorize it's an old warning now
+	btfsc	alternative_divelayout		; in alternative layout?
+	call	switch_layout_to_normal		; YES - switch to normal layout
+	movlw	index_ppo2_sensors-1		; custom view number one below ppO2 sensors
+	movwf	menupos3					; set custom view number
+	bsf		toggle_customview			; initiate toggle to desired custom view -> ppO2 sensors
 	return
 
 ;=============================================================================
 
-TFT_warning_set_window:					; Sets the row and column for the current warning
+TFT_warning_set_window:					; set the row and column for the current message
 	; ignore warning (now)?
-	decf	warning_counter,W			; -1
+	decf	message_counter,W			; -1
 	bcf		STATUS,C
-	btfss	alternative_divelayout		; In alt mode, do not divide...
-	rrcf	WREG,W						; (warning_counter-1)/2
-	cpfseq	warning_page
+	btfss	alternative_divelayout		; in alternative layout, do not divide...
+	rrcf	WREG,W						; (message_counter-1)/2
+	cpfseq	message_page
 	retlw	.255						; WREG <> 0 -> Warning window not defined
-	call	TFT_standard_color
 	btfss	divemode					; in divemode?
-	bra		TFT_warning_set_window3		; No, setup for surface mode
+	bra		TFT_warning_set_window3		; NO - setup for surface mode
 	btfss	alternative_divelayout
 	bra		TFT_warning_set_window3a	; standard layout
 	bra		TFT_warning_set_window2a	; alternative layout (Only lower row used)
-TFT_warning_set_window3a:	
-	btfss	warning_counter,0			; Toggle with each warning
+TFT_warning_set_window3a:
+	btfss	message_counter,0			; toggle with each warning
 	bra		TFT_warning_set_window2
 	WIN_SMALL dm_warning1_column, dm_warning1_row
 	bcf		second_row_warning			; =1: The second row contains a warning
@@ -3636,7 +3801,7 @@
 	WIN_SMALL dm_warning2_column, dm_warning2_row
 	retlw	.0							; WREG=0 -> Warning window defined
 TFT_warning_set_window3:
-	btfss	warning_counter,0			; Toggle with each warning
+	btfss	message_counter,0			; toggle with each warning
 	bra		TFT_warning_set_window4
 	WIN_SMALL surf_warning1_column,surf_warning1_row
 	bcf		second_row_warning			; =1: The second row contains a warning
@@ -3649,40 +3814,39 @@
 
 	global	TFT_update_batt_percent_divemode
 TFT_update_batt_percent_divemode:
-	rcall	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
-	movff	batt_percent,lo				; Get battery percent
-	call	TFT_color_code_battery		; Color-code battery percent
+	rcall	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	movff	batt_percent,lo				; get battery percent
+	call	TFT_color_code_battery		; color-code battery percent
 	STRCPY	"Batt:"
 	bsf		leftbind
 	output_8
 	bcf		leftbind
 	PUTC	"%"
-	movlw	dm_warning_length			; Divemode string length
-	btfss	divemode					; In Divemode?
-	movlw	surf_warning_length			; No, use surface string length
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	btfss	divemode					; in divemode?
+	movlw	surf_warning_length			; NO - use surface string length
+	rcall	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
 	bcf		win_invert
-	goto	TFT_standard_color			; and return...
-
-
-	global	TFT_gf_mask					; Setup Mask
-TFT_gf_mask:
-	; The mask
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_gf_factors_mask			; mask for GF factors
+TFT_gf_factors_mask:
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row
+	WIN_TINY dm_custom_gf_column1+.4, dm_custom_gf_title_row
 	STRCPY_TEXT_PRINT tGFactors
-	WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row
+	WIN_TINY dm_custom_gf_column2+.2, dm_custom_gf_title_row
 	STRCPY_TEXT_PRINT taGFactors
-	WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row
+	WIN_TINY dm_custom_gf_column3-.3, dm_custom_gf_title_row
 	STRCPY_TEXT_PRINT tGFInfo
 	; Show GF (Static)
 	call	TFT_disabled_color
 	btfss	use_agf
-	call	TFT_standard_color
-	WIN_STD	dm_custom_gf_column, dm_custom_gf_row
+	call	TFT_memo_color
+	WIN_STD	dm_custom_gf_column1, dm_custom_gf_row
 	bsf		leftbind
 	movff	opt_GF_low,lo
 	output_8
@@ -3691,183 +3855,254 @@
 	output_8
 	STRCAT_PRINT ""
 	; Show aGF (Static)
-	call	TFT_standard_color
+	call	TFT_memo_color
 	TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater
-	bra	 TFT_gf_mask2					; Show "---" instead
+	bra		TFT_gf_mask2				; show "---" instead
 	btfss	use_agf
 	call	TFT_disabled_color
-	WIN_STD	dm_custom_agf_column, dm_custom_agf_row
+	WIN_STD	dm_custom_gf_column2, dm_custom_gf_row
 	movff	opt_aGF_low,lo
 	output_8
 	PUTC	"/"
 	movff	opt_aGF_high,lo
 	output_8
 	STRCAT_PRINT ""
-	bcf		leftbind
-	goto	TFT_standard_color			; and return...
-
+	bra		TFT_custview_exit1			; and return...
 TFT_gf_mask2:
-	WIN_STD	dm_custom_agf_column+.10, dm_custom_agf_row
+	WIN_STD	dm_custom_gf_column2+.10, dm_custom_gf_row
 	STRCPY_PRINT "---"
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_ceiling_GF_tissue_mask	; mask for ceiling, current GF and tissues
+TFT_ceiling_GF_tissue_mask:
+	call	TFT_divemask_color
+	WIN_TINY dm_custom_ceiling_column+.2,dm_custom_ceiling_title_row
+	STRCPY_TEXT_PRINT tCeiling
+	WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row
+	STRCPY_TEXT_PRINT tDiveTissues
+; collides with ceiling output and not really needed, too
+;	WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row
+;	STRCPY_TEXT_PRINT tN2
+;	WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row
+;	STRCPY_TEXT_PRINT tHe
+	TSTOSS	char_I_deco_model			; in GF mode (0 = ZH-L16, 1 = ZH-L16-GF)?
+	bra		TFT_custview_exit1			; NO - no GF info in none-GF mode
+	WIN_TINY dm_custom_gf_column1, dm_custom_gf_title_row
+	STRCPY_TEXT_PRINT tGFInfo
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_ceiling_GF_tissue		; data for ceiling, current GF and tissues
+TFT_ceiling_GF_tissue:
+	WIN_MEDIUM dm_custom_ceiling_column,dm_custom_ceiling_row
+	movff	int_O_ceiling+0,lo
+	movff	int_O_ceiling+1,hi
+	call	TFT_color_code_ceiling		; color-code the output
+	call	adjust_depth_with_salinity	; computes salinity setting into lo:hi [mbar]
+	bsf		leftbind
+	TSTOSS	opt_units					; 0=m, 1=ft
+	bra		TFT_ceiling_tissue_cGF_m
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
+	output_16							; yxz
+	bra		TFT_ceiling_tissue_cGF0
+TFT_ceiling_tissue_cGF_m:
+	bsf		ignore_digit5				; no cm (flag will be cleared by output_16)
+	output_16dp .3						; yxz.a
+TFT_ceiling_tissue_cGF0:
 	bcf		leftbind
-	return
-
-
-	global	TFT_gf_mask_cGF				; Setup Mask
-TFT_gf_mask_cGF:
-	; The mask
-	call	TFT_divemask_color
-	WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row
-	STRCPY_TEXT_PRINT tGFInfo
-	goto	TFT_standard_color			; and return...
-
-	global	TFT_gf_info					; Show GF informations
-TFT_gf_info:
-	WIN_STD	dm_custom_currentgf_column, dm_custom_currentgf_row
+	STRCAT_PRINT " "
+	; Show tissue diagram
+	call	DISP_tissue_saturation_graph; show char_O_tissue_N2_saturation and char_O_tissue_He_saturation
+	; Show current GF
+	TSTOSS	char_I_deco_model			; 0 = ZH-L16, 1 = ZH-L16-GF
+	bra		TFT_custview_exit1			; no GF info for none-GF mode
+	WIN_MEDIUM dm_custom_clock_column+.3, dm_custom_gf_row
+	movff	int_O_gradient_factor+0,lo	; gradient factor absolute, 100% = on M-line of straight Buhlmann
+	movff	int_O_gradient_factor+1,hi	; hi byte holds flags
+	call	TFT_color_code_gf			; color-code output
+	output_8							; need to print lo only, int_O_gradient_factor value is limited to 255
+	STRCAT_PRINT ""
+	WIN_STD	dm_custom_clock_column+.40, dm_custom_gf_row+.5
+	STRCAT_PRINT "%"					; % is printed in color set by TFT_color_code_gf, too
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_gf_factors				; data for GF factors
+TFT_gf_factors:
+	WIN_STD	dm_custom_gf_column3, dm_custom_gf_row
 	movff	int_O_gradient_factor+0,lo	; gradient factor absolute (Non-GF model)
 	movff	int_O_gradient_factor+1,hi
-	call	TFT_color_code_gf			; Color-code Output
+	call	TFT_color_code_gf			; color-code output
 	output_8							; print lo only, int_O_gradient_factor is limited to 255
 	STRCAT_PRINT "%"
-	return
-
-
-	global	TFT_battinfo_tissues_clock_mask		; Setup Mask
-TFT_battinfo_tissues_clock_mask:
-	; The mask
-	; Put three columns at HUD positions
+TFT_custview_exit1:
+	bcf		leftbind
+	goto	TFT_standard_color			; and return...
+
+
+	global	TFT_clock_batt_surfpress_mask ; mask for clock, battery and surface pressure
+TFT_clock_batt_surfpress_mask:
 	call	TFT_divemask_color
-	btfsc	FLAG_apnoe_mode						; In Apnoe mode?
-	bra		TFT_battinfo_tissues_clock_mask2	; Yes
-	btfsc	FLAG_gauge_mode						; In Gauge mode?
-	bra		TFT_battinfo_tissues_clock_mask2	; Yes
-	WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row
-	STRCPY_TEXT_PRINT tDiveTissues
-TFT_battinfo_tissues_clock_mask2:				; Show only clock
-	WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row
-	STRCPY_TEXT_PRINT tBatteryV					; "Battery: "
 	WIN_TINY dm_custom_clock_column, dm_custom_clock_title_row
-	STRCPY_TEXT_PRINT tDiveClock
-	goto	TFT_standard_color					; and return...
-
-	global	TFT_battinfo_tissues_clock	; Show EAD/END, Tissues and clock
-TFT_battinfo_tissues_clock:
-	; Update clock and date
+	STRCPY_TEXT_PRINT tTime				; "Time"
+	WIN_TINY dm_custom_battery_column, dm_custom_battery_title_row
+	STRCPY_TEXT_PRINT tBattery			; "Battery"
+	WIN_TINY dm_custom_surfpres_column+.8, dm_custom_surfpres_title_row
+	STRCPY_TEXT_PRINT tSurface			; "Surface"
+	; Show Surface Pressure (done in mask, because it's static during the dive)
+	call	TFT_standard_color
+	WIN_SMALL dm_custom_surfpres_column, dm_custom_surfpres_row
+	movff	last_surfpressure_30min+0,lo
+	movff	last_surfpressure_30min+1,hi
+	output_16
+	PUTC	' '
+	STRCAT_TEXT_PRINT tMBAR				; mbar (hPa)
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_clock_batt_surfpress	; data for clock, battery and surface pressure
+TFT_clock_batt_surfpress:
+	; Update Clock
 	WIN_SMALL dm_custom_clock_column, dm_custom_clock_row
-	call	TFT_clock2					; print clock
-
-	; Show Battery info
-	WIN_SMALL	dm_custom_ead_column, dm_custom_ead_row
-	movff	batt_percent,lo				; Get battery percent
-	call	TFT_color_code_battery		; Color-code battery percent
-	bsf		leftbind
+	call	TFT_standard_color
+	movff	hours,lo
+	output_99
+	PUTC	':'
+	movff	mins,lo
+	output_99x
+	PUTC	":"
+	movff	secs,lo
+	output_99x
+	STRCAT_PRINT ""
+	; Show Battery Info
+	WIN_SMALL dm_custom_battery_column, dm_custom_battery_percent_row
+	movff	batt_percent,lo				; get battery percent
+	call	TFT_color_code_battery		; color-code battery percent
+;	bsf		leftbind
 	output_8
-	bcf		leftbind
+;	bcf		leftbind
 	STRCAT	"% "
 	movlw	0x00
-	movff	WREG,buffer+4				; Only "xxx%"
+	movff	WREG,buffer+4				; only "xxx%"
 	STRCAT_PRINT ""
 	bcf		win_invert
-	call	TFT_standard_color
-	WIN_SMALL dm_custom_end_column, dm_custom_end_row
+	call	TFT_memo_color
+	WIN_SMALL dm_custom_battery_column, dm_custom_battery_volt_row
 	movff	batt_voltage+0,lo
 	movff	batt_voltage+1,hi
 	bsf		leftbind
 	output_16dp	.2
-	bcf		leftbind
 	PUTC	'V'
 	movff	buffer+5,buffer+4
 	movlw	0x00
-	movff	WREG,buffer+5				; Only "x.yzV"
+	movff	WREG,buffer+5				; only "x.yzV"
 	STRCAT_PRINT ""
-
-	btfsc	FLAG_apnoe_mode				; In Apnoe mode?
-	return								; Yes, done.
-	btfsc	FLAG_gauge_mode				; In Gauge mode?
-	return								; Yes, done.
-
-	; Show tissue diagram
-	call	TFT_divemask_color
-	WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row
-	STRCPY_TEXT_PRINT tN2
-	WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row
-	STRCPY_TEXT_PRINT tHe
-	bra	DISP_tissue_saturation_graph	; Show char_O_tissue_N2_saturation and char_O_tissue_He_saturation and return...
-
-
-	global	TFT_pscr_info_mask
-TFT_pscr_info_mask:						; Show pSCR-ppO2, drop and lung ratio mask	
+	; Surface pressure is shown in mask because it is static
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_pscr_info_mask			; mask for pSCR info
+TFT_pscr_info_mask:
 	rcall	TFT_mask_ppo2
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row
+	WIN_TINY dm_custom_pscr_drop_column, dm_custom_pscr_title_row
 	STRCPY_TEXT_PRINT tPSCR_O2_drop
-	WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row
+	WIN_TINY dm_custom_pscr_ratio_column, dm_custom_pscr_title_row
 	STRCPY_TEXT_PRINT tPSCR_lungratio
-	goto	TFT_standard_color			; and return...
-
-	global	TFT_pscr_info				; Show pSCR-ppO2, drop and lung ratio
+	bra		TFT_custview_exit1			; and return...
+
+	global	TFT_pscr_info				; data for pSCR info
 TFT_pscr_info:
 	;show ppO2
-	WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row
-	movff	int_O_pSCR_ppO2+0,lo			; copy pSCR ppO2 to hi:lo
+	WIN_MEDIUM dm_custom_ppo2_column,dm_custom_ppo2_row
+	movff	int_O_pSCR_ppO2+0,lo		; copy pSCR ppO2 to hi:lo
 	movff	int_O_pSCR_ppO2+1,hi
-	call	TFT_color_code_ppo2				; color-code output
+	call	TFT_color_code_ppo2			; color-code output
 	bsf		leftbind
-	output_16dp .3							; x.xx bar
+	output_16dp .3						; x.xx bar
 	bcf		leftbind
 	STRCAT_PRINT ""
-	; Show Drop
-	WIN_STD dm_custom_pscr_drop_column,dm_custom_pscr_drop_row
-	call	TFT_standard_color
+	; Show drop
+	WIN_STD dm_custom_pscr_drop_column+.11,dm_custom_pscr_row
+	call	TFT_memo_color
 	movff	char_I_PSCR_drop,lo
 	bsf		leftbind
 	output_8
 	STRCAT_PRINT "%"
 	; Show lung ratio
-	WIN_STD dm_custom_pscr_ratio_column,dm_custom_pscr_ratio_row
+	WIN_STD dm_custom_pscr_ratio_column+.5,dm_custom_pscr_row
 	movff	char_I_PSCR_lungratio,lo
 	bsf		leftbind
 	STRCPY	"1/"
 	output_8
 	STRCAT_PRINT ""
-	bcf		leftbind
-	return
-
-
-	global	TFT_gas_needs_mask
-TFT_gas_needs_mask:
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_gas_needs_ascent_mask	; mask for gas needs ascent
+TFT_gas_needs_ascent_mask:
+	WIN_TINY dm_custom_gas_column_title, dm_custom_gas_mask_row
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_dyn_gas_mask_column-.10,dm_custom_dyn_gas_mask_row
-	STRCPY_TEXT_PRINT	tGasNeedsBar	; "Gas Needs (bar)"
-	goto	TFT_standard_color			; and return...
-
-	global	TFT_gas_needs
-TFT_gas_needs:							; LIMITATION: there is only space for 4 gases on the screen - if 5 gases
-	bsf		leftbind					;             have a pres_need > 0, then only the first 4 will be shown!
-	clrf	up
-	WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row1
-	call	TFT_gas_needs_helper
-	WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row2
-	call	TFT_gas_needs_helper
-	WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row1
-	call	TFT_gas_needs_helper
-	WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row2
-	call	TFT_gas_needs_helper
-	bcf		leftbind
+ IFDEF _cave_mode
+	movff	char_O_deco_info,WREG		; get the deco info vector
+	btfss	WREG,gas_needs_cave			; are the gas needs calculated for cave mode?
+	bra		TFT_gas_needs_mask_ascent_1	; NO  - show as direct ascent needs
+	bsf		gas_needs_mode_last			; YES - remember last results were for cave mode
+	STRCPY_TEXT tGasNeedsCaveMode		;     - "Gas Needs Cave Mode"
+	bra		TFT_gas_needs_mask_ascent_2
+TFT_gas_needs_mask_ascent_1:
+	bcf		gas_needs_mode_last			; remember last results were for direct ascent
+	STRCPY_TEXT tGasNeedsAscent			; "Gas Needs Ascent"
+TFT_gas_needs_mask_ascent_2:
+ ELSE
+	STRCPY_TEXT tGasNeedsAscent			; "Gas Needs Ascent"
+ ENDIF
+	STRCAT_PRINT " (bar)"				; " (bar)"
+	bra		TFT_custview_exit1			; and return...
+
+
+	global	TFT_gas_needs_ascent		; data for gas needs ascent
+TFT_gas_needs_ascent:					; LIMITATION: there is only space for 4 gases on the screen - if 5 gases have a pres_need > 0, then only the first 4 will be shown!
+ IFDEF _cave_mode
+	movff	char_O_deco_info,WREG		; get deco info vector
+	btfss	WREG,gas_needs_cave			; are the gas needs calculated for cave mode?
+	bra		TFT_gas_needs_ascent_1		; NO  - continue below...
+	btfsc	gas_needs_mode_last			; YES - were the last results calculated for cave mode?
+	bra		TFT_gas_needs_ascent_3		;       YES - mask still valid
+	bra		TFT_gas_needs_ascent_2		;       NO  - redraw mask
+TFT_gas_needs_ascent_1:
+	btfss	gas_needs_mode_last			; NO  - were the last results calculated for direct ascent?
+	bra		TFT_gas_needs_ascent_3		;       YES - mask still valid
+	;bra	TFT_gas_needs_ascent_2		;       NO  - redraw mask
+TFT_gas_needs_ascent_2:
+	rcall	TFT_gas_needs_ascent_mask	; redraw mask
+TFT_gas_needs_ascent_3:
+ ENDIF
+	clrf	up							; initialize gas index (0-4)
+	WIN_SMALL dm_custom_gas_column1+.5,dm_custom_gas_row1
+	rcall	TFT_gas_needs_helper
+	WIN_SMALL dm_custom_gas_column1+.5,dm_custom_gas_row2
+	rcall	TFT_gas_needs_helper
+	WIN_SMALL dm_custom_gas_column2+.5,dm_custom_gas_row1
+	rcall	TFT_gas_needs_helper
+	WIN_SMALL dm_custom_gas_column2+.5,dm_custom_gas_row2
+	rcall	TFT_gas_needs_helper
 	return
 
 TFT_gas_needs_helper:
-	call	TFT_standard_color
+	call	TFT_memo_color
 	movlw	.5							; number of gases
 	cpfslt	up							; check if all gases have been processed
-	bra		TFT_gas_needs_helper_1		; yes -> clear display area
-	movf	up,W						; no  -> get gas number	and check if need of that gas is > 0
-	rlncf	WREG,W						; multipy by 2
-	lfsr	FSR1,int_O_tank_pres_need+1 ; read HIGH(int_O_tank_pres_need[up])
-	movff	PLUSW1,hi					; copy to temp storage hi
+	bra		TFT_gas_needs_helper_1		; YES - clear display area
+	movf	up,W						; NO  - get gas number and check if need of that gas is > 0
+	rlncf	WREG,W						; multiply by 2
+	incf	WREG,W						; add 1 to address high byte
+	lfsr	FSR1,int_O_ascent_pres_need	; load base of ascent press needs
+	movff	PLUSW1,hi					; read HIGH(int_O_ascent_pres_need[up])
 	btfss	hi,int_is_zero				; check flag for pres_need == 0
-	bra		TFT_gas_needs_helper_2		; no  -> print gas type and pressure needed
-	incf	up,F						; yes -> increment to next gas...
+	bra		TFT_gas_needs_helper_2		; NO  - print gas type and pressure needed
+	incf	up,F						; YES - increment to next gas...
 	bra		TFT_gas_needs_helper		; ...and try the next gas
 TFT_gas_needs_helper_1:					; no gases to show anymore, clear display area from potential remains of last invocation
 	STRCAT_PRINT "  ----   "			; overwrite outdated stuff if screen position is not needed
@@ -3876,33 +4111,30 @@
 	movf	up,W						; get gas number (0-4) to WREG
 	lfsr	FSR1,opt_gas_O2_ratio		; read opt_gas_O2_ratio[WREG]
 	movff	PLUSW1,lo					; copy result to lo
-	movf	up,W						; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg
 	lfsr	FSR1,opt_gas_He_ratio		; read opt_gas_He_ratio[WREG]
 	movff	PLUSW1,hi					; copy result to hi
 	call	customview_show_mix			; print "Air", "O2", "21/35", etc.
-	STRCAT	":"
+	PUTC	':'							; ":"
 	movf	up,W						; get gas number (0-4) to WREG
-	rlncf	WREG,W						; multipy by 2
-	lfsr	FSR1,int_O_tank_pres_need+0	; read lower part of integer
-	movff	PLUSW1,lo
-	movf	up,W						; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg
-	rlncf	WREG,W						; multipy by 2
-	lfsr	FSR1,int_O_tank_pres_need+1 ; read upper part of integer
-	movff	PLUSW1,hi
+	rlncf	WREG,W						; multiply by 2
+	lfsr	FSR1,int_O_ascent_pres_need	; load base of ascent press needs (default)
+	movff	PLUSW1,lo					; read LOW(int_O_ascent_pres_need[up])
+	incf	WREG,W						; add 1 to address high byte
+	movff	PLUSW1,hi					; read HIGH(int_O_ascent_pres_need[up])
 	btfsc	hi,int_attention_flag		; check if attention flag is set (pres_need > pres_fill * threshold)
-	call	TFT_attention_color			; yes, print gas need in yellow
-	btfsc	hi,int_warning_flag			; check if warning flag is set	(pres_need > pres_fill)
-	call	TFT_warnings_color			; yes, print gas need in red
-	movff	int_O_tank_pres_need+1,WREG	; get HIGH(int_O_tank_pres_need[0]) which hold flag for invalid data
+	call	TFT_attention_color			; YES - print gas need in yellow
+	btfsc	hi,int_warning_flag			; check if warning   flag is set (pres_need > pres_fill)
+	call	TFT_warnings_color			; YES - print gas need in red
+	movff	int_O_ascent_pres_need+1,WREG ; get HIGH(int_O_ascent_pres_need[0]) which holds flag for invalid data
 	btfsc	WREG,int_invalid_flag		; check if invalid data flag is set
-	call	TFT_disabled_color			; yes, print gas need in disabled color
+	call	TFT_disabled_color			; YES - print gas need in  disabled  color
 	bcf		hi,int_attention_flag		; clear attention flag for attention color
-	bcf		hi,int_warning_flag			; clear warning	flag for warning	color
-	bcf		hi,int_invalid_flag			; clear flag for invalid data (will actually only be set with 1st gas)	
+	bcf		hi,int_warning_flag			; clear warning   flag for warning   color
+	bcf		hi,int_invalid_flag			; clear flag for invalid data (will actually only be set with 1st gas)
 	output_16_3							; limit to 999 and display only (0-999)
 	STRCAT_PRINT " "					; adds a space to overwrite any potential remains of earlier outputs
 	incf	up,F						; increment to next gas
-	goto	TFT_standard_color			; and return...
+	bra		TFT_custview_exit2			; and return...
 
 
 	global	TFT_mask_ppo2				; helper function for several custom views
@@ -3910,28 +4142,28 @@
 	call	TFT_divemask_color
 	btfss	FLAG_ccr_mode				; in CCR mode?
 	bra		TFT_mask_ppo2a				; NO  - continue checking for pSCR and OC
-	btfsc	is_bailout					; in bailout?
+	btfsc	FLAG_bailout_mode			; in bailout?
 	bra		TFT_mask_ppo2b				; YES
-	WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row	; tuned position for longer text
+	WIN_TINY dm_custom_ppo2_column-.2,dm_custom_ppo2_title_row	; tuned position for longer text (-8 = on leftmost edge of display)
 	STRCPY_TEXT_PRINT tppO2Dil			; print "ppO2(Dil)"
-	goto	TFT_standard_color			; and return...
+	bra		TFT_custview_exit2			; and return...
 TFT_mask_ppo2a:
 	btfss	FLAG_pscr_mode				; in pSCR mode?
 	bra		TFT_mask_ppo2b				; NO  - continue with OC mode (or bailout)
-	btfsc	is_bailout					; in bailout?
+	btfsc	FLAG_bailout_mode			; in bailout?
 	bra		TFT_mask_ppo2b				; YES
-	WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row	; tuned position for longer text
+	WIN_TINY dm_custom_ppo2_column-.2,dm_custom_ppo2_title_row	; tuned position for longer text (-8 = on leftmost edge of display)
 	STRCPY_TEXT_PRINT tppO2Mix			; print "ppO2(Mix)"
-	goto	TFT_standard_color			; and return... 
+	bra		TFT_custview_exit2			; and return...
 TFT_mask_ppo2b:							; OC mode or bailout
-	WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row	; normal position
+	WIN_TINY dm_custom_ppo2_column-.2, dm_custom_ppo2_title_row	; normal position
 	STRCPY_TEXT_PRINT tppO2				; in all other modes
-	goto	TFT_standard_color			; and return...
+	bra		TFT_custview_exit2			; and return...
 
 
 	global	TFT_display_pure_ppo2		; show ppO2 of the pure gas - helper function for several custom views
 TFT_display_pure_ppo2:
-	WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row
+	WIN_MEDIUM dm_custom_ppo2_column, dm_custom_ppo2_row
 	movff	int_O_pure_ppO2+0,lo		; copy ppO2 of the pure gas to hi:lo
 	movff	int_O_pure_ppO2+1,hi
 	call	TFT_color_code_ppo2			; color-code output
@@ -3939,21 +4171,21 @@
 	output_16dp .3						; x.xx bar
 	bcf		leftbind
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
-
-
-	global TFT_ppo2_ead_end_cns_mask	; Show ppO2, END/EAD and CNS mask
+	bra		TFT_custview_exit2			; and return...
+
+
+	global TFT_ppo2_ead_end_cns_mask	; mask for ppO2, END/EAD and CNS
 TFT_ppo2_ead_end_cns_mask:
 	rcall	TFT_mask_ppo2
 	call	TFT_divemask_color
 	WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row
 	STRCPY_TEXT_PRINT tDiveEAD_END
-	WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row
+	WIN_TINY dm_custom_cns_column, dm_custom_cns_title_row
 	STRCPY_TEXT_PRINT tCNS2
-	goto	TFT_standard_color			; and return...
-
-
-	global	TFT_ppo2_ead_end_cns		; Show ppO2, END/EAD and CNS
+	bra		TFT_custview_exit2			; and return...
+
+
+	global	TFT_ppo2_ead_end_cns		; data for ppO2, END/EAD and CNS
 TFT_ppo2_ead_end_cns:
 	;show ppO2
 	rcall	TFT_display_pure_ppo2		; show ppO2 of the pure gas
@@ -3967,57 +4199,58 @@
 	movff	char_O_END,lo
 	rcall	TFT_end_ead_common			; print "lo m" (or ft) and limit to 8 chars
 	; Show CNS
-	WIN_STD	dm_custom_currentgf_column, dm_custom_currentgf_row
+	WIN_STD	dm_custom_cns_column+.3, dm_custom_cns_row
 	movff	int_O_CNS_fraction+0,lo
 	movff	int_O_CNS_fraction+1,hi
-	call	TFT_color_code_cns			; Color-code CNS output
+	call	TFT_color_code_cns			; color-code CNS output
 	bsf		leftbind
-	output_16_3							; Displays only 0...999
+	output_16_3							; displays only 0...999
 	bcf		leftbind
 	STRCAT_PRINT "%"
+TFT_custview_exit2:
 	goto	TFT_standard_color			; and return...
-
 TFT_end_ead_common:						; print "lo m" (or ft) and limit to 8 chars
 	bsf		leftbind
 	TSTOSS	opt_units					; 0=Meters, 1=Feets
 	bra		TFT_end_ead_common_metric
-;TFT_end_ead_common_imperial:
-	movf	lo,W						; With lo in m
+TFT_end_ead_common_imperial:
+	movf	lo,W						; with lo in m
 	mullw	.100						; PRODL:PRODH = mbar/min
 	movff	PRODL,lo
 	movff	PRODH,hi
-	call	convert_mbar_to_feet		; convert value in lo:hi from mbar to feet
+	call	convert_mbar_to_feet		; convert value in hi:lo from mbar to feet
 	output_16_3
 	STRCAT_TEXT tFeets
 	clrf	WREG
 	movff	WREG,buffer+.8				; limit string length to 8
-	bra	 TFT_end_ead_common_exit
+	bra		TFT_end_ead_common_exit
 TFT_end_ead_common_metric:
 	output_8
 	STRCAT_TEXT tMeters
 TFT_end_ead_common_exit:
 	bcf		leftbind
 	movlw	.8
-	rcall	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
 	return
 
 
-	global	TFT_sensor_check_mask		; show ppO2 of O2 and Diluent mask
+	global	TFT_sensor_check_mask		; mask for sensor check
 TFT_sensor_check_mask:
 	call	TFT_divemask_color
-	WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row
+	WIN_TINY dm_custom_s_check_title_column, dm_custom_s_check_title_row
 	STRCPY_TEXT_PRINT tSensorCheck
-	WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row
+	WIN_TINY dm_custom_ppO2_column, dm_custom_s_check_title_row
 	STRCPY_TEXT_PRINT tppO2O2
-	WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row
+	WIN_TINY dm_custom_ppDil_column, dm_custom_s_check_title_row
 	STRCPY_TEXT_PRINT tppO2Dil
-	goto	TFT_standard_color			; and return...
-
-	global	TFT_sensor_check			; show ppO2 of O2 and Diluent
+	bra		TFT_sensor_check_exit		; and return...
+
+
+	global	TFT_sensor_check			; data for sensor check
 TFT_sensor_check:
 	; Show ppO2 of O2 in this depth
-	WIN_MEDIUM dm_custom_s_check_ppo2_o2_column, dm_custom_s_check_value_row
+	WIN_MEDIUM dm_custom_ppO2_column, dm_custom_s_check_row
 	movff	int_O_O2_ppO2+0,lo			; copy ppO2 of pure O2 to hi:lo
 	movff	int_O_O2_ppO2+1,hi
 	call	TFT_color_code_ppo2			; color-code output
@@ -4026,7 +4259,7 @@
 	bcf		leftbind
 	STRCAT_PRINT ""
 	; Show ppO2 of the diluent in this depth
-	WIN_MEDIUM	dm_custom_s_check_ppo2_dil_col, dm_custom_s_check_value_row
+	WIN_MEDIUM	dm_custom_ppDil_column, dm_custom_s_check_row
 	movff	int_O_pure_ppO2+0,lo		; copy ppO2 of pure gas to hi:lo
 	movff	int_O_pure_ppO2+1,hi
 	call	TFT_color_code_ppo2			; color-code output
@@ -4034,7 +4267,8 @@
 	output_16dp .3						; x.xx bar
 	bcf		leftbind
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
+TFT_sensor_check_exit:
+	bra		TFT_custview_exit2			; and return...
 
 ;=============================================================================
 
@@ -4042,21 +4276,20 @@
 TFT_surface_lastdive:
 	call	TFT_divemask_color
 	WIN_TINY surf_gaslist_column,surf_gaslist_row+.5
-	STRCAT_TEXT_PRINT	tLastDive			; Last Dive:
+	STRCAT_TEXT_PRINT	tLastDive			; "Last Dive:"
 	WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1)+.5
-	STRCAT_TEXT_PRINT	tDivetime			; Divetime
+	STRCAT_TEXT_PRINT	tDivetime			; "Divetime:"
 	WIN_TINY surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2)+.5
-	STRCAT_TEXT_PRINT	tMaxDepth			; Max. Depth
+	STRCAT_TEXT_PRINT	tMaxDepth			; "Max. Depth"
 	call	TFT_standard_color
 	WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row
-
 	movff	int_O_desaturation_time+0,lo	; bank-safe copies
 	movff	int_O_desaturation_time+1,WREG
 	iorwf	lo,W							; check if desaturation time is zero
 	bz		TFT_surface_lastdive_1			; YES - show last dive time
 	movff	surface_interval+0,lo			; NO  - show dive interval
 	movff	surface_interval+1,hi
-	call	convert_time					; lo=mins, hi=hours
+	call	convert_time					; converts hi:lo in minutes to hours (up:hi) and minutes (lo)
 	movf	hi,W
 	movff	lo,hi
 	movwf	lo								; exchange lo and hi
@@ -4075,21 +4308,21 @@
 	movlw	LOW  .3600
 	movwf	xB+0
 	movlw	HIGH .3600
-	movwf	xB+1							; One day = 3600s
+	movwf	xB+1							; one day = 3600s
 	call	div32x16						; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
-	;xC+0:xC+1 -> Full hours
+	;xC+0:xC+1 -> full hours
 	movff	xC+1,xA+1
 	movff	xC+0,xA+0
 	clrf	xB+1
 	movlw	.24
 	movwf	xB+0
-	call	div16x16						;xA/xB=xC with xA+0 as remainder
+	call	div16x16						; xC = xA / xB with xA as remainder
 	movff	xC+0,lo
-	movff	xC+1,hi							; Full days
+	movff	xC+1,hi							; full days
 	bsf		leftbind
 	output_16
 	PUTC	"d"
-	movff	xA+0,lo							; Full hours
+	movff	xA+0,lo							; full hours
 	output_8
 	STRCAT_PRINT "h "
 TFT_surface_lastdive_2:
@@ -4107,13 +4340,13 @@
 	TSTOSS	opt_units						; 0=Meters, 1=Feets
 	bra		TFT_surface_lastdive_metric
 	;imperial
-	rcall	convert_mbar_to_feet			; convert value in lo:hi from mbar to feet
+	rcall	convert_mbar_to_feet			; convert value in hi:lo from mbar to feet
 	output_16_3								; limit to 999 and display only (0-999)
 	STRCAT_TEXT tFeets1
 	bra		TFT_surface_lastdive2
 
 TFT_surface_lastdive_metric:
-	bsf		ignore_digit5					; no cm...
+	bsf		ignore_digit5					; no cm (flag will be cleared by output_16)
 	movlw	d'1'							; +1
 	movff	WREG,ignore_digits				; no 1000m
 	output_16dp .3							; xxx.y
@@ -4121,19 +4354,19 @@
 TFT_surface_lastdive2:
 	STRCAT_PRINT ""
 	bcf		leftbind
-	return									; Done.
+	return									; done.
 
 ;=============================================================================
 
 	global	TFT_surface_tissues
-TFT_surface_tissues:						; Show Tissue diagram in surface mode
+TFT_surface_tissues:						; show Tissue diagram in surface mode
 	WIN_SMALL surf_tissue_N2_column,surf_tissue_N2_row
 	STRCPY_TEXT_PRINT tN2
 	WIN_SMALL surf_tissue_He_column,surf_tissue_He_row
 	STRCPY_TEXT_PRINT tHe
 
 	movlw	color_deepblue
-	call	TFT_set_color					; Make this configurable?
+	call	TFT_set_color					; make this configurable?
 	WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.29,.29
 	WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.37,.37
 	WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.45,.45
@@ -4145,14 +4378,14 @@
 	WIN_FRAME_STD     surf_tissue_diagram_top, surf_tissue_diagram_bottom, surf_tissue_diagram_left, surf_tissue_diagram_right	; outer frame
 
 	movlw	.1
-	movff	WREG,win_height												; row bottom (0-239)
+	movwf	win_height													; row bottom (0-239)
 
 	;---- Draw N2 Tissues ----------------------------------------------------
 
 	movlw	surf_tissue_diagram_left+.4									; start position for N2 bars
-	movff	WREG,win_leftx2												; column left (0-159)
-	movlw	surf_tissue_diagram_right - surf_tissue_diagram_left - .4	; max width for N2 bars
-	movff	WREG,win_width
+	movwf	win_leftx2													; column left (0-159)
+	movlw	surf_tissue_diagram_right-surf_tissue_diagram_left-.4		; max width for N2 bars
+	movwf	win_width
 
 	lfsr	FSR2, char_O_tissue_N2_saturation
 	movlw	d'16'
@@ -4161,26 +4394,26 @@
 surf_tissue_saturation_graph_N2:
 	movlw	surf_tissue_diagram_top+.23									; surface mode
 	addwf	hi,W
-	movff	WREG,win_top												; row top (0-239)
+	movwf	win_top														; row top (0-239)
 	rcall	surf_tissue_saturation_loop									; show one tissue
 	decfsz	lo,F
 	bra		surf_tissue_saturation_graph_N2
 
 	;---- Draw He Tissues ----------------------------------------------------
 
-	movlw	surf_tissue_diagram_left + .24								; start position for He bars (.15 without x2)
-	movff	WREG,win_leftx2												; column left (0-159)
-	movlw	surf_tissue_diagram_right - surf_tissue_diagram_left - .24	; max width for He bars
-	movff	WREG,win_width
+	movlw	surf_tissue_diagram_left+.24								; start position for He bars (.15 without x2)
+	movwf	win_leftx2													; column left (0-159)
+	movlw	surf_tissue_diagram_right-surf_tissue_diagram_left-.24		; max width for He bars
+	movwf	win_width
 
 	lfsr	FSR2, char_O_tissue_He_saturation
 	movlw	d'16'
 	movwf	lo															; 16 tissues
-	clrf	hi													; row offset
+	clrf	hi															; row offset
 surf_tissue_saturation_graph_He:
 	movlw	surf_tissue_diagram_top+.23+.57								; surface mode
 	addwf	hi,W
-	movff	WREG,win_top												; row top (0-239)
+	movwf	win_top														; row top (0-239)
 	rcall	surf_tissue_saturation_loop									; show one tissue
 	decfsz	lo,F
 	bra		surf_tissue_saturation_graph_He
@@ -4191,7 +4424,7 @@
 	call	TFT_color_code_cns
 	STRCPY_TEXT tCNS2													; CNS:
 	bsf		leftbind
-	output_16_3															; Displays only 0...999
+	output_16_3															; displays only 0...999
 	bcf		leftbind
 	STRCAT_PRINT "%"
 	goto	TFT_standard_color											; and return...
@@ -4205,7 +4438,7 @@
 	rlncf	WREG,W						; multiply with 2 (previously cleared bit 7 will be rotated to bit 0)
 	incf	WREG,W						; add 1 for a minimum visible bar (He-bars could be invisible else-wise)
 	movwf	up
-	movff	win_width+0,WREG			; get max window width (win_width)
+	movf	win_width+0,W				; get max window width (win_width)
 	cpfslt	up							; skip if WREG < win_width
 	movwf	up							; crop length to win_width
 										; no need to be able to draw longer bars –
@@ -4218,22 +4451,25 @@
 	goto	TFT_box						; and return...
 
 ;=============================================================================
-; Draw saturation graph in dive mode.
+; Draw saturation graph in dive mode
 
 DISP_tissue_saturation_graph:
 	;---- Draw Frame
 	call	TFT_standard_color
-	WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159	; outer frame
+	WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159 ; outer frame
+
+	;---- clear area showing leading tissue number as it may not be printed over
+	WIN_BOX_BLACK dm_custom_tissue_diagram_top+.16, dm_custom_tissue_diagram_top+.16+.10, dm_custom_tissue_diagram_left+.32, dm_custom_tissue_diagram_left+.32+.8 ; top, bottom, left, right
 
 	movlw	.1
-	movff	WREG,win_height							; row bottom (0-239)
+	movwf	win_height									; row bottom (0-239)
 
 	;---- Draw N2 Tissues ----------------------------------------------------
 
-	movlw	dm_custom_tissue_diagram_left+.3		; divemode
-	movff	WREG,win_leftx2							; column left (0-159)
-	movlw	.159-dm_custom_tissue_diagram_left-.4	; width
-	movff	WREG,win_width
+	movlw	dm_custom_tissue_diagram_left+.3			; divemode
+	movwf	win_leftx2									; column left (0-159)
+	movlw	.159-dm_custom_tissue_diagram_left-.4		; width
+	movwf	win_width
 
 	lfsr	FSR2, char_O_tissue_N2_saturation
 	movlw	d'16'
@@ -4247,10 +4483,10 @@
 
 	;---- Draw He Tissues ----------------------------------------------------
 
-	movlw	dm_custom_tissue_diagram_left + .8			; divemode
-	movff	WREG,win_leftx2								; column left (0-159)
-	movlw	.159 - dm_custom_tissue_diagram_left - .14	; width
-	movff	WREG,win_width
+	movlw	dm_custom_tissue_diagram_left+.8			; divemode
+	movwf	win_leftx2									; column left (0-159)
+	movlw	.159-dm_custom_tissue_diagram_left-.14		; width
+	movwf	win_width
 
 	lfsr	FSR2, char_O_tissue_He_saturation
 	movlw	d'16'
@@ -4261,16 +4497,46 @@
 	rcall	tissue_saturation_graph_loop				; show one tissue
 	decfsz	lo,F
 	bra		tissue_saturation_graph_He
-	goto	TFT_standard_color							; and return...
+
+	;---- Print Number of leading Tissue -------------------------------------
+
+														; TODO: some flicker due to overwriting by tissue bars
+
+	movff	int_O_gradient_factor+0,WREG				; get current gradient factor (only low byte used for value)
+	tstfsz	WREG										; current gradient factor = 0 ?
+	bra		tissue_saturation_graph_0					; NO  - print number of leading tissue
+	movff	char_O_deco_info,WREG						; YES - get deco info vector
+	btfss	WREG,deco_ceiling							;     - do we have a ceiling obligation?
+	goto	TFT_standard_color							;       NO  - can ascent directly, don't print number, set standard color and return
+														;       YES - print number of leading tissue
+tissue_saturation_graph_0:
+	movff	char_O_lead_number,lo						; get number of leading tissue as 0-15
+	incf	lo,F										; adjust to 1-16
+	movlw	.10
+	cpfsgt	lo											; is it > 10 ?
+	bra		tissue_saturation_graph_1					; NO - will output a single digit number
+	; start position for a 2 digit number
+	WIN_TINY dm_custom_tissue_diagram_left+.32,dm_custom_tissue_diagram_top+.16
+	bra		tissue_saturation_graph_2
+tissue_saturation_graph_1:
+	; start position for a 1 digit number
+	WIN_TINY dm_custom_tissue_diagram_left+.32+.4,dm_custom_tissue_diagram_top+.16
+tissue_saturation_graph_2:
+	call	TFT_standard_color							; set output color
+	bsf		leftbind
+	output_8											; print number in leftbind, i.e. without leading zeros or spaces
+	bcf		leftbind
+	STRCAT_PRINT ""										; finalize output
+	return
 
 tissue_saturation_graph_loop:
 	addwf	hi,W
-	movff	WREG,win_top								; row top (0-239)
+	movwf	win_top										; row top (0-239)
 	movlw	color_cyan									; preset color for tissues with decreasing pressure
 	call	TFT_set_color
 	incf	hi,F
 	movf	POSTINC2,W
-	btfss	WREG,7										; check fs flag for increasing tissue pressure set
+	btfss	WREG,7										; check if flag for increasing tissue pressure set
 	bra		tissue_saturation_graph_loop_1				; NO  - keep color
 	movwf	up											; YES - buffer WREG
 	movlw	color_orange								;       select color for tissues with increasing pressure
@@ -4293,90 +4559,400 @@
 
 	global	TFT_display_cns
 TFT_display_cns:
-	call	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	call	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	STRCPY_TEXT tCNS					; CNS:
 	movff	int_O_CNS_fraction+0,lo
 	movff	int_O_CNS_fraction+1,hi
-	call	TFT_color_code_cns			; Color-code CNS output
+	call	TFT_color_code_cns			; color-code CNS output
 	bsf		leftbind
-	output_16_3							; Displays only 0...999
+	output_16_3							; displays only 0...999
 	bcf		leftbind
 	PUTC	"%"
-	movlw	dm_warning_length			; Divemode string length
-	btfss	divemode					; In Divemode?
-	movlw	surf_warning_length			; No, use surface string length
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	btfss	divemode					; In divemode?
+	movlw	surf_warning_length			; NO - use surface string length
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
 	bcf		win_invert
-	goto	TFT_standard_color			; and return...
+	bra		TFT_custview_exit3			; and return...
 
 
 	global	TFT_display_eod_cns
 TFT_display_eod_cns:
-	call	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
+	call	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
 	call	TFT_warnings_color			; switch to warnings (red) text color
 	STRCPY_TEXT tCNSeod					; end-of-dive CNS warning text
-	movlw	dm_warning_length			; Divemode string length
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
-	goto	TFT_standard_color			; and return...
-
-
-	global	TFT_display_ppo2
-TFT_display_ppo2:
-	call	TFT_warning_set_window		; Sets the row and column for the current warning
-	tstfsz	WREG						; Is there room for the warning?
-	return								; No
-	movff	int_O_pure_ppO2+0,lo		; copy ppO2 of the pure gas (OC: = breathed gas, loop: = diluent/premix) to hi:lo
-	movff	int_O_pure_ppO2+1,hi
-	call	TFT_color_code_ppo2			; Color-code output
+	bra		TFT_custview_exit3			; and return...
+
+
+	global	TFT_display_ppo2_warning
+TFT_display_ppo2_warning:				; with ppO2 including attention/warning flags in hi:lo
+	call	TFT_warning_set_window		; set the row and column for the current message
+	tstfsz	WREG						; is there room for the message?
+	return								; NO
+	call	TFT_color_code_ppo2			; color-code output
+	btfsc	FLAG_bailout_mode			; in bailout?
+	bra		TFT_display_diluent_2		; YES
 	btfss	FLAG_ccr_mode				; in CCR mode?
 	bra		TFT_display_diluent_1		; NO  - continue with pSCR or OC 
-	btfsc	is_bailout					; YES - in bailout?
-	bra		TFT_display_diluent_2		;       YES - continue with OC 
-	STRCPY_TEXT tdil					;       NO  - print "Dil:"
+	STRCPY_TEXT tdil					; YES - print "Dil:"
 	bra		TFT_display_diluent_3
 TFT_display_diluent_1:
 	btfss	FLAG_pscr_mode				; in pSCR mode?
-	bra		TFT_display_diluent_2		; NO  - continue with pSCR or OC 
-	btfsc	is_bailout					; YES - in bailout?
-	bra		TFT_display_diluent_2		;       YES - continue with OC 
-	STRCPY_TEXT tmix					;       NO  - print "Mix:"
+	bra		TFT_display_diluent_2		; NO  - continue with OC 
+	STRCPY_TEXT tmix					; YES - print "Mix:"
 	bra		TFT_display_diluent_3
 TFT_display_diluent_2:
-	STRCPY_TEXT tppO2					; OC mode or bailout, print "ppO2:"
+	STRCPY_TEXT tppO2					; bailout or OC mode, print "ppO2:"
 TFT_display_diluent_3:
 	bsf		leftbind
 	output_16dp .3						; x.xx bar
 	bcf		leftbind
-	movlw	dm_warning_length			; Divemode string length
-	call	TFT_fillup_with_spaces		; Fillup FSR2 with spaces (Total string length in #WREG)
+	movlw	dm_warning_length			; divemode string length
+	call	TFT_fillup_with_spaces		; fill up FSR2 with spaces (total string length in #WREG)
 	STRCAT_PRINT ""
+TFT_custview_exit3:
 	goto	TFT_standard_color			; and return...
 
+
+	global	TFT_surf_set_bearing
+TFT_surf_set_bearing:
+	btfsc	premenu
+	return								; already shown, return
+	bsf		premenu						; set flag
+	WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right
+	WIN_SMALL surf_compass_bear_column,surf_compass_bear_row
+	WIN_COLOR color_yellow
+	bsf		win_invert
+	STRCPY_TEXT_PRINT tSetHeading		; 7 chars
+	bcf		win_invert
+	return
+
 ;=============================================================================
 
 	global	TFT_LogOffset_Logtitle
 TFT_LogOffset_Logtitle:
 	STRCPY_TEXT tLogOffset
 	PUTC	":"
-	call	do_logoffset_common_read	; Offset into lo:hi
+	call	do_logoffset_common_read	; offset into lo:hi
 	bsf		leftbind
 	output_16_4
 	bcf		leftbind
 	PUTC	" "
-	return								; No "_PRINT" here...
+	return								; no "_PRINT" here...
 
 ;=============================================================================
+; RX Functions
+
+ IFDEF _rx_functions
+
+	global	TFT_pressures_SAC_mask			; mask for pressures and SAC
+TFT_pressures_SAC_mask:
+	call	TFT_divemask_color
+	; pressure reading 1
+	WIN_TINY dm_custom_tankdata_pres1_col, dm_custom_tankdata_mask_row
+	movff	char_I_pressure_gas+0,WREG		; =0: disabled, =1..10: gases/dils
+	bcf		aux_flag						; selector for disabled / need set to disabled
+	call	TFT_pressures_SAC_mask_helper	; print gas composition or " ---" if disabled
+	; pressure reading 2
+	WIN_TINY dm_custom_tankdata_pres2_col, dm_custom_tankdata_mask_row
+	movff	char_I_pressure_gas+1,WREG		; =0: need to reading 1, =1..10: gases/dils
+	bsf		aux_flag						; selector for disabled / need set to need
+	call	TFT_pressures_SAC_mask_helper	; print gas composition or "Need " if 0
+	; SAC rate
+	WIN_TINY dm_custom_tankdata_SAC_col, dm_custom_tankdata_mask_row
+	STRCPY_TEXT tSAC						; "SAC
+	STRCAT	" ("							;      (
+	STRCAT_TEXT tLitersMinute				;       l/min
+	STRCAT_PRINT ")"						;            )"
+	bra		TFT_custview_exit3				; and return...
+
+TFT_pressures_SAC_mask_helper:
+	tstfsz	WREG							; pressure reading assigned?
+	bra		TFT_dive_tankdata_mask_helper_1	; YES - print gas composition
+	btfsc	aux_flag						; NO  - check auxiliary flag
+	bra		TFT_dive_tankdata_mask_helper_2	;       1 - print "Need "
+	STRCAT_PRINT "    ---"					;       0 - print "    ---"
+	return									;         - done
+TFT_dive_tankdata_mask_helper_1:
+	decf	WREG,W							; (1..10) -> (0..9)
+	bsf		short_gas_decriptions			; just "Air", "O2" or "xx/yy"
+	call	gaslist_strcat_gas_WREG			; print composition of gas/dil in WREG (0..9)
+	bra		TFT_dive_tankdata_mask_helper_3 ; finish with adding "(bar)"
+TFT_dive_tankdata_mask_helper_2:
+	STRCPY_TEXT tNeed						; "Need"
+TFT_dive_tankdata_mask_helper_3:
+	STRCAT_PRINT "(bar)"
+	return
+
+
+	global	TFT_pressures_SAC				; data for pressures and SAC
+TFT_pressures_SAC:
+	; check mode for second reading
+	bcf		aux_flag						; clear auxiliary flag by default (reading 2 is pressure)
+	movff	char_I_pressure_gas+1,WREG		; =0: need to reading 1, =1..10: gases/dils
+	addlw	.0								; dummy operation to set status register flags
+	btfsc	STATUS,Z						; gas selected = 0 (i.e. no 2nd pressure reading) ?
+	bsf		aux_flag						; YES - set auxiliary flag (display position of reading 2 shall show need to reading 1)
+	; get data of reading 1
+	movff	int_IO_pressure_value+0,lo		; copy pressure 1 to hi:lo
+	movff	int_IO_pressure_value+1,hi
+	movff	char_I_pressure_stat+0,ex		; copy status data
+	; pressure of reading 1
+	WIN_STD dm_custom_tankdata_pres1_col+.4,dm_custom_tankdata_row
+	rcall	TFT_pressures_SAC_helper_1		; print pressure if available, else " ---"
+	; battery status of reading 1
+	WIN_SMALL dm_custom_hud_sensor1_column+.4+.36,dm_custom_tankdata_row
+	rcall	TFT_pressures_SAC_helper_2		; print or clear down arrow as low bat indicator
+	; get data for reading 2
+	btfsc	aux_flag						; shall reading 2 show need to reading 1 ?
+	bra		TFT_pressures_SAC_1				; YES
+	movff	int_IO_pressure_value+2,lo		; NO  - copy pressure 2 to hi:lo
+	movff	int_IO_pressure_value+3,hi		;
+	movff	char_I_pressure_stat+1,ex		;     - copy status data
+	bra		TFT_pressures_SAC_2
+TFT_pressures_SAC_1:
+	movff	int_O_pressure_need+0,lo		; YES - copy need to pressure 1 to hi:lo
+	movff	int_O_pressure_need+1,hi		;
+	clrf	ex								;     - set status data to 0
+TFT_pressures_SAC_2:
+	; pressure of reading 2
+	WIN_STD dm_custom_tankdata_pres2_col+.2,dm_custom_tankdata_row
+	rcall	TFT_pressures_SAC_helper_1		; print pressure if available, else " ---"
+	; battery status of reading 2
+	WIN_SMALL dm_custom_tankdata_pres2_col+.2+.36,dm_custom_tankdata_row
+	rcall	TFT_pressures_SAC_helper_2		; print or clear down arrow as low bat indicator
+	; SAC
+	WIN_STD dm_custom_tankdata_SAC_col+.6,dm_custom_tankdata_row
+	movff	int_O_sac_rate+0,lo				; copy SAC rate to hi:lo
+	movff	int_O_sac_rate+1,hi
+	btfsc	hi,int_not_avail_flag			; SAC rate available?
+	bra		TFT_pressures_SAC_4				; NO - print " --.-"
+	call	TFT_color_code_tank_pres_sac	; color-code the output
+	output_16_3								; print as xxx
+	PUTC	" "								; print a dummy char to have the string termination at the correct place
+	movff	buffer+.2,buffer+.3				; move the decimal digit one position to the right
+	movlw	"."								; load coding of a decimal point
+	movff	WREG,buffer+.2					; place it before decimal digit
+	movlw	" "								; load coding of a space character
+	movff	buffer+.1,up					; get the character in front of the decimal point
+	cpfseq	up								; is it a space?
+	bra		TFT_pressures_SAC_3				; NO  - continue
+	movlw	"0"								; YES - load coding of a zero
+	movff	WREG,buffer+.1					;     - place a zero in front of the decimal point
+TFT_pressures_SAC_3:
+	STRCAT_PRINT ""							; dump buffer to screen
+	bra		TFT_custview_exit3				; and return...
+TFT_pressures_SAC_4:
+	call	TFT_disabled_color
+	STRCAT_PRINT "--.-"						; output for no SAC data available
+	bra		TFT_custview_exit3				; and return...
+
+TFT_pressures_SAC_helper_1:
+	btfss	hi,int_not_avail_flag			; pressure available?
+	bra		TFT_pressures_SAC_helper_1a		; YES - print pressure
+	call	TFT_disabled_color				; NO  - use disabled color as default
+	btfsc	ex,char_transmitter_lost		;     - transmitter lost?
+	call	TFT_attention_color				;       YES - use attention color
+	STRCAT_PRINT " ---"						;     - print " ---"
+	return
+TFT_pressures_SAC_helper_1a:
+	btfsc	hi,int_warning_flag				; out of range (signaled by warning flag)?
+	bra		TFT_pressures_SAC_helper_1c		; YES - special treatment
+	call	TFT_color_code_tank_pres_sac	; NO  - color-code the output
+	bsf		ignore_digit5					;     - no 0.1 bar (flag will be cleared by output_16)
+	movf	lo,W							;
+	iorwf	hi,W							;     - pressure value = 0 ?
+	bnz		TFT_pressures_SAC_helper_1b		;       NO  - print value
+	STRCPY_PRINT "   0"						;       YES - print a zero manually
+	return									;           - done
+TFT_pressures_SAC_helper_1b:
+	output_16								; print hi:lo
+	STRCAT_PRINT ""							; dump buffer to screen
+	return									; done
+TFT_pressures_SAC_helper_1c:
+	call	TFT_color_code_tank_pres_sac	; color-code the output (clears all flags)
+	STRCPY_PRINT ">400"						; print ">400"
+	return									; done
+
+TFT_pressures_SAC_helper_2:
+	btfss	ex,char_transmitter_low_bat		; low battery flag set?
+	bra		TFT_pressures_SAC_helper_2a		; NO  - wipe out down arrow (low bat indicator)
+	call	TFT_attention_color				; YES - use attention color
+	STRCPY_PRINT "\xb8"						;     - print down arrow as bat low indication
+	return
+TFT_pressures_SAC_helper_2a:
+	STRCPY_PRINT " "						; wipe out down arrow (low bat indicator)
+	return
+
+
+	global	TFT_menu_tank_pres
+TFT_menu_tank_pres:							; imprinting function for main menu / tank setup
+	call	TFT_standard_color
+	; get ID
+	lfsr	FSR1,opt_transmitter_id_1		; load base address of opt_transmitter_id
+	movf	gaslist_gas,W					; get current gas
+	rlncf	WREG,W							; multiply by 2 because IDs are 2 byte in size
+	movff	PLUSW1,lo						; copy opt_transmitter_id+0[gaslist_gas] to lo
+	incf	WREG,W							; increment index
+	movff	PLUSW1,hi						; copy opt_transmitter_id+1[gaslist_gas] to hi
+	; show pressure
+	WIN_SMALL .90, .61						; column, row (+/- 27 per row)
+	call	get_pres_by_transmitter_id		; get pressure into hi:lo
+	tstfsz	WREG							; do we have valid tank data (WREG=0) ?
+	bra		TFT_menu_tank_pres_1			; NO - transmitter not found
+	call	TFT_color_code_tank_pres_sac	; set output color according to flags
+	bsf		ignore_digit5					; no 0.1 bar (flag will be cleared by output_16)
+	output_16
+	bra		TFT_menu_tank_pres_2
+TFT_menu_tank_pres_1:
+	call	TFT_disabled_color
+	STRCAT	" ---"							; output for no pressure data available
+TFT_menu_tank_pres_2:
+	STRCAT_TEXT_PRINT tbar					; " bar"
+	bra		TFT_custview_exit3				; and return...
+
+
+	global	TFT_surface_tank_pres
+TFT_surface_tank_pres:						; show pressure reading above surface pressure
+	WIN_SMALL surf_decotype_column+.6,surf_decotype_row+.30+.47
+	movff	int_IO_pressure_value+0,lo		; copy pressure from 1st reading, low  byte
+	movff	int_IO_pressure_value+1,hi		; copy pressure from 1st reading, high byte
+	btfss	hi,int_not_avail_flag			; pressure reading 1 available?
+	bra		TFT_surface_tank_pres_0			; YES
+	movff	int_IO_pressure_value+2,lo		; NO - copy pressure from 2nd reading, low  byte
+	movff	int_IO_pressure_value+3,hi		;    - copy pressure from 2nd reading, high byte
+	btfsc	hi,int_not_avail_flag			;    - pressure reading 2 available?
+	bra		TFT_surface_tank_pres_1			;      NO  - show not avail message
+TFT_surface_tank_pres_0:					;      YES - show pressure
+	call	TFT_color_code_tank_pres_sac	; set output color according to flags
+	bsf		ignore_digit5					; no 0.1 bar (flag will be cleared by output_16)
+	output_16
+	STRCAT_PRINT ""
+	bra		TFT_surface_tank_pres_2
+TFT_surface_tank_pres_1:
+	call	TFT_disabled_color
+	STRCAT_PRINT " ---"						; output for no pressure data available
+TFT_surface_tank_pres_2:
+	WIN_SMALL surf_decotype_column+.38,surf_decotype_row+.30+.47
+	call	TFT_divemask_color
+	STRCAT_PRINT "bar"						; can not use tbar because it has a leading space
+	bra		TFT_custview_exit3				; and return...
+
+
+	global	TFT_surface_tankdata
+TFT_surface_tankdata:
+	lfsr	FSR1,rx_buffer					; load base address of RX buffer
+;	bra		TFT_surface_tankdata_debug		; comment in for +++ debug version +++
+	WIN_SMALL surf_customtext_column,surf_customtext_row1
+	rcall	TFT_surface_tankdata_print
+	WIN_SMALL surf_customtext_column,surf_customtext_row2
+	rcall	TFT_surface_tankdata_print
+	WIN_SMALL surf_customtext_column,surf_customtext_row3
+	rcall	TFT_surface_tankdata_print
+	WIN_SMALL surf_customtext_column,surf_customtext_row4
+	rcall	TFT_surface_tankdata_print
+	WIN_SMALL surf_customtext_column,surf_customtext_row5
+	rcall	TFT_surface_tankdata_print
+	return
+
+TFT_surface_tankdata_print:					; max 12 char
+	call	TFT_standard_color
+	movff	POSTINC1,hi						; ID high (+0)
+	movff	POSTINC1,lo						; ID low  (+1)
+	tstfsz	hi								; ID high = 0 ?
+	bra		TFT_surface_tankdata_print_1	; NO  - slot in use
+	tstfsz	lo								; ID low  = 0?
+	bra		TFT_surface_tankdata_print_1	; NO  - slot in use
+	STRCAT_PRINT "----        "				; YES - mark as unused and clear rest of line from previous remains
+	movf	POSTINC1,W						;     - dummy read (+2) to advance index
+	movf	POSTINC1,W						;     - dummy read (+3) to advance index
+	movf	POSTINC1,W						;     - dummy read (+4) to advance index
+	bra		TFT_surface_tankdata_print_3
+TFT_surface_tankdata_print_1:
+	movf	hi,W							; copy ID high to WREG
+	output_hex								;                     2 chars
+	movf	lo,W							; copy ID low  to WREG
+	output_hex								;                     2 chars (4 in total)
+	movff	POSTINC1,hi						; pressure high (+2)
+	movff	POSTINC1,lo						; pressure low  (+3)
+	call	TFT_color_code_tank_pres_sac	; needed to clear the status flags before output
+	bsf		ignore_digit5					; no 0.1 bar (flag will be cleared by output_16)
+	output_16								;                     4 chars (8 in total)
+	PUTC	" "								;                     1 char  (9 in total)
+	movf	POSTINC1,W						; status (+4)
+	andlw	.7								; mask out battery voltage
+	bnz		TFT_surface_tankdata_2			; branch if battery is not completely drained
+	call	TFT_warnings_color				; output in red
+	STRCAT_PRINT "XXX"						; "XXX" for low
+	bra		TFT_surface_tankdata_print_3
+TFT_surface_tankdata_2:
+	addlw	.28								; add offset of 2.8 Volt
+	movff	WREG,lo							;
+	output_99								;                     2 chars (11 in total)
+	PUTC	" "								; dummy char          1 char  (12 in total)
+	movff	buffer+.10,buffer+.11			; move decimal digit of battery voltage one position to the right
+	movlw	"."								; decimal point
+	movff	WREG,buffer+.10					; place it before decimal digit
+	STRCAT_PRINT ""							; print buffer to screen
+TFT_surface_tankdata_print_3:
+	movf	POSTINC1,W						; dummy read (+5) to advance index
+	return
+
+
+; TFT_surface_tankdata_debug:					; surface custom view debug output
+	; call	TFT_standard_color
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*0
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*1
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*2
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*3
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*4
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*5
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*6
+	; rcall	TFT_surface_tankdata_debug_print
+	; WIN_TINY surf_customtext_column,surf_customtext_row1+.14*7
+	; rcall	TFT_surface_tankdata_debug_print
+	; return
+
+; TFT_surface_tankdata_debug_print:
+	; movff	POSTINC1,hi					; ID high (+0)
+	; movff	POSTINC1,lo					; ID low  (+1)
+	; output_16
+	; PUTC	","
+	; movff	POSTINC1,hi					; pressure high (+2)
+	; movff	POSTINC1,lo					; pressure low  (+3)
+	; call	TFT_color_code_tank_pres_sac; needed to clear the status flags before output
+	; output_16
+	; PUTC	","
+	; movff	POSTINC1,lo					; status (+4)
+	; output_8
+	; PUTC	","
+	; movff	POSTINC1,lo					; date (+5)
+	; output_8
+	; STRCAT_PRINT ""
+	; return
+
+ ENDIF
+
+;=============================================================================    
 
 	global	adjust_depth_with_salinity
 	global	adjust_depth_with_salinity_log
 adjust_depth_with_salinity:			; computes salinity setting into lo:hi [mbar]
-	btfsc	simulatormode_active	; Do not apply salinity in simulator mode
+	btfsc	simulatormode_active	; do not apply salinity in simulator mode
 	return
 	movff	opt_salinity,WREG		; 0-5%
 adjust_depth_with_salinity_log:		; computes salinity setting (FROM WREG!) into lo:hi [mbar]
@@ -4384,30 +4960,30 @@
 	movwf	up
 
 	movlw	d'105'					; 105% ?
-	cpfslt	up						; Salinity higher limit
-	return							; Out of limit, do not adjust lo:hi
+	cpfslt	up						; salinity upper limit
+	return							; out of limit, do not adjust lo:hi
 	movlw	d'99'					; 99% ?
-	cpfsgt	up						; Salinity lower limit
-	return							; Out of limit, do not adjust lo:hi
+	cpfsgt	up						; salinity lower limit
+	return							; out of limit, do not adjust lo:hi
 
 	movff	lo,xA+0
 	movff	hi,xA+1
 
-	movlw	d'102'					; 0,98bar/10m
+	movlw	d'102'					; 0.98 bar / 10 meter
 	movwf	xB+0
 	clrf	xB+1
-	call	mult16x16				; xA*xB=xC (lo:hi * 100)
-	movff	up,xB+0					; Salinity
+	call	mult16x16				; xC:4 = xA:2 * xB:2
+	movff	up,xB+0					; salinity
 	clrf	xB+1
-	call	div32x16				; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+	call	div32x16				; xC:4 = xC:4 / xB:2 with xA as remainder
 	movff	xC+0,lo
-	movff	xC+1,hi					; restore lo and hi with updated value
+	movff	xC+1,hi					; copy corrected values back to lo and hi
 	return
 
 ;=============================================================================
 
-	global	convert_mbar_to_feet	; convert value in lo:hi from mbar to feet
-convert_mbar_to_feet:				; convert value in lo:hi from mbar to feet
+	global	convert_mbar_to_feet
+convert_mbar_to_feet:				; convert value in hi:lo from mbar to feet
 	movff	lo,xA+0
 	movff	hi,xA+1
 
@@ -4438,8 +5014,8 @@
 
 ;=============================================================================	
 
-	global	convert_celsius_to_fahrenheit	; convert value in lo:hi from celsius to fahrenheit
-convert_celsius_to_fahrenheit:		; convert value in lo:hi from celsius to fahrenheit
+	global	convert_celsius_to_fahrenheit	; convert value in lo:hi from Celsius to Fahrenheit
+convert_celsius_to_fahrenheit:		; convert value in lo:hi from Celsius to Fahrenheit
 	movff	lo,xA+0					; temperature in 1/10 of °C
 	movff	hi,xA+1
 	
--- a/src/tft_outputs.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/tft_outputs.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File tft_outputs.inc							REFACTORED VERSION	V2.97
+;   File tft_outputs.inc							REFACTORED VERSION V2.99e
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -8,43 +8,48 @@
 ; HISTORY
 ;  2011-08-07 : [mH] moving from OSTC code
 
-; Surface mode
+; Surface Mode
 	extern	TFT_surface_lastdive
-	extern	TFT_show_OC_startgas_surface		; Show first gas and "OSTC2-like" active gases
-	extern	TFT_serial
+	extern	TFT_show_OC_startgas_surface		; show first gas and "OSTC2-like" active gases
 	extern	TFT_clock
 	extern	TFT_date
 	extern	TFT_desaturation_time
 	extern	TFT_nofly_time
 	extern	TFT_gaslist_surfmode
 	extern	TFT_dillist_surfmode
-	extern	TFT_splist_surfmode					; Show Setpoint list
+	extern	TFT_splist_surfmode					; show setpoint list
 	extern	TFT_temp_surfmode
 	extern	TFT_update_batt_voltage
 	extern	TFT_display_decotype_surface
-	extern	TFT_display_decotype_surface1		; Used from logbook!
+	extern	TFT_display_decotype_surface1		; used from logbook
 	extern	TFT_update_surf_press
-	extern	TFT_surface_sensor					; Update HUD data in surface mode
+	extern	TFT_surface_sensor					; update sensor data in surface mode
 	extern	TFT_sensor_surface_warning
-	extern	TFT_menu_calibrate					; Update mV data in menu
-	extern	TFT_custom_text						; The custom text
-	extern	TFT_surface_tissues					; Show Tissue diagram in surface mode
-	extern	TFT_surface_decosettings			; Show all deco settings
-	extern	TFT_cat_serial						; Add serial to current string
-	extern	TFT_cat_firmware					; Add firmware version to current string
+	extern	TFT_menu_calibrate					; update mV data in menu
+	extern	TFT_custom_text						; the custom text
+	extern	TFT_surface_tissues					; show tissue diagram in surface mode
+	extern	TFT_surface_decosettings			; show all deco settings
+	extern	TFT_cat_serial						; add serial           to current string
+	extern	TFT_cat_firmware					; add firmware version to current string
+	extern	TFT_cat_beta_rel					; add beta/rel.        to current string
+	extern	TFT_cat_beta_release				; add beta/release     to current string
+	extern	TFT_surf_set_bearing
 
 ; Menu
 	extern	TFT_LogOffset_Logtitle
-	extern	TFT_show_color_schemes				; Yes, update the color schemes
+	extern	TFT_show_color_schemes				; update the color schemes
+	extern	TFT_show_time_date_menu
 
-; Dive mode
+; Dive Mode
 	extern	TFT_display_cns
 	extern	TFT_divemins
 	extern	TFT_depth
+	extern	TFT_max_depth
 	extern	TFT_temp_divemode
-	extern	TFT_max_depth
-	extern	TFT_active_gas_divemode
+	extern	TFT_active_gas_divemode				; active gas and setpoint
 	extern	TFT_divemode_mask
+	extern	TFT_draw_gassep_line				; draw the gas separator grid line in spec mode only
+	extern	TFT_divemode_menu_cursor			; the divemode cursor
 	extern	TFT_display_ndl_mask
 	extern	TFT_display_tts
 	extern	TFT_display_ndl
@@ -55,79 +60,110 @@
 	extern	TFT_display_velocity
 	extern	TFT_display_deko
 	extern	TFT_mask_ppo2
-	extern	TFT_display_ppo2
+	extern	TFT_display_ppo2_warning
 	extern	TFT_update_batt_percent_divemode
 	extern	TFT_display_apnoe_descent
 	extern	TFT_apnoe_clear_surface
 	extern	TFT_display_apnoe_surface
 	extern	TFT_display_apnoe_last_max
 	extern	TFT_display_ftts
+	extern	TFT_clear_divemode_menu				; clear the divemode menu
 	extern	TFT_clear_warning_text
 	extern	TFT_clear_warning_text_2nd_row
 	extern	TFT_warning_gf
-	extern	TFT_update_ppo2_sensors				; Update Sensor data
-	extern	TFT_hud_mask						; The HUD mask
-	extern	TFT_mask_avr_stopwatch				; Show mask for average depth and stopwatch
-	extern	TFT_update_avr_stopwatch			; Update average depth and stopwatch
-	extern	TFT_decoplan						; Decoplan
-	extern	TFT_clear_divemode_menu				; Clear the divemode menu
-	extern	TFT_draw_gassep_line				; Draw the gas separator grid line in spec mode only
-	extern	TFT_divemode_menu_cursor			; the divemode cursor
-	extern	TFT_battinfo_tissues_clock_mask		; Setup Mask
-	extern	TFT_battinfo_tissues_clock			; Show EAD/END, Tissues and clock
-	extern	TFT_gf_mask							; Setup Mask
-	extern	TFT_gf_mask_cGF						; Setup Mask - current GF only
-	extern	TFT_gf_info							; Show GF informations
-	extern	TFT_warning_agf						; Show a warning if aGF is selected
-	extern	TFT_divetimeout						; Show timeout counter
-	extern	TFT_show_safety_stop				; Show the safety stop
-	extern	TFT_clear_decoarea					; Cleanup deco area on screen
-	extern	TFT_ceiling_mask					; The ceiling mask
-	extern	TFT_ceiling							; Ceiling
-	extern	TFT_clear_safety_stop				; Clear safety stop
-	extern	TFT_warning_fallback				; Show fallback warning
-	extern	TFT_sensor_check_mask				; Show ppO2 of O2 and Diluent mask
-	extern	TFT_sensor_check					; Show ppO2 of O2 and Diluent
-	extern	TFT_ppo2_ead_end_cns_mask			; Show ppO2, END/EAD and CNS mask
-	extern	TFT_ppo2_ead_end_cns				; Show ppO2, END/EAD and CNS
-	extern	TFT_pscr_info_mask					; Show ppO2, drop and lung ratio mask
-	extern	TFT_pscr_info						; Show ppO2, drop and lung ratio
-	extern	TFT_gas_needs_mask
-	extern	TFT_gas_needs
+	extern	TFT_warning_agf						; show a warning if aGF is selected
+	extern	TFT_divetimeout						; show timeout counter
+	extern	TFT_show_safety_stop				; show the safety stop
+	extern	TFT_clear_decoarea					; cleanup deco area on screen
+	extern	TFT_clear_safety_stop				; clear safety stop
+	extern	TFT_warning_fallback				; show fallback warning
 	extern	TFT_warning_gas_needs_warn
 	extern	TFT_warning_gas_needs_att
+	extern	TFT_advice_gas_change
 	extern	TFT_warning_sensor_disagree
 	extern	TFT_warning_IBCD
-	extern	TFT_CNS_mask
-	extern	TFT_CNS
+	extern	TFT_warning_no_BO_gas
 	extern	TFT_display_eod_cns
 	extern	TFT_warning_mbubbles
 	extern	TFT_warning_outside
-	extern	TFT_display_pure_ppo2
 	extern	TFT_info_deco
-	extern	TFT_show_mode_divemode
+
+; Divemode Custom Views
+	extern	TFT_avr_stopwatch_mask				; mask for average depth and stopwatch
+	extern	TFT_avr_stopwatch					; data for average depth and stopwatch
+	extern	TFT_ppo2_sensors_mask				; mask for ppO2 sensors
+	extern	TFT_ppo2_sensors					; data for ppO2 sensors
+	extern	TFT_sensor_check_mask				; mask for sensor check
+	extern	TFT_sensor_check					; data for sensor check
+	extern	TFT_pscr_info_mask					; mask for pSCR info
+	extern	TFT_pscr_info						; data for pSCR info
+	extern	TFT_gas_needs_ascent_mask			; mask for gas needs ascent
+	extern	TFT_gas_needs_ascent				; data for gas needs ascent
+	extern	TFT_decoplan_mask					; mask for deco plan
+	extern	TFT_decoplan						; data for deco plan
+	extern	TFT_ceiling_GF_tissue_mask			; mask for ceiling, current GF and tissues
+	extern	TFT_ceiling_GF_tissue				; data for ceiling, current GF and tissues
+	extern	TFT_CNS_mask						; mask for CNS values
+	extern	TFT_CNS								; data for CNS values
+	extern	TFT_ppo2_ead_end_cns_mask			; mask for ppO2, END/EAD and CNS
+	extern	TFT_ppo2_ead_end_cns				; data for ppO2, END/EAD and CNS
+	extern	TFT_gf_factors_mask					; mask for GF factors
+	extern	TFT_gf_factors						; data for GF factors
+	extern	TFT_clock_batt_surfpress_mask		; mask for clock, battery and surface pressure
+	extern	TFT_clock_batt_surfpress			; data for clock, battery and surface pressure
+
+
+; Surface Custom Views
+	extern	TFT_sensor_mV
 
 ; Misc
 	extern	TFT_standard_color
 	extern	TFT_disabled_color
+	extern	TFT_memo_color
+	extern	TFT_advice_color
 	extern	TFT_attention_color
 	extern	TFT_warnings_color
 	extern	TFT_divemask_color
+
+	extern	TFT_color_code_gas
+	extern	TFT_color_code_gaslist
+	extern	TFT_color_code_cns
+	extern	TFT_color_code_tank_pres_sac
+
 	extern	adjust_depth_with_salinity			; computes salinity setting into lo:hi [mbar]
 	extern	adjust_depth_with_salinity_log		; computes salinity setting (FROM WREG!) into lo:hi [mbar]
 	extern	TFT_convert_date_short
 	extern	TFT_convert_signed_16bit
 	extern	TFT_convert_date
-	extern	TFT_debug_output
-	extern	TFT_show_time_date_menu
 	extern	convert_mbar_to_feet				; convert value in lo:hi from mbar to feet
 	extern	convert_celsius_to_fahrenheit		; convert value in lo:hi from celsius to fahrenheit
-	extern	TFT_color_code_gas
-	extern	TFT_color_code_gaslist
-	extern	TFT_color_code_cns
 
-; Alt dive mode (aka Blind mode)
+	extern	TFT_display_pure_ppo2				; helper function
+	extern	TFT_debug_output
+
+
+; Alternative Dive Mode (aka Blind Mode)
 	extern	TFT_divemins_alternative
 	extern	TFT_divemode_mask_alternative
 	extern	TFT_max_depth_alternative
-	extern	TFT_big_deco_alt					; The big deco
+	extern	TFT_big_deco_alt					; the big deco
+
+
+ IFDEF _rx_functions
+	extern	TFT_pressures_SAC_mask				; mask for pressures and SAC
+	extern	TFT_pressures_SAC					; data for pressures and SAC
+	extern	TFT_menu_tank_pres					; update tank data when in tank setup menu
+	extern	TFT_surface_tank_pres				; update tank data when in surface mode
+	extern	TFT_surface_tankdata				; show the tank pressure data in surface customview
+	extern	TFT_attention_transmitter			; show attention for transmitter
+	extern	TFT_attention_pres_reading			; show attention for pressure reading
+	extern	TFT_warning_pres_reading			; show warning   for pressure reading
+	extern	TFT_attention_sac					; show attention for SAC
+	extern	TFT_advice_switch
+ ENDIF
+
+ IFDEF _cave_mode
+	extern	TFT_info_cave_mode					; show info    that in cave mode
+	extern	TFT_info_dive_turned				; show info    that dive is turned
+	extern	TFT_warn_cave_shutdown				; show warning that cave mode has shut down
+ ENDIF
\ No newline at end of file
--- a/src/varargs.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/varargs.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -10,54 +10,54 @@
 ;  2011-05-27 : [jDG] Creation.
 ;
 
-VARARGS_BEGIN   macro
-        movff   TOSL, TBLPTRL
-        movff   TOSH, TBLPTRH
-        movff   TOSU, TBLPTRU
-        endm
+VARARGS_BEGIN macro
+	movff	TOSL, TBLPTRL
+	movff	TOSH, TBLPTRH
+	movff	TOSU, TBLPTRU
+	endm
 
-VARARGS_GET8    macro   register
-        tblrd*+
-        movff   TABLAT, register
-        endm
+VARARGS_GET8 macro register
+	tblrd*+
+	movff	TABLAT, register
+	endm
 
-VARARGS_GET16   macro   register
-        tblrd*+
-        movff   TABLAT, register+0
-        tblrd*+
-        movff   TABLAT, register+1
-        endm
+VARARGS_GET16 macro register
+	tblrd*+
+	movff	TABLAT, register+0
+	tblrd*+
+	movff	TABLAT, register+1
+	endm
 
-VARARGS_GET24   macro   register
-        tblrd*+
-        movff   TABLAT, register+0
-        tblrd*+
-        movff   TABLAT, register+1
-        tblrd*+
-        movff   TABLAT, register+2
-        endm
+VARARGS_GET24 macro register
+	tblrd*+
+	movff	TABLAT, register+0
+	tblrd*+
+	movff	TABLAT, register+1
+	tblrd*+
+	movff	TABLAT, register+2
+	endm
 
-VARARGS_ALIGN   macro
-        local   no_tblptr_align
+VARARGS_ALIGN macro
+	local	no_tblptr_align
 
-        btfss   TBLPTRL,0
-        bra     no_tblptr_align
-        incf    TBLPTRL
-        movlw   0
-        addwfc  TBLPTRH
-        addwfc  TBLPTRU
+	btfss	TBLPTRL,0
+	bra		no_tblptr_align
+	incf	TBLPTRL
+	movlw	0
+	addwfc	TBLPTRH
+	addwfc	TBLPTRU
 no_tblptr_align:
-        endm
+	endm
 
 VARARGS_END macro
-        ; Compute string length (modulo 256):
-        movf    TOSL,W
-        subwf   TBLPTRL,W
-        
-		; Then 24bit add to return address
-		addwf	TOSL,F
-		movlw	0			            ; Clear WREG, but keep carry
-		addwfc	TOSH,F
-		addwfc	TOSU,F
-		endm
+	; compute string length (modulo 256):
+	movf	TOSL,W
+	subwf	TBLPTRL,W
 
+	; then 24 bit add to return address
+	addwf	TOSL,F
+	movlw	0			; clear WREG, but keep carry
+	addwfc	TOSH,F
+	addwfc	TOSU,F
+	endm
+
--- a/src/wait.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/wait.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,19 +1,32 @@
 ;=============================================================================
 ;
-;   File wait.asm														V2.98
+;   File wait.asm														V2.98c
 ;
 ;   Wait routines
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
 ; HISTORY
-;   2004-01-31 : [chsw] Initial version.
-;   2007-05-11 : Updated (OSTC code).
-;   2011-10-18 : [mH] Timings tested with oscilloscope
+;   2004-01-31 : [chsw] initial version
+;   2007-05-11 : updated (OSTC code)
+;   2011-10-18 : [mH] timings tested with oscilloscope
 
 #include "hwos.inc"
 
-basic	CODE
+wait		CODE
+
+
+; ==========================================================
+; WAIT 1 second (Warning: Do not use for time critical routines. Can be between 0 and 1 sec!)
+; ==========================================================
+	global	wait_1s
+wait_1s:
+	; Wait until "next second" flag is set
+	bcf		onesecupdate
+	btfss	onesecupdate
+	bra		$-2
+	return
+
 
 ; =============================================================================
 ; WAIT 1 MILLISECOND   (Not exact: 1,008ms +/- 30,5µs + worst case ISR latency)
@@ -24,12 +37,12 @@
 	movwf	wait_counter
 WAITMSX2:
 	setf	TMR5H
-	movlw	.255-.32 			;32 x 31,5µs = 1,008ms
+	movlw	.255-.32 			; 32 x 31,5µs = 1,008ms
 	movwf	TMR5L
-	bcf		PIR5,TMR5IF			; Clear flag
+	bcf		PIR5,TMR5IF			; clear flag
 WAITMSX3:
 	btfss	PIR5,TMR5IF
-	bra		WAITMSX3			; Wait loop
+	bra		WAITMSX3			; wait loop
 	decfsz	wait_counter,F
 	bra		WAITMSX2
 	return
--- a/src/wait.inc	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/wait.inc	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File wait.asm														V2.98
+;   File wait.asm														V2.98b
 ;
 ;   Wait routines
 ;
@@ -23,5 +23,5 @@
 ; asm routines in hwos.asm
 	extern	speed_eco			; SPEED_ECO: 4MHz
 	extern	speed_normal		; SPEED_NORMAL: 16MHz
-	extern	speed_fastest		; SPEED_FASTEST: 64MHz 
-
+	extern	speed_fastest		; SPEED_FASTEST: 64MHz
+	extern	wait_1s
--- a/tools/dev_ostc3_firmware.hex	Thu Oct 11 21:06:29 2018 +0200
+++ b/tools/dev_ostc3_firmware.hex	Thu Nov 22 19:47:26 2018 +0100
@@ -1,7682 +1,7682 @@
-:000000b65a07c8e1fae666cff9eb4e0e01c409
-:000010b2ebb643d1315570d3068294edae4107
-:0000204e410e0a399ff229a07b31df43db1ab8
-:0000303dd62c0d3b1ebe4889f06b9be77353d9
-:000040ce29b7dce7790c614d6eed4138a975e1
-:000050db8dbcc842f70058134aa06dabd61d66
-:0000609a8bb87ae59e6449fad272a8e6559ee9
-:000070dc6f84b104e37fe5bbdd82ffcc4d48ff
-:0000806aaac249bd895b8f17cddb738ac6f3bb
-:0000902cdc9ec30ae48b5fa929a519aea0cfc6
-:0000a096c0389250e1802dbe94664ad420bae0
-:0000b0368f199dd865319d17549f64b8e31c0a
-:0000c0b523b4a10b280d430c3918f4e364d398
-:0000d0fc2105fdbb9a4f4c6dc5dd9b7bf10857
-:0000e0cb75f11e452e3a626630720493aabfa0
-:0000f078ad7d64802538d2792dcbed0dd13557
-:0001006adf4fb9b80e5ceebb9779de0183ef63
-:000110089c213d3e7d844ab2af575301a3bd98
-:00012096dcec4880ae1f51688ddf03f26303ca
-:0001301147b5d0b730d1748efa17171d83c42c
-:000140e631e0a8e09cae05c4af2442756c0550
-:000150a382c0dd7257abf62e88b8731ce0970a
-:000160dc3bc34d66dc6273f82cb65e63efab9b
-:0001707883d879196aa1cb74798c513d7627b5
-:000180dbaeb7612de2716b941d22d0111732c8
-:0001902cef5c318cd1cf6863cf63f05cafba1b
-:0001a039e0156c435e0968964d59712f4e78a8
-:0001b0534e1472e61708cd97ab89332ad1e114
-:0001c03759a2f0a297e98c8b11b945a3b64bc3
-:0001d0179c1495f52b564f39caa689021e2d9b
-:0001e01616ab41b854ab7d7b9f18c39e5b12bf
-:0001f05a4e8eae2e2dcb8c3affa5ecb8f6cce1
-:0002009e7309783c8976700ee6f578c0ee43cf
-:00021064c2bb030bcdd26f40b6d03fa60655e0
-:000220d8485c18e322714eddc9a84e7af74281
-:000230aa19dafbe40b955254042db75e9d7733
-:000240d6397f228ed92d29f6f79060ff77015d
-:000250a8a3b107df9d957a9bac315b76d5f0ce
-:000260f6b4322a9f2a40fd8510a319dc5abec4
-:0002701f3f75b6c91e76e797650814df7681bd
-:000280ea3462a0162c8b22f5ba9e2ffce0209d
-:000290d8afde2a649d725a01f4635d8c4d9e60
-:0002a0525b4acc083aceca031d2d951a7fa1ae
-:0002b086b23348fc862ce4ddac454c798a8e74
-:0002c00f82282fa61cfe4c50a722c261e8e950
-:0002d07aefd7636072e7ee909d2fa1a64ad9e8
-:0002e0d342cb8a3b92c4fe2e8e398b1229aca7
-:0002f068207f730cecd6b9ecd5bea767adc1b9
-:0003008bda5153671a07724040229c12cbd1d3
-:000310a67a4cf674b7fa0e5b541adbd42020b1
-:0003202683bb279e70d127becf75fe3cd0a014
-:000330bc318161691ab20460414b33a009a993
-:000340b366781b4a056188f3e6024d206b9b41
-:0003504f03d29cb5e0581c95c9f10e611fef3f
-:00036016aa0a3c635003a43c91f8ec758d0c3e
-:000370c8ac434236d6e822b1600dd66ce6df5d
-:000380e7a37050f6f3c3cff38e3eaafd373581
-:0003901527f66dc5a7d9cbdd2257300109c6ff
-:0003a06c392b0d2347a2407b6d63e59a354753
-:0003b0c238f1eb1590ae4b8b69c07c2d878b6e
-:0003c07647dfb0a524e2236b4bf06747288f2c
-:0003d004f19f169adb79c4d32f8cb145e782c4
-:0003e028e6579ea3f5657508cb759cfca3a296
-:0003f09c1524b25bbefd72bcdbecbed8251ea5
-:00040007cded4540ca0534d0885446c50e70e3
-:0004104bfd7a63a3edd7082835c32f78b6b76e
-:00042033d763360532e4c4242cd5bfc3a4002e
-:000430824924da4015696ebe1c715fbef2e011
-:0004400d5708362b10d40bf911b9a4de6a8f34
-:000450339c8e9e3d22826ca6c49be25d3b21d5
-:00046013af3692683208ebe0f7af51a51bc584
-:000470c400d5922e59902e9573d778046ce493
-:000480d679e118b613bd372d39308528ec111b
-:000490afdbb6c033f23da4750034847197e5cb
-:0004a07c806bedbcba87e67717a5675a426c7f
-:0004b0f8027488c0acb57bfddcac4081eacee0
-:0004c0add387301b9b7415abec6bacde6c4aa9
-:0004d0c15272e0325ea649e934b2062c2f3acd
-:0004e0635b67c285a51a0d80bce24fc256aaf8
-:0004f017f6585f3b71ae9d45ac05535129647f
-:00050019ad520844816e95fd8cd3fa4dab7368
-:000510c0ab94974934550c12a93c1ef78cb38d
-:0005202128fb44ce5050335375f82f763aabaa
-:00053076bafda71d4f044c7819df2431929c91
-:0005405f3e013012b16e8af106711da6625c44
-:00055027d179b0b5653da215ebf35691fc25d1
-:0005603fab990d10f60fb91753ec2de2967fdc
-:0005709f14d0a96c1bfe6a2cc66c50e85f9034
-:00058004bdf33278ad0604051720398a0863a2
-:000590b2bf628619f16979e50bfc70cebeb35c
-:0005a0f359753b0b08b3a3f1cf22458ff92bbe
-:0005b087a00b1950b9f98061ae907bed45714e
-:0005c0a04885766db00b6f0fa74c7f08a82062
-:0005d0de472ade34585ca46e3c8b2b8361f6b4
-:0005e00e11e4751d81adcdcefe0b5d885fba37
-:0005f05d63b3d4d97212fbab64149bbe837302
-:000600dac24d8aaf70143c1a549c98c1394e4f
-:00061082fac172a3e1878b7541bf6e6fb44c9a
-:000620b536f515416c4e1ae73ed6d5025520c0
-:0006300bf9c6c4dfda019713aaa226812d4c7f
-:0006401090b97b0ee2b92174c7fb0c1ffdcfd5
-:0006501986303693ce7212c75f2979f5877e0c
-:000660a414da886c7070864dc90648155bb413
-:0006707bc01e9a78b5d83a32c7c068b5b888e4
-:000680c949efe4cdd5fbab95324473001a1bed
-:00069066dcb8ea3c775984b6b27a4fe4912441
-:0006a0f2824b9f9d522e0f13b71f47f34876b9
-:0006b0e22ae98a56b5252bd9aefbc9a3794e7c
-:0006c0e95fe21817bf55808760cabc6c02a2f1
-:0006d08a96907d49c70a64b986ba7817fa8ebd
-:0006e027db630ca50b69d930f0ec088a9fea75
-:0006f09c9e500085c92d411bab9b69ebb42b6a
-:000700db81b8d717a8e174d6de91583ccf2644
-:00071016c071813941fadf213d173b9b6cc3a7
-:00072026badc5e29f577a15eb9e3c18c0c4d08
-:000730774381d2b4c8ca74ecff2fce48430f7f
-:00074073c6249631fc57bb07150a3020dff8ee
-:0007502dda1ad2738c4d16e102647bfd726cb7
-:000760803f7507b355d17668c29450f09a3480
-:000770df79f6254ad9029869c59a2642fe8cc2
-:000780a8188487d251fdc51ddd58b4d8503cd0
-:000790237248618f88906b5ffad5d6a90b72f9
-:0007a0d77c5f6d48b1e933687e1be1b948e409
-:0007b02710e73c60892f8a61d028663fdbd75b
-:0007c03d509fd7f7b067982c0b647d4bd7dc3a
-:0007d0df507dd55fd93b381fa8cdd821e6790b
-:0007e030c571c902c49d98a4e9bfe6eac935d3
-:0007f00a43867726c67bdcb4b6af6ff9e1535a
-:0008003806c787d2dc8cc13a7c9923d1796133
-:00081050e54ac82a8f4f50cff18bace3c976b9
-:00082028c03666e945f9c0dfad82d8bc4971a3
-:000830a54f6fe31d12057cefb186cf62f1576b
-:000840df5225063c493a70420713c219000458
-:000850cbefd5eaea2abccb450bd05c2fbec8e3
-:0008601253eea6b6956ea7426dbeaf3a024807
-:000870deb5e1cf3b171cad36622657a5f8b58a
-:000880dbd0f9f73aece1cabda212b95cc9d8a2
-:00089049b5fb8a5fa71f03987c3f82566d1c49
-:0008a07a4619a04b2630bfc26055eddb77dea8
-:0008b075bf6691deb55f3ae21ad2c4dc12babc
-:0008c0ff9bb495fd27604adbd881f2df493768
-:0008d029b7c01a6b5425943e3e648527cdc7d4
-:0008e0cdee3fe247a115f2dc1c23500120808a
-:0008f0f8d54ec0a4e1868f6f6849f1d3b30ec4
-:000900b3e6c85b9c717f81243cb35fe1dde852
-:00091044cfd430fdb321799654a7c103bb2666
-:000920597f60e9d060d86545a74384044d6cc9
-:000930e32181ba395e8a6538c9d76e928506a7
-:0009409cf09a39468d23e71706bac8787ff27c
-:0009501e52e76d5b7aeef5775db66486b67a56
-:0009602a8f327592492d2f0a00ff87424a9927
-:00097074ba32339dc9790f5e5f73d5410a7049
-:000980b7ef8eff4ab1e2f2c4b87ab2f0ea9e8c
-:00099000b046855e74f69076faa9b38c70ac27
-:0009a08eb673be8a538076a1754d40817e05a6
-:0009b0ed2920dab15825cb8402a21cb87806d8
-:0009c07b389b4c639add2d009748ea4466ce3c
-:0009d007390ef6382e329d224ea17389de41c6
-:0009e038c4c84dc775d69258c3b4c8825c725f
-:0009f0f7cb8d16a142de33089c4f61da9f97bb
-:000a00d3991d4845e835edd39748b23daaffd2
-:000a106b84f1bdbb7ce452094d82c88ba55981
-:000a20a671f2032e4b968e2330f742d1ce700c
-:000a308def0ffcda643a4a95df15e8fb241ee6
-:000a40529f1f7635a6a5ac909581f6e9fa8a6a
-:000a50d2050a12abd052f7d4ec5eefd0ffc6dd
-:000a6061fc526e31b7088551f47d975ae4e5e7
-:000a703dffad093b2a0d53ae26ed7867117d3f
-:000a801a55e873943ec498abbc15c9db7745fd
-:000a900f61c1a9a3ac20af761431d4b0483842
-:000aa09b30eb743762862c71a3762920a88cc4
-:000ab06216ca15cdaed609c847ed6e9723f439
-:000ac0edeb14bfc204ac005f59115fe497e14e
-:000ad0f48ba9c3cadf32ef0eb261a72a75ec67
-:000ae0d0931655863475659537285d96f7c63a
-:000af02e3e96deb9d489c2fd2c9b43eee97379
-:000b00acd90824daa6766805ac92d909de4089
-:000b10622103cfd87efcdf9e728733aec0c598
-:000b209f65b5db94261f509ff65ce153ac6d88
-:000b3084cd23ada9504c1102b0aba2c7728dbc
-:000b40f822f2a77759fad48d2f05969701a4ce
-:000b5050e36d47b83723c48c1f01007b450d51
-:000b609faeb603e819d6d9134de4c5f49f0439
-:000b703c84db84406b7bfee26940d6af67f837
-:000b80d5835285299585fcbc387d0313fe3878
-:000b9013000d44920e3022dac6f14bf29d30ba
-:000ba027c562dca2ff556c5581241239c21b8d
-:000bb07eeee16592efacb82e7d703e0f68e345
-:000bc0e182d126ba3ac8b7aef374d371d8831c
-:000bd000cafaa6b9290b95296703cbe98d8339
-:000be07fc693396c34df008fcfa5b6a80da96a
-:000bf099a81eb0f64ec790abd3cbbe22505763
-:000c00a733e435c75310b1586b5ffd12832daa
-:000c1051a3fb47314620c3c92e57d0e9cd1f31
-:000c20acc39dfc72b59e33da9042f36c39fac4
-:000c301b8b62ec6fd5158f233db39fad631b52
-:000c405fbb56c59903c77fd2f345c4a8c527f2
-:000c507220858206bc4673c242c0d5332f451b
-:000c6029128225d2618b435388695fca886753
-:000c704a83cb5cae913baa935262dfacc9068d
-:000c80bfd27e7ec4db6b983bc43b2e29abf229
-:000c90003e75ac874bd30da6f8b63f42f3fee4
-:000ca07b868fad8a5d0a9b3ed52721c14e5f32
-:000cb008c0af21ca6240901adc7170c0f93f11
-:000cc0ababc73582fd5cc151112e67c5634462
-:000cd0a9f9bd7b2acd1f35758fecaae68c3be1
-:000ce0c3bad9fd4dd6c0ea1bcbfbd41f142685
-:000cf05282c7da6268c856aefde79e2ec8f350
-:000d00871e7e4a95c4440e3742cfb261974a5f
-:000d1070498d8fed4e825cf4facbd60fddc6c5
-:000d209e25d6f18fe5703b649d86be501cf92c
-:000d30c26ebe370451b0e0b170ef7df3612620
-:000d40af29265388773d5076148b89a58083a3
-:000d501007f44f124e58f2def6ca98bec876ea
-:000d60e67ba8c5544018d8c6d88175f10affd6
-:000d707e000e81c1d24cf8f4300266ad924934
-:000d8012918567248356e686f3da2d700fcb01
-:000d90f3159e0f019a4680d605ea750c5423e3
-:000da0a8f52041f81880f8fe0ef97c4474ce97
-:000db0d24711f07eaf42e51e0cc3530189f3e0
-:000dc0492f08fbc50daaf21b6a3babd231910d
-:000dd05ec2c6705a317ac4574d6962ebfe944c
-:000de0674bb35f2638e1e14daaca7c2903992d
-:000df0b870b39f16cc58f26dbd841baf17aea5
-:000e002fd1d9d9c0ebb1f0ec44334fad8bff8a
-:000e10b0832581223d5ff8eb4db85dd27b925f
-:000e2070d7d4eb88389438d576dd61afd9fc91
-:000e30aaf9015514bb0540875abb83e16312b0
-:000e409153ccc35a4cb851fa5b004ea3451fdf
-:000e508a8d82740efd121519844e25e70648ed
-:000e6018b5919051f8fa67e42c6bc4d0828269
-:000e704c970672a1689952f5b61c32dd6bfcb8
-:000e8015c4bf93f9384b60ee48049a3873e122
-:000e90253812181677bb44bb9779cb21fa043f
-:000ea07d3a22b7cb947f69f00ac5a4dfaeea45
-:000eb02c5fa9ea03dccebf9cc264f4adecfbfe
-:000ec01df56fc615e36774c843c7921dd93936
-:000ed0a5770411099f460a3d2f5222b8d0f429
-:000ee084a80f7b44c54f2d9a0e5e34aa913683
-:000ef033ffa82746815be3be7b3b29cda43867
-:000f001ba8d2b012f61139a25794506a4f6436
-:000f1013f8e692eefa079fbb89690bd1130750
-:000f20a22929beb4b6fa74e9fc9356c2738f46
-:000f30201a01793c6737fefbb1d09680b8e8a1
-:000f404b4a8e8acbc8ea9db434a9e3b27ac7a0
-:000f5037628198ccb0db1ba1c7d58c1eefd854
-:000f6065cf67791c7d28502362e4e26fdafc68
-:000f706133076700d939ccb996e2c1df260024
-:000f80244e82f1f396bf85a8ef5cd8e4ba84ce
-:000f9051f293bd3ac2910a42270441b2ca837b
-:000fa005399ffba2a2e4af176731d333fb3f7d
-:000fb0f71828e42b1a071befd1b2a9281946a1
-:000fc06678e778cbf84f51b1a96f803006c290
-:000fd0767c77ffc0afc9162eae99d4ab209474
-:000fe0001bad3fddbdb01bd42a67663c7d3bd7
-:000ff02b3cfb9af722fccd3e94d08f80bc6688
-:001000ddd9da2b2b9f4fb962fedba4147099de
-:001010dc2108da166dba279dcadbcaf8aef93d
-:00102076fc2299545f4e110796be0b74c7d570
-:001030445c6ba5b30850325bafa6259d64b632
-:001040aba2010dcf748b201b64cfc984a4fe6f
-:001050c0d7032050ec9f367aed57ea6810cc7e
-:001060f41adfac48a39a1ed547f68870ed2523
-:00107060321cd44c5258ecdaad87b4a4749814
-:001080eaa41784875e34d384ad1b0ca09a9f51
-:0010907a2e87ec9a53dd1b8789ea879a030e20
-:0010a07a195c0f8633bff251fbfa089f07f5f0
-:0010b025e24654680de7ece2c53315ea218812
-:0010c03fc2830c65e956250c339f5c72cad937
-:0010d0b329b96708028d9def12b87ce1ac7459
-:0010e09e2f7afb96795ec14a59be8ac7935d20
-:0010f079c9d5ddeefcbb4e0dd73a7de6699bc0
-:0011005da59ee7727faf060199ff60fe226278
-:001110a445473a8479a50f4648804927a74191
-:0011203008ef754f5d881f9e76cc365a4666d2
-:001130114c08308734c61710660901a30b5c62
-:0011402ceaebf26230afc278369c807c72652c
-:001150bfd20da5d787d68ee7706c1c9f1e869b
-:001160cc8e4d82d0f3fbb4734e891a7c288679
-:00117014836e5bdaaec9e618f559325a7c6d10
-:0011800fc46a179cf398ab083020f41effc213
-:001190aed2bb0b749e15b25204a84c811d293e
-:0011a065ad7e0332035f9a23451df6ebb8c42f
-:0011b059a150ea7fdfd1535449bd0b90e5e517
-:0011c0043ef681854209451f189f407c449ee9
-:0011d05748cda8a0107b22b9e6685856b5bf29
-:0011e0d32689720646dbe1dfff7dec346c81d2
-:0011f0ba7b7585d07d38e7c66463a01b8e6509
-:00120095273bbd7e2e682acd2960643d44d7f0
-:0012101abba1376da51f5b97c2ee278ab54410
-:0012208036892a853608d468d329635b737bd9
-:0012305177cabab77874d8b63c7943af314b0f
-:001240e53ef3ca5b302677badf0ae21dfe018e
-:0012500d64f8f2b6ed9ae07fe64c7ddac07983
-:00126087a8eac7250cfaa2b6e4b510c2c482f1
-:001270317405c7f4556357ecca53f28618b4d3
-:0012806b2c6da2bf20aa2df0a235b3f7ce0172
-:001290ea4108141d708d9c1865e71db5986d2f
-:0012a098e80bfdccea526995f56b02fb622722
-:0012b0f5133a67f0b950f52a3f1a3f8b612ca8
-:0012c0e162ad898cc955e890de2abd36506b51
-:0012d0f60dc519667f021c552dab28730abf98
-:0012e03d0002271d2075dffb0f1c3128805605
-:0012f0c2b230c3f28438f40ed7b6c44330c790
-:0013003b5dd9842eab9560bba065d86a9d875d
-:001310db00bb02919a972e7489cebdd73613fa
-:0013208470167129c8f3b90057a07a7259ceca
-:001330eba00ef5a728bb14c64d263474f96fc7
-:001340ad617fc9652593e644ee73b3b10ede0a
-:00135056f683da6968f5beeb4d881b2b414210
-:001360ffad1f997dbbf29f45e100bdc7fc8b20
-:0013700c39938f198f788222cc07633216cccd
-:00138020b163bf08cc07f26704003b104b7ac0
-:001390aaa60f89405d4ccf49fdfcce45eb5af7
-:0013a067a0a44675efb22a35c27d543849b99d
-:0013b02000da6cdbb3fe35eb06d6617b3610ca
-:0013c065412aa37e71c545574793bc631caa38
-:0013d0f429920fb0647902f81fd84f9705ccee
-:0013e0a89de6ded843ed70e35bf333fd0b81e7
-:0013f0bc142a1c4d062b3024859adb0d3d4ced
-:001400b81cb6cd383227addc2516ea16b5960a
-:001410abc91be71c32202e02b328b22bcd6dad
-:001420a59829b41ad45da211f842779d08ebc1
-:001430bf8838329e5fad335738678771c3da3c
-:001440b76c51987e6b710f375e21a4ed452cfb
-:001450c72659736f33271107d491896bff3fc4
-:001460bd9bb87222155b927502f86d10cb6f11
-:0014704655228d99e2e75d5bd78a1efdb9e917
-:0014807fd7fdac8e5e9cc9b9584f37c4600ad0
-:001490d31cae200b6a80f912b06c71bff95536
-:0014a01c1100601f7dc3a09ecbd76381424235
-:0014b0db418943b4d86e6d5b5517e17041d5e1
-:0014c0863c2d9acb7330ccee0f032488a77d0e
-:0014d0d72498d6d7131651a160909353d3619e
-:0014e0c3477b5bd168fdb557d6da043be6c95f
-:0014f0f7ecf0929ee3887e9fc20e3da049f1fe
-:001500606edb30979e157c705aa40fb2ac61aa
-:0015106c6212e66b4d344236e800fd17a8c8d2
-:001520c01a976d8af7fa96f41c6d56f81a5017
-:0015300a085a5903b6aea594a6e152d7a0ad1f
-:00154058b25230858ee3eb64f3cc2dc3bcd5a9
-:0015505093dea446e6a1479f845e116b4d8b06
-:001560d168eb7576be8591ca32ca14ed88293b
-:001570277f3d5a28ac28600b5813ba32ddceb5
-:001580a112e35b808b3e3e31109c98a2686715
-:0015900ad040f0637ea5498eadec4fd290bfeb
-:0015a0180ff8df351ecb366a917a830dc73c57
-:0015b0ac8e934211ae4686d007544970312bb2
-:0015c009280202786ba8bcfc3df1766ab0253d
-:0015d05ae7a89504efe8e38f88d084653d79f1
-:0015e0dbcae274b0de7102ae280088cf67fc6c
-:0015f091be0db2ebcca12ae3aa295e2f77a744
-:001600103f9110a18c333f7e15bac5c43ad922
-:0016100feec161419103cfaabad3addf2de5ae
-:001620cce088cc38ffdf87e245434729246201
-:001630d16d0278c0d208997eb5cc663026a914
-:001640551bcf55ff2790723d2c74906aea7cea
-:001650030e39543f6678a54f2e30934dc14c37
-:0016602fe62377270f7c6d1e94e9ff6ea51bd9
-:00167083077f244c86c0e6a87831c77672a7fa
-:001680486059cda51e4c1201ac38d2c423cb79
-:001690fa97654e4357787b3cbe0ed21416113a
-:0016a0b14592231284e771bbe8391de358c1f2
-:0016b09d3b089b546cf3c0940de0293e937f62
-:0016c0c3947714e8f90b9369a3f56c3d0816e3
-:0016d0706b0a164157486c0e2971fabf856820
-:0016e050fb54e6f0275297cc57ac17a9b73e7f
-:0016f00cbd77b11ffdf22716d3df7feb9dd347
-:001700e994af4867c580e7dd54eeeccd788edc
-:001710d3e2208b659f8b4f9f308c803a0b517f
-:0017206bb1094f6b324b930f4a2177fc9e0c8d
-:001730564a1a3a0f7aa149ef955c942027974a
-:00174047053ba1fce8dde7a10d6af0427bb640
-:00175087c0e541eaf0af02a30a095e7a066298
-:00176006aff710199bbaad7555de9dece63a48
-:001770c3fe26c2810f495602279af7018672d0
-:0017806deb2ee53aef529ba2ec86989be27c5f
-:001790cc8cdab92c1ab3234fc7eb70b9117094
-:0017a0d1fb444a7eb36e0f6ef63eeb8027dd24
-:0017b0c741b28c911d3bde311bae3c6b688b8d
-:0017c0845557f50edf9dccef2055abc1e98797
-:0017d0958df83dfb055d2dfdc7f2bc729b20bd
-:0017e0fdb4793ee521fbaf5748b170075281f9
-:0017f0b01687885e437155a598748544dee8b3
-:0018004354dfaa352580790a5e418649551000
-:0018107b0e363a44a1426dcb6b64737e770272
-:0018200ead1267f43980f21d809bc3777ebfed
-:001830b1ce433465ed075967a0fbb2adcb18bf
-:0018404a83bd647e7e5fe50f4a391d296370b9
-:0018500526c05a7f105aa54b7248520e416192
-:00186017ef8a2f91c545b72ff1891aa52e28b1
-:001870e1404ffacd6dfd11d9e8d049ed5fb22d
-:0018807237e4b1417b094587eda3811051bc69
-:001890ab0d94777a3b7c4001205e87c34353cc
-:0018a05bfe7d37246b9b12638d3f81a84b2e71
-:0018b09affb2e4e16773532e2e5618ace89152
-:0018c0ba01bc6e68f099a60f28819f7998414c
-:0018d0bf0956ff075cbc807ae2f921e1d79147
-:0018e0acf87753ec8145e5359f74cc67b7b593
-:0018f0d242675a68d84efa5b321028c54694aa
-:0019009eb3d994c50e27a68e22957a24500013
-:001910f9af1884b5838e4e0508ddcefcd1994e
-:001920dea85d0bceb7d6b83277518ab18e0c25
-:001930f7dcec1b2815ccf26c4dc0185b3c1bb1
-:00194057ae6e6ea9e4cebedc36cc6df8f78364
-:00195075e0b1e16bf53fd9c0aa8897ee016a3b
-:0019602b1b2ce225f7cb23d728b4b2f8ae6877
-:0019709389d02c1afc33448246ab2947775cd7
-:00198068ad308af38a13640eba7b043c61df5a
-:00199052c982bfab4c4ccdbfc01c4997188081
-:0019a09941b6bafe2a0b9c7ea8dfa5c5abec38
-:0019b0d9954c5112f5e1d5b51946a52ab92b83
-:0019c0e12857de503425959a9d7bfd2d2fdc9d
-:0019d0a7dd6c4597c0ae330dc594a7f144f361
-:0019e0614eba6a2f4d6486d626d92f45a2b1d2
-:0019f0a6ba9189c3f9579b315f53655f2cf448
-:001a00fa3fe729b2309fb970bf4375584ee982
-:001a10a295ed4d5a45267ef563e4c8398a0c0d
-:001a205bf234d14ff10f6461b1ab4f89ce1027
-:001a303baf6b0976463600e4642e20a498b13a
-:001a400c413b3f66d6488e8dcd2b6eaf24502c
-:001a5064f5736afc5f40ad79f7c36be12e1732
-:001a60cfaae3964c4a0803804b4a426f52b427
-:001a7062d397d233554ab5353bb720fffd9d2a
-:001a80bed2784e2b7862ba79762beba79c3426
-:001a90460c8a571281eabc6ff6fb86d8e8a78f
-:001aa0b86bc8d687249965fdc2bef1fafb8dfd
-:001ab03b57e1baac50b25bdd54c21e72dfc05f
-:001ac01a651c65d61b8e7870b56ee8fb443431
-:001ad0fd1b68cd25fada9ea7ef591e7610d2a1
-:001ae0361c7e6c744bce0b4565b712d358d11b
-:001af0ff10b0e04614ca1a593aef3675c4636a
-:001b00f17e369351560dbc2e0af7abb1cadd83
-:001b1057344467c96ddd30ba90fc08fa197327
-:001b2001693eab328b2279ef5327c645fb6474
-:001b30263e5a90187045a887fb10670868f9dc
-:001b401b1419f24bd3f604614501ca27f7de3b
-:001b50aa442c1e66ff9ad7512d3ba63552e42a
-:001b600e1aa53d935e4bcedaa25c8d5187c508
-:001b70c2c9ed5b69004ed7a6aa111dc5fe206e
-:001b805f2e09379e4dd343c913c6a7e47e1bc8
-:001b907c024a69d2a20e5eff38c6883be01448
-:001ba0398fa9415fd80919bf18f70e2af39b40
-:001bb0ddd0d596b1be95b4c8ef39baace28584
-:001bc0c45093828fe84fd5ff826f3c7b538c14
-:001bd00d38e96b1a848bff0c082b74992a320f
-:001be0bfbc2f78cff901d1913d35f36ea7814e
-:001bf04ea83fa2ae909339e865aedb1e024c8e
-:001c00242cd95abf9a869c4c5654242cf68178
-:001c108e4b5a05ee88bb9e26938d875239e41d
-:001c207e978ab1471c8edddac06fce5b4368f7
-:001c30c3fa2df22efb2763ba53620900a979c9
-:001c4016e4e7b1185bf14ff5688d6fb14e0333
-:001c506a4471fd1a1f6ad62aacedd813604eb6
-:001c6083aeca184919564925aec34ca6d53532
-:001c7040311a85e8afa5a5a8bc19b0944b0bbb
-:001c80fdd7f5d749049d9b7730782c77c27b0a
-:001c90b21cb37d7d398ead74b31b9e792b4a2f
-:001ca01d484b307237b24ba1bb670230fb0cf2
-:001cb0749f6391964219f3ae5740b5ea84092a
-:001cc0838c2a20b0486245b77ba907c08eeace
-:001cd0c2e82d157c343f0f000e7873316dc468
-:001ce08fc8f17481c1b28b8c265af12a8455cd
-:001cf066a8d34d93e5666a79d0227c19825892
-:001d00a5e88ad731dec4a75c307aa37a5424be
-:001d10d73ffc2b800518fef0df3d6ecdafc65b
-:001d20598979df92a540062b5f6fd0229dd9e9
-:001d30094169cd993caa03128f3c3a944065ce
-:001d40ba571bb1a03cc4457f1c0b5863ee6f44
-:001d5054a35ec3aa7963ffddbe823d35e02bf3
-:001d60d2f2942846fcc7bb43328972e7c93624
-:001d700ea4dea4282d8d8a0f1e80d0d1790218
-:001d80416a48b6054abddfc5dd51696727703c
-:001d90f72fe139a9c9ba0edb13ccd16d45ee99
-:001da0e7ae89ff4eeae5b56126dfc68711c51b
-:001db076bc6e58ddd2d851fedf60f1567c71d1
-:001dc08437dcd1d2b9eee8381b1aa42b870e68
-:001dd0fdc1db69df6f5dd5d71944d34df8656a
-:001de02505bbdd6f66cebed24fb9ec792e750a
-:001df0887f3029ecfc061f302433c06dabdded
-:001e00593470d38c7c9561b1e676000ec7c30a
-:001e105b575060a31ab70235a0e2ece16cece3
-:001e20a19f849b391f305f6a1b13691dbd8767
-:001e30fb6ba3382a4c03838b5bab227e850d7e
-:001e40b9391825501e7df33d22ac33d447af98
-:001e50ff0ab7d77538a235b5600cd79734c314
-:001e60c9898e4acb45c0f4e0062b554f9bd25d
-:001e70fb105e7fa5eba146be21fc9ee2f00926
-:001e8077602103f021ae6556c79d3544812b47
-:001e90ffea4cc83d9ac4858714b81c3aa93eda
-:001ea0a25c204c0ca600ae8fb46193635ef842
-:001eb016058da2b553d932dc7d1c894a1a2cb9
-:001ec0f768440f293f7dc2ee020f3e0995fe4c
-:001ed04d2289fed062343c21a7763fbae08773
-:001ee047d23c2af53805a000c7169562c1c150
-:001ef044cd17cb49fbab2fa7637ad5d0e442c2
-:001f0075fef4815b8f5b33ba9ce3e59a082ab5
-:001f106765c4a45e3642d5614a61b60a6e2537
-:001f202201f89d3e084ad4258e7bcb2d522b28
-:001f30261f8b63d1d53f841bd0f0fcbde56817
-:001f40d5b1f04caf2d6e7512b98cb34e733aed
-:001f504d8bbf982facd9887bf2243fc8954a05
-:001f60186007682faffb9a54c5db20defa8b42
-:001f7049e7d96f50abb95849e722011ccabc0c
-:001f80c574539beeba47fc4066c37e0b7fe8d7
-:001f90d628fb32a262e05d302579d98dd97383
-:001fa0a2b16f0927205cfe162359103b56209d
-:001fb058e90afc1391f3ffdee07b9a05a619e0
-:001fc07ce875304e3e39597758fad195b1d7c2
-:001fd0e0c4b5446a603184e141e519487e0f5d
-:001fe01d427de9bacd3dbdc341004dea52205a
-:001ff0fc5783d90bdd25391d7a6a49a37eb71f
-:0020009898dec963e1ebc46becf280f6e353e9
-:0020104976db9e1e9789a23e2e7799ddc85cb0
-:002020715aafd7976143b62cac1889b5240060
-:002030bf8afc15c2f51d3b4d387b16b292d957
-:0020401c27465e38d0fcbae993c7e9de6f67b8
-:002050ac1802e232346c5cd006fc150b2b8c1a
-:002060ce59dfc8ee2d72ec5b469fb21dc29e7e
-:002070df994c43af481d9aa901f845b2eabb93
-:002080524b6b00b7e3785686b46d519e8e1108
-:00209031470a2e4ad538e6758fde8ff41274ef
-:0020a06f559aaaba7ec9e0298bf64917cef2f4
-:0020b019518c88fd9cb50c2a72dd44a6ffd0fa
-:0020c0e5f7a7c5f70858680dc98900c383af3c
-:0020d01ce39b95d173cdf03470b190bb9b2436
-:0020e0fc8e430da6b397cc3f96f73d37dd1997
-:0020f0abdc6aa60bd4d8757b240a06e4fd921e
-:002100fd27399dcf48b8a254b3c447e82368fb
-:0021100ef0eb0e6cbed274f44249f3dcb7a881
-:00212069a23076586de8e6d1f5701efe336b91
-:002130f6951c80a6c7254fe7ebdd179c77dd1e
-:00214072fd9b7b8e199ef24707d47198624758
-:0021506b8dbcfbcc5922fee60b8dc8f1438584
-:002160354ad4db5284e5e7c72f1bb88f733b72
-:00217084c14d5b27e80c0dbb9d7ed96e1fe1c7
-:002180b1f96d782022dd9316cf8ac0f8687d7a
-:002190a8718738d6de98dd5bc2f43ab653f58b
-:0021a08bca44480b9802500447d5d83b180ca4
-:0021b033c15e0f1988610eae5a6635f21172cc
-:0021c0ea72383e6c053a70b55a09b22f022cbc
-:0021d02b0fd4312606fc1350fcaa82757449db
-:0021e030f289ceaefa04638e7147dba9d43919
-:0021f022462024605c2b4d304ecbc142b17d3d
-:00220040159cf32839d2ac1f102e5ab92a3709
-:0022106e9d8c7df390faecc73193406fcc3dae
-:002220caa8a318af2a425b1a8962c3696e4e82
-:002230be10394460e7f7921488855c79229452
-:00224012e59209710c1f98e7969261fd754f1c
-:0022509d765b70ff912618d91692209044a075
-:002260c80966d17b92e9aed320343fda72ceed
-:0022709068758f87b4534f62074bc8f8246da6
-:0022802981847d0cab9e687b333f8052bfae70
-:00229091997e32e51a97d64291e4dc177f29ed
-:0022a02596b8d61ed20672e896468530720453
-:0022b03756904f36d16751cf4243244ecb0c6b
-:0022c0ac28ec316fb055a79cb4b0b0ac22f3fd
-:0022d0f0e18ff2105ec5b8c62c3f712faf01d8
-:0022e0812ad7923157b3b4198b9c97e7340a1d
-:0022f06f6c6162203f521cf3a2143f320f2376
-:002300968fd3043cc924de6496ddddb8556fc2
-:00231075e8c94287fc759b1a8ea54c1e514710
-:00232082b3688b757611da45bb7bb74878992e
-:0023302b14bcbae1c2380fd1fbc7343c8626ec
-:002340d1e0130edf014b49ee8aff06d4438b5e
-:0023509b23c0321977644ecadd89a84aa544d6
-:002360a9809f38ee215cbf38e00648ecb546cf
-:0023706b9c5c4b582ac7a0fa4e5f2dca5b63c1
-:0023800d5936df4d7ac38bd3cb949d3ff011a4
-:002390b84c78c5fff0704f32e9d69df4d11e04
-:0023a0ee939fbcd066b45a924cb23b5dd68680
-:0023b0c02165d41e78d9295db44c69124a9d7a
-:0023c07eb5374f8b3313b2cd56e40be64fd340
-:0023d027d4a4893165e7ec4240a2133ea6d86b
-:0023e0b00191ab3e116c57135dcae97e544543
-:0023f0ab858d8318b625117858514f1a6037cd
-:00240039ea70342a13e560c9d3d09b3d8bcab2
-:00241082d38feeedf8061307dbbda41a6f0341
-:002420d40571517f93f22563d73ded53a2c36a
-:002430f2a16793eaa3685cae3275d026fdc6aa
-:002440ae9b09405e8b2f0906d36e4d711559af
-:0024500bf35638dc7ad485698ea6a35bcd4488
-:0024605c020c5288072776eba351169d296cfa
-:00247078726f3ae2d132b692ca57bc3685a15f
-:002480d5e1165e0ce737fa2e3c5aeada6747fa
-:00249035549c726bb1df5c2f110cb4a9979419
-:0024a0f05a132b915e3d28087abd2e7038e4e8
-:0024b08bc5b71b34b30399183aaf8d2570b724
-:0024c05216c3b300b867a5fac03fdf5f4373ba
-:0024d0ae94d17e559a746ddaf9cfb1b157c6c0
-:0024e08a6393d7c2aef4df618db97e732ec8fc
-:0024f0b032e7cafb3071f4727d365acdb8f371
-:00250016618eaa8bbbb7eef0f04fc1d02d18ea
-:002510ada1f1a95f155499a4a1af5366f2a7ae
-:002520765e6a3a81efa3d6ae2351e7ab2b93fe
-:002530eaefffc7ef2d2437297cb039bce46ad9
-:0025409fee83eaa8371031413c693b51093e49
-:00255018c0938762190447f33629604e9c9164
-:002560caca38a6ad239acd14bb2bd1aa17046a
-:002570d5dc4c1fbb1220ddf83b66881d4ccb4e
-:00258066c4f91363f3cb516ce17eb7a70a593c
-:00259085e80aee247f392a47e5969eace8cada
-:0025a009c29f90732f1b38cbf2e05148e1fcd2
-:0025b07c0a1e55c0ca7753ea2e0129519eda87
-:0025c0f697361971c7e50eca6660f628514bde
-:0025d02e3b0ed170e31b358e42f058d636e816
-:0025e044afdccfa0f4bdebfe1930a765e8ca3b
-:0025f09c824c9a4714647add339de154e850a5
-:002600a5c79c72bae68e9f1beeacfdd4348c94
-:0026106087391fde24811b836239c682a71498
-:00262020a3e96671b4dcfb93d048810383f896
-:00263068dcb92e17d7e516a8bc1c3844e4f936
-:002640ed4ff7ddbf1e9eaeeb4e7473da9b8ed5
-:002650b703aa551f076947d2d24bb35bab3ada
-:00266018e949eca30da1782bf210556223a74f
-:002670f199524172f8696df4ef383a49ab4561
-:002680765dacad10d86fce97489709f6a47f75
-:0026907dc2a7b445aabd029758f2399a5935d4
-:0026a03acb02ee9496ba8f5555aacffaaaf1f0
-:0026b08797e404993ab78c7bd8c423c71a4650
-:0026c0a2b42dddb9ee63dc395bfc1a6b3f5223
-:0026d061efbd46e9b9c8f93d40d14c4850bae0
-:0026e0a6b7ad4c9bcc0864e4442cd0d24d73c8
-:0026f0ac31be8ddd15d75304779dd8c66af191
-:00270074143c88844db59a57e196c647bd1730
-:0027104f38734188fda278bd5c2fb86ca3565d
-:002720f968ccc82a7e08fae2502e4f894bcb02
-:0027300e97a2d31de568a7af86b26ace84114d
-:002740cd138f9e94d09c260d95639cde5fbe9a
-:002750d1bcc5344b53e663578ba86619b71bd3
-:002760822bfa3d41795b28b9d3e45a4efafb18
-:002770efc6a72037c69f88c6b7ce12a1548c8a
-:002780b8310aa060c6ed74be2070cf5a9b9122
-:002790b435558026372d4323ca6f1a4a1a92e9
-:0027a033258827757051797ec0d842090c2248
-:0027b05702816ee05b246beea3b913359f994c
-:0027c023526cc11ee399ff97b1e18d34fc8064
-:0027d08a1c2e783cb044635ca15d0ecf100f7f
-:0027e06901d5239aa8b32ee5cad7d2092afe59
-:0027f04ac750a280b78d354510ca69ab82cbd5
-:00280042348a81d223ea423fbdbb40c1267247
-:00281063cd896180da8ce48d5e5dc015a0b946
-:0028209905291ac67df06812b592c29b74416f
-:002830801f52fd3cee8423b598bf362435e361
-:00284055d03f374569adfce80b6aa2223f0e1e
-:00285066c7ae509672b38c456fa4460a970f26
-:0028608b40cf284bcfca592987f78dae6d0b39
-:0028703bb6e8b2242cd7a2fa6cbeb311e4a6ce
-:0028805666b2e51642f9ad4878dc9071a0ed19
-:002890584838df30562ce4495f47b01632675a
-:0028a024004d9a6401e053e30c0599ff9b42c7
-:0028b0cb666de0c22f82291ebb1fc0963ce974
-:0028c0297e2d9365882237ff4912e531969d0a
-:0028d0653c72d2decff7807dda71bc982da97e
-:0028e0ee76117080625a4ad36d3be558a05ce7
-:0028f0569af962e793418e31b427b423098998
-:00290081a863c31ba944ef0cb410d25a08a29f
-:002910dd437814c358686720d313285c8bc828
-:0029208816289e7659d7a9bc0df9bdca4fe779
-:002930dd90b564920f4bebaa10ccb157698273
-:002940311e112c8d80ac5f4bf5c4c90d0dc1c7
-:0029506216a401705f9ea61a8d103bcc7d6e56
-:0029601a128f22a7883dfcade7e96c356e4b85
-:002970d9966d77d226d5ad868415e04b954657
-:002980c92d1eea0cff368f18846ecf59e44c58
-:00299053da06c3d968cdebd26b52cb94dc22fc
-:0029a036dfa7eabe15279b5521e04c955c6ec0
-:0029b0f19dee7e18fef52f784a086d781f9ded
-:0029c095ab927a6ea00a3b237e4b57f1b2042c
-:0029d0173229434ed8fb2aef36fed7e8cbcae8
-:0029e07029354d807c98300018e56ef2040bb0
-:0029f01902c0ec0096f7fbd882e1eed4959f46
-:002a009de379e7f47f4f1f3c4c19c4d031411a
-:002a1050194dd2a62523c581ad9700e4f7ac39
-:002a20ea6bc638246198a366c825f81bde4260
-:002a30c32eea1fe6fee820139c5abc55294675
-:002a408c3c722a550b9d41c16cb0bad8f3fe9f
-:002a506c1452e78185a9d21d874aa5db126861
-:002a60c5f86942cdf2d17c8d01f1ae3291faf3
-:002a7009b8f0a5a65b300d88e85c41f21e2578
-:002a8005bb72579d54c8fed90594c97cf7745b
-:002a907d696d42157507f87abc58f63295fe33
-:002aa0683e7b5ccd8f1ce7a4cf95edb8535375
-:002ab05861ed2679fcf2202a03bb591e899ac2
-:002ac0cd18c161683f789fa57f514e4dc8a094
-:002ad04d839ad99abff23a4faca6079f389908
-:002ae0063ca74cb8fe846dda02c508904999ec
-:002af064538df9667d53620161af68b5550e16
-:002b00a25ddafc024ac0287b583b1f19bc378a
-:002b10988b44a9eacf429e549ec31437dfe858
-:002b206356e01accc8162a4d1251e69fd2c00d
-:002b3082123f5054c18f437bc96393872d8d12
-:002b4005b6333964d1dc0768dc258685773d3c
-:002b5010b4dd25fbd4bdcd79ba591213462f45
-:002b605efaf18901584c440677082d42c0d511
-:002b703da0317a49dc55333d63ea7064c2c045
-:002b804ffe8078e4924a8b2dc4ca01408fed77
-:002b9077ae37d7f377798d051721916a72a46e
-:002ba021441edc7aa27e5c913d77f18f51634b
-:002bb03765829519d724224d4392e193b10a96
-:002bc0c2ef202a040af724f1574baa6ac37374
-:002bd0561bac2c0a0853d4f53459e69d9eee0b
-:002be08787f8eb71284aad44ae4d5fb8e37f93
-:002bf0ca11c9c2c791d03d06609f17e4429e21
-:002c007bd3142a38a99e38cc16ccf08b53ba06
-:002c1050589976395c025e1d1f3d1e4ffc5a51
-:002c209526b5d355f225fb796ba3d1322d801f
-:002c307e6558fd9b46b9d08968555a4da713a6
-:002c40b285db8b0f2dcd2d238c2d89fd1b2c8d
-:002c50220119db7bba197c11f63706ca87a9cc
-:002c60c9a4c077a8aecf86fb42b9f8f0b721a9
-:002c704c427f2e1737e0905b4e7e338d6803dc
-:002c8078ee46deefd526fa1eead970bf7255f3
-:002c90fdb443eb69b040c61cd6d8e88803b635
-:002ca013ba8ab1f21b91fdba6e0ceecf11d5b6
-:002cb0391828cbcc4f80964555b7db83aa4163
-:002cc0246710c0a13e0c2a1e1ff9e4b820285d
-:002cd06b6a686d1497186dbe0109a65c34aade
-:002ce0df9f8a57c3ab527498fc2cfa52995279
-:002cf098c7f5c536ecbf74ab4035ef1490a0cb
-:002d00d5f6a546da93745d09f1a91ee2db53cf
-:002d10133b304888fac285f3baeed846293d2e
-:002d20a52507c6aa353f65a3ae216d5bd602df
-:002d30d185a0326080c5488e9e891848c75fee
-:002d40b055efb43f412031cf61840273cea467
-:002d506d588457fae93aa75ff447714db98532
-:002d60be5d01854752ec3c5271539190b32cfa
-:002d7018e98a75f49f9674c3f004585df837f0
-:002d80e50d2118d4befbe91e3965d9ba62f5a3
-:002d90abebae5ac1e15da0dfe35940461c2903
-:002da004fa56d7b49bb578330176cc0efcec82
-:002db0bab723aea1c927f688ef67176d03ac49
-:002dc0524c395f76209159bd2d9d5b32bcb19e
-:002dd070ad3b4bcd3f1012fcbe7b3e6c1c6b94
-:002de0a2cf35809441b28dce0d87876bef4d53
-:002df0a7125b02bde7c070a6f53098d9b0ace6
-:002e0051a4b9b37f58d49e506591fc3a310d01
-:002e109d0325d250cc0e648bb2d05ce37d78d8
-:002e2058c085add28a2c287c81e0b2faa830cb
-:002e300c434a23b4c7570ea80df2bf57384684
-:002e40e9fc4dc0f67b9b5007da6af042151c5d
-:002e5013b3340e87acd21bd68a93a5c5eccc79
-:002e600611663d818508797e860dd61416e3ae
-:002e7046b5ee19f20a9e6d822a9794c9558c91
-:002e80d0fc6c8fb750b3b0da3c4354d1176113
-:002e90e196ce328952f5a03809099c7943e360
-:002ea0c19a84141f3d17899dcdbd73d349f0ba
-:002eb0f22964af50bf6a6330a7bdc5003d4bf9
-:002ec0c108f6ccc345eef06a1e46af0f9ab3e5
-:002ed08b184d3dc40c64ea2cd7b66f2861a7fb
-:002ee0f5b68aa1817613aa021818f7d99cd397
-:002ef0b17b974c20a2e41cf110485479a99435
-:002f005570a70bc9c6424de3807a0b97914f34
-:002f1024300ea86c21ff4222b3382f1f259ea9
-:002f20d67adbe0e56e6f4d5ba2d297a282597e
-:002f30700ebe1ff35a7961d560892593a804be
-:002f408ae993253c92b581b1e0dc0df42afb25
-:002f50d698da335dcdefbc37f961fcaa6cd642
-:002f603a5d20e1bad0e36da94dffd6d2d84820
-:002f70608e0c9c544d0427001023b38912ec64
-:002f8084a7aed628a31da653bfc38dfca19be0
-:002f90760c497d6ba3e77c434883f58d5d31dc
-:002fa01a5e9db0e446a99cc4bbcb9af3554592
-:002fb060da4fce5a47ea653068f41f1a0899a3
-:002fc018893b85737853b7bd94162d40b3af30
-:002fd05f6594458574c9e660c77163ac0fd4df
-:002fe0654f0b9929f41b1ba27782e1b071ed2d
-:002ff04a76257d05dd2fad836541c26640f20e
-:00300086560f3ccbcaf94cddd1d69103cafb0d
-:0030103d75c8f590457f2e92f024ce25c3cb5f
-:003020e2bc733b1d42f42f4d543c82c7ddcc0d
-:0030304f5f1a4bab651b5efd7a6f256da6c598
-:003040fa77dc89ca1964487b9632180450c0de
-:0030505e54b8a6db57326b43603c6af6b83779
-:003060ec2780a7c9b2ab7c2f026537a207ae62
-:003070427c556f9392818b5858b0ec14d82a59
-:0030800490f3724e651df839f18226d91bb609
-:003090a8dabf71877e7e97ad28fcc3ca23338c
-:0030a01b22dc4155a0524bfe5bcd54c47b46d2
-:0030b06e9382547cf8c5bdb0a0457c01af9eb0
-:0030c0bd2f2f03bb6c840cb603fe2719627835
-:0030d050a1708f1e18b48c3a4b7703c82475f7
-:0030e02ab86a0c6a1194c3d25bb02a689e2a55
-:0030f0d490e6f8e5d92f152fe00295f0b6883b
-:0031008cad781a09816e25f917b77c72b5ab5c
-:003110cab01262a15b9be316df2a86ef40768a
-:003120123b1c479282c1bbd8576f3ae4dcdb06
-:003130f73375345100f00875124a9c96bb98d5
-:00314000396822b5e6db1e32dd14b2267c45f7
-:003150e96e20fbfb67fac59d23295840a562f3
-:0031604755cfe3365a574496b769da73d32b6a
-:003170e875a49f537eb3e6cc6609bf46ab7584
-:0031807fc9ddc55a6bfd67087bbfce8f438dec
-:0031902f15d903dbb21ce7638f2868f095100c
-:0031a03115e904e43a57d2af698790f2eaca31
-:0031b0cfa78462ba5caf1439f8411ddfb34f0c
-:0031c083375e01f937c3d37f92fdb5aa93cde2
-:0031d03abee87a1efb8806f43579459c635966
-:0031e0fd34cf15a93cf01314e58412023af323
-:0031f09d3e17477eec7c48b05cb3083b6758dc
-:003200896a074252d87cd0a14f8c575f3806f2
-:003210b4173d94b64568bedc0151c4d3ce5292
-:003220629389713a6dd1e1cf68e54737bb390c
-:00323023454198e1df177f0de9bd3bbe2be3f8
-:0032409555cb7472f03bf15e78dff879e2c83d
-:0032504d27301179490a3b40a6bf50b6abc34d
-:0032604169e15755bcbe9acfb57232c01c6c03
-:003270e269efc475909e64fbd34abbea75984d
-:003280245886df19b058478be5eff0ab1f7dac
-:003290a0641db812ce48b94a90f21b7246489e
-:0032a0b38a84a44de3e00430abc0d9e7c9cc81
-:0032b06d594556d9227f6462079cf2def2e265
-:0032c00a471b0c25bb5ca3fd19ae67ea3fe954
-:0032d003d8991300e986c7f8332f6da3f32339
-:0032e01dacb077e299e9a71fe36fda48751d6d
-:0032f0fed36de266cc626dae696223045ae472
-:0033007b8f4b247099a45bcda3c2398cf11508
-:00331038e04c6fbfda09fa98f7e760da359678
-:003320ca2c5accb62044d6dbc7866c0db2f06b
-:003330e30050fcdd5741756af92a25e16449ee
-:003340fa6826c68f47d44d2b31ec4c2a3e441e
-:00335083ebec309b3205245117cad46d240fcc
-:0033600a6ee47794aff211a1409ea04624b7d1
-:0033702d57f56417d6e70117600e8c1537d393
-:00338048e6057a9d9b46715dfcc41ce972b627
-:003390c3abf7df2d29a0fa4ff9179c0b07fbd5
-:0033a0702f42b638bd96324afb9b338b37a1e2
-:0033b00f0887a674faed291f8afd6aa7a35b88
-:0033c0f708049b7000528329e1d726e968e299
-:0033d0716353b8b54bae24f1c493f745df72b1
-:0033e09fc514def22caad7e5702fc8cca7ebdf
-:0033f00e68839640153375b87eff7e4165e858
-:0034008ea7e2377652d806f9aa4d9a322a8949
-:0034103fcfb48c625b5f2a77973c8652b348ea
-:003420bf3fe21350fc78f2b88653a09d65fe43
-:0034301b405d23611df4ed24593b2c7cf07a35
-:003440a925c044f4229faa96eacdeeff3a407e
-:003450ae2f35b4ede4ddd922e3b1230a4c6bd0
-:003460ac443992ca5d8c0088baf3c411c2e951
-:0034702a2d7432c283ac9928706919d2a8d2f3
-:0034804f6d9ded16fbb32129096142c310e398
-:00349041ec0bd239f50f15e7dba1e28e3809f6
-:0034a0a7e06483670feff9294d93178f244819
-:0034b006e4cf2323f6bac2f95b138728072c50
-:0034c05420d4306714e3a52c8d33d43ff55788
-:0034d0303c175b6070696d5f75d435734eca57
-:0034e01dc2807f410756daaeee33dde254b8b0
-:0034f0f1ac111f7c34549d1638e4c625eeb194
-:00350038337fe5eb2f5e2a89a8683d090022be
-:00351070e4485d4944c8540f6b482c7a1e08f3
-:0035209d29cf3e9af9e4d235d70a608b94e13d
-:003530b1ce86ed23e62582d869276019ed7987
-:00354034ab18dd5f00ecb5c5ffb621c0f6cc5c
-:0035507c293c5e6617a0248445560ba6acec65
-:003560345e359f793ec8422a2a51665111ea83
-:003570ea0155ed8066ffad87e4cab4d297cbc4
-:0035802f9b4c5962de9ea3b7ccf1aaf4a38d4d
-:0035901b2348ff6b296f8ba910a8ce52bee9ac
-:0035a0329e5c933ec6cdd907c5b8e98e1e6a33
-:0035b049df0f4f28db8329f44910d7c53b12a1
-:0035c0455457152fb39e8dcac3c758cc16581f
-:0035d0fcab58d8a68eaa5bd063308a6e0c86bb
-:0035e0cbe3081e37e20348578b894be7e8d860
-:0035f06ec20859cfc3e42a211b65f397421676
-:00360005e4c063a73d31344fbfe3425059b747
-:00361088e62588b131ac618d63543e5eaa7512
-:0036200e4ee18fde9d179d56c3e617b1fb1103
-:0036305eb104a741e0cbc6f56d444de5229bc5
-:0036409dfe39559cd147ba959cc04615d4a9b4
-:0036503fd0c19e34da48303f3c6c0e9d65e227
-:0036605a2fba7a278a7c9adbee54b0bc6ff4f0
-:00367089a0c5b4ccd06cd2362fef0e265733f8
-:003680097f724ea4c70440246a783b899bf053
-:003690ab69f7009e1afc1c010ae4585a2b652d
-:0036a046c84fa0eee3a07653ebfda0e9b07161
-:0036b0ba0e91c72cdeb9fdc70c4fde18b93320
-:0036c007e19b569c5ffa040433ccf25d66378e
-:0036d030c43240b4c7f0eb1288f33319977cac
-:0036e0fe1aa26f60cac4ab478bbce8a684d6c4
-:0036f082c8c817f81a98bc4ae0fc45881c883c
-:003700c840034faa0cb89cb734b485e79d1099
-:00371077e116326d1867d26c580ee8ec92acfc
-:003720821c78ad2f4cfe9f7b0c958b76338ce1
-:003730ec09a6c35c3db30d66bae3df0da4e00c
-:0037401c2841ce0571febe86f6690023f0769f
-:003750a73cee73cb9e27ce5c1670103f933c52
-:00376020dc01af25db70f7876348404e3cc657
-:00377068f1c43c8e5552117d1047170ce84856
-:0037801dd6b88066ceda95f54399ee90693078
-:003790ef362e6f5cbfafbd6aecb1d6772f22a0
-:0037a044c24b4e731c0374bf103609db2afce0
-:0037b0ceca51376f4a5f5718eef460ce914209
-:0037c0bf9d76462da6701561d5120b8c97689d
-:0037d0d099e69f45ce0c7469b2e23bbe0caecb
-:0037e0dcc2b0ed243173cc28793a8e7aca4e7f
-:0037f0f80d82615d46199d10c55bdf0c584bf3
-:0038006731edee97f003c924d55b658f2eba94
-:003810241cc66151c88c9c057a4816253faa57
-:00382049f835f2b57fbebde4305086251a3dd5
-:0038304ca0d3d71370d5b8835490acd63b1bb8
-:0038400cc26ef6f070f6cab9b51e4cc0e582cd
-:00385014a580776f990c4430c737716fb56f70
-:003860e0d531d73470f0074d4b6f5e0b1510f8
-:00387085247a4f91c4ef14f45438fbf1801703
-:003880790974153cff3d6125b8325da1fb2a91
-:0038908d68bb412170ca9a772330f2767600ec
-:0038a08bb969364479786b5bf7c05d25fe926c
-:0038b0fd0cd207b10eda76ee79e4a662ff2a2c
-:0038c05401617469be035b5c543d3da5d3ee61
-:0038d016d2ec5b89098b0618aaee99cc3600cf
-:0038e0f407396680cead2b760e92b1884a8903
-:0038f016970a2e5a3ee14e6c3eaf5165d5d09e
-:003900550399af72fc40a2990a6107b44c43dc
-:0039100c18390a03157a9fcb10214acaffe29d
-:0039208e0067716fbd8f382115734cec4531c5
-:003930a984ebbb8cb1b4eb29d81299fa8edc51
-:0039403c877c01d92c9556010b8755efeb27e9
-:003950834ce2cecfc8741fb0a2cc5dc6592ab3
-:0039609fb59e058024729854becf26914fa2ad
-:0039706a7fc8c1a7a1c17d112210ad01afa9ed
-:00398087ac88cfc8aa521ea7f0438815843d03
-:0039906271cd5658678c1e3737d139bb57e370
-:0039a09c5888cd4b66fa371012cd70a3d59d19
-:0039b0a96d2cfccf9b0867ad0e291b91333fa5
-:0039c0c3cba2c1ca9425d1bc822a3db92bf847
-:0039d09808526417a4682e2f42aff44e058b57
-:0039e048fdbd91d514eb9d634c33b9299115f6
-:0039f08ff609832c16e4293548659286a87bd1
-:003a00b337c57bcef643d5e74ad4f3686ce5b5
-:003a10368e88899f1789a31eddc3681e2eab40
-:003a20515e50465aff006b09a7bc4d37cf414b
-:003a3026989bb79092d4efbb3a546a5c7bf4fd
-:003a40d5aee6fb58cd723a5b779ff0cc9372db
-:003a508c75c3e62ea47693f2e9f966214aace7
-:003a60e95e318db836976323aad33a689b00cd
-:003a70d160bfa183ca1ea93e66fbe0647f4a98
-:003a80165670cf2c3cc50a3c576cde4b186a29
-:003a90f6527bccc0185e5183907619d271eda6
-:003aa07c45a2410323e4598f46659a870fe598
-:003ab090d4456a680bcafe56e792bfc9b19c0b
-:003ac0d7a37ab38bccd22416c0e16c696aa638
-:003ad0864c16b11e19a45181a5e368df2f6233
-:003ae03148bea4aa11d32b9722fa601549c753
-:003af048071f2240e9bded52078adc30b6ada3
-:003b00fb0ccff6e9ef1a48a4529cf407393819
-:003b1014e29ed5e88fad4a511d77d7da2ffeab
-:003b20924e7b9d33bb56db3ef547f7a85b2688
-:003b30d3b6700272621d3d4985f1c16d059193
-:003b40911e826fdc30d74d69fae732519e5db3
-:003b50d3192fced7c1fa73665c65ee373f5a9f
-:003b60d4a2611236bb4119f4ae2727873bbf0b
-:003b7024ced0c0b6548a328107176d93ee0a9d
-:003b80b0ab7c9fe3990afe52b7471a7c4b9e7c
-:003b90925074db4594c8f819c56feb81285b76
-:003ba054fbe20d0a2349e35f8922ca9d166328
-:003bb0c430166ba33cb788f5aa9cb27d22b5ad
-:003bc034590b51999cad6e9b4d19b3f3118285
-:003bd01851cd7d8811391a2f01e5f9487a0149
-:003be0ca51138521e1de2bc08be1ee9821c2af
-:003bf0030008cc51fae2fc17768935cb50484c
-:003c004816f6486b334d93ad4ee40423ed048f
-:003c10d48f1abe2b200e149111d75e91e517d7
-:003c20cba52b59ae26c86220cd1c0d56a20312
-:003c3088dfa96392f914e546349fd7f3331ad2
-:003c40e375fd4c6341dba17abfcda52843152e
-:003c503ac33e9a550d376709ccdb6193cab98f
-:003c60234d548781057f59bca2fcbee080190d
-:003c70e8a8de7f4707f7d17d422eb64e488c5a
-:003c80aaa67c42c0d76bf1c41b309dc087caed
-:003c90470be164aae0a2877fc10bf00c81e3a7
-:003ca0650099b459f623452da2333446284cdd
-:003cb0603ccc0c5b265aa1269544fde12749f1
-:003cc0442663c409031d8f9b3b6d3bccf2188f
-:003cd0c56fec82f17bac10deaa8ac17dbcdef0
-:003ce07133bfae8248aad16f15bc4e2b70922d
-:003cf029cbc89f8e091bf8b28ccd6339aff733
-:003d00f4b13432b4d957702e9cb6ace161f700
-:003d10427043f618a98faa673be9e0771c0711
-:003d20be2a14e74c63fcd4c4dc163a0564a77a
-:003d30da7f728c2a7bb9c7671b4eb861202585
-:003d409cfcd9481e44c431971a0c76690c57fe
-:003d50437ab8976bdeea3208b3dfe9c3522984
-:003d6096bc7a8e3e2eb212e04f2962573a3c0d
-:003d702ce60355ee3f18fde23f62079889922c
-:003d80b7b499738e54f6433cdfb49d51dbfef0
-:003d90252fb561c1d718734273969e9e815593
-:003da0f8bfc0e6fbde444ce6aec60a94004108
-:003db0e93aefd02c7ab8cd08ecdc546e4a445c
-:003dc0c49a61f3802d04dae81f36c41fea26e4
-:003dd0be1e87b887ae7b36537b69039a89ae1a
-:003de00ab70fd0f2ec48e70d8677c40be23d28
-:003df0372f86669f2afd240f24ad2c525a5ceb
-:003e0035dd3deca7eba59067485b1ed1d80b9f
-:003e104c9e8a638661e4318638db712c2a9426
-:003e202c8994587b876c65b3b2d5952590a7fa
-:003e3058597aaf85ae223493c814ea09ebbe2c
-:003e4036011da5ff3fac2d37ff08b9033d17de
-:003e508a5db1f887a0fb7cf23fc3a78ac721a4
-:003e60c82d3e0509aa0f377b6dbb40b2401ed9
-:003e708d67b35573ac9a8a58f4307f8f315462
-:003e8094c8c47b5d3685fb637262d9000fe36c
-:003e909b268b4986e252f28e28bf2681b85a0d
-:003ea0b372cd446ba981422a11d7549139f230
-:003eb06ec36f8fc7c36fffc8774a9cdfd14382
-:003ec0eebb5fc573b5b54e50c54205df42168f
-:003ed0c924eb6d5229ddf25f499b805d61b025
-:003ee0efed51af6b73fb8480f0a105504e8117
-:003ef02a4798c3d7a208a5847c79c99abcf760
-:003f0016712284f35f719c41dde6a506ea97ac
-:003f1081ff992370c0ba2feea4803ae2349bff
-:003f207537544481a941c8225782f08910c663
-:003f3000957e5054383c6b96d9bccc05e43c60
-:003f40201dbdb840a857662bd8889aec763ad9
-:003f50bfb2998aa10ccb24cd407cefad0080f4
-:003f6096c8d8536f7e565fb069aeff4d5c506e
-:003f70ffb0aba85beb3780164c7b532a3b02a0
-:003f809317f733e556ac6d3e470ebbf058d2a8
-:003f90151f2e92eb8eb1b9c9fd0d91c422a367
-:003fa0cbd62f82b38d328e8db561c2d7007bbf
-:003fb05d53d50e5f574e5170ffa89c7bb40109
-:003fc064f460ba63b192ee5501ed4fbe5d4908
-:003fd00173a73df11be41404649680da1669e6
-:003fe0e874cef94d8a6533918c085cd49331dd
-:003ff0ca18889515dd1b7d01b716853589a206
-:0040009b12efc4608254caee3bfd9bfb20dd3c
-:0040106c0fbea0a4c6b2e24f3d86467dfeea21
-:0040201e255f78827eb0b91f9f9e5bbc0782a6
-:004030981e140e5c7a3b5b5308fdc4554d4fc1
-:0040409da389b312012855d43f1eb8c4e33d6c
-:004050fd8744e5b6a87dabe8b016303a32217e
-:004060d28a2077be8449593eabc7e8efcc74e1
-:0040703262856147657cfd9a8e2d78af673c38
-:004080afd5abea82795f038d0e35654acfc30a
-:004090089ee351e40982238221a11c90d44e69
-:0040a085c8c82b4b2501b50e817db06dc6e2a7
-:0040b0efa09b957b98ecd7ac4fd31409cab51d
-:0040c0b0150118ded011e0f1b9adc13cac7852
-:0040d00e4c5736d555b7ca54fada445c3f9248
-:0040e00eb8a48ba52aa9940ba0c5c50de78053
-:0040f03b73622013c3d1888df3ff04c571cc9e
-:004100e26603c64320167d8c6ae0c9ad9effc1
-:0041101a4b49b668fca479b47987f5c465fe08
-:004120dc390f6ab556735ad686898b0602a35f
-:0041303610291edb89058fd9dd02e89462eee2
-:004140fac44b8e85d3b8954731724f07a53356
-:00415072daa2dad7cac01dcec16b31b804d1bf
-:004160d056f41bb6695dc6eaf09feafe278566
-:0041708641e984d197a5c2f18bc9c11e3e7627
-:0041808561d80dd1695710b328bdb478798ca2
-:00419026766ed9deb3d9d0a719cdfa5796be3f
-:0041a04d5371b00102febf6ea041f6b76dbbc2
-:0041b0d7436497f6b9dad419f7d9f7753f47de
-:0041c00fc4e3977d9df19ec566275af5d180a4
-:0041d00267beebe40cf8cbb1bab289137b3304
-:0041e0e58fcd87a73cab68bce72c75939217fd
-:0041f02db20839593099e6c0bbe23dc5d0d87a
-:00420049d7528ac9218c2fa5cf0aa929ff83e1
-:0042104b41f0bf336597c2a899d2b40c96c3de
-:004220b8958d2780747a5d37ee92170642dc77
-:0042304efe93f562ea58ff64bf09d47afe8b3b
-:004240a42ddf9154d384ac55f2bd78bbc3786d
-:004250e9f42b082ca023893574a127f89d216c
-:0042602e4e03e02448012c633f8eb1b556675c
-:004270b2288c68ae575503cd6506af4e616bff
-:0042807edc6bc13b7f520ae2c65de51d33cfca
-:004290723ee7e413b78259c30f00dad259e9f6
-:0042a02d787b6e36d38cd76d5ecf8b54dce40c
-:0042b09a273b7dae38b9c638469a0b14f42fcb
-:0042c0471d7237d7aedb2bf81e2df9dbad0488
-:0042d0a9dc955244f1e969940fef92ad214350
-:0042e001eaa052c13e413abc60e6de2969863d
-:0042f0fa59c64355ef308238dabf3a288db775
-:004300f4996343ef71c12f8293e09c2bdd3086
-:004310be1db98d200e4ebdb2e95f73668d3a91
-:004320a26634a3c0c55546d315f739d2e6c3a0
-:0043308c1a6664d206c49e8403a741e1d829c1
-:00434035fa6031f317c6aa61b372d95600fc5c
-:004350a70e7bc86226846f1791489e8cd03560
-:00436092421d5dfb74fbf18c3f9ac01ca5b3eb
-:004370be30f032781a3373ad5d8b8f861cbc20
-:004380d8cf68db9352088f2542a1df9067b78a
-:0043905891cc7cc5b51fbe387329a5e3139465
-:0043a0f9c6fa3b83df2a58cd9782c1868f8d0b
-:0043b082cc3e41fd5139f7ca6f4a83383b8f40
-:0043c0f9d26a2d6cf2bea1f0d6695bb49e068e
-:0043d03b4e61e5b51722f1fd055f7ff3cd5a3c
-:0043e0cacc21670b0366bab22da9450b6728fe
-:0043f0db305a26f50fd0d3e79f87fcd1d609ee
-:00440065d0f3c0b903cf20a3d2adb2830d3cf3
-:00441027f828dd72887ac2dbf26fd4fcff785e
-:0044200d1c18be28676e55995c5f8cff3bc97c
-:004430da252ed64b32945cfb55c85edf258df7
-:004440cf420bf3c5bead2da41377f0a59de401
-:0044501db10002c2185d6828c5adf3797f0c38
-:004460adf85e1b94e6730fccc1173f015aef6d
-:0044704f9280010cb472e757e69a97a89def03
-:0044807147666ce2e7d6683d5d35636fdf0be4
-:0044908703ef6eeaad9f1b340aebd19dc8a989
-:0044a059a22dfcdbe2bc01cde88e3d9ed1e3f7
-:0044b0dd4e4d9a8ba4cf79e87783e5f64a3be2
-:0044c06923e3cc21104c613406c016055fd6d7
-:0044d058f9964f374501f33f3ad0db94120c94
-:0044e001a30c0fb32ff6dd4b3bb1f31666759b
-:0044f0c40b169d35a81959d4e69e7c831f514a
-:00450022a463bf71225e17a9b54b733a29130f
-:004510a3555be5e0bdb9bb4f1ccdbb41f45e00
-:0045202dabff3de4d8ebc4c3fbf662acf67cc3
-:00453073cb4eb4a1b1a1545d218503ba0c6dab
-:0045408a368b37d4915444d4c90fa662beaacb
-:0045507a78f21d09d310ee111f8f56901ef5c4
-:0045607eeb78f02b74977be655b6bc193be106
-:004570088c2d3098aaaa5b2a0e3f8509e75a54
-:004580935f6fabd335987dd7c4515906a0d9ac
-:004590b94edf2729f0bd87f16849647334a147
-:0045a015a985d2c461b6ec1dcbfe8b357fe108
-:0045b0702437443022b4949f4f0622a93569bc
-:0045c0fd1cc078f1b0a2fc37a6d78e00b829dc
-:0045d0a0f61ffb7fa1f6b61e28a1ccf3f4c10b
-:0045e0fe0d4592170d7d229e218a1220aeb4a6
-:0045f02bf3544709115cb049cfdf981e6bbb6c
-:0046006a3201f6acc07cc66a153a99a90348c5
-:0046103ab8ecdacb9dcc7c06881fa7f7fa236b
-:0046207c11568567d7a283f5924338074a1146
-:004630cf15f96b71f8a0591e6e0edce5f4692b
-:004640a9d70606880361c467754177d4eba835
-:004650a8e00083cdca5bba2c175bbff4c3db37
-:004660886799506e7bf08a3149491e3b88a2e7
-:004670285ca8bc1a523073ea62bb1daf90defd
-:00468078e4f6fbde62579612f3ab399f03ba04
-:0046909da52fc3b6af082f0e6e3f971fd5b032
-:0046a05b1bd60ec5c39c23f73ac2f6becc302f
-:0046b02582b2de8fe351719f185471e98c64cd
-:0046c01a1202f05b38529b084c9b929159383e
-:0046d0a9c42b9ce78162b197bc08c2d85a0d65
-:0046e05aa2cc3a612622483b9062c8724540a6
-:0046f013b214ccb310ab192216b425a7850b0c
-:00470038abbaed69159483f3b5ef81ff9963a2
-:0047108346f23c9788de3e1df3240f0550fb45
-:00472044bc93e75993358a38a8e04ed6d7bff6
-:004730662b839c4c289645047f2cda4ee52f12
-:004740635e709e925e465e2a526c34a24b4b41
-:0047501f0e9341b9ecba758d536409160b7c67
-:004760511c704bd51c81232227c29f4ad3e703
-:00477086bd32c35eb97c44bee544e22935829b
-:0047803b65913a6b7d4901b8e33806e3bbcdf3
-:0047904fe67148be2570d1da127e8fcc469df3
-:0047a06a95c1d1911f6cf298285657471a09c0
-:0047b036936b2d704e79977860e85ea0c3bdf5
-:0047c0ed5c69e5f36f9818d4358531d50400b1
-:0047d05b00409b8a759d899a693027ae545190
-:0047e05dfd6349c3589184b9536044ac87398d
-:0047f025b29554e6002f62159bb1f3ea7c6c70
-:0048008885ada487c292953f389254ea35c5b1
-:00481008bbef14b24d4d0c60c14abaf9340ebf
-:004820953c5df49c4d8a10647fc48767c92958
-:004830c02e04d2cb7765ed6ef9e88f8d7abd9a
-:004840eadd59b6063e9dc00eab55badbca09d6
-:004850cfe0a453b5011794a98f9bf3cafbd314
-:004860d475487a66603a6c500dfed706579c7e
-:004870a6f664b9f8ba4abd5131f69a0bbf0174
-:004880edf9185e4c8ef644b9f50a969c079cda
-:004890a285f028b4f15d0096f6a1ffd58fd680
-:0048a0f63c12da06b7ef0c6637f62c61bb2fcb
-:0048b07166dc0d712f246e02b63415ecaf1e4b
-:0048c0476dc33089c779f10d3705cd50acd3d0
-:0048d06ee0db05f57b85959421504d601a4111
-:0048e0f277c712795fc0ec019efc10a0d1079f
-:0048f0aaad155a1eaa52404135ce9a9c26331b
-:004900fc179f1d9ac02285ed4bfc5fbe8534dd
-:004910f1dfa14898fb87b624707ab81d0634b8
-:004920a4f99738b7d38701edbe380baae9f0cc
-:0049304dd94e61c1cc0219d9881f8a672198ce
-:004940102d515a8f104e064fb7c8f38ec0c68b
-:00495075432cee42e402f461fcd5fd2893002c
-:004960913b0ebdda04a9fbc4ab872eef129e96
-:0049702465c2a1d9dc1b8181e5c7701a1a5a60
-:004980910287b054144508a389edc8fe1cdc48
-:004990d966cc8e22d54cd0c2b581c8e23fbe3e
-:0049a0d4d6f39cbb0b9084f3e32a0c8125238e
-:0049b0f5a757aad6a031d82ec51999a14da2e3
-:0049c01fbc5cf962b3366e9ee610d1bb70366a
-:0049d0612559ee76906ac5dc542c6808ac9418
-:0049e018a6c66986fbf4c04d3852c381ba2df7
-:0049f0be26acf95890ecada03b8d2660cc1a6b
-:004a0003027871a34e1869be36a01ed0c94d2e
-:004a103d881a8f1631302de4a3ad21ceffb2e7
-:004a202991d074a96477d6bc40902d20041eec
-:004a30a9cb9ac16f1170d5754c85d2a5d9372d
-:004a40bce89b4215a0f1a33b51c880dde8f499
-:004a509acadd44cdfe63b2d9fb8de9bb6240c8
-:004a60e97b0e6125b53d8880b0daf25fafe436
-:004a70cfeef576ca566c1ce17dd434dbed0969
-:004a807bee15a51917eed188dce0d2fcdd5f84
-:004a901a7d3541644109a85f9506ee8467d716
-:004aa0a41f2d8acaff0518c57dbdef48d8c685
-:004ab0eec976cc8039d959215396ee7b7f629c
-:004ac0d783b143b4336f1efc4c1d2a91d64cec
-:004ad016e56b05471aa8cd4007f8181f53b0bc
-:004ae029cc1da11a03377b5f1b02aabee915ab
-:004af021c1434342e899c575e99e222c8c232a
-:004b001a388ff5a280e150739c45017ffcf5ad
-:004b107747fef3513f80495f996a20a33e81b1
-:004b20564ce0537fc54f264ef961201ad14321
-:004b309011497bb826e9569eb4456a7321ab49
-:004b40fe9fbe82ad4c01fbdfbce0e75d2fba6a
-:004b502d3049e501ed73dd0997006b242cde6f
-:004b60ce08b0e17277901820c795b12d09a9f1
-:004b70471e25525663d263bbe3dc8a784d4208
-:004b8073262c1270d0d1dc45c7b2684c1c99c1
-:004b9087bab1dd4d4a418075ff1fddcb478fc6
-:004ba0a1d68025cdb20673a9f1cd1d74a8b786
-:004bb0cc3520f60eb481fd4ba4fc58b51db401
-:004bc010a89df6ba9485c4afcf1aa53afcc3ad
-:004bd020fcb4c4cac3023fc34eb2d994a39d23
-:004be0f6d0a5b5f2d54dd93f5038600991fcf4
-:004bf0f1b437fd3981d1803d63d6c200d8e92c
-:004c009195d588d15ca611e6dd1b256af4fe97
-:004c10c7e7d90a683242b6b8139b7507188c8d
-:004c20f381e9843b8dc6ea59a6980b3e7740e2
-:004c305e15ded7b03ddc1398d29ffe4589ee3d
-:004c40ae498f0ae6085147263914ac57819e1c
-:004c50c8d9a3603eca2f3c9e4feee0635879c6
-:004c604d026beb6bf04f252fde601cf07184af
-:004c70fbfb39f106b7639cecd52f042602184a
-:004c802f4a623615b364d2a51eec647131e105
-:004c906f3a1be6b6d6d894f0a25714daf3258a
-:004ca020425ccd062ce0357f114bf0a92f49a0
-:004cb0b2ff5a779f45e4b25914c000842cde08
-:004cc07de8445e5dca316c3352ab8c7b05cc22
-:004cd03e8a28a1d1d3eefed5213432426093ea
-:004ce04ce13cc24fa4d1aeda7e7d64b596ac8a
-:004cf0ed05834e82a866da69283065d5609fa4
-:004d007b6748472c244d0cb0d334a63aa384f5
-:004d10e192a9caf9653b01659e0f07e17c2193
-:004d20436968bc5f1fdc50c0f75065f075957b
-:004d30b001c517df512c1a2396c23ff60d3e3c
-:004d40fa9812247dfdc5691c9b4651269c2ed4
-:004d5083640bb00640dbd910c1149b2adc3a04
-:004d60c8576826c94a4f5fea0ad261c3724e91
-:004d70802855405140737d7f213022ade48459
-:004d80b5808ddadfb1c32bb1fdb637e947de04
-:004d90dca39706e8fa4bbcdc9d9a0b3d3a7ef2
-:004da0933cf2028db0a422a78b26bd57258d45
-:004db0643634389640b27b3003eb3ff025bd1f
-:004dc0cdbe53cd958d0637c7d7ae2741d91697
-:004dd09e38702a9e9512a597dbf9fe74b8b61d
-:004de044244a9b560b8a0ad19383aae191ced7
-:004df02f39ea3d7cca493eed3b248ce11fce7d
-:004e00eaf3b205cc35647a023a416ea20cb160
-:004e109e2ba7bbaca496ceb02069aa2b6fb3f8
-:004e20f246abbce8dff435a39068fd1288e104
-:004e30735ed16479d69f9e6ddd6809b516f9a0
-:004e40dcc53b70f2608992320d278b36dba778
-:004e50cf4b15b1b39486602e704ffa8ba82d14
-:004e60cbcc454bdbeac7efa04b46015b97a5f5
-:004e70eb6ad973203c5c580a78346b63b09f33
-:004e80a1c56e8a4c39381ca6b8ecb0e23dbd57
-:004e90234f0cab2f5be4d1d0056153a22aac83
-:004ea053787c7924011293c74aba543f7b10f6
-:004eb060e00fbfcdccb2f977f07f9361c93dcc
-:004ec0dbd75b460e79e07b8fc3813810a26d74
-:004ed009d6894833dfa06785ed4cfe563b30dc
-:004ee00ee9315f2e7c895a097698b3a4015660
-:004ef09835d0fc5640ca0b3265d7f4ce985455
-:004f0025b2f65846e5f4146869604cefec74d1
-:004f102baf3cc14f10f8495f83e0f2ada0dbbe
-:004f203808b49e6051eabbfec7f3275a1bfcd0
-:004f30024056d8f46cbc6703e913c2814b251d
-:004f40a0bfb8144c735de96cb293fe34255bfa
-:004f5011eeac95709bf94a75e868ca30d7560a
-:004f6035b05db155c443ae22902693dddda034
-:004f70389c482aa132f9197aa4b08d88cfb3b9
-:004f80a26e3e55794b0d4c6d58ae79bfc3f46b
-:004f90ace5cabc543d1b2b916a93d20b1a51d0
-:004fa0dcabb5dbc3e42052d4d87f164e62819e
-:004fb075c73082c9e466727782b3c029a79e76
-:004fc0a50f38df4550dc13d092d5eb58ada968
-:004fd0b33beced4dc72ff638a7c55eae185ab7
-:004fe094532aef53ea53443925e71babe762ea
-:004ff0a97030b42a410510b847a3839f3c2fbc
-:005000483a1cbe5249e766f729fc48f8229629
-:00501073067231277fcbed40bcae2a8f779c0a
-:005020e89ee4f027d3ec29aa26bfb5aee7567b
-:005030fe94b581334acd3c9783acfd88ed52dc
-:0050404648e5f070f6f9c695203f56d3c39640
-:00505043929fd807bdfb86b76c4723fd90930b
-:005060e0c42eb91dc7825ff702cee667ab1404
-:005070f0a7c1cb8e8b92ee71e9c23eb47fd306
-:00508016f293364e97712d57b106e95db1a668
-:005090bc498b8bdfaa95287332806158bccb1b
-:0050a063930397a436535774f1ede8fe0dd34c
-:0050b09b30cf5d5bf1976b24c4317164ccc5e9
-:0050c05161b07a97eebc5d6446295b878819f5
-:0050d05abedea1fdb31f6c1f5060519e6d36f0
-:0050e08a1179b6a0f66fa964fce3c055754a82
-:0050f0fb56e0c491dee351ab8301038395d80b
-:005100fe9902f24032276da96506a05ec9a86d
-:00511082a4fd03262e395fcd119a5bf441d317
-:00512022ac0241a652ec7257b735d4ae6ebd39
-:0051300c53f9964c7563a71a66a24b9bb87fe4
-:005140b17d4360d5e9970a032dbc65c8c092e1
-:005150e47dc44d73565fb41076bade50da3c26
-:005160ee9645d6131f1f3595d091e146e4d915
-:0051707a5977393cb777f0b05aba74760874e0
-:0051801b231c25329affaa34665ee000edce76
-:0051901dc74b01c3625681a35cd37a9345ccbb
-:0051a0ba1ad45b6c1251a3d453d6d77b2e1ac4
-:0051b00f3d235d1d09986213096675d01a70b0
-:0051c079fd5117b27cec1d36050bb96665927d
-:0051d0df16f19f2eabda5b6857420d0216d843
-:0051e0f6f7ca066eb406d13b7d32400b8018d9
-:0051f0e3552ec8e080a350172fe8d37b72fb09
-:005200d91c8eedc108dd6064a92868e0ba358e
-:00521086a239745e85ee623c0bc8ff8bf7fea2
-:0052204f979789125118e9c56bf9101e1fadb2
-:005230487b73d9783e90d36c569c8571c2e4fa
-:005240d437515d10a8605d951f50e530d4af6c
-:0052502a1cf5b7a2571f8b2d491754186984b7
-:005260e5d86fd08cc8830e73e2abcf9d8a1b53
-:0052701fb9d1e4072bb9c03cba0c412102b419
-:005280e85e1c059b732ae4a6a6b37aaeede412
-:005290d608f9ad1d0231e60b794bbe0f126c3a
-:0052a0d638646af3d6b6b1c5a29ed85f63a2eb
-:0052b0f6beedc1d44f61a4fcd7e71e11158cbb
-:0052c0912320ad7ffb7972736806f690a2b61d
-:0052d0c8304298bac34f3b9149cfb4481e7703
-:0052e0de7c5422f45426e99f6914f80296cf62
-:0052f076913b7dca2070e85114b3ef29f7583d
-:005300e071a9da7df86d5eaace54e51d27845d
-:005310a376238846053afaf5a06e144072dc06
-:005320252b9a93416a63087f66dbb1d50de995
-:00533057e3d369135767b8845b5e0733624a0a
-:005340da3f211e7ab0c789cc8136723a5762fb
-:0053508613bdab0163550117db3d4b3e6433e2
-:00536006d0c7739497f59f0e2ec0105f4ace54
-:0053702bb46535aa6b19d35af449c3c02755db
-:0053805d64820fc25b7d7ad0c6ee10d0839d27
-:00539095566742134006cbc0297123fd6e7596
-:0053a00eb8f6cf294c91f6103d613a960a1292
-:0053b09562ca2ec780086f19d791c828009514
-:0053c0e082dd49e1b5d801cbf8ff56a7d41c7c
-:0053d00a47b517b4a35de1c1b6c158423851cf
-:0053e06654cc8a12464a24f5b2ed06513b7f99
-:0053f07cb1f9799ec619ae6b6aceb2d9a7d08c
-:005400f4e5f5169ce8836df00aa6e3f1b6ee67
-:0054101048e5a94bd1e6f7b523d070940c2f1b
-:0054200442389472277688c4b44740acc1343e
-:0054309c97a9b82989680519a2dfaca6306d93
-:0054407339aeec3f657fddd197b60a1b31be05
-:0054503af0839daa535332b33f8bfa4573156a
-:005460f9018bc00c25d96ffc031eff57ca3934
-:0054706c29532c21f921d25fddaf0e4683953c
-:005480e3b41a066f0b824eecfe2cac5cc7f118
-:005490327ba4c1f6907e0ba5fd486ccc0cc6c0
-:0054a01564949707aab5c4c6ec915986820ccd
-:0054b046dab1586dbd7a02fbeff29cba8fc96d
-:0054c0b83963a5020d62199d8f0e3f657bc790
-:0054d07935cf2d41db890b5aeaf89ceb3704cd
-:0054e0bb73a5befce503de231dc70dfeac1dd4
-:0054f087c6085d008e3971d901c9e7a1badcff
-:0055001fb0551d22ed65d5ad1edc291891b789
-:005510118b9fa24e3deaac234422e2b2f985b9
-:005520d1d41364b017bf7a9999b1be50b4978d
-:00553090c03052286566e900eb92d200eb2d5a
-:005540e5ea5f7062595556fd9075eeb146d3bf
-:0055505407bee3b80efcfd037f92cd16b7b634
-:0055608fc4a2b897a635b58734a761c78fefad
-:005570581db7d822925a787aa88ae0cb93b9bb
-:005580e682886be33723da4fc697737fd77fba
-:005590c6a007a4d28fd94d042ca12b90d97f50
-:0055a0318530313f7082b079c34ddd6b1a4555
-:0055b050a19004ae44e1608d4476a093865bf3
-:0055c0f4ae8573290b3bee4c30ee73938a786d
-:0055d0ff965e56b68607df4164daa882925798
-:0055e0973b593d1a3ff62703114ec2418ad7bc
-:0055f045fa687cd3de49042d6fe5e967f67ceb
-:005600d4a404d3228ba37e58c5eef0d07abec2
-:0056108d156f8e52d29d1e2547dc6f0d0a66fd
-:005620d6439dede6c478e659bd42892eda0aeb
-:00563090c6d45dab0ed5e2de41da762ae1da69
-:005640b2ffb2e8dce3ebe92b394d058c1332f8
-:0056504a5498e6845278f42a4dc2885d6d7266
-:005660ff82a5a4e7a3ee21f721dd7e26af5752
-:00567080703a8ef1770df377de8733d36d7a2a
-:00568025b18a20a12309190cec3c2b3905dbff
-:005690d4c2e2a379c454bbd0cb00e519f635a0
-:0056a034270ee23507ba07a73441a580e21039
-:0056b006fc72fda39b634d7e9080a8a7a9d6ce
-:0056c0552476d0c35e02ab8f6dd2f628c54465
-:0056d098cbc859f71585e30609b05038b8c9bf
-:0056e099b86c59601279d2431d46f0d22334f8
-:0056f0b97196157b05e6fdac8f0e5142f65afa
-:005700a9d4d7cb9115ccf01af46f96de54eac5
-:005710cc85d28f6bd01aa5365521d8266dd5d9
-:0057202f79470c56bd23d383f3208b50e62e47
-:0057300bc4f22cf68a0cb1ff7d9eeefab98da7
-:0057408439f94e1ebe141b653fcb9ce42525d0
-:0057509edf239d0ae288d265a970edec785199
-:0057608af9810b4f70393af16fd6670c30f5b2
-:005770d5f9edcccf8baf0be1b241a24f7d8462
-:005780d87cd60405b7c883fa63e86dbe837b24
-:005790286039342621983bfe08e74fe5ad9edb
-:0057a08e5d95ea387a9153ce46840b092c483d
-:0057b04dac9507a5fd4c3c90ef1473b438b502
-:0057c0d3a51f9a77d29690ec164665fb22100b
-:0057d091148bd77f118e8aa08bfa4706ee603d
-:0057e0b34354adef2432647c28b61028d324f3
-:0057f026d53453430148ba28e9f3ddaea14e43
-:005800ca3560d0e033d640e623856df64b2297
-:005810c376ebaa7a8b219aa578672e27342d1a
-:005820da044fd8d6c1cc0a9d2f841598235947
-:005830658de337e18942aee010b79d24174303
-:00584000f7d38d8f2681158db46b4da7da1453
-:005850e2c139a6a459c4520b9a826c08c1fd95
-:005860e8c3249506ee4f2706d15f410c2c7e72
-:005870323ef5377f753881908f6ccfd491636b
-:005880fec11c3ec2abf524cc51ec8fd1390a99
-:00589094c310c569aa19721428ded4ce4e3a8e
-:0058a07b20a45d8c88fced6d4f1429f9522a94
-:0058b0a32f17ed85d4731abc47cd2ec4d61a58
-:0058c0f5a4384297100016f500dc792519c575
-:0058d004fb841cb45bd830f1fe8c5a43e7d104
-:0058e0f08a272d1bac85bbd7fcfca5c4799075
-:0058f070ea6af6eaa371e31ea4d417dc676bec
-:005900b9b050be37d8ff2204a1b672763ee8ac
-:00591045f326db33391f34bcbe769fb1ab6782
-:005920d0a6bc68599ce57ea2c8f7aa053ce73f
-:005930a0312965807b026377dcefb99067abd6
-:0059407549066a1b5d898b34e1cece8bc5fa57
-:0059504815a207e8f7d9d2abd0a18284f31342
-:005960e6f7761d4039ffe27672be5443a805f4
-:005970ccd8d5feb9a6ee5163865b7f9a47abe2
-:005980ac8cd1f93bf8f1da72b8526b9e105332
-:005990eb77888a960eaf57c63c0a24b722e75b
-:0059a0452e18b7ba1af60891c6a402e8bb09df
-:0059b09bcb3cfe58707290425c2a6ebb34ddda
-:0059c0dfc8641d8c90ba0ec351cd918ea8a511
-:0059d06575f43c22c6bb9e910fb2749ddd1cb8
-:0059e02062d1f0533027968b7942bd8ab8a84a
-:0059f0a87fef736f9ed58fd310526647784bea
-:005a0016517830c6683693dfadd46f6bf7e0c4
-:005a107776b8caa6068b030fdf156f0c3b95a9
-:005a2075c7c5322a2282add2b37f02a87a441d
-:005a30df1b3b11668330250fd727d49b22356d
-:005a405f540705414a049ee5f7aed636fdd7e2
-:005a50b2faa35a30d369d32cd41bf8f72e49e3
-:005a6022a2b7652de91fb784007ee480378de6
-:005a70bb9b87bc8d71cf4dfbb7777635c9daad
-:005a809a7b05fa537efaa341845107aa329fd3
-:005a9081f9877b066da0fb92e05c52460171fd
-:005aa0f23928fc1084ae85c53362b88b7a991d
-:005ab0268a138113cbf1db96300b4f71619d7c
-:005ac03657e6936ea395be14ff0584ccd7149e
-:005ad0cb5e05a4c28ea9d4426abd18eca34493
-:005ae0f77d0df916a82591f845f043127067da
-:005af0e704d1649aad58994a3731b18a02912f
-:005b003ec598dd5759bd02d4b0b95006efe455
-:005b102b3851117352550dfc51420c12055225
-:005b201c6ff947b63556af11976b5aabb1aa4e
-:005b30c9286d7aa81c20416b5b319c7fc39a03
-:005b401e24b39e370a754cc94d2fdd66344e73
-:005b50610b1fe634aa445b07d3ec88b0bbdfc3
-:005b60e889f1a855f655d80dc8a3a301a04bb6
-:005b7061b5983b7c725f7656a232cdaf42fd9a
-:005b80db3b5fbe4686dc5254dcf39d7d619adb
-:005b904d4b9345fe8308e7ba730570f00dc0c8
-:005ba0c39dc714cfc9a4bb4cc0308bde051a56
-:005bb0c529b61ab91901d46cb4496806272888
-:005bc091e776c757c8db4cea893b845dd2da58
-:005bd044e3facb4847a1b19bacdf58456ea7e8
-:005be01814ced39c6075d7a90be5f33c4ee228
-:005bf038520a46bc771a01d0d9865d9565d650
-:005c0007e6bcfd3926c2fa5c31997b9c1e796f
-:005c10c10c65a0e9404ad11ac992f1544d65ed
-:005c2069007c955abfba5e2ce61605527dea6e
-:005c307ef0d9291929f28efd933012429317d8
-:005c40df29d7804b191ea2f9c860b0d249ce51
-:005c50ea531d48fc9f0d1dc62fac51ec4137b1
-:005c602d2734c62a65f7c5383b087360eb5378
-:005c7001ddb10d5993790c20056b20b8ae3c15
-:005c805eeec23ff630126351c61d1ee65eb1f6
-:005c90b349051b1c192d72ac0ae3d143df8c11
-:005ca06f51c5a93b68c2d856cbb0b48c6abec2
-:005cb0d3f8500d8e4d07de6532487b1b9f6cdb
-:005cc032fb809d17b120a93e7eeade12298d20
-:005cd0c3a5245bed5af7d26d2dbce275e98451
-:005ce043d024c715122a66d1f8aa4d97eb91ec
-:005cf0207ef590f6cfc147a920a59017e05fd4
-:005d002353251080a07255c1cf9708186559e2
-:005d102b3ae4b53e0f651277bd068c10673ff7
-:005d200cabc0223deeca64f4b7993c714910eb
-:005d30ddd6511230c291f163553c02dadd4a4d
-:005d403f41fa43fe284d543b8d8358160fa70d
-:005d50d91b240ee2c4b09edf2f71e0d43b4010
-:005d6055798d3338ce33b0febab607f17ff762
-:005d705dddf0632b79d58d44f61ac8ee1dbd4b
-:005d8020c48bbd351878d0a93f1f833267b5fd
-:005d90417d11c3932b9f34494ecb9b78a7c702
-:005da08a3ec3c353206d6204ec486afcb35d19
-:005db0705480db92c665024de16d99e261a29c
-:005dc0595bf0168cb185469ed44e3b7f8dfa25
-:005dd06a8dcd8ade92d2c68058a8d2ca28912a
-:005de04022f900966c46973e056ef054f07641
-:005df0754a1f1a98dd95d6bb50babbd9bcf65b
-:005e00a9ed2da3abc0c55df5ae0995071b382e
-:005e10e4530fcfec6aba5cda97028b2d44fdaf
-:005e20e27218eb6a44b723e824c1477ecccc4f
-:005e309cf829a1f58d3eb7f8f2c97aebd37e63
-:005e4003ecf3d4eadac51e73ef13ca1f45db7a
-:005e50fc07522b78025eb12a070d256b406424
-:005e601fdc0381271d43ffadfc59deb0f333d7
-:005e70aff3c608af22c6009765c3c09bc3947c
-:005e80dda050fd7143274aea1f5c86251eb66a
-:005e903b5de6dd1246468872907008f0ce1cca
-:005ea0c4ef1db80077bce52515b03f9f934ceb
-:005eb04d0b3c9a9cde6522270c42b095f4a914
-:005ec08d6152ff9af257755859bbc22354d744
-:005ed0eb12dc6815bd98fe56877227d19fb067
-:005ee000d88bcc3c2a9ca93c78dbf4e034ae69
-:005ef01b563bf1e1b5d503434ed604d92c793d
-:005f00a9229d2335c234e44eb50294eb0304a6
-:005f106fc12c7aabc097cd58ca6ccdbec3b422
-:005f2038a98aac8ce96f6be7acf4eda9831798
-:005f302ab8879f564cc2bfc6bff40874ee663a
-:005f40f958ac9bbb463a24b4db6f4a4a9877e1
-:005f50b7f7df08a70a5e58f7b22b557d1c7ff6
-:005f60c94a97ef534fe4056524288f731463dc
-:005f704d21e12bf2fb98c3c6557386c0feaad7
-:005f80c706cf2e7088bc02e33bf713de691d68
-:005f90b0eea222a2ec89dbd35ef3d646e2a949
-:005fa0665d2bc5b518482cd4621f2c0b00e401
-:005fb0f9114eadbc1c394e6cbfd54a2f7c9742
-:005fc089a5b98049734fee073262e9bbdf5609
-:005fd09a6743a2804f9b10e5fa6001c34dea45
-:005fe0b6e91aac5639bc24f0d5974b99043c58
-:005ff0ccbb91a6fe4b1dc7113cbd7a10e22c50
-:00600080a763e3b6c557149758d35d2723a1aa
-:006010b27c1cb17ffa5d65c5a350186618065a
-:006020fcdb86879361e43601a4c8c1acf879ce
-:00603038da0955581b28954348075bcb56a2db
-:006040cdb4860362daa78daa6e23b42403d42a
-:0060506a4229daf21543980da018d33bd2e05c
-:006060e80737e9ff46629465528f0a54245caf
-:006070851a4e4f4924304d7d7350bfd485e126
-:00608024546fd83bd8526fe76939fca6937a11
-:006090893ef4c334b30eb018160c805af3e706
-:0060a0ed0fbc97f2abea9544d50aba0e7852d4
-:0060b05e2162a188507d8aed33a4a505cc2d15
-:0060c036405a17d2213b1efba1fefb9d96ecf4
-:0060d08fdfda6efd46871ee5d6e215f8dae211
-:0060e09fcecb65bb16155ab6223dd680b728df
-:0060f00254dee091d5d8c70aa081ff66b6595b
-:00610018fe9c949240f3295baefe8ad9d7e302
-:00611065b8c89d5d4a21d2675de2f40ca0055c
-:0061200b70a9017303dbdb7ddbc35aabf20d2a
-:00613024e98fa9855c5cb8412f559bade60d05
-:0061406eea77bcdde2bc638dbdd60d4e9af02e
-:006150276cb8938d3034bcd7101a354f7c35d9
-:006160a9a4b1b2089fdd41ce28196d314092c1
-:00617077229a13a0498a6070b50066d319e605
-:0061806147b08c8823411d18abff1a218d4fbd
-:006190fbb627e8ad4e0bd6c505d5fcec227aa2
-:0061a0eb17788e41729dbec7def9e709ccb85e
-:0061b0dd0277c709db1e36a28e4a9b0744cd0f
-:0061c09a46e5c6eaa5a9c38bda7cd34462e6e1
-:0061d0281a16de5d5eeca9cc2d55707afab778
-:0061e049be7a5013b36c0f51d770c10943c935
-:0061f0de5f9c56096dfec078b14404f6dbaeef
-:00620027c61ce6bcdd018457dcd61cd5d7dbdc
-:006210d573dd16691e813d4aba08f39ee0cbcb
-:006220b79e9519c601c3e3e7ea589a252a6ade
-:006230efe283fdcb09ef138ae7c7c54e9e8e14
-:006240ea4ca1b8a7860d833053ba08a8878d63
-:006250ab868178e261135427fe940094457345
-:0062603e1c47390615c705b4469405ac02dbd0
-:006270d35dadbbc4b855df469c303b80b88df6
-:006280a426965114fa8fd261a753f1a7457061
-:0062904ee0f80dea5e0c5ba5644fdce9dd0902
-:0062a0afa87846dd8145b8a578bb237dacb54b
-:0062b0e190335fa7d9c714ce1a62d0427fabb3
-:0062c05c0590cf6e16be6d4d1580a5f7f9245e
-:0062d0b6eaac1a19e935a58390ebd37d0e2c3f
-:0062e050672e2e7c0166c36565eb338a3ae2d0
-:0062f09fb9c4c06c5dcf7d30003d0592cde118
-:00630019335afc77da3f016d6cd56734331604
-:00631065cff01c06ef55465a80d487d1ccc11e
-:006320801f422cdb03b359e8b22250dd31d193
-:006330db54ef2b3756be023e4e24902b737dd7
-:0063407472979ff73ded59d56681991ece2247
-:006350aedcc69794b5372c269c6209dea3d9af
-:006360515abb3302a6ae6db6ecd076b59c579b
-:006370ba2aaab559132eb0878f6ba93b6af449
-:00638099fb1ded639b7d1c1fa4ba97a0830de7
-:0063900a88f255a8d71b465f9e481511d032d6
-:0063a0c7f6d19ae21f27e389637e1a84172e7d
-:0063b0c6ea2d85ea280d9af3cb80366e1ab095
-:0063c0d2d0787da794fc7daeb8791a0505cbe9
-:0063d05f9b1442a4d168323f864672daebab54
-:0063e0a786559d630003c1512dca405221a914
-:0063f00475a47ef556f12f56bfefccfb8dcab0
-:006400cee5fe343059edd95528307e03923b5b
-:006410fa2f817129e5858a4571484fa33bdbfc
-:0064203db09a4cc18c138e5904ec8c39a7b470
-:00643026d4ebc2d12f07c4dad2c62a1340791b
-:006440897829cb9d586b4a0361eb738ce4a7d9
-:0064506cb59fd3507c1a06b7f0fe968d8b4968
-:006460f29e4957ce7b98f2548198b9c096bf9c
-:0064709f3d831137f0f6c2a7b0e3d0a40de999
-:006480aa25b3e8fa6c74915f306a5c494f5ccd
-:00649089e24dfdb7ceaf6793db9f6475096aab
-:0064a0814224cde04cb2ac2b72616edd9cfc77
-:0064b01a652ab3733b449c8e0abc81c7d7bb50
-:0064c08263ab91757129db7258d71c10d9b944
-:0064d0e455bd5487f047de15d8dd1f3ee595da
-:0064e06bc48837ee3c74a6d3f1bc204335b3a4
-:0064f03325605e3aa743b74d44b273c6e39e1d
-:006500e6fa7696c3d49f016af9809c0d1cebfd
-:0065108f82f085794046c5a6ce9fceaa160a32
-:006520127dcdf48080ab84d39609f3097fb20b
-:0065306e95f0ae67dffd2950162e1aa1787cc9
-:00654038788b3c208fb1c61fac4cc82fb430cb
-:0065504290477348fdcec469027679421da859
-:0065600c543b4ec30b7dfae7e3d89571d0ee34
-:006570b0b3f0cca5985a80d1ed37dd83c6264e
-:0065809d890b269a95c327d3f2f3eb56bacb03
-:006590fb008cf21e017fadb4567c45a35ec4d7
-:0065a01d9a5198755a7e84d1ead9e7d45f2384
-:0065b0eb59addf7b6dadaf1edeade1e3657ac7
-:0065c0cde8ecd4eb03c38d4225ac24eac8142e
-:0065d0dd0aca7ffefa872d97962e38c1b8b47e
-:0065e0e41ee6422737453a05a3577139e2a519
-:0065f01b29c1fe7a41df141e702227d96e8ef8
-:006600fb729b8d513f3e4d7d4e44316d11fadc
-:006610c8de1e7cb13244ea4bd20e4877efa9db
-:00662059c5b13dc86ed201b1087a83c1934689
-:00663060e666d544c6a114da76dbe26e06d8e9
-:00664027d5bc96e6087a19f772edd24938cc8b
-:00665086f8ac64e5f00bd6e4b8f7abba4d9d4c
-:006660f3f8972ee81e723bfb809081672b7d9b
-:0066703e092fbc0891d4e58d3f99dd2bcb9967
-:0066806c06707f6cce12aed6044b13f8d7e685
-:006690a2396c6e671cc0f633cb6bab0863ee4b
-:0066a0db0cfeaeacbf824854fd894c3cd2edfa
-:0066b08a7b3f7a5c554c60c2667c1ab4c75473
-:0066c0f37e36fcac82f40b1f11bcc1255ffb84
-:0066d01f843ff2767a5b88e85eb4850dbacb55
-:0066e08c01389fab42e43b76fe6b2eac468597
-:0066f088f7c626eea76e48ac847da478a57f5f
-:0067005e4a42db457f18fa68a44a893e502d2c
-:006710e77f65462d564648243e436fcd609930
-:006720c71b48a5296ecdc0eb90ea3b8431555a
-:0067309d2091ff18fc04857efaaa4deae2609e
-:006740df459d583cd3fd55e627dfb784e924c9
-:00675079099cee80291d53ef1d14876b79c2db
-:00676048984015738ac8e6cd2a4410695712e3
-:006770e0b215b7623d4a6d6ec4807f4c545ab4
-:0067809a8206dd64050ceb6fb03bd5ce966263
-:006790131f6c2739d5b340825e18dccb632fc0
-:0067a0d4ef9dc22e9a48bbbdfd62aa57d987f2
-:0067b0bdc4d5c47f59ddd17ab323cc61a9940f
-:0067c099c9c2a982e181426a466dddfc1c61a9
-:0067d0e70496593b526dd4f9ea7e034bf3335a
-:0067e0e040018628869c33264390d7ea584d0b
-:0067f0d2ac08dffcf20c9996a0f0e9a878b5d6
-:006800d58d65b3d9ca056787c184e25956a519
-:006810c43e489827157ec4773aca63910a1f45
-:0068207b740f60259494d446bdbfa4149ac994
-:006830e4e719d77e367506d6d1ecfa56fe6afc
-:006840868e7137743816ab6b17e65e4e5b8c92
-:0068500da9c691ed0f1578872cad76c7b1eccf
-:00686050e5f89e4187fb6ef0932ef5b76b92fa
-:0068705c17baa42ef9fe8837becc01a27e5565
-:0068805823133801e5ececaefd4e74329f1b68
-:006890a6f07e70cf9226527f55bc35efbdcf97
-:0068a07e1ddbb479780d30e0ee6be26f40f38c
-:0068b096c43b3b6bb306da4d948b265e6889fb
-:0068c01c712ccb8339af86e220440b5548fd42
-:0068d0b8277b52ffd54327f91722f9cb0ae7e9
-:0068e0169f8e74fbcd43ca020e1605dc95dd53
-:0068f06da4cc1ff9d61715ed41872b6627325b
-:0069006e9c995afd26bfd0537e8e558cdc099f
-:006910d680432d4e6489fdb0c3fe087fe17e62
-:00692060f6974c1904a4552ea1c1c8a8c0278f
-:0069300d2b8f0447a61fb611473ab11b976a61
-:006940ef8b5bfa559458ae71cf8576ffd2cd61
-:006950d6b60af2706c509682d301dcf71adc35
-:0069608e4df79e708b19f6c9e7190762b9e292
-:0069701cc223729c71dd446d4ed12b6bdd2c2e
-:0069802b377e610f76e2c25148b46705e87564
-:006990de4d2cd3b6642570791ff771b63b61ed
-:0069a0d93d5a9101a5045f72d325e87cbfb1cd
-:0069b09190b680fb394cdf043ca0990cbf2f9a
-:0069c0523275656d4e2ee658c0f2f1c6e980e0
-:0069d08754c2ea0b9a19d3cb81c69cb5a00612
-:0069e0c860236bdf7a7a2cd7c99808f19fe6c4
-:0069f0e91a381c4e1285009b502c7aa9323aa5
-:006a00f3033422ce686c2c3bb0b6a684b2704d
-:006a1052f065c1cbc5c70e8b3f3a5d45edb09e
-:006a2065ea8e1017a084377611ac0ed772a5ba
-:006a30f845079dbad85d612e3bf2e138233edb
-:006a4004357db46ce31475a63c24fd928a5584
-:006a506dc990df0023d3c66212a5f21dd823f3
-:006a600a14057d1cff48b53d3f9b5c62edc0c8
-:006a70d0085fb57bc50bd78797260c059f0598
-:006a808251fb66a9b2520c059fbf6c583f8db0
-:006a9036b0e49cd7602bd5f779d4a96fd2d3c1
-:006aa0b040cc7ad8b940212c6bc483653132d3
-:006ab0fac59b61d6362d9124529438eeb9072d
-:006ac02a46774ea9fbfd50e72b1fba23a5268b
-:006ad014492dc0ec54019674f250d91ab18f34
-:006ae0d8280a59d6fd52066b6009022c5de344
-:006af0b6f601b8845f0864d0a4a7e7b666d8c7
-:006b00e569d9810f8eb44f3442cc82d0871b76
-:006b109e81c8f8161941a82b840143d30aa047
-:006b207a8da83a3557f61011760806e065a1f3
-:006b30f7db6c803cc45fb0ab80afe421071492
-:006b4036375469e4daab6cd82f2c7b8689f200
-:006b50952091861f09958627f5209512b9b0e1
-:006b60dd9564eb587aa5f88567223e93d06212
-:006b707ad95095b5a3d6401228975bbec6ee58
-:006b807c7b69f978c4159ea3f38ef157690d2d
-:006b9017f43521e55e4d35004db3d936607d0e
-:006ba0ba015530e99159b08f78def74d42c3d4
-:006bb070c39b3ae1d6914c1b6b2eaf65a91eae
-:006bc0158930fcb68b31f5e795044999c0975b
-:006bd01be31c2723b15d1b2d42f5f3b772f1d2
-:006be0b7cd83444dddc0883bd41a2051b83d19
-:006bf05dcd2b71e46f4d4771f9d1a96bff0332
-:006c00e12a4a73a7ef36fce47454f9e46f9040
-:006c10082f819ef168900dbf0901a299d50549
-:006c2077e4597e9d0bc052f9bcb0d91b109fdb
-:006c30adcf3a1239cf797d86f5217ea88962cb
-:006c4075c9da9d7778dea96a48806b5ac372e6
-:006c5034da223886b984bff1f8f1a69d21ecdd
-:006c60af06f1906b9c8fba62cc16621901f79f
-:006c706aebfcbcda81fe0b18426981cafce53d
-:006c8035cb5d4341f9bd3546bdef41544f3539
-:006c90089b00e822879d9f72aa56c3f64fba8c
-:006ca048651cc5705225790a7e5481c8109079
-:006cb01c382f9adbdec9ebfa8800cd1ef8cf42
-:006cc067cf35059ff0771c45146a439ff14930
-:006cd0b70708e87440246900c5c9e90c2ffe52
-:006ce08da6a7406381dda0cb8a3f6d885e0ae6
-:006cf039c4026b8a6ad5eba53154c219367f80
-:006d0051746a16bd3da4fb37d267061281bc18
-:006d10a0ff2d63e0d4c9ea5ac4e794eb25c124
-:006d20b14ad945bc4138cde77db153fbd1c802
-:006d308ec38a30dd40eab6df631f40e856e2f5
-:006d4012587d6d06037ec2b7bc29bf1f94a6b6
-:006d50b47f35eb99fcba02ec9100d3aa5e10ce
-:006d60923f39a9eeba74fc0ef85827a5b327d6
-:006d707b2bb6a1540276f628dd4ed0cb9a5a55
-:006d80215208964c24a1d1099d9cbcf7473cad
-:006d901cd756de6256e020af4db4421ab6b381
-:006da06ddf46320dd0c1a651c87e006a877972
-:006db06677bd466ede99ab37d884e95dc0cfba
-:006dc03a83eba9ee90727d428c6f1d4aca5096
-:006dd0cc09946fd9eb2821a3d1d54afbaf8d5a
-:006de044d835bf14eb32c0cc0105ad9019342f
-:006df02e22b4fefed103eaba63bf95627104d2
-:006e007a07640964b53f0e25f12dd57405acdd
-:006e1054598334ba527dc9fd8309b48c34f913
-:006e2051a4f0e9726c34610132458f607ae8c0
-:006e30213b1e5599503b5691c15dd328d402e2
-:006e40f0ac6daa0c42ef891eace56d460cb10d
-:006e5077dfcd76f4bfb3b7ac5c2d8c92849ce3
-:006e600414256d7746bafbb5e6c7401a64969e
-:006e70e43d081c32b59f7de57970f285ddca61
-:006e803839b5686f99fd51a109783332691175
-:006e9015e2dc2d7e7fc86b10e5cb908338d66f
-:006ea05b3012348f93b8c165a102ab9bbe49e8
-:006eb032bcf13caf0c6a6103eeca97c2ed6c70
-:006ec09e148c38eee75b9a0c16274965177ae2
-:006ed0158f2e512eafeb325f5e2094ef8324cc
-:006ee013d0f67027e4fa23da78e47318542391
-:006ef0a30e0f9c176046e9be72069e06dc3644
-:006f00e205321f8845ec4548cb5c26c10ddf4f
-:006f100ce4dc16e6edfcdb9c6851b74f748834
-:006f20f2a3f6da723c4d506b15bd3046a8c595
-:006f30dde3a6bc8ddd5411fb918aceb9d48716
-:006f40bbe84f3f91ea12fa57e4d2a4966f7409
-:006f50bbfa4ddac03aac42003a05858de8043b
-:006f6024731bdfc4fda7dce3fcc346369eb528
-:006f70272910c7f23e42f87eed5aced3087df3
-:006f807c12fe770426301f442f9606020bb57a
-:006f9083724cc9937aecabae1cb36fe99a135f
-:006fa0e4976a60cb02802d94e3ffe6c04b7a7e
-:006fb0838001283d3807805d19029e18bb455c
-:006fc0da2ce97004f9497f6d2435cc8ea5723c
-:006fd0efffa04634d1a46173b2647332385ceb
-:006fe0b8b066c04b9caac167cc644099f13f60
-:006ff03b57655284917166ebd0d2a0e8689b88
-:007000ba08048b3925bcb49efec7db21340177
-:0070104148236f4b0d468e24e8de9fd422110c
-:0070203380acf541c62a00b486910bf6675a96
-:0070301d520ba4d6da1b3e498e6b4433e8d0bb
-:0070408429638950172e81cbc368e346538a45
-:007050e8dd89c919a84f522cf48fad34e90543
-:007060620b4a8bb89ca00f789d4f9529d4e80e
-:00707089f69acb3b5208c0cf22c9bf048b9c8c
-:007080e8c9cec8efbee5eeadd4df7cc8d4c8e8
-:0070903eb6e649d1599a63a5f2771e4300273a
-:0070a01bb19626bb2879a4429830fc75623a34
-:0070b039ee363c88fe2e106fa977137f45e681
-:0070c00309fd02b5ee485a9285662e7715be3d
-:0070d0b141520d3ecde9b1003faa0b48b10169
-:0070e0a0e526a3521c41d361c970bbac313912
-:0070f0d06ba896a5dc0902e8f4a144c3484b46
-:007100219691c3fb5151439bea83c4160b5567
-:007110848cc3833d30b752bc512e4a86119994
-:0071206a0660a777cf93f709c76f9eb628da1f
-:007130493eea9d46de93839c6aefdb979fba64
-:0071406476c23533caf3b8d37aede6f75e4a78
-:007150ae5ac8437166a73d6c7ab2d96bc47d79
-:00716071d7d4fc52b236c3939a754c1d208f20
-:0071709b6ffa54ca0bc54f2668c6f396b0398d
-:007180a26e9eb969fa7e821bd13f45d00525c1
-:007190c64335695f352419c00ee5239634ac55
-:0071a0a19a7c113b10c0d2a4f14b0b1afa70b8
-:0071b0678133cf536b253419ab1c4ab2fd4fa9
-:0071c094eb2df582befd3a8033f052c456bf5d
-:0071d062bc0f549179d19fe3b6cdc22eb08501
-:0071e05551a98f5a8d1e531df3c8b0a6994a8a
-:0071f037582f23c211487bad7d3cafff3498f0
-:007200ee7fa987dc06aab2f4c79b17b94d3830
-:007210c35600957596e16596314fb70a327302
-:007220064202210276e59504c25ea1cc5b4a78
-:007230440cf47be6f30bcd7bc1176d07d99353
-:0072408282a841a55ea8d93ed6c7fe229f525a
-:0072502c7839abfd4e04f2948b84d530239da4
-:0072600f2b52e50abebf8e5ecaf9ca7c46f92f
-:0072703eb3e6bcf68937dedd3a2ed1208c5ac7
-:007280e57c173fa239dd4471bd1459c1757561
-:007290d66aaa1625d7423a3ae82f45bbe62bc0
-:0072a037947e06619c2d117fa6f354bf346f81
-:0072b0e98c3124afa76a94e638b397b3be0032
-:0072c0ec3d142c5780c252c7871df69af9a895
-:0072d0a6a98cc89ff41ef0a064ad9be841a08b
-:0072e00c504e62df19c02208aac253957f5f24
-:0072f0869797327117069c45980d0e72a34da9
-:00730043d1c5f76e9ca166b6f427dba884f8c2
-:0073101cfdea5806d194ff10d49baff1adf3b0
-:007320f7c2b797f4f03a90e7eddd1ee2f88b8c
-:007330521cd00d845605640bda11e69e61b41d
-:007340a4e375a4354c2844f45b83b91edfeb0e
-:007350f0c921bd7fc6fb8f52804f106f55f3aa
-:0073602167ec69f685abb6906faac5237ef2c4
-:007370f460f85eea6cfcf86e7e219769092aef
-:00738005ea38d3a63ab4492d6d57e9d6aa85c2
-:00739060e9889c0b92495d5938847e993f7362
-:0073a0782568892bdf915f4b2dbc7dfae7295b
-:0073b09537b488cefc4c32f08d5db254da3248
-:0073c0a482e16b259ed4966aea702a0d3c8b92
-:0073d09a999e552929edb2c833da8c36b13dab
-:0073e07f077271b6b0bd8e5b007172bdac07bf
-:0073f08d896fb881b6314ec899ca20690016d5
-:0074004253e0345c09dcfb564fb07fc5ba6dee
-:007410294d2c761a3ba227e73c8715fd502fad
-:007420e1f6997960bd43d4c0c456842075f21d
-:0074301ab09491aa2610a6fe7ccd099a3957f6
-:00744099be933d4a2b37947e446b4acc5eaee6
-:007450adf61629a0584f329f7a794ccb7b862c
-:00746099b18077e00f8ac7e91019bf82c93966
-:007470bc0a73b8dee8b2c095606e1cd8d2b91e
-:00748070372bcbdb619a737e4bd468f914fcf7
-:0074903173b25cd132980776598dd306c04018
-:0074a0018de49c39377d2cfb30dcc1298c45ea
-:0074b04978658180bf60d8b5bcbac380d53152
-:0074c04bac2344131c6697570d0c7bf2a13c62
-:0074d09f3e95cc367a9d937970b20e26c15f54
-:0074e0cffae02a96d79b92d41e5ad8335805a3
-:0074f0666f01f55dadfecb9d123f242b51a18a
-:0075009edaadda54cc0009adbc9d966544ac91
-:007510c5aaf0389a75f945dbb30598cb452fb3
-:0075204c9d82b45a18747ff045c8bbefd4eacf
-:0075307d9ffba08de618353fd3d5bf3444ed07
-:00754080a39768ce48860ced9595f71d15432c
-:00755064c775718f141fc5c614853743489c24
-:0075606d532b0c43a786adf10916275cd29c9e
-:0075706506797a5a9daf5f0984243686a3ae7c
-:007580b79f1f27aacaec65b7b491b44a0d9c33
-:0075902712537ad45f7dc51e4f701faa53c8f4
-:0075a024845460e1a550f57de2f8b7b7b87f2f
-:0075b0e0b2d523d3f9f7ad9f899bb7b3285560
-:0075c0e51232245c12648946be623d06a2d55e
-:0075d0d2f91bb153658c56d5477f5ff94873ae
-:0075e02d8cccdee0ce6325dfce1b8ed123300b
-:0075f03c78ebcfc88b6f5523d5a4d672ff9aef
-:007600409dd02358189abeeaf0e35af202114a
-:0076108f6ae2d3e3f4d4af258682d4b23a0318
-:0076201f61bc08e1790336bed47cd8a95cb996
-:00763016db380570b6a827182d54ddc47ab60a
-:007640ef637df3573f6aae252acc8c8fead1df
-:0076503b6568604ad09f5d037177f8f201fa8d
-:0076609d9a2c429bc06121d8c7f7d920fde5ad
-:007670902efe3211e5acf70a034c3526d63c27
-:007680a4a6c09d4a1cfed72efe62739d5493a0
-:007690ccf10eae59fecfd35e950f927909ae6e
-:0076a08ebd991c154042bbb0ff200b9c0037a3
-:0076b042c4446ed3f531fd5f9e42ccb46e9ff2
-:0076c03427c027eeb9e3614b88e93a4266757e
-:0076d076cbf6fcfbab366c6217ca03d5fda82a
-:0076e03bf83b96ebe39b2ec720729ba8350447
-:0076f021480d71459b3bd5f4c57f93feb372f7
-:007700dbd21a615ec85c577e9d387b7a9e8762
-:007710d60881ff6f49dd6d6c3f8e4520380087
-:007720b13c971a5934dfdb32b407e6e2a487b8
-:00773017fc43ea672c51a6a4d78817024c9941
-:007740b25a0c9ceda35cc4ab7e4a4b46a8094d
-:0077508d423b921dc2577178080d108a242d9a
-:007760aab8a229f27ad5036bb701051725f128
-:007770ce6739f2ee460e52f07e5af23c931357
-:0077806489c609538a938fb42b4455867347e3
-:0077902fe00422f81a1e99112f1b45bfc0e0a4
-:0077a00b5a8d065e6d9ae08a5d52ec31bc9061
-:0077b0f647cb002091eb59289a784cbd4285b0
-:0077c049d91b598c42b8922bd46a395369acb8
-:0077d042039a55a1bc763eacae1138781c4b91
-:0077e0cf84f6a5acddd79a231f05b46d9a44c6
-:0077f0a135729c383bf0bc50840eea450c3ff2
-:007800446bc08ce1f5a5a7c5068346058ff259
-:00781005e9090b0296c580d0c1727a34d4c217
-:007820767a7a1e3cad39c7ee4d2e491229af31
-:007830ba9916c0a09a8e41d43cf53cf9de4d89
-:0078406d2b95c24d0c084ebdd07acc610603ff
-:007850ba3539b5694fe79220dfa36d461d1aff
-:0078606e7a4490d4dba69c444d25ace15025b6
-:0078708ee2a3949ce22b8b7c06a8611c10f11a
-:0078800829a776083d63abf7fa5c30805f5428
-:007890b1434c54613c8c97202b093c2d8c9c80
-:0078a0b484eb59ca52c081f58f27d3fec2465d
-:0078b03473d4d079a33aa7236347c6c085d1bb
-:0078c047dcbb077d772fbe2697a76c500c3e3c
-:0078d0f7d712d5b6b8d7a6b13d873987675535
-:0078e02be3843d367b7d7aa78edd88f278578b
-:0078f04c2b00c27d92401456769c4bca77e756
-:0079003476ec9c6eca87b554155b3bf8dd1dd7
-:0079103da56844eea86e3d8146b5c787131d0c
-:0079204acb05f580dc9e118a55ac89961bcc21
-:007930e7c21f59024db7b6066bd9abcfeda8e2
-:007940a4299adee7eba622221d20fb55710e5a
-:007950aeaf9006e9701ede51de8842cf69c215
-:0079605ffc9c573c976ddb988ede8f274b1332
-:007970cac6be0ae9a2d01f1b80d1ef7d03512a
-:00798006018c8f50aef3793fa8a1b2daf3268e
-:00799035a9bf2fe2345aa8d0f758c268695c5f
-:0079a0490998a7c47d825d7762ff034b696390
-:0079b0f2e69caa91071fc03cf81e89819ff0e6
-:0079c071fbf99bd704e612314403083e98bbd5
-:0079d0e29bfae0417d1d6db647517a66faccdf
-:0079e0df1e11cf8f8acdce6748854b795bf367
-:0079f01a2f663c1bcaafdd45786f4a46b9c7ab
-:007a00c134b6877d123c6efe1d516b2b16dca2
-:007a100eb5ea62f01a6f08480d68594ded1a61
-:007a20a3f91e2b9c24b23a1ebdf5cf98d5b29e
-:007a303d6a6fc9c115be32e664114d07673327
-:007a40ab27b52b9ddc2c34bf3447dba2c3fb06
-:007a508dde258e88c187b264bd8601a8ca7162
-:007a60840ba7c94d7e696137d59eaaa3d234ac
-:007a70a02cad0a8b8d78d93701f542e5b529c2
-:007a80867ccefafbdba108ac6f7945434a2b7f
-:007a90a1fe9a46df8ab348f9c01318712e373b
-:007aa0dd2094531333d2916c0ae4a7f5981a23
-:007ab060261e7a5b6c7383953d142477ee214a
-:007ac071f1b187309cb07f7025a8b9d8f23d34
-:007ad091ba5959a26b2efe980375a38b3404a3
-:007ae036264678471af148c395e3a309ce2c9e
-:007af07fe56269360afe8f94cd7bb796bc4258
-:007b0044eb6a53ba5c96cc91acaaa75c30d991
-:007b10db7d3c34f2a47bff87b43e1f97401c71
-:007b205843457a7e6b2aaeb8540dc10a5b7772
-:007b30b2d24a9948525943f9ce62627754196b
-:007b40df8c28cc17be6dc8cfc39fe10697e62a
-:007b50700d1cee77b7fc74e3cb640fcf4b1c80
-:007b60e7d254b6011273694418abf09819e3b9
-:007b701fb17d0c1d394e0dfcdd574855f714b0
-:007b8079ce05aba897fc278feb3db87ff9f55b
-:007b90598811ed2b1816d07c0a36d88ac9b333
-:007ba069d8aa068f0040a70c154d7c9012a7ea
-:007bb00b5f9b188a95df5c1043d60058215c5b
-:007bc09e682310cbe376f4327f82953ed177f5
-:007bd055a82fefbec9646f8b4049fcb671570b
-:007be0756515cdf3f97f7b65619f49beaad41e
-:007bf0d641dc713c672dd71ca9f913273ceb7c
-:007c003663a19b9f65cdda4c8609ce8f8bd6cd
-:007c10b727128042b7b847bfc175f0aa53c40e
-:007c205edc8c03d7173e8ebee8dfc635b25c1c
-:007c30c34818bdc82f0a2beac252f58180af5a
-:007c408de125aebbbff6feca93ff33e9d36c64
-:007c50fdb8615ceb839e89d576868f15c509b4
-:007c60a453191296f46d92b1bc3203d1c5b6f1
-:007c70e2767fb32baea8606344568b0a1c2f74
-:007c80c50db0ee8e7837f251fd6ebb62735702
-:007c901bec43acb8e454d5c3b62ba8b8b2579c
-:007ca036b5174b53658d88b81a7b8e71a3383e
-:007cb023a3ca42082c5a653996dbb43bcace00
-:007cc0f97ee4435ed8f6e5d1da6cb4dd46d02e
-:007cd0dc32a66e18477928d06d17c27d24370b
-:007ce0d6f993489237b6fb0f2a09fe49ab3634
-:007cf0fa601d75065a1a27cd6e385e3100727b
-:007d00163a2464f6370289b8fb5b9f73e0bbb8
-:007d10cdc455a5f4c7c6de94429302a0841933
-:007d20c0e5f67b148a5062f1464b872953ca99
-:007d30127bd6769ff3d069de7d98f88c36b381
-:007d403f00f54a9b9933532dd577edbd465509
-:007d50d3e6c2d41d5868f6a7f3ae4824c29076
-:007d60b7dc7793047288fd9fd3bcd08840d067
-:007d70ff8d436b9997229c8d0fdb43fdff970f
-:007d80d4b6534ecebdb12d8c821e6cef1964c2
-:007d90a68a42a9f06690a818bbc86660c72905
-:007da0f14df569c40115c8a44bb33711914d88
-:007db09839a9211091ca9ed720484c88d3df44
-:007dc02eadc991d35e65d67db86423e95de3c1
-:007dd0d0cae173aa5b6ba0d81a28cb6b1af067
-:007de06aa8122a43556bea89516f58295a9d7a
-:007df087f00b5074bcc4d2b928109c2a4bcbdc
-:007e0027912be479d77acf80a35cb4ca64808c
-:007e10f369a69aac5629f51546ff465ae0bc5d
-:007e20f2e0357031af79e65539a4463a5a70a2
-:007e30f4a4cff5d3555efc877aaa06a03fec1f
-:007e408125959e0a6e326a7c57b1b1ef8e9a82
-:007e50c885bb870cfc6a8f57e6bb16210ee013
-:007e60fac50594c35d6191d65f0fa433e98d18
-:007e70b3bb6a5f796aa80dbd8286860a1b6f68
-:007e80c9bb61bad3e0ac9fb89aeb010eb48136
-:007e902ca3f063e44124fa2f594080c0974d63
-:007ea0e11fa58e40f4b03cccab4e9e3a7698db
-:007eb09d32b0bcb73d473f0ac26a415e13f37a
-:007ec086dc10c67f119a5fae73f7ce71d68b5c
-:007ed0d8608627dff276bce2c05acfab55375f
-:007ee0fe45222a7580d8f0b1d56be408f85ff8
-:007ef04f6e818ff884666b858d6fc4ac6d8422
-:007f0057ec6f71c700745172014db1b6155b79
-:007f102e9e27f45ccdafcbd2f2138559a300a2
-:007f20d08e57a7f6556e2621c12baf41a55d6b
-:007f30c020ebd5b3c6bb8da0074b1ec9b523b5
-:007f404ec5286d99924270388582f478af38bc
-:007f50724627554781c6f28a7a45c9576cba26
-:007f60c8dd720fde1ab27ffd904362b42806e1
-:007f70ce67c5c9b52bae8a3dfa6d85c762bcce
-:007f80552967e3e1ae0238ad7cca2bfeced1f4
-:007f905fe822a8b4ccf061654018fb3e8f9955
-:007fa05e5cb69b4f1d18cc1224e1c225ca1e87
-:007fb04531b789dada19966dd2b98ea76e2e67
-:007fc041ef9741b3552a48be79abf5f4dd9278
-:007fd06e190daddacb24aeb37854e94500a25d
-:007fe0b9bf1890bae7fb5580dd5a5b839a68ff
-:007ff0cff2d55ea7ef06b7f852f14902898c70
-:008000d4f46f893f87181293516288edcab9e6
-:008010a5f0ac4c0d39a23fb24295bb672d3d6a
-:00802011813f219b81fb5615093b64741a23de
-:008030217d6c6259bb6e675fabb7baa39abdcb
-:0080402e4beed1fc232b79bac858994aabd283
-:008050301576327b32a3703bf7d2d3348774da
-:008060783802be4259ad5218140ddaf0de20d8
-:008070c9dc6d2a0611427c158383e62a0264ea
-:00808071345953dbe4e401e4cedb050a53aa94
-:0080901b4c95d6280f114bce7a5ff0e044803c
-:0080a054ad0a685caff9033dc112860ddf17e5
-:0080b09620f858ca916fd0579b0e8ce05ff3ce
-:0080c06a621db6f0ffc9c2e54aee2c2e1ae28a
-:0080d0204bad6ba1b8b6050ebff1f7af57e049
-:0080e04e4a1f8c5666ee88189ec786eb37f4b2
-:0080f0b976af7e70e7564b71e1cbcd804f9b86
-:008100a1a456649c591033decaf271a7bb8d2a
-:00811027313330e412c808b275def1c2fc72ba
-:008120cacc04497fae1c81e97066ba9934ee2b
-:008130dc2daf128effbdc4a68ca90ed79e8d5b
-:008140445d95f14df1f0418bb3a8ff36ad1666
-:00815044ebf1a45b33b57d2b98843ad77fd4ca
-:008160e92ba4a6cf4f3d47ecfef9e987b0f0d2
-:008170e5a14d7af61e720cdb2c97aada46219b
-:0081805f5408e77d70b3c66bcafb6c940be340
-:00819050ac7574c519602c7a4a3e50199ee86f
-:0081a0f2639e7294276a76379d15dbc1f782c7
-:0081b0c2e3381d9eedcf8e9642d8e094f5c66f
-:0081c06c9b9a22aa2da32555e093f68d29c894
-:0081d0c0cafe8918b4e4798015e2fcd5dbb207
-:0081e03ebfe5bc465d7c076cb66f9e5bf70af9
-:0081f0e4c2f16c783fd2ccb50cd77baa658917
-:008200415f24c9e55aeb87f5331336ed731c05
-:008210d13dfb877e2a1a84cdf20ee8bd1c096a
-:0082205cc6fbfee0fc7c858acf09f6fc5a1a0b
-:008230e09c08531712bed401da2e4ed4b42afe
-:008240060c9393136090cfd0543f5d1019699d
-:008250f76de62175b868df0c22f9e1781cd562
-:0082607fc20523562ae3ed7e0eb6b6e2c8eb4e
-:0082707a0743f95cc77fb0724f8efb3f1851ac
-:008280db182540cbff893e8d01566f6b57a7a0
-:008290ff27e6696d2cf46b1f41f3c2dc1350b4
-:0082a09cd9b1fe3de851e47d92047d99ea3c02
-:0082b0e054e078c34f69597b1bd1b67dff466b
-:0082c056db27c1b142f01b37f758e09029809a
-:0082d0f383ad7c7c0662d708cda19b611a6faf
-:0082e00f07a27367ac30058d49670c2f9b953b
-:0082f0523ea0c9b7b2c150193f3e631c68d1bc
-:008300be5b87d32d468b82f1ee3085e0493bd4
-:008310d54c041f5bb88638a7f916bf9a499ef2
-:008320d12b2ffa8e7e4da6419d758e43a1dd4f
-:008330d0d8afb1f2015f5b01868d3e49a9d450
-:00834087a016a6838ddc8eff81fc5d8a2d9ab5
-:008350e14fc87f4719fe94208e9a19a8795777
-:0083603b65f157a20c31a1bd65919ec66ffa13
-:00837017a188dd6605c02c9549afde73c0dd1c
-:008380889ea5703f4cae4b49aafe5bda698c10
-:008390147e643767e97c2759f24a4b5259696d
-:0083a035a36e6322a9f11266e2fbe9a3d8c591
-:0083b07f77ff4f2d8703f65254efff7523e940
-:0083c07d09c4db837b0821d28ef5ac8e126dd3
-:0083d0741d9926edcfe6ab92d7c4620d26f86e
-:0083e035f6b5b175f5d000ee37fdabf805e091
-:0083f0b707ce48159248afd0355de9d3de1f8e
-:0084006380a810fa678c5f0dea352146cb60fe
-:0084104e58da2d728d09e55a24916bc2342bd2
-:008420f89097d2748666e0db3dde15e158522f
-:0084306f61682a82a9defbf1cd8302dfd4d49e
-:008440fcbfb47e23007594e6e2908d9ca46c96
-:008450de8466f6755680f4f58d4fe37ec178e0
-:008460b38e66d408beb79aeb0d05ab0b653ec9
-:00847097382db1b072a6643797d34edd3ed71e
-:00848010e37025ba1f2b8490244c094ff1e229
-:008490c7237693aa44f713c26b37265fba5338
-:0084a01a28ed290a95716a95519612338a78a1
-:0084b040d74c153821a8c4725c356040ad788e
-:0084c00314a261274b7109de156697b892c60e
-:0084d0a0111e0005bf927a0ccf0c3915b0370a
-:0084e0fbf2b6d56e25acda5c7782e77d265bf8
-:0084f09b64974864b65ae70ac47b38701e3b22
-:0085008a4148b587a4e8148979843aa436a159
-:008510dd412b9adc38f4543f94e70d037bf3ce
-:008520bba68045541c6cc07e9fc3166631272a
-:0085309333825a1a027f39d9b40cf1afca9551
-:0085403d520be365c36085cf09a056309ffcb9
-:0085502fbefe58865bd9cc0f3b3e84141b42dd
-:008560906f6db23b4ee3eda2b4297befd76420
-:0085703f5f0f383322d6c6360a2bc5eb847e63
-:00858021678a1a7bae6c3e5bc6959a53f54cf9
-:008590ed3cfd983d682cdc87528f5ee78cede3
-:0085a042ee981a76a4c2fb6d6758fe3e0431ad
-:0085b0145ab0eb0e68ba1cbc458560c5fbc040
-:0085c0edb11f0b62bfe586662b7703091381d2
-:0085d09d12f97f21f93825f294bf21a9a6e794
-:0085e09011f13af9a6270e208b5a9c659e4e5d
-:0085f05152b46d70c4d05aa49892cd4cd15aea
-:0086008d0c27d2c25685de4abf5b0774a3eca9
-:0086105c4544c5ffc8bb199b31098b8d394105
-:008620d883abdf7449ad04b9caf1d521d940cb
-:008630db9b5714ed4994b50042c3d7ea82f404
-:008640175014dfa0f1deb6f48130f7c0690aaa
-:008650af8a5de9da757cfcc38bc65bc6236cb7
-:0086602dbaa53509c52cf7f4d0b628fd5642a9
-:008670932ba0bf61130b774340495eb9b14e31
-:008680c9302f973528064c3e24cfab8d4fb465
-:008690aad20295b2cb8b66484c819fe3d2c026
-:0086a0c7a44a9d538933f6e95db65977b1be47
-:0086b0ce96ec04096b377eae9c0b60b55a5fe9
-:0086c07242f8ec3767c0fdac139f6318c4eb14
-:0086d02effc437ce45d216adb2b4884be327c9
-:0086e0d2d0487f83b97bbed2693cd3a2145dd0
-:0086f09357876583c0f48ac91990a97afe7dd0
-:0087003455795aef5b04773645a697e750070a
-:00871078476993455b3d1777b3828ac3105f00
-:008720674fbbddc537a61ae305e7bb75a803b7
-:0087308bf121e8398417d4febea15c4488f599
-:00874025373333bf25e95fe95e9135741f9273
-:00875091d1993fe6a798415868e131ed7567ee
-:00876051cbbedc25d9bef01584b176c0d8296f
-:00877030cc471813d2c2b2c8de7918a52c668f
-:00878040e1868b3279e8bd60c0c7e6a0671028
-:00879007933cbb10c91c696bad9198e1777758
-:0087a0cd26d54f13aa9ca6e8c1793135f9cfde
-:0087b09a2b8b218ee9baba640ce18ea7d2f293
-:0087c049f4655d94b76aba467a481addb64f31
-:0087d0fb15a9168ae50394765d34e29fa29b97
-:0087e00eb61a3a69b6d5b06582cf2b77fd2fec
-:0087f00c4e8b3d76d8422f3427b51f83fccdd0
-:008800ee3d3208616cbe83f880ba82c3b71bb3
-:008810da9458bc1d38f37e6b3d17f6853f8597
-:00882013d2aa180cba094a46342fe5b09f4c36
-:008830f5ad82b75bb8cebb5ec9c3206de4a60c
-:008840feca769cb0ba01d401e103e7f9d2b5e1
-:008850b15e31469c9a6eeae8f6ec2f61ff81dd
-:0088601ba112f25047ecc5c60dc9d9a8811c44
-:0088702c3dcf6cc14bfe587dabd632c1d5fe0a
-:008880237b3159c6d206e2b7325491cdf87c14
-:0088901f3efd87d285d0d4efbfdebe78e8fc32
-:0088a0e11583ebe9e9c6fe26b0e2a53cf72962
-:0088b0baae89cd5fd528ef0647541111c1d7e3
-:0088c0acda8bb8084986e706ced0554c9bafc7
-:0088d08e3776baae026f45548ae0fb68f4b48d
-:0088e06ef2a75797708f4c6ff1b35721ccdbec
-:0088f041328e8f747936b4725d7dcf6a96de96
-:008900d888956b539e7ab98557a6efea4764be
-:0089105b0353e12bb96b0db9f14315b0130c42
-:0089201153633b1ff46c1f26d34a903d9b9b37
-:008930998d3906a576325c3ea6458c34ef446c
-:008940b6261f8bc2e3874fbbeb3fab00727b6b
-:008950ec8a2a05c86b044a555791f3d1870786
-:008960314dcec4d70847c5a7304d5009c7b10e
-:008970208d8e8603530df9e02e03877569ce2c
-:0089803da03d668e501e31f036515247912798
-:008990766280f78fbb6d13f87820c607876b1c
-:0089a0a59ab508a84a529b46647e7b076621ab
-:0089b0d99301fa55e1e00bb2dc1a6cf7f06ed4
-:0089c094868244bada503b1443c92a8d15f870
-:0089d035fbb8c51b24d4abb43c1e6af435b52a
-:0089e0a9d5d676e1a41ad6cebdfafd7c486632
-:0089f09aa39deaa6081defcf151937a18fbc14
-:008a00b1461cdd20ab78bb394dca39becb985a
-:008a1029861a4e688ef640f853839da1e2a082
-:008a200d99d7570561fbe53babd608dd9df975
-:008a308f50499998690604e00307788e3a6d0c
-:008a40515e9ccbe3683bde6ee9ffe76db4c992
-:008a509c86bfc7c01096c22e828f88d211c3c5
-:008a600516f06c424f89ec2648b608e3138747
-:008a70bdd2b7dbba20f74856dae55f3abaf1ec
-:008a80810496120af58c330f723c1494521eb9
-:008a906802847eee36611f62ff7b05403401e2
-:008aa0d3404585e417995f0e038cfa1bb932b9
-:008ab0e5007c17c818591d01006b396b4c279b
-:008ac0a09fa28e6383b2edda53c4f18e883fd6
-:008ad03ba18b259486b9094d8bfebcac68f406
-:008ae0cc59fbe5f2c7a8e075f56b2b3a4b20db
-:008af056173f3e82e9080766a12d0c73ead5a2
-:008b00970f1a7e1aa9ede02a1e60e5c7a9be9c
-:008b102e86ca9f4b8335904689cf1abffa6d93
-:008b20f5839f7d9e6c6b86652b1cf46f0fc00f
-:008b30c3104fbaedca93bf80eadc2a679243ea
-:008b40ac5e2579797a132bda521d9f4a9ef11d
-:008b500b96c94a384f0cdb5fc25493ac6d8054
-:008b60afbaab8296738caefcd61c9daf59c670
-:008b709c3e874c3220eb91a595797375de8b07
-:008b8040a21fd7709bb7bb1b386365066fa680
-:008b9050a8873fc4eb4d6e554faf12b2a1f106
-:008ba0d627f52b2367b41fdaed366ad01a2afb
-:008bb0fd289e5fd149b527183ac856a341ce69
-:008bc0759fab3e464cbd0bef15a86d4c9b97cd
-:008bd0f012ae2a748cf8d9b06933041eade070
-:008be015e718e541389ee0aff9101642d678cf
-:008bf08e99fd894c6886ca4d448979dc2c6fb2
-:008c0035bd3704f40220ea4a8215a885d7464f
-:008c102feb3126be4358453eefd5354478c56a
-:008c202a5e21a856b6b34acd825774310a4cab
-:008c30694bc7f781a1f02d7b89fcc88b95a774
-:008c400f1087d650cd0765faf05420a02497b2
-:008c50ee0fa34531537d95e936e97691d56caf
-:008c60a90afe74241f4dcf92c3b5a601ecad84
-:008c70ce1b9dbf007de3ce7ea266074a33c3dd
-:008c80abd411d4aa0bc5253dc6886b075de09f
-:008c9004c910a3f6dc5a9b45181bbb650165c6
-:008ca01f57f0d58e89607acb4075e023e0a80c
-:008cb00e96803f8c0b260456642eb5ae3b9398
-:008cc068ec88a60fed1ec7e62be2c551f65533
-:008cd0cdcb79343fe7d8d9450c425d818ea9e4
-:008ce005933424dfcf691474462fdad4c4831a
-:008cf0e39a9b829a76b44f4f3c49319ed45aec
-:008d00f62b62a922ca2a18ae956bceb2d194d4
-:008d10bbb89903a85ade0c7281d4391c51b6b2
-:008d20881a106a6c6762fdc3e35ea411550d36
-:008d30d7e0a147d6514cfbba8957bf798507f1
-:008d40ffbdfeef7dd123c5937cdf45c0593e0b
-:008d5007c2f36fd6ff7e0695913d5fa88fe645
-:008d60118ede3f2abd9225ac3c25b12c08e967
-:008d70391659268f6b9c82b50ed5ef1acda071
-:008d809bba540fb7d6416046ef634c10b80493
-:008d90484f81f27ef34758fa77edc134cd9a4f
-:008da0bbf466f4bfbec4a539a6077198899f1d
-:008db07aa1143d4324c0069c81bcd8652b2017
-:008dc07f1c12e7eb9c0fe9ab4dd3a86b4faa48
-:008dd05bf1bcab0c04090c5b56d52c57f7a616
-:008de0bf1205e4b4f635173ac8519939de5132
-:008df084bd8b2c5eb1975cb99c703e52a65874
-:008e008c6e95ae231eefc334a03b0e52aa0e0b
-:008e10999ea08e4a230baa118455bbf0f7bf0b
-:008e204887d91c31ed0fdc0f9cd2c69ab4c211
-:008e3006a876efa31586cf50bc0531250e39ea
-:008e40de138f9e4fe7c47a43082612a050e0a5
-:008e509c1a5b1f841e9c4299b75f5173b61394
-:008e60d17b03cfaea8313f8c6a0ea428a56844
-:008e70cbbba564934ab573c630ffa28d11c5a1
-:008e8074863ef567e5a992aae1275e241f60a1
-:008e90a005565d7c6b2737f7532b213125b890
-:008ea00b9a1fbdbcdc957b49f141eaf102a7f1
-:008eb0096566c84d33d9d70ecc96ff6d3374f2
-:008ec0fa570e3f89aef84a1d1a36a46e782bf8
-:008ed07362c74143ffc9802268064db81cf3f1
-:008ee09c6fcb101ffdcc028cc9b23042dbbf83
-:008ef01070763b03a91dd3f6b599e9fede8c23
-:008f000b010636bf63deb5aec4ebc738aefbb5
-:008f1094f77f74c12b3eee2d857e8edbc7cacc
-:008f20dc74a21392769ab113ea3591c7537bd3
-:008f301ed2978eb1406d5775d49607c1c4b1f2
-:008f403133c4ef196ef1543735f58518028fe9
-:008f5056283e4a6b07219184a1a17876876712
-:008f60109df001d6fd543ae6828dda8abe4ac1
-:008f7003f4a2e1e0ecfb711e7023694ca05856
-:008f801b8f00cac45b729f865904c690fc1af6
-:008f90d70c4d1783a7c630e1e99640f79be1b5
-:008fa03c6ecf42fd23ca23280a50e9ef6ae56a
-:008fb055e8076c526e91f3a4d9724ab56c9fd1
-:008fc081d29535704bff2989ce2c746bc87b36
-:008fd0d07165dccd77318ad5417697cf102a02
-:008fe048751bdf12ca1c1221f581986ea96ae5
-:008ff032e0e39c9e06b1eaf78fd844d1f6e268
-:0090008d0ca1cb418f1d7e85be457664d86588
-:00901052a26076ed4d232a8faaa978284dbac9
-:0090203e30d18512a1db33c8758ece4216803d
-:00903040ef6c6154a4aa1252747f379b66c96a
-:009040c5e6bf26cc36c60759ed7a5fd1731af9
-:009050b53bde0cda7bfb087bc4ab81bcef1d06
-:009060992d13c6cd44b775dfb89c824a6ba4eb
-:0090708908e4f85b12d2384350b5eb6410a3e0
-:009080acea4421a1393e0347629b5de441a6a8
-:009090b84a2eb1622a8ccc75e54a64cdb484a9
-:0090a06d3edcbf4b7880c84f2ed70c45fbeebc
-:0090b0754c40f01295b00ac39030dc190b1e40
-:0090c04132103e9abf0666c25f99f0bcedaea4
-:0090d08d0cc7f29162bbf0645c822867ad4d33
-:0090e002a4f6c7d12c3329832cb72ec1edb165
-:0090f0b46085f49cdb7c7746260008b2c39105
-:0091004b7b624165647b49d9d9bcad1a12f8da
-:009110c2e3a6a1eb6cf8242cd03b183f0d34a7
-:009120dabe421667d052b51005b88ee9cff555
-:009130797839cbb16684fd64da6ace974c77d2
-:009140a3285e0a73494986db1658c05a0fefae
-:00915099538a38a40561ef8db24b7ba0d42b3e
-:0091602345b9e2bf75c4d86b8195b537e88749
-:009170536e64eddf182300b275a6b28f2a5f29
-:009180ebfa6d75125994ce417bf93ba09c914b
-:009190658bd29fcd36ba132e076939d8a303cf
-:0091a025a2ef063635fa3dae27257dbc9ea2b2
-:0091b0be6b5e3095f043193a9b1a3a1ba680ad
-:0091c0d55cefbddd12e2c7cf9fd4340a77fff1
-:0091d0271a08691e9817958a0b420acb92d333
-:0091e0644dd01c7b1cabc55b67b5aab022b6f5
-:0091f095bc61af9fee3c2287f42c856a64d1db
-:009200852380f10a9477922f4f011d7dfb3d05
-:0092103da3c6127748c176d5931a841134843e
-:00922084596d976c70868faef6268043f32f13
-:0092308f13c8b5055d5b70542f2e0137670b03
-:009240b39a66e741951d91471a83090f69bcf3
-:009250fcbaa7fb5042fdfdeb4fb3976c741dc2
-:0092602c77cccf4986b51f0b87100585dbcc19
-:00927075059a780fcf5708a125909e8b564d9d
-:0092803facd30eb7fbcd393cf5baf22e901ca5
-:00929079a54f5fa8ac209bb818c85456a43b76
-:0092a0ca0c08d1258a4950a9e5db0ed722a2fd
-:0092b06859caf354bba8236a357eeb429ab31c
-:0092c05d4d27e9caa3870c4de0ff5e11100612
-:0092d0eee9eadb7643567f83d222935dd47708
-:0092e0906f74b595af0e7b823c56a50e9e9b00
-:0092f06140203c2c78a52137a0ff00743cc922
-:009300c5f9c4c7e30544aec0e5cd050581a05c
-:009310a7eb2fbc330e0f6e1852e86e75fb9fe8
-:0093200a5bcd981277491d3b4247e9ce8e7467
-:009330845809664c685b57f96bf296238e1ce0
-:009340dd9568abf1f83d1c1bb5e7808a39b7c8
-:00935050c3999db2728bc1150eeaf277fd8b49
-:009360f0b9b7c933ccbf114298b09118c85cf0
-:009370f927d81fb6583cc52e43dfc17becd6bd
-:0093807d28dfeb8f1ab05d3561bbefedc3cfe1
-:009390cdc5ef283593af1b97d13926385ea54d
-:0093a02081df5e4a679f0577c348902cc9ad8d
-:0093b0329d8714b6098eed19b80fcb8a648936
-:0093c067b99876cc54a970fe3dc5aa792a2d78
-:0093d0d78ce7fd8485e63cd479802cebea9029
-:0093e093381fbf39f5956090ba60e202385562
-:0093f0c14e2c996eaf65426a71ef4bb129c494
-:00940011a2cdc291b5707f824d84d6d2613574
-:0094109f469e4cf1204917559a7b86c6cde5b4
-:009420c483d7ffc90259a23d8e92fcedf773c3
-:0094306c77fb126cb12bb574e04ef76eefffd4
-:0094404fa0729686b1e0949226619f1c50c313
-:009450b5aee3678bab3b8e008c9447792b90ab
-:0094600f3aa800d26d2848db73ee2c6257a2e0
-:009470f247f5826a0c34e37d5a96d88cc5df53
-:009480eea90832d3c62d39300cd320528f03f9
-:009490ca957d30c2bb734c471043ecae4f1558
-:0094a071b12a508f48c8597a9a9e40db639187
-:0094b040623580066cceafd34af23e93c63493
-:0094c05a7e641b63c0693f3b97d8e1b02f5cc9
-:0094d05e688bdd96767bd0e3939cd234b64067
-:0094e07e869479d0ffe869f6443dd0dc88d1ec
-:0094f0392fcf75fe09c563bf63c0daf2dd7c66
-:009500a863dda3b70545dd28629521941f2620
-:0095103dae155664eeca618dba96e4cc8dc8b4
-:0095207defba3161af8a7ed4a43e01d53a5428
-:0095300fe006c8655ec2fc1a19e19bd30f715f
-:009540ae53ae64c3f24a42c599d7988aeca900
-:0095501564916285283b3e1b3c16f65dce062f
-:009560231350826a79b34821d1c9e457ae0fc7
-:00957043df963a4b92eed546156583029531c2
-:009580275cd549fc4add6dff67e33fc92d248e
-:00959026f219ebfe8c096d8c381e3ed90a1d8b
-:0095a0489f7eedb2a5ca90abd39deb40ffdfdf
-:0095b0becd887b9ef249e970077e841bd22ded
-:0095c0b123f6e9148824b86c731da20c15dd6c
-:0095d088a49c36028032877b0cee4433bebc7e
-:0095e03ab50d49a6f1fbdf9efa0f8ebe194738
-:0095f06e04d7c45727f3c57d3d51eae7f56c7f
-:009600baed34c835e14b51aa107b5746e47da3
-:009610bc84bdef2d51eca5420f3871c5b6c0cd
-:009620db67ebcc23e6c71a33fd7ca8cadadb90
-:0096300dd7bffa0b3e2c5bca70516c212e91dc
-:009640335cbddc72d36a85b3965a3478a0a5f4
-:0096500a11cc90a4742987d22f415340db8e29
-:009660da3293049fc18cd9bf61cb471023d72f
-:009670fd00136e31b0d22c479c016935886fa7
-:009680d94d2850b22cdf9272ddf91e777942d9
-:0096906b9f200149ed25d9b3285cc732b0edbb
-:0096a056fda7e91ac019b2454396570657af1e
-:0096b04f065868d173aadb38a10293e44a591f
-:0096c09525da2ac180bfa057d061a6ba571353
-:0096d043949e4f65603c251506f074ba4fad7a
-:0096e000abcd0da7e0b553958442dfffc5132d
-:0096f0299754a0e3d87b4134adb89f39cb1d85
-:009700a7bacb302b27db5249e1921a47481efb
-:009710d1911dd99ec36fb04663be5fa273566b
-:0097200a863d265f0910c14ef2a37bc04f7aa1
-:00973039d4cecb119295d3fd232bd636ece6d2
-:009740b57269a40cd7018ecdc1748f99753983
-:0097500f40e752fabbe3e9992c4b98bd8835e8
-:0097605ed401e8d7f76b89c53b6a607ed00c8d
-:0097708fa2ac828e618ea8bbc7df7a05e96a27
-:00978042b7c5b3858bd22eefcc8be4e2dd9e5b
-:009790f0393001cf37e6f39b7f53140531400b
-:0097a0584175cdef9889535422cf9b2bb7271a
-:0097b00a897d6741813c77858b2ff416da38d2
-:0097c0478b947dd12fa5fbb8ab2a10d8c77599
-:0097d050220f186938bf2fb245096ee0f8c92d
-:0097e0a83aee180709d15bdde2dfca0ad0f288
-:0097f0c60661d3cc25f11f4b3c81771d46244d
-:00980059bda733e9bbde0ed5a975f3d0510339
-:00981090019f0151269254b1929300c769e04b
-:009820593e19202d8647d191943779bd7ebd6a
-:009830b5255c0574dd3298d5508a2deea4f42f
-:0098409207d510b58820185dec143bcc4c43d6
-:009850109fde3fe4fd84b2cb453d27101daaf6
-:009860ff72bab2c76cf88ccc06d6462936cd0f
-:00987002c297e3a878faf1f4e9e21227fd2e05
-:00988079314add7712b9aec3810ccec4a2b502
-:0098906fd1f09b491b0cf40d69f5b5640152b9
-:0098a06ea02e5dfc3a8120ff5e550423fa0ee2
-:0098b0d97824a43a5517fde95834b342e1e8b8
-:0098c01eb68ce7d68f1a35157de21dfe3c4eb2
-:0098d0a07e5c4e562cea4a0bafc00608bda9ea
-:0098e0dbc97153b249bcdf05240aa507f0d77d
-:0098f034708314fcb709a4eded930d4155747e
-:009900badf16e6485053183c9c5283f5374872
-:009910e83631c2a944a49be4f4727486107f3c
-:009920ce7a08d38a5b0db859edb7e1e741b3a7
-:0099303bc3747fcca9abaa7055144db50b62c1
-:0099407e2a7776f57ac5814bcdc0b0f6fcc659
-:009950588d5364ea1e49541aac7d341e1e024f
-:009960508ffd355c8dcaed3f3a6fff1ad5402d
-:0099706a6311452378f05c4c9742d82c7d17c4
-:0099807c6d948bb2c198a7842f6f3abd13b658
-:0099906f494ba5c29a5277635d956382f599a4
-:0099a003e10d10062fd14af0863dfe6552407d
-:0099b0762f2ff59b0de3f3fd23a7dbbb98ae7f
-:0099c04861ba2dbdabb62a83a8c2b176a46a51
-:0099d0713ab2802a74e842b36517449dc1f462
-:0099e0ccb1cc54021e504e380cfe03f1c52acf
-:0099f0f31267a3dc50f0675b656967cbdbba4b
-:009a004c507f26d2e847a4ded3a56658d6361a
-:009a109553ab3ef6f33b3efa9dc53d4598ff24
-:009a201bcc9f0b4d7196e0f1edc099e0df1a00
-:009a30476caeb734c8ea7be7ef9b470fb55b43
-:009a4037646c24db1caa71c54873ab082ea929
-:009a50530007c097a31847594c77a985d02d19
-:009a60f01087eccc8664d7280d3390c95ea7c8
-:009a70d3ca1404f7a0981b1aec8ecd1a06127d
-:009a80a3e673b8be8830e1ef6d3b02ed676904
-:009a900281dc5d8a4ef4e3dcbd07bfbd9a01b4
-:009aa0e9d48eeaf2594c9d07f66b604c232954
-:009ab0f8770dac917e9db691f59b19afb8a64b
-:009ac0cf1aa7d987186ef7325b56b51439d5b0
-:009ad03dcff5eb0e7ad04271878c445cb12b25
-:009ae01da19c55a432c79f7429cf771ac399a7
-:009af0271e88b5a6332c0fe56e68cd5550bf16
-:009b00a72e3b42e4c0b2e53efb711aa586e57c
-:009b10cc99ef5446beba760bc93ce6c0ca987b
-:009b205239d425f63c5489c0a99519ad13028e
-:009b30c74ddc9b4e5c6dc5089536933b3049e0
-:009b4049a1ff3d9f318c60da7218c426e3c707
-:009b508d3ab0f170f3fc209ddee8ff9c250085
-:009b60da73244ec11088aaa985068dd888cd2a
-:009b705bd643691a16329c47b6992b2b5ab41d
-:009b800a24146ded45a1fb3554e26e75cf547e
-:009b90edeadba8c976001117804b2e0b4ff377
-:009ba00fabe7b1bc72dcce21f45adb085e9c79
-:009bb0fa159a4169cfd0c810a51ee32e3393ec
-:009bc06b15c8ee7de71b2897117621e3423cb6
-:009bd0c6bf909ebea18cdd5d8820e765ba475b
-:009be072a3041486c9e988dcdab5b24ba32105
-:009bf0b1f2c639023946be410bb4f039fb80d2
-:009c009dc08c0bc0327ffe5e248b7ee36f4335
-:009c1055d8cc1351a74f402b6fe6d80ffa6b7e
-:009c20c3f13baa2da716a597c88348163e2d5f
-:009c3036fc15aabb89bff5e1730e79f41a359e
-:009c40b08c35cb9f1a35026802840c6f624acb
-:009c505cc06583ca1bacbf39ec09302b64ce39
-:009c60e521c125af6df15453d8e2c8a01f5fb7
-:009c7048c3fbd56c69bcddf2d9d396e81dbff1
-:009c80f16decd9f27fb50eb9195e51cb6ca187
-:009c904648a62730ee95613ec4b047b95c5fd7
-:009ca041cfe042c68cfda99fafb6b5b4259125
-:009cb01bd6d649bb8697f98ce19fede1666f24
-:009cc06f07ed1655002dcc10a209aaf34ec5a9
-:009cd06c717d3fa2b0d95ce31c52a792bab1c6
-:009ce06c29f34150aded7bb9b5ded914b32e15
-:009cf054e5628305a708f946768f15e1ea935c
-:009d00bc15be93c1423db54c53fea951996dae
-:009d107b106c3d843c432c0299eecaf4814853
-:009d20cf06fefb4d75c2358b026c50e2dacbdf
-:009d30e066bbb3753ad6209884187af047afa7
-:009d40a4b1eecf884bb00c29485a93c6bfcda2
-:009d50928de2011cd8d6b57ad54bebfe1f3d34
-:009d60874b3520acaee122a156398afd2133ec
-:009d70dabfe95f40687756d2d0233452f0fcce
-:009d80fcf9c9b73e54ec2b8d089fd297623405
-:009d90b8598c3d05287ca170278f09e7fb035d
-:009da03701b57279d6628280f8143b7e97d46d
-:009db00bc55cbea41e35817e791f89079c59d3
-:009dc06c1770b1e81f2401041700c1940fa0ac
-:009dd01194e7dce7b4fa80333dd406ab93c0fd
-:009de0c721a71c59298c4bad9980f8284d2be8
-:009df09a558a90a84693163f1b7d5ad805559f
-:009e0050cdffb8788b3f2c91cc22721432eebd
-:009e10d202e30a60326f416ae5dd56a96591a4
-:009e2065d95276ea0217611a0ad18fc7bfe9b6
-:009e3064e1579c6070991edeb0f539327564d6
-:009e402b4def09633f12caf72f667c3b8ae430
-:009e50c6db4cd12a806ef81e388a59bec2008a
-:009e60269efbbf6d2545e5f1d0b4f8d4c15144
-:009e70d1e99780de47ebb5c37aa73005b989ea
-:009e80ba14cf3818951407e63c7348e6ad32e3
-:009e905e56f9ea047fcd3a78665f7ef914df8e
-:009ea0c7f2279c4b03f7f2cf88368bc84fedb7
-:009eb0bd8c5048d993e5e1bddc6a3d358c743b
-:009ec0f61cabf697fb41f8015dbc68fd35d41c
-:009ed0008f64740249b35a013ab677bc0a7ba9
-:009ee09a79b07ec507f46ce4b61fd7bbbe3d1b
-:009ef0f845ae9a14cc54264d33a552a427d630
-:009f00e5b155f4c4e23795da173af071781376
-:009f10a8350947bb98155e81e47d9b69f60c6e
-:009f20a33817dccde16c1679f4b8ed633a1b5e
-:009f30f7a65de40362617618f71399830e6024
-:009f40482ec225e052cda3685961b815a565ba
-:009f5045ad67b0c6f6540e6f26e6ec6dab8ec9
-:009f607962c7c0df35971f045122a0a91ace4f
-:009f7084a4172ce1626874388b57fe6a327194
-:009f80dfa7f5162e5927338f4152b3625759e8
-:009f90c2962cb13666ffc6a93a65698efba343
-:009fa00fdae1bbe065c54d5b609586b3fd5ee4
-:009fb0807177ddfb840c19a33977187b48fa0c
-:009fc070992f7b5cdc1fe36cfb8a4069480cbb
-:009fd08a9b8a178138ee61266c5cfed60c8093
-:009fe02877f18f85b66dd8fe6a60236f7d6446
-:009ff096352613617123bd7ab32d2629220b74
-:00a000f4abc1f37197219890d02d60e466e6fc
-:00a0106a8963fb8d19a1200bda1c1ac07e30c8
-:00a0205889b397de2da2b36e79dfb0730cfdd5
-:00a0303e1b44f3dd55b6200b905e208df0941d
-:00a040da9aef39c7c924bf59e3013d9781da73
-:00a0506d674665eeb66f9ee3f7191a2ed90fa4
-:00a0607f5169080e03dafc5f3545ae1cac70c9
-:00a0707bc69d671d8c5a6dc8a09342aeccdeee
-:00a0803c6ed51c2f3f886eb48259390ee7a266
-:00a090c815a4bec2064df4dd535043b42143a9
-:00a0a013eeabf89a54798b505382ccd4e19778
-:00a0b089d906fedf0c24397807920177e428c7
-:00a0c0fb159a0a69abf4c8da718ddd38ddbc23
-:00a0d09f9e610f8c607a08e2d7afc35037e29e
-:00a0e0b563b27b002b023131fbd31a16e8adf0
-:00a0f02776bd2016979f8edc55e048143c3b53
-:00a100f21dd8c9231ce14ad7876e72a5b9e9c0
-:00a110468694eb9f64f15a7cdc2df4578bc0d0
-:00a1203aae7e1eee2b8a1aef6a0da4b9dff9dc
-:00a130dc87fd0be9b0f792ca3e01dfff4adaaf
-:00a140e91941f3882b2f6cb550ecdbed4e5ef5
-:00a150b76f3724dc5b83a73b195c0dcc6577a2
-:00a1603845c02b028dedb79bb558ffce4ce8ba
-:00a170574cd64887a1db3534c415820d53dab3
-:00a180acf6672efcf97701c573d35e0bc8d018
-:00a19047bfa05ba231068bcbd1d9025b39e8f4
-:00a1a02a3d12f23227f1c214a9de97cbc360fd
-:00a1b0bc61105e47c3e796d7a3395ff9d7f105
-:00a1c0143d14f196bbee9f30179364e8c9a562
-:00a1d009331f4c02e90eebef835bc025abf30d
-:00a1e0437a1fa4a105978277e06caacf755cc1
-:00a1f08281e49cf32adce601c8ecd78ffc6793
-:00a2007313c06a1c8e7b891b412a4d928d5cd0
-:00a210b9f0137ca018fac5ac8fc968db1ed892
-:00a2206ceed5a16e4032c7ffaf9e27edb3b8cc
-:00a23099ad5088548d8c6334afcb8d9b2fa921
-:00a24071d0bc8ba6ec1c461be147b278ba77ac
-:00a25057d4a1943012bb4b79b0277c6d462698
-:00a260dc87929fc60d3b8b17092c2544b76652
-:00a27027b78ac43f39a24b4ea29daaa66f18b7
-:00a2802084dfdac408c384c9b4e00444a7b770
-:00a2909e975ee14b8c41ec5e7fd1938a745fdf
-:00a2a0b67d62baa045c287d8924357815819d0
-:00a2b05eec07617408ea7599409c3a89df12ba
-:00a2c04fd17c9f2514c45ef277013da1efedeb
-:00a2d0340072130ee50ed993f01f3c30bbd9a9
-:00a2e0f172bfe5691c832ac3cd09af8c3a73f3
-:00a2f08b9b5ec6fb38ff7e2067ccb28f484d29
-:00a3004dd3a921f10a328a3210820a73368483
-:00a310621aef3a1bbf008a61929c221a922fac
-:00a32019bb716899b36090c6798f9dfa9a881c
-:00a330b6d7c903be7ef2ffa48814cd23a115d8
-:00a3400cc7b4dd6f248992998fecda46ddecb4
-:00a35022c5515ac1186ba9aaee21a43ab350bf
-:00a360c9298d456d1cedc6b322713435668006
-:00a370b64638bca44952c9f59514aac86fa8fc
-:00a380e53674f218427ad3fc74cb04f829e061
-:00a390134e06df26bf0dfa0cff7d7ecb9e436c
-:00a3a0fb16eb7cfd3b907209b8eab0e15021a2
-:00a3b096b1b3ae8aa549afd1e399bc1215fbb2
-:00a3c09fd82ca011e81dd84936d90fe3c1faf0
-:00a3d01a07a743f50a4722a0e8574180e8783d
-:00a3e0d3e755123cc6d068a76f6e2e6877cbc1
-:00a3f03ab38a8388ebc33cbaa01df77f180e2b
-:00a400aeab5f54ede4cf106817e8be55e2fc35
-:00a410f557933f2bad16db0231fd272eeb8c0e
-:00a4206f68c0fda8171d1bc45455c917deb467
-:00a43091c0b7f893544708881df076d495f5f5
-:00a440776300c88ac862325abbeba3305c78c2
-:00a450d95a2523579cb08648a3e5c1a865e168
-:00a460a33e4d8ce03ad0b6d2fd4946a17b230f
-:00a470d3e44354e029b950f4d3f7b462d27960
-:00a48016c7977741c620dbf0d73939508209b0
-:00a49022515b59c6afac31a71d5312e211b10a
-:00a4a0a47ca5d7595bff6d14408c4d707a3765
-:00a4b0322b89a4fdd91d21007a289a5bdb8ebe
-:00a4c0e99ecd887be720d7f4934b5925ca24fa
-:00a4d0732f3055c14730979f1f799fed2cc113
-:00a4e0c618265fcb57c9a9024a5cdf4d98a0a0
-:00a4f0d7142814ec364d0cdb05b90254695e3e
-:00a500a65cba1417bfa8c07451e7cf9722fd77
-:00a510d16e9f26a20ef8baabe12e5490211646
-:00a520739beb61df641c9bf245c6d06918531b
-:00a530574caa9af3b205381a2a0530ccfba94e
-:00a540bda6c4944d8b437e5f2cd2bc00cacdb4
-:00a55029ab453438eabcf185fe53f45c2c8629
-:00a560500cc88a27e616a33ff716f831a10b7c
-:00a5700bb5f71ecce3b67334476c0ed419a2dd
-:00a580f230392e60b59dbe3abe0f0fbf4d12d9
-:00a590e63c1ab4b517789f9a08b9e87b5673a7
-:00a5a098db24e9a01fe91c55eb785a6b04e511
-:00a5b0fafd4acc983e1b02c44a504bdb117dcc
-:00a5c0a0ac510b1da6f781b134c0fc986c2270
-:00a5d0e6111c0c965fc1ab85cea5f19889a3e2
-:00a5e0f198d831054f186d301da8bc5ebbed6b
-:00a5f0ff8746131c89092b8622cec5103954f5
-:00a600b7a893e3eaae0fc6a7c1c0023537d4ba
-:00a610ca26e4bf8d74f0fefd9828ba5526778f
-:00a620c59efd97fbda98a33cc1ff61a0bd9c1a
-:00a630fe96667861daf72cb6df190c5769489b
-:00a640f4e9f25d637da3ccfcdfda38c2d233d6
-:00a650e975450c392c42c25ecaa0bb1cfe4ba9
-:00a6602142a4c419153fa71864ef04ee51c37e
-:00a6707e74f3fec1b8cc3224c8a0a52fce3492
-:00a680113c34c579470a6892b4dc4366c74aa5
-:00a69084a9fce722dd878e81278ff606b4b95d
-:00a6a038a371bff35f232d27bc965246eae095
-:00a6b0205458e9d57b6a7cb5d896ef465826a6
-:00a6c05c212f13c496cdcfa9b6873d679cbc51
-:00a6d0bc12f1c54c3df0767f8a67be46779e19
-:00a6e0774d41c5867a853988c8ab868e1df2cf
-:00a6f09ad5c0c71f9e329f1b6dfc08cf41429c
-:00a7005830dc4f6065b2327f1915221bded253
-:00a710f5370446fe9114e3f8a05211e88a95cc
-:00a720b1d40ae98c0dbada33ddbe5231aa3b89
-:00a73042f892dc7bea618d67974ecd7e95a788
-:00a7404ecbf991940f6a7bbf7fa3e337efa429
-:00a7504d72929098ba93627dd28cfafc407c0d
-:00a760f718029fedc61e217714ed2cac6e2e80
-:00a770508019a8d3061a8672ed1161dd0d4f05
-:00a780a0f79b73585dc11af86ef5b2019cab9f
-:00a790c85c3e581ad2c117db890b2082c8aa0c
-:00a7a0599c0678e45623538f53ae897d7e8078
-:00a7b09c00dbe6db271093e17b094e5624e978
-:00a7c0c0df741b15fa4b1386548782a3b7e63f
-:00a7d091900656b5fa453c988f3004c4f0d02a
-:00a7e083db79de199ea43de5785327fcf786f2
-:00a7f0c94322d07273bd5730ea6f75b7c18dcc
-:00a800b51ed70aa893977a5b5a53a9ac3cb4e7
-:00a810e2df396b5a8466e5e663b9851f39241f
-:00a82008e64c1a3132ea98db51829654b31361
-:00a8309e41e6a44c5a15670dd86cc46310b2d0
-:00a840589111b1ad3bd37b3b3780f1a655b222
-:00a850b72f1961968240fec0e181347ccc0fc9
-:00a86037a15edfcbb533f3d0de01d02df07fc7
-:00a87012ec8cfe2256898cdcb32bf2ed5c2214
-:00a88053879168bb8e10fa7480419798b0a023
-:00a89006753be21f0719370ec6e2df52eb3249
-:00a8a05ae91c6e008a45b769adc30413edbc66
-:00a8b0b62246ced1bc45068c92741ee50b8621
-:00a8c04f8089ecd1938176aa19cb469308c715
-:00a8d0f0cf8a8cda0c6d82b013fc6cf150af25
-:00a8e0726cfd46777a89cc354167c364239071
-:00a8f0197896a7a2145a87ff4e3bfeb22d3735
-:00a9002f57d23f991af37d6f65b3b98e7eec1e
-:00a9109749a17ab82e7b8afec3c8ecb588fec6
-:00a920395aaf7325f6b7e7c363daa4daeaad1b
-:00a9304a16aaa249c1847cf2ad51831fcd3e82
-:00a940f8c81d2153e5553d2286f7f90281ad69
-:00a950c97e525a202bd7b17fb345f53f55cb62
-:00a9604a5b1b9b5e779bef3e1abd34a0cceba3
-:00a970af8b66142d33aa9013a2fdacfcc3cff9
-:00a980d2c7f27e20f39e248417e210a17e5cb4
-:00a9903cfdb9648544d2afeaf1cc031a439174
-:00a9a02b5e059492fb295b75cc782bc41a8239
-:00a9b017c0dfa3f2efa61f80896117a8f25c81
-:00a9c01f292dce7ed9b95ee7169ec0a24650e9
-:00a9d0febe073d1d43d1e343673cbe40c73c4b
-:00a9e0731cdb450e8ffc0ce9c632ec624098db
-:00a9f0e8f7f6d8c03b9b82ceaa2ff084b4dc78
-:00aa0014680e37b505501f779228c9ca9cc5e8
-:00aa10e5d2930588b5e472056d6e5822695a01
-:00aa20f93e9c71e97623e9da2d5a843063f6ce
-:00aa3017f580daf54561ae05b3a74499934194
-:00aa40c903da4cb751d57260fec098d77d3b2e
-:00aa50596d30f6e6f63c710d117406af9d0c2e
-:00aa60e3fa57d3ea561cdb4259b1a509aee368
-:00aa70c8b1f9c3faaa040c91a12f04acffde09
-:00aa8036384a80ec465d6772604cfd5b69ac62
-:00aa90db7c279db73050dfb1d774d1b3c84f8a
-:00aaa0626c662af82a8947d078849044621845
-:00aab092bb3cf74fad0b9a8afb51ff0176f917
-:00aac0208c844c525e2259a40d933e429aa507
-:00aad01099f8663adc2e454349085c5dc305a8
-:00aae0836d4103c58083adf8f1f84e864a75c8
-:00aaf027e55dac774bd82b16b80027585b51d4
-:00ab00a6c43f5ef6b097b9c1e0d291825a4e91
-:00ab10fb204f4772d1b618027809ac190951eb
-:00ab20d2a8320cc2c8816756c03261c0e7a20e
-:00ab3036d0536c6b4a95a1611bf72532ed20f0
-:00ab408d2891b4e22c00ee206bc1a77b78d048
-:00ab504438824a885a6f3160e24ae7e3b6c383
-:00ab6016cf391bd1afb6de189e6fe1fc2f6876
-:00ab7074c4ee6a5a891844302cddbfa521aefd
-:00ab80bfc8cc8e31313e89cafd01f9e9327fb3
-:00ab90586f78d5bc06b7faec9fa6eadfba363e
-:00aba057017532992a6ef9337cfdbe99e701c6
-:00abb08893f59aadcb226bcd2281035b27d507
-:00abc052901d039b75d33ea102cf246f452cb4
-:00abd0979822a173922a93a0a42483d99da8c8
-:00abe036f6612bd207180336b838982c8df756
-:00abf0cd6dbcd8bd440900c49129f41cb84abb
-:00ac0051224da683556d65996aaf5846726ffc
-:00ac10cf1c941bafb16a056706a8bdae466bb8
-:00ac205fdc40f7ac06aa66007adf4e8ab7848c
-:00ac30efa35a43fdce1456ed8414f68499bb42
-:00ac408e88fd7eeec2f7ab5cc03f83ae60094b
-:00ac50c7c73b5e35544747873022d7d81ff5be
-:00ac60f6ab84b1ce738021c8b8806a1bb53fe4
-:00ac7065405425cb47b9ef3df62a461235693b
-:00ac80fdd321bd7b5d9f5dd5e708aa122fed5d
-:00ac90490766ed3eee0eebca2fb9c1bff7228d
-:00aca096a03730375e65d530dd9f8cdb5978ba
-:00acb0c7930fd5caf7942e650f2bac0cd4e0fb
-:00acc037c941477b5e8271bc5c30f988d369c8
-:00acd0d5a6bff0d93e318ecfa34426cd9d3d3e
-:00ace06ffc049009c0e45a5b9d7893599e8269
-:00acf0bca3ea0898e6d1f40de5f0558e1b68eb
-:00ad00d160e5ab0240d896a6ea28962fcfdc3c
-:00ad101d5deb6549c1cddfa177f7f701cc2c18
-:00ad20ac0749939691aaf5fcc2596daf07e21b
-:00ad30a47f33c3b6b1748fce315f3e8758d6fc
-:00ad40ca560ea0ab15d83cf492bce2abbbf498
-:00ad5087489d055c3e0f4d9381f8833fdfe4f4
-:00ad60dff2cdb1179954b71f82e985c76439fa
-:00ad7099af0dcabff70026dec4456a60098b3a
-:00ad80f286d862048938693cf654f1b654a4c0
-:00ad905f981630421519586078d12285711fb5
-:00ada078d66cab585b2fb247c85a05d82029e8
-:00adb0198adb844caa552ca7e0dae4e96c85bf
-:00adc0a5e9b444533876bf43f0b468d17ae9c6
-:00add0e9859bbbbf4b05480d1f425da689860e
-:00ade01289474d69472a3398b22d08ab89e925
-:00adf000d8b79d74fa64c2a1441cb6206c04dd
-:00ae009ead0912ab818b01c1cb1ea25df6116c
-:00ae10cc930d17be4b8c3ba6772212c3cc0ff4
-:00ae2052a3202a596b8fdd6abfb2cab09c5c54
-:00ae30d9b880661d3047a8c0c6d24483f2ea51
-:00ae4043cec93bc69529b2e283c125f9c3ce28
-:00ae507cf7f0433f88977cdf346475ee6ce3d3
-:00ae60a59ea17426afe16a04387a2672ac18f9
-:00ae7066330ea44e3fdcf5563b02786dd6de89
-:00ae80e3654048e8fbfba7df23c22a447e8ac3
-:00ae9091158bf4eac751106b16e21c775cb901
-:00aea0c4036c004f7db4f992a2c4ba25d69281
-:00aeb001de41dae9e6d054a8599510c752f351
-:00aec022c8f6d1b6299067e91840e748d54f0e
-:00aed04026f25850a6536ebc45a0d3838afd69
-:00aee0e5e1089aad0ed26edf71c65c69aaacdd
-:00aef0eb275a871bfc09eee228b29e3b8a6ec3
-:00af00318868024e2555c67d9cc6d682e1f216
-:00af10811293d4d6b9669c673a496a6235af81
-:00af20c82434c644d7c24385678458cd3847d7
-:00af30ba7b533079e72f5b6554e722b2203703
-:00af40147a99d3ea0863016daae336c8c23f85
-:00af501297b4217fe80070befa30ef850dde74
-:00af6013ff25507ba0bd48e4ad7b0c3135c30d
-:00af7074fc3aa9331747a36fcce88dfe047915
-:00af809eac10e126c03a22629a2c4a158f2822
-:00af9057f4554808dfffb9347d8849ccbe0d5a
-:00afa0ef9d2b49be4991633f4f2264af5e0e47
-:00afb06c262bd051969298e1c2b84723c1a4cd
-:00afc0eb290cbbf9591c6b2ad84f0c6e32a262
-:00afd005f2ca209c5271248bbe740744241831
-:00afe0795974f6956c92f93a93ae0b6016093c
-:00aff0e76e0a8e6274be650883cb8e0ae4eb15
-:00b000db9c9aa7cd74cc5dfe2ec87f4a713eee
-:00b0107435ed1e9597bad5416e2ad729e3c728
-:00b020604e9dc47b8345cb884546e0cc3ad27e
-:00b030f97a5b99dc6dd7f03e11d82a8b9066e6
-:00b040aeb2d5c6795ef555832b790fbce95c41
-:00b050f546faa6cd6b60810c30a4881ed1cc50
-:00b060b7253e4ac4d8d0c4697a24d5e0102bb4
-:00b070851d3b186f445dec747fa77ec1caeeff
-:00b080ed4cf687c3b3475526b3ecb185dda853
-:00b0905f64909deaa8b9fac94f6b77fc4aec19
-:00b0a0e35f47cb3af35ba08c28f52356dd4726
-:00b0b003824bf628682fc500589fdb13ae661a
-:00b0c04164ac9c297e317bd8862edce9813ff4
-:00b0d090d84aeffcf85430aeebbbc139a75fe9
-:00b0e081b7d04d0078dd169df0cf754d86ba91
-:00b0f0d9b89cf53a98a92590cd894de84a8557
-:00b10066a9aff507790099f4629c9b4089ea24
-:00b110fe10ea3f29dd30718e4c1b28e2642b96
-:00b120760e7f5897858e956a0e3c45f7d73af7
-:00b130f1f8b5478e4257ff9f4d1f79c741018b
-:00b1404a58aeb636c4bc5659c75465786e79d2
-:00b150a184d4f85368b2235693a092640f6c36
-:00b160c86efbcacb540ae6cce58a1e0e5525df
-:00b170c5221115ac0b8ed5c4806f691a60d8da
-:00b180ef5cbe78f3056b4336f47ca41abe2e04
-:00b190863ac66a6ce6b3050cf274852d57f35c
-:00b1a0899319e4f62ab723e29c9d912f6cf991
-:00b1b0e2d35b530b6c178ad38d3c838a57a990
-:00b1c0f3f0456d1094876371a7871302a7a0e9
-:00b1d01e0320de9a3d5ce2b485db9111eb9ca3
-:00b1e0ed1011d557aaf59b47fd8101e434ba7e
-:00b1f0a2a1c98195e237c7ebf448d40458c372
-:00b200c63c4194c3b73e2c684487acc2fecf70
-:00b210980c02206cff627bf0084a3096c73774
-:00b22028c75399223c1d630bcd7ea44ea5b639
-:00b230e408e8d0fb77732ac16f782a3360a4fc
-:00b24054e098f1504402d9fa22147941f4d776
-:00b25074e83e037f3669f5b2539d6bb4bc600a
-:00b260cd72eb25522bdf291806a4e0e2bf938a
-:00b27071a3c7732a439f86911945b63a8d1f84
-:00b2805a2168d28315d7da0c811da46fa3b19f
-:00b2906471476f9a169e306e38be61eabaede0
-:00b2a0c73882026473a0f2889699c0bbd4b4fa
-:00b2b0a444844262f5eb3377f71634a1139a50
-:00b2c0f814d16b51dcf42c0923b230fbe8b17e
-:00b2d0c23848a77c09aa173b210572e7b45c48
-:00b2e00089e78978d3dfe7fc96a20897412a17
-:00b2f09036dcac1a34bfda5bc5a823140a9ca5
-:00b3004d667ddcb7f424269410e99700e6735a
-:00b310488c9c97fc17e28e11e58fbd8ac31735
-:00b320339bbf59addd8b363b48dd354532c573
-:00b33065a64c98bed4e17fd7cce186ed64a936
-:00b34061f52d658ade02e2a786e1399b3b33df
-:00b3503bfc1ddbab3afba97ae697dc6e5cc442
-:00b3601f7a5fec82241f3b834df829f454c618
-:00b37063da665dfe894983495ea2daecd41ec8
-:00b380cb4206f8a49d1b2a33e5697a11e82410
-:00b390d9c940b1b008a4755d41d673ab7830da
-:00b3a0c1f51d21189ebccbb31560096a030802
-:00b3b0d46a4141a42ab1cf64d75e6cfa4f197a
-:00b3c06efbbb253b790886053d7b7aa097d4df
-:00b3d06fe0ce3e30ef4183d95b3d62d2e49b9a
-:00b3e07f429661d9be75417ea699837ced1406
-:00b3f000f13e695161680b39e3e39ab99dc59a
-:00b4007fed4e09511e3984052ffd84cebe590c
-:00b410700557aa4b0db18f4d30b0aba1d58ef9
-:00b420625fc4a38d619b427a0e1c397006eb9d
-:00b430389072f818f8138be9fa27a0ac8c5902
-:00b440df7fe1dc24eac3e718aa0c7ea3d75343
-:00b45099f5857e5345d39abd095d0a86bd0206
-:00b460e0219cf9daffe60d502c13f715e0f5c7
-:00b47016f0737c2455736958420ffbacef3873
-:00b48058aaa7376399f7dedc0e0b34dc559e3f
-:00b49009a6d7e2a74583f69e7266ed09459d39
-:00b4a09c4be948d89f88916ade88f68aa5b3c0
-:00b4b0a28084aecf568077f396a90b8422beea
-:00b4c0ddf6337ccb56c146cf264f057c9e8a35
-:00b4d0689c16a1846f97fe9bc0f5e7c8e6370b
-:00b4e063ede387c694d550731e94d7f8d342f2
-:00b4f0541dc33ba57d0f79933c0b36a98d3e56
-:00b5006108332af6b5a9c5daff4b41e02cf21a
-:00b5101d38aee3be962d18c21a8833981b83e8
-:00b520de14c786823861b406600078578fe054
-:00b53037a01268d54c74f47062a8572d3d0390
-:00b5403edea9e60ff23cc52b247f913cbf6ed4
-:00b550b6218b8d3e25760d1b7210a383b37da7
-:00b56091ccc423e65132abf6489ead3ef7af9e
-:00b57038308ddcaa857422bc7b27025b9a920b
-:00b58049bc237aa089f5891a75d35d274cb04c
-:00b5909063819347afc9db7981095618f4d3de
-:00b5a0ae2ce57a007ef5fc5048e1b2a28d12b4
-:00b5b0c34e1f65fe923bf56dc734bde89859ab
-:00b5c0ab312a53639c5d33c01cbcdd55120e3b
-:00b5d03355f8e26711640a8d3a858930880ad7
-:00b5e04476b72aed776c7014cbd87c62fc9d36
-:00b5f0287ede35ac9514bfc7bebc38ee3c7969
-:00b600d7fa9a468778a3d252f71acd08cca065
-:00b610fd66e1e7d68101813e2eb124ebf00486
-:00b62022e08580e38efa81fb3e2fce43f1d9d5
-:00b630c68631f2970c7e5dbfc62146d209fd6b
-:00b640657330de0e8e4c414c39160fdfed4f6f
-:00b650c125e96c775bfbe5da9f2eceb461d018
-:00b660c6930076a5726a1b46f846fcda769cc0
-:00b67048beb2220ae07fd413a2ce83a44c3756
-:00b6803a72e6c92744e27551595431ad4f3598
-:00b690a3993ca1b0f377b294953317390cfc28
-:00b6a053976e9097581b18a30146a4c132a75c
-:00b6b0c0e2602bf9225b86f86de9b8df437c04
-:00b6c0a82f70425453864fcf2c62e055ee9ca6
-:00b6d05a54ac651fe09cb19ebd047c60c07b65
-:00b6e02c5758d4404c1eab789126d51de6cd05
-:00b6f043bacca1e6198637df6b1deaaf3ab2ca
-:00b7008ab5830064d5e4db9e227f36546a10e2
-:00b710f1d66a20cd645ac7b1ca8b697983428a
-:00b7205858f1cb36de497a739b89b521f1e6bc
-:00b7300d5f2b9bbf00b60dd7354fc173e9494b
-:00b74040b2f8b70c0717b11dd1ae4a346ce32a
-:00b750af1e8adcf456f177ede6f7e7048a7307
-:00b7600d63000c6a3f1a17bae6d9ac6a95997b
-:00b7705ccd66e50bc7c5b7df5ba7efd3afbde2
-:00b780a0d97871964270fa79b50073f266bc44
-:00b790e169b6479dc251cd0b10c0fa78bca044
-:00b7a074a597a99d847baea5e2f97cd84b9bce
-:00b7b0ec2b3bb2b70792218bf55120922c0ad0
-:00b7c08ada6c2624e40c52a6f14ff0f60da17a
-:00b7d0e6cb60a26162435f1c8bb9f1c3c879cd
-:00b7e069942c4a42a0213ea5ab804e3b38654d
-:00b7f05ba359bfbe290ba1617414a4699ad250
-:00b80014cc68feb9708d0ce5b1dfdd5498486c
-:00b8104b73d7d9aceb68516d7ec7e0a75e994e
-:00b8209b928f8da3df8c9700fde995f31cd8c7
-:00b830da3e8ae05f324480907e33a0cff9fe6a
-:00b840c52095938452515e4550602746d5e5f2
-:00b850fb94a04be7b52669fb48ae1685a9cab6
-:00b8609029c017a23ad88d44ca994753a4a2ae
-:00b870db47fb3bc50ffca36268059ec0307494
-:00b880fe73e6ee16e0f192fe68115c64497612
-:00b8902f7defe3d76514080f2df1dac0279d0b
-:00b8a04ef7151621152c107cc893762258cde6
-:00b8b0ff93ac6ab9fd70168438d8b7fcdf870e
-:00b8c030ce64fb38480fd0fd5c120dc2e596af
-:00b8d006c8e07f6f3f92d1bbf1703d01acfe38
-:00b8e0006aa3b670516524a14be76de14f7bcf
-:00b8f03c8311d78787637eed9597336a5a2428
-:00b900e2f263208daf6d145c7f18d366ce7eb5
-:00b910c1a84edb6e1bf3f91f806416ae9a19f2
-:00b920f9c0cc4b41f1e0ce226cdc0543c7bbab
-:00b93005417a92360b8adbf0d4a120e1fdf623
-:00b94083f34aae8a863b39d2af95c92fb8ebf1
-:00b950f2d1a97b89e9eb4be3070e2d6ae5d774
-:00b960f5eaa4d296d80f576e4b7ea90c3526bb
-:00b9704695ed25964f1cbb373b4f7948aa4e9e
-:00b980006ae4945df4f2197eea3e283eaa4c7c
-:00b99015f1577df69486ea00cfeeac9a2bff6b
-:00b9a0381d6743dec439983e187b3523d1e9be
-:00b9b0820d450fc5d68bee2bac1c7e3c551d22
-:00b9c041bb388604825cb81a8076ebb9e054c0
-:00b9d0b9e34672885835e3593341b8d50cca21
-:00b9e0dabcd37c0b1b5f8c0a8fce0999323b2a
-:00b9f081c15cc94449b978e77025cfbffc2a79
-:00ba0019f76e36f257b9721d086990949d55c3
-:00ba1047d2ca90973b1cc723f0e7fb3d4557b8
-:00ba20f99054f70e7d36c8e9fdfbe383f99eac
-:00ba305a064624b67d406f7ca2997e0aa134c5
-:00ba40220a5262224ce0a530588b52907b290f
-:00ba50ad8de612a87235ba16c3e3184901aa68
-:00ba60e0aa43ee4d23aa3b6a36533a54d7483d
-:00ba7079f7e0ddea4af23787fb07b3778a378d
-:00ba802c40a98cb847d96dcf63094fe40ea04a
-:00ba90158f237859a633a1ffb9712a80604228
-:00baa08140e7bc255b49ffe8c400044f346b64
-:00bab04ee743f8a53a05dd92c19ef21285e1f2
-:00bac01f1b294592d6e651dd33a1d96f246080
-:00bad06ee796efec6856811ef706ac48ccc8c1
-:00bae016b2677cebf2c8054643fd9846c9e779
-:00baf0deef99bd3a60b4e2912dfa4fc0648244
-:00bb006e9245c9de41ee536c558b959ccfb712
-:00bb103a81229bf31695bf6b99cfa7a503c3a9
-:00bb20425a83a580fc68c506b43c4da8e0165e
-:00bb304efb65c92fbed3b0710c2bb9c0ed9bc8
-:00bb4081b9e51bce34464a2ce6dd3bc30337f5
-:00bb50628f7de65702697bf539cab622b8b57c
-:00bb6016236745da953fe934f962af83ed3b9b
-:00bb70b6962bb9b613836c67d92559d882b331
-:00bb80001d94c5468d7f5fc970a8bb94e3bb65
-:00bb905de76cf073d07ad425e9a497f4cfb538
-:00bba0b8f2f54a161f7c11ed94455e4ecffcc3
-:00bbb0f177145383b9a34ab706828cc2256d07
-:00bbc09839b8f9a7bfb4bfed9f3888424ffd9a
-:00bbd0c713905d0fd58a087d1620e729a655ab
-:00bbe0a0f32a407c4cb7e8ba73b7a53b742383
-:00bbf0981333e29b867f81ec036781a6069e3f
-:00bc009bce96baecb47db4b0dd170ebbf43e15
-:00bc1038a7f54ba49812c030319784f299b949
-:00bc20a56efcdb8a7a681da200798fe403f000
-:00bc30b267fd9e871ec4306f522f4b7c2f141f
-:00bc40e40dc20ba2d4ccf75e14440936041c33
-:00bc50232ccffc334c648cee19bafd86ee5e4b
-:00bc6075d608f1a8b50f0c2d764d0e5baa6ae3
-:00bc7001f198b37809646552abf0060adf92f8
-:00bc809cdacae16fbf4df720cb66c563d3b78b
-:00bc90dcafb7e828318a9a5b6aa7d9278de9bc
-:00bca0d142607a5f71f36e463ae8f638b61ec7
-:00bcb002c43c980f7b725532823f3f2cba65b3
-:00bcc067824a97f39d4b546961de1efe6897f8
-:00bcd05b0419efb4125cb909744fa1037408aa
-:00bce05417fb7ed4fa8411d2492d25869a6707
-:00bcf00591fb3cfb2f9b530ce43493a732422f
-:00bd009548efc554e5d34c2f17cf232da969b9
-:00bd10a5a7abf5fb2a8420fc57a612cac7a13e
-:00bd2094fc8648fc47449e178bbf154eb97113
-:00bd30ba089470decb40f322b033e4ef17384e
-:00bd409f61b6368f0c00fe10e07a39148ce746
-:00bd501c3b599d5db3afbfefc1c00a3000dc1e
-:00bd60912d158bd076f9ec843bd0470889cf3e
-:00bd702cc74586b1d1f5bf810db671beff2b5a
-:00bd80961ed9a510a434542681eacb317810b2
-:00bd90efbdb9a88ef41e73c3ecf80d8452bd67
-:00bda04e84ad5e0d9482813781ae518a84944b
-:00bdb0671d8cddd44fcab1818d6fe337b9a882
-:00bdc0305cad6ff56ca4f0ec206edeae3a7e62
-:00bdd08dab5a777ee72222c770c225b17af14b
-:00bde0fbe9afb9cf96ed3c43be1e9db6e2745c
-:00bdf0f04aca4c5b3a689f6db323e179185d3d
-:00be0048eff0ce2d98ccb3db9a948a8262934f
-:00be10bf7dd6cea743c71bacb9844b2c825bce
-:00be20b6ccbfbfee560a1e8f6be805effb8447
-:00be3020020c3c518ef6ba0a6a4b9ac386677f
-:00be40d923626e0baf4310388cb818b6adc432
-:00be505d270cda0c11648213d7beff42dc0ff5
-:00be6033418f83bf60d8fdb70c34c21d34ef24
-:00be70780d7ec7028a2b6ca6cb77e7e5341d5b
-:00be80a4d6c2e403b2ddaf3ee401aadffb486e
-:00be900a8e6132c606660068d78fad5915db5d
-:00bea0546d92ffc122100acc822c2895601ff4
-:00beb013200cca3f4e173f33b90b98ac705230
-:00bec05370bf18fb6e4e87388a407cab992199
-:00bed07fda359516085e1a5b80be53d7bf48b2
-:00bee035475a37a08202300a1e3ded7ae88dec
-:00bef0d51126ea4ab724738f835903ca3b8f1d
-:00bf00f6a18e1517e3f2c1009aba3ccc1b1b9a
-:00bf10c123e2382011df61d12a62857213d343
-:00bf2050d66e1efea9e06136c15f0865f207df
-:00bf30b85aa5f11fafdb3999dcdb51e0ba91fd
-:00bf405ea3c2aa13477c433a64e02e7cc4bcce
-:00bf50715ae990907799c319df975cf25850c3
-:00bf601dd6cb3d91ef3dbe3351a096359df230
-:00bf7024d62f2580e9b9384e77759db6bfa170
-:00bf806153db964cfd12746974cd4c28c91898
-:00bf904f4d2032efb12777f64476dfc3ff0968
-:00bfa0622d49c7e4757a8a7ea94369b25d39fb
-:00bfb0b6be3d4efc1a1c0ea6259684ddd790eb
-:00bfc0aff38004fc8c16f4c349584e9091d5e2
-:00bfd0fadb698b3c31547a75b5a7cf14804216
-:00bfe06689f94a7f77c277c848796fad5a60c8
-:00bff01d0a2f52fa290f9302edf03a18b68e49
-:00c000833e602d40d7d927934cd68f97d353c5
-:00c010777c01bbde3390648ad4282a1cef51b8
-:00c020b9040f91617d798e435b39129a65da19
-:00c03089161b2b96330bb6c5206c0509f0b2f8
-:00c0408a3d564d1cb76eb1fd3e2d52c54ebce1
-:00c0502c458d63f637d561ba235efd3998b426
-:00c06066357c1128ae70940f641018e5a659db
-:00c0707e418b195772a25d43ad3126185f5083
-:00c08062012203456e1803118529f8e4190463
-:00c0909266bc6870757d91bc6ed22924b60016
-:00c0a065b7d3c0db066e486a724e976a1bb7f1
-:00c0b0696a4703fae2ff6fbe6d06eb7452807f
-:00c0c04a31b62a0dd9173a747bd678b03eb663
-:00c0d055f064585322ac04e58b0f2d6b281127
-:00c0e037727e2fd0dc1c950e88878b0412432c
-:00c0f00e9e5c4a187203ac174f5a787c8b6642
-:00c1001535905dd3411d46482a6c475aa634f2
-:00c1105694ec9d33252cb4a9945f146513dcea
-:00c120e950541438d99318267a8012feac9e89
-:00c130b6ec823bb788cd4e6f29c6913ce3fb95
-:00c1408cfebc6d146bb25b981c9f46847ec76d
-:00c15095226923ef9223bbf78ecc9407970ec2
-:00c16041219b5e68b1057280bf50b108f9ad78
-:00c17017e587a86ddb58f46103b503666be71f
-:00c180edce93940b3c2f0b7f4c454b52878888
-:00c1900819cd7380c310347cf777a114dc1042
-:00c1a02cf69fb3994055a8638063fca90b95a8
-:00c1b0c4394c3070d30235f8e32c8d9c3de4a7
-:00c1c078ab1f77e6412d7e42538d4589018901
-:00c1d0db8b00aaf73ac40ee108f962947add54
-:00c1e06921fae458e500094064e8007f687bac
-:00c1f008e63b64cd84be248ccb4ab5150d84a6
-:00c200470e103f9ff977ad0e63b2cfdeaba7cf
-:00c21094deaf24ea5c8541d7a9a479e83628a3
-:00c2209c37b03460b40dde1d8ddb9c34bc567d
-:00c230a1464bf2dc983b0794f7c7b2dc104c09
-:00c24026c8f33078997e5212745cff286c02ed
-:00c25076afb4687057a4408c1f82eee0049f7c
-:00c260ef267b657c7029f05be004c93e6ff098
-:00c27076709b3b5678f343d3b3618a5a4ab02b
-:00c2805ec0c283da65684264a3f7cbab5ad890
-:00c2905ffb1a184a66e704912010eff0bc7719
-:00c2a08073a398dfe60c707eb8c025b74f0339
-:00c2b02c6a94d27fd9d628c3a5c1d6b843ac42
-:00c2c016fadfd06d2ed8066f7bb1c9526ad2f7
-:00c2d0bdb1fff0b5b9c7aabefbb1d2a944acf0
-:00c2e0c38fc3be01b64e2e138ac35173c4edb7
-:00c2f00607c86b93a1bd72eb266232860e73dc
-:00c3004edf0febaf29c844e5de234fb0558a25
-:00c31010790fb0f0c698373d418708951c650d
-:00c320451adbbcb63852bee749b5d3ee4d5a39
-:00c33004136e2e2d87a722934f9b4ebce3456d
-:00c340c2d23b641fd865a0e3dfcb5cc9a66f79
-:00c35059ca50fd90d690bf258e394e8a50fa21
-:00c360d120a21d5827b7bcfc6a72b72408b80c
-:00c37047d883f1a5ad89f79d0834648dd9c444
-:00c380f0f1c4a780ed2a2aae1c04c72b669b4a
-:00c39078b5bdc82dc05dbd334daa35ed29a9d9
-:00c3a0cef679fd85f5b51928599f70578fb25e
-:00c3b0b9c2cf4642c64a819c84f5af1340d890
-:00c3c0d4c54cba7c61caefaa3051ec995353fb
-:00c3d08ac1933e5b41245ee1b954c6c5335660
-:00c3e01dbf1c4dda15fa19a2b693ff749a838b
-:00c3f0fcbfebe130158a4cab0c71ac099f40b2
-:00c4006f542a6fdf49a9ed5dd113e4a7dd95d3
-:00c4102178831c1cdd4034754ca81ac43bf8cc
-:00c420233fbc9476ef41134cff592034b611c5
-:00c430bc45402ed224c6a2c82b39748b9bfeab
-:00c4407a1c14a89643c7a1010d79ef4c9c367c
-:00c4507eb8fb50564becf3bc37f03e4824b894
-:00c4604e494b5c1978757da3f0523f68885dbb
-:00c47025c9e5600163136df9c1fa5bfc0bb3d3
-:00c4801d58b2afda0e3f631fe03be45945bf6d
-:00c490f128e3071b12b2d097d96d31cb7c60d8
-:00c4a074079d8b66f6e956dfc19a6f301dc745
-:00c4b0fde5236d88c315a53cb4aa5a736c4138
-:00c4c0315933c4e1331b22a4ce189edfc0a2df
-:00c4d07dd649943dfefcaa5bdc0bb82f5dd4b4
-:00c4e0540b58ab62d9e784b07d0453250106f5
-:00c4f013550066dbb74f7befb3a923ca5536e8
-:00c50022c26a7abc3540a888ea4126403b9d78
-:00c5106142491a623767e3905d133b79c02c03
-:00c520d8e6a7991f7441fd6cbac1c7311f3e70
-:00c530f45c13300e2c6f3111fcda570e1be98f
-:00c540d50ec5522c1bdb7be3f7f11d6cdf42aa
-:00c5507ba4d5416425e4a4b36884be7c39eadc
-:00c560c6bfce5832e00b8624d831fd6ec8442f
-:00c57012eaa436bdd5e8307ee6080f59b027a8
-:00c5806773e327f226ff54625ef90445adedbd
-:00c5905d1995333499859c550016f2d6cffbe4
-:00c5a08123efad9d14dbc74af0b5d65e1ef267
-:00c5b0e87de63793870c8ccc11bc488b388df0
-:00c5c012a104d3182b88b50b3645a64a424385
-:00c5d0447f6cf8f3dc152f5acec4f87025ec60
-:00c5e0df6d3891aa6c896104fd1aeb494dba12
-:00c5f0b36e81c6d8a3eacd5dd2177c91584cf3
-:00c6007e353ec26dba76d26ebb0b56f64fc02b
-:00c610a31ebe22bdb7937cd2d4baf333548c6e
-:00c620358dde05d89c2df5997d5714f77bf395
-:00c6305be7b861b7222baf932ee11d5f02ef70
-:00c640a54a0645f7eb4ea0eae2042d47164f43
-:00c6507eaceb7b2a4468cd69b5479c35c4400f
-:00c6605c04ad72f0b15cf42078142f61ff845b
-:00c670db7a14fd611e921a434538c882499039
-:00c6806f0b8532b63a1fe1a7abd21ddd994793
-:00c6902bae08382f09f9fe91c4cc0966b4fef9
-:00c6a016c2ab77b9e40a3ab5d66ccd769efa09
-:00c6b02f578c577a781d23db1087fa6f47406c
-:00c6c0bb58f2fdb0fbd4c74dea1683f0c76060
-:00c6d0e80aad0fc3bc2ea40e1a6383db718bef
-:00c6e081abe553463bfe334e9cea0170c3fce1
-:00c6f018cc1c54ac18778ac7682f414fe11bfe
-:00c70021f6a7bfa60d38db28826c600fc8cd2a
-:00c710fdfd8f72dc193ceaf4608aaec3f24946
-:00c720821d3213ceb6af182e5f8d3e990b6a29
-:00c730576b187aa818fd283453d8f9199f5051
-:00c740a8ad7fd52aff7761c7e623ae9bb26dac
-:00c750fb844c568c22f427027227e524a6d8c6
-:00c760baa82a40af5add0051fd3b0ee6623d2a
-:00c770820557dab4d82fb5dbbefbf00a94ac7a
-:00c780c2e50eddf6892ee1cc9a85c3c05fdd2a
-:00c7900ac29c48687984053b91b3791d3e90d5
-:00c7a063d0bb318ed722c68addc94d9570d7c2
-:00c7b03a4f2e225b003419e7e199c4f9b4ab3b
-:00c7c05237949881f5c905a6b1c86475d7e349
-:00c7d05f1f92cbe2711b7b1ed293e7fc163be9
-:00c7e029ddc0588d406a61c6bd1fe162b367ec
-:00c7f0900e6187f634896450b39f82fd944363
-:00c800a3c205a730bb061ddeb21cdd5a86dec2
-:00c8106b8de947f69ebd181c160d09ee7c9fbb
-:00c820686778f63cb0ae69aa459ec6188c167a
-:00c8309453856fa18347b3a0d4f4ada7e29eca
-:00c840f6df0910ba87ffec49018993baecfab1
-:00c850a7c786e2ce444958577adffd71e166c5
-:00c860edc9965761461d027be84b04e5968abf
-:00c870345eec1853412e74159cdf14f916240b
-:00c880f3e6460d8669e8b7674dd191d63c18a1
-:00c890d57762177ba74542c6cbcee152a647c6
-:00c8a07132126c60a520095102c60e6247de74
-:00c8b03e1e807e6c3a7ca6af9a9a15cd10451a
-:00c8c08125006ea3980504b3fef09a123aa06d
-:00c8d0fd0314b898f5f403c2309daf4a0c2482
-:00c8e09008608614da25850f4e52866dd48ae9
-:00c8f008d695dcff574af2cfd53c42a7872d89
-:00c900aa4fbbffa4a97ceecab54f3d15e28216
-:00c9109d3adea3d3296433fbdfc1b2e4c6d063
-:00c9209427abd3510ad70391a0ea8009e3da06
-:00c93078d3e00ae919a35422eb87202f14950e
-:00c9409576d8967f7bf1d2b2e4dbcf49b18030
-:00c9505d9d85ddaa8db08cca8516e9c57e752d
-:00c960bb95f7a39068d13fb2344d6f3837cbf2
-:00c9700cbba3b85db3f3e4c4e69e522e16e27d
-:00c98080ab21800d987dcf54ecce480917c11f
-:00c99005fc4e11c58f00a019743c6fc553e6bc
-:00c9a0973050737833a195e033748c1fb22329
-:00c9b0fe49a89f2eeccdba7c275303e72e7f36
-:00c9c0e1448b4811d53a05d9a702a4b1cccf6b
-:00c9d0ef4842c1cababe599638a6c288088499
-:00c9e0bddae6bacdcc4b670228ab5320df9b7d
-:00c9f0ba7f5d44722e454c3552ab0dd2d1ca2a
-:00ca003e313b7bd408da5717b2f390a666a7ed
-:00ca10d294c198cac73b5069b353f733befb4e
-:00ca2057b9768b4e69bc1fbf53b89e11f5cfeb
-:00ca30d6abf50686e7bd09c0ce3e0e67384793
-:00ca40266d400c205238904f2fec8541896666
-:00ca50bee0ca6394e1b88b24a23d37cb292739
-:00ca60ef416fdc9ca8844e5a957fbc06c0e21e
-:00ca709f2f755565900186a52b7015d082b85f
-:00ca808eaa43ee5f109447e0402a6e43d5fd8c
-:00ca90a0b05bced5804a17e9885e2bf0ec15f6
-:00caa03f5649dd79e662fee955b9a06ec2a2a8
-:00cab03abaef5bfe3d205629e96c8be030baf8
-:00cac070920e558b332ca5c36fe809a7a87951
-:00cad0630e0d27a24df28640c840bce3555ce2
-:00cae05de68255e4348adbdd9644e6e27c6311
-:00caf0776a2a664a77ac975005b7d6521f66e1
-:00cb00a05dae6e189132e411d4872c0dce8715
-:00cb10b034b48a97aad4550c15cc386a190094
-:00cb20b18b193673063dd48804107146f29e05
-:00cb3045a6d52091d6846c11325eb251527fc4
-:00cb405d1f6f9542973bc777e44fb419d49480
-:00cb507b5cc9f1df8aa63146cb66dddbca6f80
-:00cb60f3fd64e6f2f4e664353868c61bc14738
-:00cb70a484d3f22d257c8c6ccfb42900c2783a
-:00cb80621b0eac0041dbd9647eb295e9f5020d
-:00cb90969ba1181cc239ffaf734d9a3f0cb129
-:00cba0df8ba0e9c3bb5052f6ad696305ebf49f
-:00cbb03a4882e85bbb32379d8ca1e3629021c9
-:00cbc0fad8aa10b359d58c3864dc3dc2e28dcb
-:00cbd0124f9e487a4e79db22edee0ecbb6a0db
-:00cbe024b53902be06db9cb70d8a0c1ac42f9e
-:00cbf09c929ce63a99864896cab32b988829f6
-:00cc00a0e14118ec02beb46bbb3fcc4932681c
-:00cc100b96ccea18252af2edd5f41ce53a64f8
-:00cc202bb4955c3a6179f11bf1fe902e42349d
-:00cc30928d592d02001e69890527d43a2739ca
-:00cc405d740829550539119696c8a624d66a7d
-:00cc50f472b07fae1455325a131efc13b4f46e
-:00cc60e3185cc933a50fad110ec5045bc5009e
-:00cc70d7180621a8a6c9c0388b3564b57c0612
-:00cc80c08118375ed88848a082b574807ae626
-:00cc90491fa2f0147f174eee73723a8b99646f
-:00cca06c4726d4e962e86ea40215bcce77c8da
-:00ccb010a94d17d4eac7f04e7a332d4726a087
-:00ccc06a1fb70dde2ed03ee0bbc35785a6a7a9
-:00ccd027dcf8bb782ad7d8495da01351743583
-:00cce0ee18c0b51fc7c54eeb3759b61cea4951
-:00ccf0c966bc3f2877e8f868218021e0426d14
-:00cd0057f177d0cf5448e79713a62d8f44fbf0
-:00cd1089aadfc1af714fc7c50472c024cd4c4f
-:00cd205fe5f35345d3c07c8cadc10b67be00fa
-:00cd309f62b38232dae977d908570860143f23
-:00cd4035f3a17885c02502185af32767627d4b
-:00cd50d5c5738da10fb97b38582d23050665a6
-:00cd605f83fe8af27ab607c37853ef25e1719a
-:00cd70346e44eddee0b2bb52156682f41bcb57
-:00cd80a61bc2dc6f7f98874bbacf9fadf8c463
-:00cd909fa66b01f3c8229bd399ca71fed9cc5a
-:00cda0bc3c26b423659ac29af42120bd68844c
-:00cdb0f42a543150944f05a91debd74a1a97fb
-:00cdc0e290c3a546e7f783930557de26ab9f09
-:00cdd043d7a22da1f9fc187ca5452ee3a5150c
-:00cde056e096db4e6715386210ae7bff0bfe25
-:00cdf0082b1e06b185bdb3ac0ed7fed07a8ea4
-:00ce00c4c65e1c5e8157e4b49dc8aa38c11117
-:00ce10b46e5463e9c1110006a43adcaf777c78
-:00ce20ca0c1c23e6dcaad3ecb81b5318d0b32e
-:00ce30d676a7ca0806cd3c99cc78e1732e80bc
-:00ce40ddc7b56576ccb49af768b3dc6c53e63c
-:00ce50637cb16bacc0b7258b31752a86df4f34
-:00ce6011cf81e38d289e6daf2b6d7f3fe7e9df
-:00ce70ba9fd923e424a4ac63848ce6e49b5be3
-:00ce808a726c81fd96918862cea8335bf12b8a
-:00ce90988f42723612768b426225cc6769995e
-:00cea0aa1fc08043253b39f3f2efb183a75549
-:00ceb0085bf6815beb19a0690047c035242ed8
-:00cec03978f6ac06db47b7a58c6537ad47a2c4
-:00ced03d1c023aab3fc0b99a28c25cd1d7bcbf
-:00cee046774b537dc09b6dde31fcd0bc79cac4
-:00cef06d04b6cdef3546030e4519cefc48b626
-:00cf00b9aff2f9023ec68fce666f9768ca9b2c
-:00cf10aecebe5dbc5e7ad11667ffeea521323e
-:00cf2008dec1d05514a1f414d8ebd48f9dcd02
-:00cf30feb7cc4b3d0b02f104adc234d8267bff
-:00cf402e723662f8b1bbdc5af4417a0697dc79
-:00cf5043c41dfda47733183c4abe6efb2ca3a6
-:00cf60a49fd5b13f6da517d7f80e15a362f9f8
-:00cf7035a4714c45fb1ad693c97e15d2873147
-:00cf80880553e0379cf5153a18b599a0fa3435
-:00cf90945bf789f9db40407cde61c2f0a6856c
-:00cfa038c144f294f2edd7018a7ecd51685100
-:00cfb0ee98304378cf13dbc94ba70ae594f083
-:00cfc048cf9c6f6d029f2bc16d99d2560b1bb6
-:00cfd06844780def10034fbac311a3f2c7b592
-:00cfe0e611195a0e8d81520b0a06521b73d768
-:00cff043183c57722842f1c765db541217e022
-:00d0004ea8ad64f25112306f8f68ae644f73ef
-:00d01048e77b2baee45c2d58f62d701175c464
-:00d0207d8ebaaaaab915b80ce59e5610144619
-:00d030cb84f6fa65df988e4b7c8cbf2b5b9866
-:00d0408b78751978d2a557e5209e8816c2ccb8
-:00d05093b0bdd0ac19e2454083bf879a67a04b
-:00d060c84365fc68a32d75c736f7b3e4f04a02
-:00d0703ea451c7d687336a3631af2ab15649e3
-:00d080605013d52143c83a23196a0738759c52
-:00d090f2fa1b7c38fba0ef2253dcd77ad7c57c
-:00d0a0c8eb143120aba38977f736fb438ed60d
-:00d0b0ed5fde52250dfe5c8e80447da5dbd9e6
-:00d0c05462b22cee71d9a1c77260eade3922d1
-:00d0d0b7bbed31942509de5accb481a7ede7b1
-:00d0e0a419beb297f199817fae16ef63def824
-:00d0f024b30092c3c72dc43ec5903615a00b42
-:00d100ec50c679b44d42519c85dc866b845cc2
-:00d1100e47e8cceeacfe069986f81be69eaead
-:00d120ff5f050d27d3ce54ef0f8d7eb955a3cc
-:00d130de06d13c59ed81c563a9174702cd19d4
-:00d140885a0ef16aa97cd6472998dfeb0a86a0
-:00d1501554694e7648a49cd087fa8615d59bd4
-:00d16071b8a05918bfb04f39eedd21d722a697
-:00d17063571c46aa1a39b42c6d7fc63b833b1e
-:00d1800c2dbae19abed90f1d525595ff197b61
-:00d1900d3b8655d065c04816c9cfb1594119ed
-:00d1a08b5e3198dce3d300cbfbb0d4ccb5bf46
-:00d1b0ea8c9d9dba33aecf8f35fb009987de8f
-:00d1c01636bf10fbf77a196e7b17879257b89b
-:00d1d072f92c178b6efed11e2d8eb618f60f10
-:00d1e0f395bf18265dccf6bef6b583bfb31bfb
-:00d1f0bef4856057b229239a4978b9ff9efa5e
-:00d200d75e733a7ad73ce6ab3b7e47eb14e61f
-:00d210abb56f9c78ef9a84f7290fbf3b41298f
-:00d2201e6e400a50c6680102094ada4bf2fefc
-:00d230ef6a0db03758e931ba5fac494e111d91
-:00d24051ee69efef6bdebc4d2702501e531a00
-:00d250c3ec3fd67eedc3cc9f0c3d8788d0897d
-:00d2600c493bd949fa047271159f48818274be
-:00d270eab767aaab23e1a2f853e6d89bcbc1de
-:00d28076cb1127642745373460126e06312156
-:00d290cd5386c124de76de0788f3d4d9664750
-:00d2a011c254b4b2caf8f6c3ab4ce66a1b5a59
-:00d2b05fba3d8f681288e070200e767925d412
-:00d2c0dd8c6f360a348d05f17eee5f892c70d2
-:00d2d0dd967f7d542956d900221aebdea56a1d
-:00d2e0c50488960f1250f1a890bf398ffb6bb3
-:00d2f068c397b9fac7d15127bdb928ff830136
-:00d3001a762be3448c7893f66a158209b40b05
-:00d310868be1151b052db8d74967c480902310
-:00d320829d96fbfa019a8c950c7090b40cfea0
-:00d33025ab0392e51855573a44443bb51f4872
-:00d34025bb4ed40220d141faedaa0fd8ba3203
-:00d350ac9f54f2627c30b204644abdcea3130b
-:00d36032674855307a0acb4b65cbe621d6909e
-:00d370289b581f4a475cbbb19f6efad0884f39
-:00d380e2d35a46a927f9e39bdae77c2cef6551
-:00d3905de27a5e997a5d851ff1242bf2a9f896
-:00d3a007d3c51db15823011b6c8cafcbed5a06
-:00d3b04cd73b8d0ca6faa562ebbf5c5d9838f1
-:00d3c0d17ac3ab94e8d68413f009b97dad4b11
-:00d3d0355df1e38af45324a96edf446774f416
-:00d3e033f7822a6d6df973323094ea4657fdf8
-:00d3f0632b5a27785e69fdf50b1ea43917da16
-:00d4001854aab6e9b0be5962ae20808dcb145a
-:00d41031fda4bc4b40bb938d49ba21900a887e
-:00d420f44f20e63ff56eba93f23de3f9b2b34e
-:00d430a7517c2a8b8687cfa94eb955075d99c8
-:00d440c71168182ed569000e59a973c34a5a84
-:00d4506ddbede11d0bf327c95ce7100d01687b
-:00d4604d6463389b4a6d87d449cbe7df1513cf
-:00d470560d2646d0ec48ca12750fc6bf7f5f71
-:00d4809aac34e446ad035e2578d169c6b99c63
-:00d490f9a7d5b11731922b01b9791bf9840f39
-:00d4a057331f73868d33699dc238b7573568bc
-:00d4b0afb4d1560443db2a78b169e2e2a78187
-:00d4c082812964c301f4f2d3ab32b24ca8ce4a
-:00d4d0d26b3a1958abbaabf2484bd609a0bdb8
-:00d4e04fe3730a86e6f45211e0f0f1673d81d4
-:00d4f0eda696303428448ecfcee0fc40f140e3
-:00d5002bcc260028cb84920cb65bd036ce0cdf
-:00d510677342232ba1fa056e96d75e3d51fb53
-:00d52024ea0dca2f2846d606c2fbe2fd50c546
-:00d530dfc65a97230223703ab5b96e591492f8
-:00d54055ff48c65476197f2dbcd34914d34f2b
-:00d5501563f4e90356b25c9f65a33a35f1343f
-:00d5606a41991c4b821e5274bee73f145416ab
-:00d570db5907e59df2f891ac949e951f8ce475
-:00d5807f661ff00e75de0f4bf55420b62b42d9
-:00d59098afc96fd6bce67851200daa0cb830e6
-:00d5a0d9a3d55f2b79f7bced79c06c44231149
-:00d5b0405c02ee94055bb01280e12123a14650
-:00d5c055ebe50ace1036b4afbed0807e82f40e
-:00d5d0f0bd12f2ec5b6a5867549d3ef841a273
-:00d5e0f5e0ae78945bbc6a8a2ed79142155d62
-:00d5f052f6e333c28ba9d65f2708ba925f9a8e
-:00d600f6484a3d9f02b15f1849bcfd84ff8ad7
-:00d610ffe8459410c3429c114acbba6dea28c1
-:00d620a2ba88b2cea4986b3ba20077836566d9
-:00d6307c121f55c7dcc8e9dc3da04d74f16622
-:00d640a0c2087265a346e20bb53539ba73e7e1
-:00d650023c122e597d7397bdf01e35b5153908
-:00d6602561c9a9d6369e9ce578750b2be13c54
-:00d6708558ea8ff257936091ab82f92b66f65f
-:00d680c824f3c3c0c04c20f6e6b4ba69412bc9
-:00d690c5fdac87ac4ccd7df848d520cf9a5554
-:00d6a08d7d991bef4c8d1813c8f04a637a76de
-:00d6b0ee2c9162c15383b5d0829639a3f6be40
-:00d6c0d49aa7cedacb852c3eb39a227d372bb6
-:00d6d05e1efa72d850cdf81d1c1aa321e3a80a
-:00d6e058b8f05755786496dfb335ab95f21637
-:00d6f0d07ace5e8470292a5e3a53dfdec04a01
-:00d700a5b9a4f0f05e07783a4b0b92dd86360d
-:00d710668378951904a7cb70bafc5862ef9dc7
-:00d7201dea2babf931c44c1f88b64a7f92250b
-:00d730162841aa4576b3bfb8fbe3aa33d56e9a
-:00d74096614f59126d7d408f4dce6ea501b046
-:00d750597adc020663d9d227d2313344699152
-:00d760b6d46f839b4699a7cfec130f8078ace7
-:00d770571e9618b0dfd55b2d9373941c703eb4
-:00d780779252c1d616b6102c15e5074c468247
-:00d7903c6471171de65a9f5b2ac546419e58a6
-:00d7a041117bdd890da6c1300b137f7f46857c
-:00d7b012e241ffe472082912af8b77e21c0caa
-:00d7c04a999fcc989f3349c3ea2ee8b0d785b5
-:00d7d04dfbf0fcd29909c51a6e465eda6b9324
-:00d7e0fc324f02bb60b6077d79c6ca6f6c7960
-:00d7f0b9289bede33c92fa2b765029a84b6528
-:00d800f81e21b4b90148ad4518f43effb73252
-:00d810bcc7cfd921e8257f7b0208d21f245570
-:00d8209963f69f5874e3a141867418e7b65e9c
-:00d83021d92d526d8e5fc1cfe77ac74a3d7605
-:00d840ad68a3df8f0259f8600ea1c2b910fcbd
-:00d8503f674f2e0897d688c0032192fe6eb7e5
-:00d860a6d21736ddc443d54f2dcc66e0dffb2d
-:00d870dcf25c1c6431c58a7f7694eacabb99e5
-:00d880e77a6d0f7ff36e15cf2fd1638f488837
-:00d890018c11c00edd2387ff1ec071605b456a
-:00d8a00743eda7dc7c4b77b102412a3b814f75
-:00d8b03f10553f51535d5a0ed112d23974d872
-:00d8c06fff99994afaf997436a30cb5eba8961
-:00d8d0ae36ef342bab3c0ee3eea2fe6847db69
-:00d8e0b9bee6956d822fba4058dca68be80494
-:00d8f060d653469e6a0cc8b3c55cec9bc7a996
-:00d9001f3d2eef473d1fafa5dc5097813cfe08
-:00d9101352ce8cc5ed80f4609519b5747bfc05
-:00d92047ba9798d2376e863a401a52b09b8f7f
-:00d93007491211861e25558328ca9a9eeb3bd1
-:00d9406796f770095bc3520a32bbba835e4c32
-:00d9505c9729e911690836f43dd474ac5a885f
-:00d960ee9fee6cd4ca49cc9e488a9882375b18
-:00d970f6d0be77aba24078498837296f2d6994
-:00d9801bf86dd03c58e3d791f13110336058b7
-:00d9907a87379e013ef740f63da25f5c42391b
-:00d9a046fb9eb714c79f2281387a1e72217360
-:00d9b0cf50980cd5fe8c3944f310c680d5f8a8
-:00d9c094be9fb75d94a0cf176ec19b86cbd149
-:00d9d0c5ff83e6a1331bb79fc6a4c85ef69c66
-:00d9e0d0ee6c81f01032293f3b838d372b83bd
-:00d9f0cad75b405c0b44861eab2a850d406401
-:00da00e8b91a19daffe62b11ae08c5ddde85aa
-:00da10918c384ac2a0bb2dc83557d4fa3bd2a9
-:00da20ac467ee5ace4ac5ca68556d12ffd63b5
-:00da30b002445c2e112a83a538dbcc7c1fe323
-:00da40b2c3cf98fbdcbf22c126b787f62f5554
-:00da501a01855f2e5daf07342a9b2a10a02d6f
-:00da6075b930e171e8af477726a48bdaae57d7
-:00da7006ea10f8405f4b51b59b668bedfed839
-:00da8024b86f4ca81917161323acd009dfa30b
-:00da90f414c3cc346fbb8365bd2899da35632f
-:00daa07ea19f854efafb914371861d5ac527b0
-:00dab0c3f72e6bc6b755be5019caf832c0edae
-:00dac0e0173346f47dd5ee8344ebe68329f53e
-:00dad09702c0879d48de4d8b284de863f49b29
-:00dae020d9a434056527ec2ff4c46d9c6890c5
-:00daf0e69c9ea7e11424fc7e6c9bc80227377a
-:00db00e1b1288e4da560113e54127afcea6e87
-:00db10ee17e9bc61292197957ef4e0ad0dab4b
-:00db200a451b771d0b1294fefaa41f89d477f9
-:00db304e70f8e64c3beaf3be1f425d9fe24664
-:00db406fce45b9e968105e94479590aaaf50ec
-:00db50663676d000f98fb1fadb588b1605e557
-:00db60dc0d2aaef7e38ab582894183a69cbcf8
-:00db70db32f7fc275bfec0f675bbf8cdfab6fe
-:00db805506855f2ae1528fcbbbbc21c53c9a10
-:00db90cee3452f29a8bca2a083a7f6e2b58693
-:00dba0ac42fd6be76204dad05c376fcc8b41f5
-:00dbb01149cb17eaa5ccd3e3c1535b93609e8a
-:00dbc099bb1a87fd9a1caa3c05685eaa256bcf
-:00dbd08f9ac83586f108e5964827f1a35c2613
-:00dbe0b534bfe364ab8a8b28d4f68ca188e782
-:00dbf00a406ba0b311d919ad3199ec6b0241b0
-:00dc00a2658be02ee0d3a9eee2c688c7a674bc
-:00dc10002a21089c6d641a2f858df75dc87ad9
-:00dc206bff30438cea43dbd8b2f2b019138809
-:00dc3091df4e8b847b8bb3187e382ebe8232aa
-:00dc40c61a7d7cb6963ee52c2f14aa9aeea131
-:00dc50a6bfda9477040ce322170f42a07ebd12
-:00dc60ab895a22c08f2c0cc261454fcf0ec3b1
-:00dc70dd00f0ceffd9de8f4f4077e966e26510
-:00dc803a7d59d9635b649c94cf2c1325351b39
-:00dc9042de38d11e7ca75ccb1b6af858379186
-:00dca08981578d75a93fa9aeabb3760a71be5c
-:00dcb0d279071c1c89997406a86f3ce49f1fa3
-:00dcc03eb9890ec40e80b2246d70b186c449f7
-:00dcd0420726f63e039f97803511e8d49f5269
-:00dce0a5f282894472f420bd318cdd66bcc074
-:00dcf08ebe8ba3540c19d9a62d80450943d867
-:00dd006eec126c9246776ced4b929c6cf8043e
-:00dd1098e7bd415a35221e524ac75f031c0aa4
-:00dd20b52e814a735aff7c081b086d6057ebda
-:00dd30d74e636b1ffb37fa464e5b192ffcbb6b
-:00dd409cc68b7403cc33d1b14f298d60037221
-:00dd50d11e6d7d277e5f5bf7002ca7202661af
-:00dd60fc45e9f566c94ff86db26ea831947739
-:00dd70f1974dd575dc86a465e098e7d1af3449
-:00dd800b33ac6538b79ec88c232fdafd283094
-:00dd90fda9fd9b92752830f4fafceee442307b
-:00dda0abac3eccd084b6d7a44d3e0bc76e7bb7
-:00ddb04289a819c416bedbfb913df2600f2d7d
-:00ddc070238744a68b1e2d2c75167e933e904b
-:00ddd0ffffd4c4a0b7710fb0802d28f5fc2e01
-:00dde0b770d06827b1ceea87c901f53d24b5ce
-:00ddf0e93688e8f433bc69f7c258127de0e273
-:00de00ba48865bc6327cd1f9f7f5ef7284bdbc
-:00de10237e44cf3c9056185166e62a8af26c4a
-:00de20b49bc71cdaa170406f78316935753d9f
-:00de3033b6e9a467066d310ea802c9a8b1db7d
-:00de40be51c8ce10d1e239a0150337c698ca63
-:00de505e006272475ad5037cca1966243595ea
-:00de60ac1d247c0af721402bb58877e099e720
-:00de7041bea9ab1a2622bfc036dccc515609b5
-:00de80f4e7c4c093aff7709c205fe27194dddc
-:00de908ab7c72dc0f9191d4599fa3d25f940a5
-:00dea03c16c01d1b0744af12402c2646bb1a73
-:00deb03046637cb65c24a33eea2d1dd83c8768
-:00dec0741b7869fd457b2bf3470a2d0575e74d
-:00ded0547dbbf6c0c5f8e1b83759073eee7f04
-:00dee07b96a296a5c436d5a06410c24b2a6b1b
-:00def06600a34f8be5255a564ad98dec08270d
-:00df00902e906cfc33d2b9889f2e9572024aff
-:00df10a2dfced18e4734d93734f87807920e1a
-:00df2088e96f25ce3fe87e849eac46708c672d
-:00df30922e4dfabd52df399269fed7f3d08775
-:00df40e689c639e10eaa2bdcdabd330dbf4e27
-:00df500264f198a9931dc185780db8bcbb877e
-:00df604f9205e1153b5cb4bbda819f0a48967a
-:00df7038c0200107413070d735c887dc5ae0c0
-:00df80097687e7832e0c56d80072756fe0efd1
-:00df90aa31fd328a21535b07467713ffb63972
-:00dfa0dd079e27b6f94b533e626134969635dc
-:00dfb0a7886f58365b1afaa56894e5104fb7cb
-:00dfc028318d6f7e064e9194f1de2ec1908cae
-:00dfd0545d5abc29226292109c2f34941a5626
-:00dfe06b48f9277ff3e0ef6ba06252d81d1987
-:00dff06fdd854be8be0a584565270614ad2eec
-:00e000de2cb425bb4e068432699fdd97604127
-:00e010ec1e86a597f2657aa289c0d069629e29
-:00e020a3ba93b129797d0d05e3554daeae193b
-:00e030fd4bd17b998b5aee4c018f0d58c63a25
-:00e040bea3ad385819af4797e81a63044cfc2a
-:00e050c49b7fa689764ac3af4c6ad5d221e262
-:00e060b323fd0139674c1ccb340d2d78d919c4
-:00e070bf2ed2569d33358f5d5f07ec96830999
-:00e080aa4b850da0c97adf3dad09b13955706e
-:00e0905d75b30d0c9248b82d7269776d5ce247
-:00e0a0cb5a5b9bdfbf39b33fb2fc328e0571e8
-:00e0b07059da69357b99fe910b19bd1167c311
-:00e0c03e8005e1ccbaf0db01cfba870f9f5ba0
-:00e0d0a61f2f661c629ebd3fade5c4ae7aaca4
-:00e0e0d27960f04a8197655934772e6265e23d
-:00e0f021fe4d14d989f81b1184c2ca4b67bc7d
-:00e10075c0de37a88a0ed75138f85313cfd602
-:00e110c4a285488132d041de9fbb0647d368d0
-:00e120d9252604dab6fba5c59daa8f40c0bb92
-:00e13049b184716e622ca3274875e60f996d5d
-:00e1405b0e159db8ca9aec21554408b6f619e3
-:00e1500744430ccf35320577ad3ccf2bdf355c
-:00e160917b4d0e3ffef86f59b4ddedefa48e5c
-:00e170f5e68f958a3fef714487dee4d5e9cdcd
-:00e180bc3171edf05440b7d414a853f925e7fa
-:00e190cf124639599c06cf481dc04524b1bf25
-:00e1a0b75c6d0c7d526790e656a920584557e3
-:00e1b0ee02fb1ff853ddd3bebca0619d663264
-:00e1c0e625b6a10f67f82c1da69c77523eae6e
-:00e1d0beb1d30655b5b66893c9e478e6b8cbfc
-:00e1e0aaa36e99b124c8b351d663dc5de4cb15
-:00e1f0e986a6b6fd7f7ca3207ae6d467685b4a
-:00e20021e44a8e13f1cdb285a5cf48b7f19a93
-:00e2101233ce033631b9032555e3767368a5f8
-:00e22019fed623cd0ef362d3745e26572d200c
-:00e230554d17547fca0b992ed77f7c9f8792c7
-:00e240970db8a43a43bca74b708235cc0d31cf
-:00e250ed98b0d6acf8578bf1d1d83d4afc46a6
-:00e260257f59dfc2dfe2da95af904ed4be8e62
-:00e2706e963cabce9dcb139b3c134ebb6dd924
-:00e280d784ec23701292391fd9a07c37c75c18
-:00e290863969b9370c3fcf06cd1ab4cae9e919
-:00e2a0cd0597e396c4b58677a96d5553883e2f
-:00e2b0eae423330a066905be4f5391cec9a49b
-:00e2c03c9fc2b6388862cce22c2471ecbdeacb
-:00e2d08625eaca3cc0e0eba05a1898d8a0d698
-:00e2e04bc407b9af12e4b6531ef0db24b40a28
-:00e2f0b0e383520494b4eb6c7fb1468b2ead19
-:00e300b0e2937839a2cb421eb1bc0757a77466
-:00e3100da47d07c8120fca3a912a29db7fea3f
-:00e3201f297792debeb916688a79ce271d03bf
-:00e330fd86e6a6ed35c38a69b082bb99b6786e
-:00e340fa22feb2071f6288979e4348b647c078
-:00e35047c160e4347432d15b11253036dd0922
-:00e3603b6947b2e59d1d04f253312254c08c40
-:00e370f947086dddcbb242d1884bce9cee460c
-:00e3802a9ab53af07e93d3507820b993b48529
-:00e39062ad97a86d5e5847e5769be983ad7770
-:00e3a08242121471a37f4c38c3d8008e079178
-:00e3b00b087dc14aac56b3491ca86a15d6ecd0
-:00e3c048f8bb326f6d7e1ce893a9fe42b8cdda
-:00e3d005fb26f011b29d87916c5a860956d1e7
-:00e3e0ea355e29dad04944d5d318390d6e97cf
-:00e3f0e51a18053c4f24feccccd0a2c5a5f294
-:00e4002bc4cba4a2f1b98375a91cdabcd1257a
-:00e410313198ae209f99d409755c6a778ac533
-:00e420372d801f22bfd3f68df15bde060b3e28
-:00e4309ae594b34ba99deeb38db35e79a10fa5
-:00e44029db665219e336e9eca2b2bb70aad331
-:00e4500e9bc423fe814ebd2eb8a80bc7534edb
-:00e4601ea8e0b2c48909e32f992c28a0a9e467
-:00e4704aa7ae6b72419d31e1bb2138af2cd062
-:00e48051e578182e32490e4a63e3885c97817c
-:00e4905701afc12afee3c9593d512488792aec
-:00e4a09ff066c1830473c0e6695332e9b70335
-:00e4b0e90dd13f99618f5bfd21b26a7d2dc763
-:00e4c0c472720ba6bfcda5814d7c079ec80e19
-:00e4d0ffe7675e9a4bb9aa011c45e2ec4b589a
-:00e4e0c4f939ebe631b8609370aa404989e8b9
-:00e4f042175ecd95f2f183fedac528c7f77c63
-:00e50089c507ddd6d787f6716ba22c69fdf4c6
-:00e510abceb3e388e8d7f7f0bc6b44fd101055
-:00e520b07a41a4f204cad25931701ee0df5dd0
-:00e530dd0b940f60c3b8d12e4ced156570b8f4
-:00e540f95534f99447cd7ab3006e1056fd74a0
-:00e550fc4f4e7d08b9928ba728c2bd20850c2c
-:00e56059634788ba8ea7c549e04a4742c242b9
-:00e570d974bf2e1215d703dee0331bdc66f591
-:00e5809b440342bd6a46b019a7212d9537fc5f
-:00e5907f3ca1cc8633231898c0849bee668413
-:00e5a0f4b250b6eb05356a1f337681a7182c4d
-:00e5b0c783e1284d6a8a1e49267b6debc752c5
-:00e5c0aa41ce9f01491c8f30234fdc802bd2f9
-:00e5d0e2515efccec5864c9cfb8202b79ce45e
-:00e5e0f5dbcc7cb4eab98cfd04c1afe7fa126e
-:00e5f07b3b5ca4b1b32d6b410929bb9c56ae19
-:00e600fc0e9aca47651e86d723cd21f789d680
-:00e6102e475710fd81cfc67d3fe5c3552c9aae
-:00e62064e9a2a1a57187b86063034c30cfe6c7
-:00e630546dac50457d36f0a5fa7cde49ea07d4
-:00e6406d7f532fef135db809285dd21a61e26b
-:00e650d07fd9e9523faa938bc32ca6ed6e3061
-:00e660d50573b7bda4d64d16892d3c00a6b0ca
-:00e670111ce7c266bb2efc6031fd1a09b5054b
-:00e680dbe4d575fa7b6982e8212d6887d01c83
-:00e6908664a585c4bb6dfcbce3c8cf58fe2f49
-:00e6a011369b28ba8c1192a0d476bbfcad6386
-:00e6b0c7b2888be0f93e23d6c74be3c8145b79
-:00e6c09cf9ee1a9b82ec5a8cefe32457500437
-:00e6d059683172e990c5f0d4c3977850001c36
-:00e6e07011cc08e77f9ccc01b928cfd828e06b
-:00e6f064dfa021f153b032548f09f83eb03814
-:00e700376e5c2fc805a1545115659cb2049112
-:00e710821cd4bb961e4bfb7a4f0dafc7e04f7b
-:00e720fda60b885b0e878df369905c5df217d7
-:00e7300b3901ce20ea40b3290af5ee3edfa27e
-:00e7401ba6f82d5d81b0218f29777419056493
-:00e750fae03d5b8addc7d2e5843db62e2be001
-:00e7607bbd47804580114381462b82ae0c44f9
-:00e77054d1c1ce18b2b6207bab143afbe20809
-:00e780e0f75e3af1a36fda8bb32fc8184afdca
-:00e7907b08f60ff7f16341f252067b44620094
-:00e7a0c2799e7afa651ddd79b8855c1f18c98e
-:00e7b0847f005085d54bb706815b47e2f4f0aa
-:00e7c0bf274a631e529f2aa25e2e9a3a6b4b41
-:00e7d06278436e6e7d1ca8491caf0dca6f1208
-:00e7e01ed4b2a4328ba23f45174067800999f6
-:00e7f0b4026bbdb01015f46e5575b4630fb6ab
-:00e80017e7d7a9182b78b3ffc1f9541c67c7cd
-:00e810f47bcd587a01531ac71d25111a988ec0
-:00e820d1ce235892b59dcf6e3193323261c13c
-:00e8306e05c448d9655c8689ab9a1504a7f540
-:00e840faacb650879a45c12283cfca6bddd60e
-:00e85034798ce32562fa0533fabbf233254113
-:00e860a4357ade48c890f2b18eda4f4a0f0a2d
-:00e8705a71c6562d699ad7ba347ed9e8f4ebef
-:00e880c266ca9bee2288d548486ae9d3738d44
-:00e8902bd60b4eccec50ddfa589e693fe547e8
-:00e8a06b1dcfad7f8dc0e266d3d847ff25f294
-:00e8b0505d6574947cefd968e8ca2d04f928d3
-:00e8c0760b152278392aff73feaebbf357d2bc
-:00e8d070a0dc3a0eca8dd33a0d755ae43e1af0
-:00e8e0629c3f8fdab2b7b664d48690ce0f4e61
-:00e8f07e5910902eff3effea123ba8b458f896
-:00e900b5f8ead6aca3d523f08f670823deff2e
-:00e9104b35c0ccbbeb11c5c68e6cf961ec586f
-:00e920815c344291e2f83a9929c3b1b5161a61
-:00e9304d4c6a1bfb94c6832476a022b85dd3d7
-:00e940fe90b9f293338b573bda6d71a1a0b480
-:00e9502a7a31d2a0673f186a9a42cc72bdd17a
-:00e960649db41334c4a0be5c06fda6cc82b29e
-:00e970769c8a8608f3c530f0045f20c8f7fc2a
-:00e9805f841467ce620f55d151ea7e3b0ce196
-:00e9906b6ded435a0d96c74bf4e9a7a25de576
-:00e9a06c1904565e8b0406f6d0c59200edd3fd
-:00e9b07c60cf86b1079bad50a526e563d6c632
-:00e9c02e137178c7897635aa126c03f92c1f75
-:00e9d0d3653ab89d6e110bf8ccb2a5d613a132
-:00e9e0d1d3e385ed3a95bf6d70f8d75d7926f2
-:00e9f016ec931c870e62543e4b182ff16dd05c
-:00ea00b160f1a5237b5cb2f064dff4da4a6d42
-:00ea109bfa45f548a48bf336b232b6cfba921f
-:00ea20a4ae065d5ce6e0a0f12451542e5f89d9
-:00ea30ae32511d480c64222f66d53cc35e235f
-:00ea400676e5307ca8eb2c183d453bf80940cd
-:00ea50d105b349b79f6c6c7088b13b8d806543
-:00ea600efdc424565ba633055173ba5ca6f72b
-:00ea704059fb2905b1044f401ed4d3c05b679d
-:00ea809ddbd104d8389f6328128a9e84423693
-:00ea90c9041dabcdf8bb5e12d6c3a8bb2e5d0d
-:00eaa097990279047102521fbba597d30d2219
-:00eab095a3fc4e064b4d57eb3f9fe22a63504f
-:00eac0d9b4880a649d3ba00f0eb78f9a0a944d
-:00ead00107018b942bc20db05805769f1f833c
-:00eae0255bd7f7c5c574e2e4d8c56fe8e0f7f5
-:00eaf0c60a37c05bff5b7e55c4b237f914c119
-:00eb00ca55f42ffa73393838731e4cb3550e7f
-:00eb10e801b0abb9fcb5e5a0175ad01ad68d9b
-:00eb20bb021511b470e800f389a58276fedb1b
-:00eb3001ab370d19ba92bdb9504f87102c9002
-:00eb40e8dae2c04b7d60c2aa3748722cf01cc8
-:00eb505980d99462f40a75a3094ab2c2187fe8
-:00eb60545822e35a02437975980ec09b059359
-:00eb7040aa20af5be93673c69f7168bc5e1cd5
-:00eb80c9f756f7c0782e115dfe24ba440f4657
-:00eb90283a82d46386c32bbbf684e987434284
-:00eba0df4bb768bef7372a8ffc1614e05bc107
-:00ebb0065a06cffb14a2e50b5d9cedcad7f4f6
-:00ebc0ea9980209d34b724ba07349b30bb1b3d
-:00ebd03477939f0b8996dc18f204a359486b28
-:00ebe08980eaa0f79d11505cc698d44724ab6c
-:00ebf0de481efa1f0889952f14f638729872ec
-:00ec0014d9cbf56738b5c1c1640714471b30a9
-:00ec105ccd494bd69365ad0bf67e1095eaf161
-:00ec209bb422a0ec6a71b98f31b1cdc7cbdfd0
-:00ec304395ff1c89e87d84ac37605bf65d6d10
-:00ec4053cf14777abc8e74259132e77e5e5ea0
-:00ec508eb9b30a8feec771421b2cb18a204283
-:00ec60a3e1fff9b1277da46e796b36e1447162
-:00ec7029b3e67badcd02b54ee30f1bc2dadec3
-:00ec806abc160240be14995b8e0213b477206d
-:00ec90ea7890d52fb133cfe22b0c63e6f3a3ff
-:00eca0ce6b5ae23e2b11a1bb9872d31447a7e9
-:00ecb0aa293de5d7240ab8ea16048f12d340fa
-:00ecc0a2e651e639dcd07e5fdf1e172092f52d
-:00ecd0d3027f41d961b1179898886d0377c6c8
-:00ece0df08ffd774031394b031db3161913217
-:00ecf03555388bf2862faba9ebcd8bc8e942de
-:00ed00ef6e9778dabc499fe5eb856cb2531d64
-:00ed100d935980d933a39c97c05f9af541800f
-:00ed2021ba8aa958417218b4f333edd4fe3aa2
-:00ed30c84bdea07ba902986441f77223ba667d
-:00ed4007dc7081846677a6279598fc1a97a2da
-:00ed50f1d58e29611a7e1255549260469b6ff7
-:00ed603971af16142219b72a0fb0d1a49812e5
-:00ed70147e76742a368c91567d2ad545ceb18a
-:00ed8085238b02105a7bbe573a555587064b99
-:00ed90aa8c63ecab80077c6b513c8b754393eb
-:00eda0198308e7422c4f9f24dee2aaa18fda77
-:00edb0521a05e20172188d022965040fd95052
-:00edc06b2a4120105d2ca56712f8174e3c15d8
-:00edd007aa95850302708429e59c6d8cec18d7
-:00ede082a099e25541ed836e612816378df50a
-:00edf0b2c6c014ac593bda7ccf8242c1673c77
-:00ee00d997747a1573df0e2e254f7638aa7da6
-:00ee1075cc63088194546790cc0fef5701af01
-:00ee20033adca25defa6cf2c46c5ef387f1036
-:00ee30190f1646d14aa3a4ef282246ad8a0c40
-:00ee40bfada944a778ae267692d88da543861a
-:00ee503fdde50d122d2329426dacbe62068ea5
-:00ee6013c19237cecc8267cfc3ba8887656ae0
-:00ee705453d3cae6513c3c10d43b9a42814d9a
-:00ee8054ea9963c686a519782a5534c7ba3704
-:00ee90f205439f73b1d22a85fc4cbb4743c8b1
-:00eea0e87d91a0789ea657f5d30b926d5f6429
-:00eeb0479775e6608c3302e94ef05ce337fb64
-:00eec06417a425d02f3969f73517972243e3fd
-:00eed0d991d1bc3dc9dea9ff32274657114090
-:00eee0bf259541ae265cd8f962a88f463fd6cb
-:00eef07128542470cd1f7beb566ebab8646644
-:00ef000e4ab79f698a04754eea1d4f4a8bf18f
-:00ef1056db13327e6f535ed280ae094d21f91a
-:00ef20b41490f38c29924ce81772f32bfe5e74
-:00ef30f09ee384e42520e85c269a7a96df6503
-:00ef40508cbd193edc0b193f55bf3972858bba
-:00ef50263e4e1e86262466506b46818a16ac9c
-:00ef60c9296783806ba102b77c0d2bdc3e48bf
-:00ef709b4a8dce0ed1063069fbb92f1eca5463
-:00ef803ccf493a8010f3408ec73602a6beb9f4
-:00ef904a088d89db5f1c1a6144f018c78b8f1c
-:00efa0e33dfeee621751d1736bf6b34b58ede4
-:00efb00e18b330920545bb4fba59d36b6b443f
-:00efc01f6e28edbe65b7872c96d1a1d4dd9492
-:00efd0c05aff3801e74749910e2741f19bf7ff
-:00efe0a32feb879a177865c2c2bf1b8189f8a6
-:00eff0f130f1d690e9d4714b4c5f093852d570
-:00f0007ae559cbaaba12694fb4be9d940a332f
-:00f010246b415d9540b50f7051f2c6476086fa
-:00f0203a7ef2b9fe77914bb3715f6aba2eaee9
-:00f030fe1282ca2f890c413addd4aa27901ae4
-:00f04044bae5b126d637508c912fc56159f25e
-:00f05088cda78a609193e1ccae33892ea7bc40
-:00f06080bae2636bd046f3572ba0bc70076ae7
-:00f0708a755b4d069e84767ec1772323e5421c
-:00f080fca23b46378840bf1c12a9b1dc1dedab
-:00f09004d1d95815f7a6ec6fc099b90270799e
-:00f0a034310a1ad4c23e5e297efc6e8c218aaa
-:00f0b0aeb53444f3504719cf376f6c280730a7
-:00f0c0b1035238b38162a95d4afebfd077d247
-:00f0d097e70fb5ff39e3731a2aa5cdda2c63d8
-:00f0e0c57d58a39a1e25b2db8e1f94a7d75b64
-:00f0f0f87f634aa29c29b42d63bf1a03319ca3
-:00f1000f684bece057267f65a3c1ac8a3b9af1
-:00f1104e1227fe8087fcd70494b7f4f6328ca2
-:00f120bac5ad722a926487881cf9e70fef3e87
-:00f130a112a1118014e0117c750e3c8b59a304
-:00f140b84c04fb0e35d16d21450b7ba533dc43
-:00f150b6c9c15df3a483c1b12bdebcbe99edbb
-:00f16019b562cf41582800bb64ffe8fd7f85e0
-:00f170aded78b7eacc65fdf2641e2282e89234
-:00f180d54b1bcba89ea71f82da783639b60e01
-:00f1901fb97105772bab953cee5b4284f152ca
-:00f1a0bdd7f4f042be779642cd377661af7233
-:00f1b09f56de102299a50227d21daca271531e
-:00f1c03d25dd96a35871e8170e3991413aa118
-:00f1d0cf556338dd7ee1578fd2193d98cbd4d6
-:00f1e025b3043aa06b86f4ca427db4ef7ab664
-:00f1f0807910c32056ff4bfbbbdc4c9fc783bd
-:00f200b2c94670435b177824d5d8b80cd57d39
-:00f2106a581b0f94fbcfd172c96b1623041708
-:00f220b5acda2e9c6d476d625da3b52e841272
-:00f230b916b3e77e3af83dfb2f01f41a98681f
-:00f240582056594d5d1ce6c9e4c6219bdbddaf
-:00f250fe9ba1094b704d0d41584a78725125c2
-:00f260a2338069491bdd8ada0cb007510b7e32
-:00f2704ae3a1b34b15636490d5ed8305e76940
-:00f280b19c3b2b4e3c88845df6fc5da76800fb
-:00f290e03a517b1f4ae5faf4445ad98b694b0a
-:00f2a0584c539904abf23ae3d0a051ebe30ebc
-:00f2b01b4c44f09052801df3e4179fd63aa029
-:00f2c03f0f510fed811959d76bbbfa5dddb268
-:00f2d0a0661e4a724007b8138189ffa5654347
-:00f2e0c30ffb60078b07725e91a3cfc16b1c48
-:00f2f00aebd01a18557bc46e550bfdcd33868c
-:00f3002f73c087c19964e9d7528b92a3ae1666
-:00f310cdb40e09a0a85b505f328c81ac839e7d
-:00f3206c99ffaff1b99520669490d23e6fa4bb
-:00f330f75035498d751d099ced69c5d8b48d72
-:00f3409041eaca5ec2ee8b1fb14d71b48e574c
-:00f350a60a266ce516bd7b136c5828b21b3491
-:00f360c983feb2825617aa29c599865e870ce5
-:00f370594c65f35b2b6eabb010ea1b9ab999cb
-:00f38022758e68aee78b9742094bfb8b0b2d22
-:00f3903d8efe7869158ae596fe93990a086782
-:00f3a0e10504ad2f44688129d69001fab2a025
-:00f3b03021a1b1191c2797ce7b473bb4531da2
-:00f3c0092ab76f626717791ec3c8b1d91f7e62
-:00f3d012c84739d5f65bb1b2597725cdf2cd81
-:00f3e0f28770c4bc7b555136b8a309568fe4a2
-:00f3f0f9ce26f7d21ecc665ed65403c23ec6bc
-:00f400f0ba1011c0fc74da9865ab9040267242
-:00f410da4cd7013a1f30a176312094afbf461e
-:00f420802b4d0e6be12e903ee40e7a49a011ab
-:00f430af18269a9c9ded657d624f554404314f
-:00f44031dc01008476d71de69b905b76b6df4d
-:00f4507af9f969547b730b0375f2d13341f3ac
-:00f460841ae4fe4241b3c976d8cf1cddd22c2c
-:00f47029e08b639bff62714b947850f167cd02
-:00f480befc4640049b7522a4953685df7f2fe7
-:00f490f8e318b3f9573c4d2e1687dde5a58afd
-:00f4a015ac415868873fde04b465b33ef73266
-:00f4b0f7d4df93036e3935a9168e43b2aa21da
-:00f4c07ee42a8a9e8309aea3c3008c032f7f3c
-:00f4d0d5e569bd426a75ab9155821fd849b61f
-:00f4e0181232a6aaf971519eed54b7b9206812
-:00f4f05c6083db0f0add9d91a5afaea0836aa3
-:00f500d65858038f2217e281e7e0d947d9ed6a
-:00f510cbfeb25403fad539db8359b1fbd99e46
-:00f52068628f84a57ad2ad8f7aa7a27fb05fd3
-:00f530b67d737434ab5395e9f11c1facb0b956
-:00f5403cbbbbb8cbe553d5a4ebc0373effddd9
-:00f550f328bcb1c3133c2a3aab7fed526b6e44
-:00f560e438b774450da4bf9743c12e96108ca9
-:00f570b50466595e1b6568e432c9c7515d57a1
-:00f58013040d6b4bc3238d87a3c433886f83df
-:00f590c47e78f8c5e79496a780ccbb588c14e2
-:00f5a089890a852f1d2c2d8c15eab92f191a32
-:00f5b096b91861bbf0958de479a30947d0b98e
-:00f5c08523e7ee89c239443e6eb520fe949c86
-:00f5d008a0a884de915bed39557b37449d509b
-:00f5e0dc2583d5f9f6de2a841ae095f8107d80
-:00f5f0fff3e296d9f12ba3708b7cdda36ebc7d
-:00f600574d04a33d7f7166d5aa84a770f30d5f
-:00f61052e13a5efd6284b4c430ad6938e552fc
-:00f620758ba1154be8c5e23c408d29d3c36d89
-:00f630e72e38030a4c3f365769ceb32fbe14ba
-:00f6406a7a89010ec8dd29a19d98f3868bb9b7
-:00f6500b937bedff5b5a00a7ed53b8e4040b25
-:00f660fe7ee056210b255d281f89dc513f6366
-:00f67017f4c1bc9d7313ea1980c8a1aa2878c2
-:00f680803ead52b69426cfe05cd293dda78650
-:00f690409437ca872021a97324982b5b35502f
-:00f6a0ce9c2aebc649bd126d44490295587481
-:00f6b0d24422ab49366a5fcc231816dcdddc68
-:00f6c065a1ef1c05729e8a8c0d14454e606647
-:00f6d0d7f158bb8fc0c97fc47ef5e51a09d56a
-:00f6e000be5ffdfb6761c0a9f8dd2315acbc2d
-:00f6f0d70e626d5302d8c446f520e492a29272
-:00f70050769a9a940636bd4e4bbb59a8a1afb4
-:00f710bf7f72cf13a65c410408c439fa4f390f
-:00f720d8f1e87e9bf5b1eff55347792faff141
-:00f730a9e1c1ce947f9f5e42d19bb6160130cb
-:00f7402a73eedbe13325c0adf991b2804863b9
-:00f75064b95664d34afb67a11aa50fe41f2569
-:00f7607b2f91a092852ba016e161537af03e45
-:00f770242a801045f5717a8b4972c817e04da5
-:00f78057764ad65333700d1140c5fd625efafa
-:00f790a2c9fa18b978c21abf3a2ec1d0d37edd
-:00f7a069c899b1d27923e61413752ccf050ba4
-:00f7b0a94239a25f849921b35363617a21b941
-:00f7c076a8b62dda3216ab1c3ea70b1a8f0902
-:00f7d002d56e6a9df61f6de98ce5fca84d5a46
-:00f7e093da6a02e0c1a5ac4c2576932fd2c44d
-:00f7f0dc7c70fb7e5b57233c2bede1ac7370b9
-:00f80099af50143b9eed57cbb058b0dddeda84
-:00f81037e9a44ff2e2ba354282123a3eb6c7de
-:00f820383cc26c85cfff85beedeb0fefe1a777
-:00f830f6a6c1711b723157e8cede80417dab6c
-:00f8406317712e5dc1d77f03ecbbf5c1704b16
-:00f850492b05c10d24dba7bfbb9c7ed5f83c3a
-:00f860cd7e3789597de3ab3c3e21e05ccc4402
-:00f87002484e7833b02fbec6a9cb95865611e4
-:00f8807aa7aefc394c652403e89a8ed8bdc422
-:00f890ee6bcb232e47708a9c572ec664be924d
-:00f8a073e6d5884887c34888a0e6e5283949ec
-:00f8b01572ecbd65875b6a0f772c875d72b08d
-:00f8c01c9201c27b35c061baf6b05d6d40288e
-:00f8d01a1438cf609505bb64f5b396c849ddf1
-:00f8e0d10a2db8e29141d935fe629d13856898
-:00f8f04f751bdea9791eb674f0d9704040a274
-:00f90055ee97dd480cf625f6cb73466a8a9acd
-:00f910d0da133ef951773d7a0e126ff532b115
-:00f920e7d4ed06923f8f01e9cb653174c55145
-:00f930307d8ef5c4f4986c1807260e0bc35a60
-:00f940c2171d8935c528573b5d20e6809c800f
-:00f950b2f9ad6e7c114784e6b19d6ab34105bf
-:00f96063acaf5097eae505e8c592f65fdd4734
-:00f97044500e30b578d1d601cc0a00c0a8feb0
-:00f980dd897c1f78c2077049b35c8022cb34b1
-:00f990f23bce27e838d127e402024ddc94a377
-:00f9a04347f8ebf7ca64ac817f1e4d36ef531c
-:00f9b04f92572db75b1ca3c0ad32d7a14a2458
-:00f9c0d0150653920156988048b1eefb2b49c8
-:00f9d0f2cd6c1c7e16c129a1e19593f08c25c6
-:00f9e0c55b4df44be9b67e7d22dd3a6054c9bb
-:00f9f0bdf3e503f2003930726c7b3050734aa8
-:00fa003194c2eda51d785f30eaa647d1956f6c
-:00fa10d448ae77a2b1bb45ac0bb384aa790c87
-:00fa206900450df8d4f9e73f57519d952081d3
-:00fa307037e2bb7549862cd584e7b6851b55bf
-:00fa4048be1b3de9e7a9b709c208efe5d01226
-:00fa50bfacbb916a31c2e80afb86a1224accb0
-:00fa60381e0da5c2f68facc41dd3c197b2e39f
-:00fa70c0cec4efaf4c51aff5b45cc078a091c8
-:00fa800843c820b70a85b038024f36034c1660
-:00fa905492ac2d05918602359ef2db7c34f30d
-:00faa0ed35f4c0803d0efa83afc192963db01b
-:00fab084b217bdac0ac2be30081a9d5c63a4ed
-:00fac0068d571f2fe49f3588ab430550fc16f5
-:00fad024b9d95f2bd2462900295bec81f580ea
-:00fae03b19569df234e4294acec80c04f25b9d
-:00faf0879f636c8bf55e6c43de1138945ab6a3
-:00fb000081cb8941915152dfcbf9b9a1b8187c
-:00fb10e781921f06aa619e438d7d65a2f49783
-:00fb20edcec8159d01aa0aa83117aca313305b
-:00fb30e0c41e672b5cbcf929cb9e883a6fe33a
-:00fb40f11a9746b0bab1f926a661515187c200
-:00fb50dfb53419cb944043b5a1a985053c8d57
-:00fb60a6de645c1f0477e015d0e35ad8d9ec41
-:00fb704cdc1e905aca7714c8928ccd58b23e87
-:00fb80e9e57ab04f1d2f829028966b8c3b8d73
-:00fb9051cc9ad00c223d8135a8f37dad7d3ec7
-:00fba07b24961c238942fdef342aacd6d67862
-:00fbb021a1887ffc26e7c2d3204e9524e8cffc
-:00fbc0dd60bccdabb8c7f64599b392e01d23fb
-:00fbd0f1189afb8fee028497939a151043bded
-:00fbe082bff910c53288d457137392358516b0
-:00fbf00974fb4d11496caf9451f0466243dd5d
-:00fc00a6c281be437ea5772ae7c52c56bfd35b
-:00fc1010d97fecab8b28099b4bbc56422046f9
-:00fc205a2427f979a721a653b3c52b0f079280
-:00fc30fa26a6aac06e012c3cfd505ca2c01e89
-:00fc40b3cc1ff66f748dc686a4af5a044f2129
-:00fc50237d37ad6739b3282cc1df27a0f7e009
-:00fc6060c226719d58772ec7be424627f45c67
-:00fc7037bf8cce921f6c1fd1fd76687f6bb01e
-:00fc80f91b5068afa258fe8fa6ba14cfe07d51
-:00fc903aeb764a575163d2d2aec6005f82d565
-:00fca09282603187dc396228e8d17219c6b5a1
-:00fcb0350ebf0447bc35be7f45c56dcbee5232
-:00fcc04d93d27ee0a501c8127145b0486823cd
-:00fcd07b3e85f7286d8dc28e9fad3e455cbffc
-:00fce0f6a36c182ee6041e203b4de23767e4da
-:00fcf00b7ec5639a2c01b2e183ebf5dec3dd07
-:00fd00bf3caf22f72c6706d23d16debe2d1a89
-:00fd10716afdc7e2575cf1ce6061a73c746cf0
-:00fd200ddf95c7b092cbc2b1bd32fd7a87de53
-:00fd3050e7cc584eae3fc3352184078faf9c27
-:00fd403763e2c58c75c4335bfa1315d41fcd67
-:00fd50e3ab60545b08f45cf8287005f8979594
-:00fd609a1b82e9aa9d88091b9a07b90d21ec54
-:00fd70f4756397a9e41acb913d2daffa8b7ad2
-:00fd80c679d3d4b0f7d03403cb3be86da4e8a4
-:00fd9020a347e014a658eb6a30103c0bb29a47
-:00fda0eaae2f77ea9cbe7b29dc1b86ee10a1a6
-:00fdb01e1fa9edc02bb145b690f893881ecddb
-:00fdc03c7421c0fe73def6662e37264d13f04e
-:00fdd0ce5b3c86d64e818c0ee67b093becbce3
-:00fde07add2afaa944b3db887448ea68a605b4
-:00fdf0cd7e4848e4fb547217e45df4e0b29054
-:00fe00eca4cb9799988cbf466befecaa5fbb03
-:00fe106658ba686781d05cc86807fc41365bbb
-:00fe205d70c6ac43edd02c60fd35c94eb7209f
-:00fe3093d41fb52736f98addd487ad9a4c56ad
-:00fe4011a249824a5f96cb801e5d14db6d4528
-:00fe50cae22bcb0e794ed424f69514a0b07dbe
-:00fe609af555705288229e82af30c6f7a19b95
-:00fe7084455ead931615782078188beb014b2f
-:00fe809abb9bf768d5ed7c890283244d648d95
-:00fe90704cffda1314792c9fcf4c992b601283
-:00fea038983f51285b13607adc571bcd13bb92
-:00feb03c4acd2721f8964faf60b18717299ce1
-:00fec0d301056e99003a85a51260467039c784
-:00fed0430a7edd5c19f57d504b63207c4b7053
-:00fee0941302c68a6b5edb38a38a290e55cc83
-:00fef021441152bd5181970dfbdf69f59099d4
-:00ff003b2d204f8e65307d19446c37348d8693
-:00ff10e77a25b246e9791d9cf3e24d4c8b0c3f
-:00ff206e79db24a34e16adfe8f8111d3441274
-:00ff30d1c65c4fb27d11d97444522e7eb89455
-:00ff408c03eb76372ccb71b2d102ad2330dc86
-:00ff50fa093620cc44399ad4cbddaf91714cb2
-:00ff608990c41ddf8c49d309f6b3d9350111c7
-:00ff70f96c1f31b7a2a876fa73dc6f66d7cc4c
-:00ff800478ee015333e2320ee7d8c452bb2cd5
-:00ff90adf88ca76c91fd072a3fd09a4c71fa32
-:00ffa0c5cf662e95cd14a68795f5dbf2973d7e
-:00ffb0f00d14b5265c9e5d610cbfe4d5cb8d8a
-:00ffc0c745a8e6c1dbab4a5147687cbeaf5cf1
-:00ffd09d79988b71288797c0bb5166be306bf2
-:00ffe05a91917a94dbd3eb492babc1c3c5791c
-:00fff0a89d3213de31aca15908f21a2730a4d5
-:0100009fead2a25ebbad20eab8b0300f97fa12
-:010010cca678bdabff85c097116caa936ac6ce
-:010020a4b757a1ec5f3d149e161d33e10768ad
-:01003002b67b83f4e2a13c04424f659f606008
-:01004011ae3a63bf50ab3977404644e7ef8636
-:010050fc84b42a64bd18bef388da20e825945a
-:0100606571054f8fcf00e1b864d3f47727065f
-:010070a1065f829113bc9be26a45e4d129ce7a
-:010080227d5a87f432528d39f428887fc9f0ab
-:010090b27200d90c1268cb95751f9ca392a2c5
-:0100a076f4d1f8062bec3f82fa0c8cae7148d7
-:0100b0ae68e529c12bc72b887d52cc4152f501
-:0100c073389d8d1fbfda54e97d36581712be9e
-:0100d0461e297e8072cd3ecbfb8d42edfdf0d9
-:0100e063fbb2221f591353d221465c6625cc13
-:0100f0b5ca139334ee0439900646c5924b921a
-:0101004a17e210d58f9a572cde0095703cab75
-:010110dad172e0e6311ae0a02df2d4dc0b516d
-:010120cdcded5a4aea776fda46491f3cc96294
-:01013033b28d9b16754bcfa0522e72e742cc8b
-:010140e28157ab76bc8be2beaa7cf4dd8f5cc6
-:010150efea84691ccfdf63597d906698ca221e
-:0101604813ce4ede1efe6cbf50683da72b41cf
-:0101703549064b5487a0cc3839128f387c13ac
-:01018029637115713700b453988d676ba7558f
-:010190791bde631ea38099aa1930432a1d78e0
-:0101a013202e5f8fbc0205a795b5517c825f25
-:0101b088a5b3bd31d0ce05b61bf389c3e81ac1
-:0101c0289469d1a8fcf9f1b21ce06b78357497
-:0101d090a5711fbf8838548d093e4d2d70c3aa
-:0101e0b891746221b7ddbcf0e3547bb3150fb5
-:0101f0873de8e8b6dfa2b165a6e2dd2772b091
-:010200ebfe6b88c596a1db31b67ea583fe4778
-:010210d7642d442d65421b964f83180f1892bc
-:0102209611ddbe18e5d87d690ac7bf36d368c2
-:010230c7501e2fad2ddb45aa43396172609341
-:0102402f5192ec6d1276e80e9206e1f71dc9c7
-:01025064d0982bf01dd75ddd51ddb99964c449
-:010260ee529923f0538ef0a6cfb7b7e6aa5431
-:01027028af45cfaefaa9855a6df3dce7ebd705
-:010280c7193307bc8b910e3c6a1e3e927e0b53
-:010290178f7d764619ec0b3c0ab5486cc4e8a4
-:0102a0526967e11f67ddfb8c4ae739593d8a98
-:0102b019e99ae6d3bcf7e4eaba7f1e8f18cff4
-:0102c0b6dff697ea7f9cb07e2d5cdec848b917
-:0102d034ed72fd34112e395af23989c0517127
-:0102e04d6a56613383d57d17ce5fa08be69467
-:0102f05947f6b014a3287982cac4a55bea5ea9
-:0103002ae89f20666109ed83dd8c70d826c43c
-:010310aa3846222a4dba7dd624c5c64b2dfd6f
-:01032013042fcc5b50fbee873707278f82a66b
-:0103300327a512eef2357383e1396c6425c518
-:010340bcb5e79fb5c8057f5136fe154f90c90f
-:010350f42a4a84a80160c939932da93e4a43a0
-:010360c8c57c609cb4a5fb511d98fda71f99a5
-:010370cd096de99f01c4fea1b67e12f66242ba
-:0103804baf37217762e513a2e4511299f2c133
-:010390c4236a48bdb8d7e659e2df17eb896bda
-:0103a091ee329f0dbf2217872262846dd818fc
-:0103b098d8c41e4182b2fa830ac21b9240c241
-:0103c0de56ba33c0e74caedf328b2b809fe0ef
-:0103d0b528f9e7e18de90d75829ff82734fc2a
-:0103e08d0d7afa49ff4aa3ffc4d1b8481a1dc9
-:0103f0531317a2fb4226e8a6b699ae6f9917d1
-:0104006f5815a31302edc60de80319739d75c6
-:0104105c50afbf6a6340eff18a33ca1c1666df
-:01042086635476113b7a8e0491b5e067c5932f
-:010430bb0aec4c51a328b6c4ecc794cb76a2a8
-:010440727e6e50b6460be674d5845ce433a4d9
-:010450d146699fd4e55025e981f401eed2042f
-:01046087cb083d94dadc8530a3bf34158e2349
-:01047034897bbeb1702ce07ce7831d9ada951b
-:01048014b447e5201bea10fbb26f7cedb17fa1
-:01049024c3185edee704dcc5008aa8117f544c
-:0104a0c2af2b05d87e3a1d98a39a206380977b
-:0104b06bb7843b552e4387258c2a290da7942d
-:0104c0607d0e46a589e67d868c9348f09d6c0c
-:0104d087e18205af1e19d815a6bdfbf87f8af6
-:0104e02ac6aec321f34b2f9a0ed2b8435e2e1e
-:0104f002fd92b4172a86a0e36ad167235b155a
-:01050052d132f5dcd13ab7be78988dfd84da3a
-:0105107790bd4411c6711a9ecc79deab040fd1
-:010520d3ed8ddcbfb80d1d87a942759a2facee
-:0105303872a2446eb2611559bef2b046c76caa
-:0105401a6bd0185a1e3ea396d392740c1b0210
-:010550207b09a79d88e7f26c8060bfd03e8289
-:010560f970a86350216f8ebf81894e8905f173
-:010570323ab7fee97723f47fe96cc72bb0e104
-:0105804b4876b7d4211d659c21ac27db3f12a7
-:010590bc4303b03b058ddfbd36d742b374bcb3
-:0105a0cd9ffecbac34098956eb8316685b47a8
-:0105b0c9c96b4e753c1098d16c88b0bd6f4bdb
-:0105c0159f22d2ac047908f03d621880fd9d23
-:0105d05ce9040427e06ccf5784f17db4626b75
-:0105e0bacc9853542c1b77445f4e06939f9740
-:0105f08f1084b33843148d7ce1d643c23c0f2e
-:0106005c435105faefa08ad189f4c734cd7f01
-:010610e9b869195fd84b249ff5fb3f37cf10ce
-:010620d139ed72be8f37419ba364aa24fd90e5
-:0106302e4599161bc2890b2febf94b60cb6b94
-:0106402c48ac9e4396413c493710b238323ea0
-:01065069bd75835fb140bc7c246cfde4f1477f
-:010660c9bc07d31173956d85f31dcf7fecd10a
-:010670727dea2f202e843cc3f505b67bf0a8a7
-:01068036b27037578e98df673483207ba49e2b
-:01069062995533ebd3232a7c82aec0febc7f30
-:0106a02d718c4449ff9970a1437297b8af735e
-:0106b0343ccb4e54611ed40ac40f4facb5d22e
-:0106c017e78b6b368cd5ed56ca359d95617785
-:0106d0f1e5d078e9dfdf3aa1dab1d591b1aa77
-:0106e01f3293273c85453eb82fd40053a366f6
-:0106f0ad66abfe5e16b0ad3527e671f80f8598
-:0107006ae1be4c9a59df834c630c1e3d9dc197
-:010710be694e2fc803f7d8634c0c8c50d1ba06
-:010720568f359dfa2388c8e165ec7499087230
-:010730fdd8091663fe5578fd4cbbca65f657f6
-:010740192c8437e34ea72c773bb078f702beed
-:010750805e41fc604094ee2ba6b0d00219fc28
-:010760615ab58b8136120813e511339c63f4b9
-:0107707ff3fd91b63c8904ef7e5ba6ae7b1efc
-:01078017ad0ed3e912480093226ce3c77dc0e0
-:010790a529c9d3c2a6eb2e248588fbe56fda2d
-:0107a0784757f2f31d4e714068de84001305ab
-:0107b0c296197b6ce45d39866da68f28d25670
-:0107c063b3e3dbf8526ea8cd5a2f4a6b2ad46a
-:0107d088d4177364d9acac283b7b1bfe8d25a6
-:0107e050a3ad2bcfaa7baf4ed2e017d9656378
-:0107f0d308e500aa7354f64a47de58127712ce
-:010800fb4c6def2f34b6ed416def7f755a35e6
-:010810741ec6c3239ddcac236480bb7463c1da
-:0108206d39e1124aa1328c4b2e19e5bdb27447
-:010830c3ac847f4a3c582c3c19508f69617ea7
-:010840ec28c31e02fa80246d88c14334158ce7
-:01085083af8ffccda258c0486c8e808ebbe4bd
-:010860069633fe38a5a05d366ed369ef9255f8
-:0108700e8ff06b3a5aaf6dcfaa0b214a2f8a6d
-:0108801c256cbab78a1ea43483e6aeb98a16d8
-:0108904bd64154b38a262b5c9dfa02d115d3ee
-:0108a05df9c69f1f9507715cd94629639619be
-:0108b0687638d63fdf0165da5cce21bcf4511b
-:0108c01df4cfe6cbe342c3a94aa96a6809caf2
-:0108d0989d74238e12afd928c37892c85f777a
-:0108e04a257fe0bff8f9b96d08bf8ec2d865b2
-:0108f003f969667a2052d0abb1556781c79b31
-:010900d6768f215d2dff6665b746df39c97bdf
-:010910bfdbf269cfb7f9c55d41665f0b685c73
-:01092099b8bcc695d065314c71aeb516a556b1
-:010930f27a7195cf4b7ba3113e0c79b6653d9a
-:01094001e5c5ce9b4c4f9cdc52068a3ba2bf18
-:0109504bc0a376857891c6b3a9ed5ae084861e
-:010960ae21c18b102aba23d746347c2016a4d0
-:01097098a7bd1f3687d81779d875c8cb4bd701
-:0109807ae7381529a0afc78308876f37a6f41f
-:0109903fcbd8561df9785666475065aa65fcef
-:0109a0062bad46ba35bf061b21216fbad7d641
-:0109b0a68d9a580c6ced9d067375d1f6a41416
-:0109c017130b3d7495ca05fa10bd9e23992cf7
-:0109d08b66a8e4e1ac6cba44300506ae1be676
-:0109e0e3c417726cfc2ce9314c7fa692cf8a80
-:0109f0100381fc317ed5f7dec2c409b4219f3b
-:010a001e3d944c5c76d59fcde97d7a88d83437
-:010a100d676ff04d12ce17b6d5404a76845831
-:010a204925530c5cf52e5447765a417a45521d
-:010a306fa1eeaf3c9c72ba105952d0c9201385
-:010a40225aea54d369394fa3e6d0c552808291
-:010a504556f1310869baac90878efffa74941f
-:010a6048c7985e3cb2a96a60963b6b4dac8f02
-:010a70f0773675883c64702ae0c821d43b41e9
-:010a80084cd84b4a39b99d83ddfbf853e6e47b
-:010a90f4069a8600f4b8a0c64261f9282c3413
-:010aa093ea67a67e76b21297239498efed0e1e
-:010ab03a5f943c2227c8f72bf3b295ef0f1def
-:010ac0a73df69c1d37f63366e48603bf0c839b
-:010ad06c2e790d1b021f3ba87ea19166bde459
-:010ae018570b2cffdf1b8008406b0c27b60d7e
-:010af0e1f184be74cd53d267f86d661e839d10
-:010b0033bbb674abe3a9c255bc250433cf992b
-:010b10905780abdb0d695d5006c066d82c1414
-:010b20b821ff6c22b02aff4bab9efa5468b665
-:010b3017e8ac6fda86c106fdc743d753ece6ba
-:010b406fe8e1750740a08fe86d47cd04692df6
-:010b506692c17d47978c13e230441d4528bf08
-:010b6000db327a2f6cd42ca5b800b4404a1bdc
-:010b70b7c490ed681e9dcf69ce7fe5499a0656
-:010b801936afb5dc534e0c1e6d408a948917ff
-:010b90bf775c8c5adc970ee61b33f656e42573
-:010ba0bb217fb767b9d03c86918c4a33e82560
-:010bb05a465a6e41b7a1d6831e81f8074289ed
-:010bc06e673a59abf8a554edb98a2d24a5b5d8
-:010bd03d5ec69cd1981eb0e0eee165ede10865
-:010be075040f4fe10fc0e725575de81d0c085f
-:010bf06cb48ab2dfb367ba94277861b0d8e1a7
-:010c002ee7670f671f1a895c406fd7cee2660c
-:010c1013a4ab41c64faa486b81fe893ccb7c44
-:010c207a754b6b2ae602564b5d141655807f99
-:010c302a0616e3a65bc7e3d5211f703aecc6fb
-:010c40864c611a37a089af41bdeeb6c9d45c0b
-:010c505658d5994baf4f3357b1178dcc530796
-:010c601ef3d0864a7dbd87a0482f0af7869768
-:010c700e38b9b667b6144bbbb66aa7a44b2617
-:010c80906efb52c77adc18207964a2187c526b
-:010c902676b4d6b3e426b711943c21533b5664
-:010ca00ff9ec3a1ff6492ccf2ac3d3b1926cfa
-:010cb01d0eaafd91dd892736df07157f7c6792
-:010cc0cc48558aaacb202708abb1f154b0ac9b
-:010cd0d5a74672b9ea0f1a88cca0533f528142
-:010ce003285c945982fc0dbc3d42122d0ab0a6
-:010cf0d6169a474f766287408fe32c4cac3728
-:010d008d8ef4845aa548fedfb3947b4718317a
-:010d1069b1e9e666ec0f17dc3f9ab052d1bc18
-:010d20f3f5c4656d4a92b4896b461aaa17a63b
-:010d309be083a89edae2dc6188fbea6b03dce5
-:010d40c7e5570b91c8619bcd9fe362010a3fc2
-:010d5085e5edaec458149af62d1a9116acc019
-:010d603687694c565fc6051b771f2aa10e9055
-:010d70442a4bcf5a97ef906e8393631295e910
-:010d801f226d215527ab17733b3245394637f5
-:010d90308a6c4fc7a9c79e2401a957e36aa595
-:010da042eb4b607f301d453f96ad70828baf00
-:010db0e3b2723ce6764edfdf5b10d5603a38f8
-:010dc05476b603aa1031811aede60a7ffc9161
-:010dd0680678d035ffba67d49929f7c7a056ad
-:010de097dc9185127717e03cee92959da5e1b5
-:010df07ec9580fabac99e9592782b4735045f7
-:010e0048a125515014f371f46a85a850a82f95
-:010e105a430f37e03025c26181ec3e2294b36b
-:010e20c191b1593fc80259514593d56c668f82
-:010e30dc2cc176a5ab6fff967e975c3f0a043d
-:010e40fb5b1939b08b9d1b60c9d85e78a6476f
-:010e50a0fd21fbcc0022e4e20131b3c1713104
-:010e6005b120f38613d86ee7d24f4029c6a75a
-:010e70c2ab2aae1f38f621f8c7a2efe83b3253
-:010e80c6f316db0f569241d62de37d16564a1d
-:010e908874d21675723bc481cc3909fcb6f9c3
-:010ea04ee7b6f753c06a6c0e8be843436aac8b
-:010eb0008ddedc524a397cbe6f176696c885e4
-:010ec0a87eb4d722ce0c51b386d30ed13830c7
-:010ed0bf8575f6055cc067ed6d0d25e56161e3
-:010ee0e0788675a7f0339a8d3e8629b1f9a315
-:010ef09f9b365fbcaedbd8c83d95a619150720
-:010f00a4bb494590a149ff40a6f68dca0754a1
-:010f10e0e68d6db2868daee8f2dec16b5c7dfb
-:010f206d9abc5fae7a9d496b5030f6c2cd59e9
-:010f30794fc3df95ef9229b28c603c124459ba
-:010f40ed10c9bd89a8ffc440a84be4329a5b4b
-:010f50ab96bb7e7dddc5fcb22ec712f4012df5
-:010f605ad763187736638e3ec995546a7ac81c
-:010f703c4f619095f776b5f3f6e5c6af53b040
-:010f80435ac0b4f5d1938e69a3328005399447
-:010f904c03db6e36ee34e2f42944836493ac54
-:010fa004b23902876b7914ae1667349a7d7dd9
-:010fb089474108ba7b3e361b6290b4146a3897
-:010fc0dc99cea4481a8506b04b75ee0899cdbb
-:010fd0afa2837ad7e5882675fd499591cf0be9
-:010fe0570acb65d92827ef06f0fcbcedd7403f
-:010ff0702aa278d36b7b74f1b7541dd300af7c
-:0110002e88ae0275e21ae03fd501e5d13b9c62
-:0110103fcc8fec528b608190f46164badbefba
-:011020d9394e93436a2bc0bfc7903e4432041e
-:01103059c19b5154007961382f4ab648d6e1ec
-:011040af8c30a521660f90ba3741fc54cfd75f
-:01105019b57c891602c4c7380bd0030b026dbb
-:01106008755c4aa23b581bd2c4b175605f6da9
-:011070e433f7c8681bc4f018a85d62ad557099
-:0110800e3ce4c8cea9084cccc10f2aec4f3096
-:011090c4a7864c2849f7cfec7dda71b7a91083
-:0110a0fbce6085a3c848e6a6831f199108eca0
-:0110b0b3050e63500a27e8f21311e15c494d9c
-:0110c0e54a3b207970d1df9316aeb3568f44fb
-:0110d0788bd81e3fc7b92c5b360bf6b10a82d4
-:0110e01dc46aec7e98cb04a46f7350466ed0db
-:0110f0add9de548ef858082db5e1220be36d0b
-:011100313a012b0fb4e47f6bce402be92aea2f
-:0111104a4d93b69db3ff92335a2a1d2f93f020
-:011120e99612ce17bee100f24f20cec07dbe39
-:0111308e0b861eb8f131989a0de35ddb5b0768
-:011140bea7a03bb47c4223ac52b950691a5c54
-:011150db6ca71d5f7afbcf071cd884a8379750
-:011160fb692eecd691aa6241154d1a0359f3a8
-:01117042cc3116930ffe22a62f84da421a1e99
-:01118005094b21d47d7349c5b85dd4aabacb87
-:0111901f7774352489116404b0aef5cbd39ab4
-:0111a02103051cf6e434f71c9406d052fb7757
-:0111b064e5ce45a5d62caf6c1ac1e3705eebf3
-:0111c0f06a024e09f5cb6df22959612f8234dd
-:0111d06f2790039284d1f0eed15927a7b11ebb
-:0111e052ee1fc4219000c34f6a7cf6f48aca3c
-:0111f03b9291a59cad952dd3a76c0fcd05dae6
-:011200882afb538e912e3397f71c840c958ebf
-:0112108b92f3213a2b432875f67a8dd4bca042
-:0112203e7311cc7780919301454b620736aa1e
-:011230d44a9cad9b85b593212adc1b7c986b87
-:01124084c9d806a0cf0a8da3401a8456eaeb74
-:0112504d3c6ac5c82cd20effdeb40eb6cbc2af
-:0112607f9a007680ddb9a74ebe634f66a73fab
-:011270d65127b3f7a63545416d254dbe489f59
-:0112800f4181db7b98ad5bedd44088ee91ce59
-:011290e1da6aeeb52c6fee2f9b88f8114ec91d
-:0112a0a5e96fbb36d9ac4d43d432fbe54e1e17
-:0112b0781784fdc37654968c9c8c695a55c558
-:0112c0f85c966af4a395945310bd13aa8dff81
-:0112d03ea7e4d1c3c1b2d2c6decc1fc2f31ac5
-:0112e0998a898e2e77c10fd0d53357dd8d6ccb
-:0112f000ccb14de939dc0fcc8d8592fcec4fab
-:01130081a4106325d416f29f00af999fe20227
-:011310147d575d111886c166acff6d144f9b1b
-:011320bdab099ae945e668dcf2df0ed5e22d68
-:011330b38e7a7aebd2fbabdecc15cc2819f730
-:0113406a2a65a73d72d9a5f791a61d049dba23
-:0113502907409e40116e8ce393a7521cebb91f
-:0113605db03b6ab951102e3062ca2243573527
-:011370fb05826820032d909d51261e35637ece
-:0113806867955bceb8834223665cea395652b8
-:01139084fb2facac5804999bd3cec11a98ed6f
-:0113a002b3c65d973ea979ffa1a7bb581edced
-:0113b052c50bee127df8bd422840b578098ba0
-:0113c0d206d384576b756f32d0ffb9300c3884
-:0113d0ca8e7f77604cf9f3232be4648a1c983c
-:0113e086d52d003aeb82706f1aa1e5df9ac17d
-:0113f02e4f33a85ea2981f8ac8e761bbe5b9c1
-:0114009c217c1c2d572281187009c8ecd257d7
-:011410df493b5cc2b5ed80256141b68a6437bd
-:01142073c09d6c313bc4cb4ff1b3ba059ba6b6
-:01143058a78ff33e1d5b90d4f7088e70c1512e
-:011440d2e9aa07ae922d34e5f95fb5cf6996f5
-:011450fffa9890e0c1c9e7933a15da7e9dcb68
-:011460dd35b3b05602aaa7e9f107f97210a641
-:0114700d948ab97b6e0d494b2a0708282ce094
-:0114800390588f8c44de6dd94d3bc91ee07613
-:011490d50a3ed2810412f45d98588bef9c2104
-:0114a043b691745279b04b8d5b5ded5c6afa80
-:0114b05508eb6b37c12f4addbfbc8ca394eef7
-:0114c06ed637b6266c6c8c698eb1c96bb8503f
-:0114d0398e773aac36557c394ef6394d59e887
-:0114e01e926bcb678b0534ab604e4502db3efc
-:0114f0e2e7dc83a85e51077db87478c6411cc8
-:011500f28c7c699ac11225395dded72d9346f9
-:011510bd12bf4056eaf69d8cbe37b6a4bb554e
-:011520569cfadf203b11b49a153037f3cd7a97
-:011530a448f56b527cb5751642b1429cfb6aba
-:011540be41b4d806172f2b3ed3d22e884781bf
-:011550f9bbfeaea1ff19097f88014abf7a530a
-:011560295ca4c8574346b8f338fab7d851dbf2
-:0115709990472647b8ecbe9dfe391b6add46ba
-:01158043e57c16daeabd7d420a577fa4e7fcb0
-:01159001938c6d76015df4dd1f320446fa4a3c
-:0115a018f1349a932b542b30245bb27d405707
-:0115b00298b2a187e8f2f51629838852e4dfbb
-:0115c0bb239c5fa10fccb537fc2e20377d4f76
-:0115d0499c25c67d9df7b16f364dd6d27bc424
-:0115e08bcc2f1a0c0af810144aa729b89df0c0
-:0115f0fe2454c37f3dfe1c89aa40adcbd8df34
-:0116002f3cd437e72af7899fcdec4900dc011d
-:01161066b0a2802a819e25ce3122e06995eb4d
-:011620984528ef85f6d5bccb5023250b6069bb
-:011630225e15f3504be8178daf314f26e311b5
-:011640421a96b4b36ab2450685843b8fbab5aa
-:0116501cbe89afbc93be8618e8cb69a5a2120f
-:011660f1493649566ae90c90110a45d1c676d2
-:0116704f735a84924bfdce43a2e18954b3398d
-:011680ecab1658feb20952012a4831b65ab12c
-:0116908c57b2f5853274bf5d9f634d2b9d2aa0
-:0116a0e57cc1833f690e46a8bc44fe5a7a27d3
-:0116b00b0d5ef3fbbe3b260ee68680a93bfbed
-:0116c038c2dd68eb2e80cb575f0ee0ae507519
-:0116d0e6a2370e060a4fe618bac244fbf98ff6
-:0116e0f6a1ef3920f53a5548577df887b183f5
-:0116f0a3fad5cdcec41d9def903564e7442745
-:011700284001fe7fab2880d64e851d8cd31e63
-:011710542272a70bffcbeac40b968d56b98591
-:011720b4d26a9b9a7d79d34a9e54948712a385
-:0117301287e467feeb95a358a1437d03443490
-:011740f7751fd2fb1e78d0dafaf95275335ef2
-:0117502025a44c260158af99ffd7c4391d1ef4
-:011760b3ea6c5ad231034dea0ffb353f94cb69
-:011770ba72236bc8405323d4ed0d51e1779a0a
-:011780990c979fc6d1d3fad201ae843bc41f0a
-:01179000b84795e414edcb816773fc4d173586
-:0117a0dc390aee75fb5d05e0475c4891ed1eb8
-:0117b055f46e8a814b267f8cb6241abfa1be29
-:0117c095f3e35e23e7f711939e6ec761b0259f
-:0117d02725c76e7fbb762839233606a142b290
-:0117e0ff06f94e4e71577535260e7c33985795
-:0117f0178e5f9396d9dad6df76dc68ce7e01b5
-:011800d8a088cf6111094556c1f48856fdbb59
-:01181075b51e2e026557fcf80b5a59745c04ea
-:0118201c1076f22d4929c7858d23c1dc5b4819
-:011830b8d54ce17f7025ff0d6d1f6dc1d74597
-:0118406c8febe329340bf9e684b8e5a1185ace
-:011850a81889b07250edfb8bd5623d2fef05b9
-:011860b9d9f8c040c953d202184c1e27d949a0
-:011870ce94abaaf68492b7dd56fc10208b2105
-:011880b75cd97f899500c5e39b2af0a3e465d9
-:0118906acdfe40b273d28a3ccf1e940841c91d
-:0118a0cc1b7502814c4b676fdfb348d2c8e636
-:0118b006529aebcf74ac6576998cb0f07b8b78
-:0118c0dfbf07f9cc9839366e796998d855d6fb
-:0118d0deae11b88fabf641629218600071da46
-:0118e018a2458fbc0af9ce19f770e0c8b68f5e
-:0118f0fc835213706a132a85391c49fd4176f8
-:011900f2557c506b0dfe8913b2eb788df769b5
-:011910a8986c57057b388461180e0acab35238
-:0119205217f731499504edd039b1871e974597
-:01193060d235140906887e8f603f6d3c9b9afd
-:011940e3da88e0063883877ebe622a8940d446
-:0119500adf8f0d8f9cfc8c35203f7207914b04
-:011960c83f39c3a0de8930f0f37b74e4cbe9f7
-:011970ce5b2b71a2b56b7cf70637cbf12f607a
-:0119801c87143fb7de46c6940d4ca03f389fb1
-:011990640ece724256aafff6689f1590ccf851
-:0119a0049c451fb950fbf264ef0b4ef913e4f5
-:0119b0bd2fcc5dc044d62c530607216412df27
-:0119c09b599b41e017a727753a7e5f3d359359
-:0119d0021ee17301a239a6ffd40163fd5e6aef
-:0119e060bbceb12b9d9312cc41e2bf1579c903
-:0119f0c0b9134957af75b6844da1ab1d7995a4
-:011a00b664667720dd39a76c628b225730c53d
-:011a1052e4f918c32b17d3f5ade1fda57825a2
-:011a2031b6d86da62437e6e49f52796fb992d1
-:011a30ee904a3d6802073f797e21a605757ea1
-:011a40a1aabc272a8cdc044243678ca4d7b326
-:011a505f0aea2cc8f71f919e1656b1d7ed408e
-:011a60a9b816f295438a5f1be154c58f15942f
-:011a70b02b5d961f36bb737f642ba7b76d176e
-:011a803ae4b439edbf2369ac05fd16d114bedc
-:011a9081b477e763a4e17f914e014733237d1f
-:011aa0000a2d9d1464e7fc762d8c535b1716e9
-:011ab08424118b75ab662ee7de13bdfa1202cb
-:011ac0b1a0faff393155832e13f8fb7e5807b6
-:011ad06fadb18e6658636f24b0af183b42b0ae
-:011ae017037d766de91d0b85f527917fc78a17
-:011af099aedae79886b27c6626e2a4160b119d
-:011b00dbb5410d5d432272709ae7f2fc4c7608
-:011b1075959416d030bd632ff3f8b0a3b66a8c
-:011b20129e990c76bd811d66c5cc0b6ad4ffa2
-:011b30777ff7aaaa5caed97da81affc3e0ba14
-:011b402b36b7d05b44ae2fbffcb1ada1ac7268
-:011b5098ae84606919b083ce5062e6199b1b21
-:011b60bd89ebedc319c08f53c0b6c5790c9518
-:011b70da3a5e9dcf18012db5c157b9ce7667e5
-:011b802592b3a0173838b58ef0f220e7216934
-:011b90f5a16143ddae3fdc76d3a9a477ae0c73
-:011ba01ec3698b65aa7c02ba019dee4aec2206
-:011bb0bbc31d215a963bea1eee2ff9fec84b96
-:011bc062e060d33d1654cc0f5d5c1bb5b11c71
-:011bd0c6dece96389c2471353262aa3fcece82
-:011be03b2ba136271f62d17fea3167e104bd78
-:011bf01db5ed2c546d3ee334001ad86cea794b
-:011c00505dbdbe06cb20ecea2f4507e4c26ee7
-:011c10e3c3f75c7485cc4433b0c5b4503c02b0
-:011c2075a9bc298d5812224dc7dfa8b1ba5302
-:011c30e17b2c51e1ae2dcf2a40daa05434ec80
-:011c402e1acbd9bcc1f01644c09333cb519fb8
-:011c5070d90de7655b37ec29decc445f212d60
-:011c605a478697926707148538b7b10556f66f
-:011c704ea34cc66d72adead3fff0b2ddf9df4e
-:011c8044b95b0ac384f4c4fa448ba4a09486f7
-:011c90d4ae761f5235e9a29af5c39475636e35
-:011ca04f8075108bb18aee3e1d56c776bb518d
-:011cb0927da100f3d6676d6bead6000f345122
-:011cc08c2798c1915fe811431953956e721518
-:011cd0698a96971338196407963f6a7d1f6226
-:011ce0f8658e569a0b2848d35f0c2718fed718
-:011cf004448dd7922fbe5885bb6f0163bf877f
-:011d00d182d292f8b406086cda11cb1ab2cf7c
-:011d105bcafed58a242b61aef6a6afb5f7751a
-:011d20dc2298c73f32c17fb66700ec767fdab3
-:011d309fa6fae5df83008b35ba4034aa29f983
-:011d40549ea005a5fd43714d0851e5807fc7e7
-:011d50e6a40ed0f602d39d67505ee23b2a08a1
-:011d60eaf9b8f5ea938c076d103a9ac454d9cf
-:011d70b3cd5ad10867e015d7a93036e39a7bc8
-:011d80e822a0d8f45e62bd68d041114a806316
-:011d902a1ee3e077f57b832f71636800a4fc9b
-:011da03197600a63deabe49c9fda09cb3e5a64
-:011db01efbf8928fdc02a277748a3f8f3dc0b8
-:011dc036b3e8fed8ead92a409ce7f1905a9675
-:011dd012dcb997d563e22a7789f2ce00f44075
-:011de02416ad1ae119136e7794026626a49645
-:011df0c9695192e2a4520626b1c43d2fb7a2e6
-:011e00fdf71bc7cd158bc19954c88377de3a97
-:011e1070ed0e63e4a3cbbc02139d5d680c214a
-:011e209ab31296a2844491c400918f6df2ceb2
-:011e3017bdf9165be6edb2975577d3bd5e0d16
-:011e408061bb9e12a59cd4f7852fb04adbbab7
-:011e50332e59f0c44ad1adb38bd78659ffb1e2
-:011e601723dcfe1211a3c02b99bdf62fc68283
-:011e70398de65ad4c1b8cdaa2e9eb8a13e548d
-:011e80080cb4bf8e0200dbf35d27074b0602ff
-:011e901545974340c06205c713dc37054b8b49
-:011ea09e6e04649edb1e4b6f5ee2973cdce11b
-:011eb0e59677c35a3824dda65d311cf54badf0
-:011ec0b4944d07e92f11c9e062d6b32fbee0d7
-:011ed0f6199f1c7c42b6f9d34c014004b5f36d
-:011ee0e76e92fd0e5ba13038dae70596c522fc
-:011ef04369342900dde52196a29f2a11b49915
-:011f00126494902465331e5904287ea90519ed
-:011f1088121d2048ebc54bfa49907e10f8cd03
-:011f20c60851d469004acb1fbf32ca78dd02a1
-:011f300a91c660849fc678130d7d7a660afdf3
-:011f40342262d75dab1d3d329e0ee922381688
-:011f50359ebfc413e55a4c7cb1d1606ff9569b
-:011f6032870bf0e45e999dbd2f15357eee3c73
-:011f709d109cb602081ffb3aed5af71f889b93
-:011f80ed208e7ca4e55f0f03ee9414c3c37fee
-:011f90cceb326f3e1ba2cf77b95a84622b4499
-:011fa0ef1188d5b12e77c23fb12c765743bf6b
-:011fb00143a025ac2ef63c902576383cda8c1d
-:011fc004efab14e1f39cc9562e9249a7ab1dac
-:011fd06e71394fc4979b350cc00cc7253c6927
-:011fe053cf25c0761d8063e8e330bf9d2fbb9b
-:011ff09bc60ec63c4548eceae122634711685b
-:01200092debfcfdb751ac0e20a67f5d72debaf
-:012010b55568f59b426dc9d773d476806f4356
-:012020cc51fc99f5facf1abd0012ed85bdb2f3
-:012030b24055dee3e718db15eaebfa40924fdc
-:012040435baba6d4f67783f457ed7f9fa30f3d
-:0120507ecb4e4c29da08699e0d651d34d8dcd8
-:012060e9819186cee41b682b7ecf6a4400a5d9
-:0120702ed106b645d98e64607d0112d8362e00
-:012080daea71a44940498a962f73a3aecf7adb
-:0120907d0dca1834f9fa950451c19fe09e783d
-:0120a05641bc576a350a8aa4741c1dcfce22d1
-:0120b0efa19332d54697ec393e7198dd9b6e62
-:0120c010b38cb7ba80fa1badc92eb37f9a984b
-:0120d0b22278dc522f88c6f8864f6a3ea8c156
-:0120e09370a275a4f354dc6454a223f5cf2bf2
-:0120f06120a46244ce2b84e958d20429fe90bb
-:0121008ba99ffcf5c0c9992cf6774d27477356
-:0121101f08549691bf52949cc3994d318620b0
-:0121205d40741503aba8cee84472319dd392b3
-:0121306bb8dda1d141611041135e48941fed7e
-:01214041153e8090422f5bf4d61b5c2f255af6
-:0121506a652a298542acd786469e47a62444d5
-:012160b5a4b2afd94e0322943712ff9cd5bfc4
-:012170fdb8851a91174951fc89f13f6a228723
-:012180600cc9dee2fd249042dfbe770f9808b4
-:012190ec6693c5de6673260411b33aebd5f329
-:0121a044d365e60cd15f71442930efa29387a4
-:0121b0eafa02438ec9b46d04a0f06b51922ba6
-:0121c048865192e80a006a127c7280416db775
-:0121d07911eabd8ecb5ba4dde16f436be8d863
-:0121e0c0565be6a08f41e817f3761096f85765
-:0121f001e1d25200d171b5ce1a4bc190d28dc7
-:012200354d7a467804db65c3417cbc6b0b2c61
-:0122108978f7ad1249ef60ea39500b10ee5bb8
-:0122200485c71cd32ba107a37c0e110fc0e6ad
-:012230de3a5f60f1ebd9736f1a444299208658
-:0122405bda01eb6583dc548bcafc204a7bdba6
-:0122508b1479d591817702e46e2f977cc9aa80
-:012260d7d98ba026361b7f0709249e4122314b
-:012270c26574a3dbf2fd3d061674326e4625ee
-:012280dad66fe6e9afa08ec0a44247f7303b7b
-:0122909b4cf42667955517b36cbc12a55fb7f5
-:0122a08098779ae4d5aadf517ee92084548714
-:0122b0a23a1906bd8f958148e92377e0f5048e
-:0122c0b4296594605df47489886eed39046c27
-:0122d0fb224f027a87dbb6a62c3522c5ce8304
-:0122e03cbfb74e9bdfd5cb16fb78824ebfec9a
-:0122f03ad25c7461da78230ffd83b15ee82deb
-:012300ea1085fa8c449e6121a66bedb29c7eb7
-:0123109afe088f74e269d41630d9f77c61bc34
-:01232073055bcf740b8452ae77af4c947dff7e
-:012330c797ec57e8da1338d4562fb267b8b3f5
-:01234087125ec408c26813542ab5dc836cbd7f
-:012350b547fe4017318451cd253ff5069ff870
-:0123601b11594db143c627c7d4ee9864eafb73
-:01237016a8fa013a4e9ab11d011afd8e59e643
-:0123800749eeb46a3c6335dd9d135af7f3cb23
-:012390e635845e99406f0624a7424ecbdcf5c5
-:0123a0be833e8a2d2738190d1486d0974dd769
-:0123b047f90920c360dfa14ada80f8e19c6d85
-:0123c07a220f7ed661a4bcc24a42503c758c71
-:0123d0e9577aeb2eedea700cc67084d75bed17
-:0123e00695cb8dc227bf07e80ff258090e81dd
-:0123f05bbd4583f3c18364eaf22185554c20fa
-:01240061977a32579d12186db91aae9f3b2745
-:012410de28ebce5ee7487fdddf6d6ecbfeb738
-:012420fe81065d6905fb4f7b6dc94c40897497
-:01243075968b07765fa2c8ede0de749032013e
-:012440c15fb1a7f7948a319a3d3b1f8012bfeb
-:0124503e18baeedf39109f0a34fe81132c05ea
-:012460756342de80fbd83f2b38b74cc47111ad
-:01247030ad6c5d77840dee6cd4459e97baa5a1
-:01248039497ca5b10b89cbf9dd92cae72ffc0d
-:012490ea95d514326580a7e928a39a2eb225bc
-:0124a0208c27231bda2b650aaec9782f08460f
-:0124b06658aea0c308d86901c64a559aafde50
-:0124c0312308589a6fc7a3062a7614f926cfad
-:0124d071e4759c4416e634919fc9ce3f0e2afe
-:0124e0dbf5e00c9a11abdf8d58c0df71a6bf22
-:0124f0a826e4b6d7ed6e8d9a61501d77e5867d
-:012500ef4d4f597a2eb03c41273c3d6fba3612
-:0125104bcd98f4c5f7f08034f7e40c912e4c0c
-:01252013adf2c5f56e01093dfd0e647466906e
-:012530b396ce3b166ea0901089860c0d993419
-:012540d5eba0ca0470fcb2aaa2125d0b1a0d37
-:0125505f094eb667ecc70d038f2f12b0978315
-:012560c0fd61e4b6d0da3a9732bd9b46b8a012
-:012570a49a5838daf8e4bb2cb0b761b66a060e
-:0125803dd3b26bf63ec7d481950a12baa7b6d7
-:012590c6afc6b3d98db74d21176f897f07a6fb
-:0125a0cba6176bc39983f4b2de3203a89bc7a4
-:0125b0e5bc9ff2731773c2034d60915af2dd25
-:0125c099c6d8f305df425163ee4142aea72822
-:0125d06b4f02ff4519471ad62f355f8b193082
-:0125e0f0884d0178ed7a3afd9425e0cb84c0d6
-:0125f02fb2127ef626af7870f46516aac55bff
-:012600391e1a08dfb5d5b89c72133e7310743c
-:0126100e5040f899c9fc947ffec8117fed9996
-:012620ec3fae67fc5e1c493aa0fae6537588a9
-:012630c1a96a16ab50a12f76ecc76a7eb25c8a
-:0126409eb1cdd117c32e36c9c493ad60781be7
-:012650fb00197bc555829113efaee640672542
-:01266094c648005b6a8fdea2e515d661e0dd10
-:012670b0fd81ffde1097d280df08dd47d82760
-:0126804e6dd808cec68997308690ecdd769b5f
-:012690cdf2e54c1ab5b90c3c5db1cf1d7d88f2
-:0126a07263fa111b64af80592500dfb2217ecf
-:0126b046214b671c5385a31dd677ff5334de26
-:0126c0bf2ee0582f18e94b36dfc9137b33a431
-:0126d02cc11875b505a13c2f5fb6368443cced
-:0126e02a3b3dbbcee80fb72cdca2815b74f27a
-:0126f0bb79a58249f3df2142bf9eee840c4dc2
-:0127002a3a7fb759e93fc70924adcc34ef609a
-:0127101421d2ab917884b17803edaf15d76528
-:012720acf2a9c4d4c05810e6da4ecd92ba7c38
-:012730f2f3fac3ddde8ba6b3f9daab5916a79a
-:012740729b906e021ff18423db2ccb4d9036b5
-:012750c4e0945adf73e649ab71d731771079c8
-:0127608524f25ef328454ae7636c4c92bc3c6b
-:0127700f55b6d1b8ad366c390196e5fb0cc1ac
-:01278037fddc286b08e0638ccef2b1836bc501
-:012790829dc25a42cffe171bc08c37b0d722ae
-:0127a00ded89fab858850fa20684255866ecd5
-:0127b068f9663e6daf1aac9b550b91012d0c03
-:0127c0becc5d877002c080508b327f11dbed5a
-:0127d025b2e3b6704b2d48be210f29415f79ae
-:0127e093b58358131be1d4ef80b67a27b34cf8
-:0127f075f02c3f778ab6ff72bbf51550bc1007
-:012800a9ae03ce7580e65436497395861f62ed
-:01281078b9fc94e5dc7fc062164358ea71f750
-:0128203edbed696f59930c1ebee3607428eafc
-:012830ea130e3e01401d54af542ebbed558f58
-:01284000805979a0af419ca1488af8bcb47c7f
-:0128506de698eac77654b5a95c1a152d46d386
-:012860244888d587e618d3eda06fb20e5273bc
-:012870ff3e0af8e7d548a7751e628d0f17a76e
-:012880c7942a823ffdb8ce3c07f90cff286257
-:0128905a1d54993307cc747753db8104289430
-:0128a070fb598479b0db5d2d867916cdfd696d
-:0128b0a41f2f5253287b6eb6cba7d98edec888
-:0128c0142a85c6e8a231faa9265bb1f0941bb0
-:0128d0b106c438d78141c3c6094272f5d7f538
-:0128e0f099ed5f16b538896342c64a794d2d86
-:0128f02b8e27264660f60ca83475985b5c3523
-:012900e70749d558037914a9c78dd2c3f0a945
-:0129104b161599b86d87002eb446c9c3cfa588
-:012920463da693014d9e2f75342f8912382e6c
-:0129304ebf8f481eb5a3635e4bd88e103d3e46
-:012940d4acd8ccf0ef402667790e4d45de810c
-:012950a9eafd47839d6cb38a08e6011eff3741
-:01296033a8e65d251f538507573153a50d977e
-:012970633813f89a752b384b0ccfd58f4ced83
-:012980a2814d2f60eba73ec60a0a0be1522947
-:0129905bfb83766ca33ec507eb3be6175e50c0
-:0129a0ad810991ba2354ff9a0b0ed490e8ae67
-:0129b0e011df87a1619095efe22e68810744d1
-:0129c0186773b51c4b2b6d39d2916d2b4bad17
-:0129d02fc679436ebf89f8684b1e90fdbacb21
-:0129e03e0f7ae65bcb767838ba52ea18753a1b
-:0129f0883f22069b6431e0592ba8005b9d279b
-:012a00dae75a98def6e6bba42665a40e8ea800
-:012a107b4b8863dad3f41f2bb8fa4084d88fe4
-:012a2088a3e014a8ce934404c8d7fa33407f5b
-:012a3055f84ef9b460e2413736bda95e2b9aeb
-:012a40d01101c7d60eecc47ee2def1702bf925
-:012a502e0b1ead04776a2555a35eafd2682697
-:012a605bfa1c22076ab5a49b41ce92db9c00f7
-:012a700f3dfa33d47781c4e932a623e8ae5453
-:012a80fe2377a622784eace9c1b133bd34c658
-:012a90fb0d9b713d80e1c3ea0bd952821ab3f7
-:012aa0a7ce82f4a63601f7461f28bca355e981
-:012ab04083f6d15f52f4ad4d34e8dfa759eee0
-:012ac0bb2e72e3834140dd921de8a8b37c04d0
-:012ad0c857f33318fc4768cca4620971b69c69
-:012ae0c6395e9649665f62bd40fecd308b097a
-:012af0585268d3e61d19e77225b5e8b8ee087b
-:012b0079c82664bd988231196b7120ecf08722
-:012b10aecc9b763ad1bea0cede6c91e64bac1b
-:012b20877799ccb40332c128843e9ea76a3d18
-:012b30e9c177bac808203e5bc85c201f8127d9
-:012b40b00b3789c27f62681765827bd1898c82
-:012b5091255bccb6785bf438e1fbd4b24f0052
-:012b60f88368e1d69e8d646f6bc2dc5dab2e0e
-:012b70a1a6eda7fbb46f05670127af94d40110
-:012b805eb802ef19364136714ae2f30c70f1f3
-:012b908509db69f68f1195e92a56e39a5772ae
-:012ba05126dac682532f6cee1b772aadce1fb4
-:012bb06ad93e992398e7f4e8359f7cf787ae8f
-:012bc007ec63b878e95c3b2e48a8cf2a81dfb3
-:012bd0c7467fd149a4693460dcb02d6bc1e5fd
-:012be0c0ef96e19a825ac80a6cdb0237ff94f8
-:012bf0b0a5f8d9f2f549dfb8ac2e4853f4dfbe
-:012c00755af3052fa057297e24230678e415c9
-:012c1088a365e24dd758fadf5606e3e1e70640
-:012c20148fe79cfab4a7b7c5bfc37301663a32
-:012c308b9e5ed12ae5b469e5b31a43e35fb550
-:012c4039b31face1e69bfa6a1509157192a26b
-:012c50e1f0c6d5a75344b1a81c75146736eee2
-:012c60036036d3130fc9176deca88210f8010e
-:012c70d87c906fc54220db1dd0f1200e3bf38e
-:012c8096e282c03232b2c30a1993fde12b0b38
-:012c907a21ee1092a1449a9f97871fa88ebeec
-:012ca0df4b8ec33c650a963809c5305aab238f
-:012cb049cae0bfec4930b38204cb74db323a62
-:012cc08f2bc6f758e0564b204a2d5d580ab5c3
-:012cd0c0c801c071e4f4cd394c671157863bf0
-:012ce06576b9150477bb75ec4108f617cb4c85
-:012cf0af96d6c71a17d4edf85ba833bb83ee10
-:012d00a592be3fb8ea918fb16e7569f4715ef0
-:012d104c401e4a98dc5b12406f62cc07da3616
-:012d20545b5e57d3a08dbcda06123d3837d92d
-:012d302a5e23a43766214209d0627adcab8eb5
-:012d400b39d39773b8e2e8afc81523580f9366
-:012d503e4d8fd47a6aa4c79793c3622cb55e52
-:012d600a5d4f4e5451150c47a9922937dba69e
-:012d70900802c264791223aa1db88ff19c0aa6
-:012d805ad5565a89130bc596b945075a1a8951
-:012d9053417537c921395e97e5623ddd6349da
-:012da08842ed862c8bcc2c35fedd9897d0d031
-:012db0a93cc05e0cb82c6f5fe9e701db90d57f
-:012dc03d685462559c6d8b8db606553fe96145
-:012dd077f884d673e7565945a962f5201acd94
-:012de0bca22af57cf73160a6c3c49b70f7e48e
-:012df001b531446edabcf3f13d7de7d216a69c
-:012e00018bc946e674ba7f65294e0fbacd532a
-:012e10e0172981ba91f66e2b2901205a8b82b1
-:012e20e238998912ec4e0ca103c3dd5b048331
-:012e30b9dd6752fefede28ddc4d7a420621a5c
-:012e40a7494df3e56ff09223df34c21663480b
-:012e500097ccab60ea68f7a551b3fdf24a9201
-:012e6044c09deebfdbbbac9d5c5a36a79363d8
-:012e70b552c44902484fa425916eb578768340
-:012e80488ff7f059c3dd5585df90f7a15b0c85
-:012e90e8fcf79c06b0bf0dfacd7d314239ea35
-:012ea026288bc3b6f3aea17b6d7bc66ed901df
-:012eb073671b8ccb7723bdf9af25de4305ef07
-:012ec0e2bbbc87fcb6c7154445a8f1397f3ac5
-:012ed0faace8ba35f039c713fee2577385e4dd
-:012ee04d528025c8037e225515f90046e5ba7f
-:012ef0cf5b57079cc08ad29a4be7536f2dc3f9
-:012f001c0f3af669e15c3dc38494ae33b9080e
-:012f108cd0747ba8e5497559ab56db55543c5b
-:012f20e8f8155ae250e677b151a6031274e704
-:012f3030353c8c8191181a7358a772f7c015b2
-:012f4044c93e7b0c75f450e22dc0131bfcf939
-:012f50c1275fa82ca35437956d34ce377999e6
-:012f60f83d293e8e77668e20b4f3ef8d9e82d2
-:012f70060f6d98713e55a3a319c4551db92011
-:012f80979ad65469695fef118b301f4db764c6
-:012f902af1675c294a44804d2ca9b62af3832c
-:012fa0891fbf82f4fdbc7a783a381e86822be5
-:012fb0c61968097189358a41d5080ab00539ae
-:012fc08121ca61435a70cf625f64ce148c0f3d
-:012fd0b8bf1eed992de16fce503d964e6dd9a2
-:012fe0e0cb04821f639bfc58a0e1c1d7dc08b3
-:012ff02b300c4b2f16c8deb530e2eff8436b24
-:013000c6ffd131316a97ceb051554acfaf606e
-:013010f81e8fdbbe4a2b399d83460042d928ae
-:01302064482abc0982c2d0acb8c383dbc28f3e
-:013030b02862978ff818ece477ad9842b05a33
-:013040a8a0aadaed2886cebd3142a15eeac582
-:0130508624adc83e875ab9ad5ad9a57ec199fb
-:0130601105b8b87c8e651f9159fb8172ed523f
-:0130709a9739877a70ffaf57a91747a3c713bd
-:01308026cf042d28869d5b3522333bda9ecd0f
-:013090a804a0b4eddfcdc7e91d156dca1633a0
-:0130a0dec5f45c8f4c18d965ce19b9d93ca9c5
-:0130b0933352b794754fcae020262744c3afee
-:0130c0ecf7c8c02f7fd192ed6cbccfe3ab27e1
-:0130d0dad470a9896a04e282963ebf68a92126
-:0130e0ecc79f389cf1e71f48ffb510a43b7f8f
-:0130f0b870029931e610861dfb216612936587
-:0131001bd8b424166d96b4a887fb38fd8c7f9f
-:01311025e542c38e26ee63dd14b1fe3e3df86b
-:0131203d240cce1bc46de0220c5daa31d3bce5
-:0131304a1642a55b82409bcbb22cdcf52714dc
-:01314079f9c73835bab67a21bd6150a7f20eab
-:0131507316b9dbbdbf5e6f5fe2c6e69ed7b1a7
-:013160fa2839ca26fa7de54634233dcda8c904
-:013170ff3cb9a04814c2e4024e8e22f6c623f5
-:013180e35de6cb4371a9643e1eb385af2fb912
-:013190b60cccfbda823d07b3563c370beb4916
-:0131a0d8ed9459f9c5033b34141009ca44950c
-:0131b08d029fdbe729017362f18a7875235ffd
-:0131c0746dada6a4366006f1dd843a8c84a3bd
-:0131d0aea158fd1310d072bad8053e8d41ae88
-:0131e0df8724b8a6ea505023da019e7e68cf68
-:0131f0154fc070eddd3b252183ef018ad40aa5
-:01320007eba2ddb121e88c0f68635fbeda7b9d
-:013210bc0f7737682d41f82277b48de43fc819
-:013220737b5d2299fb54cd31ad36c6d0076a9f
-:01323029c94591bb54fd5680bbf7c12deff464
-:013240b4b1160a1ad63b1d6ed04190cba78b09
-:0132508e0dd45220d4ce95016caa370d837eb5
-:013260f0239e0bc1686742607d36fc17d02dd4
-:01327077cebd77e1b44fad26a8b46d41184f23
-:013280400798ff961ffa7d8d36773563bdbd18
-:0132905139f63248aa59b50d97e46ecf82d3e8
-:0132a07b5b02b3d31f2a23837fb58ed7e9ed09
-:0132b054dc0b4897710ba5355ea719edc86d2a
-:0132c074ffea7ff49e35f5e86fffa05dcfa038
-:0132d0df0b3553af772e3f5ca7761d9328a543
-:0132e059d59daba1bc22d299cb9412694c0849
-:0132f079f949e2cfb83cffc557891bd385eae4
-:013300263ae30d578061ad35ddafcca3693fc3
-:0133107e8f640a015b7465a027f59d630a37d8
-:013320f934d62f14208eb249c4301e9e12d0b5
-:013330b560b66601e870da36483ba13e6d417a
-:013340d6bcd1de938b77043dcfa2d4b5bdbd92
-:013350aa8f92603346848a85bb6631e78ca34d
-:013360d984fee8e75f95ba362a0d2e8a34cb8f
-:0133708e7e827f6d4648bb5c58b27895c2a0fb
-:013380b19cc4b993789b8746eb1d9c7b5ec358
-:0133908af5cf93ec5e7abe699d45ac21f477cb
-:0133a09368abd4975a7e1b88a5a336afed489a
-:0133b0f5b33fbcb5e3fbe304ae173777a9fcf8
-:0133c071f89577ee6f40550eef3c307de475e4
-:0133d07af41ba68bbb3dbc243aa94bf7c3f26b
-:0133e0d4e4b7a6885f136af500bf16c14ec5eb
-:0133f0ca8f0332d9395694417af2117b59e462
-:0134005d4db3e76c6ec32d68f3cbb85ccc6273
-:0134107a281a52eb924774f053477e7c48f7cd
-:0134208ed197a5b062d3de71759122002c6fdb
-:013430b73b2af392ab875715218c6fb2a784b9
-:013440283785849f19008063d0134ffa042511
-:0134502e5e9045f3404ff7048814c195218f1a
-:013460e21bc2519ca1e88988594a1c9d8d9a68
-:013470105e007d8fdcc6da1c8ac98028b72cee
-:013480803f7a14eeee24a9dfdf81e84c712010
-:01349077d5149f8cd0fa8a4fa025315a21a443
-:0134a0ef445de8505f4a329df0c7519043bd92
-:0134b0c1a01c9b39d6b5e231b3d96d9fcaba7c
-:0134c0072643721d103ad8e69a1bd90c90d15e
-:0134d04d3b1344679a7a95aded053936b62d33
-:0134e0a335854e095073d05c76c9a6708f35f7
-:0134f01cd0d3186b2f1b37f214d728115313a8
-:013500f771fce22237c79d071581c1be6f2823
-:013510a2e3c774ae1dede59c96a877e49e4faf
-:013520f7cff401871459cb17e2b6165a5c7fd6
-:01353017b78bc734e213dbcadae5c72d3362e1
-:013540ac38f5d1eb443d2246f809d2887145a8
-:0135502d449a509ea7e68c1f3792e22518621f
-:0135604980c80b93b48f87e8fe0457878f2cc6
-:01357036ecd2688ed75c32acc2524ea9381069
-:0135806c0fba6011a257030327b78d2937d09a
-:013590820c14dac1aa189b17752571e9239ca7
-:0135a05e854a3192e27c1a5eb6b2dc80b4a919
-:0135b09e2e668d8b2b51b1698918b7082a7d2f
-:0135c045e47fedfa44e9434223d0bdc45db0f0
-:0135d0a4144155ab60dc25f809fa368e7bfe19
-:0135e0e0529143d2be45a983acfadad750386d
-:0135f0bbdddb618b8b35cdaed17950726ff267
-:0136001f222cfe9e9f87b45dd48264f4b16abd
-:013610ef8252660b3a15b3f955055f37a1ef95
-:013620c0aed8f5507b371680fcf18a4b878b08
-:0136305384a4400d721b379659e1e00225d661
-:013640c0c7e33bd95f7d6956e3d66a8c143d0a
-:013650691f7f6551fb87b2020f494ee60d9a8b
-:013660d98fece8cc35d0ce8feb700a57b9ad16
-:013670c0bd719a4d2aab7f832230baf02a64e9
-:01368095904fcda785491e514e7df7389668e5
-:01369039805ca240d4adfd0f403da53bdb8ca9
-:0136a0d2a88d98e558fa09b51a81e60177cca3
-:0136b0b1e1bd4b33232a14cf5148138eb50c3a
-:0136c0ea000578b97477fccc2a22f86010d5ef
-:0136d045cf929fc2a16ad5132f1a037a3438bb
-:0136e0335676f0bcb545fe0447e43faa65eb1d
-:0136f043315a84cdfde6ea679f39bfd53beef5
-:0137002e3e6901d674e31b59982b42203301b7
-:01371024e076881b7a75d2cf2a29c2dee7cd49
-:01372092b40da19e20514fdd38ae551055d44b
-:01373073dd5035006d64cd19ef83f9d4769f73
-:013740c293bcb4b7a6d7ed09ed41e2e55b3155
-:0137503469209fd9ae50e88b4606e9ce2e379c
-:01376001c011fcb280cb4c1899adc917aa5091
-:013770f1bdd307d08f4b2cc0fd73122fc65da2
-:01378036ae202db69af9a9c90a1d2ce4c2c28b
-:013790ab801715df0c337046a7852684d65542
-:0137a0ab4e0fd96cc26793be5f45a243e28394
-:0137b074eea86c769b2c76d0ab1425030e17ce
-:0137c095c71ae829a94f70c3adc523a370abb6
-:0137d080f74eea6f4408c0b1705612733459e8
-:0137e048aae584e8b7f738916314dc292f23df
-:0137f0c77f3602d8805fd46b6f2fa44d61d76d
-:013800c4ef2a138bd10aa8a61293e0953f0dac
-:013810f3d9f8140016f0683d1f207311aa8180
-:01382007a97af67c4a785e2cadf8242d986775
-:0138305ca4983f06fdc291dc3dbc8113a9a86a
-:01384008fcd36e7f69be5fcc8f3a5962b8182d
-:0138508664da469e90d2e21ca9f4479f6624d8
-:0138605cbbca68697e7429a82535b230bdace5
-:0138705486befe067c0125e0be1972878eb753
-:013880507f005c128d66e96354934f62a7b949
-:0138900ca4da48a779c1febead979eb942e93e
-:0138a0c8378d9661ec6d3fefcd55dd4b5f0cb6
-:0138b018ca6b14b869712b9c5f977e6ea245ee
-:0138c0a078640da190eda0b3d9eee981b4c8ef
-:0138d0f02bd865213e2c9a3688ba87c36fd7a4
-:0138e04bdd80189ecb8843b9c5d1fbe6563010
-:0138f006af45c20ebfc03f9e3f37cdeefc3e55
-:0139007be7ae35fdaab5922f870946a1da83ad
-:01391084aaa7f17830cfb7f56aebffcad44f1b
-:013920dae92bc3c9f6f5a0b2c0deea2fcff8a1
-:01393088b961e96a490b2b7307a9dfac26cc22
-:013940fb4aa5d8e7078d4c06759c564528e34b
-:013950dcd1ac02f3bb1dc5ef8c70ae5f9fe9e5
-:0139601ea18249014ad3183ecb885e0e3db1c3
-:013970885f9f39b99af3e181ba0b1b4d4fff34
-:0139808e5f79a8d29931d95308841b80690090
-:013990b5d1a4adc3c1ec90b07fd1d6cecb77a3
-:0139a08382ac6a71713fa4b2d6352f3f44bc99
-:0139b0a7f23202b3964bfa4f7c3c90b2f17d36
-:0139c057a383426339a0e87fdbca678f9ede27
-:0139d03888282c91a706f5783abbeb9cbd453c
-:0139e0dfed7c7f48ed375bd7d8ec3022c4d3c8
-:0139f0f9c593f4360e8e193574684e0514f346
-:013a00c1d30c3a752b2c44c2af3cf7a30ea27c
-:013a10caa4eb5de650ec6ceb4e9e45468e4797
-:013a20234f48b0b984b1a70c1006bf131b089b
-:013a306d3999c46f7f85acfcbf23f47d198f87
-:013a404739061a5fc70eded827194c4cef52cc
-:013a5084bf18de57cbbe1b763f12aeb1043315
-:013a605ebdc8d742aaca8cfda2978ee9fe84e5
-:013a70d669563580744a2602c7c794d79d4894
-:013a80ced757b98abecb0dacd3cd1fb7721336
-:013a900dab76fe36cade33e572233bbfbbda10
-:013aa0f0218cac0bbc4d0404424ea11ff559a0
-:013ab0765ecc4441932630e4ca354c776ee1e7
-:013ac0ceeab4d445da7d603ded5e95983873c4
-:013ad0c3a52692c779116e0f3c818e637dd2a0
-:013ae0bd44d6b5041a3dc523bb82fe4078731e
-:013af0d55ea514492877aabeb61456e347c0fe
-:013b00841001fe5785d3b0695362ff8dc54a75
-:013b100919a2f4dd5b12378ae98494232eda6b
-:013b203f49d4f18d261f1be4e5352d03d903fe
-:013b30b9ff95a769579365247b3dbe927167ad
-:013b408e798da76aa1b687ca258067ed16eab8
-:013b507ea353815943f4069f6475ff6e06618b
-:013b607ae3ddcdee198dcf776bd7d07228ec8c
-:013b70ebc205140246c413c17cb32fadf16041
-:013b80f3718d1388e596db985c2b81b700ef3f
-:013b90d77efe7fbbc7fca2f68443d0b12cdbf5
-:013ba0ac47c5115167d82cf6c864ae5a90f3a0
-:013bb03d9b6291e1f80d2910765d56801f29da
-:013bc018056b03ed936d162e6cde8bc5fdafe3
-:013bd0e5fecbde5b9cd0d119d7518823eb4e1a
-:013be0c0035c48951b3ffdaa986edc5875c081
-:013bf0f3214573f68c10c6e42a4c7b8b85513f
-:013c001e32b358d033a632454b0c26e632001a
-:013c107c2320771c8714460bb679ea2d72261c
-:013c207162ce1a312fcd1c3972d06faab1c7ac
-:013c305f61198a51d1444f479de710538ca361
-:013c401b3941edf3e4e8ee08f3f05467423094
-:013c50a0210ed68349875e2dad5b8b611165a9
-:013c60ff87b94960e9c8979806bae69b14364b
-:013c70a6200b7aa31ba2321731a3d721d51b04
-:013c801b70f5e2a34775f1f97e5f262b39b9b8
-:013c9031ff0d3c035d15b71789702d403b0f59
-:013ca0ab00d327753d6b628c51937a51d78d21
-:013cb03985f719046320bcb73d7e3d309b2a44
-:013cc0323c290af51bef67dec29f1396300748
-:013cd044ee11b535404aa49163d0793eb7461f
-:013ce062bee4106674090e761e6d119364a557
-:013cf08bc416bdc701b5bbe4bc9582acaf2ca2
-:013d00b64a6ad5e901be165cf5821d14e8a679
-:013d10c6ee1b2da74700162f1f76344cb7696b
-:013d2067cbb8767614c8904762764c8e2c208a
-:013d30dfecdb1f8d207f0d65fb1b89a1b14c46
-:013d40b15b3efc864afe456bc957a37047caa2
-:013d50cc4f3d89640a98a11bcf1f62164445ce
-:013d60bfe3c75ae2b25e54b8cda32071c8770c
-:013d70ed5d57771b10402543f55a76fc9816c1
-:013d80b5fb23eb66c871233c863f69f79557f9
-:013d902e8b3be9eb35bb0b74fd2be554a95abb
-:013da0141ec86942019170dceca3f892d15307
-:013db0198efb2af434dc90a3d066e7ed00cc10
-:013dc021a9b823cf6fb79df51fc5e687da4e50
-:013dd0403cf70bffbf117f40e0d2a955467796
-:013de03860366282d9ed592d3e15292966665e
-:013df0804bc9165096803d654c508759829c61
-:013e001db963e87663c826809a92151039e884
-:013e10f26854d087a270a919c98f965c4be89c
-:013e20be706e31c690999b2e49b60b1d5f2d6b
-:013e30492c7f23a1bae45caa8f1f3e60e4e4d2
-:013e4058a3f37400a28c315f0ec7f9129f8960
-:013e500990b36b8c38219ba231aa7721a8cb87
-:013e600bc8886d497193aac82db35751f42909
-:013e70f65cfb58b5c4e0b4a40cba78f8429f01
-:013e809ae5946de073000fc0f397de41a2e3f3
-:013e902178cb30747d8ee83a679a5b66ad5749
-:013ea0ac4772e5195b8e73f63f24b3b7453bb4
-:013eb07bb3049239e5701105871d01685fb531
-:013ec0eab85bd39421cdd7fe757c4f720a7dd3
-:013ed0a90be0bef7e82c619f1f5e71cf018207
-:013ee0a85e87b2c54373ab75352f112cb01a7e
-:013ef0d76151468de5a03964fbefc17e01e710
-:013f007d4bfb0e453afe8f9b2a5361ab6437c5
-:013f1013c75e6dc6c9e29aef2e06d1afef4ded
-:013f208c9e56671b62f3f06d4038f5f9a082ea
-:013f30ec1e54ee5dd72c7898c8bc0f32a0484b
-:013f40cb0e868b19e886699d80edafe706c305
-:013f5071a69974ccc28529c183dd2087a04f92
-:013f6097c95e3a188b68abaf047df7b7590dd2
-:013f709624a929d7d1e2ed0f5256a0260a257e
-:013f809784b43e53fac26eca6f5ef58f941dc6
-:013f900399a92fa5d2cf50682f25f0976274f3
-:013fa0f381a0c860eb9af65dddebed9502049b
-:013fb0f0badb39e84a4febe63da126b5e63710
-:013fc0c426a0ed074f73a8a349a440428161ca
-:013fd084194668f248de780d8940f25fee3207
-:013fe008d3bc66bc005e1ce80186093ddda0e8
-:013ff023b1560db16cf8a23daab63b69ad2de2
-:014000d3b8ba70887f70241ab8d2607aaac79d
-:014010a27541627ceafaf7a28fad292fe82181
-:014020dae4c5cf5e957a8ac0442b56f92f669e
-:014030530d0230e2ebc9574bf9a2e8516ff2c7
-:0140406832dad12b52dd91ae555a28746639bd
-:0140507c29ff5170745121aa20fcfe9b21a862
-:014060292541562fc875107a0317de291bc63a
-:014070e54018131d6fa0b40a8612e6dc62b197
-:014080a8ca886f5674be0f627d28378d44d420
-:01409022bbffb778e90b0f01dd1a8bd5b4bab3
-:0140a0cd5e9f54adb0be35b147e74990129800
-:0140b05fb9eb26c5971497b32ddfbbf25c9c5a
-:0140c0aad9a0b5f3e0edc6420eaaf8717ad2fc
-:0140d06a3b7de0bf7431b88653ce3e49265bd4
-:0140e0ef2881a3ca24850f951208eef75bab9b
-:0140f05401abcdb80b5279c7f83eef0dbecfe8
-:0141000bbe30a4a344a0fe79872875fde15d62
-:014110cbff3b68b22d2b7c5ed3b202267f2d2b
-:01412085536525f4c476f3af3d42a5d6f21a93
-:0141306ad18675b0f86192acf47b3cd614a752
-:0141401567a5aaf8393613bae07afd1536c16b
-:01415032072d2adb7e05c72f866908f99fb959
-:014160bfe1aca077a258309ed955f39d8fa56c
-:0141708fb6b29198ecde949bb60b407181ca99
-:014180ce4c24d813d07ea820f9c8d4656bf3b0
-:0141903318185430f712ca9b2411d320976b4b
-:0141a0145d5754ccafce88b2eeb4f6fffd7486
-:0141b07a383a5d74934e195eb6149edbcd0ba5
-:0141c0b074e307852f2eb56d043d329ac97381
-:0141d0e9910639c8622edbb8eade7dab39252f
-:0141e02b2f7b4d245b25425470401997e0a6cb
-:0141f01550e7f26f623bf25afeccf3108c315c
-:014200621e23269eff0911155b7a699bd44832
-:014210879f78986e86b279a850b1360539c929
-:014220366ec1f615dec60e79466bc3d79d601d
-:014230453a312c6b66355ef55f8e76b8826116
-:0142403ac212622b5e569b45cf474bb1ed5c9d
-:0142505b87bb758664eb709df552111eb827d8
-:014260244fe3ec45ba843015a7246c5627b898
-:014270a826bb0f3624f87d2b6789b2d902c208
-:01428051ef5e7870ee8181ce3a87ae275b21b0
-:014290cd8c21acf01ef245bc7634892be221dd
-:0142a09cbc09f9dbd281db1e356dba41ac782d
-:0142b02e4e89697bb3372754156959ac6001ff
-:0142c00ac0edbfc69a283834ffdb46dfe702ba
-:0142d0e8f06c7d147e87fe740666e3aba6829d
-:0142e0c406e95a20c5a895965dea12d1ab8c08
-:0142f0aa4fd06dcd63be6a5ed7eec567dc1f11
-:014300de13957323c5bed4feaa4af2728b0621
-:0143100012a82de9c279109a5114254e5bbd08
-:014320a008348939d67c6b4342870d4d0fa242
-:014330bdaae077508f875fc3bb01d6ad302a51
-:0143405c05d8514202f264dba507b32eb0e1db
-:0143508d715d40cda0cb9f18415a5a72ca81dc
-:0143609266c560f2d0a08899ce8acd21c23e17
-:014370c3af3a2433e01747ce79f36a7ff1339e
-:014380c8f9fce37151f48e82cdb178619b35f7
-:0143900b09109a3f6f963f51d7003ff560dfcf
-:0143a06ea1141bcbf6d8a1bac01e0b021e3cf7
-:0143b08fa8a95db8bda0c8ef3dc54e67eadbe4
-:0143c0b4f200cbab2ba72ae83324ca6264f925
-:0143d05a4c26257622bd5b0bb0b60c866f17ab
-:0143e0dd017aa7f46ff2b81227171f94fecc67
-:0143f0a6aa350decee371c9b5be23d1c3bdccc
-:014400b54da4b1c371aec13ab9ee5edf730119
-:0144109b281bc74a4ee48e170a3c90806c4a25
-:014420bf070193c12cb9456f6266db8f4ffd93
-:014430a9d66683ebadedb1da232de4257ac350
-:014440dc99722de41f3ebff7dcd642ae7ccbaa
-:01445013c35dbaf0587f95472ccfa251968838
-:014460a1b7a86c9f2523bfa1f0d922fd8f3bb4
-:014470f2d0354f1a749a19507191c7cd0a3425
-:014480ee3873245f7bf97844af33cce1809f1c
-:01449085b48042ac3d441ad540ee29dfdf0ccd
-:0144a04fdf68e727e8236f2051b93fb199c33a
-:0144b0f66c42bacdf767cadc26e5819b44fb4e
-:0144c037189049b8243344aa3efae8cbd2f9ec
-:0144d05dc77b5cd94753cd1e401ca1caf9fcbe
-:0144e097e23dcd1d14978c35e5726c8fe41f20
-:0144f025c50ff69306245b5a933ad4327994d2
-:014500de53874aa7c9b26ddc6a42cef079d6ea
-:0145107f2ca8eef995aad6b953b0c4886fdfdf
-:014520f394cf598383c3cec346095909e36e83
-:014530d76055c7c6e05fea2e6cbc33b0e19fcb
-:0145406a986956e92e8e40f21f27a6be2b0278
-:014550e3c3ad2c562008892c4d3f332cdbcefd
-:014560c9d266585919d3ab000e6b79db9fbb49
-:0145707efc4411df5e3649b561e2e1f0af17ec
-:0145802b637e0ea77e19ca7f31a99c75c6a725
-:01459066bb3d050bd635ca1e424a8e2be8da86
-:0145a0d4358caf78fcf4930b916fab81f0f553
-:0145b0451a8f78f11dcd003c65a1eb44bce8be
-:0145c03642ae7fe94a92cb58167596c229fb1f
-:0145d0577fb4dcced5d018dbdb35dd964b3380
-:0145e0f8debb77223e7421fa4746104fa8264a
-:0145f0b84c4a0b06abadabee63dafcffd8498d
-:014600a9971e663927980393e6cdf110f8095c
-:0146107eb9e80fe5b8c29180b5c81cc7278c8f
-:014620a84496261d92d2415021be733bf9defb
-:014630409d3b10cdd14487f87a9d2e804fc240
-:0146407e33fe2d97943b6255489ddc8844b3b4
-:01465022e78d94ed34678788accec759edde8d
-:014660fc2ba7da36321cbacfafe4b802b4b766
-:01467043b99ed1c43f33f4c8cb2c975384e4d8
-:0146804b480e3920a696c6cc65b4277051f934
-:0146907d53eaf0b85399b7e9653d9ef1eaa771
-:0146a0726b016dbe1aa85da9922288da1ca8c2
-:0146b0fbff56afc0344ca5523da79232ba5141
-:0146c04e6faefde9ac7e7f785c70c0d5776c5c
-:0146d0c0980a0752ab14292b08fd82503e154c
-:0146e011704e63f083bfbe4c9ebdedc2e1eb46
-:0146f0e6e8e7acb66dedf30ae807fbca2fb427
-:014700ec5a0a13bfbf9680baf9956034175c65
-:0147104d87b80773231843b5beafe98a011360
-:014720fe6f35bc4a04a4bf15a6c1956ba18d83
-:0147307f80674e81dcaf592d7bd055734de57c
-:01474008c6da9a07b4dea7ba0fb3838a5636dc
-:014750a40005878b1d4f8975e49f8fb4729107
-:014760ea81e24ff7b86b47a3d1b9153061bfbb
-:0147709e993aaadcd6182e59ed86e440dc8ed4
-:01478062258dccd4ea8d4a3e6dfcd881802488
-:014790d90b9a2c2364f3e88fc31fe09e7bc1db
-:0147a08454cb008523ae71019a4022170dbf58
-:0147b0043df9ade80e7089c22ed2e7a1e5cb9e
-:0147c06a5d38c72868d8f4b2f0b9cf92000cf3
-:0147d029e8c451a7de904ac2477c1fa4ab6bff
-:0147e0de4d0d1757fac43ffd51cb94fe34924f
-:0147f05d2311808205ddb2607ac247fe9ee996
-:01480037652b455cc62eec268b07701bc3b971
-:0148100cc1daadbf1ee141bc8fc2b83fda3f53
-:0148205f564dd8e55a136f7dd50f7a61aa8b6b
-:014830bdca368d918a473554b2ea62b4e8db58
-:014840887a37c009c3ce36f405796cc21eba07
-:014850af8ff2092d2e0f4ff77adeac35d8265e
-:0148609e4dd6b90f4b87ab009c2d476337b444
-:0148706c6af4e959f65c37bc3203701d3343d7
-:014880955d791bf108202cdaa77511b7f8d743
-:0148901e0c793b383da4cdd2f00b1556817e06
-:0148a0f93082cbaf7ab02c6ca9aa7936af4ded
-:0148b023efdfe5ec542e6a2ebaebb88173ee11
-:0148c0ad0929446d26ef4f5479bc033ba25e25
-:0148d0e721a2f69b2f327432bce60c80e28c38
-:0148e0c8528930682022dd2ae0ebff705ce512
-:0148f0af5467524317436e3bdac56cae0675fe
-:0149008da1f9ea4b6f0bbcdb18619a9607ed5d
-:0149108fc95d91ea53292d3c79671472e01588
-:014920618a0930c9ad939951fe2e4665d56a34
-:0149300612103531b2d4ba6cf72add7f22a8f6
-:014940ef4966085899c154d1d5156a9ea0d737
-:0149506d3d266af7f452ece1a3b1b03dfffaf7
-:014960bdeba4ca74b81d8ecff73a5e87a4e1c5
-:0149704481fe027d6a5c53c6fa997b8ea57dd6
-:01498094d039049ee58888a1c6d649a4d8e5f8
-:0149903b107a20ff30d3754589a1e7d952d18d
-:0149a08723422a03c9a8876dada30546b351d0
-:0149b07ff2c2d12ac19d9a3496bc99f431fdf6
-:0149c0265e93f21fed960c39a66a5d8ca7eb54
-:0149d034b434dc0fb663d86bc61c884aaebbb9
-:0149e084e1a63bb53abf8655b9fc4b9f55d42c
-:0149f08234da193c719fc57f49d5f7e8059ddf
-:014a00f465343633914abf5618bb97e51702c9
-:014a10567495f309cc5cdcb9e7fe3c669aa574
-:014a2077c1c4fc3b4ea6bcf18ea93efc0a965c
-:014a3045d934fe9388b5a06c37bb51d1d4ab63
-:014a40ceb9b5fbe6571da357ec735cd4591151
-:014a508c7e5cb856c73078afc3d2d8a0f2573f
-:014a602bf97a2e01eb121bd0e400864c47a0ca
-:014a70964f6a4512b8aefcc1b120738fb3972c
-:014a80e74271d14296b77ee87d1351c2dd99d9
-:014a9080a7706c3cf91b3028a21cf5f3f7ba72
-:014aa089414af7c89a35ca546c65eec804480a
-:014ab076b1ab9d16a7438f172c9becf289f30e
-:014ac053b1b76799a4649582b748dadcfca365
-:014ad007c39c9d526e83a8614e826e3aebb23e
-:014ae03b9febc8944df9ec52901e84bc004658
-:014af0c69169cbf53ab32af1df2c3860b3bf67
-:014b00e17635178dcd47812960da35b148f632
-:014b104f7270f19898b3e962e0d3142437474b
-:014b20af5e5318eab8e0a759ccf2fc8687976c
-:014b3020f3bcf6591fca9cf3b8ec5649ef3097
-:014b40d8c5a81828f91943f5e210cf20043aec
-:014b50c3c9ae6c289e9010e6da929a23302300
-:014b605da9d01a5368565c66a7a02ee4c70294
-:014b70a9d234cce64c4811273cdda8401876a2
-:014b8025595f38ae894838b28cd15c5deb9edc
-:014b901d8a35f7de924d898dc741823a33bf31
-:014ba0a3c5a340bf9bf9007771f07dea49b4f3
-:014bb0090b63073992dbd43c1e8559ad62f782
-:014bc0dd51dc13ba547dfd0275d93a411a9862
-:014bd062f26e7bcd7d1cf30a12d0e9583b9019
-:014be04b735b1d5c010af7600dc9d7f2d48e74
-:014bf01524035a4ad7bd42d0c2ea7119fa312b
-:014c004fed6345857976dc194b94031581887f
-:014c10587a38c9e3a8924584e21e715b621921
-:014c202e374e1ac53fcb7085cb3b8080909c76
-:014c30888b79b0c809a1a26ccb8971c3fd756a
-:014c40edc6bee6b18b5429ffa077d2f178c8da
-:014c505b847c680fc3974975c3f3e9ebf7b6db
-:014c609b7b78a257c7cf526d676bd517ec6e92
-:014c70543519a2e301b9bca374113568fec3b2
-:014c8060f6f656fed2cdb6d681ee75b9a9ffcd
-:014c90bbffbb30fa77ee44ebae1f7125da7377
-:014ca083a2114de6688b5fdd8ae0d27d14c1c4
-:014cb027fb2157da32c719b11b2178488c1572
-:014cc098c175ed462f39d37117973d8606e4e0
-:014cd0764f69e40019e5848ee7bf8963e462c9
-:014ce03804964e976cb2470281cce9cd0372a4
-:014cf05dc7b0db8bef28ed160516bca39e7b2d
-:014d00b326f3cea3171ede27eb5634342aacbc
-:014d10752b25081bf77f60f76f0584bdfc83fb
-:014d201d37378e8f7f5583c18d9af552ed55cc
-:014d30405e4182bc2634896f2d426ed861d642
-:014d401994c85c6495271bde03fd7b2097baeb
-:014d504172763d28bcab9994477c4520cd95a9
-:014d60e8496fd6b5a15efb94cf4a28e61bfe7b
-:014d7060e6a02751c514a8b4f1ad84b804bf3e
-:014d802a07b5845011348f64dd32176033235a
-:014d90dd109fddf6cf9547ac1649dab65b4334
-:014da015a185c39cccc426e00adc3318e144fe
-:014db098c0ab7c4eec7a00d45992260364c433
-:014dc04c58ad505b6580a7fbf54ed64d370833
-:014dd05907597382623aa2e3496974fac557cf
-:014de0a20b07aa77b04cb40b9da89bd1c1f8f2
-:014df078a07e3751ad09f91d9eae3f482cf8d9
-:014e00ad8a4146fa23dce8901b95b246bafa17
-:014e104b6151d73e9abab8ced631a50db4eac8
-:014e20a9816b79ac4f197f742918c7bcd8bdf1
-:014e302b5c7f86fd3745ce149ae19000ef7eb3
-:014e4043411662465613a9cf9b373a6c660085
-:014e50680bfe7a9d57e61fa10427e6a2f676b6
-:014e60b384e1ddfcb662ee23d864de45a3fceb
-:014e70f47111508cb782ce9f5b9673866bd465
-:014e80b081efbc63e2e0537f7203c9d66e217a
-:014e903ac5e4551e2f0d35eb929392d8ef932a
-:014ea095c65af7ed1299fb0183169c5ee39b3b
-:014eb0d28922054b484c7d9fda9720de94dc97
-:014ec0ddcde4433a546ac8528027a8b849b6ee
-:014ed0154e34313f5498f93ed617e1bd30148d
-:014ee0123c34bf8f8fdd07e6c075e899aac018
-:014ef018bd94487f8802ea549b0afd13c32be7
-:014f004b825e4a8dd68f03a075f4f3ef7e6afd
-:014f10986abec652aed253b38a9120c38d0070
-:014f207c0e4c9f25bcd6b6e2b3e57aa3f369d0
-:014f30608153fc5dfba159f2ce85cdc53a1510
-:014f4067174912184b9c0f92f8ac90b1017abc
-:014f50f9cc2bc9943e1a9990a80aca9d146daf
-:014f60521e337e7bab5d84f12bb2e9b741af82
-:014f70279a57ce0ebf659f8bc056aea99c2924
-:014f8019791ec4f9f7ebe4762d88f654a8ecbc
-:014f905bba61ac1ce2501b2ec7eb03b13c2e3b
-:014fa0aa9b25241c00b676c84d24c108616240
-:014fb01551f7dcfb38ac9e8e34207831f795da
-:014fc0338eee719cb9b19cffc584ed384de12f
-:014fd02b9d9e112111cea413d34c818abfd931
-:014fe0a0049bb3e4e004eaa084dd358dc068a5
-:014ff09a62112466b9f56e926f0aac8ba85b52
-:015000d50efea5cdf98bb89d8f54ef36c5151a
-:0150106f295f2fe8079d822b5d3e6669d0dc59
-:01502057899d719321a84b9f420f3c678befb2
-:015030e1bdc64d6743a0d03b2c1e333eb46184
-:01504072febea8bf75698d3994ff7126247858
-:01505051aa7cb2ff4dc2e8d1e734d8046090cc
-:015060a8d28e730131f3a0f9a0d31b4ab664a8
-:0150701cdf93cd307bd9da85ffee06bfb0db9a
-:015080f91a93201e0aa0f70a935acbe8cc6be8
-:0150908bb88e1dfcbbd55348c43afdf5d1b15f
-:0150a033806dcc4e2b4ae6ea673366e4b7d7a9
-:0150b00077739d4dea10d92c36ba6c56cb09c1
-:0150c042cd3962d96d41d99e71bb81466d4017
-:0150d029f277589f134b0b06b433fef9b7173b
-:0150e089a8e4801caace26f16f7d915c4e0fe0
-:0150f016b6729b66aaadd0c5963ce3ed850282
-:0151008a4e95b46671ee24b62ab2727cf740bf
-:015110fa9bc1033b678258928048ef042d5689
-:015120de4cc5abd06522367f25c080e4ac4637
-:0151308978e8ef99c241aff709b358c8cbec2e
-:01514032407b535e1d7a894526a384d0a85a8f
-:015150dd05df3bf4e9f5d5d8d0248f293ab3ff
-:015160fa6bbc2b9a4f17328c551758a847011d
-:0151708f7208592610950655d72c82b031bf97
-:015180292d55ee57f595a4c8a1b98d732688d7
-:0151900278f476a33922df07aac5813be78524
-:0151a0dd272a6dd741e73c3846de426c424967
-:0151b0b735419f55c0ad29b8f9b1956f14f646
-:0151c065c487202cd66a4be4ec56c5a3199a17
-:0151d03813d6156507f7bcaab8e284e8207a14
-:0151e08b9ac98f57e6f793922a04b6c16a7c10
-:0151f0167cbae3e1f4b0848d51fe684b2a5b9a
-:01520069ce9e418b14023fc5db1195536e9d03
-:01521032ac2a9e423607c8bfe7ddf47b03cbe2
-:015220153799871a6d179fcffa1aea2df23fe1
-:015230b0db8e13323f0abe727f198da72d498f
-:0152400670a816bcf6e190dab7722a31c12294
-:015250fdc093abc1f4932171e9fbbb7a2aa0b2
-:0152606516ed227091cd2507223073b4e9972a
-:01527028e14d19f530447441c658d1cc46d313
-:0152808a6258e75fb194489eb5007525efa429
-:015290ee0fdec6ded8b1fb29f1996a77c777aa
-:0152a0d39e550390c36011c3b28d41a6af53d8
-:0152b0546b9391e09813e5752e4f6f7e9f7e9f
-:0152c021db5c0517c5c8131ad542180a1eedd1
-:0152d01e2dd033ac5617069b1dc1e36e123698
-:0152e05e681b57a3a96107fe8f164fc6aa8549
-:0152f0111391d3d611061abef43f623ebce24c
-:01530012c26bc91991317c5cb52078f8f38ef3
-:0153109c8121eb7bc91b5371189dde8fce6223
-:01532000401c70ecb301b9a1c672fe379ac556
-:0153301e34cab773f95c57b72df84b70de37e9
-:015340e6cc14d9104cc9317626e71f37cd0169
-:015350c009ef2afb6ae88f5e658a3cb3a2e630
-:015360577d6cf51bb8104c59b7dff5eb0af444
-:0153708d8cc7ae324c25af975247019f51ef69
-:0153802d870dbc066f927e11dcf2b6ea7df623
-:015390ad4d6adb9a8c0d4973afc7b4bf818198
-:0153a0cd7634497ef925a879e6d1dd179d1f34
-:0153b0fd4a55c502bad6bfc77c28b826c3bae7
-:0153c017daf29dfff0dab060d88a7eae06022c
-:0153d08a58f310dcf0763bdc3a4bb72c82019d
-:0153e0a2565e54887a955b682595ab55af2828
-:0153f0571f87bf1afc459ae8d8ea228b32314d
-:0154000c9b1e6843628b75b97bf5657111be59
-:015410776f8ad8d05e456f0298ffb2c09c31c3
-:015420cd9b5d17d994e90ceeb3d4d43841c97a
-:01543037fb38355a3694b2371f0c151de8f6b4
-:0154400076bb5a65a46ccc63f866aca94fa785
-:015450bfa0e0e498c41d0d99e7d410fd4346cb
-:01546017c2646e30e6d44cf8ad10471b1d7e23
-:015470b8dbb802ce277a067bda6ebe380ff83a
-:015480a9f69a71b06e6e97eaac3993b40a8ae2
-:0154909fb194490e80ac23c77a24a8f54d3f61
-:0154a0e8e22bbdf0387b39a5b3ee380355574a
-:0154b0cfb2fa48c4e0bdc37e07cdd54d2b173b
-:0154c01700f4ec4c59780bd8dd409ddf1b8446
-:0154d0f0fec44b8c32aa8031ce90cbbdaf8abb
-:0154e0c619a220c0d99ec48cb7ce14bdcb2581
-:0154f05395ef06ed236f89ddb527b88186613c
-:0155001c9e5298acb55105425214fd380d2bba
-:01551049890e5821bd6a587995497dd74882fb
-:0155207cf5e0bcda09c2cd1ffd8c41c700c9ba
-:0155307a3e9079c4ea70857eb52c2e0defa918
-:0155400e11786a16271d82bebb14e6236d29b8
-:0155507ea53aee9e993b71f94e3846c210c3b9
-:015560e32e7383f506cb43b91ab1327e952239
-:01557030d56a6306e365143bb9df709293a746
-:015580d5bbd773ba29a44a07a2bcd4ad6f528d
-:015590b5c54108b2508a762588b5592c1443e5
-:0155a00745c07fe1b03ca930076580dfb7f6e4
-:0155b03a6403c0249ea673e6af7d6621b851cd
-:0155c088dcfed6e6a61f47f582320aa12c0a9a
-:0155d08ca4336110bd80ff0ac83cd40c096a21
-:0155e0ed3516e4aa806a32430b6f315bfe9a5d
-:0155f0b7843211725c5c4dc4c6e66b9371b9d4
-:015600b02a6dd5172ff329a0af6d137e09f1d1
-:015610db2d53918e3ec4aa1c82c4317bc1b253
-:01562098843a83a1018769d82b4668e86127d1
-:01563083becc730776d4026a93c3d2b96dd607
-:01564049caef9dff4f3cb7471d1f6c3782a364
-:0156506532055ae581a8c227d0493888af6641
-:015660e6c2f466068e33a8bebc9a610a9b7af4
-:015670ae1d92cac7e4438d35cc024f3a9d9843
-:015680235bbcdcbfde7042f93322c03d3028fd
-:01569069cf2a161ae2327d652d89e9ecbb9dc6
-:0156a04866726f45c883edf53f24601e003e6c
-:0156b0eece90fd3b87aac6a8d16bc999cce5c0
-:0156c02eabf870819f2cb72059e7ea75888505
-:0156d00a8e9eba0ef7235624d8831829e1dcab
-:0156e09200ec7c80f9168dfe436f12480806ef
-:0156f0f5712f235a9903a3cedc3602086e8f8f
-:0157007a2da99322a7ee80db06e5762220a092
-:0157108b00b110cd111635a638d4a0599453a9
-:015720956ddb3564ee43097156e38a092dfbd3
-:0157304c39964ff0b7aae12655a87c2ca6d14d
-:015740d2cce01b389ee339bb7bacfc629a8de8
-:0157506822ffa2a2e44e5f843fac1690ecc85e
-:015760c76bb0490ce8804e47bd3872c3d02721
-:0157704c5e7b36f1080db66a63255e4468fc3b
-:01578031dcde112377d0e0b8693d5180af5ce6
-:015790468841f0628a49e227639ac30c40b0cb
-:0157a0b08b13f9f4ac9ecdd08067ccde359fb0
-:0157b0568072d6126805802bc2749053ab832e
-:0157c09308a8f606e613520f881d3cf2c29195
-:0157d0cd4d8a644f18c9e1a93366320b84a7e1
-:0157e0c711d2f51c8103193910d2485db080db
-:0157f0ec459bd94f34c70c59df02ab0f9a7f99
-:0158007360403b27f58a2dffc860813922599c
-:0158101604bfc1dd56b6b7cd6314841ee26923
-:0158207eddbde9ec886f4a6c10a8cff02611ac
-:015830de22355414b89400b24fefac86b4544f
-:015840935feb8c39e35d32482260f8890be8cc
-:015850bc72bb2791068f9b2dd91041059d57e8
-:015860ce21f9227a917153afaa9dbe2fea1652
-:015870df05529a1237cacaf5a5f967b1a8e35a
-:01588079e2fa2ef455304857e1a7bbf52496e3
-:015890fbf6f37774863305515ae93d2e272fe6
-:0158a0274207d9822d4fae1169ca26860357e2
-:0158b0a74bd475762f8453207f2bfe6f31d1d9
-:0158c040ae43e1a7baac600f2f390696468998
-:0158d0f3590a74e9cb435eb3ba01b14a833dd4
-:0158e072c366bb3729821fbd90850f1472cec7
-:0158f015f6664d3d047d4b9fe0ccff86b344d8
-:0159001e920a29d4b5191cacf62bc3c936d3d1
-:015910bf18a3a134cfd8dca807c6627a78e47b
-:015920ad2b508de98f56bfb6f3ced554e48d19
-:01593090c65dc7bfe316ffd7028b3b61d36a19
-:0159400509ed153c0764c8e2b69cc34e32d1d8
-:0159503afff856b8b33f62ba829634f8422f59
-:0159606e80a18d25bf8a8fe04c3527e1fe5972
-:01597078734b71ff54b41a1ba0427bf1fe9408
-:015980bbe4dbca96aac0065e2872cb1dca0ae6
-:015990283aaebbd47aab230f29d946a2e9a5b8
-:0159a03d23d73dc016be40fbff7850075ecda0
-:0159b03fdc8ecae2429e1df4018a06698dc579
-:0159c034fd1bcdc75b685616d1d767b4ae89fd
-:0159d047321d5b57fe68cf5bab095497ddc28d
-:0159e02d1fadfef704b35dc8b1ebee027c017d
-:0159f04d46730c7974a83ac70eebfd714bd434
-:015a00164bc9c81862ae451a979ab22886eb8f
-:015a101be04842f1a9aa2e0c78f804ca23ef2e
-:015a20e1bf878c7833c8e71747a5d6489a6e86
-:015a30d5aa651325de6eba44fd9d98f3c60ed9
-:015a4048e34186dfd29c493c7cb3d0a41e34d0
-:015a503fb21a1230084cea23848a468c8d90f8
-:015a600ca60d16f3a70c96a852a5fce3d9c689
-:015a704da3a7a55ea1c57f9abcc6f2e312a74a
-:015a8051c77a67981772299f696378b252493b
-:015a9060d1cb2d3ab8f8b3a6a111ab075dd9d4
-:015aa038262d62021f817b87c9c5f4bd3f8c07
-:015ab02e9bb79455cd959306fb3dc5048922b3
-:015ac0b5b5b1c402b3f7fe9555351d47158a43
-:015ad039d4e1d50e469dc198fbc75f33152760
-:015ae05af9f8c2bc6b8b17060b6818df85de73
-:015af059fd50a19a0f6176fe053f6af5deeb29
-:015b00cb235b7ec4d19d30094f518fb713de41
-:015b1022d00f26cb53fd33cc28364c0b027717
-:015b2088b53a7f4213901398a529df020f649f
-:015b30bcfec4f08991ceffa8560d7fae1fcb46
-:015b402e1886586f249a8f4e8b9c0ce6a4e9a2
-:015b50ec21cade8b2341c647698e7892891815
-:015b6049a7ab8406b55d840b26faac34cbd618
-:015b70f524de2c39ca6770435ab41e566d09c1
-:015b8015f328df61d3166ebac7f70a21f05acf
-:015b903fd076ba11459b7723d086aadf7b7d22
-:015ba014515e79a1368b6088d23ddadcc503c8
-:015bb082833904227e7015b84364362d0880a1
-:015bc035332aa26af60edeedc260e10dedba66
-:015bd0dbb3a8ade450b455af3cc8edaa3e22f6
-:015be0b1c26548fa608700fffd74244288a9c2
-:015bf0c90577047f109e9b0bea185145c1c172
-:015c00ca62b352b81997ed1f332831c6394e85
-:015c10ec93bfa7017e50c01fc7c11e643a417b
-:015c208a144f50857051a052cd719b027eff4d
-:015c301832fa52b7c5e20b1ea3e1f6602e2568
-:015c400a507307a1d89877e7f6d98de7271ac2
-:015c501e8d83dbbd0b2222c07ea04192441410
-:015c60e6a9dd07bf9de2f2cfd6f797c11b8642
-:015c70030880f13773630d6101045e36561171
-:015c80d07249f8bb49c4afa54d28634f911122
-:015c90efa4015c0808ed5d5824082da8ad1975
-:015ca07c383ba02955a46264aef7d560917560
-:015cb0c12dc23e41416c13d8a16fe223f6574a
-:015cc031b32c668a345c3c8f874c3acc3e130b
-:015cd0a23735396e58efb7e6cd7cca8b35f754
-:015ce072f165cc8a2997cf4929a32acf3c271c
-:015cf0f8d0a00bbfec57844370470d6dfb34f6
-:015d0021edbfa20d788f191db1432d14103607
-:015d101bb854de69ac88b0d2147d0db026cee8
-:015d20d4f79068e76e15d9df88c63369a2663d
-:015d30a19dfe011d87552a847bfacbf98386c8
-:015d40a4e09fdce5d05e715e02ff7a1e047079
-:015d50ad4b55ffe19054ba4269fec5eaad4362
-:015d60f2b449e119a2bc05df7ac6521f8380eb
-:015d7050534fda778642706232dbb2610662e4
-:015d80eab64c026204cede79babf33278ff58e
-:015d901b6ca475c1a8c3f6455e14f99041ccf4
-:015da0df8381d520e68b64c1fee51d943943af
-:015db051e27ac486f529719b11f342588e8b6e
-:015dc0683a4a4c9e37e10add7e723040d8ab46
-:015dd006bb9702cae7ef94ac9894155bceac22
-:015de0ce286edf19a90dcb7af9ed831f248afe
-:015df0d5c8402ce8ec951cefdfd29490f0f732
-:015e00c3ea06bd7e24dbabd45ec26b13351113
-:015e10e6ddae20c954c4a0f72ec61319b5e8d1
-:015e20dbb07ba53c416f5a6bfdc08eb9a87550
-:015e303b345637f0f612d2b723ea3a0a6bb929
-:015e400d9795bba64e61f546ea3437abdce0f7
-:015e5009c885a78fd261f521824c0e006dcdc0
-:015e60434810d1cc06cd52b406a7898170375c
-:015e70209705595b8803ed378faf0d6d50a0b3
-:015e802bd1b3097459d55330b3e1fdaf57f7a3
-:015e909339ee317ec701ba3cfc236efc158a51
-:015ea04b2a9c86f0d35e8f03e637920d5d4b8d
-:015eb008bddb74a7e550868399488bebfa0eed
-:015ec0f4a5f9ebff604adc23354db00d300609
-:015ed06f13ee990177e43b6814a85bb9e93f44
-:015ee0a13aa01f2c2331504bda7a05977356d9
-:015ef0c770c7f752649f98144aa6157ed27fa3
-:015f00c9e969f685f4572c04a83ff9ae8f6502
-:015f10895020b5efa0c70d0ef6a47ea23a290d
-:015f20f67aec7183455dfd4c4ffec16cc5c7eb
-:015f30528ac053339a42519ebab6d63d69dbaf
-:015f40acd7465b71c240d39c50fdef4fe317de
-:015f50189343fdc16c9cb7e80d569dce9f30ee
-:015f6042b93b85fbe77cf5a2a3a56395a4c0b0
-:015f70b10d60ac73b8b25da1fd6023acf6b3cc
-:015f80fce8e43e6e8166585afdf75489da64a5
-:015f9088d2272cd8e280af2930a8518c590485
-:015fa029b2bf5d1f2dfc49bc92441ad75c5b9c
-:015fb02e178404c0ab052b3b0bdd44bd110ffd
-:015fc04dc6d2953d86679561c0150621092fdb
-:015fd0bc2be7d9611b7a2312980cdfaf75b55d
-:015fe0a9f1a0aac6c5b2c22ed353f54a9c9b04
-:015ff076335dc72a1bcc0125dbc0847b5afdd1
-:01600080d3686d7708664bfacf0e32b318d2e9
-:016010822c02725e85aaa624e2ccaab3bf487e
-:016020a65e295bad353dcb5374117101c64e73
-:016030d5f9e12165973364f4d114e28d91fdc7
-:016040f4a63ed47af2c4410aa6861ac62cf0a7
-:016050e103035b1604ccaec6f0da560dc75829
-:01606068dd42c552e3707ebfa82e00f587e641
-:0160703d7d01fc0057beb64677c4ac61b1e768
-:01608069759bf6334e0b1cfaec0febc6830097
-:0160901a573511f4d7e1c210ddcf4273c34c26
-:0160a0d80600fe3d91e2340e8c4412248c9351
-:0160b01f734dad51414b728af9ab1271bcd268
-:0160c006dfee49218d3cb6fe8c6e98f4c14a9d
-:0160d0345129632d20f40823b6d335bb59175f
-:0160e0f5d6f84d3e5ae9400c0a64e5e2ec95fb
-:0160f0a0c05ba61200df60464721c70a3082d7
-:0161000ad7fba79432085a8e7743c9425b42f4
-:01611040ba20197f67d59bf7eeb8adf9d30180
-:016120e8c8877c7494955000cfad08deefb530
-:016130375eb3b22dece6bdf78859b370157343
-:016140d60020d63175b1de08d6591a87ef6bd2
-:016150e79dfa3900fd05edd39b7241c5736a4c
-:01616072c180a78b8d5ee697498ce419a2fc8e
-:016170c1a8aeab573d3797137f10065df896fd
-:016180a65ab947a6a69b0b279401362500d001
-:016190b7fe98511bcd4fdd3b7ed516ebfc6919
-:0161a09162ec7e586a22c3736e86f6fae11a00
-:0161b0d52949baebbce0146189815e45dd23e6
-:0161c0cc24cc73f911d76c99fc0845be5f49dc
-:0161d02954b1552e67403352f2fd3ccdddc3ee
-:0161e06b826706a666f01c79fd51478d44faf5
-:0161f0dbc054214a2b14571634469bbb50e5bd
-:01620099a7ff5a535bf347c8b67637d99a13a7
-:0162106d2ef00c6a64a0d9c85c28f04d9bb589
-:01622051584f93fc0bb50a818dc97466625e2d
-:0162308f72f9cd364d1ca38f6889c68c268f93
-:0162400addf0d289c60b0597f42d0964e65af2
-:016250c93578777c72ca278e33dad4b3bfdefd
-:016260ecd51b123cc5e93c1efb442b0cbaece1
-:016270136eef453dcb354c4a6021eef91d97c0
-:016280ee6309245ea60cacacbefdc912ef7027
-:016290f9f3b1f1dfb454c4073d2c9933f520ed
-:0162a05c4b7b1851927a672cbe04e12c6535b2
-:0162b008acdf3d5703b62983fe26216a6136dc
-:0162c0c76c1df951312f74a9fa25dabe58220c
-:0162d070912d7bf438b3811bb07b5fe461f538
-:0162e0c81a5e46113327c41cea19088466a817
-:0162f01f40bbea9568021e7bd0055ee4e1901d
-:016300021aca704cccf1c902960f6efabb9969
-:0163106d9061b051fe85c413215c839bb5d6ce
-:016320b8016c8cc07820df1cb2d7be0b5aee75
-:016330e244fce425070951da3798f02f3ea070
-:016340496c3f7dade1a70ec0e969e0bd3b6023
-:016350500cca8f107d6ff43c5379d225457c6b
-:016360ae712f4cb64d8c02437ae3c2989c9350
-:016370c68656b635c3a1dbd51ced6c670339b9
-:0163806f08741d5d41ab76350b475253540dd4
-:0163900f2b225697556e552cf09d55d57c6f4b
-:0163a03eb397ffe96afb996d6e98f7fe1e4511
-:0163b004a62366a4a6d658130ae7a556060701
-:0163c00faee543ee0242221a48a40b02a87b86
-:0163d073156285ba83aada66774e82aba0aa37
-:0163e025d429878bd22995a9ab1ee94f3539ee
-:0163f03d7cc14fe2eabe15e0a458787319bd38
-:016400b3e02c3efe540fbe1169d643af6e75d2
-:016410714eb3e65f8a6d701d893d578ef0a525
-:016420bde49ed6aa1f10824ca19d3b28569db7
-:01643001da0195e37e54cd4d87bdcb5faee779
-:016440a3b0e9f4132403ce5afcdb389d4eb8b0
-:0164508329e15fe2a5309877817c8c811d39a8
-:016460266071c1f732b5e6c3173cca24991193
-:016470b728790e8728921f70b1d838ca3323d7
-:016480fd618f2b84419a01e12cb74b9e396dfa
-:01649032c45ba04e17bd9da14c801d23ffe0c7
-:0164a0bb52b3564c4d4f4c9eceda725bc930aa
-:0164b0fc3697f703f11e6900dd3607caca6538
-:0164c0b5414a9fb556f68e2e79df6640a3abe9
-:0164d0784e977c0b953cf79330955da2b19854
-:0164e07eeb2e8b94a43d94c92f615cd0aa1607
-:0164f0a15bbcd2fc7959247716bf4643cf28df
-:016500fc2e7c8b5b03a7c2aaa56fb110ee830f
-:016510adcc282a4c66f7e5869e20110e7a24be
-:016520a2e9d355db07dbc3d4288949bbd30912
-:016530a26c415dc512cd53d26ba5bd1b708652
-:0165403f65e9f1815d9f838cb24b93763ebc71
-:0165509b1f96d28ff00e7e5542c76197e52e8c
-:016560a999ce909068edcd33f52f44cf4f6b71
-:01657008e64a7966358c55ffcc9e9189a0e39e
-:0165807a9e03daed6903226e60ae1da67c0d28
-:0165902c72950ad06a389ae7b846c35fd5c156
-:0165a0d25c742293e58568c7d1d1e588e1473b
-:0165b06a952997979735ad9215a4fd4a567499
-:0165c006194f8ac266508b29271e2028bd5ecd
-:0165d0faa1eadd8828e58b205e9ddd90d3d4a4
-:0165e0aa041eb77a7d5099c902dd63c921d3c6
-:0165f0ac13f18fe929ca09b2d40cb07c5cd2ca
-:016600089390cd846b1d141c0606df041f15a9
-:0166107cabb8829ba2abceeacecc263d05cb13
-:01662001701bb99fc9f0ab5ea12e3f3a166a04
-:0166300ec73cc42b78d27d4c4a9bf929ae3b8e
-:01664098b247ddb67ee6f85cb9428ebee358df
-:01665099a4ff2a244d74db520d4329b5b1d6c1
-:0166606e4c2316ed508689dc337750f6618e1d
-:016670ba354584c1e377c4b9df1026837c1b51
-:01668040a3323f1594cb93b75d10a6e82b61d2
-:0166903391e74e7d6582528ddfe50299d392f6
-:0166a0632b72137ef943d5770d7a9e95668893
-:0166b05275fb1431df6e5b0e3c41b87bdd5771
-:0166c019380b546314b907690b16fcdb123ef0
-:0166d041754cc90453aa1724100850877dfcaa
-:0166e065bdcaa7194f122e8d8aabe202027ef1
-:0166f0efa738866ac45a849515ac14f692791d
-:016700a9ab6e920e31f147ddac0dcd36db5144
-:0167107c69cd07456796b14a27f006b80c3855
-:016720e0dc5330ecb73885a2e0eb3a8d2d5d66
-:0167303477c9b645137d4d48314954e894aea7
-:016740c5278be118df2489fab9387375b3d4e4
-:016750f4622327cdf8262ce29e0526f0d0ec78
-:016760bd43fc61a13ce677c3888702d00d2eef
-:016770ebcc652619be9c2328213f2fa62d2f51
-:016780f48989bc7a040f09a3b4aebfef0816fd
-:016790d50c7b508300444692929296fe7de0d0
-:0167a07edd11a3caa1f74ec0077bfaa33a0087
-:0167b036ab9ebba34db21caf16874410474d93
-:0167c0e6b020347e6900a6ba7c3dddaa2c118b
-:0167d06a0c6d184699dcd6fc9b293663e830a2
-:0167e0c6bb33c3eb087f313047d4c34a58395c
-:0167f06d2582afa173147c4ca7dc6bb75450e7
-:016800b43ae6c220aaebb6f0a81afc1ce3ccd9
-:0168107572f0ff1bb96e111f2afb5fb57c6d49
-:016820b2eb51cd6e2b32e495465407197c2e9a
-:016830eca20570efd681e244495417763a5453
-:016840120ee60fd619cbd510b249240fb11dd6
-:016850aa6cb55a1bf5c78cee90b5668baac944
-:016860c392d0bc5ea3d6c7e22395ef8988817d
-:016870dcd6e03725ff0fe8c731ae7f2f440d33
-:01688073102194a2c54d97e7bd0c9749b1a17f
-:0168904de839ae89c9bf4d411819c448472dfc
-:0168a0bdc5904f51bcfef19c358c8450a60174
-:0168b022e40ac93d76ac8f668d3332feb17bfa
-:0168c02bfa37078f2fbdccd900f8bd812cfc2e
-:0168d0d2cbbdde15024a1083ba7023a5343b36
-:0168e01960d644c7fe166aa4534db86eabb2f9
-:0168f06636267fedd91ead45c4750bf6e2558a
-:016900e052942983105f281d050c31db61a361
-:01691013598b376efff2b0fdb101d706a2c240
-:0169208ed29d53f3b3b4c0f576e935f2ee554e
-:016930eb99ddd5d11ac85deb32714f502538ce
-:016940495ead8233507546909f75e34e874968
-:016950cfc842f70ecc25fc721548448f55b24d
-:016960a29f4a525d3ba2c9beabf1b442ada9c9
-:01697092678b5cf99ddc5f0eac7a5825d9f145
-:016980514824c732b9faf0064a354b47e543d1
-:016990f2a25f4aa5772726881f350cf10a9083
-:0169a075cd4cc75fc6f9f5e788a4bda6683a63
-:0169b07a3acef3266b88c0fc7a3eeedf8f6f08
-:0169c0e386e01221dd37733c8cdf4b02e5a8df
-:0169d0f1813c8c5d1b5af61ddd8d45ecfb6502
-:0169e016b640f8b07ff9411135622b91946801
-:0169f028aa548ad9b8ad7f440135a65c3be389
-:016a00e351d5e41db21a285e46e955771c8e76
-:016a100f9cfda652523fb449f87c1ebc36439d
-:016a20025ffc27837b2ef41498d3a8bf6c0c60
-:016a30f82be60e0ab1065f25d7caff93a9a214
-:016a409d0f9e89ed0fd491871691f79688b228
-:016a5049103bfee7208246a06eff42825ed97c
-:016a60bb26298c9c3ff59b785233916b859571
-:016a709d16bfcef227d93756f6f2c3a315aa4b
-:016a80a0be0da9c07a9e6b53b9415b87f06af3
-:016a9084a23bae7b566ec1810cd31941617fe7
-:016aa0e45c0b5c1c474bd53435a2654c2f2796
-:016ab0feb722d13038bbedcbfe718eccd4ece1
-:016ac094b9f785b0b5a6721c4ed23c2e191193
-:016ad0dda9081eb9d36ccc99a143686c8d4411
-:016ae001ecd8a4241511abd434fc74f1e40c4e
-:016af05f4cb97da32d1f49c4d751ba18d58e0c
-:016b00a47ec249972cef4fce421e62b9c3c2f4
-:016b1090ee42b92a18d49aaba3749916ad85c1
-:016b20f75f3085d72ddd9a51a12223fdc1708c
-:016b30360329c637f4a90d517580c97ad8f133
-:016b40289a4d53991cc1dd8f29061f6829559c
-:016b5060ad0bfc7ed220cb1aca6c337c767f01
-:016b60ab38bcf74b7c3032e107bf18d4ff6183
-:016b7078edce91d092c25ef14cf6a73431e608
-:016b80935768cae1bd9cd5719759af5fd85edf
-:016b9093e69c7fc82b6270236b8877b83caa24
-:016ba0eab0edfe2ee5b6da05ed55a7278abe73
-:016bb0561786eaeb420f270612ebbf7bb953f8
-:016bc046e9382513508c2511873d82385950ea
-:016bd07e15c616f6bdd57afc411ea1ecf5920b
-:016be0771dc5e2b82286521db6e84b3850e8fb
-:016bf014e7b3da6904e981ca3b615c088fa87f
-:016c00abc689fdd23fe394b31b7f1291996274
-:016c10e171fad29ccab8fad53185d8ca914bb7
-:016c2081474bf8ff0e745d1d9639bd6dcbe744
-:016c30807dd50ec5d53842dab1286ee43ac7f1
-:016c40e1cff7103d5e86210f90fd6b7c48cfea
-:016c5040be33e30166388e990551241063b643
-:016c603b3ced9b9c56a38ddba8fd3020a82b63
-:016c7054826aff71b8e9524021455b9e18b571
-:016c80ffd2c74c5a29bdd8f9c9500a7a23c83b
-:016c90766f245ec5967e21a29c4d855de03a27
-:016ca06c3980d10052cf8eacaf5e5393c233e5
-:016cb054d70e3c49ca60e9f64a5611194c468c
-:016cc073a92b634a8233c20ec5307ffa5ce3ca
-:016cd0e0b579af81ee51f7feafb2ec7e7f7cfa
-:016ce077997ae3f35643d96be9862f1a3e953b
-:016cf053ceb91181f44a12475d4a95756385d3
-:016d00a190e27069004833955229b74a7873ce
-:016d100eabc924fad1b94cdea467bcf387a5b0
-:016d200d5f51a64410a8c27975c86a5ed85b15
-:016d307635e0324b7521183d35687e63ea9aa0
-:016d4098cd840887434ea15d8df6d519f75a31
-:016d5092a60c7ffa9e6197c9d56fd0926503ae
-:016d60ebbce3723dc24ca772f181ccd3687ecf
-:016d70f07e1e698962460dffb6a08e4fafb14a
-:016d80beefe67f6cfe7fb7cbd781afbbf518cc
-:016d90d5d15c0cd01401ef9cf9dd202048009d
-:016da01b5deadd3227550a7b623ea5ed514526
-:016db0254f5b799ea5d4e9b8834f2b37f15027
-:016dc00c41b340746cf714c6a33276d84fc373
-:016dd04eb65b1b0eed7b24f69544077084ab48
-:016de00274abe016ce83480c552ab08a4f1d08
-:016df0e202eb2e1217c7e652b0162c4c2a6ee2
-:016e009cf3a781a7d10eba86dccc529e003ffd
-:016e108340650343746acbc16759822845f5d4
-:016e204631f37cf0ad9aec4217fddc8970e177
-:016e306e150c707b1ff447ff28a00da2e9efcf
-:016e40cb897456e0daff84b8105e87c4747258
-:016e5016cb4c4bc5e5c7280ba344c33b95290e
-:016e606d9832a833407254dbfb82b476256a93
-:016e70f994252e9913295181b48d283d2c7aa2
-:016e803552f174318ea41b6cdb84ab63cc663f
-:016e904a59afc15c08d5449f2956a168c81945
-:016ea07d0b6e29a985da9b38ccade1e1994e2f
-:016eb07ce8b0b531d2c9eeffd5a1c410c55b7c
-:016ec0423de6a9ee38091143eb16bb1c1fccf2
-:016ed0604919905df3911f8efa3942299f016b
-:016ee080a023c793aef91ddba5df56d959fb33
-:016ef0b653bf1faf53bb902676f562625f2cba
-:016f00ce86a07be19386e9923b9d9b903be3dd
-:016f10f6c33cf2173d1e29983c0458fd60d14e
-:016f2033d5789888b1f0d4ff02fb6a146a3e6d
-:016f304b4774805d23542b38887ee79cc4a542
-:016f4063c6cab738cda9ea36a060e10146e628
-:016f5097e94645712f2aaeba8655e81d66a6a4
-:016f6094f314b856f8e9d030bf2b8ae5390586
-:016f7037c0b278ecb7cb9c11daf2a0d1288dc2
-:016f80f30a26ca6eeed07d8a24daaa16a803c7
-:016f9088faa5e477c9122468acbefe352e59d7
-:016fa0f8fd87998185bcc9864b4a50fc5b76a9
-:016fb0703423291088d1a94a1f15a1a69a2b2f
-:016fc00b01ff1e937862a182581510c9563df1
-:016fd04e3f664669b091dfdb1ec90ca834bd57
-:016fe04ba5679b20a11a4deae28e516e62db91
-:016ff07eee6a2a1ce749f41dce3d041af918b8
-:017000e30de86342bda79faa2c08ecef66a794
-:017010868ef76ab2de3adb128eed51ae687348
-:01702043f7094bbcb029b02f707c86fea7422a
-:017030ab2de37e888e208849c27fece33ac0f1
-:017040f782c83e553f496c3f4fe0f8d808dae6
-:0170508df7dd99dc49102306245e3be63131ec
-:0170606ff3751cc39ef414d27817f8885f28f6
-:0170708e5e94e4a3a0e5819a066974bb2573aa
-:01708036ee122a45445f2c7ca4a55f19243f9c
-:0170900fad64f89ec8d150126f61364efa826b
-:0170a014778d48f6088c59420725801c14067d
-:0170b0d71fe7b2787263c16e3aaa8cf01448d0
-:0170c063fa01c2305a69fe69121b7f1cfb2c79
-:0170d0f13d8fd74c5f9b39a3149229ad15c910
-:0170e00270e72829d1a83b7d8d1ebeba62062d
-:0170f08830a2f8c381810f08dc0175d9416e98
-:01710089aad664516264be5a7f15bb1aac4219
-:017110d3f3e21d15412cdbf898cf73da97d929
-:0171206ec7308486c18ba52b9a2a82beb2e491
-:017130c53e343bd3fe992fc8864be36aaca002
-:017140ab0fc6729cb2f5d44f74e88aa4988fea
-:0171509b7cb601af22d9e74e01da0e01036016
-:01716019d11421f82839675afde5fa7fa41512
-:017170ee55efae42935bf23919ee93842f2a8d
-:01718067b853741ec02ec4c25308cbea6c0e9d
-:01719050e61e1c714481b24530a4f0447e3dc5
-:0171a0a3a0da2ad578b33dcd75aad859490bc3
-:0171b08720165ff5df77aa1f3a91c8f1d069e7
-:0171c07f59bafd81efe9375434002defb61904
-:0171d07a3673c8007bf546ab068bff8741b2a6
-:0171e03d18195e23263d8b3b757a2d56b22063
-:0171f0ee742eec808e071ebbf124cc8c3fb6c4
-:0172003a16dc8f70a07817d74b5d5285df5c0a
-:017210c0016395a0f8e3efd53f342443869e4c
-:017220961bd76168b1724f7d846919bfcbc584
-:017230b6a21f5c699733a40faf441616d132b8
-:01724045c804a44cc8b49607bb86abf69058a3
-:017250a99f39dea0dc59613277113ffab80343
-:017260b85b24c02c42649203b639f43d85137e
-:01727025410be4ecb32aedfa17ec9cd308da78
-:017280bb2e86d41077fd3e2ec3e730ee727272
-:017290bbd1386ded37a4a9299589f78f207998
-:0172a011596c96d611ba32032352745d70c8dd
-:0172b05ec04889ae549c6c1e768d646728f460
-:0172c00d3999ec20aadba1db3c6eed78711472
-:0172d089ae2ae832324b1c6e06949da424f047
-:0172e0e3d6b346ad4cf5cab0119b10d9c3b135
-:0172f0922fb22a5a47366e3f91bc54eee16921
-:0173005b75cf9d180e447c5c0598cdc7a43c49
-:01731069dfc26b67d1ed263b23c73c7c704b14
-:01732032e49a06adf5aecd984f8b49bedc6d78
-:017330065cb99edb40a54e9a3a0c11c0b1e0fa
-:017340e8df61e592731049ff665f024a8f6dde
-:0173508e1a50f76214ab9c6513ae0e6cff62b5
-:017360347b35d2e20588039b4822807be22c6a
-:017370ae00ffc2f87699eabff1309cb15acca9
-:01738034bff359a0f90fe86305ed0f8e1624ae
-:017390fa788504a9fba07d3b21b3a14da90523
-:0173a0a8cd543eb9f3cc9449a01c953908766b
-:0173b0b304462b7b930d74987b51b87e84e66e
-:0173c0b0a3caa763c0a0b230fc54bbbc2a8a6b
-:0173d0dd1adc52367a847279bbe20b0cb16f93
-:0173e0883501f4f13042f4956e1c24ddd701de
-:0173f0cbe50447a2e29edaf9729ba241c3bb47
-:017400702da5a500f3c4fd07db0162c8619ebd
-:01741018ef0ccd26578e9321740e3f6e54111e
-:0174200e38ef2853a68d6f84990f70b828d194
-:017430893ab6224d7a7cca4fb667d92c07ba47
-:0174406853246b68417b556e2d8644aba86e00
-:017450dc060f2c0aef262f637ee5e3dc217efb
-:017460bb3e09d2217c3376ed0922027d7bfe89
-:01747005218299788cd3f962d9e9f6d11cea86
-:017480b93973294bfe43ebfae408ccfceacf21
-:0174906d2b4b3dadf52c2eabe32a6b5fc6657c
-:0174a057fef55a4ce7b36d43143e4806a21cc8
-:0174b098b3c2fa43e7e79cdd18d41ca6c332ef
-:0174c02505d51f94979cde967256a08f049a21
-:0174d04b4d5695239fb310bc3b5db20808adc0
-:0174e0951681282cced861971c65c5dae350ad
-:0174f0e0b3cf3c2d3b9a81e995af7cc938d0f9
-:017500e1283c2dcd7b95b25f9f27f6a61f8594
-:01751088458773c65f7eecef21fc782a650723
-:0175207f656d5cc1c19a37eabcdc0ac300ad55
-:01753014fc8e46f3368277977424310b95ba1f
-:017540fa06bb43989f6ca09cf8ff565f618274
-:017550da9c179bcab2d5ef1466f2c89f1828e5
-:01756012a06fd3af3659760c4ceedcb7eddb74
-:0175705dcd73266e4bd116a9ea11d9babfcf61
-:0175804a939378a0d501643410a64eea3b39ed
-:017590265013b002c1e3bfae3e4771a2620b62
-:0175a04afd2377da6e51adb2ed7b2cbb08b130
-:0175b0826a14c7972c268844ba962e8b1fe11d
-:0175c099f306bd0c43874b6251c45927f18375
-:0175d04abca42a743e386915abd7ed68912cf8
-:0175e0548404eba4b27601957ab2a9a1b489f3
-:0175f0af54b99f3efde16e6e1b7365d6abbc3f
-:01760047767639ed2eb965f60db7cbc584dd99
-:017610214b1be60ce68c3b7cbfc85e8388c56e
-:017620e0121439ae493632f8692db8a153f70b
-:01763031b2a760a36b8edff991c7aa893e9285
-:017640486ae932aa8cea25222b4ffdd3198cac
-:01765083d1faf6fedb9f25e0ecdfef6c863ca9
-:0176605be5ffffb6898b72066b7908e5083401
-:017670fef08a419799276ca4794a2b9fa3f9fd
-:0176809b4603842206be4ef420121b093f8491
-:0176907e53b3a52b222a0d1e53bc48c0a0da1a
-:0176a0bc02a0c1ddc0fb4e19e87a1f785392a3
-:0176b0f8caab27b17a338f1c409f8e25a5d6e7
-:0176c022cffa3b281d900b4e17b176e9df4cce
-:0176d0c6f49394ea232889f9aac7b7fef03870
-:0176e01530d46bc997b5f408cac12e127d9292
-:0176f08d25c8b59a50d16e1ea757dfbff055e9
-:017700f7f4e460939f300ffafc31b2f54e8542
-:0177103c6ef6db678218456b5268e2709a663f
-:017720e4ddca597ede3880157d78df819b8594
-:017730d74f096f2cc108b9d0c0552b8538c430
-:017740d8e96f6489b1a22178b48026116672dd
-:01775081e9e7185b55d9117f870012646eb882
-:0177608300a5ddf28bfa49a10eea7e99f86ca9
-:01777011ab5939c1f4ea09b3669307927f8497
-:0177801d6d1b2f99346503f63f0d4d6c859694
-:017790adba14f7d1fd0af7d14ce183d4e9ffe3
-:0177a0440506967c62444e7631c6261c7cc39c
-:0177b0f525c2011c32cee0362ec143611fce1e
-:0177c09aace5f64033044ca8641fe8e62fb8c9
-:0177d04aabc361601a0400911f5162b6576e4e
-:0177e0d7b422669416cbec058114650b83f04b
-:0177f05a031cb56f4f3b2bbc7e676eae25c76f
-:0178009c21a0a94b24b871db2fae1f3bead81c
-:017810b067d41c6d540790f262229660b0b7d1
-:0178201ca866d2896fd722aaf0bbc71db4e69c
-:017830c0ff67028f34933316ffad0035081537
-:017840f8d91e18ee0d6a8a69f60fa3bd9a59b3
-:017850d51e5613bda8e13638ad321d99e05be0
-:017860c2dc0ffe1e01ff7a02cbcd350c09452e
-:017870e2fdc5165897a2d2d2e6965159e82378
-:0178801d4c28bd21f4e4856dd1001ade536179
-:017890a80340c16a4615916d10e4acd5f70e14
-:0178a0d349c40ac730a01e5029fae30515f64b
-:0178b0b1e58eb5ebffb659920016b1f3968eaa
-:0178c0ade952a3c53829fe277addd8a866930f
-:0178d0683ce9b56d222e1b31e856e8219906cc
-:0178e0a8c15d181bd2722f8c4993bfd1de4c86
-:0178f0587743c068fc570b5b449838b6b38a85
-:017900eafe0d1cf4f7dc90cb640a95fa171c6b
-:017910d555da5b2fdad2c50502d5849e165527
-:01792061334e2de8f3083574081905e769c50f
-:01793088b80c5ce974f257abff9b5dbd48115b
-:017940a6ba3d13ac39bfa340fc20e699f56086
-:0179506fca719a677a8130d99c72eb19d44ce3
-:017960bedc53ad5d756f8ba27b925621526842
-:0179706c2f854f6f828416afd6c5073af19ea5
-:017980cb153002dd09ecc2812303ff1c2316a6
-:017990a9adf960f95d2c63dd923847c20894f5
-:0179a041caf7197e8e3fbba9363d67fba6dba4
-:0179b0a9c18ef5bbb4d25027b3af5c4880d3f1
-:0179c0fbea3b97d62aa4550d8080a2f0ae66d1
-:0179d00898f441e95c96d4aa305b7eeded984b
-:0179e04c05a87ad1216f0fc1c0128dcabe8d9f
-:0179f05df223fbf86ab2cbfb070497dde26c34
-:017a00e4dea594fd1f6d26554635e01eb15666
-:017a104b38cca2286d4a4534ef155d7a88efa9
-:017a206c806d802732f55f191ae12f437a5e2a
-:017a30d8a6106691eabd65e84867c09198117e
-:017a40c6c737107b7c335a6af318d9dae6e567
-:017a501d4c6444b8e5566f0f548904e01fc023
-:017a600b8cc1f64681b64f1d40f5727fd42375
-:017a704a9decb5e7c912cd5bfb670cf9665f0c
-:017a809d9ffd03f83e622d509bd6adc91d8456
-:017a90e1ce01318a79742a75043f2caec3e270
-:017aa0b8acaf2dc48c456fd4368b2d8814ff08
-:017ab0cdf8fe1ce29610a0caacf821f774e219
-:017ac0b256fd3c02893499c8553ffb99850c80
-:017ad03d715d0bdc35a16c14ae0e70c465b46e
-:017ae097808d294af2233e431fb08c220142c5
-:017af06d4dea6c90d980124b256cc83abb6df2
-:017b001e07a19eba75c8abd1c2eab82e32eba2
-:017b1086bb2ee6bebb1421cac9df0033f96c89
-:017b20727c9b428ed6df31694f06996a4bb6af
-:017b301958bc64041713d015f6275e66cdec45
-:017b4075ad4fb142c2a677503d370284b0f09f
-:017b50dec57af3a2cdf49c24ee44b32a26e0bf
-:017b60e28c9ce4a89a008dc7e40eb8cfaf5c19
-:017b708b4a2d14d48d6d00bfe58aeb62d15a77
-:017b80fe5ad1449f5d29ab317b75c0d450e8e1
-:017b9005e811bd3e02ccddc0a088e3987f2189
-:017ba05ce7a79a41d680198d06565862e5dfb1
-:017bb01658448126cd8bcbede93e306f33c25f
-:017bc0560cc40b410275a73485e2471660ecb5
-:017bd071121b05df2ff358082b7dbb4551f331
-:017be0f9c049dc81f450d7b1793a1276eba442
-:017bf0c2d8c30a2c619efb5b6c75b79b796968
-:017c00099d2d002add388bb684c0e773090187
-:017c1027051cb7a8ae01e345ed384c6d40e6a0
-:017c202f36d80676b468fcdf72cd4cb03e2826
-:017c3054374a6296aa6b1517822b9ed30e278a
-:017c40c52b553a71de02bbfbccdb0b06f0b8eb
-:017c50eed578c25d15fb4faa87f1d1e79b4e7e
-:017c602081104ae6858632d5ee6710d8e26b4b
-:017c70a2723cd2a1f0556f359bf19d5e15bdcf
-:017c80763cf6a180bdfc2c806af839a1f46519
-:017c90b6aa34d84911a6ff6155512e22ef8418
-:017ca096dd9d11839fbeb1b81e3fc3946fa5ac
-:017cb0d67c53ce844f35519feeaefb5d08e6ce
-:017cc0ddc0d57779817eceefd60f7656835de6
-:017cd04d085a61601ccfedb3e0f77a5b07b8d9
-:017ce056ca10f297d5957d67f210c78a8d89b2
-:017cf09b5340b7e280e7fc13383e47360b315c
-:017d00b93b0657fd3205e96bdc70e07b8fb060
-:017d10452d75ab16bf608128a7e960c5025a9d
-:017d20d3d27e25617d1a5102cabea6b44b4fb8
-:017d301f988beba3b489cf9cc6c5656339f9fc
-:017d400ad3b2f7cadf35d910fd40e4040f2cbe
-:017d5089a5408852a6e6df3ba00ede2eb96ccb
-:017d6034f41721a80fe7cc822e8da832965d3a
-:017d70bf80f419cb9aeb3e5dddc4b09e06220c
-:017d80857d901554645fd00255623697ee0124
-:017d90507880ca2bcfb7f487205f2592152638
-:017da07e01b3ae5c657e583b7623f9b99c1b3f
-:017db08acc877c6cb7b65b15027b2513d127c7
-:017dc0d244081975891178d31d022cb012c689
-:017dd0beec7698ddf053c11eb3786910ada694
-:017de0f6d920f8cacdaab2f81fea5fa7c0a822
-:017df0e8be2be17dbbf13cd9261d8ca1e02e68
-:017e001cc14fd9c816c3a7f9ae5c617e464e98
-:017e10cb593ae6fcabfafbfaaa30f9b48fc549
-:017e201220ddac82e9e72f1708dc468dbcf017
-:017e3088a31031561e9f121a125d2edba8575e
-:017e40e3ae32080192210c37d193a8460ed3cc
-:017e503bfa4fcfed423c6d160cae81ec63ac0d
-:017e60f3629254010ecbda88c1293a3fdb858a
-:017e709b240816a73073476ed167e28005268d
-:017e80fdccde51c3a9d721437b84ad3d6567d8
-:017e909851e6f2c1383be82d794bdb8a9ffa93
-:017ea08553c8048df7fc0a8e632e590d10604d
-:017eb0bf0cfc30603efb091f329703cdeacfbc
-:017ec08d2e246fb1a14e90d27087927a4e9102
-:017ed0f70857af73a53e396b30327b71f353f8
-:017ee0dbdb77e2a358e38ff27ec7647b779e89
-:017ef01382b99f76c8089901be43d3d7390793
-:017f0002bfec0b089ac344c9c737ed7f1d40a8
-:017f10a2e3dd24a57eab6ef0728f8000a36549
-:017f2016eece0ca1f8024f2c4a6c9d76bb50b8
-:017f30b951e7a6cb7c4497379b2ff9f5baea0a
-:017f40a864df25732d5a8c5ad26113dd6248e9
-:017f50ca395351fd7218afbfd48b40ddf87e58
-:017f6072673f3645e103b3650aa05b3a1cec6a
-:017f70a22519c59624f18cfdbbe59c57ea9a7a
-:017f8049c955ac30d41a259fe16292c1e609b9
-:017f9029f3c34caeea658ea29d5d70a2113901
-:017fa0eb3214fdab04b5c891f76979ab88aa56
-:017fb0ea762bc24e49b44c3afa85c67f29524e
-:017fc0b6e7e3a83bdbf41263c4d22c958d5140
-:017fd0c8a71fe51630831f7be07df478eafc6d
-:017fe094461b75665a0d90869f2d6754ba20a8
-:017ff0e9cc40f8d3c0fc9ede030528f8520d31
-:0180009c75e59e90c98b0b874b62ebc68f5f50
-:018010a4554c7e0c01cf2cc1c139b956cb14f0
-:01802021b2b4ac7f66c99d11ea40ab359321e9
-:018030fff48d60395fe88733c1411ef0d0021b
-:0180401ce114e138a263348d46b543704af8bf
-:0180501b002176d6dff13e932c02fa10710f00
-:0180606c4531428cbc70c749da11b47311b9fd
-:018070cbee79fffc7dc9e598fffcacf149c9e8
-:01808062a3e0d7ca3636281d4a9845387c69b3
-:018090a0d8ab2e5a7bcc37a7bb95dfbf5e6782
-:0180a04a0acf005569d4d83554851e45b3214c
-:0180b000d1418822212317f214d444d7e93d15
-:0180c0c413b5cc3bc3189936d71b0ce1b99e23
-:0180d0384801dedfe152c137c36474476d91b4
-:0180e0289ed771adfc180a0b8d7dbe69dbab1e
-:0180f0adefa4dfe81a284fd27151f58d2656e3
-:01810083ddeee8265c930a537db70ca1ba8e8b
-:0181105669d364365c15f1e6cf41cc285eb7d0
-:018120ba101834436a721ff4a1755d2c02adc4
-:01813053b61a3524ce726129b011a3084fb9cc
-:018140086286db57b33c79c622ea739aef6c5d
-:01815013b475a97b98ed61848de886c9a6a0bd
-:0181605dce37a9e45ddf489395ed40171224ea
-:0181703305114dc8a4fa9b7ce41a2d946f9298
-:018180dc557d370848dea7b3ec1aa060a902cd
-:018190b5c4c733d4cce84378b12c6e2e525485
-:0181a020b6ff0cf60c7ea19e63119fa05975a6
-:0181b0b8d7f8841de64da5c6875c243ea17ef5
-:0181c0a93d0776f4b9d0a8c89749f2d0034709
-:0181d0fc8659e2cd8157c89e09ed80d8382a49
-:0181e024ba6e713606f05b15fed104d7c8d9c4
-:0181f023355f825db1a8c6dd97b88b91594cc4
-:018200b352df4e1e30642018f567c92ceabafc
-:018210f5e8bd9a6888ad7ed4433125ea21943a
-:018220febe58d1f11b09ae8a9e9062d5146bd9
-:0182300d8fd23f9a1973f0ba9ea66a0ef08f47
-:018240dbf074a4b52bb01f9fad9e7ad2c420ad
-:01825097d5260e7b264ee0ee61c01bd11a67f0
-:0182600a9bba14b6e11d6a20f8b479a5371e39
-:0182704f6774a881157921f8ecf3ca737eccea
-:0182804f23ec3e9a1333b5c3eb9cc17a9c5b69
-:018290ecf2825965c80818478aad708c5b559a
-:0182a0a3db8a8dbbfcb66e8d364d6b841c632d
-:0182b08aeee9d902439a2ee97b6db056739469
-:0182c0ed6ea64ced880045a1a967f6c7bd72bd
-:0182d04e1d90560f5cab383a32f38351cf1d0f
-:0182e0fff1d5ea7812087c4fa59e4648fdeeda
-:0182f03cc2854dc0faffc9a29f13f35a106685
-:01830000a498b9c288a947b206739b13b58429
-:01831096d1d09799f1896161e04adaffadf808
-:0183203c8ca8cfa481d6c9b0d8703671a16237
-:0183309b2229fe692b41f6b27418f41225c4ab
-:018340bb538a523f5a80af3ad1a0b3beaf2ed5
-:018350746382ca6c759be8a65b7db99bb9cb1e
-:01836057334b28469dcb128abb413ccf6047ea
-:0183707866c3ff88c5da9242b9df45bf9441e1
-:018380caa2d60cef3af0116c5052347fdcc0dd
-:0183909e5068f6b39dfafef97973ecf3ae3c07
-:0183a055e626c8bebfdd503cbff10e9c114666
-:0183b0d8583354d80f17671dc3736050a50f28
-:0183c00019ca734fcf06ffda581bdfa4894f93
-:0183d086b73fdd3f3a7ea9302ffe4a79ae215d
-:0183e02c85d10add4ed914d16d340b9d7db5a8
-:0183f0648a6acc423ce5b25cd194c895196d12
-:018400b9b1e4d88b955ac40b981ba06ddef862
-:018410f8e3e0db842e22f4484267ee4a161ed2
-:018420603c621a95b9f1f59cbd429f464196ff
-:018430733762360ca738bbf51b473f200e386c
-:018440926a84aec1c3686f77048727fc2e3689
-:018450a1b73faa86c85eb9c4c2c559ae31b8b9
-:01846084795edbbef57367610761bfd0eda2d3
-:018470bdc393573bd55a618b1410d96f9fd962
-:0184805297a02304dea855bbc296c6a1e7df04
-:018490d820aa7215446817ef38211cba79d80e
-:0184a09a486cc1c488f1b72609c411487a4d51
-:0184b07007166e3293d6bcd6b881fa568c362b
-:0184c036a113dc484d4d5b8a5a52bd00615cac
-:0184d0d65af71fb5df832a0bbbd3cb02fa8a74
-:0184e0e5c39a7a410b88ef14e906ec4525505d
-:0184f02dfb795c3c511566bbcf496971bcbcea
-:01850058c9a9fc59e3ce9c883d0429cfcbce94
-:01851096f9a85203629d1e699f9a439c2c90fa
-:018520ba86c4a10da2b13a02e318e2452162ce
-:018530dbf50a55a9a3fba531c3f4138d800a3d
-:018540981627e1036213514e96302249a3f41b
-:01855012f3a37f18e742f22c6c617da39553cb
-:018560316f522cc9cec1f264fe1ad927446512
-:018570dbaebb63adebeba43439896414e7b77b
-:018580a2c3721a3d593972c229a74b983ca212
-:0185905c5a688b8552c6823fd8afe96873b277
-:0185a01a6fd2a3ee7d36198009be9fc765ec0d
-:0185b09c30a903b9ed437a45772243fb4fff44
-:0185c09609d23c34a08d2aa28a5e6c03e7e2e3
-:0185d09c2079daecdc9a5a64310e5e54788fcc
-:0185e0b0f298dad36d9c4b2e4ad225e49db8fe
-:0185f0564a5363b0b04298667e1fe4518771e4
-:018600b7fd6919fbb5a30209df20bc6dd8c20f
-:01861015fa3b961deeb2c216de65fc34a3b2fd
-:0186203907b364390e3769a50d0ce556f66fa3
-:018630a74e835da4b078a7b7045635b3cb0af4
-:018640e00a15e79be5a9a3408d2bc1f1fc7fb9
-:018650df53d3ace62f6ddae4823aaaf9ddb7e5
-:018660a4e5ad353d6c3bdda4e7a2173f0b6c33
-:018670004e9f545feef28ac042a08327b2df0f
-:0186803458fdecaece8a3d5213c37fcd02da7f
-:018690039786fe52c7b954b4fccd4ef871ec32
-:0186a0dd07b7102b03c3b7d0f63b4d2629f3bd
-:0186b0a953601f706d6eac04c895efcb350a24
-:0186c09bd3bcab66e307d5a4802c52352430bd
-:0186d06a8ad5e88104f57c4d459e39b2e83fc6
-:0186e007864e3feb534c1ad5a9789f8ab8ea2b
-:0186f0ecffe8320ae66c397621d306200e5ac2
-:018700d3d8cd41921878c756774c69cb9d05b9
-:0187108efc10720ed45c87cf7147da2d72489d
-:018720ed97798c1e69ef99eab5055a10e84897
-:01873057b63ddb868ba1be929d2b2596aa04c7
-:01874015da0f6f6996113f8b654cae126c0f3a
-:018750a00517fdef3f621bd07862ae8f169325
-:0187602c606544cbad0d32895767c6f3d0a042
-:0187708ec2cec606d59662cd9822f6b1db307a
-:018780cde873c56bec969a3ac6a5ed08f2f682
-:0187909f64e521b454dd7bb3e2ac85cb0bdffb
-:0187a0f5218d275d65336775530452c79314c8
-:0187b0760426a720bc038495309f6d80f24786
-:0187c068ee5dcfbecc0cbe0c6b9ccba4c5cfa3
-:0187d0580ba80d469fb6292c6820e0671b65e5
-:0187e01b3811da39a74034cd4c907a0aabd525
-:0187f0e0e3868132681d6073af9c2bb6d0cd63
-:018800d28403a9a4086de447929ef15940a94f
-:018810d97691042d93f075c057eb35abe3da8f
-:01882053232ab13dffbd6ac67a57dce04d8275
-:0188305a7f3c2018bdc4475c82fe17a6b5e2c0
-:018840f179067bde17ea5f4b674e03da796e51
-:0188504caa376db4b5afee5a18fedbb7465231
-:0188603cbe2c5c25d2fe430d9c68b6d8910bbf
-:018870c64f79b435155fda0575c65209aa7c82
-:0188805ecf92f40fef20186cd211c06b07eb14
-:0188901c54aa39ed2a85a61c4fd0cef6b35bb4
-:0188a09874ed46ad3febc4fb9bc5c1c816ba46
-:0188b0d8c6c0d47628a0d7e3461f3eee4e66f2
-:0188c05134d18eb08af5aa4971fd1d8654501b
-:0188d05aee93330f40b5744937f5177fed9bd8
-:0188e0d13b1494d1554e2df61c3ba847c42a33
-:0188f03ee763dab7e7ce68749e4edd7e23826d
-:01890091b823b5c5d3fdd0533875c3efd10dd8
-:018910e2e3d985f4e59f5ffdc0133c6a5c5b8d
-:018920dd87ae8614cfaf4a990ee2e95933316c
-:0189309333d4fae75b585de87d527fbe0e5e1d
-:018940186f5e50fded8ca5e5ffdf87c50715ca
-:0189507b885b10363c93e1e42ffa5af5b7a265
-:0189600e25134e4fd2deb0fb3a260b2de2d458
-:018970824fcfcfb64a76f7cdf8d23e57f47fa0
-:018980266e2777b1432ccbb3713c113ebc22c4
-:018990910a5998e1aff03acf279cbb9f00ef77
-:0189a06f3a4841c179daa81d38566a61ea4ccf
-:0189b03789fbce48fdcc5561aa805568a1eb5b
-:0189c06e2ca1dedf0e1a8dedb35ea1a6c552be
-:0189d0e3523df0f34f6fa65a258d0b50d929d9
-:0189e04b2b6da1d13009e58e7e51e89ed06a6a
-:0189f0ccaeaaa24b656c2fbc600e9a11198cfa
-:018a000f574b04c1e72cd14ee1ff11afc364fc
-:018a10ff540060d5d47fca91c5eec1dc5b2f33
-:018a2020151f70148db523b4758b25f76ead2b
-:018a308f2a5785c1a2bf4a86a0fdc0f0a0fcb2
-:018a40ced79c054cde925a3194f89b1bcf0993
-:018a5051bdac25a5034b6a002e3ec9d1812b06
-:018a60f0647c0cf1d317960f5c72449c8e8307
-:018a70457f98f9b8fd3f30c6f5b8abf84547f3
-:018a80b2d2a353932e0cec104ab4d784e82654
-:018a90597017f9418bf6fa5d15e0b4376b062d
-:018aa000ed2cf113cd0fa50c5daf016d0c2f6a
-:018ab015e35aac8660455b7a68c485c006ccc9
-:018ac01b5468208559bf7234bbaabc8991871b
-:018ad0f7e28a0bf10eee724d4a7f602ffdaf95
-:018ae0fb33c5faae82ae1f9c0278999c8dabac
-:018af06ad83eb9d18b7b48e6f91c84b8aa270c
-:018b00c4fb7c24d7895004132e6317a7eec1ab
-:018b10bdde93108098ecfe9e022da007ea091f
-:018b20864392b0be6b0fd4c9cfc611da8bfa67
-:018b30f83e52119924dccb2a16ce7398bfd77a
-:018b40fcce79b67c38777e368bf224accc7d2c
-:018b50ef57fbbd40ea39f5e48a806c53c5f589
-:018b601a5ce2d934892ba1b6e5cc972d7a6384
-:018b702d3774e07ed389f9a2af2509d472de7d
-:018b80086544bce9e415a995ec56a22cb1be1e
-:018b90d3260cf8bec5b22a73705aabda680c81
-:018ba03059cdb7844c83af7a6badadc6062c96
-:018bb0a5088800ef8429219b818ae0934b12f5
-:018bc0bc68c79a75563ea6591dcc89cf165a48
-:018bd0fc6ff50b6c5fc656897d20de987e9fb8
-:018be0d9e16d729a48ba5face637f7307840e7
-:018bf067a2e96c345cb147e8f1dbe0a0216a94
-:018c00a1dc02c5733d3fc489347d18145091ff
-:018c10af950a7b96c6aef7c45469343fc47d1d
-:018c20f9d365df15d5e397e76c45ac80562515
-:018c30d1f5a6d7291e509cdc5e212098d40c11
-:018c40355f3af250bc31e2e1679cc31852ce69
-:018c50ce077845f7633ffefc57407ee0d29339
-:018c60012782dff21613c9126c2893ae75500b
-:018c7089f2e01eb28a06d92dcaa3d7b13ca885
-:018c80732aeee7e83670854c747dc3f0baacf6
-:018c90e314b5b760254ff30df8481dfadd31c0
-:018ca06c0a8bb9e0d80e2b1844e2eac1b8eb5c
-:018cb0ca92deb9b6c88e5d00c8ce20a1b2e4aa
-:018cc0bec86639cf9b58e290ae883e44366054
-:018cd067d935bc9ed0ca1457fc3cdaa2e03ae1
-:018ce09b29829fb1728391e74d506794d20141
-:018cf01f1425b8eae86caf906d81b84e779503
-:018d007b9f7e6b0a4dda87cb8d82c4d1032f1c
-:018d107732e927e2d9bfc0c3699951d3ebd177
-:018d20ec723cd738ca8aafa9827dfd154bb5a7
-:018d301b72955ce2b6a2e55c989bc3e62635bc
-:018d40d82b8dea45637b4573c674d6499ad5bf
-:018d500594b378b820de71081ea38fdc9b0021
-:018d601558ce8e824efa1b29160d9c013ccd56
-:018d705ab3f7007d2c2fcd071c1b75e4072bee
-:018d80cda1c0bdae5e35d93679316e3b332d90
-:018d90184d75098423f70b58083f4c12f1720b
-:018da0c7cd9a8791658a1d04f6783014a87805
-:018db0cf5e1acda3d58a1b654ca49846617029
-:018dc0ab73bc91e06db5d37fcc159391c60a52
-:018dd01d786e5018ac7218599afceb6d9cc34a
-:018de0018a721bb9a3492f774db7c721710421
-:018df07c0246513ae8ab836324beca72d73fef
-:018e00e53641d5158adce731ef5875f4c68184
-:018e1022532bcad8678fdf18b39332cf32b4a1
-:018e20ca0ae01e4ed2f4ae53e33133f781fa34
-:018e3063f6e37527059a501678119cf8679dc9
-:018e4018d2da1ef4527181a5b454464eb87045
-:018e50cfe6ab7107fbdb59ba66379437d07dc6
-:018e6012e0949471447eaac1da0351cca19b50
-:018e70ec79c504360fa8adefd65e646634d279
-:018e806c18d66144e89d5d2c41b4554265d11b
-:018e909d9649e6f64bfa4db46a85edebcc9ebe
-:018ea0ec762ecd021553fb0ef4e216bae835c4
-:018eb00246c22f29bf5c00fe6fc111c6ff12c5
-:018ec02d9ea541222d79c9f5d2c5b1cef0ef37
-:018ed012fa421822daef85bc86e2faa5883570
-:018ee0e70dc931ee2bebdb076e142db515ecb1
-:018ef0d5383d9d32bbbce299cf48dc89659a2f
-:018f002c83217dac12e86b38e785ce964e418d
-:018f100d3da5773acd4aaa604e2c27d914ef10
-:018f209753698e59564235a05cafe3155608ef
-:018f30150caadda4f52e27e29425d922f292e1
-:018f408fd4a51c7dab361f31715d7e28cc9190
-:018f50afae7cfeb3680083cf158de7015508d4
-:018f60874b0f850eb529ae5a6d72072cbb6b0e
-:018f700874c10370f9f13a7217fa802acfe590
-:018f808ce8f50e42aa10d9c41b74a8e84037c3
-:018f90d27dcce927922a0693d95a078b541f82
-:018fa031fb9aa602083d9640818c9b47c73678
-:018fb0d3d9c085762ce5ef7aaf7ac47d6f29a3
-:018fc02aaf3930f3ac65676fa5d10a84b7d508
-:018fd0b049840c8382a0ab92cf5a1754d9a658
-:018fe0e183d19ba47c9b3af9db6534de10aec6
-:018ff0cfa95479692cb076a8aac36fb356f823
-:019000d9e45695625b79cc222344d078249197
-:019010620075cd73e1357e7381e386a7945819
-:0190206a76faec6ca5647863ab44f0357f28f7
-:01903066664565b9d9f71b7f2daf25c345fa28
-:019040dc19d571c36e0746d9395fa7c0fd060b
-:019050bef547e63198e27afcc778367262e712
-:019060c294ff6fedae919da0d227fd2e6937f4
-:019070072d51b13850e5929a625af1922c403d
-:019080671355272b28a3b1f95bed4271217ac2
-:01909032cde7c588872727c272adca6a9e1823
-:0190a06eb8ee9afb3a2a0ef47e0aadb4c0c4a8
-:0190b0e3814d8e723809b9516354c9885523ba
-:0190c0df68fb00eae9d481e3e4881c45614ba3
-:0190d02862dae63ceb299ca4267cbb34d5d96a
-:0190e07e756e8a9608d7fcc5d56b36f67d3f39
-:0190f0db02db87b531e9029246883a79c9aae9
-:0191000d932b8e80ecce49cc6153f836440d04
-:019110389c29d083b3fe5a1aafac2d6d31d4f5
-:01912098ed3fa823255c87de40a046a4276c8c
-:0191301d9599dc65ff9c247b9f094980a180f7
-:019140a666fc9c4ec878590a170b273ec892f1
-:01915031ace97d55298b41c7c559685f1512d0
-:0191604fb5f8bf5e610c483dccade7fe5636a4
-:019170d64b833b464e678108a36ccce2de6187
-:019180c394b12aafcc5609210e6fe3cfcbce84
-:019190c9ff74d98f2f1ff5f1244e5a57171d6b
-:0191a058882b59b0b0d05635b147c3aa56c8d8
-:0191b0da9cbf262ede0e2348b06e0a9e0a5f24
-:0191c07249c58be04290da58998e5d77a6eb5c
-:0191d074e7e24c8ad6df9f9a2e99560b0bf452
-:0191e037604f89da7ab1199f216c3c3f470694
-:0191f069e9734bdf7516b38e1686f5878dfb19
-:019200adb862baef3173763ade8342a1175490
-:019210558f2b347d63875616536bf1b4cc73f5
-:019220bf71b434093e82c16fa8a820f8ec6557
-:019230e78086fb5b30b031b9eb9c9137e985cc
-:019240fd0ca6cea3345fcd2ef5c69be59bb7ee
-:019250bf6565c6d558703be33451ed362b33a8
-:019260086146708ed6ac63f5d1fad8888ebd81
-:0192709b68a347ff9f4ac3a6c9b7d6cecdfdd4
-:0192806a313239395dd76114662c5e8850139c
-:019290b98e001bd08f057a9bd02fdec80b060e
-:0192a058cad57abcb97374195e36fe6ee228a4
-:0192b08582917f879a675c94894daf0de95407
-:0192c0cf539968260de683317662c11b1d68c7
-:0192d0c8c9a4ee367d6d42c0d0a960ff232592
-:0192e0a3bf8d585b01c95aa0b1d8c8f62ed653
-:0192f0c40c9e874cb20af5cae0264b35d4e49c
-:01930079cacff67146831f3ace7dcf2e11285a
-:01931023a9247ac000c455533d582ee1828122
-:019320b4f9d6112156b922f2528462df06f75d
-:019330caec53fbee9403b3fb2841cc32a0a325
-:0193404577f102542d36b3c14e9b7e304679ee
-:0193500ca1e59a568f24be8ec7500acd17bcb6
-:0193600126e93d1c2af87aee7b951a211fcc9e
-:019370cb904e1a99c68a70b14ece67853c4e32
-:019380601ae24ed74f2ccc6f81f24b9985cf8c
-:019390360202cfd099d1f7c364eaefd5df6e11
-:0193a0e242b6dca26908b75ad484fdcef9a2db
-:0193b06d962f2730d0ddb939e84f2ce7975658
-:0193c0ab91d7a239cb0fbedbe217b95a526ab7
-:0193d0ae62d8600e1f37e39841b79c6fc9a7f5
-:0193e0d97b8f6a98c66c527e3c9ed4297f52fc
-:0193f0d4d478eb9609674502593b133ddfffc1
-:019400c0afc58340260a5fa55ebfda4eaea7a1
-:0194105eb43722a1d9eceb1db4221e2fb1ced1
-:019420c91d56f3ffba5f882de7b1d6b4c66ac4
-:019430d7145755955d723fc8344d027d80ea79
-:01944049fd842c4eedbd858b71412714b6319f
-:01945045d719c8185d5ee33b089532f3e483da
-:019460d998b5b9711e8ebec46f89cdb789ec0a
-:0194709104f03de678d8760e8a08ddb9238b40
-:01948038e89f1ce5907c18f6ba4fb0a7139fb9
-:019490349a8bd4885ff42514fe8908b561026b
-:0194a0516a3f98d05053c84a89e8cf1ecbf27d
-:0194b0a522d10785a6a849385f9db7b6a46354
-:0194c081a5d598279ed6196f1e5ec8fe74c8a3
-:0194d058cd633f505757a3d1c4172fee5bb4ba
-:0194e00d47ceb50f9943f7b3d80a3b2c32cc68
-:0194f07ee86a665f490f0fe0aa071f78ab9308
-:019500e4aaae10e23179a8fbad8845bc195be6
-:0195100ad6136bb7dfd3a439f793de612c475c
-:01952076637091c1499518cb37063475f4228d
-:019530b656aacbe8691c50bc6137a9e776fa81
-:0195407b675c0dbb41128d415cf61514d05420
-:019550cb9ff35aaad52784ac2995bda013a170
-:019560e742b02bf5998ba934c88e74396902d4
-:019570d77762455d1c624eac092bb1bc1af2a6
-:019580230a16cbec059a69778eba42af259b3d
-:0195906f1f7959850052df8e78e8f7f56c2a54
-:0195a009f86c4e6c235fa1ba23fd26b79acc6b
-:0195b057f941492566f75309454ed9c19e1aa0
-:0195c09427eec7f3fe531173b1d23c5cc23a80
-:0195d05e1842d4ffe479109fd6f7b58668398f
-:0195e06baecac24b14b9bb5c697d45614df3ae
-:0195f0c44eb713fcaf371d3a7da9ce7e144b61
-:019600c00d71e15dea3e0dbcfc11e1261c895d
-:019610bc997b1043f701d59838f2b4dca643a6
-:019620e03923f19264da5fb94194cffe747ce4
-:01963061d4c0c48d005ec8c7bd17cfbb7ddc58
-:0196408129c793cadfc17b5704e12bd0e4528d
-:0196504086096f9855768b82caaae4d396c936
-:019660977384e179982e5ed5ef7ac2c50ef275
-:01967070985e4d762c96a07326ef5153dacd65
-:0196806e0c4546fe8dc071a7145a500a6e2564
-:019690edb55d07071925dc4c284ff5d94ab357
-:0196a0b5275f722827fd1ec4670600e9aa08cf
-:0196b08777a72ac2489acb12937add1a63be90
-:0196c011aeade42296a6399c79db6eb6872644
-:0196d031064536f0d60f456741dbd8a93b575b
-:0196e0c18310a326c38c4e21b4d37bc595279b
-:0196f04cb6781afad3c5a01cc982c712d6dc2e
-:019700daa1b8baa779ba029366f670851c476c
-:0197101875ea057c28eb585aa31b89cd1ac9f7
-:01972077837df429999b705f55f5e3f33c4921
-:019730710ad0aa10c2e4cc7837f2dd616a7029
-:019740a5dc5f5e708059619b9bcbfed519b9d3
-:0197503303dfcdedc11feac851288b511188c3
-:019760a230ab83d68cfcb069e912328ac884db
-:019770cc7651ed2aa80d52ebfa2342d981fde5
-:0197808e65b0233f5824263cb59105721410ce
-:01979086735a98bc06e596c3bef54db38ae61f
-:0197a08e06c9e7098d189d53630240f5dd01bd
-:0197b0821b685482886f43de9ba334a6bdfb95
-:0197c0d662555a91c0ffc98733669a03f5391a
-:0197d0330b2f2b7d9a54fbd617e2e0e12eefc3
-:0197e0ce9132fc5aa0667dbfce3b72fb29d7c3
-:0197f00944462cb493cd6b74f784e6fd45d4bd
-:019800523aacb078d4b72da65263b07417a4ad
-:0198109d319b772f21748a7831288ee4192910
-:0198209238967dc5eaefb4d3e83db282cc8e31
-:019830275336002d72d15c46e8139c2322c6d9
-:019840de739742b0204003b756611c9097f8ae
-:0198507b99cc84c9fcbc75c44955b7c1d6b0ea
-:0198606b3ec363e42e374a090f019c59ac7fb4
-:019870473713adecc1e297e18c92ed120295fa
-:0198807f5aea5424ddf3e31f0c72ca61515e17
-:0198909e2fb9d1c4553affe0571a5505d66842
-:0198a008dd63dbda4644d66d0598343777d7fd
-:0198b06aefabd1271ac10d0314d88fa8eb8c0e
-:0198c0a064d5298f745ef9c3e21a03d42a2dde
-:0198d0c998b78fabad46acb2acfadf838e571c
-:0198e0626996652a4da78d691e9709f0a26e5c
-:0198f0d5fab3c7419e4d6c00142b18d22af792
-:019900e088ee93bbfea951a66f6def0f70c2d9
-:019910337ab3c6576bf97d5cc2e4a06d1b70d6
-:01992044cfe9b38b8ee55a1079b2090036f963
-:0199308523055b2bcc68fb5258bff45cf90ce6
-:01994047ef611eb520f1d904343bc11769c967
-:0199506a5edab6cfcb39a140ad2c7efcc3a19a
-:019960999f529f5d2363eb2b205c21e9519e9c
-:0199705e19ca23eb37be567ebb8d03f7149537
-:01998094bd566203c1f8a54d35cf4d4d8b0caf
-:019990d9041a99331fe79cb2b87d3864beaa6e
-:0199a051cb75a8bc6dafca9dc26eccd263cb81
-:0199b05e3a1036f54a76e8e4e71f3d602c37af
-:0199c00d3a7d1cab0b1d9193080303ced21952
-:0199d0cedca4c48f588bbfffbd1b07e112ba88
-:0199e0e14bc0cad1cf77965343b658654c522a
-:0199f0650ae90f0fae0b5e69adc6dbf12c9f51
-:019a008f04ba22cf2d8b366ce895d6a7c628ed
-:019a107187e6d4badee3bcf6aac0b6f08724f4
-:019a2092595ceb334297e1e79e493c76e2c616
-:019a30dc8628c34cfdca61ef91dac9a2df4fd5
-:019a40731d99b1a1dac23669f5502d365bdbdd
-:019a50795fbc5b1fc0912ddb2593ca12dec82a
-:019a608f4b2c15d281fe83d9c6bb8f84f5df24
-:019a70306c6d77b79d4f8000ad70d9e0f5cecf
-:019a8043eed8257ac0f969dbd44d3c4179cd69
-:019a906b00c15f992ebcc6974bc83aeef31469
-:019aa0c9202b6ed1f1b2da89c0fc6bbc087c4e
-:019ab0fed206bd9a1cf01e9fde527887c3e74a
-:019ac037194ffbba28270f498fc038581b6d41
-:019ad09b4af7700f1e3b7552b66f1305db818c
-:019ae0a50cac90bedf2192b80a97cf4ed32801
-:019af08b22d8fc45c66ebe116dc8d0ef94690b
-:019b002cb15a9f4bb856e509b0b3cb055a7742
-:019b10b59a8a5af14b2d9fdb4d1f5030e32e1e
-:019b20654305f60e4dc8bf357a4efd3b83002c
-:019b3037012b367166b5be3b24084f58d4c3fd
-:019b40599468012d3328bdae938417da012379
-:019b508935dadfb7fcfa1f876021497bd45159
-:019b60a508e2937dc03fb8a649d2975c118e6a
-:019b706196ab22b605a768e921c466a9b6641b
-:019b80d90b6ea40209387e15657bc4171db358
-:019b9026cc8806427621b5f2674e0ea2340aa3
-:019ba0adf2fccb18e5f2c694445ad68f8c7bdb
-:019bb0b80f38fd584761e477a4bec9949af88f
-:019bc08cb442f12e6ec3d91a44f9c4123e6ae0
-:019bd01e5cf05d19ff0d87b0b3088fee00c232
-:019be0eb90a894763d138da26e767e523a2928
-:019bf0b9df7ed3d7c76dbd5c92f67fcbf2d72a
-:019c00eadabaedd4cb9eb3b044dd7d3ee6ac4e
-:019c10e48978c565a4a891c8ad605663827442
-:019c20c548f8523da5b5d82b1a12c33662d3a2
-:019c30c4c46070822b3cb8e303eadc3dcf44ee
-:019c408c068172bfbe4993111137332ec1d46c
-:019c5033166d1128a3ab5dd8b5ebe4103c2d76
-:019c6091ad691058fefde663d8571a0b875e23
-:019c70a47768f8564a7c2508aa12238030db26
-:019c80f198166ac39be06fafffc8fd541af3fe
-:019c9056f7ea58dafe02a34f493ab28b08e40e
-:019ca02ef389211d028aec72de23ec07767559
-:019cb0e21ac2f6800d4bd9be027d4dc1f8a1a7
-:019cc06aa53b264c4bbf1786be2ce80874dfef
-:019cd087da62eb175b9c574cd023f0e55bbb28
-:019ce0c8b4bf131b961195e65a3e4d28fadca2
-:019cf0cc03ef12e22a93913f8404e26ff9ee8e
-:019d00e1bc74ba9cd4c159e84456e520395347
-:019d106b41d57e72c4cff5cea5c900151ace29
-:019d2032f796b9d893a136f877a556b2da979d
-:019d308558b917a140c038382bc5ca1448dc0b
-:019d40b6352b10c9d38b53b70087b04193b2a4
-:019d50118c2a60ccb4548cb65b1dda4cf02a5c
-:019d60e1bc8dc4942a47ea10e75bd1da030622
-:019d703e378d3e123c46c21dcea2803cf6a1c3
-:019d80b05db2c51b9caceea742bf9089793a8d
-:019d90cc680bf9e64f4385c18059cc326a1925
-:019da05d72b94143c2d95916560e163d52454d
-:019db0da41bf3558491ad554091ddb26e59d94
-:019dc0f54f57e61f870611a700dceb93c8743a
-:019dd0c2c1ed41bf109055423c5443246815c7
-:019de00f7c4716d4732b0f6be38fe0709d2894
-:019df0f813f8ec4aa2b7be5ee6b60701739234
-:019e00d2292ced69ef2cb2090d9a5092ceceda
-:019e104d66b2131018ccca3524a9aa363b01d7
-:019e2059f49a49610f74e9e2abdb84e648eaa4
-:019e30066c30a59a2c049812e659a992518f4c
-:019e403d3e6b58afb1afe53af4ea812b3de387
-:019e5049ded70485a107fe6cd33658ab5fcb60
-:019e60984ffac846ede1721869d8b70e839388
-:019e703179f03b82f070e6447849aabf3a450b
-:019e8083f40ccd249484a0268534e2f747103b
-:019e904f170e2d2d3b10b8595fe321ff7e8822
-:019ea0bf0739ccb1149cfdd55866234f829d41
-:019eb0d4f70171c80030512659b1fb876a7ee5
-:019ec0ec9283d4b1138e87dfb8cd02b42b0df7
-:019ed042271a5a54e31fa12396d40270d90e49
-:019ee0a6ed4fc5e1e20a6eb06b7cd580f8b9da
-:019ef0bbaec13e2514ae4f901bbbfe71628925
-:019f00b5f86a34c34675c6f28bb6611e04c0bf
-:019f10d932e9f22cf780dc3b4e004c974e2be2
-:019f20cbb0ce3f6a44b401cda3ccbc353be10a
-:019f30a7d627c3b018048769d86a01b9466578
-:019f40bd54813b03ea4e5009f5761a9912978f
-:019f507df7d48f6074b6c8e91b9050eb5f3950
-:019f60ed806d102075f85dfd7052054b73086a
-:019f70811e1eed6d0bdf81b4db064a43952526
-:019f80b6bf6374c59f62a7476dc51c4812c145
-:019f9080a0756c810f4c1398c9cca57983294e
-:019fa05ea05925582f1a8ef245539b95b59fce
-:019fb0e82067f61e6dbe6e1c4f813c8d2e17f0
-:019fc0ba3249bde5eff571de13105ac2f2a81e
-:019fd0e0384859668c22f4e9a0837576f4440d
-:019fe000a87f4fa831b41c11de0d73272a15de
-:019ff0ad5a30f23462aed4a2d53e15ab454744
-:01a0009b4d9c84dc1d50d90cf803dae52b4580
-:01a0108674288728729fc5f267944297cc2834
-:01a020148750f6b6203c40c0d4f38edf138423
-:01a0300c838cb7b2fe26b5ca52a4551908177c
-:01a0407d073f13b80d4157c3cab7af22e1475a
-:01a0509bf5983f728ab14a2070b736f1a12e56
-:01a0606addae5991c1b119ca29236656c79e7e
-:01a0704ed273abf87080a26b17d7072ae1bba9
-:01a080ff0b0855493f11fe0d5ec48486767684
-:01a0906479f2cbe379c46c2d5b52197f77acda
-:01a0a08b1d9fb2b3d8d1cf6c64118d61313d0a
-:01a0b05a55acb95dd2c3da94ecac4f29c23125
-:01a0c0967132cbbfc5c4f81bfdd3367f2b65e0
-:01a0d0b94c1d0290244033e9d99e1df3771f9f
-:01a0e00be01b8ee726401dba2478656d9ae771
-:01a0f01df80b95b766793b0b43f09fe539fdff
-:01a100d1b0e22eb47f238ee7afc2037c34a947
-:01a110ece3fc5ad57e0f71a8d8fe3b14bba571
-:01a120647851125cd7035567fb48fb6e1a0bbb
-:01a13035e2fed9b7c39b190ab6458ff22176e0
-:01a140a88967c42c08ad95a59ee3506ff7c987
-:01a15039d1effa62cdc3f827a59d4bd7ca9229
-:01a1601c0421f2475c61c9c9f597c040f19100
-:01a1701d6b760fd75ecce5607c6ae67a7d3338
-:01a180a54d84bb14cfda0135b36b200ac52c9c
-:01a190ba4baea4f9b1da0f0158021bd8b7087f
-:01a1a05bcb5d2ecf22c4f3bca2824941d47235
-:01a1b0b3375137b3991568472df88ad2080b5b
-:01a1c0d6d69506cb3a29f0dfcc1d3d799f0646
-:01a1d0f647f51f9acf459575b1d6f5fa75e507
-:01a1e0a4aa6d625a557ff1be73fe4affa1759d
-:01a1f0cfb14994c9a7e587aa9f2baacf5abec4
-:01a2003dae4bd897732ac2b7499693a37bb500
-:01a210a323ed5d1cd726a900734fe7c5e23923
-:01a2203187f5314c998f95032e6cede24ed3dd
-:01a230cbf7de9bf67787bca42c509b8a53f977
-:01a240d73113ae3f4af45c42a30baad87e4311
-:01a250bff260407c40097e520969c0afc42088
-:01a260f5c72f86827010c48fcab2733abae003
-:01a270ef31acc4932bab7175bdddb4d914c3b5
-:01a2803e71c75e5cb20faeff606ee30577bec5
-:01a290f87115d27de8480150b7f4107e35600e
-:01a2a0881f8d030fa171320eda071449bfa370
-:01a2b0a0f123bafaaba27c2ec1c3a5abf4b4e2
-:01a2c0c37a2972bfef686e6ce16e53d0c563af
-:01a2d00fb01c6052eb6aabdd582e52a3054d57
-:01a2e02021983f09170dbc0f6304820f5f4112
-:01a2f0dcd6d6602c4be911ca10b3a59fb55b94
-:01a300d97a03087be83cc573dbbd8f76900305
-:01a310395c2fcad7340a86aad519942aee1fb9
-:01a320b13ae887ea591ba1de9a38a4955fd30d
-:01a33005a556750469f23b0f6b13f86b0eaa83
-:01a340b6a20becfc318a909ea4de048b1c3cf1
-:01a350c8aaa57aacd364f2604722d08e204e9e
-:01a36045ea53cd1d4aaaf65c136011082a7491
-:01a370b36b01e5fb21783ae6b602884cba156f
-:01a380c4833840698f252b57e019f1284e0fc7
-:01a390bc411099a55da7ef5e7dff2c018e578a
-:01a3a0870e3b36966b13eb1795b37bc2b2ecf1
-:01a3b03ba126ae548b2371aa35182e20d7a0ef
-:01a3c06e9a27de4eed101d30339f71aa3bd7c1
-:01a3d0604f9389afcd52881f39cf4dfe764e32
-:01a3e0299245639fd92bf332ed9b1052cdf517
-:01a3f07cd886ff975af6c9ebf1fc4312349961
-:01a40035d48130e0de66d93ae62585d52241aa
-:01a410721a0beda84e49d6d577d530853e94a4
-:01a420f4a6b4d952a1b653d9928a23f15bc1ff
-:01a430811dc9a20f09e6b6ce9e1609cbb1b94f
-:01a44062a1bc829fd03c5668a61b2415f9530f
-:01a450794d8d2473ded26fabc1f1c94315f505
-:01a460230fd7478e757ed853cf4768de378cd7
-:01a47047392420a8aa54751dfd48de10e2626e
-:01a480552b68f131c5de7b3ad0eb58b09969a3
-:01a490bda25de7b4f403ce3e260aa5444fbfee
-:01a4a006651a438e70d0218e40ab421c2908fa
-:01a4b09a78ddb2ae91a65e1e193c90dc5e316b
-:01a4c01546093ebb6bc9f79cf3d56d2b82a698
-:01a4d048fc9e4de3d8f4d552c293843ec47eb5
-:01a4e0de553ff7a292b74549370d5a8e24fcb5
-:01a4f0a5dac2d4b3d26d34900b11030980d57c
-:01a50036985ba233571138fe7769077aa48f93
-:01a5109f4192f8dc1fe8f9d65925ae00cb1498
-:01a52063332e4aa4f45fdf549e750790e2907e
-:01a530a7968e4f8b544235a6b17f0a72f26350
-:01a540f0d79e1cce54d26e3bf084a119f40497
-:01a5508fc2a3e9b172a723271be429aff966be
-:01a5603e55fa70fda192f8ff868bc087fb82bb
-:01a5708a49d2a9972a180dc80487162121cff4
-:01a58005dd88544d17a5a7ea779fd78248f488
-:01a5900c28755c1dbd9f46de6e0007ee5d62ba
-:01a5a0b30c44045dc15362dca7ac3fa6d34ffc
-:01a5b08120115e9ecaa557d47e8b54e7f95c68
-:01a5c0fab66d73228a0c61325d8746a19b0384
-:01a5d05174596c9c10cd9b625b22c227dab892
-:01a5e029c48afe177f6e973c47d25a61748071
-:01a5f00e1c5885fd54b7cbb77159ea63df1c6b
-:01a6001e02042743a43b2b367f5bf4373839eb
-:01a61029ca84c5bd5801ff1ff311b4fcce0499
-:01a62053e2067391d1e27cac8186331f2472cc
-:01a630c01f9e4781533e7f217b4afa464dc3f6
-:01a640e0071bbdc548b843cfa9692995343bdc
-:01a6508c62ff3ddac8b2d1315777e79c23352d
-:01a6601ec89842a9d560b94c2e848ea5fd8f70
-:01a670bc6a2978b9c5a4be852c914ba6a75007
-:01a6803c2b17a7fc8b0ab4562a9ace553cc8dc
-:01a690e04f7909db26b9b30d2fbe27390fe5ed
-:01a6a0c5e656c3dd567058063853e638b9b683
-:01a6b0f241f3c3a19dd7d9f24edc7040c34503
-:01a6c0f28de50a9b4a6af741609a2c82cfd66e
-:01a6d0dc451ed063d71fafa102d72543a953a3
-:01a6e0c5eec78d999694d467564213af2815df
-:01a6f0853bee2d2ed5b4b064ff7161ecf8787d
-:01a700eb0728da0cea9932d0d529219e0d01d3
-:01a710e3de7e599b43f3041b57484835953681
-:01a720edac459c38af0484d2052ebabd7f93ec
-:01a7305207938a7747fef28eddd863f296c4ed
-:01a7402be067b9418b92d6fe07e4d3709ec6c3
-:01a7503d4b938363556467b1eeb5507ac142a5
-:01a7607ed0f3a101040ca15ada745a1bf78719
-:01a770b1e45066e9e9e883db892a2b22976993
-:01a780df5da134ae31013085e88657849ab549
-:01a7906d5a8e532c753134da2b4bc4e2468d50
-:01a7a0d699edaa852a3658276a6c1786027d90
-:01a7b01c9a6aca42885f8b193ebe09a619e142
-:01a7c0dbb4b90381e9549481df0d0640f25030
-:01a7d0cb0609bd14e1b118894b8e43943f41ca
-:01a7e0c4ec606949c67374197c6216f6a11c69
-:01a7f08fc3486b3d5120730144d3afc95b8693
-:01a800392ccc4064c0d798b0dd765d51efb7a9
-:01a810bba1eb34d1a510e26b5565574621caed
-:01a820f00e3b418854e1c8039503c6f2d5f796
-:01a830fdb4a2329a0953b50c3518816148d5c7
-:01a84006c3a890b81433785644f7b16a13e18f
-:01a850683b9a150cc135ff35d4c1b84902018a
-:01a86090cd7ef30ca4044ba9e6b6d34b15fd76
-:01a870bfb5ae5322e76e4af4ad707bb5e89b3b
-:01a8801f45252844384ca54c78195a50b2ac16
-:01a8900c2344b7487a4cb0868adc62d05f0f72
-:01a8a0e20a1a79f4fa5739122e097e9dfbe138
-:01a8b07d118761f5c1b8ef7ce89568f3d84837
-:01a8c07c25c8b9b9c52cdda35e5196093776f6
-:01a8d042df6ebf317c3bd1011a85a5a432c72f
-:01a8e04439663b60e2d0b750b8e80783363e52
-:01a8f0c106601e1b9e018b0848604fcf40afca
-:01a900380953d4304eae6b71ed001cd4c594cd
-:01a910738a89998afc1b8890e9a4ee4864de62
-:01a92035f30f9961489e9a1895160d72831fda
-:01a930faa02b123537a732f49d370a3c8ec3ea
-:01a940b455bbf5097b169f78c88df204a49e41
-:01a9508e1a5e1a64821859e6b808e7f8e4ca92
-:01a9601ac2ad3614df5278a0400a32f0015b00
-:01a970fc91466fbfb9f5510b883d2d0228086e
-:01a9802c8d8ff9fff4d7d03838deca8fde433f
-:01a99083ab8981a733f3f9ce9328582f69f000
-:01a9a0d50da9c95f537507cb5bfc22e36461fc
-:01a9b0f707a6b362357568bdba1a22391b0cd2
-:01a9c032f9db64fcc7074f65a174a966c9e0fb
-:01a9d03fd49bb1e1462c9c89f62dc2a0ca61c3
-:01a9e0a5f103ca820d623b2d7973b4312af2e0
-:01a9f0d787d8053ae606b5e566f4a9a70a9160
-:01aa0000ccdfd129ecbadd9bc5da5bd5aa1e5c
-:01aa104fd78853579fd3c15dd225d66d60bc62
-:01aa209b29470ea3acae4dade33f858a2594f7
-:01aa3020018b726589f510f0109600959ae93a
-:01aa402f17529020f71964a28184beedb8e7a4
-:01aa501df63e6aab4a0e80e76dd87908961585
-:01aa608675295be6a2092e7654697a5d8b946d
-:01aa705b50ffd336703740aa58fc2ce33e4012
-:01aa807719778b6c01d512fb16b1b04467d267
-:01aa904bb346f9c50ed36ea982b8cb11784d59
-:01aaa01a92896f68d56bd66a4c46ed7a2dd193
-:01aab0238c9e6716fd2c5b3bfc3d5fb1f3d0a4
-:01aac0f9d315455fb619ff1ad28be7f82f52e1
-:01aad09b95cba50bce1eec101c6982bdeaebf6
-:01aae0f89bdb6c91de449312514d51d5f0ad7c
-:01aaf0fbbc83ab5aebcc52f1b78b4c74a17c37
-:01ab0096398c686d923303004767cab678b718
-:01ab109ac352fb883156dbbe4337b179c4bc6a
-:01ab20b08fb659740af8cb33ef07e6fa4913ea
-:01ab309b13c7468cc0a44deeb04a097524a541
-:01ab4045b28759300cb5696f02c82b91f4c9e5
-:01ab50c58776744ce910b326712a3fe51a38f1
-:01ab60ab8300539e15ff731b72410778818592
-:01ab70bc2dbb988742cfffb16f5c634f2b1cad
-:01ab80c4096f5868125986eb0fe2125473af39
-:01ab90ef2af73ea354b5aebba9a09e5e42d646
-:01aba039ac78ad705c090b7f53e91caba1ce77
-:01abb09117ac188d1242d1f258bb13590b8f11
-:01abc0e3163122655812f46fc094486abe6869
-:01abd0e3671cd50294f3bf6f19e0773177f557
-:01abe0df7e7538d785feabbdb2e9b6abb5528e
-:01abf0dde460fdb999bb183f7c5a6c714e0740
-:01ac002a308e24c47103b115e051e910a10c26
-:01ac103610f7e4a144424e8c66ca34ea4868d0
-:01ac2034ec450ce6e41f205fcd9f57f73cee2e
-:01ac30a12b5812c875469a217a8e2bce3cc030
-:01ac40e7fdabd0c15ec63c6bdaa7436d63e645
-:01ac50471c86a5573aff2868005b936bbc0f5a
-:01ac60e106a4c1448f5332225ee9a1e4813297
-:01ac70c854c25af2d9beea874265501c7ad42f
-:01ac802da4c42d28897df44a3179527b9168f3
-:01ac906778f52e9c385a6b23e0b6dac8ecc384
-:01aca011d88106fc13190306a892d1f058e1c7
-:01acb088c2c49c1afe4f8ead595f95072300b9
-:01acc083898a583535c383daec7627a122386f
-:01acd03980303c3c0d19556efd1a7d44079d0c
-:01ace0b9aba162376e46f3c5420642c922d21f
-:01acf047f3331f522326b7d0d14807e1e2c403
-:01ad00be697749911ed8dae9964347a5e51416
-:01ad104498a00feb6090c2a62dd74c7e484818
-:01ad20ef0820f98e3083da804b873af259f3a4
-:01ad301982473302b8e2789f251b1f67a6ec57
-:01ad40f3ece06a9f365fa9cb44f516064b7e20
-:01ad5070b5f1a5cc40169baaa598b8d82e6adf
-:01ad60b7d5ab309a7f6e8adf5e6b7036a6199a
-:01ad706a965e93625d25ec7e4f638cd0328ca4
-:01ad80c5fb5f6b2cb72086f88d388e5dfb215c
-:01ad901e389f9aaaea1f7b1dc34eee7d7d41bf
-:01ada0ab26dc2b12e7cd44eb0bc12581082069
-:01adb099d77e29340050285661932cdcc6e1b1
-:01adc0f30fde041c28c5faaf742bfc92c30e7e
-:01add044fa644925d3c35768da4c10141c04b3
-:01ade0fdc0eb1679d29b8569743e556f2dcba7
-:01adf0143eba027b0ef106e8ed07957167c093
-:01ae00df39b28bdca7715cb02667c86a8ef5e5
-:01ae10686c4cbf47c35611889a591eb41c0f53
-:01ae206bfeb51612683c2f2d582f10dedb5b2a
-:01ae3098035da1b35265986a5cf2e2d803ce1b
-:01ae4042d911f07cb3cc15119ad66ac69d2c46
-:01ae501615fdb06acf67ff223204172e15bd07
-:01ae60b30e96eb5db5abe94671da6952c8fb22
-:01ae70aaac3ea1c644fd1402ae99a56a7a7588
-:01ae80b95088ee9cb1f764357981671f4c716b
-:01ae9086a70e69ee1d2a80e0ddf18d4ad62908
-:01aea0f0d6ef4e9747f5528c07f64d9375212a
-:01aeb0984a6bdfd192fe91943f9fa1e9d72b07
-:01aec0c351e4a65198012caf0a63cf817929bc
-:01aed067ebf16fa0208f5b154e064ae5190d49
-:01aee0364b4a5959e243e458eda43fb11bb8f3
-:01aef070f2563e83296a45ae861363a643369b
-:01af00a997c8ebd5f7672f44fd4d4d9bbb68c7
-:01af1090776bfd211e94242e1f76a37506bf90
-:01af2064ec2d9f4a184597a7828cebadb98a2b
-:01af3001ceed03cdb6d83808796492d47a84e8
-:01af40ac9bdfca1713037efd5d7374158315f0
-:01af5037d97f2d0a00f39b05ef2ac4a13b1c18
-:01af60dcb2f68912204e720ac80066442d130a
-:01af709601481d4c39d71dd88ed4a766007289
-:01af80d9ea1a59fc4f44e75d99b7854ff27ce9
-:01af90464e9356242f1f235c71461cccf1c267
-:01afa082a9070142aaabcf30f872c89613f3ba
-:01afb0490c545dc90683328f3f5217418ee964
-:01afc039ca55ef03b53c14cccf83de6935ae02
-:01afd02bba2fe8df04ab48900a551d1eb91ec7
-:01afe0de25630fc45be434767193d77edf4698
-:01aff0344545f9928c9035c136dd715db64ae8
-:01b000846a2e38ff941abd695713130941244f
-:01b010fe4c5eb2de636b2010441292dbc4cc53
-:01b020d518d7e6003e13ea2daef5899b5970f3
-:01b0301e4b162e6ce125617b45e19570359732
-:01b0408fac3c031d6be8639522aef8ed8bb464
-:01b050e58dcf4e95f2580684f73230b32892cc
-:01b060814c556d4335fcdf95c6fe8954baae0e
-:01b070fc69479351be0e3bf4b5dae293fc2cbd
-:01b080291ae54807929f5217b13e045e423a4e
-:01b090f3fb8609b525ce40319a281a9934e7bd
-:01b0a0bf7c1da8ad8ff448050e4c54b95c8cdf
-:01b0b06c9970df2a1f0efa28afbc0be99d4cbd
-:01b0c09872ae65b345a0091ab44dd560475693
-:01b0d0610d90dc221b150efa2a9cacb4335592
-:01b0e081531ebb16f7bef160e43dfdb07e88a0
-:01b0f0090be9f4e17f11b5761c68ed1dc5cfa7
-:01b1005c980bdfe1f5aad3b2039f8397e7358c
-:01b110879fb7ba3331abf9504caedaaacedc3d
-:01b12020cab1ed7d0b32ffe7931a1dee0c7e1d
-:01b130f80b1e594c58d6fdc5067a361d711669
-:01b1405b3519f0af1fa80ad77a2f29a5cac403
-:01b150f7e84dbe828c648ee6f1a24fc4abf9fa
-:01b1609d2070fd39217370300757be30d2ccfd
-:01b17005aac1a91feb96b3d18a31585f267214
-:01b180bd3673a92c52cb84d4c325612a663f03
-:01b19078a897e92866966cb31da6e031faf248
-:01b1a075e582cf3d83303b0f27eeaaba38cfbf
-:01b1b0f2286a6dfa379cddf396d956859456eb
-:01b1c03f19227bcac2640fe5824844f413ccdf
-:01b1d02dd6e3aa545cc619e444f27bade135da
-:01b1e08101d016a2f5685a45221b32b30bdd5b
-:01b1f0cc287a416829568713fa6b7bc3ff1a1f
-:01b200d26d8a9e60697596ec1b477d77ae1eba
-:01b21028eb7bd7e53669d120cfea2f8aebab6e
-:01b22024f4be829a127e2c2ad34337ec7b1f41
-:01b23035c75c29a00576355b24b4ca9eef5cdf
-:01b24055a264f26a4b2d2b2c414c11e8ec251e
-:01b25014a66658da08b53cee2f9a606e9ee99f
-:01b26038619dcdbf36e2114fb2bcd2441c7f2d
-:01b2704d470cd759345a2254fb5b5c37994935
-:01b280160b1cc8d203a9a0b675972ddb80d75f
-:01b29035631f5f554dee0afb5c0e43970059d0
-:01b2a0ada5194742c4de0c8f1045a52b7a29f2
-:01b2b0427b90d496afe002fcbffb55577690c6
-:01b2c041c55f5d4a65b297c22ae0e4817e762e
-:01b2d094904782b62e42e1728c48232a5057f7
-:01b2e08714cc86f645fb7e61ad647930436430
-:01b2f03c0e8f974e254e6fb894af6fb0d4af4f
-:01b30068f479a624dff5851f84abecb79cda06
-:01b310f5bef3c9668478c9d265550a0d1f5c90
-:01b320f6ebd3d760f4b7f72145eab3619543ac
-:01b330230c8595f4670c94bee5e8089f42a14d
-:01b34031a8bf0e389822da498d802bb0ef3cd9
-:01b3503b4f2fffad3681e070a0f3afb2ae9153
-:01b3603547d783c3e4bb044be1e30230c8a074
-:01b370536fc66d0671322b55a63f9a964efa66
-:01b3806ce793ab8a8dcf774418a77f197481c5
-:01b390a5a0769d6360fcbd2f140736c22dc279
-:01b3a043a089b1ef8a058a5a6c8256b5ef2bbf
-:01b3b0a90723ec7bb624e8d6603ce9b0aa3065
-:01b3c071f5356a44fb89918f1e098ff0ee7d55
-:01b3d0a224efa52a724994f488ca529e2eb4f1
-:01b3e085dffcd6115d240c97f103a73e40be65
-:01b3f0a339b98046d0bfb73db0c1d7607eb7e4
-:01b400bb3d2b677c96963da4f07633927daac0
-:01b4108435e68169d0079848578ee4c9fe0c61
-:01b4208995df621291d25bd64aac4cab00f3fe
-:01b430d82e6a78399a8d6d007a8e4aba256583
-:01b4401744494f37f9f5148546a7a9fe20693e
-:01b450640154b8af85cd4fe903e508e6124835
-:01b460cf7776a4105c93e8ec32403220901876
-:01b470db6a30d866631cd07795937e368b0ef9
-:01b4802eac6c2ae92adf3ad6309a23b59ad21f
-:01b490890987203c4d40abd615219694a363f6
-:01b4a067225e79572052b7b98083389001c417
-:01b4b0829b089d9a4f5b19aeefcfeb20c4648f
-:01b4c0fdbf33aeb26de1d20a47a8b7811c2ab6
-:01b4d057f583e247fe267b9f4f49c8ccbc047a
-:01b4e08aef2059ece3d7c23ce0a029cd68045c
-:01b4f0124bb78b576ac1af41fd7b9d95c57486
-:01b5005c01290ea128480535075af625cf9a13
-:01b5107f7c3f2a521c4885b570c427a84d2884
-:01b520f1b89d8a2d9d971159b0c5d54bbaac14
-:01b53035885dad17d40aa8891c9eeccccac92a
-:01b540c075cea7a84c1b12b182ff613ebee9e3
-:01b550fbad383eb0e6839b10bc99329f5fdcc5
-:01b56044099e1d1deea26563fe28f0a88d593e
-:01b5704bb6620033cd7362d4cd065c85cf37ce
-:01b5805b150946c7093b081d3be034584b4f33
-:01b5906c16550352447f970e61e3ab16f69ea4
-:01b5a0e99dce818a07b61e9b0c54b7dcfeee6e
-:01b5b02536d6e98054d51913862374717f83ec
-:01b5c011b9b5b20fc541313a0a5379d1c134c6
-:01b5d07a0b95af1bf9e016e630bc1af241e79a
-:01b5e01b63b1074b0c628096b87eb0596d93b0
-:01b5f0f9a436878b6e99ee50444656ed85fde9
-:01b600e652d34f2cc87c95f04ebab8975ab15d
-:01b610cfdb03647c1d458665e70183317f5959
-:01b620e9d7eb95c1fe9fbc37674b30086dc93c
-:01b6306f05e4ee9bf914a293ea382c58b73e8b
-:01b640799fcce558aaddf096c6c5977831c24d
-:01b650ab0c02970b1114283fee2721aee5df56
-:01b6604a421e1d0f07495b7f6ef0df7c515500
-:01b67045137e33b9546b495d7eace69624b494
-:01b680076f2e27999130eda6bd6f071761810f
-:01b6909f052945c6f4891335d37d89c94d1def
-:01b6a07972d5e8a057a2fa77deecb846aa3572
-:01b6b0df0f2610f1ca8e61c1cfa139f7be28c0
-:01b6c0676d1e57e0e03007dc7d52350dfc62c5
-:01b6d03ee24bfb00886a8bce5ecf72eaea3e4a
-:01b6e0a0d175406dde1ac358733845ed6bc516
-:01b6f068e74e0d77325538750d337ebc3cd737
-:01b7001fb53a3ed28d8a16db535bb502285b9f
-:01b710102f10cff19593904c3114903bfbffbc
-:01b7208bc810c663ffebae71f26c7e6d306b1d
-:01b730baa568bfd6efb708cc15315413550558
-:01b740e00ad700a8b67f25369642a6ff5b3d4b
-:01b75003e124a098264c4ef010dac11114c00d
-:01b7607d649dc0e03af6679171f11e0d0d709f
-:01b770a4e5caadd6ebc846fc5155a30df3863e
-:01b780fffd9aaeec28e1b14fbd85a73d9dc23e
-:01b7908dd4dae35ad24ca22df9687a4d2d07f7
-:01b7a0dbbb15fa817b5422786fb98de74a5f06
-:01b7b0351319f54b2fbb1b9f51d77ff24d988e
-:01b7c0f7aa0dd97bfd81d15f440009e707e57e
-:01b7d05d02cca5cb795d544e5e01de565acb1c
-:01b7e03a3852d3aafa78631af48a474f2e1297
-:01b7f01bf19aff7d285ca67d79900797031b06
-:01b800852028c0fb966a5c3668e67860b2f778
-:01b810ff326d7896db40ba19013f039670a05d
-:01b820032dfbaae52e77bf3c13c5814319f093
-:01b8307ece04fef0cd68f410bfe8d43c8a09ab
-:01b8406f553998b23c34645d9b4b33ca60195a
-:01b85076afdb4ec5425fbc79e72ef21a10378d
-:01b86023e431b6c1496909fd5081e8087cdab8
-:01b8706b150d88e74715b40b8bbac0f1defd77
-:01b8807c5e8d5f4df9fa6342db14f463f6a091
-:01b8900280144d13b36a2e32a8b53948226fb0
-:01b8a08d3715e61fcf6f526b22cccf306bcb0a
-:01b8b01d9d6e6cb0bad88f9ed1eb4e2b4b4260
-:01b8c0fd75d0b2818bf9ac26fba5fefc3dfb8b
-:01b8d09a42f90ea5c56ca324d3243dcaa37c73
-:01b8e09870690a11c32c5f10fe94c978b324b9
-:01b8f03bac808cbf2ff61a354188e13cbc84d8
-:01b900e47d63b7b88a892d665ba05e20252da8
-:01b910f0a90bc5cc3583522f87c9f46feec8f4
-:01b920fe36d09e3e8335d3d255dd9d7f08237b
-:01b930090ec0d07a97fb404ca97712c2ad3f43
-:01b940cd078aafd48be93b5b4635bb415cb378
-:01b9508b8f01097b2d0c6279701dc467ae8431
-:01b960a63f0606890e2d32555bbebfe99fc857
-:01b970e8fa9a01fc8935cdc24f56377c33f256
-:01b980945961229cd09c0d0b5d04715ba2e1d9
-:01b990c949cfe6fc19e0b0f0148fa681327652
-:01b9a082288709cf2939dbbfd939ef17b511bf
-:01b9b0dca0ca87d615031a4bd1c921a37eb8c7
-:01b9c0d522ba0cf2954ecab3effc101549ce7d
-:01b9d04056c4b8395ceb92bef51557500370fa
-:01b9e06704ead0873a230b399eba6b2489efba
-:01b9f04df81e5544e5947bf5704a7303662e73
-:01ba0050055af2d920eb2b939b05fb0215b0bd
-:01ba1025513a7c25a1cf243971526f2e1f98db
-:01ba20732dfd5871a7ce1070406d8b16bb1b0c
-:01ba30136d6327647ec573cdf2ab655d4a837c
-:01ba405746ffebb494d1d2b3bb19a216094c9b
-:01ba50c7d0ac501b011f79ca74499d86cb0614
-:01ba60ba082eb248e98e3adb89f7e63124d84a
-:01ba70f7c7272a0b5c50c6f6fcd15fd2292b43
-:01ba80d852eb19e83e22d60f156a3981200f01
-:01ba9025adf1695d521acb213d860c79eb88cc
-:01baa079ddbfe86a64aa13226beb6874c36397
-:01bab011b33ba51757f564687e62eef0272a44
-:01bac0ff55633a72720b538307fd11ea161c15
-:01bad030adfde7cbd3fbea9a6b25d77f0ff2be
-:01bae0723447f2e43130638fced1298d5b5636
-:01baf0dad6f595edbf76ccb9b11a8819382f00
-:01bb00fb3040a2880de523aa5cb5b403761052
-:01bb10afa03b6df334884def2cfcfd70039099
-:01bb20420ad492877350f0bd3e97405c126f74
-:01bb3087058f120af8d2a0a78f77ba0d1a9194
-:01bb40e55599ace4c2c19e43e8beaa0da33277
-:01bb503f0dad9c4b5e4cff5d20ab3b8a532bd3
-:01bb60572bae306c69c9e890ee62aebd85bdd6
-:01bb702aa5a2d5a667f92ef1d7039e1bb0c202
-:01bb80a89dc072aceaab84d5fda6930b8e82ee
-:01bb904b418a57fcf838cd6713765f26d855a1
-:01bba0367eb6e75242c597b3982cac39f0383b
-:01bbb0d10adda306ae2ced025cb24c63807218
-:01bbc034c953c7b6298326cad63c058b7fe562
-:01bbd06c3012dbbb1ff8bcbd305d6cd8c5ca10
-:01bbe043ee7d1b7ca193e3b9b0b120bc591658
-:01bbf0395edd155eb7426887edd31d1a6b5ca9
-:01bc0042e46cdaddeb65c3058ca5c0f3e60393
-:01bc10f33b84448e1cd9a91565ec11c04e4b67
-:01bc20eadeff5d453e03d28b2ee121fadd4bfd
-:01bc302635f9f5154dc0fbb9cb072547a5f345
-:01bc408d5ca9ed171ea9b427e56e30dcfe86f7
-:01bc500c7ee68188a996a82d5c870f57b81b53
-:01bc604997a6ec10ea4ffa662ce2bd10bc0c73
-:01bc7068ad117948507548410b0c7fc27bcc17
-:01bc8048f593a6c43a0f6296ce010de56192e0
-:01bc903d8220ce2bdd1d884ae076eefe876f78
-:01bca01a86dbd02c944275121846c8d7150b41
-:01bcb07b392acf94a310303542061ab0727e54
-:01bcc053f036b4bc2545f4359b7241d3fa650f
-:01bcd0fc3f1cd0632786ffda1f5f4c0bf22756
-:01bce0d37b41acf9a8a603dfca3e87eae78f7a
-:01bcf099046153d1e4e2dcd0a119088d3c106c
-:01bd0009cfbe5f550cb81dc9659c47042f4655
-:01bd10597e6bc7d7354fd96fb17db17d12936a
-:01bd20f0ac50afca5682a90ba233e46260bd2a
-:01bd304a02632c968d69fa3e05b56298fa4026
-:01bd4032f15f09f5beb48c8062b8bd465c08c2
-:01bd5074906f86956ab88552c613c96a07a6cc
-:01bd60ea1d891f72adfff4fc3575f9ddd3a62f
-:01bd70df03161697992cfe4a75ec6ec093442d
-:01bd80624ee8e73312e9dbdb703f1a427c0160
-:01bd9030e9f89bc1c70c0c8c18cde3cfa566f3
-:01bda00be9bfe36fd338c214441d7866cf4bda
-:01bdb01b2897d0b1c488290d785520a54fb0cb
-:01bdc064001e8ea1ee50ea1fd3507abf35e64f
-:01bdd0cd6bff916b057371b4620e7f7cc5d21d
-:01bde0b24ec985c254a53a5e79c7aef60ed222
-:01bdf055863de7c05ffc6aeacb70eac0aeae8a
-:01be00987a384a9dc258533748491e02abd16e
-:01be1091be2e4cd2365f99b26ded26b750f424
-:01be209a26d4e71ee038d59a240b8db0619ddb
-:01be30cee197d57cfe5b2de3f303701a92df94
-:01be404f03fce5b373373f60e47dfa2102df92
-:01be5048f6b1134301106d19047f27b4ec076f
-:01be6054c1739e860b40a7fff304afda21f29d
-:01be70052986ccebde73f5c2ad9cbab8fa1d83
-:01be80358e595dc6383317a216234acd3dd672
-:01be90b11d323581a93c5ba292feb3231253a5
-:01bea08a07106a87578f5c01323c7dc031aaf5
-:01beb0c9f0b7610074da563355b44ea85a29ee
-:01bec0ad5c4d9374364060833ee4c415ba6a87
-:01bed0cc1c3d31a6f7ecc9a1f8a8f963dcb459
-:01bee08cfd6a8b9b4047d8e87a1f441ae40725
-:01bef01b5592f836eb6a4a6073b84cf96c7e88
-:01bf008aae9e9514739784bf4f551b0c258b3e
-:01bf10ef2eea5a32956985ce83f9bdaee06a42
-:01bf20cef35131de66dff8d84177d6f961c661
-:01bf300cd9cd6d2cc6a0e77fde7c76696e2f58
-:01bf40f49cb9f8d6ebd0100498d2dc156fe36f
-:01bf50471db7b8a1d608f88cf44ba5439c27ee
-:01bf604c1c59661b99329e88a99f32efc52d2d
-:01bf708fa3ff9e43f43336db71ae3c6b2db07d
-:01bf807d4c5dd078d0392d766ac8ca0a58a0b3
-:01bf90b50f1239b3ab26075e661374b5f173fb
-:01bfa068a16879168c3d280c01e77ed87026ee
-:01bfb0897a0d4e0e4c6901ff0d63bd15f660ab
-:01bfc081877f3df29a5ff3fc483463652f7e47
-:01bfd043bc8bbee67eed2fdcb7f3954e144de0
-:01bfe09aedaae1a00287cbb43e207f013519a5
-:01bff0442f9846f8c70f392778260097a7c683
-:01c0008ebe1896cb262c239011f43845e2f2d2
-:01c010067655f819388d4f7f215afbb5742e5c
-:01c020d8861f2981c91a39ab7037b27b040963
-:01c0301831b8cac460c978b9bd5a17084d77f0
-:01c0401e88ec137d157ad1e64b7c48659a322b
-:01c050ba6a37599d564d4dfb169c0bbd052f16
-:01c060ad7fb9855bed786185fe44c74b48b23d
-:01c07029e2472b0439917db41f66b60f16f289
-:01c080415c727430b4b0df8403f80eb6841257
-:01c0905ff8d43370c0a97c6d562d85a263b9e0
-:01c0a05f436e24d3bdd84feee1c8ddeda58fda
-:01c0b03329bc52a6626b95278f912ca1a96605
-:01c0c08b172e84462959f577555b89892c7263
-:01c0d01ca55933d66c6d37fb23a32edf1ec36d
-:01c0e088199f1103cb5b5169060f44dd655e94
-:01c0f05dafda4158eeabdc0f6507bc25870438
-:01c100d2e01c332b234fb079aab6ba0fec5158
-:01c110e863ef6785964ac1687c52595c9730cf
-:01c120035d1fed6101028911f20683c6d93346
-:01c1303491ed93fc649bf5093088fe066d424f
-:01c140ebbb76987416ae8b770197766bbf1fff
-:01c15030817ff26ebddde24be46d196c943da9
-:01c1600a71ae306f30a0d5bd5cc0f1f2e332af
-:01c17022ab62b5ceaeb20ba68b9c2b55a30acc
-:01c1805335df24c8cba4a981efdbf944a4ebb8
-:01c19073bf7b8d8ad9886ac613462b678df9ac
-:01c1a0ac0f7a6667faa0a9974c38efb208d81f
-:01c1b0d1f1d383bc93df1a0b60249ca16376d9
-:01c1c05b4f1aeb8046b0721ed4b29299e65aa4
-:01c1d0cf7040581e6d729c4e3fa03fafc9cee2
-:01c1e08e1ee937539b68d493992afe5e930b50
-:01c1f0457dd1fea0207560333e070f8de004ab
-:01c200817eca0577748e3ad94c13017bfc24d7
-:01c21050d927055cc14e97d5ae0400f3e77b82
-:01c220d71abacde7f625b600dde29d0a5112bf
-:01c230d88b10f629cd84313f5f43c13639d725
-:01c24056abb2152edb70badbec70076ec7a6b3
-:01c2509874cb6ed3c4b541fbf6f7162f49eae8
-:01c260e85adb4388471427590ffca0f76e5bdc
-:01c27032fb25911b1bfb1427848bcf4ea6b3c2
-:01c280a355f3551484ba508208f7febbd2a690
-:01c2902cca694c9cb5d9280bc3e373c1d9422b
-:01c2a0779816fca523b94a297ca42513d2eca7
-:01c2b04e61f1cee0118cc0440898dc4ff90274
-:01c2c00a0eb9d411b13632c7e616eac9098a29
-:01c2d03c021487329b20f4e3707d663641a66c
-:01c2e025bb66c76278f807d4b1abec40e1d893
-:01c2f0be375d21ac901315a2826042c23214ff
-:01c300e1a188d4d8cc0a96799d71b932d24a39
-:01c310278bf9f94eeaaee2c2b20ae5a559a4b9
-:01c32093ed4cbd63ce460ad254144ea27fd240
-:01c330dae7bce94238dd4eaead8e65541469cd
-:01c340460e431ed3cae80594135b05073b6437
-:01c350e762836c623fe25cfb3e27812813d52c
-:01c3604e8d97b6be3ffd4b61d20f2def059fb3
-:01c370aa151ba30896e6f93c2220fd3bd9bf4a
-:01c380576afa873de4687b2bb4007ffe548338
-:01c3906122ef0ed8b47e36f72f4463f7cfb971
-:01c3a0fb8cb090ad901fef0463291ef0d1b98e
-:01c3b099564f20d13bee24390c3fcd1b22a9e9
-:01c3c0962f165ac0055b07e5bb14656a867da5
-:01c3d057a7fb6ddb75be7c584535346d3346b4
-:01c3e064cd8125a407261060245781dbda8a55
-:01c3f044ef8c49cbe7a014a1f543d7c818e5e3
-:01c400ec97356ca7c16dd273ff463236271be1
-:01c4109ee717202bf5419a8c29955d8a89a712
-:01c42046eaba58d1c6e8688a14646373c9b532
-:01c4304b4b68c1cc3f8df7be4c962854773616
-:01c44083dd1cb5228eab850a0a7ac4c140f1af
-:01c4503a360b34790fcd668751ad07cf22cc99
-:01c4601e748e8d55e4749e8a2770f3639f8728
-:01c4702723e6b074717e49f71b4b199c0fdc8f
-:01c4807eb5edb941e4d702753da935f05b0373
-:01c4904926ac444e593352d150ab412c217c1c
-:01c4a09eff53abda12e0c18f9ef7bad8c497c0
-:01c4b0868f9d92354ff184681b2ff9efbb3076
-:01c4c078edd62340ab3ea2f3c63899b84ea911
-:01c4d0ee3a16ca4d990de93c182733066e0a71
-:01c4e08728a65a198528a1985f4ca797a705ff
-:01c4f010abbbcc4a0ff09dd32c8e121e81a743
-:01c50084a1f44ff12b793759963dbf8a785352
-:01c51029b129c08a9c65cfea4cb1040b341088
-:01c52037f13d7aa5123a974fb80789770fdd28
-:01c5304dec7f449cdbcdb25ae472ee9a263f37
-:01c5401ff1052ba2995f3144ec5bf20309db87
-:01c55012a17d59bd39e62b1af3649a1f6b56e1
-:01c560bc18079ca9085b7381e112b6b3114e1c
-:01c57027793d0b141f0835bb9883e4690f40f8
-:01c580b438b20c5ac50c36b0bc62bf835f74da
-:01c5902350efd939e2a22cfe0391054d4757b4
-:01c5a0e84f552d2914187a014d7b60c3da9a3f
-:01c5b0a78676a29d17690511722f20a5c6ea1b
-:01c5c001b8741837288dd73a95ba75c9b1f1f0
-:01c5d02879e890603e3966c60ddcd8fb87ecc2
-:01c5e04af9c2f3a9741ade6f4b979359c51041
-:01c5f0e95c8aebedd28e4234c0ab29dbd8f9a2
-:01c600122034b1fc576fcf54a70d6117db0fbc
-:01c610ee1f76aea17e44fe27e90ad654f121b9
-:01c62027e7f628cfb40ca3c165417a169fc2b3
-:01c630591378ab9791bd76dd076a5c8f86192b
-:01c640a42fda39a752796af95d295119c8bef1
-:01c650077dc20dbd6ae0facd2f2605e7eb295c
-:01c660b01e6960418a9a21dbd0de462f079ca8
-:01c6702d7674589d18f03e7e0bee8c75cfafa7
-:01c680b99ca2bb4d4fbef74892a6f965029624
-:01c69054af953f7f4a3c969b71d7c5b90789ff
-:01c6a06ee8209a021ee7cb0c4fa2daa38156fc
-:01c6b0577d167da95d790653abcb07d2d76361
-:01c6c0d6783f4e5be6855a13629943fd95e8c0
-:01c6d02ea7e78b037f35e37d738ee2ac0b1051
-:01c6e0bd356a257a2f01b3edfd05d893b121e4
-:01c6f0df460145de979485f4c7728f6d4e18d3
-:01c700e4ac9743a287e1906b4c2c9bd62f6d5d
-:01c7107ebb95fa37a46cc65fb1445d364b1494
-:01c7206e7998bc0bedc93e9148cbf45ab59f86
-:01c730e1629baf4251fefec08532f89eb593fb
-:01c7403989936b649c19a6b4eb9087f15bca68
-:01c7503ec29805c9409701a73db87a6b9e8fd6
-:01c760c2df13849425e652a71493e859902932
-:01c7707ec86ca216637492f61b4872a3b10fe4
-:01c78010e86f17b6a0d5e3f3cbce03c4957d03
-:01c79087205b13a77651e81d10e1be793a7e92
-:01c7a04127e6b28d936e6ba859b864c5c619d1
-:01c7b0a562c31bd7b49a430cf701d04490866f
-:01c7c0b79a236b41296185efb264ba7504168b
-:01c7d025eee9e4f6063b2555f578d7a2ea423d
-:01c7e04ae544f7fb792d95d7d3dda38055731c
-:01c7f07caf9c1137d8940285089ac53a8b2d78
-:01c800123087079f26d45af7abe2a0deab79dc
-:01c810d70f05146d29ca893e5b7952e3c1e805
-:01c8207f3a31caf894684a5cd727407e629474
-:01c830c7ddd2ed8be275c1cdbc94b9f11e01cc
-:01c84093e26e7f99131fa628a052590603cc64
-:01c85073ac2137e075e74ac2b95cca7431c09f
-:01c860966084d21d76b4bf38d8ba1c8740641d
-:01c870b770273b668c167815feec9c8ecfe2db
-:01c8804a06e0901ece864eec84f88ef3487446
-:01c890eb50021c1196ed8c9894998ab5631dd9
-:01c8a0c50e508606b79e20d982ef2774e42447
-:01c8b07e16b0d9b4b119072813ab33006883f8
-:01c8c095dd02bce025b1cac8300ec153ba8289
-:01c8d09952cdc7117c4a61754aa6d99da33474
-:01c8e069859b8077d1c782e11276cb7a7bd55f
-:01c8f046337c2629b2615b320fe4917f1b022c
-:01c90090d8e05afc9c6454674a70777b256740
-:01c91098a0ca269849fe8df042aca5fd281bc0
-:01c9208dd1451876ab7b394bd711615462a708
-:01c930e616ffb30fa26dd2a9713b0ee6b7bea2
-:01c9406628d598b971cdb6566e66913f3fa0b6
-:01c950b0b5dd3bcab1f427d64c3dfe0de1c4cd
-:01c96096a80d6048992f752f1e26fb6a36c7d7
-:01c970a66f1c4bdca4d86c3c8d1013e36a0c94
-:01c98086b858326a81b372cbaffebfea8412c6
-:01c990652a155ab5a9bbea1c9cd74dc5973139
-:01c9a04ffc0d73ea87ef1c77ac40f9b0fbd4db
-:01c9b08dae8cad0002acc470013271ae000439
-:01c9c0e40ec5a3a70cad10c2efea555f35bb8d
-:01c9d0cc8f725209916901b9a42610c276871a
-:01c9e0258bafba61ec4d2452c112d8991ab9ac
-:01c9f0eda29bf3b30b9823751a4220e9d6b5f7
-:01ca00df4eb287310830ecd715a59807edfadb
-:01ca1041df2ed389f6890577e5d72185d1379e
-:01ca209aa2e7b062dfdc31dc9724be680d8ff5
-:01ca30283a198f94795c8820030812d213d9b7
-:01ca4082566de1c1be213b3efeec21a7dd9c56
-:01ca5083a27839f9c79d094bd284839021f076
-:01ca60569ab2b511c1460ba20ced7e2314577a
-:01ca70f1745798173ea015778155a1b9f068d6
-:01ca802f7e58abb5161e974d022f13ee75f913
-:01ca90ee188be99ee7985a06a82c7e020cc03d
-:01caa045b3e12467fe620a5a07eae61dfa7b06
-:01cab04d8c98517eabea1f28571e50891a32a9
-:01cac0756a618cbfa0e335002fb4e0d26775d0
-:01cad03e45f032f91dc5c85dd78a19cedf3f55
-:01cae0ff37631e3180d1663e54f101e18b2de9
-:01caf0d941eec55977f7d641be9e9d4ca9475f
-:01cb00d39031ccabcc060a565c24d583311453
-:01cb109c0bc015fae3eafe16d68b3d5d0ebe5e
-:01cb201be28fee372b0a32d535afc1bc474192
-:01cb30a732289e3dee783985ba356ee10fbd47
-:01cb40a86382b21439a8e286cf10a22573ea38
-:01cb503e7970083e8c6850a95502ba57a22e47
-:01cb602f811c7b3127eedcca46e63b1978dbdd
-:01cb7081f5e45313e19e2316e0d81d1a75e185
-:01cb802193d6a27a9638bea821bb76509a73b0
-:01cb90b383311fa1c13f6a5deb9207ef104206
-:01cba024c597e9281210009a0dc15e6112ad13
-:01cbb0469eacc98318fce7008a0b1c5c3e424e
-:01cbc0977caafcac9e991f08921aee3bd538e4
-:01cbd07d5a3e3821300c33ccd617895206374f
-:01cbe0e40fe6bcaf8d68682c7aaec42a99453f
-:01cbf0060394d83f9f42a219d5aafe295dd69a
-:01cc00e6ee14d1d76857a35aed738348ce35d8
-:01cc10b496acd73cece309c9a4d7da1fa4e02e
-:01cc20ac463bc65c0804a2cc5e1351c7647add
-:01cc30f771196092f93c00972a49ebabeab691
-:01cc406ce7cadac817e790ea6943b8413bd417
-:01cc505fb316cf52c2449190356154ec745461
-:01cc600cb76c40ec954cf18de84b765959b511
-:01cc702ef7148a7346ec97dabd01d8526fcf76
-:01cc805411f4df66adfacd7859ba89c0065ff0
-:01cc90cf400f22ab102c82e34575dfd5b6e1b2
-:01cca0532436d823de683d7c76174ae9272c0b
-:01ccb071cf86ecb60e89b2152a5cae37492691
-:01ccc085956cfdfcc0c3581715e992a5aedc9c
-:01ccd0e5433573793ca89d0f84405677681e52
-:01cce0e19038514130a421b23a3cbe722a1837
-:01ccf06ed2e2682d80b8288d3ed3ba935fd09d
-:01cd00e9aad6d27dfc7b38daac21c010e50952
-:01cd1076b65f36e6faa7af31a4bd8ca4ef7b16
-:01cd20a1c8f6fc8de3e7cbce871ff8c08db2aa
-:01cd30307caaf0dc1b9b480c6624efb70c609e
-:01cd40499f87bf0bd4bf4248aa31e45c496e52
-:01cd50d88c43cef7139ee44ac1c858bb525c55
-:01cd601b2800e2af0a059e5895de8e3136beb2
-:01cd70a70a604988111b67bba90e19807fccd8
-:01cd800bc9087a3975640b2d618464d55f95a8
-:01cd90779985d4b33e0abbe1b238272dba0ddd
-:01cda0d2c321f8b1695d7a04b7a57b211866d0
-:01cdb088a2ee45bdf0fedf89c98ffc2ce6fb19
-:01cdc0bb31a0322b361bd79218092fd5a3f769
-:01cdd0bf46638a4175ec35c49c403ce6ace77c
-:01cde06c17e1290a28f01e526ac40e1cd19bde
-:01cdf001e8f9bf4833d7c82297646e8bfe0ed5
-:01ce0063345bea3a41c61a8e011083e994cbc6
-:01ce10862686b0fb17521e3c3a782efb66cba6
-:01ce20dd031e5bcd1ead4c207ce8468e23ade7
-:01ce301e3c9fc07fde536f1a2d5d1515f62744
-:01ce4003a3ad9b9c34824ea1c145b4c2ed3433
-:01ce502de8e6026face129ba97d280bb26f67d
-:01ce608612212169b6f43161235ea083da9b52
-:01ce70a5985acd199e3996e3e45c7dcbc05c65
-:01ce80214d080b53cda48f77c07384c8e7ad82
-:01ce90b1f84c4d1a089f5b4d82405845cd47c8
-:01cea00044264e0ffa196df962e751390d7e3b
-:01ceb05ab2bdcec1601c8538fa212e5f4175a6
-:01cec0030c74b64440717819994b4b3dcee151
-:01ced0239acec1071bf81141a4c3298b0fae03
-:01cee09ae26cc2b80cd927380949adf4490a27
-:01cef0c62cc2366faad8090d243074a9decfdc
-:01cf00113526e93121ed0183fc04a25c4adc25
-:01cf104c2098ccf4a3501205b8e7a18785647d
-:01cf20388eec0aa0f39db262970b518128d644
-:01cf30126467ac47435ebe0365f79153caa6a2
-:01cf406a259047451ebb254512945eb38a0c67
-:01cf50a52044c1345aac581ef17b965f1e807d
-:01cf601b021847c33055822a749b4cbbb265cc
-:01cf70c85514b91906305295eac38d53ecff8a
-:01cf80568643e0cdea25a6993185f30ee600cf
-:01cf904ac7efadc7ac3d0a4a4cb0cdc17233e0
-:01cfa0b9ac79a3cc2f87e829e4389d0fd4a3c3
-:01cfb02e9c283ee2db352d9593723381cc67fb
-:01cfc0f1c248e2a3050b2b3d0d6e99ee28fe08
-:01cfd0fab694540285dff2404d28fe14e761e1
-:01cfe0c5d15fdeb96c5f01f1bc243c57b3c2ef
-:01cff04f1b40ddf47cb69692f3b0284af812c5
-:01d000d6a291e06147183a832301c3670c13fb
-:01d010cd9052d6f561964286bc9e77a496f279
-:01d02056d9b0e52ffa477904c6774399e5d8cb
-:01d0308b18caf01591225d179c94403ce07dd5
-:01d040fa68b909d1eba627d60c5ba645020447
-:01d050efb974efe9babb2115838ff791f58d19
-:01d060edae49078a274efbdd97a8d329c61856
-:01d07079dcfef681b918c42be27a4e9585e14b
-:01d08076b714be30e383d7c28af4cbbeb94814
-:01d090a8de28f222fe834dfe2e6d463052f265
-:01d0a0e73d1b101bc8d61e501fedcd54840a14
-:01d0b04ace82bb5274bf35cc6f0669aaea87c6
-:01d0c070467ceed02e29f0f78b23211bc4b329
-:01d0d0c964c063b6f2e511180062bb228cd0bb
-:01d0e0cffa8a349a994c2abc342e1c711ac761
-:01d0f0ab4468ce2dc90f12982c376acc438e11
-:01d1002ce775aa4c08caf5bb74eebc82bb0149
-:01d1100d4d3564ef889245d161cb231e7ce041
-:01d12060a0ae361cf132e7864bbf03b7ae3e41
-:01d1304f2c68b63ac40ca52821ddbf46f3fef7
-:01d1407be9929539ef7932f54fc199d9f6da40
-:01d150512bdbc0ad06f12f78ce54d68e0a83d7
-:01d1604b10ec364145e3030cf263622abd8dc0
-:01d1703b531c725821780095cb045b385e5196
-:01d180cd466f0bc19ae81c89b37e762bdb5ffa
-:01d190a93f76413b87567e1816ce4088e00cc9
-:01d1a0a370952a23066c391128285d1b782c86
-:01d1b0dcce78e59c0bd09b003fd0e7bb65687f
-:01d1c0bcec0c080cc3714f40504c900534c135
-:01d1d0ce5ae5dd72029c002db69d7712869a32
-:01d1e05abdf40caf4fb91fde9d2974b7f9234c
-:01d1f0ba8a0e0cbb71a8094089ea5351bca00a
-:01d2006860238e7a307fa80a3f27d8110ad4ea
-:01d2100e8239a8e17f0b6b5d98191f2c3c1ad5
-:01d220bff1f63055603f8589c44ea0f334e1e9
-:01d230456e5003839ec2134fc97855f555b169
-:01d2407377bde79140cd88db3806690585bda9
-:01d25013f0df98c398dfd6d4f8629cffe1c8a7
-:01d260bbc3c158950e40d9a01ab30d689982cd
-:01d2707ffca20e1f5dbd371e7eeff02f1320c6
-:01d280931a7b6e045102336980a645cac87d8f
-:01d29021b30629945d0c4632aad6b04671a117
-:01d2a08e350ed464b03fe505d680c360d978ef
-:01d2b08e874865d9ae1b0c4325ccab03abb849
-:01d2c0bbb761de95f7ddda32f70577727d4aa3
-:01d2d03eb03dd31d27bd6e9a0730deac203d16
-:01d2e0edb555311af31365389c3bd2788902a6
-:01d2f09450c4c4e7341785ec40d6b4ab4ec094
-:01d300d5c2d00090fea9e8ad3c3af7c25acf3a
-:01d31005ca96c657691663833b99befcc5bfad
-:01d320d040af6ec46523f63d5bc8d04e6e8684
-:01d330fd5abc1a7a247780e4ff106d1e221926
-:01d3401c23947db488bdf1f5b6a0a091d2917e
-:01d35074346abfa8e060e14e062cbacea00bae
-:01d360bee3ad0cabd335a8772d5d833dfae587
-:01d3706f11a4f46ac507d174ae709259c1f420
-:01d3808f4f254d30ffe937bf5d80a9aabc6e75
-:01d390ecdb84c18495a3bc179acfd2d5de4451
-:01d3a01ac0569be53a6f892081681b0550c71b
-:01d3b05fe539f94e4ddc59d5ff65e1f612b7a6
-:01d3c00204a736a0affe5d7ed418284d5bca24
-:01d3d0c737dffd74215947b849258d7b15a812
-:01d3e03022c028f0936ddd64a1038c2f69516f
-:01d3f02759345173f468130444b5749062d474
-:01d4003b262064119d92cca028b9fcdef60648
-:01d41005098a5ade639ca7bfb9616a688429e3
-:01d42049d36d4a4e28934eaeb47ccdd3934042
-:01d430c1534bde86487dc2bd9b57bbd7c739df
-:01d44077fe9424a30ef2398efd2b91f94fdc61
-:01d450c5c50dd95b274d91662cf8c1530cf241
-:01d4607e8f5baaf975c7fbacf83d529b7d8247
-:01d47090aefb17eb7036b666a03bc45e6d8444
-:01d480527e6763050bf750333ee8726cc32974
-:01d490b34491160578934178d4999bb6825b7b
-:01d4a0f719f8046e654ea248003ade2b6a4f2e
-:01d4b0b33af7d5975e40490dbe6d84086ed752
-:01d4c036914effe91e7b04b6fe298284c0ab7b
-:01d4d0d15b3ea4dcb456b83a551d0e50451c10
-:01d4e089261e75235e82675cf95b6c2524169a
-:01d4f08badfc4bc0a2aa1372dee414fc0013ef
-:01d500e8ee876d7fa4d0befbb3d7082a016156
-:01d510667c9cc97892dbfd99c6bcb39b3f1f29
-:01d5204b8fb091ae9453b3ca004223b44c5f87
-:01d530bec1fdcd8bbfb1c3ff0f417c22c58b70
-:01d540f36b8215fe2666dee2d83e55febaf10f
-:01d550a79f15c4405187d523c149aef97eb24c
-:01d5601bfd730ac1f0b3546a9893a021b50481
-:01d57069e57bb386f772ffd81c7334ed8b3d43
-:01d580223fb6b2920f7ce7ab67c2e8bd4fa428
-:01d590fb503934f9f495fef023430e0858e9c1
-:01d5a00258b6d542f041de52cdb58bc29b574c
-:01d5b052c7a5ea37857001d8df25101e574c84
-:01d5c0ced03c4775ca170ff9c79910e032687d
-:01d5d0eb5d195743e85592dbb6531fa0f23d18
-:01d5e0ddd9a130820163358af222a7c1e580ea
-:01d5f0f3fdd51ebb6bc563e3528ea75b8b6a8a
-:01d60049af55e82abb11de35d343c81e5d36f2
-:01d610143634666ff0c3407770c4ed777db6cb
-:01d62006d44c3a75bbc02dbd115b14e4c3af6c
-:01d63041099ff16f721b266f6549039492215a
-:01d640ac00cc7b961a234ac22e4329434e34b3
-:01d6507a3570cf244759659b34d0e6bfac0f2b
-:01d6605e2a5c706de5598f4140d6d1b6cb2a8d
-:01d6702acd849c783d5b5088fc719d7cf783b0
-:01d6805059dc2b3aeec19e89803c8160f97d2c
-:01d690f0644785ea5e9c792c252aecf7a1e1bf
-:01d6a01d872fa9b40bc2b01eece1e6015c9f7b
-:01d6b0cf2146a39973ffcbaaa225b2fe6441fc
-:01d6c0a1a0484fa18e0b19ba5bc80e521fd603
-:01d6d0b39bdfd407b19d94f33b05f89fdd65ef
-:01d6e099e0b99e478bae0dda2f58867f2abc4c
-:01d6f01c20fb447438b57d8c338077c150447f
-:01d70027edc0574f5f37e5045d552d6b72eb3b
-:01d7105c4ea21141ae1debfbfd696ac6f20d70
-:01d720e0fa095a8c14d34aa3638bb90249cd17
-:01d73016fcbfdcb55f5a91c9f9a61bbcb7e1b5
-:01d740bc843507e19b36af3e9040e407b9f0fb
-:01d7500d22d4461384c3a6c7e20fec7e353712
-:01d760d06b4e36b344496b1241f79746e28ffa
-:01d7704c166433dfe684b280176663a5b77b50
-:01d780134d2b54c66801c6919449901092f2f6
-:01d7902b40ee145623ea0477dedc55a5c00f97
-:01d7a01f6de1f71bf1c257fd7b28f3cb30a2fb
-:01d7b055dac5483e31ac5c648954308bf1fb64
-:01d7c0e08b570a55ba8b3479075340adeff13b
-:01d7d03ac663a6af58ed85b7be16f101948362
-:01d7e040fc001460523f0c1886928f3208d769
-:01d7f0464505fb33f0bf607e8043418e418132
-:01d8007b9533860e2bd7e7d94988a01c09ef61
-:01d8103dc2d24ef6271f8c077d5aee0eafabb8
-:01d820a205ca8bdcfc29b5b47183e188502067
-:01d8304559442d08fc36fd19e31bdab0018778
-:01d8402191c9830b1ece7c6cd41f72335bc421
-:01d8504af6c0d6f4110c6f00903db2fbd8f905
-:01d8608898c29bdf136887f765dfc2ea04c766
-:01d870abdc5cc32f105d016c54db71d7a0d96e
-:01d880679376aa99f3ee74d4da0ed910a7eb93
-:01d890e62fa5664d74ded513be8531efef6bbf
-:01d8a0ef33e59621262b55cf4af239b4dad535
-:01d8b0d85ede8d7164079bfe6b2762ddf7680c
-:01d8c037bf830efb4e04a66efa6481ccfe27e9
-:01d8d0931fd57bdd2e662d469a35f9e08c8f71
-:01d8e051af4fd4baacd41fdaf6d7430583dfb6
-:01d8f07b14c20f175e049c8579dd6c049f8712
-:01d900f648570d270bdd3649454bbcb7c5f1ac
-:01d9108bf8d1dbcde18e64054cf2f4f8961e5a
-:01d920320695b2180e7906a879163792a81f00
-:01d930c21c48ca7d1780656d24c0e5b2940d1a
-:01d9405f40e75588284fffc63540752a94316a
-:01d950575efaf4089e8ea07076665989f35c1d
-:01d960583691b37569b58e96438db6397a6972
-:01d970a817e8e66659a5893307abe7cc348ee0
-:01d9805e5066d5abe3abb27517e00b69895cc1
-:01d99004741c224410c63305d4c6a3f8daf94a
-:01d9a01083e72b84c2d8962a677b12c2a018e3
-:01d9b0234d43a985aa3704d1e700cc21c8895e
-:01d9c0a3ab0276b6df1e0b82afec803101d553
-:01d9d039dd137286a58f484f2016de5d6c9eaf
-:01d9e088d1b6c9e00f9fedf8088286759e3cce
-:01d9f05f343ad390c37bb49fbabd6d49a1d652
-:01da007dab2f58d4490369cdf302c7349ebf2a
-:01da10166cd264c8e14380faf0e277268e0476
-:01da2009b131258069a50df000cf74a96023c8
-:01da30fa4dbd28e932f09be4601137b6174f33
-:01da40c302defbec72080fe4de997f1a6e88c0
-:01da50abafc9a2db70e2d3411ec01bf9ae9f11
-:01da6039374e7c058fc027902f05da17d5db29
-:01da70e43e9acdcc274f6f6f7160bf8ffa5ef0
-:01da808f062be8647fa3e2170b784f4c011c21
-:01da90145d0d77c9d63a3ffe0851c389edd968
-:01daa0247e71d0a41efd69cfb3f6d842796174
-:01dab0c57c55939b69e995bde283bdbc9ffa05
-:01dac0ee2d2c8d187dc0fab3ca5ccfc0f63458
-:01dad0d3be57a1b77075c9911958855dd445da
-:01dae03249cab77e7f0e510f75b28c43a7c8ea
-:01daf0d2f162159d548f01cee0e6eeb93248c2
-:01db00e72862647d84ed7e24f66824868c3d4e
-:01db1037820d6674581189e8d8276ea0ded0ae
-:01db2069ead1ef7fbf53cb87ab74195225cfb4
-:01db307b37d1c0b86ce117269da6ce9430a04c
-:01db4048148f3cc3b334d8dcbd8a3df427cdf4
-:01db506fe4a46028cb6998095b014164246ae0
-:01db609edf15ba779d313d2f0faf9fc0d2a641
-:01db70dabdecce206fada23c5aaf00aa4b3aa7
-:01db80c4e1f246d34b84190c383e0eaeb986d5
-:01db903a6ce864fe12af0a968441b6f157b9a5
-:01dba042a29e08cf0c98e3ebf34f75da702671
-:01dbb02e000f30037ea44434f17cbc2f81bff5
-:01dbc09252fde039da3ca05c147812a1b823f8
-:01dbd02234cfc6c474d7bf64908ca03a4141bd
-:01dbe0df24f1eda580a754741715bdefb85211
-:01dbf08b0337e431db68697f71b4841751e453
-:01dc0061d968d86bddc166e9e8029350da6eba
-:01dc107646e9991829e0e2919de3eb28a765d0
-:01dc206610aeb627eedcea6adbf22cf5d570db
-:01dc304e350621d9a9064c03cbbe083157d8a5
-:01dc400c554682a407803a755cf6a56a060b89
-:01dc50648a0e1f732454c667ade2a196a36fd0
-:01dc60b1ae772adcde155ad0c9f4229e74be12
-:01dc7046b33a9a0f17924a0f8f09bc5dc7b657
-:01dc80267aaa41b50be68f7bc5bc59ac8dc6bf
-:01dc90bf19c44062395b5f40187a432dfbab83
-:01dca0cad63fd03309950a76adf981b9ce5657
-:01dcb0fb8ad1b1f87087864654b2460c575d70
-:01dcc0c7c7041ba05002f7ac40053aa710e457
-:01dcd001bda394a7ab9d5a035ec64241027289
-:01dce0315a88eb8ca9f1646962e23dbf26ecb6
-:01dcf0204ce4db598ce505b2a6047ece44b621
-:01dd009ee48970fc8c21ecfa6e7be509d274b0
-:01dd10adcff50f42e61e63f9a6eac860de087d
-:01dd2092036196907dfad076b36ea2d0313efa
-:01dd309816b1525ea46ea3950083f2cb4b4276
-:01dd4036c1ac1c473b23dfeba828dc5465e03e
-:01dd5045a19bb6adf158019ef1fe8f1525bce2
-:01dd60604c763dbc06f83d02fde3cd72a2e8a3
-:01dd70e263569c06160ce5a657d8c8f831c052
-:01dd80935b726138e3351671eaea8ec025b3ad
-:01dd906128b8876664a8b22b538610c6b09614
-:01dda09e98decfb638a9df42963b539461c8f0
-:01ddb0cddfb3c229ac334a29e7915801f834eb
-:01ddc026a149a8314230da9bd6cf8cae2e70b4
-:01ddd010d2f62f8647eaacbbdcd7d03201ea39
-:01dde0be9a10029f8678f63fa5aaac83045478
-:01ddf0ccfb36ac24091d41db2b1ee6d9fdbb53
-:01de0080e484e029e225c3fc0577ee0f7fbff5
-:01de1063a449aaa35101c65523b8d6ca07e929
-:01de201962dd9203647691b0c49479781f9894
-:01de3036135d2a3e978017838fd5bdb4da94b5
-:01de40a61ceb015298f08d0e27d8fd29eb4b3b
-:01de50d2178953942301b825f139e9efec9a80
-:01de6008a549500fb768f04847aaa131198a13
-:01de709c26d8038b7ae1d1f2f655353d056580
-:01de80417c6fac8f3153523fed797f02611364
-:01de90b2dd801e78de02536a5068a6a7ed9b73
-:01dea0613bedbf3a09f5d75ff3b89d9449f48b
-:01deb08145dcb85043368533daf511846496b9
-:01dec0ad13fc49790aa96ac007ebf5e1daf080
-:01ded0a79d22b0723b07e660d27ee613d08630
-:01dee069862a4076a907aec47769fe1a6c0409
-:01def00686dece1d10546f6c15b3ac5a0308b4
-:01df000e4fc0c5af4b05d13270227fdc4571bb
-:01df10ea6387bed03450502dee018b33237557
-:01df20975b8c1306b5257360cfc3db2af1b6b6
-:01df30fc2c1ecc7ca0a430978b1eba265b6fdc
-:01df40ded6b91a882c449b63c27c3d3b1a00cb
-:01df50e4c4ed6104b68651570dfbe690a641d5
-:01df608cec68ff0098f317e377ba7591963956
-:01df708100301b4d034f389f48df6ec477143e
-:01df80200c9402b4c931a912375a50cf737b8b
-:01df9015b424dbba34e74e04398d955f6c53d6
-:01dfa0e172ca7ccf3108e599f89ac0bd573ce2
-:01dfb00155e8612f47d8fa7f90877187e7b169
-:01dfc0c50c068f251f5473676dfbe50f0cbfea
-:01dfd07ad03ef67738bd42ad8675bae4f20069
-:01dfe0aa8d0114e26f26774d54e53ecec75ebd
-:01dff083890666e8a83e6a5a2a5db01aee654b
-:01e0006989d5d539ece1850df656da0765efc5
-:01e010d7258b8a
+:0000003bf3d7ee45e5173bd2ba70dc9167c22d
+:00001059a541a042cba2510e498a01d336d487
+:0000201f2e706284e71bf0c738254c2bd59b29
+:000030549479a06e58210ae9e09e40dbf58680
+:000040411cc069ebf222fb7ba0d6f636aefd36
+:0000506eb8b962ef63dc61e32014b82ec5635a
+:000060befeca57c2af11e4a9117394623a6321
+:0000708e019704bc1ec8d6ee678db8e7ac6585
+:000080f8028ed021ce947641f6b10e9da0c119
+:00009018d34a657da63b8f4a91c56526589818
+:0000a0f6b300676a3e0f0831cc289ab74b6de1
+:0000b07c23c084e196b93a7bdde553765877ec
+:0000c0b8e478223c6ad968c4db795cdb32a661
+:0000d021e6a67db35c2ab57021916b00bcae2e
+:0000e02bc5630ed47d9c7a780ea5cdff5b1772
+:0000f0024fed5094cc0b9a40d86244f8934dc3
+:000100d70c619687309f33f37497b83ea23d2d
+:00011055a96174c73db276b702678ceca19753
+:000120c7a718a907bae46a29da4b8194ba039d
+:00013016d45fcedd369d8d65be297d697d7b04
+:00014088a42e1e4124cb5659a2b5fec3f03ddb
+:00015087a6abee2fe7cc682e0a85d40f08e776
+:000160be38c33b1dc31caa20a99b650b4ad181
+:0001708c32db06ea755db4cc40085ba4fe5e2d
+:00018092ec3b6d172e7d241bff8db54c348357
+:00019028b705bd350bbe9bcb117801594540f5
+:0001a0bb13e3cca1d8492d061d63dbf57bc403
+:0001b06eb2941743e425aaa90c4d5f0721dbf5
+:0001c0a9fd8b84072b575ca7142b2ada5aba1c
+:0001d019a825fb220be13991ba4354fa4d0f77
+:0001e07d6c618274e5a198104052b597c2722d
+:0001f09dd68627019b8ee2f920c19dfd1c46f8
+:000200c84f2cc46ea33042de94d748b803fb09
+:000210ad026093f03a5b90632de7a6cffb87a9
+:0002208473e1dad0df9a3ff5a25e2e4d00f538
+:000230466a5fd7535d0fcce1b12904de2ca564
+:000240b1d283e028d9d2576403e6a3be8d9aa7
+:00025002557fbb17181594c8a324f49d91ba22
+:000260102d1bb88568f1cdf5c0890243611a2f
+:000270b476d4097e37478ab14d64dd4143298b
+:0002806165aedd686377b4a5493662998bb682
+:000290f8aa36d55162e3e67c7f448322ef5cf0
+:0002a0e8589d998a765133f9631666c9e45947
+:0002b0ee3187e209869df46361327378a98411
+:0002c0899b98a4e440b597782d5478d99f3bb0
+:0002d0755b8b32bfa59c234b8fc8c6646592cc
+:0002e064aaa93d8706ec0a01e0d520578bdc38
+:0002f09a5644614b2fb1224d62b43b2200757b
+:000300b4cff0d61b32ceb3872306ebb3c2202e
+:00031074fc3a94849e269d801f96d727828e06
+:0003204cc9e9c970b71cb543198cd8da7360fc
+:00033087e25ba09bd38e05e89c95a210c675b4
+:000340ac078982b40ad8f5e17ed363753f6b91
+:0003506397225d1b01a2930284e135fd78157e
+:0003605bb93b6824aedb044f2c1af48cc79192
+:000370d209c8eb1b88b52761514916364500ce
+:0003807a2fb187f992f5668a084de6e16d9e44
+:000390036962ad375a3bbad56e3d7912f62f75
+:0003a069b035a14960030857f7320804fbbaf9
+:0003b03682413b40345d8bfac6988f2c982957
+:0003c058221bc2af0f2eaf23497d866a987f41
+:0003d0fa52432709fef2717e694ca3ed93963c
+:0003e078f82f9467bcf6f2318000bbad0da6f8
+:0003f0e6c854569e0201fbe356b7464737bc56
+:000400ebde34f0d2d309fbc682b3c8a0c3b22a
+:000410f4a500c3970133e11be633cffbd27013
+:000420bde031a69603059b6d0a2a2e4d04626a
+:000430a79dca60d6943d5f38dc2adea0cdc178
+:000440cdcf134682a5aeb3e394c7e5f04139b1
+:00045012a4a9ff077397bb06ae454e4927bc75
+:0004607bfe1329fd0b16ffc071580021d04341
+:000470517c8383e9075912a92738045a4ea464
+:000480bd110f65dabdc777513bf904f7821566
+:000490654b37c3b5e4866cca92c93a1ff8bbc2
+:0004a0650d6f0eaf7db350b489e34b8f202643
+:0004b06e1c780b9f899ec56f56c786fd26bb9d
+:0004c06082a3717bf989943d257a91462b67ba
+:0004d0c3976a53af20be50a414750ef6a33b7b
+:0004e02563ecae3eec8c667d8bed62b9a2dbd8
+:0004f06013e0d966418240f6759f9e9727cb42
+:000500c6303dd68a3ecc13777e55be85c183de
+:00051029620f22b1523184e646caa67b6b5d95
+:0005202f9477ae19f10af1a30ef7beda712c13
+:000530a747ff49bb09e6b5212895b9b7c66d2b
+:00054028d3d3ba6217eb64e91be2e60d912aa4
+:000550f9c304705fc3868985b75fc6835e1ec3
+:0005607928c1efc6da14c771544f7cbddd5b58
+:0005700852999902760d60827f6ceaae9491d7
+:0005805190525d9dfb743e4c4488910d1f438a
+:0005902af29dbb75fc22e132d16119658b08d3
+:0005a0c590712d31e8ba5d2456ad6b0b0305eb
+:0005b077890d5e849a7e8fa465f88fa89a2af8
+:0005c018bf3654139fe2bc18b560d8fbc70bbc
+:0005d0b7a8678202b8fc32d52da2e380d2bfd6
+:0005e0ebc1409109dbe37ca63e9b59f2c39442
+:0005f0b67876e099e4d4d4912a3da0bc588d14
+:0006003138e44c5053c39d6a5c4092680329dd
+:00061009571575518400955970d9466fef0672
+:000620df728968e12b44dd7e621eb2b10beeba
+:000630bb47649f0dba0354b118d76d75d13a76
+:0006402ab57e26c039810a35242dbe8a633b89
+:0006508743c8890b494534c46463670ae0a1a4
+:00066071ddb3e723b68713105e4b90d2965620
+:00067008b208d0f23bbe969903912b4079a44b
+:000680e1ebd35b2f2fd2d2606248d42b40d56d
+:00069037686f65f1d80118b39386ceea77f64c
+:0006a0e07e793d275a01f200c408b8a0d6915d
+:0006b0b883aaf3dfb6df00ebd5bb69e5bd68a3
+:0006c0ab2dae165cf6bb0f4f44d2b6d7498768
+:0006d029d16e95ef46eb93bebd8cd096e0257a
+:0006e080a1977ebe76d1e09a804cf58bf7ce73
+:0006f03499b157cde18299004f1126867aacde
+:000700dd35acd7a89624e5ec6bbff90d9dc47b
+:0007109789d2db4326d6cd37445fad19157528
+:000720fee2b651186c02c865521fb30a2561dd
+:00073019d1022ad6483579d5518477ab1e2a2a
+:000740b803e0765217294dfc4bb9b573df511c
+:000750873b01cc6df1cd7ade61b73cb6a0aa52
+:0007608e7ec717412de101af67d6dc40d60cdb
+:000770dfbd0638caedf2f6bee83489302bc05f
+:000780b70ed0bf89d27bc8d810e52841d61d7e
+:0007909e751199f51b7bf6ca815f58167595e4
+:0007a0ef257c841fbb2e0add9a3e0513fc9ce1
+:0007b0a70cbbd06cf654fb14759ca8c91141c2
+:0007c01821da87f16f4dcd1b160c4eaebce4bc
+:0007d04833183ae68fd9bac80f58066979551e
+:0007e02e70310e6f926394e1283038d7d79e84
+:0007f07245307733c666f793805eb6aaa1fffe
+:0008008cdba6c346f5a893b12da32a2d3817c6
+:000810001fc3a2d1312584c4b5def6503c2a4c
+:0008206bf22a7daa9ca21a419fa7eec0b16993
+:0008300c4c0fb47bbc7605f20d00f514e8fc39
+:0008403d5265dae2df4a0d54cca4e469ee2f5b
+:0008500f5032b9a94cbe8bf61946184b6c8ace
+:0008600a7bda66f3c28a1a7220ddff7ddadb8f
+:000870df3d4c5d62181fb95292ebd8c2275e3d
+:0008801f1781876fd489d899d9dfcf9b951467
+:000890f5fe51917c73586490baf6943e65ee9d
+:0008a0b8e0b18a52c1d102e4867ae56d3f876a
+:0008b065a3482c9e5fe49915d428bfa92a4fb0
+:0008c0db7a01a5b910549c457d8f3d3d57ed42
+:0008d01336a58ced569f8055f3104b4e2d4d66
+:0008e0e23441e6740bd3c9e215b0bedee49300
+:0008f034e2fbbd6bc991728b43310d939a488e
+:000900a4e9691510ce0dd7bd252dcb09949dd4
+:00091099f73698fa5d73702515989bdad6e237
+:00092055c8881e41bf4b86c57509761ff3eff2
+:00093038ba20c6ea5186cde1a0dd6ee88e8ed9
+:000940c8ead1bf4cf81a040ddd356b3bad66b4
+:000950b98bf2865c5b47acbb529a6e1d0fe8ca
+:00096087de75fbcb80dfbfb94ef67387d7d069
+:0009709efe6c3eee55c54cadb8942a0aa8f8d3
+:000980982e7aa3d66f3e3833ec34b81f8efadb
+:0009907f9d15a1ced69845c6fdb356a0a1e318
+:0009a0049fea74f68fabf50b8ec5dafe42e85d
+:0009b0d1f34cc3de0c9095574c1c1daf83d6ac
+:0009c0b6d02f6bdfc52a7c1d131dc05ab915d5
+:0009d046d1855d50f9197282bbb45a78b81b1a
+:0009e05e4e2996806c54ed86ec21368376509c
+:0009f09c8f33bdfaf1000b37507b2605870bfb
+:000a0071f50a5ba452febec743dcfd47c91724
+:000a10d8e4a477caf6d743502fd7c77403c19a
+:000a20a8fb226701e59f7e976dbd0a3247ae16
+:000a30e2546447ef69b7ab890aa0757730f564
+:000a40faf993fd126e416d313421104d65bfbb
+:000a509b7ca4d168f1444b5f31f5b829ee67d0
+:000a60186cbc0aea0f2b84d863dacfa768e2a0
+:000a703d464b4e24e7a70bf1c8bbdeef4b8f96
+:000a80ee540ae3057777e7c7e4eac9ab5e21b3
+:000a90c09f7f4f93f2e135b3e9889283e5007a
+:000aa026d2eb79fe3082b9ab156c2621f49ecd
+:000ab0cbb8034dcdc0e9ef47a4ba4e12d4ab54
+:000ac0dde6d80a19eb20fb18233f03152d9857
+:000ad0bb4e2c3404351c3bb890938211d1e91a
+:000ae051aed91b7b1f555cbfecd8f2000e8fe3
+:000af0c18f7eb852df4451b476ea1dfca44885
+:000b0015d4a69d5ce7db961878cb2287100372
+:000b107b79ce03fcd9e0d39832990a58af96eb
+:000b20288ae315191d916e74dcfde1690701fd
+:000b30171b16f81578ef412d92bb6d0933b3f4
+:000b40769ddfbbbf790f7559401d283e1b894e
+:000b50577b0e2866f924e13f1d2412d4542fed
+:000b6019529c671df9c37cc016ef66e69c22e0
+:000b7019603c20d4f69b11942c4e36c8408fba
+:000b8048769e39a447507b9b5e6f7aebf97690
+:000b90fc580247cdfc87b26ddbec5f6331f966
+:000ba0082bd4978fa04ba37f731cb53700f785
+:000bb0bb0a17d9efdca24aeba542ff11c7378c
+:000bc05a9d82934bf16614cfadd2ba01b619a5
+:000bd0acbe5e0df9808e7a5379705482d73987
+:000be0ad9ca5346841f6edd0eeff2f109e811c
+:000bf0633a9a8bdf3e884626ef6dea33e3d431
+:000c001fafa83d5850ca636c55fd1d4065a926
+:000c10a3a7ef0383f383359d347316942067d1
+:000c208e57eb3078cf64dd2059af4da6f09a87
+:000c300583a0a57e3bf47d61ed7d7e07bf7a69
+:000c40debf86c4959252b5d43c7fa8c608c173
+:000c502a0b83ab5dc6cefbfbc7afbadd64c30c
+:000c6066710421b3dfe21448764b1a79cc5e66
+:000c707dab6af927e4b747b324c8acb606ff18
+:000c8077139e571a079612bfc8bc0a5c71009d
+:000c9064efc4b539d37b46b7f82480d6afe242
+:000ca0f94dd8bb998efd8872cc7c89198b53fd
+:000cb0650d131cd6c597f7e5fb11c9ae95b1ab
+:000cc0822d7b080d439bddad439ff1b6514ac0
+:000cd081eaa8cd4e32e459ca31ffb16779ac05
+:000ce0f1524aeee8be9e3c57bbf4f2d6507c99
+:000cf04a96d98562eb64ff6e44250af41bf72b
+:000d0079f418b38fc5083a06c54a93c2e3bfba
+:000d10c75326405d1b4dae6e0c1473334f841f
+:000d2079bb22f3e794db4cd1ac0fc6b815ac73
+:000d30c4ba591b37d72fb706292200c7205d90
+:000d40754ef5d78ae0c97fc08962bcefccd256
+:000d5069a5af893dcf22eb043a5772d44f6def
+:000d60b571de73e9ed25d0fd7a9c499420b816
+:000d70ba49ca34551bc64d7d426989294dc0a6
+:000d806d242582e3c3ef38886a546101e9f8c9
+:000d904e5253a73fdc4e9a37f26810d3b103f8
+:000da0778e05e6591b737d806af810ae0ea22d
+:000db0e31b342ebac78dc6d5e39cc21c6b1419
+:000dc046764e8226e99697d6335bff7875e313
+:000dd033c33a1c6563cd23e94f30a0eb80ee3a
+:000de055151809ff01f17aaecacf86f5492222
+:000df07a1278b183f3c9846fb9ad4bdd5bbe7c
+:000e003dba18d5991beedf824b25769d366955
+:000e1038cd67d5941874f9f9f6e8476423a396
+:000e2018f7687b2353c34a66f5c2f8e644faf0
+:000e30cde55f5ce51ca1d10b2c4a4442601741
+:000e4010cabae6ed8d81fba9d13f8d0c1e4e40
+:000e503743756d63f30f3b3d861839df49021d
+:000e60ece84576b375e12322ff1336bcf6b39b
+:000e70dc53d77321616ab4fa3ded1750571554
+:000e80d300eb38bcfa7c92fb5e1c2d94906d5e
+:000e9064ba0f00356efba42f5cb6a53cbe2264
+:000ea0598e4a4b769e371199cd4d67cee8bf32
+:000eb0848ae093e156301594430026daf84706
+:000ec03c1b05aeaf994fa2d1f732ace0840c81
+:000ed02cbeeee15c4bdfae70dba2a92d57bded
+:000ee0ca1368474eef0da270d45cf1a20696e8
+:000ef06e1eca2acb5f2662cc9a6d852adf2ce6
+:000f00767c6133921abde018b2b57c451eddc2
+:000f1062527d462c40b999172c8e16d32da252
+:000f20fbb408d2bc9ef68c8d27167b0e9a5f5f
+:000f30a0a0955a7f3427679f4f7c750729332c
+:000f40e4b6ba0722a70099f10572be1bb9d372
+:000f500e5ac2f1def523638753c552d1948694
+:000f601367cf5380c81b6b1e1dcd25efc8114b
+:000f70fe2154c9c2644819536d8506750be81f
+:000f80fc31ce4305b079a218dd5cd295b72d1b
+:000f90aba3d6710a4b11f031085837b9282029
+:000fa0d4058ca4cc72475f4542aa027892fff6
+:000fb0a7a0daad5ad7bb4439cb7302655cfb69
+:000fc04d012b664312db75e21cc5f2d59b756f
+:000fd0ded72e90d0ee4b12c3647a07be7f9f4e
+:000fe0d77674595b39285f8485eaebc8a4c3d6
+:000ff0031524c92eab06f658f14c0b86376aba
+:001000c2ffdca873381cfb3d53a33704a0500d
+:001010b0fb5979a56d81efa8ed3233248afb57
+:00102037c99a9c4da20bf0bd65c38ba735623b
+:001030cc44ad5651128b9439794121c4264a06
+:001040e68b3fb64890c69975617023e9c4c2ac
+:00105095fad9248b8aa895208ce5cb87fe959a
+:001060494d4a87324540441b616cb52751b732
+:0010706383f7871d61b87923b6bf56ce94442e
+:0010807ac921898b53534db6d95f8e2180292f
+:0010907a081896cfb2d47d7cda6d6719494bb4
+:0010a0eb561c9fe2463259a5de92f9e3b26d23
+:0010b0659a8bddaac2540f9aff74d28aa9d55b
+:0010c0c04bb2ebcc6a3e9c3bace030572dc668
+:0010d0264c5ea2c0196be4e304bc55bb4f8ad5
+:0010e0c0cfce0d842011fb432aecd4a92e8cb7
+:0010f088e9390c957cd3e209fd36182ef58850
+:001100476d8a20614d58613dd81004e94bd555
+:001110b45cbc0964fbd7cec24aeda8b6a3a2c3
+:001120cdf0e06f854c9e801872dc705f8ae114
+:00113029dc7514754fc991499912448837847a
+:0011403abdbf9fc1328bc71a1aa716ef1d6148
+:001150d2ab95f0a6bc3a12a01376137f625f13
+:001160dc6f6691c9a2a2370c256b2d2251de6c
+:001170345fb59e85c4e7ab38898f4f290a143d
+:0011803159fce41b4cc8910f9756e87f760402
+:00119061345aa7a158a017421d280641fef403
+:0011a070a8877f29246a90f6626145adaef14f
+:0011b0f8664fe2d45020cbc85b6ca1c9252e2f
+:0011c059b1cccf7489c086b7e56b892e6f7ccb
+:0011d020063f29369ecf69ea9dfdb32635af26
+:0011e0c7755bae403018e5bb9565e953ee1e07
+:0011f0d35d7f29d79c8915f446aa9f161a7fb1
+:00120038f698789c9b26de35ef46bafcc4efec
+:00121060e53fd5f61a8b2e747715f0a5a8d919
+:00122025171aeb97fafee00d6c0e7cb7a17053
+:0012303775830687ab7821f83359a90d6e07a9
+:001240e3c41c4926bdadd3391acfd604539b86
+:001250fefa0cfb4929d28574d0be848fc99fb8
+:001260a08c904d744bd776028e98b4819ce402
+:001270f94c8d5536600268690abc2280899f26
+:001280b5dc92fce2fdd9b1efe8fe3554d02c66
+:00129050b92d88775535048d5f5910e3f03ef5
+:0012a082d7ceffebb60bac9c4026fc3bedd1e7
+:0012b06bd242030d15f4e7e1df8fbc25f08f68
+:0012c0b2cd06b77949225758ca46a55518e661
+:0012d0a5d04b84d165f31e4f6c0cbdff547607
+:0012e0203211bbe8980da4be48c1868efc90d5
+:0012f05a1eb4a0f945cf896024eafaab6b26ae
+:001300035babdd9f5f9eca50fc4ee33d8202d6
+:001310a9058af1c3910dcb915268e25ecc459b
+:001320701662f3a5be9ea1fccf52820791b4d4
+:0013305872132408a199238e98f7f2002715ba
+:001340c437f859c0bf59a99f114cd69dd67b8d
+:001350e539ffa75ae4c7af425ed62a322548ee
+:001360ef1b374dac875081f8abd7955b3e8ea8
+:0013706e6e063dbf22fb761fe975a7bc7c6e63
+:001380e1731e10334a7f23be8460ff94f93d27
+:0013904f751e586ae8ac4f5ef108d79d2c8ae8
+:0013a0b3d4758454a93105ea52e67076d2a435
+:0013b05666e3838fbc4313ca6bb69c326142e9
+:0013c06706a382da4fa2cef5b368ca1f0b363e
+:0013d03cf1e06481c1452ce5de5e2ea9450f01
+:0013e003ba45f5b711eb8b538463d5fa19dbce
+:0013f0d215a7ed81d9bec1a9d2b5fc3779c282
+:00140067cb8d81719ce8255ef96cfcf02467b1
+:00141063b1dd9ffe378918addf9421f78d2fff
+:0014205d54060fd1775c0bf05d799d527dd122
+:001430b70619d3d3f8473b8926a1b25e3515a9
+:001440d9dc9e87316a5138ce1b5ca58a58fa07
+:001450c5aefb20640b069ac48a1a40af477ab1
+:00146033392aec38198d70c608e409b2af5c01
+:001470d9572d5451c7e9c5fcc039c1fdeac34c
+:0014802cfd255945927c817ee18cfd9ab86ed9
+:00149023c1a7742a3b024610f18fcd8dd86dd3
+:0014a0fd27d87368773b94a04fbac0d33c5d43
+:0014b029fb858be1bf1cb16a74d337646240a3
+:0014c0a22c80d8aa9219aea8c1c57b2620df4d
+:0014d0e8775d01c7c00a8e41856442bd06a754
+:0014e090196896ca70c48f118d9f0a542fa2fe
+:0014f0e54e7e49523ba9b8bd7fdfcc47a8a987
+:001500ad27818c09f61500642c17ee1dbe7c6b
+:0015101148b1e280332af044658084ef03a8c1
+:00152084028d1b92f0ac54a228c9e267a7e2b8
+:001530b30bd4d8f364ad6e606fce3cade9e72f
+:00154009f100da648041a43e58c5ce302c52ec
+:0015503bdf7a1c99b58970c09e979aaeef700a
+:0015601e8455cbffe986af750ca15d3f478c5f
+:00157044b8c32bf2c3b59ba2da6757ea0f7b92
+:00158055180ea22ef5d49f45d0923a5fd24c27
+:001590090d555ca35576d292d21413fe42d5f7
+:0015a09f3a406c69631b330062800e157763ee
+:0015b0c377b9aa19c47ab2576381f516fdbaf5
+:0015c0140effee54452a1b3175e1afe866474d
+:0015d0661390b4e01b0ceef82b1763146cab23
+:0015e05a469b091f86bdd4c960f61c590defdf
+:0015f0992b1e54b3602a48c3c8b8d67aae5849
+:001600821f5b8142c4dca45ee974a31d61aae8
+:00161049f58391ee8e4a9cb5cceb949265b3fc
+:00162063ef5f43ef27e5a93fb3a5f3f762ee07
+:001630b83e5bcd098042ad23185e784c20b73b
+:00164083ed61a252cf34a43539ee8b263d63c4
+:001650a32ba562b0dedb78eebdb71e7c7f82e4
+:0016606afd70bb99ae2f1834d497908d305de7
+:001670898d50f52cb5773a66cf934c6cffae65
+:001680be32a288d5131f8cc7653a1b0a7447ab
+:0016905a85ef4d6e29de64e3c65b7e46849478
+:0016a0c59fd679221c3249e8362130574372c4
+:0016b0bf3c117b0937f112168043158af4f536
+:0016c06a535e79f8a7111c9bacaca3e95ce5f5
+:0016d06cb26938668d04aa9e0895f4021c99e5
+:0016e00f3d5916fbfe47d645d1dc57a569589f
+:0016f040052a72c5311cda3d6c85aea2d20c1a
+:0017001c1d881b23b46e40a842ee6d1c89ecb0
+:0017107c29e8670a4cade269923700cc6640f1
+:001720f868c1f0037af02f3713fe3b665460d2
+:0017300c0bc3eb93c6ff750b4728ee9ce8f2b4
+:001740ee68c4fff253f5ec442aae998bf51f49
+:001750328d5fb83fbc3949ade1148485858819
+:0017600b05189db8443ae99d10b0519e4cda0b
+:001770dd56aa7f39e63a300154a42d063acc37
+:00178094bb9c22587eff726c7ec51a17724fb6
+:0017900284f6237683353da6309533bb257644
+:0017a09a1b223aae9a22ea81677c52b1e322c5
+:0017b000635e69be1c964aefc71e33d3b9ec21
+:0017c091f673288ed20b72e96c3293b31812a4
+:0017d038008aad0f6f612b2b0db03211fbdd7e
+:0017e09ca2d2e46077bb9c374a12b81e4cc398
+:0017f01c06d7f42351237f00cb3b972d1e5ff1
+:0018006ddffe8a0ff3f774293d6dbaf5024140
+:0018105bb7f5d9e835b9c24968ef851dc389cd
+:001820a455b8bd7eb9890570ab06d49e2355a5
+:00183029e1f056eeb9b236287bf86e21242e73
+:0018405f565135b12d945bab01eeda74dd1d5c
+:0018503927eecd4f7d22ce0792687b5b436094
+:001860178253f2bb09b802f2bf317d86564c10
+:0018708ac38a0c5e315e569d3b8b6ad2e66f8c
+:001880cf97d39d8742fb15cf53bffd7a986160
+:001890d29570614dbff5503dd36857af100df0
+:0018a0b410df3bcf484a5d30a24eda67916d52
+:0018b0f532210d967c197673f3aafe774c03c8
+:0018c0b597941e80bfe71dd71c390cb0c66aee
+:0018d086ac8496f4fb52e4a7fa1a2a8bc2e471
+:0018e0dd98c38cc23a18100775fb1fd9e97d7a
+:0018f03cc5b34858a96edad489380a067a89cf
+:001900831f669bd10933ac567c695923618cac
+:00191034982cebd26b2bfa5eda6bc278a47189
+:001920c9bbe05710a81a644a930af8ad1c10cb
+:0019302e226846873de650e624400bb0eb52f2
+:0019402b5189e0aa6befad6cb554edaa50703f
+:001950003c14d84ea2642a7aa135c3654980a0
+:001960052f04fd68088f6eac28ad9ea55f6b37
+:00197068b6e14ef7ea175d8f1e3eb3607f104b
+:0019804446a410396cf470c94a61b9a90196d8
+:00199008adbf99be2760034d4ff4c87105960c
+:0019a0b63d502a03982c57c7446b0b6e716237
+:0019b034653db1a68fc02b8a049e293a334daf
+:0019c0a61ae990879c60a7844a02ddc24f84cb
+:0019d0106991e165ea963f34c0f658b1cc0e80
+:0019e069838f9e0d1c5d3b3969bdecb753f379
+:0019f0a0b0a8b877d5a8ad372c4a5637376ee6
+:001a00aedf841695e1a522b4c6a88964b0b388
+:001a10e8881c2e6476aefc1a62b60094006b4f
+:001a20c37409c2bedcc689d1608df8b310fe77
+:001a30ff285af5f3599f9ab4dcbb1fa3415f18
+:001a40851498215936138a6684d1d53c7602eb
+:001a509d267b39c471397de883b5c3c6ffc347
+:001a6020ef918241b8ea2b02134e69a88b53be
+:001a70b73e5155c07f2d216a9f092eef293564
+:001a80e02fd8a881c2e896e5dbc9626ff9c1ec
+:001a9011c2755c2c01acc05d3c5a67725aaa56
+:001aa0c0aa7833c44e6776e2f1f9a1cdb71138
+:001ab0327d5ea1db17097f08546527c399f8c9
+:001ac0138214550a722b655afd15ce34537226
+:001ad0b18c9817501be1c0c2db994c2759c330
+:001ae05aa2e76d24b7fd847bb7b9071c3f75d2
+:001af0bc976a21ec930f31ea004ff291a38688
+:001b0050fa00d0831fe3c1306483e61984fb6a
+:001b109fcbc606fef4c423ea3ea8330a636330
+:001b200c476d701fa6077fc5e80f36e1418632
+:001b305d9d980883116bc08a86d6baf72bc616
+:001b4082e277b3c7bfec7b8afc53d0eba43076
+:001b5063380377b71888de6b51895a76c29955
+:001b605f95d41f8b49b2035886e802f45df782
+:001b70a252226fa9a67609b23d851c2cc09bc9
+:001b80112db4ac1ef3eac7d0e424697a3f3b94
+:001b902c342d146a910dc4150289d60c9ab97c
+:001ba0cdaf3bb5ef8f4b1e27564f435585699a
+:001bb0727a41d8535eca686d5d943a63301567
+:001bc07610d75003ad52d88331abf07231f81c
+:001bd00bb520b2d4dad341d3fe7b390a52d41e
+:001be01d1eee7abebfaaa498b4cc83d2aea2f4
+:001bf00710d4016a158fbb0d30f3234c4c4ddc
+:001c008cb2d7e40be144a17ea827f7b41f48eb
+:001c106f8c222fd703db0e784ec79ed98251b7
+:001c20bf4def9f91a164cf73c6dbc1603b6001
+:001c300b5d3c5f01c003815a86464b62382e00
+:001c4038264183e59ffe829d2eb59f992c62c5
+:001c505b64053c352a5c34773de9c44a777ec7
+:001c6054226226622450687b2a57f1a20ba5c6
+:001c708369d0076a7a0b77481f1dbc79366013
+:001c80e8c04cce021e8dcc35112a3749e19f12
+:001c90ce4ba6ec22f4f18a9fc0a1b4d57d529e
+:001ca0abba213ca6e18260779e79e7cb27bb75
+:001cb02ac3ac4e611bfff95c9489d9d259186f
+:001cc065604bac2e1f8fc4261f7306c45170ba
+:001cd0d50c4297646be52c051a708c968041f2
+:001ce044bb6911e5c81b212ee049d3fb3f32f2
+:001cf082028635b961d55f4b1cc2e674fd43bb
+:001d0057749311ab59e103c6290fa562ece3e1
+:001d103e317c349f4130245a433b5a65e10d24
+:001d2081ef394adf2376e0fa7d74711241b5b2
+:001d302b8d544941787da09f48223b857fd013
+:001d408279beb1dadbd7defb7785a0507c2eb2
+:001d5046cf0063451bd43c172d817df1ccb68a
+:001d60e664bdb4fba463dd1bb718305b7c1528
+:001d702934269e524f41ed38c650cbbdbaa0ad
+:001d80affb6e73020a551dc200821176c96527
+:001d90216f8a3c414e67e63a653a05bbf55aaf
+:001da01a4b89395a2a73f63e7f95bf5006654a
+:001db0bae58889389c80fa11735ef4fec6497e
+:001dc09a061ed5661a8f3f9d42eb8c4ff05334
+:001dd0d9e1ff1881ed0c26001387c50185bdb2
+:001de03a99153b462b53029824a7f781781f99
+:001df02dfa8941db7362a0d27a2b15a878321a
+:001e005fa11336f8f1214905302062ae151a45
+:001e10edecfa59d93c2ce06e36852be5716b45
+:001e20569a61a8b7b54379bb030558b05c8f0e
+:001e30f8ff69020e23144b2b4e5e48073f8502
+:001e400d0bc6baa94bd9aa3359a3179fd2ba29
+:001e50fcf628934a5b261ab2cc67cfc51f521b
+:001e6055be8cdd3b2c933121b38a4a92710a64
+:001e706941100a4ae3f1c3f1e6874d104cca85
+:001e80df975cc3f1048846f4667b8886efbeae
+:001e90dadf4dd65e8a9d84de78123addd41210
+:001ea031cd86fbd9163e0905d22ff0e128788b
+:001eb0a5cd620703072211773fcebbece50d8a
+:001ec06860105422f54d51c2b0e8572861d002
+:001ed00970e8180744f1a5844425b29b9e14bd
+:001ee01ac091c95845aac0619b020c33283903
+:001ef0e785a82ece9a8368b277cf8cb22be3aa
+:001f00881a00da4582892bce76abd76cbde88b
+:001f106c44b494f78bed820bea52cf6c616a3d
+:001f20a176a10b20e46aaf1272a5a0bad1be58
+:001f30107c17273fbcde8d421eeca92cfb6d16
+:001f400ddf01e5490ae27640a471841f881e4b
+:001f502c4b3ec7e936dc52bd3996fb7a730dbd
+:001f600a0b29bd77d1e1167ba5cfca83a517b9
+:001f70eb31c76f45374c7dc494eaae64c7c88e
+:001f80f5f9727f885d73b5949774980eed0ef6
+:001f903644a6436baffd4fc123e0c9ccd25862
+:001fa00b3c787d45ece4eec9ec7d5b9e31b4f3
+:001fb04fd9cd4363414765c9b44687e63f7fcd
+:001fc06edabc9a9825048a2cc4e2f5c0e94db1
+:001fd09f374284a9835a8badb904e4d7fe082f
+:001fe0a739ff8a1bf2b049370c1b87dcbf073e
+:001ff09521e73ad6085c4a1847e5640aa8d2e5
+:0020008b542eaa32b78929c00db8ebcadf2d89
+:002010713c00dc90426eae556fd779a26d5235
+:002020abd6dea02cd4b916c1562c2baf0f6d6f
+:002030ec1d90dba438c7c1910c9da4aca28f4d
+:0020406d01b7dffe3936fb4f3bcef496faec83
+:0020504b1eec068e31e75a5feb572a2e7e637e
+:002060b1bb1d605ec19294ff0586c9e4cd8bd3
+:0020705d281c0bbab02d58260befebb31d4b57
+:002080b8582c5f9d62f26c9170a9ee8cb6ce42
+:002090fced5394bd33ac0a5a86c25938e18c83
+:0020a057ec24f9b8abd35b45f340c871dd0bfe
+:0020b06427dc808f3ef0c511696d10bf766173
+:0020c083b91f88f7a053732b6a0585d35c6190
+:0020d0efac950c1bab2e34ccf46a54ed5676a8
+:0020e07249d45343193e7b89f6f6de781fb73c
+:0020f0efe1107eb6a2ad6d31386cb1897ea68a
+:002100e8882920f1cdeb2b9775c094ae0c0a1e
+:002110f7f57c48f8b4592379e80e29cb1ec748
+:00212030b67b3e1323b635425eb44e91a3c68d
+:0021301a353633ef5e528c33ce710b956e30a8
+:0021405ee2c1f8b743f1d6468715aa04689c9b
+:002150a41ad7edf525e97da15e1d315666f06a
+:0021605dcfa5fcb9f603d65312f5abbc9fc204
+:0021705768f66a2f71871d7a21d8e98d986cbd
+:002180c8c35679eeb2d885f87385f3f6de1e2e
+:002190145dc17aaf2938ee581182724530ab2f
+:0021a0a7436dadb90832b4fadf4e49cfd1d82b
+:0021b07f348657a81e9b05d1fc949aaf360d73
+:0021c06e743ee7a129fc573ee888bedb35b08d
+:0021d06198b165b545db617fec11156aa8d5bf
+:0021e0eebe2464426fa8bbf74549ce9ab1763b
+:0021f0c99fa0508ccbdb55f4393b92e2d89fa9
+:00220077427527a8513f5b28581cd92a8985f2
+:002210271412133a96dade42c9bf44afe7a9bf
+:002220177a270780144b5969c4bfc97c3312d8
+:0022307995996a48ff8de54fcb281d24cf726e
+:0022407d7389bdb375274a256e307ddae19f2c
+:002250171bd553d9b01ea6d28adafcad958824
+:0022608ac4f5c63d8e8aaf1208c6b003b141ab
+:002270f015bb43f7e1c80cb6e45883c8f17c97
+:002280619930e146757e6c4657f6f54a9289bb
+:00229096bdadb64f2f495c716bea3ed0b1fba9
+:0022a0fed7231772c1c1db2c6c066900ae1701
+:0022b0719a0f617fd4b63debb0f22f77d6d234
+:0022c01c4f42ede9d7385cf465475d06da27e2
+:0022d0e71750792e72c070c190214bc0771242
+:0022e07a8df7cb25f10599fc94117fc38c893c
+:0022f08e638ab854b96d89314fc2e8a0d3daf3
+:0023007fd4a0361dafccbd78767cebcc5fe27d
+:00231044f711b2d3d14a4bd6e77103f815cfe8
+:002320bc27947f79fea6775323033c1e9b8aee
+:002330a110b6a3652662275166fb25041b4ea5
+:002340831ebfcbf5eea9ad9593b35474c24146
+:00235099115d7de5e9ea7d3e2e2f33b11b1cff
+:00236059ab29e7a9777350879e30a52f307ca1
+:0023708852c57d4278997e741447b863658ce4
+:002380db811aa0b51a5cce432f7d64c1eec1b7
+:002390a8f6467225aabcd5ae7445c70b7ba1a3
+:0023a0bd73b28b7f5da524db4f06ae6bfece33
+:0023b080acdd62b71e7cdc13a1b9be3464d88e
+:0023c095e9d5bbd558800bff17269770011140
+:0023d08befc93256526ba53b3e0440494a7be4
+:0023e0bfcfcd9101c828d3c85898c5c67541fb
+:0023f055739151eb39564b26186c5454b1a479
+:002400e4ba4876333ee73499f66fe31725d57b
+:002410e13d06b2027de673a2729dd10fb822d7
+:0024202d24fdc2e73de176780374c9e1d0ec79
+:002430bd4648ef4dbe861b289dd5df486691fc
+:002440dae03b43d2edc757dafbdd3d5d1ba84b
+:002450489c2aa9b5bc882cc5682207fb502d9f
+:00246019ce1ff6c02b84234857c7ccd40364dc
+:0024709f14a66378c69631b14fa5e46e244e93
+:002480c4d6b35bae44b82716e3874db3874913
+:002490f494075c8b3e8f4791fc098679aa09a2
+:0024a084692845492080e9b42a258937a07ff8
+:0024b00d12bbe610391f545cad328268f6fe66
+:0024c0a9138d817827d43d31523ba567a2eca9
+:0024d01e9a2a1ff0c7617b882deb0b41824c32
+:0024e0174cc5213970132431a0a9d73a1af6e5
+:0024f060043bf4a418ea20f45f68ff5aa4db83
+:002500cda887e39ac8bf4779106b50fc6f2cb5
+:002510de8f272f1c0a86ce638b5f9151dabf59
+:00252021ad13df5032882a26c640bc8f7e2207
+:002530ba45f1c9d531ad3ca6b8e5043abf7d66
+:002540f515f700e9f39b72a04014914a3fc101
+:002550168e0666ea3a223895dd02c71e63bd06
+:00256048711fa0f91765df02c564ccd5b9406b
+:002570fe128ccd890981490a3ab914f4cda0a3
+:00258013b45859caee8a02a72a40fcdff9e705
+:002590560abe3c7ac25c2fb4dec2930383f613
+:0025a0376ad44f0a8e933dc6baee95a575ab60
+:0025b088a8be0c1aad8dc900ddb94e2efd6309
+:0025c0af954eda603c51203c473174ad0d8e69
+:0025d09cf22a1e08f343e49b035f0aebda8a3f
+:0025e00af2f112d7f13bf130de6018685f3ee9
+:0025f0254e5a52982391f1355461b319929058
+:002600b0208bbcdfdc465b9a958de0483c3ee1
+:00261086eb41005af2aba53d0be909b408fda3
+:002620f940c24fa4fcc42be1661105cc387501
+:0026304529cd58906061878cd0b08f1ed51b46
+:002640c2e01af5552cc99c0accd253871d2420
+:00265014958a341b8c2c74d7900b25a935d961
+:002660b5aeab59c38a663556af245d34066dca
+:0026704e51a453eeb9bb06417d571dcac73fd8
+:00268054ae558fdf899efeb4051c54ec939eb2
+:0026901cc6a3809ffb615a88a596fb0504ef45
+:0026a001ec0b7af4e764dfd167e91bcd26ae8a
+:0026b0b599d5c0ca280c220de9299c7d6405ec
+:0026c0c50e9b9501b9c6f97a03e8d2f47928e8
+:0026d0822ce12a82be1a485b9bbc4b56009e19
+:0026e0aa14bc39259d298fdbc17478db251db1
+:0026f0f5c4a987ad156b99f6420a3a8e85ee18
+:002700c83ca126cef34ee5fcfe9b00398c5324
+:002710573ed8b80c47b34e52d80790806fe440
+:002720a1dd4fdba86cc7860848fb86673bc896
+:002730f83eeb211e7f25a5c077eacfec41f90d
+:0027406e3bb42dd853409433c8a66b63cd8b56
+:002750dea6d5754cef3bcd323d7e743519098d
+:00276046577fee1df223f925f4068d2acedce8
+:00277070b556d2b3d613527c7d6e0e096c694a
+:0027804d82169e9ca5b2964c777cd1323cfd8d
+:002790a452c7761906aad4647c45bda0eac263
+:0027a0d3b766eced4b37675c5d1a94a416d016
+:0027b0f4e006b3d175a3ec8889c697a8f7efbc
+:0027c0040e435ce3853b82eb814d58857b8ee4
+:0027d0cadf80f34d6741f4b3b3a6b77b23acb2
+:0027e0922cedb3dca48eb523e45de989711b81
+:0027f024a36fd31e9511330aec5482f122f942
+:002800f8c14d0d20a5292f49ef1f0c260b3618
+:0028109e08a282f341a46549a9dddd777bc563
+:0028206a570f599ae99065b86dcfaae1968548
+:002830941a64e090337b9ce44f2333ecebc5ea
+:002840a4dde17f6228e8291bd0aca3ce7167d1
+:002850701eda4dad798508fd6f69e104a966ba
+:002860ed40d8e252565b0e119f9a15d717530b
+:0028703eb88c369744da24baf82c88e16905e9
+:0028800b3b4a7df3a3c2d78c87aa1e6dfd78db
+:002890e1ae2f249cd07c678c6f1e19d3a9c49c
+:0028a0c224c2be8d0c3d99b0228f72a28faea1
+:0028b0bca8b57c7f1caa3eac5a0f8024897dde
+:0028c0037aced1da47f51a25eea51bf1950e9c
+:0028d07a159ab03833ab6e66f2dbc17c74382c
+:0028e05cf5bfe1233e78d908105ffcd52795bf
+:0028f0dc772f772e518403299d673380d222ff
+:002900b9c78030330396594ad7c0bee73fcca2
+:0029103a4da575de0208b6ecc956accbf1166f
+:0029200e397fae5961a757df2f6dcbd267afec
+:0029301af9472629844cf29ffb20455764f60e
+:002940097e37684a7df77ed818c1647873bf08
+:002950f9183a98b58cf51f26111abb76942b6c
+:002960a17bf60627641bd60c774475036a6f60
+:002970238c7d6432ef9d27931b5294806fcd45
+:002980ef37be474964e7701558b20a0c6ff6be
+:0029906e7f8dd8599e47add7676979293f54c5
+:0029a000b0881d4d55aa877de198ca8b0e223e
+:0029b00951dfbb40540996db5f93a779cd4d4b
+:0029c033465c86d1f043b6ea99f18a9a7d2747
+:0029d0a298a462be4d25063fb1c3bfb61fafc0
+:0029e0b4aa8c6f6040c3dbafa002475b2162c1
+:0029f050f10090cfacd5601ef0d086c1be51fb
+:002a004a2ebe2677cbc15dfaebf61ad5b7ec5e
+:002a10a9b7cc7c7e38547a3f355c0c1de1eb0b
+:002a20515321d6503e5f91100d4b633743a2b6
+:002a30dd8dbf81bcf84dcae3ef2fcbe3c22996
+:002a4061dcd1857b1667a575946e2c2a433126
+:002a50259987c4a77b01ff156ad879cff0aae7
+:002a6090d8163884a5e7766bc706f7cae565e6
+:002a7053894f3c0ae72f0349076ed3598fb6c9
+:002a805062910ad17875ee297b4186f4078a55
+:002a90ad7982cc022bcc3f167f644783c50621
+:002aa0cfbe486be28d2140ac4bd91785c474e8
+:002ab06ed6510d97c19f2baa10b68f5ec7784a
+:002ac0e8c7fb72af332e248c15da09d4bcb092
+:002ad054b326dfc4e08e6f3a5c78259495b761
+:002ae0bc8aa7398c2ddca71754ed9c39d1d696
+:002af0333d57de8a1da23e4f1122e7d4d183d8
+:002b0025c22b3c6f1cd047b882e8bb390e0461
+:002b1050fb5fec6a8c789dc6b8cd919cb166e0
+:002b204b88eb070582854999c041625360f553
+:002b30a51ae0a14e25b0c18939b6d030c0d18d
+:002b4043dd95e6d975223f8cb334b86cdfc7e5
+:002b50750284f365b992cc7c9b6e83c4317ab9
+:002b60664a24f5edd36ba71520a105a8340fb8
+:002b70621d392dd29cedbf63ca81a0b8440255
+:002b80fc9648473253bdd2557cadb03d2c7074
+:002b90d21317a69c8ace813589f806a8f3317a
+:002ba0212b1e893e716f01bf46c21cbd60b442
+:002bb0abe3fc843baea885732cb864ed6bcbb4
+:002bc0b693275e7876e2b2f5f176e31e8ffaae
+:002bd09c7ff274f9b6304e33fd37f4beebfb47
+:002be0d040b7a9fff680efc84e1a7869ff32ea
+:002bf0e840465303b75c11ba2d2900420454e8
+:002c00b53f701e2a7416a9d7fccd529aa27931
+:002c10f6e76f3f743c29461a5b3e9398f760c5
+:002c20eca1d115a09885400dbd4be090a40f37
+:002c30d222f9d5906e31c8830fe8b559743c31
+:002c40e4f78605660b55c0baca59a0c555a7ab
+:002c505d418dee67d977fcda8d42cf95521f8d
+:002c6076a909fdd5c50d265a309214a8ed9dae
+:002c7095264c77a04d6f5e018b74acf0a0430b
+:002c80552c53066859303299df41960af5df79
+:002c907a53034c6532eef4be17de8161a38491
+:002ca0ae53351650a4678a93bf6c0aa13bff70
+:002cb0a01fd2ec49293217bef3a88d0d135f7b
+:002cc0253aa0c3d3bd92cd0d2108eef42e38de
+:002cd096a19d72d8809f27bb67c65380c93bc1
+:002ce095f0ad0291145c1677325e91d14987e4
+:002cf05eb1cc2da212636d362f843eaf3c0187
+:002d006079932e8238d06d5b354f80afe492bb
+:002d10366bdcefe4af7510d2bb1072e87dfabf
+:002d20ef33d334be4054227239aaed8e700bb2
+:002d3091b2a1d94513d69eb59bfa332eee9088
+:002d4036884dec4d9808d269bec6e494048a68
+:002d50ebc5e4239520b14331defa599534b9a9
+:002d602a7394c0d4ed955a8ca7a5bb9f6c1efa
+:002d704deb678f9f08e1b2d79fc8a28dd6b73f
+:002d80257d9e40430b48d40f6390189cc09afe
+:002d90edcaa9374e0a84d66ad940c564594739
+:002da0b66ae27e82832f52e0c8f7198e46c394
+:002db02471397713aec85fb5056c157c127f18
+:002dc0e76c1a488b546755fc3e5115c098167b
+:002dd01d8d26b2de3ca197598ed9e58c0fed14
+:002de0c3b96a21957235e9fa9568997057be3c
+:002df0d3980c45591cb79f9816dec69258d77b
+:002e00cff7d12ce68475bfc54fb79de1a13af6
+:002e10b6e82ce0e8447b44ca27a6e60ddc0571
+:002e2097c5a609c6ebf4d20661db8721daf636
+:002e304a784174cd4eec5ca8dcdbe3cb62aef2
+:002e40ef7c172fd7ce50f83bd34e582d61f9bf
+:002e50b2adf268f80dfc42a03ad64f5e4801fb
+:002e60689eea5b33f4d463744df6d2e86776e7
+:002e70fd9c2be8d57bc589681c45d2d8b7b0d7
+:002e80a22921d1861b372bbc1d679a28615780
+:002e90581c4b4e66ca43b19cf3de6ebcf48940
+:002ea04a5147aa3b07e780a1253bbcb1be669c
+:002eb000a64eb968dcac8c0178a956347db066
+:002ec03802847074916a2b94e881e4612a96fb
+:002ed074c87fb3a88e5d1f2cb00bbf01908cb5
+:002ee0a3f6cb586c8a858123b7fca84cc62b8c
+:002ef0f029cc997334315e79893cf91a14daaa
+:002f0077eec05c479c15137a0a1886f44dfd78
+:002f102bafb87871a5d20bf9988d2dbabeba5d
+:002f20f8959028d268424e877442a2547e32c3
+:002f30d5888e3c5eac531c6c34d6ad671ce5aa
+:002f4009c9336124908918064a7d8df872e48e
+:002f50b83a993dbaa97a319771ff30978f780c
+:002f6019df6b730c0ff624dffc7ff4938fd7a4
+:002f706ef3327f49d92a6f20faa6f02259dcc6
+:002f80f39a90e93dc9d7b34b51543d5601404f
+:002f90ca054c52e841416c35e30682c16aecca
+:002fa0552b66eb3f182de6c14bb8ca9cf7238d
+:002fb005395028c23aa627327eeb8b3632d423
+:002fc01094a3498eeea24adb4d852b92404711
+:002fd0b143e17ae5ad8d91153d24e17f2ef403
+:002fe0e3a056d527c9262569cb3f1f6097ff5d
+:002ff08df018c9601ede735b6905c818738cdb
+:0030009515565c7765d2b62a083d648b97e085
+:003010dd03eac5f206eade090c594cfa4a8ab2
+:0030203e4b3d2a121c88fae7f6455d684598c3
+:00303012b4928bea91d7650ddc27801877ab4c
+:003040e1eb94a822acd35e49285d6da296f3f9
+:00305013b16612108d0a0acc3b0563b7e2e974
+:0030605ad74321c8f4cff9a2afe8eef87ce7e1
+:003070bd1f2439917effcf6f98364babdfd699
+:003080d5c0b0c95e63fcea552e130dc8655b10
+:0030900bef0919a818a889892f1791fd9da70a
+:0030a0677587c9dc45ba75c0bba8ae791c902d
+:0030b0be665a0c2fb5cfbde3ed5540e1f641b1
+:0030c07bb124da6ef4510f1a7ceb5662581472
+:0030d0a3ce2b0853401907a3ae034f5779fd8a
+:0030e0f0f9d8741be488909defffd77aec1692
+:0030f02ae169ec04030411297a75ec391a7ed8
+:0031006816fd0a036f61cb2052743f49470c98
+:003110b5484f49af39215ee52da307a2935c88
+:00312080814eec5d20bece5faff84d90353cfd
+:00313048bb4014f44f3bdfa71a9a540bc62c28
+:0031408dbc9d733cb40af95ec4d9efa1ded53b
+:003150b467963d6d6a762c3a0229ee474499bc
+:0031601106da1c6c505826ee53799c431e892c
+:0031708df0ad7fed30b63dc404c2ae6a630f2f
+:003180c673a97d3ee2eee28a61e8a1de5d0f9c
+:00319011c2f1b0cacba97e5b65785378a595da
+:0031a05d3b45258f1b77ec284a0926cc335d53
+:0031b0fe7bea8a2bc21847b8fa5eafc0aea63e
+:0031c00e67e4f8f96bb95b035779a00afa3be5
+:0031d038aef8369ac14cf3475a566b96d2ea05
+:0031e092cc587e8e256d680022a8516f132cb5
+:0031f0dded002d62102acb5c2df5e85f102f24
+:003200ebd22875f645e0ed71dbee75b0d7744c
+:0032106c7e53a68c5d0d448e15befbb91778d0
+:0032207d1356ed2019843fb09577d17c1c88de
+:0032300e27528c9bfc85e1c013706232fc5829
+:003240216dc7569ff6d352c01f417ed2e47c46
+:003250817f6b0bc6b5081fd77463893dbac72b
+:0032603ed18bc1dc015beec799be470328f1fb
+:0032708af14e77a1f7c81c877bbe279c0d4183
+:003280481e79b7044010c2a2bd3a1827fd5977
+:00329034eefc0f7654428b48fd2fff85b596b7
+:0032a0d4f35d4020491ec3ae660bdebfa96c90
+:0032b0033db73386da9648673396786b0ae0dd
+:0032c032ab0dc093c78f5da949f4b5d51ca2fe
+:0032d0b09ffd5dbc2c0723c1d994a3615014ad
+:0032e0f7dc8fb0de6d69df1f8c665f2abc4259
+:0032f04bdcc3f8650a42c83aeea2d714566f26
+:003300f3e48a585bc4d077ffc8d81461e81c65
+:0033109f18b03446302f78cb0110e3e85012cc
+:00332072ec0e3e455f20af4acf42702785a3af
+:003330abe310523ceb142ee09e630d3bf22cfb
+:0033408d8a49b65ad193ff587b6c0c2e1b601d
+:00335089e9af4da2db505f0ea7702e20fc487e
+:003360a290b0ce8efdfdc1e67573ff1dfd55e0
+:003370676825406c38b8f5dfa415db4e752346
+:0033809ba884975156599e33de0a35bc320a68
+:003390ea49bc6a9deb4b4940ab124a5dbe8f0f
+:0033a014d7d6070947295c9d85c6c945135591
+:0033b013a96da8124bd2e94feef7df0984d4ef
+:0033c01855b24ace733d45bac2a8240b9fd67f
+:0033d0053f878f1f12056c91cc09a219bb917e
+:0033e0898fbca37341375f77f6ef379efba1f9
+:0033f00811d13b9656ff71006c176d7451305e
+:003400186f936d71db968a8795633605b742b1
+:003410b9db8334517b0d0afffd2a09b6c37331
+:003420b3eff197978ce3e3e6041af558172b8d
+:0034305ca7079d52992c8517ccf71c2b0ef47f
+:003440324184fe7fe7deed6dcfb577a614d8e6
+:003450629555fe11ed13f8e279eee60828e35f
+:00346001bb967429fa79418473473fb8d318a8
+:0034701f86ea076bef1f24a22b3bf079523882
+:003480700d97ef1a2d69fabed0fd0211910ab4
+:003490b633d7409ab4b9f4953cef712067450b
+:0034a0ee01cd96653e8bbc6c1398ecf496f9f4
+:0034b01cd62b648cbe5a6adbcb249b5491fa1c
+:0034c0b8373392d892fcbbde68f55f899119d2
+:0034d0f1643d736851eb6324aad75fc9eaa6d7
+:0034e035e41b3cd4b7072bc59e5c65f0996ab4
+:0034f082a90cb57e789d83833cfb998cbba32f
+:003500804fa441d7844a05e9b18e43a1e66fbc
+:003510381242c7d83c8f572fcdb98b40adc0ea
+:00352059a38c83233e333a55812a045b966bad
+:00353055c8b10b026a6a1ca9f3576e2f726132
+:003540b9f9e42fc4020df556fffe3ef75655cb
+:0035505d8072c6eec57feb14c1a4e81ac7fb8c
+:00356091ae78ed3cda5999d3881190d6723043
+:003570157edbd1c287fd8bbca19c882e1cb7ec
+:003580dcd3f6df06179be329e286fbdf3204ee
+:003590f968fe15f00c1e37526943e2da939a68
+:0035a0d1fb2b27627d9d0c03755dd7b1481f7e
+:0035b0976df617f2135e9788a3c450704bd08f
+:0035c0ce6cda1359b6afa80eaf11a3eadf790f
+:0035d034607fb4346153a703c54e74cd289185
+:0035e00151c228870a16d9138e26af97119699
+:0035f0f20602d65a88c6f965d6ca9c536bd185
+:0036005ff35557bfad6b3adcfc92cbaa3161e4
+:0036101933fdd5409edfa24363c0d9afcdce70
+:003620fb1898cd1383318a9d4eaae126b9171f
+:003630ab02e9f8ed7ed98e5d3d54a896c6c479
+:003640f1ee05fdcdcc52b6a529ce8a0c813d2a
+:0036503a8a950fed29bb0b462271e9860a774b
+:003660ddeea31a58586418046aa77ae33c645b
+:00367091912188e1c7c866aee3ede89f24888a
+:003680b0983d04275f880775c3f9c1e7675914
+:00369019b62b8e79ca0b2b748593a3eec0e29a
+:0036a070f3d197e39105f8d2a381e14105049d
+:0036b0561f8e678b9e9c9d3110f278e3c692b5
+:0036c09a094e370b7294590b88e08e308b4d12
+:0036d093d1a4b87c4461207436eec78b045eb4
+:0036e04e740299f9b43136ff84cbe9edbef8d6
+:0036f070ebeafdad257766d705861d205141ed
+:003700decf3b5252150bc35800731783b9378e
+:0037104c00b25002589028b44ba4d3a872670c
+:003720dcf554c1a599632b1eb347fd7240e7e6
+:003730e2d2cf6090f0e8093ded379dec5703d5
+:003740d9555991c7d45d4dcb180b29f0a1c27e
+:003750a643a4422b89720bf6430ae85bdf4fa6
+:0037608d803642dd5a09894f1e31c2c64dea26
+:003770bdd2de1bc339aff36c810c59342a6f32
+:003780b4adc42dd8f711f1846aec8472a35fa2
+:003790fe0fcaae878f74fcbb67b66c398d451f
+:0037a0f0af456986c71b73396508c0d27489a7
+:0037b00f7893cc0c582136eb27b1adae1a3f2c
+:0037c09a7e7f67795431c46021a3fca1c9127e
+:0037d02e6420f6fa6d2db8da531f43db213760
+:0037e07a8ba30fddf8c180fc0d5ff983beef26
+:0037f0ec10789e171a6468e3e8d9fcbed43011
+:0038008b2386e441e45fa8b2d87a8e77da01cc
+:00381014171505e54365290f780c0de8c50cef
+:00382099916464318aeba61c0d3ae723074933
+:00383072bdc0aab094eb14767d33d1291468d6
+:0038409e7c5d8526f6f580d4fbf6fdaff5b566
+:003850b24bb8e530b95b27ed659a3fdf39cadd
+:0038600e1cfd0284da97c374ae66e0727e00ce
+:00387013120b7a14416cf9bf074286b1429b62
+:0038808333afb1f9a782a47ec9dd8853cffac9
+:00389015d4f4e8a4ac7064a46e022926416661
+:0038a0c4a8d861e3073006c4f35d11d591a0bf
+:0038b0eb058723ea246b99d5daf34a6a07c67a
+:0038c0df7efe3682d083194828dfeb61e87f38
+:0038d091285f69f8130f894a12438bd6100658
+:0038e04e2ef64ed9e862358b39e2f4d61766c8
+:0038f035a2b38c3ba70356da0a704e20b03a45
+:0039004afd2bce2218c42ebe747f6af10a83f4
+:003910eee032fce90635a3f7abfaa60d051176
+:003920da589e353ee95264734d10449e9d206e
+:003930a161f1fd13806a2a932ee4c18c9b9812
+:00394068bb4a814386eb02387fd31602c6b5e5
+:0039507ae211360f771ecbd1c8b067584b57c1
+:00396072bba2fc9ecc2436c68f37b271368732
+:003970dcd8ec5150b0355e13582ba139bebe35
+:0039800216b3bf8a12eba252a2d6df0b10c905
+:00399055b5fa4c774b1dd23f38bd68a218a751
+:0039a02132e7834f67f2acf6079b1102db199a
+:0039b0754d86d7f1eff1f287dc2d6dcfe6cfd6
+:0039c01cd63cf3fc161646c56204029c773e91
+:0039d04002151950a07c51df73361b30afc9fd
+:0039e091137b75824b74093c9ae77abdde25f9
+:0039f0c81368b6d0c715b33ccb6194e30dd8d9
+:003a0068b86ea932cb8ba5e2f965867f2496e0
+:003a1007a00ab6e0e5baa92f764d41a2a49400
+:003a20177c30d9e074acadc410dc395613a05e
+:003a3054ce5e4eca8f22e2ffa432126be5fa48
+:003a40ce6e18818a3671bcf9cf13d952a641bd
+:003a50f8e204d81f4a2354db13a91f8c23caae
+:003a60b243b38f56fadd87972606e6c627dd0b
+:003a70e7f8004e9bcfe5146eb2ad80d02bf65c
+:003a80920e4fdec0af56921cb3254a71883011
+:003a906c2d66bdc07069aad6688fd91655691c
+:003aa0707019f8d53cc0502d4ad308549c9105
+:003ab0884e956ab12eec2e82a0d5342e4dcca5
+:003ac0e040b8662c3e7ce7edaec5ccfc4d071a
+:003ad024309509a3fb11efc118053287ea7a65
+:003ae082f5867d3c99dca9073356979454c0a7
+:003af01e4e5b1253741a7b62b37b1736024a02
+:003b000c9eb9044b17a4956df34d0c4875560c
+:003b10fbd87312b559be7053669569061dc799
+:003b20cc14eb3d5f9656919f74a349aa45d84c
+:003b308e8f3be20e8cdd766a2973bcdb9ed263
+:003b4051330e48fed3b8383df94dd2c7c3d12e
+:003b506dab720725ad5b158ff05e7662acd3a1
+:003b602df478d01edf799fd851fd1becb2a595
+:003b70dd142483130dd93532c057f01a832e0e
+:003b80448c7da9b44b430a37fb67a85bdc8225
+:003b903b38318329a6c9feda548c900aa79f1a
+:003ba0db46049405325c45b8dedd3e96bc3f2e
+:003bb0b5e61aa34893892297fc589ffb84cd57
+:003bc07e3bc047f51be57cba9a09b4bd203297
+:003bd0c05ecb20919066c5ef8671ae0a266b65
+:003be0af783013384970fd8168fad314fcd6a0
+:003bf04819c76211ca36fa7eeaa1c98b0b9588
+:003c00d64e7a4a39c890e3ca7b3edf09b3577e
+:003c108ebe349e57d5f6e6e67be3ead8033fa7
+:003c20a674b9ee22c7e7e0f10cdcf383b406c5
+:003c306bf8a21113eea0a48c169348238018d6
+:003c40c6f936cb838dd141227538ea769fc459
+:003c504ab1721e4de820f27c741dbff5b92f12
+:003c607246ec3185672cfe1c7a76ec67fd9d39
+:003c70a2fb0f1c380ea7024cb6e72600ac08f7
+:003c80f535f84d74883dc893d621336d24bfe1
+:003c909260419e24e8b7d1c0f3ee10c90c9374
+:003ca080d4cbe375ad1bcc050bc065a46eba54
+:003cb0d93f3022406c9dba4b16784982879513
+:003cc0acb801ea2ca9a019eba4e6870162c1e4
+:003cd07697a9aee66102a3289385477cda0a69
+:003ce00de02cea1425f2f35ea10bdb81a9dc8d
+:003cf098c73f1f53eb9c5809bc1818479ea428
+:003d00ea668db3eef5f0ca45caadfecc9a2796
+:003d10424f64858c3c97481dd1def38ad2b071
+:003d205d07638fc011c8471ad2754fc53c2eda
+:003d3061129bfdab5977c963d8c1fe241b3b22
+:003d4069ff4eac30c43df10f730e2665624b7d
+:003d508019168f263848c9ccfb0e6ca9f7e31d
+:003d60b0746c456d31798a95c925af61c8ba26
+:003d70fc74c7607eaf8805d0bef412eac4da2f
+:003d80b990997e74d60108b171375861c4f63d
+:003d903e69cf6a1ba5b1c4906dde88cd9ad112
+:003da0d65fc5952912c3bd48bb70133783f174
+:003db0f71f9d2d85be88a89b81f8525d897559
+:003dc086b48d8031643c0b7c8755ce67979fd6
+:003dd00f0c0d375394474a8b34649bf404a5d7
+:003de0a692a1dddc049483e4436128c16c0e97
+:003df0902931d389135b0b3fe0fcae576c5ddb
+:003e00c172d9099b71ebe7533599affb5f3616
+:003e102f50a647697af27971502a502543a7ac
+:003e20a5df8761695dec6a943b2d6e4142cf23
+:003e308dcd4b59901caeb69d08b4c07fde587c
+:003e400871814a858860f2b06252679387e3c8
+:003e50c878d30a2ac3e8fcbb3b28fb210e4554
+:003e605748515dba779c5e4c4a72312dad32e6
+:003e70b0e08b7c5b36a7af371b79b4dac559ce
+:003e809811e9166dd5eb6583a0b7362165dece
+:003e90ec83ba01c2f3a4cb16d431eb56cc3158
+:003ea0b31170a3e9c5daf7f77d8c42d6563d98
+:003eb0a671d630b721487885b42974b73d57c5
+:003ec0ff58b7688ca3e04b9643ea940eea0440
+:003ed0df6f3235103c8ecd0031e236b3ceb90e
+:003ee036430878b227bd78abc33903dd135c08
+:003ef0fa76ee3444b8ecbac58f354516b038f6
+:003f00e1a722a71b49b09b5a62aa4e4c228a80
+:003f10e15ade5a92e95a2cf25efbd1d943d116
+:003f20b475e15caca2215a7defc8a16e41da0e
+:003f30f0018c8c0ca8efd110f0fe993cd99046
+:003f4095d13c5135d2cbcfe834fc87a566f744
+:003f502317c44c75cb67031d12bc35fd5c2dd1
+:003f60c828bfbc4169d94d5ebf20e14832b665
+:003f70eac84f102ba8af9b4c9d1a651dbb8eb5
+:003f80e8f0ff34f7c2af8de015d86bb8175129
+:003f902e1aedf987ab6c2e0c3eca1fd5d15aec
+:003fa03821e13c9e0703269b34329b55377096
+:003fb072aa2d92ed131856a81d8e35b936d4cb
+:003fc064760e9283dfc3c0dd90e93ecbfb30fc
+:003fd034c3568698991cb331958e7f61e589b2
+:003fe064e29ab8b22d675f32de6b0dd197f187
+:003ff0689c4055c6e4930e22a94f7ce4f63139
+:0040000902c324ee5a5aad54ec25bb2747b0e4
+:00401052764752cc96d8e83cf42be9de2ba1d8
+:0040206452cb235388c9596ef717675653f433
+:0040309db4655509aafb03cb49bb504d61ef86
+:0040403bc36eb77b9f9458a783463871885a2b
+:00405088a74b5d1118965dfb4262a22cef2cbc
+:004060a33900ebbaac5166eedab5fab25880bc
+:004070d6717c2f88216e8a53cb3ecedefcbadb
+:004080515d2c2f50e47693b33844271c1e2da8
+:004090aada6ee207aad4ea6923fac6a3c4e5fc
+:0040a03bc115c23a52832e413e5ba9fdb5e508
+:0040b07d24c09c852953f5497362c2edadc149
+:0040c081e21caa55a4665ec6a974af93f64446
+:0040d0b719b1e0ca7fd437dd09d6817a47b431
+:0040e0d4aeb4a972bc7f986ed2eaaf2d891e6b
+:0040f075d751d113e873af0c9aa17776c680a0
+:0041009a7a9c9f21dbfd367da2d74ca2452c80
+:00411024763c9c7a67329f7afcc434820b1786
+:004120b71d8ed6fa784c0e26166b14ab3756c2
+:00413084db82d1c73cfe7a35525ec18af93908
+:00414088337507cdc579e79f8dc9b21b69778c
+:004150581514e141eacdaa17217ac1392ad82f
+:004160f653bf3f85d3498c6051e7461a505758
+:004170bae81627273df5c4ee7a265912524dee
+:004180585920dd374d03696465fc8eacfb5488
+:0041905cf409bc17c1d31d03ff355f220aceb0
+:0041a0c5e2f92123c18b312011c069cf60d9a8
+:0041b097efd21d33464e7785f7bb855f2ab0be
+:0041c08d999aca181db27302522274055de286
+:0041d0a484a36f1d3ff35e72b346f9957968ba
+:0041e063e8a430f1553c5a903ac72af9d7cb83
+:0041f0f3f814aaad080b42a4618a68d320afab
+:004200d1cd4d37a7f4823ccc40afde70be6c42
+:0042109643ce908ef19de36c0798563fb814dd
+:0042205821b0425ba2822b1da9da8eb8c21214
+:0042300778a00486ead746561c97c112c079a5
+:004240518941555e114301ca36f91c8b5fcd92
+:004250e5f9502f2f35808b87144864db890050
+:004260fc6c1656e5890c27e720d5bbef9d1201
+:00427068c98d684141d5a6e89dc8f04892aa0b
+:004280d293194e98ae27dc51fa83846449cb96
+:004290bc45cf9732917b9647e7d740d2165755
+:0042a0e49003e809dde3176b3020de2022ed92
+:0042b09fddb05e5d38a2bf40614a0441acd26c
+:0042c0586fa95e7f54e896a0de004d103e782c
+:0042d0b658933b4b29351ec4d12cd57251999f
+:0042e09918e0bb703c7557de4abde00e298f0c
+:0042f099ccebaa06efd0fa5d570ba9c6066e64
+:004300b4490c2343614973a17a23edbcf9880b
+:004310d4702e4b76b0f711de756049d214afb9
+:004320e7b98ad026ee7c706e89e6c6d8edd5a4
+:004330073b5f33250f36fcc9116ab259844eac
+:00434078d8c45d05f6414ca48886b9a120e59b
+:004350aade59749b9a9e504c11b8f6217e1da4
+:0043604686a4afee52296efc91bb81a1a647d7
+:004370f43f905fbb5e501ee8d743ceb8b554d2
+:0043801fac4588abfc126fad5e7737568588c1
+:004390c6a8abe8f9f84bea86a28a2b9cc5ac1c
+:0043a07b8661adf80fd76acdce9d885a4d5945
+:0043b0233641b2a8f079e7d034cf07bfba9b51
+:0043c09570edb6260dca6ac2f5343b0aa930dd
+:0043d0a948747900cba5530144f5fe4d0035d0
+:0043e05f478c7f3fb4f23f6901f50f4dcfe431
+:0043f0883d9ab88c114bc53656e6eda009fca5
+:004400d6bca100329ef6c6cd3ce90ecd4108bc
+:004410f220d1110c6aaffb4486179178fcac8f
+:0044203b66e2a03ce1416ca66fe8903775aa56
+:0044300b27f870e07c0dc5bd64c0013e33b81d
+:0044403b5088a22d67b77025855e8f9ee463fa
+:004450da78dd69765ab02da7de12a40687f7b7
+:00446001431b620be3fa8ad75d05e94c621eb1
+:00447038e188f6044c3f111a3dd5c955784ca2
+:004480f5f75d80c051d867d891c56e783ed930
+:0044902dd96e59dc2a8e33fdd267ffe698dd4c
+:0044a0e96e186e63318fa14e12061117b880bb
+:0044b09a283be1f907684acff7826e4e9ec823
+:0044c098fc3529eac293737ca9f9915f8f7b1d
+:0044d041224b973ebc492ec43b7c847be08cbc
+:0044e0ee400e5f9e4fc2b7a01ae80d855cac6b
+:0044f04ac7472a75f8ab780edc8d9328d257d7
+:004500c8081c3ed6d9325a0095f82e4ebedeea
+:0045104c415e09dea10c8835e49a14e966f33e
+:004520e3d88481a21b25e17f8d27e5428b2c9b
+:004530cecfd2fcb3887c9c953cb84458813400
+:004540350ec205d594ddb04bf303e1a59427f8
+:00455071c5bf493e6ab84e30100fbf1e63b3b8
+:0045601bf51a83cc1a9aedd2aef47e2e926252
+:004570c711c3ffb22c564f808f088e72b4e2ef
+:0045805990b124bf98b6021eb38569d9e0e691
+:004590160e78b5c2c031ab53690c8e3bc6c730
+:0045a0e4286a74a439d5190a9ae76c12f74506
+:0045b00cad4081a765b6499d3541c1f2add7fb
+:0045c00911575a8d5f9edc0cc460dc87498ae1
+:0045d0b81bc282f17e43d7746e713524002f83
+:0045e08b84468783972645bf0c5650493806ba
+:0045f084289ff0e322cc07d12ba95c779d0e04
+:00460027110dfeb126055e4975c5101a53b340
+:0046105285410f3cb7fc97eb33b860414388ad
+:00462036b2e303674dda9836843dcfc64511c5
+:004630906f9e6860a941551f5b3562832c8875
+:0046402439ec6c8c6ed14eee575077105d4662
+:004650c6e21d04cbd3a1e1efecbaf717bd7041
+:004660311a0e30baa59e007fdeb738294a037a
+:00467024d6f30e87e63e6a003f2f416ff61f3e
+:004680f9a875bc9f4aa312e5a0c76bb337b25f
+:004690952096955c7886ab63bed18987b72687
+:0046a0fac38d07c60f1f7fef2e46f07a39378f
+:0046b0ee76c15ce25f94c49614458f5d9bad66
+:0046c0b96e5369314bdfeed9b79a7a677030fb
+:0046d0e9e257831cd2ea3ed7f28b09407e07ed
+:0046e009a97cb65da05e880e63db910a864ff7
+:0046f02ae2cd855967c6b0ce12e79c094fdc45
+:004700a17d3978e0c6adf44750803b20b74523
+:004710dfb3a64e30fb7d18485020ed040da53a
+:004720cc5d9e869a70a0641e0b7e8b8327f58c
+:004730245b3406117854a2a066e5cd39dc2664
+:004740fd7a1454acbed7892fc12672764ac23a
+:004750e28df6198904c9ed2092e7dbfcbe4793
+:004760806c04c12637e40993f9253f8b5753a8
+:0047704d142768780aa65863c16521ef6c4fa9
+:0047802afb355918581418f0e32956c753389a
+:004790c71c68f4210b897d8fcd27d4c2cca05c
+:0047a04629e05513a240cdc68fa54773e1fe08
+:0047b0980e6cb6543841c0f8d5120b0d1aecc2
+:0047c030b37ccbcbbca159522a57b1f9a96caf
+:0047d0ba846aac3fa809772516fed17b97d308
+:0047e07ee95d8bceb01951d8a69123fced94be
+:0047f0403b6090fedf965eaed15c4da0cf5c1a
+:004800728d6aab4b1a2a5dc64bf7c3d74eebb2
+:0048103854e2d66b3c220e23b95b9559684251
+:00482013cbccb7d782ce110b71d74fee01e4a5
+:004830bc78288742a895a9f9b1abc78fb80b81
+:0048402aa0c5739f3209fefa4b4ff7dc0be62a
+:004850e7cabc72203fb739d38bbe40de4c8548
+:0048600cd160516edbbed208c7a657c87394f0
+:00487031346854398fcb6df3fa72bd8f225eb4
+:00488049e434e18c1ef7bbe4ec45e9d0da0d6e
+:004890431ac40d91ff07fb6300991a8bb420f3
+:0048a04b864bb6eb8daefed7b360cf4697bd79
+:0048b0f6f4492e729134bb4a681f21849bfc81
+:0048c0c78b86aa87f80abdfe3fac6fbef9890f
+:0048d0101179bc25f1712745958a7568b9cb49
+:0048e06ec430325dbf77ba73b863920f8f397b
+:0048f02543ae8b1e808b081f289b5a747ff17b
+:004900f7ee1c1edea1bf4a39dd9b4e8146ec2d
+:0049105db2f6e3561825865724751fa8d73ba1
+:004920cebc09be2aa9daf43a2e85abbc40986b
+:00493074f21d0622d76bfa857e7d5d58fcfd1f
+:004940fe373582c2885fcb073b84908047d9b2
+:004950c24b5f2b735228e80f6d7241d5edb13d
+:00496098caf9a2cc0e8a8201d0e2f2e99731cb
+:0049709868dcaaa12169c63f532433d021b85a
+:004980eb845a3ad62c0fa73d4305d31bb94918
+:004990a827a2e91557971718330653b109b069
+:0049a08ffaddb4d320278e66822ca447a59995
+:0049b081571ded4e850f52a7f8a875b50428b9
+:0049c019c3c5602118b8a24b71099c5f956ee8
+:0049d0a8c3a607b098c288b4e142971361a066
+:0049e0f7f582442ff341614b88948f02d1c05e
+:0049f0efa52b20eacae6a11f45e7e0befdc1af
+:004a0093da36913200763222b0e127b734e49e
+:004a10b02d8473ddea23d3bd9b4fde169dc6f7
+:004a202d2d31ca510e4c7dd57e03b7a641c977
+:004a30a52d82b02775db234651643f5b687631
+:004a4028b5bcf04a2496f7d4d34eb1eed82696
+:004a50893592ad80ca01a3d1b05cdac595b49e
+:004a6051595c0eef70aa1cefa020fa5b4c4775
+:004a70a15adc78c6a194d2aa54652e0ce4f8e7
+:004a80e6b1d4440c2d7624435c8244f37c9cf7
+:004a90acea3a0fe5b596a9baba3c0980d7c2d9
+:004aa0d19dad6d2f221582d8d84bf32ec57399
+:004ab071f1367b994b18b004ad23a92c00646f
+:004ac0e5bd72477150379fc18291364b66e930
+:004ad0d3b3757f0eb119f122bdc9f58d91b5f0
+:004ae0adde9f594fc5b93729fca4b9ecc5e52c
+:004af0115617d3b6c2bc72d15c7d717c8569d8
+:004b00fa8f442baa85dcf82d129293b5f0626d
+:004b10ed49bbba7d472acb04e2a65926ea3baa
+:004b20b3c9604ce9c97dd3c173ad3385fd8836
+:004b30ca38388536f9794d6e67212d35cd55cb
+:004b4005a65943c5dbcc2ec13939ba08537ff2
+:004b50b607dfb882e6fe7bd7df0432b8ff1898
+:004b60480b8d48652a5a963f6841943bc6cb1d
+:004b704789423659279a6d8b3560d8aa80d87f
+:004b800e4740fd550d8be42b954a6815608a21
+:004b90128037622548c677ca727c48ecec68d2
+:004ba0adc73224d13371d2818a492403448341
+:004bb09c798f9920f6b879bbde1baf6f62dd50
+:004bc0cbd81c2924a9f9e2c6c123ea88e10d43
+:004bd04e37644d0b3a9114392cc8bd51bf4be3
+:004be033b060a332891df69ad1a6aabf395f88
+:004bf0d4fc40cfd8c45b15585a5256368693d3
+:004c00492351fab8866abb2de9b9c107953efd
+:004c10d30636a16da2ff034af585376d83be51
+:004c2060f426735d2461e463afc67e5b7bcfc8
+:004c303a233a69b54f78238fe65d0986c93524
+:004c40622f0cb83f393393457e6bf2da35ad9b
+:004c501a2ee43577fd30d89313e7263e92d148
+:004c60d2ddf487eff892fbc78a16d5dd46f0d4
+:004c70c505143ee5cb25e68618a95fdc3e9f0f
+:004c80cf4e3d1205df8a04d5897c7bf4c7c64b
+:004c9064f2c3c60597bce1475b9cf20c03b1aa
+:004ca0a71012a0e9e62867e764ec7025e49ebd
+:004cb0a8e2d6ffd9d7321c72bf6ad9706624ba
+:004cc0ca99724c0104171d1742690bd2e7b44c
+:004cd01608caaf56912e297558611bd248d1cb
+:004ce0e1cf342c40f5596b49a5abb0d1827fa1
+:004cf09588e8fd7b25830e09c438cd39afd5e7
+:004d0039d864048668a1efe35ec886c648fee9
+:004d1076e6123bacb37d75530696f54bf9ba48
+:004d20c4f8edd9e04e448aa58ca13187594d9c
+:004d30652b90e53f146874916d5c55c09f2325
+:004d40553d4ba57e228f908be97c1daee3bb68
+:004d50f2bc23a65da86b81c2219da670d80349
+:004d60b01a60c704e33ca3281b70d81440b63e
+:004d705769416f1c3b7c68c128d846bcd6990d
+:004d802d79c65af4951a5554570e62ae589dbf
+:004d9042eccdf5cb6397b6b44745c55a37edc6
+:004da010fcc0879b8568237335220182f8b8c7
+:004db026498498c1d15866a2f086eeeab57bab
+:004dc05b3140a2c5fd9545566fabe3d459c3a2
+:004dd0f39e1cc575ddfe2cd16f85453d3d1c87
+:004de0c1b664928b40d584ab2e3788d86f9f01
+:004df0b0fccc26b8d986aad3cc6846887c513e
+:004e00756e649b912c8ab6f3f243eff64852b9
+:004e104e8fd64ee7869682b1b3675294e5a27d
+:004e2003dbdaa0f0c74cf7d4a3807166e2fa37
+:004e30df9c19d69fc8e2fe3a7476acdde029e2
+:004e40f3dff7c2cd2ae069db0caf131cabfa55
+:004e50180149476e871260a0ed090ac971a2ae
+:004e60a3bff99ae4dbcb244041486b983d52fb
+:004e707783f2c7e839e35bb07d93afb7fdfcdf
+:004e804b0e1f05711eddf6e39f185012783046
+:004e90908e182f5f4111d2e43fbcb0288d7bec
+:004ea0c18d8ee7f11e6578dbb64b6056868a91
+:004eb0e86be049f589e9a91f31a53fef3f8601
+:004ec09be5b163628c3419a24f9295dd85c888
+:004ed0bac2bcdf58c4f1f934b996edcec8cfa7
+:004ee07f8083d69e0816672407b38afd535826
+:004ef08e2996449835eac4b1d9158a824870d2
+:004f00c1f40923c6128f74f42e136694c6a7bf
+:004f100f43235c401304ab4242a3dbe4ab34a1
+:004f20a9a3393ec174b8ed2b0443484691b98d
+:004f30b890f19a13ce5669c3f789192dda4e1a
+:004f403f5aa09aebc1ce17787bb72fd9b48aa2
+:004f50852110742f268713e2cab594baf295fa
+:004f60918b184f29a7b999e59e817d686e57e5
+:004f7020f9e63b6163476ece227ae19eeab356
+:004f80c8ed543c6107d768a6b9c8ec8f05bd4d
+:004f907231214d34e88ba3736040f2432bb11b
+:004fa0c00f4c6989abe2bcaefd0ca0139600cf
+:004fb02a68126607f8f19793cf49e34622a95f
+:004fc0dcfd57490e7a8490f9f160f372590c92
+:004fd0e669bd61e97c4dec632d75bfe275b971
+:004fe0cd2dfc268f3410e1cbe7935a6b38d5a3
+:004ff056816bff824151e9a7baa83694efdd30
+:0050003d3513e9cd31c2cdea7d74ae8ba0f2e8
+:005010bce322636eb0fd7b0cee37ec1343bfce
+:005020bc72c1dcef554bd6a04dc0cbf7e3bc33
+:005030ff9453f3e198244377baad8fd4773eb0
+:005040db774378cdec5e3dac6b5aa1507cfc72
+:0050500b40ef7db51eb51230c90e7cc87f9d0b
+:005060d0664449dee66a7ba038c32e61f5c522
+:005070a4f2ffc1374f0d3cec23f456044a2d4a
+:00508018ea8479d2e26528be454c241a18e00c
+:0050902bc25f779d95f75c50744b113e720219
+:0050a0ff19849782da921dd6dfdc721c7147be
+:0050b09ef4485d24148f43026917e0a9a7d44d
+:0050c0f4341f8043e8ef468faa3c173656838f
+:0050d061be15311b52669d8e6722969f00cc24
+:0050e0229715de01f4b5493306c6f3fbfb53c5
+:0050f0cb4fb46caf6174a79c940d76d13cdc78
+:0051000972c326ac2a79ebde7df3cfd60672c7
+:0051106939d0a4ba90f4f14ce1eb9d6bbce549
+:0051200338fc6ab6412f1e4d7d5407d7bba2f4
+:0051303a5226a6c9474ab10a1a3941ddc9ff60
+:0051402aebf3c1591dc8253895191e6ae7cf90
+:0051508cf4768965f2206af5b0a7f43bcb6dea
+:005160e3865f11825011e855ab245be5b9eeea
+:005170d1de0b26664461c3af6c74a631589d21
+:005180a0b45963fd9cb1f1b8c4a30aeca88726
+:005190de7ca94e00a611c8af01d90dc671c882
+:0051a01a4027ad27836fb5324966d867dee79a
+:0051b0489473d6e210362e5d9609b11b1977cc
+:0051c00cb49da369f46684c1328b397bc4ff5f
+:0051d0d972c5f98b26e500b367292eea532641
+:0051e0aff88035a8cef7fc5788b7ea8fa223f7
+:0051f0410d8cad287bcc6a77e35adead4f98c5
+:0052007bd201b611526fe1abe692b6f27ac9a6
+:005210c9b5db8f5cf133ef28fa7d90cf50e976
+:005220089251cfb2a350130334975c7aa7cc2e
+:0052306f3987b038a488d8acf0ab64f227ede0
+:005240dcbf67c1f026c667172b46337cd35fbe
+:00525077c57c824decc604485a762c355d1b7b
+:0052608644097d574d27a51cc24fc27522fc01
+:005270496243b44540697b19d5690c08ead279
+:00528029a0f727ef79484ec06c1645a3dd6c70
+:005290d01b77c27a9218a4a8198a3822e2eb41
+:0052a0fd84d03b28e0dfbe2e50beb3aacfb3fa
+:0052b093726b2478720674c5f4dfbff14946cd
+:0052c091904623741b783faaaa969a1877fd27
+:0052d0a747cedfa1392d934b7186717685cea1
+:0052e0818669e6c71bc5a9d1effa2f4277880f
+:0052f03cbd8ad62808ec54d89733461d4f571f
+:0053000bb9bc9cba47805ab8143c0b056183eb
+:005310bfacaa963924b256f2b2140c658c8253
+:005320b95dd544ec850a7a5437d25cba2e36f4
+:0053305d3d8e56029dbb31171793fe7e9199d5
+:005340274951f03feff56b91ddfc1baa08f150
+:005350c0d9b021326a5591588792faac3783af
+:0053601ea3d37b57da32f369be8aef93d16f03
+:005370bb84c8d1370b98e8a480bf4c0a8fa9b7
+:0053804a716aad2e4868075b2c666c10d475db
+:0053905e6596632e0b699e46c01be0807fbeea
+:0053a01823204eff2f67009ab38ac84e833a99
+:0053b0955328e9c42b9d1588936f3bd58eb649
+:0053c047f7d5547a834118c3cbb23f203ff374
+:0053d0fd1b3402623c3e49de92d210e82df311
+:0053e02cd9740d6dd004acfb2592ec7f03960a
+:0053f04de52a0d32a18dc44f10e94827bae02a
+:0054006eba2327a586544eb1ca81922538a463
+:0054105e7b313a58702e3df8f551180289b016
+:0054201af297b67c4c6cfbb1086706155484f3
+:005430a058ee4c2833a7b719e29374cf70fd06
+:0054409b1045c91cc7e19757f8896310c76345
+:00545059f4b91b18d2c746eaf29fa2b15e4593
+:00546057d21b0bc4836d8f2e476f1805b462da
+:005470348775ed4cf5e73759058ea0c2439406
+:0054808d5ec687fc959dc3af4f2f2fe0dab5c5
+:005490f50276b5d1f73c1af05dc016ec9eefe9
+:0054a0b95d79e198a1039b8eec5c64f05b3561
+:0054b00400ff1d0fb072021a979919c62b3cd8
+:0054c015e6f4a775399aa500b6dd4e1117fbb5
+:0054d004078b5b1a3e6e2846e2f1d5e3dcfbc6
+:0054e02c0afae9a968c1eac56f90e3d67ea3e1
+:0054f09a291cc1666a0b07da0016e2bbd20387
+:005500f19cf6de715e487fd0ba33e766dd0f25
+:005510fdf8770474e0c46c1e34e6b64faf775d
+:005520a82073f61cb2f5bd7f6870f7fafc8480
+:005530fcea8a65c6df20da9ab74ede5c12f57b
+:005540d1650d65ed8e21bd662dbff5b11a43fa
+:0055508ea8c3df4d96a7a0e96ea01f54605c30
+:005560c7d3eb8a8a9e3c4cb4a6375bae13dcaa
+:0055708669658080340e4661f2ea9fd6459abe
+:00558038f68ef7d342d9da4dcec96fe98575b3
+:005590b74d1a215c9ffd5461a6d596f4504547
+:0055a08e75544a5ead10c85d412687e1f62199
+:0055b09fa652b97acd40cd8585e05cf4f6ab72
+:0055c04d544378c2e4f82cc44932cffb04d99f
+:0055d083d32b7d9b08515a0ce091a0f398d320
+:0055e0994e951b4780404f783b982657c84fb2
+:0055f0a70a9ece40c2ba2d8978148b27926b45
+:005600bcffce1aacda1e31f9d3002d1f573d48
+:005610d14c4e3ee8d89706b0b1b441716f3907
+:005620e1acf1a873edb74f6f9f2785cd88a2b0
+:0056305645d3bd49ab7dbfd105ed72173e8378
+:005640df6d996879bad535ff4d876ca577b7ca
+:0056506ed216b3d1af4915147512a0e0bcf1e4
+:00566008d8d4bb13613e296f2f4e6c2a317570
+:005670bc46152de63ed8ddbc9f34ad070b5fe7
+:005680df0c8f9d2c2d64492bcdd982e67602db
+:005690a018c3eb261063c925998e51590c7eeb
+:0056a08223924e1473399ffb455cefa978d379
+:0056b0cd9cdee9b923237cc21fed4feece83ba
+:0056c0952cfe033b814b81347992aedf578a14
+:0056d01704f6d7e8f7b26caa23fd14884b635b
+:0056e03e6eef7f3a413ebea3910c339bba3945
+:0056f0147dfed371d0c82bbd87390cc732b496
+:005700e51436d142f171e59c014522a1df2652
+:00571017e782cce2f62ae59b3cd83d2f095ab4
+:0057201cb927aaf916c814e5a5fafce7030cee
+:00573089983e7d71949d95e27e0ab6e5763359
+:005740f65b4630a00cee647032746291b348a1
+:005750d98f60d174871b129e8f4472129b9d84
+:0057604522b987dd19012c42e03f2f22cc5bad
+:0057705769e1672d7f611b76155517403f06bd
+:00578079cd82dce71578e62e4eac2ba5967457
+:005790320cc46986952104b945bc817dde35a4
+:0057a0bfe553ff91e42ad30a9f7672376f9d8a
+:0057b07b49e9ee7a7dd5b9a95c07f91ca24aab
+:0057c07a62ca71633c888bdc3bd6e413c296be
+:0057d0f3e11d63ce71a4f4db9d36c584ad5230
+:0057e0d027a4d473cc90b2b6dedf2eb8de213b
+:0057f07837ba702a22b750f40a9ad933226455
+:005800e6f38e56a390c1ce75cf11914d0f78e3
+:0058106233f60702165b3bb74a0d6d73cbcb21
+:00582053d2d7f1ea0b994dc5d99d3400d1f974
+:00583006caa218b62f3416f22ec58e5fe6740f
+:0058402acda38aa83aed4cce2b00c0f0c9df3e
+:0058507b83fbaac9e5290b2f02f5b52f83cfbc
+:0058606073f38bebed3eb585fc22428508065f
+:005870842d631ddae29d388f423f5d7015b585
+:0058800342c3ea7f3d31282e2fceafd6812b27
+:005890547bf9ecdf8b9ec754301115d7ded5b6
+:0058a03b73f391aa09957efc3ea3617583b27e
+:0058b0c8afef5a805b294167f32f0f0c3c0313
+:0058c0022fe30604f8f77d6e68d2d1ee5f5864
+:0058d0226f3f7f327a0c9a9eef5fbd7517ddd1
+:0058e0b8e265262b714a7e14d414921452addb
+:0058f049ec8d272b20b006315a920ab7c4dfa9
+:00590080b83bf292d33d206b3623a9a4eea608
+:005910d130457cb7ca2d672de263ab3e6f3e49
+:0059209a80b1781fa76e6e5e6dade50bc75a79
+:005930dd0b1e3b1242330cf061938d24242243
+:0059406ef8da962838c0e02af48d73f2e40f0c
+:005950ad26e8cbe7dcaa8b2c09e6e71da8c7c8
+:0059608e4a445083c4550318933147cffd7c7c
+:005970e24a2e6c62d6459ea2e2e0f268784ae6
+:0059808256a1bd8bf9740e77851b7e4a72b03d
+:00599050dd734e2765870d8f95fb41f020f699
+:0059a005394e3d661230b0afc954aa54d075a8
+:0059b046b88346ada68a408dc966042fa6839f
+:0059c0232a5b3d1d3f6de4f7367f144da930d6
+:0059d09778114ace1338f7a25970afeadf7ad0
+:0059e032cbb17a92fbbc5d074f7da75ced1983
+:0059f0b1c0ee325a713d2197f086b058fac340
+:005a00ad230c514982045de1981fda32b92780
+:005a100e435dd66149312dfc030d844b701308
+:005a20f2159d8fbc472f4d983d5e36cc7ef244
+:005a3005d644b8dcbe309acfc896506191e692
+:005a40de8436c26c7b7d38acf18198004888fb
+:005a5037fd020daf2485af2934f9468ed59f2c
+:005a6075dd77888ac2408eefa4be1c7d978360
+:005a70eb79ccf40323cdf9d7784457e3cf8534
+:005a80158f52bf6658fb645a947ef1d1b7c52a
+:005a9036040e7ce539e801710f0dc8ef9e9db5
+:005aa01efa774c459d076fd0201734d3951550
+:005ab0b03db1134754cc37c20a7136e2050661
+:005ac0d27f2c434f34c45ff547151a79a1100a
+:005ad08f44fa04ca9898c8d3a4998d956f2bc4
+:005ae08b2ff778b75bdb93b16cdb4b11381114
+:005af07ddb5f6327e498e661a4b61eb1aa6f91
+:005b0078caea2bf22282316ec2efef4113e8aa
+:005b10df596978b1246a8e66b46ed39124e2bb
+:005b201a51600d6dfac997b19464aa14bdf760
+:005b302d6c1e6d0f42c687391e90bf9571bdef
+:005b40fd9da8b3e630bcc8d97f0a4ae0ce9bab
+:005b50e6df3d68ea402e1ba89820762d242be1
+:005b600fa6265f96ac4800ee056aaec4192c6f
+:005b70102a7e224597a334bd5f6265049477ed
+:005b80522d1ee5470a39f2fa2a5216351a6ae8
+:005b903d4d4ce39796a4f6041e404160128bad
+:005ba0ea15eb38d3dc89a56531bafd1666e25e
+:005bb03fc9364bc1d77ef171a431c4cdaebddf
+:005bc0b338a33a5279778c781cdcfbcfcdc7b1
+:005bd0f03f34811114f8467cee5f36e48929d9
+:005be008e3de5d9d1c701d7bb590b062041994
+:005bf09c6059d1bbd872488714e141c430c042
+:005c00dfbd34e0262fc35b65e485bd03e965fe
+:005c10f2dcd922967f0c37b8fd24323a2fbf74
+:005c20bdf9eb844138cfa02ef75ece80c09d94
+:005c304b6677b3265f1f9a38c5019cd254008d
+:005c4096b2549781fccd46c5845c67ec3c9713
+:005c50900ef7902c16b85babd23474085df522
+:005c60ac8d984b26be6d202362071a8423094c
+:005c70d09ef4117ce94c1fadc9ddb5831385d4
+:005c8023765289712df6bdabffb1751fd38968
+:005c90b0c8dd063791540bec5aaff1f71aca67
+:005ca077620168a166795fc90c55b79bc5bbb0
+:005cb0f7021f0ef6c667ba86cc4ae1dd52efd0
+:005cc01f78df6a759f2b4f2656529ccbd27f60
+:005cd015dc9c909d0af1a8b53da9bbd451e299
+:005ce0a9f0fbf5863975ec5e588fe7c2b43dd4
+:005cf0575dca30adfc7188ee25542c57d8e4d8
+:005d00d8331368b95ed75130f114415e8ba966
+:005d10c0a13c4b56f976a3ab519340ae304f8c
+:005d2011c06a592ef667a683c6ecbc60e6f599
+:005d30c60423562378faf23e688f5e041258ea
+:005d40870970b31b4986b0cfbfc5e5169a1d8b
+:005d500a76fee2a30f5df864db5faf578c0ecf
+:005d608eaadcaeda22b386a422f2518eee7ba3
+:005d70a7126dc694fc4a95839f40357007cccc
+:005d80b3375521a8cc0caa8f111d74b5f4bd97
+:005d909c34196c730220f6fb84bdea7ff64f84
+:005da0b624959d7e16cffc0d9381a2ac1de288
+:005db0c5933c8c85157c6d62c64af7236a2cf5
+:005dc022439fad7aa16d2155315bf745c7cfec
+:005dd02f7acf25dc9124b1833f9abd5c94d26b
+:005de06d6d25aefe809c6718949794b33350e4
+:005df02df4784d7e22519a200f41a19a6c3737
+:005e00ae387ffa875dd46772f26afa7f8be9d1
+:005e106b8aae20c20033bc2c6a73a545fe6934
+:005e20fa8dd6cbb9f2f3a1d33fd25889067dd7
+:005e30de3fd915ec2beb7193f65165129e0e64
+:005e40e02ae8b436903fb06fef2d4c8ba1e25d
+:005e50c1c8a25798daab198f830a1d24771ef5
+:005e603966c35cb719b22630e4395301444945
+:005e70edcaa78be934715adcf4dce8dbcf9557
+:005e803fd6c6855767f09e59ea0abb602b991a
+:005e90a1224c1b9b1c0fb2927698e0f5d9bda7
+:005ea017e44f48eb365f2047272425dda80320
+:005eb01f7bc70e02183172e05417ac0c3cdb13
+:005ec06ea7bf27d0cc58a3496bbce0616b56d5
+:005ed03a2da60aa3144bfa3c9e2475a1786ed3
+:005ee082d1ed04e8697099611fb30f85b2df0e
+:005ef0f4ca18efd16b853723956a9e69444d56
+:005f0017d351111b3f7f283858795e610b553a
+:005f10aae249fc5cbae23f31a8e7d1cd6b1b71
+:005f202eba9a66c08090f6ff0e33e1014bc1df
+:005f308b00ed323c6481bc267b6b97f34f0ce6
+:005f407eac243189224c5cb4d292f2bcc06dd6
+:005f502b5964b1d7a9006f3d79ae845eb31613
+:005f60d45930fd6803ccb7e27bfc225583e6db
+:005f70def2348b70a36db63471163e89fd1d97
+:005f80f209ffdc1c575dcb356b41fb16dc1c07
+:005f905e4e0053d2061bd007613dec581892a5
+:005fa02e7d40ba98cea5f846cdd925dae145db
+:005fb0017511654f96a57a0960da68b59fc503
+:005fc0bc81ebc5298e400ca72500c11dda5326
+:005fd03ef6845532daa39051d56fb79e640f12
+:005fe0e13db89cd80316a5e294eec8b9b52c19
+:005ff0f18fc566fd8ef2f4211d1d5ac3056a69
+:0060000d5a9fe8388f81c9c81ef107714d7897
+:0060104191850672be087d3682fd8007594f99
+:00602050f0bc01f2dacbfc4a4ed49cece693b4
+:0060300f466ff0d4c47b37a3e37c632c914f8f
+:00604057146a2f4e4bea20e5164c84a8d15365
+:00605012073fd1699e96e1d71ba3a406686e59
+:006060218dc1b39c5696e88923080c52edb0ed
+:006070d71a243fc1d2204119292d8529e555af
+:006080cd9bb1b1cccf596ed8209d6fa97f4b6c
+:0060909dfa4948cb96f6e6f7f2dab2f17400f1
+:0060a069b283f6c6bdd0df8008a47e4aa08446
+:0060b0244aa3fef8d22449a2dbbf3941881577
+:0060c0c2505891955da1d19bcb3c12c54a01fa
+:0060d04f10377738782e9d346a706a657eba1d
+:0060e02a4f57c5850b1de678cba3936133fef6
+:0060f099860459019a3a9e25e373aba7a50006
+:006100e0456e91bfc5f8e8e92759e4572ce184
+:00611050284bc8f87e7de94369b9601deade4e
+:006120cd7fba9fe12996fd7de8c25b5edbbc19
+:006130901a4ab0517b730ac70c9472af06d2d9
+:006140259bbfa17300ed784bc0987caf10ca59
+:006150e2579a31b344b53051ff2137a05aeb89
+:0061600159d6240684f70a7809d74cc070e484
+:006170719175f1aa982f79fc7e026f49ba8004
+:006180733d0e637bd4abd8e432d0970e4a8632
+:006190a0824884cb66c407ce515b9e9131d962
+:0061a02d3884c6b72551f3e0c4d2b6d0a803d6
+:0061b0552f653ae3d37e70624f48c21deee06b
+:0061c05078524028258bbeec339c6b289f89f9
+:0061d0460722e84a45ee954cfc5389b7f810ea
+:0061e0c2ec6f4907ffe26ada48e121d274a3ba
+:0061f0a45c77bc60bd2d0e08c3c33ab1ab25d8
+:006200b137aaa7a79913309473ce10f9794ac9
+:006210dba6023b9dc3eef2bda049ee3b4c88bc
+:006220bef83c0b92d07930bece9b37afcd4e75
+:0062300076f2c595ecf38327369bbe0d9d5cfa
+:0062402224564a8aa8c359f9e27f5a67366a0c
+:00625065059d33451fffc05d8c70270e20e45d
+:006260eeb271fa2117b4af3e7b99b63fcd78c7
+:006270a946d58a844909f9bc8f27a3f6c9fe44
+:006280c031ed11114872a764cc9f82223d1ba3
+:006290ff4ed5de8b31a77c26ca2d115c4f1990
+:0062a05ac8c0a9e6bcb0eb48d074f67da72287
+:0062b0ff1292062082a6ec4d81cc489ae19de0
+:0062c0ee8119c0b7d028d801ad766254b2e46d
+:0062d001f8a32ec05d4e2f17fb86a2d2f8b0d8
+:0062e056b94b4cbc02f1e98c227c453f481972
+:0062f08a308cb25de6c8e1d69baa196af5adba
+:006300ea776e8345fd937e283b777abba7268a
+:0063106fc57f03dc79867a2314669a13d40c25
+:006320d13a758f945adad8378050f2a07774aa
+:006330da7c3ea855efda8fe246a92e1b09fcbb
+:00634005c7bb21018fe005e02439d8727231e7
+:00635040aac5a14945196f646daa51fe46edb3
+:006360617ca4c148b86697f8b34d6c22f8a937
+:006370595d6a1f202a52ca386182cd9712a9d8
+:006380ef655da7ef7c802929d9b9f0e51efed3
+:006390f8b0f5645f6fc96692085260d4bb2f2d
+:0063a0b7748d87fd92efc4890904e4262cb807
+:0063b0745de9236bbb82079af7c44068bbfd1f
+:0063c0cbe0c5118ce42d033811d6ca59aaabb2
+:0063d03ade17aedf5e931d6d494672a6e5215f
+:0063e0c26e664be8c2b200e498f5a62bea9c05
+:0063f062b463151c7ab6d61a71e7a69b2d2ede
+:006400c4deadc850521ba6b393e3c8542ac686
+:00641077bb3045064f0a036ccbffe8bb413e27
+:006420964e48ae025aa4f02ee6acf461c4c4ec
+:0064308b7a06d77ed46145b9c6671725486b6a
+:006440a24b7629a493f8a3b0f90560801447ca
+:00645062ffe42c43d201e40e92a866b897c2b6
+:0064605c9b26dd9030d31855668b52fa52c206
+:00647095a7349e3396ca62a4f254f663f29b41
+:0064801b64d480380b54a19278e647df24e40a
+:006490abb2c2b85f98aca914a7210ae9324ceb
+:0064a05fbc1f45435be9220ac4ace8f453fc36
+:0064b0264683ae03fe3a51316c3fe73d71ccc7
+:0064c08ce7f35a3be061852ac0ab76b8aee443
+:0064d07029aa750ee1da8bab8d1f1b93da558b
+:0064e059249a858258ea069be5a8b6bed4b6f2
+:0064f020bab18ed115d97af82258fa9ae23b17
+:006500f417dc4fc04465513ac16100c8fb4303
+:0065107302ba403df81ec4be37318b9785cf93
+:0065209f10b1d471543dbcbc30518f131ac8b4
+:006530f0fabbb78c607dd1ab16203307a2ab70
+:0065402fd7d98ad2104f4a0985e5827edf4e47
+:00655024b5a745328e6f2cf059961a0e901393
+:006560c09bf1071c34fa92ba4c9d1722e09ff4
+:00657044222561798246328bad7833ba352e1e
+:0065802d0fee86908403e1b2aae4453c2919e3
+:006590f58decd8bbba574e25b7215cc9c7d61d
+:0065a0d3d738b498be6be0b18888820adeb614
+:0065b0d901521113e97364f586e9255360b43f
+:0065c0e50b7e9914d8572b8cc85e9aef6a18b9
+:0065d0db64c3d07f91e1e2a69d76785374dd6b
+:0065e02719abca3252bf3ca48b268f52342e16
+:0065f077e540e9dbb31d4a4f809e0e233e0d1b
+:006600a54aa651c890db279a6fd85ccd707ab2
+:006610120c070710f2a88b1f294be6ee0312b8
+:006620db51a8e39bc8f9353c51ec8dafd486b7
+:0066305fa915f9856f4f3c7677c233e52615db
+:0066404ab2906488bae1e97046eafa360d7cd4
+:006650573e6c4d358468879f353e263aa5ca29
+:0066605500f6d2fad9c3ce7ec7211863ed8b15
+:0066700947654b1e930d32d67f76874cff3d5e
+:006680316921cf9edd85b01e56ee8a2c482d4b
+:0066902c748643814a5352847bab12b2342c6f
+:0066a033e75926fba88bf61321478d603c7538
+:0066b025903a881edb1b66cacd1541f610f407
+:0066c0db969b8396dace1fe1e404372a24654f
+:0066d01f50caaaa6970ed1d56d32aa8ff5e544
+:0066e036fb2ec562beb2a5e80f06aa04a5a8d5
+:0066f0221f482c66ffea8c397ae13856a36dc1
+:006700d5ff6e81d9442db92c54b51c404f245a
+:006710a5083a96eff05fa4db3a4f6cc2a3e739
+:006720b2d2016321ecf865e63241a03d79db21
+:006730a4f177b92ab49e9daf6bf1409ad7f290
+:006740491815ba3da4858ec93d41284f33e925
+:0067509e322ecffd0308bd25a4aeb6c67590da
+:0067604dd3f89af211b794b3656b90059ea8a6
+:0067700183587f55f56ae257a6fad645caaa76
+:00678081598ce70725cef6c7de97fd1c154488
+:006790cc4e07a951cb33b2b81edc60a78fa760
+:0067a09dec61d987b304d83c43fe13b0205d40
+:0067b0714d375d78623b75ed35081e56828a12
+:0067c07b71240aa5f7f9192d6f1db90bdd0e78
+:0067d0b9778f5f24d560c7d4971660e32256fc
+:0067e0639872face7abaf57fbc8385d764c368
+:0067f0bd37bcb5bbab36452f228dcf508d61b4
+:006800ba2923e83a5b44ab4dae846096f95bf7
+:0068100561a3d37b0ebbdec9fc86ede1881661
+:006820129512fe266373c743cc7e124550f09d
+:006830fe0a66b44900c4d92cf37c0bd9e66a95
+:006840000a4fbae0d20dbc2a0d3047182a8c1f
+:0068502b347a9a6054324dbf40c2e076c8f984
+:006860ea128bf33689a3f8e673c36f3e577c79
+:00687015eea5664983e5b8058f36188c4f9275
+:0068809519dff62a1e1c35666a3f996fd3203e
+:00689094aa06fad0942fb15b243a33481a5839
+:0068a049b2312b428c0b7d6ead02afba2fa4c5
+:0068b0195dc4e114defbfc4f5be952d05c6409
+:0068c0d379a2df76691a12a0f7ce5b52e47530
+:0068d0d3a3667f15231179c9be14388b70f34f
+:0068e0eba7751883d24dbd135de64b1733b37f
+:0068f02b8a097506569f30016f61475351639a
+:00690072babaedcf77817b93d94d70003f4456
+:0069100c3a91a68bb616340f62cbfd7815cb4e
+:006920de474787e6638b2bb1203cbc974a9a6f
+:0069305e6e849590d118039ef820f1a047ef20
+:006940b01dbd0b86b197d9ac6e03e4d97ac966
+:0069504e92ed627851c2f7f72231d3b99b2783
+:006960a30ee677842b81deebb4637b4906ac70
+:0069702d7ef0ca328ede35aa6d44d7faa5b7fd
+:006980d2105149e2cc67b00dc1fbffd27c572d
+:006990e036fb02f7d433ffdd8af5e2890991c7
+:0069a09721c178f29c46d0be3086b3c4872035
+:0069b008afa0e38b4ec4119b051c2499fded11
+:0069c0faf10d15cf11b48e5c4f7ec468873caa
+:0069d0683f73827b1003bc5c211ad694c1a7dc
+:0069e0541f8e763568ecc17a4ba5f367b2c3a4
+:0069f0be3d264cb07a53ed70abec154e09d487
+:006a00476df96ec827a6344c5c27b8919cccde
+:006a1010647938d7ba6dd6fa4bf92d1aaf5e01
+:006a20436f341498cb5897ada9604f175ca746
+:006a30081284914f22d60bd1fe6b714ae186b9
+:006a40d1474621d5b9adf0c44d5ccdf96e8a69
+:006a5062a53ed529a7165ded9a4cf157c66684
+:006a60c2b9a9ffec2564237fe15cfff9f180e9
+:006a706bcc415e924c902c19212804605828a3
+:006a8056cdbd7d64e3ce59930d57f66a7640c7
+:006a90d557c0778a76f42f8632d4dab7af63e2
+:006aa0f21e841462fa5b5c795f91c44596f5e2
+:006ab0fd0c01d7d33d45f8214b4b9b9fe1417b
+:006ac05e5ec1fc458c873d8f456ab9ba02e985
+:006ad045840aced3e8f1f1756f4d0f9aa745b8
+:006ae000db85083e906bcf6360ba57bec8b1a9
+:006af0c102bb441bbc38a873bb4dc5eccbc6a8
+:006b000b61280bd034da1b4c2c7e1dd6117e06
+:006b105587d4ff5d97c4debc95719d8628ca28
+:006b2057918e6b2e2aa0c50ba51de4ed625165
+:006b3062f8195ef5412248eca83b4ad58cda41
+:006b408249e5f44995bf7b8fe8cb970b79ab4b
+:006b50e60fa230d54a69845d7356cdf8d085dd
+:006b60d156b2bad3c45dea7907aa95c6b0b55f
+:006b702f81fecbed37cd282fc4babe849ebcad
+:006b80e94fa9073b66364f024523f53d2b38bb
+:006b9071622acb000cd5f0c0f27658ca1e4565
+:006ba0ddaec0070544a52ef81f6a6f9e85f64a
+:006bb0ed488b7949f6ba153efc00ce8aac1379
+:006bc02206b3b3a3a0f5633984b483f37a9d21
+:006bd0c57871e87685b0d77141eec407dd0dc4
+:006be047de52cad8acd24e0725855611499d2a
+:006bf057ea74ce512886442886c0fbde7c0386
+:006c00d24215027dd094ebe10e5a2738ac9434
+:006c100a50a550ae7b0ec5b9cc96b6b9ce038a
+:006c20e05c0e0efa6d9dde5bcf44ae100c7497
+:006c30cd4db74ea7a3688f0c2158d4e260a128
+:006c409949ed0bf3ef1311c91436890f3bc61d
+:006c5024866636843dd7a3055b43eecb231dae
+:006c60bad987bd8429430564e3d025eac890c8
+:006c704aa3449934111acc506d40220e02e168
+:006c80eefb65190d903d3f0b712749d2c13250
+:006c90ed79f13d8607789db6ca70222930c3ef
+:006ca0d699a1a241c24a649af6be9547ee1a47
+:006cb0a72f5a8c64eb24a74e13c66f9d305480
+:006cc0c182b0963f2ed264305bf4cbc09862f1
+:006cd0240fcbc6f578ebf2637f4733391277da
+:006ce02ddea1091c5254be0c9f3e4334efa8ad
+:006cf03dde458c3c2040235c5d821a62f0ce92
+:006d009a5ae0b2564a668b1c18f129b9d95800
+:006d108a79a6aabef1a9f98d3b8ac671f45493
+:006d207883136b6113a6456b44b4c13484af23
+:006d30ceac3355eac4d0de2dd8a5109d41e20c
+:006d40803c04d797b7fbb3ef46f9e786257bea
+:006d505cc050df8df8a1d1dde703169c285e47
+:006d604ad058d6f66426cbd33af8802a7eb65e
+:006d7029c1d21af5e775ea4ce06b2330757455
+:006d80002bd7e08463d4bac45acd313c66a578
+:006d905cbb167dd1a0393f250bfed6d30f90d2
+:006da0b1413c1b92fcbb896f68d1ff0a4a9189
+:006db017931fc93fa6b7000e62fce690d1707c
+:006dc00307cd362f89dc73347316fd1ceb91cb
+:006dd05423990adfd8112e0177fd38f4f23a3d
+:006de0b1039455362dd5002098f379bc28bfae
+:006df088cf8d027804d6f6763ee990cab3e676
+:006e00f2ec29be4c277cf6507479a932d4609e
+:006e10f4f91100228fb7a37376f905cc135079
+:006e2088328c523470d0b1087d2859ef62fea9
+:006e30eb7eb1278e13589d11ae872665f90e95
+:006e400df0591332d6eb001a48c4df91a41c92
+:006e50efc68ba552dcadf5a6cb0e9d42ab80d7
+:006e600f15163eecf1863a98d2a030fc00c083
+:006e703e9aea98ee6e11ade586d4db51b1458d
+:006e80b178825f040243856677863fc9d7ce8a
+:006e906dd94cd8cf7082927f51d22d373af85f
+:006ea06574f28e49acadce799a5d5f17167b53
+:006eb028b72866c96e3dd0f450ff6b64c7b1c1
+:006ec0d691d869eadd504dcc0276682489ec09
+:006ed0149f9b5c472cf7dd16cab368a1dcb4a9
+:006ee00bda99098e0a2bc75633387925b24181
+:006ef01fb3225341880138be9835dd596a2803
+:006f00b92b03da90aefb258a4d584015c6cfbc
+:006f10d890b4674ceb650291de7fb887b8ded3
+:006f2095cfbae44782f099957d1aa7f9d71ec9
+:006f3012d13ce11ffe736b42df66e412d1bfc4
+:006f40da46ce95e26fe4dfd480343e75eedeaa
+:006f5009cde2b23312858ca9cf28bb939a699b
+:006f608088234a7d7e567c01caaebd3fa6eae8
+:006f704ea1501f5e55d53a37ad9c35e90f4f5f
+:006f80679ea94241853c4f81254569af2beef7
+:006f9027d90a1db50aa25dfc275fb2441478db
+:006fa05393263d0bd09545d29f1803fcf4f731
+:006fb0e702beadfaee8bea59737554c4028e77
+:006fc00d59de552c2989634fcec947057f436d
+:006fd0f0450dc7afdcb912950186e3ac1bb367
+:006fe08ebf8525f77dc1d06ef9be96146deb98
+:006ff0ece2bc3ff00d477263b1560ba8a39870
+:007000fdea02a5e15d057f3d18462f1a9a5bb2
+:00701058f2b643faf7b707f2242019e9390387
+:0070206d52d1ef64ddbecb68486db9fb7242fa
+:007030faddaa913b90a7db17a7427444b118df
+:0070404c44cf3407a9d9629cce8154910be6dc
+:0070503d260d0c20a74ca0a1f392053bcaad88
+:007060eef81188026bf7884e7159c1bd3aa529
+:0070702207975299bbcc79a10a19f69e7e8688
+:00708097e09607418bb8404ef1a05428c0871c
+:0070907f18db1e507e03080ea8e58d57564240
+:0070a0942883e968d58dea2e8e86c413bc5928
+:0070b00a8cb16a8ea9a2b5e2f7e52045a882af
+:0070c08db5d7a52df427367edeb7cd5eb2fac0
+:0070d0784921c8cd14d28710a00d38f2ee13d3
+:0070e02ae142e260d2e4261193eb2ff27d6865
+:0070f0e96a3c4302e8febe98f7058da7ec61d8
+:00710045f380ff387a932d5074092e587c3231
+:007110a85e42150f9ce653abb3f5de5345fc13
+:007120804da635c08ad20e45a5434793fd72be
+:0071305511d4c3eab7489238b7c2b4efa87f0c
+:0071402cc3e618b1b668d8b439fa1d85b13618
+:007150f463b5cd4ffa718e2267a9f503d2d175
+:007160462dd1460754fded98a95f9249f6b56d
+:007170c545f02c01a50ca58b5513fa990d700f
+:007180c001733911ebd12f87d59bcb429bb86b
+:00719099c9653177bf427f324aac9380577d4e
+:0071a02db4ba6abbc40a0578e062683912efdd
+:0071b0d17c365e0b7941f4a4889fde7d07ccde
+:0071c0d8601253ee5887f2211a7c27e75439f9
+:0071d0290c68f452fc6b7cb697862e53366d6f
+:0071e0a0b811fd170839d3cfec67a6851e8670
+:0071f0d7d602a8769824c3303deb339ec384ba
+:007200e251bf6a36eab16085a4b3d51bc53495
+:0072107da6b6d47e094cb1ea580f9960516ce2
+:0072201cfe7179640fa27d20b9577ed2420919
+:00723063ecc52c991c6697328c23e780417e47
+:007240985323d49fcd6c7120f82dd383952c2a
+:007250f967aa4a9d141b8e4975a6afceb108c9
+:0072609547ab1932f90c7a5f28d5999dc30ffe
+:0072700c02bc9fbaccea594559f5199f4047c0
+:0072804688e4ec9f859b7e447d555e4e60944d
+:0072904308140a20db882278f912b7a50722fa
+:0072a0f5fdc322cefe1cd32db052876fd988b8
+:0072b0438d1e9eb6feefb2c23873cc34386bd8
+:0072c033d1adce5e222561215d651b906897b5
+:0072d0df51f479e78fafab2e4dc89f184a2d72
+:0072e0158bb45464708cc7f8c27ac8bdd8b2e4
+:0072f011d023e144af49565ad9be63c052ee00
+:007300a75f2f36299eba3d658ec35c99d42250
+:007310670fea06f1e78f143916dffcb7482769
+:0073205c527e9daa73b884e7ec22ed4892ceb8
+:0073306a7a2d1ba9035b84348534d00e083cdb
+:00734039b8aa0b64b866dd7cde157f97ca182b
+:0073505e40dd255e011335f4d37dd58be250d9
+:007360dee072a87e1ba5e85b0d7e10b352f4b9
+:007370f56278f081cca4384f416d0058b4187e
+:007380c8bce04e5a03e3becac85ce1dac58e5b
+:0073906f09c52c6dca7963aff1995b918f158f
+:0073a0af1ac6f1ed4b890e49a1ea1eff141de7
+:0073b062ef45e48816bd9ff03093ba2306e494
+:0073c07e37dab9507d03b09ae125856a7825e8
+:0073d027b06c68707a84d2d726d77a826db350
+:0073e0481545fe6d2b6eb19b09331e97a0e9c7
+:0073f00acb8e11d1306490df632d73c6d0f144
+:007400ef98d3d6ebf117a710de44384256f6b1
+:0074106f14d4daf6e0b32e8b34c9f7c11c7542
+:007420f79b20116bacd5da5bda9fb31924e415
+:007430c03645d587187ceb98026f59f03c37f8
+:0074402809919e94a5e9ed556d40e34d06b53a
+:007450163d3a632b1b83429df559d69d45f91c
+:007460ea43e82afac3006d4182085beab314c8
+:007470b84c0cbb4198b333d096bc35bda6d39e
+:0074809a8479a2dfce415bb734b3f83e29955e
+:0074903f728f7c63fa82be555e9a2ea30c7f84
+:0074a0f12690f074b8d7255ef1087a5a607a33
+:0074b0cc3e210a6c02074be9a20e05c8bad9b0
+:0074c0735b23e57e203cb1094ce5c5a06542d0
+:0074d07b5e8560f6e38d029a4a46a649b044df
+:0074e093e8d7f3d2d196a643ff37366bf0ba10
+:0074f03439912345015860835cbb85c7e82432
+:007500ca52fa87bf80140c757b5009d687eba0
+:007510e9963fff236871fc24b14ec3006bc8bd
+:007520fcac3d658ed632ea763ca8971945def4
+:0075308aba09cd154fbaf8ee647db911678f93
+:0075404b06b83f3007fe10c8911a19aa997ff4
+:0075502249c031350a86e19914088705de339b
+:007560e0279641bb75eb4e20e7e11768774584
+:007570dac3692e3f835cb5a9df5d5b6e452503
+:0075803dd7fc51848f115e53f5d83728bc9a68
+:00759040f11880037cc14f01a4c060fee5fcfd
+:0075a0a1345a0d598409d22d95a577a8ae0c0b
+:0075b042ec49317f8ae601ed35daed218f5b57
+:0075c02a00e086d6d55b1993778efc48e0a39b
+:0075d0fa566574da12a093d98230615a75bae9
+:0075e01d34aa243e153724b2a8c9ccb470971d
+:0075f09f0c953c3a51ff4fa48e29815f454364
+:007600c60b8d6e7a20182b384b6d3f47759521
+:007610365d088207b9f7fee3d8728200f9e3d6
+:007620f7a2d28d2d3176242eec5b6eb8c0febc
+:0076309fa3cae15d1b2a62c8295372cf54e6ef
+:007640a368350c5dfd659a675b63b9efc315c7
+:00765034f705e6e2b0d5b1eda16411a0db4721
+:00766071af963a5540c0468f520b400180fbd9
+:007670395b0851dd4485b5c780d99807e46661
+:0076800ad82900b07c149d7ad727b86d995e0b
+:0076905d963d8fabb9557e23a10a5fdd210f28
+:0076a0106599dd7922d2256152f67707118177
+:0076b007b46067ce655d548d4f9f5545251dda
+:0076c061ff085873c75916d3ca27b1414fa31d
+:0076d08b5ba5443478e7d94481d2447ba5d7c9
+:0076e02835150611715913115be627c7bd7a6f
+:0076f081b17f5a937502da232fd260c6839aae
+:007700e5e4b9b9eadd1794a86f555efd14d478
+:0077101a7c91c3247db1265596517ec1b64e1e
+:007720c0c84b824f185582862dd5171e8886a8
+:007730c210bd8ba4626c1e99f97c469af70818
+:00774093fb4aa4e92bfc4e4e9c1c1c4d5e1f02
+:007750e542838d9137f6773af7d9f2144e52ba
+:007760927d94299b01d8bd7b4dc24235c2f766
+:007770bf13937f625c24c9033915351f58744c
+:007780c069cbdf25c0eab20aedce9fc1475024
+:007790daed04e14efed15ee7a2b528a9a28419
+:0077a0f9bf92425dfc34993d8c8b9ae5dd54db
+:0077b0a2b9285db61a488da9e8343a4783be3d
+:0077c0436a78a4b199a03134c40d559443810c
+:0077d0249c12c920f9f1ac483bc5f510d36597
+:0077e0315d242b53af32b174066d26c63cb3f5
+:0077f09cb0cd4053b38b474bfe86af8e1fa384
+:007800e8d5806b06f5648cf49c677bcb7a548d
+:0078102fc908088db6f4bfa17d2b2d683676b0
+:0078206e526b553dbaaedd1924c823b131f4e8
+:007830920c8eb785b31b1939511d8cab8fe619
+:0078408d1fef0f092bb7485d0184532b939653
+:00785030a74065e2d50adb5982e77dbbc1d446
+:007860c8498394d0f1d0d1c453c0d291c4669b
+:0078701b1292ce1c5f84b3019ff8879a633d76
+:007880d9a42687218de1d63599ca3eac146729
+:007890f841578d2ed75f31c23a32288bfe1ca5
+:0078a06f2eba32ae1e60cf6f3849d832b9fb13
+:0078b0a1238cc2debf5686b9248b90f101c7b0
+:0078c0ac79986a5794cb394d3d9f1409d6c71e
+:0078d0abe047c66638025183156fa1f20b3036
+:0078e0e698021ec5554f8a990b948d5138edfa
+:0078f07cc2bb07701511f786f9cef954b8cc4e
+:007900d9364c5cefbc5a669d39063c7c2b5599
+:007910cb101d267cc92ab92f6bf3cb6869d314
+:0079209766099e62ebe362d60b6b76855d837f
+:007930d49617be14f5bc3b53f2375ab560a467
+:00794044eb711ed05dae518ac1f2a3fd3ec4b7
+:007950a740fe3375b2cb4255d4988345f6c5b7
+:007960037a61c50951f01d677174f857c3984b
+:0079700c5ff2774a246e73ead24f29949752ea
+:0079804204623706926c53d638a20174114783
+:007990f19301f889bbe7dd47b6a2bafa09c66b
+:0079a0a88f67ea3a8e0ad4de7a0cc199b4da6e
+:0079b01495c5d4a63a72e637539eb21a1b0fa3
+:0079c03a19e59644cbfdab8149f6f93783d728
+:0079d05cadbb806d8796e38c001268ff230283
+:0079e0145a7b5c7edd941db2a5ed91c932599f
+:0079f0b1866ada7c9bd02350b5eecb20c653e4
+:007a00efd847856f623d1fe4e6a4cc4584d2f1
+:007a106489dc4ab9c33bae74c1b418168fc00e
+:007a208bcb3a39a54252ef8ccd3f276f643f80
+:007a3054dbc26dea9e286a4f9a30b4f5e740fd
+:007a40665f134f5c75be75529e4cc34beb36b6
+:007a5013de2380f6b52cbcfc9ce8717e1c0696
+:007a602b4bf4e2d55a4de29d1baf69912917df
+:007a70d1f10a2657ff0fffcf02598c595cb566
+:007a807f14792d7a5a0c043539ce059c5925d0
+:007a90a89d1bfe14c385ebcdfb91b73ff5bbe1
+:007aa094a684b9016daeea424d3694356b4b82
+:007ab074512656f6ad502b9c855000668b35f6
+:007ac01afffb45556f7ff95de7af69fcfb72d6
+:007ad033b727a0e655c224b1cd545e39fe050d
+:007ae08a5afc7806c0417c226b46e9e0fb2d8b
+:007af02714348781e6ed81dcffa57f8a9022a8
+:007b002fefbe0e1fc6adea1d2ecf25fecf4375
+:007b1092b37da69acfadfb638a315d0a70b4e2
+:007b2078c02d9321ea93e4e533e077d3e02502
+:007b30f39051986d49d00d080ae7045c478b95
+:007b4058fcf4a8ff93ea2471b9a56cd3b78c44
+:007b50bc6b587f6c08a43998bcc3797b25bca2
+:007b60b42e507f8e059170b837272b1133c26b
+:007b708067111a177ca1fd4aa541ddd6669c16
+:007b805eecbfdbc65897cac08118ad5e4bd4a7
+:007b9027a479f0dbe1c6104f873d1fcadde867
+:007ba03a2a03402ab1468bdedb21819bb788e1
+:007bb075c3fad03bc19de745e57550cf1e0d2e
+:007bc0fe7ec3f39afa471836b8a5a27759d01d
+:007bd034ae61547ada3c61fc1948fd4c1a252f
+:007be0554fe2c12092c1346bf5e8092b6ab793
+:007bf0fc096ceff7e8b4e3e9e936a432a7f647
+:007c00986d29bb93148df134e76f60f87eb449
+:007c109e0e033d366e5d35693a6640f7a39c7d
+:007c20cd422e9e8d9375cfbdc7d45bb6ef1f5f
+:007c30b9469c518bfc4c9b33c85a72fd421558
+:007c40746443d18e6d45f29cca605058fb183f
+:007c50f2a1f1f3280aa341d388643459cdc544
+:007c609de6c475a704163c3c8d4c0ea18429ab
+:007c70b34d9d69a6e53a92fbdb58674c4e4792
+:007c808ed7a30abaedc938078e31ffe614f954
+:007c909c345b3ab150ef6da5b457c9be9d5857
+:007ca0bbd8f6d96ee95eb36e8dd02833cba550
+:007cb0b0c38d35d83f3ea8da3c498f3498e798
+:007cc06ca1e4b74668c8dea3ec673b65f8a26d
+:007cd02dd333da79f7b4f547e6f208998e3851
+:007ce0c06ff3ec40e6c7f028ee4daf00b04581
+:007cf090d011590e62386003ce1fd3131d5e56
+:007d00edef342f2f91366a6c9b9ba0e4475fcd
+:007d108617b82c44e0d0449fd63c23f7842f05
+:007d20a9daa76b179bf198eb7bd27a2b40abfb
+:007d30eefa7e0d557f9c60d96851fd91f55a5d
+:007d40dc79601f1cc1328eb1b3c64ccbf9d592
+:007d5052b92d7d5ea43a2cda0f079a7b563ede
+:007d6003fe59a531ca7fb6b9bf98c849422b78
+:007d708d8e1733dcb66e9f68b257a010ff97fe
+:007d8046c6140f964a7f0aa604fffd071b759d
+:007d90dd6053b1def4c1b446cb486c1293a148
+:007da0aa45710fe255ceed473fecb39926a592
+:007db0968b95118aee9fba6ac5fc281ac4e801
+:007dc0ae375119790b3f5e18075c2f261967a8
+:007dd03dc03ba71d0929b837c5e4cf69905939
+:007de01a3827a9e67ca492c94fde5513905ef3
+:007df049f84db3db76e62a67179260c585fa1f
+:007e00437b1c263230b526cebd27a20f0e4bc1
+:007e10e4d9cca707b48dca7531708470e550c7
+:007e20abc351505d8566c0cfaf72e01c8417ce
+:007e307a9ef666aea388be95667ab8c14e7ad4
+:007e40ca5f0a57fd8a2063d67068b5ba18971e
+:007e50e59881430aecdc4f05c32fdefd72ba55
+:007e606b6c44b275263bb73161d7b19de799af
+:007e70d3df5d38bd5d0c0c99fabd6ee78e9674
+:007e80176cd41b1032858f92a23d63ac71b79b
+:007e90ea2894bd4b081da1f3952a5b3706d856
+:007ea04d749d25d8fb76a4288a1599db5f9d8f
+:007eb074194d5463b4bed4e2e9b4a0310e2a4f
+:007ec09c4c1ac84db00c19ecccf6752b3c9ef2
+:007ed04dcd7f30dfd4b4d1e075687d4774de2b
+:007ee089c1526ad3bd99a784956b0ef4507421
+:007ef07509dac652bf8afebfd3fc6319e7e983
+:007f00f93847d74f5481ad28f1573961838d95
+:007f105a65d39b80207b29cc59f944e0c8870f
+:007f2071fcdb3bed7a280e50896b42c6587705
+:007f3004554900101410cc018379c4fd563783
+:007f4053dac650c350e2ef7377f4b814653981
+:007f50685b25d1c632d8febd13750a4b2782b7
+:007f6034accbd8c66cdc7b2ae6dbecb31e68ce
+:007f70c9739926b11ded0ca5321c70e0c4365e
+:007f803f4afd642418e7673d773d69c89fe96e
+:007f903b54c18743bf95cbe74644924189adc2
+:007fa0c7d4cffaf86c882de78c22fb84798906
+:007fb0b0028264bad43293ab8ddd18798f5e21
+:007fc0cb701c8edfc639d55b219243101a6e02
+:007fd0479153a08303072ffb14595a1aa06d26
+:007fe0a2dd22061ebe0384676b9d5c1f1bdca2
+:007ff0b8098b1cfccd9df1ca5f5b34fa02ff79
+:008000eb9b2575d0978290091f110509447d56
+:008010fe0c9d2490f5b9b51fbf80b808a5753a
+:0080202045a302b4d31daa8ec58b61c7fc2f87
+:00803002f0eeec656320264f60c3ff320c2340
+:0080401794d352e1ae1ed3de655868971d1c13
+:008050f09638dc30e6a80d4bfdd1d90e81b6be
+:0080607f42c2d6c5c215b8ee3f2e7a0434bf19
+:0080704498415a15a7ebaba2de25ad2178c2b1
+:0080809797382fab6ef7249f76d4d37ad21dd9
+:008090e9e7ecc82d6bf2dc486efd21cee921f4
+:0080a072f990a8ae557591a034653e113d351f
+:0080b0d6c777e4a5d33e28d4cf98a23afd4cfd
+:0080c06c57ae7f58dbd7cfc6c72e6b5b41d8af
+:0080d04862bc0447f44b32ea982861143b4e95
+:0080e002ff765d229e3ba2cfe236e3e3f1eca7
+:0080f0f7e83acf857f2874db3d7f2a2447201a
+:008100c3db77d65f238c5d14c9b76b25fafc1f
+:0081107772e5bf3c8472b66688d45038ba72a8
+:00812025389a4ab93d01beabc7c108ff9c9878
+:008130fa7182bba201b826f73b06247ef41262
+:008140aea8b49ef7b3ff52c8585522686b7c2e
+:008150975892e6c446623ce99eb18fff8d71d0
+:00816038f663e805b1dc25d164a663ce34398f
+:0081707927f589d0ced47db211be46f60f3ec3
+:008180ea94e01a8614235eba15229135eb29b1
+:008190694f6c96a6508b221b56e9c9e4153ae7
+:0081a0dfa312dd0d0abfcee230fa8d78ed7c80
+:0081b02646ef3a9f02a497d3d85b29e7a75594
+:0081c0ab95f35e7cc405c8757b3e7da1ce749e
+:0081d047ce3712bf36fd0649028c4715bc8dfe
+:0081e05dc842d06889312a619022a726caa903
+:0081f00db7a715af9ed1fa7184e2ccc40d646c
+:0082004141a4308fb81414c193cbcb27249398
+:0082104810782bac0707f0d696dd8a11494d2d
+:008220d16b8277319c630453d1c77db8eca99f
+:00823045726868edf0e4f2c6a7cd526c72308f
+:0082408d2218dd83aa8dba4a5cb9ba1a185a85
+:0082505fd80c6a560510d411326512a9ce5aad
+:008260b8176d3322b99a7706e170f2b85f64d5
+:008270d2a7b81569cadafb0832c7ffa0d578b9
+:0082807b8b5b007aaffdaf1bce02bb0830f201
+:0082901c51eecb0ac3dbd67a7dbe84d7069d82
+:0082a01690b8b3d5f76f5d8af1d58881bba05a
+:0082b0b6873f872a644a7810e343f6a53f2ec1
+:0082c06d10b5fa07aaad666b2695b5dc5f9564
+:0082d0acbc186b4ea96e0f4da297b6816cdfa4
+:0082e0056bd3edc597ace5864acbf0095eff0f
+:0082f0617e6ec5b93764f892846f8807ff9b6a
+:008300facc3125cff216bc226973a0126c6a1c
+:0083108a93f11d4d0f5a38a221c72ef5792da6
+:00832031860edf2b1407aa586039eff1fd3362
+:008330b42b949c63bd93afa25d8dd7f03ec168
+:00834071828886bfba2ca1437ef7f102045243
+:008350cebbeff4e6880e589fff0b077678f101
+:00836050f9e6e382a46813c3857393c435c8fa
+:008370912454455b144ead69bd3227276da6a5
+:008380b936b6dc5f54a0b73e5469b666c62da3
+:008390aaf405fc5a2b446bdaf3e9929f26841f
+:0083a080009c20aa3d5fd416a6d38b3b6c99f0
+:0083b09a822d9b9396f7ac60cece13de962694
+:0083c0bbac7fc6c47d3c5423113a13b40c4a4e
+:0083d025b7a4a96aa9a9faf769c1155a2f85c1
+:0083e057e333c9e3cc01fd4d30ff1be0a424a3
+:0083f083d442a5bcdfaf78e1bf0c8f5ebe9d18
+:008400ee14a04a2ce37f2b5f178be833e0b072
+:00841044c783da54cf3dbc66658590c22a14ad
+:008420a815cbaa301ff497da1d66b24705a166
+:0084306d4e10f9ce30124e188f82e1031afdcb
+:0084401cf6d22416b52a2c3386d9677544385d
+:008450503eda8ac92a059232a9f2803b924b8c
+:008460b894e5267e989abda47e629f6d462944
+:00847048494b629ae626b0966a3078c15a389a
+:0084802e56ae9e1f329c2d1a89a53310df7322
+:008490d40b618bae46d7f037f7b61018eb4d1b
+:0084a04e198eab824d1fdc963bd390d6a2a9fb
+:0084b08d7d759e50e2026c157ca5fd6b97841e
+:0084c054d22ebdcc72784f7dde92e03a573ce2
+:0084d0ec8b40ccf4840c398c0f10999d9239bf
+:0084e0e2602cf62f4c9b415ff9f8df7ec70559
+:0084f01e8d9720197ff1094cfc18fecea4fbef
+:008500e7548c5e8e630a04722f7571971e07f6
+:008510dd34a3b075bfa606db60a5dcc98f58e2
+:008520f0449a404ef6d2ca69d1d614f0b2a465
+:008530e773401792fabb0a5d419d194e58bc81
+:008540d4d425565effc5a73881117cd2d9d447
+:008550458db7e541dceba2e4aa34e48b97f8cf
+:0085601577b167d0f4b6639a8a44804b49efe6
+:008570e12ad718ab445277546ce3f26d0b55eb
+:00858029e452dc63864f16a256ceca458dd5b2
+:00859003ce72189f823c4cb605dfdfde0d8e2c
+:0085a050105b1be8e072d4153aaa0927f3619e
+:0085b036dd6495ae14a97bc3692828e588688b
+:0085c0150fdf46711f217b0fe6b3adabbecd64
+:0085d01a328befdb6c63c5d87d5d681ca891a0
+:0085e0755e6eadc7e20f33babc69467571cf27
+:0085f07da7c525b00651521f13ad48320af4b8
+:0086002572f48a96c0bea00e35d6e0e0911670
+:008610cb68a2f620181f4e6e0258a7e43c3a39
+:008620954582bc155caf70ba4e94612ce2f04a
+:008630787eb93b0db6a6cc3c93fd72d0f79501
+:0086408dd2f4008dc56ccfbda2b8a8d11a3955
+:0086507da2f5c0be3f50e75eb372e28527e004
+:008660ea4e55370b6a3622981d8016216db953
+:0086708b4fa0cb61d284a3a95499874c7732f4
+:008680ecc76581915cade4486e853ecd194ca5
+:008690821c8a46215acda6d7473a30211c1460
+:0086a0425d211238e4a39567df7a47e51aeab0
+:0086b0de1a24eaca626e67f12b0531d3a85992
+:0086c03733cad8b85f4130db3c8ea004b473d2
+:0086d0a5c7c50fb567f2a024bdd07b9727f9e4
+:0086e08433cf04dd3c116056d97fe423ac43f3
+:0086f0d9bee4c690770caa52cd4a6a553ce821
+:008700eb30c865a103226db8e64c72c5f282d1
+:008710ceb2d94d36fbdd2fe514563394e4571e
+:008720f41d80d21f483ea27057856e210b19bd
+:008730ae2c7742ca7b95191b288d60e8512d8c
+:008740cc1d72cfd2a62622965eb496fe5753b8
+:0087501d6d9ea81443b962ff30a2bd00e6c41c
+:008760ec41e852b1f6c5247dddfd248f435da4
+:0087704efb3f708f9c4fb3f10c8927d5e5685b
+:008780051d219368ea1c5bf0efd9f62483e294
+:008790587071061ca2a4bfc921a0afd71fda02
+:0087a04a055329f1097cb13ff62a0314a90d6f
+:0087b0b9667e677005080492570c981210f06b
+:0087c038fe1e390b9257a2244f55564b093106
+:0087d0ea42aa49410233f1a4ced536949fbb3a
+:0087e0372d7e13a48ff67bc4d642465e85a544
+:0087f00c83708a579a8dd16d6e196d9bdab415
+:008800b0896a06cc6828cb877f945c36cd8a91
+:0088109258c9a26f26a60ee4fa9efa4947e93b
+:0088201adb25cf3e921aea3d01f275d1de9e23
+:008830e779abd7709642e3b1f4935bf738f4aa
+:00884097997d3ba7aedd8a135fcf439fec6016
+:0088507b2928a12df33a938aa171c7275bc8bd
+:0088601e1181c0dcadb0d27d61484600333cee
+:0088706ae7e895d739eb652b4ee372baa7ada2
+:008880c5e486aedcee8098ede373cb67ac8e35
+:008890f23d8ff3cb4861d9156b2d9ad93458e8
+:0088a0bfb041f3f3431146cabc75ab3a160db5
+:0088b0f0784cd3472f14ae0dea645f57feaf85
+:0088c0045ecd9f5ad4d1dc5379d3b15ad7ddcc
+:0088d0d6056a97fdcf0dad154842207c189645
+:0088e074e50bef2f285505cb4d47a0e8b3f6ad
+:0088f0e59e90074133f60efe2cf837e1c9cf63
+:008900a6f1e13deae945a22abaff57b441de79
+:008910ad6e14f00dd2b5588e35bf9f11c19d79
+:008920ed1dc4b12e5082ba956597862b0f4ed9
+:0089305ff5bf50a39b01837009cb69aff55908
+:00894004eba0e69c2c0caefd0be04b3697a522
+:008950e6d22ef48be4915c744f7497bc4bfe44
+:008960eca4490852872e149ef4f836095b5455
+:008970e905b533e5e5eb6eb71bce7bfcdd8287
+:0089806153aabc47b15bc7b1e33f2236cdfd89
+:0089904800a1f725502a161286d253c4881023
+:0089a0450e77b5ea33ccc6f1b5af308dbdaa42
+:0089b0eff70f871a8255b716f9b8accc5d60a1
+:0089c011cd293a27b47c2594860046f834d0d1
+:0089d0ea66e21eb04afdf1d73f3f8be2b029c2
+:0089e0d87c26de5b5d839c26a41623df69c2db
+:0089f08dba299532279e4297a5c522f9a16e9f
+:008a00c938df9ec329f719771a4200da0a9b2b
+:008a108e5e1aef5d91b4ac5603e0631375c963
+:008a2031015260cc678a65c491a3448cc0d148
+:008a300b50414b393c25c6afcacf648f7d1b78
+:008a40894d3fbaf03243301344c17c63f40a31
+:008a500f343789fff725df4780387f64a89882
+:008a608b5af076cbc7cfd24733e0e162abaf0c
+:008a704566888785dc185b09e87bc95ce7e1cf
+:008a80c982a7f9ea97ad8396fa97339a2e97ad
+:008a90e534afe85353ac96d0c38164e0d68e04
+:008aa0557a98fc44f22c92ea25fae62ebe48b8
+:008ab038ceb35a1614820469bf5aa02b23dbf2
+:008ac0213de46632117ee59a6ca1ce43b4fbac
+:008ad020841956231dcdc93a20be7349b2a9a3
+:008ae08b3f01be7bf0620f4331fd8ab612e1d3
+:008af03fc0c69812bad02183b751714c50a551
+:008b008b5391c79c13d23be1de7fc8067a2629
+:008b10e507534fd76a21a1dfd98842c9eeaf2b
+:008b205b6e3033ae46e2fa2104ad96836f210a
+:008b30fda26b4893555840a93c1d9f942064c8
+:008b401049206a02191dd1c5f8bb398b830272
+:008b50fd1c2db94ecfb85681a0935401eb902e
+:008b60024ff5bb9039e76f7d9cba7f3956417a
+:008b70071d8cba9598292d82b3b3cdfdb02f81
+:008b80b05d189c57fbd03a720dd3b2765105a8
+:008b90fb81e54d7d4d288171724b1607ccc1f4
+:008ba01671cc447e1506f7f27569f622d8b74c
+:008bb0f0b96e7351956e29afccf22a53ab5165
+:008bc01c241a95f81177de7e5fc2345ce0068e
+:008bd06ddb7c5a732e9175af586a175524182e
+:008be01030229538cb8951615454154f7cdc34
+:008bf0105c1edf90f112d6c277152ae3d3643f
+:008c00d31e9cac02ec08ca1155cba354f39f63
+:008c1051d48e1be9c5c9f2101464194cad04ba
+:008c20a0dda198bea70f6d69890b7727995ff6
+:008c30a8662a5e83eff8fbb1ecb3ac9331950d
+:008c40a1461274710a7677014af75298fe5b45
+:008c503a015fc7dbd2baf98509a87e157b7ad1
+:008c605d3b7db4aa5cb270b2bff9c2a84c2f31
+:008c706654dc8bab06c13472e117c25a5ed9a9
+:008c807fba2568e57085242cfaf7206fd9653b
+:008c9079a78ee23e2983b2f615d8470fb44346
+:008ca0c8e878485ed566e263c82f51e3291b81
+:008cb027d1fb62aeddeb452f885bd53019d870
+:008cc0cc80a8664ec14e39a4e332a43a064073
+:008cd0faf8de88c4c42276f445b0b89fc9432e
+:008ce0b2f5d6ced5843abc118cc40c0ab127ab
+:008cf0aca0e6f14ecdc2980a3a3f747d2723bc
+:008d00aeece7c71e54e0ca8c77be04e4ce33e9
+:008d10cb3aac85b183d29ce6294a9f2f188175
+:008d2071aec143380cc8cb11f3646f66a7e9f5
+:008d30eb8b09f69c7f4d31813c88e76effa4aa
+:008d4072626fe75aef9883a6c6004676d1ded4
+:008d509ae6df6124d3046df91faef895401557
+:008d60141aaa5859d353faa13a8f40d2f0285b
+:008d70d9235a25243fe190995d9fc0ee8ca14d
+:008d801202a949486541699e11e3fde3202c1c
+:008d9048f2939ca1e38092449f134eed399172
+:008da0a210ec41dde5b8b99f3be1a2b82daed7
+:008db076640b704575e9a026f2ab66898e530e
+:008dc0ec1d14d9f241dd480d82fa9c931bb281
+:008dd039f8b260f9425f837b73512149fe64a1
+:008de088c87fde5be118c0f42e90522deaf2d4
+:008df0087a6c4bfaab83b1add113ccbc0c59ee
+:008e00d22ea343039964d6aabfea94d88a5c99
+:008e10b2010840d1a574bcdb091272838529dd
+:008e2084aba010f8ba35e41daec42ac60f0222
+:008e30e94cf8dd527ba1ae778099041f9f9f7e
+:008e40ac83e3b9a8dd4f43f30f256cf7d1edce
+:008e50e47753f800fe2330c5d4dc5fbcfea518
+:008e60266ddfd30362c2b7ca050d21adfad8c4
+:008e70b7e970c19330888c12ca16afb8b9d070
+:008e80b059efeb429f223f8156a87eb23a1ca7
+:008e90cdd31eea46e21b551a0d9d2d6d8f5753
+:008ea066a7f5225855b9ac18102945d143340d
+:008eb031b6d05e451b1123a896fd854d7b70a4
+:008ec087ee42a38c5e347bf56e7db42be7adc9
+:008ed065813c030a3127b2dd6b498e823ffb96
+:008ee09d5874b661f92bfe0941b6172e10fb54
+:008ef0b16f8ba06c4d611e50658762e41f51b6
+:008f00a818f9ce404a73f0f0e921f4d339e094
+:008f10d0eb43ce42b91a316659b4fac1fc30a6
+:008f2060aa8664e4b53009e304d70250a4b28d
+:008f30182c669e14f2062065af355b397f8603
+:008f40bf8f6bdd7de7a63489a03d4afb87f6ee
+:008f500a7a1f437c089551bd1ccd240338bead
+:008f60e43cae66d81c4632beb8c67a6d0aae2e
+:008f704d5be2af6f96c1297b73a236ddbad092
+:008f80891041076fad7afe2708d48e8ef89a42
+:008f90dc374bf6a08c005241442556786d129e
+:008fa080fee917dea81e7ea88f2fd9575d7f04
+:008fb0f36d2761576b955c3a3bc261ad3550b6
+:008fc001e8c936f455e278691e2e9dd49462b9
+:008fd06fe0b2e09beec7348ad6d4cb4ae65220
+:008fe0c4ae9796b3c0aee10d365119e5c9a0cf
+:008ff06d6f234effee32d9ea340e88e0961f16
+:009000fb70c408c58524d4db5b3ddf50442fe8
+:009010b3f551cae530c1db79215d239c298de2
+:00902045d94ec00c33e50cfff7adf72dd493ca
+:009030f300ff326e6fa0642fa0a12b0b90677a
+:009040c055dc3cb35019a9a078112fdaa0f495
+:0090501ecf3eedf14b5a5618585e6cc8c0b103
+:009060561c905886a4bb17890c47d53e62f0ba
+:00907068974bc65bf69a7e3948ec68a55ff51a
+:0090805597bbe6e7286df766a6116c2e51e535
+:009090cdfb0355f80da5aa10c9ce636cb945a7
+:0090a0738bbdc8b7920405344d74b97f808380
+:0090b022d60d0d0d6cdaacff89f754d80cf2ee
+:0090c01b0d61c7aa57bd7baaf5f682d87025fd
+:0090d02d9da441df187dc98679d00b52e771ec
+:0090e02de2ac59f5d549fde36f6dfd65054be3
+:0090f021db7530a22ddfdea2e77637f25e2db7
+:009100a6d8f2834cf90e4230e162dfc15077af
+:0091105635a20ee18b2bd8c9dd2641b17d0e8b
+:009120d841189833d92b2ce9b4ee64d76153c6
+:0091304b70a979beff9fd58bc44a6b632ad17f
+:009140d0194cf1abf77aace3633d4fa3b38173
+:009150b1b7a3d650fa4eda8d2cedb2954db2ce
+:009160658ed95bb0c5677ce3f11348a90269b6
+:009170722bad7158e1960757191847c56b0990
+:0091801468c0018e51eb32acc2fd345db49ff5
+:009190e64c894fc0777c7a50630a4c38d3af84
+:0091a0ee783786b0a1edbe1a862e178011e9b6
+:0091b068bdc73b08474e8fe8bc530285b8fd96
+:0091c085eefd40d43fe93fa440de5ab10f6e6c
+:0091d0674ad29aca2bdac790c1b96af4e1260a
+:0091e01a0bc0a57f9cbbc081b3a700cd0a6faf
+:0091f0efd9966293dd153db3d77bbc70005c5a
+:00920023059bdcfbbc3f879afb0409c5a7adbf
+:0092104b2009a14c64bf265b61e1354fbe2985
+:009220700cf4f76e69e9772b685d55428a3797
+:00923012285d231fd7b002803362e202b36ec3
+:00924019f81cad0c95ab23915a65b15795eab2
+:009250359c4aa097887d5166d80a1baa0f4ae8
+:00926088fdbe9ad0b9fd5271bc8e012e7a6722
+:009270a1e911dff5c5e04fe92fa0db378628c1
+:00928038866d46a5a627eb660bfaa499acc496
+:009290dee21b83c318947a4841c7b5af56c11f
+:0092a0433ea077875593f1c972065e0cd6bca6
+:0092b0fd0007fa2365f424c7aa290d8219cc1f
+:0092c076c22d02a3fcced014fe78c8d195475b
+:0092d0c82d9658224747ee5e00e307817987e9
+:0092e035845b7b0657afe533b54614f35727dc
+:0092f0a6c6cd15f3f671ed5202212a3c2600e3
+:0093007482685d0659204decb788db0e2f5dfa
+:00931040dae454bfca327f197751732ffa9239
+:009320a05c89ac8a2c1a43a59f5fefb4ee7047
+:009330ef83ac2bc17bc7e63409366f2b957ec0
+:0093406b397db5a41d6abbc7a349b746b60e39
+:009350bab1940da80469a6679a4f1416fdd93d
+:009360f74b1b89366379cd73f26cece699ccae
+:009370b3d43137cc1bc4f11552b578d73a4521
+:009380c7141788ebf13b08b64b513f2484060c
+:00939039f4db4eef094bba1b09c3308b5e2b51
+:0093a0993d467322052bbbf31ff74d03b835a7
+:0093b0eff075723610912bc39c8b07336e4ade
+:0093c000767ca0b8a059fd14209eec93e917d6
+:0093d08c416df1238aec173ff60bcf73a3179a
+:0093e02c85892f53e8bab233e6adf9c3cc2958
+:0093f030fa5c02b07d9c4ab16bcc4c13688577
+:00940030069400159417c3556719c914ec3f48
+:00941096ec886dff01997bbda4ece0d2b37a38
+:0094206ab62dbf2d65698f5b2d78bf5bc2160e
+:00943098469348b81de992ef3ca5fc49115dad
+:009440b57f6e827dba76431eb022b4b12c7d30
+:00945080d9e869c87a9ba2a0f72c8b28fbef0a
+:009460d4d3a7dbdb519633302941ecdd09749c
+:0094701a66fdd2ac10affbf7a5665fd45b7809
+:009480ba801600fe308733e12bccc089aa4302
+:009490b2016dd13f4a3ce4eacc67a7460d568b
+:0094a04683f4721b60e37fb97b137a1ed78d32
+:0094b0fbc5c2cf412cf87ea4fead9e791273b3
+:0094c083d882a4993f5a6ab2f0b9157cae86e8
+:0094d087de141b625d7d92d53cca3c5c00fc9e
+:0094e02dc92e9d03a82597a076a4fc0166afcd
+:0094f04b050b2ca0418b6e5f23cd6219cb6a05
+:0095004d575b132ee8cd3ed77563f793208fd8
+:009510864c53a3ad1e0c19791e6930d45ff869
+:0095205cf443b7499db3df4c66fa1b93d3c1cf
+:00953059cbd1cc2e7a00fdf8c1373b834de3de
+:00954046b2f06f590d081d881f9e0afd731c36
+:0095503852ac32c3b402b9235b7c8b47b74b7c
+:00956024a466ad1feb068cdc5059958b09b959
+:009570d31b35d735db9253968f6b829f58ff61
+:00958082b904ee1b2a895587189c0fc7a227d5
+:0095909b5e978efbb6d909b863022fe52dd76a
+:0095a0617f61c1220636091fc859d2ded4fbcc
+:0095b095c5728f796a1cd69105d59bf9f28013
+:0095c0872ed07e2474cf2e8ef5afe8f823f1c7
+:0095d07caef613c12f5b059c0fead4566beb70
+:0095e054d78baae64bf8098c4bbbf552fd450e
+:0095f0c087378b4ad9c055320c2c65a7acd195
+:009600f5470d7605b2c3183ffa08874ee1eedd
+:0096102028cce804e262917b4c553345ab4609
+:0096204ea45592ee79a4d3539c3724104f8986
+:00963020c077d323fa45c3292d29194ddbd502
+:0096403009035291491d6c2227045d8ef3f67a
+:0096506dae6bc4275d798df356aece837f4647
+:0096606e8ba73d3e5ae04d68650092762631c1
+:0096702b1b4ea5d4111175c10f243249e97f6a
+:0096807217d706b695ef3d53877bd70d450620
+:009690cf27b39b32017c39d3d9245d8f1fd14b
+:0096a0116eabe5c09a30c9190c08d25051149e
+:0096b0cf51c9eee119f7ff0ba71fd5a0b2285f
+:0096c069d063408c5f112415918086a0116d84
+:0096d071e143b706ce20e601f8107f1032c3cc
+:0096e081ab501df07acb4fc7110b83c3f019cc
+:0096f08961ff9e7e41aec894f2f84346f2d24f
+:009700bb46981766e3afec9cfd100f4d57631d
+:009710c4b25d05a878da045216f7b4bede6078
+:009720e42f71b09e8e257795af5e8b449af558
+:009730633725ddba7f2e9f4dc54d86378c84aa
+:009740b9ee3a63fc874ef7a324a3a150b3c40a
+:0097509b02224b48d4a19b8cab4863fc67f26c
+:0097603df517707d64532ac003788de95086ce
+:009770269378786ce7dd85000eb381eddeb4f1
+:009780c7f69b7514be5427b13cd00b57da6e53
+:009790aaa5811736354d3e0be1a6da7c62de16
+:0097a0038233d1f0d1f128b1be45b621c4b546
+:0097b025bd716a0ac4cfd88bdb067011ec8518
+:0097c05aaaa7e0da9e089fed00da963b54e23b
+:0097d088c96302dd14edbb48ab608386ece928
+:0097e049770ef256ffdcb6f1339cef03cf978e
+:0097f07fdd8c146d773988384b54a04831e39f
+:009800bfe7e0139eb27764a627e126901431cf
+:009810385f094701639f0ffb03a03cb377ecaa
+:009820547e62f62e1bd376c0754b0e133f50ca
+:0098304966ee446886e886f4139b71eb89c36f
+:0098406106ee647107ba0179e0fc11d3e66f90
+:009850a63adbf37c1ee6dcce79d37b1d528672
+:009860a714828eb5f3eb224224661c559f1ee7
+:0098706de191b49a2ab72cded3f6babbff5096
+:009880f7351b64c8f33965574163af4316259e
+:009890b43efaab7b59b38063777939036d589b
+:0098a0b2ee17f963861ba624b7253576751159
+:0098b0383d008811d5e6045aac7c842bc6eca2
+:0098c050949bd0139e65ca712412f655822e52
+:0098d08c09eb1e6abf27ff1b210e6c9868076e
+:0098e0b9760d39f0cf7e38054b989c1b8893dd
+:0098f0ea724a73c14a8736182212b51cdf7a07
+:009900971b19f84ce9fad33d4f8290aaeaa3f4
+:009910987647349ab3f0daae9e35de3672831d
+:009920bf183c56af6f8d1b77beb0ff9ef75212
+:0099306f82edb28052fd393b1f6daac3964020
+:009940c6dd7d01bc4c384f4cf0547df1663bfe
+:009950f9580bfbdc1be0592a5d31b36b2812a1
+:009960806d7af5175758f15060c71043b61148
+:009970d8d11d22c2a602250cc905f969c43d8c
+:009980f8c9c6e2b59338074367b7cda64db57a
+:009990e5db020f7905753e8fbe9ca4f54a3add
+:0099a034139387c3304c5b8e2ca76a1fb1d7f5
+:0099b0627ff561438a6fd91b36114bcf5f6db1
+:0099c031a27c32a9e6ed5b98bc6060b9c7af7b
+:0099d03cb8eb31f3d8e1a2ee23b8505d536a3d
+:0099e01907f74b6933f0452232db84197ea5f9
+:0099f0ad0a67eff7cc749a0e616867f5dca478
+:009a0057af64ff2b3ec0f292fc66caee74eb20
+:009a10f39884d2f758422974aa597c1f611721
+:009a2062b089b556a0425254d765c4c4523e14
+:009a30621a6ab3f853642aa3a850ac924629bc
+:009a40b91e49be5f2ddc9863076ad420bf4a90
+:009a50e1e5e93ccfd96d0657fbab21e99d6f31
+:009a608e42f048cdd597c25246e5149c90741b
+:009a706ab9e894cef822cd4c5c26485d31ad20
+:009a80f482cc77ad7bc7d89f347b243e2f855d
+:009a9079d1b770aed73a325da69e4195fcc363
+:009aa04a022b20459873ed5eead87f09cf3f0d
+:009ab03525a1aa1206e4e97411ad25530f5c54
+:009ac09d1ffc6fc253970bccf5bc47b86bc175
+:009ad019e54049572b3f0dc91be295e551e422
+:009ae0316258a99e1d44a9d931ecfaa7bc418c
+:009af06dace5319dd08a953686da7fbb0f7bb5
+:009b00ba4b75f25ccaf0bc127abac6ee31dbe1
+:009b10eaeaa4ffe9a8baa77aa0106ea2375857
+:009b20f4616542dc2b6ff654f820d1fcd1893c
+:009b30bf840d8112e83608b432e384c1b9937d
+:009b40e9b09f77c3dd7ac6baafb265d6a8d7c3
+:009b50ad367d60812618ace5d62772157a0d45
+:009b60c2c2ffd386fe3dcb9e3b3d4e60ec547a
+:009b7070edbe22a232e0181b0804439a310ae0
+:009b80efc1e13e767e0e839c7a6929eb1cb7ba
+:009b90be7deaa03a50e8144a3927e68d8059c3
+:009ba0e2b67adcec77b43b8b7564ddcaba9245
+:009bb0dd9387265723cd3e4e450ddf3e8b56c5
+:009bc020fd6227e41409a210eb1acbbfbeb1ee
+:009bd02acdb598f1a46032797cbfc942bf54c6
+:009be03c844777d21e9242ab72bd9d7da418dd
+:009bf077428b6abf17bb1b92cf6d4b6587ee8a
+:009c00aec0581dbd7741df36b5fb5c1d8a92e2
+:009c10b9df16f950c9307d3818f78922975600
+:009c206008b2879b9815c44116c69b3ffb5990
+:009c30291e6821be33617e1af95fc5d23937cc
+:009c407bdf02d941847e8e497a5bc662fab14f
+:009c50eebc2291574fc852a6b2f555496516a4
+:009c609e8d4dd1600c05666158535eba747c58
+:009c70767d1f6425f3153473f43e166ff1b7c1
+:009c8078d5b0895e684a839807ffa96d298fa1
+:009c90f4f6aecdf49bf48629837bfdd43da99c
+:009ca0f1e6a61113991af674b6a89e4156ec61
+:009cb07af7c1deab5e1b00fc213c0a8b93fdcb
+:009cc06183fe262dd0ab67bab367da94c1c719
+:009cd04315bbb9039971ac7e9cdc65fade6f0e
+:009ce0b3db401e8b7ac234d99ae5979930bb6f
+:009cf0fa06d9f24746f959277028cc6788c0cf
+:009d00295b4b7bd3d1077f11d193fa36e5ebe8
+:009d10c3a1ba2c8aebdfa42d16227c068c7724
+:009d2009982db4deb989a11fad96f6353e67e1
+:009d30827cd98b69fdfe3318c7aee2330c70d2
+:009d40c40257245fcc36a8be0130191b40eb93
+:009d50d731529b3c799bdde4a1f12e7ea26620
+:009d605d009d96b14c307a7a15d85d02ea737a
+:009d70441e06812649f43097e25ba66810d972
+:009d807a48070c0037a79803c021a0da5b5d50
+:009d9027e501e4c5ea6770a512ca8165a38e9e
+:009da07c1737c7b120d7daffc3db97567f9248
+:009db070530ac5006f4b0eaad3b94ced64620e
+:009dc04742fb5dad69d3af92c34c0a21951c78
+:009dd0dc5e66b0b9b665b648520a370d98d7a2
+:009de08b29a1234f3a8f9e235b2c85c657430c
+:009df0f49de2409c6dbcc04edc3ab210efe2c1
+:009e00c790a4be1010a2bf19b46370072d9e8c
+:009e100397d76f26f14bef31259e933ec0c29a
+:009e20fb607b7fe27651dedba8b6e83fd333f0
+:009e30d79a4c1fc38a9b6747b96e043c8910cf
+:009e40e2311897e6112b7443de83adf32393aa
+:009e5004565306d7ad78e08f45cf465dd61de8
+:009e600113314b1092b6d6a9405c72162f1f36
+:009e7062fe87f1d214a5e0b197902cca95e7d0
+:009e8082f7651dd596f705716777d08094bc8b
+:009e900fd81fb453b15e511dd5f29a8c38486a
+:009ea0f6075edddad6577ef9a894b19a7bc1c3
+:009eb084569c4dab395796a1aef67c8e629f61
+:009ec0473d7d744ad8630008ffc7bec6f312d1
+:009ed000b780dff1f80ebfe1881ea76f8d24c2
+:009ee079f891e9791a898f570a08f30121a27c
+:009ef04d2a8bb05cf4730ca0ae81a495ade0bc
+:009f0052baa2ca4767b9950d42fb45c3d1f830
+:009f1060bac972586f5e3c0b58e3e0b050d9db
+:009f20b7b209b5f540ae65dac6d0d6738d3e8d
+:009f3036276e9de471228fe0daa6b6e78ee7d3
+:009f407193ae396ee6dc66c0a4bc19d05a395e
+:009f50975a651d45c5bfb1ae9f01562a6845a8
+:009f60db9b73aa5d32a8a6260f0eda9b752899
+:009f70879e94d1d8c3f5441b0ecf4b7448c85b
+:009f80010656f67b0ae722a7c38232d88de21c
+:009f902659c19b04151a2b36439da7aeb037cf
+:009fa0102be118c24e168e0b39393a75e78da5
+:009fb0910742023b49913835b7e0aef95de71d
+:009fc0122c9421c5eff98b2b3e099bb1953388
+:009fd022d362cad9b891458a8fdd413b0c86c7
+:009fe0ef08c104311b0c19fb8297cbbd3bee7d
+:009ff031912a201c33e5450b03d504bee01992
+:00a00003b743c3f15f29f492265baedbe08f35
+:00a0102c318c2e27faf54e7bd821e4104a6d73
+:00a02085d854fc484ecdd7ffbba3fb8f43e73f
+:00a030cd5fcb62b51fa32e66789befbb84fcf6
+:00a040aaf6815a2ad8b82ecea30f04f2932cc6
+:00a050b9422c27c089807fb4c97b02ba4568a5
+:00a060ac1a575f2e1083fb633ecbe37aaf42e4
+:00a070bf0ca36608663fda9531475c37b072ad
+:00a08077a3cc16975e390f42c99874f7326e08
+:00a090b0b6a71f9e8cc812cb752e4de9ce3044
+:00a0a0e64c25e1cd6e52f310e11b0ae08db952
+:00a0b0c9c55752f4b99d4de9f05d71e232c757
+:00a0c093ca7d4e177860d37e9c6a6e21861c07
+:00a0d065ab46f2c2993a053041cf53dba76bf7
+:00a0e05641a581a8e2493275b54632064f1ba3
+:00a0f031d1111a7bc180b24f8642a6405e070c
+:00a100b91c3609f01df8a480d6eaf9f604b496
+:00a110b884f1d58745b9e673036ec99d714503
+:00a12071cca7d28d09d61a648bc38e29bcbdee
+:00a1301545e229460804429d2e6f0107bdc319
+:00a140a341731d1ffd43e09df87a41a4a33050
+:00a1500ff5294814fb2784946b731d42dc8046
+:00a1606f9cb93e74d8eb08dcd209fef051395a
+:00a1705cd3b44293cccb1982b4c1d3e3a84955
+:00a180282e02ec25d0bc76e562ab0d4e7a5670
+:00a19053df5b7c5aa89bacaffc9e29b3ea3361
+:00a1a00b89abdf5b60587a51cdcd9b5dacf57a
+:00a1b0e442ecfb93bcb9c9e788d37c94064805
+:00a1c0fd5d651189a7df782979a230770b9db6
+:00a1d0454e44c04f4c528b3ef9b3c5951bc12f
+:00a1e00421903f14495eac35e7d3660d060c24
+:00a1f070830eb4512cb97ee6181709a1ca865b
+:00a200b1633703364d12db77594ba4ca2c6641
+:00a210875df02a00c373fb08d5eb7e09090583
+:00a220c26c50f0eccf6ceb83f92d8dd468f88b
+:00a230402488e166ccacb36f8e0d4bf923c0d0
+:00a240b71534dae0f4ae67fd58f75e7ea7a889
+:00a250790d85a1065406bd3609c495cc90e854
+:00a2601bf58f7477d21bf5813be26bed6a8503
+:00a2701e87af0853bc204d85cb63dd6fe5305d
+:00a280648d6e75bfe15dde7ae22a705e67c3c5
+:00a290a161be213282aa61cad14d8219925b66
+:00a2a0e1db9e8d83143aab3a0c0a37ef2b1c14
+:00a2b0e4b00b378c266624e0096c9020efeaf8
+:00a2c08d6b66297b7840b735972fe1c78b0648
+:00a2d06f5684459aceefce670a2017faf62e66
+:00a2e0396eed3a0dd0e9fa43576792dceeec32
+:00a2f01cb8f5c1f6c45789cde4ccf1bc89e353
+:00a300296a856e20afbb2512dbc0da41e832de
+:00a310eab1f0491797fb6062f4bfa661e40730
+:00a32046318c32b00ff33127dae1602a36df34
+:00a330cfeb8ad287d2bfd5cf53cf89fa1b5bae
+:00a3408bdce404cd2abfa8246fd0fa6e7995b7
+:00a350e0c8a62ce4b724cc75f2642f51e5b696
+:00a3606eed1a15a707c47d90462e1fb9b195c9
+:00a3700fd19a734ebdeb7e822e4274f6a17518
+:00a380ce5b79ee7243d801ebf9cfc8a6f1c401
+:00a39062907ee1e10d5420be18a3699a2d9720
+:00a3a0f2443f5579e5f3e4a762f9cbf3787eea
+:00a3b007e3814123adc75333e91da5de307d02
+:00a3c08a2adb22eccd4fd443e839522da98d9c
+:00a3d0597dc5a6386e7458fafd32da178c177f
+:00a3e08d75f5856c483ed6d263b72c467bb797
+:00a3f046a9c22582adea51deee3449f7b53ca9
+:00a400d490e81b8ee602cff5a2ddf807ce93df
+:00a410feadfa4432c8442126b3bde884601359
+:00a420d1a07068c2dd54381d0e2939994732e9
+:00a430956e65d9aafdf4131a770cc20917ef36
+:00a440111ddf39d612e82007aadc8099e1776c
+:00a450a6bd4d0bcd8767a0976e06a48b66c215
+:00a46016e8501e6bcc69ea02aa0c82e0e50efd
+:00a47061f95175ee6310b0052cd3ff014de8d6
+:00a4809b090b94a3a811a7fa84a11ba9bb8d75
+:00a490cc6ce1772f0e9d75428a417ee0e40376
+:00a4a01125e83083e956ef3025241585bf817f
+:00a4b0988519dd6072b079b398ae6ed15e30e2
+:00a4c04ab1ee6465b57bde73144e9f8853c4ff
+:00a4d0bc0d28747737acf6dc921f139d0dfee8
+:00a4e09ab87360dc4181a565ab79c645c52dc3
+:00a4f0874b0f0d582e1ec427fe96ba527addde
+:00a50096636689b2cb20ae5acc1fe9b2d029ac
+:00a510fca8f7a9b9b775a58fed44e23787ac3f
+:00a520c2ef332b2f38a5d32bf81af6fc2f2605
+:00a5301f6decdfc0bb945aca8e10ca9b1fde35
+:00a54099e3bbf92daa201a08d91cbeccf5e4a0
+:00a550b238926036cbe337c24cdfc983497940
+:00a5607e5b958a6d0cfcee5a60a64fb3cdb65f
+:00a5704158ec490e0b53150dc06bc800032831
+:00a5800cce2dce9ddb4fd5d8bda8a17a5de18f
+:00a5903078a87e8a89a2dd8b3f03674aa2ff10
+:00a5a095b0a88d58154354dc288c4c1bce8758
+:00a5b04ad0e627a94df6a791bd19cd23daa202
+:00a5c081b27af0d08846edcfed4635212b068e
+:00a5d0a6ddc429ed9b2c3c890313289206c09c
+:00a5e02b0d690ae160abb0f2449855957b2d50
+:00a5f0887749965a33f1a314563a4fafaa928e
+:00a600fddcf6eb2733e15623847908eb3a1cbb
+:00a610feb2b64e51299d0ccb56b135c9d8a0f9
+:00a6208b9eded0a6f95186d5c8be3670f6cade
+:00a630184d1527c09913303ae88be6a52b8e0f
+:00a6400a3011641396114d7188f16377d8ce16
+:00a6501c1009b1f36712c67650cdf5ebc318c5
+:00a66017594e1c52b3675a3b8eb70527b4b662
+:00a670e71b54624c437ceb2a2e36bf42257070
+:00a680358378f089a65c250f5621ef3f1e960a
+:00a690b38221a3d0c43287a5627aba4a56af03
+:00a6a0fc916ba1af64d3e93ef75ab5ae384ea4
+:00a6b0244c2a8e4f1bdd61a7a1390be0efb0c5
+:00a6c0d31b62598b14bec13e817cfd063c7587
+:00a6d018d782ab2de04119bc0c51720f95f0fe
+:00a6e0b982987120f999193ffd04ebcb63de00
+:00a6f01c7e63bc19a2621e54e7192015ad184b
+:00a700e903a22b3c11b46c8adbb61244a26c82
+:00a71074de7fd85318e87db395bde341c5dde2
+:00a720639e04eb9aebf4f71013185523804348
+:00a730c5390d672c733a15109d6567f6ef90c7
+:00a74060a5046998abf980a1b62bfae76e6c8a
+:00a75012ee0b2730085bccee4a1bfe19a86afc
+:00a7604df4ede74c48f85f2c2975a65a9b637d
+:00a770c013445d082e279fb269178a0b50080c
+:00a7808f0c3900f1adbd303f0f150bcda2f925
+:00a790463b253047c9320ded107af4e620d3bf
+:00a7a0a16d474e31ff03e9972d017e360a9ef8
+:00a7b038e1b5242c6eb9eb504d79231f4999c2
+:00a7c03c6665bd916990d932396d3c0503f47b
+:00a7d084dbcbbb2fdc35a5e4279a55c4a1c96e
+:00a7e0fb893a8fdfecd5ccbfe6f10a3dff51f4
+:00a7f0ca63c928e899881b56c48095cfd7fc54
+:00a800ed2e851e4a289236ddf319f0a2da8c26
+:00a81079861c75061d1d97d7482c4cec28dba5
+:00a8208d612c34916f60cdfc9aa04e18a18b2f
+:00a8303d5866c0bbf7da5110259cd884872723
+:00a840e18d975c7ba86abfc1287e1a9c66e600
+:00a8505c2833e3261d0e6e1cb0f29ff62c6f90
+:00a8608edfd962b701b15a129fb740f307c037
+:00a870d9c9f005ee32a7930af510e14ff54850
+:00a8806e3bc83d586464dd4bf2b50172973d07
+:00a89004f9b5d8c2a4160d7bb3e9907fe67717
+:00a8a0c0f70efa252bee1aad8868e4b52be7a7
+:00a8b06644e4b6141fa82aa6837743075efdcc
+:00a8c054c1df409d534d316db3d3c68ae67340
+:00a8d0033074b65d36e9abc413956e7c628d32
+:00a8e0f8162668e6bddf3bb1252ac802ce29c5
+:00a8f0781e6e5274e87ed88e4ebe68cfc0b54d
+:00a900eb675c1bab97b9392b6c85844d92ace8
+:00a910bb1079010782205c8c07c653efc142f5
+:00a9205aa686fea384b0f555447d3afac8586d
+:00a930fd1c561222ba1e30e08e7d81b1e3806a
+:00a9407ee7b55ae70813cb7d505a4e51b86f05
+:00a950ceae08f6a4b83e503fea28e16af123c2
+:00a960a41afdf970dbf4316758d40e2f687546
+:00a9706233709b9cb1c34f5e5801b1d4b3ac7f
+:00a98074674074ced98c868f9194f8623b2b53
+:00a9909dffde918496af7ea2194660f3599dc6
+:00a9a0cfa7ae8ddce6b626e4d766efc97da9a5
+:00a9b029c4e7cb52ad7ea6d47b9531af95009c
+:00a9c04fc522b4b7c42e87b2a99f54044744fc
+:00a9d0243ff5a5ee31ac4c69db98ca7a88fe2f
+:00a9e02fcc432830a828ab60df4a5dd4be8386
+:00a9f08828700abff80adc92a8907a0da3f5d7
+:00aa00b8ca0890fc64ed0d6060375b27e153cd
+:00aa109892519bd079accc8cc04f0c8774953b
+:00aa20c9c89cf5594c565e6c8a70f205653fdb
+:00aa30ce20a5c7bc1bba58f88daae21465daa7
+:00aa40ecd5fb7a38bb75616bf83166b78246f2
+:00aa500453068494a9f784b1f310bebce7085d
+:00aa6066245c160f404086954747973f5f45cc
+:00aa7040eec6067f0565b694505932eded517f
+:00aa80ccc979e76a9804a8f013137c3886ab4a
+:00aa903521e6d7a18778bb80691eaa25436d31
+:00aaa0a4f6f7bc694a0028711f2bcf42fc45fb
+:00aab071f50c077abe9f4f0dc1ad38b342c039
+:00aac0552deddb007bce5cfcd7bc994c7de7f4
+:00aad05f4aa3fe3668e256ea086af55a7d0c19
+:00aae0acbbb2f2dc5a7d7aaa6d2922e57dd3f7
+:00aaf08cb8b65597406b94b628eb7a2fda323f
+:00ab00aec190cf2ad2861d8914a12699622ccd
+:00ab1066bced9b73f6d8ed1fd6e5b8cceee20b
+:00ab2095b6fa01a853c61a7c3b025cb312b047
+:00ab30c7d05afd2bd6832dcce39b9798f5a56e
+:00ab40d2ab608fcfd6a6374a0436da9c339dbf
+:00ab509ba25e05982c10cbee6dd560754832a1
+:00ab609f27f2cd756b02c16ec5d966d07b35e5
+:00ab70f7e469c2136b62c34e997ef54a028f7a
+:00ab80712610c36409bb58970f288d512e4f2f
+:00ab9084c1e3c2ccffdde00d2d5bf0920dff64
+:00aba0ae45fc713e32a6d5e29667a97f4973ff
+:00abb0e1d0bcd06029ee126340357513ade4e7
+:00abc038c47634c8d8608aae04bd97dabd3e10
+:00abd0b7cc677212e255866626bc307e3e9c22
+:00abe0fef3275905989190d3b8f2f0dc8e4ee8
+:00abf026d216f22ed53410bfae710fad2d40fe
+:00ac005e5c855d798c2089b18c1df8020df6a1
+:00ac10d18ddc84ebbc21d8bdca12210efc5ffe
+:00ac20d558ef0b552a9cc62937ec7ec400d09f
+:00ac3001f8f33b49508522332785f4680a79c7
+:00ac40f9381736b031248e5b0a51b4253bb13a
+:00ac5063b09f5828a70be53ca50bb6c6c9c84d
+:00ac60f6f52ba10b30ecca33d919ab25762bb1
+:00ac70fd8ef0f75afef6f1da77056273ad7394
+:00ac80877e404b5d89a56b2c523dee1e1f4927
+:00ac909c0f63e95c4b83c0ff9a57f6d26cfb75
+:00aca00408781659421d2081ebf64e8ddb426c
+:00acb07f169594a4f10be8f0ff2786df5ef08d
+:00acc0d22e220fc69237845520665e29865f77
+:00acd01b2d06d140393b1d6e338b77268424e6
+:00ace0f306676e55efa82ce4d885ee1abca464
+:00acf028e34c9ec082d4656d14081c5c897521
+:00ad0050bd7e32e0cf6854668e80ee2b71d961
+:00ad103e129267f4515fb9c2ef6aba0381f8a8
+:00ad203e1056b82cbd114f316afefc1644a290
+:00ad3023286c5a3650c251565234b5de4e0f3c
+:00ad40c253caef21d6914a0a50bb20c71aa87a
+:00ad5099f2c2d13849c3e5f912dbcb48affc82
+:00ad605a312fcdfcd7d6a4a8c9177ae4804a13
+:00ad70b80249245412cae5a3b1867608614ecf
+:00ad80c19ac6f67793a80f5eac268dc63865c5
+:00ad90c90f5d1ac2616cfb479b489f84755288
+:00ada01d315a988dd637ebc0e22a61ad111946
+:00adb0c905e8b86f1df7000da28c7373b39c3d
+:00adc0a5e36b4c4e19b2dac016fdd10ada1310
+:00add092ffd2cfa58425fe55c6ba0b8cd6a20c
+:00ade03bc4881d79545fc53c1bab19a7edc99a
+:00adf04558701fc9d29c8a3690eba0ebc4d4aa
+:00ae005f7856e11546983c82865edcbd388962
+:00ae10582f4adc39afc9b15a7984c8ee27d1a4
+:00ae207bdb6bf187aaaaf5e6fa1c33d06381e4
+:00ae30a9d92f21fb3e1e2cfd1613dbaf7dda4a
+:00ae4093a91c1332b2bae7f043544faffcad80
+:00ae5022d9c124757aa9bda6a6974765fa188b
+:00ae600297c239fc9318b887cc4c78f0a2e00c
+:00ae70b0e6d4717b7d75a6f4c627e8687a5116
+:00ae80381e0b4d5cf36eec92b6e875f0c4433f
+:00ae904ba31a5053ad850a93299daec0bc0a75
+:00aea0df58abb0b8aea6d5ca67c6fc85ca06dc
+:00aeb0740f9e8d339ebd85a5dcf8883c10df7f
+:00aec09e801f5f9eb516f168ef2b51d349c970
+:00aed0981cef55f23309a670977f72f661fd56
+:00aee0b3deddb92f91fdbdffb918c6466a1f71
+:00aef02fa55bc435ab2ed9c59e1912783415da
+:00af0046dbca15abf19a07d2b5482ca922abe1
+:00af101a65506fddfcd4c70c9819ce7abb1799
+:00af20b8681b9b4a032ad250b8355c1b8a55e4
+:00af30ab396b872e36e01df0ccb79956f03319
+:00af408a90e5625f7293ea325a34f9042283f0
+:00af508adaf01b2199865a25bd7ae956153754
+:00af6024ec7a19af5c7a60d70393cfe3bc358c
+:00af702d18e713028f9bd13b70cf6854010adb
+:00af8086bb621521498764f1c92d14da1bfecd
+:00af903b6cd01d75129d2f38dbdf1f01d72308
+:00afa05f19a1a98b434890ffc6eaccf54fb66a
+:00afb06bdfd370caa0c998c00110c08fa4b243
+:00afc0d0b187ac0ebfeddd750d5937bc135df3
+:00afd0787bac1aa3de88629e4be97c1c689dd3
+:00afe0d9b0e99d0807ebf99c6aa4a1f525091f
+:00aff0ff66492c53c8f8b53d23109021018d48
+:00b000242efc7be559842c983903f256e316c3
+:00b010a8c254e01f83cd4d0865774f4c2a5aa7
+:00b020fe8b8ff89bbe9232bd799444748df091
+:00b03081995f4150260cd1ea8e937e8cd9390d
+:00b0402647e871f9e30f88d76e87699a9a03ad
+:00b050f4483bb4fc006f4036d1f20eb82ae336
+:00b060c05b2862fb5b64944426b11d54dc4fb2
+:00b070cbb42aa2cdcf9f4f2cf2fe3780236384
+:00b08069b923f87fbbb344bfe25c4131d185af
+:00b090d8f6315d271d0310454542e7fb3f1c7c
+:00b0a09db218e2849224f44bbe267b9fa293e5
+:00b0b0b443cebffecc13177f6ee3343caa1c93
+:00b0c0f59daf3c6539540ee48243287465354a
+:00b0d036d55874726bbac585de65c647cf2ad6
+:00b0e0cc2d2a64a27ac2c80427e4983024b6dd
+:00b0f091d6036070620bb45166c627bd4a0c33
+:00b10035918990605c49baf0103de22cb8647c
+:00b110352c069d35b4e648e0f2a5cb9c82be16
+:00b12080360b63dd0dbf47bb57263420dc8ed3
+:00b130ff2c571ad7e909790b87ff3a06b04c4c
+:00b140e6afb0f560cdd57be90d9bade5e66668
+:00b15091c7388e0cce2a0b7a97097b198f24a6
+:00b160abb017e09d1cc66851a539501a0c4f65
+:00b17034ed9e12e2877c80e8c8eebfd22d2658
+:00b1805fe5cad883d2eaaa5c71220dd16e2d48
+:00b190582d639709992a0f57b22cdcd87d1374
+:00b1a0a8caa8feaa11ca1b56d39a83e4896c9f
+:00b1b0002260647076a8069535d9190bae001e
+:00b1c02b87120459f948e53ed0f4d321bb394f
+:00b1d05fdb8cc91445cdbc5020775b2667de95
+:00b1e0b92f2de20e33eb87b160def506dfb6c9
+:00b1f01ede335c1398bed2948bc49cb3d4aa67
+:00b2003cdb462cac8773f16fde0b731002506d
+:00b210df9ae49d887c07800a3b7ce5bac8a56a
+:00b2204b0f201f649aadf9d5a0cad1d4973ea6
+:00b230a489cbfca686081d2c90962cbf6500d4
+:00b24053e1b9844ae0c1a9545d6b37caeacbb7
+:00b250203a60ba2e1a45ebefa9288c8912c8cf
+:00b2603b7474d5e9f0a85949aec52a00c54d77
+:00b27041ca73626eca6d7fc9254c763dca559b
+:00b280799905443bc7a8fa92e8d2cedb6bc40d
+:00b290156666589d2e6f9a3d89e178b3f94f88
+:00b2a04ecbba21a644b874f43820cf289bd576
+:00b2b0e579b7292241809450c816aa17e3893b
+:00b2c0f5706380622f5ff509b594f7138eb408
+:00b2d0c4845f7d11588db269d611fc356c52ba
+:00b2e073e348b94c32c05f06a3c80b89caffa4
+:00b2f0c69e78537b5399734fc903da933bee65
+:00b3004efe62dea176d823c6ce8c032a800204
+:00b3102073cae408918b6b2076c1a4f1d2c274
+:00b3204c1cd6f3eb2acc262880254ca111329f
+:00b3303c5668005910784da77b730759b00f83
+:00b34021e05cf1bcc11932150b53ffacefebda
+:00b35042126e66c19b803fbc66a1a7e4c3dec6
+:00b3601802d7cd3374ef0ad113e2b88b3190af
+:00b37001e7fdc651d55995d0eb6d2e47726993
+:00b3806028368205c1a620a2865927e057f41f
+:00b390f992f1c7bbdf324c88eefe0ed92696a5
+:00b3a07d096210f9466d556fc0a4a53a9113e7
+:00b3b08f4c880fa77710c49fd17d911abf6026
+:00b3c075880026ff5512504427f527a4fdfbfc
+:00b3d0dc773b9f48129b93cbb3e229da92e1f2
+:00b3e0d7a51d240dfb12415487652c16f89c8f
+:00b3f0d5750a2ede5398371749304fea12da52
+:00b400ed19dba8c299b6a3c954596240134d3d
+:00b4102eca2bd116de020c8c1cdbe284cc5acb
+:00b42080b1220853d0382e011ea28f2ea520c0
+:00b4300b504fe508316c60ec3a6ad9881ae340
+:00b4409fc0899232b6ad838d49e8f20a67d4e7
+:00b4501d6aa09003e4206b4b610ff94ca7792b
+:00b460f3455b6361d9eacbe5aabc5b7ee17e67
+:00b470b43fd6d5f2312f7c4313591c2c1727f6
+:00b480da919b5b0e4d048fa566dcc8ba324003
+:00b490156814e7ea23a4e3f4871b70af20fcd6
+:00b4a009189fa10ec83273eb0a6d303c5684b9
+:00b4b068fa8dc3dc9f95f8735d83d50d08de9c
+:00b4c063c1376e935569a9a0d531fb14ab838a
+:00b4d0f6a95b934a899acbb94954e6af7e3c5f
+:00b4e0624bc29c586960ec6fd7fa0fd2d501d8
+:00b4f007e54517ebf1ad1f51de225123aa98d3
+:00b500ccbed2f66c9a320fea7c43c7c58788bf
+:00b510a9f86d6059f6b410f30d6b77282e38b8
+:00b520a28af7e50b547b4e2f9630dbcfd94300
+:00b5308063f35c4c50ead93262e74876b7b348
+:00b540fcd36233b028aa7300ff506377445e84
+:00b550fbceb736b2214106d77cabeaa037bf09
+:00b56039d1baa655e264278bb70f585d8aa930
+:00b5708211e0fcec18b3057a5009abcd7a654d
+:00b5806e56f13d2c9ae52ba8d1d8aab38531a8
+:00b590e8dbae6638620a1952a6b37a7ea68aa4
+:00b5a0517256a1506d78a26dcf286af8e07379
+:00b5b00948bfbc8e45f93c0118fe8f4e328102
+:00b5c079b0a4bf5cfc3b17dbee93314944439b
+:00b5d0793baaff3a0ed21f81a61881a25bcded
+:00b5e0a3c5093778e0654f396bfa3d89ff226f
+:00b5f0b02fecb2c79e7b22a0ff32112a7a5a66
+:00b60004308c65b716db0f01741008a3b54d88
+:00b610afa3a1325f4f93ddd89b6c4065bff3a4
+:00b6201c81c2120f0b7aa2d2f521c55b3e2c3a
+:00b6303cd114c9ccc97f1e336efb110ddd880b
+:00b640ad54772d46653f119babe7b8ce37e3af
+:00b650f6dbf932d82eb53f3bf5526ff281cba9
+:00b660734f666485593e8bf339e42c1705a062
+:00b670773203fae7af7839cf4abde35bea7907
+:00b680cc9428b2e1bc380fb79eb483483c67b4
+:00b69041904302de0ee6dba73e834b8b32eefb
+:00b6a07f7732de6f59a3647c032e0cb56bdedf
+:00b6b08fbfc83fbba7d4bc52d5706c52525343
+:00b6c0a7aac41b8d4c9b0dbe56c06c89ccb7d9
+:00b6d0a4b353c22c92e77c84fada180d5b14ef
+:00b6e063d536a35bc5d5323536d0c61c821c75
+:00b6f0d385faa905e8e1e04e88ee7240bd03de
+:00b7001584626aeab01d684d38499133c5b518
+:00b7102d4a060a1d986176c67400e5ba55f013
+:00b7204e4d4d1e586fb1e6be68aada35d70002
+:00b7306fbd1202d17678c5ff5717eb476c6ce9
+:00b740f15ca999447ad8f3eb245d32e63fbf9d
+:00b7509b2f3f56fe962e2f888171f0ff6fb531
+:00b7603e03b584f6e94b535bb42200e4127075
+:00b7707dcf2f3d50aa5d6b49034e6abaaa6007
+:00b780b2afe57bff10b6d948b1fa67e62ad0c4
+:00b790a28cb0b40c57875e8df085e82b460a4a
+:00b7a09720d78d430133e09c29602e17bfcb87
+:00b7b03fe688406192ef62ec342ffc6126d8e9
+:00b7c09299e380542971d767598ddec6fd58e6
+:00b7d06a000f6d277f14f811f03d641a8936d7
+:00b7e07355b5e83496dbcaa2c420c459d7f8fd
+:00b7f0cda72190f5827a97443eda93b1cc0e31
+:00b8000ce1ec5ea98e8bf31059399ec2304eb7
+:00b810b54a4f3030bd0558b603fa3ac3ea0daa
+:00b8205e9fcf1ff90f0751d6504ddd8437120f
+:00b83066a3306481a88724a4743676f30773fc
+:00b840ac8e4918632076d23fb18ea78534dd3b
+:00b850f5e6ae4f78092fc656805d9c92e2a1f0
+:00b86009017448606b6bec0c8db3c91bc8abdc
+:00b8701d433a76a39c03fc4cf25e8b2b705470
+:00b880cda9a1aea1f2b03a2429c9aa5f8e42cb
+:00b890e4d195f98e5059988c3c69bf8e2c85c8
+:00b8a0fc115f12d9afbfb8c82feeb8a17374a3
+:00b8b0098ffbc1e3dc1a83d93ec0d1aa97e4ed
+:00b8c047410799afcaaef9bb39d4efecf185f2
+:00b8d0156c69a85293abb4884f58c5c9876bf1
+:00b8e007cb6fd515ca0b9ecaeecee3f535aabe
+:00b8f0a840df2b02d742db5067ee954307d4d3
+:00b90073841e40d080a76d5ca2af3cb8b9d1f2
+:00b910d994f1f9883572eab298db03ff778cbd
+:00b9204724b8f6e7f7eb37ca164b39e7951e8c
+:00b930a2ce16e32d16b785155f641589866fdb
+:00b940646e9c247239750a5d8e508febc49d95
+:00b950f30fc644eca569d05c1d29d32b8b4833
+:00b9602da6e8f71fe5f2fc4b9cfc699a70fa98
+:00b970d4eac2d8aaaa9775b0e1ad0a9c220f41
+:00b98099da91d2041604ee73491da7f6b3739d
+:00b9904f13ab1d0f0c106308f3e4e1b0a3290a
+:00b9a06e877de9ca7059f9667212a1083778a6
+:00b9b0aafddefef0e7ded184ea8b4ce1e5f966
+:00b9c0898d7b483cee5e8f70aa809e498d236d
+:00b9d041a1eb68e13f821745e98574de6aa2c4
+:00b9e0937a8c5a0f0854e1866a98a42d8c5fd8
+:00b9f01756fc540ae3f8d1302562048225ff6c
+:00ba00c720fa707b9238bf9320f0daaad9006f
+:00ba10d9fa00890824f0efcf8d8dacb1c1eec8
+:00ba20747e25a97fe6b16620d24d7f342a4efc
+:00ba3033b2df2493c540d206eb37a96e0a1ab8
+:00ba40d3e61e25becdc32412af0ad21bc3d696
+:00ba50d993b4b13a1bb792f15e27420c850589
+:00ba60e2a0f6e478c5ffcf7036c51a06f98ec9
+:00ba70c2b2a7d09228992e64231e86ff07c249
+:00ba805b8e1d6bdf5f4bf965a5f5b05c21c757
+:00ba9045fdd557ccef7d1a20d53fe597b9f00d
+:00baa03ee563a4f5dcb2815ac54e46794406b1
+:00bab008fd8e1a0484ecaded3d4cfdf2b544f4
+:00bac006d9377d62884514d5a9a61b4c3b9124
+:00bad000c60b9b94054063053537af4ce75b9f
+:00bae0f62a12601665561922e04b07b4a1543b
+:00baf044ca6ec23555c25b73f42ebccf1862f2
+:00bb00b245ee3b155825abec7d847f6ef713d6
+:00bb10029b603a3cf959364f981e1d500a6ca3
+:00bb20dc0a664f6dc85005ebae6ed00858a60d
+:00bb30d969cb2b036562475dfa24316e4bc1df
+:00bb40c31dbc76b1e1246aec02efd74930d63c
+:00bb5019720c72bae9fa9a92812d52f1064cb8
+:00bb6033c4172e50f2cc8df935d3203431e7e2
+:00bb707ef52853995d0853f3cffd10e549b09d
+:00bb80cc1910a6594219f85802a8b8c9f2ae83
+:00bb90aaa5d49e484d581a82f0fc3aca010b7b
+:00bba0df23a41aeaa3651a43713fbe1ce55144
+:00bbb06a215242fa8c298704c3e5270288e954
+:00bbc061998509c1c273884218199afb8bb7a4
+:00bbd0a1e03c807d534ad756230e7ee11ac58a
+:00bbe0b54157cba028c02e79bf2822b64e5320
+:00bbf06b48b98d021fde3b948dff7297679cea
+:00bc001d101995a7d71f1ed7173359f714c0fb
+:00bc10d9dc751c4c0c8e85ed05a198a7297014
+:00bc20ab5e54b856d8f79a1ac7f1d50ccc838a
+:00bc30e5ffb8b202c841bfd760772ca933666c
+:00bc40f8a61b30a8fc2d171b65e67a48e36c95
+:00bc509242df4f9ae79a6c322bf108e999b3ff
+:00bc607c893e72c91c170a3a46ca18baca1efc
+:00bc70bfe6b75f2db2807a65bd6509b3c6ab96
+:00bc8044904c8095e49154a8b285179c4d227f
+:00bc90c5b2b728a0ca274cc5d9fa4439a8432f
+:00bca04db0f7c6cee5a9c8a91a1ca9ca4fece6
+:00bcb0b8b4c88d375bb493615d85328e438bfe
+:00bcc0753077d46dd6ac46bbb707b0cbd9cbba
+:00bcd0a2e8b513187fc0c514733612830177d8
+:00bce0173561389a869f9f638eb5893615170e
+:00bcf0a164e2e8dac07a11749160533a0ee70e
+:00bd00d783b8594d1cbc7f55ac12db7f0780a7
+:00bd100b698e5a8f016c29ce35b2a0ad88209b
+:00bd2048229155966cbaee35f345bf2432208b
+:00bd3020ef9bd2eb53c0acf276f06fb315c436
+:00bd409c8528f5a7a69c01552cb7a5e1bc7acc
+:00bd50fb73ae0d676f23a826fa6be6cea9b4cc
+:00bd603c9896d5d7ac0cdb5c8ccabb1c6d63eb
+:00bd702582285d49d90423c4bd6be615b6c1bf
+:00bd80ad9e8555c4978ca7ed2be50b560a448d
+:00bd90e3a811b585548c3a6159b823a2051131
+:00bda09c385bb0a304bcf15ac67901163e6ca6
+:00bdb04c20594270bc4d9808ff0fb5c53100a9
+:00bdc0e8460416ccc6df3a8abd42d6ab26ae0d
+:00bdd034a4459d48a25bef6e3ea884d5e7182d
+:00bde0f0c08bc8914b44c52a3fb11e5e34cfce
+:00bdf08d591fbf407efbab2ee15e23092364c6
+:00be004ccaa2f4791c8ab2814e2139e650bbe0
+:00be102ee4cd01056d5872bb479c62b9b0480f
+:00be20eb715685dfd86416f115663cc2539fc0
+:00be30b3a8f1bfd7ed61beda873ae4020d41ff
+:00be407bacfe68eb4d6923133c86d51414e6ef
+:00be503af2ebf45d823ad3feac14cded04d36c
+:00be6090ddcb6c9546730fb6b918cb49cad43d
+:00be70e8a2f8111ec085078cc8aa7ed84dae52
+:00be80f7cd721f2e7a1cb6a8ca927882cfb300
+:00be90f2349fcf114bd8336b8e1ec5eac5cef2
+:00bea05996905e64a0701661ac1f8351521e43
+:00beb0a9a0abb7723deef8fd4f02d8ff60b4df
+:00bec04413736e90ef25d3e6fbff1f62a8fd13
+:00bed031d371382a54a165b156d50236c1094a
+:00bee010d1fe75a69172bcb82d0529eadf1ba5
+:00bef0100c1942f8e99ec6f7f77f5b05761eca
+:00bf00dfcb52122a568fd9d0aa815d1612ed69
+:00bf105e1e92a809301853e2931a24f4b78fae
+:00bf20dbad9a0dc6b65ec31239a143ebf79e73
+:00bf3035f96751a4d298503a4c20331d2951d5
+:00bf40baf0a22cfca99daf6e939f29644362e0
+:00bf50d596443316f86b19d4b76660f35ffae5
+:00bf60ff246a1780b6a1ba6c85fdd4086c157d
+:00bf70168f1aa7ad0448ab843fc520984bfccd
+:00bf8001d04b3f291e24b50da7e2ba5dca94a6
+:00bf90002799d64a1711ad1c8c69083e0f3c2e
+:00bfa0d551866d33cc8436e66359c4333b8798
+:00bfb0ee95349a7cb7160c0d3ba4994b0857dd
+:00bfc0ddc953064db00ff46d70afc6331306c2
+:00bfd0be48ea3bca4ab608645f44efc0842849
+:00bfe098d9553bf0765e85c01fe843a75b5467
+:00bff01cf0c669fb152ca5fb81bdda8b24112f
+:00c0006d02e9aa5658a075680d1429744d2026
+:00c01000ca8c07b1a849b274b156982106bd5a
+:00c020690b2e02c29ba0bacf1f6a5a98a3dfd0
+:00c030dcbd7c62004b73122bb964bead6ee002
+:00c04071f5b794b5dc3d0e6b0fd1b2ba1b192b
+:00c050f0534b39b47d2ed333d29cb4b13f253b
+:00c060fd94ebecef80c6a4183f943599fd3c41
+:00c0701e3cd862f34af8c37d2db05437c02d83
+:00c080b149903cd55446e74aa6c5f6485fb8bb
+:00c09079103ff4ab949d0b1d50c19973cb9778
+:00c0a072f6e5e4f2d6e749a62fe886a74a76ac
+:00c0b0c7a0b9ee19bc5bfca3e622439a8eee6c
+:00c0c0886c6ddb2c6f1589b6bf4f43415520f9
+:00c0d0e20d6aae32316dd6f5d4b8b1cfe676ff
+:00c0e09f2759e58d3644025adb1398d46df96a
+:00c0f05040f33a1c71d03b147f2627aebfd764
+:00c1009fc94cfaa7855d3f8a9a72b0ba8c47ba
+:00c11044591ce44d186900789cd6df34272d87
+:00c120f878357070fe222d72b82be8d5739f1b
+:00c130fc5dffb624930a1257fef1ae3485ba0f
+:00c1407f94000d627fe8a8fc28461eae69ddac
+:00c15087378f6bb7e4cc23f3ed68a3e7ea122c
+:00c160f3814cce1c33c019fee7de62ef36a15d
+:00c170052fc76ebd271356b233dda6e2dd29c6
+:00c180212d3f5f84bcef577f359f2fd3989b55
+:00c190fcbfc10d31c7494fc4f7dd70412b0c49
+:00c1a018fcfd8e690aae9da7b03df213f10e9e
+:00c1b08d82f495fc72ba24a3d827eff9ef8035
+:00c1c0d5972550578ffe83392739b8d05a2955
+:00c1d0a66a64d169f3e24eb410ba24c93cfcfa
+:00c1e07349a0eb142e1a459a213c5e4043c423
+:00c1f01e2eb7404d610c7b0ffdb81aacf536a4
+:00c2007489ddf7a1ebdaf7978f31bfdb9f33e3
+:00c210892f6795ff332ba53968762eb2cab4bf
+:00c22021d1ced63205d807c6c5fe1e5598e1dc
+:00c230d72ad1741aa0fa1b440203132c8533df
+:00c240cf867ba41a0f6558c0da4dc065a6c54b
+:00c250501b1aebe4799314a6feaf9f12a06c69
+:00c26069e60e9cc76878bd0c05a4b1edf2fe3d
+:00c2706c0250204a0b1c46c2417229191775b0
+:00c2807f9f63423ae0123096fc3d4be526b856
+:00c290c3989d7419f4b6d7fd8bb6014b7db3d5
+:00c2a091138e9bbb0cee3dc449a37593238272
+:00c2b0023d7ba42122959c62e89fb44ae09437
+:00c2c0ab57cfb865286bac2cb6e88a314bcbf3
+:00c2d0268947cb552f3e13c0a0465b535835f4
+:00c2e04c39f9eed795a606418c216228f379b4
+:00c2f0d3b4b9c8e6b8ae4ef31a2ed1781c7456
+:00c300acba0dfa372acf090d72a92e1a4df04f
+:00c310987daff3dcef1c16038242c30e6a2ebc
+:00c320fdccba11cbd5c6e1d4eaa8090b26f643
+:00c330f208d0b892b209d624e4e75e174b4fa2
+:00c3401b60097197b7d5b23ad27d23a2322a93
+:00c350e5db5d5f3fe200f1f575f5e816ff9a26
+:00c360cf770ba05ffd4b8748ae43427fc21dd6
+:00c37067094d5082430e857e2a45ecfad97aca
+:00c380ccd65a92bf619c76961d7044c008f3d5
+:00c39028e4f6cadc3ab4038f380d1e322e6416
+:00c3a0ff7ecba04a3d2c5fe17dd67819e98fbc
+:00c3b07dab3e5408b60861d90678fa8669df64
+:00c3c09078a877e5b218f5e1072dbf2dec2502
+:00c3d09ab857e3197840a192f06cb4ab676372
+:00c3e0f472eca5c6a92974c43af48051251b19
+:00c3f0bdd70ef6498b7e9506bfb8fa587d7d4e
+:00c400dde95e98110658ed3d035a2c76e6428a
+:00c4106923c10bfc232525c88d36d4c3d72815
+:00c420cdbcb942f07b895c5cfb668e29b10759
+:00c43050c8fbb97070a0c4af0d46fd8cd43ae8
+:00c440d907e949585da9d98b14bfa2784456f1
+:00c4507d7c43b4533e7a7a417c0746793a64f7
+:00c4607f83d691505d393ca8d73a6db3c339bb
+:00c47075733cd776fc146642b469716c67621a
+:00c4805db3f0cfc1fb8fe34fc0be9586f81675
+:00c4900bf193e17e9e8c1a269a2fc5f7196365
+:00c4a06563d0afe4df537cb7a64bbd5c447e39
+:00c4b007a20296e9b0710abfc172d5f1b21196
+:00c4c06e551d6ff321129f1054b5ebdb5ff7f7
+:00c4d0d830dba5e95e4bc6902a0946552b0f9d
+:00c4e0e27a4339a7e0d9c0be8d1f904211085e
+:00c4f0655cb9ad41028c6b70cf6fce824529fc
+:00c500e1015b3133b8965d35d9d429b5b72aa5
+:00c510b65e4b9dfa335231459e46e22693eb1b
+:00c52075b7be406edad46cf845aad7d9200e50
+:00c530820125fc085969a211a3f9305470259f
+:00c54094a1ad84ab8688080e561d24713c094d
+:00c550c437a4c56208ce76a777cd2b6a9314a8
+:00c56011dbcbf6ea096d1033e4f25cc1b26332
+:00c57041096dcf6a82618659a5bb6a6417f31a
+:00c58008d570abb294f4880f11d41df5876404
+:00c590a50e085646f0dbc6f27572a647e1d722
+:00c5a07112a171bfe32fba81c7772b3868deac
+:00c5b0c505a079208031f15bf72a7d42876cab
+:00c5c0de62b1260d7f0e7eeccbe2fb1b417496
+:00c5d0f00d9da47e95440119af1de18de7556d
+:00c5e0d7cf046ce6484f4527d8c87f9c109ee2
+:00c5f0a0e3a27fb9b108dd1796f37999f462b2
+:00c6007c3fba12364db01d491aa3ff9f45a94a
+:00c610e1e1b8364772bccf8ef935450858ffae
+:00c6208285034495b2b66883a765aa109e77e9
+:00c6301b86f995caf82705f785cf4015802d52
+:00c64029db533662b2b7c3be635fbfbf5e4f7b
+:00c650a2b067d6dc0c62d2f5b2a8c47e33aabc
+:00c660fb39a59e0071651c83fe1bbb51ea79ea
+:00c670b094074c8355ec5fa97f3a6d8107b36d
+:00c6804a1029c4734a40c89d070bea9da13c4a
+:00c6906f55b8bd7a2b602761f3ff58d843a81f
+:00c6a0343fabcbcfcd17c0e17e2e7770593cc3
+:00c6b0faec5ab52cd8ccbd1877ac39eda0850c
+:00c6c00b295accff9a34c8f1fe3b289bd930c9
+:00c6d070181728ff680438426ab5f23d0602d2
+:00c6e00a226d38207411072125b481ca358892
+:00c6f0456a059604045c0ea779bb6770f8ad0d
+:00c70031a433f9762940773aba4adc15acbd41
+:00c710dc424442dbfde214a2b1450569556ee7
+:00c720f616efdac8cc7dff97da2bcd04352a35
+:00c730f278ee0383909faae4e10fe70ad02a47
+:00c7401dbedb7af21ba7cefcdf3bc4308ce335
+:00c750c6eee0cda161b15445ecf3a3d900af80
+:00c760bbf3f35bfa22c8432766e0176ba21728
+:00c770a5021de1f6923024c7f742388d074876
+:00c78051bd09b6d0e7a83f0d61e86e58513ef3
+:00c7907b43b3fb705ab678fa4324b2483b6dbd
+:00c7a09dfdb0465cc19c6affb1b856c197ab19
+:00c7b0084b6f6e48dd9e3a67e246eb232705a6
+:00c7c06edc3d87dcd511c0d35b67141b8bb43c
+:00c7d02e6d4f710e047e7573b395ed63916ad7
+:00c7e079a8fb7f9e93e057b2de8b4b7e16c6e3
+:00c7f033eba0c5a5c7ade46217793219accbef
+:00c80097f0770b753a5ce353b0cc3f775c81c1
+:00c810ba92145d7d4f1f6b39a31887942220b5
+:00c820fcadfdf8efe84f2e323490d850a91260
+:00c8306d1b64a0896858f35f24dac56595f0cb
+:00c84055b6d0fddd8fab49a529c9e00bbaf96b
+:00c850cfa6ebf6d0886240d9f19e45a16a6483
+:00c86024e3e2b6f59c775fe2fbabaec645921d
+:00c870c38bb18c4e129868ad151c0e21d33778
+:00c880cb1f1402b1fd5869a633e7a43e4ae1c2
+:00c890b89225399c98ac59c5a8c51e26e0710a
+:00c8a0920c6a1ee85098d613b1174186affb1b
+:00c8b05b515f59ed9c0da5f31b5dd15034b78d
+:00c8c02e3d60ae771bad6ebb77846e053035e7
+:00c8d0637e328c878670ac7f3bbd47ab55167e
+:00c8e0a31649356e12a37e5997f0951fb37d52
+:00c8f0b9eec8564b2c75081ee248040e65f277
+:00c900f309d0b2eba47cdd99320337213dfb9e
+:00c910e27000819c3224b7ca62343a89876c5d
+:00c9209192dfb93b176d60c099bd471bfc806d
+:00c930f8cb9c36a9d5ee1f7730528693dd65e1
+:00c94039b824ba99c97e5b4c4b9cfe335d4cf8
+:00c9506b219acd03d75f4bb0cb57fb19695014
+:00c960d21e0831415c0f0898e6e97951d542f9
+:00c970b3be7cff972e9f4cebd4b69cec62f18f
+:00c9807aa01fcd5aec287c0b8ec610422d8c6b
+:00c990872f5e9bbbb0dd4244cc2df34f4e2ce9
+:00c9a071fee1b9abf76757837f22e58b953f1e
+:00c9b003b65d90662954d4ee54873dc16e6755
+:00c9c078b0c7e07121be0bdfc0f6a827bb9d8c
+:00c9d0c2af8be24de9e74c92b574dd9ee10d6d
+:00c9e0fb858a24382901b0be13b5fdcf1c8a28
+:00c9f0cdc0ac1ab7b03c559ae115a7f119be43
+:00ca000f369ffb5fd704007afaee183d7f1f79
+:00ca10106a4601e9089fcf982e36fd6afb4388
+:00ca2022e362421f64a486595dc0ef5f07aa0c
+:00ca30bfa0dc6e4fb45034075ed3aa87a1e28a
+:00ca4071f38e09af1e1d1259e95b28da095faa
+:00ca50c5299277fd43c4777ba92f3eaf1b65e4
+:00ca60181c639deed3ba50ccda0e812889acde
+:00ca7041d176ebd11a390a971f2ef38b5cc5f4
+:00ca807e86d0fe684ac030685b6a85c9b8fc1d
+:00ca9012cb57012acf0b018b98b0d2f976fdc3
+:00caa0ea4fed391f192a3ace88647637a0bc51
+:00cab0e97ff8bc630d1e9d5486bcb195904a09
+:00cac0e928a1d091ca0f881e50af62ffb5334b
+:00cad066fcec77b53354e28015b8a6bd4211d6
+:00cae0baae18160c8eaa0184a4b114743d9c54
+:00caf0f1eeecd2f9a354a9507ad17032c10c6d
+:00cb00138bcb0bf5bf1e108349bc72a190a3db
+:00cb10374ba6972ebbe4ebc070a29d36a63832
+:00cb206409441b65b96304f9ad6d041fcbd31b
+:00cb300d902c6d5d1f490445854774ba6a0573
+:00cb4005496f27c0a0d4aecffd8e9e279d2fdf
+:00cb50fcae69ee06465c753b48e68b6987983b
+:00cb603eda424e8811dae082e3285220438a18
+:00cb705ba8f3c586f5073545c95ec713f599e4
+:00cb80b22ae7a85bb5389e1146b1fb0615f9d1
+:00cb90d22b249ab71fa52bb6c2360c917dbfaa
+:00cba0efacbd86923bfb01c3635575c3de116c
+:00cbb08a61db9c44cdb8f0fe8dd6a52aaed43f
+:00cbc0b3f7f7e8a8a087760502c563426fd6b9
+:00cbd0e900cc3f2b4e38167835923f60ac8083
+:00cbe0a4cfc1ac42615881ece388b0a357758e
+:00cbf0c72c0abba6e1032cf408248c6795d051
+:00cc0053789c0753550da6e52f8f5c4b997d93
+:00cc108befaf8c12cec2ab1ab72632cd53503b
+:00cc20000f4382d5f22d22b9afc68a924614ae
+:00cc30574dfca6cf48f25f6b9ef678f98a5c1f
+:00cc409b0590ad00a6084e351eca22a4493b5e
+:00cc503662dc165ee5c13af6386fb7fd573ee5
+:00cc6051e19bbb0a547fce145cd4c796160686
+:00cc70cc916a24a23718676cb1e7cb9d860352
+:00cc80b462988160587ecb5b32dfa17e09e371
+:00cc90d410f135d893633c68fc4973fb745720
+:00cca03305c2df868f461dbaa35a1b500ec36e
+:00ccb02c789d1931ee72352a62efd7b8a5071b
+:00ccc010049d14befea1f5aabd184c646fbaba
+:00ccd08aa6d3595bf82a300a8d1895bce9e20a
+:00cce051c40389b6b10ad2b7d4ef567c202a5b
+:00ccf02a00d37d009f54f1ff222bd4d966d723
+:00cd00570da35c1525656eb25bbde864bcd940
+:00cd10fd9ddeb62095a440c582faca94d4dcf8
+:00cd202d02b6d354abab95f119c0a540296067
+:00cd30c0e38c05f54ae7630e6e6eb1b69f93f7
+:00cd40f74380d0c76b24589459d420f37a615c
+:00cd5065e0a1961dff8672bfe1239441e68cf8
+:00cd60da7f7fc862d8af89176c35c44909b4eb
+:00cd7099a649b73671631bf086746397fe84db
+:00cd806d0e1fcab40f71797b453ea6d4bac654
+:00cd9098adb16fa91770e7184405f85014ffb9
+:00cda0d0c8a58685dc9cbc044667b7c30b8f36
+:00cdb0b70b8bbdb01d75feb7d5c7858ea37d14
+:00cdc0a1e838c98f356e41d4d1a7401bad2dbe
+:00cdd03d4f72a0b799332a20ce631c44383b3b
+:00cde000e1d28318daaad740fab0e23b8feca9
+:00cdf0c99ac9fd668269d6ab7658b1fde34444
+:00ce001c855fa60237b049aec96ecd093fff2a
+:00ce1010c74fefee7191d888f0764f7d247c96
+:00ce205931269424968c4ced24fa1e36860ab8
+:00ce30c6016cc444bc7ae93ec0ba1f916ef802
+:00ce40e72e1195b35a85143dd674b4a8605aed
+:00ce50a6da897e2c8677fc5e51260f2315e0a4
+:00ce60e00433632fe3a5808bfb7eb6e719862c
+:00ce707513e8c11e04e4eaa69c62962fe8ac29
+:00ce808d8f218d341649f304a3b96acc344c0f
+:00ce90d470476ecaa1e841958b53c5f04fd594
+:00cea04aa68e4373c9d9debf46370669107f8b
+:00ceb0893f06cd71a8c08b57c4ef1709087934
+:00cec06497ebda993f4a6a048bd6b3e1b9554c
+:00ced023bab647ea5aa371d1c787d05405095b
+:00cee0694190d82754f8ba7b7c04cdcd603e81
+:00cef0e724259313aac3414ca048ba30768280
+:00cf00a8a3732211d20865b98fa45f050b7b2a
+:00cf10c42e8ae32da64f7afe17d2dd52a7983d
+:00cf20b31f0e3a247676b8417961e30026dde5
+:00cf3015f932dc0e831336bc2ce220bab4d84f
+:00cf4046d6922e00c7ceb375d6afca058b2848
+:00cf508a946943aecf3d8c293d9993a9857182
+:00cf6028a221e92eb4baa61fabd1d723a03ebe
+:00cf70135efd0f2814fcf1ff4f120a5072b920
+:00cf807c2205f042e39d9f8d0d918c00c41526
+:00cf90a8043fbb4ac3ad8b66362b50b6d62f29
+:00cfa0059adca6efca8d33577e1db78dab2b46
+:00cfb0dece231a825f1498467db5a15deed1dc
+:00cfc0eca96a73476eadc7826d39efe8187d16
+:00cfd0be2d05cbee740b648f218d5160cbe5a6
+:00cfe0520b7d33900a015bc2a6ee51069b94ed
+:00cff0ef2176df76bba91247cc4bcdfb4231ab
+:00d000b2a1004079391bad4dce8c72faea3148
+:00d010b0b61d95654a4b2020bebcf8d83b6cb3
+:00d0206fb502895fb1949939f320a0e1b0cc73
+:00d030de059665f04d815ebca4a409014548f3
+:00d040eb35ed3a22c0b6e54946e78e9ddea1db
+:00d050bffaad47e8fe8bca71ab8d7a317fc195
+:00d060b6a50928859b01c45103302a0a2eb5ac
+:00d070197a07628e36a84d1bad2536b04ec819
+:00d080157f318aa7d3bc9895adfa7740571057
+:00d090c15b2b7f8b1067c0bd9f88f3df18d6d8
+:00d0a0ca9dbb2f468aba0c3e5d4a4f089a2fcf
+:00d0b0c819a4d59259b0e992286c76e0adf844
+:00d0c0c7e41f2b0a8f1ab88024a3ea27ce41e9
+:00d0d018862cf15bdf78c13e8b234033f90e2e
+:00d0e06ae58b6707cf1b3794759401dd44911c
+:00d0f0668078b3ef67fb2c993d2f30f5c98095
+:00d100924f919c616a8eb00350dd2e1f01cff0
+:00d110c31b3ff23bbe92d5af1d22e2c3c64dce
+:00d120b51b6fab22aef0f67fb4cb3308d9d479
+:00d13004118227fe8bcd980d330e746f257d62
+:00d1408b898706289a43d6d217b3d3cd9c1f40
+:00d150a596ca7125cb5fb0b01af61a6ab494b4
+:00d16032b5d3d0bf1fb1e54d14a45e9f704fc0
+:00d170d8b90803c1807a0662c8754261bc8364
+:00d180cca01959dc623be92894e9d154624b62
+:00d190c4a08fd9be7adb9328ced39146d59c4a
+:00d1a0734ff2bb71f580aa7ecb5c500251e8c5
+:00d1b09344812cd14f19705bc69a5bcfa2da29
+:00d1c0434ca641172c44c6bbe02ff26a6ad051
+:00d1d037c3164368304a5bdaf92c39129d45c9
+:00d1e0db97b35f1c6a8acf3ac7ede21972c98a
+:00d1f0e5a99a15f13be3efb9c965c292363f16
+:00d200e42c825c23d4b8865c568af90a716f49
+:00d2106a2e80144dd7b51f1d676608c6d25ccd
+:00d2201a1d6c3bdfb79e201a1c36e7deb5dd1a
+:00d230e547435e2fd01c426e6b31a9936b3012
+:00d24034ba1d7867cc6a25f3bb4457a74ed1c5
+:00d2504c7b0f9a0055fe4614484006c7485a41
+:00d260ce93b0b534bcd363238475c188c299f6
+:00d270d20ded50fe50fb15ab4f1b5fb0b4283a
+:00d28052addfb6d789f5e9bc9097003d13c11a
+:00d2901208199c7685d625b878e748661626ab
+:00d2a06f6375f6aee1f3647fd3f425c2e5ccc7
+:00d2b0fa68a42efd492d0222ddd934425f05d3
+:00d2c03c7a8a2a1320eb313a8973b7922142d3
+:00d2d00c868305115f60d89f35692ddcff5c33
+:00d2e0172800f18da3efbd931c34d2dd954ed8
+:00d2f084ff0ce4b65c61cb4dc3fbf83fd500bc
+:00d3005bc0f147bb1d067dc7ccf2869cfa0480
+:00d310d90b34351abbb21977652088dbc84148
+:00d320c329a2cb195e6afaccf495bc938f609b
+:00d33044cafc5ce20e5f0e915bf2c4c5a5c734
+:00d3405bf0105ebce587218710fa31d26a32a0
+:00d3509afebe4569069005018ab5c3832ed628
+:00d360ae8be4abbb4601b9ac17b89ece7123f0
+:00d37093223c0c51f7679fd72e8228cf5ef7f8
+:00d380dca5d431b51839eecefd98ee1c1aebed
+:00d390c22c7255dd71075e956318b4b0f8d462
+:00d3a04fbd3ac0f51d0b7407198d5d9d5dccfd
+:00d3b0e5d2309c0366cefac7a9e532a86f6141
+:00d3c00208bda3c24b9aa088c5dd92aa84f92d
+:00d3d009c1c0e8b24e0de5137b778db67f7c40
+:00d3e06d603e6aeecbb48c7a3287ca54d9d67a
+:00d3f029e642b83cc3ecfbc43c1977abcfea77
+:00d4008c37a608df55857b1f642f0fccdb6836
+:00d410a6b83edd03eb09fc786ac515cee59d57
+:00d420b2ee99ca8b233e319624ffb90adb15a9
+:00d4300487b44cc58090faf5c4d10d6c156106
+:00d440baad3300c9517dc3ad07f8b880397bf2
+:00d45051e1dc8585862037db297a6a4b36b15e
+:00d460bbc37b357650be2f73dfa140ac7fa8c7
+:00d470769d1b90fd5dd3b30325f5552ab334da
+:00d480530d6290ea9620491120e764f28dfcad
+:00d4900d01d8b1c8a6c065bc8f64a4373f195b
+:00d4a097cfa354c784b73b50d2baf6fe672c0f
+:00d4b0e1f35dea4b7555b184b129e02eab50ca
+:00d4c029e6e3507f54c45d86e5e8364cbb5013
+:00d4d0bb711e9c0f682e2e067ea4cce3072ee7
+:00d4e07305d0d9654c453351173951e48d79b0
+:00d4f018453a8f14fb19fad542c767ed5874e1
+:00d5005c995201eaed8ca0e6bc96c9b2488c56
+:00d510e36648aae97cc2fdb5afce4dd1b9b172
+:00d5201a7bdbefc754355946eca79023b7422c
+:00d530e9c22da5f4b0d47db857a227861c3299
+:00d540384e73f5eda708586c186ec051ec489c
+:00d55067e7d16eda72df68aaed3a2925527112
+:00d560c21d703f0eeff941062ecc56e42aca8c
+:00d57072db206dd7bcfce1941de160362c4afd
+:00d5807ac62d641ef7d37c80ad54cae24b6e8b
+:00d590b1271195731b61a6f69f31baf9b30c45
+:00d5a070298b5171c7465a94eaadf1f0d07ce1
+:00d5b09904fa9bb55f878114d742c3b980bafa
+:00d5c0f0a4c79d16fca1e441b706edb9040300
+:00d5d0299b83e0353c907e991c8bb63b1e27f9
+:00d5e09688348b37562bcae83b21dda7b42153
+:00d5f0f8afc1fd6c5e02381f1398651e79d536
+:00d600f35edaac524234515f27e4878b488196
+:00d610799ec9f600a4d80bf791a31bf4ff5d90
+:00d620f894782725d729750900b354fd0852a1
+:00d63088f7b0f0570b2da15fbf5b6d237352b8
+:00d640f31d9150963d535406de86ef3efaa177
+:00d650617d12cdada0ea3fe271cdd1eb274b13
+:00d6605a823633155ae3b435093f7b6b02d417
+:00d6703965787ca6a5a32ec6f04d2554c5975b
+:00d680c13be156efaa33f9cc07cf26f5a1e2ef
+:00d6908f88f25c21c99ff4aefe4cdfe5116d55
+:00d6a05c1fc359358ec91825f8d50b22a61b9a
+:00d6b04e3846b1ca74c8a45c84ab606e23035f
+:00d6c099d31fa9cd31956c00537844d0cd0e9f
+:00d6d07a17789d0f3884d1dce04980a97d8bdc
+:00d6e0bd66883d1dfb4996b4ddf26f88e4ddb7
+:00d6f0db7905a5c8d7d27e365e17e9b1cee5f4
+:00d70093eec9886af3b458c43c7c56fce9e03b
+:00d710ce331d734c7b62a90815232d6ba18adf
+:00d7204d178d49eb86e9d74e1e00380f7ecb7e
+:00d730d1232acd1fb4b8250493245818b3359d
+:00d740a0452d35fc5995871b42f25656868a58
+:00d75003c7006c0ce57cd15adb71ddc0f0295c
+:00d760650bce5e2e5dcd8cb8c2483f3c52b2fb
+:00d770b2fc02b098e2703a21c888159eb032c7
+:00d780e06a34b10b01a974cc33c4989385f0fa
+:00d7908cbad3551645b3c7d0d632e33faa653e
+:00d7a01ec2aa77a56d65873b00c9230afbbf73
+:00d7b0a094792faeaf15c720947b448fe7bed5
+:00d7c0477fccb3dd3824bfe0be78b101b1fb4f
+:00d7d0f7011c9c4976c671b462f22a2e97c6fc
+:00d7e023488f77a1036aba12492138cefdf346
+:00d7f0526e7d7cf1b2e31f00724d9c82d3b422
+:00d800cdeb4749308e2de1e8aba6bea3bf2ca5
+:00d810eeebe4f120ed1e0e302728ee758e3f66
+:00d820e901bafeeea75c5eb028ceb9bd203311
+:00d8308c72608a6cdd633d275890639dfa5927
+:00d840e966bf3633d8a4384711c027614e1e50
+:00d850dbb3acc11f898b78fcae4c75971551e7
+:00d860e3abcaf7ae8106c0762ccaf2bf0d4eb2
+:00d87001ed0ba45af468915c620e73e138e413
+:00d8804ef40ce058dab139ec5b6dfd09e7ba8c
+:00d8904b4caa9cf133e69e8836ee4347b0bace
+:00d8a07e1a237598a243bda8327b2cd2c50048
+:00d8b06da4e932117811e046a64a34f505dfdc
+:00d8c0ad47baa77acc915638d0800ac1a7e1c2
+:00d8d0a8973d63e547e78a2624630323bba931
+:00d8e0027a33c43f3d94bb53c35265de6a87b3
+:00d8f0f7ef51bcd687f5d0ef8c754d91de4e1b
+:00d90041e85d33c74db1472a0f989fb5235087
+:00d910826d04dd31eeaa089a38fa4011fcc9c8
+:00d920c114962e07deaa44a86c439ddd16077b
+:00d9305996d1cc598addb944a4ab86ffb57cea
+:00d94025197a929763ddb35c15f2f7bc4d8685
+:00d95094849901740b44468451a82de1bfcb5f
+:00d9602f53284cde5d4202eeec877684a7d6dd
+:00d970168632f2c7a80e4a2d7ed65dcc3dd20f
+:00d98018ec2b7e2be91c60dd90787231d89aec
+:00d990291b3dc2ac04635d370c7bd52616ded5
+:00d9a04c8b6fd52edb52a122b0cdc466acea06
+:00d9b036772d2ee72db73cb1d6d74a672a1bd4
+:00d9c0eb2fe5e865b2beb7cf00ba8c6e84797a
+:00d9d0993c889bc91dc0a5da3c52ffaa78581e
+:00d9e0439f099e961d65c3356ee66c2d1d1e09
+:00d9f0d40cacb4c559e886d6190af9b05d5036
+:00da00bcb382114ce168e3a87980e07e9d694b
+:00da10804bcec46afaaa6d9ef55601860a0bae
+:00da20df1724f27a9e195c7e1f50497cfbf460
+:00da30f18a649f5fb2ba4c97458d501ee4d100
+:00da40333239e371c211f132f1a613af6c5d82
+:00da509915e44f8cb5c191071e6ce3226a3d2c
+:00da60355bc58e6dc5ced36cbefb1fb0d4cf55
+:00da70b9678b2f63f1f52017093e451f25835d
+:00da803da37cbcdc4a00c3c1b14393eedf894d
+:00da909879e9e45b32721450c2a729d6b00d85
+:00daa09bae5343f1eabaadb4d9158c6fd83cdc
+:00dab0d28a358e8ad976739bdeeefc1eba7670
+:00dac0dac2c0fe12cd6a5c1e61e56429af0331
+:00dad0dfeb197915ecce986e84e45ca82b7ed1
+:00dae0a36487a365f0435cb8c9ae58a3577b13
+:00daf0b4c53d57b70d1251ce8921dad49d1603
+:00db001567acee36b6395d995985e6f02d0ac3
+:00db107ad399a3be7cb06ab60f29852700ed9f
+:00db20f8a825668866649ca65fb89bacb8a99e
+:00db30a15d65bacf16e68095e6b599d09531fc
+:00db40c618183d8de628cf5fdfac626174a9cc
+:00db50b3cf849d5c0a9ebaa7a91897b0f45184
+:00db60f1563d34259cce51e37b59ed973863b7
+:00db7046559a737043201d0b7655ed5019c660
+:00db80810bc2ce54864c2f953db222c50bc4dc
+:00db905f25c44e02c74b4c917fb1bc95becc36
+:00dba0984d3bebfedf8e17d336e93881c52605
+:00dbb06bc3b79a2f596df6d8d458721f092b04
+:00dbc095d1d614549cdad3748cfae1378ff9c9
+:00dbd09509d3cd43a6fee0468f851d037509f7
+:00dbe0693d3b93dfcb99418a7ce6e7efae934a
+:00dbf0dd30e325581e94aa89adfb77e128bf41
+:00dc00c12d782c54d857f56d31b18750d84c7d
+:00dc104c365cf51671f26f58d373c8e357e080
+:00dc2092243879697c6205df17e5e48c1dac4c
+:00dc30fb6efe3f03c089c3f73a4b1135efd8d1
+:00dc40df83cf1cb65c7c30f815243dbccd967c
+:00dc5021851ba784577d5699ea661bbd07e7f0
+:00dc60c9969f624b2e141969ebdc3c776680c7
+:00dc7082e5dacf0f053eb4ae6944f52a734c26
+:00dc800c6af824a374628709606888ccd1ec0f
+:00dc90fe0d903ae1b32b25a20de2d9b5284bbd
+:00dca07fb10ca61a9901a2f83b7b2e56bb6e40
+:00dcb014b2de610a2c92eae521b173ee79f980
+:00dcc04ed32abcfca2c24d29e3fd27e79ca3d0
+:00dcd0875cd3757ada975693888b95502df5a5
+:00dce05bcd87464864afbe11eaf83d2ff11ca3
+:00dcf042eafff7d403fc0bdace6e5e68854cee
+:00dd00a0365b987da1d7122bf63c570e0a946f
+:00dd10aaf0f9412ccb0ae27a1316bc32c91bf3
+:00dd207c668cecba72faaca930d86f894c89a9
+:00dd305af09eaa500724fee437ad619d647f36
+:00dd40b2a4dbd38a57539879439c3b9bfa3b20
+:00dd505e9b456b79f0ac95c2ac885f9ff9fbf6
+:00dd60dcf9c564ac1c4b38ab53b5e5d8f8531a
+:00dd70812e57829e66ee71375973ff54522eef
+:00dd80ae170f31a56b7c10e6b6b3e47c45cb7a
+:00dd9083677b70dec5eef4ab66b165206b996e
+:00dda042496b5419a1ae07cf84d297830c62d8
+:00ddb0b2e940e29f1f4c4c44c55dc2cafdcdac
+:00ddc0b4c46e895ea2266106d83340e22235a6
+:00ddd0635f2ceb4480fa2bae4783184f15c822
+:00dde07b447465ca8bf5465c0daeab0583db5f
+:00ddf0dc0fc275de6eb1715f0fd8cc85ea996f
+:00de005f49e7ef83ba9b25c7dfedbe346b3050
+:00de103be86b88cfc82a9550a2fecf48a0aae3
+:00de20ff638d60188c963bdfb648206c979bb8
+:00de3051126b20651a16fc0cb969d2eecbc628
+:00de40155162832135a5de2b8c6299ca09e043
+:00de50f6520763f3cd65dc454daec7e0ef062a
+:00de604b8509091002af64fa8186b94d04da01
+:00de706e71dd50b8740ec4a19574600c7c027e
+:00de80b769f0733c784fc346e869043bb30db9
+:00de9093766ef6042711f0084789360c5a7000
+:00dea05deff3cf05ffb4bd0970968d24098fac
+:00deb096fb30a76363596be51976c8a20eea2b
+:00dec074f6aa376cfe0c94f76b9195c2cf6b76
+:00ded07b4818de7f38f27a5b6018ac6354fd5a
+:00dee0c6cf900da31c09677c741d6af52823d7
+:00def08a1e3661e36f3d42dc1a15970e3990f7
+:00df00d0104156f2ae79a6437fcb35fa2256b0
+:00df100c6cb92883257d6764211a282984223c
+:00df2089d5a0ed516beef28224e4f5c58b9baf
+:00df3089ed11a21bcbb9f5b7895e197e7dd9f7
+:00df408021c1baa2b0dbc058286d3c51234d54
+:00df5096dc3e90a717aeecb9e1ba365d4c0358
+:00df600311c14dcec8d391817dbf21e8fd029c
+:00df708e4053a61c68b5a832880269ea3173c3
+:00df8055812e09151ada01b8c8893fa36ea79d
+:00df90f5e72b7f05e8f4aa9d2ecfc46416a03e
+:00dfa07c1011114e6354910c38bccd3111aa4e
+:00dfb07b69589294da904cccd4d11efd8fc05c
+:00dfc0cc26aafdd5aa409ccad1ff7f60e43e8c
+:00dfd0d3f9a6de11efaedd08651002d400c06a
+:00dfe081e3977436924257877cd0887ef537f0
+:00dff0f2c2eb25e460bba86afcdb5e3582356b
+:00e000f18e9e041b81d18fddf60708072cc29a
+:00e010f354242904525cc1cdfa79090f318398
+:00e020282f87691f823e3b3d9d29f4c1e0aed3
+:00e030d4c37c297c18075b956daa08d6cdb581
+:00e040db64ef2dcaccff58cafe84307415c03b
+:00e050048bfa9b268119f2436121f494458820
+:00e060daf38ee0056014de59ef61192dd9a4f9
+:00e070e6a83b7477343571ac3c11e0312f3c2d
+:00e0802d33dd344ab6c86350d85210731cd085
+:00e09070c81471a526920b2430d7f0bb776777
+:00e0a0b5b9c85bbddb4e299a7839f3417f81a7
+:00e0b04906604be6d2771c3d77b19c8213c604
+:00e0c0fa4061ace9813e86c8230abee22de998
+:00e0d0dc8f2d1be8683554fb4d010449f2efe6
+:00e0e05f7661d982a6f7377d213448217afa32
+:00e0f0e981180adff39a1c77aa4e0b731f5f88
+:00e10007eecfc8f04facfef84ea2efe91b969f
+:00e110bb9c5b023f04bfb743bd57724a835248
+:00e120efd9ae8ba4801f411ce74a5f23ff952d
+:00e1300a3d9e2aa0f70c5becf16391f1cec12b
+:00e140f1a91e61ffaf6e409ec8911da92e9ffd
+:00e150f439de2e8b60a3b600ced7b21b597a6f
+:00e1603f3e22c179b5a78367a351ceb0c9e6bd
+:00e1705638003f0f1959a06da2648930454e7b
+:00e1809c6f1dccbeb07c998e08efa4b1bfe126
+:00e1906156ad64a81a7c14966d94ec38446483
+:00e1a061dfb941cf0026a37fbe2046a02635f4
+:00e1b01898989832062379be164c32afca2037
+:00e1c0f37e4ce36c13f3c10871a85a372124c6
+:00e1d05d9a7c3192a56de59f3866ef7204434c
+:00e1e0814a7f435a5397493b120f169f50378d
+:00e1f0ce755fa9fa9285efcb628ad2c83eb06b
+:00e200462ff359d7a92292169e9a412077d3e5
+:00e210cd10224a40cdd54ef25c0b993108ef9e
+:00e22049c6b48cfc4b1f75ccd1403d215c8777
+:00e23085ba34ac729235776d509c03e715eedc
+:00e24013a211833b97b949a0e56facee5463d7
+:00e250eb7ec5d81d9871cf0db2779f6c519617
+:00e26044d6241e4c8c359da31775d124f9f3e9
+:00e2705f610b7701ba480746fa96a4246bc3b1
+:00e2809fbbfad1417add55b743ccfa1ad27577
+:00e290b988a91909efc3b08db34cacfe6775e3
+:00e2a0dca285077bd7f3d71bdd8e6f4af3997b
+:00e2b0df87a35081a2a2901af4e41a37c3b416
+:00e2c0a349cdd1f10f9fab4c59da6f1ce3458f
+:00e2d04ae268d470e4be7a7ddc9ee5639f4f0e
+:00e2e098f0b8773887f9c61fa09887a54dd2c5
+:00e2f09e35f0021ce372ea717264c94c5bf7df
+:00e300de9bebf4faee912546d003861fda58de
+:00e31075f3957d1df227deaad583abb2655d82
+:00e3201b633f8f4553c9277d881f67e25545bf
+:00e330312cf370b26d2df585badcf76bced4c3
+:00e3403c1bbabd19aafea9cd672ef13c927031
+:00e3503e11d7d7179a6fcea1f79924b260d46e
+:00e36085886c8ec27b11819a550b3f2f285ed8
+:00e37051a17f7aaf5ec848792ace298f169a35
+:00e380487c56a908557aba0ebd5cccc88b61f2
+:00e390c7b5fe5c1e73aabc86a5f9cc0ec666dd
+:00e3a034bd751135dec0fac2a52ae1a650d97f
+:00e3b0edd3262ff0328bb58e5e8ef7f03c39f4
+:00e3c0f500d8a7ccd0a3d14be2438f960c3a88
+:00e3d0dcbeecb7bdb496595c19a72f6c90cbcd
+:00e3e057beb8c92b679bc75d08bfe250c3fcf0
+:00e3f075426149a76f436e30653ca44fae4fdd
+:00e4007acdfc02c74607f98aefbdf5d48181a8
+:00e410f226c6849e8de70183c86b12f1cb694b
+:00e420dca2c6a774120cae20ccf7aa08a22e1b
+:00e430de15579cea1e430092847ee85dfbde43
+:00e440f277b9d5dc3425f6e0861df54140b4c2
+:00e4508c266c1ed9d961f671b262c0a05d97c0
+:00e4605553a48571b53334352ba4c600c8dcf1
+:00e4703723f49d2b094b1235817fbcd4a7e5da
+:00e480857a2b21f192a6f54fe6b333f470c5c5
+:00e490cccbc6214c20005d0dcca45ae182b8ae
+:00e4a0ec33fa46c47618166f736a478b758e77
+:00e4b00e66abdc8234cfdde82d586c0b2dde31
+:00e4c04f35a26ad96c6eea0b655e4a01844f2c
+:00e4d09693b48a2be620c1cf9efeac799cfda7
+:00e4e0c238ef761ac04d12da0aeb363baa8821
+:00e4f042c2a92edeee5c3b3d0db8fcb6386274
+:00e500a46261da27057686ad436f24a53c0113
+:00e5107c31c08d92b4a5f57c9be9e9cf9ed9ab
+:00e520d8da7ec1868f1bf8ff6b1e250986c016
+:00e530d13481654af4fbbb1ccf653d3a6ba0e2
+:00e540832bcc290a322897b161f385c1816493
+:00e550fab5328ae07cb129ff0ac5492eceafaf
+:00e560742df4c9d9c6c514987a54c9774599c8
+:00e57044bf4ceae214e5c06978c57760d700e4
+:00e5803fe60014a509f573f13b9c3c9b3823f5
+:00e590000b9f44c502257a84aeb2a9be31c3ea
+:00e5a0872fb57eb94d6156b9a983be5127cca9
+:00e5b07ef87c26d15e7758e0727111d2116162
+:00e5c04496fdbd9366056f950c840657eae56b
+:00e5d0ab97ed0048262c107e4236a75cf433d5
+:00e5e07e098bc9c28100251cbff1a2225da97e
+:00e5f0f672cf5da4634b5807174fca56915ed4
+:00e6006a9ab7567526687f03636ad0296dae76
+:00e6101cf54a713e6ade7ece2eaaa854e49a8e
+:00e6202cfee2188c26bc5566d25dd36aaa9814
+:00e6308b67fd4bf160d2f8c57f37e3d2898d93
+:00e64048d18199f2597ae0540b61cf5e7306d4
+:00e6507ae49ddbbbe11a7592749681cb30ff2f
+:00e660c39b6611d17f45e24eda8f0a5fafdc6f
+:00e67037a4dcae02c79e9507d2e9c564ab38b6
+:00e680bf9cddfc840ae6bd06cdd8325969dd98
+:00e690befafe07a9cd6af6790b7aa64c83dfb7
+:00e6a0d383bd9b3256ff7ab814ea14336271e8
+:00e6b0cb1a36b6f0a2081d8d51a2464fd76235
+:00e6c0bbaca3543e57ff52456773083afce84b
+:00e6d086418849cbcdf37db146f7014539110b
+:00e6e0566f3ff185f24aad435a4bb3130ada7d
+:00e6f0153ae746a4fc9a35b3a0a28f1f2173b4
+:00e700ffe9a132ac020759941da43ab4f2a44b
+:00e710c7e56a8ed266d1384dbe4cef35a9a452
+:00e7206c6c99681f79f59975b93b60b57890a3
+:00e7306b8f7bd9292e93f05401ba58d22f4154
+:00e7408d99e5923be118f8f0fd45a2d88242a2
+:00e7509bf9a0dc46dd9dce0aefbe36d56d46a9
+:00e760a8220e31bcc8249303341344944da8c7
+:00e77004f5fa6ccfc9adbf2bbb2a761b8cc875
+:00e780ccc3aa6021be0d6e479b89a80aa7fecd
+:00e790ba7c2e24acaa934e6f92c910fc1c84c9
+:00e7a06e4fae9c12bb2d072c693628f057150f
+:00e7b0ae4086edbbe4ac7c7d159be245514202
+:00e7c084929e28c07cdafd13f77a9fef277ae6
+:00e7d0aa173fc0f14aaf5c646a63070b26a418
+:00e7e06d427acae8d537fd4b037d7973de9f53
+:00e7f06dd04978f198e51a048d0091695c2ce2
+:00e8008e3e14834b5b9493d0c8e0b7c44b1302
+:00e8108b2a34de3d403e6e8df25e742e3a7f8f
+:00e8203324e34b7fe89a127c793036cd5e35e3
+:00e8309c3e1e55eee3aa5086e0b5a649073ff9
+:00e840c2942b98422494cec00307bcf8677523
+:00e850077d20edd82cb7ea57bac271c44469d3
+:00e86075dffc7994cef5ffdd980cf0b7cdda07
+:00e87069de0970c85de5b96bde5312a5fcd9c7
+:00e8806cc96914431e0301e7201af2bf4ff6e0
+:00e8906f203d8c3d26f9741e1d5c867020b231
+:00e8a0c4b97b4914e787ec8d9c67928c2e4fb0
+:00e8b0fd0078f45556b410216c29245e1c5771
+:00e8c0d08ebbcb565dfd4678784438a12ee2f0
+:00e8d0a6564b3e606bf8f6b5095290d83fa7d7
+:00e8e04262b8c35edf9aee51e42f1159c5373a
+:00e8f06c5d898e3dc89a55571b1c2bc632903b
+:00e900f638567fb1a785aea18cb2fc7942ab56
+:00e9100458d3db6c413db9ca268b288c9b7f0a
+:00e920653ada63c744683b345e4106ecae80bd
+:00e930155e56c91a93da1fc00127d4c30fccf9
+:00e94023e8b056f9041fc8ad9157ddb041a90e
+:00e950816c49273aaaa2aeffa5adeca4fa460e
+:00e96028c680bdf286081d75cc8c8f3133f6bc
+:00e970ea3bd84f42ce1456e27249bec8981a2a
+:00e980d2df71ac03f22f7554db4fdf4448c87d
+:00e990c75a6bf1153e09e912b2c615d16b46e1
+:00e9a0705e89bcd6c10dbc246dcb3dde3c34af
+:00e9b094d4810e84c65febc1b0bc9d80d24f28
+:00e9c03055fa6fb3b67a4d2ec3fea016786d58
+:00e9d0abae0410a0e59c5bffb6b7e7b174fe1a
+:00e9e04505dca2bde3ce708a7ac90f9b32e5ab
+:00e9f03f6608953a6d48776dc3f538242a305c
+:00ea007c62fa18744ea9092acb4c08b142ece3
+:00ea1094c17358762809956a19a5426b9ca00c
+:00ea20bff1cafa5ea0da0156e3df4e3412cb5b
+:00ea30e2d91c02be8c9c2f05b6c5a305a3fe18
+:00ea40c9a64f7250d8e437d338a6869cd464cf
+:00ea50fb2962a48df04134adc57e2354605520
+:00ea60f21b79169a39696e6db621be50c0808f
+:00ea70cce5d5da971453d2a4388125ec9e92ab
+:00ea80bc2e9843ff7f1d72563326837d3d70b2
+:00ea9034520230f281012f656a05dc618e8243
+:00eaa0c1a6de4acf64d23ad01c6e16f00a5e6f
+:00eab01e5abe60c58250b6c5f468189fdd2d93
+:00eac068ce639e89c3da4c32428ec079d97b0b
+:00ead04b8420c7fc4cd142e7175dc8d1c91e16
+:00eae04daaa84906cdddd6552bd83bb0830691
+:00eaf06f2e30da953b4055e5da73b3f8bdfba5
+:00eb000f7d8bfdb68730f8cd59e265178d7000
+:00eb1089973fbd493ff7ad786bf8c7703c24dc
+:00eb20aeae9dfdc43faf194f91dfef5aa3b441
+:00eb309b4c5d25cd22d5feac04f2f17784db23
+:00eb40b7ab275b816d7058a90dde9f9e5b57ef
+:00eb50c30329e66144bb2d0a23ccb75aed35b6
+:00eb605f386c53854478ab220413bb373f998f
+:00eb70f765978664d230f2d7b2797b49d46735
+:00eb80db7d3a6ec8c40b862b4883cdf60bfdc3
+:00eb90eff403cc5545e0981b7832056b55f3d4
+:00eba0ea073993a7d402847028ccade72839c8
+:00ebb06c3736023d6dac4f2060a50b5f0183f1
+:00ebc007ded5fa99bfb126c4ba6e9087a0be62
+:00ebd02bfae9b52d07e76175ac098fe193658b
+:00ebe0e867b28a84c4ba456137ac14bf12de03
+:00ebf016d9504e91f4f869f12cd17dd5fa1f0c
+:00ec00e1cb70f9af119feb63a4c750e77e3aec
+:00ec1098847f9361fe7ed333bb516e65a1b7ca
+:00ec200b7b498f57111f5846d75d4687f0df34
+:00ec3020e7d584190f324b8b1f4eb195cdcc4b
+:00ec407f0c65624e721270730a1e4e1d653f46
+:00ec5097cee38b93862032e981aad8b1ecbcd4
+:00ec60328a1109dfc6e0038aac0bca6517a042
+:00ec709d8a158248820b442b6678110eedc15f
+:00ec80dd120e0aa5dfd740c7bb43a597f06b5c
+:00ec90bb46f0eafb5280b8ab03d60772e58183
+:00eca0a263cc829396c946f50e253f002af21d
+:00ecb0905354fb9c2bc136a8a429725fa4fd0f
+:00ecc078d54ba456fe01b25013b5711cf4799a
+:00ecd0f0c61041e9d6d39747379937b29762b4
+:00ece0e5f9793a504aaf069a7c5db31ce759a3
+:00ecf0bdd2771b62d42bd6621fb60dfa9ba898
+:00ed00863e743d8b45519c097eb0426eb33086
+:00ed10cb18bdc1c9d4b7d48af94293c3911e1b
+:00ed20b3927072dca88a4a62d34b4822bac543
+:00ed30c268ed9416a48dc69d504d78aed1a67e
+:00ed4067a8310b6a5b244d73e6967bb0ab5f38
+:00ed50d5ceed4a0960df44d52decc77d56a7a4
+:00ed60b76261f7d3ffb23610b1148ec3b597f6
+:00ed70f3b6a203ef0403fa02c71a385dc13d19
+:00ed80434387c1d57fd850143d9759fd1f220d
+:00ed90c5fc38c1ca9157c138b4368cc1e0fbc4
+:00eda0df96f5b9530ce4f3b49376e8ea38c776
+:00edb081f400202e7ab3f848b770e36381799e
+:00edc084ebde0357e708952fbe4c0eba3c4f94
+:00edd0ace16f82432b8eed5048337c8c6e89dc
+:00ede056e16967346b183bffabeb18e8a5697f
+:00edf0c5046d2dcb70be094f3d18eb20aeb800
+:00ee00f7a83b20e228aaa74dd49af9e6319115
+:00ee100fc4e3640c5d1dc8e38ffeb8d9257031
+:00ee20200a13a89ff07f9fc4382ab3402eb28c
+:00ee30cb0843ccd94a677efe328911923e31bf
+:00ee403eef2e12444b64392590d2efba7bbe1c
+:00ee506fa49ba2b3f18ecae86a12eeaa72ef33
+:00ee602d162c92e69a9da06b288eb0ce20fc1d
+:00ee70e33ce77a23dc52f909809f4861d6589d
+:00ee804b41cf646e80a4dc007e25cd58582881
+:00ee905e9941369fc9fd0f8a4bbd84623e9b37
+:00eea05a57556cb354c5aca2dcfc465bee43b5
+:00eeb0a392d8bf1a27babfcff6e02a38c35c95
+:00eec040a095d4e455d0850ab246a50e8dd006
+:00eed08d61fcca62a1103ef352edb9a72510ef
+:00eee0b696cd84a682ac6def0b5a45347f156c
+:00eef090decfb519cad5cab457b1e4a7da4a04
+:00ef009217433d2650d0a71af456064fabd8e0
+:00ef103827bce89e5a52ff8eb5fabcdfa775b9
+:00ef20d08cd909f200ab31be3f442f1b2c6999
+:00ef30c71de4682efd1f880aade283cde4b93d
+:00ef40ffc8c54bbea3dcc3ea6b7f774b445ed3
+:00ef50aabf051bb8364c6e7d4277e2b9a18d48
+:00ef60cc81da7ce6366d4da3d44cc1217334a3
+:00ef70e088779afad666c21c31b531b1e2be1d
+:00ef8000fa9b22cbbfb292c58ec777305bbf69
+:00ef908bee1b48fe9dc5de5ac97b934b6c93b0
+:00efa0c435ced88e3450cc8e51ba05bf2f04ff
+:00efb04a514dddb8de10afbbc5abdd06cb2c3c
+:00efc0cc971dca0ee40f88071ad04f2e5974f1
+:00efd08cc4f6778d92dd7d3f217060036c5538
+:00efe0649bea572d836e61aa1ea2527040ef90
+:00eff08be41f139fdaee6894fe1a62f6a28588
+:00f000c56d5949920328f160620fc10dfd6cb8
+:00f0106c69690063dbe5d165f270aad295a912
+:00f020e23d90c2495b26f825e999482a2d6e6f
+:00f030fcedb296ebe19839e1d820a5514c64b8
+:00f040e92d7303849472c159e4af77f42c1d68
+:00f05054bcdbf67e419aeb9a24b45afa8234fc
+:00f06028e393f63b50b24017418649e4003a05
+:00f070a698cee9bdf9843999743ef7df25dc65
+:00f080ec1021e3cd191dece09d30421846ff12
+:00f090d205f809ef5126fcf272a59c472464dc
+:00f0a0c8e415e034404993b340a8eea1ae71d2
+:00f0b065b902a49a9a738f7c1c6b8db6076c45
+:00f0c02c3ffa10c0f66ad5327e3026680ebb61
+:00f0d0e4b552234b17f950ddb621751251b455
+:00f0e0f71bb58b1da34932f9f34ef84f626cdd
+:00f0f03be4857ea2132c769f1f27c72dbfe2ed
+:00f100df44a8272f6adc1d4bfbed69257d1f02
+:00f1105d9b9df1827c14e0b98f085b37decb5c
+:00f12032d5f2f26d4ca51b5b1b9c21c950fb35
+:00f1308996225a2d3e387282a4610880845937
+:00f1407d307209211833118a38ddc8eeb3d30e
+:00f150502350a9a6f5799ad1ad724fa7fd9e15
+:00f160dc0f29c9e7e015c9256f84c3e076fcd8
+:00f1709068a03cad0f362cc566860c7402800f
+:00f180193bd7cdb081e3b13ae0a3ef5b740e3f
+:00f190cb9a443624a9636f7603ba6284983f82
+:00f1a063006e65d46f3a285abe4e91811c14e0
+:00f1b0e076f3e4f80563d9036165cde650b9c6
+:00f1c0da5fb48706d7479dc1c824f0da26571e
+:00f1d0ba72a9a9beb214260e5ac447b9650e8a
+:00f1e03cda4059c93bd898c8497f60ee1312b8
+:00f1f00c0aeb2985bdd90f9d849d77d5092529
+:00f200d33c5b6ffa666029b0910838a1d0190f
+:00f210a4c712a38894ae93376bab975f1fc7e2
+:00f220936699020da664f97623498407a054e3
+:00f2305febfb59f9f5cda72a8369d0900c900a
+:00f2408efd20e15ff8d662bb2cfb596da95df4
+:00f250658d73493beefb0d4f30f8c9c621920e
+:00f260507a216b26610fb120827c841ef6cb9d
+:00f2708daac101a66bc98b6639712f2169ea64
+:00f2802d07fd9eb6632fc3af02bcaf870e6ee4
+:00f2906924a52e8de0cd346b23e39da4d0d789
+:00f2a0178b75ba3c7dcaaafaab9aa6f023a882
+:00f2b0f0bc0ddc661dc7bb6114f9e8f762f852
+:00f2c065411f51370190c9590e0b7ac2850d4a
+:00f2d0c8e4f7666e1d243be52263fc3aad7351
+:00f2e072e69c0cd75533d9465796150bc426d1
+:00f2f0a030d12a549fe90ce005c45c7aeb8729
+:00f300a5c746d2699773c1186c48ff33032d52
+:00f310a4a5591144033e286c837e0dd8d942e9
+:00f3204e3c384793e81aa062a553540e66e617
+:00f3301e7b8d958a092787892f2c8f28403b4c
+:00f3403afbd99971464363af50a834d3cd11cc
+:00f350752162b47d958739aa657ede7c498aa3
+:00f360fff1c0c0a7c9a7e9af0330534621af29
+:00f370cb3a42486dce4d0574199730d5e9fcdd
+:00f380782c9f42050cb3de1bbe65e8d2d0ab76
+:00f3903c5897cc5d833c2a24b39ca431560b43
+:00f3a007db80019d4fdfa733323e993e7a2134
+:00f3b0f8c042cea82a7e04acde7a6d9e1b2a91
+:00f3c0a1869d717c986b80f0bbfa656081c6e9
+:00f3d0ee1830c54a288751b56098f7a9ea0425
+:00f3e008009149290f18f51a088bf9704a1feb
+:00f3f06bde7ee3b0fb46113284e6f9510d3bea
+:00f400b17dd212b38a5ed15f6d611cee7ea215
+:00f41053be3336522cf5036893ab68876e55f3
+:00f420f90bbc890ecf938fd67e97a5bbef8e33
+:00f43021f5eca49d6c393248d179627c164b28
+:00f4409a13a8e764c7e8b6de8cfd9a7113d0cc
+:00f4504a667996d765097af8ab441f624e3129
+:00f4601dd183d2596feee0ae0dc4d32e64ca85
+:00f470e4db04836217d9a2aad5b6b921d5ca21
+:00f48055f5ffaa846fee9e53d18597ff4d8cec
+:00f490a4ce28c071b6ccc5c5edea554349ee0f
+:00f4a098d21f8db3fd2bd0c33514261ff12642
+:00f4b0de52d29a3d8edeb12623dafc24c50d55
+:00f4c01bea9a22aa7470719f1092b1d6f8583b
+:00f4d060d4c5562d42fbd52d1d3e5a4b32fa12
+:00f4e096cb36edd0a49e462f858296e02dc9fd
+:00f4f040cebca61ab5dc092b1771a5742c7de5
+:00f500a8a8383cea4448bcccbfcf97af72a578
+:00f5100e1b7d6a7234cc9d0f0e5bd96a077529
+:00f52078facfed59f1aee5a0ace35e877a4d25
+:00f53046d07bb9211a7f36c8090df81dc13524
+:00f5408a3cf92b6b27fbccb1e300a93a007404
+:00f5501cd457fceef244d49bec15f6078ea4d9
+:00f5603465b92db08dcdfc70718d634d5e7117
+:00f570820ce9ac549c430a9f0a8d2e07aa764f
+:00f5806cbe21034a04880642c963b2c1847452
+:00f5907b4c262d8d8fb3bd3b28ed241ce3bbf5
+:00f5a0ec67f1e50701530db87a43cac64cb0b9
+:00f5b059b5af1096d6e9965fc40e46472ac542
+:00f5c0a77eeecec306827607756a31fe2d7eb5
+:00f5d00fe893cdeb5030a2776b452fe007d5ef
+:00f5e04be1178da8da6093bffc152e199eefcc
+:00f5f09bae13a52cb9ccec953a1a9601ab2e14
+:00f6006451d2f0b172a81dc47b53ae5ce328b3
+:00f6101ecdcb22aa2732ba533b7b98f4a05bbf
+:00f620052484f76d44ee8f14fb654f1cecd27d
+:00f630f4a72a2dfe33fd94ba6f4fd7bc033c73
+:00f640de09d496d1dd944576591d643c11e27a
+:00f650a6511f245390ae11de5c3539a2f464fc
+:00f660f044332abafb2f730c5ee41245a826f5
+:00f670abb1fec00e9db697e4c02d64c3bdef0b
+:00f6809e382b3fd0e8e78dd3acf3314ec29c65
+:00f690f10efe820975d82207154e9f0c5f02bc
+:00f6a0206617f87f80d24c962217752b2c42dd
+:00f6b0dbf60fcfdb72e477af7ad6cfac28c4c0
+:00f6c0e15b68301209b79eb54ff4fe05346b58
+:00f6d0f0175876f82a75abfcca5782ad4b692a
+:00f6e054068e68e510f70eafc7c0367634d700
+:00f6f0d5d942d4a3faf1880e336aeb85dbd709
+:00f7007858058a97ed4d5c4fbd683ebe14809b
+:00f7105eb728e87c70aee8b7ffeec4de9df6a2
+:00f7201954c23bf41d4793e3f029708074a57f
+:00f7300df48608db2e5066237d616f412418b9
+:00f7409f9b71c582dbf9b00c935b1f26c09860
+:00f7506b898333c01e64aa478fe26e79c0e7a3
+:00f760733cd457bd1f65f8f69c0d9038aaa660
+:00f770efd322703cfc54de565fcddd41f7f84a
+:00f78018c09b0f4db9dab47b3882e719b647f8
+:00f79092b8a5e70e8b1f9827953b278b25f7e9
+:00f7a0e3b8f334cc8ba68298adfc159c7e36a6
+:00f7b043a448bf6c0cb77c7873d6147e5a039b
+:00f7c04892e597df92e3ba004fa0e4202b1dbd
+:00f7d005390808631b7e5e801966d94540014b
+:00f7e02d1fc311022b8eeb58441b852a40b7ab
+:00f7f094808cced430aa52f1e8904cb6e3b845
+:00f8007174620d236ad3e22b82b964bf2d117f
+:00f810e20ae8ff7e70c1f9305aba5bfc078e6d
+:00f820902d006d25ce19e7f2d3307712448e2d
+:00f830074c3b3a472b5b5d151d408d395a5de8
+:00f840fa9f4c74fef26347f241cc1c39f81878
+:00f850008d0d08de6ca613e5f6b54c8272139a
+:00f8605e9ede26f5448ccd92ab21680d6e4506
+:00f870c184ebf0da3823880f9a84c03aabca8c
+:00f880a4af0342d94bc8087f5a27a5cc3490c9
+:00f89056b614622d14b81637ae9d8af1830f1b
+:00f8a0c87803985d3801b2272b1422fe18b826
+:00f8b0cdf90ae61a4bab8a9e7475c65d99cccf
+:00f8c0381a99ff0c2dd0caf02b98ea4c25f79f
+:00f8d00a118231e39fe57df2224355e8d4d6b5
+:00f8e0f0f489fb8b4ee5eccf5d5d8dd457ae7f
+:00f8f02560a695c022c14c86b0cd474bfb2cf2
+:00f9000dfdd43decac1e619fdcc8e96746f716
+:00f91089b7cf132940f4ff5adc84682d6e93d4
+:00f920d45cd5edb168d50fea8210a12f26415e
+:00f9308b060dbb08f3e82094c4bc6532a4ea8e
+:00f940a1d2f801d6c0d4258ddffd23c56005f9
+:00f950126350799808d6b499bdf023a16d3bf9
+:00f960a25dd2c443857a097f9d634341490866
+:00f970504bdfea2a0c24f81b265459a6ad1c24
+:00f98084b44d9145a4b362dd4ba7c5025a6b2b
+:00f9909673bd0e6b0751d6ae31b0ffa8db6057
+:00f9a062b24669fcaf3b14aaca54a026da509e
+:00f9b0227bc5b08d2d06366b1131534e9429cf
+:00f9c00c102028db5c679c2207a34d927f5f50
+:00f9d08b7556e6ddf1d30665c1b5b09b9ed1cf
+:00f9e0f9edffac3af9991eef7863027c8758ed
+:00f9f00628b1deea3ca18ea39b7faca0420690
+:00fa00cab719a4c9b09cfea9a4d78eeafacfc0
+:00fa101cb6e0a1102256aa7f5d14920d3bcc48
+:00fa200aa6d787eac72520bff2b7a19e7cff49
+:00fa307e214836ea63aa152677b6064e8c93ec
+:00fa409676e26007e67058fcb5541b1d872544
+:00fa50975c893b6e2b20716a482cb9ee6ab4ad
+:00fa60f8ad75d73985c2261f320a1a9487dd46
+:00fa70d57fffa1c3ffb919104d6bc9f3cd45b7
+:00fa807b7909a892f73edfc6a8368b77957a03
+:00fa900bfa5b5ada581e93b909d8c2fc05dd0a
+:00faa000cd7a9a016893ae90b658d336bbb814
+:00fab08a2f82f2a8f3a13ca826fb61081f5500
+:00fac0b205b2867aaedd146be91c237df44bb6
+:00fad0dd08a40ea76e46a0f8e6e70f747a6a39
+:00fae056ccfc03875eea99384adbfaec4d59f0
+:00faf095b6da6841f3bdbb03943871be33ad80
+:00fb0080f99e0e92ce00f41da79109f96c05bd
+:00fb104a2f215e0fdaa553fb2867996910a9e0
+:00fb201ed0a2dfeb6c1255224ea1377f92b998
+:00fb308351b59921577432f31310c22cab8f84
+:00fb40f8aea70cfdec5e2deb30a4039fd58fd0
+:00fb503bf03bc1f449f8d206bb7f99d4cf1a04
+:00fb609b053d21ad3400b6ab62620c605234ce
+:00fb70dc18c5095cf107e64edb88996a351255
+:00fb8093b158cb281656e9dd1fc344bbbb56b6
+:00fb903f17df3114cf9a657825fe876356d76d
+:00fba0e6c5cd95224604b81390f0a9b122d646
+:00fbb07d30038040a0fb2f09f9d3ee4fa78d61
+:00fbc05e05dc991f11a694578cd3b41fc66351
+:00fbd0fd24a072ce78d060826a22dc062c9a94
+:00fbe0aaf28e5e3954184fdc361fc2731b3414
+:00fbf068db537784038ce0ba985431f6272bfc
+:00fc00bd5690c2b6fdb8feb7034de366702948
+:00fc106ea21fdb6c5e6e78cf15e5ad8114f342
+:00fc200c7bb5ec814b4ad45e41a6d87e74214f
+:00fc3043f9d5dcf98eec945edc3dfee138372f
+:00fc4009e87a1ed48bbb4972aa2430e43b0b82
+:00fc5087c476a841776437b28cab8ae7d7abdf
+:00fc60c23797c197678a5dfa1f2a1802263d56
+:00fc70edcad81a92a6216cb6adae31d843d9de
+:00fc80dd9ecc278cfc4a4e5843097c701f8f27
+:00fc9002a70fd464db5433c8c28355d952ff54
+:00fca0f2a198e981852b0c19695fc971307552
+:00fcb0538480d59855182ffc77e9a8e788bfe7
+:00fcc009e047e6e09ba0d4f493d7405e0a2b03
+:00fcd0074085ce9a68a2f23041301e0d63d275
+:00fce01c9bddaca37cfec6c42d7977ea792fd4
+:00fcf0ad5533755ff5883f991e7d915424ad9a
+:00fd00216bc9f06dccf64fda3211cbf81a9fe9
+:00fd102965908684056d3e0e4edf718c8c2ae3
+:00fd206c57e90655ab04899206bd40595d64e2
+:00fd309a7c50a3b522c5ff850ce2ea6bd999a7
+:00fd4038476ea15a2097ff0b38ce9fc85890ea
+:00fd50a162b14ca6aab0f08c0b10f531b3a379
+:00fd600d0d3b584856ee9a99a4a86be3cf07c0
+:00fd706e9f18045d0de77c4233bf4f819af213
+:00fd8057246bcb0541439bd844d295f1d07085
+:00fd90b4f9096089f53def5bc3d7a470d77866
+:00fda0fc437e6272edc59d5b7a8df9fe9462a5
+:00fdb092c98f17da49fbfb995cb4585d27370e
+:00fdc0ca57aa4697b33e9ba047cbebd1a89cef
+:00fdd0bd8c900a3dcb62feed48592361449e86
+:00fde069cb741f5b65284ac66d4f0adc71e4c8
+:00fdf02e378c6492b972e308b256f5d0784fc9
+:00fe00c6b3a257af5c4a57697817178a3aed90
+:00fe10ab056937437d775b85d49b86d330dbe3
+:00fe207549778fd5e1c36dbf7861a62c2c3ece
+:00fe3068496b39d97f8273a80067657566dbf3
+:00fe40673f58ae632f89760203d5011ceac69a
+:00fe502ec40df55f12a9c0b163e85614fae2d9
+:00fe603db4643e8316bc17d0f6e0cf4ec23a7b
+:00fe7014c71222f6e8fcc267ad4f3ea5d6d153
+:00fe804498945141ae08dd1ded89fc3852d470
+:00fe90cbf65cdbc8953d6b9906220e131a73bb
+:00fea0c4748ad1d1a9c7aa285d6636a05c0c3f
+:00feb0ff3110b87fd98a12eef678219cc0a0e3
+:00fec0544e96e78398637c721df5c40b3af86f
+:00fed07b040d3833caa5ef0bca0b87e1cac3c0
+:00fee058276c2a1d47707ca8d5074fe68bc8d6
+:00fef00e84e71d5e81ecada3849a0e5571f964
+:00ff00308dbf9c756f5b8ac85edebbdd7defb0
+:00ff10b0dcc954da9d6bb252d90917f1d5cd80
+:00ff2019ea6e8655fceb165aa3cc0cca9828d0
+:00ff302b88eb9992b0e7f6a6f65116cc98b6b6
+:00ff40eba7c5196289173dadd69216957e531c
+:00ff503f829e32a0a3ecf7b37ab9432fdced18
+:00ff60a09841e16fc96849583f8bdad81c7ff9
+:00ff70a5c6a5424d7b17b77c8cf8e7bcaab45d
+:00ff80f94c2c38ee4f70410e3b02331d0026e0
+:00ff901628c672b634d563c89824d7e331e92b
+:00ffa023c45104b8e4aa6358850fe5613812cd
+:00ffb0246ec5984a0456e80d10737b8c0dbf3d
+:00ffc0d58b862546dd8eb617fa91669fd84870
+:00ffd09477db807b8a518e93b9ed2a143e7416
+:00ffe037a3b2963829fe4ec51044697c098ea5
+:00fff081c7ec0da0e7bcde0038b3f57390587f
+:01000013b525a6c2dbbc2d0b7c9175e8908e3b
+:010010f2bdd0069b7dc4574085074dc3019f30
+:0100207a1039c50350c0d5e41a02b3c4acec08
+:01003008a58ef3d308057079b8bc1b87841790
+:010040333a055b872b279ff86981d9fe4abd98
+:010050473e26116afbb3734f50463f40c7f7e8
+:010060f412c8a87bcd1557a9fb8c804fb4a14a
+:0100707419f3bb19823457e3596fdfa00c5c4d
+:010080fbb343b631021b1f06850e3a437df151
+:010090f2ac9ca1d758059f6efabee33b7f8fda
+:0100a0dee9e303d48600300f0c67db88b8ad90
+:0100b0c67a049ddc1511fbee20fdbf19f05c60
+:0100c0efa240b192c66e49ee00fdeb5151aec8
+:0100d06894893fdb89190a71d1d2015a42f758
+:0100e0441a9de0aa3656545c6711617d2a9375
+:0100f0e66ae142ec8d4feac1648349fd3c4eed
+:0101008cc976fde0e321c776f94e14a41178e7
+:01011013ff4d4cf9e2cf37744d0d01491f177a
+:010120b37927d56665ac7909512239f8f2c566
+:01013062a93bf7293421fea249c796035fbaa9
+:01014050c5ab84899dc33a496c4f567733593f
+:01015016062111f32c49cc9e4bbf9dc3b1c0f8
+:010160ee18bf7eb79b14b550bb97f465edc061
+:0101702e3008bb85e8b08a89fefc0906237e52
+:010180d108fc2830d6f9f444fbbb2372254a00
+:010190eaa29225995350495671c7e4d9f82a20
+:0101a0a68c636a8f38b2fcc84e09f7fbe18b4c
+:0101b0e7b6ba52d8c6a78e7c8c66296eedabd3
+:0101c0731357e7610e110430147e14c1fefdf3
+:0101d0764b1476dd59c2c91534ced7a6817d61
+:0101e001a08d6d964d0987a0f5fe717b40f2f7
+:0101f065d5ab7833fab41f60e4b4ded5e9f4a5
+:010200f97c82425c34b8e381dfab64d533912b
+:010210d61eeb98f26ae60990f7bb7acc1c39b5
+:010220f1232a43361c6d2cdc0db9dd81dca27d
+:010230fe912f6e95dafcb9771714ba635b746a
+:0102406c446dc16b4e8b593ee2d868b741a42d
+:0102507616215e1ea96b4f05c7a1dbf5a63de0
+:010260d98d301724c28a586872123e241a23aa
+:01027008237321a756b8318206b1a6583ae93b
+:010280d0b9dd2b51c61a837318faae35d921bc
+:010290c6f83af7cb41af5a13577690a4d4e883
+:0102a010d88227515daac5448df3ae629c3600
+:0102b0ddc2e85c1275ce10f5287f960f5381ac
+:0102c07e6d9c1bbf3ddd4cbe621f80a586730b
+:0102d019babe5992e50a7e7e0667ee47315252
+:0102e0b6b5ccfabd4f5d5021bf382879af8021
+:0102f0466659033b7fbf6f8e3aeb0be279bac8
+:010300821625d6373edabbc4c34a485bbcd2b8
+:010310a60a9c48f3adf145f4a7dbd95f04a2e2
+:010320098d148efb1baec5c10076b49dace42e
+:0103305bb64e0948fcb1c252fd5c2367f61dd3
+:01034058b2cc6ab9333f048c4d7bbb42134908
+:0103504e170ef1a8d291866b8889bdb7b65471
+:010360b5690eb65a67de9bc5d1f39d1b0dff0a
+:01037030bd76993b52e86a24a2401301d347a4
+:010380e7ebec0da61b4537a3fe6d8bba302a59
+:010390ac8bd5050b3393b068bb665b3f7f8905
+:0103a0dd67bfb2c2708c46b29d91211dd5d553
+:0103b0a766c4251b6ed4f040222f24e6c56292
+:0103c080aabc482e10edd3d042818eed332571
+:0103d01263f885e32fae67e7fedd38b98145cb
+:0103e044079c4e9539e691f201c5f905f03003
+:0103f0e4de172373f4207ccb74ee6f0b5b4a0c
+:010400da9bca8462e5028a1a69063e5cf28c8a
+:0104107317ba5f387f22127576cc1f6655dc65
+:0104208b0f0cfe81c92bd3cf0aac2066af3b93
+:0104307a16cd6e3be094f69a19c75a52a2e06f
+:010440ba4413904acd54bbfb276d499c74cf1a
+:010450002684725ed6bc98eb13aa699debf3da
+:010460159497edf35f4f1849a5b09b42078ce4
+:01047022bd76ff783500c0caff9271f9e8cff1
+:01048049dbb08699945a95debe1607bc64c246
+:010490e416f311ae8f5b56b3f14876efcd035a
+:0104a0556d9a55c274f48f3f580d87b1c6ec66
+:0104b003b510e2c3bd17dfac3e5bd45996c4cc
+:0104c049cac8f84ce7ddf5103e5051c3de4837
+:0104d04418ff415cadb66f69576207deb3d642
+:0104e0a772d3d14637d8191bd04c652ea01db0
+:0104f01c1f1d8de961c448f493131a017500e7
+:0105002aa5214f62b3f77a38774fdadd0a6249
+:0105107fd8e7fbae23e8d2fa0179a47821f0a8
+:010520bb9f51ae80ce3559775d92af6db4474a
+:01053062e472c6b118ab8612d46971bace67ad
+:010540bbc1cc2d85a2c5a244f703e62c4710d9
+:01055058ea9e50d8ecafd99eb28216c4d379b0
+:010560ce245ff3492a62ed0f57b6098a273b42
+:010570981518c78643364c05a34b6c282990dc
+:0105809c13da5d55fba1e17291b87ee7f9383b
+:0105909cb3a7f3ad8393e2704d1b8123871d1b
+:0105a0c4b7ddb4dde967c75657b7360eab7a26
+:0105b00d2c5cc37cd976f23d16a246ae5bf578
+:0105c01c1caf7c24a6fa7795c8be87de13f925
+:0105d0ad6ed1cc52b7d003fbc1b93e975da25d
+:0105e016cdd68d7e73b77d26f3c252cd697182
+:0105f0eae48675746aef59cd2d2132798feaa5
+:010600b801be7c74269be27d1882994e4e6fe3
+:0106103d1156415cd1ed0ff2e4d3695ffaa729
+:010620f16ac0640c14f7058b2e30a71860cba7
+:0106303017e7045e291ce95e4ef5a6bbba64fa
+:01064064febfda512e2ab6b6fb58192e3b5ec5
+:010650b984ea340c80eec25bed410b2f6dbc4f
+:010660943390dcd9077a1ea09fbcf2b0d60220
+:010670f40dff09a344a871dd05a2d9f3bfbd71
+:01068069b2775b00af847c9d5b4a686baae199
+:010690f6c1c5cc84186aaf0eadf7d59dab0df3
+:0106a05ed74c1b506a2ec625eac2212ac819dc
+:0106b0bb3e58365a6b8c2686d2d19d31b965b5
+:0106c08da95aaeaee67ca02ca14a6087386d37
+:0106d01242d7ea257a338012f43592b593dd1b
+:0106e09f81c06663e0d93629eeb4cc4fa3f246
+:0106f05d45d888a372f825b761f5749bdae6f4
+:0107003027dd5821109fb8f3bc98cb20bcfec1
+:010710bcc44cb9b133757c11167c11be6fe4bb
+:0107205a9a4e3c044f5309eeab4bc78635a149
+:010730aaef1f52141cfa4dc775b5a9b1baf49f
+:010740afde1a5d7bbc34d61662afa17a0be915
+:0107505e0454e27c96cd464625e4619ff52692
+:010760bf5e3ad2f456e60f74c5bb7aa491fb5b
+:0107701dacbdbf2b201c4e753f145d0c047407
+:010780236829de28a718607eff469a4544be73
+:010790f4ee324536f3be54341f1135d22373e5
+:0107a0c7a2837c82037e68cd95c0b93f8c1b48
+:0107b02de0eddb6200d5b67fb1d0f52b275229
+:0107c070c699bb81a0fedffb22fca01861713d
+:0107d0c32ed4158324f46ea7a58ff4b88ca692
+:0107e0ac5b21ae7aa7009f7922ecfc45d64bcf
+:0107f03d6222c98d1e9779afa42223e3e65a27
+:010800f947c3df714f000b012ad72b5a651603
+:01081014133725da61183ff1b409f91508c2e8
+:01082096137b3a3cdffc567128454f60afbf0a
+:01083078020ed1f2893272f920d009049e475b
+:0108400010c6a36a0fe0f0ee8257e5dc4af6cd
+:01085082fd0ebf844a736c2c80ae81304922d6
+:010860df19fca35ca2dd2ae50919d08ea0a840
+:010870f7fd3100a93252eeb2345223159f46d0
+:010880fd93361f74a143d0683e1266e112d7f0
+:010890543d3ba6992784e37c7337c9f80bc0da
+:0108a000729728f0d0a4afda81beadcb48af84
+:0108b08ebd70a90d49fcce2284f371067e7b9c
+:0108c09979efdff62bbc674bdb6966c9124504
+:0108d0b213b83cff57e71b25340a5c534eae1a
+:0108e0fce17a34484dea75e4e062c9f8b51ad4
+:0108f0d5d94b2c03dfee2c4abf1771f2940dee
+:010900dedb6283a218c29e24bf52c1d6dff6a8
+:010910a8241ff65c53f73cda8c848e2031c0f9
+:010920083c1acc7ed7aa75609f3f1b70b04ce4
+:0109304eb3ee08036d512de507e4c9e58f9ec2
+:010940d633384eff29ea79a6ba1825af5f4024
+:0109504e85f13fbfded619d8522f2fb4f4b12a
+:0109605d4834b0ea357dfb799ca10394542ff2
+:010970d0288523953586f8b4636dafd802f16c
+:0109803c9d1c23125a3a7a42994a6aec8cb1d7
+:010990b9bb137e3ef8a3c95787632e4e4663dc
+:0109a044752a17acfe016ce309c91dbf8fa4c0
+:0109b03ca52e21921f5be8375299b1d6e53dde
+:0109c0eada762e3d1825780c98ddc2a38a407d
+:0109d0878ca1704b44bc3936f1c33793a29d8c
+:0109e0d2bd8958c286055b9b207790984b2a85
+:0109f0acf241899c28db10b48393bd096fa00e
+:010a0077807e888654e3c1169b118194c2f1c2
+:010a10e95ef809b3c25e7a868e0fc0e81af680
+:010a20902f3d2607c96cc0b0144f55a7310bda
+:010a30a8becc2e74f0bf53d20620b4c0e0ed1b
+:010a4020df1fcf6663be8685e912a4a040a85f
+:010a502f5f80959deb09639994fe0138c8d8e8
+:010a608708b1cf7730176673dda08bc678c0ca
+:010a70b1592fcd4bff31ddbbc61f894309c975
+:010a807e8e7431ac689bb23176ed55daf1ee50
+:010a9000c43ee5f13a0729535228f0696e8a92
+:010aa0d7fec0b4c81d63ddfd9b55762fb2cd98
+:010ab035dca5afad3a77e267eb44b7c3aaea11
+:010ac0dbe02faa230247869acd2b3367d9c358
+:010ad0d70f0cd9989056371a5447e60fb4471d
+:010ae01fa0c668c3ddfb80db258ab876381de4
+:010af009201dbddc13c21c8ca5a5ee422d3aac
+:010b00990755432e7d2602bde2744ce05c5e29
+:010b10c62b0d6c0a507e3520d3719c89bc9396
+:010b20bd2ade85a42a0baedaae46d09ddf9058
+:010b309be1bb3d1c56526b3e77a077b4e15fbe
+:010b40c5a388eb42d666c444948c784417de2c
+:010b50bd49e0307dd6bef2ab4235fcb1df4d5e
+:010b6009902ff68cac932ac6a97f6183d93a5e
+:010b7016e7aee6076a52426fe95c50a4c26d67
+:010b80326f39bb1a3f6655887ea0f266dbf9f4
+:010b90d15cc79b24f0a73293dd861deab0fba7
+:010ba09ab440eb2ab464fbc31f9a8dab10249b
+:010bb0f2da78a0f9f5215f8cc95fa7f92efea4
+:010bc08c512aa3ea85b0054e3b81e359c3203d
+:010bd0efd1a747d73c3903fc8c4bcec598b3f4
+:010be09d57882fe088c8cba44e3f034a593bc7
+:010bf0d116ba03610252f52bb780ea56592e7a
+:010c00308beaa7121aaaabb4d6037476f499a8
+:010c100b1e326009e9863f7ab773aeb20b7ac3
+:010c2082d2a1c812808a445f5c0aebfd5b4691
+:010c303c73731849c477f54573731f1e6be0d9
+:010c4043126e56407aa22aaff77c665616a02a
+:010c502a9672eb1b930cd4abdd5c637a6051bd
+:010c60d9be7ccb9bd7b2e539bf713b5376c0bd
+:010c70c14edf0129a3b2aa9966f3ffbf07952e
+:010c804824945989dcd912e046f58f2693e3b9
+:010c90f4e732b0be45b30e728416d0de6b43ee
+:010ca03c4886bf836de71694c10117ec6f4429
+:010cb01af0742b081a8ebc9d47e34dc54c7b6c
+:010cc0514872a5fb19633d80420e480f02abc7
+:010cd0555c28e566dc8d1dfe2e2041326f88c0
+:010ce071a82fd8c5eaa9de3d7f57325f2873fd
+:010cf0c4719d40c6fb87e65687b7d54a65fe70
+:010d00625b9737a637d2349f848d6402f83718
+:010d10f51b2c92d9b4fdf4bbd0d9f5336f7450
+:010d20c5f0860e7faff8cf33b8dfc807874516
+:010d3052a1fe6df01c14d36f49e9af6f21973b
+:010d402306272501f61866f37bbd1d643d7c31
+:010d50f3cdca1f0c66d0f3d1bc46f6885e154c
+:010d6049182f1cf7cfe463f9ca7c6cb7e42a1d
+:010d7074885726c9250136f3717434f8081d83
+:010d806da2524c0d25a30549a797d89856abdb
+:010d900ee2c18273d50041d98b1193bb8b42c6
+:010da01784e718e47b3b8953069096b6a7681a
+:010db0a24cd2d997062337e166ad904a68f6d4
+:010dc072199d519a3057f1ab66dd07bcf6c6f7
+:010dd0dd12cf2ffefb1a629c79940d0fc06f50
+:010de096abd44c321b2cbfee83ea9ceb6891d9
+:010df08a4923ee38c67929d916f9e86d086cda
+:010e00ff8e37747072fed77a7be2081fc63e11
+:010e1003f67e8b1f58f817f49846aa8c0b3e75
+:010e202de37cb0d68fe54130857062f603ab91
+:010e3085da7e1e4714a5fe762fb73f96722e88
+:010e40ddf284ebc99d4d7fa9b4837fb911e4ec
+:010e5080112dda3e016e1ac433a4e064122828
+:010e609af9199b442dfbec62b8fb7cd64033ea
+:010e707416a34a6cbe73fcb7a64b81294cf02b
+:010e80eb5e5c1d6e02b1b7e7e64aa4ed48e8fa
+:010e900dfd98383ca6f9ab8802e0af4a47d68a
+:010ea0f0750575ccf199bde1be7dd68453efdd
+:010eb099f2fc375a7afcd25b9b75c8fbf9e882
+:010ec0bdbfc7674efaaa2e4cc6a1b8e2d8b65a
+:010ed0c750828c9669629aba19edf647491bda
+:010ee0d4af9e5f63f3c125653b1dbc9b3d8b91
+:010ef03d90b542018141e50992aaec63e1bb38
+:010f006afb186d84940e17befc03aa4a697c27
+:010f10a268ab08d9fbba43dc855fd5704304c0
+:010f20fcaf942694638a5d986a8befa70baef8
+:010f30b3e5a45f83dcf964482f518b6af3a337
+:010f40795194531367cc27b1c24e3728d0384c
+:010f507eec3d638fe2dedb0235e8578f60ca4d
+:010f605944d6fe7f06304dee77f020ab9a5b46
+:010f709bd3d1601c0a26ab503489b52fa98a47
+:010f801fa25ddea38ed7aa006a5ab1d6c98d32
+:010f90d3a6afe78091e5b091bbc1fe5a41e59a
+:010fa05708bd61179186b051127f18698bee15
+:010fb0c21875d25d32b6d9f53e985429f37131
+:010fc0bfddb2826c7870293a53e8f2d4e6773a
+:010fd09cfff24351aba2b779e5677953601479
+:010fe08dd8a961765ba3d59f9a93839a33c628
+:010ff00cb6a409b9b7fac8dded193e888957c3
+:0110004cec432709f7828b10b9c406b086876a
+:011010707e17d71b6de7cea26eb064c2fcca85
+:0110209f987133a0957cd7ac93123aebda2115
+:011030c19b24e06ff745aea9b901ea7b26bc7b
+:011040e0e6820507437afa098717ce7fcd8195
+:0110507915a92816f67fb4737a709960567142
+:01106000fa765b63a2475f5ff6b07fefbfdffa
+:01107074814db8b0daa784f0e5918d365a9f22
+:01108099401f9cd6b9c4224f358a087e2c5035
+:0110907240eb696f46913fa2f984d07a98754e
+:0110a03a70932137e761fd6c6f2fddf2ad302d
+:0110b0d2bb64bdf11845d9bd1ac60833e37793
+:0110c034964c2e9dee782f46a7a2ac10c55b7d
+:0110d05086797ac2faa82a0d3bd3b79a8b9cd2
+:0110e0cd2208fa60966a57a049d65bb92bf249
+:0110f0156d6768dcf594de0eb8f14b5c66945d
+:01110005f38d0074f154cec23793254ed3258a
+:0111106acff4f33e12056d359a4d8abd32b7c5
+:0111203074b7bd748701964b37edda157f2dd2
+:011130857dfd50f8f85fb82f851325b270942b
+:011140bc804e8044db86224ee7890334c00065
+:011150b2b6e2852e0139a20bf1ac8cb99d20ce
+:011160a94b196fc76ce5f66af69c012684ed34
+:011170f471d20c08110d884b7fc6d88b9e6916
+:0111800f5a27738adc02c9edfd9701195d242b
+:011190c7d8b6fa4997c77719033781f235c3d2
+:0111a0668976532b54e5c97542d0988926b3a2
+:0111b0a13336a092cfe1053c1282b22cd719e5
+:0111c03f7f42e1b7c2c6fc0cd17c7acebcace0
+:0111d050573487708cb0b5d6a54f6df9216123
+:0111e0da773a1f001a31cb3772993b9aab09c9
+:0111f05c13776945b7cb14af269162cfa65b54
+:01120087f093c9c16d1c9a556b4caf7e35e7aa
+:01121027ddd45f6f07ede3c00204184f890e14
+:0112202a79fec1a0c7bc1a4ed9b576a61ff030
+:0112306c19fb7aa04ed918bbf024487bccf3f6
+:011240832ffca24ad59adb7a12874feb3c6263
+:01125072fc4d301ed226751413be4c477c6736
+:01126039be2a2be247391cf0eac5a9f9f198d4
+:01127095a18ea4dc02c672eac88445f0782443
+:011280d8737aefe9636153fcd86a4f548a9f26
+:011290b6116ce78421957364c1add843352c8c
+:0112a034b8ebabff05ccc516c1490aeba88e15
+:0112b01a1dc0a5c1982d35e5bb18d32ac15886
+:0112c05f1c3082133e162d04f6b180b8dfa85b
+:0112d06d47b6291403a8b34c16a6da57dbacee
+:0112e0b45dabe8e9acfba79cdfaaeac071f683
+:0112f00e2f299f1ec6ef169d7e78478471d913
+:0113002d440e1b1a61d985494ff4c40a698d1b
+:0113100bd388d702099ac0f3b44ca4b729c236
+:0113207d1ddf76b8e584b416aa59de9485e0f5
+:011330d8a1e7cb8b2490eb40e4196f1dddabe9
+:011340d55365b3f75e92aa1e0d208918c1cf1f
+:0113505157fa13bc6ba05b2e18cf08c6894f8b
+:0113601288527e416e57b42d10c6fa59794d5c
+:011370d7b11652a3b57689b45b913705ef0072
+:01138080930bbbbd8b7024e8053140fb6a63c4
+:011390452014fb16c78ea1b986be8a129f21b8
+:0113a0e8187114a3b2715d330e564c0b0082a6
+:0113b09048aa05dc9aa4a009474917db7eb870
+:0113c0908441e42c1b2ae54ca042995b6fdf3a
+:0113d0d89822b94749397c241fe8e31d55f9c0
+:0113e0eebdf7c46ce0f14f2d0e2c5f9bd90c9a
+:0113f0d59aa87fd4d4c14b1500882d4a044f95
+:011400597422840fd6bf44391e43c8ab176777
+:011410c1be41598f894fb7e7fb54d8ee2b4a23
+:011420a93aa4d0a4bf46c7f4c3caf0ab46ee0a
+:011430850ca0595c6f6a79fda4e1dfe064c77d
+:011440c7049fe60f6eda530789445814d62c90
+:0114500a60297bbc97f183cb1ea9b5233c1dc9
+:0114607720cd07c1fe3746159e7998c303647d
+:0114703584332aa608305fcd8ad1d4136c3b84
+:011480fd3a0558e8d135fc5f2c283eb5deb2d5
+:011490b677d27f0e7fcb0d7ab2eb29e8b22dc0
+:0114a0edd098c2b402dc85f7fae90c520de200
+:0114b0cd554586ec204e3ad655b23b8c7eb9f8
+:0114c0e683539e30cf7f3a67e597096d313fe2
+:0114d073634d6be6004f94575631e6e97ec65f
+:0114e052c32a7f1e571edecf217d51da609cd2
+:0114f01b8b18410ba4620de39a3bbfed0c103b
+:011500df197230b9e3afc22d0cb0a3d4fded56
+:011510c13b3e36bd998d1f816affa749693f0a
+:011520e36b7c86488a8f5d1365d8e62dd353a5
+:01153098ac46fe0a0ddfef6b109de86905bf80
+:011540bb6f3864e224a3644558ecf3057df95b
+:0115504ace9b54b94d2bdf230693f2cbb5bb44
+:01156026bce55c46e746d5ef7a416a00fedac5
+:01157075d039d9728d586bb2d6792a1046ded4
+:011580cb5a288548972c5a26668b9942a8d61e
+:01159095f99f24edef7e1bbb14b14b4caa3989
+:0115a0b255925355f544766d0b188dc74c5578
+:0115b0371c8462874335ab184d7a73fe900d53
+:0115c0de050f2c3402f0eedfea92e5133b6ad2
+:0115d002c6b53b2a831cb451ae5a30f74917f4
+:0115e0b6d22dc0475c9fee3b4a6a8d912aea9a
+:0115f04096a964dce0af4796401848f083cb0f
+:01160085e892982614d8d546dd159891083343
+:0116103c92e70849f5a114a9b8a94abbceaf94
+:011620de56f23c5a79f9f18330d4838089e6f7
+:0116300abe53cacd6b299b580b4c7b3606c213
+:011640928af748692815f383aa528b1d22c57f
+:011650374d873bb11426bcce60a62c683b35d5
+:01166072179fcdd096d19034941a91e561250d
+:0116704e55356f60e3487d510455f375d5b13c
+:01168084e03cd0d559e0132ee2598d12b9867d
+:01169027ae79608d014674e80ce1f0e9a77712
+:0116a09c5793a97ff3c8a41c45857c00ea54b3
+:0116b0052a12719c77a83ab08731d46c5d6a46
+:0116c00808788c25eced77312fbcf6acea6a41
+:0116d0e373a9eb5a57d8a6b777fa4010915bc1
+:0116e0d5ac8fbfc8230fb4892e31a83873d4bf
+:0116f077f6ed80fd0efd2842ee99a36e1f601c
+:0117003daebe69139ed13b6a4146568ee71b27
+:011710eaf2b6a23fe70e25933c7174072a3192
+:0117205c51b107b56315b52ec6dae16aba4e19
+:0117302cb46af756054152e6a02cc0b6aafc41
+:0117407b1455af1ed0cde63838a0d1aa0641a8
+:011750b3f06b37758d0faf77e49b070600a98f
+:011760904d54e36042eeef7c96fc9084a4277e
+:0117705f058794887c343c24e98bc792a693de
+:01178078b3a8419b2cdb28e7049704f9b19e96
+:011790ac62b18c54de5365a6d65e817745ca0e
+:0117a0ecdbd2bff79635efe21a3481097b02b9
+:0117b0549f1d5137aee2be5ce0e66cd8c100b3
+:0117c0a654ee906a193ec0f5c850fc7d80bbd9
+:0117d0ecefd98f764d30e7b11c6055fc7c441f
+:0117e02c046e01e5f93ff06474fadc49f7388f
+:0117f0a315893c49d9759a5f1d2e5c8f3c46f8
+:01180042c1d42cf5e52d17925de4e21abc7b0c
+:0118104aa8912e3187c279fe7d7a8c47f4fd30
+:01182024ac62d7d50a3f41a20e8a134102dfd9
+:01183005685a9cc6a25d7387b219aee7824596
+:01184032ebd4c674212b49d516e50ad4cac264
+:01185020bb2c6492714ade999d916cccd86c01
+:01186070aef521c5e165cb0715884818e66bee
+:0118705d9204b564033f9eb4590225dc315413
+:01188090b2146533f30d115c8d3c7ebb346c28
+:0118905f44ef57619320262937aaf511edd27f
+:0118a01e8ce48948ae2e1a8cac5dfaea8f2222
+:0118b0c16a398c5e63deb092e0481769f169ee
+:0118c05e2f243643d80c93937cb8f0779b6272
+:0118d064033b86c562a75e47701155afd5b338
+:0118e0019bb5d424691a672b9072ddbbea45ce
+:0118f0136ecf856f78848858501c5e56b11bb6
+:0119008a3982f82278fd1c79f6b340ff17a2d9
+:0119108df4c525fda7a7e36f0ab9952ace4c2d
+:01192066e224ff87ae44a8d811658051ec9d14
+:011930e4a3581aa223ea6d2fc8fb790becdb86
+:011940be0b5403aaa8e9035342fcf068e823c7
+:011950a1c9c695ced41508945c55ca140f641e
+:01196070f63541d531be527434d4f687e75534
+:011970dccca5caec4b305d920fa58e7ae88535
+:011980d1196e4d4077b1f77c4325935d093e2a
+:011990d7c3cbfa4a58108d0c6f5ef9d3bb3c46
+:0119a00f3c7b8855884befff267d4aa29964f4
+:0119b03c07ab3a479d85894d0781db7c1f9588
+:0119c022b8c1e5bf087297b3f6dc0ccce5761b
+:0119d001badafd8f06782179a48690fb799dc8
+:0119e01ab03ff5723f68f25d1c721a05d93f14
+:0119f0ee6bf3042439b6ce0a990d7a8625dfe5
+:011a000b6663a4122396d37c2ec1f697136088
+:011a10e8788e94a3a38c201c4fb6cc245e6e02
+:011a20c14f06dae00868c7218662458fb131c6
+:011a3046807cabaf16e4d8c36a02892b78ba4c
+:011a40e8b0bf19188ba6ff91e635a4a6fde7c1
+:011a500008760083016db30a5d401ef6706163
+:011a601fb019b3a8b600cb3a721108ad9f077a
+:011a70b692c33543be50248337b612982c75a8
+:011a80ae5b0616045da154b91662899ce37933
+:011a9052e22aad7631f82e2cfe3a4290ca6ae0
+:011aa05d0cd8410a97eb9c5c95cd00f5bd9d0d
+:011ab00624be2d589ade2d35494f489c638c7a
+:011ac0a1fdf4cd047c3a399e70e06d27e4840b
+:011ad0e1318ab9d9c41c0d7d64c6fce057eb14
+:011ae02242ef428b659d96aaac465be607c973
+:011af014807ca8efa613e1ab110647a2c477cb
+:011b00f7836715bf4f983827b8bfed9616f14d
+:011b10f73d6f43985b7595b006c9c78cb3d74b
+:011b2098577076b62d055ce61d0015f9a9e3b8
+:011b309db51cbccc207133e3eacc49aec0e039
+:011b403ee509a42b955dad75a9356d28ccc28d
+:011b50a205486d9ad9dbcdf3416c7b96e46bc4
+:011b60b544292d0fcaab461a2c59aeef8924fc
+:011b703efa14f144348a5f487743a5985c1368
+:011b80fba40da51965c57421486979143ba393
+:011b907707a273ce975d4651c85d5687fd71b4
+:011ba0e7821d828b11dcef8eabd98e178b4d59
+:011bb0a0f7db8fd0207aa9940ece8687f5bcdb
+:011bc0135cb3773f2c7ae68e44bf68cb4f6099
+:011bd0fc147f15797652a662400b4456b481ae
+:011be00d98a650a9c377009166072fbd335670
+:011bf0a274d02dcb6de2361bd4fa4d2b3304e1
+:011c00b356eec9719f54eef46f50d33d7778e6
+:011c101baecd2a736f6a4961ac19397e380527
+:011c2027407c29572ab98ca962108ea5bfc979
+:011c30ca705c68f42d906ef6b71f409d0a82eb
+:011c40243cdbffc285f4c36b0dbb6244d6f645
+:011c505d14dbd41bd3413c4ffb99d47b479e79
+:011c603a104f4cdb8da32955d127e8e688a1e8
+:011c70f9035c1428f552178fc3002ea96444fc
+:011c802f8cc052f8b74bda894ce949fbba3068
+:011c9058c448f7b5177ebc3f461e671e5018b1
+:011ca0d32432907fbebf3b7fdfe5da023a90b6
+:011cb0279d38b247bb90f59cebd6363e901f0f
+:011cc0667a1bfe65f469f8ff2f2981ce4b0865
+:011cd08e5058004e24cd2154d1fdfaca716f52
+:011ce0011c8a8ed820a98b5c6c5748e46da47f
+:011cf0913daae9fea6b94b7b34df9047d1ceff
+:011d005823e3fdbebfe232d70719f6e3edbc10
+:011d10d713e9cb0d6a00fc9039be2e70905d80
+:011d20195c4d1d0304364680459f4a99ae0eb9
+:011d307c2ab0c9c24bfe852fed7159a3b8a7d1
+:011d400d54076aefec41674f1b8b5e054c65a2
+:011d50463686c27ddff56a9a76acee0c3d69ac
+:011d605a7c081f1d67811fe42c8325b871c3b8
+:011d708f81911defef4d10a618e3029de94d7d
+:011d80904027c7372254c5abba67e7e5295b37
+:011d90ad35ce2ccf89b523ea31964b840abb51
+:011da0256065ec7a36f2fd6d9dec206bb922ab
+:011db061e8430c57779affb6494c36696a3275
+:011dc04c5a674c490b4e7c57d2d2ff2ec999db
+:011dd0f9b82e0621ea5245766861627dadb7d1
+:011de01e734444cde4fc2eb29abd92a1e86e41
+:011df0f37c7f5d341647b3f5f32240b78b8839
+:011e004d335c650396edcc5581acfab1cd80e5
+:011e10bf4253367821c5bffc98b7ad04511005
+:011e2045d47c3e0ef02578c225d0b27787bd3b
+:011e304d1107abf5786f8cda7c289c1d90fa1c
+:011e40b87e5787e6be67e1e96870b801cedc01
+:011e503a93109a72ebe3ccd70ed87b9e31759e
+:011e60fee1cbc848893dd6377ffb3766049bf3
+:011e70652d0cc2ef19c599b78b118b27fd3703
+:011e80d64ecbbb46991be82037bcc49402fac1
+:011e9097a3f78bffaa5be32e839bd9884c5c4e
+:011ea0fdb07ecf48cecff2fe68a58059751cb0
+:011eb02130d4fef7c9b76002cb66c098da0b7e
+:011ec0d56d55661c33f3aad2a4550326a2475a
+:011ed0b1aa0a66650c4f1dcb627811d3a80689
+:011ee040571cf13289ab51d930069faebcb7d5
+:011ef038b123408409a4c9ea8e6b1280c30053
+:011f00e1239dde67e34dbf4ef22a4a235be13b
+:011f100772ac4eeba1bf1631173783fed6f2fe
+:011f208c411e7c64c5213685a13dd69efcef87
+:011f3045fa166471a8b5539b16d0f56da7f669
+:011f406adfb22cbb68c9fbb8acba2622745a97
+:011f509840e83a427eb9d84897856504fe4708
+:011f60542e76b25bedbc6ca9186cfa52bc9eba
+:011f7079a040ee00514e260d31f5cba9502923
+:011f8068545fbedebf65a8776542cd9621d4db
+:011f90df84d89f75c4e6956a28ea9671e39ebc
+:011fa07b0e42fffb0c2cf815ed78befacc5ef9
+:011fb05692cbe195b90d5b474e8a7f7c03b79d
+:011fc0eafad78ca374bf58d60515235f148cfc
+:011fd022b0f138d75126fb5604cdc0302fceec
+:011fe05029875d5c5d4a5ddb4c5d81a23679aa
+:011ff084b42ede32d1bcb5f7b7542a4ff8ef93
+:012000453ca71856ddb20154261a65fbe814ac
+:012010efa4d2c89ef314a69ed270710c79869e
+:01202067c560bf1764864b04e99e42cd71cd64
+:012030966e75c74018d5e6b0c01a63de8e6eaa
+:012040db351ae72465ca1f945a4e1db4b6608a
+:012050e462a97880cd4fed2f64899ce0ea5ed9
+:012060b4543983c0e3c12710353a84dcd7bbb2
+:0120700fde9dacc5207cadcd52af78f26e35d4
+:0120805d6d059e373a2f6fef5fb455d0650804
+:0120901e9a169c3a05d0daf15e98a5c2eb414c
+:0120a0260120f962472e8e21b82c2cac0260b3
+:0120b027f3362af6230f5bfca899b0707f60fb
+:0120c0fe578ee1e511adf318c3b059903135cd
+:0120d04ecbb898ff2860c28eaabb0c8cf6763e
+:0120e04b807254101dd97a48473d8eeeefa639
+:0120f0e661029470e73566a20ce3b6995cc5d4
+:0121003ad09fbc0d67c2996d63cd26a383c257
+:012110025edc8e4a25d6147636c26f0e542713
+:012120f4e9674938bec2e22055865f8045ffa4
+:012130448cd611a983accb76d7e82156943923
+:0121405e6daf589c56fce10abb20b899d2db84
+:012150a6456244d41f842f521088228d4804b2
+:0121605a34af981a8f915ba1ba2ceb4398eb54
+:01217090fef37f06998495d9284f68e257c2e8
+:012180ccb8e2b519f94b3ad0a98b0ca73d5298
+:0121902d22cfb4de9bcebd7b0e858dbb322f11
+:0121a0c507ece482cde8211298da1e71d3acd7
+:0121b0593be2760d66da565e14c6ae5bfd78dc
+:0121c072afc57edc646e248f87ccaefa4509d8
+:0121d01641c093196212cb540cc7b621e8c21b
+:0121e0ed7135ec3647eb6909d3b46fa2341df9
+:0121f03b407941c0f85e022e95c68a3edb4458
+:0122002138165296b828712012d406ad3b33df
+:012210685975b7d216bb2dc128012076b6752f
+:012220325f5573c0985872e474a9f8d0579ee7
+:0122303aa4f0b1b0f366efc67dd409fc73a313
+:0122408f3a0eaf973182cbcd4ce14a98cc9ae8
+:0122502149f9c7e0a4715ef7a91e2e2a937a29
+:01226036eb12b41fe8988e2823bebf84da34f9
+:0122702bf7d0d9ba503f94a2e7d93bef772afa
+:0122801028c4ab53c7b97c88c103c4d8970e02
+:01229003ed79d2adf879c5c02ffe2c5f85bafc
+:0122a0bafca05fa82378c9e5cfc4c00cd76ffb
+:0122b0bee9d57243391432bd6243fe40f228cf
+:0122c031e15a7526052027f700521db8a32830
+:0122d0f676af32b6dbd3473504c6e7cfae9c9d
+:0122e0ed9bce17bc174f8cba630b9ac84ffd7a
+:0122f0a92739234dbba515e9f8086807edb7f3
+:01230043c320fa1c4258e0893af3a8e30839b7
+:0123109f8a3975e956cf59392ed7f37ccffdf4
+:0123209d832e6f1dc81ceb46344549e39a7a5a
+:012330a2fbe8bfc86ca36695765f8ec6b8fdd6
+:012340316f206fcb9472e8a0a80fb7c805f3bc
+:0123501bd7faf0846e993fc0b30ecf58823335
+:01236026c48ff97c87cc6aaa2f868df07f794d
+:0123708ec404e7546f26c17ee151d5fa7d84d9
+:01238081e608d1c32c797e5c1c7de7f8ee2aae
+:012390718096c925472333a25e6f55fc86724a
+:0123a03db5ddfd35fd6d294fd200b17b85c2b2
+:0123b01d5076d067efd5accca4fea66a16b28d
+:0123c0e8f8513e7fea6a39c0baec25bbb701b1
+:0123d0b0c640dc22942c57a9f13426c6357781
+:0123e011abbc4ad12b69438250714ad6c167d2
+:0123f00aa5de1ebb9c382d63c2d062aeae6329
+:01240066481526f68f806caa58eaba2b745b44
+:012410de4d118935cc08d6b7da74dcd0f93ae5
+:012420a2a0549cf36443c910ceaaeb6a2c486f
+:01243092846a543371c0b3104dbc864b2ade7b
+:012440107733988d46ecf5354c73becdc52f87
+:012450d16a5f18075f5742fbf00270e46d493a
+:012460c5a9e3b5b62d0de9ab377cd98d7a8d68
+:0124701850d014da784a2148e6a071bda5550f
+:012480e958dfe2859ce895c3d4e4a8f643d5c2
+:012490e9f417d4d50d57a1a4f6638e8cd394f2
+:0124a0e6cfd938bff83bf0f90262bbfc98b26f
+:0124b0c13305bf9844f77f63c5aa51d6435a56
+:0124c0c7a04b17c120ec0016d83a4cb448c4ba
+:0124d00c42a6b5c809b5373267a1af6cc7fc21
+:0124e0d2ff54f79c4c59537651cf526cd8fab5
+:0124f09d9abc03d3a28917e6b9d35946d41fbc
+:0125003e04b28c3ed938e78828c78083ce110a
+:012510899e8d421d8501e99945f22a6f693a7a
+:0125209c40a41b1dbed667e1af25f3bf434b19
+:012530d171b02759fdf3ed549a83e6bdbf4d12
+:01254030cfa06ee3cb4c4f1dbbfbc0ebec352f
+:012550999a2d35e0a1b61e6386abe68728f1f6
+:0125607eb8071165a64ece0ee7e19d795047ac
+:012570d8b492c17e6d96a6e53b7af0c72e7a14
+:0125808381bb6dea4f83d41c1dfad4bbe837c3
+:012590ff54cad6ff151d2206c0c2db753b68ac
+:0125a0c4e962d4f0342f41dc45fa4c983028a6
+:0125b05b258319f53326f60cc62e9c4330f303
+:0125c0ca7213236d6e094acd24358401143100
+:0125d0471042a92ac3243e613e86509f4023b0
+:0125e0942ca49202a0ea62a3b36706a709fb55
+:0125f0b3b4d420bb9cf515c18188eb34bcdd8b
+:012600a11f870455b07b28a9510b54120b7ca0
+:012610d86462174d1079e3d358c422941e808a
+:012620def096d17ba64b9b33b4627c76548efb
+:0126307dc0c643cd2fb602f6015083c44bba2e
+:012640e236d05dcf67bcc318f2a239c73e359b
+:0126500c87303ff2ca0e8c49ba918029a5ee50
+:0126600ad840ff4fe52c95197fd28b4ddfd308
+:0126707f149d22798904a0559019cd04f6636d
+:01268076225819ce912fe49980376d52f0489c
+:0126907cec5386b8afbfebb7aa9d92abf3c3d0
+:0126a051008a7abcd3c230ca07fe393e0cda83
+:0126b0f9c5a79e05d9e071a24c0762e3457910
+:0126c0decd2aeb162364bd0cec82b15144385f
+:0126d052af2a184475ce17abaf8a9a19a448ab
+:0126e01d1fb46754e4136cf809aed5605f9c1a
+:0126f0690fa3812af4b1a05c5b785504fb8473
+:0127003a4b54bde2987eb73662b6efc532359e
+:012710b854e3d4bc8b3bd74807dfd9e309ec7e
+:01272024133b1139db7fc46b9afb40429ba810
+:012730b939d2b15d84f10020182cc722f81209
+:012740590ee92ab6251e2de7fd7a3e9ebd56c0
+:0127502e45d028833568f35fcbf00e12324367
+:0127607a99b059bc5de322b6c7bd3764e539d4
+:012770ff9cdb45956ed1b1f8619c1e6a630d59
+:01278009d86c21fdf9f78a1e5b0c38d5cc8b01
+:012790769376bc811f9c4d0352ea12f653a8cf
+:0127a01a7e9da9bba3c932f66bb78a55e772ba
+:0127b0580895061fee2197b6f4346cfbe6a210
+:0127c01f718fbe624423ac6b19e8051162c084
+:0127d0076e628329950cc114c59a37a6e3e379
+:0127e0cc2ea82fd677fd6a6eb37472b12cea4e
+:0127f01e85d51af429c0eff1e1a5ae5b03f4b8
+:01280039d28a9454f65ddb396c250f1ebf8e05
+:012810a5b5be259247c513c71e1556a4b8b494
+:0128209c83bd55126e22d033b98c52a678fc58
+:012830960966752f78c990d8bbccc42f9508ec
+:012840abe84576efef8b69fd6cb14c94be5150
+:012850637710190686404868343a931a694967
+:0128606ae092162afd6e6aa26fcb2097ae8b01
+:012870a82510b86efca8fd30e90c904c4fbfa9
+:012880d26c091dd4c4bb40dd6e20010b7f5ccd
+:012890765c8b3538901ba87e60ba5e7eac9e33
+:0128a0cf2a27e331ab86677b10c0dd04f5cb47
+:0128b0431932991943e937e973744e68b59c25
+:0128c0baf022261cedf92c9fbf13309d2d51e5
+:0128d0fc537e7dc1b3e4e7fdc9f1988f14b578
+:0128e07e0d5f2a31fdfbf16add0396aeff000c
+:0128f0affba7351ead0e335c4e404efcbab7ff
+:0129008f3a05c3f8f64a04f782b15f9f808e10
+:0129105dea27f2d6adc2047c6476f21227e2f4
+:0129201180d7b1b7c679f420a49a1c1bb476a9
+:01293010fce120ac74423ef1cdcd60d175536a
+:012940c8ef343b31edf070faced8f462b5ff5c
+:0129502bc23b9328a39c87fa9befc5e30180e5
+:0129603fa52886013025339ebf7285124e6256
+:012970e8d15f26446cb4141cb296ee3934bbbf
+:01298004481363e0d37353c3b9df733515bf2d
+:012990bf02a11dde92932653b2c3295d692b15
+:0129a0382774feb70462b30cd044d0675ed8cf
+:0129b0aebbfc35a6c3c1f828fbdb4fa14f3b02
+:0129c073dcab5dee03dda3bbda1bbd19427a52
+:0129d0ade5568c10cb901842fdbb4355f80a40
+:0129e04bcdd8042bc034444818aecf52c00a47
+:0129f01fef0b2f9de89b14485215bf0f97da45
+:012a0067a85aa5a480e2d9be308ee1a1a22f52
+:012a108c79ad2dcab8425ee0c59feb8f3c8208
+:012a2055135f3acca4c2928a05945baca53c35
+:012a30939fe52a3406beff5ab11a7caae1bb05
+:012a406cd6af359c0a39d99d5c6a96546c588c
+:012a50916368b6c39fbf88b5e8ad81d1111279
+:012a605a3758395e2a10e779cf93e29bdb39a6
+:012a70c1fe34989ffc6d157e3912c24eea2ccc
+:012a80a94965303dc8cc4fc344311402583c12
+:012a90744edbd53c7900a2c83fdb20cded15ba
+:012aa09eb0e270f235079475a3e514ad18b568
+:012ab0486961b17b04c83ef1a11a08b519e6b6
+:012ac000dfb2c4418fe0d246b06bd26ddec08c
+:012ad05b13ef414a2310cc056add3b6e7bf1b0
+:012ae01737962c79a6058c2acebe00b15abc51
+:012af01a83e25cda8cc6783b19f37ad6d254ae
+:012b0012caebf581b62d376f75c75b0214228a
+:012b10306ea9269afe15dc60e093edf99cf269
+:012b208fb21d38b2bbcd15a82246adaffabfe5
+:012b3054764a3f2a60ca6761e1fd9c2e14c0c8
+:012b4002c6466e627a33fa2e8c496611e16c60
+:012b500baf92b4c84f98e7a79ac4ebd90d7283
+:012b604e4c447fb9401d01f7d80e7972d33dd0
+:012b700ffc1b5d0ce1f8a1380d2d135acfdd31
+:012b80b296b98ba6e76e2e412661e3c45ca735
+:012b9008bb2a331da5d68fc921c84817fa6287
+:012ba0e82f34bfd0e196d11f8372f27e496fbd
+:012bb0325d996521e8a34a1f38a577cec85b20
+:012bc026395ba857d7b00c2d6ee664e73dcf53
+:012bd0cfece2622e5ed0485b91897040873f92
+:012be03ec65cfda8108c2465f3799f1e80f616
+:012bf056cdef1b29b12eeb015767b714a2fb12
+:012c000eebd7599fd8a09e4761262e022e6c6a
+:012c109d6dd32e5e9a59c8334ff18d3f12e147
+:012c205dfb272f9f569a679db256a83d59e3ba
+:012c30d7d18e17873965c2826e971774da0dac
+:012c406e64749be3a4fd9573950f57f192de02
+:012c50f77a7d4b7e3114ebec968fe21fa54318
+:012c600f6bb8948a626b23ae436db37dc4ebca
+:012c7077a4d5f8b96d46707271b2766d90fb84
+:012c80a9ed2549f741578880930e995035d8d6
+:012c904d2a2e8f39c897ed8d30a19006c17bb2
+:012ca03fe1fbc9a4544d835b38e98a0a14598b
+:012cb0dde0e4587713169285508e159997acfa
+:012cc07aac1ab9d81929113ee83e67cfbc2175
+:012cd00c2415cddd20a941691a1a56d3d04e27
+:012ce07ed4af695ce7aa265c986b0320fdb1fe
+:012cf0d70b748126cad2aee83e8c51164c9a6a
+:012d0069ddce0c4a47c9c60834c023ed32b180
+:012d10c6f9a1f844c9f7ee301d698ce40c74b1
+:012d20e00d0efc617bc86b859a83a6c3a8683f
+:012d305931d1b141ee106f7973e3dc655e7d20
+:012d401966097d2119fa49d75cc9b1b0740ab6
+:012d507e94b724fcdc31303c13d06dfa61b9dd
+:012d60b3b1c75a2368b709d618b8579b27b4ba
+:012d7001f0ee780754e6d8d6355ec342089eb1
+:012d8022d0aa3a847921f29175efbeaef42ca1
+:012d90f9a28889037a52add29545013571dfa4
+:012da073b2af8d18b9c6774bd9b06b76d7c805
+:012db060bf4c0de6fde30ead42bf5b78b5e626
+:012dc0868f784e577f98f0322556580b8885a3
+:012dd04ef8af82031a8f978f01d3c67a47a32e
+:012de0b7e88a857dcbd1977e25c7016e3437de
+:012df03979529983fdacafce1bced17c250d5e
+:012e00c90dc75fd3403059cd4cab4ffc160ca9
+:012e10093fdcda0085bea4126db33d982ced4c
+:012e20d655307ca42f2b5e08d34631be82ebba
+:012e30e2e112480981f27c6d0846b761dd75db
+:012e406dfd01f1877ddac6d6e749c7251249f1
+:012e500c3ffdda773ec1b679892e118a17c0c8
+:012e6006817cb70fa93b9e656648a23948b9d5
+:012e7007eeee08dfe8bc1344f0b7021a5c26af
+:012e80ddea5d53d5afd9f19cffbe597d9a0937
+:012e90fa65227c90874ddcb97ac0e2ecef46d8
+:012ea06cb9de3afd3628f4970b88d4b7d1121f
+:012eb04cdbe31978f605de0af3cdf4036af4e1
+:012ec027285d6da638fbd811fa8ad73920cfe3
+:012ed0426d5cc644f59a35fe49983f66a88558
+:012ee020698bb7ec9ee17cf16f498937c9b1df
+:012ef08ae3388286d36bbc8cbfd1e027379725
+:012f003ef8786899860a0af7db20bf3b13abe9
+:012f10d1e88682dc34893fd928833879c8768e
+:012f20ba8273243c80d1ce00dd7a559a1f7e8a
+:012f3030323ccefa96aae6bc9df716f86283c4
+:012f40bfbc81e31406b5f98bf3bcf14752e453
+:012f507a0198e56362c34d54534a4399088583
+:012f600f68132d5702b5294347d8b7eecc568b
+:012f70d93640bf6f9d59f23b2d98ddaddb3fce
+:012f809f6dedb65a8073a9f1dd4c5cb17ddd1c
+:012f902f9b3d17b98275925e56dd7279562f00
+:012fa06b7f2bf5732afa15638401976b3d71ea
+:012fb0982dce0e15a1e96aa8debfe4d5c42872
+:012fc0791013e28d5dc315c0edf9dd57798cc9
+:012fd0927a69d3e4415b4d3d6c590f63f0b505
+:012fe0b4d85618d44fd05f4c2fe625bf3b742c
+:012ff011d50a6c66e421aba775590bd20d5569
+:013000eeaea4039b1e3858edcf8914bfa6ea48
+:0130100ab1430d6c83c291121f3c00c42c89ed
+:0130206b2d211758e4a4474391e1d016e30fbb
+:013030da4fe0a698495e86caa6b8af967fd794
+:013040c57716fc91aa701c9bd5c8dd9a6212e8
+:013050cd320ab46654b0a99b0900f3ac9f34f1
+:01306037ed8a7dff86b7cfd2507879f89e685c
+:013070358bf1a0fb2988cb26455ce4cfc3965b
+:013080c719e09c1e10d5eb748d0909a7b0226e
+:0130908fe1c74f9f6c9b680a4906129a2ba382
+:0130a0d27b94437249f9f75b44f8cb5d56a9a2
+:0130b03dcad07d96417e9d4c3848ccc134c977
+:0130c059781b214048dc639b043ef9fa1d7f70
+:0130d0950ae5c43ccc0e94c04f26ff759ce3fb
+:0130e0d7d6412761be35b9263ae7a7c8de806a
+:0130f0ee7cd760a2a273a8ba09051eddf1fca6
+:01310040ce21d1e3f4408f0bb8e5dcf24ef74c
+:0131109427dd151b4d9df0f3478105d6458788
+:013120cab9fe3de2bda5efe2204f7db4ed9384
+:013130a7b39974f149700647f9de19467691f8
+:0131400c7e6c121a76fbfadf97ba5d6c247b4a
+:013150bd61ef712d7a6aa8ce221b0ae8a8a075
+:013160fbe5de8a869a93b0608fb31b2cfc81c5
+:013170dd659f1e9487d252740f55490975ea9a
+:013180b78bf8fb996bd528c49bba661826c3f9
+:013190f081968d149459e6e49deaf36687e7d3
+:0131a01489270c7178dab3d69ae626e7fd844f
+:0131b0807d000dcf12ca4c484f4dd6d672b9ab
+:0131c0054b316cf6ffda8e1af99d8ee80e32c8
+:0131d01a83b58a7d594b5935bdce181cd8a0a5
+:0131e08876352b492b0cf45aa7ece89c1e0d63
+:0131f0a5572115c1652dc0b0e6304ce7e50b18
+:01320021785a557bb9ca6e587aa614f636092f
+:0132102575067f9a1d7e40f3d0814386671c11
+:013220d3ac6c3f1d5cfc6e2c7e6052143ea510
+:01323013b93a13a33e4448c7b307a2a3cca548
+:0132404dca04bacf1c7f113c288f3b363afbeb
+:013250e98da936e1d4ab6e5863fe7782390555
+:013260b76df45e1d5fd380ecae4f0e00fda036
+:0132701faffc911db6ed5bfbbb90891a661576
+:013280e09dfaf40d96f62df0d855349b51c987
+:013290a41f06679c53de914582958b8c84d1b7
+:0132a09ac3d9228e61abbae2247dc25d0d4c46
+:0132b0457553aba7368ced50fa0b1885d8aedb
+:0132c017a3b09ef6a4370002a7e2c3f56c827c
+:0132d0db0b4fb062d5641c6dc23f5a8a7866e7
+:0132e0523a5877b3916f2381f0703810758e87
+:0132f0b4c0d96594f8f5f641c531d2109923f9
+:013300bf922674f005c82aa43e4dd7da962cac
+:013310539453f4364b09df7ce0aa97d79e87b9
+:01332086c69c4f93568b1afbd6f865f61b13d7
+:013330605f2040b650da0e9e73be08d71c3e7f
+:013340d02ce84e640f3d869aae4fca44f15b70
+:01335021738db543a58c218d2c70c90869a897
+:013360cf2a4f83512b1afa8ef2bcf512fb63e0
+:013370696ed1b99a90e03220a3a5bd347c7e54
+:0133808a92afa20d79d7f4f0af96c73addd9f3
+:013390f0a3fdb6a485ac6da9c580fd69b6b393
+:0133a0f599fd7c80af5c58747875d882d4155b
+:0133b0af3da196d3f0498faf103a8f23aa6003
+:0133c08d48361002482cd20443ca74ad2c89a9
+:0133d01c83d183063d1f0753f08ce58e6e07b0
+:0133e0523f0c98f4fe50fe1ae1a4c8e4c4d142
+:0133f05e9501aebe156e25609ec4651674484a
+:013400e2a5d52d7881816a92a991a7174c76c6
+:0134106846991eb1db77a3ef56c069f1437ecc
+:013420ca92b96d2714a610fb5448c1252d62f4
+:01343091d20a6147680cfe519e4e03d2f92e31
+:01344006043499b23a4bda535b97fc9f0a703e
+:01345056d2e0eeef2e36365078cf3a89e17707
+:013460a4e43e1497acf9e2f99fb2d6392233d9
+:013470feabe47120a77a48fa0c1e263b349cfb
+:0134806572bfe661fbbe75d4992e70d95599f8
+:013490fa5e3daa8b77d15966ce00620bfbc813
+:0134a0e2b80729194b7cf0d699847dd32668b8
+:0134b06914c2cc99572e2c50446c6db429acad
+:0134c06def41293d441e4c45e3d23a76e7bf45
+:0134d0dd9304d48924a140374c7075154bb09f
+:0134e032217f18e2a713f9cf9f2c8bdd571047
+:0134f0acedcb51610089c692195422f335a494
+:013500aca4f005892c11f22895ecd989931efe
+:013510ce3b35a7efd3d21aad74f63af644f137
+:013520426f7e16c769150678d76c3772e492b8
+:0135307a012f466e63d3eea4a07cb0789ff6f6
+:01354063ed5cf21c3d182b82fa39d355f966e4
+:0135509f9ec93be7f0ad6abe912d113000bbc9
+:01356060a022f62b14c845ad3039d2450b66bc
+:013570b025bacbba02da49931c2b2b4bb5e43b
+:013580846aec7da385d8f1dc36c7e0e3c5ebb5
+:01359015aaabe54861373f4903c0babb07d243
+:0135a03a37c92c826ade7afa1440567c7642d1
+:0135b0f17bc279cd3396a13120c26ff3ccd6f9
+:0135c0d476eef0f7c9349e8546055654f88ae6
+:0135d06018644f3934803b4b37f43466724eb8
+:0135e07fb44f560461d46d9ac7dc4e57abf673
+:0135f0c3e83c62b6ba6eabe673e50cbaf66688
+:01360083bc5647ccc70d2344fb53c856bd4270
+:013610217c0cdf1ca3afe3e4a59ad8ee3e751a
+:0136208343bbd50d67f1278e350c378b9a6d0c
+:0136307fd7f4821ef41c16bc862f3f0a171fd5
+:013640b45bae81e5d725d7b1a613060d3a083c
+:0136505c08705de0884c4c5ae88855978d6bd7
+:013660bf75c03f3cf0722fba34e1dfbf0ed574
+:013670f4a71554ec47908aecdb48557640daf1
+:0136803974fe64c0e53fbe4b79628c891699e2
+:0136902ae4f70adb86664bac43d3ab3478e665
+:0136a0e36bb7dcbb887de8825a55765e43e038
+:0136b02d902a8658ba132ccefc9b2a2d018877
+:0136c0b957da42f3813573631789173075f8c0
+:0136d0935ce82e8f6351044c3fdf081df4daf5
+:0136e01332f50ef23b83a0d3ae0b363eedfc15
+:0136f0faf2cb6db2f88b0d0aa9d47d39e83954
+:0137003f9309094aabe498bdbf44d926f1859a
+:013710b58d0fde21a2c5cc56dd767379a48aca
+:0137202bfa91148c50191d2407ef966779f001
+:0137302a048be0557d6b1850df23f9ddf4a834
+:0137406b0effc5255db01ded8224dfb879c910
+:013750b433ed9662822307ac22fdbb61718f5d
+:01376067a1a71fee81580cc60b6516e22ef617
+:0137705982e8fd844400bdcab7a174d5092efa
+:013780493dc29adb882e18aa52476b51542d73
+:013790b3e295f57185ee938f3cf045c1d6b686
+:0137a06059dabc26cb851b58d74ad240f98439
+:0137b0507ca49a910031be7311c18143ee97b7
+:0137c0b6b99fe6b7e42eae68efe669a98ae514
+:0137d0a308082f45f098cd4bf40e6a0aba13c6
+:0137e07898b387dfde634fa00be5c0db33ba2f
+:0137f0d734665c29d8ca87dc1ffd86c4c8893a
+:0138003f10553b776c4872916313c40d117297
+:013810468a0ee8dd81c5f0e6c5eaae4edaa6e1
+:013820656754bb3e7b2d1c58eaf4daee2d5d98
+:0138304c97312e93851fe0fa478099b1c94695
+:013840e787681bd0cb27cb8302469fae090205
+:013850ac2e07fdb6a33e53c3c738c23051b79f
+:013860399ae03ada0a19a91b16d345993c4c05
+:013870f615b24181f79eb4cf92aace84efc81f
+:01388088201c2b2c5f8b6b4d2a45f0a51c3c5c
+:013890dbeedc34b750ff95a3f1c312badf1dcf
+:0138a0c17526dcbfbbf80e637470f022e8fadc
+:0138b057229d205e2ccb9ed5111ba05b03805e
+:0138c02ffa7902f0423336e5bedbb1637929b5
+:0138d0e04231806e067de8f41a2c72cac13d78
+:0138e03a30f012b4b78bcd6c1921758b4003e6
+:0138f082eb32189877b9705e876fa8956c7bc9
+:01390062ac5625df127ca7ca1ab68f447bfe88
+:01391008588ce1884a950c1eb2026276e018a2
+:01392024a82d1071714914382c59051155005f
+:013930b72d2049907c18b3b73f37d7606d3bfd
+:013940186a8c9e199587689101a517cea09340
+:0139503a0b73fef97911ab494bc3f7aadd5129
+:0139606956bdbf19dc34a95f7b9b10465faf89
+:013970ee097f52499159642cf9b98b1a8f5b8f
+:013980794122ca8e212157c857296cf407a87f
+:0139908c0775491299f6a774deb5fdb82f741a
+:0139a0f820c471178a7a24c9be2b93310968fa
+:0139b0d1464e147539c261a0cd6d3700178fd8
+:0139c03d888a1fd7d9a4373b7146246a95682e
+:0139d0a961caff6bea4e48dfbaf4e8b9581d3b
+:0139e07101705fa4f40e901cded841fcb172f3
+:0139f0a2b29fb73bbe6ec6abf3522a3b47334a
+:013a00c073bd6be62800bd9672839188e1c154
+:013a1082bedac2b141e4e7c8c5cba0c5fe5683
+:013a20b337ca9049317a30d7bbe1b9e31296e2
+:013a306464f16210be52726cb295013322bd06
+:013a40dad2c0d9c9794eb809402f76e667691b
+:013a507a833476023ed3749f51e57322c0833e
+:013a60fe76506c7fb991c096fb516e9327d3d6
+:013a70b2f08f1ca56c1a87dc5f905e7d6bac33
+:013a80acc879b12a3e1ff56e63f286c0098f1d
+:013a90cb740bb11467a7ab27516361ea9e8b6e
+:013aa0e7b6fa0a9d8bcbb10796051df4c223b2
+:013ab0cd6f15836ac7f5a1f295c86d9d83e885
+:013ac011c42ea88792c9f62ae98e9965b864df
+:013ad086b55db8ea4546cc37f9c3877f07f2cb
+:013ae08d7cbdfb0308e3fc928aa68fea9a54ed
+:013af06553f49cda42295ffc2dbade88c3b8fc
+:013b00859092f9a99ae5a16e917e5b4253b686
+:013b1033651c6d681a584dde31773418d9de64
+:013b203ccda10d6bb0ad154739cf9e58b138a9
+:013b30b838497e6aa7838ed36f31c789788042
+:013b408df9b8995cafb46bb943b481535c22f6
+:013b50b1820c3a9ea1c29a325613d31bc723ab
+:013b6015cdc51def3821238a2586c1219d88d9
+:013b70a3f041a383e5688d23bb7b80379c2199
+:013b80ef322539f4048290f8aef1b7c2bd9b04
+:013b90d2dfaed1972875d97de8ab4bdadfca0d
+:013ba024e880761bbe2c59c25407c4c8acd3e9
+:013bb035d1a48c02a818d1e5d9ad276b5d1647
+:013bc090cc673a36fd75d8a285ddf085c3f383
+:013bd01c21199e9229992a3b52865eb05bd3be
+:013be0803a1d9376a7bd9256f7d5181fa0aa5f
+:013bf0ba1b806f9ba42d987ac8611e4d5a4af9
+:013c00e4d18791f90f96eaad6a6180cd665249
+:013c10809eab446978bc70e82dd065f04dadbd
+:013c2052a7815eed74b9d849073d67d84a4508
+:013c3082f88e36ac2f81e0d03aaaea3bf66879
+:013c40bb20434de27bbeb4f6171911932fa1e9
+:013c50dfbd593b851b68e632dd30dfb261fd7f
+:013c6018647316af5913656957385fc8a3dcf6
+:013c70775d2c8b3f860029d7b3caf8dc9fc3e0
+:013c80686cc08b3b0dde34d8eabefae0396b0f
+:013c908e5d8124292f66d48d942d726f07cf22
+:013ca0b41312a519612047468271f238ac0d20
+:013cb064ffb965c309bf78de78ccdbee4d5bd8
+:013cc0db5202618967cce65bf09e89a3839dcc
+:013cd075e81f0255074033860a197ab300b487
+:013ce0bc714a0bd018033f573e8000754f5ac8
+:013cf01c204dd467e86fc3fb553d2139222b2e
+:013d00cbba233d7ea35898e2bb12af35f5e5bf
+:013d107cff0674f24e4c77fd9d7f8d2e4d2579
+:013d20245306d5b95553ef65580774b3017b54
+:013d3019492991434f72f60f1ce675b6221a3b
+:013d404bba13ad31eea04625aab13b1d94a141
+:013d50caaf631d9f93927267d7c2850a253d2b
+:013d60412815e7e87347e13cf9a7e87ba4fb63
+:013d70b4738a07319d34b0e638311932cda672
+:013d80040d950a1c132bf79bc0e871aa974402
+:013d90f451de854bb54055271ffac6d271d613
+:013da0888fc3ec17ac2019d919a824e8e5dd17
+:013db001bb2966425541a3ae9d262ec6594f91
+:013dc049deb94ba8257a5d01a9f9b7c5da9173
+:013dd0a3796089beab1e151f2621f85765ef0f
+:013de01b707e08e5b8f555647f28f419449744
+:013df07fcfb1a1fa0c540d532af51bab178557
+:013e0063b7b3887af6535a347ef5aa726f8711
+:013e10b9a0ec0f37e0fdc1cc8377c713834e9c
+:013e207bc843f5e86db96f6bcae164b4e58461
+:013e30d853c02f96de968a563c6bbbfe3244df
+:013e40b6a34b9986772cdbb4db843877ed22a6
+:013e50befca483ca82fc7e4f3dddb38a7096e9
+:013e600c62120e903303bcfe68543219d7f48c
+:013e70226e61f3c2ae721bc2c08db5518fbcce
+:013e80b6e1660899f91f571928c6c74a974186
+:013e90436cb5ae9682e215a1388ef644a3c479
+:013ea04d98ff4f10b8bfda35acf886883d3c9f
+:013eb0619b813af7d700e46545c0802bf26e53
+:013ec07b4cd078cec4424e3370bfb6492849ca
+:013ed0df0d44850598d6abeca85e4529d9d2eb
+:013ee08be2d4c954c9c68d7aa090e3676ab17f
+:013ef019f629bf65b33b8a72b7402b78223794
+:013f009f6ed5e778659a9f38d139c08f13a2bc
+:013f102755f2735fced46747b2f5f61628be5e
+:013f20c3664263f8ab6ce0a85dccacce7c03d4
+:013f3071341d5fef952e705228d907a0384760
+:013f4086d7c7c76d0c178d6941ce7ad17f379e
+:013f50b6cb416e84a9897030df3245126ec89d
+:013f606b0d6e15e71b32d052f775a5819a3996
+:013f70d7e28ed3b6f351ea77e70f5c01adba56
+:013f80e68387339f2a94f20c41ce8dac49ef9c
+:013f9018cf223d19b94af2c48a91bd3e9aaa82
+:013fa01213abec39852118d9a4783185178281
+:013fb0138c42356cebcaa25d66cfec49f0e8b6
+:013fc0749cc2bb821a1b58cf768a6a8c5d226b
+:013fd03c7fb333dd32afc9ec434bc9dbb45304
+:013fe04e06ef3af2197508efe3ca290e84aa49
+:013ff0efbe2d07f6e54d4440d822a017293753
+:0140000cc5d928d30bbb4f311c55d668f7857a
+:01401061e448818b8cdc2cad5e0770dc3fd0e2
+:014020dcc81d25bb4d82b9b5f18f6f81a3448f
+:0140308103d2b49343581511f682306bb405e1
+:014040bfefbc11bb6616a17b5ecdc184360eab
+:0140505969e32bd1f145f3656e0cfeeaf565b0
+:014060632a1b6d69d1c2d461a3785d673ee950
+:014070fe653a13da955e6b441c3100e36d4bde
+:01408069bccc5b04c17af304e18d0e8515ff96
+:01409048084120ca29da8b682135ed9dd6744f
+:0140a0e539759fcbaf459e9541251a4134841e
+:0140b09928d38d9be719a870d70f71d87e1e69
+:0140c060a71f41e89d0103ca124e2ead86e582
+:0140d07dc7fc0c0ac6d8cc9b7f8767d07f0069
+:0140e0acccb412490723682934e98718f42854
+:0140f01fdb1e44674c29c358aa9f133e1bcf66
+:0141003f4cc72a40ee9f682c26f16965d735b3
+:01411023d4ce15b52735d643abac0e421f623e
+:0141205e04a241c81a27421357c0dd1a76ab2f
+:0141304859b67570dfd130ea47b0641d02e797
+:0141401d0c11e4a7c284a71720cd3008946423
+:014150cbb3b8726901d7bac7f4d325d2e1a67e
+:014160672bddf9b5932a9afe58b753712bacf1
+:0141701b2881461ee5f5b3e9f435c2065f6e5d
+:014180c57b00a71f2711a58e2fcbfc2bc7a598
+:014190f7282aa051641d347d07bbce72e07def
+:0141a031b5d632d8e74d2723dedde2a2d3c033
+:0141b0808f2572020588bca235eae893265f9f
+:0141c059330edcb4d905d4473116eeeb18bb51
+:0141d0aa9679fa9af6c3e2407fab2571a3dc6c
+:0141e08799f358976bfcd7dacbec7689576466
+:0141f09377dc5cbe153bd407f0a5ff512fd1c9
+:014200625a4670b349c9d3745becdf423d8a7f
+:0142109b199929a6807956d75e12885fe858b6
+:014220b09d4cada0298cf06e6a9aea667086e8
+:014230661560d74a4c3ef5ac36346bca386af5
+:014240e9a7dd48338c99e44159673ff7905fd4
+:01425085a4c7160815ceab5b6a6b7d2ff2be21
+:0142606018ca879a3111331fa67f0b571a8fbf
+:014270f1382aae64c14473cb2a213fa62ed6fe
+:014280791eb2acd5eac4658a236e8e945ed7fb
+:0142903a7e804dfcfffc4cffeeaece99a15196
+:0142a0ae4f9c21def35892368819eb3c9c6e98
+:0142b0155cded77e9f5dc785c15ad6ac87caa1
+:0142c0fa497a47655bb0b844b942eebea84435
+:0142d09b518df1044bd1293b4db71dd8b354b9
+:0142e0ca77783a5b0f0a3de2b57c5c0b297252
+:0142f0f01f5ad7f09ea4bd2dcdad94b279e8fe
+:014300391b31956ea1906f8d86f37b11decf3a
+:0143100e5e87838535c741de7b5b2cddf16c5e
+:014320fe2dd5c088c4f9e23994aff0962143e0
+:014330c9295fc0c15e71730d0cd2415b6a3da8
+:014340b454a01f9d4dd08cbac5969ae343df50
+:0143501d296e1d6f591a058008f781270638b7
+:01436005f5cd6ad7d1365c6d5a82e2e9c826d9
+:014370599c29479a1749fde5401b616473f83c
+:0143806cc38e5e5de3dffbae403f017812b91f
+:014390e5abdce3ca891316e47f6820327ce579
+:0143a09318dcaff32b81a828cbabfcf6af91a6
+:0143b009420d15b4ff61a8ba9b91461824edab
+:0143c0fd27cddd30f913efc86c5a42262b47d8
+:0143d0a364280e6dd6c27703d54ecf23e6ed38
+:0143e0d53e5f167084594c9b8500c95542e07d
+:0143f0712a40da1b013e5267d65afd71eab0a8
+:0144001b76791fdea37276007f9b45bc590109
+:0144108614bb16a36c1f8f6601233dd21f2453
+:01442029c6487402da620874c38b4dd7573074
+:01443007596abd337eef23f5a3560bae7b9962
+:014440ef7adb71a10fa158ed5236ae3e594465
+:0144508995909cb27e5e4ea07f4d157898737a
+:014460871f1958c2676f2bf1665bdbf93b8447
+:014470ef17f67159a6c1f23b881d830736b147
+:014480f0316881d5e62476eb73e3aad07584b9
+:014490966a2d678309e773c30bf1d56fbab26f
+:0144a0c4e2bc473a1e7e07d5ca9fd01294675e
+:0144b0517a0b035c313ed20c2ab18f40cc3a27
+:0144c010e327572b97710098baac458f6ed9fb
+:0144d02b319fddc08536d69ef993c355e37f14
+:0144e0024b56d8393ba1630ce6384842643368
+:0144f02355e245a116764708210e9df0f4f459
+:014500f0300b3d954d045f305ade43f6b657b0
+:0145109b93471519bc13439716b73180d62230
+:0145207125ad3923eb50de398ffb905223b311
+:014530946afa9f0e66b88cb4f23ac1274b97e3
+:014540ccd6ee5521a259feee7cca4e7a7f48f0
+:0145503117f6b4ae97a9f388eb2b1394f88267
+:0145607ea9f6a3314bb2c2f84a57ef19de5d02
+:01457056199670b9b4a3185f2b70554e4f9aa8
+:014580c271bb36c9481f74bc19bfbf57a49899
+:014590a69c5a489bc5e1867bfdade8d4ad4633
+:0145a04c2e7151dd496a4fee25f6dfa435d49f
+:0145b029737fa3cc47def55b94ab55339cb145
+:0145c00392cf5b9e00077ecdb906811c3d8aa5
+:0145d03b2b7d5207312134a8dee11f4a2fe383
+:0145e06e948ba65d309b0c7f7fbf9a68399cdb
+:0145f0b99dfa58309d8aa5f7abba7ce94ab10b
+:01460058560814c5f2ee992ef13785e146f4fb
+:0146107635632165adddd5a0cbd2d36f020c61
+:01462027eb0f6e7440b134b730b62260564416
+:014630aecd1c599b9d5c028b58c854255919fe
+:0146404e959ceee3c14016a1d3eb63946891c0
+:014650df97ca9af27b15d1425173c35ec25acd
+:0146602f1c36efd9193a5eb6d52d2337e093d7
+:014670b140d7229a8f6e5f2a6a8e113f0d51c2
+:014680f931fa4ec20baba84f0dda8e859b95e9
+:014690bac071d3ca528962921473387e078d6b
+:0146a054dd047e0c3558bc29be4e46033d56b4
+:0146b0d8ce6b32a74e997aeeab42bb1da56819
+:0146c055b3ee6f69dd7e051df338c5879eeebb
+:0146d0d0af1391d46fb082ff602526d390db28
+:0146e09d46e8bce85e7030947b96da2ba47ef0
+:0146f04c718dfe850b556d63df65aa4f94e612
+:014700834dbca29f87840ba3ab98b2026a8b43
+:01471075dff698d00ac5aa4ef7e6bb2ef0579b
+:01472014b185605e7e7bcd30139727e2c8059b
+:014730ddc84b795b16196057fac5a990dfbe93
+:01474068b7f2e5d0c1bcf2fbf649cfc7b4ae85
+:0147509d93b5266a5a0e318dc16f96fc6c7ec9
+:01476003cf95745e9e2a30979a2f3153ad58c1
+:0147708238d4cfa390ee90911e200e748c47cb
+:0147807dc0db3ee72ac4f52e25a62674f3c0f2
+:014790a31a21fcfccb94a498133f53956bccb2
+:0147a0becd85bce5030a1f73421a821f99199a
+:0147b0565ba1c8a2bf2a358fcd24ae71bbba1f
+:0147c016ca99e827537048580c8db4410af948
+:0147d00583849a8acfddb8976adfa341b50f79
+:0147e02ad8f0349fcd9b53d5e08384a44f8b86
+:0147f0ee409a7332db18d6424f79df07315736
+:0148007a8a7d8511b59d759fef985a6dde24be
+:014810c50e33925ae06910fa49fb027d6dbf33
+:014820a9733154ce451d01c60cf6fcffa4370b
+:01483093ebd475eeb7782a72b56d7361f6186c
+:014840dfbff344a96c4d7eedc1be8523098ecd
+:014850cfeacf91080f3b14b57d67357c5e9a46
+:014860b91b67feaef7c3064e045e5dd7212f93
+:014870d69b81bd9b069715b636fef003a829a2
+:014880fb6ddcf55bd9c3e38be91c70aee35d47
+:014890eba98639e1c104e817a9b4c15872c507
+:0148a0091ad6b3b29c1f9fd2432d4ce042da57
+:0148b002ff5dc40de99f5518f9ee8b7e7f7d3b
+:0148c0295e2692886fc7e1a566d7a7fa584f8f
+:0148d0185d105fa5d7a5bd9c2f1d2ce1728d7a
+:0148e0e606f09715abde3e3708a58a2cedab27
+:0148f06e9386246e9ee8b04935df29ce54824b
+:0149001d7c841c7f3263854360fb2a150e4f87
+:01491023eee59421adc74e06d077bf22c10d6e
+:0149204c48d39325fae6f9bc9662aeeb57f2b3
+:01493026a28203ec300eb666c3971f4b6b890a
+:014940d1066337963c8c24e85cf11a92ad4ef9
+:0149504c374a71cd98bca20c3bf1fd673b02bb
+:0149605cf51170e846cb75b0e58dca15d04f6e
+:01497000fbb3705fa3ad1168add44cd7ca3824
+:014980b12259a4f99e3faa948e374644e59a60
+:01499001b0cb1ac28d0b6121ea625a3d2cb06a
+:0149a0be5e408d07427cff6d531fb763dc1294
+:0149b037712fd841f15ea5e7387a52929cf5a5
+:0149c0f3c96f12ab6a575e8be769ebb2c0a5f4
+:0149d072fa23de56e7feff2492f4608118a7d9
+:0149e0aa11b2b5f4f4887e293c171ed4f93c99
+:0149f0c41b6666a8af78090cae0b777cc6b6a1
+:014a0097cc10c4d11859e8290a2f06e4edcb2c
+:014a108c69a670f4a56e2ac237c4d45faaf6b8
+:014a201e1371f3381b4107d123fad7f8ea2a92
+:014a302c4ac3e28b3f162735f5c529ca03a70f
+:014a407a1acf08909a2c706115dad023ec3c53
+:014a50e0b0eda462e635e37569b84c8d6620ea
+:014a60a1de36a2f0a17c60f7e95e79f4c4770d
+:014a70535c7f38c91ed7097fb1242f519f5888
+:014a8001270be5b2ab6e518daf531a6436d1dc
+:014a90bf43c51d88e39cf0f816fc4e1f54cce0
+:014aa06e27548547c3f1deeac8480bb0a8d3c9
+:014ab0df7d6b95cc8edfb4ad60793bcc3cdf8b
+:014ac08d5a826f7c80dc90b72d8834c6540f60
+:014ad0113c1db3e8ee6c3008c0ec5c9f38fcaa
+:014ae0ca68066e39b7d0694561b3df6215fd46
+:014af0da351d66f1ec782662c9cd61df8592e0
+:014b00ac502df395e5abe4e8371be1abb6d03d
+:014b10706a776dfb1f2fad846729ca73599254
+:014b205ab29c88b372c780dca874803cb7fc8c
+:014b30aa4c40b59ee2d4043ef7c4d8c0b8a0a5
+:014b40c3c2262d972da55bc1593f30132ec8ea
+:014b5048cc5934aba152e3b5250a06ba56bce3
+:014b60d53e36186a9409685d10f2aaffd7fb23
+:014b70bc43d514a0cca428582534215cc98113
+:014b809897772a524cf687ed812b71300de72b
+:014b90c7569811c84c3ddbfe6e9a022608087e
+:014ba032d3b10b627f09e1d682b9e85a37987d
+:014bb0dfd308e966e1990d3b83569e1f8149e2
+:014bc08a5ead95887a8235cdbec48e4a84b422
+:014bd02e19d7b70b2bf28ea5691d6b3e5a5caa
+:014be068cacee9397c61cde836c0298dc625b7
+:014bf0e30ce3893f52b75b0fc18743427b1bb1
+:014c00fbf9f64ce6209ff8ecd302f293ff95a1
+:014c1062e902da423705c06773762f6bd5c525
+:014c20b64aae5f15bf58d071e06633281730cb
+:014c301748c4f39b7eae0889c36bbf21e68407
+:014c403cc7aae605b760d81a061e93f212f352
+:014c5033c388223cd2dd1961f3fc3bfd9300ba
+:014c60a08dbffcda4a1448e1d01d6c55886533
+:014c706471564f3951bcd5f567e4a92130f148
+:014c80c04fcfaaf5e02ae89d7f0d7b4df9b11f
+:014c9075e1b66c243597b965b2c157269d6b7a
+:014ca08f0c3f8677b4f7ffa32a03206ca6da81
+:014cb0a07ca747a4cdd2660d30dbfe94623110
+:014cc0184960afcefdd3d0c2dc8ae6345775da
+:014cd06fc9f57ea13f159a7ad41b56ce7ce4c2
+:014ce057b6eb3d6f1f8d17df761d4fee670e15
+:014cf0dfe00e93ff0e52d287510ec7820123eb
+:014d00a6c4bf44b47c39ef7ebc9353046cce4e
+:014d10e27c03a87c23607893d34607d13136c8
+:014d208829cd69d481e503b0722c50136b0408
+:014d30f1cf04a0189a625c5ec60f8c854ea1b4
+:014d40218352d23198fdbd4ce06e00d052d1a9
+:014d50b31c1b74da3e0bf0364768a2457083b8
+:014d60ce3975a14876dde5d58428ef79de84eb
+:014d70e01d3014aa7e62dbb395a5c1af1e084e
+:014d80e15e5538e85f37c7dca33deb5e84a723
+:014d90bc0ccff7c7c7181cc63481bb19c626e1
+:014da0266f06dd648e95e031867eb6c8291b16
+:014db06bf8fb00e44018f7991cfec6574ef38b
+:014dc0c63b8de0922e9d2d64027bf1d7244d59
+:014dd01e41bf90f68c134307ca8153344cc2a8
+:014de06685d464b89de8f149df7622920b6a6b
+:014df0f19066958019400d7992e9625abe2d16
+:014e0065d23bd6d6d9465538275dc191f6a676
+:014e108ebc3b25becdb30f9bff3d55de8fe29a
+:014e2035bc3844b9e8bdbb0ee50fec28f5a37f
+:014e30fb88e3088981a07ff26b17c2d2245b5c
+:014e4011ce78b22969047cb2927b8e7d666ea5
+:014e502a7deb3b14f1cf6baa5ea8dd9f99d9c2
+:014e60a46168e6620a1ee12d8d3387ba14860e
+:014e70af4f3e9fc9f1e44df5d29d7982045839
+:014e80be78d9ea32efe043883cc198d42421db
+:014e9034efb80710ba1dba277161eeedb48371
+:014ea0a6f6ddee9e0f4bee3fde640ad3371b13
+:014eb09c74fb7dc8321b535d5bba6cce3408c1
+:014ec096c751df9bea2d97fd1b1a95259dc85b
+:014ed0fca5ac8c8a733597d648669d7203a349
+:014ee0cbd1a10c63f0be07cebd801018f17e88
+:014ef0c97e2952e2e8741957577083029f2a37
+:014f00c099f0acd68e3d059a0516920dbebc91
+:014f103938c057a05eed2f40c20f09d1b12559
+:014f2059751957e5f4e6c1aadc33f92a45bca6
+:014f301a45b0f5ff5390e0865f492748b2c425
+:014f40c3ccab3114f73b4362665b719f46a6c0
+:014f50b8c5a80d974a0fd4f512e201bf65be8f
+:014f603367c66fbfa1b15707b36c9f47643613
+:014f705069290969e1d29f3c104d17969ac485
+:014f8013afa76a9b46496deaba5b185a8dd865
+:014f906da515b4c4ea9fb30e9f9f484502c094
+:014fa0141b4f756903605982f85577808332d0
+:014fb0f38d0c9d4fe1f8a82c05ea9655dd7a6e
+:014fc041fe400810a04f12596b4cf0382fe77f
+:014fd0fda2d9491ee218076965907c1feff902
+:014fe0b0c5ed0f0c649b6552aeec1da0d9eceb
+:014ff07e186f6e5754a4ecdf0402527f9c17a0
+:015000c78b9fcf62759b85fff4dc6749d9d441
+:015010bd94543341d068475f417f51ca794f7e
+:01502033d6d14b5ef9117269dc19f5ef57f8cf
+:0150309bd783c33c2b33d12a99d818c660ae75
+:015040094381c1bd64ad3efc07b95b6be31143
+:01505094f2092657efa8626527603755d28699
+:015060d3ebd7ca618a60349fca2da53266ed05
+:015070deb4cb58543ae14274a9d869aa4c9b52
+:015080fd6a4d3b78342fec95e0cda3c418411b
+:015090d6eec98f0d9cd8c99a183fcc0dc57cab
+:0150a0fc4c4c69275b7a8e278359532af44d79
+:0150b02b3898ecb55e6e630fef79a6f2ddafb5
+:0150c087b92f98e13688a2bc99b79d3c3a175a
+:0150d0cae757829b0fa51549561364bed585f1
+:0150e0bd32db298a70ae949f21cacba986a162
+:0150f0414e9a74dac244909d243d02c80fd596
+:015100bea2a346114d5b875f853011852f7f6c
+:015110ec33a60bf173ad99e574dade32d8a482
+:015120fa372264881ee038c54cd9a709ef8c7f
+:015130199c7178d4d1e11210a729ce80cc7f47
+:015140f3694dd7a01642599b6b3c0ded7beb98
+:015150f7d65048bc363a86af438193c08da50f
+:015160ee73f19bc1a006c85797b8e754b26a3a
+:015170d40391267f0d1dca5057da4a08ca5422
+:0151808604e38b974480df079c1e689e690ec6
+:0151904f8c73885e5635c3f5387d7c07bc2170
+:0151a0dc0595f861c43ecd23ad96c541c8ccc3
+:0151b0bd4bccf43576bb61b82f1a73cbf02bfc
+:0151c0e447b82e92b14c9707186180c20e5c2e
+:0151d032a15212bec754fb1d2deeca8f4a393b
+:0151e0773e43745ce569019ea76e0715963232
+:0151f0420b3ed29fe954467bb2b2c931dc7dba
+:015200ea6d466c9096f93a8d17526c81721808
+:0152109dc560557760d4b615df81e07f5e618a
+:01522023bb8b4885e966ec58e45a0dd5f7f2a9
+:015230e0b6f851b4beeeca8e33144c9c76fc7c
+:015240206491564e073718192847ab3a083955
+:015250d7f9e43c328051c14bbddc7750b02934
+:01526074ea3a8217479cd49ce63f3dfc5fd43d
+:01527060a55d84001acfe6fff953e3233ddc01
+:015280359495a3f8e230f256f67a5039631cf8
+:0152903a0f220e3064a456ba808c8ed98f670b
+:0152a0ab071630171135bc3178ae072627cfe4
+:0152b0afec58c8bd0621eecea3288a56c7e112
+:0152c0bfb5780ffd30349c48c954539d1ae33c
+:0152d040ebb368cdfb0a6e7d2ccfd3c64c6d46
+:0152e054c248114c5c09d97e690f6595909ea2
+:0152f0167934a6b279d62c23bdcdf7a418620e
+:015300795e2c7951173e9a9323a3722cd72699
+:015310d4d55c44009ba57f154cbddba6518a9e
+:015320bac08725c1b6e8890f2a8d380e28552e
+:01533003ee3a6f93f23a668f1a1de7f959fdc0
+:0153405635460d1ab70b0562fe6a2771b7d0f3
+:01535039ed0971e228e01223537d2dfa263ec1
+:015360865061bc0261bde8c686ecbebfa79fc5
+:0153704756c0f067f88fd55dd4621a7544f489
+:015380412f17ce9395d307af07082806a749c7
+:01539034f9a05d63a4c878f3b314c9183f295f
+:0153a01fa505815e9fbdcaed5a73e6651d29c2
+:0153b06ade26196d2163bb304152773aec149d
+:0153c044180cf4071384bf26f929cde433510a
+:0153d00d2d4bb9966b963371546c0073983a4b
+:0153e02fba026db5dc13e4bd1863f5657c1789
+:0153f04698fb51434de6133c921b45096174fb
+:015400d2551c05c69f2317e4abda9420f5c2b8
+:015410887842ee81c7e8295db32c232fc2ba62
+:015420c96688652c330835ad7c78f6e6bb918c
+:01543052163535365dd93e32e3ad9401f66a6f
+:0154406a8f4f9b968a886b2622e38a560bf719
+:015450c7164b7710244f3cf33ada41bd64f8a5
+:01546072fd75a75308ae3571a5bd64f8131edf
+:015470f57670aeefe7bf25c9d84b92def93c07
+:015480de8eca66f1c603d3aefba253e8e389b4
+:0154909b5b4b0a234215e18052f4c934bc147e
+:0154a0dabdde2cc855971a01835730881b61ef
+:0154b04736a0efeb683bb5108a774e36123df8
+:0154c049bfe1e093603aa2c47678885ea09f43
+:0154d0a8dae5a5995ae8c3766b58d4fe300c1a
+:0154e0cefb66668c02db4dfd1c69ff69c329af
+:0154f096b1dcc95cc73acfe7f1599826edda85
+:01550065cd1ed6299ae1c81e0bdb72c46a0a5d
+:015510cc13448940684d25c28fc6f2a1db885d
+:015520fdd425bb1b4695024cc10f63733268d3
+:015530b887abef3d982e6baad5091d313eda1c
+:015540b3aa9465945391c8a563ceda74997f27
+:015550cf6293c7b7d88ff7b7218333a99febfb
+:01556081f408e9b677fffedd3ffbd59a259e6c
+:015570a3e57958d1f42df24188a868b6478b74
+:01558009cdb020b826b57c6c5921a02d66bfce
+:015590a869083958690ac9aeb24587f16afb1f
+:0155a00aff66362b0534246a0c49837497c1d5
+:0155b04b28a5cf017815487ad617faeccb23d9
+:0155c064f58ec11ba95a3483f2f23e0a00ff4b
+:0155d0a4cfa073c27e759cdc2e2140b04248bd
+:0155e085e375d479c51dcb38c255e2155b4263
+:0155f023282784bf4ed57053aef4801b0896d5
+:01560010c0e4173440c62b2a2d3cd3e78a59c2
+:015610bcc785a92c07c20452f19b6ec2da8f88
+:0156207828f8a79a562ea16321f9707b481d4e
+:0156309cb80ac046d43642caba0be97d74fae0
+:01564042f3ca3875d95f207726bba928aa923e
+:0156501e8caeb517f5eed9897fbc43a93be2f9
+:015660787af56bbb8715335fd7c8a90fd0748b
+:01567071b6814f7a5cfb50caf21a8152e88f3a
+:01568090898a7427dcdc9a0cb8da29cfdc813c
+:0156901cd870f4d2749c8fc2d5b0baf35b73d8
+:0156a027862a3a39a8b41d66ad812fdbbeeada
+:0156b05dcae8b5d4919bab3fd928d066c4be9e
+:0156c06490c6d27ff9932fe9abb853ac006384
+:0156d00ac3d8d707f1dee45d8ed593d8cc7f3e
+:0156e0209bb947a0a420a1167b831a8609c047
+:0156f045a442093c61522a1ffb53ae21e5a0f7
+:0157007c922370c929dd0208eccf97764b05bc
+:015710f6c00c623cf7bd8b428e6d59be21265d
+:015720242889ed33e375b633fc834c4748070b
+:0157303b257b5f9901921a4ccd5f5f74ab2372
+:015740601a0901367b71a30a142b7e03c02785
+:01575037fc0457072059d77098202210ec1d24
+:01576005dd81cf098ff28566434414fbeea31e
+:01577088dea14fa61b29db437031121eb915c4
+:015780ce634987113c616c5daafa7c22eba03d
+:015790eb2328cad984b75cb53f226a7797d13c
+:0157a08fb7fa9513afcabb279e0dde707d9698
+:0157b08cbbb37df00b1fee8df8705c03e45ad2
+:0157c0eec25b1414f523111f9e589f75c77e11
+:0157d093e905be7831fbb792a0d55cacc65f3e
+:0157e05b4c1eff7152760d61ea32e5e6454abd
+:0157f0ef1b73899bd34b9fe319866365e54262
+:01580041f8357c28178395f2130c9a84aa350d
+:0158105af989ed6c14571945a10fe09593be88
+:0158208298d6aaa576de4850f63bfee3df9bb2
+:015830f7c0e7de4c72409f9a00429c09f00909
+:0158404273fd4a7d98ba145bfe5eb6fb1a6e2f
+:0158507d4c98cbdda7866982cff7d9d7292884
+:01586045d7d5452f760e518d7ff46e04dc38de
+:0158705b5c2e2ef5332c32dc7bdec3f3870ffc
+:0158807cc9956ef1b576678c2ff140b6ba4612
+:015890cd9414593aec0dec32ee6aa66c2dfe7f
+:0158a0d1fa2af4ac0e5edd1cec42b80cbd7b78
+:0158b05f3e0943309ae5fe2828d281e6ee4fc5
+:0158c00e4d9c5b7204016af45a79a58c87dcc5
+:0158d058a646fc8d645a233ef23dba5089d2a8
+:0158e045a972ade89a0aa273a1065fe2abd884
+:0158f0825a7ce1010a65dbfb66bf943f10b587
+:0159002162b0bb60805e879b892b6150f31284
+:0159105d4dcf75e76d60c4a81517effe6ad6ff
+:015920cb6fbd395392fdcd619cc35c5938995a
+:015930f9aec39a6fe871772549f8e04f410e72
+:015940dbeb8e7ced88e155c466b9fdd33e7726
+:0159503ae394e64920628329d33b8dff175579
+:015960393b960eb627dc83958bb265e02d50db
+:0159700a7724eb475ab21c42e5009f87597795
+:015980dd6114effd3794182726019b71b20f9d
+:01599067e9f3c898f62a25035fa0225ec06cd0
+:0159a0b4022a16e318f02f72ae3d1394334371
+:0159b06a5cfa40b604c0b0e428e5a575b02ccb
+:0159c0550dd1121ffc9a0e2db90cbe72995300
+:0159d03103ea0cc5f1cd91d7b234ea000aa9c5
+:0159e0fdea34db4e911293aa1c75207cc9cdbb
+:0159f0ffff95f4e4bd6dab319705e7c2fdec59
+:015a008b82b1740107c58bfa3db39e82c120b8
+:015a10902ec2d3963d481ac702825f308f5860
+:015a2019a445325abbda679614876a0b579897
+:015a30d63ba8e0bd1c818d7d03b8143f22582e
+:015a407220eb1eec8d4c9b0c129ac64c6adc1f
+:015a503d48188cb2de84acdae8986504839059
+:015a60b76d03d45e4c1a76d8826b89047daba6
+:015a7021c991ed1bbf379a7041cd57572b092b
+:015a805402c324c791cd11b23c6907b6b1deae
+:015a903dbba2dba6fe7e77d09f10467a36995f
+:015aa02c45497fe3a604fd4f78e5c92afe8ead
+:015ab09e23bbd1cee32ba7d36f45bdbd3a02ee
+:015ac0a480ad88b67a34915e875c5e146febe7
+:015ad0a2213dd97c5619af6afd9053280f67a3
+:015ae0a1cb05edae2c9a93fe52a9f68cd284e1
+:015af0346eb27e94dd00c85361086319ad7cb6
+:015b00190aa8fd7585e4cb39cfc6bf63517029
+:015b1069b4e302a7abb1b12a7b3890d77d1290
+:015b2005441750137dd5658e5495485d181a92
+:015b3052aa4fe2d15262f2cb0a62f2e1f6ba54
+:015b40d3de1a59004ac18c9a5c3244607c9521
+:015b5039f061d5c489467e8048ca23d0d233e0
+:015b60f76a4d067a32c2f1a3e8a22e6cdaab20
+:015b70b2aca23d9d796290288322616bb39a41
+:015b80e5e14e021d720d2e3e4647a8d258609b
+:015b9028e2fbfd8c6bfb3b263fd6bca8553769
+:015ba0e5d7a4eda6223bd69deab460fbc7fc3d
+:015bb0779de5ba6f8aacd87ac38dc295d0f2aa
+:015bc0676e11fa0bfba60bab33a3307e6b916a
+:015bd099c9eac0f4b034ae6c949363c18771f0
+:015be026191aa2a767c05ed2ada891680f420b
+:015bf040ececba03ca4dc1a39b2b1795e513bc
+:015c00b6e5db6d5db31dfca70802f0910c99ef
+:015c10e8e0bef1e4df5be8dad40f5dc85d7658
+:015c20073973ec193e2aab28005918f88c05c6
+:015c30b0893202212dc0ae17acad79e2fb8566
+:015c4046227528b68b3a6b83791479f5ff4c10
+:015c50628b2f31a6fefaccc3cdcdc35f42a238
+:015c60486ffe39de232a3046584a115ba2ee39
+:015c70d993d5abd6228f791256511dcc3f978c
+:015c80a6152ecc50bc5094fbff783a7cdfd8fd
+:015c90868e0cb3ca0da55abea3b64ce4807c5c
+:015ca0d828fd3039a4b92b88eb5e05f4444b1f
+:015cb0b2fb80c4f1265962850331c3fb43baa3
+:015cc07c5fb91f09ea316510b960b3b0b13148
+:015cd0c025086033fb645e784896e6697ccfe6
+:015ce02fb59941e044b259324e285992e16ff9
+:015cf075bab827982222472945775e0a5c22e7
+:015d00a1e06e7f827d8f47515ee63ec356028b
+:015d1086bc39a0b17610f5cb7d87da2e5cd841
+:015d20e8035737ce59fa0477e7affe478c6f7f
+:015d30320d71422868ee119b801d09bb5bd411
+:015d40e12f4c152584415346192edc8c0deea4
+:015d50a55cccf3b50e0133d5551b9d2b714dee
+:015d60d96542c76589c6854d781fe03b647184
+:015d707525273d478619420ecca0316f2f51a0
+:015d80d010b0c90589baf8545d8dec0572c07d
+:015d9033e2a1c96206639d2ba93f2ac732c2d3
+:015da01dff7dedd76d7e77792eea89fd97257a
+:015db00c8f30593bd8ea3978dc83b664ae7935
+:015dc0656ade38d4afec4538fbc0b10ae18e60
+:015dd032254bce0037cc462b760dacab446e64
+:015de00b05500371009d7795890d455cd4d0dc
+:015df0e35d33a51eddb6a21853e1f7ead7facf
+:015e006d2843446b1883f55a0b8a34621ec3be
+:015e10cba6825c78f8fd47f6302acaf917c50d
+:015e205828aa5a9639165a88f6242d85014f1f
+:015e301db5b45815bc7d12ef7364e4710883b2
+:015e40c162522f826b934e26894855f711d25f
+:015e50b127d2461895d289c704e7de4992e7b8
+:015e60a419d8b15be119fb433b0366d7b5a64d
+:015e702b5c9001288373bbc6af222d7149a7b6
+:015e803e41902ac80bfbb968019fda30108d3c
+:015e902762afb39ea153b0f9417c0feec43b26
+:015ea06abc06821f91dd011d4908ab3366788c
+:015eb0e70b42554f81ca109e1eb979b9df8b9c
+:015ec0737e0c347783c18fecdd034b34663b50
+:015ed0afc3208e4adcfb0f727863c7dce2451e
+:015ee0c0208efac7ae20f16393e6f56aaff3a0
+:015ef0f0e15d1d60c2d3f5c1f2d366ba093c68
+:015f00b0c713591fd1668777e1359c1548af03
+:015f101e77cdddadd3b59c581acde61a03b897
+:015f20cd0eb8939d28324ed8c5bdd2644bca7a
+:015f307c4475cfc3c89f5acc1ee84bd8a0b6d6
+:015f40a008c8b3b2b4ff46c750a53a24352bb9
+:015f50b8b1f2e851dc0d73a672e6fb40851a5a
+:015f601dbea3eaee587289285ec5aeffe95e7c
+:015f708978537b705aa40873e9a650f64944b0
+:015f809c453fee0044d6cb104e7e99c2f5446f
+:015f9009c0c122ef77cba6eadcb3b19e72b01c
+:015fa015a1b0a367d4c3fc1caa94c3d4f33577
+:015fb062435305516297b8efdddd1dd357a104
+:015fc0b18c4c4bdb7d8074043228fb59ed82d3
+:015fd04cbf10913ee2073de7dd6f1c80eae7d7
+:015fe0d3b61ad7c74556b5de58a6372ea00be1
+:015ff01e72592614848efb5b59d42f2de20390
+:01600086026c89ee3fcff795ce2ec1028d885d
+:01601027c7282f96ebb42494980fbc517d5d8d
+:0160205851dec8f4ff5e82cec7ce6fdf0ad6b5
+:0160304ceb81257a7c9ab8259ad6d035920a98
+:016040d905b2437e880792025cde3d07d75dbb
+:016050fedc003ba025b409eb899179d586ca7a
+:0160603929af5203fb3dd837ccf868fcae5d1a
+:0160706605342501fc4f53f0940dfa727e2882
+:01608034385f122a4b731d3b690102fcbeb3dc
+:01609017008f35bbedcc98b839cd49bea4b10d
+:0160a0d6ac0cebaae46b3e8beb04d5640f691d
+:0160b0ff262af4e8df3d0ba9f20c0bb0b581fd
+:0160c07eb2df342c84ee03148f3708bdea0829
+:0160d0c28b96e72789916ddd000a6a5f858a6b
+:0160e06b3e8266b7efe5ec3cbe6cdc340e2e24
+:0160f01737f1fea7a75388056fb43696db1a4b
+:016100f3455ccaa0a667ba53e86430d5c91240
+:016110edba73913e143512f627f2e8769bc3c7
+:01612039374380d40fe9e48f5c4e6dd69d189c
+:0161308354121daa5943d1d889934c182cc988
+:0161404f5a88078157d3cf24b068065d9fe0c1
+:01615054a7b10703fefca82bbc0214128ad7ea
+:016160208d5de7fb57674843b1c1b36ed9ccb3
+:016170ed0ba0447c7eb9642ef52f4d0bb4cd49
+:01618098d388577c8b3091b01cfe42583b2a54
+:01619043e3e76d513d9362f62fde37f6b4ea27
+:0161a08c318fd646f64c9a55f33633dbefb5e8
+:0161b07256b72ce7d3e95b421e725b341fb1c4
+:0161c0b07b789121d3c4b9e44487ab3cd3232a
+:0161d0db38e32de3ad68d704e7d8e949c11a35
+:0161e0731441009908fb8984cd3605fffce55f
+:0161f02aa216541c506a3b00e4ae8e8849702b
+:016200e0c8412d17dbfd03ab9cb93fbe68ae37
+:016210daec0bd7ceb576fd4356411f43fd6a84
+:016220f4c3e54e56e084a8a32ca28c12edfd2f
+:016230e434fc149c6ed717f76ba47f4b5af7d4
+:016240c2ebd05c57d47f82ea3324b4c2ce8d37
+:01625067d25d0c892bb20e90262584aa3765ea
+:016260e8056c3d2bf19e16a5d3908b68b0deb0
+:016270de911bd715c9f519af80e9e8700bf111
+:01628081597155ef71840dc8f351162292fda3
+:01629044935a233387a0e847ef550f7d543fef
+:0162a0e27dbe7c221b423dd21906f67c2274bc
+:0162b0eedd5b9661f8a9612e4f861c5eccf031
+:0162c012674adfad89cc96acf554867fbb86bd
+:0162d072798c1f727ceeeb5b28307842797a93
+:0162e024f5272e90408c8ec871c14ab2a86421
+:0162f0dae884d2c391b9a18258e230aa8d7d39
+:0163003661e3e5a0acb0cd33d8a52cd9f300e9
+:01631063b040e4b66e5a0fec078edcef8bfebe
+:016320e55a136ee7065621e61eb1b790115078
+:016330e175a15e7817d34f6483b5995a0d3511
+:0163403eb92181f5853429ee5149966c15df12
+:0163503b0113eb3b72c36e684a2400acbb7d33
+:016360c8773d11ad9e7b3c9647784810b16004
+:016370ccf1596f7bc9f572ad35c256db9b6bce
+:016380d48b3c32b93bed6c21cd49e07354d59e
+:016390c1e8da37a1246c39d0ac9ed8a1e9bc05
+:0163a0b784c5990ca669d6bde277e11e8d44a3
+:0163b00b376dafbf98bbb5c3fcb921c069e73f
+:0163c098d057d5e124dcb7e397ccbf0f3c6bb0
+:0163d0e47faf37b64cd326f7377a66367a62e2
+:0163e04f44926b532c47d3234cc3f71618c768
+:0163f04a65e24710ba720b6e46f34b12eaad67
+:016400290aea4d7f64de08175cc0b7ccb2e038
+:01641015a38f9136b7fd385b83453ec8ff96ed
+:016420afcab97499c5688cf646b7092d528e3c
+:016430be4b5b24cfc50843c569790a24a84354
+:016440d6e05528e24a2a8c1489ac4c50ba37e5
+:0164500adce6deee91d72e72b13b7e9a9831c8
+:01646055ac4d9d94b557f8734ac6889e0162d2
+:016470e21dd5f1fb31317fb1e91085fc233efd
+:0164808810f7f31892b0498c38fcfc82f2cdd4
+:01649016e51ad46f0947af5974ec58d0acb105
+:0164a03e491d60dcb6b15eb2c74982a23c52a1
+:0164b094014bb40adaf80ef91bff0f2ecdd556
+:0164c03f893b6c87f2e9815b50a2b3519cbd61
+:0164d09366400dc015f38c21e23669ba622a3f
+:0164e0d7828511614fa5cb5171caf0c855fd10
+:0164f0b4d01046bf2f1e7cd0b021ff48bb0d79
+:016500e8e29b21a08749b4757843f04a868085
+:01651002abadd06502c84e5ad61ccde75de7f0
+:01652099f7f5ebf6755629c8c1dfa3d2b3a7b8
+:016530fec983532ea12ccadea7e44f833d88b2
+:016540603991fa2c9342cdf835c508797fd349
+:0165502045a02a9eb21938b0231462e48552c4
+:0165600bdbb90f85246d619dac9c39b8f86ca4
+:01657000b431c331ae90daffcbd667e24a5123
+:0165802ac8916a09511dc70114d266766c385d
+:016590955f21af8179f2a88a0e8f32c4cf5ef3
+:0165a04d553fc5094321965fe5becefc74fd64
+:0165b05878cf8d275709f370c1e7ad92938e3f
+:0165c0c8514c2f88a2e282354008129cee50d9
+:0165d09f453213c64192ef2200c8316a2440b4
+:0165e06f0ea0e492296a1c88df625667f44a79
+:0165f085790b27126157254bbdd70cc6606e9e
+:016600051a24718f6e4632cd914989fea1a799
+:016610d73d60bb7fa1c30020b9cd81de4e0687
+:0166207859000f3f88f4b1e2ccafec2aa44535
+:016630730daf7d488a4f816805cd96e4a00b03
+:01664009233b89ce8a98d127653f7858731320
+:016650ec57dc4aa362fb31b3c7a83fa0216a36
+:016660921bc52c4c94c817350597b65931e0df
+:01667052c2a9bc086befab994b944c4cc17558
+:016680711c0772704abd193913ac255ee92556
+:016690604e7bb231de08dd5341fba9f5b8155d
+:0166a059accf9bee0dcdc24c6d419baad44874
+:0166b0321592972762c96ef68ec67237babbc1
+:0166c000151237e8c536eca9e1bc8011f1aafd
+:0166d0a7c0a57d1515e789a5e0a6323f81c5c4
+:0166e05dc275dd9a37fa2d76c6c6205f9e7f9e
+:0166f003be5307d810f3470b75a9cda12ce137
+:016700ddd143761f12c708ee64193f2575c57b
+:01671019da162344d0f94f8042211df22292eb
+:016720f71fd2ddb91cd439f058b93738dba6bf
+:016730cfc35010289f7d1d5d37105f19490cb6
+:016740d74419a92c00e1eb0ece8bb2666a0d1c
+:016750f0767e483d89a10b18a519d3a987ab1e
+:016760e8433d73bf786eba836d6804aaee0072
+:0167708bb8258c347b7c607a2e7a192f70bba5
+:016780d3e23ef96caa8db84658297a9981b123
+:0167905b87c91abb0c49fc87a22b2a2e003606
+:0167a0628d7ea0e45e38d18b43fb5415d304f2
+:0167b0e58340e975d13240b758c7e2e0b384de
+:0167c056f316720d947661bd02865e97fb3702
+:0167d0cd5832a01c60229a04aa7d2e307da508
+:0167e00ef4b38069b781f83cde096ea85cb4fc
+:0167f081812df44b53898b45f40fc46819883a
+:016800ff33ffbcb738c408f771de798fa5c741
+:0168105b16674ceecf337a26a96a2aa3a7bedc
+:016820a2e8a8b3f7addec425600cb2e4da72dd
+:01683014e9d9b4b45bf3e5a50f7a8ccb53bc91
+:016840f635338062064c7b7882e914ef499351
+:016850bc0d2a3988e9f7b89fee65b88b696e15
+:0168602a43a2d297460af072e5910ac76d346b
+:016870913c52d3b680af61e2e8aa01fdb2bba6
+:01688093473cab5274b6e622f85139841c248b
+:016890300cedcc62ab737e9116e70bcbcd9659
+:0168a0a8b6e882e7be3db3a1540686ccc149e9
+:0168b08d05919d63afbd13cfdde03d1be20489
+:0168c05b50d6377f6187201d67382c15afe2f0
+:0168d064dcfba11ae068fcadc39ae4a6fa2c93
+:0168e09ac6cf368d6986db783f6795b8f10262
+:0168f00eb7fcfcd0fbd94f97b7064664ab07aa
+:0169002260e94470c473a5bef865325d6dd123
+:01691051293db171f6025e49025b454d621542
+:016920c0d6714301ca13e97c94bb7f56e144a2
+:016930b8d9a52ab9ee853ab9b654c7930d67d9
+:0169404a397de82fea79a08ecf186360f40aac
+:01695095b9b8ed43ffccd30a00ee45999af58d
+:01696061d98bff2a5e9034aa0e5e856e0bcf6e
+:016970eee3858e6446810fcdc64a6b9b70161a
+:0169801cda2fb4118129748aa75e48a69a79d6
+:016990a3fe70a583e52ac81765d22d3f85ca98
+:0169a0db4b516985d71a456fa157f4beadca88
+:0169b02d1b935209808e4654c2b8a77f936de8
+:0169c0ffea8d2265fffa5cebad2f8df3038a06
+:0169d0b97617338c880270d0e4533b10ff6586
+:0169e027d6c328d7482bc7cd20c81af02099d2
+:0169f015743077d10042ef1f118d1a3efed318
+:016a00aa8878a2d06d14e8cf7c39af77a4ceee
+:016a106e762cd293e9bcd3a3e780f0d4d7ee18
+:016a20e23f6351abcc3d274a3d1e90d9ef6b91
+:016a30e61ba35c95ed673de79fc8ba90138340
+:016a4012e18020194738ded2047b5471eb1f84
+:016a502067412a33c1072607722b49f25a175d
+:016a60b1c4a311ae30afd6d47a767568b8fbb8
+:016a70d503c4c2460ae3bc7f9cf8c80e10747a
+:016a805dedc1dc87ac8e7fb6a2fb233182fd3b
+:016a9097ab28a5486c8c3a456a3ec2f167e6af
+:016aa0585d05ef9d329fe76382e797e5a3ca84
+:016ab04addcb3bfcd071da621fbf289c193adc
+:016ac0cab6b52a3d50173daf1232a0a3efd7ae
+:016ad0e42105b8285164d2760aa64d0d818509
+:016ae071a4f823a5d13e3015b7ee9016a43e2e
+:016af0fc45fc9b41469d0c4b39845df7e85edb
+:016b00a54d69a258a653d0bc4d43fb7a5e9100
+:016b100dea8fc48ccac197468e53cfecd25884
+:016b20de3273c0bf719c7403b22769ecb0f782
+:016b3051a49f73bf8bca271ca6d5696c64ee7f
+:016b40afeb50d1dbf7c1a2aca529f556533da7
+:016b50f5c055efc9adffaf3a36128004711f7a
+:016b60c988124c7dbf5071496c58fc8960ba88
+:016b7014a8aa6c485741a1b96812de94d31ea5
+:016b80745b7f2bd1f6c763be666856520f15e5
+:016b90be148c68d43416091971b656fbb345e2
+:016ba0b9d5d4ce1c3acb2cd014b1ccf3237af8
+:016bb0af4545a66e43438453b076edaf569cfd
+:016bc0b745a4118b5ebeaa336019b02b743544
+:016bd04e2acc5d3bc1b68d626ce6e63cfce097
+:016be06b63676bcc04fda059a11f9d0414c4e0
+:016bf082976d2fb0572b9427693de941d02037
+:016c0015624a6065c83e7c545d912cb5198dd4
+:016c10d188d4384a26177ed34b20e8f6080f79
+:016c20a41bdc5fe6759002cf3b37d52bcc66ef
+:016c30f0958199e4bf86ebbcda7952abf79a44
+:016c40f2f4068460c4f1f19febf015893de7ca
+:016c50b60b7fe4beba191ff6eba61b262acb89
+:016c60d8817b38a5e96af7b67b19e07b971057
+:016c704cf85bf37e17c0d783466e65802c097f
+:016c80e97e01129b127312116e31642af4a83e
+:016c904c5a7cb6344c2899d686e5a54d4364bc
+:016ca0fe82b6c3ffe4f9df95ea354eed9ee3bf
+:016cb00012d82c56b0b0204add1b4d6288690c
+:016cc08f2ba159cc55cee3bbb53fbc2345938b
+:016cd02f8efa5c38881a3f03cfebd11f00008a
+:016ce0c6540ce6b770e8f657ffa53153170a0e
+:016cf0f24afe609aa30b24b27971f231e47294
+:016d00295b76da8f2500d601c0ccc6566e3445
+:016d10fad0b96633e8b0e8c8eb2c2da26d52d6
+:016d20011f69ada6fc5f4166b9ba9aff9a4e47
+:016d306105191990e124bfff64689e18e82dc6
+:016d40e5cbb144042e7084bdab0df34e7c045c
+:016d50b5373ea2bf51d76e98aff8fda3d98589
+:016d60a787072aa52ff32f44128631e103d568
+:016d70c0e2889d8162cd1d4bacd3969bd7f222
+:016d80dd3ef071d3b3d86b3564bc1b226ec963
+:016d9052e350c982a1bdbababdf320d3d5c704
+:016da09ebb770104b05ffd90fec90c8ce508ed
+:016db07b8a566d11bbaa72e838429d92b61403
+:016dc0b7a93a56f63c12d19cf693e07f120093
+:016dd0b1f2bf2719b1bae2a3f8fd7f5b4eabfb
+:016de03b882f4120f0ff70085a4b6cf6c1a358
+:016df0ca65e2a2db488d71176a400c09d7174b
+:016e00ccdf27126133e200074796957edded1a
+:016e1002d97e9f12af29d1698407c59619ea1a
+:016e20e62c768f1c5564e4330b4325a103be20
+:016e30ff931ed5679f3ee528cfae02238dd6fd
+:016e405b83842a8895af0547baa71bc1a4679c
+:016e508642d5c227b610e3ec61398fd2adc1e6
+:016e60b65d0e071971100bf53461308ccafe57
+:016e70bae53651d51fac8947964f9db3107ffd
+:016e80f29f64557166a9da8f0a41f8b516f9e6
+:016e90b2edc073ad3fec00cd338cdbd8c9e0ec
+:016ea02ae43e2e36ff2cf422ff3e5242be5cf3
+:016eb021f1b4314a6d5e0ce545283eea20996f
+:016ec0363922cfa8cd0e9cd51f9eb7ce38b940
+:016ed03a7ef33239d55ec74bea65e9d4b7da74
+:016ee0b5455d4cefb7901167e9ac067ce68197
+:016ef0d5b0c5e8994970f13373cddc3bc9ecea
+:016f00ffb9e8b72c852cd04ce00c9f167527a6
+:016f106130786fb3de9c6ea72f1c1feadc1129
+:016f2019c4ad273b9c4fc15ab3ef19d2a53d96
+:016f30277479b3fe48f6fc8256dc9706bbe60a
+:016f40ed34c64a3c1ed1da5f890e83b27c14de
+:016f50cb6b5413e08a20f149396fbc6dcf855a
+:016f60eedad8967f9e70566977c323ac60088c
+:016f70e2f4424040baf1d54c7c9120ae14d44c
+:016f800df40dfa362a4fb7523b001183a703f9
+:016f90629ec4d52da3cdd0d1ccbc9d9cc1a903
+:016fa096a5bfa75c235391dc057fcef0e1e9a2
+:016fb0ce00865c5c64c65da42de41e489ec279
+:016fc039e82958d3ab2804fb4e865f3423e334
+:016fd07c5995f6e665dee5518b31a7a6e8879e
+:016fe0806bc6b50dcf4e16e9128f4500c002fc
+:016ff0162a34c11c1a307dfabc2f93fd46665e
+:017000eb5b51aa339357a9dab8c6e0e4d3bfcb
+:017010332bd8ab26dc675ae285e8f77219e5d7
+:0170205c6b232204bc000c5b1855ef19744447
+:01703090c2ca8a591857acf010787f02150728
+:01704088e97539993b93755f3f0c4c4cb718c6
+:0170500f8b467cf6029adf43958186cce3e4fa
+:0170604d944cb72d8c876ed939daa2c005e90f
+:017070933fded7462d7eac362f31b0861e92f7
+:01708071ee9fa3e4b323b149d290fd9974fca9
+:0170900c1ee4d00bc4d55aff30e0ec7790cc00
+:0170a09a6f69bd9f12220977be39461c68543e
+:0170b0906a900ac83774cf39d5e172214a3d61
+:0170c03b5e7ae8f1b63df793a299d703f5b0a0
+:0170d090d084baeef944f1e052ce37852fddbf
+:0170e0c169811e60dddd6c8dbc1349bb52357d
+:0170f0f03bcfd9e18c2abbdc890f382d6a69bf
+:017100b4da36d9f17780baa94c88282c8e927b
+:01711072e8289fd1a5e2f1e9165691fd76cefe
+:017120f3bc8bfec715109825d7c42fad418e0e
+:017130aa38e2f17c9a5768a8fd773f977906bf
+:017140f22d22cd4d08fefd436870b1b0aee067
+:01715095727f98942343c370b1d776d78739a3
+:017160c65a4dbea1dd8401d736210a40da08bd
+:0171700caa74ed53d798153e3d1d7bd593c36e
+:0171801b8dd94ae09d4e352deabdec7003715c
+:0171904a35041170dddfad2ff47caf1b18d57d
+:0171a04d078f4a0e94dc35399487fa745f313b
+:0171b088fd9a2ac0e251c09a32fa321bdb6d33
+:0171c0e7c53d75a6b5e335e73cd93104c6d037
+:0171d0453bdc322e172148f6e3e8ba43c6fcc4
+:0171e0c4a7d0b9ae25f810f21d67b8d3c4f172
+:0171f0d342f4f6520a20bdaf163e17aec6469f
+:017200570064d0fe7a0e4fd9e66b22788b730b
+:017210328912be27e5e9ae280c2f12f9c1aa98
+:017220bf0ac3ae19aa34e51bb05d786061f3c7
+:017230df803a5a1a78460d52ff0a4d8c89b862
+:017240a3ae81f03dec553adbb546a1182fcb4d
+:0172501f543f6e770a1a1d8679b4c91d1e6c91
+:0172609fe5d5f732dea589cba3577dcc1380ed
+:017270dcebecac5b07afba06c2f2b858f8c59e
+:0172800705aa0366f4ae0508b073a61ad9c1e2
+:0172909303331589fbf2eaebdefeb7bb11c4c1
+:0172a00f93812efe3e3a0f996c8f327e9a7f70
+:0172b009d025451fafc96782507817ad5e26b5
+:0172c078ed599ca2ec1694510384d9a00d6a02
+:0172d0642a5fff664be0cf24bab932ef7c6485
+:0172e09114f6be3511bbbec620fa19e7fc7771
+:0172f09364e43a48949891e9e10ff5b14bec00
+:01730060bd8e449f906ef2b64aae84e7a9df2c
+:01731048428fe504ef4517005ccae7bc28694b
+:017320463376c4031600c172885d1483af3c38
+:017330ec8407309d2a25058a41811a0d35db96
+:01734084da32c0ad6c183459696d654e866a4e
+:017350dbfef3fcaa95824d66c394fa36466a23
+:0173609e642ab1488b4e3045c5abc1a44c8b97
+:017370b6f386c8bb491a065a473c4061d67fee
+:017380e9eb45b2fa77ba245d4c8092ddb8123a
+:01739084de0e99c5543d7c0bcf34803591037c
+:0173a01aac208fdd5d86ad21fc0c1d92e01c6f
+:0173b03a8bddfd33f2c091e5d446c9d167d983
+:0173c0ca24fd1cbe52591921adefee10532319
+:0173d0d2d68be42b54aa5005ad07e167c1f8af
+:0173e00c412c40d545c8e5c9b81be83e3816c0
+:0173f09a9a626011945aedf5a55beb6965947a
+:017400b50535b97afdc289855fd1e9812aa1bd
+:017410c24a4f065f4d7b7732472edec142e561
+:017420ff56c6c2e7ae27bf3eed8da3f2b10973
+:01743079c091a491c30ff95c199e382a6790c2
+:01744086d1be39b6457b280a45bb05abbe895c
+:01745093bc990a2c83a67f7bb166424c06a070
+:017460e898c5d0c0509f9937aa6962aef66e85
+:01747098f546147e02aa181aad2750c2c501ad
+:01748037652bf94c3cb19e9e40645cd465294c
+:01749017b17c443f670a7c87c2e02309adb553
+:0174a08284504e13dfd2448c7f4fc3d217e8cc
+:0174b02da9703f2c28a7f48bacc147d73304b0
+:0174c069bb54e06c1c4eb8fe4bfc9148204ddc
+:0174d03b9f4a3dd5e9827fac4f029afe794296
+:0174e0311bc5f87e3238589222f32bc951ff25
+:0174f05b85dadb9f33db80466a7ef385f0ceb0
+:0175003f7be6e668682c8f2e98d8ce00c09741
+:017510448bfa7d5fa4be4df7220b266342d1cf
+:017520958c758bd172b0830909be0ad3de02db
+:017530d3caee8101145c50f78b07d4ffdd511c
+:01754092b048c622e5db5267dc1cee14e75c4b
+:01755094976fd93250ba034d928e51729c7a70
+:0175603f940ae8c9f31b6f6ee7e70f0ec19003
+:017570fd6e27e4bc2319ed5bea474a2fceca46
+:017580986046816a575f715450926761b400a0
+:017590e84579fc10465ccdb23431bb13e3d1e9
+:0175a014816fe6615f9ca5b9e2263dd6e67f7e
+:0175b0cfd81501a9e51b34cca1f650aa69057d
+:0175c0f570dfd73cfed40b0ddfcba6d5870675
+:0175d08e2956d93a3dcfe36b80fa4c9112d21c
+:0175e07f4ab8b7cdadb72d017d653c6edcdbf1
+:0175f064fe750e65cb90a205743f31d50dfc2d
+:01760096ef0c4d712d7dae775267484287104c
+:017610b470c70c5de0c9c0dd61d6c168167a10
+:0176204514e417af522868aed79bd65b61f849
+:01763028d2d0cdbaebd692adb34cea1bd692a4
+:017640341c00cfda56cdcca1079aec8b42089e
+:0176502d8746cc1eca94edd903190fb0bf9412
+:01766041a1bc8e23236591ce69f99fc954bfa3
+:017670860532d77938cdc2b90a6e89b28f911e
+:0176806c9cdbeef8faff228cad40b3859045c3
+:017690f2faa300a9a32be3479a3af0f93077e0
+:0176a0c0c7c8ecf43aecbfae4acace3de73e84
+:0176b0cb7684f7bc642b51132a0dc4414c89bb
+:0176c0fd3621cc4daa6a13a892c68caab66721
+:0176d08a989f235c7955ebc26015599d1fbf7c
+:0176e0ce870851a666a2c6e9b57366c8228305
+:0176f069c4e4edf727ed46f81d0f1cb24e8082
+:017700d82e57d2da96770a7669592777148b94
+:0177109caf088a9af41f96af81e94218f285f1
+:017720158dd83adc336cea8b7dd081012f558b
+:017730cbcbeb6f0ad256a867f0c47bfb1d8fb0
+:01774019d5cee9e736afa5f06512df5c7800ba
+:01775046ed1e68a0f32bb323268bf1ccbac0db
+:0177600f460c4c2fd6c978c55ef74966139dd1
+:0177706b1509e742e3bad4076fc9a05a26789e
+:0177802249d89ca274f22e4ec3dd10dfc976ad
+:017790354b8391441ee430936be4b74c1e5ce3
+:0177a0a60d2f76f153877f2f536c8b7ab62d13
+:0177b011ae27b7e9ef0dbbb06dd0d254d9a092
+:0177c0bbef101dd7663f9ee1f118adea61dbd1
+:0177d0346c2c5f803073e1eaffc478b47e971b
+:0177e0e372345886379e24ed7d68041127d5b0
+:0177f0d1abeefd0891162cf6f25efe24bdb953
+:017800294a072b088e3ad04f47d2f0e7e53903
+:0178106e592750e14e2bbf4132891e7c8feff1
+:017820aba9020260434aa815a0850f4f791ccf
+:0178301bf20b7cc8b7317a3c2bc5f6f30c6872
+:017840f70381660292722e121dfd5fd4fe4c5b
+:0178503b098d872774d14d4f03124154df5bc2
+:01786029e17c70f11bb3e1687d4fc272462482
+:017870e384a3b5883fb4fc69d99b7d06ba960f
+:0178809d181610044877e1a93e68777d531313
+:017890133ee9caafc9f8d0feedb20069375b5c
+:0178a03bcfaa59ba77fb14fdbc68a696690ba7
+:0178b03916871eee030516ae40ff9dde9a621b
+:0178c0dd10a98b1a7680c8edb0b6d8b6408983
+:0178d07ace514b265824b32b8613da2f3d3c8a
+:0178e0bd349674a58245c7d127243f644f0f3e
+:0178f0cc6296c12379785e7d697372f0bf64ec
+:0179005a0b33504b280740fc9b511051b98d38
+:017910e7f84839eeea9e4962882057d6b23cba
+:017920a02f28aa39dc6bf19d0cad1609b9336e
+:0179308d9b7ae896de29e982095f8f94f07b14
+:017940dbaff75b349374e37c9ccae28b7877e1
+:0179501c67e43461bf645c88b60faca28dd1e0
+:01796060ac736b409a918ba186374098a3083d
+:017970f56d50374ee4e1588e06d2d15c72dbf1
+:0179801252aba9308829eb2351fae56fec8a69
+:01799000f7a568085f7039b0ffad15ff7f8d00
+:0179a0bf4a570b306f6e94e708f88ed0c95595
+:0179b0c338023bca9d36cbbe99caf995b554b4
+:0179c09e5729f7c1f2ae757e8b4f1b02f6cc0e
+:0179d0d787f86f8deab0d1305c8861de070102
+:0179e08f4ea8d63c0e3e50fcc8b15b9b1829fd
+:0179f0bc26d006d83b9766cfd65500c78f60d2
+:017a009a059ca5d27036130747e047126b451e
+:017a10ab93cb1c09a5b777742621cf182fcef7
+:017a20455a271c622393852fb23948787bf1f4
+:017a303a1fd35ba0aa5a3b1ab7398c44dbb5b0
+:017a4082dceb8ac3247149fb1cb568bb6e6a95
+:017a50cffa16b4db03257586226552d42d0358
+:017a600bde6cf9965fb038216edd301eaf7d20
+:017a702bc00bfa7fecf5b0f605e570a82e41ea
+:017a80815470dc38b6b9981e566f7d06168e5a
+:017a90cab82c60d7fe931d1912284988ccc8fa
+:017aa07eb8eda877e96f0382a2bb93b9139ca2
+:017ab0d52cc52db7f7a195143e3092341bd404
+:017ac08fb14479d8b9d1d2c5a8e80c44689f87
+:017ad07201b5746de003b645128bd095b81b7e
+:017ae04c83863d5fa61818b47c1a80afc23a8c
+:017af0b2c8268987dcd484f71506d45d111eae
+:017b0044b964f5a49aa96d24afdc32a9733a0e
+:017b10c4c085b5e06c2bf2f031c4ad7dd9c339
+:017b2002f6208c21d5c523aaaab6715cc5addc
+:017b3056597cf702006a9be9905b502befa48b
+:017b40196f50fbd40c7b0670198e8daf1d3524
+:017b50b276db5d03a0c0c3b1d0a8c7f3f6b077
+:017b602421159e810e2c035e6ef3cd0eb6f541
+:017b70954f923d618802563ebc97596e80ec69
+:017b80c9dee9d247476c94bd641b6097c7095b
+:017b909e63f4050e9f0ba8405d82971b0e3c48
+:017ba0a67db6b47386e8777de4910aa246c03b
+:017bb02604670f7a3799038b12c40a7b672940
+:017bc09cadc0fd4b666185d97650833ca67bb3
+:017bd04d137dae5e09f4a6aa39364b52afa3f6
+:017be09545a2a7021696fb023519843dc3ed8b
+:017bf046daf4ac70f5c9efa67bc017495e1f21
+:017c00486325624a3ecc4de797197a493bad8a
+:017c10f56b923384fbf47d0eb54d361579ee5c
+:017c20951bf038f9bcb589fd1fe64821b6db28
+:017c30ddc55da1a13bdf7e12cef6dee39a3827
+:017c400d560bfe2d1ca78032645279d21023e4
+:017c506b007e1efaea951a045e8c1c18ea4eb1
+:017c6055aa37320bed5bdf7e06561c9aea30a9
+:017c70372847c657f61eb1eb45d93180aefedc
+:017c80a87696406dd7db1adafa6f9f5d45aa50
+:017c9057a2e8c573e1942f9d31c641412c8792
+:017ca0eb199f5e7b625fddd74fcaa74ba7e2c0
+:017cb008d10c1f74cc92d1cc7a29e913bc4f6c
+:017cc09b22b8367312ace3c590031e17e46bc4
+:017cd0b628730fb6bde1559d66d01422a5b82c
+:017ce0f3cf180aa667f2db994472392992ae4f
+:017cf092ed8875f0af16864e09ddd24693bdab
+:017d001d5e902b50de03d5e981a73f8dbe1ef9
+:017d10520076d5b72644f8a9c7cfc393494faf
+:017d20552018fcd0e324615a3631b49e2288e3
+:017d309b7c51fbb7aaed11c91632ed2457659a
+:017d40a2863fe5687677942452af3564007478
+:017d507bb0f0c3fb6497bc1eb1e8623e0b1e5e
+:017d60fb502468e4c6dbbd51a9a78730ec29e9
+:017d70a4a992a0e84856b181de16dbf6bfc08a
+:017d805441b0d466ff6f0098c66edde1c3de78
+:017d905365d7c047e46ca6e99ff953b369edb9
+:017da0f71d0b3fc53fb8befd5c7a6a957d4ae1
+:017db0bde847437b4f2a701b507684a9903a1b
+:017dc04642615ab30862948f11096a6cb0d38f
+:017dd0800a292456768f5ccf1d8ecaffe1f7f1
+:017de00c4d0bf786d03560aa7139fbd1d8a25e
+:017df071c420ce7bf72d7c89e1d1eab2d1dcf9
+:017e0052cfee2b0e163c5d3eefcfeeeb3ed617
+:017e107b215fefff32eb480b059dd67698b28e
+:017e200c902fc386a5bf48f2c2c5167abae6fb
+:017e3099f4e7371b1ed6467268ac8aa9947c39
+:017e40c335645197e5fb05680f0966c6d5841e
+:017e501f1f52574fc1ceeb8590abb4166ea0da
+:017e601602b22b806210f2db9bb5e7073b70dc
+:017e709031acd40dffb9ffaca8726ab6453ea8
+:017e803448f4c8c277c0d9572b28990b9b5b21
+:017e909a26ecd80ac2ae35aed00c6132ad30c1
+:017ea04a13646058d67ca7ac5e89ddb9184c6f
+:017eb095beff8ba9e0b4e6bd2b646f4640b73a
+:017ec02ee49eacb4f7c32775538d5583150f7d
+:017ed00b74ebe1757f30df3dc0bf9e6d15907a
+:017ee002c82766479af7a7da79d950dd43dd35
+:017ef0f3978dbb20acd53432f46cef114aa79e
+:017f004db6b08c88af2d8a7bdb7fbb0386dcb3
+:017f1050751703492afb0d16fa70c13fc2b0c3
+:017f20fc90e224c47a16fad6ab6c1de836151f
+:017f303685d7cdef0bf61b033604fd25466ecc
+:017f40ab97c6504ee63268f298026933a27de3
+:017f50abff88e2ad70e6a0f16634c0e4e8b0d5
+:017f60e3e5097e431dcc8a526eb5da2293f7d9
+:017f702a1e085620bd2fd1e0e705ed58fdf249
+:017f808c5d311e90c927fd5d8e74b7aaf19394
+:017f9018c18dcc7ac34890c2408527de9f4918
+:017fa07ea504b34e992cd537a9fe93451fd928
+:017fb086e583d11d7c3d1007ae2d94a3b8b1d5
+:017fc08069786169afafbc969bab8af735114a
+:017fd0ca422cbcab06ed74027d6d240a4007ba
+:017fe0b09c8bb5344a01f1cddba6cd0ef196de
+:017ff09ab88f49339309dfa29335225602bc54
+:0180009deda93d44d5897194731ab563baad7e
+:0180103bd5adb6ec818198c5b1b691af967fe2
+:018020481c278dbc8e639f3bae997361c54cba
+:0180301c87f79fc39ec7ebc09225615583c319
+:01804036953d6f394888d40fcd37984fe9b601
+:0180503242256e78360ed21ec3b24b7396a314
+:0180600d8d72b602c3cec3627813195fa39fe0
+:018070b8501a12c6165e929549c98eb7b1333a
+:018080a71698fa31d34b7b16d6f72b9affbea6
+:018090e4da29f5267d8730b24151f5682dfe12
+:0180a0cb02abc97af335a2a2dc0f3e7d2438d1
+:0180b00e997815efe045173e2cd0657d867e46
+:0180c04905a7008301a8ed60862a5db915f6a1
+:0180d01a7e9df0cce7dc33544805074e143bec
+:0180e0216396c79976f2ff55bc856f7e0b160f
+:0180f025a69265dab17307e9d90f9ee6607df5
+:01810065f8eeaa53033a8c7283116d5e620f88
+:018110d0a9f7861243a40a4f81c40103282262
+:018120afa4865fd166e30b52715cb0da90162a
+:01813050d369353ae38cfa1c51f578e97233e5
+:018140e55531ae9573e820186658c487d6523c
+:018150b3e0d84cccc62732a591565830193bc9
+:0181601fe65229f3fb23210b50e502611a4da6
+:0181703cb2aa6f300e7fd872ea62d9f1d3a05c
+:01818018bdc88cfcbfe9207546d22c0f26b648
+:0181902e640aa43fc061c4c6361666ea8e725f
+:0181a018f1f1a38400ff2269a8b5233fe3fab4
+:0181b0b0600801a1acc3a68d1e9abe090211e7
+:0181c07f30070b5fdf901f67bcf1a6e2b7d565
+:0181d029fc0bbd0ec81fdbe6116418b7771312
+:0181e096f2cfb8d4ae418362fe25c0dd861175
+:0181f01590dace1bc51324ef6c0ad96d2ff173
+:018200560ed3eae2c3972d5063dee850a25851
+:018210bfc94c2f66b8f4ba54d2c53f8b43e2e5
+:0182209230e2514036786f94f797d8c3060703
+:018230c1824ac21b9e2d54b42e94bd27154aa2
+:018240b3ec681dfc7a31a35684b9f958ff8c47
+:0182504c29ec4029e8a9bd0b0b00436fc7002d
+:0182606ef05d47c5bb2c956bcd5497f01ca389
+:018270b61296050d78986731232cae5ffa06e2
+:01828079eeaa86e5209f620351d7632524f7be
+:018290d501a87aed00cdf015e5d6f6443cd90f
+:0182a024f3f0375003c30f19a26f21d612758a
+:0182b0bb9b076ccedc87b220c9b17603389ed5
+:0182c009f6414e5d5fa96120e9d997d005e4e0
+:0182d03f8349143b373eba79bee8b6cfc5f228
+:0182e0e3e1f9254fdb54f93d1bb5634bd4d2ac
+:0182f0f6f4d169f8b75d061346a07aad6b53c8
+:018300ea17a370843b9c403e66ade0f708c513
+:0183106da80aa6fff5240c49eef53271075d3d
+:0183206bfaaea1aec8b7d9bb6c0d38a42553ea
+:0183309dffe3844b256fd6540f0e9096d77202
+:018340d2ad5c81791d319f5fbc283485265a1c
+:018350fe4182ce20d717fb8dd2a262d3b2c18a
+:0183607428214eef4db5b33a0f04827491d45d
+:0183706c920eb3005cf9aff5ff5c70fb83f745
+:0183807166ebd3b220e5194f492b1c3b83961a
+:018390c50eefa60f634e80e1079e65abf38d40
+:0183a00c1e862713c8eb7304d9ee617d606f1f
+:0183b0fd4961b2eae655093bc31be1616e7996
+:0183c05e5d1a99d7cd83ca580a03132320105c
+:0183d0c453b6fae06788ad0f2cd60b0da1c78f
+:0183e0be86db71994f5e62d1d65b3ff61c36dd
+:0183f097c8d120f693c88e07050def0d4131f7
+:0184000136f8894ffb597fcbc47cfafe7ee2fe
+:018410508c86f6da8bdbb74bf1cd6c3a90691f
+:0184208ffca4fcd1e695f8a0db2830952d67c3
+:0184303967b94d07eccc58da6a52e58c3859a4
+:018440939b0fd3d826267defcc5079756d3763
+:0184500b977c9b58507f2c3d9db2f0f56dda7a
+:0184609b54b7a182ceae6d8b1dbc0b2650448c
+:0184700dc3dbcbbc0708c85de05f8e8294d0d5
+:018480763c4f2412335592cdfd7e422ca3157e
+:0184900d4cd647b48c538c2b1cb92ff3042975
+:0184a0fee50963db7d6c71a83cdd8f0a735a7b
+:0184b0b0c26cc3af9cde43b7a08202f6b6b999
+:0184c0cac43300474e72f1641f6b912ce64ef0
+:0184d01265a7772dc8099fa77b3746e34494ef
+:0184e0fc1b691710b3495257f77f8c39d5fdcb
+:0184f00f5bd358668ba61f2467c2c332380a7b
+:01850052168fd128c0f254330a06db73283be6
+:01851051f2645d75db695a8985e76979483b97
+:0185205ba062f9fe0ba3601853a80dfebe84a6
+:0185308e2cf241c80ec46b6658a2d1caca5e35
+:018540c1900077c885554cca8104a3a4418a83
+:0185509107d603e11cde19217446a53a6dfc90
+:0185600a27c163dd580dc72a632a64627d4c96
+:018570365a4c5f437e66fabf148b8716dcf3b6
+:0185803a418b1f1f47b1c816a519d2efe2267a
+:018590bcaff16ae4e499a6cfab26bf87b557f6
+:0185a0d1c0ef114d1f19612cd8aa603fd52e45
+:0185b0fb5cef0c96f5823afae92584364bca36
+:0185c064f9084deeee4b7cd2dceb3298e4ebf0
+:0185d0b655a165be7b7d90a18bd2a83095c671
+:0185e0008358603fb18231203f8f01fa96cdcf
+:0185f0093b598f0f38c27c68dd81fab0e03f36
+:01860040f5195608ad613227f782a83f638c5a
+:018610eaaac5fe77df0eb7d341941f2f37546f
+:018620280ed39f0c1cabc4357def04191bd142
+:018630f905df999de2294a4b30b66129141dbb
+:01864052d7559173416f3738fea34b84b193bb
+:0186502efa6969676fb590b754dcf8cde51108
+:01866060310255a62abe9c3c452d8467979042
+:0186702515dd1c0ab52005318842a2427a04c2
+:018680fb22d9d1daed2d9a19865f8be6a58840
+:0186908db7200626a657d3ac10c78f368d1ff4
+:0186a0d51a104bfc898195051d8e74d7173b53
+:0186b0ebc82862169f298cc112cbb62e738e22
+:0186c005db84a72a65a0d2cd11ea87898f79b6
+:0186d07439141575a15caff99f500caaf82a04
+:0186e061a3deb05106e2d951e96d3d6704fa8e
+:0186f030ef6199c0a30013e0a4668661a022bc
+:0187000a478586ba9672fc47477def4b0b806e
+:018710edf52711199fd268bdb770aed3747950
+:018720c26914b90ede856ffaf864fbf90aa66d
+:01873088582d337079aa77ca1f27c8f5702c3a
+:018740e7651857213da1fed4274e8b9d30f7f5
+:018750984b86e786799b7ff1f2a4de9cf2fd3b
+:0187601e7e61c8c4fb53864a4cd079e7185407
+:018770f9b07e844d384a5bbaf4f2e9b2f98e85
+:01878062c487b2d84747543c2d4421238a9968
+:0187904027a02122f1e19d909a832e5410b174
+:0187a071e8429bcfa63f95910cc9e3b55667b5
+:0187b0012b871433525ab11609ddf3e1def295
+:0187c01afe93e700b5c2519632a06b28f8708f
+:0187d060418c8832bcf1fd2ac0eff596d38cae
+:0187e0344b4c0e9783d7769e25e9b8a72b2081
+:0187f085cb2e2d4e83f29f8ea6998770b13d88
+:0188005ec93fcfdeeb17e5f5dc38091da609e0
+:01881006bf05acf0aedcf2c987d9e1099e1f61
+:018820b10ec39f1c550ecb7dc2bf99ffab94ab
+:0188302887a7b52760713435bdfeb30f8278d5
+:018840e69fe7216e825dc64c1a91923052d89c
+:018850832267fd3c31b48cc298a054c9e87914
+:01886038e43c8cd77cbf203d43fd9b5a4f3cb8
+:01887052e6e3a0bd59a4d52857e238a6c46b6d
+:018880d31ca37f5373a63aefbd7fe9ac362589
+:0188902bf6f4e1db94a6623edb68a58c21bd1d
+:0188a0af90d4457b443330c6062bd1c8c79701
+:0188b0cec03cdadbff602c9d0e25338564e1d7
+:0188c012cbd927419f2bcbb906f97ded6f12b1
+:0188d07816bcc744479ee64e5bf2e6c7b3ed9f
+:0188e041e6520a1cc590342e4534c8db23a68f
+:0188f0f293ffbb04d660611722d58e21457477
+:01890082e1fb3a0452b593d813ab98820559e1
+:01891054915b9a30b6f5d5512936486d07ef79
+:0189202a69caae1af1ae69503b3e53877c4b07
+:018930cedb135255b2ae81000ece4f824e1358
+:018940a34cb8694c52bb8a571a9828dc4a56d3
+:018950f2323ef7eaddb954b224ffba43d5f676
+:018960c16904da518da5405b499984cb8d1c51
+:0189708609ea6b3e617c7cfade32f7bd2c711a
+:018980b5d73a807c794c652358b3fc52295e64
+:018990363ee4c5b23e9302d1c3bdd62c008067
+:0189a07cf2a969921daaf9df7bbc684d282efd
+:0189b08905caba869528c008ae9fad29a0f72a
+:0189c03b9d20228a0972e25ef61948241fade1
+:0189d084866a15defa78571a54043ef39b32cd
+:0189e0c49e2a841d25f9caee987b02083e777e
+:0189f0a03818a114aeb0ee790d0272fef9a156
+:018a00855c5f638ff0d285b01e4bf5f5d77285
+:018a10b4992289b59f1f4eef862b1b5b81975d
+:018a204028d5b5b09e35b4009fcf1fea32dbae
+:018a3066a038e30fbbc46a671c8924067eb81e
+:018a40cd68f665de01ced157bb6a5318c5de00
+:018a50786d755f15f8fcd34ab93af85e5047d4
+:018a60f86b6149eee1d17369d2bc6352068696
+:018a70fe79230fd63e2bbebaf917ee024e7529
+:018a80d0a50130e2f51b6e191be9694eb55775
+:018a90b8f462a66748c573be373f7e5a515109
+:018aa08c6cbba7e0a28d1e6a8c07ef65751987
+:018ab02959906dce4b74b25c5dd40d20cd5769
+:018ac01b9ae4ad6e6e3aa32f65a1269941186b
+:018ad06341ade6a658122a04dfc9be40d8e106
+:018ae081d7bd871fac96c0100183ee55d72e80
+:018af04ae49c8657fef1a908b1042296734538
+:018b0096de76eccf587abefd7ce6a36d942d04
+:018b101764a7f252de33465b62b96a2cf4deab
+:018b20b2ddfe87838470991f434d7b7f378a92
+:018b30a0ee8f0ef98b43e28d7ce53f8dcb032f
+:018b40ce1374a739d7b09f2f044b9471f33900
+:018b5070e4d895bcad4e339590097da33bb1a0
+:018b60248059a31182437b0c076bdb18787052
+:018b706c2510acbd5c7c9eb87cfb4de39c3989
+:018b80de5e222da02d03668e1faf02f5f06a29
+:018b90a2e3612b1dec43c8b0d07785121e52c0
+:018ba0e30ee43a1b9eb730d8ba0e240c3c23a3
+:018bb0d41af1d128c492e5b54029a7a835a382
+:018bc0ee2371e5daff3c705e6af97fc3cdbec5
+:018bd07f97100a6cc2f2eba8fe152c0df086fb
+:018be06f154b29d98969ad1b431a5cc815afd2
+:018bf09ab891d1b96908f1e85f7a0a2933a1d3
+:018c00c4c804ac22fe9b1a3f4c1984d26083ee
+:018c104a6e930cf7b694894ff7d253c0f680c5
+:018c2085de3745d28b662ea272f3253faf54cc
+:018c30d53b80ce8c38fbf42a37aefb928414fa
+:018c40b08391ef460f2feb3701b1371c6fbc45
+:018c503ff1cefb16ed6c50c352ac528c8d57ad
+:018c60a793051f1c965b292b28e39416fbb297
+:018c70c811f9a62aeed241245b2d2e456a0c6c
+:018c80c33f98888f32016cda8269df984ba53e
+:018c907fcd76e519980a966be7c3aaadfaa156
+:018ca03e92026c5039d5ab5f5932bdaea85498
+:018cb0ff5648a697eb8ad8418056a22facce9a
+:018cc090ebe99852ba6d50d8d9f01e3039c45c
+:018cd0409e86ec4242ec307869e0f2cac0e2fa
+:018ce04ddc2859010a5aa40a3e77bfe90b6abc
+:018cf094695db7e71d62579ac3fdd37c70320e
+:018d00245d5f96864052f411e3c0c2c9025284
+:018d106f2ff9792d53adf5a790a5cb76fc5894
+:018d202880106229255598e0d4b083a86032f4
+:018d3005faeec1631d07188468a3c080001b71
+:018d40e9ef7cbb2cd0539598678a83861be407
+:018d50abc66ac17dfe3b83cabcc05afe6b2808
+:018d607df2f3fee824e55f1c9c55e1dccb8897
+:018d70afae40574f9b301602f6031726e53805
+:018d80e88c5a3dd9d869b65c393ec3a2752d21
+:018d9055aa7da604e92651437f6966edcd2367
+:018da02a009dd4efad617a5aee1eecc4d9e522
+:018db0b461bddef2a5fe17300cf0d290dd9171
+:018dc02b87e2c28007dfbf4a1332fabd9168c4
+:018dd06de8a9826cbce6b6a9c935410ac43b94
+:018de07db895bec1c019539be0ee5f3bb39eb5
+:018df03ef8023db954795fe4ebb1f5b1819f1d
+:018e00692aee4ea795f53a2bf8bd4d2e5828cb
+:018e10311d26ada6f9f207974b39198de655b9
+:018e20640b1b60c01b0d8a085db6fc3eb8d5ce
+:018e30a344a742d26ee9ae74de041b27378761
+:018e402eea6aafc0b3a3d1d5a311bc04bb323f
+:018e506cb6aa561a9017174746e41af256063c
+:018e60974e46f9b1f1ed5ebf1037bc4c4144e1
+:018e70156d562694c0b1a0913d8e7944e55868
+:018e80a29caeb8e6ec0b3b7355ce5a3e7616be
+:018e90ec4ed8047111580b0d0f2d6940c7c4fb
+:018ea0760d54ac586e357a5056d5bdc240f446
+:018eb02d88777890dc0afce88fed19acf93e15
+:018ec0ba422fd5415be50b79956d797f35d152
+:018ed0f9b1e01efd9f166db613eedb2076eb5d
+:018ee095364fe2366f6b73c075422e544c8133
+:018ef0c2af0153e5d742752e79ce1982805faf
+:018f0084fa539185aa251d1bcdd17a0731847a
+:018f103ba739781d41024425f03fe941d968c6
+:018f20f240c73fb21e9cd16c13753a4cb0f930
+:018f30c3cbf4f590c4efc05afa00ac48882fd4
+:018f402cf5a26e93e436bb6ced6d2fc7dde740
+:018f5045d92d791fb1774011a3663684c3bba4
+:018f60b61fcf4698ea3c6b30bfbff406d11ae8
+:018f705bbd50e33f462477eb3979920c12a733
+:018f80fcee8e6178cc90bd3ff136a97ba06925
+:018f90a401926451c87a2377157f7b24404c9b
+:018fa039725feae4f2eb227188049e57f25f9a
+:018fb04ce5f677a75d646d0ba99efd16ece1ea
+:018fc0240717b47f6a4fabd506bd588279c02b
+:018fd0866bbe04f252bf3c500707db24160977
+:018fe018ce85cccea4d1fefa4e9abfcfcb4fdd
+:018ff01b34a6a0729c929cc87e5f9805000303
+:01900028665e3b1fbea20aa07aa2562a3cd35d
+:01901096f4879cd308fa333f252a2cb8fda209
+:0190201050233f8ab09d05a889678f4dddaf26
+:0190306e56735018a2af2665fc5acf28410e09
+:01904038d024befde07b61d01df38a223f4f2c
+:0190507f378e8800da413ffae66002f8469c38
+:0190604809ef8a5dd66ec1f5722669e945eae4
+:0190701f812ddac35af3b158381ca5ecede2ce
+:0190809010e434b51656795886e631a15f561b
+:01909022f874cd04501a40dd933ab242b7fb1a
+:0190a0d36929f3be0259d057812746df512913
+:0190b01d53bf6b72e4a8778b51cb615ad61b51
+:0190c07bcf31bc79983333177dc7a1b7aed0a6
+:0190d032fbc75ff0a034ae67dee9c98b6ec729
+:0190e0f477635bcda7fff3b53d7caa59655c21
+:0190f0d1c3d1dcf84c65992f763c95511f6182
+:019100716d8fe7a5dfefa406a4f6613a51614b
+:0191108ebc26d2bb8bd6e8a02fa611eb7c7a29
+:019120dfbdf1aa07e3c493bba09adad1d40933
+:019130e26ab1fb10319abf39cef49512124b35
+:019140f4317f1428d189bedbd3e4dc4cbe832e
+:019150256db2de4a5af2cebb15ff84481d5fe2
+:0191604e0263412d6903847964b251a9aab3e3
+:0191709a8cbfc31cc38d1518d3bb9e47168efd
+:01918059aa603bb11e07623abe2e240f961781
+:019190d1f042d0ace898babff652d66a3770be
+:0191a038e4b25971d5bbd87df94af8c0801ad6
+:0191b0ee2c28c6b85e53d7f463a0cf27dce378
+:0191c06a834c093f4cea0c330d766fe5a01b31
+:0191d08263539b5bdcd6ee8d88f0199bed04c2
+:0191e0e4a2d5dec7071fd7788a4699c1734105
+:0191f0b1d0912436b80b624e8d2bfe4cf174dd
+:0192008de4b2f9d4da2c264adfa2473ad5a8c2
+:019210f25e86d1d9f4f312b79002038e4be05f
+:019220ee305599dc50b4bf8a17c16cc837d92b
+:0192309277b6fdb205fb4dd07175cad22aaf98
+:01924001e3e4741e28034fdaf13b1b62296ca3
+:019250f22a3443115f05a34820053cb0a51d75
+:019260260908a01256b16e3aad96a8385acdbb
+:019270ac64082c476db4cf9185d1749481390d
+:0192801f759d80a9455f279074772a5366ad09
+:01929068b3f21c3a5b45498fd6e5a1672c0705
+:0192a04601c082a06b87b2041f494270fdb654
+:0192b0083cb53e3b78d3edfca90bb6e363992d
+:0192c0ece2e7a44c0ecc29ad3852a73ece3b49
+:0192d00e4e87e582c4a577ea5e41203f5245fc
+:0192e03e27f70f0e977aeb0ac19a6820081f41
+:0192f0439cb2d97e8d3757a18dfbcbb610ac9d
+:019300eb832bcdaea168daaeb99f9932f5ea1e
+:0193106c8c6a6c705e0a541ee12d5bbc0368be
+:019320cdd8002875a8e17ba7f0c8b2e00be195
+:0193309a64947d2d1fde335a9835f1d5aee025
+:019340958b8a77a5aa79109c6dedacf079afda
+:019350e22b319ce904a91f1c986e1e333e75c2
+:01936087089c5a62564df0e9979a47b03a1e57
+:019370a9a4a5d8a2e97432c1463c092c6a94e8
+:019380e7deac3af8945fa693c9b36d0602c9c7
+:019390cc73cdd36097ba6bb9ba9b7eeb8e5bb9
+:0193a066dd1a5ad33c3138cc1a9566dedfa9cf
+:0193b053c6fac83e201bd79f4a2a053b267f0b
+:0193c051afa51da923a19688d538902f7964d9
+:0193d088a8b4ce6c992f2a80e8fdf82c335d76
+:0193e0f49a7c6248d91e64002fbf3d33f52362
+:0193f0a99911e10b476647cb9c64d3bea42b7e
+:019400b1e48f86792e50339e9c36f5b1f4473f
+:0194109502752ae231d43e96ab379b31d8455f
+:0194201443715c0a900ef1c967a1bd292ae29b
+:019430112b291aa30612feb2c3bfe10f186265
+:019440a1615b1575287e8a9cc1bf5c52aeeb67
+:019450fd62adc1449f97a1b23136881427901f
+:01946012e20e565836091d13125ce4cc8d4292
+:0194703764da9182e3d02b62b5262f3b9c89a3
+:019480fedd132d4a7a2f2eea56c0575131b844
+:01949000ad2baf1fb5a220ed959a11bb7cd8fc
+:0194a0a77bedbf15bfa79a99c50009a0634a30
+:0194b095e1fa32d2241cea63a3206e717f9742
+:0194c051117afa144c343ae1afd79ec24d856f
+:0194d0dd75172d7db9db97a9f9693e2e2be99e
+:0194e08da44d9f1c7b810fb98b4bcc0c30ca2e
+:0194f0659c65304651fec9c74836f22482445e
+:01950042fb1718f72e090dc6a5b8e55f54ac94
+:01951043b9d2fd837409e1955a67eaa00bf522
+:01952038d2c450f2db2eca459d589f8f488dc2
+:019530fda30b155fae3b825d6984c1fcb5f216
+:01954006819a861773c42d767406a3ee225515
+:01955054000ed8ed5ade4a5837a2be04289859
+:01956012e02a7c6b2c11f9d20cd628cc5e801d
+:019570990d1da67faa40c7ece2fb9e9e2b699f
+:019580d2c30d68e1313b5066178c818b01c294
+:01959043c9a06089a07a947105d5f729861e62
+:0195a088cdd75cbccf06f98934517e885ba35f
+:0195b03a5949f55b880b9c2d9ea0534e9b067d
+:0195c02cc50e9ba2e832d4ecd0261c1c1f3884
+:0195d02d302c4900434e7847560254606e3b36
+:0195e035b047b2cefb9352037b73ca09abd6f5
+:0195f0fc926aa8d26f8fed9922f9a5fb7fcd5b
+:0196007c3f0311196f5ce48fab6028cf8f8ef0
+:019610315e69d83ba1fe3f68995225bdc8ba4b
+:019620bfab4a1f362685d1f7f5c293d73b1ccb
+:019630bbd17ed097a5b6cea8e6e767e2d25394
+:019640a993a0d43351e1da0024577da505faa8
+:019650b464f96dcb1f37aaa5ec43cadfabd044
+:019660d61022d542bc208abd919d33b0ab733a
+:0196702e7aba1639305c703bc66f3630abd457
+:0196802de32b15dc9914a160b59b194e5eab0d
+:0196902421798887efd46b74f9e37b0cd65ce5
+:0196a0f6bffc13d881b050cf3e5db920a0c97e
+:0196b0003461a25047cbe47c656aa88a76e135
+:0196c042b83de356365804d378eb7de381f937
+:0196d04e913be7efa55944e53248b09d20a49a
+:0196e0aab464141eccfcbd73bdb57879fc4e5a
+:0196f0ce1be6f835d14f5d7da5af014c011c1a
+:019700ea107e56258522a6237a457bc1ec2e24
+:019710b2506787c4d5bb01f6d9e8aacfef75cf
+:01972074dfa0b2993c6c67546506d7a8297613
+:019730d0cb3ef6cda11b0e764d113baa84306a
+:019740eb85f6ead440b6903d8fe16be2f30710
+:0197507979a233f62dda90ebdca2f2877c3074
+:01976041d72f5b36c8e4fa7ff3d20ec531fce2
+:0197709583440ac594be605145932dff31986c
+:019780c960e937ccc8a2c27f7e30c3eca0071a
+:019790eff38123b89bd43913173b1441d17cfd
+:0197a067f2f2993877129f612decf6db1a09df
+:0197b07fe7605f71d0f1d048704d3ee137633c
+:0197c097cee59d6bda71d822af07d84559be20
+:0197d07f494c07c0f616ee7fbc55bf034c1c6d
+:0197e0d25e165d87744d3143db55f31fe74170
+:0197f0d0ac1dca9da9ec00972f3cd7ed9605c7
+:01980096525a338d5b1cbdbc5189a2ec61555e
+:019810f41bf14d9b5f58a2676c9017e946463c
+:019820165ecc2b4445b15d8f491beae36d92b9
+:0198305d68fe552984b090f1ee8ee9106ff6c1
+:01984003d15c24a61cb7f1352b807a5d2a8502
+:019850e0603a0b6cd16aadfa5145e9a81aef5a
+:019860a35f5be6b97afb68afdaea6b001b5395
+:0198704b81adc1815e92f6adb0d1e8f973affa
+:019880944fe295d8c6c94fdafb3232376f993d
+:0198900c302b0f33e2c301769dd01a7c13c87c
+:0198a040ce4c42c97981f496b4f7f0f3cc90ba
+:0198b089480890c48094e902c5354b606cc6bd
+:0198c0e8a05076af608c919ab656bc9c91fcde
+:0198d025f15c3f17d10511cbc10291ac3a0163
+:0198e07b2b41158cfbbeaca5381d9b61a0c0c2
+:0198f0bb8cd52d4f49b02d183347a0e5d9a4c3
+:0199007eb192ab0c6662f704d901b483e47ce2
+:019910b1b7acfb0a8a4aaad790d6d59041a492
+:019920e6d2db1638e665e2872189c51186e516
+:019930f9319ed09a25e23be69300e327c57330
+:0199403b4b0755673d56091a5b328dd6ee2c6e
+:0199504dd08cd1e2237f03d0144687a1d0afa5
+:01996050f2ca4ec3a0e6b3c9ab71c2b6861bd0
+:019970c197e04fd4f74fd4729a0795852cad33
+:019980ea022f2ce7e59b70bf0a4e4edd942640
+:01999067ff27d13dc8ff4787c6f1f8dabeaa5a
+:0199a00eb4dfa18f9bfb82634e9581b7124699
+:0199b02a89f8d5bc6a6eeffaa9a20c8db5e92c
+:0199c0ae6cc120d4e2eb3558f27cccf7f1c47b
+:0199d07f4f01cabf09d72ccb9f2dda7c0cb07f
+:0199e0e0bf8ce08664fbe9f2258372e7b16bd7
+:0199f090dfa9b57536b0b7d6e080172ca430fe
+:019a0065ba1a0dd53e33d7590e02e407705d02
+:019a10211f3f343070c8faa144685d2f089eab
+:019a208b878550b36c9b4f6717307d07aef0bc
+:019a3003f3063bf517c40f5870b3c4031c9d27
+:019a40e72d7acfce11d37cfbb554f39ea371ee
+:019a501ce53be1ea44e69a70df8322c999afb6
+:019a60954aa8cb565947a07707e8aeafe87955
+:019a70ecc8a8f24626d7e67f1705c6ec41d7c6
+:019a80f7cb42fc4df435d5c33d010c87a631c1
+:019a90249840921b5523e6762f1fd6caa469e0
+:019aa0056aaf7ae4785e7e0376ee2a058593bf
+:019ab01e274c163a581689423fbd0c36763b14
+:019ac0d7d46da25894fd0cfe4af90eb4ef7a2e
+:019ad0c88ac3efd9248475aa5a355396e42993
+:019ae0ef452eb2513cb8562557ac76b107d1e0
+:019af03d24006fcd1b503c4f45f8e424215d03
+:019b00eecf4d787b8f65fbf7ff3ff92b1a89a1
+:019b10d2ce9789c9b13483e92dadec4e9f77e2
+:019b200ea310e9cc525dc600aa859a59b5748a
+:019b301ed9b53f1219c25a62bcc0585f0698cf
+:019b40a4656c97dd0f7f8788c2ac91ef482eca
+:019b500e4547888bb157d985c56f9164d6a158
+:019b605e9c719ff92871bf082367ef6c369968
+:019b707d26117e97840b67038a962db40929df
+:019b80efa526cf9ad72b7200878393d71bb329
+:019b90e7e98a20951d41cfd2baed16b13a211d
+:019ba092e40b48a79e3ae317c4b3dc977f7c9d
+:019bb0060ae0a554e199c5a861892f321ade0e
+:019bc03c9cc20683999f44ea709e24b9b50aba
+:019bd0a8e23686cd113881b1607fddbcfc89ac
+:019be01772382ed5e562c8eb116e2b1c0e2e29
+:019bf0ffe66f9b4baa7da31e7aa0e2494f3ea6
+:019c00eeb98fe990aed9a5fde52ae375900e24
+:019c106b4a54105f17da06af3d8db82039a9b0
+:019c20540f0954cefb4c1dbb12f34c47ee7de4
+:019c30f2bb0a2d1aeb03f4e8fa7508f31d98af
+:019c402fc7e036193ec73dee29a5cbb59d5d6a
+:019c50b1ad27c31a6b655be0a0bbb1081549ea
+:019c60f6d54f3cb7a254be947ab0d18c2b5fd2
+:019c70c5a24a4a9fe51d6b8d7ed9eaad513a5e
+:019c807b932ab4a4b509e29b987efb321f82dd
+:019c9045d27e2f0e6d010337138f30d4a54607
+:019ca0921480076b1919904f5172c2e053847e
+:019cb0e0ed5afc6c32329e338363480d53cd39
+:019cc06a71654eb8c756766203ef33a15d56f6
+:019cd09033554548b72e1bcf2f1f1221e2cb16
+:019ce06ea3c99b7bced37dcfc653d6f825d2d6
+:019cf033226f09741c6fd0c8b44964293f1216
+:019d00359b7f6f20a3d462157ca8ec7136c896
+:019d10f3db2b67cf6f1e583616339359437fe5
+:019d203a63cef538968e5615acd9c034e4db30
+:019d304a0b344899155b87529254b65faa3ca5
+:019d40f285592bbc443d4b70406152be51f723
+:019d50b72e300afa485f71d58727c9275c2f08
+:019d609af1fa618b7d5ccc84fa845c1ad4e7b1
+:019d7033cf16a0fabba1b8a4d86c79f4f1e915
+:019d80f7d1ffa8c722efaf2035355dd1cff219
+:019d906b2b6bf355445d0d39cad698153a6f4b
+:019da02582f2ac1da71b9db58a1e2c08f31666
+:019db0760ab62ba837e547d61bb9ad35a90d5f
+:019dc0a297b72d9bc056ba377320898df6cc68
+:019dd034b3cdc1518a12594ef3d5664f41921f
+:019de03adea9965bca35b9d92699bbe392c18f
+:019df0be1f76b90c7ee4de5550cbc948315bd0
+:019e000193d1b086b80001feb549c309b1018d
+:019e1068c52bd0c5d49e83894dc0f026b60524
+:019e20fe55122c1ca11efd000b3f3893225c93
+:019e30250b8ee9fac2f7d3be12a1708d800647
+:019e40d39006c6e778fdaae563176538b9b906
+:019e501c402f6584764a1f0486e4acf95443a1
+:019e607e560dd1bff0bb4d75e13ffa350a346f
+:019e7043cd9ce5f9a13578cad0939554ef59b3
+:019e80500ff04c30bcf67c6c35159c297019d5
+:019e9037f76c7c191e721ee053ee37db37dae4
+:019ea00716e355d7acfc4a0189d281b02fa17a
+:019eb08f0087ebfd922a4920b8360730a3089f
+:019ec0325c3ee2903cd7bd7c441590229cde9f
+:019ed06e1d1bc9bf516f9f3a9fbdcfd743a843
+:019ee0206f7882364b103925e9316574c9a115
+:019ef05b9415d71e8927c9e5fa69799a3b8288
+:019f00e30af8c4baedee93bea0b3211a745b3b
+:019f109d4afe40a7c78a53972f013f18bc9dcd
+:019f20d476232326a7e190eb91b3b17c1d17a0
+:019f304b46d7d4d42efd472371511af6523b51
+:019f40505adaeb98b67cbee0f1ac97fd69365f
+:019f50fe6a970a41dd073cc16b0cf2f6f4dd31
+:019f605de41eb8743fecb6404969432a4576ed
+:019f708a3ea6913e618e8ddeb952a622249077
+:019f8087a501f8e2b27febd24e07588f9bca0c
+:019f9046bdf05fc9769f713d1a9a0c427705b5
+:019fa0d4bebd621f514084f6363474c3d0d130
+:019fb0dd314106a9d895859635def7841d824f
+:019fc0f740c09fefe968dca934b62034513be3
+:019fd00b12300201d2d5e0cd9d9086ff9e53be
+:019fe0fe11b5a3d10c807686ddccc2b931c1c7
+:019ff0c3d823deb2cd35780d88ab74aa000783
+:01a0002b15cbdd4193ab6cc1f1fb297871d765
+:01a01044bd2734ef4b51baeb521815b30e6be8
+:01a0200bb68171f58c57bae9e89fba7305ba11
+:01a030496d7e57eb9a62af4e3093550720e34c
+:01a0400866e285354b2060e97a4d5d906aa054
+:01a050d1969c0b82b44a90c372790d3b0f0280
+:01a060083c5ca9b0d035a82346f13831397ffe
+:01a07064f2fe389a8e6f65b6b30e01215bb706
+:01a080ba19f329996aa591419c58ea4c83602a
+:01a0908b17d9a0e50ce3b0e2605aecb0c84efa
+:01a0a0a8731c887a47f5a0131c564d8969d5d8
+:01a0b0f5eaca6ed9ce353bf21e67073dcd6e4c
+:01a0c0728f458fbeebf46dbd6ee1ae3aee43f6
+:01a0d0626caa5dbd0567bb29631397fed0b20b
+:01a0e08d2e26c961560ac27f67844a6cfa800d
+:01a0f0435f51387d3a2793efc155bdcd00f448
+:01a1002076899bd30dbe6a290f182537a10b23
+:01a110108cd88aee0b8538700753d1fdf4ec99
+:01a12088feeb0f1202961379451205533bc932
+:01a1308e7fccc5d4a8c67fe649676bf930cd9f
+:01a1407630e86fea0dbb4a3210789ecae0ef94
+:01a15091bfc69dc2c5f0bc309aaf0bb195f119
+:01a160704c5b2430651ad449af7a780868eb0c
+:01a170d38aeb1d8e7df8c110c3980d4ff7bc92
+:01a180c98f6a80616d178f79a3c3080ad59689
+:01a190a1fdaaad0569ef895e386ecd2ceeacd6
+:01a1a03ec2808da2ecb5ada3b187df9db0d07d
+:01a1b072ce780368d98838ad46d6c93f5355ab
+:01a1c0fb8dfd6410be9037b60f876d206f7fca
+:01a1d0046db7ae2113ed65342d79a457b35d25
+:01a1e028d68b7e2829b779e271be0ded4fc558
+:01a1f02dffc71707a9603f5bf8eb8ffeca6d85
+:01a2005b0cb1fb36da532dc2e928b5c2fd0478
+:01a2101d9958560b13ea6939927e8750b8ebf9
+:01a2205b82d4e8f609612e4bdba6e7b4ff2d9e
+:01a2304f98eac2762ac160ad91d740bd6168c8
+:01a240b96dfef0cc3eed7c89eda6e13459d2f7
+:01a25013bbb4bf23fa81b4de8dc223843627bd
+:01a2605b8dca256cbc0297587539338f0ba5b7
+:01a27036cfbc7c8bdeb80d34df49dc4a0b7057
+:01a280e23470995b2e683ddc381d879c7942b8
+:01a290862032fdc1135602522a6f1011fcbc0f
+:01a2a0a9e775bb87b80f3fdd6b0f21db340426
+:01a2b03122ad6040984810071223ff34d748d1
+:01a2c046dfa144d28fe290d5cb599b14655056
+:01a2d0d914bc172b34e23e131b89495a96e743
+:01a2e0c62635a876fc083b413f3f922c73f86b
+:01a2f0b586006311ab0209bb8dae612cd35132
+:01a30010b28478d26ea4832bae04fb0a5aa589
+:01a3106ae666bfc6f29d9372fc71542a08b5b8
+:01a320d9fd0f54f15b0e06153b097318a5a945
+:01a330bafb20f0f8faf42e513317dd18ed209a
+:01a340738cd17dda636429a2ceadc3df62765e
+:01a350c02fbe9c618d1cd87305c7e81049c49a
+:01a3604a1c96520b7eb6baca112e94c08ce89e
+:01a370e7a532e2a3acc7b992e50e7f652f0a85
+:01a3801dcbfadceaa4b3fd0f33ab59de492d79
+:01a39000e9c0a2784a6093c3757c5683e7048b
+:01a3a077fc721871f26bf52a8e0eb96f3a8ea7
+:01a3b0ab63f59ad0bf2f30dc9bea1fbb60d8fa
+:01a3c007c081bdb872124bcb17ea783a1030ec
+:01a3d060836e432a6f3d6c827f67b6ca6a8c00
+:01a3e0151dbad26eb2aebc3376627fb50628c8
+:01a3f0e5870745dbd80333800e8dfee2bb887b
+:01a400073383980601f285d7209393f0bd1203
+:01a4103f816b4df9387b03dd931e04a78872b0
+:01a420ff4048e94766da2e937c33f8951b2a2a
+:01a430936448b475db51a14f9b2c43782ce43c
+:01a44020dc7956b89e267d52f5f91d5a9526c1
+:01a45047ac11b837b61d21b0aaad174fd9f79e
+:01a460fb5213fb48ad2d27b224bac62a995202
+:01a470dd07255612d12a2458270a166b16ca19
+:01a4806df711877d30f4251020f0278e2f128c
+:01a4905a1878106c0a18b3bca68e7eb5fa6e5c
+:01a4a05fd55565d9a7f57cce0053152969cc1f
+:01a4b007fa2794b1817217af9f110f0c91e35c
+:01a4c03510b76cd2f067212153566b950e3522
+:01a4d0e2bbd63feecc8dee52f82e405a7cdad0
+:01a4e0aa1ef8913d60d6ceecc2f5821e5fae13
+:01a4f081241cb00f11fc4bee48830503b5ba35
+:01a500b60da37debd7d3c79a173110c289ea67
+:01a510d1ae2cb6f060d3e65c80b866b8fb5ba6
+:01a5201f9576621b540af9c8350130a5b9cfc9
+:01a530cc97b1784215534120093a9a68d70c85
+:01a540471cb4df090ed8f1ed2801b5dd1b6cc9
+:01a55010501cc0e7b829a279aadf7a7914d94c
+:01a56092a292a9b49db87acae392dacfa8a023
+:01a5706641da00d9cd56a35de478b6ef5c8973
+:01a5806045284e9dcfcfad5eace1cb06e159a6
+:01a590eb7a8edb6dcc01b6fd83412b41cc1983
+:01a5a0eddcf0343892943172198b3f3d54a2f1
+:01a5b07f9f0b75d6d1c9ca9fe6ce49e55f43dd
+:01a5c0a3ee20d0bc81e23d7d53066877072e67
+:01a5d0795521a3841e74f3da94abd89ddf3710
+:01a5e09c579423280e4994677015fa88d3a0f7
+:01a5f03d3458e02c64e5c486ccec8c59c537cf
+:01a600e80e6cd237f2511a1e57c6067bdedf34
+:01a6107b8b8cfa3b4e09a099718bc22f616752
+:01a62085683fe50694fa4085d66a0e642fa993
+:01a630c0bfae0ee81b31ff37dc35b3bd3aa73f
+:01a640d414d052ad7e2ba39e1304f63bbd1728
+:01a6506cfd5e9245a80d291942fa5c94aa13ef
+:01a6604bd3751e63a0de648e8ff7c8ace42d4c
+:01a67091f9607e0ae46f66df9cea5ce722471c
+:01a68036e0ecc1251ebb6ade2934a9b5cd70b6
+:01a69068d0b69546edf697e642c77cb3bbd2f8
+:01a6a054d0090c04cac1e2f89ef9c06ea5331d
+:01a6b0df510dbb9520a61949d851fca78f8cbc
+:01a6c0eef2de123ebfeacf2dc401694b92ae2a
+:01a6d02633915dcb51f6e6f9a521c257790602
+:01a6e0481eec74759810056f911448da989b75
+:01a6f04e1245d456ad193888ec71047a720198
+:01a7003aae965501c1435aba32b5e2ade08f41
+:01a71052f3e25fa0af0b4cf3e9fa38b6401573
+:01a720c37f6955a845a634ad383732431eab3e
+:01a730c24f9d9d232def7f2c6cd0de89d3abeb
+:01a740d6890a8ade22b204aec9f676723903e2
+:01a750e2588a243f2ce23ef56a2c4d99d065af
+:01a7607049a89e32f7931d25c0b92c8f8ceb64
+:01a770dba90774b1bfe59c5ec28b4b8ce5522f
+:01a780f00ae6042cbba746aaee8694c7e8b26a
+:01a790deccb0f2a122d5c05c3b7ded1c1edd52
+:01a7a033f60ec2d45dfe532fb09e6edf2948cc
+:01a7b0ecd0c581246b3259fc5e7b2f100a0616
+:01a7c0daf5b75733ce2263374fd26c944f919c
+:01a7d00d51e22e943eeac89d12a4b3592dc65f
+:01a7e0badb6ac2bbaf470ba4cf43f26782f6b2
+:01a7f03c770e350465922e978b647eaaf8aa89
+:01a8001f825f04625bb9b75d7075a97bc6fd32
+:01a810d931d828ebbf9eb05a40d6e2313eec32
+:01a820c1932569bf823ae358adc39efd73b330
+:01a8307b488ff0a74577648ae74adf3b36e700
+:01a840e31bd3be49927fbabac0fec603c6c2c4
+:01a850021603d655515dec16c4570c74d5e6a2
+:01a86001d19a1d2d9df21e49371949d6d3acce
+:01a870d684bb040cfe1296d989cd604cfbc863
+:01a880b9c3f96c13d77919d001a8911eaeed35
+:01a890dbc1619dd682af2580de16a4ba77d30e
+:01a8a009c7b88c881e9c6b92231485b2222062
+:01a8b08f0676d626d8dc65aac29a50e36d20f4
+:01a8c0eedadfa119b2ee1f9d287a5c7f3c1f1a
+:01a8d08294b2049d17fc2f90b427c883f1cace
+:01a8e0c93e71264b7a5395a85a10728211f64a
+:01a8f0d7dae3d95de0a7dcc4e088c451465e24
+:01a900913618d8afc687d39dc3d09d7882199f
+:01a9107603e25be92e3ee22181f561f8a893de
+:01a920fc7a1a21e971430bd6410f3661f5643b
+:01a93091476a67505e2a5ea3414a10a913778b
+:01a940bd0725042789d3be3d804360ae074fbf
+:01a9505d339f34776fa4c9958c174977b0314b
+:01a960ce0683dad5524a5b83cdae2c8089c19a
+:01a9701801289ab97801a4bc8f2538c47536e2
+:01a980dfd012f7282cc43f9a5d27b50174e6a0
+:01a9906306eabd42089b4c89c0c1b1dd7c05cd
+:01a9a00fb69664c614cf5016752fbcad568778
+:01a9b030b005c901dfffeaf88e0165a5f06d5e
+:01a9c022feb10f0cab5b58ef0c2992a2eb717f
+:01a9d0d536a346386071c0dc6ec058a39c3813
+:01a9e04a009513061074b12a6208d04c66422f
+:01a9f00a97bfff8d42a62708a9840ab0ef2327
+:01aa000a0cc1f7347add59069928210ae3a391
+:01aa10588ef043b20fbc8d3b1fbf2e8de4d144
+:01aa201b918c8856084f126f5028f454f94bc7
+:01aa30eb1faf55f2556e7fc5fb5125d98a5835
+:01aa40460d80c88255b2d6d6a7efb88cfd681b
+:01aa505852ad8381ccbabb98bc7c9d2cec2125
+:01aa609512d5cc6a9ea3fe8fe7c2b95bc256fc
+:01aa704f8cad0c7dc70430ffbfa5f7b703bfe2
+:01aa8088e2808a7df51c23dd34030955f14dcf
+:01aa90356109b52cab408d9c63f8e8d4e837e0
+:01aaa076ad4378704c44e48c665663c01c3939
+:01aab05bd093e36f3037c36ef0369a99c6d22b
+:01aac08ff9e2fa8e2af38849dccc52c9de8c49
+:01aad09b0ff4d59d83dac34078f26094248dc3
+:01aae05ba5d9dadc0d90b2c06154d67f3d3691
+:01aaf0a76e056b57e25f6d2d35e7196566ffb2
+:01ab00d70e8b3cf4cea8e3a57cb33ab5a80971
+:01ab10427405b594dcc49e5044fe5cbb35e1ab
+:01ab20132b1af37817aa35f61e1696c16ddf7b
+:01ab30c89d5b6bad03032b5973c734655fed29
+:01ab40161a45a3bd430c63f909f95d71c8e6e3
+:01ab50b141d6435f8a43bdc2a86fa2d3c8bcf5
+:01ab60fd7102d99bc4effce7b0371f3d13bd16
+:01ab701f6177dc304e60b21dbb10dd43959895
+:01ab803909eada21bd9c0fdf527c7bc7067889
+:01ab901e6b00e3f1c5732081319307049ae290
+:01aba01fad062b81406a8d1d2997554f0e739a
+:01abb040609498c3f3917e966f384044ae060e
+:01abc08492d012d1f0b853525dd7cd67881d47
+:01abd0034a98279d00d6f3e1cceb5d80c7847c
+:01abe0c2655edec07a6e8391d5ea02d1ec4a67
+:01abf09ed56d2e80bff1fa0b0fa3e07bec41c8
+:01ac004cc961db8875eb41e8a38df76a998db9
+:01ac10611c3019a77824d5d6b8f64c1d92c4d1
+:01ac20997eda3257ee15178935ac1171f834f9
+:01ac30e54c64590b165f66730e711ffac7b7f7
+:01ac40ebe41fe82a3cb4c0a1e0ebd8f8d54487
+:01ac50041676fee6145b1bed0050efb00746f5
+:01ac60cbc1ec2cd6cb0957f902bf2379f8f79b
+:01ac70c4ecabac2eefb4f16d61bdd7d6fca9c9
+:01ac80290a841ae5558ec1a31316924db03e00
+:01ac90ae9544deab7aebe1dd45ba52c73df6c3
+:01aca0d60848a696775593d904107b1989d194
+:01acb053f892a9482a79517353ed3086d3d2bf
+:01acc0c8ffd14ec1b80d6087e5569edc3b9bf1
+:01acd0ad78ffc459e27efdb4918dc59e5a6b54
+:01ace0b44511e8dd0671f078ffcebdaedb4461
+:01acf029043c2a6b843d51e4e1c32278577581
+:01ad006a1da7c7f34d1a0119b61f690c8801fc
+:01ad10ac801c40dfbad6b0c38ac3416d84e229
+:01ad2030a9485dcdab6cbd32e1213b01822b19
+:01ad3057a1c033285ff04ff18f3cbfc13890a6
+:01ad40a754db70f30a0bed8543157837083d2c
+:01ad504fddcd33e585c61330ea17a4db882792
+:01ad600b88e7ece20e497c76191827ae9c83a2
+:01ad7036d891870af1e8008590e18d83c5f353
+:01ad80c43fb673b7c1d571ee0757b628c06e22
+:01ad9070ac7a340a40c023ebd513b96f77a5eb
+:01ada0668f50188e1ab44481aaf6dd97029438
+:01adb09ae9372eef1238ea60f011e57bb96545
+:01adc0d73848a73228388171fa76a90c89b943
+:01add0ca2bc2d9159090e0845532ff2a4f6ad9
+:01ade09dbc377964a5ff29668b130b6219df5f
+:01adf0d8790bb4a956067aed7de737f9d8e7f1
+:01ae004af2ca615e5109e44df3a4f4ac9048f7
+:01ae10bb0ea81b03f4aa71bee9ecc8f5045a1b
+:01ae20933d5343786e9dab11a223582cbf49d9
+:01ae306d7f2b7faa833b44caa3b23d94d962b3
+:01ae40e623ac660d1e4bc4573cd51b1d72cd81
+:01ae504fb1c037b164eb0a95e9c0706182b7bc
+:01ae60c946f2380a83ff64e591c87765e347a7
+:01ae70aad0941db60bc5d2bbfbfc9bc58b8f0f
+:01ae80e296e6ae39f5defdf1928a2b5273f8e0
+:01ae90ae64a58ebae9872cb472eff5f52cecd1
+:01aea02fb2c17f8d02ec429221882b68d0a886
+:01aeb0f5f8048633b06ba20d658fe23d2c28d1
+:01aec0dc626f5c41f27adeed2bedc3671996b5
+:01aed051854cbe9492be27838a338c67d999a6
+:01aee0d8972cbc95618b422cc996168897ddcd
+:01aef03e27bc1747b7738a21de5147b93c4bd6
+:01af009b0ef5419aaf165849d672a62d94eed1
+:01af10dde3148a8b1d07ab33a1ca3885fec7ab
+:01af20504e4c94cfc45a41160927409549064b
+:01af30993fafe7a5f6a4acf9ada4531b81a8c9
+:01af400d9d739d5a813c1b4f215690984fb34f
+:01af50023105437ad3df65a71b9d2fbf2668ee
+:01af60a98b138bee79c5b929dccb540b86a8dc
+:01af70a753e453a474228d9f588a0abd15ce21
+:01af80ab7d84230b846a983f58bfb28c61baff
+:01af90d841b43b1845ac58f42aa45b32828027
+:01afa014ec79ad3f848ec0224e8f068bb799dc
+:01afb04abfa34bc08c36cfd59ba50df55ab51d
+:01afc0bf0dd5f9b82015fea9c014698b7b5e10
+:01afd0bcf8db1bf60d2efca011f386e57179a7
+:01afe07ef4d95c9e80d3eccef565f4116eb8e8
+:01aff0e8b21d362b9a4ceb7ab1ba1020e61814
+:01b000649e798e10b4d8a72d96c28a6d4c2fe0
+:01b01016be45a870d9cb6cb2d4211b3a5a4019
+:01b020e5cc44e255a9a08f378d398a7366495b
+:01b0307dfb6b0b0f30239366214df7319af9b2
+:01b0402a9ab3aa0acdad60d8faddf8242bbd12
+:01b0508d80958e1425a827140edb316634337e
+:01b060bc420403e7f57be316b7093bf9f00535
+:01b070b3fd1a855fdd660f6f04bf5771aae044
+:01b0804a3668a01c1c96b255ebc40f95c4632c
+:01b090015d6780388af83eb9326dd64c6b20d2
+:01b0a065072a6c1d0c631f515c92006d240209
+:01b0b00f74f8ae76e945ac2bc101dee088e9b3
+:01b0c0f190ce64a15e76ff767c586a292aa2e4
+:01b0d0102685f52910432eee4965aae771083a
+:01b0e0330195dbac3cef2a0208a1db61068651
+:01b0f0926302a807ba54a951673a9dbe907adc
+:01b100f2c2b5cfc0c650e9c2d31e538c390708
+:01b110b887c953b861b27a7bfb1efed15464fe
+:01b120629a854fcf203641b1f3fcd9146af7b3
+:01b1307a1b9922644722fe0701e44426b12de9
+:01b140a7064b60a71a246fd41b5591412e4b50
+:01b150cd9cf0aaad41d93425a53b24b5b9929f
+:01b160f5dca7414c3b1fb5277f01be4a776991
+:01b170acaaf5905dc54510e3bd94d10bbf60c6
+:01b18092d3e3bf0351355c123dbc9288029d3a
+:01b190b6932f6e9cf5b230c79702104eadb24d
+:01b1a0864771ff47518354f5761388a04fc2bd
+:01b1b087ed774f0b1c7fa688a897ca370e8a39
+:01b1c03ae9e5baf360cf9e54740419803d3303
+:01b1d0100114e9f4f8a34b05330d1970b31f6f
+:01b1e047ae829f46bcfd0ac43054a51dff8691
+:01b1f006ef36ffdc21d06f50cc9e4dc8b12a1d
+:01b200b9d379ad3e22925722bb98ac95935222
+:01b2106d7cc4b3663854b586a41d73acfd6f21
+:01b220e17b093cdccb642b33318b4a4134923e
+:01b230b397309c02322bbe19a79d8cb8d98b16
+:01b2405e34a7ff8e7adb95c719c8fa9bd4064c
+:01b250b4d60c69505af2a226f5262f8ec76b99
+:01b260f33d0d34932cf86d09cc496b3404d425
+:01b270faf285e0f6cde17470db7f34faff22ec
+:01b280cd093168ed02cdf8bb297c6ef26d7719
+:01b290145d872e8e080be8652e0d8d7108d805
+:01b2a02b2ddd9ff84c014a32d8b3bde7868683
+:01b2b0400f74780f8bb4b32d9d17d150b3f4e2
+:01b2c0452ef08d36c54dc5e720208bcd840464
+:01b2d02195bd5c325f6e1560d96884e4289b9d
+:01b2e0634dd28e893bc071c2f7994af4235897
+:01b2f0fb3ff709244f89a4b147417643dfcc59
+:01b300f8dbbc2101999c5a5aeea644c80c4d89
+:01b3103a2dc4380150424abf4fe58f6efcdb37
+:01b320a770d2e680aa29cd4f969949120adc78
+:01b330357a4c1b62234afb92cb99ed6f12ec92
+:01b340df1649faeba8234e830ceedada8a5960
+:01b350cf6cdb1d84cec6a0d53d9623e15cc3b9
+:01b3601da9452c3db7eaa141f5aafa8fe2df2e
+:01b370073fba3c548d54a01d24146b4be7911c
+:01b38030382248a1364c2d135e2e818d015474
+:01b3907b7dd0fc092fb4e48ba05bd39dad599a
+:01b3a0d5ed31aa73640757c03e5a4bb3bd0ddb
+:01b3b0d6a19dc99426659946437e5a7b426fe5
+:01b3c0d75cdec2be772b16935f4bcde9f22b91
+:01b3d0fabdfd58eb0b9dad3c8bd6f4895ded67
+:01b3e0f8a4ff8bc3e47cc134d579c083d0ecc8
+:01b3f054a7008fa61b7f88eb1f79b9056cbe5f
+:01b4007fc28b7f91a33237b1946b646e1270e0
+:01b410c2022dc722b242248692a605df272a75
+:01b4203ac43cee818f95b45733fdb8a8b14853
+:01b430e17e51774cb8e37b8a736455bb6f1c96
+:01b440c355d4cfa181e7952a103d020942a83d
+:01b450e55c6a2af1e4f8c416aea570a7f35d85
+:01b46098eb8113c8d6981aa12ead193e493dcb
+:01b470f9059fb04fb20f12baf13d904ee9d551
+:01b480d62b594f9a5c367a6539b9f23ea39bcd
+:01b4905d45a8360b1e91d54694b7adce673f28
+:01b4a033cf1ea872174c8a83c3887cb660f1ef
+:01b4b0338598fc474090b23d15291837afe5d1
+:01b4c08d1df42f7ea78a2db98a5e2c6972e0e8
+:01b4d085981e3c4991e4df9477108fda202186
+:01b4e0aba602191e41960e9ead1d1beda37251
+:01b4f002a256ef4e5a945026cb7dd2cabc228d
+:01b5009f132e7da76dfd075fb40cde898dc970
+:01b51034d895ee334b36b1054b0c9ed05bd8d2
+:01b520d4ec0469c8474e3a33eb3b61c378fdda
+:01b530156c8913e623eca053c2207f6eb75f44
+:01b540bc60ea994200a0dd920c4b264c2cd210
+:01b5502aa2465c8daaa86121288859dd11cca3
+:01b56062a7b28f80838f195446b1e338f369ac
+:01b57047a19045a675d7d808b1965b4b33112f
+:01b580177da31b8b07e199e5b2f5a7ed02cddc
+:01b590298d8e788cd53c34631f75d3a8fdbb74
+:01b5a013f277be5b9e6b05daaff9ef5dd77dd2
+:01b5b066983fc07cbd405deba03355496c05db
+:01b5c0da9a970b47a63832920d1741f1227413
+:01b5d0a227391b8c1bafb3adc0e976606dd143
+:01b5e0e435eadcbbadf59fe29380c76e6ae4db
+:01b5f057ed1a519a00265f1641bb97911be633
+:01b6001b5eaa6045bd003fb560c00a147b90a4
+:01b610302b95d74852b6b18192e0ef857d1812
+:01b62058d4440386c73e6d9700b94b5182998d
+:01b63031b70702d65a9fc9adae7306ebdef890
+:01b640fb5bdf445cb86201a5068712b200b236
+:01b6506b713dad09ba2d2c495ae39f5184bf23
+:01b6609e981008bfc4a5547f8672a0f4826928
+:01b670e6abdc8fc36a430110db8354d8bcf611
+:01b6808aa734101e8e56b7a2a13e07074842c8
+:01b690e54ee8d567a250fd4a881c9e7b065e10
+:01b6a07b6a6ca2160c3be7906d6c455eba2968
+:01b6b0e23703f78eb9d56eb66d5158e5e6832a
+:01b6c03ac05992f4245c486ea88f65a6ff6c95
+:01b6d05e6ee194f633744eaab1be939abc6874
+:01b6e0b7273df635856566f563169e14765c94
+:01b6f0169776ced110d71fce5c5207abd7837c
+:01b700ec17b19c613708340136ec2b4e02948e
+:01b710c612556da239058bcc258d8be909f069
+:01b7202198e060f5f8393456516e4b79387e37
+:01b730d4669696c58aebbeff3a383bc6720111
+:01b7405589596d4dcf26cf1f1d0d96c17b48b6
+:01b750e8e5b1f67414fa9a0e27218c164f89dc
+:01b7602c1aeb736d085663a07dde70fb77e41a
+:01b770d803a524385327724401054a411bba7b
+:01b7805ba5370bc5819a068d0ec0114cb6e489
+:01b790ebf0565fe36227d6a95ac68518a4d420
+:01b7a0b50d3deeba2e6d4bfab4e6054d4872a0
+:01b7b0d29c22aa2108ddb9487af094de6f3342
+:01b7c03a2acdbd7d8d9adb20437b068fe66a4e
+:01b7d0379cac67c386c9271d1e1d544b076b2c
+:01b7e086ab0eb38ea281c9c672801bc03306b7
+:01b7f0116dbc3b729adb64d627c26d1b27567f
+:01b80089fb81663ef526586e733cac9f8f663f
+:01b810006ba28fda8e2ffd34ded4b6b7972646
+:01b820947fccb638a6c1dedccfaac8040d0b82
+:01b830f27d819dae2f8781667236ededd058f8
+:01b840ef693f84eeb11da5d5d5b6199ce2f74d
+:01b85076f457c7cb06ccb668729ec8c8db4b15
+:01b8600848a09b9eb2d5b1ea4fdd82f9cd02b2
+:01b870fa53b47608f04b5fad6e92c2834446e8
+:01b8809537ac86234748d0c1df5122478f8ab9
+:01b8900ef6128c3ca851d3523bb2cff7800a34
+:01b8a095442db3d1993dde152c8d68f7718b54
+:01b8b0a4e9f533cea673ec91f7d8798c7a2c00
+:01b8c0b7e23c9a063338d7bfc7a106c8e7cbb7
+:01b8d025a2f93bf4f925bdf227e16ebceb5f71
+:01b8e029ff9a46fc7cf83973b80a0c78b604a1
+:01b8f05e515104f8b79fa555a72899583d3d71
+:01b900f0d7a53c53da22be1bd85493b33be324
+:01b910fd5a04229403192d83a3eb165a4a0d0a
+:01b9209511671204f02cae40d4d5a4a67cbadc
+:01b930d7401bf5e703172562f4a0623b43517a
+:01b940ccce65e49846067b224015f2411f7655
+:01b950b1b4a8cb0f708323bb17189b4d86eee4
+:01b960af48eff813fc01861d8f6a58afdf9753
+:01b970f8906bfb6b3ea607e78e2169526504e4
+:01b98045aa966a4950bd4849baef351c87fec2
+:01b99049c826ca1ab1058aede06ef0492c3d77
+:01b9a0184ec5a20bba939b38c687c0724debff
+:01b9b074790bcf475a9b0a03773eeca73f8c24
+:01b9c0b491508d6aed84b7e5ea86929479191c
+:01b9d0966f0af4402cbc7b5e8a3b91c76c540e
+:01b9e0e325987807c232943f4d97bcbca62f09
+:01b9f01d88d6b3afc50c00906b4c6ef1e7313c
+:01ba00ea152b9a9583a40bc74d647a768b94d2
+:01ba106204c975ac8870161a989baf84ca6f39
+:01ba2067501548fbace132925ea15e72f60fb7
+:01ba30c29af0a2386685f1b0c5cb7c41b07ffa
+:01ba40575057b6315cbdc01d4d3454821b65c6
+:01ba50dbd1f9b71dd02409ce1c5b3455bbf9de
+:01ba60091719c9178ade91e06cd564429596e7
+:01ba70d4034c2da41b36b5b34510c117ed9884
+:01ba80dcf5881ee8f172ca2fdeee4acdc481b1
+:01ba904c0210cfb7c4e6a5c855a24bade3f0ea
+:01baa009ff2d2bd6aaaaf779749f6458536d19
+:01bab0d4e1fd90e4de5e1dccbb98aad90974aa
+:01bac05eb0bc33421c3d1ea74f736d8da2fd24
+:01bad042d871c10426e50df63cf50071d1cb7a
+:01bae004b4cba73919fcddde52d324d378e95f
+:01baf0486ff34ae5157945b13ebd2a1547e303
+:01bb00ef285b37d87bd4619f42c2acb8aea394
+:01bb1042bc74b2818c83d838386375ced05e17
+:01bb20be9cde2eab36ae5ce205f12535d7b14f
+:01bb3070925965dac368476b860d91955cb945
+:01bb403a099996ad68ff22667da00b0356abcd
+:01bb506f6ad541eaddd19ede87cde115c6f4fa
+:01bb60903dcb3a582f55f14be1e6fc356467c4
+:01bb703e8a23e29f218ef9200ca72dedb1c8bd
+:01bb80fc7f40ec1bb7cf58adbe2528ec04f8a8
+:01bb902c96da8d605bb89e709fbcda83bfb9cd
+:01bba0d23449c7c5d8a45717294db5aceea4ae
+:01bbb08b3ea6a0f3703bedd2e1fec3d62c1827
+:01bbc076c73d5d75619ee917bef5ce448d9be1
+:01bbd0ee7a9eff46a2fcc14f260bf1368b3fb0
+:01bbe0b8b322880f514d53c1c669cdd54349f3
+:01bbf0cb3b1619c61b895219f467e8fc438e2a
+:01bc001ca0bf948bb6fe2216527c646d77466f
+:01bc101e13f645352bb33b48381b9f46c2e86e
+:01bc207df3b432eab9ec2ed57a451678f07159
+:01bc30d9a902e76b0f73d754d1244cd1ce59e7
+:01bc40f628836066333eecf29783c78c1a397c
+:01bc50ad148611e7689b333797137ab69320d0
+:01bc6055d9091ecdabc2c49934effd4e9a1837
+:01bc703d33d990120739df988f0c8550b49eac
+:01bc80a09329c9d8e2816795de1ffc8d531bfe
+:01bc9092f8cfabb2e1e768a2c04fe4b9210327
+:01bca027e6b7907f923ec58663fbafa0b40e60
+:01bcb0d8b059726477b35ce7914468e0d30003
+:01bcc00e8ef54e556ec436aae52c5e93bd9b44
+:01bcd04e2a602f1db1629aeba4111d61a5f942
+:01bce03a2391ea3844997f962a19ac9a61f338
+:01bcf0a2347e9e516c1b0c98012b3759231e1f
+:01bd00c162b27981ac5a133d50c48a74b842c0
+:01bd10d354613e2e60ccb291133d0ffba0bdfe
+:01bd2090e72ca94b8a1537d5ba82d377b2e444
+:01bd3060e5c1b4df5ce367ed684fd7f4d6e0d5
+:01bd4012238d48cd40ed96a43308967bec5f53
+:01bd50f1a6da6b46c8c1c1ba130192916fd5ac
+:01bd60874b2f1d8dbd2e0a13c09499a5345687
+:01bd700ae5b3a4a48f1eb4856ae67aec938725
+:01bd8003704497d114d06eff9f3115705b3a3f
+:01bd90b5d709978ae6c5ec65d5ae7ba22c4ff8
+:01bda07fd64eafaf1114400b8e90fdb42dc2dc
+:01bdb0e525b2da8f962fbd700642389cadca3b
+:01bdc05af770c808535e43ed158e99a8df0cb9
+:01bdd007d13805c9e890f8c641d4dc95309899
+:01bde08c7d71a67c7e9b0b10b1a8d3e49ef614
+:01bdf05b33cc8ba38258069479e7651a4ed450
+:01be00583f36b7cc87f98ffa805fe4e498ed4b
+:01be10a8447b7cfd25349a33867a1e04ba799b
+:01be20a86e0cd2d56b97c3c657aaffbe6bc166
+:01be30bcfb2c26cbb64094fa17b34cd49f35f4
+:01be40a9824ebf4debca3e636523bb338e4eec
+:01be50099337bc03e4d09f34ddfcced777e08e
+:01be60f3d5f62dfaf1a5040140ed79955011e8
+:01be70320b519708cf478a2cbe6bea372f81b1
+:01be802947be3f1a87f3e3ba8167c4dd193cee
+:01be902e9ce6a628dfdb2722c58322fb1e03eb
+:01bea0008571f5e5ced3b9680b82afde012342
+:01beb0770d0f90f49304b77bd6a8e32a881a5f
+:01bec07452f6aa24804a96e8eda2d5199eb97e
+:01bed0c33059df9b05c197aba741e235006fe6
+:01bee05c21280952c3c75dc7696e84126ef076
+:01bef0a87e845f16ae0266392eb3f888815eb9
+:01bf0078258b991ba24d767a7026f3c6484981
+:01bf108061b6c4ed67974c1c9a5b9e9ad87f59
+:01bf209a40b659ade710acbb53672b86b30047
+:01bf3090890c1e84ee2c268f5002fa8e66907f
+:01bf40b7e5f14aedbb6d09ea01d64ed78f2572
+:01bf503fd511f14e47848139415c165e621ca8
+:01bf60cd1253869900418d21e985591a6a2ec3
+:01bf7000f066244088fc1e35eede713214974c
+:01bf80c012205b1e836f5c948559533fef0dd4
+:01bf900565c74bc94717ac1560a3e205e35bf6
+:01bfa092f625d7bc59133d15e3daae69dd58a8
+:01bfb0fc56730e52f54f8aacfe3cc0c022c732
+:01bfc09cd760eb6262bfbb752b3f3e2793f57f
+:01bfd0bc12449972f84c8949848d41b7515319
+:01bfe05ade06f6347644dc488f41fce1d7a70c
+:01bff0b8c7bbbd8ad6bf573cfab4571be94b4b
+:01c000034217e08a6e259cc76e4461866a46b7
+:01c010aa4cd33a141efd8a0457c881dd6ad8ab
+:01c020ad480995327310fcb4e3c4f39d18739e
+:01c0303e8701131aed1f77c63b393c1b32c64e
+:01c040403317107da47cc67a2fd05baa9cd7d7
+:01c050d4bf259e2182e178ee35351052146525
+:01c06090ba5f2f4a50819c6a199a8c49697349
+:01c0709594b898e2eab63d960021694bae4e29
+:01c080c9b372a05d1fcf5db1e3784447d37605
+:01c090a607ad79715199aa1103e8f3f459df9f
+:01c0a0290abcf5037183b595521eda6c77424d
+:01c0b0fe1047c67c5f0cc898976a7f49caa062
+:01c0c04ad125c9cc746ea70c1bc6e61a6127c4
+:01c0d02388bd19e86584e7a0921c5f4e02449f
+:01c0e0360ac841c187ce8ce16aa6059d1d0945
+:01c0f0521b0a03c27ac117f5edd16de1e34bb0
+:01c1003a226d7e243f293f177a92e971fdbdef
+:01c1106c91e03abdab61837c45c092e004eb2f
+:01c120975d612dc78208d3d1f7ae9db35b13a0
+:01c1301e2a961e3a8ed92bcefb095942367866
+:01c140f9459423a04da08d8d5c41ab3ef2119e
+:01c15029139a88622dea0208449504add0f318
+:01c16040482e244ee54de5bcfdca99fc5c47f5
+:01c170ef25e6a7f9a854ebce28a79d9632b59b
+:01c1801539d940d7abb4293483b64270978d22
+:01c190051a8f8430837682c8cea2bdd81be86f
+:01c1a04f1325d60f576ece180e7e159d335322
+:01c1b027598859d9998a4981cef79fef0bb424
+:01c1c0f4fc24466f68f952bf05f4fe6c1f4427
+:01c1d077646058be98f2cca51867e8177731dd
+:01c1e0c18847578df21166921e38437140579f
+:01c1f0d5d49fde60ff50b1a1b854c73adec045
+:01c20062aa1bedfb6048a1c92b841fea9f277c
+:01c2103ec5f3ccda1fd8e3cf23bd5c4a89eb82
+:01c220eca48832e51c0975760b43a05ce8d17e
+:01c2302637b0b58e5b9eedda500cc89d2b42b6
+:01c240a7c43aca76363457bb228e8b986c6879
+:01c250b75d62e3b7e3f0ab0ecd1db7f0f98bda
+:01c2601484dec9a72a5891906ca2cc1ae05892
+:01c270f8244cafd75895dfa9d113b6f225e4e2
+:01c28079e021693c16e63bb6f7f18ceb21f791
+:01c290346a576e77f06be7126e5bcd777a6290
+:01c2a045a796758615bc51165ac424d2e1fc52
+:01c2b080a06ff588ec3b0e6a95663a65ca280e
+:01c2c0b945358f46675a57856818fd70a26e4d
+:01c2d0cc03e176180fc8947bcde2fa2493beab
+:01c2e07be0e9210e3e3397770986fd8f178797
+:01c2f0e4e5ad9210a3c4fa8da44a686c28af30
+:01c3002fca6a916269614d9d3956f583bc28ef
+:01c31098f3576c2b155734c02abed44d5105e1
+:01c32089cec27b859199cc814444359ccb7fd4
+:01c33020c197ff330397a53be229a2804de88f
+:01c340635057905710a77fec74ecf04d48ad7d
+:01c35004fde874ef1cc90df5ce213979d3990a
+:01c36009e71d1659bf8b2f37554e50220f4501
+:01c3703a459ae92814880142c992266da0dad1
+:01c380a60553cbdef1b43af73e63f244e9d02c
+:01c390eceddbf241c8ef96ac368cbf265006d5
+:01c3a020a21f89929c76232822a97a32628549
+:01c3b00f3025339a7c2a7ab9ab75d149c5b182
+:01c3c03d1af938eff01efd32ec43b81325a6f0
+:01c3d0f7576f4afd44ba2cc6c22628f5f6d449
+:01c3e04d7049a2bb3b84d9c041f38ad91a975a
+:01c3f0e932bef100a54ef11e7f8f663f4862a2
+:01c400aba9b1672840f9fd0d95d8070c51c183
+:01c410039121eb9d759281f2b254b13dabf758
+:01c4209d6faa8d2198e4f348a3778badfdc938
+:01c430390506b969c41ebb8628ed196318a1a9
+:01c440f72f3e574a4466b209d9907f3ec8864d
+:01c450aa172441699ccc22adbbfc7fd91675a1
+:01c460f198474ab83f74909c1be036fa2ae053
+:01c4702fa4b7174ff829bab62cb43b9271bae9
+:01c4808b2a272193aa1deae9b959fdfe0243a6
+:01c49089618bf1023e9e703a4a83f1c12f97d8
+:01c4a073adfb6acc32c587af56804ecd0d9f33
+:01c4b0e392517dcf9fdd2ce327dddc560260f7
+:01c4c0331ff67c7762a18fb1b60b0812ce9902
+:01c4d07386d5c67c405121dcf42834e6a22fef
+:01c4e03a4712545e8f561f7c4e8fd1ac58e30c
+:01c4f078f8d9c6fa190b4bc414d29fe1ef1816
+:01c5007d8f695a5db58e4e40ccabe11fa5b625
+:01c510b3561847bc5b22e02d8e35126bf24d47
+:01c5209c5795cc6e20df3672c04f5693a74121
+:01c5309ca383d467f9963e1c37b8c951181963
+:01c5405f9a03b74a45eaf8e611ac77d99f8814
+:01c550e77b1aa8324d37765e37bb0b637c2dfe
+:01c560091d8e101c28420d4b868b24cb480037
+:01c57029caec60eb8eaaf02118a36a6994af11
+:01c580236d357367a3185be807179cea80bdfe
+:01c590b88b74d5a58d9be449270c4f32cc21a3
+:01c5a01bae3179b1d3009c7b7bf5d5462cbf5c
+:01c5b08e6c753dbe2362073c9286ee08d4ce3f
+:01c5c07d36f9a1ee34ddf645067ac8017bb493
+:01c5d037f4c481a77b5f0e67d295a5b5472265
+:01c5e03f3db950574398b1992605c1bb9d4807
+:01c5f0cd8be36b49a8e4b565e4404af7ba54d3
+:01c6001a5445e54005ebc27347c591d5e2b3ee
+:01c6108a0fe2b1341f040ebcc687f64f332fe4
+:01c620246547109a12def97c09467033a0eb0a
+:01c6301c56b21644f6b4a2a750f147aa16ce3a
+:01c640d393e9299ba4e07300b3315342dcb926
+:01c650b7ff7ca879a0cfdd9f85210780c1ff6c
+:01c66050fe97f1196521b11b61726540bc8af7
+:01c6708bef0fcd25a59521a730488d7eb8d8b0
+:01c680ffceab9c87fb77c90b140f046b99df2d
+:01c690e2a00faa64b33f8505957a87a7e0cae5
+:01c6a0d8ce40e4daef4d41c977f5cb1532905f
+:01c6b03ab1e80e92ca5eb9263d2f1bffcd8f28
+:01c6c08796b7059e034dafb36dcc95c0331b3b
+:01c6d0752e2065ffd258bc6c3d4959f8d3d9fb
+:01c6e0fecd7df4da27782f84c22eb26be3e22e
+:01c6f0217c50273e6651fa275493ea65468c73
+:01c700c712df9cabe5011a44f08a45b5f693e4
+:01c710f59d85e44b484f667acd33d25e3afc7d
+:01c7208e21dd947aa32f60eb9c8972fc584e97
+:01c730e41683d5ec329b3ea68b8982c4c0e462
+:01c740667315629a32eebb54de02a209befd9c
+:01c750b94f34b20a5757c47e05059edaa924cd
+:01c760ed441559d4810da45502fc74bb27a9c3
+:01c77062793f9ae18af521c14d220e77c1ccf1
+:01c7801b7c3b24aa7ece6538c2ce509bc01376
+:01c79042e0216f27d32dc8372b18478d217d12
+:01c7a0e17fccf04e8f86a360d7dddf6bd34f32
+:01c7b096531a6d87bd49ee07be61822dd4e8f6
+:01c7c0d66473f37b27ca1bdf28af31651ab5a2
+:01c7d0035cab88b0236c8e565f7d74307bc5fc
+:01c7e06e36c963065b75c8771d178d69ddecdb
+:01c7f06e6934936a3b3ea5d5f8d7da389b9f3a
+:01c800acaf18422586750a48b3c38b84ac63fc
+:01c8105f787c226bf9c929c96fc983732be2e9
+:01c820557dcb58e45057cf63d4cd2a0d54b24e
+:01c83099f81c46a29ed60d701e98b48c924b8b
+:01c840a9f52006afd40af150b4a3a40f9fa336
+:01c850e6f659cef1a118779c17eb4aa72197ae
+:01c8604772c9794ce57538a72a8d266d710eb2
+:01c8703b9fdc5e57da81aa4215a3518011fc8d
+:01c8805a9a0fcc855bf59fd4caf8bc3dfbab42
+:01c890c753f346fbeb0fd4cb8e372981d65c0b
+:01c8a0671c5505c1c2b01e37298426133980bb
+:01c8b04377f2504e778e6ed73b0927348640b4
+:01c8c0537cc32a7e05f6bda2eefaee211ca23d
+:01c8d0d63d422edb985c11fdec92b61a336614
+:01c8e05c8b5434802557b91092efaf03157b4d
+:01c8f0d3aa80be96f3a438dc5d599b074c6f68
+:01c900ae23d6c5650783fb6b69f9036052ab30
+:01c9108a5f78384d22ba21ea6ad38a39c1691f
+:01c920b0700c597aa594767f44dca05f02b93f
+:01c930ce50d66cd9a84cee414b5f3e77188d3f
+:01c940913274e2f3f98da4a5bf9cae1e7e87f2
+:01c950be15a84ff7e74555cd9b411961392c1b
+:01c96060b7c5156e308985de610fee1c0f8f97
+:01c970829ca9a57ff05b5c61e7f68dce045a01
+:01c980bf806547f8606a76a79102333697c57b
+:01c9902247f9f24f0b4694beb3bb19210fc784
+:01c9a0105ae12d19bf869313b0b2d7c93cccca
+:01c9b09e0fef24b2b609fb8d9d15febac6f4d9
+:01c9c047ddb46062b25d408a5e6e9cec5e0ba7
+:01c9d015c2f0bb7d74b2dbfb8fce582c6af933
+:01c9e045eca860bd513c51ce39bc67b0c5ee5e
+:01c9f0c4ecffd20657b9af9b8d420e4cb50f0a
+:01ca0055f76490dbc11a938d7b37925e9033cc
+:01ca10f90138c3a3c11e233b6b07ac7e311049
+:01ca208928723457b8f7f0f677ba4eaa42f1c6
+:01ca30bd2022fd2014ca6d4365d4b244017006
+:01ca40d992f4ff13f20cc85cedac0e6325f7a7
+:01ca500d3a36853faad84db968b8b680282c0a
+:01ca6093e4cbade87499c7ca657dccc05a74de
+:01ca70038d3658f3a30f6e6440037d3fd3ea7f
+:01ca808994c67a1399329c784b79c2697a4a9e
+:01ca90b97bb3eff40e8dd6876b5afb5078ca52
+:01caa0b92c3a51fe000900811c23c4997c5e55
+:01cab00349d13e0051089e97f047dc0030b496
+:01cac08760bb59010f6f10ebb573cec2262773
+:01cad0ffb1e21958fad9212456fa6d6cdde4fc
+:01cae0d93a617be116cb2387ddd123c332bfe7
+:01caf02c3bd8674e8e67f71951cf7eedf9ecde
+:01cb0092f48c2c3f73e9e23286fc4603dca55b
+:01cb10d9f985e4898b5957f09aadb32156a9f7
+:01cb2016cafcc78b5ff02c3035ff850c6a449d
+:01cb30f910b452093065c2ededd261957045c8
+:01cb40e77fd113ca62736bda311e3fddabc5e1
+:01cb50edcea7cadc6fcaafd4ed4f7c5855b36f
+:01cb6053092d4aacf368ff077506cfafb7cb75
+:01cb7062914b41877ccefd07d55da6c2764ec9
+:01cb80d00247e2d33dc2824c418f9f6b9e295a
+:01cb90c499bf2885fbe83595cfc245cf84333e
+:01cba08d9e5dda589a951461db50b6470086e2
+:01cbb0b4d97f87dcf4a6767a7b2784027fb182
+:01cbc02485e516c07a39a32cc059482579ed59
+:01cbd017798dc3d5a5ab34ee0280263d05c832
+:01cbe081564b7c59a4e2339367d4b488fd85eb
+:01cbf0ecc7360412ee11cb2b26b9e0c26b0709
+:01cc00bef4d66bf2ab108d17b6935b1c533ef0
+:01cc10547891b2c18f160fc03f5e68fdb26117
+:01cc2017194adfac3654942d7e0a9c7c123370
+:01cc302627ec386a33d783c78d3ddf95e2ee9e
+:01cc40fcbe087725ca18bd8a8099e4ffd92c54
+:01cc506443594977f46ced4416fc99bfbbe7ae
+:01cc60dc04c4d3d4b03110a57324a64bea8e45
+:01cc70b5fcf9cc71ad0c2df877c77b564f8da8
+:01cc805f49270a67041b798f37cb329e572de9
+:01cc909a3fa3ed4eb8a25fa15778157d1d80a4
+:01cca02a4b777d3bd4971262b923a3f642e706
+:01ccb09f02ce26c65cf4d6ed9d309d3e74f6d6
+:01ccc0a65389be73276f4ede0cf73d467ef2f3
+:01ccd000a569efed28a1a4ca933168186c25bc
+:01cce0f469bf4110fdf3654a7da6478702c60e
+:01ccf09158f350b12da77984f226147f5d8ea5
+:01cd00aa010274f9e202bc757da105a7e1a50d
+:01cd10036e3e0b586df473fb9370deff2b003c
+:01cd207b2e65c702c8f4f190d94a921446ce64
+:01cd305148e0f88b1e2c24fa24d384b8270337
+:01cd4007fc2b2a84f453411a53f1adc2d54457
+:01cd507940a270ef5011a3125c158a5efe42fb
+:01cd602abbcc2597554907384561b7f72e7026
+:01cd706437fb77762153377529ad26c6317dd8
+:01cd8070dcd794605883d3c9461d78ecd26019
+:01cd909c58487c37193e7470fc5891f4c42621
+:01cda0b406c44daba0ba449d2e3a6033ffc48a
+:01cdb09f6768a2697c77c6e3fc4c635b8f4f8d
+:01cdc03d32dc83bc1979dd547bb1020c65dff1
+:01cdd0d6407b3c8924a457acf8b7b6d26dcbaf
+:01cde09dd87ce1d49bd854bcc576173e6020e2
+:01cdf050a8afd6c5e085bf684b925fc6cd59fc
+:01ce00a19fae9a6cdaf093a7e4e820f7205045
+:01ce102e2344cb282c5eebe606938b0a4b3b96
+:01ce20084f5d575d02565d83cccd65a3418a82
+:01ce305c78a94eaf4bf3cfefefadc429843bd8
+:01ce40657e20339e902e75039d27086a506394
+:01ce508cb58c25a164d1cad50b8def88dc0e28
+:01ce602840be5c39d86cc726ea63273f55d5b8
+:01ce70863dd218856af39f63f5060fddcff564
+:01ce80f9864bb118a753f2f4217900dd43c46c
+:01ce904bc1ec0222e08e15619871615c052c4c
+:01cea056f4706cb918c09da61cc4c3a63de051
+:01ceb05a53421091f8f60537d51cbcdcc9542a
+:01cec06b8dbcab360679c9afbcdca0ef7c1196
+:01ced092dde3eb9574c72e58746e4389db87f6
+:01cee09c6e7396cd855f03e19d5ece145534b1
+:01cef05f32b9d59f0f6ecc37bc0369fe1ccbcd
+:01cf001f0969a9f78551731a708fa34fc7d959
+:01cf1092d0d024eb990614799dff9708d8302b
+:01cf201a81f246fdf90f9245c1494bf63b6a7b
+:01cf30ad7e32fe0679c4fd32ec8d3537b843fc
+:01cf401351a76c3db89809130ca80aae7fefdb
+:01cf5034c3cdf272a121ee583e82ec372b19a4
+:01cf60a39e8bb00101e64813b3cde71f8e9579
+:01cf70d8cb9313ae4588e172760d4f14b52633
+:01cf809189f352a070ecd9d242830b0e71adaa
+:01cf9046743570c703d3b12f77ae7d8b0a9c44
+:01cfa0243b89cb4f0d80935dc1f720e4cd69e5
+:01cfb069abe2e4346d87a42505ec422bdd1eb0
+:01cfc0a9c39b60e858b5340c9487cd7858c2aa
+:01cfd0a634842810a468a9457b0d10ae0a7126
+:01cfe08fd8b63a2f69c12af8056f7f88dac962
+:01cff05a94a21bd23c257eac7e89869336d5a5
+:01d000917ec0b3a64001134d259b2ee139b212
+:01d0109b6f9e0a72ac3a59fe42e228e2fdb4f9
+:01d0201db3402bfa9ee00003a53cb109c2e77e
+:01d03080670d31793ea5ad7a623cb92285c5ac
+:01d040f1ba70f7c56f0f43a05fcc506b9f73bd
+:01d0503eb04da856b79ccc6f065ef9e06b22c2
+:01d06064814e124b623d28f9a4b1ddf0803b4d
+:01d07024b5ed7aea8ee97c74b19ada7b47888c
+:01d0802224980973335da8d12356ed16e02e7e
+:01d09050c67dc65d0dfab494cd8527a1cc23f7
+:01d0a0d59ace8e03c51e26809c6dc0e7c3cfb5
+:01d0b0f282d87df26f7c76f74fe5980d2a3093
+:01d0c01b9a9a02e56287044cfe3f1921c9a806
+:01d0d06c8342f4003eef1ae2d3b0d756cf3a96
+:01d0e0d43498c82f47d325b2cdb9f3a4f56d40
+:01d0f07cb21f5d4a73eedc485fd3b2b963bb98
+:01d1006ddbdff367c02f92e03543e535f48054
+:01d11035e043e513bf98c074f8733f82e4d979
+:01d120c9b666012956ec0deb1d8c7dcab98e71
+:01d130fe316d7a54765d19611a04ea071b22d8
+:01d1404c96febe98d7ebc2783481d470bd3fd4
+:01d15092ed9c2b9218b4e1039cfa3f593ccf42
+:01d160780783fa778ead1f8afb318bffc61161
+:01d170ccf5053a30b0da059d0f5bee61d6eb32
+:01d18044e2c2ea392b6f2ef2b7e55745fee207
+:01d1908cb822df03278e380759b4ca273f3600
+:01d1a073bda32b0d1b3e897365dd72a726b683
+:01d1b0fc3b20f9aa817a1f35ca7ef2df214d02
+:01d1c053d52e6d64cd3b83185d8f322c0bd9ca
+:01d1d0b764eca8cd16cafb824aacddd03d34ba
+:01d1e0a8a30ac4080f23d066591ce2839e344b
+:01d1f03ea31321173a1b051be5502df6c0dc85
+:01d20089816ae48ffb218b6a31777a00188e40
+:01d2100e6909a9141c77140c97ff0c2bab89de
+:01d220f042cb41d91f54231572b878730e2257
+:01d230d4043bce7cdbe0007d8ac9bc02d637bc
+:01d2400ee5bb964eff49ae5ce56e8763c057ab
+:01d250d91e5790ebc97ae4d99311381d2fd1bb
+:01d260f5f594859a67058e6235b88cef09e0dc
+:01d270b7be81d5ee868a64e385489ea342040e
+:01d2802fe0916950a55a10e25f65aecf0f16a4
+:01d290693d9357525a0cc0653eeb9ead9653d5
+:01d2a0654752648635326d6effd5e7dbb490e5
+:01d2b05e8dbd3a87a1c33fa0f4a0a7e35eb383
+:01d2c0ff24a4fa0b3e9c396758639d6fd75bc0
+:01d2d0e54218e6e098f7c7de1070962fad89b8
+:01d2e0393b3882de62a00b6a76549ed5cf55f3
+:01d2f055981a796205229594aa8cbbdcab716e
+:01d30001b8c793fa241a2ea59ad83781c6d8d9
+:01d310f9bc8de785978ea05fb40c6401afdebc
+:01d32010dd398f6420a14580e2b7ed951e5c9e
+:01d3303cb03a9c1049b9f4603afe7594f3e4bb
+:01d340ad6dde2c3b36a87c22776a9721313407
+:01d350661b7cb168d77fc198cb8ae45afdd9fa
+:01d3604c5bcea2cc6f926442371b9eff22aeac
+:01d370a2677a9ac1af538235f96c2531021d92
+:01d38027385c8a908ae1f861e12fdeda57c9fc
+:01d3908179dd85732b4651eb8fa7eccb3e579a
+:01d3a0b681a04d4b2e0cd40111ff3135b50fa9
+:01d3b0a95e9e9b7a067ba62a3c72e643f6b7e8
+:01d3c08c4e7600579b73a8e7ffb6596e40ea2a
+:01d3d09f209774411b07b0b1bd6a6206e4c684
+:01d3e05674aa651445220503a9da58b0bf9d00
+:01d3f0f5572ea9cd1292cad4efa8eac39d367e
+:01d40039f354b876045a5b03a1027581c360e6
+:01d410c1e1cf1e944289a57dc116f5924b6ccd
+:01d42079605fd340dd0b3b6e58fbaa87fe8e36
+:01d430475a405623e173234392e572a96ec9e7
+:01d44004b1a6436e753dec4e8fca20d2fc1a7d
+:01d450780102004002989786bb71c0e7685208
+:01d46014676ca1867444343eb498b5d0fa1cfa
+:01d470ae7d775d65607c3b049f57e314728301
+:01d48016c66cad78e86b6edb98a96d21fc5319
+:01d4902cc1e3bdc203083bbaf10bdbb662d9fc
+:01d4a0ea700915d95197188580f117cd5fbe03
+:01d4b04544023101247f236d139b66a44ad9bc
+:01d4c08ebb99b8e62e07f1de86ce725a6a7155
+:01d4d03aa951b52f15380558d61565f4c4e74a
+:01d4e0e800c13cf0b117bcdee9bc6096bb1020
+:01d4f00d0a4113cbd1082b7a54c9f8f3d9bc54
+:01d500451f387baab501cd5d0179cfb21a62c1
+:01d5103ce66b17af0056ddbe411b6520743200
+:01d520567f673c0acd2faf2bd7296492107491
+:01d53030dbe642d5b0f22367a30af7c4e2c3f3
+:01d5401f4eb3dd3413e648862cd8de3d79d8e2
+:01d550edecd436641032d4b2bcfa7aafa1d640
+:01d560bb408f721cb3a845c0ca3f6d4ccde1c5
+:01d570555fac945d6aa5e8d5aa99a2def94589
+:01d580358f5446876fdce3280a069e1de3d790
+:01d5902d6d7a21a4a66669bf8a15459db58cd0
+:01d5a082636c5476c29980314002052fc382ca
+:01d5b0214736b9cdd886f0d4dc33b06173094a
+:01d5c0ff688c86476c46b8e02b947dca19adf9
+:01d5d05c7b586db251339d179490e5e9610bf3
+:01d5e0b9ab745d0fcd3e7559936dc3c3e42587
+:01d5f099200bf07e7abdd277747f5c86902935
+:01d600f8cdf9fc7ce255bcc63b7de42bf43153
+:01d610f3a9cc3ee4c549549728127e696e47b4
+:01d62069d4807a80b4f42149810cb98daa58b1
+:01d6304dbab27403b39decd7cf211e824fe2f1
+:01d64038d9cfd2751198aebb179174720ba268
+:01d65030c0d7ab1a74ab0f994b4a63886af3c0
+:01d6604d3eec9e952acb35e6bc4eb7e5aab35f
+:01d6702ad8303d726889ee4fb620b113d18b3c
+:01d6806cdbb860a394c58d0b68b43d59847392
+:01d6901dcefd248c3829429c3600276f822d2f
+:01d6a0ba4383292be8b4e20c6e5019c160e0cc
+:01d6b0aba546911bbf556caf425e22099c3191
+:01d6c093409738f0fc1d1343c5f421d61aeb6f
+:01d6d084d16eddc8f6b96e164ef9bea20f0977
+:01d6e02b563bd756bce8dbf86ca26440e94514
+:01d6f0f6ddb0bdddd2397e44f458502fca0a62
+:01d70037195028723aeb89fc17e41a7d0b0991
+:01d71098b62a29003609020833539737a5f755
+:01d720e360e9ffc117b90aa43ff3c69fc29484
+:01d7305a402aba16cf97c5e190ec50b2a62cef
+:01d7406d61417987294d409695951140422103
+:01d7508ccbfaf7c6edd23345965f84b9266cad
+:01d7608440b908ad967601c3ec6056c336a6d1
+:01d770270c1d58353c8df705a1f93bf3a5bed5
+:01d780b0711266830f3a2ae981fd3e2a84e0ca
+:01d7908f14e99c1b8f48c0a335ace9c6c3ff7c
+:01d7a0af41e73b43a88e3d514d27a933aa7dfb
+:01d7b09b3191ad12c35d14a49d0b6477baa29c
+:01d7c06b439e0cff57d3cc9ef1675b67c23cc4
+:01d7d0b7f1e5b663c491471dc8307371c82b1e
+:01d7e0530ff4c0ed32a7e937a323cfcfb0e461
+:01d7f045fcc16645595ae881922ddc04310497
+:01d800ed8b0885bceb114dc6bcd935ca0363c0
+:01d810ced52833687f4ef636e3b86b1209f5ab
+:01d8204be05b4d5c08b2a357485a22007b0e05
+:01d83071b870cd6257ba621154a9216e3c7fd9
+:01d840cc23b191c2feb0ef32c5564495f3e287
+:01d850dcd0d4ef1b01774e64c1b25880d2c351
+:01d86088ef839253a43e9511e0408e5fb4a570
+:01d87060b6ab7cb92d8c7161a4ebb9f75a111d
+:01d880015b5e1b70f5216ead2c54e63ebd8af7
+:01d89063bbb7d4b1914d2a3e524f1d55e5c3b2
+:01d8a07e539459716210172432598da2e744f7
+:01d8b063809eb6cfb37bca776044c5651d4f26
+:01d8c0c9409014ccc5261c0625d1d489676987
+:01d8d0b7add1404908e09b1a820a5e97384402
+:01d8e0f57dd533da477eb139552634e01ab46f
+:01d8f0a2797f3abb683888364048ddaadb1a8e
+:01d90076eb8a0e80a977d0d49d730532e9ec76
+:01d91007ca5a170dda6f1a7fc038f2778f681f
+:01d920a9d7ec8f3972327046982ffb194891d7
+:01d93098e6b98443ea69a49e23da68352a73df
+:01d9409c8303cfa79985aa4791990cf18db35a
+:01d9508e66d41ec16bb3196c83bbb618f4615a
+:01d960eb769455d55fdafea565fa212c91411c
+:01d9707582ca319e1221576f9d7364952f227e
+:01d980cd1f30bc130b2adb0f168a70bb678d9c
+:01d990f4bbff0f40ab264c6dcf33486c9398cd
+:01d9a07b35fe9f548ee9f474bcf86cd0af618d
+:01d9b08b8c056c24d9b018ac77ddfc284fede0
+:01d9c05c67f5649f5322e6afb28d900a7dde14
+:01d9d0be385075a2e3df7e77101631d34931bc
+:01d9e09cc1f95c9e77f67c8b51832d6b9fe5b6
+:01d9f0ffb69b4a6822cdfc9c13b76531c109d2
+:01da002d919faa25a3a462c191839fc693dde9
+:01da1033188074beb7bc6d587ea22ab147e39b
+:01da20a26dcb1ef313a0fe14267cf37ab4aa4b
+:01da30803c9bc6158ccfa5132e8b8162e911fd
+:01da4020d0e8e3408e339bc47af066ef6b68c4
+:01da50a4e1310c7f7746c2093cdaeb177093d4
+:01da603ac106222ae2471b3ca8a536d6484c8f
+:01da7062060929713e982c95e6f8321429ad87
+:01da804c73d80de35946c65d2e29a688dcf78f
+:01da90799528619c71eb0dccc2ef78a6be9d64
+:01daa0c00ebdc48f989cf8a2e2f0479c0f8353
+:01dab08a095a7df5b36df84a9b6274e6de7145
+:01dac09746f449297117fd8e47e84e91405a87
+:01dad0ee09ccb0f3287118b32ad96b4e0c5430
+:01dae0783ee2500414bb5319c5059f1e490a6f
+:01daf02610087645e6c5dddb8cb2a944ecb0e9
+:01db003194e4d32838ed2d3192c4ee27575ff4
+:01db1076fb851bb43ed84ceecd1fb7cd7d6387
+:01db2022ca6f34c7794f6876524befae07d2e5
+:01db3055c20f2d9a6f184a473d42885e1c1898
+:01db40ed3acbb833b88f7c94dab42cf5b126a5
+:01db508896dc03f8db4e39a230a759afa604c5
+:01db60d21fc039a351d18509e0ed32a0f7bc64
+:01db7093fa6e11f3b85361370efbc3e2fc3871
+:01db80d28b57e110b61db576e65874a9627dee
+:01db90089eff20e68e5aa8301e0f79f34b0839
+:01dba028e50d6ef4bf838a2f5852d8f6483a1f
+:01dbb00f595423081409f9c2f2093500b6d3ff
+:01dbc09b3f884993f85581e672f4512dc61c3a
+:01dbd0501afdff53e0757e5972647ae56719a4
+:01dbe0252dcd50df02e39c3c38b80d11a6b1f4
+:01dbf0d5a8534171628dc6786429b8b881f7ee
+:01dc00eff2b1cf8c3883187240c14bc50d0226
+:01dc10d422984bbd118bad7b882d4fa989dc51
+:01dc2085639dc40cdea0afe1efd181ef95181b
+:01dc30640dff30062597125b468e65b40ed22a
+:01dc40ed799e2a277be6a86b07e8be1ea1f1f3
+:01dc503b33cc4b9d250ee7c9dc18b444042d9b
+:01dc60f65ea79e558df0336f37de4f87967ce4
+:01dc7093362d9c7ad09389f7c2cdf4c820b609
+:01dc80ec61bd19b4e0b4a82260d686b0f37030
+:01dc90f73977c2aa2c7352af5104aca7a43104
+:01dca0497ef5a2b77eb9e17cfdb88b32394309
+:01dcb0c10cdc448086cb4dbec26a216d177476
+:01dcc0960d0005168c944050e4f891afb49442
+:01dcd0bef544ee50eb052c01808abb922f0eda
+:01dce02e7efead11183ec782ccc020d5200b39
+:01dcf0e945798e142b3aa5ab3d32822a4c2cf8
+:01dd005c6487d11c562fd560fd539d596f6c7f
+:01dd10bde9bf4aaf21eff8fd8a78512ae7fc36
+:01dd20f98592e4e4864d140e389c96f18bf8b3
+:01dd306105577c171457beb9e6e355ccb479f1
+:01dd408a9fec9ada3525458563143666655a90
+:01dd50bbea8fbec432e4f7bc72845de28527e8
+:01dd603c25b47c764e30b71bc551336faa5e51
+:01dd708e37d30d35e7f417e314d9ca57e6de31
+:01dd80f7f1506abbdc351acfa909de8ca384e6
+:01dd9022fc337855eb3571ef95ca31b23f207b
+:01dda0b2b3be117cf4c152db830b191495dc4b
+:01ddb0ed857d26bc3311211acf12e6760d2b43
+:01ddc0ac0e123a81be5cd68914cc127198e346
+:01ddd0e570762198f854363f2f80c371e9cd36
+:01dde00c39eacc1fe859d22e8665c6dad9f783
+:01ddf030fcda34c59b2687394f49fa2b939e46
+:01de005a0b35e4dfd40bd8177d38fee7a8d7ab
+:01de1097b56f9c7c9bb5b49ea177998de7b315
+:01de20fcd3c5266f62c58e84803d4962995ad7
+:01de306e6097a09d8f7d86f714c3cccce6d1c8
+:01de4044bb8afe4bd8740f6b2de089ee9b9d1e
+:01de50c9876cd1ee97d89fa2471d2b4483b78a
+:01de60c3dd30525642d3019a9001ffa67fb741
+:01de700a08f20d9175084a402a52f3b585e85c
+:01de805ccbe33a56f48051a2af395f73dc1939
+:01de90146b8267731e6b9152eeec05f9917a28
+:01dea09ef254929a3ba34b7b1b2ca2b65d568b
+:01deb0922cc0dabc55b2598ef030826d84904a
+:01dec09a6a2fd207b3be37f2c61144299eebef
+:01ded00ba6ea54d803488cfcb56b86094d2b8f
+:01dee0534bcf81eb388baab91e664193acd05f
+:01def00becda526bf9582a79c37ff8308fc5ff
+:01df0078e07d0f01b4c8e7bfe0ddd6e6131212
+:01df105b96bffafc0a5f9ea86cb7870adef5f1
+:01df209c4c339e4a3cbb4db551708c9566afaa
+:01df30a611f9c369718d6ff245e1d5ce66b91e
+:01df40e2cf3610ab3cd9d3dee29723f9474497
+:01df5008212e128a128435fdb1f3d3181bcd5d
+:01df60b360015fe96c85d4fefa8c0611ab55ad
+:01df707e946b2b6c72c8f96c21c11037b40a96
+:01df80f523bb7d5824d46c98894f0b37ba63dc
+:01df90ce556bac62b03a6b4a04d279489732b1
+:01dfa080ef8d96c7b2fe733a002223f781adf4
+:01dfb03b061a4f018dbba00e7ecb00e8a96eae
+:01dfc078b0635d9d9292c955173e67c234476e
+:01dfd0b1b2b71d0fc1d2e408127ae837568f21
+:01dfe0e4a24b2c9b6c8347aa792422cb369ac9
+:01dff0a0d47ece4dd17fa1a97581942772a131
+:01e0006c8c89ce6687c7ac43f3273d9e1c3583
+:01e010eea86f42