[Python-Dev] textwrap.py

Steven Lott s_lott@yahoo.com
Sun, 9 Jun 2002 11:44:25 -0700 (PDT)


--0-1592618721-1023648265=:17605
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Here's a version with the Strategy classes included.  This
allows for essentially unlimited alternatives on the subjects of
long words, full stops, and also permits right justification.

This is my preference for resolving "creeping featuritis".  Any
new feature can be implemented as yet another strategy plug-in.

Note that I am AR about superclasses.  Python does not require
this level of fussiness, but I find that when I leave them out,
I always wish I had them as a place to factor out common
functions.



=====
--
S. Lott, CCP :-{)
S_LOTT@YAHOO.COM
http://www.mindspring.com/~slott1
Buccaneer #468: KaDiMa

Macintosh user: drinking upstream from the herd.

__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.com
--0-1592618721-1023648265=:17605
Content-Type: application/octet-stream; name="textwrap.py"
Content-Transfer-Encoding: base64
Content-Description: textwrap.py
Content-Disposition: attachment; filename="textwrap.py"

IiIiClV0aWxpdGllcyBmb3Igd3JhcHBpbmcgdGV4dCBzdHJpbmdzIGFuZCBm
aWxsaW5nIHRleHQgcGFyYWdyYXBocy4KIiIiCgpfX3JldmlzaW9uX18gPSAi
JElkJCIKCmltcG9ydCBzdHJpbmcsIHJlCgoKIyBYWFggaXMgdGhpcyBnb2lu
ZyB0byBiZSBpbXBsZW1lbnRlZCBwcm9wZXJseSBzb21ld2hlcmUgaW4gMi4z
PwpkZWYgaXNsb3dlciAoYyk6CiAgICByZXR1cm4gYyBpbiBzdHJpbmcubG93
ZXJjYXNlCgojIFRleHRQcmVwcm9jZXNzIGNsYXNzIGhpZXJhcmNoeToKIyAg
IFRoZXNlIGNsYXNzZXMgYXJlIGFsbCBwbHVnLWluIHN0cmF0ZWdpZXMgZm9y
IHByZXByb2Nlc3NpbmcgdGV4dCBwcmlvciAKIyAgIHRvIHNwbGl0dGluZyBp
bnRvIGNodW5rcy4KCmNsYXNzIFRleHRQcmVwcm9jZXNzOgogICAgIiIiUHJl
cHJvY2VzcyB0ZXh0IGJlZm9yZSBmaWxsaW5nIGxpbmVzLiIiIgogICAgZGVm
IHRyYW5zZm9ybSggc2VsZiwgdGV4dCApOgogICAgICAgIHJldHVybiB0ZXh0
CiAgICAgICAgCmNsYXNzIEV4cGFuZFRhYnMoIFRleHRQcmVwcm9jZXNzICk6
CiAgICAiIiJFeHBhbmQgVGFicyB0byBzcGFjZXMuIiIiCiAgICBkZWYgX19p
bml0X18oIHNlbGYsIHdpZHRoICk6CiAgICAgICAgc2VsZi53aWR0aD0gd2lk
dGgKICAgIGRlZiB0cmFuc2Zvcm0oIHNlbGYsIHRleHQgKToKICAgICAgICBy
ZXR1cm4gdGV4dC5leHBhbmR0YWJzKCkKCmNsYXNzIENsZWFuV2hpdGVzcGFj
ZSggVGV4dFByZXByb2Nlc3MgKToKICAgICIiIk5vcm1hbGl6ZSB2YXJpb3Vz
IHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZSBzcGFjZXMuIiIiIAogICAg
d2hpdGVzcGFjZV90cmFucz0gc3RyaW5nLm1ha2V0cmFucyggc3RyaW5nLndo
aXRlc3BhY2UsIAogICAgICAgICcgJypsZW4oc3RyaW5nLndoaXRlc3BhY2Up
ICkKICAgIGRlZiB0cmFuc2Zvcm0oIHNlbGYsIHRleHQgKToKICAgICAgICBy
ZXR1cm4gdGV4dC50cmFuc2xhdGUoIHNlbGYud2hpdGVzcGFjZV90cmFucyAp
CgojIENodW5rUHJlcHJvY2VzcyBjbGFzcyBoaWVyYXJjaHk6CiMgICAgVGhl
c2UgY2xhc3NlcyBhcmUgcGx1Zy1pbiBzdHJhdGVnaWVzIGZvciBwcm9jZXNz
aW5nIGEgc2VxdWVuY2Ugb2YgY2h1bmtzCiMgICAgcHJpb3IgdG8gd3JhcHBp
bmcuCgpjbGFzcyBDaHVua1ByZXByb2Nlc3M6CiAgICAiIiJQYXJlbnQgY2xh
c3MgZm9yIHBvc3Qtc3BsaXQsIHByZS13cmFwIHByb2Nlc3NpbmcuIiIiCiAg
ICBkZWYgYWJicmV2KCBzZWxmLCB0ZXh0ICk6CiAgICAgICAgcmV0dXJuIHRl
eHRbMF0gaW4gc3RyaW5nLnVwcGVyY2FzZSBhbmQgdGV4dFstMV0gPT0gJy4n
CiAgICBkZWYgdHJhbnNmb3JtKCBzZWxmLCBjaHVua3MgKToKICAgICAgICBy
ZXR1cm4gY2h1bmtzCiAgICAKY2xhc3MgRnVsbFN0b3BUd29TcGFjZSggQ2h1
bmtQcmVwcm9jZXNzICk6CiAgICAiIiJFbnN1cmUgdGhhdCBmdWxsIHN0b3Bz
IGFyZSBmb2xsb3dlZCBieSB0d28gc3BhY2VzLiIiIgogICAgZGVmIHRyYW5z
Zm9ybSggc2VsZiwgY2h1bmtzICk6CiAgICAgICAgaT0gMAogICAgICAgIHdo
aWxlIGkgPCBsZW4oY2h1bmtzKS0xOgogICAgICAgICAgICBpZiBzZWxmLmFi
YnJldiggY2h1bmtzW2ldICkgYW5kIGNodW5rc1tpKzFdLnN0YXJ0c3dpdGgo
JyAnKToKICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdPSAnICAnCiAgICAg
ICAgICAgICAgICBpICs9IDIKICAgICAgICAgICAgZWxzZToKICAgICAgICAg
ICAgICAgIGkgKz0gMQogICAgCmNsYXNzIEZ1bGxTdG9wT25lU3BhY2UoIENo
dW5rUHJlcHJvY2VzcyApOgogICAgIiIiRW5zdXJlIHRoYXQgZnVsbCBzdG9w
cyBhcmUgZm9sbG93ZWQgYnkgb25lIHNwYWNlLiIiIgogICAgZGVmIHRyYW5z
Zm9ybSggc2VsZiwgY2h1bmtzICk6CiAgICAgICAgaT0gMAogICAgICAgIHdo
aWxlIGkgPCBsZW4oY2h1bmtzKS0xOgogICAgICAgICAgICBpZiBzZWxmLmFi
YnJldiggY2h1bmtzW2ldICkgYW5kIGNodW5rc1tpKzFdLnN0YXJ0c3dpdGgo
JyAnKToKICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdPSAnICcKICAgICAg
ICAgICAgICAgIGkgKz0gMgogICAgICAgICAgICBlbHNlOgogICAgICAgICAg
ICAgICAgaSArPSAxCgojIExvbmdXb3JkIGNsYXNzIGhpZXJhcmNoeToKIyAg
ICBUaGVzZSBjbGFzc2VzIGFyZSBhbGwgcGx1Zy1pbiBzdHJhdGVnaWVzIGZv
ciBjb3Bpbmcgd2l0aCBsb25nIHdvcmRzCiMgICAgdGhhdCB3b3VsZCBvdmVy
ZmxvdyB0aGUgbGluZSBlbmRpbmcuICBBZGRpdGlvbmFsIHN1YmNsYXNzIG1p
Z2h0IGJlCiMgICAgd3JpdHRlbiB0byBoYW5kbGUgc3BsaXR0aW5nIHdvcmRz
IG9uIGRvdWJsZSBsZXR0ZXJzIG9yIGNvbW1vbiBlbmRpbmdzLgoKY2xhc3Mg
TG9uZ1dvcmRzOgogICAgIiIiU3RyYXRlZ3kgZm9yIGhhbmRsaW5nIGxvbmcg
d29yZCBicmVha3MuIiIiCiAgICBkZWYgaGFuZGxlKCBzZWxmLCBjaHVua3Ms
IGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aCApOgogICAgICAgIHBhc3MKCmNs
YXNzIEJyZWFrTG9uZ1dvcmRzKCBMb25nV29yZHMgKToKICAgICIiIkJyZWFr
IGEgbG9uZyB3b3JkIHRvIGtlZXAgdGhlIGxpbmUgYW4gYXBwcm9wcmlhdGUg
bGVuZ3RoLiIiIgogICAgZGVmIGhhbmRsZSggc2VsZiwgY2h1bmtzLCBjdXJf
bGluZSwgY3VyX2xlbiwgd2lkdGggKToKICAgICAgICBzcGFjZV9sZWZ0PSB3
aWR0aCAtIGN1cl9sZW4KICAgICAgICBjdXJfbGluZS5hcHBlbmQoIGNodW5r
c1swXVswOnNwYWNlX2xlZnRdICkKICAgICAgICBjaHVua3NbMF09IGNodW5r
c1swXVtzcGFjZV9sZWZ0Ol0KICAgIApjbGFzcyBLZWVwTG9uZ1dvcmRzKCBM
b25nV29yZHMgKToKICAgICIiIlB1dCB0aGUgbG9uZyB3b3JkIG9uIHRoZSBu
ZXh0IGxpbmUsIHdoZXJlIGl0IG1heSBiZSB0b28gbG9uZy4iIiIKICAgIGRl
ZiBoYW5kbGUoIHNlbGYsIGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdp
ZHRoICk6CiAgICAgICAgaWYgbm90IGN1cl9saW5lOiAKICAgICAgICAgICAg
Y3VyX2xpbmUuYXBwZW5kKCBjaHVua3MucG9wKDApICkKCiMgTGluZSBwb3N0
LXByb2Nlc3MgY2xhc3MgaGllcmFyY2h5OgojICAgICBUaGVzZSBjbGFzc2Vz
IGFyZSBwbHVnLWluIHN0cmF0ZWdpZXMgZm9yIHBvc3QtcHJvY2Vzc2luZyBs
aW5lcwoKY2xhc3MgTGluZVBvc3Rwcm9jZXNzOgogICAgZGVmIHRyYW5zZm9y
bSggc2VsZiwgbGluZXMgKToKICAgICAgICByZXR1cm4gbGluZXMKCmNsYXNz
IFRleHRXcmFwcGVyOgogICAgIiIiCiAgICBPYmplY3QgZm9yIHdyYXBwaW5n
L2ZpbGxpbmcgdGV4dC4gIFRoZSBwdWJsaWMgaW50ZXJmYWNlIGNvbnNpc3Rz
IG9mCiAgICB0aGUgd3JhcCgpIGFuZCBmaWxsKCkgbWV0aG9kczsgdGhlIG90
aGVyIG1ldGhvZHMgYXJlIGp1c3QgdGhlcmUgZm9yCiAgICBzdWJjbGFzc2Vz
IHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJl
aGF2aW91ci4KICAgIElmIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgcmVwbGFj
ZSB0aGUgbWFpbiB3cmFwcGluZyBhbGdvcml0aG0sCiAgICB5b3UnbGwgcHJv
YmFibHkgaGF2ZSB0byBvdmVycmlkZSBfd3JhcF9jaHVua3MoKS4KCiAgICBT
ZXZlcmFsIHN0cmF0ZWd5IGNsYXNzZXMgY2FuIGJlIHVzZWQgdG8gY3VzdG9t
aXplIHRoZSBvcGVyYXRpb24uCiAgICAKICAgIEEgc2VxdWVuY2Ugb2YgaW5z
dGFuY2VzIG9mIHN1YmNsYXNzIG9mIFRleHRQcmVwcm9jZXNzIGFyZSB1c2Vk
CiAgICB0byBwcmUtcHJvY2VzcyB0aGUgdGV4dCBiZWZvcmUgYnJlYWtpbmcg
aW50byBjaHVua3MgYW5kIHdyYXBwaW5nLgogICAgICBFeHBhbmRUYWJzCiAg
ICAgICAgVGFicyBpbiBpbnB1dCB0ZXh0IHdpbGwgYmUgZXhwYW5kZWQKICAg
ICAgICB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIEVh
Y2ggdGFiIHdpbGwKICAgICAgICBiZWNvbWUgMSAuLiA4IHNwYWNlcywgZGVw
ZW5kaW5nIG9uIGl0cyBwb3NpdGlvbiBpbiBpdHMgbGluZS4KICAgICAgQ2xl
YW5XaGl0ZXNwYWNlCiAgICAgICAgQWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVy
cyBpbiB0aGUgaW5wdXQKICAgICAgICB0ZXh0IGFyZSByZXBsYWNlZCBieSBz
cGFjZXMuCiAgICAKICAgIEEgc2VxdWVuY2Ugb2YgaW5zdGFuY2VzIG9mIHN1
YmNsYXNzIG9mIENodW5rUHJlcHJvY2VzcyBhcmUgdXNlZAogICAgdG8gcHJl
LXByb2Nlc3MgdGhlIGNodW5rcyBwcmlvciB0byB3cmFwcGluZy4KICAgICAg
RnVsbFN0b3BUd29TcGFjZQogICAgICAgIEVuc3VyZXMgdGhhdCBmdWxsIHN0
b3BzIGFyZSBmb2xsb3dlZCBieSBwcmVjaXNlbHkgdHdvIHNwYWNlcy4KICAg
ICAgRnVsbFN0b3BPbmVTcGFjZQogICAgICAgIEVuc3VyZXMgdGhhdCBmdWxs
IHN0b3BzIGFyZSBmb2xsb3dlZCBieSBwcmVjaXNlbGUgb25lIHNwYWNlLgog
ICAgCiAgICBBbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIExvbmdXb3Jk
cyBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgCiAgICBtZWNoYW5pc20gb2YgYnJl
YWtpbmcgb3IgcHJlc2VydmluZyBsb25nIHdvcmRzIGF0IHRoZSBlbmQgb2Yg
dGhlIAogICAgbGluZSBkdXJpbmcgd3JhcHBpbmcuCiAgICAgIEJyZWFrTG9u
Z1dvcmRzCiAgICAgICAgV29yZHMgbG9uZ2VyIHRoYW4gdGhlIGxpbmUgd2lk
dGggY29uc3RyYWludAogICAgICAgIHdpbGwgYmUgYnJva2VuLiAgCiAgICAg
IEtlZXBMb25nV29yZHMKICAgICAgICBXb3JkcyBsb25nZXIgdGhhbiB0aGUg
bGluZSB3aWR0aCBjb25zdHJhaW50IHdpbGwgbm90IGJlIGJyb2tlbiwKICAg
ICAgICBhbmQgc29tZSBsaW5lcyBtaWdodCBiZSBsb25nZXIgdGhhbiB0aGUg
d2lkdGggY29uc3RyYWludC4KICAgICAgICAKICAgIFByb3ZpZGUgYSBzZXF1
ZW5jZSBzdHJhdGVnaWVzIHdoZW4geW91IGNvbnN0cnVjdCB0aGUgaW5zdGFu
Y2Ugb2YgVGV4dFdyYXBwZXIuCiAgICBUaGV5IGFyZSBleGVjdXRlZCBpbiB0
aGUgb3JkZXIgcHJvdmlkZWQuCiAgICAKICAgIEZvciBleGFtcGxlOgogICAg
ICAgIHdyYXA9IFRleHRXcmFwcGVyKCBbIEV4cGFuZFRhYnMoKSwgQ2xlYW5X
aGl0ZXNwYWNlKCkgXSwgTm9uZSwgQnJlYWtMb25nV29yZHMoKSApCiAgICAi
IiIKCiAgICAjIFRoaXMgZnVua3kgbGl0dGxlIHJlZ2V4IGlzIGp1c3QgdGhl
IHRyaWNrIGZvciBzcGxpdHRpbmcgCiAgICAjIHRleHQgdXAgaW50byB3b3Jk
LXdyYXBwYWJsZSBjaHVua3MuICBFLmcuCiAgICAjICAgIkhlbGxvIHRoZXJl
IC0tIHlvdSBnb29mLWJhbGwsIHVzZSB0aGUgLWIgb3B0aW9uISIKICAgICMg
c3BsaXRzIGludG8KICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3Uv
IC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIQogICAg
IyAoYWZ0ZXIgc3RyaXBwaW5nIG91dCBlbXB0eSBzdHJpbmdzKS4KICAgIHdv
cmRzZXBfcmUgPSByZS5jb21waWxlKHInKFxzK3wnICAgICAgICAgICAgICAg
ICAgIyBhbnkgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcidcd3syLH0tKD89XHd7Mix9KXwnICAgICAjIGh5cGhlbmF0ZWQgd29y
ZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKD88PVx3KS17Mix9
KD89XHcpKScpICAgIyBlbS1kYXNoCgoKICAgIGRlZiBfX2luaXRfXyAoc2Vs
Zix0ZXh0UHJlPVtdLGNodW5rUHJlPVtdLGxvbmd3b3Jkcz1bXSxsaW5lUG9z
dD1bXSk6CiAgICAgICAgaWYgdGV4dFByZToKICAgICAgICAgICAgc2VsZi50
ZXh0UHJlPSB0ZXh0UHJlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2Vs
Zi50ZXh0UHJlPSBbIEV4cGFuZFRhYnMoOCksIENsZWFuV2hpdGVzcGFjZSgp
IF0KICAgICAgICBzZWxmLmNodW5rUHJlPSBjaHVua1ByZQogICAgICAgIGlm
IGxvbmd3b3JkczoKICAgICAgICAgICAgc2VsZi5sb25nX3dvcmRzPSBsb25n
d29yZHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmxvbmdfd29y
ZHM9IEJyZWFrTG9uZ1dvcmRzKCkKICAgICAgICBzZWxmLmxpbmVQb3N0PSBs
aW5lUG9zdAogICAgICAgIAoKICAgICMgLS0gUHJpdmF0ZSBtZXRob2RzIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAgICAjIChwb3NzaWJseSB1c2VmdWwgZm9yIHN1YmNsYXNzZXMgdG8gb3Zl
cnJpZGUpCgoKICAgIGRlZiBfc3BsaXQgKHNlbGYsIHRleHQpOgogICAgICAg
ICIiIl9zcGxpdCh0ZXh0IDogc3RyaW5nKSAtPiBbc3RyaW5nXQoKICAgICAg
ICBTcGxpdCB0aGUgdGV4dCB0byB3cmFwIGludG8gaW5kaXZpc2libGUgY2h1
bmtzLiAgQ2h1bmtzIGFyZQogICAgICAgIG5vdCBxdWl0ZSB0aGUgc2FtZSBh
cyB3b3Jkczsgc2VlIHdyYXBfY2h1bmtzKCkgZm9yIGZ1bGwKICAgICAgICBk
ZXRhaWxzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIHRleHQKICAgICAgICAgIExv
b2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiEKICAgICAgICBi
cmVha3MgaW50byB0aGUgZm9sbG93aW5nIGNodW5rczoKICAgICAgICAgICdM
b29rLCcsICcgJywgJ2dvb2YtJywgJ2JhbGwnLCAnICcsICctLScsICcgJywK
ICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywg
J29wdGlvbiEnCiAgICAgICAgIiIiCiAgICAgICAgY2h1bmtzID0gc2VsZi53
b3Jkc2VwX3JlLnNwbGl0KHRleHQpCiAgICAgICAgY2h1bmtzID0gZmlsdGVy
KE5vbmUsIGNodW5rcykKICAgICAgICByZXR1cm4gY2h1bmtzCgogICAgZGVm
IF9maXhfc2VudGVuY2VfZW5kaW5ncyAoc2VsZiwgY2h1bmtzKToKICAgICAg
ICAiIiJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10p
CgogICAgICAgIENvcnJlY3QgZm9yIHNlbnRlbmNlIGVuZGluZ3MgYnVyaWVk
IGluICdjaHVua3MnLiAgRWcuIHdoZW4gdGhlCiAgICAgICAgb3JpZ2luYWwg
dGV4dCBjb250YWlucyAiLi4uIGZvby5cbkJhciAuLi4iLCBtdW5nZV93aGl0
ZXNwYWNlKCkKICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhh
dCB0byBbLi4uLCAiZm9vLiIsICIgIiwgIkJhciIsIC4uLl0KICAgICAgICB3
aGljaCBoYXMgb25lIHRvbyBmZXcgc3BhY2VzOyB0aGlzIG1ldGhvZCBzaW1w
bHkgY2hhbmdlcyB0aGUgb25lCiAgICAgICAgc3BhY2UgdG8gdHdvLgogICAg
ICAgICIiIgogICAgICAgIGkgPSAwCiAgICAgICAgd2hpbGUgaSA8IGxlbihj
aHVua3MpLTE6CiAgICAgICAgICAgICMgY2h1bmtzW2ldIGxvb2tzIGxpa2Ug
dGhlIGxhc3Qgd29yZCBvZiBhIHNlbnRlbmNlLAogICAgICAgICAgICAjIGFu
ZCBpdCdzIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIHNwYWNlLgogICAgICAgICAg
ICBpZiAoY2h1bmtzW2ldWy0xXSA9PSAiLiIgYW5kCiAgICAgICAgICAgICAg
ICAgIGNodW5rc1tpKzFdID09ICIgIiBhbmQKICAgICAgICAgICAgICAgICAg
aXNsb3dlcihjaHVua3NbaV1bLTJdKSk6CiAgICAgICAgICAgICAgICBjaHVu
a3NbaSsxXSA9ICIgICIKICAgICAgICAgICAgICAgIGkgKz0gMgogICAgICAg
ICAgICBlbHNlOgogICAgICAgICAgICAgICAgaSArPSAxCgoKICAgIGRlZiBf
d3JhcF9jaHVua3MgKHNlbGYsIGNodW5rcywgd2lkdGgpOgogICAgICAgICIi
Il93cmFwX2NodW5rcyhjaHVua3MgOiBbc3RyaW5nXSwgd2lkdGggOiBpbnQp
IC0+IFtzdHJpbmddCgogICAgICAgIFdyYXAgYSBzZXF1ZW5jZSBvZiB0ZXh0
IGNodW5rcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBsaW5lcyBvZgogICAgICAg
IGxlbmd0aCAnd2lkdGgnIG9yIGxlc3MuICAoSWYgJ2JyZWFrX2xvbmdfd29y
ZHMnIGlzIGZhbHNlLCBzb21lCiAgICAgICAgbGluZXMgbWF5IGJlIGxvbmdl
ciB0aGFuICd3aWR0aCcuKSAgQ2h1bmtzIGNvcnJlc3BvbmQgcm91Z2hseSB0
bwogICAgICAgIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRo
ZW06IGVhY2ggY2h1bmsgaXMgaW5kaXZpc2libGUKICAgICAgICAobW9kdWxv
ICdsb25nX3dvcmQuaGFuZGxlKCknKSwgYnV0IGEgbGluZSBicmVhayBjYW4g
Y29tZSBiZXR3ZWVuCiAgICAgICAgYW55IHR3byBjaHVua3MuICBDaHVua3Mg
c2hvdWxkIG5vdCBoYXZlIGludGVybmFsIHdoaXRlc3BhY2U7CiAgICAgICAg
aWUuIGEgY2h1bmsgaXMgZWl0aGVyIGFsbCB3aGl0ZXNwYWNlIG9yIGEgIndv
cmQiLiAgV2hpdGVzcGFjZQogICAgICAgIGNodW5rcyB3aWxsIGJlIHJlbW92
ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgbGluZXMsIGJ1dAog
ICAgICAgIGFwYXJ0IGZyb20gdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZl
ZC4KICAgICAgICAiIiIKICAgICAgICBsaW5lcyA9IFtdCgogICAgICAgIHdo
aWxlIGNodW5rczoKCiAgICAgICAgICAgIGN1cl9saW5lID0gW10gICAgICAg
ICAgICAgICAgICAgIyBsaXN0IG9mIGNodW5rcyAodG8tYmUtam9pbmVkKQog
ICAgICAgICAgICBjdXJfbGVuID0gMCAgICAgICAgICAgICAgICAgICAgICMg
bGVuZ3RoIG9mIGN1cnJlbnQgbGluZQoKICAgICAgICAgICAgIyBGaXJzdCBj
aHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdC4KICAgICAg
ICAgICAgaWYgY2h1bmtzWzBdLnN0cmlwKCkgPT0gJyc6CiAgICAgICAgICAg
ICAgICBkZWwgY2h1bmtzWzBdCgogICAgICAgICAgICB3aGlsZSBjaHVua3M6
CiAgICAgICAgICAgICAgICBsID0gbGVuKGNodW5rc1swXSkKCiAgICAgICAg
ICAgICAgICAjIENhbiBhdCBsZWFzdCBzcXVlZXplIHRoaXMgY2h1bmsgb250
byB0aGUgY3VycmVudCBsaW5lLgogICAgICAgICAgICAgICAgaWYgY3VyX2xl
biArIGwgPD0gd2lkdGg6CiAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUu
YXBwZW5kKGNodW5rcy5wb3AoMCkpCiAgICAgICAgICAgICAgICAgICAgY3Vy
X2xlbiArPSBsCgogICAgICAgICAgICAgICAgIyBOb3BlLCB0aGlzIGxpbmUg
aXMgZnVsbC4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAg
ICAgICAgYnJlYWsKCiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBp
cyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0bwogICAg
ICAgICAgICAjIGZpdCBvbiAqYW55KiBsaW5lIChub3QganVzdCB0aGlzIG9u
ZSkuICAKICAgICAgICAgICAgaWYgY2h1bmtzIGFuZCBsZW4oY2h1bmtzWzBd
KSA+IHdpZHRoOgogICAgICAgICAgICAgICAgc2VsZi5sb25nX3dvcmRzLmhh
bmRsZShjaHVua3MsIGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aCkKCiAgICAg
ICAgICAgICMgSWYgdGhlIGxhc3QgY2h1bmsgb24gdGhpcyBsaW5lIGlzIGFs
bCB3aGl0ZXNwYWNlLCBkcm9wIGl0LgogICAgICAgICAgICBpZiBjdXJfbGlu
ZSBhbmQgY3VyX2xpbmVbLTFdLnN0cmlwKCkgPT0gJyc6CiAgICAgICAgICAg
ICAgICBkZWwgY3VyX2xpbmVbLTFdCgogICAgICAgICAgICAjIENvbnZlcnQg
Y3VycmVudCBsaW5lIGJhY2sgdG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGlu
IGxpc3QKICAgICAgICAgICAgIyBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1
ZSkuCiAgICAgICAgICAgIGlmIGN1cl9saW5lOgogICAgICAgICAgICAgICAg
bGluZXMuYXBwZW5kKCcnLmpvaW4oY3VyX2xpbmUpKQoKICAgICAgICByZXR1
cm4gbGluZXMKCgogICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBk
ZWYgd3JhcCAoc2VsZiwgdGV4dCwgd2lkdGgpOgogICAgICAgICIiIndyYXAo
dGV4dCA6IHN0cmluZywgd2lkdGggOiBpbnQpIC0+IFtzdHJpbmddCgogICAg
ICAgIFNwbGl0ICd0ZXh0JyBpbnRvIG11bHRpcGxlIGxpbmVzIG9mIG5vIG1v
cmUgdGhhbiAnd2lkdGgnCiAgICAgICAgY2hhcmFjdGVycyBlYWNoLCBhbmQg
cmV0dXJuIHRoZSBsaXN0IG9mIHN0cmluZ3MgdGhhdCByZXN1bHRzLgogICAg
ICAgIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5l
eHBhbmR0YWJzKCksIGFuZCBhbGwKICAgICAgICBvdGhlciB3aGl0ZXNwYWNl
IGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuZXdsaW5lKSBhcmUgY29udmVydGVk
IHRvCiAgICAgICAgc3BhY2UuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHBy
ZSBpbiBzZWxmLnRleHRQcmU6CiAgICAgICAgICAgIHRleHQgPSBwcmUudHJh
bnNmb3JtKHRleHQpCiAgICAgICAgaWYgbGVuKHRleHQpIDw9IHdpZHRoOgog
ICAgICAgICAgICByZXR1cm4gW3RleHRdCiAgICAgICAgY2h1bmtzID0gc2Vs
Zi5fc3BsaXQodGV4dCkKICAgICAgICBmb3IgcHJlIGluIHNlbGYuY2h1bmtQ
cmU6CiAgICAgICAgICAgIGNodW5rcyA9IHByZS50cmFuc2Zvcm0oIGNodW5r
cyApCiAgICAgICAgbGluZXM9IHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcywg
d2lkdGgpCiAgICAgICAgZm9yIHBvc3QgaW4gc2VsZi5saW5lUG9zdDoKICAg
ICAgICAgICAgbGluZXM9IHBvc3QudHJhbnNmb3JtKCBsaW5lcyApCiAgICAg
ICAgcmV0dXJuIGxpbmVzCgogICAgZGVmIGZpbGwgKHNlbGYsIHRleHQsIHdp
ZHRoLCBpbml0aWFsX3RhYj0iIiwgc3Vic2VxdWVudF90YWI9IiIpOgogICAg
ICAgICIiImZpbGwodGV4dCA6IHN0cmluZywKICAgICAgICAgICAgICAgIHdp
ZHRoIDogaW50LAogICAgICAgICAgICAgICAgaW5pdGlhbF90YWIgOiBzdHJp
bmcgPSAiIiwKICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRfdGFiIDogc3Ry
aW5nID0gIiIpCiAgICAgICAgICAgLT4gc3RyaW5nCgogICAgICAgIFJlZm9y
bWF0IHRoZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBv
ZiBubyBtb3JlIHRoYW4KICAgICAgICAnd2lkdGgnIGNvbHVtbnMuICBUaGUg
Zmlyc3QgbGluZSBpcyBwcmVmaXhlZCB3aXRoICdpbml0aWFsX3RhYicsCiAg
ICAgICAgYW5kIHN1YnNlcXVlbnQgbGluZXMgYXJlIHByZWZpeGVkIHdpdGgg
J3N1YnNlcXVlbnRfdGFiJzsgdGhlCiAgICAgICAgbGVuZ3RocyBvZiB0aGUg
dGFiIHN0cmluZ3MgYXJlIGFjY291bnRlZCBmb3Igd2hlbiB3cmFwcGluZyBs
aW5lcwogICAgICAgIHRvIGZpdCBpbiAnd2lkdGgnIGNvbHVtbnMuCiAgICAg
ICAgIiIiCiAgICAgICAgbGluZXMgPSBzZWxmLndyYXAodGV4dCwgd2lkdGgp
CiAgICAgICAgc2VwID0gIlxuIiArIHN1YnNlcXVlbnRfdGFiCiAgICAgICAg
cmV0dXJuIGluaXRpYWxfdGFiICsgc2VwLmpvaW4obGluZXMpCgoKIyBDb252
ZW5pZW5jZSBpbnRlcmZhY2UKCl93cmFwcGVyID0gVGV4dFdyYXBwZXIoIHRl
eHRQcmU9WyBFeHBhbmRUYWJzKDgpLCBDbGVhbldoaXRlc3BhY2UoKSBdLCBs
b25nd29yZHM9QnJlYWtMb25nV29yZHMoKSApCgpkZWYgd3JhcCAodGV4dCwg
d2lkdGgpOgogICAgcmV0dXJuIF93cmFwcGVyLndyYXAodGV4dCwgd2lkdGgp
CgpkZWYgZmlsbCAodGV4dCwgd2lkdGgsIGluaXRpYWxfdGFiPSIiLCBzdWJz
ZXF1ZW50X3RhYj0iIik6CiAgICByZXR1cm4gX3dyYXBwZXIuZmlsbCh0ZXh0
LCB3aWR0aCwgaW5pdGlhbF90YWIsIHN1YnNlcXVlbnRfdGFiKQo=

--0-1592618721-1023648265=:17605
Content-Type: application/octet-stream; name="test_textwrap.py"
Content-Transfer-Encoding: base64
Content-Description: test_textwrap.py
Content-Disposition: attachment; filename="test_textwrap.py"

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgpmcm9tIHRleHR3cmFwIGltcG9ydCBU
ZXh0V3JhcHBlcgoKbnVtID0gMAoKZGVmIHRlc3QgKHJlc3VsdCwgZXhwZWN0
KToKICAgIGdsb2JhbCBudW0KICAgIG51bSArPSAxCiAgICBpZiByZXN1bHQg
PT0gZXhwZWN0OgogICAgICAgIHByaW50ICIlZDogb2siICUgbnVtCiAgICBl
bHNlOgogICAgICAgIHByaW50ICIlZDogbm90IG9rLCBleHBlY3RlZDoiICUg
bnVtCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGV4cGVjdCkpOgogICAg
ICAgICAgICBwcmludCAiICAlZDogJXIiICUgKGksIGV4cGVjdFtpXSkKICAg
ICAgICBwcmludCAiYnV0IGdvdDoiCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uo
bGVuKHJlc3VsdCkpOgogICAgICAgICAgICBwcmludCAiICAlZDogJXIiICUg
KGksIHJlc3VsdFtpXSkKCndyYXBwZXIgPSBUZXh0V3JhcHBlcigpCndyYXAg
PSB3cmFwcGVyLndyYXAKCgojIFNpbXBsZSBjYXNlOiBqdXN0IHdvcmRzLCBz
cGFjZXMsIGFuZCBhIGJpdCBvZiBwdW5jdHVhdGlvbi4KdCA9ICJIZWxsbyB0
aGVyZSwgaG93IGFyZSB5b3UgdGhpcyBmaW5lIGRheT8gIEknbSBnbGFkIHRv
IGhlYXIgaXQhIgp0ZXN0KHdyYXAodCwgMTIpLCBbIkhlbGxvIHRoZXJlLCIs
CiAgICAgICAgICAgICAgICAgICAiaG93IGFyZSB5b3UiLAogICAgICAgICAg
ICAgICAgICAgInRoaXMgZmluZSIsCiAgICAgICAgICAgICAgICAgICAiZGF5
PyAgSSdtIiwKICAgICAgICAgICAgICAgICAgICJnbGFkIHRvIGhlYXIiLAog
ICAgICAgICAgICAgICAgICAgIml0ISJdKQp0ZXN0KHdyYXAodCwgNDIpLCBb
IkhlbGxvIHRoZXJlLCBob3cgYXJlIHlvdSB0aGlzIGZpbmUgZGF5PyIsCiAg
ICAgICAgICAgICAgICAgICAiSSdtIGdsYWQgdG8gaGVhciBpdCEiXSkKdGVz
dCh3cmFwKHQsIDgwKSwgW3RdKQoKIyBXaGl0ZXNwYWNlIG11bmdpbmcgYW5k
IGVuZC1vZi1zZW50ZW5jZSBkZXRlY3Rpb24uCnQgPSAiIiJcClRoaXMgaXMg
YSBwYXJhZ3JhcGggdGhhdCBhbHJlYWR5IGhhcwpsaW5lIGJyZWFrcy4gIEJ1
dCBzb21lIG9mIGl0cyBsaW5lcyBhcmUgbXVjaCBsb25nZXIgdGhhbiB0aGUg
b3RoZXJzLApzbyBpdCBuZWVkcyB0byBiZSB3cmFwcGVkLgpTb21lIGxpbmVz
IGFyZSBcdHRhYmJlZCB0b28uCldoYXQgYSBtZXNzIQoiIiIKdGVzdCh3cmFw
KHQsIDQ1KSwgWyJUaGlzIGlzIGEgcGFyYWdyYXBoIHRoYXQgYWxyZWFkeSBo
YXMgbGluZSIsCiAgICAgICAgICAgICAgICAgICAiYnJlYWtzLiAgQnV0IHNv
bWUgb2YgaXRzIGxpbmVzIGFyZSBtdWNoIiwKICAgICAgICAgICAgICAgICAg
ICJsb25nZXIgdGhhbiB0aGUgb3RoZXJzLCBzbyBpdCBuZWVkcyB0byBiZSIs
CiAgICAgICAgICAgICAgICAgICAid3JhcHBlZC4gIFNvbWUgbGluZXMgYXJl
ICB0YWJiZWQgdG9vLiAgV2hhdCBhIiwKICAgICAgICAgICAgICAgICAgICJt
ZXNzISJdKQoKCiMgV3JhcHBpbmcgdG8gbWFrZSBzaG9ydCBsaW5lcyBsb25n
ZXIuCnQgPSAiVGhpcyBpcyBhXG5zaG9ydCBwYXJhZ3JhcGguIgp0ZXN0KHdy
YXAodCwgMjApLCBbIlRoaXMgaXMgYSBzaG9ydCIsCiAgICAgICAgICAgICAg
ICAgICAicGFyYWdyYXBoLiJdKQp0ZXN0KHdyYXAodCwgNDApLCBbIlRoaXMg
aXMgYSBzaG9ydCBwYXJhZ3JhcGguIl0pCgoKIyBUZXN0IGJyZWFraW5nIGh5
cGhlbmF0ZWQgd29yZHMuCnQgPSAidGhpcy1pcy1hLXVzZWZ1bC1mZWF0dXJl
LWZvci1yZWZvcm1hdHRpbmctcG9zdHMtZnJvbS10aW0tcGV0ZXJzJ2x5Igp0
ZXN0KHdyYXAodCwgNDApLCBbInRoaXMtaXMtYS11c2VmdWwtZmVhdHVyZS1m
b3ItIiwKICAgICAgICAgICAgICAgICAgICJyZWZvcm1hdHRpbmctcG9zdHMt
ZnJvbS10aW0tcGV0ZXJzJ2x5Il0pCnRlc3Qod3JhcCh0LCA0MSksIFsidGhp
cy1pcy1hLXVzZWZ1bC1mZWF0dXJlLWZvci0iLAogICAgICAgICAgICAgICAg
ICAgInJlZm9ybWF0dGluZy1wb3N0cy1mcm9tLXRpbS1wZXRlcnMnbHkiXSkK
dGVzdCh3cmFwKHQsIDQyKSwgWyJ0aGlzLWlzLWEtdXNlZnVsLWZlYXR1cmUt
Zm9yLXJlZm9ybWF0dGluZy0iLAogICAgICAgICAgICAgICAgICAgInBvc3Rz
LWZyb20tdGltLXBldGVycydseSJdKQoKIyBFbnN1cmUgdGhhdCB0aGUgc3Rh
bmRhcmQgX3NwbGl0KCkgbWV0aG9kIHdvcmtzIGFzIGFkdmVydGlzZWQgaW4K
IyB0aGUgY29tbWVudHMgKGRvbid0IHlvdSBoYXRlIGl0IHdoZW4gY29kZSBh
bmQgY29tbWVudHMgZGl2ZXJnZT8pLgp0ID0gIkhlbGxvIHRoZXJlIC0tIHlv
dSBnb29mLWJhbGwsIHVzZSB0aGUgLWIgb3B0aW9uISIKdGVzdCh3cmFwcGVy
Ll9zcGxpdCh0KSwKICAgICBbIkhlbGxvIiwgIiAiLCAidGhlcmUiLCAiICIs
ICItLSIsICIgIiwgInlvdSIsICIgIiwgImdvb2YtIiwKICAgICAgImJhbGws
IiwgIiAiLCAidXNlIiwgIiAiLCAidGhlIiwgIiAiLCAiLWIiLCAiICIsICAi
b3B0aW9uISJdKQoKCnRleHQgPSAnJycKRGlkIHlvdSBzYXkgInN1cGVyY2Fs
aWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXM/IgpIb3cgKmRvKiB5b3Ugc3Bl
bGwgdGhhdCBvZGQgd29yZCwgYW55d2F5cz8KJycnCiMgWFhYIHNlbnRlbmNl
IGVuZGluZyBub3QgZGV0ZWN0ZWQgYmVjYXVzZSBvZiBxdW90ZXMKdGVzdCh3
cmFwKHRleHQsIDMwKSwKICAgICBbJ0RpZCB5b3Ugc2F5ICJzdXBlcmNhbGlm
cmFnaWxpcycsCiAgICAgICd0aWNleHBpYWxpZG9jaW91cz8iIEhvdyAqZG8q
JywKICAgICAgJ3lvdSBzcGVsbCB0aGF0IG9kZCB3b3JkLCcsCiAgICAgICdh
bnl3YXlzPyddKQp0ZXN0KHdyYXAodGV4dCwgNTApLAogICAgIFsnRGlkIHlv
dSBzYXkgInN1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXM/Iics
CiAgICAgICdIb3cgKmRvKiB5b3Ugc3BlbGwgdGhhdCBvZGQgd29yZCwgYW55
d2F5cz8nXSkKCnRlc3QoVGV4dFdyYXBwZXIobG9uZ3dvcmRzPUtlZXBMb25n
V29yZHMoKSkud3JhcCh0ZXh0LCAzMCksCiAgICAgWydEaWQgeW91IHNheScs
CiAgICAgICcic3VwZXJjYWxpZnJhZ2lsaXN0aWNleHBpYWxpZG9jaW91cz8i
JywKICAgICAgJ0hvdyAqZG8qIHlvdSBzcGVsbCB0aGF0IG9kZCcsCiAgICAg
ICd3b3JkLCBhbnl3YXlzPyddKQoK

--0-1592618721-1023648265=:17605--