From 8fc601bf6f37fba71b0dcd292805572648a02312 Mon Sep 17 00:00:00 2001 From: dfr Date: Sun, 18 May 1997 10:03:48 +0000 Subject: Add a couple of test cases for mmap over NFS. --- tools/regression/README | 2 + tools/regression/nfsmmap/Makefile | 3 + tools/regression/nfsmmap/README | 20 ++++++ tools/regression/nfsmmap/test1/Makefile | 25 +++++++ tools/regression/nfsmmap/test1/test1.c | 46 +++++++++++++ tools/regression/nfsmmap/test1/test1.good.uu | 95 +++++++++++++++++++++++++++ tools/regression/nfsmmap/test1/test1.zeros.uu | 95 +++++++++++++++++++++++++++ tools/regression/nfsmmap/test2/Makefile | 25 +++++++ tools/regression/nfsmmap/test2/test2.c | 44 +++++++++++++ tools/regression/nfsmmap/test2/test2.good.uu | 95 +++++++++++++++++++++++++++ tools/regression/nfsmmap/test2/test2.zeros.uu | 95 +++++++++++++++++++++++++++ 11 files changed, 545 insertions(+) create mode 100644 tools/regression/nfsmmap/Makefile create mode 100644 tools/regression/nfsmmap/README create mode 100644 tools/regression/nfsmmap/test1/Makefile create mode 100644 tools/regression/nfsmmap/test1/test1.c create mode 100644 tools/regression/nfsmmap/test1/test1.good.uu create mode 100644 tools/regression/nfsmmap/test1/test1.zeros.uu create mode 100644 tools/regression/nfsmmap/test2/Makefile create mode 100644 tools/regression/nfsmmap/test2/test2.c create mode 100644 tools/regression/nfsmmap/test2/test2.good.uu create mode 100644 tools/regression/nfsmmap/test2/test2.zeros.uu (limited to 'tools') diff --git a/tools/regression/README b/tools/regression/README index 03342ba..d2a92ed 100644 --- a/tools/regression/README +++ b/tools/regression/README @@ -4,3 +4,5 @@ A regression test program is one that will exercise a particular bit of the system to check that we have not reintroduced an old bug. Please make a subdir per program, and add a brief description to this file. + +nfsmmap Some tests to exercise some tricky cases in NFS and mmap diff --git a/tools/regression/nfsmmap/Makefile b/tools/regression/nfsmmap/Makefile new file mode 100644 index 0000000..c731d42 --- /dev/null +++ b/tools/regression/nfsmmap/Makefile @@ -0,0 +1,3 @@ +SUBDIR= test1 test2 + +.include diff --git a/tools/regression/nfsmmap/README b/tools/regression/nfsmmap/README new file mode 100644 index 0000000..81c4ad5 --- /dev/null +++ b/tools/regression/nfsmmap/README @@ -0,0 +1,20 @@ +These tests are intended to make sure that NFS's use of the +b_{valid,dirty}{off,end} fields of struct buf is consistent with the +VM system's use of the underlying VM pages. + +Test1: + Open the file and write into the file, creating a buf + with a valid range and a dirty range + + Fsync, flushing the dirty range + + Mmap and read the whole page. Since only part of the page is + valid, the VM system must re-read the invalid parts of the + page. + +Test2: + This is the same as test1 without the fsync. The VM system + should first write out the dirty range and then read the rest + of the page. This is currently broken since the vnode_pager + doesn't use the original buf for its i/o and therefore the + information in b_dirtyoff, b_dirtyend is not avalable. diff --git a/tools/regression/nfsmmap/test1/Makefile b/tools/regression/nfsmmap/test1/Makefile new file mode 100644 index 0000000..54a7b9d --- /dev/null +++ b/tools/regression/nfsmmap/test1/Makefile @@ -0,0 +1,25 @@ +PROG= test1 +NOMAN= t +NFSSERVER?= herring.nlsystems.com +CLEANFILES= test1.zeros test1.good test1.data test1.scratch + +all: test1 test1.zeros test1.good + @cp ${.OBJDIR}/test1.zeros ${.OBJDIR}/test1.data + @if [ `hostname` != ${NFSSERVER} ] ; then \ + ssh ${NFSSERVER} touch ${.OBJDIR}/test1.data; \ + fi + @cd ${.OBJDIR}; ${.OBJDIR}/test1 + @if cmp -s ${.OBJDIR}/test1.data ${.OBJDIR}/test1.good && \ + cmp -s ${.OBJDIR}/test1.scratch ${.OBJDIR}/test1.good ; then \ + echo passed; \ + else \ + echo failed; \ + fi + +test1.zeros: test1.zeros.uu + uudecode $? + +test1.good: test1.good.uu + uudecode $? + +.include diff --git a/tools/regression/nfsmmap/test1/test1.c b/tools/regression/nfsmmap/test1/test1.c new file mode 100644 index 0000000..7a7e69f --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + int fd, fd2; + caddr_t addr; + char zeros[4096]; + char ones[200]; + + memset(zeros, 0, sizeof zeros); + memset(ones, 1, sizeof ones); +#if 0 + unlink("test1.data"); + fd = open("test1.data", O_RDWR|O_CREAT, 0666); + if (fd < 0) + err(1, "creating file"); + if (write(fd, zeros, sizeof zeros) < 0) + err(1, "writing zeros"); + close(fd); +#endif + + fd = open("test1.data", O_RDWR); + if (fd < 0) + err(1, "opening file"); + if (lseek(fd, 600, SEEK_SET) < 0) + err(1, "seeking"); + + if (write(fd, ones, sizeof ones) < 0) + err(1, "writing ones"); + + fsync(fd); + + addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) + err(1, "mapping"); + unlink("test1.scratch"); + fd2 = open("test1.scratch", O_RDWR|O_CREAT, 0666); + if (fd2 < 0) + err(1, "creating scratch"); + + if (write(fd2, addr, 4096) < 0) + err(1, "writing scratch"); +} diff --git a/tools/regression/nfsmmap/test1/test1.good.uu b/tools/regression/nfsmmap/test1/test1.good.uu new file mode 100644 index 0000000..633d2d3 --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.good.uu @@ -0,0 +1,95 @@ +begin 644 test1.good +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test1/test1.zeros.uu b/tools/regression/nfsmmap/test1/test1.zeros.uu new file mode 100644 index 0000000..2332258 --- /dev/null +++ b/tools/regression/nfsmmap/test1/test1.zeros.uu @@ -0,0 +1,95 @@ +begin 644 test1.zeros +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test2/Makefile b/tools/regression/nfsmmap/test2/Makefile new file mode 100644 index 0000000..460c0b2 --- /dev/null +++ b/tools/regression/nfsmmap/test2/Makefile @@ -0,0 +1,25 @@ +PROG= test2 +NOMAN= t +NFSSERVER?= herring.nlsystems.com +CLEANFILES= test2.zeros test2.good test2.data test2.scratch + +all: test2 test2.zeros test2.good + @cp ${.OBJDIR}/test2.zeros ${.OBJDIR}/test2.data + @if [ `hostname` != ${NFSSERVER} ] ; then \ + ssh ${NFSSERVER} touch ${.OBJDIR}/test2.data; \ + fi + @cd ${.OBJDIR}; ${.OBJDIR}/test2 + @if cmp -s ${.OBJDIR}/test2.data ${.OBJDIR}/test2.good && \ + cmp -s ${.OBJDIR}/test2.scratch ${.OBJDIR}/test2.good ; then \ + echo passed; \ + else \ + echo failed; \ + fi + +test2.zeros: test2.zeros.uu + uudecode $? + +test2.good: test2.good.uu + uudecode $? + +.include diff --git a/tools/regression/nfsmmap/test2/test2.c b/tools/regression/nfsmmap/test2/test2.c new file mode 100644 index 0000000..b3a19e1 --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + int fd, fd2; + caddr_t addr; + char zeros[4096]; + char ones[200]; + + memset(zeros, 0, sizeof zeros); + memset(ones, 1, sizeof ones); +#if 0 + unlink("test2.data"); + fd = open("test2.data", O_RDWR|O_CREAT, 0666); + if (fd < 0) + err(1, "creating file"); + if (write(fd, zeros, sizeof zeros) < 0) + err(1, "writing zeros"); + close(fd); +#endif + + fd = open("test2.data", O_RDWR); + if (fd < 0) + err(1, "opening file"); + if (lseek(fd, 600, SEEK_SET) < 0) + err(1, "seeking"); + + if (write(fd, ones, sizeof ones) < 0) + err(1, "writing ones"); + + addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) + err(1, "mapping"); + unlink("test2.scratch"); + fd2 = open("test2.scratch", O_RDWR|O_CREAT, 0666); + if (fd2 < 0) + err(1, "creating scratch"); + + if (write(fd2, addr, 4096) < 0) + err(1, "writing scratch"); +} diff --git a/tools/regression/nfsmmap/test2/test2.good.uu b/tools/regression/nfsmmap/test2/test2.good.uu new file mode 100644 index 0000000..2edf155 --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.good.uu @@ -0,0 +1,95 @@ +begin 644 test2.good +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! +M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end diff --git a/tools/regression/nfsmmap/test2/test2.zeros.uu b/tools/regression/nfsmmap/test2/test2.zeros.uu new file mode 100644 index 0000000..9be013a --- /dev/null +++ b/tools/regression/nfsmmap/test2/test2.zeros.uu @@ -0,0 +1,95 @@ +begin 644 test2.zeros +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +!```` +` +end -- cgit v1.1