Problem with creating 3D bar plot
Curtis Rueden
ctrueden at wisc.edu
Tue Jun 6 14:54:48 MDT 2006
SGkgo3VrYXN6LAoKU2luY2UgeW91IGFyZSBub3QgdGhlIGZpcnN0IHRvIGFzayBhYm91dCBiYXIg
Z3JhcGhzIGluIFZpc0FELCBJIGRlY2lkZWQgdG8Kd3JpdGUgYSBsaXR0bGUgdXRpbGl0eSBjbGFz
cyBmb3IgY29uc3RydWN0aW5nIGJhciBncmFwaHMgd2l0aCBWaXNBRCBpbiAyRAphbmQgM0QuIEl0
IHdpbGwgYmUgZm91bmQgaW4gdmlzYWQudXRpbC5CYXJHcmFwaCBmb3IgdGhlIG5leHQgVmlzQUQg
cmVsZWFzZSwKYW5kIEkgaGF2ZSBhbHNvIGFwcGVuZGVkIGl0IHRvIHRoaXMgZW1haWwuCgpIb3Bl
ZnVsbHkgeW91IGNhbiBwdXp6bGUgb3V0IGhvdyB0aGluZ3Mgd29yayBieSBzdHVkeWluZyB0aGUg
Y29kZSBhbmQKcGxheWluZyBhcm91bmQgd2l0aCBpdC4gWW91IGNhbiBzZWUgdGhlIGNvZGUgaW4g
YWN0aW9uIHdpdGggImphdmEKdmlzYWQudXRpbC5CYXJHcmFwaCIgKGlmIHlvdSBoYXZlIHRyb3Vi
bGUgd2l0aCBjbGFzc3BhdGhzLCB5b3UgY2FuIHJlbW92ZQp0aGUgInBhY2thZ2UiIHN0YXRlbWVu
dCwgcmVjb21waWxlIGFuZCB0aGVuIGp1c3QgcnVuICJqYXZhIEJhckdyYXBoIikuCgpMZXQgbWUg
a25vdyBpZiB5b3UgaGF2ZSBhbnkgZnVydGhlciBxdWVzdGlvbnMuCgpDaGVlcnMsCkN1cnRpcwoK
LS0tLS0tLS0tLS0tLS0tLQovLwovLyBCYXJHcmFwaC5qYXZhCi8vCgovKgpWaXNBRCBzeXN0ZW0g
Zm9yIGludGVyYWN0aXZlIGFuYWx5c2lzIGFuZCB2aXN1YWxpemF0aW9uIG9mIG51bWVyaWNhbApk
YXRhLiAgQ29weXJpZ2h0IChDKSAxOTk2IC0gMjAwNiBCaWxsIEhpYmJhcmQsIEN1cnRpcyBSdWVk
ZW4sIFRvbQpSaW5rLCBEYXZlIEdsb3dhY2tpLCBTdGV2ZSBFbW1lcnNvbiwgVG9tIFdoaXR0YWtl
ciwgRG9uIE11cnJheSwgYW5kClRvbW15IEphc21pbi4KClRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCnZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQpMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlm
IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVt
cGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCk1BIDAyMTExLTEzMDcsIFVTQQoqLwoKcGFj
a2FnZSB2aXNhZC51dGlsOwoKaW1wb3J0IGphdmF4LnN3aW5nLio7CmltcG9ydCBqYXZhLmF3dC4q
OwppbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwppbXBvcnQgdmlzYWQuKjsKaW1wb3J0
IHZpc2FkLmphdmEzZC4qOwoKLyoqIEJhckdyYXBoIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHBsb3R0
aW5nIGNvbG9yZWQgYmFyIGdyYXBocyBpbiAyRCBvciAzRC4KKi8KcHVibGljIGNsYXNzIEJhckdy
YXBoIHsKCiAgLy8gLS0gQ29uc3RhbnRzIC0tCgogIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVh
bFR5cGUgQkFSX1ggPSBSZWFsVHlwZS5nZXRSZWFsVHlwZSgiQmFyX1giKTsKICBwcm90ZWN0ZWQg
c3RhdGljIGZpbmFsIFJlYWxUeXBlIEJBUl9ZID0gUmVhbFR5cGUuZ2V0UmVhbFR5cGUoIkJhcl9Z
Iik7CiAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZWFsVHlwZSBCQVJfWiA9IFJlYWxUeXBlLmdl
dFJlYWxUeXBlKCJCYXJfWiIpOwogIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVhbFR5cGUgQkFS
X1IgPSBSZWFsVHlwZS5nZXRSZWFsVHlwZSgiQmFyX1JlZCIpOwogIHByb3RlY3RlZCBzdGF0aWMg
ZmluYWwgUmVhbFR5cGUgQkFSX0cgPSBSZWFsVHlwZS5nZXRSZWFsVHlwZSgiQmFyX0dyZWVuIik7
CiAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZWFsVHlwZSBCQVJfQiA9IFJlYWxUeXBlLmdldFJl
YWxUeXBlKCJCYXJfQmx1ZSIpOwogIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRnVuY3Rpb25UeXBl
IEJPWF8yRDsKICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZ1bmN0aW9uVHlwZSBCT1hfM0Q7CiAg
c3RhdGljIHsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jMmQgPSBudWxsLCBmdW5jM2QgPSBudWxsOwog
ICAgdHJ5IHsKICAgICAgUmVhbFR1cGxlVHlwZSByZ2IgPSBuZXcgUmVhbFR1cGxlVHlwZShCQVJf
UiwgQkFSX0csIEJBUl9CKTsKICAgICAgZnVuYzJkID0gbmV3IEZ1bmN0aW9uVHlwZShuZXcgUmVh
bFR1cGxlVHlwZShCQVJfWCwgQkFSX1kpLCByZ2IpOwogICAgICBmdW5jM2QgPSBuZXcgRnVuY3Rp
b25UeXBlKG5ldyBSZWFsVHVwbGVUeXBlKEJBUl9YLCBCQVJfWSwgQkFSX1opLApyZ2IpOwogICAg
fQogICAgY2F0Y2ggKFZpc0FERXhjZXB0aW9uIGV4YykgeyBleGMucHJpbnRTdGFja1RyYWNlKCk7
IH0KICAgIEJPWF8yRCA9IGZ1bmMyZDsKICAgIEJPWF8zRCA9IGZ1bmMzZDsKICB9CgogIC8vIC0t
IDJEIGJhciBncmFwaCBtZXRob2Qgc2lnbmF0dXJlcyAtLQoKICAvKioKICAgKiBDb25zdHJ1Y3Rz
IGEgMkQgYmFyIGdyYXBoLgogICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIGVhY2ggYmFyCiAg
ICogQHBhcmFtIHNwYWNpbmcgU3BhY2luZyBiZXR3ZWVuIGJhcnMgKGF0IGxlYXN0IDAsIGFuZCBs
ZXNzIHRoYW4gMSkKICAgKiBAcGFyYW0gY29sb3JzIENvbG9yIG9mIGVhY2ggYmFyCiAgICovCiAg
cHVibGljIHN0YXRpYyBGbGF0RmllbGQgbWFrZUJhckdyYXBoMkQoZmxvYXRbXSBoZWlnaHRzLCBm
bG9hdCBzcGFjaW5nLAogICAgQ29sb3JbXSBjb2xvcnMpIHRocm93cyBWaXNBREV4Y2VwdGlvbiwg
UmVtb3RlRXhjZXB0aW9uCiAgewogICAgcmV0dXJuIG1ha2VCYXJHcmFwaDJEKEJPWF8yRCwgaGVp
Z2h0cywgc3BhY2luZywgY29sb3JzKTsKICB9CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSAyRCBi
YXIgZ3JhcGguCiAgICogQHBhcmFtIHR5cGUgTWF0aFR5cGUgdG8gdXNlLCBvZiB0aGUgZm9ybSAo
KFgsIFkpIC0mZ3Q7IChSLCBHLCBCKSkKICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiBlYWNo
IGJhcgogICAqIEBwYXJhbSBzcGFjaW5nIFNwYWNpbmcgYmV0d2VlbiBiYXJzIChhdCBsZWFzdCAw
LCBhbmQgbGVzcyB0aGFuIDEpCiAgICogQHBhcmFtIGNvbG9ycyBDb2xvciBvZiBlYWNoIGJhcgog
ICAqLwogIHB1YmxpYyBzdGF0aWMgRmxhdEZpZWxkIG1ha2VCYXJHcmFwaDJEKEZ1bmN0aW9uVHlw
ZSB0eXBlLCBmbG9hdFtdIGhlaWdodHMsCiAgICBmbG9hdCBzcGFjaW5nLCBDb2xvcltdIGNvbG9y
cykgdGhyb3dzIFZpc0FERXhjZXB0aW9uLCBSZW1vdGVFeGNlcHRpb24KICB7CiAgICBpZiAoaGVp
Z2h0cyA9PSBudWxsKSB0aHJvdyBuZXcgVmlzQURFeGNlcHRpb24oIkhlaWdodHMgaXMgbnVsbCIp
OwogICAgaW50IGxlbiA9IGhlaWdodHMubGVuZ3RoOwogICAgZmxvYXRbXSB4MSA9IG5ldyBmbG9h
dFtsZW5dLCB5MSA9IG5ldyBmbG9hdFtsZW5dOwogICAgZmxvYXRbXSB4MiA9IG5ldyBmbG9hdFts
ZW5dLCB5MiA9IG5ldyBmbG9hdFtsZW5dOwogICAgZmxvYXQgcyA9IHNwYWNpbmcgLyAyOwogICAg
Zm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CiAgICAgIHgxW2ldID0gaSArIHM7CiAgICAgIHkx
W2ldID0gMDsKICAgICAgeDJbaV0gPSBpICsgMSAtIHM7CiAgICAgIHkyW2ldID0gaGVpZ2h0c1tp
XTsKICAgIH0KICAgIHJldHVybiBtYWtlQm94ZXMyRCh0eXBlLCB4MSwgeTEsIHgyLCB5MiwgY29s
b3JzKTsKICB9CgogIHB1YmxpYyBzdGF0aWMgRmxhdEZpZWxkIG1ha2VCb3hlczJEKGZsb2F0W10g
eDEsIGZsb2F0W10geTEsCiAgICBmbG9hdFtdIHgyLCBmbG9hdFtdIHkyLCBDb2xvcltdIGMpIHRo
cm93cyBWaXNBREV4Y2VwdGlvbiwKUmVtb3RlRXhjZXB0aW9uCiAgewogICAgcmV0dXJuIG1ha2VC
b3hlczJEKEJPWF8yRCwgeDEsIHkxLCB4MiwgeTIsIGMpOwogIH0KCiAgcHVibGljIHN0YXRpYyBG
bGF0RmllbGQgbWFrZUJveGVzMkQoZmxvYXRbXSB4MSwgZmxvYXRbXSB5MSwKICAgIGZsb2F0W10g
eDIsIGZsb2F0W10geTIsIGZsb2F0W10gciwgZmxvYXRbXSBnLCBmbG9hdFtdIGIpCiAgICB0aHJv
d3MgVmlzQURFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbgogIHsKICAgIHJldHVybiBtYWtlQm94
ZXMyRChCT1hfMkQsIHgxLCB5MSwgeDIsIHkyLCByLCBnLCBiKTsKICB9CgogIHB1YmxpYyBzdGF0
aWMgRmxhdEZpZWxkIG1ha2VCb3hlczJEKEZ1bmN0aW9uVHlwZSB0eXBlLAogICAgZmxvYXRbXSB4
MSwgZmxvYXRbXSB5MSwgZmxvYXRbXSB4MiwgZmxvYXRbXSB5MiwgQ29sb3JbXSBjKQogICAgdGhy
b3dzIFZpc0FERXhjZXB0aW9uLCBSZW1vdGVFeGNlcHRpb24KICB7CiAgICBmbG9hdFtdW10gcmdi
ID0gZXh0cmFjdENvbG9ycyhjKTsKICAgIHJldHVybiBtYWtlQm94ZXMyRChCT1hfMkQsIHgxLCB5
MSwgeDIsIHkyLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKICB9CgogIHB1YmxpYyBzdGF0aWMg
RmxhdEZpZWxkIG1ha2VCb3hlczJEKEZ1bmN0aW9uVHlwZSB0eXBlLAogICAgZmxvYXRbXSB4MSwg
ZmxvYXRbXSB5MSwgZmxvYXRbXSB4MiwgZmxvYXRbXSB5MiwKICAgIGZsb2F0W10gciwgZmxvYXRb
XSBnLCBmbG9hdFtdIGIpIHRocm93cyBWaXNBREV4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9uCiAg
ewogICAgaWYgKHR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IFZpc0FERXhjZXB0aW9uKCJUeXBlIGlz
IG51bGwiKTsKICAgIGlmICh4MSA9PSBudWxsIHx8IHkxID09IG51bGwgfHwgeDIgPT0gbnVsbCB8
fCB5MiA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBWaXNBREV4Y2VwdGlvbigiQ29vcmRpbmF0
ZXMgYXJlIG51bGwiKTsKICAgIH0KICAgIGlmIChyID09IG51bGwgfHwgZyA9PSBudWxsIHx8IGIg
PT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVmlzQURFeGNlcHRpb24oIkNvbG9yIHZhbHVlcyBh
cmUgbnVsbCIpOwogICAgfQogICAgaW50IGxlbiA9IHgxLmxlbmd0aDsKICAgIGlmIChsZW4gIT0g
eTEubGVuZ3RoIHx8IGxlbiAhPSB4Mi5sZW5ndGggfHwgbGVuICE9IHkyLmxlbmd0aCB8fAogICAg
ICBsZW4gIT0gci5sZW5ndGggfHwgbGVuICE9IGcubGVuZ3RoIHx8IGxlbiAhPSBiLmxlbmd0aCkK
ICAgIHsKICAgICAgdGhyb3cgbmV3IFZpc0FERXhjZXB0aW9uKCJMZW5ndGhzIGRvIG5vdCBtYXRj
aCIpOwogICAgfQogICAgUmVhbFR1cGxlVHlwZSBkb21haW4gPSB0eXBlLmdldERvbWFpbigpOwog
ICAgR3JpZGRlZDJEU2V0W10gc2V0cyA9IG5ldyBHcmlkZGVkMkRTZXRbbGVuXTsKICAgIGZsb2F0
W11bXSBjb2xvcnMgPSBuZXcgZmxvYXRbM11bNCAqIGxlbl07CiAgICBmb3IgKGludCBpPTA7IGk8
bGVuOyBpKyspIHsKICAgICAgZmxvYXRbXVtdIHNhbXBsZXMgPSB7CiAgICAgICAge3gxW2ldLCB4
MltpXSwgeDFbaV0sIHgyW2ldfSwKICAgICAgICB7eTFbaV0sIHkxW2ldLCB5MltpXSwgeTJbaV19
CiAgICAgIH07CiAgICAgIHNldHNbaV0gPSBuZXcgR3JpZGRlZDJEU2V0KGRvbWFpbiwKICAgICAg
ICBzYW1wbGVzLCAyLCAyLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7CiAgICAgIGZvciAoaW50
IGo9MDsgajw0OyBqKyspIHsKICAgICAgICBpbnQgbmR4ID0gNCAqIGkgKyBqOwogICAgICAgIGNv
bG9yc1swXVtuZHhdID0gcltpXTsKICAgICAgICBjb2xvcnNbMV1bbmR4XSA9IGdbaV07CiAgICAg
ICAgY29sb3JzWzJdW25keF0gPSBiW2ldOwogICAgICB9CiAgICB9CiAgICBVbmlvblNldCB1c2V0
ID0gbmV3IFVuaW9uU2V0KGRvbWFpbiwgc2V0cyk7CiAgICBGbGF0RmllbGQgZmYgPSBuZXcgRmxh
dEZpZWxkKHR5cGUsIHVzZXQpOwogICAgZmYuc2V0U2FtcGxlcyhjb2xvcnMsIGZhbHNlKTsKICAg
IHJldHVybiBmZjsKICB9CgogIC8vIC0tIDNEIGJhciBncmFwaCBtZXRob2Qgc2lnbmF0dXJlcyAt
LQoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgM0QgYmFyIGdyYXBoLgogICAqIEBwYXJhbSBoZWln
aHQgSGVpZ2h0IG9mIGVhY2ggYmFyIChkaW1lbnNpb25lZCBjb2xzIFggcm93cykKICAgKiBAcGFy
YW0gc3BhY2luZyBTcGFjaW5nIGJldHdlZW4gYmFycyAoYXQgbGVhc3QgMCwgYW5kIGxlc3MgdGhh
biAxKQogICAqIEBwYXJhbSBjb2xvcnMgQ29sb3Igb2YgZWFjaCBiYXIgKGRpbWVuc2lvbmVkIGNv
bHMgWCByb3dzKQogICAqLwogIHB1YmxpYyBzdGF0aWMgRmxhdEZpZWxkIG1ha2VCYXJHcmFwaDNE
KGZsb2F0W11bXSBoZWlnaHRzLCBmbG9hdCBzcGFjaW5nLAogICAgQ29sb3JbXVtdIGNvbG9ycykg
dGhyb3dzIFZpc0FERXhjZXB0aW9uLCBSZW1vdGVFeGNlcHRpb24KICB7CiAgICByZXR1cm4gbWFr
ZUJhckdyYXBoM0QoQk9YXzJELCBoZWlnaHRzLCBzcGFjaW5nLCBjb2xvcnMpOwogIH0KCiAgLyoq
CiAgICogQ29uc3RydWN0cyBhIDNEIGJhciBncmFwaC4KICAgKiBAcGFyYW0gdHlwZSBNYXRoVHlw
ZSB0byB1c2UsIG9mIHRoZSBmb3JtICgoWCwgWSwgWikgLSZndDsgKFIsIEcsIEIpKQogICAqIEBw
YXJhbSBoZWlnaHQgSGVpZ2h0IG9mIGVhY2ggYmFyIChkaW1lbnNpb25lZCBjb2xzIFggcm93cykK
ICAgKiBAcGFyYW0gc3BhY2luZyBTcGFjaW5nIGJldHdlZW4gYmFycyAoYXQgbGVhc3QgMCwgYW5k
IGxlc3MgdGhhbiAxKQogICAqIEBwYXJhbSBjb2xvcnMgQ29sb3Igb2YgZWFjaCBiYXIgKGRpbWVu
c2lvbmVkIGNvbHMgWCByb3dzKQogICAqLwogIHB1YmxpYyBzdGF0aWMgRmxhdEZpZWxkIG1ha2VC
YXJHcmFwaDNEKEZ1bmN0aW9uVHlwZSB0eXBlLCBmbG9hdFtdW10KaGVpZ2h0cywKICAgIGZsb2F0
IHNwYWNpbmcsIENvbG9yW11bXSBjb2xvcnMpIHRocm93cyBWaXNBREV4Y2VwdGlvbiwgUmVtb3Rl
RXhjZXB0aW9uCiAgewogICAgaWYgKGhlaWdodHMgPT0gbnVsbCkgdGhyb3cgbmV3IFZpc0FERXhj
ZXB0aW9uKCJIZWlnaHRzIGlzIG51bGwiKTsKICAgIGlmIChjb2xvcnMgPT0gbnVsbCkgdGhyb3cg
bmV3IFZpc0FERXhjZXB0aW9uKCJDb2xvcnMgYXJlIG51bGwiKTsKICAgIGludCBsZW5YID0gaGVp
Z2h0cy5sZW5ndGg7CiAgICBpZiAobGVuWCA8IDEpIHRocm93IG5ldyBWaXNBREV4Y2VwdGlvbigi
Tm90IGVub3VnaCBiYXJzIik7CiAgICBpZiAobGVuWCAhPSBjb2xvcnMubGVuZ3RoKSB7CiAgICAg
IHRocm93IG5ldyBWaXNBREV4Y2VwdGlvbigiTGVuZ3RocyBkbyBub3QgbWF0Y2giKTsKICAgIH0K
ICAgIGludCBsZW5ZID0gaGVpZ2h0c1swXS5sZW5ndGg7CiAgICBmb3IgKGludCBjPTA7IGM8bGVu
WDsgYysrKSB7CiAgICAgIGlmIChoZWlnaHRzW2NdID09IG51bGwpIHsKICAgICAgICB0aHJvdyBu
ZXcgVmlzQURFeGNlcHRpb24oIkhlaWdodHNbIiArIGMgKyAiXSBpcyBudWxsIik7CiAgICAgIH0K
ICAgICAgaWYgKGNvbG9yc1tjXSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFZpc0FERXhj
ZXB0aW9uKCJDb2xvcnNbIiArIGMgKyAiXSBpcyBudWxsIik7CiAgICAgIH0KICAgICAgaWYgKGxl
blkgIT0gaGVpZ2h0c1tjXS5sZW5ndGggfHwgbGVuWSAhPSBjb2xvcnNbY10ubGVuZ3RoKSB7CiAg
ICAgICAgdGhyb3cgbmV3IFZpc0FERXhjZXB0aW9uKCJMZW5ndGhzIGRvIG5vdCBtYXRjaCIpOwog
ICAgICB9CiAgICB9CiAgICBpbnQgbGVuID0gbGVuWCAqIGxlblk7CiAgICBmbG9hdFtdIHgxID0g
bmV3IGZsb2F0W2xlbl0sIHkxID0gbmV3IGZsb2F0W2xlbl0sIHoxID0gbmV3IGZsb2F0W2xlbl07
CiAgICBmbG9hdFtdIHgyID0gbmV3IGZsb2F0W2xlbl0sIHkyID0gbmV3IGZsb2F0W2xlbl0sIHoy
ID0gbmV3IGZsb2F0W2xlbl07CiAgICBDb2xvcltdIGNvbHMgPSBuZXcgQ29sb3JbbGVuXTsKICAg
IGZsb2F0IHMgPSBzcGFjaW5nIC8gMjsKICAgIGZvciAoaW50IHI9MDsgcjxsZW5ZOyByKyspIHsK
ICAgICAgZm9yIChpbnQgYz0wOyBjPGxlblg7IGMrKykgewogICAgICAgIGludCBpID0gbGVuWCAq
IHIgKyBjOwogICAgICAgIHgxW2ldID0gYyArIHM7CiAgICAgICAgeTFbaV0gPSByICsgczsKICAg
ICAgICB6MVtpXSA9IDA7CiAgICAgICAgeDJbaV0gPSBjICsgMSAtIHM7CiAgICAgICAgeTJbaV0g
PSByICsgMSAtIHM7CiAgICAgICAgejJbaV0gPSBoZWlnaHRzW2NdW3JdOwogICAgICAgIGNvbHNb
aV0gPSBjb2xvcnNbY11bcl07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYWtlQm94ZXMzRCh0
eXBlLCB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyLCBjb2xzKTsKICB9CgogIHB1YmxpYyBzdGF0aWMg
RmxhdEZpZWxkIG1ha2VCb3hlczNEKGZsb2F0W10geDEsIGZsb2F0W10geTEsIGZsb2F0W10gejEs
CiAgICBmbG9hdFtdIHgyLCBmbG9hdFtdIHkyLCBmbG9hdFtdIHoyLCBDb2xvcltdIGMpCiAgICB0
aHJvd3MgVmlzQURFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbgogIHsKICAgIHJldHVybiBtYWtl
Qm94ZXMzRChCT1hfM0QsIHgxLCB5MSwgejEsIHgyLCB5MiwgejIsIGMpOwogIH0KCiAgcHVibGlj
IHN0YXRpYyBGbGF0RmllbGQgbWFrZUJveGVzM0QoZmxvYXRbXSB4MSwgZmxvYXRbXSB5MSwgZmxv
YXRbXSB6MSwKICAgIGZsb2F0W10geDIsIGZsb2F0W10geTIsIGZsb2F0W10gejIsIGZsb2F0W10g
ciwgZmxvYXRbXSBnLCBmbG9hdFtdIGIpCiAgICB0aHJvd3MgVmlzQURFeGNlcHRpb24sIFJlbW90
ZUV4Y2VwdGlvbgogIHsKICAgIHJldHVybiBtYWtlQm94ZXMzRChCT1hfM0QsIHgxLCB5MSwgejEs
IHgyLCB5MiwgejIsIHIsIGcsIGIpOwogIH0KCiAgcHVibGljIHN0YXRpYyBGbGF0RmllbGQgbWFr
ZUJveGVzM0QoRnVuY3Rpb25UeXBlIHR5cGUsCiAgICBmbG9hdFtdIHgxLCBmbG9hdFtdIHkxLCBm
bG9hdFtdIHoxLCBmbG9hdFtdIHgyLCBmbG9hdFtdIHkyLCBmbG9hdFtdIHoyLAogICAgQ29sb3Jb
XSBjKSB0aHJvd3MgVmlzQURFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbgogIHsKICAgIGZsb2F0
W11bXSByZ2IgPSBleHRyYWN0Q29sb3JzKGMpOwogICAgcmV0dXJuIG1ha2VCb3hlczNEKEJPWF8z
RCwKICAgICAgeDEsIHkxLCB6MSwgeDIsIHkyLCB6MiwgcmdiWzBdLCByZ2JbMV0sIHJnYlsyXSk7
CiAgfQoKICBwdWJsaWMgc3RhdGljIEZsYXRGaWVsZCBtYWtlQm94ZXMzRChGdW5jdGlvblR5cGUg
dHlwZSwKICAgIGZsb2F0W10geDEsIGZsb2F0W10geTEsIGZsb2F0W10gejEsIGZsb2F0W10geDIs
IGZsb2F0W10geTIsIGZsb2F0W10gejIsCiAgICBmbG9hdFtdIHIsIGZsb2F0W10gZywgZmxvYXRb
XSBiKSB0aHJvd3MgVmlzQURFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbgogIHsKICAgIGlmICh0
eXBlID09IG51bGwpIHRocm93IG5ldyBWaXNBREV4Y2VwdGlvbigiVHlwZSBpcyBudWxsIik7CiAg
ICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHoxID09IG51bGwgfHwKICAgICAgeDIg
PT0gbnVsbCB8fCB5MiA9PSBudWxsIHx8IHoyID09IG51bGwpCiAgICB7CiAgICAgIHRocm93IG5l
dyBWaXNBREV4Y2VwdGlvbigiQ29vcmRpbmF0ZXMgYXJlIG51bGwiKTsKICAgIH0KICAgIGlmIChy
ID09IG51bGwgfHwgZyA9PSBudWxsIHx8IGIgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVmlz
QURFeGNlcHRpb24oIkNvbG9yIHZhbHVlcyBhcmUgbnVsbCIpOwogICAgfQogICAgaW50IGxlbiA9
IHgxLmxlbmd0aDsKICAgIGlmIChsZW4gIT0geTEubGVuZ3RoIHx8IGxlbiAhPSB6MS5sZW5ndGgg
fHwKICAgICAgbGVuICE9IHgyLmxlbmd0aCB8fCBsZW4gIT0geTIubGVuZ3RoIHx8IGxlbiAhPSB6
Mi5sZW5ndGggfHwKICAgICAgbGVuICE9IHIubGVuZ3RoIHx8IGxlbiAhPSBnLmxlbmd0aCB8fCBs
ZW4gIT0gYi5sZW5ndGgpCiAgICB7CiAgICAgIHRocm93IG5ldyBWaXNBREV4Y2VwdGlvbigiTGVu
Z3RocyBkbyBub3QgbWF0Y2giKTsKICAgIH0KCiAgICBSZWFsVHVwbGVUeXBlIGRvbWFpbiA9IHR5
cGUuZ2V0RG9tYWluKCk7CiAgICBVbmlvblNldFtdIHNldHMgPSBuZXcgVW5pb25TZXRbbGVuXTsK
ICAgIGZsb2F0W11bXSBjb2xvcnMgPSBuZXcgZmxvYXRbM11bNCAqIDYgKiBsZW5dOwogICAgZm9y
IChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CiAgICAgIGZsb2F0W11bXSBib3R0b21TYW1wbGVzID0g
ewogICAgICAgIHt4MVtpXSwgeDJbaV0sIHgxW2ldLCB4MltpXX0sCiAgICAgICAge3kxW2ldLCB5
MVtpXSwgeTJbaV0sIHkyW2ldfSwKICAgICAgICB7ejFbaV0sIHoxW2ldLCB6MVtpXSwgejFbaV19
CiAgICAgIH07CiAgICAgIEdyaWRkZWQzRFNldCBib3R0b20gPSBuZXcgR3JpZGRlZDNEU2V0KGRv
bWFpbiwKICAgICAgICBib3R0b21TYW1wbGVzLCAyLCAyLCBudWxsLCBudWxsLCBudWxsLCBmYWxz
ZSk7CgogICAgICBmbG9hdFtdW10gdG9wU2FtcGxlcyA9IHsKICAgICAgICB7eDFbaV0sIHgyW2ld
LCB4MVtpXSwgeDJbaV19LAogICAgICAgIHt5MVtpXSwgeTFbaV0sIHkyW2ldLCB5MltpXX0sCiAg
ICAgICAge3oyW2ldLCB6MltpXSwgejJbaV0sIHoyW2ldfQogICAgICB9OwogICAgICBHcmlkZGVk
M0RTZXQgdG9wID0gbmV3IEdyaWRkZWQzRFNldChkb21haW4sCiAgICAgICAgdG9wU2FtcGxlcywg
MiwgMiwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwoKICAgICAgZmxvYXRbXVtdIGZyb250U2Ft
cGxlcyA9IHsKICAgICAgICB7eDFbaV0sIHgyW2ldLCB4MVtpXSwgeDJbaV19LAogICAgICAgIHt5
MVtpXSwgeTFbaV0sIHkxW2ldLCB5MVtpXX0sCiAgICAgICAge3oxW2ldLCB6MVtpXSwgejJbaV0s
IHoyW2ldfQogICAgICB9OwogICAgICBHcmlkZGVkM0RTZXQgZnJvbnQgPSBuZXcgR3JpZGRlZDNE
U2V0KGRvbWFpbiwKICAgICAgICBmcm9udFNhbXBsZXMsIDIsIDIsIG51bGwsIG51bGwsIG51bGws
IGZhbHNlKTsKCiAgICAgIGZsb2F0W11bXSBiYWNrU2FtcGxlcyA9IHsKICAgICAgICB7eDFbaV0s
IHgyW2ldLCB4MVtpXSwgeDJbaV19LAogICAgICAgIHt5MltpXSwgeTJbaV0sIHkyW2ldLCB5Mltp
XX0sCiAgICAgICAge3oxW2ldLCB6MVtpXSwgejJbaV0sIHoyW2ldfQogICAgICB9OwogICAgICBH
cmlkZGVkM0RTZXQgYmFjayA9IG5ldyBHcmlkZGVkM0RTZXQoZG9tYWluLAogICAgICAgIGJhY2tT
YW1wbGVzLCAyLCAyLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7CgogICAgICBmbG9hdFtdW10g
bGVmdFNhbXBsZXMgPSB7CiAgICAgICAge3gxW2ldLCB4MVtpXSwgeDFbaV0sIHgxW2ldfSwKICAg
ICAgICB7eTFbaV0sIHkyW2ldLCB5MVtpXSwgeTJbaV19LAogICAgICAgIHt6MVtpXSwgejFbaV0s
IHoyW2ldLCB6MltpXX0KICAgICAgfTsKICAgICAgR3JpZGRlZDNEU2V0IGxlZnQgPSBuZXcgR3Jp
ZGRlZDNEU2V0KGRvbWFpbiwKICAgICAgICBsZWZ0U2FtcGxlcywgMiwgMiwgbnVsbCwgbnVsbCwg
bnVsbCwgZmFsc2UpOwoKICAgICAgZmxvYXRbXVtdIHJpZ2h0U2FtcGxlcyA9IHsKICAgICAgICB7
eDJbaV0sIHgyW2ldLCB4MltpXSwgeDJbaV19LAogICAgICAgIHt5MVtpXSwgeTJbaV0sIHkxW2ld
LCB5MltpXX0sCiAgICAgICAge3oxW2ldLCB6MVtpXSwgejJbaV0sIHoyW2ldfQogICAgICB9Owog
ICAgICBHcmlkZGVkM0RTZXQgcmlnaHQgPSBuZXcgR3JpZGRlZDNEU2V0KGRvbWFpbiwKICAgICAg
ICByaWdodFNhbXBsZXMsIDIsIDIsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKCiAgICAgIHNl
dHNbaV0gPSBuZXcgVW5pb25TZXQoZG9tYWluLAogICAgICAgIG5ldyBTYW1wbGVkU2V0W10ge2Jv
dHRvbSwgdG9wLCBmcm9udCwgYmFjaywgbGVmdCwgcmlnaHR9KTsKCiAgICAgIGZvciAoaW50IGo9
MDsgajwyNDsgaisrKSB7CiAgICAgICAgaW50IG5keCA9IDI0ICogaSArIGo7CiAgICAgICAgY29s
b3JzWzBdW25keF0gPSByW2ldOwogICAgICAgIGNvbG9yc1sxXVtuZHhdID0gZ1tpXTsKICAgICAg
ICBjb2xvcnNbMl1bbmR4XSA9IGJbaV07CiAgICAgIH0KICAgIH0KICAgIFVuaW9uU2V0IHVzZXQg
PSBuZXcgVW5pb25TZXQoZG9tYWluLCBzZXRzKTsKICAgIEZsYXRGaWVsZCBmZiA9IG5ldyBGbGF0
RmllbGQodHlwZSwgdXNldCk7CiAgICBmZi5zZXRTYW1wbGVzKGNvbG9ycywgZmFsc2UpOwogICAg
cmV0dXJuIGZmOwogIH0KCiAgLy8gLS0gSGVscGVyIG1ldGhvZHMgLS0KCiAgLyoqIENvbnZlcnRz
IGphdmEuYXd0LkNvbG9yIG9iamVjdHMgdG8gZmxvYXRpbmcgcG9pbnQgUkdCIHZhbHVlcy4gKi8K
ICBwdWJsaWMgc3RhdGljIGZsb2F0W11bXSBleHRyYWN0Q29sb3JzKENvbG9yW10gYykgewogICAg
aWYgKGMgPT0gbnVsbCkgcmV0dXJuIG5ldyBmbG9hdFtdW10ge251bGwsIG51bGwsIG51bGx9Owog
ICAgZmxvYXRbXVtdIHJnYiA9IG5ldyBmbG9hdFszXVtjLmxlbmd0aF07CiAgICBmb3IgKGludCBp
PTA7IGk8Yy5sZW5ndGg7IGkrKykgewogICAgICByZ2JbMF1baV0gPSBjW2ldLmdldFJlZCgpIC8g
MjU1ZjsKICAgICAgcmdiWzFdW2ldID0gY1tpXS5nZXRHcmVlbigpIC8gMjU1ZjsKICAgICAgcmdi
WzJdW2ldID0gY1tpXS5nZXRCbHVlKCkgLyAyNTVmOwogICAgfQogICAgcmV0dXJuIHJnYjsKICB9
CgogIC8vIC0tIE1haW4gbWV0aG9kIC0tCgogIC8qKiBSdW4gJ2phdmEgdmlzYWQudXRpbC5CYXJH
cmFwaCcgdG8gdGVzdCBiYXIgZ3JhcGhpbmcuICovCiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4o
U3RyaW5nW10gYXJndikKICAgIHRocm93cyBWaXNBREV4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9u
CiAgewogICAgSkZyYW1lIGZyYW1lID0gbmV3IEpGcmFtZSgiQmFyIEdyYXBocyBpbiBWaXNBRCIp
OwogICAgSlBhbmVsIHBhbmUgPSBuZXcgSlBhbmVsKCk7CiAgICBwYW5lLnNldExheW91dChuZXcg
Qm94TGF5b3V0KHBhbmUsIEJveExheW91dC5YX0FYSVMpKTsKICAgIGZyYW1lLnNldENvbnRlbnRQ
YW5lKHBhbmUpOwoKICAgIC8vIDJEIGJhciBncmFwaAogICAgZmxvYXRbXSBoZWlnaHRzMiA9IHs0
LCA3LCA1LCAxMSwgOX07CiAgICBmbG9hdCBtYXgyID0gMTI7IC8vIHRvcCBvZiBncmFwaAogICAg
Q29sb3JbXSBjb2xvcnMyID0ge0NvbG9yLnJlZCwgQ29sb3IueWVsbG93LAogICAgICBDb2xvci5n
cmVlbiwgQ29sb3IuZ3JheSwgQ29sb3IubWFnZW50YX07CiAgICBGbGF0RmllbGQgYmFyR3JhcGgy
ID0gbWFrZUJhckdyYXBoMkQoaGVpZ2h0czIsIDAuMmYsIGNvbG9yczIpOwoKICAgIERpc3BsYXlJ
bXBsSjNEIGQyID0gbmV3IERpc3BsYXlJbXBsSjNEKCJkMiIsIG5ldwpUd29ERGlzcGxheVJlbmRl
cmVySjNEKCkpOwogICAgU2NhbGFyTWFwIHhNYXAyID0gbmV3IFNjYWxhck1hcChCQVJfWCwgRGlz
cGxheS5YQXhpcyk7CiAgICB4TWFwMi5zZXRSYW5nZSgwLCBoZWlnaHRzMi5sZW5ndGgpOwogICAg
ZDIuYWRkTWFwKHhNYXAyKTsKICAgIFNjYWxhck1hcCB5TWFwMiA9IG5ldyBTY2FsYXJNYXAoQkFS
X1ksIERpc3BsYXkuWUF4aXMpOwogICAgeU1hcDIuc2V0UmFuZ2UoMCwgbWF4Mik7CiAgICBkMi5h
ZGRNYXAoeU1hcDIpOwogICAgZDIuYWRkTWFwKG5ldyBTY2FsYXJNYXAoQkFSX1IsIERpc3BsYXku
UmVkKSk7CiAgICBkMi5hZGRNYXAobmV3IFNjYWxhck1hcChCQVJfRywgRGlzcGxheS5HcmVlbikp
OwogICAgZDIuYWRkTWFwKG5ldyBTY2FsYXJNYXAoQkFSX0IsIERpc3BsYXkuQmx1ZSkpOwogICAg
RGF0YVJlZmVyZW5jZUltcGwgcmVmMiA9IG5ldyBEYXRhUmVmZXJlbmNlSW1wbCgicmVmMiIpOwog
ICAgcmVmMi5zZXREYXRhKGJhckdyYXBoMik7CiAgICBkMi5hZGRSZWZlcmVuY2UocmVmMik7CiAg
ICBwYW5lLmFkZChkMi5nZXRDb21wb25lbnQoKSk7CiAgICBkMi5nZXRHcmFwaGljc01vZGVDb250
cm9sKCkuc2V0U2NhbGVFbmFibGUodHJ1ZSk7CgogICAgLy8gM0QgYmFyIGdyYXBoCiAgICBmbG9h
dFtdW10gaGVpZ2h0czMgPSB7CiAgICAgIHs4LCA3LCA1LCAxNCwgOX0sCiAgICAgIHsxMywgMSwg
MTksIDcsIDE2fSwKICAgICAgezYsIDExLCAxMiwgMTMsIDR9CiAgICB9OwogICAgZmxvYXQgbWF4
MyA9IDIwOyAvLyB0b3Agb2YgZ3JhcGgKICAgIENvbG9yIGRhcmtQaW5rID0gQ29sb3IucGluay5k
YXJrZXIoKTsKICAgIENvbG9yIGRhcmtZZWxsb3cgPSBDb2xvci55ZWxsb3cuZGFya2VyKCk7CiAg
ICBDb2xvciBkYXJrTWFnZW50YSA9IENvbG9yLm1hZ2VudGEuZGFya2VyKCk7CiAgICBDb2xvcltd
W10gY29sb3JzMyA9IHsKICAgICAge0NvbG9yLnJlZCwgQ29sb3IueWVsbG93LCBDb2xvci5ncmVl
biwgQ29sb3IuZ3JheSwgQ29sb3IubWFnZW50YX0sCiAgICAgIHtDb2xvci5ibHVlLCBDb2xvci53
aGl0ZSwgQ29sb3Iub3JhbmdlLCBDb2xvci5waW5rLCBDb2xvci5saWdodEdyYXl9LAogICAgICB7
Q29sb3IuY3lhbiwgQ29sb3IuZGFya0dyYXksIGRhcmtZZWxsb3csIGRhcmtQaW5rLCBkYXJrTWFn
ZW50YX0KICAgIH07CiAgICBGbGF0RmllbGQgYmFyR3JhcGgzID0gbWFrZUJhckdyYXBoM0QoaGVp
Z2h0czMsIDAuMmYsIGNvbG9yczMpOwoKICAgIERpc3BsYXlJbXBsSjNEIGQzID0gbmV3IERpc3Bs
YXlJbXBsSjNEKCJkMyIpOwogICAgU2NhbGFyTWFwIHhNYXAzID0gbmV3IFNjYWxhck1hcChCQVJf
WCwgRGlzcGxheS5YQXhpcyk7CiAgICB4TWFwMy5zZXRSYW5nZSgwLCBoZWlnaHRzMy5sZW5ndGgp
OwogICAgZDMuYWRkTWFwKHhNYXAzKTsKICAgIFNjYWxhck1hcCB5TWFwMyA9IG5ldyBTY2FsYXJN
YXAoQkFSX1ksIERpc3BsYXkuWUF4aXMpOwogICAgeU1hcDMuc2V0UmFuZ2UoMCwgaGVpZ2h0czNb
MF0ubGVuZ3RoKTsKICAgIGQzLmFkZE1hcCh5TWFwMyk7CiAgICBTY2FsYXJNYXAgek1hcDMgPSBu
ZXcgU2NhbGFyTWFwKEJBUl9aLCBEaXNwbGF5LlpBeGlzKTsKICAgIHpNYXAzLnNldFJhbmdlKDAs
IG1heDMpOwogICAgZDMuYWRkTWFwKHpNYXAzKTsKICAgIGQzLmFkZE1hcChuZXcgU2NhbGFyTWFw
KEJBUl9SLCBEaXNwbGF5LlJlZCkpOwogICAgZDMuYWRkTWFwKG5ldyBTY2FsYXJNYXAoQkFSX0cs
IERpc3BsYXkuR3JlZW4pKTsKICAgIGQzLmFkZE1hcChuZXcgU2NhbGFyTWFwKEJBUl9CLCBEaXNw
bGF5LkJsdWUpKTsKICAgIERhdGFSZWZlcmVuY2VJbXBsIHJlZjMgPSBuZXcgRGF0YVJlZmVyZW5j
ZUltcGwoInJlZjMiKTsKICAgIHJlZjMuc2V0RGF0YShiYXJHcmFwaDMpOwogICAgZDMuYWRkUmVm
ZXJlbmNlKHJlZjMpOwogICAgcGFuZS5hZGQoZDMuZ2V0Q29tcG9uZW50KCkpOwogICAgZDMuZ2V0
R3JhcGhpY3NNb2RlQ29udHJvbCgpLnNldFNjYWxlRW5hYmxlKHRydWUpOwoKICAgIERpbWVuc2lv
biBzcyA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCk7CiAgICBp
bnQgdyA9IHNzLndpZHRoIC0gMTAwOwogICAgZnJhbWUuc2V0Qm91bmRzKDUwLCA1MCwgdywgdyAv
IDIpOwogICAgZnJhbWUuc2hvdygpOwogIH0KCn0KCk9uIDYvNC8wNiwgo3VrYXN6IEJyemV6b3dz
a2kgPGtydXRueUBkczUuYWdoLmVkdS5wbD4gd3JvdGU6Cj4KPiBIaSwKPiBGaXJzdCBvZiBhbGwg
dGhhbmtzIGZvciB5b3VyIGhlbHAuCj4KPiBVbmZvcnR1bmVseSBteSB3ZWFrIGtub3dsZWRnZSBh
Ym91dCBWaXNBRCBsaWJyYXJ5IGNhdXNlcyB0aGF0IEkndmUgYQo+IHJlYWxseSBiaWcgcHJvYmxl
bSB3aXRoIHVuZGVyc3RhbmRpbmcgeW91ciBzb2x1dGlvbiBhYm91dCBCYXIgUGxvdAo+IChzb2xp
ZCBiYXIgd2lsbCBiZSB3ZWxjb21lZCBiZWNhdXNlIGl0IHdpbGwgYmUgcHJlc2VudGVkIGluIHN0
ZXJlbykKPiBwcm9ibGVtLgo+IEkndmUgdHJpZWQgdG8gY29uc3RydWN0IEZsYXRGaWVsZCB3aXRo
IFVuaW9uU2V0IGRvbWFpbiBhY2NvcmRpbmdseSB0bwo+IHRoZSBEZWxhdW5heVRlc3QgZXhhbXBs
ZSwgYnV0IHdpdGggbm8gcmVzdWx0Li4uIEkndmUgYSBwcm9ibGVtIHdpdGgKPiB1bmRlcnN0YW50
aW5nIHRoaXMgZXhhbXBsZSBzbyBJIHRoaW5rIHRoaXMgaXMgbWFqb3IgcHJvYmxlbS4uLgo+IEFs
bCBJIG5lZWQgaXMgdGhlIHNpbXBsZXN0IHdheSB0byBjb25zdHJ1Y3QgQmFyIFBsb3QgaW4gVmlz
QUQuLi4gSSB2ZXJ5Cj4gYXBwcmljaWF0ZSB5b3VyIGhlbHAgdGlwcyBidXQgZm9yIG1lIGFueSB3
b3JraW5nIHZlcnkgc2ltcGxlIGV4YW1wbGUKPiB3aWxsIGJlIGJldHRlciBJIHRoaW5rLgo+IEFs
bCBJJ3ZlIGNyZWF0ZWQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG1lc3NhZ2UuLi4uIChmYWls
cyB3aXRoCj4gRXhjZXB0aW9uIGluIHRocmVhZCAibWFpbiIgdmlzYWQuRmllbGRFeGNlcHRpb246
IHNldFNhbXBsZXM6IGJhZCBhcnJheQo+IGxlbmd0aCkuCj4gSWYgeW91IGNhbiBnaXZlIG1lIGFu
eSBhZHZpY2UgSSB3aWxsIGJlIGdyYXRlZnVsLgo+Cj4gVGhhbmtzIGluIGFkdmFuY2UsCj4gTHVr
YXN6Cj4KPgo+ICAgICAgICAgUmVhbFR5cGUgeCA9IFJlYWxUeXBlLmdldFJlYWxUeXBlKCJ4Iik7
Cj4gICAgICAgICBSZWFsVHlwZSB5ID0gUmVhbFR5cGUuZ2V0UmVhbFR5cGUoInkiKTsKPiAgICAg
ICAgIFJlYWxUeXBlIHogPSBSZWFsVHlwZS5nZXRSZWFsVHlwZSgieiIpOwo+ICAgICAgICAgUmVh
bFR1cGxlVHlwZSB4eXogPSBuZXcgUmVhbFR1cGxlVHlwZSh4LCB5LCB6KTsKPiAgICAgICAgIGZs
b2F0W11bXSBzYW1wbGVzID0gbmV3IGZsb2F0WzNdWzZdOwo+ICAgICAgICAgR3JpZGRlZDNEU2V0
W10gZ3JpZGRlZDNEU2V0cyA9IG5ldyBHcmlkZGVkM0RTZXRbNl07Cj4gICAgICAgICBmb3IoaW50
IGk9MDsgaTxncmlkZGVkM0RTZXRzLmxlbmd0aDsgaSsrKSB7Cj4gICAgICAgICAgICAgZ3JpZGRl
ZDNEU2V0c1tpXSA9IG5ldyBHcmlkZGVkM0RTZXQoeHl6LCBzYW1wbGVzLCAxLCA2KTsKPiAgICAg
ICAgIH0KPgo+ICAgICAgICAgVW5pb25TZXQgdW5pb25TZXQgPSBuZXcgVW5pb25TZXQoeHl6LCBn
cmlkZGVkM0RTZXRzKTsKPiAgICAgICAgIERhdGFSZWZlcmVuY2UgZGF0YVJlZmVyZW5jZSA9IG5l
dwo+IERhdGFSZWZlcmVuY2VJbXBsKCJkYXRhUmVmZXJlbmNlIik7Cj4gICAgICAgICBmbG9hdFtd
W10gc2FtcGxlczIgPSBuZXcgZmxvYXRbMV1bMTJdOwo+ICAgICAgICAgLy9mb3IoaW50IGk9MDsg
aTxzYW1wbGVzMi5sZW5ndGg7IGkrKykgewo+ICAgICAgICAgLy8gICAgc2FtcGxlczJbaV1bMF0g
PSBpOwo+ICAgICAgICAgLy99Cj4gICAgICAgICBSZWFsVHlwZSB2ID0gUmVhbFR5cGUuZ2V0UmVh
bFR5cGUoInZhbHVlIik7Cj4gICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gbmV3
IEZ1bmN0aW9uVHlwZSh4eXosIHYpOwo+ICAgICAgICAgRmxhdEZpZWxkIGZsYXRGaWVsZCA9IG5l
dyBGbGF0RmllbGQoZnVuY3Rpb25UeXBlLCB1bmlvblNldCk7Cj4gICAgICAgICBpbnQgZG9tYWlu
RGltZW5zaW9uID0gZmxhdEZpZWxkLmdldERvbWFpbkRpbWVuc2lvbigpOwo+ICAgICAgICAgaW50
IHJhbmdlRGltZW5zaW9uID0gZmxhdEZpZWxkLmdldFJhbmdlRGltZW5zaW9uKCk7Cj4KPiAgICAg
ICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9tYWluRGltZW5zaW9uOiAiICsgZG9tYWluRGltZW5z
aW9uICsgIlxuIgo+ICsgInJhbmdlRGltZW5zaW9uOiAiICsgcmFuZ2VEaW1lbnNpb24gKyAiXG4i
KTsKPiAgICAgICAgIGZsYXRGaWVsZC5zZXRTYW1wbGVzKHNhbXBsZXMyLCBmYWxzZSk7ICAgLy90
aGVyZSBpcyBzb21ldGhpbmcKPiB3cm9uZwo+ICAgICAgICAgZGF0YVJlZmVyZW5jZS5zZXREYXRh
KGZsYXRGaWVsZCk7Cj4KPiAgICAgICAgIERpc3BsYXlJbXBsIGRpc3BsYXkgPSBuZXcgRGlzcGxh
eUltcGxKM0QoImltYWdlIGRpc3BsYXkiKTsKPiAgICAgICAgIGRpc3BsYXkuYWRkTWFwKG5ldyBT
Y2FsYXJNYXAoeCwgRGlzcGxheS5YQXhpcykpOwo+ICAgICAgICAgZGlzcGxheS5hZGRNYXAobmV3
IFNjYWxhck1hcCh5LCBEaXNwbGF5LllBeGlzKSk7Cj4gICAgICAgICBkaXNwbGF5LmFkZE1hcChu
ZXcgU2NhbGFyTWFwKHosIERpc3BsYXkuWkF4aXMpKTsKPiAgICAgICAgIGRpc3BsYXkuYWRkTWFw
KG5ldyBTY2FsYXJNYXAodiwgRGlzcGxheS5SR0IpKTsKPgo
More information about the visad
mailing list