aboutsummaryrefslogtreecommitdiff
path: root/modules/objfmts/bin/tests
diff options
context:
space:
mode:
Diffstat (limited to 'modules/objfmts/bin/tests')
-rw-r--r--modules/objfmts/bin/tests/Makefile.inc34
-rw-r--r--modules/objfmts/bin/tests/abs.asm5
-rw-r--r--modules/objfmts/bin/tests/abs.hex5
-rw-r--r--modules/objfmts/bin/tests/bigorg.asm9
-rw-r--r--modules/objfmts/bin/tests/bigorg.errwarn2
-rw-r--r--modules/objfmts/bin/tests/bigorg.hex38
-rw-r--r--modules/objfmts/bin/tests/bin-farabs.asm53
-rw-r--r--modules/objfmts/bin/tests/bin-farabs.hex59
-rw-r--r--modules/objfmts/bin/tests/bin-rip.asm20
-rw-r--r--modules/objfmts/bin/tests/bin-rip.hex46
-rwxr-xr-xmodules/objfmts/bin/tests/bin_test.sh3
-rw-r--r--modules/objfmts/bin/tests/bintest.asm56
-rw-r--r--modules/objfmts/bin/tests/bintest.hex65
-rw-r--r--modules/objfmts/bin/tests/float-err.asm12
-rw-r--r--modules/objfmts/bin/tests/float-err.errwarn8
-rw-r--r--modules/objfmts/bin/tests/float.asm10
-rw-r--r--modules/objfmts/bin/tests/float.hex48
-rw-r--r--modules/objfmts/bin/tests/integer-warn.asm6
-rw-r--r--modules/objfmts/bin/tests/integer-warn.errwarn5
-rw-r--r--modules/objfmts/bin/tests/integer-warn.hex25
-rw-r--r--modules/objfmts/bin/tests/integer.asm8
-rw-r--r--modules/objfmts/bin/tests/integer.hex25
-rw-r--r--modules/objfmts/bin/tests/levelop.asm4
-rw-r--r--modules/objfmts/bin/tests/levelop.hex12
-rw-r--r--modules/objfmts/bin/tests/multisect/Makefile.inc51
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-align.asm12
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-align.errwarn3
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-align.hex17
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-align.map66
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-ssym.asm5
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-ssym.hex25
-rw-r--r--modules/objfmts/bin/tests/multisect/bin-ssym.map16
-rwxr-xr-xmodules/objfmts/bin/tests/multisect/bin_multi_test.sh113
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-loop1-err.asm2
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-loop1-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-loop2-err.asm1
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-loop2-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-notfound-err.asm2
-rw-r--r--modules/objfmts/bin/tests/multisect/follows-notfound-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/multisect/initbss.asm5
-rw-r--r--modules/objfmts/bin/tests/multisect/initbss.errwarn2
-rw-r--r--modules/objfmts/bin/tests/multisect/initbss.hex0
-rw-r--r--modules/objfmts/bin/tests/multisect/initbss.map17
-rw-r--r--modules/objfmts/bin/tests/multisect/ldlinux-sects.asm102
-rw-r--r--modules/objfmts/bin/tests/multisect/ldlinux-sects.hex11363
-rw-r--r--modules/objfmts/bin/tests/multisect/ldlinux-sects.map148
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect1.asm31
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect1.hex20
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect1.map78
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect2.asm42
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect2.hex66
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect2.map74
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect3.asm9
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect3.hex2
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect3.map54
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect4.asm31
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect4.hex768
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect4.map97
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect5.asm22
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect5.hex1816
-rw-r--r--modules/objfmts/bin/tests/multisect/multisect5.map138
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect1.asm10
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect1.hex512
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect1.map54
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect2.asm12
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect2.hex512
-rw-r--r--modules/objfmts/bin/tests/multisect/nomultisect2.map54
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-loop1-err.asm2
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-loop1-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-loop2-err.asm1
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-loop2-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-notfound-err.asm2
-rw-r--r--modules/objfmts/bin/tests/multisect/vfollows-notfound-err.errwarn1
-rw-r--r--modules/objfmts/bin/tests/reserve.asm14
-rw-r--r--modules/objfmts/bin/tests/reserve.errwarn4
-rw-r--r--modules/objfmts/bin/tests/reserve.hex233
-rw-r--r--modules/objfmts/bin/tests/shr.asm3
-rw-r--r--modules/objfmts/bin/tests/shr.hex260
78 files changed, 17435 insertions, 0 deletions
diff --git a/modules/objfmts/bin/tests/Makefile.inc b/modules/objfmts/bin/tests/Makefile.inc
new file mode 100644
index 0000000..e29ed72
--- /dev/null
+++ b/modules/objfmts/bin/tests/Makefile.inc
@@ -0,0 +1,34 @@
+TESTS += modules/objfmts/bin/tests/bin_test.sh
+
+EXTRA_DIST += modules/objfmts/bin/tests/bin_test.sh
+EXTRA_DIST += modules/objfmts/bin/tests/abs.asm
+EXTRA_DIST += modules/objfmts/bin/tests/abs.hex
+EXTRA_DIST += modules/objfmts/bin/tests/bigorg.asm
+EXTRA_DIST += modules/objfmts/bin/tests/bigorg.hex
+EXTRA_DIST += modules/objfmts/bin/tests/bigorg.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/bin-farabs.asm
+EXTRA_DIST += modules/objfmts/bin/tests/bin-farabs.hex
+EXTRA_DIST += modules/objfmts/bin/tests/bin-rip.asm
+EXTRA_DIST += modules/objfmts/bin/tests/bin-rip.hex
+EXTRA_DIST += modules/objfmts/bin/tests/bintest.asm
+EXTRA_DIST += modules/objfmts/bin/tests/bintest.hex
+EXTRA_DIST += modules/objfmts/bin/tests/float-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/float-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/float.asm
+EXTRA_DIST += modules/objfmts/bin/tests/float.hex
+EXTRA_DIST += modules/objfmts/bin/tests/integer-warn.asm
+EXTRA_DIST += modules/objfmts/bin/tests/integer-warn.hex
+EXTRA_DIST += modules/objfmts/bin/tests/integer-warn.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/integer.asm
+EXTRA_DIST += modules/objfmts/bin/tests/integer.hex
+EXTRA_DIST += modules/objfmts/bin/tests/levelop.asm
+EXTRA_DIST += modules/objfmts/bin/tests/levelop.hex
+EXTRA_DIST += modules/objfmts/bin/tests/reserve.asm
+EXTRA_DIST += modules/objfmts/bin/tests/reserve.hex
+EXTRA_DIST += modules/objfmts/bin/tests/reserve.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/shr.asm
+EXTRA_DIST += modules/objfmts/bin/tests/shr.hex
+
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/Makefile.inc
+
+include modules/objfmts/bin/tests/multisect/Makefile.inc
diff --git a/modules/objfmts/bin/tests/abs.asm b/modules/objfmts/bin/tests/abs.asm
new file mode 100644
index 0000000..e34b14a
--- /dev/null
+++ b/modules/objfmts/bin/tests/abs.asm
@@ -0,0 +1,5 @@
+[absolute 0f0000000h]
+foo: resb 1
+[section .data]
+bar dd foo
+baz db (foo>>24)
diff --git a/modules/objfmts/bin/tests/abs.hex b/modules/objfmts/bin/tests/abs.hex
new file mode 100644
index 0000000..a5612f0
--- /dev/null
+++ b/modules/objfmts/bin/tests/abs.hex
@@ -0,0 +1,5 @@
+00
+00
+00
+f0
+f0
diff --git a/modules/objfmts/bin/tests/bigorg.asm b/modules/objfmts/bin/tests/bigorg.asm
new file mode 100644
index 0000000..a02ed32
--- /dev/null
+++ b/modules/objfmts/bin/tests/bigorg.asm
@@ -0,0 +1,9 @@
+[bits 64]
+[org 0x000ffff100000000]
+dd end-start
+start:
+mov rax, $
+mov rbx, $
+mov rax, qword $
+mov rbx, qword $
+end:
diff --git a/modules/objfmts/bin/tests/bigorg.errwarn b/modules/objfmts/bin/tests/bigorg.errwarn
new file mode 100644
index 0000000..30f590d
--- /dev/null
+++ b/modules/objfmts/bin/tests/bigorg.errwarn
@@ -0,0 +1,2 @@
+-:5: warning: value does not fit in 32 bit field
+-:6: warning: value does not fit in 32 bit field
diff --git a/modules/objfmts/bin/tests/bigorg.hex b/modules/objfmts/bin/tests/bigorg.hex
new file mode 100644
index 0000000..f26abd8
--- /dev/null
+++ b/modules/objfmts/bin/tests/bigorg.hex
@@ -0,0 +1,38 @@
+22
+00
+00
+00
+48
+c7
+c0
+04
+00
+00
+00
+48
+c7
+c3
+0b
+00
+00
+00
+48
+b8
+12
+00
+00
+00
+f1
+ff
+0f
+00
+48
+bb
+1c
+00
+00
+00
+f1
+ff
+0f
+00
diff --git a/modules/objfmts/bin/tests/bin-farabs.asm b/modules/objfmts/bin/tests/bin-farabs.asm
new file mode 100644
index 0000000..4d931c1
--- /dev/null
+++ b/modules/objfmts/bin/tests/bin-farabs.asm
@@ -0,0 +1,53 @@
+keybuf equ 0040h:001Eh
+
+absolute 5000h
+label:
+
+section .text
+absval equ 1000h
+
+org 0x100
+; Using seg should yield the segment part.
+mov ax, seg keybuf
+mov ax, seg (0040h:001Eh) ; NASM doesn't understand this syntax
+mov es, ax
+
+; Use without seg should yield just the offset part.
+mov bx, keybuf
+;mov bx, 0040h:001Eh ; Illegal
+
+; Each of the below pairs should be equivalent (and legal) in Yasm.
+; There are some differences from NASM here!
+
+; Defaults to near jump (on both NASM and Yasm)
+jmp keybuf
+
+; Direct far jump.
+jmp 0040h:001Eh
+
+; Force near (non-far) jump (just offset, no segment).
+jmp near keybuf
+jmp near 0040h:001Eh ; Illegal in NASM ("mismatch in operand sizes")
+
+; A couple of jumps to "normal" absolute addresses.
+jmp 0x1e
+jmp 0
+jmp absval
+jmp label
+
+; Non-absolute jump
+label2:
+jmp label2
+
+; Non-relative access
+mov ax, [0]
+mov ax, [label]
+
+; Direct far, explicitly.
+jmp far keybuf ; Illegal in NASM ("value referenced by FAR is not relocatable")
+jmp far 0040h:001Eh ; Illegal in NASM ("mismatch in operand sizes")
+
+keybufptr:
+dw keybuf ; offset part
+dw seg keybuf ; segment part
+
diff --git a/modules/objfmts/bin/tests/bin-farabs.hex b/modules/objfmts/bin/tests/bin-farabs.hex
new file mode 100644
index 0000000..5ebd422
--- /dev/null
+++ b/modules/objfmts/bin/tests/bin-farabs.hex
@@ -0,0 +1,59 @@
+b8
+40
+00
+b8
+40
+00
+8e
+c0
+bb
+1e
+00
+e9
+10
+ff
+ea
+1e
+00
+40
+00
+e9
+08
+ff
+e9
+05
+ff
+e9
+02
+ff
+e9
+e1
+fe
+e9
+de
+0e
+e9
+db
+4e
+eb
+fe
+a1
+00
+00
+a1
+00
+50
+ea
+1e
+00
+40
+00
+ea
+1e
+00
+40
+00
+1e
+00
+40
+00
diff --git a/modules/objfmts/bin/tests/bin-rip.asm b/modules/objfmts/bin/tests/bin-rip.asm
new file mode 100644
index 0000000..2211054
--- /dev/null
+++ b/modules/objfmts/bin/tests/bin-rip.asm
@@ -0,0 +1,20 @@
+bits 64
+org 0x100
+foo_equ equ 0x12345678
+
+section .text
+nop
+foo_text:
+nop
+mov rax,[foo_equ wrt rip]
+mov rax,[foo_text wrt rip]
+mov rax,[foo_data wrt rip]
+mov rbx,[foo_equ wrt rip]
+mov rbx,[foo_text wrt rip]
+mov rbx,[foo_data wrt rip]
+
+section .data
+db 0
+foo_data:
+db 0
+
diff --git a/modules/objfmts/bin/tests/bin-rip.hex b/modules/objfmts/bin/tests/bin-rip.hex
new file mode 100644
index 0000000..d56601d
--- /dev/null
+++ b/modules/objfmts/bin/tests/bin-rip.hex
@@ -0,0 +1,46 @@
+90
+90
+48
+8b
+05
+6f
+55
+34
+12
+48
+8b
+05
+f1
+ff
+ff
+ff
+48
+8b
+05
+16
+00
+00
+00
+48
+8b
+1d
+5a
+55
+34
+12
+48
+8b
+1d
+dc
+ff
+ff
+ff
+48
+8b
+1d
+01
+00
+00
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/bin_test.sh b/modules/objfmts/bin/tests/bin_test.sh
new file mode 100755
index 0000000..9ab7e41
--- /dev/null
+++ b/modules/objfmts/bin/tests/bin_test.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+${srcdir}/out_test.sh bin_test modules/objfmts/bin/tests "bin objfmt" "-f bin" ""
+exit $?
diff --git a/modules/objfmts/bin/tests/bintest.asm b/modules/objfmts/bin/tests/bintest.asm
new file mode 100644
index 0000000..c434ce9
--- /dev/null
+++ b/modules/objfmts/bin/tests/bintest.asm
@@ -0,0 +1,56 @@
+; test source file for assembling to binary files
+; build with:
+; yasm -f bin -o bintest.com bintest.asm
+
+; When run (as a DOS .COM file), this program should print
+; hello, world
+; on two successive lines, then exit cleanly.
+
+; This file should test the following:
+; [1] Define a text-section symbol
+; [2] Define a data-section symbol
+; [3] Define a BSS-section symbol
+; [4] Define a NASM local label
+; [5] Reference a NASM local label
+; [6] Reference a text-section symbol in the text section
+; [7] Reference a data-section symbol in the text section
+; [8] Reference a BSS-section symbol in the text section
+; [9] Reference a text-section symbol in the data section
+; [10] Reference a data-section symbol in the data section
+; [11] Reference a BSS-section symbol in the data section
+
+[BITS 16]
+[ORG 0x100]
+
+[SECTION .text]
+
+ jmp start ; [6]
+
+endX mov ax,0x4c00 ; [1]
+ int 0x21
+
+start mov byte [bss_sym],',' ; [1] [8]
+ mov bx,[bssptr] ; [7]
+ mov al,[bx]
+ mov bx,[dataptr] ; [7]
+ mov [bx],al
+ mov cx,2
+.loop mov dx,datasym ; [1] [4] [7]
+ mov ah,9
+ push cx
+ int 0x21
+ pop cx
+ loop .loop ; [5] [6]
+ mov bx,[textptr] ; [7]
+ jmp bx
+
+[SECTION .data]
+
+datasym db 'hello world', 13, 10, '$' ; [2]
+bssptr dw bss_sym ; [2] [11]
+dataptr dw datasym+5 ; [2] [10]
+textptr dw endX ; [2] [9]
+
+[SECTION .bss]
+
+bss_sym resb 1 ; [3]
diff --git a/modules/objfmts/bin/tests/bintest.hex b/modules/objfmts/bin/tests/bintest.hex
new file mode 100644
index 0000000..3a53e37
--- /dev/null
+++ b/modules/objfmts/bin/tests/bintest.hex
@@ -0,0 +1,65 @@
+eb
+05
+b8
+00
+4c
+cd
+21
+c6
+06
+44
+01
+2c
+8b
+1e
+3b
+01
+8a
+07
+8b
+1e
+3d
+01
+88
+07
+b9
+02
+00
+ba
+2c
+01
+b4
+09
+51
+cd
+21
+59
+e2
+f5
+8b
+1e
+3f
+01
+ff
+e3
+68
+65
+6c
+6c
+6f
+20
+20
+77
+6f
+72
+6c
+64
+0d
+0a
+24
+44
+01
+31
+01
+02
+01
diff --git a/modules/objfmts/bin/tests/float-err.asm b/modules/objfmts/bin/tests/float-err.asm
new file mode 100644
index 0000000..7c608ba
--- /dev/null
+++ b/modules/objfmts/bin/tests/float-err.asm
@@ -0,0 +1,12 @@
+; Tests illegal float handling
+db 1.2
+dw 3.14e500
+dd 5.12e100000
+dq 3.141592653589793e-158105
+dt 5653894745.318293470142875104710284019245e-1999
+
+db -1.5
+dw -5593824513450897123075109385109385019324871093470134710984.34981
+dd -47102940.46710358135703124751034875109875103294510984019324
+dq -45102571092751092341095.5827509174509178450917845019e15555
+dt -1.e-100000
diff --git a/modules/objfmts/bin/tests/float-err.errwarn b/modules/objfmts/bin/tests/float-err.errwarn
new file mode 100644
index 0000000..4aaa940
--- /dev/null
+++ b/modules/objfmts/bin/tests/float-err.errwarn
@@ -0,0 +1,8 @@
+-:2: error: invalid floating point constant size
+-:3: warning: overflow in floating point expression
+-:4: warning: overflow in floating point expression
+-:5: warning: underflow in floating point expression
+-:8: error: invalid floating point constant size
+-:9: warning: overflow in floating point expression
+-:11: warning: overflow in floating point expression
+-:12: warning: underflow in floating point expression
diff --git a/modules/objfmts/bin/tests/float.asm b/modules/objfmts/bin/tests/float.asm
new file mode 100644
index 0000000..32d2777
--- /dev/null
+++ b/modules/objfmts/bin/tests/float.asm
@@ -0,0 +1,10 @@
+; Tests float handling
+dw 3.14
+dd 5.12
+dq 3.141592653589793
+dt 5653894745.318293470142875104710284019245e335
+
+dw -62000.0
+dd -47102940.467103581
+dq -45102571092751092341095.5827509174509178450917845019
+dt -1.e-1000
diff --git a/modules/objfmts/bin/tests/float.hex b/modules/objfmts/bin/tests/float.hex
new file mode 100644
index 0000000..33b0d97
--- /dev/null
+++ b/modules/objfmts/bin/tests/float.hex
@@ -0,0 +1,48 @@
+48
+42
+0a
+d7
+a3
+40
+18
+2d
+44
+54
+fb
+21
+09
+40
+75
+4e
+ef
+f1
+30
+25
+6e
+97
+78
+44
+92
+fb
+f7
+ae
+33
+cc
+4d
+63
+8a
+d2
+07
+1a
+a3
+c4
+67
+14
+9e
+a8
+88
+91
+8a
+86
+05
+b3
diff --git a/modules/objfmts/bin/tests/integer-warn.asm b/modules/objfmts/bin/tests/integer-warn.asm
new file mode 100644
index 0000000..31c0f41
--- /dev/null
+++ b/modules/objfmts/bin/tests/integer-warn.asm
@@ -0,0 +1,6 @@
+; Tests warnings with integer constant handling (for output, not parsing)
+db 0x51a
+dw 0x3875bc
+dd 0x35783134affff
+dq 0xABCDEF012345678989abb
+dt 0xa907bc890d0e907f0134afb8adee
diff --git a/modules/objfmts/bin/tests/integer-warn.errwarn b/modules/objfmts/bin/tests/integer-warn.errwarn
new file mode 100644
index 0000000..dfce6c5
--- /dev/null
+++ b/modules/objfmts/bin/tests/integer-warn.errwarn
@@ -0,0 +1,5 @@
+-:2: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 16 bit field
+-:4: warning: value does not fit in 32 bit field
+-:5: warning: value does not fit in 64 bit field
+-:6: warning: value does not fit in 80 bit field
diff --git a/modules/objfmts/bin/tests/integer-warn.hex b/modules/objfmts/bin/tests/integer-warn.hex
new file mode 100644
index 0000000..82c4bfa
--- /dev/null
+++ b/modules/objfmts/bin/tests/integer-warn.hex
@@ -0,0 +1,25 @@
+1a
+bc
+75
+ff
+ff
+4a
+13
+bb
+9a
+98
+78
+56
+34
+12
+f0
+ee
+ad
+b8
+af
+34
+01
+7f
+90
+0e
+0d
diff --git a/modules/objfmts/bin/tests/integer.asm b/modules/objfmts/bin/tests/integer.asm
new file mode 100644
index 0000000..469887c
--- /dev/null
+++ b/modules/objfmts/bin/tests/integer.asm
@@ -0,0 +1,8 @@
+; Tests integer constant handling (for output, not parsing)
+
+db 0x51
+dw 0x3875
+dd 0x35783134
+dq 0xABCDEF0123456789
+dt 0xa907bc890d0e907f0134
+
diff --git a/modules/objfmts/bin/tests/integer.hex b/modules/objfmts/bin/tests/integer.hex
new file mode 100644
index 0000000..baad38f
--- /dev/null
+++ b/modules/objfmts/bin/tests/integer.hex
@@ -0,0 +1,25 @@
+51
+75
+38
+34
+31
+78
+35
+89
+67
+45
+23
+01
+ef
+cd
+ab
+34
+01
+7f
+90
+0e
+0d
+89
+bc
+07
+a9
diff --git a/modules/objfmts/bin/tests/levelop.asm b/modules/objfmts/bin/tests/levelop.asm
new file mode 100644
index 0000000..ee67eef
--- /dev/null
+++ b/modules/objfmts/bin/tests/levelop.asm
@@ -0,0 +1,4 @@
+test1:
+mov word [0x0010 + (test2 - test1)], 0x0000
+mov word [0x0010 + test2 - test1], 0x0000
+test2:
diff --git a/modules/objfmts/bin/tests/levelop.hex b/modules/objfmts/bin/tests/levelop.hex
new file mode 100644
index 0000000..4e70f4b
--- /dev/null
+++ b/modules/objfmts/bin/tests/levelop.hex
@@ -0,0 +1,12 @@
+c7
+06
+1c
+00
+00
+00
+c7
+06
+1c
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/multisect/Makefile.inc b/modules/objfmts/bin/tests/multisect/Makefile.inc
new file mode 100644
index 0000000..dcb7d62
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/Makefile.inc
@@ -0,0 +1,51 @@
+TESTS += modules/objfmts/bin/tests/multisect/bin_multi_test.sh
+
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin_multi_test.sh
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-align.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-align.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-align.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-align.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-ssym.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-ssym.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/bin-ssym.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-loop1-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-loop1-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-loop2-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-loop2-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-notfound-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/follows-notfound-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/initbss.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/initbss.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/initbss.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/initbss.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/ldlinux-sects.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/ldlinux-sects.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/ldlinux-sects.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect1.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect1.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect1.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect2.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect2.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect2.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect3.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect3.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect3.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect4.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect4.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect4.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect5.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect5.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/multisect5.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect1.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect1.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect1.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect2.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect2.hex
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/nomultisect2.map
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-loop1-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-loop1-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-loop2-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-loop2-err.errwarn
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-notfound-err.asm
+EXTRA_DIST += modules/objfmts/bin/tests/multisect/vfollows-notfound-err.errwarn
+
diff --git a/modules/objfmts/bin/tests/multisect/bin-align.asm b/modules/objfmts/bin/tests/multisect/bin-align.asm
new file mode 100644
index 0000000..e355aac
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-align.asm
@@ -0,0 +1,12 @@
+[map all binalign.map]
+section .text
+db 1
+align 8
+db 0
+section .data
+align 8
+db 0
+section .foo align=4
+align 8
+section .bar valign=4
+align 8
diff --git a/modules/objfmts/bin/tests/multisect/bin-align.errwarn b/modules/objfmts/bin/tests/multisect/bin-align.errwarn
new file mode 100644
index 0000000..e13f89d
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-align.errwarn
@@ -0,0 +1,3 @@
+-: warning: section `.foo' internal align of 8 is greater than `align' of 4; using `align'
+-: warning: section `.bar' internal align of 8 is greater than `valign' of 4; using `valign'
+-:1: warning: map file already specified
diff --git a/modules/objfmts/bin/tests/multisect/bin-align.hex b/modules/objfmts/bin/tests/multisect/bin-align.hex
new file mode 100644
index 0000000..dd133f7
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-align.hex
@@ -0,0 +1,17 @@
+01
+8d
+74
+00
+8d
+bd
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/multisect/bin-align.map b/modules/objfmts/bin/tests/multisect/bin-align.map
new file mode 100644
index 0000000..3031bd1
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-align.map
@@ -0,0 +1,66 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/bin-align
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000009 00000000 00000009 00000009 progbits .text
+00000010 00000011 00000010 00000011 00000001 progbits .data
+00000014 00000014 00000014 00000014 00000000 progbits .foo
+00000018 00000018 00000018 00000018 00000000 progbits .bar
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000009
+start: 00000000
+align: 00000008
+follows: not defined
+vstart: 00000000
+valign: 00000008
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000001
+start: 00000010
+align: 00000008
+follows: not defined
+vstart: 00000010
+valign: 00000008
+vfollows: not defined
+
+---- Section .foo -------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 00000014
+align: 00000004
+follows: not defined
+vstart: 00000014
+valign: 00000004
+vfollows: not defined
+
+---- Section .bar -------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 00000018
+align: 00000008
+follows: not defined
+vstart: 00000018
+valign: 00000004
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
diff --git a/modules/objfmts/bin/tests/multisect/bin-ssym.asm b/modules/objfmts/bin/tests/multisect/bin-ssym.asm
new file mode 100644
index 0000000..8c5608c
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-ssym.asm
@@ -0,0 +1,5 @@
+section foo start=0x10 vstart=0x6000
+mov si, section.foo.start
+mov di, section.foo.vstart
+mov cx, section.foo.length
+;mov dx, section.foo.vstart-section.foo.start
diff --git a/modules/objfmts/bin/tests/multisect/bin-ssym.hex b/modules/objfmts/bin/tests/multisect/bin-ssym.hex
new file mode 100644
index 0000000..e89a7e2
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-ssym.hex
@@ -0,0 +1,25 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+be
+10
+00
+bf
+00
+60
+b9
+09
+00
diff --git a/modules/objfmts/bin/tests/multisect/bin-ssym.map b/modules/objfmts/bin/tests/multisect/bin-ssym.map
new file mode 100644
index 0000000..9ddfe16
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin-ssym.map
@@ -0,0 +1,16 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/bin-ssym
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000000 00000000 00000000 00000000 progbits .text
+00006000 00006009 00000010 00000019 00000009 progbits foo
+
diff --git a/modules/objfmts/bin/tests/multisect/bin_multi_test.sh b/modules/objfmts/bin/tests/multisect/bin_multi_test.sh
new file mode 100755
index 0000000..aa3f616
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/bin_multi_test.sh
@@ -0,0 +1,113 @@
+#! /bin/sh
+
+YASM_TEST_SUITE=1
+export YASM_TEST_SUITE
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+mkdir results >/dev/null 2>&1
+
+#
+# Verify that all test cases match
+#
+
+passedct=0
+failedct=0
+
+echo $ECHO_N "Test bin_multi_test: $ECHO_C"
+for asm in ${srcdir}/modules/objfmts/bin/tests/multisect/*.asm
+do
+ a=`echo ${asm} | sed 's,^.*/,,;s,.asm$,,'`
+ o=${a}
+ oh=${a}.hx
+ og=`echo ${asm} | sed 's,.asm$,.hex,'`
+ e=${a}.ew
+ eg=`echo ${asm} | sed 's,.asm$,.errwarn,'`
+ m=${a}.map
+ mg=`echo ${asm} | sed 's,.asm$,.map,'`
+ if test \! -f ${eg}; then
+ eg=/dev/null
+ fi
+
+ # Run within a subshell to prevent signal messages from displaying.
+ sh -c "cat ${asm} | ./yasm -f bin --mapfile=results/${m} -o results/${o} - 2>results/${e}" >/dev/null 2>/dev/null
+ status=$?
+ if test $status -gt 128; then
+ # We should never get a coredump!
+ echo $ECHO_N "C$ECHO_C"
+ eval "failed$failedct='C: ${a} crashed!'"
+ failedct=`expr $failedct + 1`
+ elif test $status -gt 0; then
+ echo ${asm} | grep err >/dev/null
+ if test $? -gt 0; then
+ # YASM detected errors but shouldn't have!
+ echo $ECHO_N "E$ECHO_C"
+ eval "failed$failedct='E: ${a} returned an error code!'"
+ failedct=`expr $failedct + 1`
+ else
+ # We got errors, check to see if they match:
+ if diff -w ${eg} results/${e} >/dev/null; then
+ # Error/warnings match, it passes!
+ echo $ECHO_N ".$ECHO_C"
+ passedct=`expr $passedct + 1`
+ else
+ # Error/warnings don't match.
+ echo $ECHO_N "W$ECHO_C"
+ eval "failed$failedct='W: ${a} did not match errors and warnings!'"
+ failedct=`expr $failedct + 1`
+ fi
+ fi
+ else
+ echo ${asm} | grep -v err >/dev/null
+ if test $? -gt 0; then
+ # YASM didn't detect errors but should have!
+ echo $ECHO_N "E$ECHO_C"
+ eval "failed$failedct='E: ${a} did not return an error code!'"
+ failedct=`expr $failedct + 1`
+ else
+ ./test_hd results/${o} > results/${oh}
+ if diff -w ${og} results/${oh} >/dev/null; then
+ if diff -w ${eg} results/${e} >/dev/null; then
+ if diff -w ${mg} results/${m} >/dev/null; then
+ # All match, it passes!
+ echo $ECHO_N ".$ECHO_C"
+ passedct=`expr $passedct + 1`
+ else
+ # Map file doesn't match.
+ echo $ECHO_N "M$ECHO_C"
+ eval "failed$failedct='M: ${a} did not match map file!'"
+ failedct=`expr $failedct + 1`
+ fi
+ else
+ # Error/warnings don't match.
+ echo $ECHO_N "W$ECHO_C"
+ eval "failed$failedct='W: ${a} did not match errors and warnings!'"
+ failedct=`expr $failedct + 1`
+ fi
+ else
+ # Object file doesn't match.
+ echo $ECHO_N "O$ECHO_C"
+ eval "failed$failedct='O: ${a} did not match object file!'"
+ failedct=`expr $failedct + 1`
+ fi
+ fi
+ fi
+done
+
+ct=`expr $failedct + $passedct`
+per=`expr 100 \* $passedct / $ct`
+
+echo " +$passedct-$failedct/$ct $per%"
+i=0
+while test $i -lt $failedct; do
+ eval "failure=\$failed$i"
+ echo " ** $failure"
+ i=`expr $i + 1`
+done
+
+exit $failedct
diff --git a/modules/objfmts/bin/tests/multisect/follows-loop1-err.asm b/modules/objfmts/bin/tests/multisect/follows-loop1-err.asm
new file mode 100644
index 0000000..ad7fef1
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-loop1-err.asm
@@ -0,0 +1,2 @@
+section sect1 follows=sect2
+section sect2 follows=sect1
diff --git a/modules/objfmts/bin/tests/multisect/follows-loop1-err.errwarn b/modules/objfmts/bin/tests/multisect/follows-loop1-err.errwarn
new file mode 100644
index 0000000..613280e
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-loop1-err.errwarn
@@ -0,0 +1 @@
+-: error: follows loop between section `sect2' and section `sect1'
diff --git a/modules/objfmts/bin/tests/multisect/follows-loop2-err.asm b/modules/objfmts/bin/tests/multisect/follows-loop2-err.asm
new file mode 100644
index 0000000..9b15f46
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-loop2-err.asm
@@ -0,0 +1 @@
+section sect follows=sect
diff --git a/modules/objfmts/bin/tests/multisect/follows-loop2-err.errwarn b/modules/objfmts/bin/tests/multisect/follows-loop2-err.errwarn
new file mode 100644
index 0000000..bc832e0
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-loop2-err.errwarn
@@ -0,0 +1 @@
+-: error: follows loop between section `sect' and section `sect'
diff --git a/modules/objfmts/bin/tests/multisect/follows-notfound-err.asm b/modules/objfmts/bin/tests/multisect/follows-notfound-err.asm
new file mode 100644
index 0000000..36361d5
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-notfound-err.asm
@@ -0,0 +1,2 @@
+section foo follows=bar
+
diff --git a/modules/objfmts/bin/tests/multisect/follows-notfound-err.errwarn b/modules/objfmts/bin/tests/multisect/follows-notfound-err.errwarn
new file mode 100644
index 0000000..53d29d8
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/follows-notfound-err.errwarn
@@ -0,0 +1 @@
+-: error: section `foo' follows an invalid or unknown section `bar'
diff --git a/modules/objfmts/bin/tests/multisect/initbss.asm b/modules/objfmts/bin/tests/multisect/initbss.asm
new file mode 100644
index 0000000..8fe39bc
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/initbss.asm
@@ -0,0 +1,5 @@
+section .bss
+mov ax, 5
+
+section foo nobits
+db 5
diff --git a/modules/objfmts/bin/tests/multisect/initbss.errwarn b/modules/objfmts/bin/tests/multisect/initbss.errwarn
new file mode 100644
index 0000000..e92a68e
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/initbss.errwarn
@@ -0,0 +1,2 @@
+-:2: warning: initialized space declared in nobits section: ignoring
+-:5: warning: initialized space declared in nobits section: ignoring
diff --git a/modules/objfmts/bin/tests/multisect/initbss.hex b/modules/objfmts/bin/tests/multisect/initbss.hex
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/initbss.hex
diff --git a/modules/objfmts/bin/tests/multisect/initbss.map b/modules/objfmts/bin/tests/multisect/initbss.map
new file mode 100644
index 0000000..d26734d
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/initbss.map
@@ -0,0 +1,17 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/initbss
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000000 00000000 00000000 00000000 progbits .text
+00000000 00000003 00000000 00000003 00000003 nobits .bss
+00000004 00000005 00000004 00000005 00000001 nobits foo
+
diff --git a/modules/objfmts/bin/tests/multisect/ldlinux-sects.asm b/modules/objfmts/bin/tests/multisect/ldlinux-sects.asm
new file mode 100644
index 0000000..2beae7c
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/ldlinux-sects.asm
@@ -0,0 +1,102 @@
+[map all]
+BSS_START equ 0800h
+LATEBSS_START equ 0B800h
+TEXT_START equ 7C00h
+STACK_SIZE equ 4096
+STACK_START equ TEXT_START-STACK_SIZE
+org TEXT_START
+[section .text]
+times 0x2410 db 0x1
+[section .earlybss nobits start=BSS_START]
+resb 0x40C4
+[section .bcopy32 align=4 valign=16 follows=.data vfollows=.earlybss]
+times 0x2A0 db 0x3
+[section .config align=4 valign=16 follows=.bcopy32 vfollows=.bcopy32]
+times 0x23 db 0x4
+[section .config.end nobits valign=4 vfollows=.config]
+[section .bss1 nobits valign=16 vfollows=.config.end]
+resb 0x1FB
+[section .text start=TEXT_START]
+[section .data align=16]
+times 0x590 db 0x2
+[section .adv progbits align=1 follows=.config]
+[section .bss nobits align=16 follows=.adv]
+resb 0x3900
+[section .stack nobits align=16 start=STACK_START]
+resb STACK_SIZE
+[section .stack nobits align=16 start=STACK_START]
+[section .stack nobits align=16 start=STACK_START]
+[section .earlybss]
+[section .bss]
+[section .text]
+[section .bss]
+[section .text]
+[section .data]
+[section .text]
+[section .text]
+[section .text]
+[section .bss]
+[section .text]
+[section .data]
+[section .bss]
+[section .text]
+[section .data]
+[section .bss]
+[section .text]
+[section .text]
+[section .text]
+[section .data]
+[section .bss1]
+[section .data]
+[section .text]
+[section .bss1]
+[section .text]
+[section .text]
+[section .data]
+[section .text]
+[section .text]
+[section .bss]
+[section .text]
+[section .bss]
+[section .text]
+[section .data]
+[section .text]
+[section .text]
+[section .bss1]
+[section .data]
+[section .text]
+[section .text]
+[section .data]
+[section .config]
+[section .bss]
+[section .text]
+[section .text]
+[section .text]
+[section .data]
+[section .text]
+[section .data]
+[section .config]
+[section .bss]
+[section .text]
+[section .text]
+[section .data]
+[section .bss]
+[section .bcopy32]
+[section .data]
+[section .bcopy32]
+[section .earlybss]
+[section .text]
+[section .text]
+[section .bss]
+[section .data]
+[section .bss1]
+[section .text]
+[section .data]
+[section .bss1]
+[section .text]
+[section .bss]
+[section .text]
+[section .text]
+[section .text]
+[section .bss]
+[section .data]
diff --git a/modules/objfmts/bin/tests/multisect/ldlinux-sects.hex b/modules/objfmts/bin/tests/multisect/ldlinux-sects.hex
new file mode 100644
index 0000000..bb591fc
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/ldlinux-sects.hex
@@ -0,0 +1,11363 @@
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
diff --git a/modules/objfmts/bin/tests/multisect/ldlinux-sects.map b/modules/objfmts/bin/tests/multisect/ldlinux-sects.map
new file mode 100644
index 0000000..03fde84
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/ldlinux-sects.map
@@ -0,0 +1,148 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/ldlinux-sects
+
+-- Program origin -------------------------------------------------------------
+
+00007C00
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000800 000048C4 00000800 000048C4 000040C4 nobits .earlybss
+00006C00 00007C00 00006C00 00007C00 00001000 nobits .stack
+00007C00 0000A010 00007C00 0000A010 00002410 progbits .text
+0000A010 0000A5A0 0000A010 0000A5A0 00000590 progbits .data
+000048D0 00004B70 0000A5A0 0000A840 000002A0 progbits .bcopy32
+00004B70 00004B93 0000A840 0000A863 00000023 progbits .config
+0000A863 0000A863 0000A863 0000A863 00000000 progbits .adv
+0000A870 0000E170 0000A870 0000E170 00003900 nobits .bss
+00004B94 00004B94 0000E170 0000E170 00000000 nobits .config.end
+00004BA0 00004D9B 0000E170 0000E36B 000001FB nobits .bss1
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .earlybss --------------------------------------------------------
+
+class: nobits
+length: 000040C4
+start: 00000800
+align: 00000004
+follows: not defined
+vstart: 00000800
+valign: 00000004
+vfollows: not defined
+
+---- Section .stack -----------------------------------------------------------
+
+class: nobits
+length: 00001000
+start: 00006C00
+align: 00000010
+follows: not defined
+vstart: 00006C00
+valign: 00000010
+vfollows: not defined
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00002410
+start: 00007C00
+align: 00000004
+follows: not defined
+vstart: 00007C00
+valign: 00000004
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000590
+start: 0000A010
+align: 00000010
+follows: not defined
+vstart: 0000A010
+valign: 00000010
+vfollows: not defined
+
+---- Section .bcopy32 ---------------------------------------------------------
+
+class: progbits
+length: 000002A0
+start: 0000A5A0
+align: 00000004
+follows: .data
+vstart: 000048D0
+valign: 00000010
+vfollows: .earlybss
+
+---- Section .config ----------------------------------------------------------
+
+class: progbits
+length: 00000023
+start: 0000A840
+align: 00000004
+follows: .bcopy32
+vstart: 00004B70
+valign: 00000010
+vfollows: .bcopy32
+
+---- Section .adv -------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 0000A863
+align: 00000001
+follows: .config
+vstart: 0000A863
+valign: 00000001
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00003900
+start: 0000A870
+align: 00000010
+follows: .adv
+vstart: 0000A870
+valign: 00000010
+vfollows: not defined
+
+---- Section .config.end ------------------------------------------------------
+
+class: nobits
+length: 00000000
+start: 0000E170
+align: 00000004
+follows: not defined
+vstart: 00004B94
+valign: 00000004
+vfollows: .config
+
+---- Section .bss1 ------------------------------------------------------------
+
+class: nobits
+length: 000001FB
+start: 0000E170
+align: 00000004
+follows: not defined
+vstart: 00004BA0
+valign: 00000010
+vfollows: .config.end
+
+-- Symbols --------------------------------------------------------------------
+
+---- No Section ---------------------------------------------------------------
+
+Value Name
+00000800 BSS_START
+0000B800 LATEBSS_START
+00007C00 TEXT_START
+00001000 STACK_SIZE
+00006C00 STACK_START
+
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect1.asm b/modules/objfmts/bin/tests/multisect/multisect1.asm
new file mode 100644
index 0000000..d9699b7
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect1.asm
@@ -0,0 +1,31 @@
+[BITS 32]
+
+[MAP all]
+; This file is loaded as a DOS .COM file.
+[SEGMENT _TEXT start=0 vstart=100h]
+
+; shrink & relocate stack:
+ mov sp, stack_ends ; NASM puts 460h here -
+ ; 9B0h is desired.
+ mov bx, sp
+ mov cl, 4
+ shr bx, cl
+ mov ah, 4Ah ; DOS resize mem.block
+ int 21h
+
+[SEGMENT GATESEG align=1 follows=_TEXT vstart=0]
+; label to use for copying this segment at run-time.
+gate0cpy:
+dd 0
+
+; 32-bit ring-0 protected mode code that interacts
+; with the VMM (Win3.x/9x kernel). To be relocated
+; at run-time to memory dynamically allocated with
+; DPMI, and called through a call-gate from ring-3.
+; vstart=0 makes some calculations easier.
+
+; Reserve space for stack:
+[SEGMENT .bss follows=GATESEG align=16]
+ resb 400h
+stack_ends:
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect1.hex b/modules/objfmts/bin/tests/multisect/multisect1.hex
new file mode 100644
index 0000000..32695b8
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect1.hex
@@ -0,0 +1,20 @@
+66
+bc
+20
+04
+66
+89
+e3
+b1
+04
+66
+d3
+eb
+b4
+4a
+cd
+21
+00
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/multisect/multisect1.map b/modules/objfmts/bin/tests/multisect/multisect1.map
new file mode 100644
index 0000000..0a56e41
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect1.map
@@ -0,0 +1,78 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/multisect1
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000000 00000000 00000000 00000000 progbits .text
+00000100 00000110 00000000 00000010 00000010 progbits _TEXT
+00000000 00000004 00000010 00000014 00000004 progbits GATESEG
+00000020 00000420 00000020 00000420 00000400 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 00000000
+align: 00000004
+follows: not defined
+vstart: 00000000
+valign: 00000004
+vfollows: not defined
+
+---- Section _TEXT ------------------------------------------------------------
+
+class: progbits
+length: 00000010
+start: 00000000
+align: 00000004
+follows: not defined
+vstart: 00000100
+valign: 00000004
+vfollows: not defined
+
+---- Section GATESEG ----------------------------------------------------------
+
+class: progbits
+length: 00000004
+start: 00000010
+align: 00000001
+follows: _TEXT
+vstart: 00000000
+valign: 00000001
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000400
+start: 00000020
+align: 00000010
+follows: GATESEG
+vstart: 00000020
+valign: 00000010
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
+---- Section GATESEG ----------------------------------------------------------
+
+Real Virtual Name
+00000010 00000000 gate0cpy
+
+
+---- Section .bss -------------------------------------------------------------
+
+Real Virtual Name
+00000420 00000420 stack_ends
+
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect2.asm b/modules/objfmts/bin/tests/multisect/multisect2.asm
new file mode 100644
index 0000000..cfbf58c
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect2.asm
@@ -0,0 +1,42 @@
+org 100h
+[map all]
+
+section .bss ; follows=.data
+ buffer resb 123h
+section .data
+ msg db "this is a message", 0
+section .text
+ mov ax, msg
+ call showax
+ mov ax, buffer
+ call showax
+ ret
+
+;-----------------
+showax:
+ push cx
+ push dx
+
+ mov cx, 4 ; four digits to show
+
+.top
+ rol ax, 4 ; rotate one digit into position
+ mov dl, al ; make a copy to process
+ and dl, 0Fh ; mask off a single (hex) digit
+ cmp dl, 9 ; is it in the "A" to "F" range?
+ jbe .dec_dig ; no, skip it
+ add dl, 7 ; adjust
+.dec_dig:
+ add dl, 30h ; convert to character
+
+ push ax
+ mov ah, 2
+ int 21h
+ pop ax
+
+ loop .top
+
+ pop dx
+ pop cx
+ ret
+;--------------------------
diff --git a/modules/objfmts/bin/tests/multisect/multisect2.hex b/modules/objfmts/bin/tests/multisect/multisect2.hex
new file mode 100644
index 0000000..f043f37
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect2.hex
@@ -0,0 +1,66 @@
+b8
+30
+01
+e8
+07
+00
+b8
+44
+01
+e8
+01
+00
+c3
+51
+52
+b9
+04
+00
+c1
+c0
+04
+88
+c2
+80
+e2
+0f
+80
+fa
+09
+76
+03
+80
+c2
+07
+80
+c2
+30
+50
+b4
+02
+cd
+21
+58
+e2
+e5
+5a
+59
+c3
+74
+68
+69
+73
+20
+69
+73
+20
+61
+20
+6d
+65
+73
+73
+61
+67
+65
+00
diff --git a/modules/objfmts/bin/tests/multisect/multisect2.map b/modules/objfmts/bin/tests/multisect/multisect2.map
new file mode 100644
index 0000000..82002ed
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect2.map
@@ -0,0 +1,74 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/multisect2
+
+-- Program origin -------------------------------------------------------------
+
+00000100
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000100 00000130 00000100 00000130 00000030 progbits .text
+00000130 00000142 00000130 00000142 00000012 progbits .data
+00000144 00000267 00000144 00000267 00000123 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000030
+start: 00000100
+align: 00000004
+follows: not defined
+vstart: 00000100
+valign: 00000004
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000012
+start: 00000130
+align: 00000004
+follows: not defined
+vstart: 00000130
+valign: 00000004
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000123
+start: 00000144
+align: 00000004
+follows: not defined
+vstart: 00000144
+valign: 00000004
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+Real Virtual Name
+0000010D 0000010D showax
+00000112 00000112 showax.top
+00000122 00000122 showax.dec_dig
+
+
+---- Section .data ------------------------------------------------------------
+
+Real Virtual Name
+00000130 00000130 msg
+
+
+---- Section .bss -------------------------------------------------------------
+
+Real Virtual Name
+00000144 00000144 buffer
+
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect3.asm b/modules/objfmts/bin/tests/multisect/multisect3.asm
new file mode 100644
index 0000000..d6499f9
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect3.asm
@@ -0,0 +1,9 @@
+[map all]
+section .text
+ mov ax, bx
+
+section .foo nobits follows=.text
+ resb 4
+
+section .bss
+ resb 4
diff --git a/modules/objfmts/bin/tests/multisect/multisect3.hex b/modules/objfmts/bin/tests/multisect/multisect3.hex
new file mode 100644
index 0000000..a994975
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect3.hex
@@ -0,0 +1,2 @@
+89
+d8
diff --git a/modules/objfmts/bin/tests/multisect/multisect3.map b/modules/objfmts/bin/tests/multisect/multisect3.map
new file mode 100644
index 0000000..1c67c22
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect3.map
@@ -0,0 +1,54 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/multisect3
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000002 00000000 00000002 00000002 progbits .text
+00000004 00000008 00000004 00000008 00000004 nobits .foo
+00000008 0000000C 00000008 0000000C 00000004 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000002
+start: 00000000
+align: 00000004
+follows: not defined
+vstart: 00000000
+valign: 00000004
+vfollows: not defined
+
+---- Section .foo -------------------------------------------------------------
+
+class: nobits
+length: 00000004
+start: 00000004
+align: 00000004
+follows: .text
+vstart: 00000004
+valign: 00000004
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000004
+start: 00000008
+align: 00000004
+follows: not defined
+vstart: 00000008
+valign: 00000004
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect4.asm b/modules/objfmts/bin/tests/multisect/multisect4.asm
new file mode 100644
index 0000000..94d2415
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect4.asm
@@ -0,0 +1,31 @@
+[map all]
+; Memory below 0800h is reserved for the BIOS and the MBR
+BSS_START equ 0800h
+
+; PXELINUX needs lots of BSS, so it relocates itself on startup
+;%if IS_PXELINUX
+TEXT_START equ 9000h
+;%else
+;TEXT_START equ 7C00h
+;%endif
+
+;
+; The various sections and their relationship
+;
+org TEXT_START
+
+times 0x100 db 0x3
+
+section .earlybss nobits start=BSS_START
+resb 0x100
+section .bcopy32 align=16 follows=.data vfollows=.earlybss
+times 0x100 db 0x1
+section .bss nobits align=256 vfollows=.bcopy32
+resb 0x100
+
+section .text start=TEXT_START
+section .data align=16 follows=.text
+times 0x100 db 0x2
+
+section .latebss nobits align=16 follows=.bcopy32
+resb 0x100
diff --git a/modules/objfmts/bin/tests/multisect/multisect4.hex b/modules/objfmts/bin/tests/multisect/multisect4.hex
new file mode 100644
index 0000000..d40d7a1
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect4.hex
@@ -0,0 +1,768 @@
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+03
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
diff --git a/modules/objfmts/bin/tests/multisect/multisect4.map b/modules/objfmts/bin/tests/multisect/multisect4.map
new file mode 100644
index 0000000..e1940dc
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect4.map
@@ -0,0 +1,97 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/multisect4
+
+-- Program origin -------------------------------------------------------------
+
+00009000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000800 00000900 00000800 00000900 00000100 nobits .earlybss
+00009000 00009100 00009000 00009100 00000100 progbits .text
+00009100 00009200 00009100 00009200 00000100 progbits .data
+00000900 00000A00 00009200 00009300 00000100 progbits .bcopy32
+00009300 00009400 00009300 00009400 00000100 nobits .latebss
+00000A00 00000B00 00009400 00009500 00000100 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .earlybss --------------------------------------------------------
+
+class: nobits
+length: 00000100
+start: 00000800
+align: 00000004
+follows: not defined
+vstart: 00000800
+valign: 00000004
+vfollows: not defined
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00009000
+align: 00000004
+follows: not defined
+vstart: 00009000
+valign: 00000004
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00009100
+align: 00000010
+follows: .text
+vstart: 00009100
+valign: 00000010
+vfollows: not defined
+
+---- Section .bcopy32 ---------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00009200
+align: 00000010
+follows: .data
+vstart: 00000900
+valign: 00000010
+vfollows: .earlybss
+
+---- Section .latebss ---------------------------------------------------------
+
+class: nobits
+length: 00000100
+start: 00009300
+align: 00000010
+follows: .bcopy32
+vstart: 00009300
+valign: 00000010
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000100
+start: 00009400
+align: 00000100
+follows: not defined
+vstart: 00000A00
+valign: 00000100
+vfollows: .bcopy32
+
+-- Symbols --------------------------------------------------------------------
+
+---- No Section ---------------------------------------------------------------
+
+Value Name
+00000800 BSS_START
+00009000 TEXT_START
+
+
diff --git a/modules/objfmts/bin/tests/multisect/multisect5.asm b/modules/objfmts/bin/tests/multisect/multisect5.asm
new file mode 100644
index 0000000..2b76117
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect5.asm
@@ -0,0 +1,22 @@
+org 0x100
+[map all]
+section sect1 start=0x100 vstart=0x2000
+times 0x100 db 0
+section sect2 follows=sect1
+times 0x100 db 0
+
+section sect3 start=0x300 vstart=0x4000
+times 0x100 db 0
+section sect4 follows=sect3
+times 0x100 db 0
+section sect5 vfollows=sect3
+times 0x100 db 0
+
+section sect6 start=0x600 vstart=0x6000
+times 0x11 db 0
+section sect7 follows=sect6 valign=16
+times 0x104 db 0
+section sect8 follows=sect7 valign=16 ; NASM bug - sect7 and sect8 overlap
+times 0x100 db 0
+
+section sect9 vfollows=sect8
diff --git a/modules/objfmts/bin/tests/multisect/multisect5.hex b/modules/objfmts/bin/tests/multisect/multisect5.hex
new file mode 100644
index 0000000..a2776bc
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect5.hex
@@ -0,0 +1,1816 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/multisect/multisect5.map b/modules/objfmts/bin/tests/multisect/multisect5.map
new file mode 100644
index 0000000..4c052be
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/multisect5.map
@@ -0,0 +1,138 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/multisect5
+
+-- Program origin -------------------------------------------------------------
+
+00000100
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000100 00000100 00000100 00000100 00000000 progbits .text
+00002000 00002100 00000100 00000200 00000100 progbits sect1
+00000200 00000300 00000200 00000300 00000100 progbits sect2
+00004000 00004100 00000300 00000400 00000100 progbits sect3
+00000400 00000500 00000400 00000500 00000100 progbits sect4
+00004100 00004200 00000500 00000600 00000100 progbits sect5
+00006000 00006011 00000600 00000611 00000011 progbits sect6
+00000620 00000724 00000614 00000718 00000104 progbits sect7
+00000730 00000830 00000718 00000818 00000100 progbits sect8
+00000830 00000830 00000818 00000818 00000000 progbits sect9
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 00000100
+align: 00000004
+follows: not defined
+vstart: 00000100
+valign: 00000004
+vfollows: not defined
+
+---- Section sect1 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000100
+align: 00000004
+follows: not defined
+vstart: 00002000
+valign: 00000004
+vfollows: not defined
+
+---- Section sect2 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000200
+align: 00000004
+follows: sect1
+vstart: 00000200
+valign: 00000004
+vfollows: not defined
+
+---- Section sect3 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000300
+align: 00000004
+follows: not defined
+vstart: 00004000
+valign: 00000004
+vfollows: not defined
+
+---- Section sect4 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000400
+align: 00000004
+follows: sect3
+vstart: 00000400
+valign: 00000004
+vfollows: not defined
+
+---- Section sect5 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000500
+align: 00000004
+follows: not defined
+vstart: 00004100
+valign: 00000004
+vfollows: sect3
+
+---- Section sect6 ------------------------------------------------------------
+
+class: progbits
+length: 00000011
+start: 00000600
+align: 00000004
+follows: not defined
+vstart: 00006000
+valign: 00000004
+vfollows: not defined
+
+---- Section sect7 ------------------------------------------------------------
+
+class: progbits
+length: 00000104
+start: 00000614
+align: 00000004
+follows: sect6
+vstart: 00000620
+valign: 00000010
+vfollows: not defined
+
+---- Section sect8 ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000718
+align: 00000004
+follows: sect7
+vstart: 00000730
+valign: 00000010
+vfollows: not defined
+
+---- Section sect9 ------------------------------------------------------------
+
+class: progbits
+length: 00000000
+start: 00000818
+align: 00000004
+follows: not defined
+vstart: 00000830
+valign: 00000004
+vfollows: sect8
+
+-- Symbols --------------------------------------------------------------------
+
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect1.asm b/modules/objfmts/bin/tests/multisect/nomultisect1.asm
new file mode 100644
index 0000000..5f720d8
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect1.asm
@@ -0,0 +1,10 @@
+[map all]
+
+[section .bss]
+resb 0x100
+
+[section .data]
+times 0x100 db 1
+
+[section .text]
+times 0x100 db 1
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect1.hex b/modules/objfmts/bin/tests/multisect/nomultisect1.hex
new file mode 100644
index 0000000..59c9350
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect1.hex
@@ -0,0 +1,512 @@
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect1.map b/modules/objfmts/bin/tests/multisect/nomultisect1.map
new file mode 100644
index 0000000..8997420
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect1.map
@@ -0,0 +1,54 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/nomultisect1
+
+-- Program origin -------------------------------------------------------------
+
+00000000
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000000 00000100 00000000 00000100 00000100 progbits .text
+00000100 00000200 00000100 00000200 00000100 progbits .data
+00000200 00000300 00000200 00000300 00000100 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000000
+align: 00000004
+follows: not defined
+vstart: 00000000
+valign: 00000004
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000100
+align: 00000004
+follows: not defined
+vstart: 00000100
+valign: 00000004
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000100
+start: 00000200
+align: 00000004
+follows: not defined
+vstart: 00000200
+valign: 00000004
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect2.asm b/modules/objfmts/bin/tests/multisect/nomultisect2.asm
new file mode 100644
index 0000000..b97e40a
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect2.asm
@@ -0,0 +1,12 @@
+org 0x100
+
+[map all]
+
+[section .bss]
+resb 0x100
+
+[section .data]
+times 0x100 db 1
+
+[section .text]
+times 0x100 db 1
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect2.hex b/modules/objfmts/bin/tests/multisect/nomultisect2.hex
new file mode 100644
index 0000000..59c9350
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect2.hex
@@ -0,0 +1,512 @@
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
+01
diff --git a/modules/objfmts/bin/tests/multisect/nomultisect2.map b/modules/objfmts/bin/tests/multisect/nomultisect2.map
new file mode 100644
index 0000000..cc6d9c8
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/nomultisect2.map
@@ -0,0 +1,54 @@
+
+- YASM Map file ---------------------------------------------------------------
+
+Source file: -
+Output file: results/nomultisect2
+
+-- Program origin -------------------------------------------------------------
+
+00000100
+
+-- Sections (summary) ---------------------------------------------------------
+
+Vstart Vstop Start Stop Length Class Name
+00000100 00000200 00000100 00000200 00000100 progbits .text
+00000200 00000300 00000200 00000300 00000100 progbits .data
+00000300 00000400 00000300 00000400 00000100 nobits .bss
+
+-- Sections (detailed) --------------------------------------------------------
+
+---- Section .text ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000100
+align: 00000004
+follows: not defined
+vstart: 00000100
+valign: 00000004
+vfollows: not defined
+
+---- Section .data ------------------------------------------------------------
+
+class: progbits
+length: 00000100
+start: 00000200
+align: 00000004
+follows: not defined
+vstart: 00000200
+valign: 00000004
+vfollows: not defined
+
+---- Section .bss -------------------------------------------------------------
+
+class: nobits
+length: 00000100
+start: 00000300
+align: 00000004
+follows: not defined
+vstart: 00000300
+valign: 00000004
+vfollows: not defined
+
+-- Symbols --------------------------------------------------------------------
+
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.asm b/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.asm
new file mode 100644
index 0000000..84a7c1e
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.asm
@@ -0,0 +1,2 @@
+section sect1 vfollows=sect2
+section sect2 vfollows=sect1
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.errwarn b/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.errwarn
new file mode 100644
index 0000000..3965e58
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-loop1-err.errwarn
@@ -0,0 +1 @@
+-: error: vfollows loop between section `sect2' and section `sect1'
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.asm b/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.asm
new file mode 100644
index 0000000..ac080b8
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.asm
@@ -0,0 +1 @@
+section sect vfollows=sect
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.errwarn b/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.errwarn
new file mode 100644
index 0000000..4f252b4
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-loop2-err.errwarn
@@ -0,0 +1 @@
+-: error: vfollows loop between section `sect' and section `sect'
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.asm b/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.asm
new file mode 100644
index 0000000..fe0f6e5
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.asm
@@ -0,0 +1,2 @@
+section foo vfollows=bar
+
diff --git a/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.errwarn b/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.errwarn
new file mode 100644
index 0000000..93b44d0
--- /dev/null
+++ b/modules/objfmts/bin/tests/multisect/vfollows-notfound-err.errwarn
@@ -0,0 +1 @@
+-: error: section `foo' vfollows an invalid or unknown section `bar'
diff --git a/modules/objfmts/bin/tests/reserve.asm b/modules/objfmts/bin/tests/reserve.asm
new file mode 100644
index 0000000..cd87e21
--- /dev/null
+++ b/modules/objfmts/bin/tests/reserve.asm
@@ -0,0 +1,14 @@
+; Test res* family
+resb 5
+resw 10
+resd 50
+resq 1
+rest 0
+
+[section .bss]
+resb 1
+resw 5
+resd 10
+resq 40
+rest 4
+
diff --git a/modules/objfmts/bin/tests/reserve.errwarn b/modules/objfmts/bin/tests/reserve.errwarn
new file mode 100644
index 0000000..fb0d722
--- /dev/null
+++ b/modules/objfmts/bin/tests/reserve.errwarn
@@ -0,0 +1,4 @@
+-:2: warning: uninitialized space declared in code/data section: zeroing
+-:3: warning: uninitialized space declared in code/data section: zeroing
+-:4: warning: uninitialized space declared in code/data section: zeroing
+-:5: warning: uninitialized space declared in code/data section: zeroing
diff --git a/modules/objfmts/bin/tests/reserve.hex b/modules/objfmts/bin/tests/reserve.hex
new file mode 100644
index 0000000..49dfa56
--- /dev/null
+++ b/modules/objfmts/bin/tests/reserve.hex
@@ -0,0 +1,233 @@
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/modules/objfmts/bin/tests/shr.asm b/modules/objfmts/bin/tests/shr.asm
new file mode 100644
index 0000000..66ade16
--- /dev/null
+++ b/modules/objfmts/bin/tests/shr.asm
@@ -0,0 +1,3 @@
+x: mov al, x>>8
+times 256 db 0
+y: mov ah, y>>8
diff --git a/modules/objfmts/bin/tests/shr.hex b/modules/objfmts/bin/tests/shr.hex
new file mode 100644
index 0000000..9ce7eee
--- /dev/null
+++ b/modules/objfmts/bin/tests/shr.hex
@@ -0,0 +1,260 @@
+b0
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+b4
+01