OyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2CjsgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseSBhbmQgR2lsbGVzIFZvbGxhbnQuCjsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBtb2RpZml5aW5nIHRoZSBsb25nZXN0X21hdGNoCjsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMKOwo7ICAgICAgICAgaHR0cDovL3d3dy56bGliLm5ldAo7ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbAo7ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAo7CjsgRm9yIFZpc3VhbCBDKysgNC54IGFuZCBoaWdoZXIgYW5kIE1MIDYueCBhbmQgaGlnaGVyCjsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsKOyAgIG1sLmV4ZSBpcyBhbHNvIGRpc3RyaWJ1dGVkIGluIGh0dHA6Ly93d3cubWFzbTMyLmNvbS9tYXNtZGwuaHRtCjsgICAgYW5kIGluIFZDKysyMDAzIHRvb2xraXQgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS92aXN1YWxjL3ZjdG9vbGtpdDIwMDMvCjsKOyB0aGlzIGZpbGUgY29udGFpbiB0d28gaW1wbGVtZW50YXRpb24gb2YgbG9uZ2VzdF9tYXRjaAo7CjsgIGxvbmdlc3RfbWF0Y2hfN2ZmZiA6IHdyaXR0ZW4gMTk5NiBieSBHaWxsZXMgVm9sbGFudCBvcHRpbWl6ZWQgZm9yIAo7ICAgICAgICAgICAgZmlyc3QgUGVudGl1bS4gQXNzdW1lIHMtPndfbWFzayA9PSAweDdmZmYKOyAgbG9uZ2VzdF9tYXRjaF82ODYgOiB3cml0dGVuIGJ5IEJyaWFuIHJhaXRlciAoMTk5OCksIG9wdGltaXplZCBmb3IgUGVudGl1bSBQcm8KOwo7ICBmb3IgdXNpbmcgYW4gc2VlbWJseSB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2gsIHlvdSBuZWVkIGRlZmluZSBBU01WIGluIHByb2plY3QKOyAgVGhlcmUgaXMgdHdvIHdheSBpbiB1c2luZyBndm1hdDMyLmFzbQo7CjsgIEEpIFN1Z2dlc3RlZCBtZXRob2QKOyAgICBpZiB5b3Ugd2FudCBpbmNsdWRlIGJvdGggbG9uZ2VzdF9tYXRjaF83ZmZmIGFuZCBsb25nZXN0X21hdGNoXzY4Ngo7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcKOyAgICAgICAgICAgbWwgL2NvZmYgL1ppIC9GbGd2bWF0MzIubHN0IC9jIGd2bWF0MzIuYXNtCjsgICAgYW5kIGluY2x1ZGUgZ3ZtYXQzMmMuYyBpbiB5b3VyIHByb2plY3QKOyAgICBpZiB5b3UgaGF2ZSBhbiBvbGQgY3B1ICgzODYsNDg2IG9yIGZpcnN0IFBlbnRpdW0pIGFuZCBzLT53X21hc2s9PTB4N2ZmZiwKOyAgICAgICAgbG9uZ2VzdF9tYXRjaF83ZmZmIHdpbGwgYmUgdXNlZAo7ICAgIGlmIHlvdSBoYXZlIGEgbW9yZSBtb2Rlcm4gQ1BVIChQZW50aXVtIFBybywgSUkgYW5kIGhpZ2hlcikKOyAgICAgICAgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkCjsgICAgb24gb2xkIGNwdSB3aXRoIHMtPndfbWFzayE9MHg3ZmZmLCBsb25nZXN0X21hdGNoXzY4NiB3aWxsIGJlIHVzZWQsCjsgICAgICAgIGJ1dCB0aGlzIGlzIG5vdCBhIHNpdGF0aW9uIHlvdSdsbCBmaW5kIG9mdGVuCjsKOyAgQikgQWx0ZXJuYXRpdmUKOyAgICBpZiB5b3UgYXJlIG5vdCBpbnRlcnJlc2VkIGluIG9sZCBjcHUgcGVyZm9ybWFuY2UgYW5kIHdhbnQgdGhlIHNtYWxsZXIKOyAgICAgICBiaW5hcmllcyBwb3NzaWJsZQo7CjsgICAgY29tcGlsZSB0aGUgYXNtIGZpbGUgcnVubmluZwo7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsZ3ZtYXQzMi5sc3QgL0ROT09MRFBFTlRJVU1DT0RFIGd2bWF0MzIuYXNtCjsgICAgYW5kIGRvIG5vdCBpbmNsdWRlIGd2bWF0MzJjLmMgaW4geW91ciBwcm9qZWN0IChvdSBkZWZpbmUgYWxzbyAKOyAgICAgICAgICAgICAgTk9PTERQRU5USVVNQ09ERSkKOwo7IG5vdGUgOiBhcyBJIGtub3duLCBsb25nZXN0X21hdGNoXzY4NiBpcyB2ZXJ5IGZhc3RlciB0aGFuIGxvbmdlc3RfbWF0Y2hfN2ZmZgo7ICAgICAgICBvbiBwZW50aXVtIFByby9JSS9JSUksIGZhc3RlciAoYnV0IGxlc3MpIGluIFA0LCBidXQgaXQgc2VlbQo7ICAgICAgICBsb25nZXN0X21hdGNoXzdmZmYgY2FuIGJlIGZhc3RlciAodmVyeSB2ZXJ5IGxpdHRlKSBvbiBBTUQgQXRobG9uNjQvSzgKOwo7IHNlZSBiZWxvdyA6IHpsaWIxMjIyYWRkIG11c3QgYmUgYWRqdXN0ZXIgaWYgeW91IHVzZSBhIHpsaWIgdmVyc2lvbiA8IDEuMi4yLjIKCjt1SW50IGxvbmdlc3RfbWF0Y2hfN2ZmZihzLCBjdXJfbWF0Y2gpCjsgICAgZGVmbGF0ZV9zdGF0ZSAqczsKOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KCiAgICBOYlN0YWNrICAgICAgICAgZXF1ICAgICA3NgogICAgY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdCiAgICBzdHJfcyAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stNF0KOyA1IGR3b3JkIG9uIHRvcCAocmV0LGVicCxlc2ksZWRpLGVieCkKICAgIGFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQogICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQogICAgcHVzaGVkaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTE2XQogICAgcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQogICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQoKICAgIGNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdCiAgICBsaW1pdCAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTMyXQogICAgYmVzdF9sZW4gICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zNl0KICAgIHdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdCiAgICBwcmV2ICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ0XQogICAgc2Nhbl9zdGFydCAgICAgIGVxdSAgICAgIHdvcmQgcHRyIFtlc3ArTmJTdGFjay00OF0KICAgIHdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdCiAgICBtYXRjaF9zdGFydF9wdHIgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTU2XQogICAgbmljZV9tYXRjaCAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02MF0KICAgIHNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdCgogICAgd2luZG93bGVuICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02OF0KICAgIG1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdCiAgICBzdHJlbmQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTc2XQogICAgTmJTdGFja0FkZCAgICAgIGVxdSAgICAgKE5iU3RhY2stMjQpCgogICAgLjM4NnAKCiAgICBuYW1lICAgIGd2bWF0Y2gKICAgIC5NT0RFTCAgRkxBVAoKCgo7ICBhbGwgdGhlICt6bGliMTIyMmFkZCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIGZpZWxkcwo7ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgdXNlICJ6bGliMTIyMmFkZCBlcXUgKC00KSIpLgo7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4KOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuCgogICAgemxpYjEyMjJhZGQgICAgICAgICBlcXUgICAgIDgKCjsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQogICAgZGVwX2NoYWluX2xlbmd0aCAgICBlcXUgICAgIDc0aCt6bGliMTIyMmFkZAogICAgZGVwX3dpbmRvdyAgICAgICAgICBlcXUgICAgIDMwaCt6bGliMTIyMmFkZAogICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDY0aCt6bGliMTIyMmFkZAogICAgZGVwX3ByZXZfbGVuZ3RoICAgICBlcXUgICAgIDcwaCt6bGliMTIyMmFkZAogICAgZGVwX25pY2VfbWF0Y2ggICAgICBlcXUgICAgIDg4aCt6bGliMTIyMmFkZAogICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDI0aCt6bGliMTIyMmFkZAogICAgZGVwX3ByZXYgICAgICAgICAgICBlcXUgICAgIDM4aCt6bGliMTIyMmFkZAogICAgZGVwX3dfbWFzayAgICAgICAgICBlcXUgICAgIDJjaCt6bGliMTIyMmFkZAogICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDg0aCt6bGliMTIyMmFkZAogICAgZGVwX21hdGNoX3N0YXJ0ICAgICBlcXUgICAgIDY4aCt6bGliMTIyMmFkZAogICAgZGVwX2xvb2thaGVhZCAgICAgICBlcXUgICAgIDZjaCt6bGliMTIyMmFkZAoKCl9URVhUICAgICAgICAgICAgICAgICAgIHNlZ21lbnQKCklGREVGIE5PVU5ERVJMSU5FCiAgIElGREVGIE5PT0xEUEVOVElVTUNPREUKICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoCiAgICAgICAgICAgIHB1YmxpYyAgbWF0Y2hfaW5pdAogICBFTFNFICAgICAgICAgICAgCiAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaF83ZmZmCiAgICAgICAgICAgIHB1YmxpYyAgY3B1ZGV0ZWN0MzIKICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzY4NgogICBFTkRJRgpFTFNFCiAgIElGREVGIE5PT0xEUEVOVElVTUNPREUKICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaAogICAgICAgICAgICBwdWJsaWMgIF9tYXRjaF9pbml0CiAgIEVMU0UKICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaF83ZmZmCiAgICAgICAgICAgIHB1YmxpYyAgX2NwdWRldGVjdDMyCiAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfNjg2CiAgIEVORElGCkVORElGCgogICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OAogICAgTUlOX01BVENIICAgICAgICAgICBlcXUgICAgIDMKICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQoKCgpJRk5ERUYgTk9PTERQRU5USVVNQ09ERQpJRkRFRiBOT1VOREVSTElORQpsb25nZXN0X21hdGNoXzdmZmYgICBwcm9jIG5lYXIKRUxTRQpfbG9uZ2VzdF9tYXRjaF83ZmZmICBwcm9jIG5lYXIKRU5ESUYKCiAgICBtb3YgICAgIGVkeCxbZXNwKzRdCgoKCiAgICBwdXNoICAgIGVicAogICAgcHVzaCAgICBlZGkKICAgIHB1c2ggICAgZXNpCiAgICBwdXNoICAgIGVieAoKICAgIHN1YiAgICAgZXNwLE5iU3RhY2tBZGQKCjsgaW5pdGlhbGl6ZSBvciBjaGVjayB0aGUgdmFyaWFibGVzIHVzZWQgaW4gbWF0Y2guYXNtLgogICAgbW92ICAgICBlYnAsZWR4Cgo7IGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGgKOyBpZiAocHJldl9sZW5ndGg+PWdvb2RfbWF0Y2gpIGNoYWluX2xlbmd0aCA+Pj0gMgogICAgbW92ICAgICBlZHgsW2VicCtkZXBfY2hhaW5fbGVuZ3RoXQogICAgbW92ICAgICBlYngsW2VicCtkZXBfcHJldl9sZW5ndGhdCiAgICBjbXAgICAgIFtlYnArZGVwX2dvb2RfbWF0Y2hdLGVieAogICAgamEgICAgICBub3NocgogICAgc2hyICAgICBlZHgsMgpub3NocjoKOyB3ZSBpbmNyZW1lbnQgY2hhaW5fbGVuZ3RoIGJlY2F1c2UgaW4gdGhlIGFzbSwgdGhlIC0tY2hhaW5fbGVuZ2h0IGlzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AKICAgIGluYyAgICAgZWR4CiAgICBtb3YgICAgIGVkaSxbZWJwK2RlcF9uaWNlX21hdGNoXQogICAgbW92ICAgICBjaGFpbl9sZW5ndGgsZWR4CiAgICBtb3YgICAgIGVheCxbZWJwK2RlcF9sb29rYWhlYWRdCiAgICBjbXAgICAgIGVheCxlZGkKOyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKICAgIGphZSAgICAgbm9sb29rYWhlYWRuaWNlbWF0Y2gKICAgIG1vdiAgICAgZWRpLGVheApub2xvb2thaGVhZG5pY2VtYXRjaDoKOyBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoCiAgICBtb3YgICAgIGJlc3RfbGVuLGVieAoKOyB3aW5kb3cgPSBzLT53aW5kb3cKICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dpbmRvd10KICAgIG1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQogICAgbW92ICAgICB3aW5kb3csZXNpCgogICAgbW92ICAgICBuaWNlX21hdGNoLGVkaQo7IHNjYW4gPSB3aW5kb3cgKyBzdHJzdGFydAogICAgYWRkICAgICBlc2ksZWN4CiAgICBtb3YgICAgIHNjYW4sZXNpCjsgZHggPSAqd2luZG93CiAgICBtb3YgICAgIGR4LHdvcmQgcHRyIFtlc2ldCjsgYnggPSAqKHdpbmRvdytiZXN0X2xlbi0xKQogICAgbW92ICAgICBieCx3b3JkIHB0ciBbZXNpK2VieC0xXQogICAgYWRkICAgICBlc2ksTUFYX01BVENILTEKOyBzY2FuX3N0YXJ0ID0gKnNjYW4KICAgIG1vdiAgICAgc2Nhbl9zdGFydCxkeAo7IHN0cmVuZCA9IHNjYW4gKyBNQVhfTUFUQ0gtMQogICAgbW92ICAgICBzdHJlbmQsZXNpCjsgYnggPSBzY2FuX2VuZCA9ICood2luZG93K2Jlc3RfbGVuLTEpCgo7ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KOyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKCiAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93X3NpemVdCiAgICBzdWIgICAgIGVzaSxNSU5fTE9PS0FIRUFECjsgaGVyZSBlc2kgPSBNQVhfRElTVChzKQogICAgc3ViICAgICBlY3gsZXNpCiAgICBqYSAgICAgIG5vZGlzdAogICAgeG9yICAgICBlY3gsZWN4Cm5vZGlzdDoKICAgIG1vdiAgICAgbGltaXQsZWN4Cgo7IHByZXYgPSBzLT5wcmV2CiAgICBtb3YgICAgIGVkeCxbZWJwK2RlcF9wcmV2XQogICAgbW92ICAgICBwcmV2LGVkeAoKOwogICAgbW92ICAgICBlZHgsZHdvcmQgcHRyIFtlYnArZGVwX21hdGNoX3N0YXJ0XQogICAgbW92ICAgICBicCxzY2FuX3N0YXJ0CiAgICBtb3YgICAgIGVheCxjdXJfbWF0Y2gKICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWR4CgogICAgbW92ICAgICBlZHgsd2luZG93CiAgICBtb3YgICAgIGVkaSxlZHgKICAgIGFkZCAgICAgZWRpLGJlc3RfbGVuCiAgICBtb3YgICAgIGVzaSxwcmV2CiAgICBkZWMgICAgIGVkaQo7IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuIC0xCiAgICBtb3YgICAgIHdpbmRvd2xlbixlZGkKCiAgICBqbXAgICAgIGJlZ2lubG9vcDIKICAgIGFsaWduICAgNAoKOyBoZXJlLCBpbiB0aGUgbG9vcAo7ICAgICAgIGVheCA9IGF4ID0gY3VyX21hdGNoCjsgICAgICAgZWN4ID0gbGltaXQKOyAgICAgICAgYnggPSBzY2FuX2VuZAo7ICAgICAgICBicCA9IHNjYW5fc3RhcnQKOyAgICAgICBlZGkgPSB3aW5kb3dsZW4gKHdpbmRvdyArIGJlc3RfbGVuIC0xKQo7ICAgICAgIGVzaSA9IHByZXYKCgo7Ly8gaGVyZTsgY2hhaW5fbGVuZ3RoIDw9MTYKbm9ybWFsYmVnMGFkZDE2OgogICAgYWRkICAgICBjaGFpbl9sZW5ndGgsMTYKICAgIGp6ICAgICAgZXhpdGxvb3AKbm9ybWFsYmVnMDoKICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngKICAgIGplICAgICAgbm9ybWFsYmVnMm5vcm9sbApyY29udGxhYm5vcm9sbDoKOyBjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXQogICAgYW5kICAgICBlYXgsN2ZmZmgKICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcAogICAgY21wICAgICBlY3gsZWF4CiAgICBqbmIgICAgIGV4aXRsb29wCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3AKICAgIGRlYyAgICAgY2hhaW5fbGVuZ3RoCiAgICBqbnogICAgIG5vcm1hbGJlZzAKICAgIGptcCAgICAgZXhpdGxvb3AKCm5vcm1hbGJlZzJub3JvbGw6CjsgaWYgKHNjYW5fc3RhcnQ9PSooY3VyX21hdGNoK3dpbmRvdykpIGdvdG8gbm9ybWFsYmVnMgogICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQogICAgam5lICAgICByY29udGxhYm5vcm9sbAogICAgam1wICAgICBub3JtYWxiZWcyCgpjb250bG9vcDM6CiAgICBtb3YgICAgIGVkaSx3aW5kb3dsZW4KCjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10KICAgIGFuZCAgICAgZWF4LDdmZmZoCiAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3AKICAgIGNtcCAgICAgZWN4LGVheApqbmJleGl0bG9vcHNob3J0MToKICAgIGpuYiAgICAgZXhpdGxvb3AKOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcAoKCjsgYmVnaW4gdGhlIG1haW4gbG9vcApiZWdpbmxvb3AyOgogICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYrMQo7IGlmIGNoYWluX2xlbmd0aCA8PTE2LCBkb24ndCB1c2UgdGhlIHVucm9sbGVkIGxvb3AKICAgIGpuYSAgICAgbm9ybWFsYmVnMGFkZDE2CgpkbzE2OgogICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAogICAgamUgICAgICBub3JtYWxiZWcyZGMwCgptYWNjbiAgIE1BQ1JPICAgbGFiCiAgICBhbmQgICAgIGVheCw3ZmZmaAogICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdCiAgICBjbXAgICAgIGVjeCxlYXgKICAgIGpuYiAgICAgZXhpdGxvb3AKICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngKICAgIGplICAgICAgbGFiCiAgICBFTkRNCgpyY29udGxvb3AwOgogICAgbWFjY24gICBub3JtYWxiZWcyZGMxCgpyY29udGxvb3AxOgogICAgbWFjY24gICBub3JtYWxiZWcyZGMyCgpyY29udGxvb3AyOgogICAgbWFjY24gICBub3JtYWxiZWcyZGMzCgpyY29udGxvb3AzOgogICAgbWFjY24gICBub3JtYWxiZWcyZGM0CgpyY29udGxvb3A0OgogICAgbWFjY24gICBub3JtYWxiZWcyZGM1CgpyY29udGxvb3A1OgogICAgbWFjY24gICBub3JtYWxiZWcyZGM2CgpyY29udGxvb3A2OgogICAgbWFjY24gICBub3JtYWxiZWcyZGM3CgpyY29udGxvb3A3OgogICAgbWFjY24gICBub3JtYWxiZWcyZGM4CgpyY29udGxvb3A4OgogICAgbWFjY24gICBub3JtYWxiZWcyZGM5CgpyY29udGxvb3A5OgogICAgbWFjY24gICBub3JtYWxiZWcyZGMxMAoKcmNvbnRsb29wMTA6CiAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzExCgpyY29udGxvb3AxMToKICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTIKCnJjb250bG9vcDEyOgogICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMwoKcmNvbnRsb29wMTM6CiAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE0CgpyY29udGxvb3AxNDoKICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTUKCnJjb250bG9vcDE1OgogICAgYW5kICAgICBlYXgsN2ZmZmgKICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQogICAgY21wICAgICBlY3gsZWF4CiAgICBqbmIgICAgIGV4aXRsb29wCgogICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYKICAgIGphICAgICAgZG8xNgogICAgam1wICAgICBub3JtYWxiZWcwYWRkMTYKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cgpub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViCjsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCiAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdCjsgaWYgKG1hdGNoICE9IHNjYW5fc3RhcnQpIGdvdG8gcmNvbnRsYWIKICAgIGpuZSAgICAgcmNvbnRsYWIKOyBjYWxjdWxhdGUgdGhlIGdvb2QgY2hhaW5fbGVuZ3RoLCBhbmQgd2UnbGwgY29tcGFyZSBzY2FuIGFuZCBtYXRjaCBzdHJpbmcKICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1YgogICAgam1wICAgICBpc2VxCiAgICBFTkRNCgoKbm9ybWFsYmVnMmRjMTE6CiAgICBub3JtYmVnIHJjb250bG9vcDExLDExCgpub3JtYWxiZWcyZGMxMjoKICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTIsMTIKCm5vcm1hbGJlZzJkYzEzOgogICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMywxMwoKbm9ybWFsYmVnMmRjMTQ6CiAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0Cgpub3JtYWxiZWcyZGMxNToKICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTUsMTUKCm5vcm1hbGJlZzJkYzEwOgogICAgbm9ybWJlZyByY29udGxvb3AxMCwxMAoKbm9ybWFsYmVnMmRjOToKICAgIG5vcm1iZWcgcmNvbnRsb29wOSw5Cgpub3JtYWxiZWcyZGM4OgogICAgbm9ybWJlZyByY29udGxvb3A4LDgKCm5vcm1hbGJlZzJkYzc6CiAgICBub3JtYmVnIHJjb250bG9vcDcsNwoKbm9ybWFsYmVnMmRjNjoKICAgIG5vcm1iZWcgcmNvbnRsb29wNiw2Cgpub3JtYWxiZWcyZGM1OgogICAgbm9ybWJlZyByY29udGxvb3A1LDUKCm5vcm1hbGJlZzJkYzQ6CiAgICBub3JtYmVnIHJjb250bG9vcDQsNAoKbm9ybWFsYmVnMmRjMzoKICAgIG5vcm1iZWcgcmNvbnRsb29wMywzCgpub3JtYWxiZWcyZGMyOgogICAgbm9ybWJlZyByY29udGxvb3AyLDIKCm5vcm1hbGJlZzJkYzE6CiAgICBub3JtYmVnIHJjb250bG9vcDEsMQoKbm9ybWFsYmVnMmRjMDoKICAgIG5vcm1iZWcgcmNvbnRsb29wMCwwCgoKOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQKCm5vcm1hbGJlZzI6CiAgICBtb3YgICAgIGVkaSx3aW5kb3cKCiAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkaStlYXhdCiAgICBqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUKCmlzZXE6CjsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCjsgYW5kIChtYXRjaCA9PSBzY2FuX3N0YXJ0KQoKICAgIG1vdiAgICAgZWRpLGVkeAogICAgbW92ICAgICBlc2ksc2NhbiAgICAgICAgICAgICAgICAgICAgOyBlc2kgPSBzY2FuCiAgICBhZGQgICAgIGVkaSxlYXggICAgICAgICAgICAgICAgICAgICA7IGVkaSA9IHdpbmRvdyArIGN1cl9tYXRjaCA9IG1hdGNoCgogICAgbW92ICAgICBlZHgsW2VzaSszXSAgICAgICAgICAgICAgICAgOyBjb21wYXJlIG1hbnVhbGx5IGR3b3JkIGF0IG1hdGNoKzMKICAgIHhvciAgICAgZWR4LFtlZGkrM10gICAgICAgICAgICAgICAgIDsgYW5kIHNjYW4gKzMKCiAgICBqeiAgICAgIGJlZ2luY29tcGFyZSAgICAgICAgICAgICAgICA7IGlmIGVxdWFsLCBnbyB0byBsb25nIGNvbXBhcmUKCjsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQogICAgb3IgICAgICBkbCxkbAogICAgamUgICAgICBlcTFycgogICAgbW92ICAgICBlc2ksMwogICAgam1wICAgICB0cmZpbnZhbAplcTFycjoKICAgIG9yICAgICAgZHgsZHgKICAgIGplICAgICAgZXExCgogICAgbW92ICAgICBlc2ksNAogICAgam1wICAgICB0cmZpbnZhbAplcTE6CiAgICBhbmQgICAgIGVkeCwwZmZmZmZmaAogICAganogICAgICBlcTExCiAgICBtb3YgICAgIGVzaSw1CiAgICBqbXAgICAgIHRyZmludmFsCmVxMTE6CiAgICBtb3YgICAgIGVzaSw2CiAgICBqbXAgICAgIHRyZmludmFsCgpiZWdpbmNvbXBhcmU6CiAgICA7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUKICAgIGFkZCAgICAgZWRpLDYKICAgIGFkZCAgICAgZXNpLDYKICAgIG1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMKICAgIHJlcGUgICAgY21wc2QgICAgICAgICAgICAgICAgICAgICAgIDsgbG9vcCB1bnRpbCBtaXNtYXRjaAoKICAgIGplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gKOyB3ZSBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZQogICAgc3ViICAgICBlc2ksNAogICAgbW92ICAgICBlZHgsW2VkaS00XQogICAgeG9yICAgICBlZHgsW2VzaV0KCiAgICBvciAgICAgIGRsLGRsCiAgICBqbnogICAgIHRyZmluCiAgICBpbmMgICAgIGVzaQoKICAgIG9yICAgICAgZHgsZHgKICAgIGpueiAgICAgdHJmaW4KICAgIGluYyAgICAgZXNpCgogICAgYW5kICAgICBlZHgsMGZmZmZmZmgKICAgIGpueiAgICAgdHJmaW4KICAgIGluYyAgICAgZXNpCgp0cmZpbjoKICAgIHN1YiAgICAgZXNpLHNjYW4gICAgICAgICAgOyBlc2kgPSBsZW4KdHJmaW52YWw6CjsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcKICAgIGNtcCAgICAgZXNpLGJlc3RfbGVuICAgICAgICA7IGlmIGxlbiA+IGJlc3RfbGVuLCBnbyBuZXdiZXN0bGVuCiAgICBqYSAgICAgIHNob3J0IG5ld2Jlc3RsZW4KOyBub3cgd2UgcmVzdG9yZSBlZHgsIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wCiAgICBtb3YgICAgIGVzaSxwcmV2CiAgICBtb3YgICAgIGVjeCxsaW1pdAogICAgbW92ICAgICBlZHgsd2luZG93CiAgICBqbXAgICAgIGNvbnRsb29wMwoKbmV3YmVzdGxlbjoKICAgIG1vdiAgICAgYmVzdF9sZW4sZXNpICAgICAgICA7IGxlbiBiZWNvbWUgYmVzdF9sZW4KCiAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVheCAgICAgOyBzYXZlIG5ldyBwb3NpdGlvbiBhcyBtYXRjaF9zdGFydAogICAgY21wICAgICBlc2ksbmljZV9tYXRjaCAgICAgIDsgaWYgYmVzdF9sZW4gPj0gbmljZV9tYXRjaCwgZXhpdAogICAgamFlICAgICBleGl0bG9vcAogICAgbW92ICAgICBlY3gsc2NhbgogICAgbW92ICAgICBlZHgsd2luZG93ICAgICAgICAgIDsgcmVzdG9yZSBlZHg9d2luZG93CiAgICBhZGQgICAgIGVjeCxlc2kKICAgIGFkZCAgICAgZXNpLGVkeAoKICAgIGRlYyAgICAgZXNpCiAgICBtb3YgICAgIHdpbmRvd2xlbixlc2kgICAgICAgOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbi0xCiAgICBtb3YgICAgIGJ4LFtlY3gtMV0gICAgICAgICAgOyBieCA9ICooc2NhbitiZXN0X2xlbi0xKSA9IHNjYW5fZW5kCgo7IG5vdyB3ZSByZXN0b3JlIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wIDoKICAgIG1vdiAgICAgZXNpLHByZXYKICAgIG1vdiAgICAgZWN4LGxpbWl0CiAgICBqbXAgICAgIGNvbnRsb29wMwoKZXhpdGxvb3A6CjsgZXhpdCA6IHMtPm1hdGNoX3N0YXJ0PW1hdGNoX3N0YXJ0CiAgICBtb3YgICAgIGVieCxtYXRjaF9zdGFydAogICAgbW92ICAgICBlYnAsc3RyX3MKICAgIG1vdiAgICAgZWN4LGJlc3RfbGVuCiAgICBtb3YgICAgIGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0sZWJ4CiAgICBtb3YgICAgIGVheCxkd29yZCBwdHIgW2VicCtkZXBfbG9va2FoZWFkXQogICAgY21wICAgICBlY3gsZWF4CiAgICBqYSAgICAgIG1pbmV4bG8KICAgIG1vdiAgICAgZWF4LGVjeAptaW5leGxvOgo7IHJldHVybiBtaW4oYmVzdF9sZW4scy0+bG9va2FoZWFkKQoKOyByZXN0b3JlIHN0YWNrIGFuZCByZWdpc3RlciBlYngsZXNpLGVkaSxlYnAKICAgIGFkZCAgICAgZXNwLE5iU3RhY2tBZGQKCiAgICBwb3AgICAgIGVieAogICAgcG9wICAgICBlc2kKICAgIHBvcCAgICAgZWRpCiAgICBwb3AgICAgIGVicAogICAgcmV0CkluZm9BdXRob3I6CjsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhCjsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSEKICAgIGRiICAgICAwZGgsMGFoLCJHVk1hdDMyIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlIHdyaXR0ZW4gMTk5Ni05OCBieSBHaWxsZXMgVm9sbGFudCIsMGRoLDBhaAoKCgpJRkRFRiBOT1VOREVSTElORQpsb25nZXN0X21hdGNoXzdmZmYgICBlbmRwCkVMU0UKX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcApFTkRJRgoKCklGREVGIE5PVU5ERVJMSU5FCmNwdWRldGVjdDMyICAgICBwcm9jIG5lYXIKRUxTRQpfY3B1ZGV0ZWN0MzIgICAgcHJvYyBuZWFyCkVORElGCgogICAgcHVzaCAgICBlYngKCiAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTCiAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MKICAgIG1vdiAgICAgZWN4LCBlYXggICAgICAgIDsgc2F2ZSBvcmlnaW5hbCBFRkxBR1MKICAgIHhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTCiAgICBwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjawogICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCiAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTCiAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCiAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICA7IGNhbpJ0IHRvZ2dsZSBBQyBiaXQsIHByb2Nlc3Nvcj04MDM4NgogICAganogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3NvcgogICAgcHVzaCAgICBlY3gKICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBBQyBiaXQgaW4gRUZMQUdTIGZpcnN0CgogICAgcHVzaGZkCiAgICBwdXNoZmQKICAgIHBvcCAgICAgZWN4CgogICAgbW92ICAgICBlYXgsIGVjeCAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTCiAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUwogICAgcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQogICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUwogICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWAogICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIG9yaWdpbmFsIEVGTEFHUwogICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LAogICAgamUgICAgICBpc19vbGRfNDg2ICAgICAgOyBwcm9jZXNzb3I9b2xkCgogICAgbW92ICAgICBlYXgsMQogICAgZGIgICAgICAwZmgsMGEyaCAgICAgICAgO0NQVUlECgpleGl0Y3B1ZGV0ZWN0OgogICAgcG9wIGVieAogICAgcmV0CgplbmRfY3B1X2lzXzM4NjoKICAgIG1vdiAgICAgZWF4LDAzMDBoCiAgICBqbXAgICAgIGV4aXRjcHVkZXRlY3QKCmlzX29sZF80ODY6CiAgICBtb3YgICAgIGVheCwwNDAwaAogICAgam1wICAgICBleGl0Y3B1ZGV0ZWN0CgpJRkRFRiBOT1VOREVSTElORQpjcHVkZXRlY3QzMiAgICAgZW5kcApFTFNFCl9jcHVkZXRlY3QzMiAgICBlbmRwCkVORElGCkVORElGCgpNQVhfTUFUQ0ggICAgICAgZXF1ICAgICAyNTgKTUlOX01BVENIICAgICAgIGVxdSAgICAgMwpNSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKTUFYX01BVENIXzhfICAgICBlcXUgICAgICgoTUFYX01BVENIICsgNykgQU5EIDBGRkYwaCkKCgo7Ozsgc3RhY2sgZnJhbWUgb2Zmc2V0cwoKY2hhaW5sZW53bWFzayAgIGVxdSAgZXNwICsgMCAgICA7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4KICAgICAgICAgICAgICAgICAgICA7IGxvdyB3b3JkOiBzLT53bWFzawp3aW5kb3cgICAgICBlcXUgIGVzcCArIDQgICAgOyBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdwp3aW5kb3diZXN0bGVuICAgZXF1ICBlc3AgKyA4ICAgIDsgcy0+d2luZG93ICsgYmVzdGxlbgpzY2Fuc3RhcnQgICBlcXUgIGVzcCArIDE2ICAgOyBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCnNjYW5lbmQgICAgIGVxdSAgZXNwICsgMTIgICA7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwpzY2FuYWxpZ24gICBlcXUgIGVzcCArIDIwICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCm5pY2VtYXRjaCAgIGVxdSAgZXNwICsgMjQgICA7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQpiZXN0bGVuICAgICBlcXUgIGVzcCArIDI4ICAgOyBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyCnNjYW4gICAgICAgIGVxdSAgZXNwICsgMzIgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAoKTG9jYWxWYXJzU2l6ZSAgIGVxdSAzNgo7ICAgc2F2ZWQgZWJ4ICAgYnl0ZSBlc3AgKyAzNgo7ICAgc2F2ZWQgZWRpICAgYnl0ZSBlc3AgKyA0MAo7ICAgc2F2ZWQgZXNpICAgYnl0ZSBlc3AgKyA0NAo7ICAgc2F2ZWQgZWJwICAgYnl0ZSBlc3AgKyA0OAo7ICAgcmV0dXJuIGFkZHJlc3MgIGJ5dGUgZXNwICsgNTIKZGVmbGF0ZXN0YXRlICAgIGVxdSAgZXNwICsgNTYgICA7IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKY3VybWF0Y2ggICAgZXF1ICBlc3AgKyA2MAoKOzs7IE9mZnNldHMgZm9yIGZpZWxkcyBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUuIFRoZXNlIG51bWJlcnMKOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUKOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywKOzs7IGNoYW5naW5nIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUgY291bGQgZWFzaWx5IGNhdXNlIHRoaXMKOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQKOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pCgpkc1dTaXplICAgICBlcXUgMzYremxpYjEyMjJhZGQKZHNXTWFzayAgICAgZXF1IDQ0K3psaWIxMjIyYWRkCmRzV2luZG93ICAgIGVxdSA0OCt6bGliMTIyMmFkZApkc1ByZXYgICAgICBlcXUgNTYremxpYjEyMjJhZGQKZHNNYXRjaExlbiAgZXF1IDg4K3psaWIxMjIyYWRkCmRzUHJldk1hdGNoIGVxdSA5Mit6bGliMTIyMmFkZApkc1N0clN0YXJ0ICBlcXUgMTAwK3psaWIxMjIyYWRkCmRzTWF0Y2hTdGFydCAgICBlcXUgMTA0K3psaWIxMjIyYWRkCmRzTG9va2FoZWFkIGVxdSAxMDgremxpYjEyMjJhZGQKZHNQcmV2TGVuICAgZXF1IDExMit6bGliMTIyMmFkZApkc01heENoYWluTGVuICAgZXF1IDExNit6bGliMTIyMmFkZApkc0dvb2RNYXRjaCBlcXUgMTMyK3psaWIxMjIyYWRkCmRzTmljZU1hdGNoIGVxdSAxMzYremxpYjEyMjJhZGQKCgo7OzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQo7OzsgV3JpdHRlbiBmb3IgemxpYiAxLjEuMgo7OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Cjs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAo7OzsKOzs7IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAo7OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCjtHTE9CQUwgX2xvbmdlc3RfbWF0Y2gsIF9tYXRjaF9pbml0CgoKO1NFQ1RJT04gICAgLnRleHQKCjs7OyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQoKO19sb25nZXN0X21hdGNoOgpJRkRFRiBOT09MRFBFTlRJVU1DT0RFCiAgICBJRkRFRiBOT1VOREVSTElORQogICAgbG9uZ2VzdF9tYXRjaCAgICAgICBwcm9jIG5lYXIKICAgIEVMU0UKICAgIF9sb25nZXN0X21hdGNoICAgICAgcHJvYyBuZWFyCiAgICBFTkRJRgpFTFNFCiAgICBJRkRFRiBOT1VOREVSTElORQogICAgbG9uZ2VzdF9tYXRjaF82ODYgICBwcm9jIG5lYXIKICAgIEVMU0UKICAgIF9sb25nZXN0X21hdGNoXzY4NiAgcHJvYyBuZWFyCiAgICBFTkRJRgpFTkRJRgoKOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8KOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLgoKICAgICAgICBwdXNoICAgIGVicAogICAgICAgIHB1c2ggICAgZWRpCiAgICAgICAgcHVzaCAgICBlc2kKICAgICAgICBwdXNoICAgIGVieAogICAgICAgIHN1YiBlc3AsIExvY2FsVmFyc1NpemUKCjs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAo7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQo7OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUKOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuCgogICAgICAgIG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdCiAgICAgICAgbW92IGVjeCwgW2N1cm1hdGNoXQoKOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7Cjs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwo7OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7Cjs7OyB9CgogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1ByZXZMZW5dCiAgICAgICAgbW92IGVieCwgW2VkeCArIGRzR29vZE1hdGNoXQogICAgICAgIGNtcCBlYXgsIGVieAogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1dNYXNrXQogICAgICAgIG1vdiBlYngsIFtlZHggKyBkc01heENoYWluTGVuXQogICAgICAgIGpsICBMYXN0TWF0Y2hHb29kCiAgICAgICAgc2hyIGVieCwgMgpMYXN0TWF0Y2hHb29kOgoKOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4KOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4KOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCjs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55LgoKICAgICAgICBkZWMgZWJ4CiAgICAgICAgc2hsIGVieCwgMTYKICAgICAgICBvciAgZWJ4LCBlYXgKICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngKCjs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTmljZU1hdGNoXQogICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0xvb2thaGVhZF0KICAgICAgICBjbXAgZWJ4LCBlYXgKICAgICAgICBqbCAgTG9va2FoZWFkTGVzcwogICAgICAgIG1vdiBlYngsIGVheApMb29rYWhlYWRMZXNzOiAgbW92IFtuaWNlbWF0Y2hdLCBlYngKCjs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OwoKICAgICAgICBtb3YgZXNpLCBbZWR4ICsgZHNXaW5kb3ddCiAgICAgICAgbW92IFt3aW5kb3ddLCBlc2kKICAgICAgICBtb3YgZWJwLCBbZWR4ICsgZHNTdHJTdGFydF0KICAgICAgICBsZWEgZWRpLCBbZXNpICsgZWJwXQogICAgICAgIG1vdiBbc2Nhbl0sIGVkaQoKOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcKOzs7IGR3b3JkLWFsaWduZWQuCgogICAgICAgIG1vdiBlYXgsIGVkaQogICAgICAgIG5lZyBlYXgKICAgICAgICBhbmQgZWF4LCAzCiAgICAgICAgbW92IFtzY2FuYWxpZ25dLCBlYXgKCjs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/Cjs7OyAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzV1NpemVdCiAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRAogICAgICAgIHN1YiBlYnAsIGVheAogICAgICAgIGpnICBMaW1pdFBvc2l0aXZlCiAgICAgICAgeG9yIGVicCwgZWJwCkxpbWl0UG9zaXRpdmU6Cgo7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CgogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1ByZXZMZW5dCiAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4Cgo7OzsgU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiBlc2kgbG9jYWxseSwgYW5kIGluIGVzaS4KCiAgICAgICAgYWRkIGVzaSwgZWF4CiAgICAgICAgbW92IFt3aW5kb3diZXN0bGVuXSwgZXNpCgo7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47Cjs7OyByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Cjs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsKCiAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGldCiAgICAgICAgbW92IFtzY2Fuc3RhcnRdLCBlYngKICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCiAgICAgICAgbW92IFtzY2FuZW5kXSwgZWJ4CiAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0KCjs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4KCiAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdCiAgICAgICAgam1wIHNob3J0IExvb3BFbnRyeQoKYWxpZ24gNAoKOzs7IGRvIHsKOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKOzs7ICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKOzs7ICAgICBbLi4uXQo7OzsgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Cjs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKOzs7Cjs7OyBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlCjs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbAo7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCjs7Owo7OzsgV2l0aGluIHRoaXMgbG9vcDoKOzs7IGVieCA9IHNjYW5lbmQKOzs7IGVjeCA9IGN1cm1hdGNoCjs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykKOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKOzs7IGVkaSA9IHByZXYKOzs7IGVicCA9IGxpbWl0CgpMb29rdXBMb29wOgogICAgICAgIGFuZCBlY3gsIGVkeAogICAgICAgIG1vdnp4ICAgZWN4LCB3b3JkIHB0ciBbZWRpICsgZWN4KjJdCiAgICAgICAgY21wIGVjeCwgZWJwCiAgICAgICAgamJlIExlYXZlTm93CiAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoCiAgICAgICAganMgIExlYXZlTm93Ckxvb3BFbnRyeTogIG1vdnp4ICAgZWF4LCB3b3JkIHB0ciBbZXNpICsgZWN4IC0gMV0KICAgICAgICBjbXAgZWF4LCBlYngKICAgICAgICBqbnogTG9va3VwTG9vcAogICAgICAgIG1vdiBlYXgsIFt3aW5kb3ddCiAgICAgICAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlYXggKyBlY3hdCiAgICAgICAgY21wIGVheCwgW3NjYW5zdGFydF0KICAgICAgICBqbnogTG9va3VwTG9vcAoKOzs7IFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgoKICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgKCjs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlCjs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlCjs7OyBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kIGVkeCBpcwo7OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCgogICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddCiAgICAgICAgbW92IGVkaSwgW3NjYW5dCiAgICAgICAgYWRkIGVzaSwgZWN4CiAgICAgICAgbW92IGVheCwgW3NjYW5hbGlnbl0KICAgICAgICBtb3YgZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQogICAgICAgIGxlYSBlZGksIFtlZGkgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQogICAgICAgIGxlYSBlc2ksIFtlc2kgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQoKOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwKOzs7IGFkanVzdCBlZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLgo7OzsKOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQo7Ozsgc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQo7Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zCjs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQo7OzsgcG9pbnRlci4gKGVzaSB3aWxsIHN0aWxsIGJlIG1pc2FsaWduZWQgdGhyZWUgdGltZXMgb3V0IG9mIGZvdXIuKQo7OzsKOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQKOzs7IG11Y2ggb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb3JlCjs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKOzs7IHBlcmZvcm1hbmNlLgoKTG9vcENtcHM6CiAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeF0KICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4XQogICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzCiAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeCArIDRdCiAgICAgICAgeG9yIGVheCwgW2VkaSArIGVkeCArIDRdCiAgICAgICAgam56IExlYXZlTG9vcENtcHM0CiAgICAgICAgYWRkIGVkeCwgOAogICAgICAgIGpueiBMb29wQ21wcwogICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtCkxlYXZlTG9vcENtcHM0OiBhZGQgZWR4LCA0CkxlYXZlTG9vcENtcHM6ICB0ZXN0ICAgIGVheCwgMDAwMEZGRkZoCiAgICAgICAgam56IExlbkxvd2VyCiAgICAgICAgYWRkIGVkeCwgIDIKICAgICAgICBzaHIgZWF4LCAxNgpMZW5Mb3dlcjogICBzdWIgYWwsIDEKICAgICAgICBhZGMgZWR4LCAwCgo7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCjs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4KCiAgICAgICAgbGVhIGVheCwgW2VkaSArIGVkeF0KICAgICAgICBtb3YgZWRpLCBbc2Nhbl0KICAgICAgICBzdWIgZWF4LCBlZGkKICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gKICAgICAgICBqZ2UgTGVuTWF4aW11bQoKOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQo7OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgoKICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQogICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQogICAgICAgIGNtcCBlYXgsIGVieAogICAgICAgIGpnICBMb25nZXJNYXRjaAogICAgICAgIG1vdiBlc2ksIFt3aW5kb3diZXN0bGVuXQogICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdCiAgICAgICAgbW92IGVieCwgW3NjYW5lbmRdCiAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdCiAgICAgICAgam1wIExvb2t1cExvb3AKCjs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwo7OzsgICAgICAgICBiZXN0X2xlbiA9IGxlbjsKOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwoKTG9uZ2VyTWF0Y2g6ICAgIG1vdiBlYngsIFtuaWNlbWF0Y2hdCiAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4CiAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gKICAgICAgICBjbXAgZWF4LCBlYngKICAgICAgICBqZ2UgTGVhdmVOb3cKICAgICAgICBtb3YgZXNpLCBbd2luZG93XQogICAgICAgIGFkZCBlc2ksIGVheAogICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQogICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpICsgZWF4IC0gMV0KICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQogICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieAogICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQogICAgICAgIGptcCBMb29rdXBMb29wCgo7OzsgQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCgpMZW5NYXhpbXVtOiBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQogICAgICAgIG1vdiBkd29yZCBwdHIgW2Jlc3RsZW5dLCBNQVhfTUFUQ0gKICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeAoKOzs7IGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsKOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7CgpMZWF2ZU5vdzoKICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQogICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc0xvb2thaGVhZF0KICAgICAgICBjbXAgZWJ4LCBlYXgKICAgICAgICBqZyAgTG9va2FoZWFkUmV0CiAgICAgICAgbW92IGVheCwgZWJ4Ckxvb2thaGVhZFJldDoKCjs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCgogICAgICAgIGFkZCBlc3AsIExvY2FsVmFyc1NpemUKICAgICAgICBwb3AgZWJ4CiAgICAgICAgcG9wIGVzaQogICAgICAgIHBvcCBlZGkKICAgICAgICBwb3AgZWJwCgogICAgICAgIHJldAo7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQo7IFlvdXIgY2FuIGZyZWVseSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlZSBvciBjb21tZXJjaWFsIGFwcCBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSEKICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoCgoKSUZERUYgTk9PTERQRU5USVVNQ09ERQogICAgSUZERUYgTk9VTkRFUkxJTkUKICAgIGxvbmdlc3RfbWF0Y2ggICAgICAgZW5kcAogICAgRUxTRQogICAgX2xvbmdlc3RfbWF0Y2ggICAgICBlbmRwCiAgICBFTkRJRgoKICAgIElGREVGIE5PVU5ERVJMSU5FCiAgICBtYXRjaF9pbml0ICAgICAgcHJvYyBuZWFyCiAgICAgICAgICAgICAgICAgICAgcmV0CiAgICBtYXRjaF9pbml0ICAgICAgZW5kcAogICAgRUxTRQogICAgX21hdGNoX2luaXQgICAgIHByb2MgbmVhcgogICAgICAgICAgICAgICAgICAgIHJldAogICAgX21hdGNoX2luaXQgICAgIGVuZHAKICAgIEVORElGICAgIApFTFNFCiAgICBJRkRFRiBOT1VOREVSTElORQogICAgbG9uZ2VzdF9tYXRjaF82ODYgICBlbmRwCiAgICBFTFNFCiAgICBfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHAKICAgIEVORElGCkVORElGCgpfVEVYVCAgIGVuZHMKZW5kCg==