(original) (raw)

changeset: 71570:5467abaaf5eb parent: 71569:1521d9837d16 parent: 71567:2792aebd0bf0 user: Éric Araujo merwok@netwok.org date: Fri Jul 29 03:11:09 2011 +0200 files: .bzrignore .gitignore .hgignore Doc/ACKS.txt Doc/distutils/install.rst Doc/glossary.rst Doc/install/index.rst Doc/library/packaging.dist.rst Doc/library/shutil.rst Doc/license.rst Doc/tools/sphinxext/susp-ignored.csv Doc/tutorial/classes.rst Lib/test/list_tests.py Misc/NEWS Python/marshal.c Tools/scripts/patchcheck.py Tools/scripts/pysource.py description: Merge from 3.2 (#10318, #12255, #12043, #12417 and other fixes) diff -r 1521d9837d16 -r 5467abaaf5eb .bzrignore --- a/.bzrignore Thu Jul 28 23:35:29 2011 +0200 +++ b/.bzrignore Fri Jul 29 03:11:09 2011 +0200 @@ -14,6 +14,7 @@ pybuilddir.txt pyconfig.h libpython*.a +libpython*.so* python.exe python-gdb.py reflog.txt diff -r 1521d9837d16 -r 5467abaaf5eb .gitignore --- a/.gitignore Thu Jul 28 23:35:29 2011 +0200 +++ b/.gitignore Fri Jul 29 03:11:09 2011 +0200 @@ -37,6 +37,7 @@ config.log config.status libpython*.a +libpython*.so* pybuilddir.txt pyconfig.h python diff -r 1521d9837d16 -r 5467abaaf5eb .hgignore --- a/.hgignore Thu Jul 28 23:35:29 2011 +0200 +++ b/.hgignore Fri Jul 29 03:11:09 2011 +0200 @@ -41,14 +41,13 @@ syntax: glob libpython*.a +libpython*.so* *.swp *.o *.pyc *.pyo *.pyd *.cover -*.orig -*.rej *~ Lib/lib2to3/*.pickle Lib/test/data/* diff -r 1521d9837d16 -r 5467abaaf5eb Doc/ACKS.txt --- a/Doc/ACKS.txt Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/ACKS.txt Fri Jul 29 03:11:09 2011 +0200 @@ -203,6 +203,7 @@ * Kalle Svensson * Jim Tittsler * David Turner + * Sandro Tosi * Ville Vainio * Nadeem Vawda * Martijn Vries diff -r 1521d9837d16 -r 5467abaaf5eb Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/distutils/apiref.rst Fri Jul 29 03:11:09 2011 +0200 @@ -72,8 +72,8 @@ | | be built | :class:`distutils.core.Extension` | +--------------------+--------------------------------+-------------------------------------------------------------+ | *classifiers* | A list of categories for the | The list of available | - | | package | categorizations is at | - | | | http://pypi.python.org/pypi?:action=list\_classifiers. | + | | package | categorizations is available on `PyPI | + | | | `_. | +--------------------+--------------------------------+-------------------------------------------------------------+ | *distclass* | the :class:`Distribution` | A subclass of | | | class to use | :class:`distutils.core.Distribution` | diff -r 1521d9837d16 -r 5467abaaf5eb Doc/distutils/install.rst --- a/Doc/distutils/install.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/distutils/install.rst Fri Jul 29 03:11:09 2011 +0200 @@ -72,7 +72,7 @@ do the obvious thing with it: run it if it's an executable installer, ``rpm --install`` it if it's an RPM, etc. You don't need to run Python or a setup script, you don't need to compile anything---you might not even need to read any -instructions (although it's always a good idea to do so anyways). +instructions (although it's always a good idea to do so anyway). Of course, things will not always be that easy. You might be interested in a module distribution that doesn't have an easy-to-use installer for your diff -r 1521d9837d16 -r 5467abaaf5eb Doc/glossary.rst --- a/Doc/glossary.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/glossary.rst Fri Jul 29 03:11:09 2011 +0200 @@ -431,7 +431,8 @@ mapping A container object that supports arbitrary key lookups and implements the - methods specified in the :class:`Mapping` or :class:`MutableMapping` + methods specified in the :class:`~collections.Mapping` or + :class:`~collections.MutableMapping` :ref:`abstract base classes `. Examples include :class:`dict`, :class:`collections.defaultdict`, :class:`collections.OrderedDict` and :class:`collections.Counter`. diff -r 1521d9837d16 -r 5467abaaf5eb Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/library/ossaudiodev.rst Fri Jul 29 03:11:09 2011 +0200 @@ -14,7 +14,7 @@ ALSA is in the standard kernel as of 2.5.x. Presumably if you use ALSA, you'll have to make sure its OSS compatibility layer is active to use ossaudiodev, but you're gonna need it for the vast - majority of Linux audio apps anyways. + majority of Linux audio apps anyway. Sounds like things are also complicated for other BSDs. In response to my python-dev query, Thomas Wouters said: diff -r 1521d9837d16 -r 5467abaaf5eb Doc/library/packaging.dist.rst --- a/Doc/library/packaging.dist.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/library/packaging.dist.rst Fri Jul 29 03:11:09 2011 +0200 @@ -67,8 +67,8 @@ | | be built | :class:`packaging.compiler.extension.Extension` | +--------------------+--------------------------------+-------------------------------------------------------------+ | *classifiers* | A list of categories for the | The list of available | - | | distribution | categorizations is at | - | | | http://pypi.python.org/pypi?:action=list\_classifiers. | + | | distribution | categorizations is available on `PyPI | + | | | `_. | +--------------------+--------------------------------+-------------------------------------------------------------+ | *distclass* | the :class:`Distribution` | A subclass of | | | class to use | :class:`packaging.dist.Distribution` | diff -r 1521d9837d16 -r 5467abaaf5eb Doc/library/profile.rst --- a/Doc/library/profile.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/library/profile.rst Fri Jul 29 03:11:09 2011 +0200 @@ -39,7 +39,7 @@ 2. :mod:`profile`, a pure Python module whose interface is imitated by :mod:`cProfile`. Adds significant overhead to profiled programs. If you're trying to extend the profiler in some way, the task might be easier with this - module. Copyright © 1994, by InfoSeek Corporation. + module. The :mod:`profile` and :mod:`cProfile` modules export the same interface, so they are mostly interchangeable; :mod:`cProfile` has a much lower overhead but @@ -592,27 +592,3 @@ functions should be used with care and should be as fast as possible. For the best results with a custom timer, it might be necessary to hard-code it in the C source of the internal :mod:`_lsprof` module. - - -Copyright and License Notices -============================= - -Copyright © 1994, by InfoSeek Corporation, all rights reserved. - -Permission to use, copy, modify, and distribute this Python software and its -associated documentation for any purpose (subject to the restriction in the -following sentence) without fee is hereby granted, provided that the above -copyright notice appears in all copies, and that both that copyright notice and -this permission notice appear in supporting documentation, and that the name of -InfoSeek not be used in advertising or publicity pertaining to distribution of -the software without specific, written prior permission. This permission is -explicitly restricted to the copying and modification of the software to remain -in Python, compiled Python, or other languages (such as C) wherein the modified -or derived code is exclusively imported into a Python module. - -INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT -SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff -r 1521d9837d16 -r 5467abaaf5eb Doc/library/shutil.rst --- a/Doc/library/shutil.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/library/shutil.rst Fri Jul 29 03:11:09 2011 +0200 @@ -159,12 +159,18 @@ .. function:: move(src, dst) - Recursively move a file or directory to another location. + Recursively move a file or directory (*src*) to another location (*dst*). + + If the destination is a directory or a symlink to a directory, then *src* is + moved inside that directory. - Uses :func:`os.rename` to perform the move. If it fails, for reasons such as - when *src* and *dst* are on different filesystems or in case of windows where - rename is not supported when *dst* exists, fallback to copying *src* (with - :func:`copy2`) to the *dst* and then remove *src*. + The destination directory must not already exist. If the destination already + exists but is not a directory, it may be overwritten depending on + :func:`os.rename` semantics. + + If the destination is on the current filesystem, then :func:`os.rename` is + used. Otherwise, *src* is copied (using :func:`copy2`) to *dst* and then + removed. .. function:: disk_usage(path) @@ -177,9 +183,9 @@ .. exception:: Error - This exception collects exceptions that raised during a multi-file operation. For - :func:`copytree`, the exception argument is a list of 3-tuples (*srcname*, - *dstname*, *exception*). + This exception collects exceptions that are raised during a multi-file + operation. For :func:`copytree`, the exception argument is a list of 3-tuples + (*srcname*, *dstname*, *exception*). .. _shutil-example: @@ -277,7 +283,7 @@ .. function:: get_archive_formats() - Returns a list of supported formats for archiving. + Return a list of supported formats for archiving. Each element of the returned sequence is a tuple ``(name, description)`` By default :mod:`shutil` provides these formats: @@ -295,7 +301,7 @@ .. function:: register_archive_format(name, function, [extra_args, [description]]) - Registers an archiver for the format *name*. *function* is a callable that + Register an archiver for the format *name*. *function* is a callable that will be used to invoke the archiver. If given, *extra_args* is a sequence of ``(name, value)`` pairs that will be diff -r 1521d9837d16 -r 5467abaaf5eb Doc/license.rst --- a/Doc/license.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/license.rst Fri Jul 29 03:11:09 2011 +0200 @@ -494,36 +494,6 @@ PERFORMANCE OF THIS SOFTWARE. -Profiling ---------- - -The :mod:`profile` and :mod:`pstats` modules contain the following notice:: - - Copyright 1994, by InfoSeek Corporation, all rights reserved. - Written by James Roskind - - Permission to use, copy, modify, and distribute this Python software - and its associated documentation for any purpose (subject to the - restriction in the following sentence) without fee is hereby granted, - provided that the above copyright notice appears in all copies, and - that both that copyright notice and this permission notice appear in - supporting documentation, and that the name of InfoSeek not be used in - advertising or publicity pertaining to distribution of the software - without specific, written prior permission. This permission is - explicitly restricted to the copying and modification of the software - to remain in Python, compiled Python, or other languages (such as C) - wherein the modified or derived code is exclusively imported into a - Python module. - - INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY - SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER - RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - Execution tracing ----------------- diff -r 1521d9837d16 -r 5467abaaf5eb Doc/tools/sphinxext/susp-ignored.csv --- a/Doc/tools/sphinxext/susp-ignored.csv Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/tools/sphinxext/susp-ignored.csv Fri Jul 29 03:11:09 2011 +0200 @@ -5,7 +5,6 @@ c-api/sequence,,:i2,o[i1:i2] = v c-api/sequence,,:i2,del o[i1:i2] c-api/unicode,,:end,str[start:end] -distutils/apiref,,:action,http://pypi.python.org/pypi?:action=list\_classifiers distutils/setupscript,,::, extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))" extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {" @@ -495,7 +494,6 @@ library/pprint,209,::,"'Programming Language :: Python :: 2.7'," library/pprint,209,::,"'Topic :: Software Development :: Libraries'," library/pprint,209,::,"'Topic :: Software Development :: Libraries :: Python Modules']," -library/packaging.dist,,:action,http://pypi.python.org/pypi?:action=list\_classifiers packaging/examples,,`,This is the description of the ``foobar`` project. packaging/setupcfg,,::,Development Status :: 3 - Alpha packaging/setupcfg,,::,License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1) diff -r 1521d9837d16 -r 5467abaaf5eb Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst Thu Jul 28 23:35:29 2011 +0200 +++ b/Doc/tutorial/classes.rst Fri Jul 29 03:11:09 2011 +0200 @@ -598,24 +598,24 @@ Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls. For example:: - class Mapping: - def __init__(self, iterable): - self.items_list = [] - self.__update(iterable) + class Mapping: + def __init__(self, iterable): + self.items_list = [] + self.__update(iterable) - def update(self, iterable): - for item in iterable: - self.items_list.append(item) + def update(self, iterable): + for item in iterable: + self.items_list.append(item) - __update = update # private copy of original update() method + __update = update # private copy of original update() method - class MappingSubclass(Mapping): + class MappingSubclass(Mapping): - def update(self, keys, values): - # provides new signature for update() - # but does not break __init__() - for item in zip(keys, values): - self.items_list.append(item) + def update(self, keys, values): + # provides new signature for update() + # but does not break __init__() + for item in zip(keys, values): + self.items_list.append(item) Note that the mangling rules are designed mostly to avoid accidents; it still is possible to access or modify a variable that is considered private. This can diff -r 1521d9837d16 -r 5467abaaf5eb Lib/pstats.py --- a/Lib/pstats.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Lib/pstats.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,13 +1,9 @@ """Class for printing reports on profiled python code.""" -# Class for printing reports on profiled python code. rev 1.0 4/1/94 -# # Written by James Roskind # Based on prior profile module by Sjoerd Mullender... # which was hacked somewhat by: Guido van Rossum -"""Class for profiling Python code.""" - # Copyright Disney Enterprises, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement # diff -r 1521d9837d16 -r 5467abaaf5eb Lib/test/list_tests.py --- a/Lib/test/list_tests.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Lib/test/list_tests.py Fri Jul 29 03:11:09 2011 +0200 @@ -4,17 +4,10 @@ import sys import os +from functools import cmp_to_key from test import support, seq_tests -def CmpToKey(mycmp): - 'Convert a cmp= function into a key= function' - class K(object): - def __init__(self, obj): - self.obj = obj - def __lt__(self, other): - return mycmp(self.obj, other.obj) == -1 - return K class CommonTest(seq_tests.CommonTest): @@ -484,7 +477,7 @@ return 1 else: # a > b return -1 - u.sort(key=CmpToKey(revcmp)) + u.sort(key=cmp_to_key(revcmp)) self.assertEqual(u, self.type2test([2,1,0,-1,-2])) # The following dumps core in unpatched Python 1.5: @@ -497,7 +490,7 @@ else: # xmod > ymod return 1 z = self.type2test(range(12)) - z.sort(key=CmpToKey(myComparison)) + z.sort(key=cmp_to_key(myComparison)) self.assertRaises(TypeError, z.sort, 2) @@ -509,7 +502,8 @@ return -1 else: # x > y return 1 - self.assertRaises(ValueError, z.sort, key=CmpToKey(selfmodifyingComparison)) + self.assertRaises(ValueError, z.sort, + key=cmp_to_key(selfmodifyingComparison)) self.assertRaises(TypeError, z.sort, 42, 42, 42, 42) diff -r 1521d9837d16 -r 5467abaaf5eb Lib/test/test_sort.py --- a/Lib/test/test_sort.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Lib/test/test_sort.py Fri Jul 29 03:11:09 2011 +0200 @@ -2,18 +2,11 @@ import random import sys import unittest +from functools import cmp_to_key verbose = support.verbose nerrors = 0 -def CmpToKey(mycmp): - 'Convert a cmp= function into a key= function' - class K(object): - def __init__(self, obj): - self.obj = obj - def __lt__(self, other): - return mycmp(self.obj, other.obj) == -1 - return K def check(tag, expected, raw, compare=None): global nerrors @@ -23,7 +16,7 @@ orig = raw[:] # save input in case of error if compare: - raw.sort(key=CmpToKey(compare)) + raw.sort(key=cmp_to_key(compare)) else: raw.sort() @@ -108,7 +101,7 @@ print(" Checking against an insane comparison function.") print(" If the implementation isn't careful, this may segfault.") s = x[:] - s.sort(key=CmpToKey(lambda a, b: int(random.random() * 3) - 1)) + s.sort(key=cmp_to_key(lambda a, b: int(random.random() * 3) - 1)) check("an insane function left some permutation", x, s) if len(x) >= 2: @@ -165,12 +158,12 @@ L.pop() return (x > y) - (x < y) L = [1,2] - self.assertRaises(ValueError, L.sort, key=CmpToKey(mutating_cmp)) + self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) def mutating_cmp(x, y): L.append(3) del L[:] return (x > y) - (x < y) - self.assertRaises(ValueError, L.sort, key=CmpToKey(mutating_cmp)) + self.assertRaises(ValueError, L.sort, key=cmp_to_key(mutating_cmp)) memorywaster = [memorywaster] #============================================================================== @@ -185,7 +178,7 @@ def my_cmp(x, y): xlower, ylower = x.lower(), y.lower() return (xlower > ylower) - (xlower < ylower) - copy.sort(key=CmpToKey(my_cmp)) + copy.sort(key=cmp_to_key(my_cmp)) def test_baddecorator(self): data = 'The quick Brown fox Jumped over The lazy Dog'.split() @@ -261,8 +254,8 @@ def my_cmp_reversed(x, y): x0, y0 = x[0], y[0] return (y0 > x0) - (y0 < x0) - data.sort(key=CmpToKey(my_cmp), reverse=True) - copy1.sort(key=CmpToKey(my_cmp_reversed)) + data.sort(key=cmp_to_key(my_cmp), reverse=True) + copy1.sort(key=cmp_to_key(my_cmp_reversed)) self.assertEqual(data, copy1) copy2.sort(key=lambda x: x[0], reverse=True) self.assertEqual(data, copy2) diff -r 1521d9837d16 -r 5467abaaf5eb Python/marshal.c --- a/Python/marshal.c Thu Jul 28 23:35:29 2011 +0200 +++ b/Python/marshal.c Fri Jul 29 03:11:09 2011 +0200 @@ -57,7 +57,7 @@ int error; /* see WFERR_* values */ int depth; /* If fp == NULL, the following are valid: */ - PyObject * readable; /* Stream-like object being read from */ + PyObject *readable; /* Stream-like object being read from */ PyObject *str; PyObject *current_filename; char *ptr; @@ -467,7 +467,7 @@ static int r_string(char *s, int n, RFILE *p) { - char * ptr; + char *ptr; int read, left; if (!p->readable) { @@ -566,7 +566,7 @@ static PyObject * r_long64(RFILE *p) { - PyObject * result = NULL; + PyObject *result = NULL; long lo4 = r_long(p); long hi4 = r_long(p); diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/abitype.py --- a/Tools/scripts/abitype.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/abitype.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # This script converts a C file to use the PEP 384 type definition API # Usage: abitype.py < old_code > new_code import re, sys diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/diff.py --- a/Tools/scripts/diff.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/diff.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 """ Command line interface to difflib.py providing diffs in four formats: * ndiff: lists every line and highlights interline changes. diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/mailerdaemon.py --- a/Tools/scripts/mailerdaemon.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/mailerdaemon.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,4 +1,5 @@ -"""mailerdaemon - classes to parse mailer-daemon messages""" +#!/usr/bin/env python3 +"""Classes to parse mailer-daemon messages.""" import calendar import email.message @@ -6,7 +7,10 @@ import os import sys -Unparseable = 'mailerdaemon.Unparseable' + +class Unparseable(Exception): + pass + class ErrorMessage(email.message.Message): def __init__(self): @@ -18,8 +22,10 @@ if not sub: return 0 sub = sub.lower() - if sub.startswith('waiting mail'): return 1 - if 'warning' in sub: return 1 + if sub.startswith('waiting mail'): + return 1 + if 'warning' in sub: + return 1 self.sub = sub return 0 @@ -145,14 +151,17 @@ errors.append(' '.join((email.strip()+': '+reason).split())) return errors -EMPARSERS = [emparse_list, ] +EMPARSERS = [emparse_list] def sort_numeric(a, b): a = int(a) b = int(b) - if a < b: return -1 - elif a > b: return 1 - else: return 0 + if a < b: + return -1 + elif a > b: + return 1 + else: + return 0 def parsedir(dir, modify): os.chdir(dir) diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/make_ctype.py --- a/Tools/scripts/make_ctype.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/make_ctype.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 """Script that generates the ctype.h-replacement in stringobject.c.""" NAMES = ("LOWER", "UPPER", "ALPHA", "DIGIT", "XDIGIT", "ALNUM", "SPACE") diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/patchcheck.py --- a/Tools/scripts/patchcheck.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/patchcheck.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import re import sys import shutil diff -r 1521d9837d16 -r 5467abaaf5eb Tools/scripts/reindent-rst.py --- a/Tools/scripts/reindent-rst.py Thu Jul 28 23:35:29 2011 +0200 +++ b/Tools/scripts/reindent-rst.py Fri Jul 29 03:11:09 2011 +0200 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Make a reST file compliant to our pre-commit hook. # Currently just remove trailing whitespace./merwok@netwok.org