[Tutor] Simple line drawing in Python

Daniel Yoo dyoo@hkn.eecs.berkeley.edu
Thu, 10 May 2001 15:05:30 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--545289610-1584610050-989532330=:19917
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hiya everyone,

I've written a small wrapper around a Tkinter Canvas which lets people
play around with line drawing.  Once loaded, graphics.py makes a 400x400
canvas and provides global functions to meddle with it.

The graphics.py module is meant to be "from graphics import *"'ed; once
you the import, the following functions become available:

    clearGraphics()
    positionPen(x, y)
    drawLineTo(x, y)
    drawLine(x1, y1, x2, y2)
    drawPoint(x, y)
    clearPoint(x, y)
    graphicsText(text, x, y)
    setRGBColor(r, g, b)

and the included circle.py demonstrates how to use graphics.py's features.  
What's neat about this is that if the user accidently closes the Canvas,
calling any of the above functions should magically sprout a new Canvas
without prompting.

I'd like some suggestions on this; I want to make sure that this thing is
useful for people.

--545289610-1584610050-989532330=:19917
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="circle.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0105101505300.19917@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="circle.py"

IyMgVGhpcyBwaWVjZSBvZiBjb2RlIGdpdmVzIHVzIG9uZSB3YXkgdG8gZHJh
dyBhIGNpcmNsZSBpbiBQeXRob24uDQojIyBJdCdzIG5vdCBwYXJ0aWN1bGFy
bHkgZWZmaWNpZW50LCBidXQgaXQncyBjdXRlLg0KIyMNCiMjIGR5b29AaGtu
LmVlY3MuYmVya2VsZXkuZWR1DQojIw0KIyMgTGV0J3Mgc2F5IHRoYXQgd2Ug
d3JpdGUgYSBwcm9ncmFtIHRvIGRyYXcgcmVndWxhciBwb2x5Z29ucyBvZiBu
DQojIyBwb2ludHMuICBGb3IgZXhhbXBsZSwgZm9yIG49Mywgd2UgZ2V0IGEg
dHJpYW5nbGUuICBGb3Igbj00LCB3ZSBoYXZlDQojIyBhIHNxdWFyZSwgYW5k
IHNvIG9uLiAgV2hhdCBoYXBwZW5zIHdoZW4gbiBnZXRzIGxhcmdlciBhbmQg
bGFyZ2VyPw0KIyMNCiMjIE9uZSBpZGVhIGZvciBkcmF3aW5nIGEgY2lyY2xl
IGlzIHRvIGRyYXcgb3VyIHBvbHlnb24gd2l0aCBsYXJnZXINCiMjIGFuZCBs
YXJnZXIgbiwgdW50aWwgd2UgZ2V0IHNvbWV0aGluZyBzYXRpc2ZhY3Rvcnku
ICBUaGlzIHByb2dyYW0NCiMjIHNob3dzIGEgdmlzdWFsIGRlc2NyaXB0aW9u
cyBvZiB0aGlzIHByb2Nlc3MuICBUaGUgbWFpbiBwcm9ncmFtIGlzDQojIyB0
ZXN0LWNpcmNsZXMsIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgYSBwb2x5Z29u
IG1hZGUgb2Ygc3RyYWlnaHQNCiMjIGxpbmVzIGNhbiBjb252ZXJnZSB0byBh
IGNpcmNsZS4NCg0KZnJvbSBncmFwaGljcyBpbXBvcnQgKg0KZnJvbSB0aW1l
IGltcG9ydCBzbGVlcA0KZnJvbSBtYXRoIGltcG9ydCBwaSwgY29zLCBzaW4N
Cg0KIyMgVHJ5IHJ1bm5pbmcgdGVzdENpcmNsZXMgd2l0aCBuPTQwIGFuZCBk
ZWxheT0uNSBmb3IgYSBuaWNlIGFuaW1hdGluZw0KIyMgZWZmZWN0Lg0KZGVm
IHRlc3RDaXJjbGVzKG4sIGRlbGF5KToNCiAgICBjaXJjbGVfcmFkaXVzID0g
MTcwDQogICAgZm9yIG4gaW4gcmFuZ2UoMywgbiszKToNCiAgICAgICAgY2xl
YXJHcmFwaGljcygpDQogICAgICAgIGRyYXdDbG9zZWRQb2x5Z29uKG1ha2VO
UG9seWdvbihjaXJjbGVfcmFkaXVzLCBuKSkNCiAgICAgICAgc2xlZXAoZGVs
YXkpDQoNCiMjIEhlcmUncyB0aGUgaGVhcnQgb2YgdGhlIHByb2dyYW06IGdp
dmVuIHJhZGl1cyBhbmQgbiwgcmV0dXJucyBiYWNrDQojIyB0byB1cyBhIGxp
c3Qgb2YgcG9pbnRzIHRoYXQgc2hvdWxkIGNvbnN0cnVjdCBhIHJlZ3VsYXIg
bi1wb2x5Z29uDQojIyB3aG9zZSBwb2ludHMgYXJlIGFsbCByZWxhdGl2ZSB0
byAoMCwgMCkuDQpkZWYgbWFrZU5Qb2x5Z29uKHJhZGl1cywgbik6DQogICBk
ZWdyZWVzID0gZGl2aWRlVXAzNjBJbnRvRGVncmVlcyhuKQ0KICAgdGhldGFz
ID0gbWFwKGRlZ1RvUmFkLCBkZWdyZWVzKQ0KICAgcmV0dXJuIFtwb2xhclRv
UmVjdChyYWRpdXMsIHQpIGZvciB0IGluIHRoZXRhc10NCg0KDQojIyBEcmF3
cyBhIGNsb3NlZCBwb2x5Z29uIG9mIHBvaW50cy4gIEZvciBleGFtcGxlOg0K
IyMgICAgZHJhd0Nsb3NlZFBvbHlnb24oWygxMDAgMCksICgxMDAgMTAwKSwg
KDAgMCldKQ0KIyMgc2hvdWxkIGRyYXcgYSBzbWFsbCB0cmlhbmdsZS4NCmRl
ZiBkcmF3Q2xvc2VkUG9seWdvbihwb2ludHMpOg0KICAgIHBvaW50cyA9IHBv
aW50cyArIFtwb2ludHNbMF1dDQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHBv
aW50cykgLSAxKToNCiAgICAgICAgKCh4MSwgeTEpLCAoeDIsIHkyKSkgPSAo
cG9pbnRzW2ldLCBwb2ludHNbaSsxXSkNCiAgICAgICAgZHJhd0xpbmUoeDEs
IHkxLCB4MiwgeTIpDQoNCg0KIyMgVGFrZXMgaW4gYSByYWRpdXMgYW5kIGFu
IHRoZXRhIGluIHJhZGlhbnMsIGdpdmVzIGJhY2sgdG8gdXMgdGhlDQojIyBw
YXJ0aWN1bGFyICh4LHkpIGNvb3JkaW5hdGUgdGhhdCBtYXRjaGVzIHRoaXMg
ZGVzY3JpcHRpb24uDQpkZWYgcG9sYXJUb1JlY3QocmFkaXVzLCB0aGV0YSk6
DQogICAgcmV0dXJuIChyYWRpdXMgKiBjb3ModGhldGEpLCByYWRpdXMgKiBz
aW4odGhldGEpKQ0KDQoNCiMjIGRlZ1RvUmFkIGFuZCByYWRUb0RlZyBjb252
ZXJ0IGJldHdlZW4gcmFkaWFucyBhbmQgZGVncmVlcyBhY2NvcmRpbmcNCiMj
IHRvIHRoZSBlcXVhbGl0eTogMSBkZWdyZWUgPSAocGkvMTgwKSByYWRpYW5z
LiAgV2UnbGwgbmVlZCB0aGlzDQojIyBiZWNhdXNlIFB5dGhvbidzIHRyaWdv
bm9tZXRyaWMgZnVuY3Rpb25zIGRlYWwgZW50aXJlbHkgd2l0aA0KIyMgcmFk
aWFucywgd2hpbGUgaHVtYW5zIHVzdWFsbHkgYXJlIG1vcmUgY29tZm9ydGFi
bGUgd2l0aCBkZWdyZWVzLg0KZGVmIGRlZ1RvUmFkKGRlZ3JlZXMpOiByZXR1
cm4gZGVncmVlcyAqIHBpIC8gMTgwDQpkZWYgcmFkVG9EZWcocmFkaWFucyk6
IHJldHVybiAoMTgwICogcmFkaWFucykgLyBwaQ0KDQoNCiMjIEdpdmVuIG4s
IHJldHVybnMgYSBsaXN0IG9mIGRlZ3JlZXMgdGhhdCBlcXVhbGx5IGRpdmlk
ZSAzNjAgZGVncmVlcy4NCiMjIEZvciBleGFtcGxlLCBhIHRyaWFuZ2xlIGNl
bnRlcmVkIGF0IHRoZSBvcmlnaW4gaGFzIHZlcnRpY2VzIG9yaWVudGVkDQoj
IyBhdCAwLCAxMjAsIGFuZCAyNDAgYW5nbGVzLg0KZGVmIGRpdmlkZVVwMzYw
SW50b0RlZ3JlZXMobik6DQogICAgYW5nbGUgPSAzNjAuMCAvIG4NCiAgICBy
ZXR1cm4gW2FuZ2xlICogeCBmb3IgeCBpbiByYW5nZShuKV0NCg0KDQo=
--545289610-1584610050-989532330=:19917
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="graphics.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0105101505301.19917@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="graphics.py"

IiIiVGhpcyBpcyBhIHNtYWxsIGdyYXBoaWNzIG1vZHVsZSB0aGF0IG1pbWlj
cyBzb21lIHRoZSBmdW5jdGlvbmFsaXR5DQpvZiB3aGF0IHRoZSBDUzMgc3R1
ZGVudHMgdXNlIHRvIGRvIGZyYWN0YWwgZ3JhcGhpY3MuICBJdCdzIHNpbXBs
aWZpZWQNCmJlY2F1c2UgdGhlIGNvb3JkaW5hdGVzIGFyZSBjZW50ZXJlZCBh
dCAoMCwgMCkgaW4gdGhlIG1pZGRsZSBvZiB0aGUNCnNjcmVlbiBhbmQgaXQg
dXNlcyBmYW1pbGlhciBjb29yZGluYXRlIG9yaWVudGF0aW9uLiIiIg0KDQoj
IEknbSB0cnlpbmcgdG8gbWFrZSB0aGlzIGltcG9ydCBzYWZlLg0KDQppbXBv
cnQgVGtpbnRlcg0KaW1wb3J0IHN0cmluZw0KDQpjbGFzcyBHcmFwaGljczoN
CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6DQogICAgICAgIHNlbGYu
X3Jvb3QgPSByb290DQogICAgICAgIHNlbGYuX3hwb3MsIHNlbGYuX3lwb3Mg
PSAwLCAwDQogICAgICAgIHNlbGYuX3dpZHRoID0gNDAwDQogICAgICAgIHNl
bGYuX2hlaWdodCA9IDQwMA0KICAgICAgICBzZWxmLl9yZ2IgPSAnIzAwMDAw
MCcgICMgRGVmYXVsdCBzaG91bGQgYmUgYmxhY2sNCiAgICAgICAgc2VsZi5f
Y2FudmFzID0gVGtpbnRlci5DYW52YXMoc2VsZi5fcm9vdCwgd2lkdGg9c2Vs
Zi5fd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGhlaWdodD1zZWxmLl9oZWlnaHQsIGJnPSd3aGl0ZScpDQogICAgICAg
IHNlbGYuX2NhbnZhcy5wYWNrKCkNCiAgICAgICAgc2VsZi5jbGVhckdyYXBo
aWNzKCkNCg0KICAgIGRlZiBjbGVhckdyYXBoaWNzKHNlbGYpOg0KICAgICAg
ICAiIiJDbGVhciB0aGUgc2NyZWVuIG9mIGFsbCBkcmF3aW5ncy4iIiINCiAg
ICAgICAgZm9yIGlkIGluIHNlbGYuX2NhbnZhcy5maW5kX2FsbCgpOg0KICAg
ICAgICAgICAgc2VsZi5fY2FudmFzLmRlbGV0ZShpZCkNCg0KICAgIGRlZiBw
b3NpdGlvblBlbihzZWxmLCB4LCB5KToNCiAgICAgICAgIiIiTW92ZSB0aGUg
cGVuIHRvIHRoZSBzcGVjaWZpYyBwb3NpdGlvbi4iIiINCiAgICAgICAgc2Vs
Zi5feHBvcywgc2VsZi5feXBvcyA9IHgsIHkNCg0KICAgIGRlZiBkcmF3TGlu
ZVRvKHNlbGYsIHgsIHkpOg0KICAgICAgICAiIiJEcmF3IHRoZSBsaW5lIGZy
b20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gKHgsIHkpLg0KICAgICAgICBB
cyBhIHNpZGUgZWZmZWN0LCB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVz
ICh4LCB5KS4iIiINCiAgICAgICAgeDEsIHkxID0gc2VsZi5jb252ZXJ0Q29v
cmQoc2VsZi5feHBvcywgc2VsZi5feXBvcykNCiAgICAgICAgeDIsIHkyID0g
c2VsZi5jb252ZXJ0Q29vcmQoeCwgeSkNCiAgICAgICAgc2VsZi5fY2FudmFz
LmNyZWF0ZV9saW5lKHgxLCB5MSwgeDIsIHkyLCBmaWxsPXNlbGYuX3JnYikN
CiAgICAgICAgc2VsZi5fY2FudmFzLnVwZGF0ZSgpDQogICAgICAgIHNlbGYu
cG9zaXRpb25QZW4oeCwgeSkNCg0KICAgIGRlZiBkcmF3TGluZShzZWxmLCB4
MSwgeTEsIHgyLCB5Mik6DQogICAgICAgICIiIkRyYXcgYSBsaW5lIGZyb20g
KHgxLCB5MSkgdG8gKHgyLCB5MikuICBBcyBhIHNpZGUgZWZmZWN0LA0KICAg
ICAgICB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVzICh4MiwgeTIpLiIi
Ig0KICAgICAgICBzZWxmLnBvc2l0aW9uUGVuKHgxLCB5MSkNCiAgICAgICAg
c2VsZi5kcmF3TGluZVRvKHgyLCB5MikNCg0KICAgIGRlZiBkcmF3UG9pbnQo
c2VsZiwgeCwgeSk6DQogICAgICAgICIiIkRyYXcgYSBzaW5nbGUgcG9pbnQg
YXQgKHgsIHkpLiAgQXMgYSBzaWRlIGVmZmVjdCwNCiAgICAgICAgdGhlIGN1
cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQogICAgICAgIHNl
bGYucG9zaXRpb25QZW4oeDEsIHkxKQ0KICAgICAgICB4MSwgeTEgPSBzZWxm
LmNvbnZlcnRDb29yZCh4LCB5KQ0KICAgICAgICBzZWxmLl9jYW52YXMuY3Jl
YXRlX292YWwoeDEsIHkxLCB4MSwgeTEsIG91dGxpbmU9c2VsZi5fcmdiKQ0K
ICAgICAgICBzZWxmLl9jYW52YXMudXBkYXRlKCkNCg0KICAgIGRlZiBjbGVh
clBvaW50KHNlbGYsIHgsIHkpOg0KICAgICAgICAiIiJDbGVhcnMgYSBzaW5n
bGUgcG9pbnQgYXQgKHgsIHkpLiAgQXMgYSBzaWRlIGVmZmVjdCwNCiAgICAg
ICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQog
ICAgICAgIHNlbGYucG9zaXRpb25QZW4oeDEsIHkxKQ0KICAgICAgICBiZ2Nv
bG9yID0gc2VsZi5fY2FudmFzLmNnZXQoJ2JnJykNCiAgICAgICAgeDEsIHkx
ID0gc2VsZi5jb252ZXJ0Q29vcmQoeCwgeSkNCiAgICAgICAgc2VsZi5fY2Fu
dmFzLmNyZWF0ZV9vdmFsKHgxLCB5MSwgeDEsIHkxLCBvdXRsaW5lPWJnY29s
b3IpDQogICAgICAgIHNlbGYuX2NhbnZhcy51cGRhdGUoKQ0KICAgIA0KICAg
IGRlZiBncmFwaGljc1RleHQoc2VsZiwgbXNnLCB4LCB5KToNCiAgICAgICAg
IiIiV3JpdGVzIGEgbGluZSBvZiB0ZXh0LCBsZWZ0IGp1c3RpZmVkIGZyb20g
KHgsIHkpLiIiIg0KICAgICAgICB4MSwgeTEgPSBzZWxmLmNvbnZlcnRDb29y
ZCh4LCB5KQ0KICAgICAgICBzZWxmLl9jYW52YXMuY3JlYXRlX3RleHQoeDEs
IHkxLCB0ZXh0PW1zZywgZmlsbD1zZWxmLl9yZ2IpDQogICAgICAgIHNlbGYu
X2NhbnZhcy51cGRhdGUoKQ0KICAgIA0KICAgIGRlZiBzZXRSR0JDb2xvcihz
ZWxmLCByLCBnLCBiKToNCiAgICAgICAgIiIiQ2hhbmdlcyB0aGUgY3VycmVu
dCBjb2xvciB0byAociwgZywgYiksIHdoZXJlDQogICAgICAgIGVhY2ggY29t
cG9uZW50IGlzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuIiIiDQogICAg
ICAgIHNlbGYuX3JnYiA9ICcjJTAyWCUwMlglMDJYJyAlIChyLCBnLCBiKQ0K
DQogICAgZGVmIGNvbnZlcnRDb29yZChzZWxmLCB4LCB5KToNCiAgICAgICAg
bmV3eCA9IHNlbGYuX3dpZHRoLzIgKyB4DQogICAgICAgIG5ld3kgPSBzZWxm
Ll9oZWlnaHQvMiAtIHkNCiAgICAgICAgcmV0dXJuIG5ld3gsIG5ld3kNCg0K
DQoNCiIiIkhlcmUgYXJlIHNvbWUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdmFy
aWFibGVzIHRvIG1ha2UgdGhpbmdzIGVhc2llcg0KZm9yIGEgYmVnaW5uZXIg
dW5hY2N1c3RvbWVkIHRvIE9PUC4gIE5vdGU6IHRoaXMgaXMgdWdseSBiZWNh
dXNlIHdlDQpuZWVkIGFuIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uIGhl
cmU6IHdlIHdhbnQgdG8gbWFrZSAiZnJvbQ0KZ3JhcGhpY3MgaW1wb3J0ICoi
IHdvcmssIGJ1dCB0aGlzIHRha2VzIHNvbWUgc2lsbGluZXNzIHRvIGdldCBp
dA0Kd29ya2luZyB3ZWxsLiAgTWlzZXJ5IG9mIHRoZSBmZXcgZm9yIHRoZSBq
b3kgb2YgdGhlIG1hbnkuICAqZ3JpbioiIiINCg0KDQoiIiJPdXIgZ2xvYmFs
IGdyYXBoaWNzIG9iamVjdC4iIiINCl9fZ3JhcGhpY3MgPSBOb25lDQoNCg0K
IiIiRm9yIGVhY2ggb2YgdGhlIGludGVyZXN0aW5nIG1lbWJlciBmdW5jdGlv
bnMgd2l0aGluIGEgR3JhcGhpY3MNCm9iamVjdCwgd2UnbGwgbWFrZSBhIGNv
cnJlc3BvbmRpbmcgZ2xvYmFsIGZ1bmN0aW9uIHRoYXQgd29ya3Mgb24gYQ0K
ZGVmYXVsdCB0b3BsZXZlbCB3aW5kb3cuICBUaGUgdHJpY2t5IHBhcnQgaXMg
dG8gYWNjb3VudCBmb3Igd2hhdA0KaGFwcGVucyB3aGVuIHRoZSB1c2VyIGRl
c3Ryb3lzIHRoZSB3aW5kb3c6IHdlIG5lZWQgdG8gZHluYW1pY2FsbHkNCnJl
Y3JlYXRlIGFuZCBob29rIHRoZSBmdW5jdGlvbnMgYmFjayB1cCB0byBhIG5l
dyBpbnN0YW5jZSBvZg0KR3JhcGhpY3MuICBUaGlzIGNvZGUgaXMgc3VidGxl
IGFuZCBuZWVkcyBzb21lIGV4cGxhbmF0aW9uOg0KDQpXZSBleHBvc2UgdG8g
dGhlIHVzZXIgdGhlIGxpc3Qgb2YgX193cmFwcGVkRnVuY3Rpb25zLiAgVW5k
ZXJuZWF0aCwNCnRob3NlIGZ1bmN0aW9uIGFyZSBhY3R1YWxseSB3cmFwcGVy
cyBhcm91bmQgdGhlIGFjdHVhbA0KaW1wbGVtZW50YXRpb25zLiAgRm9yIGV4
YW1wbGUsIHBvc2l0aW9uUGVuKCkgaXMganVzdCBhIHdyYXBwZXIgYXJvdW5k
DQpfX3Bvc2l0aW9uUGVuKCkuDQoNCldoZW5ldmVyIG91ciBHcmFwaGljcyBv
YmplY3QgaXMgZGVzdHJveWVkLCB3ZSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0
aGUNCmltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucyBhdCB0aGUgbWVtYmVycyBv
ZiBfX2dyYXBoaWNzLiAgVGhpcyBpcyB3aGF0DQpfX3Jlc2V0R3JhcGhpY3Mo
KSBkb2VzLiIiIg0KDQoNCg0KX193cmFwcGVkRnVuY3Rpb25zID0gc3RyaW5n
LnNwbGl0KCIiInBvc2l0aW9uUGVuIGRyYXdMaW5lVG8gZHJhd0xpbmUNCmRy
YXdQb2ludCBjbGVhclBvaW50IGdyYXBoaWNzVGV4dCBzZXRSR0JDb2xvciIi
IikNCg0KDQoiIiJUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYWxsIHRoZSBuaWNl
IHdyYXBwZXIgZnVuY3Rpb25zLiIiIg0KX193cmFwcGVyVGVtcGxhdGUgPSAi
IiINCmRlZiAlKGZ1bmN0aW9uX25hbWUpcygqYXJncyk6DQogICAgdHJ5OiBh
cHBseShfXyUoZnVuY3Rpb25fbmFtZSlzLCBhcmdzKQ0KICAgIGV4Y2VwdCBU
a2ludGVyLlRjbEVycm9yOg0KICAgICAgICBjbGVhckdyYXBoaWNzKCkNCiAg
ICAgICAgYXBwbHkoX18lKGZ1bmN0aW9uX25hbWUpcywgYXJncykNCl9fJShm
dW5jdGlvbl9uYW1lKXMgPSBOb25lDQoiIiINCmZvciBmdW5jdGlvbl9uYW1l
IGluIF9fd3JhcHBlZEZ1bmN0aW9uczoNCiAgICBleGVjIF9fd3JhcHBlclRl
bXBsYXRlICUgeydmdW5jdGlvbl9uYW1lJyA6IGZ1bmN0aW9uX25hbWV9DQoN
Cg0KZGVmIGNsZWFyR3JhcGhpY3MoKToNCiAgICBfX3Jlc2V0R3JhcGhpY3Mo
KQ0KICAgIF9fcmVzZXRGdW5jdGlvbnMoKQ0KICAgIF9fZ3JhcGhpY3MuY2xl
YXJHcmFwaGljcygpDQoNCg0KZGVmIF9fcmVzZXRHcmFwaGljcygpOg0KICAg
IGdsb2JhbCBfX2dyYXBoaWNzDQogICAgaWYgVGtpbnRlci5fZGVmYXVsdF9y
b290ID09IE5vbmU6DQogICAgICAgIFRraW50ZXIuX2RlZmF1bHRfcm9vdCA9
IFRraW50ZXIuVGsoKQ0KICAgICAgICBfX2dyYXBoaWNzID0gTm9uZQ0KICAg
IGlmIF9fZ3JhcGhpY3MgPT0gTm9uZToNCiAgICAgICAgX19ncmFwaGljcyA9
IEdyYXBoaWNzKFRraW50ZXIuX2RlZmF1bHRfcm9vdCkNCg0KDQpkZWYgX19y
ZXNldEZ1bmN0aW9ucygpOg0KICAgIHRlbXBsYXRlID0gJycnDQpnbG9iYWwg
X18lKGZ1bmN0aW9uX25hbWUpcw0KX18lKGZ1bmN0aW9uX25hbWUpcyA9IF9f
Z3JhcGhpY3MuJShmdW5jdGlvbl9uYW1lKXMNCicnJw0KICAgIGZvciBmdW5j
dGlvbl9uYW1lIGluIF9fd3JhcHBlZEZ1bmN0aW9uczoNCiAgICAgICAgZXhl
YyB0ZW1wbGF0ZSAlIHsnZnVuY3Rpb25fbmFtZScgOiBmdW5jdGlvbl9uYW1l
fQ0KDQoNCiMjIExldCdzIHN0YXJ0IHRoZSBtYWdpYy4NCmNsZWFyR3JhcGhp
Y3MoKQ0KDQo=
--545289610-1584610050-989532330=:19917--