[reportlab-users] Re: Plotting with logarithmic axes

Berthold Höllmann reportlab-users@reportlab.com
Thu, 24 Jul 2003 15:57:15 +0200


--=-=-=
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit

hoel@gl-group.com (Berthold Höllmann) writes:

> "Andy Robinson" <andy@reportlab.com> writes:
>
...
>
> OK, it involved a little more than just the scale function. I'll
> attach my first version.

I hope this stuff is usefull for somebody else. I worked a little more
on the code, deleted surplus stuff and added minor tics for the
logarithmic axes. Would they be accepted for linear axes also? If yes,
I will try to provide a patch. I'll attach a new version of my
logarithmic axes for LinePlot. It comes with some examples.

Regards
Berthold
-- 
Dipl.-Ing. Berthold Höllmann   __   Address:
hoel@GL-Group.com           G /  \ L Germanischer Lloyd
phone: +49-40-36149-7374    -+----+- Vorsetzen 32/35    P.O.Box 111606
fax  : +49-40-36149-7320      \__/   D-20459 Hamburg    D-20416 Hamburg

--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=logaxis.py
Content-Transfer-Encoding: base64

IyEgL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogaXNvLWxhdGluLTEgLSotCgojIENvcHly
aWdodCAoQykgMjAwMyBieSBHZXJtYW5pc2NoZXIgTGxveWQKCiMgJEhlYWRlciQKIwojIFRpbWUt
c3RhbXA6IDwyMDAzLTA3LTI0IDE1OjU0OjA2IGhvZWw+CiMKIyA9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTW9k
dWxlICAgIGxvZ2F4aXMKIyBUYXNrICAgICAgUHJvdmlkZXMgbG9nYXJpdGhtaWMgYXhlcyBmb3Ig
UmVwb3J0bGFiIExpbmVQbG90IGNsYXNzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEF1dGhvciAgICBCZXJ0
aG9sZCBI9mxsbWFubgojIFByb2plY3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU3RhdHVzICAgICRTdGF0
ZSQKIyBEYXRlICAgICAgJERhdGUkCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCgoiIiIKUHJvdmlkZXMgbG9n
YXJpdGhtaWMgYXhlcyBmb3IgUmVwb3J0bGFiIExpbmVQbG90IGNsYXNzLgoKVGhlIGNvZGUgaGVy
ZWluIGlzIG1vc3RseSBzdG9sZW4gZnJvbSAiYXhlcy5weSIgYW5kIG1vZGlmaWVkIGZvcgpsb2dh
cnRobWljIGF4ZXMuCiIiIgoKIyBDVlNJRDogJElkJApfX2F1dGhvcl9fICAgICAgID0gKCIyMDAz
IEdlcm1hbmlzY2hlciBMbG95ZCAoYXV0aG9yOiAkQXV0aG9yJCkgIiArCiAgICAgICAgICAgICAg
ICAgICAgImhvZWxAZ2VybWFubGxveWQub3JnIikKX19kYXRlX18gICAgICAgICA9ICIkRGF0ZSQi
Cl9fdmVyc2lvbl9fICAgICAgPSAiJFJldmlzaW9uJCJbMTA6LTFdCl9fcGFja2FnZV9pbmZvX18g
PSAiIiIgIiIiCgppbXBvcnQgbWF0aAoKZnJvbSB0eXBlcyBpbXBvcnQgU3RyaW5nVHlwZQpmcm9t
IHJlcG9ydGxhYi5saWIgaW1wb3J0IGNvbG9ycwpmcm9tIHJlcG9ydGxhYi5saWIudmFsaWRhdG9y
cyBpbXBvcnQgaXNJbnQsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIE9uZU9mLCBcCiAgICAgaXNOdW1i
ZXJPck5vbmUsIGlzTGlzdE9mTnVtYmVyc09yTm9uZSwgaXNDb2xvck9yTm9uZQpmcm9tIHJlcG9y
dGxhYi5ncmFwaGljcy5zaGFwZXMgaW1wb3J0IERyYXdpbmcsIExpbmUsIEdyb3VwLCBTVEFURV9E
RUZBVUxUUwpmcm9tIHJlcG9ydGxhYi5ncmFwaGljcy5jaGFydHMubGluZXBsb3RzIGltcG9ydCBM
aW5lUGxvdApmcm9tIHJlcG9ydGxhYi5ncmFwaGljcy5jaGFydHMuYXhlcyBpbXBvcnQgVmFsdWVB
eGlzLCBYVmFsdWVBeGlzLCBZVmFsdWVBeGlzCmZyb20gcmVwb3J0bGFiLmdyYXBoaWNzIGltcG9y
dCByZW5kZXJQREYKZnJvbSByZXBvcnRsYWIubGliLmF0dHJtYXAgaW1wb3J0ICoKZnJvbSByZXBv
cnRsYWIuZ3JhcGhpY3MuY2hhcnRzLnV0aWxzIGltcG9ydCBuZXh0Um91bmROdW1iZXIKCmNsYXNz
IExvZ1ZhbHVlQXhpcyhWYWx1ZUF4aXMpOgogICAgX2F0dHJNYXAgPSBBdHRyTWFwKAogICAgICAg
IEJBU0U9VmFsdWVBeGlzLAogICAgICAgIHZpc2libGVNVGlja3MgPSBBdHRyTWFwVmFsdWUoaXNC
b29sZWFuLCBkZXNjPSdEaXNwbGF5IGF4aXMgbWlub3IgdGlja3MsIGlmIHRydWUuJyksCiAgICAg
ICAgdmlzaWJsZU1HcmlkID0gQXR0ck1hcFZhbHVlKGlzQm9vbGVhbiwgZGVzYz0nRGlzcGxheSBh
eGlzIG1pbm9yIGdyaWQsIGlmIHRydWUuJyksCiAgICAgICAgdmFsdWVNU3RlcHMgPSBBdHRyTWFw
VmFsdWUoaXNMaXN0T2ZOdW1iZXJzT3JOb25lLCBkZXNjPSdMaXN0IG9mIHN0ZXAgc2l6ZXMgdXNl
ZCBiZXR3ZWVuIG1pbm9yIHRpY2tzLicpLAogICAgICAgIG1TZWNOdW0gPSBBdHRyTWFwVmFsdWUo
aXNJbnQsIGRlc2M9J051bWJlciBvZiBzZWN0aW9ucyBidWlsZCBieSBtaW5vciB0aWNzJyksCiAg
ICAgICAgbWdyaWRTdHJva2VXaWR0aCA9IEF0dHJNYXBWYWx1ZShpc051bWJlciwgZGVzYz0nV2lk
dGggb2YgZ3JpZCBtaW5vciBsaW5lcy4nKSwKICAgICAgICBtZ3JpZFN0cm9rZUNvbG9yID0gQXR0
ck1hcFZhbHVlKGlzQ29sb3JPck5vbmUsIGRlc2M9J0NvbG9yIG9mIG1pbm9yIGdyaWQgbGluZXMu
JyksCiAgICAgICAgbWdyaWRTdHJva2VEYXNoQXJyYXkgPSBBdHRyTWFwVmFsdWUoaXNMaXN0T2ZO
dW1iZXJzT3JOb25lLCBkZXNjPSdEYXNoIGFycmF5IHVzZWQgZm9yIG1pbm9yIGdyaWQgbGluZXMu
JyksCiAgICAgICAgKQogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIFZhbHVlQXhpcy5f
X2luaXRfXyhzZWxmKQogICAgICAgIHNlbGYubGFiZWxUZXh0Rm9ybWF0ID0gIiUuMGUiCiAgICAg
ICAgc2VsZi52aXNpYmxlTVRpY2tzID0gMAogICAgICAgIHNlbGYudmlzaWJsZU1HcmlkID0gMAog
ICAgICAgIHNlbGYubVNlY051bSA9IDEwCiAgICAgICAgc2VsZi5tZ3JpZFN0cm9rZUNvbG9yID0g
U1RBVEVfREVGQVVMVFNbJ3N0cm9rZUNvbG9yJ10KICAgICAgICBzZWxmLm1ncmlkU3Ryb2tlRGFz
aEFycmF5ID0gU1RBVEVfREVGQVVMVFNbJ3N0cm9rZURhc2hBcnJheSddCgogICAgICAgIHNlbGYu
bWdyaWRTdHJva2VXaWR0aCA9IDAuMTUKCiAgICBkZWYgX2NhbGNTY2FsZUZhY3RvcihzZWxmKToK
ICAgICAgICAiIiJDYWxjdWxhdGUgdGhlIGF4aXMnIHNjYWxlIGZhY3Rvci4KICAgICAgICBUaGlz
IHNob3VsZCBiZSBjYWxsZWQgb25seSAqYWZ0ZXIqIHRoZSBheGlzJyByYW5nZSBpcyBzZXQuCiAg
ICAgICAgUmV0dXJucyBhIG51bWJlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9zY2FsZUZh
Y3RvciA9IHNlbGYuX2xlbmd0aCAvIGZsb2F0KAogICAgICAgICAgICBtYXRoLmxvZzEwKHNlbGYu
X3ZhbHVlTWF4KSAtIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pKQogICAgICAgIHJldHVybiBz
ZWxmLl9zY2FsZUZhY3RvcgoKICAgIGRlZiBfY2FsY1RpY2tQb3NpdGlvbnMoc2VsZik6CiAgICAg
ICAgc2VsZi5fY2FsY1ZhbHVlU3RlcCgpCiAgICAgICAgUCA9IFtdCiAgICAgICAgdmFsdWVNaW4g
PSBtYXRoLmxvZzEwKHNlbGYuX3ZhbHVlTWluKQogICAgICAgIHZhbHVlTWF4ID0gbWF0aC5sb2cx
MChzZWxmLl92YWx1ZU1heCkKICAgICAgICB2YWx1ZVN0ZXAgPSByb3VuZCh2YWx1ZU1pbikKICAg
ICAgICBQLmFwcGVuZCgxMCoqdmFsdWVTdGVwKQogICAgICAgIHZhbHVlU3RlcCArPSAxCiAgICAg
ICAgd2hpbGUgdmFsdWVTdGVwIDw9IHZhbHVlTWF4OgogICAgICAgICAgICBQLmFwcGVuZCgxMCoq
dmFsdWVTdGVwKQogICAgICAgICAgICB2YWx1ZVN0ZXAgKz0gMQogICAgICAgIHJldHVybiBQCgog
ICAgZGVmIF9jYWxjTVRpY2tQb3NpdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5fY2FsY1ZhbHVl
U3RlcCgpCiAgICAgICAgUCA9IFtdCiAgICAgICAgdmFsdWVNaW4gPSBtYXRoLmxvZzEwKHNlbGYu
X3ZhbHVlTWluKS0xCiAgICAgICAgdmFsdWVNYXggPSBtYXRoLmxvZzEwKHNlbGYuX3ZhbHVlTWF4
KSsxCiAgICAgICAgdmFsdWVTdGVwID0gcm91bmQodmFsdWVNaW4pLTEKICAgICAgICBmYWN0ID0g
MTAuIC8gZmxvYXQoc2VsZi5tU2VjTnVtKQogICAgICAgIHN0YXJ0ID0gMQogICAgICAgIGlmIHNl
bGYubVNlY051bSA9PSAxMDogc3RhcnQgPSAyCiAgICAgICAgd2hpbGUgdmFsdWVTdGVwIDwgdmFs
dWVNYXg6CiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0LHNlbGYubVNlY051bSk6CiAg
ICAgICAgICAgICAgICB2YWwgPSBmYWN0KmkqKDEwKip2YWx1ZVN0ZXApCiAgICAgICAgICAgICAg
ICBpZiB2YWwgPiBzZWxmLl92YWx1ZU1pbiBhbmQgdmFsIDwgc2VsZi5fdmFsdWVNYXg6CiAgICAg
ICAgICAgICAgICAgICAgUC5hcHBlbmQodmFsKQogICAgICAgICAgICB2YWx1ZVN0ZXAgKz0gMQog
ICAgICAgIHJldHVybiBQCgogICAgZGVmIF9jYWxjVGlja21hcmtQb3NpdGlvbnMoc2VsZik6CiAg
ICAgICAgIiIiQ2FsY3VsYXRlIGEgbGlzdCBvZiB0aWNrIHBvc2l0aW9ucyBvbiB0aGUgYXhpcy4g
IFJldHVybnMgYSBsaXN0IG9mIG51bWJlcnMuIiIiCiAgICAgICAgc2VsZi5fdGlja1ZhbHVlcyA9
IGdldGF0dHIoc2VsZiwndmFsdWVTdGVwcycsTm9uZSkKICAgICAgICBzZWxmLl9tdGlja1ZhbHVl
cyA9IGdldGF0dHIoc2VsZiwndmFsdWVNU3RlcHMnLE5vbmUpCiAgICAgICAgaWYgKHNlbGYuX3Rp
Y2tWYWx1ZXMgYW5kIHNlbGYubXRpY2tWYWx1ZXMpOgogICAgICAgICAgICByZXR1cm4gKHNlbGYu
X3RpY2tWYWx1ZXMsIHNlbGYuX210aWNrVmFsdWVzKQogICAgICAgIGlmIG5vdCBzZWxmLl90aWNr
VmFsdWVzOgogICAgICAgICAgICBzZWxmLl90aWNrVmFsdWVzID0gc2VsZi5fY2FsY1RpY2tQb3Np
dGlvbnMoKQogICAgICAgIGlmIG5vdCBzZWxmLl9tdGlja1ZhbHVlczoKICAgICAgICAgICAgc2Vs
Zi5fbXRpY2tWYWx1ZXMgPSBzZWxmLl9jYWxjTVRpY2tQb3NpdGlvbnMoKQogICAgICAgIHNlbGYu
X2FkanVzdEF4aXNUaWNrcygpCiAgICAgICAgcmV0dXJuIChzZWxmLl90aWNrVmFsdWVzLCBzZWxm
Ll9tdGlja1ZhbHVlcykKCiAgICBkZWYgX21ha2VNTGluZXMoc2VsZixnLHN0YXJ0LGVuZCxzdHJv
a2VDb2xvcixzdHJva2VXaWR0aCxzdHJva2VEYXNoQXJyYXkpOgogICAgICAgIGkgPSAwCiAgICAg
ICAgZm9yIHRpY2tWYWx1ZSBpbiBzZWxmLl9tdGlja1ZhbHVlczoKICAgICAgICAgICAgICAgIHYg
PSBzZWxmLnNjYWxlKHRpY2tWYWx1ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9kYXRh
SW5kZXg6CiAgICAgICAgICAgICAgICAgICAgTCA9IExpbmUodiwgc2VsZi5feSArIHN0YXJ0LCB2
LCBzZWxmLl95ICsgZW5kKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAg
ICBMID0gTGluZShzZWxmLl94ICsgc3RhcnQsIHYsIHNlbGYuX3ggKyBlbmQsIHYpCiAgICAgICAg
ICAgICAgICBMLnN0cm9rZUNvbG9yID0gc3Ryb2tlQ29sb3IKICAgICAgICAgICAgICAgIEwuc3Ry
b2tlV2lkdGggPSBzdHJva2VXaWR0aAogICAgICAgICAgICAgICAgTC5zdHJva2VEYXNoQXJyYXkg
PSBzdHJva2VEYXNoQXJyYXkKICAgICAgICAgICAgICAgIGcuYWRkKEwpCgogICAgZGVmIG1ha2VH
cmlkKHNlbGYsZyxkaW09Tm9uZSk6CiAgICAgICAgJycndGhpcyBpcyBvbmx5IGNhbGxlZCBieSBh
IGNvbnRhaW5lciBvYmplY3QnJycKICAgICAgICBzID0gc2VsZi5ncmlkU3RhcnQKICAgICAgICBl
ID0gc2VsZi5ncmlkRW5kCgogICAgICAgIGlmIGRpbToKICAgICAgICAgICAgcyA9IHMgaXMgTm9u
ZSBhbmQgZGltWzBdCiAgICAgICAgICAgIGUgPSBlIGlzIE5vbmUgYW5kIGRpbVswXStkaW1bMV0K
ICAgICAgICBjID0gc2VsZi5ncmlkU3Ryb2tlQ29sb3IKICAgICAgICBpZiBzZWxmLnZpc2libGVH
cmlkIGFuZCAocyBvciBlKSBhbmQgYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5f
ZGF0YUluZGV4OiBvZmZzID0gc2VsZi5feAogICAgICAgICAgICBlbHNlOiBvZmZzID0gc2VsZi5f
eQogICAgICAgICAgICBzZWxmLl9tYWtlTGluZXMoZyxzLW9mZnMsZS1vZmZzLGMsc2VsZi5ncmlk
U3Ryb2tlV2lkdGgsc2VsZi5ncmlkU3Ryb2tlRGFzaEFycmF5KQogICAgICAgIHMgPSBzZWxmLmdy
aWRTdGFydAogICAgICAgIGUgPSBzZWxmLmdyaWRFbmQKICAgICAgICBpZiBkaW06CiAgICAgICAg
ICAgIHMgPSBzIGlzIE5vbmUgYW5kIGRpbVswXQogICAgICAgICAgICBlID0gZSBpcyBOb25lIGFu
ZCBkaW1bMF0rZGltWzFdCiAgICAgICAgYyA9IHNlbGYubWdyaWRTdHJva2VDb2xvcgogICAgICAg
IGlmIHNlbGYudmlzaWJsZU1HcmlkIGFuZCAocyBvciBlKSBhbmQgYyBpcyBub3QgTm9uZToKICAg
ICAgICAgICAgaWYgc2VsZi5fZGF0YUluZGV4OiBvZmZzID0gc2VsZi5feAogICAgICAgICAgICBl
bHNlOiBvZmZzID0gc2VsZi5feQogICAgICAgICAgICBzZWxmLl9tYWtlTUxpbmVzKGcscy1vZmZz
LGUtb2ZmcyxjLHNlbGYubWdyaWRTdHJva2VXaWR0aCxzZWxmLm1ncmlkU3Ryb2tlRGFzaEFycmF5
KQoKY2xhc3MgTG9nWFZhbHVlQXhpcyhMb2dWYWx1ZUF4aXMsWFZhbHVlQXhpcyk6CiAgICBfYXR0
ck1hcCA9IEF0dHJNYXAoCiAgICAgICAgQkFTRT1Mb2dWYWx1ZUF4aXMsCiAgICAgICAgdGlja1Vw
ID0gQXR0ck1hcFZhbHVlKGlzTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
ZXNjPSdUaWNrIGxlbmd0aCB1cCB0aGUgYXhpcy4nKSwKICAgICAgICB0aWNrRG93biA9IEF0dHJN
YXBWYWx1ZShpc051bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjPSdU
aWNrIGxlbmd0aCBkb3duIHRoZSBheGlzLicpLAogICAgICAgIG10aWNrVXAgPSBBdHRyTWFwVmFs
dWUoaXNOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M9J01pbm9yIHRp
Y2sgbGVuZ3RoIHVwIHRoZSBheGlzLicpLAogICAgICAgIG10aWNrRG93biA9IEF0dHJNYXBWYWx1
ZShpc051bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjPSdNaW5vciB0
aWNrIGxlbmd0aCBkb3duIHRoZSBheGlzLicpLAogICAgICAgIGpvaW5BeGlzID0gQXR0ck1hcFZh
bHVlKE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYz0nSm9pbiBib3Ro
IGF4ZXMgaWYgdHJ1ZS4nKSwKICAgICAgICBqb2luQXhpc01vZGUgPSBBdHRyTWFwVmFsdWUoT25l
T2YoJ2JvdHRvbScsICd0b3AnLCAndmFsdWUnLCAncG9pbnRzJywKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRlc2M9Ik1vZGUgdXNlZCBmb3IgY29ubmVjdGluZyBheGlzICgnYm90dG9tJywg
J3RvcCcsICd2YWx1ZScsICdwb2ludHMnLCBOb25lKS4iKSwKICAgICAgICBqb2luQXhpc1BvcyA9
IEF0dHJNYXBWYWx1ZShpc051bWJlck9yTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkZXNjPSdQb3NpdGlvbiBhdCB3aGljaCB0byBqb2luIHdpdGggb3RoZXIgYXhpcy4n
KSwKICAgICAgICApCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgTG9nVmFsdWVBeGlz
Ll9faW5pdF9fKHNlbGYpCiAgICAgICAgc2VsZi5sYWJlbHMuYm94QW5jaG9yID0gJ24nCiAgICAg
ICAgc2VsZi5sYWJlbHMuZHggPSAwCiAgICAgICAgc2VsZi5sYWJlbHMuZHkgPSAtNQoKICAgICAg
ICBzZWxmLnRpY2tVcCA9IDAKICAgICAgICBzZWxmLnRpY2tEb3duID0gNQogICAgICAgIHNlbGYu
bXRpY2tVcCA9IDAKICAgICAgICBzZWxmLm10aWNrRG93biA9IDIKCiAgICAgICAgc2VsZi5qb2lu
QXhpcyA9IE5vbmUKICAgICAgICBzZWxmLmpvaW5BeGlzTW9kZSA9IE5vbmUKICAgICAgICBzZWxm
LmpvaW5BeGlzUG9zID0gTm9uZQoKICAgIGRlZiBzY2FsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAg
IiIiQ29udmVydHMgYSBudW1lcmljIHZhbHVlIHRvIGEgWSBwb3NpdGlvbi4KCiAgICAgICAgVGhl
IGNoYXJ0IGZpcnN0IGNvbmZpZ3VyZXMgdGhlIGF4aXMsIHRoZW4gYXNrcyBpdCB0bwogICAgICAg
IHdvcmsgb3V0IHRoZSB4IHZhbHVlIGZvciBlYWNoIHBvaW50IHdoZW4gcGxvdHRpbmcKICAgICAg
ICBsaW5lcyBvciBiYXJzLiAgWW91IGNvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8KICAgICAgICBs
b2dhcml0aG1pYyBheGVzLgogICAgICAgICIiIgoKICAgICAgICBtc2cgPSAiQXhpcyBjYW5ub3Qg
c2NhbGUgbnVtYmVycyBiZWZvcmUgaXQgaXMgY29uZmlndXJlZCIKICAgICAgICBhc3NlcnQgc2Vs
Zi5fY29uZmlndXJlZCwgbXNnCiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAg
dmFsdWUgPSAwCiAgICAgICAgaWYgdmFsdWUgPT0gMC46CiAgICAgICAgICAgIHJldHVybiBzZWxm
Ll94IC0gc2VsZi5fc2NhbGVGYWN0b3IgKiBtYXRoLmxvZzEwKHNlbGYuX3ZhbHVlTWluKQogICAg
ICAgIHJldHVybiBzZWxmLl94ICsgc2VsZi5fc2NhbGVGYWN0b3IgKiAobWF0aC5sb2cxMCh2YWx1
ZSkgLSBtYXRoLmxvZzEwKHNlbGYuX3ZhbHVlTWluKSkKCiAgICBkZWYgZGVtbyhzZWxmKToKICAg
ICAgICAiU2FtcGxlIGRyYXdpbmcgd2l0aCBvbmUgeGxvZyBheGlzIgogICAgICAgIGRhdGEgPSBb
TnVtZXJpYy5hcmFuZ2UoMTAuLDEwMS4pKioxMC5dCiAgICAgICAgeEF4aXMuY29uZmlndXJlKGRh
dGEpCgogICAgICAgIGRyYXdpbmcgPSBEcmF3aW5nKDQwMCwyMDApCiAgICAgICAgZHJhd2luZy5h
ZGQoeEF4aXMpCgogICAgICAgIHJldHVybiBkcmF3aW5nCgoKICAgIGRlZiBtYWtlVGlja3Moc2Vs
Zik6CiAgICAgICAgZyA9IEdyb3VwKCkKICAgICAgICBpZiBzZWxmLnZpc2libGVUaWNrcyBhbmQg
KHNlbGYudGlja1VwIG9yIHNlbGYudGlja0Rvd24pOgogICAgICAgICAgICBzZWxmLl9tYWtlTGlu
ZXMoZywtc2VsZi50aWNrRG93bixzZWxmLnRpY2tVcCxzZWxmLnN0cm9rZUNvbG9yLHNlbGYuc3Ry
b2tlV2lkdGgsc2VsZi5zdHJva2VEYXNoQXJyYXkpCiAgICAgICAgaWYgc2VsZi52aXNpYmxlTVRp
Y2tzIGFuZCAoc2VsZi5tdGlja1VwIG9yIHNlbGYubXRpY2tEb3duKToKICAgICAgICAgICAgc2Vs
Zi5fbWFrZU1MaW5lcyhnLC1zZWxmLm10aWNrRG93bixzZWxmLm10aWNrVXAsc2VsZi5zdHJva2VD
b2xvcixzZWxmLnN0cm9rZVdpZHRoLHNlbGYuc3Ryb2tlRGFzaEFycmF5KQogICAgICAgIHJldHVy
biBnCgoKY2xhc3MgTG9nWVZhbHVlQXhpcyhMb2dWYWx1ZUF4aXMsWVZhbHVlQXhpcyk6CiAgICBf
YXR0ck1hcCA9IEF0dHJNYXAoCiAgICAgICAgQkFTRT1Mb2dWYWx1ZUF4aXMsCiAgICAgICAgdGlj
a0xlZnQgPSBBdHRyTWFwVmFsdWUoaXNOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGVzYz0nVGljayBsZW5ndGggbGVmdCBvZiB0aGUgYXhpcy4nKSwKICAgICAgICB0aWNr
UmlnaHQgPSBBdHRyTWFwVmFsdWUoaXNOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRlc2M9J1RpY2sgbGVuZ3RoIHJpZ2h0IG9mIHRoZSBheGlzLicpLAogICAgICAgIG10
aWNrTGVmdCA9IEF0dHJNYXBWYWx1ZShpc051bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkZXNjPSdNaW5vciB0aWNrIGxlbmd0aCBsZWZ0IG9mIHRoZSBheGlzLicpLAogICAg
ICAgIG10aWNrUmlnaHQgPSBBdHRyTWFwVmFsdWUoaXNOdW1iZXIsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlc2M9J01pbm9yIHRpY2sgbGVuZ3RoIHJpZ2h0IG9mIHRoZSBheGlz
LicpLAogICAgICAgIGpvaW5BeGlzID0gQXR0ck1hcFZhbHVlKE5vbmUsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZGVzYz0nSm9pbiBib3RoIGF4ZXMgaWYgdHJ1ZS4nKSwKICAgICAg
ICBqb2luQXhpc01vZGUgPSBBdHRyTWFwVmFsdWUoT25lT2YoKCdsZWZ0JywgJ3JpZ2h0JywgJ3Zh
bHVlJywgJ3BvaW50cycsIE5vbmUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVzYz0iTW9kZSB1c2VkIGZvciBjb25uZWN0aW5nIGF4aXMgKCdsZWZ0JywgJ3JpZ2h0Jywg
J3ZhbHVlJywgJ3BvaW50cycsIE5vbmUpLiIpLAogICAgICAgIGpvaW5BeGlzUG9zID0gQXR0ck1h
cFZhbHVlKGlzTnVtYmVyT3JOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlc2M9J1Bvc2l0aW9uIGF0IHdoaWNoIHRvIGpvaW4gd2l0aCBvdGhlciBheGlzLicpLAogICAg
ICAgICkKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBMb2dWYWx1ZUF4aXMuX19pbml0
X18oc2VsZikKICAgICAgICBzZWxmLmxhYmVscy5ib3hBbmNob3IgPSAnZScKICAgICAgICBzZWxm
LmxhYmVscy5keCA9IC01CiAgICAgICAgc2VsZi5sYWJlbHMuZHkgPSAwCgogICAgICAgIHNlbGYu
dGlja1JpZ2h0ID0gMAogICAgICAgIHNlbGYudGlja0xlZnQgPSA1CiAgICAgICAgc2VsZi5tdGlj
a1JpZ2h0ID0gMAogICAgICAgIHNlbGYubXRpY2tMZWZ0ID0gMgoKICAgICAgICBzZWxmLmpvaW5B
eGlzID0gTm9uZQogICAgICAgIHNlbGYuam9pbkF4aXNNb2RlID0gTm9uZQogICAgICAgIHNlbGYu
am9pbkF4aXNQb3MgPSBOb25lCgogICAgZGVmIHNjYWxlKHNlbGYsIHZhbHVlKToKICAgICAgICAi
IiJDb252ZXJ0cyBhIG51bWVyaWMgdmFsdWUgdG8gYSBZIHBvc2l0aW9uLgoKICAgICAgICBUaGUg
Y2hhcnQgZmlyc3QgY29uZmlndXJlcyB0aGUgYXhpcywgdGhlbiBhc2tzIGl0IHRvCiAgICAgICAg
d29yayBvdXQgdGhlIHggdmFsdWUgZm9yIGVhY2ggcG9pbnQgd2hlbiBwbG90dGluZwogICAgICAg
IGxpbmVzIG9yIGJhcnMuICBZb3UgY291bGQgb3ZlcnJpZGUgdGhpcyB0byBkbwogICAgICAgIGxv
Z2FyaXRobWljIGF4ZXMuCiAgICAgICAgIiIiCgogICAgICAgIG1zZyA9ICJBeGlzIGNhbm5vdCBz
Y2FsZSBudW1iZXJzIGJlZm9yZSBpdCBpcyBjb25maWd1cmVkIgogICAgICAgIGFzc2VydCBzZWxm
Ll9jb25maWd1cmVkLCBtc2cKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2
YWx1ZSA9IDAKICAgICAgICBpZiB2YWx1ZSA9PSAwLjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3kgLSBzZWxmLl9zY2FsZUZhY3RvciAqIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pCiAgICAg
ICAgcmV0dXJuIHNlbGYuX3kgKyBzZWxmLl9zY2FsZUZhY3RvciAqIChtYXRoLmxvZzEwKHZhbHVl
KSAtIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pKQoKICAgIGRlZiBtYWtlVGlja3Moc2VsZik6
CiAgICAgICAgZyA9IEdyb3VwKCkKICAgICAgICBpZiBzZWxmLnZpc2libGVUaWNrcyBhbmQgKHNl
bGYudGlja0xlZnQgb3Igc2VsZi50aWNrUmlnaHQpOgogICAgICAgICAgICBzZWxmLl9tYWtlTGlu
ZXMoZywtc2VsZi50aWNrTGVmdCxzZWxmLnRpY2tSaWdodCxzZWxmLnN0cm9rZUNvbG9yLHNlbGYu
c3Ryb2tlV2lkdGgsc2VsZi5zdHJva2VEYXNoQXJyYXkpCiAgICAgICAgaWYgc2VsZi52aXNpYmxl
TVRpY2tzIGFuZCAoc2VsZi5tdGlja0xlZnQgb3Igc2VsZi5tdGlja1JpZ2h0KToKICAgICAgICAg
ICAgc2VsZi5fbWFrZU1MaW5lcyhnLC1zZWxmLm10aWNrTGVmdCxzZWxmLm10aWNrUmlnaHQsc2Vs
Zi5zdHJva2VDb2xvcixzZWxmLnN0cm9rZVdpZHRoLHNlbGYuc3Ryb2tlRGFzaEFycmF5KQogICAg
ICAgIHJldHVybiBnCgogICAgZGVmIGRlbW8oc2VsZik6CiAgICAgICAgIlNhbXBsZSBkcmF3aW5n
IHdpdGggb25lIHhsb2cgYXhpcyIKICAgICAgICBkYXRhID0gW051bWVyaWMuYXJhbmdlKDEwLiwx
MDEuKSoqMTAuXQogICAgICAgIHlBeGlzLmNvbmZpZ3VyZShkYXRhKQoKICAgICAgICBkcmF3aW5n
ID0gRHJhd2luZyg0MDAsMjAwKQogICAgICAgIGRyYXdpbmcuYWRkKHlBeGlzKQoKICAgICAgICBy
ZXR1cm4gZHJhd2luZwoKZGVmIHNhbXBsZThhKCk6CiAgICAiU2FtcGxlIGRyYXdpbmcgd2l0aCBv
bmUgeGxvZyBheGlzIgogICAgZHJhd2luZyA9IERyYXdpbmcoNDAwLDIwMCkKCiAgICBkYXRhID0g
W1tmbG9hdChpKSoqMi4gZm9yIGkgaW4gcmFuZ2UoMTAsIDEwMDEsIDEwKV0sIF0KCiAgICB4QXhp
cyA9IExvZ1hWYWx1ZUF4aXMoKQogICAgeEF4aXMuY29uZmlndXJlKGRhdGEpCgogICAgZHJhd2lu
Zy5hZGQoeEF4aXMpCgogICAgcmV0dXJuIGRyYXdpbmcKCmRlZiBzYW1wbGU4YigpOgogICAgIlNh
bXBsZSBkcmF3aW5nIHdpdGggb25lIHhsb2cgYXhpcyIKICAgIGRyYXdpbmcgPSBEcmF3aW5nKDQw
MCwyMDApCgogICAgZGF0YSA9IFtbZmxvYXQoaSkqKjIuIGZvciBpIGluIHJhbmdlKDEwLCAxMDAx
LCAxMCldLCBdCgogICAgeUF4aXMgPSBMb2dZVmFsdWVBeGlzKCkKICAgIHlBeGlzLmNvbmZpZ3Vy
ZShkYXRhKQoKICAgIGRyYXdpbmcuYWRkKHlBeGlzKQoKICAgIHJldHVybiBkcmF3aW5nCgpkZWYg
c2FtcGxlOWEoKToKICAgIGxwID0gTGluZVBsb3QoKQogICAgbHAueVZhbHVlQXhpcyA9IExvZ1lW
YWx1ZUF4aXMoKQogICAgbHAueCArPSAyMAogICAgbHAueSArPSAyMAogICAgZGF0YSA9IFtbKGks
IGZsb2F0KGkpKioyLikgZm9yIGkgaW4gcmFuZ2UoMTAsIDEwMDEsIDEwKV0sIF0KICAgIGRhdGEu
YXBwZW5kKFsoaSwgZmxvYXQoaSkqKjMuKSBmb3IgaSBpbiByYW5nZSgxMCwgMTAwMSwgMTApXSkK
ICAgIGRhdGEuYXBwZW5kKFsoaSwgZmxvYXQoaSkqKjEuNikgZm9yIGkgaW4gcmFuZ2UoMTAsIDEw
MDEsIDEwKV0pCiAgICBscC5kYXRhID0gZGF0YQogICAgbHAubGluZXMuc3Ryb2tlV2lkdGggPSAu
MgogICAgbHAubGluZXNbMF0uc3Ryb2tlQ29sb3IgPSBjb2xvcnMucmVkCiAgICBscC5saW5lc1sx
XS5zdHJva2VDb2xvciA9IGNvbG9ycy5ibHVlCiAgICBscC5saW5lc1syXS5zdHJva2VDb2xvciA9
IGNvbG9ycy5ncmVlbgoKICAgIGRyYXdpbmcgPSBEcmF3aW5nKDQwMCwyMDApCiAgICBkcmF3aW5n
LmFkZChscCkKCiAgICByZXR1cm4gZHJhd2luZwoKZGVmIHNhbXBsZTliKCk6CiAgICBscCA9IExp
bmVQbG90KCkKICAgIGxwLnlWYWx1ZUF4aXMgPSBMb2dZVmFsdWVBeGlzKCkKICAgIGxwLnggKz0g
MjAKICAgIGxwLnkgKz0gMjAKICAgIGxwLmhlaWdodCA9IDI1MAogICAgbHAud2lkdGggPSAzNTAK
ICAgIGRhdGEgPSBbWyhpLCBmbG9hdChpKSoqMi4pIGZvciBpIGluIHJhbmdlKDEwLCAxMDAxLCAx
MCldLCBdCiAgICBkYXRhLmFwcGVuZChbKGksIGZsb2F0KGkpKiozLikgZm9yIGkgaW4gcmFuZ2Uo
MTAsIDEwMDEsIDEwKV0pCiAgICBkYXRhLmFwcGVuZChbKGksIGZsb2F0KGkpKioxLjYpIGZvciBp
IGluIHJhbmdlKDEwLCAxMDAxLCAxMCldKQogICAgbHAuZGF0YSA9IGRhdGEKICAgIGxwLmxpbmVz
LnN0cm9rZVdpZHRoID0gLjIKICAgIGxwLmxpbmVzWzBdLnN0cm9rZUNvbG9yID0gY29sb3JzLnJl
ZAogICAgbHAubGluZXNbMV0uc3Ryb2tlQ29sb3IgPSBjb2xvcnMuYmx1ZQogICAgbHAubGluZXNb
Ml0uc3Ryb2tlQ29sb3IgPSBjb2xvcnMuZ3JlZW4KCiAgICBscC54VmFsdWVBeGlzLnZpc2libGVH
cmlkID0gMQogICAgbHAueFZhbHVlQXhpcy5ncmlkU3Ryb2tlRGFzaEFycmF5ID0gWzEsIDFdCiAg
ICBscC55VmFsdWVBeGlzLnZpc2libGVHcmlkID0gMQogICAgbHAueVZhbHVlQXhpcy52aXNpYmxl
TVRpY2tzID0gMQogICAgbHAueVZhbHVlQXhpcy52aXNpYmxlTUdyaWQgPSAxCiAgICBscC55VmFs
dWVBeGlzLmdyaWRTdHJva2VEYXNoQXJyYXkgPSBbMSwgMV0KICAgIGxwLnlWYWx1ZUF4aXMubWdy
aWRTdHJva2VEYXNoQXJyYXkgPSBbMSwgMV0KCiAgICBkcmF3aW5nID0gRHJhd2luZyg0MDAsMzAw
KQogICAgZHJhd2luZy5hZGQobHApCgogICAgcmV0dXJuIGRyYXdpbmcKCmRlZiBzYW1wbGU5Yygp
OgogICAgbHAgPSBMaW5lUGxvdCgpCiAgICBscC55VmFsdWVBeGlzID0gTG9nWVZhbHVlQXhpcygp
CiAgICBscC54ICs9IDIwCiAgICBscC55ICs9IDIwCiAgICBscC5oZWlnaHQgPSAyNTAKICAgIGxw
LndpZHRoID0gMzUwCiAgICBkYXRhID0gW1soaSwgZmxvYXQoaSkqKjIuKSBmb3IgaSBpbiByYW5n
ZSgxMCwgMTAwMSwgMTApXSwgXQogICAgZGF0YS5hcHBlbmQoWyhpLCBmbG9hdChpKSoqMy4pIGZv
ciBpIGluIHJhbmdlKDEwLCAxMDAxLCAxMCldKQogICAgZGF0YS5hcHBlbmQoWyhpLCBmbG9hdChp
KSoqMS42KSBmb3IgaSBpbiByYW5nZSgxMCwgMTAwMSwgMTApXSkKICAgIGxwLmRhdGEgPSBkYXRh
CiAgICBscC5saW5lcy5zdHJva2VXaWR0aCA9IC4yCiAgICBscC5saW5lc1swXS5zdHJva2VDb2xv
ciA9IGNvbG9ycy5yZWQKICAgIGxwLmxpbmVzWzFdLnN0cm9rZUNvbG9yID0gY29sb3JzLmJsdWUK
ICAgIGxwLmxpbmVzWzJdLnN0cm9rZUNvbG9yID0gY29sb3JzLmdyZWVuCgogICAgbHAueFZhbHVl
QXhpcy52aXNpYmxlR3JpZCA9IDEKICAgIGxwLnhWYWx1ZUF4aXMuZ3JpZFN0cm9rZURhc2hBcnJh
eSA9IFsxLCAxXQogICAgbHAueVZhbHVlQXhpcy52aXNpYmxlR3JpZCA9IDEKICAgIGxwLnlWYWx1
ZUF4aXMudmlzaWJsZU1UaWNrcyA9IDEKICAgIGxwLnlWYWx1ZUF4aXMudmlzaWJsZU1HcmlkID0g
MQogICAgbHAueVZhbHVlQXhpcy5tU2VjTnVtID0gNAogICAgbHAueVZhbHVlQXhpcy5ncmlkU3Ry
b2tlRGFzaEFycmF5ID0gWy4zLCAxXQogICAgbHAueVZhbHVlQXhpcy5tZ3JpZFN0cm9rZURhc2hB
cnJheSA9IFsuMTUsIDFdCgogICAgZHJhd2luZyA9IERyYXdpbmcoNDAwLDMwMCkKICAgIGRyYXdp
bmcuYWRkKGxwKQoKICAgIHJldHVybiBkcmF3aW5nCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18i
OgogICAgczhhID0gc2FtcGxlOGEoKQogICAgcmVuZGVyUERGLmRyYXdUb0ZpbGUoczhhLCAic2Ft
cGxlOGEucGRmIiwgIkxvZ1hWYWx1ZUF4aXMgc2FtcGxlIikKICAgIHM4YiA9IHNhbXBsZThiKCkK
ICAgIHJlbmRlclBERi5kcmF3VG9GaWxlKHM4YiwgInNhbXBsZThiLnBkZiIsICJMb2dYVmFsdWVB
eGlzIHNhbXBsZSIpCiAgICBzOWEgPSBzYW1wbGU5YSgpCiAgICByZW5kZXJQREYuZHJhd1RvRmls
ZShzOWEsICJsb2dzYW1wbGUucGRmIiwgIkxvZ1lWYWx1ZUF4aXMgc2FtcGxlIikKICAgIHM5YiA9
IHNhbXBsZTliKCkKICAgIHJlbmRlclBERi5kcmF3VG9GaWxlKHM5YiwgImxvZ3NhbXBsZTIucGRm
IiwgIkxvZ1lWYWx1ZUF4aXMgc2FtcGxlIikKICAgIHM5YyA9IHNhbXBsZTljKCkKICAgIHJlbmRl
clBERi5kcmF3VG9GaWxlKHM5YywgImxvZ3NhbXBsZTMucGRmIiwgIkxvZ1lWYWx1ZUF4aXMgc2Ft
cGxlIikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KIyBVcGRhdGUgSW5mb3JtYXRpb25zCiMgJExvZyQKCiMg
TG9jYWwgVmFyaWFibGVzOjsKIyBjb21waWxlLWNvbW1hbmQ6InB5dGhvbiBzZXR1cC5weSBidWls
ZCI7CiMgRW5kOjsK
--=-=-=--