ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBkMTYyZTkwLi44NTUzMDNiIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDYgKzEsMjcgQEAKIAogICAgICAgICAgICAgICAgIENoYW5nZUxvZyBmaWxlIGZvciB6bGliCiAKK0NoYW5nZXMgaW4gMS4yLjIuMyAoMjcgTWF5IDIwMDUpCistIFJlcGxhY2UgMVUgY29uc3RhbnRzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0IGNvbXBpbGUKKy0gVHlwZWNhc3QgZnJlYWQoKSByZXR1cm4gdmFsdWVzIGluIGd6aW8uYyBbVm9sbGFudF0KKy0gUmVtb3ZlIHRyYWlsaW5nIHNwYWNlIGluIG1pbmlnemlwLmMgb3V0bW9kZSAoVkMrKyBjYW4ndCBkZWFsIHdpdGggaXQpCistIEZpeCBjcmMgY2hlY2sgYnVnIGluIGd6cmVhZCgpIGFmdGVyIGd6dW5nZXRjKCkgW0hlaW5lcl0KKy0gQWRkIHRoZSBkZWZsYXRlVHVuZSgpIGZ1bmN0aW9uIHRvIGFkanVzdCBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCistIEFkZCBhIGZhc3QgZ3ppcCBkZWNvbXByZXNzb3IsIGd1bi5jLCB0byBleGFtcGxlcyAodXNlIG9mIGluZmxhdGVCYWNrKQorLSBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBleGFtcGxlcy96cGlwZS5jCistIEFkZCBDKysgd3JhcHBlciBpbiBpbmZiYWNrOS5oIFtEb25haXNdCistIEZpeCBidWcgaW4gaW5mbGF0ZUNvcHkoKSB3aGVuIGRlY29kaW5nIGZpeGVkIGNvZGVzCistIE5vdGUgaW4gemxpYi5oIGhvdyBtdWNoIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgYWN0dWFsbHkgdXNlcworLSBSZW1vdmUgVVNFX0RJQ1RfSEVBRCBpbiBkZWZsYXRlLmMgKHdvdWxkIG1lc3MgdXAgaW5mbGF0ZSBpZiB1c2VkKQorLSBBZGQgX1dJTjMyX1dDRSB0byBkZWZpbmUgV0lOMzIgaW4gemNvbmYuaW4uaCBbU3BlbmNlcl0KKy0gRG9uJ3QgaW5jbHVkZSBzdGRlcnIuaCBvciBlcnJuby5oIGZvciBfV0lOMzJfV0NFIGluIHp1dGlsLmggW1NwZW5jZXJdCistIEFkZCBnemRpcmVjdCgpIGZ1bmN0aW9uIHRvIGluZGljYXRlIHRyYW5zcGFyZW50IHJlYWRzCistIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEZpeCBjb21waWxhdGlvbiBvZiBkZWZsYXRlLmMgd2hlbiBib3RoIEFTTVYgYW5kIEZBU1RFU1QgW09iZXJodW1lcl0KKy0gQWRkIGNhc3RzIGluIGNyYzMyLmMgdG8gYXZvaWQgd2FybmluZ3MgW09iZXJodW1lcl0KKy0gQWRkIGNvbnRyaWIvbWFzbXg2NCBbVm9sbGFudF0KKy0gVXBkYXRlIGNvbnRyaWIvYXNtNTg2LCBhc202ODYsIG1hc214ODYsIHRlc3R6bGliLCB2c3R1ZGlvIFtWb2xsYW50XQorCiBDaGFuZ2VzIGluIDEuMi4yLjIgKDMwIERlY2VtYmVyIDIwMDQpCiAtIFJlcGxhY2Ugc3RydWN0dXJlIGFzc2lnbm1lbnRzIGluIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jIHdpdGggem1lbWNweSB0bwogICBhdm9pZCBpbXBsaWNpdCBtZW1jcHkgY2FsbHMgKHBvcnRhYmlsaXR5IGZvciBuby1saWJyYXJ5IGNvbXBpbGF0aW9uKQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCAyOWY1M2RlLi41MzU3NzlkIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzAsNyArMzAsNyBAQAogCiBMSUJTPWxpYnouYQogU0hBUkVETElCPWxpYnouc28KLVNIQVJFRExJQlY9bGliei5zby4xLjIuMi4yCitTSEFSRURMSUJWPWxpYnouc28uMS4yLjIuMwogU0hBUkVETElCTT1saWJ6LnNvLjEKIAogQVI9YXIgcmMKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggMjlmNTNkZS4uNTM1Nzc5ZCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTMwLDcgKzMwLDcgQEAKIAogTElCUz1saWJ6LmEKIFNIQVJFRExJQj1saWJ6LnNvCi1TSEFSRURMSUJWPWxpYnouc28uMS4yLjIuMgorU0hBUkVETElCVj1saWJ6LnNvLjEuMi4yLjMKIFNIQVJFRExJQk09bGliei5zby4xCiAKIEFSPWFyIHJjCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggZTkxYTdhNC4uOWJiYTJlNCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw2ICsxLDYgQEAKIFpMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCiAKLXpsaWIgMS4yLjIuMiBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUgaXMKK3psaWIgMS4yLjIuMyBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUgaXMKIHRocmVhZCBzYWZlLiAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcwogKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpCkBAIC0zMyw3ICszMyw3IEBACiBpc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGluCiBodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQogCi1UaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjIuMiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCitUaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjIuMyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCiAKIFVuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSAiY29udHJpYiIuCiAKZGlmZiAtLWdpdCBhL2FzNDAwL3psaWIuaW5jIGIvYXM0MDAvemxpYi5pbmMKaW5kZXggMDRjMzMwOS4uMjkwNWVlMCAxMDA2NDQKLS0tIGEvYXM0MDAvemxpYi5pbmMKKysrIGIvYXM0MDAvemxpYi5pbmMKQEAgLTEsNyArMSw3IEBACiAgICAgICAqICBaTElCLklOQyAtIEludGVyZmFjZSB0byB0aGUgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKICAgICAgICoKICAgICAgICogIElMRSBSUEc0MDAgdmVyc2lvbiBieSBQYXRyaWNrIE1vbm5lcmF0LCBEQVRBU1BIRVJFLgotICAgICAgKiAgVmVyc2lvbiAxLjIuMi4yCisgICAgICAqICBWZXJzaW9uIDEuMi4yLjMKICAgICAgICoKICAgICAgICoKICAgICAgICogIFdBUk5JTkc6CkBAIC0yMCw4ICsyMCwxMiBAQAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMKICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAqCi0gICAgIEQgWkxJQl9WRVJTSU9OICAgIEMgICAgICAgICAgICAgICAgICAgJzEuMi4yLjInICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlcidzIHZlcnNpb24KLSAgICAgRCBaTElCX1ZFUk5VTSAgICAgQyAgICAgICAgICAgICAgICAgICBYJzEyMjInCisgICAgICAqICBWZXJzaW9uaW5nIGluZm9ybWF0aW9uLgorICAgICAgKgorICAgICBEIFpMSUJfVkVSU0lPTiAgICBDICAgICAgICAgICAgICAgICAgICcxLjIuMi4zJworICAgICBEIFpMSUJfVkVSTlVNICAgICBDICAgICAgICAgICAgICAgICAgIFgnMTIyMycKKyAgICAgICoKKyAgICAgICogIE90aGVyIGVxdWF0ZXMuCiAgICAgICAqCiAgICAgIEQgWl9OT19GTFVTSCAgICAgIEMgICAgICAgICAgICAgICAgICAgMAogICAgICBEIFpfU1lOQ19GTFVTSCAgICBDICAgICAgICAgICAgICAgICAgIDIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIgYi9jb250cmliL1JFQURNRS5jb250cmliCmluZGV4IDczMmQ0OGMuLjIwYWZjNjIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKKysrIGIvY29udHJpYi9SRUFETUUuY29udHJpYgpAQCAtNDIsNiArNDIsMTAgQEAKICAgICAgICAgICAgIGFuZCBDaHVjayBXYWxib3VybiA8Y2h1Y2t3QGtpbmVzb2Z0LmNvbT4KICAgICAgICAgYXNtIGNvZGUgZm9yIFBlbnRpdW0gUHJvL1BJSSwgdXNpbmcgdGhlIE1BU00gc3ludGF4CiAKK21hc214NjQvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKwl4ODYgNjQtYml0IChBTUQ2NCBhbmQgSW50ZWwgRU02NHQpIGNvZGUgZm9yIHg2NCBhc3NlbWJsZXIgdG8KKwlyZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCkKKwogbWFzbXg4Ni8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgogICAgICAgICB4ODYgYXNtIGNvZGUgdG8gcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLAogICAgICAgICBmb3IgVmlzdWFsIEMrKyBhbmQgTUFTTQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc201ODYvbWF0Y2guUyBiL2NvbnRyaWIvYXNtNTg2L21hdGNoLlMKaW5kZXggOGYxNjE0MC4uMzcxYzlhMCAxMDA2NDQKLS0tIGEvY29udHJpYi9hc201ODYvbWF0Y2guUworKysgYi9jb250cmliL2FzbTU4Ni9tYXRjaC5TCkBAIC0xLDM1NCArMSwzNjQgQEAKLS8qIG1hdGNoLnMgLS0gUGVudGl1bS1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkKLSAqIFdyaXR0ZW4gZm9yIHpsaWIgMS4xLjIKLSAqIENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPgotICoKLSAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5PX1VOREVSTElORQotI2RlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0Ci0jZGVmaW5lCWxvbmdlc3RfbWF0Y2gJX2xvbmdlc3RfbWF0Y2gKLSNlbmRpZgotCi0jZGVmaW5lCU1BWF9NQVRDSAkoMjU4KQotI2RlZmluZQlNSU5fTUFUQ0gJKDMpCi0jZGVmaW5lCU1JTl9MT09LQUhFQUQJKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpCi0jZGVmaW5lCU1BWF9NQVRDSF84CSgoTUFYX01BVENIICsgNykgJiB+NykKLQotLyogc3RhY2sgZnJhbWUgb2Zmc2V0cyAqLwotCi0jZGVmaW5lCXdtYXNrCQkJMAkvKiBsb2NhbCBjb3B5IG9mIHMtPndtYXNrCSovCi0jZGVmaW5lCXdpbmRvdwkJCTQJLyogbG9jYWwgY29weSBvZiBzLT53aW5kb3cJKi8KLSNkZWZpbmUJd2luZG93YmVzdGxlbgkJOAkvKiBzLT53aW5kb3cgKyBiZXN0bGVuCQkqLwotI2RlZmluZQljaGFpbmxlbnNjYW5lbmQJCTEyCS8qIGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4JKi8KLQkJCQkJLyogbG93IHdvcmQ6IGxhc3QgYnl0ZXMgc291Z2h0CSovCi0jZGVmaW5lCXNjYW5zdGFydAkJMTYJLyogZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwkqLwotI2RlZmluZQlzY2FuYWxpZ24JCTIwCS8qIGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcJKi8KLSNkZWZpbmUJbmljZW1hdGNoCQkyNAkvKiBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUJKi8KLSNkZWZpbmUJYmVzdGxlbgkJCTI4CS8qIHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIJKi8KLSNkZWZpbmUJc2NhbgkJCTMyCS8qIHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAkqLwotCi0jZGVmaW5lCUxvY2FsVmFyc1NpemUJCSgzNikKLS8qCXNhdmVkIGVieAkJMzYgKi8KLS8qCXNhdmVkIGVkaQkJNDAgKi8KLS8qCXNhdmVkIGVzaQkJNDQgKi8KLS8qCXNhdmVkIGVicAkJNDggKi8KLS8qCXJldHVybiBhZGRyZXNzCQk1MiAqLwotI2RlZmluZQlkZWZsYXRlc3RhdGUJCTU2CS8qIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMJKi8KLSNkZWZpbmUJY3VybWF0Y2gJCTYwCi0KLS8qIE9mZnNldHMgZm9yIGZpZWxkcyBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUuIFRoZXNlIG51bWJlcnMKLSAqIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUKLSAqIGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywKLSAqIGNoYW5naW5nIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUgY291bGQgZWFzaWx5IGNhdXNlIHRoaXMKLSAqIHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQKLSAqIGNvbXBpbGUgdGltZS4gU2lnaC4pCi0gKi8KLSNkZWZpbmUJZHNXU2l6ZQkJCTM2Ci0jZGVmaW5lCWRzV01hc2sJCQk0NAotI2RlZmluZQlkc1dpbmRvdwkJNDgKLSNkZWZpbmUJZHNQcmV2CQkJNTYKLSNkZWZpbmUJZHNNYXRjaExlbgkJODgKLSNkZWZpbmUJZHNQcmV2TWF0Y2gJCTkyCi0jZGVmaW5lCWRzU3RyU3RhcnQJCTEwMAotI2RlZmluZQlkc01hdGNoU3RhcnQJCTEwNAotI2RlZmluZQlkc0xvb2thaGVhZAkJMTA4Ci0jZGVmaW5lCWRzUHJldkxlbgkJMTEyCi0jZGVmaW5lCWRzTWF4Q2hhaW5MZW4JCTExNgotI2RlZmluZQlkc0dvb2RNYXRjaAkJMTMyCi0jZGVmaW5lCWRzTmljZU1hdGNoCQkxMzYKLQotCi0uZmlsZSAibWF0Y2guUyIKLQotLmdsb2JsCW1hdGNoX2luaXQsIGxvbmdlc3RfbWF0Y2gKLQotLnRleHQKLQotLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8KLQotbG9uZ2VzdF9tYXRjaDoKLQotLyogU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0ICVlc3AgdG8JKi8KLS8qIG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLgkJCQkJKi8KLQotCQlwdXNobAklZWJwCi0JCXB1c2hsCSVlZGkKLQkJcHVzaGwJJWVzaQotCQlwdXNobAklZWJ4Ci0JCXN1YmwJJExvY2FsVmFyc1NpemUsICVlc3AKLQotLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWVjeCB3aWxsIGhvbGQgY3VyX21hdGNoCQkqLwotLyogdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiAlZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUJKi8KLS8qIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCQkqLwotLyogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCkuCQkJCQkJKi8KLQotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWN1cm1hdGNoKCVlc3ApLCAlZWN4Ci0KLS8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLwotCi0JCW1vdmwJZHNOaWNlTWF0Y2goJWVkeCksICVlYXgKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieAotCQljbXBsCSVlYXgsICVlYngKLQkJamwJTG9va2FoZWFkTGVzcwotCQltb3ZsCSVlYXgsICVlYngKLUxvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApCi0KLS8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KLQotCQltb3ZsCWRzV2luZG93KCVlZHgpLCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApCi0JCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicAotCQlsZWEJKCVlc2ksJWVicCksICVlZGkKLQkJbW92bAklZWRpLCBzY2FuKCVlc3ApCi0KLS8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCi0vKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLwotCi0JCW1vdmwJJWVkaSwgJWVheAotCQluZWdsCSVlYXgKLQkJYW5kbAkkMywgJWVheAotCQltb3ZsCSVlYXgsIHNjYW5hbGlnbiglZXNwKQotCi0vKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KLS8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLwotCi0JCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheAotCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4Ci0JCXN1YmwJJWVheCwgJWVicAotCQlqZwlMaW1pdFBvc2l0aXZlCi0JCXhvcmwJJWVicCwgJWVicAotTGltaXRQb3NpdGl2ZToKLQotLyogdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsJCQkJKi8KLS8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovCi0vKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovCi0vKiB9CQkJCQkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheAotCQltb3ZsCWRzR29vZE1hdGNoKCVlZHgpLCAlZWJ4Ci0JCWNtcGwJJWVieCwgJWVheAotCQltb3ZsCWRzTWF4Q2hhaW5MZW4oJWVkeCksICVlYngKLQkJamwJTGFzdE1hdGNoR29vZAotCQlzaHJsCSQyLCAlZWJ4Ci1MYXN0TWF0Y2hHb29kOgotCi0vKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCi0vKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCi0vKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSBzY2FuZW5kCSovCi0vKiBzY2FuZW5kIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJKi8KLQotCQlkZWNsCSVlYngKLQkJc2hsbAkkMTYsICVlYngKLQotLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCi0vKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovCi0KLQkJYWRkbAklZWF4LCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQotCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KLS8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLwotCi0JCW1vdncJKCVlZGkpLCAlYngKLQkJbW92dwklYngsIHNjYW5zdGFydCglZXNwKQotCQltb3Z3CS0xKCVlZGksJWVheCksICVieAotCQltb3ZsCSVlYngsIGNoYWlubGVuc2NhbmVuZCglZXNwKQotCi0vKiBQb3NmICpwcmV2ID0gcy0+cHJldjsJCQkJCQkqLwotLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCi0JCW1vdmwJZHNXTWFzayglZWR4KSwgJWVkeAotCQltb3YJJWVkeCwgd21hc2soJWVzcCkKLQotLyogSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCQkJCQkJKi8KLQotCQlqbXAJTG9vcEVudHJ5Ci0KLS5iYWxpZ24gMTYKLQotLyogZG8gewotICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotICogICAgIFsuLi5dCi0gKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKLSAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotICoKLSAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKLSAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi0gKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLSAqCi0gKiBXaXRoaW4gdGhpcyBsb29wOgotICogJWVieCA9IGNoYWlubGVuc2NhbmVuZCAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgc2NhbmVuZCkKLSAqICVlY3ggPSBjdXJtYXRjaAotICogJWVkeCA9IGN1cm1hdGNoICYgd21hc2sKLSAqICVlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pCi0gKiAlZWRpID0gcHJldgotICogJWVicCA9IGxpbWl0Ci0gKgotICogVHdvIG9wdGltaXphdGlvbiBub3RlcyBvbiB0aGUgY2hvaWNlIG9mIGluc3RydWN0aW9uczoKLSAqCi0gKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdXNlcyBhIDE2LWJpdCBhZGRyZXNzLCB3aGljaCBjb3N0cyBhbiBleHRyYSwKLSAqIHVucGFpcmFibGUgY3ljbGUuIFRoaXMgaXMgY2hlYXBlciB0aGFuIGRvaW5nIGEgMzItYml0IGFjY2VzcyBhbmQKLSAqIHplcm9pbmcgdGhlIGhpZ2ggd29yZCwgZHVlIHRvIHRoZSAzLWN5Y2xlIG1pc2FsaWdubWVudCBwZW5hbHR5IHdoaWNoCi0gKiB3b3VsZCBvY2N1ciBoYWxmIHRoZSB0aW1lLiBUaGlzIGFsc28gdHVybnMgb3V0IHRvIGJlIGNoZWFwZXIgdGhhbgotICogZG9pbmcgdHdvIHNlcGFyYXRlIDgtYml0IGFjY2Vzc2VzLCBhcyB0aGUgbWVtb3J5IGlzIHNvIHJhcmVseSBpbiB0aGUKLSAqIEwxIGNhY2hlLgotICoKLSAqIFRoZSB3aW5kb3cgYnVmZmVyLCBob3dldmVyLCBhcHBhcmVudGx5IHNwZW5kcyBhIGxvdCBvZiB0aW1lIGluIHRoZQotICogY2FjaGUsIGFuZCBzbyBpdCBpcyBmYXN0ZXIgdG8gcmV0cmlldmUgdGhlIHdvcmQgYXQgdGhlIGVuZCBvZiB0aGUKLSAqIG1hdGNoIHN0cmluZyB3aXRoIHR3byA4LWJpdCBsb2Fkcy4gVGhlIGluc3RydWN0aW9ucyB0aGF0IHRlc3QgdGhlCi0gKiB3b3JkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hdGNoIHN0cmluZywgaG93ZXZlciwgYXJlIGV4ZWN1dGVkCi0gKiBtdWNoIGxlc3MgZnJlcXVlbnRseSwgYW5kIHRoZXJlIGl0IHdhcyBjaGVhcGVyIHRvIHVzZSAxNi1iaXQKLSAqIGluc3RydWN0aW9ucywgd2hpY2ggYXZvaWRlZCB0aGUgbmVjZXNzaXR5IG9mIHNhdmluZyBvZmYgYW5kCi0gKiBzdWJzZXF1ZW50bHkgcmVsb2FkaW5nIG9uZSBvZiB0aGUgb3RoZXIgcmVnaXN0ZXJzLgotICovCi1Mb29rdXBMb29wOgotCQkJCQkJCS8qIDEgVSAmIFYgICovCi0JCW1vdncJKCVlZGksJWVkeCwyKSwgJWN4CQkvKiAyIFUgcGlwZSAqLwotCQltb3ZsCXdtYXNrKCVlc3ApLCAlZWR4CQkvKiAyIFYgcGlwZSAqLwotCQljbXBsCSVlYnAsICVlY3gJCQkvKiAzIFUgcGlwZSAqLwotCQlqYmUJTGVhdmVOb3cJCQkvKiAzIFYgcGlwZSAqLwotCQlzdWJsCSQweDAwMDEwMDAwLCAlZWJ4CQkvKiA0IFUgcGlwZSAqLwotCQlqcwlMZWF2ZU5vdwkJCS8qIDQgViBwaXBlICovCi1Mb29wRW50cnk6CW1vdmIJLTEoJWVzaSwlZWN4KSwgJWFsCQkvKiA1IFUgcGlwZSAqLwotCQlhbmRsCSVlY3gsICVlZHgJCQkvKiA1IFYgcGlwZSAqLwotCQljbXBiCSVibCwgJWFsCQkJLyogNiBVIHBpcGUgKi8KLQkJam56CUxvb2t1cExvb3AJCQkvKiA2IFYgcGlwZSAqLwotCQltb3ZiCSglZXNpLCVlY3gpLCAlYWgKLQkJY21wYgklYmgsICVhaAotCQlqbnoJTG9va3VwTG9vcAotCQltb3ZsCXdpbmRvdyglZXNwKSwgJWVheAotCQltb3Z3CSglZWF4LCVlY3gpLCAlYXgKLQkJY21wdwlzY2Fuc3RhcnQoJWVzcCksICVheAotCQlqbnoJTG9va3VwTG9vcAotCi0vKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4JCQkJCSovCi0KLQkJbW92bAklZWJ4LCBjaGFpbmxlbnNjYW5lbmQoJWVzcCkKLQotLyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlCSovCi0vKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KLS8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLwotLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCi0KLQkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCWFkZGwJJWVjeCwgJWVzaQotCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheAotCQltb3ZsCSQoLU1BWF9NQVRDSF84KSwgJWVkeAotCQlsZWEJTUFYX01BVENIXzgoJWVkaSwlZWF4KSwgJWVkaQotCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQotCi0vKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi0gKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi0gKgotICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCi0gKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi0gKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKLSAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQotICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLSAqCi0gKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci0gKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCi0gKiBwZXJmb3JtYW5jZS4KLSAqLwotTG9vcENtcHM6Ci0JCW1vdmwJKCVlc2ksJWVkeCksICVlYXgKLQkJbW92bAkoJWVkaSwlZWR4KSwgJWVieAotCQl4b3JsCSVlYngsICVlYXgKLQkJam56CUxlYXZlTG9vcENtcHMKLQkJbW92bAk0KCVlc2ksJWVkeCksICVlYXgKLQkJbW92bAk0KCVlZGksJWVkeCksICVlYngKLQkJeG9ybAklZWJ4LCAlZWF4Ci0JCWpueglMZWF2ZUxvb3BDbXBzNAotCQlhZGRsCSQ4LCAlZWR4Ci0JCWpueglMb29wQ21wcwotCQlqbXAJTGVuTWF4aW11bQotTGVhdmVMb29wQ21wczQ6CWFkZGwJJDQsICVlZHgKLUxlYXZlTG9vcENtcHM6CXRlc3RsCSQweDAwMDBGRkZGLCAlZWF4Ci0JCWpueglMZW5Mb3dlcgotCQlhZGRsCSQyLCAlZWR4Ci0JCXNocmwJJDE2LCAlZWF4Ci1MZW5Mb3dlcjoJc3ViYgkkMSwgJWFsCi0JCWFkY2wJJDAsICVlZHgKLQotLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCSovCi0vKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4JKi8KLQotCQlsZWEJKCVlZGksJWVkeCksICVlYXgKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCXN1YmwJJWVkaSwgJWVheAotCQljbXBsCSRNQVhfTUFUQ0gsICVlYXgKLQkJamdlCUxlbk1heGltdW0KLQotLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCSovCi0vKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuCQkqLwotCi0JCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAotCQljbXBsCSVlYngsICVlYXgKLQkJamcJTG9uZ2VyTWF0Y2gKLQkJbW92bAljaGFpbmxlbnNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92bAl3aW5kb3diZXN0bGVuKCVlc3ApLCAlZXNpCi0JCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCi0JCW1vdmwJd21hc2soJWVzcCksICVlZHgKLQkJYW5kbAklZWN4LCAlZWR4Ci0JCWptcAlMb29rdXBMb29wCi0KLS8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLwotLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLwotLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLwotLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLQotTG9uZ2VyTWF0Y2g6CW1vdmwJbmljZW1hdGNoKCVlc3ApLCAlZWJ4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCQljbXBsCSVlYngsICVlYXgKLQkJamdlCUxlYXZlTm93Ci0JCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCi0JCWFkZGwJJWVheCwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKLQkJbW92bAljaGFpbmxlbnNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92dwktMSglZWRpLCVlYXgpLCAlYngKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQkJbW92bAklZWJ4LCBjaGFpbmxlbnNjYW5lbmQoJWVzcCkKLQkJbW92bAl3bWFzayglZXNwKSwgJWVkeAotCQlhbmRsCSVlY3gsICVlZHgKLQkJam1wCUxvb2t1cExvb3AKLQotLyogQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCQkqLwotCi1MZW5NYXhpbXVtOgltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCSRNQVhfTUFUQ0gsIGJlc3RsZW4oJWVzcCkKLQkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkKLQotLyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwkJKi8KLS8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovCi0KLUxlYXZlTm93OgotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVheAotCQljbXBsCSVlYXgsICVlYngKLQkJamcJTG9va2FoZWFkUmV0Ci0JCW1vdmwJJWVieCwgJWVheAotTG9va2FoZWFkUmV0OgotCi0vKiBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCQkJKi8KLQotCQlhZGRsCSRMb2NhbFZhcnNTaXplLCAlZXNwCi0JCXBvcGwJJWVieAotCQlwb3BsCSVlc2kKLQkJcG9wbAklZWRpCi0JCXBvcGwJJWVicAotbWF0Y2hfaW5pdDoJcmV0CisvKiBtYXRjaC5zIC0tIFBlbnRpdW0tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpDQorICogV3JpdHRlbiBmb3IgemxpYiAxLjEuMg0KKyAqIENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKyAqDQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0DQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisgKi8NCisNCisjaWZuZGVmIE5PX1VOREVSTElORQ0KKyNkZWZpbmUJbWF0Y2hfaW5pdAlfbWF0Y2hfaW5pdA0KKyNkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaA0KKyNlbmRpZg0KKw0KKyNkZWZpbmUJTUFYX01BVENICSgyNTgpDQorI2RlZmluZQlNSU5fTUFUQ0gJKDMpDQorI2RlZmluZQlNSU5fTE9PS0FIRUFECShNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQ0KKyNkZWZpbmUJTUFYX01BVENIXzgJKChNQVhfTUFUQ0ggKyA3KSAmIH43KQ0KKw0KKy8qIHN0YWNrIGZyYW1lIG9mZnNldHMgKi8NCisNCisjZGVmaW5lCXdtYXNrCQkJMAkvKiBsb2NhbCBjb3B5IG9mIHMtPndtYXNrCSovDQorI2RlZmluZQl3aW5kb3cJCQk0CS8qIGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93CSovDQorI2RlZmluZQl3aW5kb3diZXN0bGVuCQk4CS8qIHMtPndpbmRvdyArIGJlc3RsZW4JCSovDQorI2RlZmluZQljaGFpbmxlbnNjYW5lbmQJCTEyCS8qIGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4JKi8NCisJCQkJCS8qIGxvdyB3b3JkOiBsYXN0IGJ5dGVzIHNvdWdodAkqLw0KKyNkZWZpbmUJc2NhbnN0YXJ0CQkxNgkvKiBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovDQorI2RlZmluZQlzY2FuYWxpZ24JCTIwCS8qIGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcJKi8NCisjZGVmaW5lCW5pY2VtYXRjaAkJMjQJLyogYSBnb29kIGVub3VnaCBtYXRjaCBzaXplCSovDQorI2RlZmluZQliZXN0bGVuCQkJMjgJLyogc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcgkqLw0KKyNkZWZpbmUJc2NhbgkJCTMyCS8qIHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAkqLw0KKw0KKyNkZWZpbmUJTG9jYWxWYXJzU2l6ZQkJKDM2KQ0KKy8qCXNhdmVkIGVieAkJMzYgKi8NCisvKglzYXZlZCBlZGkJCTQwICovDQorLyoJc2F2ZWQgZXNpCQk0NCAqLw0KKy8qCXNhdmVkIGVicAkJNDggKi8NCisvKglyZXR1cm4gYWRkcmVzcwkJNTIgKi8NCisjZGVmaW5lCWRlZmxhdGVzdGF0ZQkJNTYJLyogdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwkqLw0KKyNkZWZpbmUJY3VybWF0Y2gJCTYwDQorDQorLyogT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KKyAqIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCisgKiBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsDQorICogY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KKyAqIHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCisgKiBjb21waWxlIHRpbWUuIFNpZ2guKQ0KKyAqLw0KKw0KKy8qIEFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzDQorICogIGluIHpsaWIgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KKyAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4NCisgKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4NCisgKiBpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4yLjIuMiBvciBsYXRlciAsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDgiKS4NCisgKi8NCisNCisjZGVmaW5lIHpsaWIxMjIyYWRkCQkoOCkNCisNCisjZGVmaW5lCWRzV1NpemUJCQkoMzYremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc1dNYXNrCQkJKDQ0K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNXaW5kb3cJCSg0OCt6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzUHJldgkJCSg1Nit6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzTWF0Y2hMZW4JCSg4OCt6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzUHJldk1hdGNoCQkoOTIremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc1N0clN0YXJ0CQkoMTAwK3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNNYXRjaFN0YXJ0CQkoMTA0K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNMb29rYWhlYWQJCSgxMDgremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc1ByZXZMZW4JCSgxMTIremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc01heENoYWluTGVuCQkoMTE2K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNHb29kTWF0Y2gJCSgxMzIremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc05pY2VNYXRjaAkJKDEzNit6bGliMTIyMmFkZCkNCisNCisNCisuZmlsZSAibWF0Y2guUyINCisNCisuZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaA0KKw0KKy50ZXh0DQorDQorLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8NCisNCitsb25nZXN0X21hdGNoOg0KKw0KKy8qIFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCAlZXNwIHRvCSovDQorLyogbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuCQkJCQkqLw0KKw0KKwkJcHVzaGwJJWVicA0KKwkJcHVzaGwJJWVkaQ0KKwkJcHVzaGwJJWVzaQ0KKwkJcHVzaGwJJWVieA0KKwkJc3VibAkkTG9jYWxWYXJzU2l6ZSwgJWVzcA0KKw0KKy8qIFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICVlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAkJKi8NCisvKiB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uICVlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQkqLw0KKy8qIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCQkqLw0KKy8qIGVudGVyaW5nIHRoZSBtYWluIGxvb3ApLgkJCQkJCSovDQorDQorCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeA0KKwkJbW92bAljdXJtYXRjaCglZXNwKSwgJWVjeA0KKw0KKy8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLw0KKw0KKwkJbW92bAlkc05pY2VNYXRjaCglZWR4KSwgJWVheA0KKwkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieA0KKwkJY21wbAklZWF4LCAlZWJ4DQorCQlqbAlMb29rYWhlYWRMZXNzDQorCQltb3ZsCSVlYXgsICVlYngNCitMb29rYWhlYWRMZXNzOgltb3ZsCSVlYngsIG5pY2VtYXRjaCglZXNwKQ0KKw0KKy8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8NCisNCisJCW1vdmwJZHNXaW5kb3coJWVkeCksICVlc2kNCisJCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApDQorCQltb3ZsCWRzU3RyU3RhcnQoJWVkeCksICVlYnANCisJCWxlYQkoJWVzaSwlZWJwKSwgJWVkaQ0KKwkJbW92bAklZWRpLCBzY2FuKCVlc3ApDQorDQorLyogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwkJKi8NCisvKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLw0KKw0KKwkJbW92bAklZWRpLCAlZWF4DQorCQluZWdsCSVlYXgNCisJCWFuZGwJJDMsICVlYXgNCisJCW1vdmwJJWVheCwgc2NhbmFsaWduKCVlc3ApDQorDQorLyogSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwkJCSovDQorLyogICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CQkJCSovDQorDQorCQltb3ZsCWRzV1NpemUoJWVkeCksICVlYXgNCisJCXN1YmwJJE1JTl9MT09LQUhFQUQsICVlYXgNCisJCXN1YmwJJWVheCwgJWVicA0KKwkJamcJTGltaXRQb3NpdGl2ZQ0KKwkJeG9ybAklZWJwLCAlZWJwDQorTGltaXRQb3NpdGl2ZToNCisNCisvKiB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwkJCQkqLw0KKy8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovDQorLyogICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsJCQkJCQkqLw0KKy8qIH0JCQkJCQkJCQkqLw0KKw0KKwkJbW92bAlkc1ByZXZMZW4oJWVkeCksICVlYXgNCisJCW1vdmwJZHNHb29kTWF0Y2goJWVkeCksICVlYngNCisJCWNtcGwJJWVieCwgJWVheA0KKwkJbW92bAlkc01heENoYWluTGVuKCVlZHgpLCAlZWJ4DQorCQlqbAlMYXN0TWF0Y2hHb29kDQorCQlzaHJsCSQyLCAlZWJ4DQorTGFzdE1hdGNoR29vZDoNCisNCisvKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovDQorLyogdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0LgkqLw0KKy8qIEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHNjYW5lbmQJKi8NCisvKiBzY2FuZW5kIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJKi8NCisNCisJCWRlY2wJJWVieA0KKwkJc2hsbAkkMTYsICVlYngNCisNCisvKiBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsJCQkJCSovDQorDQorCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheA0KKwkJbW92bAklZWF4LCBiZXN0bGVuKCVlc3ApDQorDQorLyogU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiAlZXNpIGxvY2FsbHksIGFuZCBpbiAlZXNpLgkqLw0KKw0KKwkJYWRkbAklZWF4LCAlZXNpDQorCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkNCisNCisvKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8NCisvKiByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8NCisNCisJCW1vdncJKCVlZGkpLCAlYngNCisJCW1vdncJJWJ4LCBzY2Fuc3RhcnQoJWVzcCkNCisJCW1vdncJLTEoJWVkaSwlZWF4KSwgJWJ4DQorCQltb3ZsCSVlYngsIGNoYWlubGVuc2NhbmVuZCglZXNwKQ0KKw0KKy8qIFBvc2YgKnByZXYgPSBzLT5wcmV2OwkJCQkJCSovDQorLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLw0KKw0KKwkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkNCisJCW1vdmwJZHNXTWFzayglZWR4KSwgJWVkeA0KKwkJbW92CSVlZHgsIHdtYXNrKCVlc3ApDQorDQorLyogSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCQkJCQkJKi8NCisNCisJCWptcAlMb29wRW50cnkNCisNCisuYmFsaWduIDE2DQorDQorLyogZG8gew0KKyAqICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCisgKiAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQorICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOw0KKyAqICAgICBbLi4uXQ0KKyAqIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KKyAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOw0KKyAqDQorICogSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KKyAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsDQorICogYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQorICoNCisgKiBXaXRoaW4gdGhpcyBsb29wOg0KKyAqICVlYnggPSBjaGFpbmxlbnNjYW5lbmQgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHNjYW5lbmQpDQorICogJWVjeCA9IGN1cm1hdGNoDQorICogJWVkeCA9IGN1cm1hdGNoICYgd21hc2sNCisgKiAlZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKyAqICVlZGkgPSBwcmV2DQorICogJWVicCA9IGxpbWl0DQorICoNCisgKiBUd28gb3B0aW1pemF0aW9uIG5vdGVzIG9uIHRoZSBjaG9pY2Ugb2YgaW5zdHJ1Y3Rpb25zOg0KKyAqDQorICogVGhlIGZpcnN0IGluc3RydWN0aW9uIHVzZXMgYSAxNi1iaXQgYWRkcmVzcywgd2hpY2ggY29zdHMgYW4gZXh0cmEsDQorICogdW5wYWlyYWJsZSBjeWNsZS4gVGhpcyBpcyBjaGVhcGVyIHRoYW4gZG9pbmcgYSAzMi1iaXQgYWNjZXNzIGFuZA0KKyAqIHplcm9pbmcgdGhlIGhpZ2ggd29yZCwgZHVlIHRvIHRoZSAzLWN5Y2xlIG1pc2FsaWdubWVudCBwZW5hbHR5IHdoaWNoDQorICogd291bGQgb2NjdXIgaGFsZiB0aGUgdGltZS4gVGhpcyBhbHNvIHR1cm5zIG91dCB0byBiZSBjaGVhcGVyIHRoYW4NCisgKiBkb2luZyB0d28gc2VwYXJhdGUgOC1iaXQgYWNjZXNzZXMsIGFzIHRoZSBtZW1vcnkgaXMgc28gcmFyZWx5IGluIHRoZQ0KKyAqIEwxIGNhY2hlLg0KKyAqDQorICogVGhlIHdpbmRvdyBidWZmZXIsIGhvd2V2ZXIsIGFwcGFyZW50bHkgc3BlbmRzIGEgbG90IG9mIHRpbWUgaW4gdGhlDQorICogY2FjaGUsIGFuZCBzbyBpdCBpcyBmYXN0ZXIgdG8gcmV0cmlldmUgdGhlIHdvcmQgYXQgdGhlIGVuZCBvZiB0aGUNCisgKiBtYXRjaCBzdHJpbmcgd2l0aCB0d28gOC1iaXQgbG9hZHMuIFRoZSBpbnN0cnVjdGlvbnMgdGhhdCB0ZXN0IHRoZQ0KKyAqIHdvcmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWF0Y2ggc3RyaW5nLCBob3dldmVyLCBhcmUgZXhlY3V0ZWQNCisgKiBtdWNoIGxlc3MgZnJlcXVlbnRseSwgYW5kIHRoZXJlIGl0IHdhcyBjaGVhcGVyIHRvIHVzZSAxNi1iaXQNCisgKiBpbnN0cnVjdGlvbnMsIHdoaWNoIGF2b2lkZWQgdGhlIG5lY2Vzc2l0eSBvZiBzYXZpbmcgb2ZmIGFuZA0KKyAqIHN1YnNlcXVlbnRseSByZWxvYWRpbmcgb25lIG9mIHRoZSBvdGhlciByZWdpc3RlcnMuDQorICovDQorTG9va3VwTG9vcDoNCisJCQkJCQkJLyogMSBVICYgViAgKi8NCisJCW1vdncJKCVlZGksJWVkeCwyKSwgJWN4CQkvKiAyIFUgcGlwZSAqLw0KKwkJbW92bAl3bWFzayglZXNwKSwgJWVkeAkJLyogMiBWIHBpcGUgKi8NCisJCWNtcGwJJWVicCwgJWVjeAkJCS8qIDMgVSBwaXBlICovDQorCQlqYmUJTGVhdmVOb3cJCQkvKiAzIFYgcGlwZSAqLw0KKwkJc3VibAkkMHgwMDAxMDAwMCwgJWVieAkJLyogNCBVIHBpcGUgKi8NCisJCWpzCUxlYXZlTm93CQkJLyogNCBWIHBpcGUgKi8NCitMb29wRW50cnk6CW1vdmIJLTEoJWVzaSwlZWN4KSwgJWFsCQkvKiA1IFUgcGlwZSAqLw0KKwkJYW5kbAklZWN4LCAlZWR4CQkJLyogNSBWIHBpcGUgKi8NCisJCWNtcGIJJWJsLCAlYWwJCQkvKiA2IFUgcGlwZSAqLw0KKwkJam56CUxvb2t1cExvb3AJCQkvKiA2IFYgcGlwZSAqLw0KKwkJbW92YgkoJWVzaSwlZWN4KSwgJWFoDQorCQljbXBiCSViaCwgJWFoDQorCQlqbnoJTG9va3VwTG9vcA0KKwkJbW92bAl3aW5kb3coJWVzcCksICVlYXgNCisJCW1vdncJKCVlYXgsJWVjeCksICVheA0KKwkJY21wdwlzY2Fuc3RhcnQoJWVzcCksICVheA0KKwkJam56CUxvb2t1cExvb3ANCisNCisvKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4JCQkJCSovDQorDQorCQltb3ZsCSVlYngsIGNoYWlubGVuc2NhbmVuZCglZXNwKQ0KKw0KKy8qIFBvaW50ICVlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kICVlc2kgdG8gdGhlIHN0cmluZyB3ZQkqLw0KKy8qIGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCAlZXNpIGFuZCAlZWRpIGFyZQkqLw0KKy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLw0KKy8qIGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgkJCQkqLw0KKw0KKwkJbW92bAl3aW5kb3coJWVzcCksICVlc2kNCisJCW1vdmwJc2NhbiglZXNwKSwgJWVkaQ0KKwkJYWRkbAklZWN4LCAlZXNpDQorCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheA0KKwkJbW92bAkkKC1NQVhfTUFUQ0hfOCksICVlZHgNCisJCWxlYQlNQVhfTUFUQ0hfOCglZWRpLCVlYXgpLCAlZWRpDQorCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQ0KKw0KKy8qIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCisgKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorICoNCisgKiBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCisgKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorICogc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQorICogYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSAlZWRpDQorICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCisgKg0KKyAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCisgKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KKyAqIHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQ0KKyAqIHBlcmZvcm1hbmNlLg0KKyAqLw0KK0xvb3BDbXBzOg0KKwkJbW92bAkoJWVzaSwlZWR4KSwgJWVheA0KKwkJbW92bAkoJWVkaSwlZWR4KSwgJWVieA0KKwkJeG9ybAklZWJ4LCAlZWF4DQorCQlqbnoJTGVhdmVMb29wQ21wcw0KKwkJbW92bAk0KCVlc2ksJWVkeCksICVlYXgNCisJCW1vdmwJNCglZWRpLCVlZHgpLCAlZWJ4DQorCQl4b3JsCSVlYngsICVlYXgNCisJCWpueglMZWF2ZUxvb3BDbXBzNA0KKwkJYWRkbAkkOCwgJWVkeA0KKwkJam56CUxvb3BDbXBzDQorCQlqbXAJTGVuTWF4aW11bQ0KK0xlYXZlTG9vcENtcHM0OglhZGRsCSQ0LCAlZWR4DQorTGVhdmVMb29wQ21wczoJdGVzdGwJJDB4MDAwMEZGRkYsICVlYXgNCisJCWpueglMZW5Mb3dlcg0KKwkJYWRkbAkkMiwgJWVkeA0KKwkJc2hybAkkMTYsICVlYXgNCitMZW5Mb3dlcjoJc3ViYgkkMSwgJWFsDQorCQlhZGNsCSQwLCAlZWR4DQorDQorLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCSovDQorLyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCSovDQorDQorCQlsZWEJKCVlZGksJWVkeCksICVlYXgNCisJCW1vdmwJc2NhbiglZXNwKSwgJWVkaQ0KKwkJc3VibAklZWRpLCAlZWF4DQorCQljbXBsCSRNQVhfTUFUQ0gsICVlYXgNCisJCWpnZQlMZW5NYXhpbXVtDQorDQorLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCSovDQorLyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgkJKi8NCisNCisJCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4DQorCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngNCisJCWNtcGwJJWVieCwgJWVheA0KKwkJamcJTG9uZ2VyTWF0Y2gNCisJCW1vdmwJY2hhaW5sZW5zY2FuZW5kKCVlc3ApLCAlZWJ4DQorCQltb3ZsCXdpbmRvd2Jlc3RsZW4oJWVzcCksICVlc2kNCisJCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpDQorCQltb3ZsCXdtYXNrKCVlc3ApLCAlZWR4DQorCQlhbmRsCSVlY3gsICVlZHgNCisJCWptcAlMb29rdXBMb29wDQorDQorLyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsJCQkJCSovDQorLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLw0KKy8qICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsJCQkJKi8NCisvKiAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLw0KKw0KK0xvbmdlck1hdGNoOgltb3ZsCW5pY2VtYXRjaCglZXNwKSwgJWVieA0KKwkJbW92bAklZWF4LCBiZXN0bGVuKCVlc3ApDQorCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQ0KKwkJY21wbAklZWJ4LCAlZWF4DQorCQlqZ2UJTGVhdmVOb3cNCisJCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpDQorCQlhZGRsCSVlYXgsICVlc2kNCisJCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQ0KKwkJbW92bAljaGFpbmxlbnNjYW5lbmQoJWVzcCksICVlYngNCisJCW1vdncJLTEoJWVkaSwlZWF4KSwgJWJ4DQorCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQ0KKwkJbW92bAklZWJ4LCBjaGFpbmxlbnNjYW5lbmQoJWVzcCkNCisJCW1vdmwJd21hc2soJWVzcCksICVlZHgNCisJCWFuZGwJJWVjeCwgJWVkeA0KKwkJam1wCUxvb2t1cExvb3ANCisNCisvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovDQorDQorTGVuTWF4aW11bToJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgNCisJCW1vdmwJJE1BWF9NQVRDSCwgYmVzdGxlbiglZXNwKQ0KKwkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkNCisNCisvKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLw0KKy8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovDQorDQorTGVhdmVOb3c6DQorCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeA0KKwkJbW92bAliZXN0bGVuKCVlc3ApLCAlZWJ4DQorCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWF4DQorCQljbXBsCSVlYXgsICVlYngNCisJCWpnCUxvb2thaGVhZFJldA0KKwkJbW92bAklZWJ4LCAlZWF4DQorTG9va2FoZWFkUmV0Og0KKw0KKy8qIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLw0KKw0KKwkJYWRkbAkkTG9jYWxWYXJzU2l6ZSwgJWVzcA0KKwkJcG9wbAklZWJ4DQorCQlwb3BsCSVlc2kNCisJCXBvcGwJJWVkaQ0KKwkJcG9wbAklZWJwDQorbWF0Y2hfaW5pdDoJcmV0DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc202ODYvbWF0Y2guUyBiL2NvbnRyaWIvYXNtNjg2L21hdGNoLlMKaW5kZXggOGU4NmMzMy4uYzI0YmU0ZCAxMDA2NDQKLS0tIGEvY29udHJpYi9hc202ODYvbWF0Y2guUworKysgYi9jb250cmliL2FzbTY4Ni9tYXRjaC5TCkBAIC0xLDMyNyArMSwzMjkgQEAKLS8qIG1hdGNoLnMgLS0gUGVudGl1bS1Qcm8tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpCi0gKiBXcml0dGVuIGZvciB6bGliIDEuMS4yCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOT19VTkRFUkxJTkUKLSNkZWZpbmUJbWF0Y2hfaW5pdAlfbWF0Y2hfaW5pdAotI2RlZmluZQlsb25nZXN0X21hdGNoCV9sb25nZXN0X21hdGNoCi0jZW5kaWYKLQotI2RlZmluZQlNQVhfTUFUQ0gJKDI1OCkKLSNkZWZpbmUJTUlOX01BVENICSgzKQotI2RlZmluZQlNSU5fTE9PS0FIRUFECShNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQotI2RlZmluZQlNQVhfTUFUQ0hfOAkoKE1BWF9NQVRDSCArIDcpICYgfjcpCi0KLS8qIHN0YWNrIGZyYW1lIG9mZnNldHMgKi8KLQotI2RlZmluZQljaGFpbmxlbndtYXNrCQkwCS8qIGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4JKi8KLQkJCQkJLyogbG93IHdvcmQ6IHMtPndtYXNrCQkqLwotI2RlZmluZQl3aW5kb3cJCQk0CS8qIGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93CSovCi0jZGVmaW5lCXdpbmRvd2Jlc3RsZW4JCTgJLyogcy0+d2luZG93ICsgYmVzdGxlbgkJKi8KLSNkZWZpbmUJc2NhbnN0YXJ0CQkxNgkvKiBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovCi0jZGVmaW5lCXNjYW5lbmQJCQkxMgkvKiBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcJKi8KLSNkZWZpbmUJc2NhbmFsaWduCQkyMAkvKiBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCSovCi0jZGVmaW5lCW5pY2VtYXRjaAkJMjQJLyogYSBnb29kIGVub3VnaCBtYXRjaCBzaXplCSovCi0jZGVmaW5lCWJlc3RsZW4JCQkyOAkvKiBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyCSovCi0jZGVmaW5lCXNjYW4JCQkzMgkvKiBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gJKi8KLQotI2RlZmluZQlMb2NhbFZhcnNTaXplCQkoMzYpCi0vKglzYXZlZCBlYngJCTM2ICovCi0vKglzYXZlZCBlZGkJCTQwICovCi0vKglzYXZlZCBlc2kJCTQ0ICovCi0vKglzYXZlZCBlYnAJCTQ4ICovCi0vKglyZXR1cm4gYWRkcmVzcwkJNTIgKi8KLSNkZWZpbmUJZGVmbGF0ZXN0YXRlCQk1NgkvKiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCSovCi0jZGVmaW5lCWN1cm1hdGNoCQk2MAotCi0vKiBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzCi0gKiBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlCi0gKiBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsCi0gKiBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzCi0gKiBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0Ci0gKiBjb21waWxlIHRpbWUuIFNpZ2guKQotICovCi0jZGVmaW5lCWRzV1NpemUJCQkzNgotI2RlZmluZQlkc1dNYXNrCQkJNDQKLSNkZWZpbmUJZHNXaW5kb3cJCTQ4Ci0jZGVmaW5lCWRzUHJldgkJCTU2Ci0jZGVmaW5lCWRzTWF0Y2hMZW4JCTg4Ci0jZGVmaW5lCWRzUHJldk1hdGNoCQk5MgotI2RlZmluZQlkc1N0clN0YXJ0CQkxMDAKLSNkZWZpbmUJZHNNYXRjaFN0YXJ0CQkxMDQKLSNkZWZpbmUJZHNMb29rYWhlYWQJCTEwOAotI2RlZmluZQlkc1ByZXZMZW4JCTExMgotI2RlZmluZQlkc01heENoYWluTGVuCQkxMTYKLSNkZWZpbmUJZHNHb29kTWF0Y2gJCTEzMgotI2RlZmluZQlkc05pY2VNYXRjaAkJMTM2Ci0KLQotLmZpbGUgIm1hdGNoLlMiCi0KLS5nbG9ibAltYXRjaF9pbml0LCBsb25nZXN0X21hdGNoCi0KLS50ZXh0Ci0KLS8qIHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpICovCi0KLWxvbmdlc3RfbWF0Y2g6Ci0KLS8qIFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCAlZXNwIHRvCSovCi0vKiBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4JCQkJCSovCi0KLQkJcHVzaGwJJWVicAotCQlwdXNobAklZWRpCi0JCXB1c2hsCSVlc2kKLQkJcHVzaGwJJWVieAotCQlzdWJsCSRMb2NhbFZhcnNTaXplLCAlZXNwCi0KLS8qIFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICVlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAkJKi8KLS8qIHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gJWVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlCSovCi0vKiBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQkJKi8KLS8qIGVudGVyaW5nIHRoZSBtYWluIGxvb3ApLgkJCQkJCSovCi0KLQkJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgKLQkJbW92bAljdXJtYXRjaCglZXNwKSwgJWVjeAotCi0vKiB1SW50IHdtYXNrID0gcy0+d19tYXNrOwkJCQkJCSovCi0vKiB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwkJCQkqLwotLyogaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsJCQkJKi8KLS8qICAgICBjaGFpbl9sZW5ndGggPj49IDI7CQkJCQkJKi8KLS8qIH0JCQkJCQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJZHNHb29kTWF0Y2goJWVkeCksICVlYngKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCW1vdmwJZHNXTWFzayglZWR4KSwgJWVheAotCQltb3ZsCWRzTWF4Q2hhaW5MZW4oJWVkeCksICVlYngKLQkJamwJTGFzdE1hdGNoR29vZAotCQlzaHJsCSQyLCAlZWJ4Ci1MYXN0TWF0Y2hHb29kOgotCi0vKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCi0vKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCi0vKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawkqLwotLyogdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4JCQkJKi8KLQotCQlkZWNsCSVlYngKLQkJc2hsbAkkMTYsICVlYngKLQkJb3JsCSVlYXgsICVlYngKLQkJbW92bAklZWJ4LCBjaGFpbmxlbndtYXNrKCVlc3ApCi0KLS8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLwotCi0JCW1vdmwJZHNOaWNlTWF0Y2goJWVkeCksICVlYXgKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieAotCQljbXBsCSVlYXgsICVlYngKLQkJamwJTG9va2FoZWFkTGVzcwotCQltb3ZsCSVlYXgsICVlYngKLUxvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApCi0KLS8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KLQotCQltb3ZsCWRzV2luZG93KCVlZHgpLCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApCi0JCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicAotCQlsZWEJKCVlc2ksJWVicCksICVlZGkKLQkJbW92bAklZWRpLCBzY2FuKCVlc3ApCi0KLS8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCi0vKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLwotCi0JCW1vdmwJJWVkaSwgJWVheAotCQluZWdsCSVlYXgKLQkJYW5kbAkkMywgJWVheAotCQltb3ZsCSVlYXgsIHNjYW5hbGlnbiglZXNwKQotCi0vKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KLS8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLwotCi0JCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheAotCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4Ci0JCXN1YmwJJWVheCwgJWVicAotCQlqZwlMaW1pdFBvc2l0aXZlCi0JCXhvcmwJJWVicCwgJWVicAotTGltaXRQb3NpdGl2ZToKLQotLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCi0vKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovCi0KLQkJYWRkbAklZWF4LCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQotCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KLS8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLwotLyogUG9zZiAqcHJldiA9IHMtPnByZXY7CQkJCQkJKi8KLQotCQltb3Z6d2wJKCVlZGkpLCAlZWJ4Ci0JCW1vdmwJJWVieCwgc2NhbnN0YXJ0KCVlc3ApCi0JCW1vdnp3bAktMSglZWRpLCVlYXgpLCAlZWJ4Ci0JCW1vdmwJJWVieCwgc2NhbmVuZCglZXNwKQotCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQotCi0vKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4JCQkJCQkqLwotCi0JCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAotCQlqbXAJTG9vcEVudHJ5Ci0KLS5iYWxpZ24gMTYKLQotLyogZG8gewotICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotICogICAgIFsuLi5dCi0gKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKLSAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotICoKLSAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKLSAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi0gKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLSAqCi0gKiBXaXRoaW4gdGhpcyBsb29wOgotICogJWVieCA9IHNjYW5lbmQKLSAqICVlY3ggPSBjdXJtYXRjaAotICogJWVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotICogJWVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLSAqICVlZGkgPSBwcmV2Ci0gKiAlZWJwID0gbGltaXQKLSAqLwotTG9va3VwTG9vcDoKLQkJYW5kbAklZWR4LCAlZWN4Ci0JCW1vdnp3bAkoJWVkaSwlZWN4LDIpLCAlZWN4Ci0JCWNtcGwJJWVicCwgJWVjeAotCQlqYmUJTGVhdmVOb3cKLQkJc3VibAkkMHgwMDAxMDAwMCwgJWVkeAotCQlqcwlMZWF2ZU5vdwotTG9vcEVudHJ5Ogltb3Z6d2wJLTEoJWVzaSwlZWN4KSwgJWVheAotCQljbXBsCSVlYngsICVlYXgKLQkJam56CUxvb2t1cExvb3AKLQkJbW92bAl3aW5kb3coJWVzcCksICVlYXgKLQkJbW92endsCSglZWF4LCVlY3gpLCAlZWF4Ci0JCWNtcGwJc2NhbnN0YXJ0KCVlc3ApLCAlZWF4Ci0JCWpueglMb29rdXBMb29wCi0KLS8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgkJCQkJKi8KLQotCQltb3ZsCSVlZHgsIGNoYWlubGVud21hc2soJWVzcCkKLQotLyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlCSovCi0vKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KLS8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLwotLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCi0KLQkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCWFkZGwJJWVjeCwgJWVzaQotCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheAotCQltb3ZsCSQoLU1BWF9NQVRDSF84KSwgJWVkeAotCQlsZWEJTUFYX01BVENIXzgoJWVkaSwlZWF4KSwgJWVkaQotCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQotCi0vKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi0gKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi0gKgotICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCi0gKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi0gKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKLSAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQotICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLSAqCi0gKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci0gKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCi0gKiBwZXJmb3JtYW5jZS4KLSAqLwotTG9vcENtcHM6Ci0JCW1vdmwJKCVlc2ksJWVkeCksICVlYXgKLQkJeG9ybAkoJWVkaSwlZWR4KSwgJWVheAotCQlqbnoJTGVhdmVMb29wQ21wcwotCQltb3ZsCTQoJWVzaSwlZWR4KSwgJWVheAotCQl4b3JsCTQoJWVkaSwlZWR4KSwgJWVheAotCQlqbnoJTGVhdmVMb29wQ21wczQKLQkJYWRkbAkkOCwgJWVkeAotCQlqbnoJTG9vcENtcHMKLQkJam1wCUxlbk1heGltdW0KLUxlYXZlTG9vcENtcHM0OglhZGRsCSQ0LCAlZWR4Ci1MZWF2ZUxvb3BDbXBzOgl0ZXN0bAkkMHgwMDAwRkZGRiwgJWVheAotCQlqbnoJTGVuTG93ZXIKLQkJYWRkbAkkMiwgJWVkeAotCQlzaHJsCSQxNiwgJWVheAotTGVuTG93ZXI6CXN1YmIJJDEsICVhbAotCQlhZGNsCSQwLCAlZWR4Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAkqLwotLyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCSovCi0KLQkJbGVhCSglZWRpLCVlZHgpLCAlZWF4Ci0JCW1vdmwJc2NhbiglZXNwKSwgJWVkaQotCQlzdWJsCSVlZGksICVlYXgKLQkJY21wbAkkTUFYX01BVENILCAlZWF4Ci0JCWpnZQlMZW5NYXhpbXVtCi0KLS8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQkqLwotLyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgkJKi8KLQotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCWpnCUxvbmdlck1hdGNoCi0JCW1vdmwJd2luZG93YmVzdGxlbiglZXNwKSwgJWVzaQotCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQotCQltb3ZsCXNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4Ci0JCWptcAlMb29rdXBMb29wCi0KLS8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLwotLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLwotLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLwotLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLQotTG9uZ2VyTWF0Y2g6CW1vdmwJbmljZW1hdGNoKCVlc3ApLCAlZWJ4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCQljbXBsCSVlYngsICVlYXgKLQkJamdlCUxlYXZlTm93Ci0JCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCi0JCWFkZGwJJWVheCwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKLQkJbW92endsCS0xKCVlZGksJWVheCksICVlYngKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQkJbW92bAklZWJ4LCBzY2FuZW5kKCVlc3ApCi0JCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAotCQlqbXAJTG9va3VwTG9vcAotCi0vKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovCi0KLUxlbk1heGltdW06CW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJJE1BWF9NQVRDSCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCi0vKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLwotLyogcmV0dXJuIHMtPmxvb2thaGVhZDsJCQkJCQkJKi8KLQotTGVhdmVOb3c6Ci0JCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAotCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWF4Ci0JCWNtcGwJJWVheCwgJWVieAotCQlqZwlMb29rYWhlYWRSZXQKLQkJbW92bAklZWJ4LCAlZWF4Ci1Mb29rYWhlYWRSZXQ6Ci0KLS8qIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLwotCi0JCWFkZGwJJExvY2FsVmFyc1NpemUsICVlc3AKLQkJcG9wbAklZWJ4Ci0JCXBvcGwJJWVzaQotCQlwb3BsCSVlZGkKLQkJcG9wbAklZWJwCi1tYXRjaF9pbml0OglyZXQKKy8qIG1hdGNoLnMgLS0gUGVudGl1bS1Qcm8tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpDQorICogV3JpdHRlbiBmb3IgemxpYiAxLjEuMg0KKyAqIENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKyAqDQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0DQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisgKi8NCisNCisjaWZuZGVmIE5PX1VOREVSTElORQ0KKyNkZWZpbmUJbWF0Y2hfaW5pdAlfbWF0Y2hfaW5pdA0KKyNkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaA0KKyNlbmRpZg0KKw0KKyNkZWZpbmUJTUFYX01BVENICSgyNTgpDQorI2RlZmluZQlNSU5fTUFUQ0gJKDMpDQorI2RlZmluZQlNSU5fTE9PS0FIRUFECShNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQ0KKyNkZWZpbmUJTUFYX01BVENIXzgJKChNQVhfTUFUQ0ggKyA3KSAmIH43KQ0KKw0KKy8qIHN0YWNrIGZyYW1lIG9mZnNldHMgKi8NCisNCisjZGVmaW5lCWNoYWlubGVud21hc2sJCTAJLyogaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbgkqLw0KKwkJCQkJLyogbG93IHdvcmQ6IHMtPndtYXNrCQkqLw0KKyNkZWZpbmUJd2luZG93CQkJNAkvKiBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdwkqLw0KKyNkZWZpbmUJd2luZG93YmVzdGxlbgkJOAkvKiBzLT53aW5kb3cgKyBiZXN0bGVuCQkqLw0KKyNkZWZpbmUJc2NhbnN0YXJ0CQkxNgkvKiBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovDQorI2RlZmluZQlzY2FuZW5kCQkJMTIJLyogbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovDQorI2RlZmluZQlzY2FuYWxpZ24JCTIwCS8qIGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcJKi8NCisjZGVmaW5lCW5pY2VtYXRjaAkJMjQJLyogYSBnb29kIGVub3VnaCBtYXRjaCBzaXplCSovDQorI2RlZmluZQliZXN0bGVuCQkJMjgJLyogc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcgkqLw0KKyNkZWZpbmUJc2NhbgkJCTMyCS8qIHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAkqLw0KKw0KKyNkZWZpbmUJTG9jYWxWYXJzU2l6ZQkJKDM2KQ0KKy8qCXNhdmVkIGVieAkJMzYgKi8NCisvKglzYXZlZCBlZGkJCTQwICovDQorLyoJc2F2ZWQgZXNpCQk0NCAqLw0KKy8qCXNhdmVkIGVicAkJNDggKi8NCisvKglyZXR1cm4gYWRkcmVzcwkJNTIgKi8NCisjZGVmaW5lCWRlZmxhdGVzdGF0ZQkJNTYJLyogdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwkqLw0KKyNkZWZpbmUJY3VybWF0Y2gJCTYwDQorDQorLyogQWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCisgKiAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQorICogKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgdXNlICJ6bGliMTIyMmFkZCBlcXUgKC00KSIpLg0KKyAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLg0KKyAqIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLg0KKyAqLw0KKw0KKyNkZWZpbmUgemxpYjEyMjJhZGQJCSg4KQ0KKw0KKyNkZWZpbmUJZHNXU2l6ZQkJCSgzNit6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzV01hc2sJCQkoNDQremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc1dpbmRvdwkJKDQ4K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNQcmV2CQkJKDU2K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNNYXRjaExlbgkJKDg4K3psaWIxMjIyYWRkKQ0KKyNkZWZpbmUJZHNQcmV2TWF0Y2gJCSg5Mit6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzU3RyU3RhcnQJCSgxMDAremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc01hdGNoU3RhcnQJCSgxMDQremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc0xvb2thaGVhZAkJKDEwOCt6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzUHJldkxlbgkJKDExMit6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzTWF4Q2hhaW5MZW4JCSgxMTYremxpYjEyMjJhZGQpDQorI2RlZmluZQlkc0dvb2RNYXRjaAkJKDEzMit6bGliMTIyMmFkZCkNCisjZGVmaW5lCWRzTmljZU1hdGNoCQkoMTM2K3psaWIxMjIyYWRkKQ0KKw0KKw0KKy5maWxlICJtYXRjaC5TIg0KKw0KKy5nbG9ibAltYXRjaF9pbml0LCBsb25nZXN0X21hdGNoDQorDQorLnRleHQNCisNCisvKiB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKSAqLw0KKw0KK2xvbmdlc3RfbWF0Y2g6DQorDQorLyogU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0ICVlc3AgdG8JKi8NCisvKiBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4JCQkJCSovDQorDQorCQlwdXNobAklZWJwDQorCQlwdXNobAklZWRpDQorCQlwdXNobAklZXNpDQorCQlwdXNobAklZWJ4DQorCQlzdWJsCSRMb2NhbFZhcnNTaXplLCAlZXNwDQorDQorLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWVjeCB3aWxsIGhvbGQgY3VyX21hdGNoCQkqLw0KKy8qIHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gJWVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlCSovDQorLyogZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUJCSovDQorLyogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCkuCQkJCQkJKi8NCisNCisJCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4DQorCQltb3ZsCWN1cm1hdGNoKCVlc3ApLCAlZWN4DQorDQorLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLw0KKy8qIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7CQkJCSovDQorLyogaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsJCQkJKi8NCisvKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovDQorLyogfQkJCQkJCQkJCSovDQorDQorCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheA0KKwkJbW92bAlkc0dvb2RNYXRjaCglZWR4KSwgJWVieA0KKwkJY21wbAklZWJ4LCAlZWF4DQorCQltb3ZsCWRzV01hc2soJWVkeCksICVlYXgNCisJCW1vdmwJZHNNYXhDaGFpbkxlbiglZWR4KSwgJWVieA0KKwkJamwJTGFzdE1hdGNoR29vZA0KKwkJc2hybAkkMiwgJWVieA0KK0xhc3RNYXRjaEdvb2Q6DQorDQorLyogY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgkqLw0KKy8qIHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4JKi8NCisvKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawkqLw0KKy8qIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJCSovDQorDQorCQlkZWNsCSVlYngNCisJCXNobGwJJDE2LCAlZWJ4DQorCQlvcmwJJWVheCwgJWVieA0KKwkJbW92bAklZWJ4LCBjaGFpbmxlbndtYXNrKCVlc3ApDQorDQorLyogaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CSovDQorDQorCQltb3ZsCWRzTmljZU1hdGNoKCVlZHgpLCAlZWF4DQorCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWJ4DQorCQljbXBsCSVlYXgsICVlYngNCisJCWpsCUxvb2thaGVhZExlc3MNCisJCW1vdmwJJWVheCwgJWVieA0KK0xvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApDQorDQorLyogcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsJCQkqLw0KKw0KKwkJbW92bAlkc1dpbmRvdyglZWR4KSwgJWVzaQ0KKwkJbW92bAklZXNpLCB3aW5kb3coJWVzcCkNCisJCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicA0KKwkJbGVhCSglZXNpLCVlYnApLCAlZWRpDQorCQltb3ZsCSVlZGksIHNjYW4oJWVzcCkNCisNCisvKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nCQkqLw0KKy8qIGR3b3JkLWFsaWduZWQuCQkJCQkJCSovDQorDQorCQltb3ZsCSVlZGksICVlYXgNCisJCW5lZ2wJJWVheA0KKwkJYW5kbAkkMywgJWVheA0KKwkJbW92bAklZWF4LCBzY2FuYWxpZ24oJWVzcCkNCisNCisvKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8NCisvKiAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsJCQkJKi8NCisNCisJCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheA0KKwkJc3VibAkkTUlOX0xPT0tBSEVBRCwgJWVheA0KKwkJc3VibAklZWF4LCAlZWJwDQorCQlqZwlMaW1pdFBvc2l0aXZlDQorCQl4b3JsCSVlYnAsICVlYnANCitMaW1pdFBvc2l0aXZlOg0KKw0KKy8qIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOwkJCQkJKi8NCisNCisJCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4DQorCQltb3ZsCSVlYXgsIGJlc3RsZW4oJWVzcCkNCisNCisvKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovDQorDQorCQlhZGRsCSVlYXgsICVlc2kNCisJCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQ0KKw0KKy8qIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwkJCQkqLw0KKy8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLw0KKy8qIFBvc2YgKnByZXYgPSBzLT5wcmV2OwkJCQkJCSovDQorDQorCQltb3Z6d2wJKCVlZGkpLCAlZWJ4DQorCQltb3ZsCSVlYngsIHNjYW5zdGFydCglZXNwKQ0KKwkJbW92endsCS0xKCVlZGksJWVheCksICVlYngNCisJCW1vdmwJJWVieCwgc2NhbmVuZCglZXNwKQ0KKwkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkNCisNCisvKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4JCQkJCQkqLw0KKw0KKwkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4DQorCQlqbXAJTG9vcEVudHJ5DQorDQorLmJhbGlnbiAxNg0KKw0KKy8qIGRvIHsNCisgKiAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7DQorICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KKyAqICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCisgKiAgICAgWy4uLl0NCisgKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCisgKiAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCisgKg0KKyAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCisgKiBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KKyAqIGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLg0KKyAqDQorICogV2l0aGluIHRoaXMgbG9vcDoNCisgKiAlZWJ4ID0gc2NhbmVuZA0KKyAqICVlY3ggPSBjdXJtYXRjaA0KKyAqICVlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCisgKiAlZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKyAqICVlZGkgPSBwcmV2DQorICogJWVicCA9IGxpbWl0DQorICovDQorTG9va3VwTG9vcDoNCisJCWFuZGwJJWVkeCwgJWVjeA0KKwkJbW92endsCSglZWRpLCVlY3gsMiksICVlY3gNCisJCWNtcGwJJWVicCwgJWVjeA0KKwkJamJlCUxlYXZlTm93DQorCQlzdWJsCSQweDAwMDEwMDAwLCAlZWR4DQorCQlqcwlMZWF2ZU5vdw0KK0xvb3BFbnRyeToJbW92endsCS0xKCVlc2ksJWVjeCksICVlYXgNCisJCWNtcGwJJWVieCwgJWVheA0KKwkJam56CUxvb2t1cExvb3ANCisJCW1vdmwJd2luZG93KCVlc3ApLCAlZWF4DQorCQltb3Z6d2wJKCVlYXgsJWVjeCksICVlYXgNCisJCWNtcGwJc2NhbnN0YXJ0KCVlc3ApLCAlZWF4DQorCQlqbnoJTG9va3VwTG9vcA0KKw0KKy8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgkJCQkJKi8NCisNCisJCW1vdmwJJWVkeCwgY2hhaW5sZW53bWFzayglZXNwKQ0KKw0KKy8qIFBvaW50ICVlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kICVlc2kgdG8gdGhlIHN0cmluZyB3ZQkqLw0KKy8qIGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCAlZXNpIGFuZCAlZWRpIGFyZQkqLw0KKy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLw0KKy8qIGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgkJCQkqLw0KKw0KKwkJbW92bAl3aW5kb3coJWVzcCksICVlc2kNCisJCW1vdmwJc2NhbiglZXNwKSwgJWVkaQ0KKwkJYWRkbAklZWN4LCAlZXNpDQorCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheA0KKwkJbW92bAkkKC1NQVhfTUFUQ0hfOCksICVlZHgNCisJCWxlYQlNQVhfTUFUQ0hfOCglZWRpLCVlYXgpLCAlZWRpDQorCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQ0KKw0KKy8qIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCisgKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorICoNCisgKiBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCisgKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorICogc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQorICogYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSAlZWRpDQorICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCisgKg0KKyAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCisgKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KKyAqIHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQ0KKyAqIHBlcmZvcm1hbmNlLg0KKyAqLw0KK0xvb3BDbXBzOg0KKwkJbW92bAkoJWVzaSwlZWR4KSwgJWVheA0KKwkJeG9ybAkoJWVkaSwlZWR4KSwgJWVheA0KKwkJam56CUxlYXZlTG9vcENtcHMNCisJCW1vdmwJNCglZXNpLCVlZHgpLCAlZWF4DQorCQl4b3JsCTQoJWVkaSwlZWR4KSwgJWVheA0KKwkJam56CUxlYXZlTG9vcENtcHM0DQorCQlhZGRsCSQ4LCAlZWR4DQorCQlqbnoJTG9vcENtcHMNCisJCWptcAlMZW5NYXhpbXVtDQorTGVhdmVMb29wQ21wczQ6CWFkZGwJJDQsICVlZHgNCitMZWF2ZUxvb3BDbXBzOgl0ZXN0bAkkMHgwMDAwRkZGRiwgJWVheA0KKwkJam56CUxlbkxvd2VyDQorCQlhZGRsCSQyLCAlZWR4DQorCQlzaHJsCSQxNiwgJWVheA0KK0xlbkxvd2VyOglzdWJiCSQxLCAlYWwNCisJCWFkY2wJJDAsICVlZHgNCisNCisvKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwJKi8NCisvKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4JKi8NCisNCisJCWxlYQkoJWVkaSwlZWR4KSwgJWVheA0KKwkJbW92bAlzY2FuKCVlc3ApLCAlZWRpDQorCQlzdWJsCSVlZGksICVlYXgNCisJCWNtcGwJJE1BWF9NQVRDSCwgJWVheA0KKwkJamdlCUxlbk1heGltdW0NCisNCisvKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UJKi8NCisvKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuCQkqLw0KKw0KKwkJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgNCisJCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieA0KKwkJY21wbAklZWJ4LCAlZWF4DQorCQlqZwlMb25nZXJNYXRjaA0KKwkJbW92bAl3aW5kb3diZXN0bGVuKCVlc3ApLCAlZXNpDQorCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQ0KKwkJbW92bAlzY2FuZW5kKCVlc3ApLCAlZWJ4DQorCQltb3ZsCWNoYWlubGVud21hc2soJWVzcCksICVlZHgNCisJCWptcAlMb29rdXBMb29wDQorDQorLyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsJCQkJCSovDQorLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLw0KKy8qICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsJCQkJKi8NCisvKiAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLw0KKw0KK0xvbmdlck1hdGNoOgltb3ZsCW5pY2VtYXRjaCglZXNwKSwgJWVieA0KKwkJbW92bAklZWF4LCBiZXN0bGVuKCVlc3ApDQorCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQ0KKwkJY21wbAklZWJ4LCAlZWF4DQorCQlqZ2UJTGVhdmVOb3cNCisJCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpDQorCQlhZGRsCSVlYXgsICVlc2kNCisJCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQ0KKwkJbW92endsCS0xKCVlZGksJWVheCksICVlYngNCisJCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpDQorCQltb3ZsCSVlYngsIHNjYW5lbmQoJWVzcCkNCisJCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeA0KKwkJam1wCUxvb2t1cExvb3ANCisNCisvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovDQorDQorTGVuTWF4aW11bToJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgNCisJCW1vdmwJJE1BWF9NQVRDSCwgYmVzdGxlbiglZXNwKQ0KKwkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkNCisNCisvKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLw0KKy8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovDQorDQorTGVhdmVOb3c6DQorCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeA0KKwkJbW92bAliZXN0bGVuKCVlc3ApLCAlZWJ4DQorCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWF4DQorCQljbXBsCSVlYXgsICVlYngNCisJCWpnCUxvb2thaGVhZFJldA0KKwkJbW92bAklZWJ4LCAlZWF4DQorTG9va2FoZWFkUmV0Og0KKw0KKy8qIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLw0KKw0KKwkJYWRkbAkkTG9jYWxWYXJzU2l6ZSwgJWVzcA0KKwkJcG9wbAklZWJ4DQorCQlwb3BsCSVlc2kNCisJCXBvcGwJJWVkaQ0KKwkJcG9wbAklZWJwDQorbWF0Y2hfaW5pdDoJcmV0DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oIGIvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oCmluZGV4IDEwYmY1OGMuLjEwNzNjMGEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuaAorKysgYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmgKQEAgLTE2LDYgKzE2LDEwIEBACiAgKiB6bGliLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBoZWFkZXIgZmlsZS4KICAqLwogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2s5IE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7CkBAIC0yNywzICszMSw3IEBACiAjZGVmaW5lIGluZmxhdGVCYWNrOUluaXQoc3RybSwgd2luZG93KSBcCiAgICAgICAgIGluZmxhdGVCYWNrOUluaXRfKChzdHJtKSwgKHdpbmRvdyksIFwKICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jIGIvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jCmluZGV4IDI5YmVmNmEuLmFjNDU3NWMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYworKysgYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZ0cmVlOS5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTksNyArOSw3IEBACiAjZGVmaW5lIE1BWEJJVFMgMTUKIAogY29uc3QgY2hhciBpbmZsYXRlOV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGU5IDEuMi4yLjIgQ29weXJpZ2h0IDE5OTUtMjAwNCBNYXJrIEFkbGVyICI7CisgICAiIGluZmxhdGU5IDEuMi4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEyOSwgMTI5LAogICAgICAgICAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMzIsIDEzMiwgMTMyLAotICAgICAgICAxMzMsIDEzMywgMTMzLCAxMzMsIDE0NCwgNzIsIDE5OX07CisgICAgICAgIDEzMywgMTMzLCAxMzMsIDEzMywgMTQ0LCA2NiwgNzF9OwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjMxIGJhc2UgKi8KICAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LAogICAgICAgICA2NSwgOTcsIDEyOSwgMTkzLCAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsCmRpZmYgLS1naXQgYS9jb250cmliL21hc202ODYvbWF0Y2guYXNtIGIvY29udHJpYi9tYXNtNjg2L21hdGNoLmFzbQppbmRleCAyMjg3ODA0Li40YjAzYTcxIDEwMDY0NAotLS0gYS9jb250cmliL21hc202ODYvbWF0Y2guYXNtCisrKyBiL2NvbnRyaWIvbWFzbTY4Ni9tYXRjaC5hc20KQEAgLTEsNDA4ICsxLDQxMyBAQAotCi07IG1hdGNoLmFzbSAtLSBQZW50aXVtLVBybyBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkKLTsKLTsgVXBkYXRlZCBmb3IgemxpYiAxLjEuMyBhbmQgY29udmVydGVkIHRvIE1BU00gNi4xeAotOyBDb3B5cmlnaHQgKEMpIDIwMDAgRGFuIEhpZ2RvbiA8aGRhbkBraW5lc29mdC5jb20+Ci07ICAgICAgICAgICAgICAgICAgICBhbmQgQ2h1Y2sgV2FsYm91cm4gPGNodWNrd0BraW5lc29mdC5jb20+Ci07IENvcnJlY3Rpb25zIGJ5IENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPgotOwotOyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLTsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotOyBCYXNlZCBvbiBtYXRjaC5TCi07IFdyaXR0ZW4gZm9yIHpsaWIgMS4xLjIKLTsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Ci0KLQkuNjg2UAotCS5NT0RFTAlGTEFUCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgRVFVQVRFUwotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1NQVhfTUFUQ0gJRVFVIDI1OAotTUlOX01BVENICUVRVSAzCi1NSU5fTE9PS0FIRUFECUVRVSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKLU1BWF9NQVRDSF84CUVRVSAoKE1BWF9NQVRDSCArIDcpIEFORCAoTk9UIDcpKQotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IFNUUlVDVFVSRVMKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotOyBUaGlzIFNUUlVDVCBhc3N1bWVzIGEgNC1ieXRlIGFsaWdubWVudAotCi1ERUZMQVRFX1NUQVRFCVNUUlVDVAotZHNfc3RybQkJCWRkID8KLWRzX3N0YXR1cwkJZGQgPwotZHNfcGVuZGluZ19idWYJCWRkID8KLWRzX3BlbmRpbmdfYnVmX3NpemUJZGQgPwotZHNfcGVuZGluZ19vdXQJCWRkID8KLWRzX3BlbmRpbmcJCWRkID8KLWRzX3dyYXAJCQlkZCA/Ci1kc19kYXRhX3R5cGUJCWRiID8KLWRzX21ldGhvZAkJZGIgPwotCQkJZGIgPwk7IHBhZGRpbmcKLQkJCWRiID8JOyBwYWRkaW5nCi1kc19sYXN0X2ZsdXNoCQlkZCA/Ci1kc193X3NpemUJCWRkID8JOyB1c2VkCi1kc193X2JpdHMJCWRkID8KLWRzX3dfbWFzawkJZGQgPwk7IHVzZWQKLWRzX3dpbmRvdwkJZGQgPwk7IHVzZWQKLWRzX3dpbmRvd19zaXplCQlkZCA/Ci1kc19wcmV2CQkJZGQgPwk7IHVzZWQKLWRzX2hlYWQJCQlkZCA/Ci1kc19pbnNfaAkJZGQgPwotZHNfaGFzaF9zaXplCQlkZCA/Ci1kc19oYXNoX2JpdHMJCWRkID8KLWRzX2hhc2hfbWFzawkJZGQgPwotZHNfaGFzaF9zaGlmdAkJZGQgPwotZHNfYmxvY2tfc3RhcnQJCWRkID8KLWRzX21hdGNoX2xlbmd0aAkJZGQgPwk7IHVzZWQKLWRzX3ByZXZfbWF0Y2gJCWRkID8JOyB1c2VkCi1kc19tYXRjaF9hdmFpbGFibGUJZGQgPwotZHNfc3Ryc3RhcnQJCWRkID8JOyB1c2VkCi1kc19tYXRjaF9zdGFydAkJZGQgPwk7IHVzZWQKLWRzX2xvb2thaGVhZAkJZGQgPwk7IHVzZWQKLWRzX3ByZXZfbGVuZ3RoCQlkZCA/CTsgdXNlZAotZHNfbWF4X2NoYWluX2xlbmd0aAlkZCA/CTsgdXNlZAotZHNfbWF4X2xheHlfbWF0Y2gJZGQgPwotZHNfbGV2ZWwJCWRkID8KLWRzX3N0cmF0ZWd5CQlkZCA/Ci1kc19nb29kX21hdGNoCQlkZCA/CTsgdXNlZAotZHNfbmljZV9tYXRjaAkJZGQgPwk7IHVzZWQKLQotOyBEb24ndCBuZWVkIGFueW1vcmUgb2YgdGhlIHN0cnVjdCBmb3IgbWF0Y2gKLURFRkxBVEVfU1RBVEUJRU5EUwotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IENPREUKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLV9URVhUCVNFR01FTlQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBtYXRjaF9pbml0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQUxJR04JNAotUFVCTElDCV9tYXRjaF9pbml0Ci1fbWF0Y2hfaW5pdAlQUk9DCi0JOyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKLQlyZXQKLV9tYXRjaF9pbml0CUVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUFMSUdOCTQKLQotUFVCTElDCV9sb25nZXN0X21hdGNoCi1fbG9uZ2VzdF9tYXRjaAlQUk9DCi0KLTsgU2luY2UgdGhpcyBjb2RlIHVzZXMgRUJQIGZvciBhIHNjcmF0Y2ggcmVnaXN0ZXIsIHRoZSBzdGFjayBmcmFtZSBtdXN0Ci07IGJlIG1hbnVhbGx5IGNvbnN0cnVjdGVkIGFuZCByZWZlcmVuY2VkIHJlbGF0aXZlIHRvIHRoZSBFU1AgcmVnaXN0ZXIuCi0KLTsgU3RhY2sgaW1hZ2UKLTsgVmFyaWFibGVzCi1jaGFpbmxlbndtYXNrCT0gIDAJOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCi0JCQk7IGxvdyB3b3JkOiBzLT53bWFzawotd2luZG93CQk9ICA0CTsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cKLXdpbmRvd2Jlc3RsZW4JPSAgOAk7IHMtPndpbmRvdyArIGJlc3RsZW4KLXNjYW5lbmQJCT0gMTIJOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcKLXNjYW5zdGFydAk9IDE2CTsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwotc2NhbmFsaWduCT0gMjAJOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCi1uaWNlbWF0Y2gJPSAyNAk7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQotYmVzdGxlbgkJPSAyOAk7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIKLXNjYW4JCT0gMzIJOyBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gKLXZhcnNpemUJCT0gMzYJOyBudW1iZXIgb2YgYnl0ZXMgKGFsc28gb2Zmc2V0IHRvIGxhc3Qgc2F2ZWQgcmVnaXN0ZXIpCi0KLTsgU2F2ZWQgUmVnaXN0ZXJzIChhY3R1YWxseSBwdXNoZWQgaW50byBwbGFjZSkKLWVieF9zYXZlCT0gMzYKLWVkaV9zYXZlCT0gNDAKLWVzaV9zYXZlCT0gNDQKLWVicF9zYXZlCT0gNDgKLQotOyBQYXJhbWV0ZXJzCi1yZXRhZGRyCQk9IDUyCi1kZWZsYXRlc3RhdGUJPSA1NgotY3VybWF0Y2gJPSA2MAotCi07IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZwotCXB1c2gJZWJwCi0JcHVzaAllZGkKLQlwdXNoCWVzaQotCXB1c2gJZWJ4Ci0KLTsgQWxsb2NhdGUgbG9jYWwgdmFyaWFibGUgc3BhY2UKLQlzdWIJZXNwLHZhcnNpemUKLQotOyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAotOyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlCi07IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCi07IGVudGVyaW5nIHRoZSBtYWluIGxvb3ApLgotCi0JbW92CWVkeCwgW2VzcCtkZWZsYXRlc3RhdGVdCi1BU1NVTUUJZWR4OlBUUiBERUZMQVRFX1NUQVRFCi0KLQltb3YJZWN4LCBbZXNwK2N1cm1hdGNoXQotCi07IHVJbnQgd21hc2sgPSBzLT53X21hc2s7Ci07IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7Ci07IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7Ci07ICAgICBjaGFpbl9sZW5ndGggPj49IDI7Ci07IH0KLQotCW1vdgllYXgsIFtlZHhdLmRzX3ByZXZfbGVuZ3RoCi0JbW92CWVieCwgW2VkeF0uZHNfZ29vZF9tYXRjaAotCWNtcAllYXgsIGVieAotCW1vdgllYXgsIFtlZHhdLmRzX3dfbWFzawotCW1vdgllYngsIFtlZHhdLmRzX21heF9jaGFpbl9sZW5ndGgKLQlqbAlTSE9SVCBMYXN0TWF0Y2hHb29kCi0Jc2hyCWVieCwgMgotTGFzdE1hdGNoR29vZDoKLQotOyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCi07IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4KLTsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sKLTsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4KLQotCWRlYwllYngKLQlzaGwJZWJ4LCAxNgotCW9yCWVieCwgZWF4Ci0JbW92CVtlc3ArY2hhaW5sZW53bWFza10sIGVieAotCi07IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwotCi0JbW92CWVheCwgW2VkeF0uZHNfbmljZV9tYXRjaAotCW1vdgllYngsIFtlZHhdLmRzX2xvb2thaGVhZAotCWNtcAllYngsIGVheAotCWpsCVNIT1JUIExvb2thaGVhZExlc3MKLQltb3YJZWJ4LCBlYXgKLUxvb2thaGVhZExlc3M6Ci0JbW92CVtlc3ArbmljZW1hdGNoXSwgZWJ4Ci0KLTsvKiByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJZXNpLCBbZWR4XS5kc193aW5kb3cKLQltb3YJW2VzcCt3aW5kb3ddLCBlc2kKLQltb3YJZWJwLCBbZWR4XS5kc19zdHJzdGFydAotCWxlYQllZGksIFtlc2krZWJwXQotCW1vdglbZXNwK3NjYW5dLGVkaQotCi07LyogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZyAgICAgICAgICAgICAqLwotOy8qIGR3b3JkLWFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdgllYXgsIGVkaQotCW5lZwllYXgKLQlhbmQJZWF4LCAzCi0JbW92CVtlc3Arc2NhbmFsaWduXSwgZWF4Ci0KLTsvKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/ICAgICAgICAgICAgICAgICAgICAgICovCi07LyogICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JbW92CWVheCwgW2VkeF0uZHNfd19zaXplCi0Jc3ViCWVheCwgTUlOX0xPT0tBSEVBRAotCXN1YgllYnAsIGVheAotCWpnCVNIT1JUIExpbWl0UG9zaXRpdmUKLQl4b3IJZWJwLCBlYnAKLUxpbWl0UG9zaXRpdmU6Ci0KLTsvKiBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJZWF4LCBbZWR4XS5kc19wcmV2X2xlbmd0aAotCW1vdglbZXNwK2Jlc3RsZW5dLCBlYXgKLQotOy8qIFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gJWVzaSBsb2NhbGx5LCBhbmQgaW4gJWVzaS4gKi8KLQotCWFkZAllc2ksIGVheAotCW1vdglbZXNwK3dpbmRvd2Jlc3RsZW5dLCBlc2kKLQotOy8qIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLTsvKiByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7ICAgICAgICAgICAgICAgICovCi07LyogUG9zZiAqcHJldiA9IHMtPnByZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JbW92engJZWJ4LCBXT1JEIFBUUltlZGldCi0JbW92CVtlc3Arc2NhbnN0YXJ0XSwgZWJ4Ci0JbW92engJZWJ4LCBXT1JEIFBUUltlYXgrZWRpLTFdCi0JbW92CVtlc3Arc2NhbmVuZF0sIGVieAotCW1vdgllZGksIFtlZHhdLmRzX3ByZXYKLQotOy8qIEp1bXAgaW50byB0aGUgbWFpbiBsb29wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdgllZHgsIFtlc3ArY2hhaW5sZW53bWFza10KLQlqbXAJU0hPUlQgTG9vcEVudHJ5Ci0KLTsvKiBkbyB7Ci07ICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotOyAqICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKLTsgKiAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7Ci07ICogICAgIFsuLi5dCi07ICogfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Ci07ICogICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7Ci07ICoKLTsgKiBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlCi07ICogbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwKLTsgKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLTsgKgotOyAqIFdpdGhpbiB0aGlzIGxvb3A6Ci07ICogJWVieCA9IHNjYW5lbmQKLTsgKiAlZWN4ID0gY3VybWF0Y2gKLTsgKiAlZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spCi07ICogJWVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLTsgKiAlZWRpID0gcHJldgotOyAqICVlYnAgPSBsaW1pdAotOyAqLwotCi0JQUxJR04JNAotTG9va3VwTG9vcDoKLQlhbmQJZWN4LCBlZHgKLQltb3Z6eAllY3gsIFdPUkQgUFRSW2VkaStlY3gqMl0KLQljbXAJZWN4LCBlYnAKLQlqYmUJTGVhdmVOb3cKLQlzdWIJZWR4LCAwMDAwMTAwMDBICi0JanMJTGVhdmVOb3cKLQotTG9vcEVudHJ5OgotCW1vdnp4CWVheCwgV09SRCBQVFJbZXNpK2VjeC0xXQotCWNtcAllYXgsIGVieAotCWpueglTSE9SVCBMb29rdXBMb29wCi0KLQltb3YJZWF4LCBbZXNwK3dpbmRvd10KLQltb3Z6eAllYXgsIFdPUkQgUFRSW2VheCtlY3hdCi0JY21wCWVheCwgW2VzcCtzY2Fuc3RhcnRdCi0Jam56CVNIT1JUIExvb2t1cExvb3AKLQotOy8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdglbZXNwK2NoYWlubGVud21hc2tdLCBlZHgKLQotOy8qIFBvaW50ICVlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kICVlc2kgdG8gdGhlIHN0cmluZyB3ZSAgKi8KLTsvKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUgICAgICovCi07LyogYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCAlZWR4IGlzICAgICAqLwotOy8qIGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdgllc2ksIFtlc3Ard2luZG93XQotCW1vdgllZGksIFtlc3Arc2Nhbl0KLQlhZGQJZXNpLCBlY3gKLQltb3YJZWF4LCBbZXNwK3NjYW5hbGlnbl0KLQltb3YJZWR4LCAtTUFYX01BVENIXzgKLQlsZWEJZWRpLCBbZWRpK2VheCtNQVhfTUFUQ0hfOF0KLQlsZWEJZXNpLCBbZXNpK2VheCtNQVhfTUFUQ0hfOF0KLQotOy8qIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwKLTsgKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi07ICoKLTsgKiBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKLTsgKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi07ICogc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zCi07ICogYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSAlZWRpCi07ICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLTsgKgotOyAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQKLTsgKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotOyAqIHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQotOyAqIHBlcmZvcm1hbmNlLgotOyAqLwotCi1Mb29wQ21wczoKLQltb3YJZWF4LCBEV09SRCBQVFJbZXNpK2VkeF0KLQl4b3IJZWF4LCBEV09SRCBQVFJbZWRpK2VkeF0KLQlqbnoJU0hPUlQgTGVhdmVMb29wQ21wcwotCi0JbW92CWVheCwgRFdPUkQgUFRSW2VzaStlZHgrNF0KLQl4b3IJZWF4LCBEV09SRCBQVFJbZWRpK2VkeCs0XQotCWpueglTSE9SVCBMZWF2ZUxvb3BDbXBzNAotCi0JYWRkCWVkeCwgOAotCWpueglTSE9SVCBMb29wQ21wcwotCWptcAlMZW5NYXhpbXVtCi0JQUxJR04JNAotCi1MZWF2ZUxvb3BDbXBzNDoKLQlhZGQJZWR4LCA0Ci0KLUxlYXZlTG9vcENtcHM6Ci0JdGVzdAllYXgsIDAwMDAwRkZGRkgKLQlqbnoJU0hPUlQgTGVuTG93ZXIKLQotCWFkZAllZHgsIDIKLQlzaHIJZWF4LCAxNgotCi1MZW5Mb3dlcjoKLQlzdWIJYWwsIDEKLQlhZGMJZWR4LCAwCi0KLTsvKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwgICovCi07LyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuICAqLwotCi0JbGVhCWVheCwgW2VkaStlZHhdCi0JbW92CWVkaSwgW2VzcCtzY2FuXQotCXN1YgllYXgsIGVkaQotCWNtcAllYXgsIE1BWF9NQVRDSAotCWpnZQlTSE9SVCBMZW5NYXhpbXVtCi0KLTsvKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UgICAgICovCi07LyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLiAgICAgICAgICAqLwotCi0JbW92CWVkeCwgW2VzcCtkZWZsYXRlc3RhdGVdCi0JbW92CWVieCwgW2VzcCtiZXN0bGVuXQotCWNtcAllYXgsIGVieAotCWpnCVNIT1JUIExvbmdlck1hdGNoCi0JbW92CWVzaSwgW2VzcCt3aW5kb3diZXN0bGVuXQotCW1vdgllZGksIFtlZHhdLmRzX3ByZXYKLQltb3YJZWJ4LCBbZXNwK3NjYW5lbmRdCi0JbW92CWVkeCwgW2VzcCtjaGFpbmxlbndtYXNrXQotCWptcAlMb29rdXBMb29wCi0JQUxJR04JNAotCi07LyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotOy8qICAgICAgICAgYmVzdF9sZW4gPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLTsvKiAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi07LyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7ICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1Mb25nZXJNYXRjaDoKLQltb3YJZWJ4LCBbZXNwK25pY2VtYXRjaF0KLQltb3YJW2VzcCtiZXN0bGVuXSwgZWF4Ci0JbW92CVtlZHhdLmRzX21hdGNoX3N0YXJ0LCBlY3gKLQljbXAJZWF4LCBlYngKLQlqZ2UJU0hPUlQgTGVhdmVOb3cKLQltb3YJZXNpLCBbZXNwK3dpbmRvd10KLQlhZGQJZXNpLCBlYXgKLQltb3YJW2VzcCt3aW5kb3diZXN0bGVuXSwgZXNpCi0JbW92engJZWJ4LCBXT1JEIFBUUltlZGkrZWF4LTFdCi0JbW92CWVkaSwgW2VkeF0uZHNfcHJldgotCW1vdglbZXNwK3NjYW5lbmRdLCBlYngKLQltb3YJZWR4LCBbZXNwK2NoYWlubGVud21hc2tdCi0Jam1wCUxvb2t1cExvb3AKLQlBTElHTgk0Ci0KLTsvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4gICAgICAgICovCi0KLUxlbk1heGltdW06Ci0JbW92CWVkeCwgW2VzcCtkZWZsYXRlc3RhdGVdCi0JbW92CURXT1JEIFBUUltlc3ArYmVzdGxlbl0sIE1BWF9NQVRDSAotCW1vdglbZWR4XS5kc19tYXRjaF9zdGFydCwgZWN4Ci0KLTsvKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47ICAgICAgICAgICovCi07LyogcmV0dXJuIHMtPmxvb2thaGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1MZWF2ZU5vdzoKLQltb3YJZWR4LCBbZXNwK2RlZmxhdGVzdGF0ZV0KLQltb3YJZWJ4LCBbZXNwK2Jlc3RsZW5dCi0JbW92CWVheCwgW2VkeF0uZHNfbG9va2FoZWFkCi0JY21wCWVieCwgZWF4Ci0JamcJU0hPUlQgTG9va2FoZWFkUmV0Ci0JbW92CWVheCwgZWJ4Ci1Mb29rYWhlYWRSZXQ6Ci0KLTsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLgotCi0JYWRkCWVzcCwgdmFyc2l6ZQotCXBvcAllYngKLQlwb3AJZXNpCi0JcG9wCWVkaQotCXBvcAllYnAKLQlyZXQKLQotX2xvbmdlc3RfbWF0Y2gJRU5EUAotCi1fVEVYVAlFTkRTCi1FTkQKKw0KKzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvIG9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQ0KKzsNCis7IFVwZGF0ZWQgZm9yIHpsaWIgMS4xLjMgYW5kIGNvbnZlcnRlZCB0byBNQVNNIDYuMXgNCis7IENvcHlyaWdodCAoQykgMjAwMCBEYW4gSGlnZG9uIDxoZGFuQGtpbmVzb2Z0LmNvbT4NCis7ICAgICAgICAgICAgICAgICAgICBhbmQgQ2h1Y2sgV2FsYm91cm4gPGNodWNrd0BraW5lc29mdC5jb20+DQorOyBDb3JyZWN0aW9ucyBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4NCis7DQorOyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCis7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQorDQorOyBCYXNlZCBvbiBtYXRjaC5TDQorOyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQorOyBDb3B5cmlnaHQgKEMpIDE5OTggQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4NCis7DQorOyBNb2RpZmllZCBieSBHaWxsZXMgVm9sbGFudCAoMjAwNSkgZm9yIGFkZCBnemhlYWQgYW5kIGd6aW5kZXgNCisNCisJLjY4NlANCisJLk1PREVMCUZMQVQNCisNCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorOyBFUVVBVEVTDQorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK01BWF9NQVRDSAlFUVUgMjU4DQorTUlOX01BVENICUVRVSAzDQorTUlOX0xPT0tBSEVBRAlFUVUgKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpDQorTUFYX01BVENIXzgJRVFVICgoTUFYX01BVENIICsgNykgQU5EIChOT1QgNykpDQorDQorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKzsgU1RSVUNUVVJFUw0KKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCis7IFRoaXMgU1RSVUNUIGFzc3VtZXMgYSA0LWJ5dGUgYWxpZ25tZW50DQorDQorREVGTEFURV9TVEFURQlTVFJVQ1QNCitkc19zdHJtCQkJZGQgPw0KK2RzX3N0YXR1cwkJZGQgPw0KK2RzX3BlbmRpbmdfYnVmCQlkZCA/DQorZHNfcGVuZGluZ19idWZfc2l6ZQlkZCA/DQorZHNfcGVuZGluZ19vdXQJCWRkID8NCitkc19wZW5kaW5nCQlkZCA/DQorZHNfd3JhcAkJCWRkID8NCis7IGd6aGVhZCBhbmQgZ3ppbmRleCBhcmUgYWRkZWQgaW4gemxpYiAxLjIuMi4yIChzZWUgZGVmbGF0ZS5oKQ0KK2RzX2d6aGVhZCAgICAgICAgICAgICAgIGRkID8NCitkc19nemluZGV4ICAgICAgICAgICAgICBkZCA/DQorZHNfZGF0YV90eXBlCQlkYiA/DQorZHNfbWV0aG9kCQlkYiA/DQorCQkJZGIgPwk7IHBhZGRpbmcNCisJCQlkYiA/CTsgcGFkZGluZw0KK2RzX2xhc3RfZmx1c2gJCWRkID8NCitkc193X3NpemUJCWRkID8JOyB1c2VkDQorZHNfd19iaXRzCQlkZCA/DQorZHNfd19tYXNrCQlkZCA/CTsgdXNlZA0KK2RzX3dpbmRvdwkJZGQgPwk7IHVzZWQNCitkc193aW5kb3dfc2l6ZQkJZGQgPw0KK2RzX3ByZXYJCQlkZCA/CTsgdXNlZA0KK2RzX2hlYWQJCQlkZCA/DQorZHNfaW5zX2gJCWRkID8NCitkc19oYXNoX3NpemUJCWRkID8NCitkc19oYXNoX2JpdHMJCWRkID8NCitkc19oYXNoX21hc2sJCWRkID8NCitkc19oYXNoX3NoaWZ0CQlkZCA/DQorZHNfYmxvY2tfc3RhcnQJCWRkID8NCitkc19tYXRjaF9sZW5ndGgJCWRkID8JOyB1c2VkDQorZHNfcHJldl9tYXRjaAkJZGQgPwk7IHVzZWQNCitkc19tYXRjaF9hdmFpbGFibGUJZGQgPw0KK2RzX3N0cnN0YXJ0CQlkZCA/CTsgdXNlZA0KK2RzX21hdGNoX3N0YXJ0CQlkZCA/CTsgdXNlZA0KK2RzX2xvb2thaGVhZAkJZGQgPwk7IHVzZWQNCitkc19wcmV2X2xlbmd0aAkJZGQgPwk7IHVzZWQNCitkc19tYXhfY2hhaW5fbGVuZ3RoCWRkID8JOyB1c2VkDQorZHNfbWF4X2xheHlfbWF0Y2gJZGQgPw0KK2RzX2xldmVsCQlkZCA/DQorZHNfc3RyYXRlZ3kJCWRkID8NCitkc19nb29kX21hdGNoCQlkZCA/CTsgdXNlZA0KK2RzX25pY2VfbWF0Y2gJCWRkID8JOyB1c2VkDQorDQorOyBEb24ndCBuZWVkIGFueW1vcmUgb2YgdGhlIHN0cnVjdCBmb3IgbWF0Y2gNCitERUZMQVRFX1NUQVRFCUVORFMNCisNCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorOyBDT0RFDQorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK19URVhUCVNFR01FTlQNCisNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOyBtYXRjaF9pbml0DQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwlBTElHTgk0DQorUFVCTElDCV9tYXRjaF9pbml0DQorX21hdGNoX2luaXQJUFJPQw0KKwk7IG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZA0KKwlyZXQNCitfbWF0Y2hfaW5pdAlFTkRQDQorDQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzsgdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCUFMSUdOCTQNCisNCitQVUJMSUMJX2xvbmdlc3RfbWF0Y2gNCitfbG9uZ2VzdF9tYXRjaAlQUk9DDQorDQorOyBTaW5jZSB0aGlzIGNvZGUgdXNlcyBFQlAgZm9yIGEgc2NyYXRjaCByZWdpc3RlciwgdGhlIHN0YWNrIGZyYW1lIG11c3QNCis7IGJlIG1hbnVhbGx5IGNvbnN0cnVjdGVkIGFuZCByZWZlcmVuY2VkIHJlbGF0aXZlIHRvIHRoZSBFU1AgcmVnaXN0ZXIuDQorDQorOyBTdGFjayBpbWFnZQ0KKzsgVmFyaWFibGVzDQorY2hhaW5sZW53bWFzawk9ICAwCTsgaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbg0KKwkJCTsgbG93IHdvcmQ6IHMtPndtYXNrDQord2luZG93CQk9ICA0CTsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cNCit3aW5kb3diZXN0bGVuCT0gIDgJOyBzLT53aW5kb3cgKyBiZXN0bGVuDQorc2NhbmVuZAkJPSAxMgk7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0KK3NjYW5zdGFydAk9IDE2CTsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0KK3NjYW5hbGlnbgk9IDIwCTsgZHdvcmQtbWlzYWxpZ25tZW50IG9mIHN0cmluZw0KK25pY2VtYXRjaAk9IDI0CTsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorYmVzdGxlbgkJPSAyOAk7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXINCitzY2FuCQk9IDMyCTsgcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoDQordmFyc2l6ZQkJPSAzNgk7IG51bWJlciBvZiBieXRlcyAoYWxzbyBvZmZzZXQgdG8gbGFzdCBzYXZlZCByZWdpc3RlcikNCisNCis7IFNhdmVkIFJlZ2lzdGVycyAoYWN0dWFsbHkgcHVzaGVkIGludG8gcGxhY2UpDQorZWJ4X3NhdmUJPSAzNg0KK2VkaV9zYXZlCT0gNDANCitlc2lfc2F2ZQk9IDQ0DQorZWJwX3NhdmUJPSA0OA0KKw0KKzsgUGFyYW1ldGVycw0KK3JldGFkZHIJCT0gNTINCitkZWZsYXRlc3RhdGUJPSA1Ng0KK2N1cm1hdGNoCT0gNjANCisNCis7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZw0KKwlwdXNoCWVicA0KKwlwdXNoCWVkaQ0KKwlwdXNoCWVzaQ0KKwlwdXNoCWVieA0KKw0KKzsgQWxsb2NhdGUgbG9jYWwgdmFyaWFibGUgc3BhY2UNCisJc3ViCWVzcCx2YXJzaXplDQorDQorOyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaA0KKzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KKzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCis7IGVudGVyaW5nIHRoZSBtYWluIGxvb3ApLg0KKw0KKwltb3YJZWR4LCBbZXNwK2RlZmxhdGVzdGF0ZV0NCitBU1NVTUUJZWR4OlBUUiBERUZMQVRFX1NUQVRFDQorDQorCW1vdgllY3gsIFtlc3ArY3VybWF0Y2hdDQorDQorOyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKzsgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsNCis7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQorOyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KKzsgfQ0KKw0KKwltb3YJZWF4LCBbZWR4XS5kc19wcmV2X2xlbmd0aA0KKwltb3YJZWJ4LCBbZWR4XS5kc19nb29kX21hdGNoDQorCWNtcAllYXgsIGVieA0KKwltb3YJZWF4LCBbZWR4XS5kc193X21hc2sNCisJbW92CWVieCwgW2VkeF0uZHNfbWF4X2NoYWluX2xlbmd0aA0KKwlqbAlTSE9SVCBMYXN0TWF0Y2hHb29kDQorCXNocgllYngsIDINCitMYXN0TWF0Y2hHb29kOg0KKw0KKzsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbg0KKzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KKzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCis7IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuDQorDQorCWRlYwllYngNCisJc2hsCWVieCwgMTYNCisJb3IJZWJ4LCBlYXgNCisJbW92CVtlc3ArY2hhaW5sZW53bWFza10sIGVieA0KKw0KKzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorDQorCW1vdgllYXgsIFtlZHhdLmRzX25pY2VfbWF0Y2gNCisJbW92CWVieCwgW2VkeF0uZHNfbG9va2FoZWFkDQorCWNtcAllYngsIGVheA0KKwlqbAlTSE9SVCBMb29rYWhlYWRMZXNzDQorCW1vdgllYngsIGVheA0KK0xvb2thaGVhZExlc3M6DQorCW1vdglbZXNwK25pY2VtYXRjaF0sIGVieA0KKw0KKzsvKiByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICovDQorDQorCW1vdgllc2ksIFtlZHhdLmRzX3dpbmRvdw0KKwltb3YJW2VzcCt3aW5kb3ddLCBlc2kNCisJbW92CWVicCwgW2VkeF0uZHNfc3Ryc3RhcnQNCisJbGVhCWVkaSwgW2VzaStlYnBdDQorCW1vdglbZXNwK3NjYW5dLGVkaQ0KKw0KKzsvKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nICAgICAgICAgICAgICovDQorOy8qIGR3b3JkLWFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisJbW92CWVheCwgZWRpDQorCW5lZwllYXgNCisJYW5kCWVheCwgMw0KKwltb3YJW2VzcCtzY2FuYWxpZ25dLCBlYXgNCisNCis7LyogSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPyAgICAgICAgICAgICAgICAgICAgICAqLw0KKzsvKiAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCW1vdgllYXgsIFtlZHhdLmRzX3dfc2l6ZQ0KKwlzdWIJZWF4LCBNSU5fTE9PS0FIRUFEDQorCXN1YgllYnAsIGVheA0KKwlqZwlTSE9SVCBMaW1pdFBvc2l0aXZlDQorCXhvcgllYnAsIGVicA0KK0xpbWl0UG9zaXRpdmU6DQorDQorOy8qIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisJbW92CWVheCwgW2VkeF0uZHNfcHJldl9sZW5ndGgNCisJbW92CVtlc3ArYmVzdGxlbl0sIGVheA0KKw0KKzsvKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuICovDQorDQorCWFkZAllc2ksIGVheA0KKwltb3YJW2VzcCt3aW5kb3diZXN0bGVuXSwgZXNpDQorDQorOy8qIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCis7LyogcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOyAgICAgICAgICAgICAgICAqLw0KKzsvKiBQb3NmICpwcmV2ID0gcy0+cHJldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCW1vdnp4CWVieCwgV09SRCBQVFJbZWRpXQ0KKwltb3YJW2VzcCtzY2Fuc3RhcnRdLCBlYngNCisJbW92engJZWJ4LCBXT1JEIFBUUltlYXgrZWRpLTFdDQorCW1vdglbZXNwK3NjYW5lbmRdLCBlYngNCisJbW92CWVkaSwgW2VkeF0uZHNfcHJldg0KKw0KKzsvKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCW1vdgllZHgsIFtlc3ArY2hhaW5sZW53bWFza10NCisJam1wCVNIT1JUIExvb3BFbnRyeQ0KKw0KKzsvKiBkbyB7DQorOyAqICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCis7ICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KKzsgKiAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7DQorOyAqICAgICBbLi4uXQ0KKzsgKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCis7ICogICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQorOyAqDQorOyAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCis7ICogbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwNCis7ICogYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQorOyAqDQorOyAqIFdpdGhpbiB0aGlzIGxvb3A6DQorOyAqICVlYnggPSBzY2FuZW5kDQorOyAqICVlY3ggPSBjdXJtYXRjaA0KKzsgKiAlZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spDQorOyAqICVlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pDQorOyAqICVlZGkgPSBwcmV2DQorOyAqICVlYnAgPSBsaW1pdA0KKzsgKi8NCisNCisJQUxJR04JNA0KK0xvb2t1cExvb3A6DQorCWFuZAllY3gsIGVkeA0KKwltb3Z6eAllY3gsIFdPUkQgUFRSW2VkaStlY3gqMl0NCisJY21wCWVjeCwgZWJwDQorCWpiZQlMZWF2ZU5vdw0KKwlzdWIJZWR4LCAwMDAwMTAwMDBIDQorCWpzCUxlYXZlTm93DQorDQorTG9vcEVudHJ5Og0KKwltb3Z6eAllYXgsIFdPUkQgUFRSW2VzaStlY3gtMV0NCisJY21wCWVheCwgZWJ4DQorCWpueglTSE9SVCBMb29rdXBMb29wDQorDQorCW1vdgllYXgsIFtlc3Ard2luZG93XQ0KKwltb3Z6eAllYXgsIFdPUkQgUFRSW2VheCtlY3hdDQorCWNtcAllYXgsIFtlc3Arc2NhbnN0YXJ0XQ0KKwlqbnoJU0hPUlQgTG9va3VwTG9vcA0KKw0KKzsvKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCW1vdglbZXNwK2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7LyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlICAqLw0KKzsvKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUgICAgICovDQorOy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcyAgICAgKi8NCis7LyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKwltb3YJZXNpLCBbZXNwK3dpbmRvd10NCisJbW92CWVkaSwgW2VzcCtzY2FuXQ0KKwlhZGQJZXNpLCBlY3gNCisJbW92CWVheCwgW2VzcCtzY2FuYWxpZ25dDQorCW1vdgllZHgsIC1NQVhfTUFUQ0hfOA0KKwlsZWEJZWRpLCBbZWRpK2VheCtNQVhfTUFUQ0hfOF0NCisJbGVhCWVzaSwgW2VzaStlYXgrTUFYX01BVENIXzhdDQorDQorOy8qIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7ICogYWRqdXN0ICVlZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLg0KKzsgKg0KKzsgKiBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCis7ICogc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQ0KKzsgKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMNCis7ICogYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSAlZWRpDQorOyAqIHBvaW50ZXIuICglZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOyAqDQorOyAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7ICogbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7ICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOyAqIHBlcmZvcm1hbmNlLg0KKzsgKi8NCisNCitMb29wQ21wczoNCisJbW92CWVheCwgRFdPUkQgUFRSW2VzaStlZHhdDQorCXhvcgllYXgsIERXT1JEIFBUUltlZGkrZWR4XQ0KKwlqbnoJU0hPUlQgTGVhdmVMb29wQ21wcw0KKw0KKwltb3YJZWF4LCBEV09SRCBQVFJbZXNpK2VkeCs0XQ0KKwl4b3IJZWF4LCBEV09SRCBQVFJbZWRpK2VkeCs0XQ0KKwlqbnoJU0hPUlQgTGVhdmVMb29wQ21wczQNCisNCisJYWRkCWVkeCwgOA0KKwlqbnoJU0hPUlQgTG9vcENtcHMNCisJam1wCUxlbk1heGltdW0NCisJQUxJR04JNA0KKw0KK0xlYXZlTG9vcENtcHM0Og0KKwlhZGQJZWR4LCA0DQorDQorTGVhdmVMb29wQ21wczoNCisJdGVzdAllYXgsIDAwMDAwRkZGRkgNCisJam56CVNIT1JUIExlbkxvd2VyDQorDQorCWFkZAllZHgsIDINCisJc2hyCWVheCwgMTYNCisNCitMZW5Mb3dlcjoNCisJc3ViCWFsLCAxDQorCWFkYwllZHgsIDANCisNCis7LyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsICAqLw0KKzsvKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4gICovDQorDQorCWxlYQllYXgsIFtlZGkrZWR4XQ0KKwltb3YJZWRpLCBbZXNwK3NjYW5dDQorCXN1YgllYXgsIGVkaQ0KKwljbXAJZWF4LCBNQVhfTUFUQ0gNCisJamdlCVNIT1JUIExlbk1heGltdW0NCisNCis7LyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlICAgICAqLw0KKzsvKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuICAgICAgICAgICovDQorDQorCW1vdgllZHgsIFtlc3ArZGVmbGF0ZXN0YXRlXQ0KKwltb3YJZWJ4LCBbZXNwK2Jlc3RsZW5dDQorCWNtcAllYXgsIGVieA0KKwlqZwlTSE9SVCBMb25nZXJNYXRjaA0KKwltb3YJZXNpLCBbZXNwK3dpbmRvd2Jlc3RsZW5dDQorCW1vdgllZGksIFtlZHhdLmRzX3ByZXYNCisJbW92CWVieCwgW2VzcCtzY2FuZW5kXQ0KKwltb3YJZWR4LCBbZXNwK2NoYWlubGVud21hc2tdDQorCWptcAlMb29rdXBMb29wDQorCUFMSUdOCTQNCisNCis7LyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKzsvKiAgICAgICAgIGJlc3RfbGVuID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorOy8qICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCis7LyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7ICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KK0xvbmdlck1hdGNoOg0KKwltb3YJZWJ4LCBbZXNwK25pY2VtYXRjaF0NCisJbW92CVtlc3ArYmVzdGxlbl0sIGVheA0KKwltb3YJW2VkeF0uZHNfbWF0Y2hfc3RhcnQsIGVjeA0KKwljbXAJZWF4LCBlYngNCisJamdlCVNIT1JUIExlYXZlTm93DQorCW1vdgllc2ksIFtlc3Ard2luZG93XQ0KKwlhZGQJZXNpLCBlYXgNCisJbW92CVtlc3Ard2luZG93YmVzdGxlbl0sIGVzaQ0KKwltb3Z6eAllYngsIFdPUkQgUFRSW2VkaStlYXgtMV0NCisJbW92CWVkaSwgW2VkeF0uZHNfcHJldg0KKwltb3YJW2VzcCtzY2FuZW5kXSwgZWJ4DQorCW1vdgllZHgsIFtlc3ArY2hhaW5sZW53bWFza10NCisJam1wCUxvb2t1cExvb3ANCisJQUxJR04JNA0KKw0KKzsvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4gICAgICAgICovDQorDQorTGVuTWF4aW11bToNCisJbW92CWVkeCwgW2VzcCtkZWZsYXRlc3RhdGVdDQorCW1vdglEV09SRCBQVFJbZXNwK2Jlc3RsZW5dLCBNQVhfTUFUQ0gNCisJbW92CVtlZHhdLmRzX21hdGNoX3N0YXJ0LCBlY3gNCisNCis7LyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOyAgICAgICAgICAqLw0KKzsvKiByZXR1cm4gcy0+bG9va2FoZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorTGVhdmVOb3c6DQorCW1vdgllZHgsIFtlc3ArZGVmbGF0ZXN0YXRlXQ0KKwltb3YJZWJ4LCBbZXNwK2Jlc3RsZW5dDQorCW1vdgllYXgsIFtlZHhdLmRzX2xvb2thaGVhZA0KKwljbXAJZWJ4LCBlYXgNCisJamcJU0hPUlQgTG9va2FoZWFkUmV0DQorCW1vdgllYXgsIGVieA0KK0xvb2thaGVhZFJldDoNCisNCis7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCisNCisJYWRkCWVzcCwgdmFyc2l6ZQ0KKwlwb3AJZWJ4DQorCXBvcAllc2kNCisJcG9wCWVkaQ0KKwlwb3AJZWJwDQorCXJldA0KKw0KK19sb25nZXN0X21hdGNoCUVORFANCisNCitfVEVYVAlFTkRTDQorRU5EDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9tYXNteDY0L2JsZF9tbDY0LmJhdCBiL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MzQzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKQEAgLTAsMCArMSwyIEBACittbDY0LmV4ZSAvRmxpbmZmYXN4NjQgL2MgL1ppIGluZmZhc3g2NC5hc20NCittbDY0LmV4ZSAvRmxndm1hdDY0ICAgL2MgL1ppIGd2bWF0NjQuYXNtDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtIGIvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTIxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20KQEAgLTAsMCArMSw0NjQgQEAKKzt1SW50IGxvbmdlc3RfbWF0Y2hfeDY0KA0KKzsgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCis7ICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCis7IGd2bWF0NjQuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYNCis7IENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCis7ICBmcm9tIEplYW4tbG91cCBHYWlsbHkgaW4gZGVmbGF0ZS5jDQorOyAgYW5kIG1vZGlmeWluZyBhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwNCis7ICAgICAgd3JpdHRlbiAxOTk4DQorOyAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQNCis7ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KKzsgICAgICAgICBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sDQorOw0KKzsgdG8gY29tcGlsZSB0aGlzIGZpbGUsIEkgdXNlIG9wdGlvbg0KKzsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSBndm1hdDY0LmFzbQ0KKzsgICB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0DQorOw0KKzsgICBtbDY0LmV4ZSBpcyBnaXZlbiB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNSwgV2luZG93cyAyMDAzIHNlcnZlciBEREsNCis7DQorOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIDIwMDMgc2VydmVyIERESyB3aXRoIG1sNjQgYW5kIGNsIGZvciBBTUQ2NCBmcm9tDQorOyAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldnRvb2xzL2Rkay9kZWZhdWx0Lm1zcHggZm9yIGxvdyBwcmljZSkNCis7DQorOyBCZSBjYXJyZWZ1bGwgdG8gYWRhcHQgemxpYjEyMjJhZGQgYmVsb3cgdG8geW91ciB2ZXJzaW9uIG9mIHpMaWINCisNCisNCis7dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisuY29kZQ0KK2xvbmdlc3RfbWF0Y2ggUFJPQw0KKw0KKw0KKztMb2NhbFZhcnNTaXplICAgZXF1IDg4DQorIExvY2FsVmFyc1NpemUgICBlcXUgNzINCisNCis7IHJlZ2lzdGVyIHVzZWQgOiByYXgscmJ4LHJjeCxyZHgscnNpLHJkaSxyOCxyOSxyMTAscjExLHIxMg0KKzsgZnJlZSByZWdpc3RlciA6ICByMTQscjE1DQorOyByZWdpc3RlciBjYW4gYmUgc2F2ZWQgOiByc3ANCisNCisgY2hhaW5sZW53bWFzayAgIGVxdSAgcnNwICsgOCAtIExvY2FsVmFyc1NpemUgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQorO3dpbmRvdyAgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cgOyBzdG9yZWQgaW4gcjEwDQorO3dpbmRvd2Jlc3RsZW4gICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgcy0+d2luZG93ICsgYmVzdGxlbiAsIHVzZSByMTArcjExDQorO3NjYW5zdGFydCAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZyA7IHN0b3JlZCBpbiByMTJ3DQorO3NjYW5lbmQgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nIHVzZSBlYngNCis7c2NhbmFsaWduICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nIHIxMw0KKztiZXN0bGVuICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIgLT4gcjExZA0KKztzY2FuICAgICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaCAtPiByOQ0KKyBuaWNlbWF0Y2ggICAgICAgZXF1ICByc3AgKyAxNiAtIExvY2FsVmFyc1NpemUgICA7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZSAtPiByMTQNCisNCitzYXZlX3JkaSAgICAgICAgZXF1ICByc3AgKyAyNCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JzaSAgICAgICAgZXF1ICByc3AgKyAzMiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JieCAgICAgICAgZXF1ICByc3AgKyA0MCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JicCAgICAgICAgZXF1ICByc3AgKyA0OCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMiAgICAgICAgZXF1ICByc3AgKyA1NiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMyAgICAgICAgZXF1ICByc3AgKyA2NCAtIExvY2FsVmFyc1NpemUNCis7c2F2ZV9yMTQgICAgICAgIGVxdSAgcnNwICsgNzIgLSBMb2NhbFZhcnNTaXplDQorO3NhdmVfcjE1ICAgICAgICBlcXUgIHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZQ0KKw0KKw0KKw0KKzsgIGFsbCB0aGUgKzQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBwZW5kaW5nX2J1Zl9zaXplIChpbiB6bGliDQorOyAgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHJlbW92ZSB0aGUgKzQpLg0KKzsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KKw0KKw0KKyAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQorICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQorICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQ0KKw0KKw0KKzs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQorOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCis7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KKzs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQorOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCis7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCisNCis7ICBhbGwgdGhlICt6bGliMTIyMmFkZCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIGZpZWxkcw0KKzsgIGluIHpsaWIgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4NCis7ICBpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4yLjIuMiBvciBsYXRlciAsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDgiKS4NCisNCit6bGliMTIyMmFkZCAgICAgZXF1IDgNCisNCitkc1dTaXplICAgICAgICAgZXF1IDU2K3psaWIxMjIyYWRkKyh6bGliMTIyMmFkZC8yKQ0KK2RzV01hc2sgICAgICAgICBlcXUgNjQremxpYjEyMjJhZGQrKHpsaWIxMjIyYWRkLzIpDQorZHNXaW5kb3cgICAgICAgIGVxdSA3Mit6bGliMTIyMmFkZA0KK2RzUHJldiAgICAgICAgICBlcXUgODgremxpYjEyMjJhZGQNCitkc01hdGNoTGVuICAgICAgZXF1IDEyOCt6bGliMTIyMmFkZA0KK2RzUHJldk1hdGNoICAgICBlcXUgMTMyK3psaWIxMjIyYWRkDQorZHNTdHJTdGFydCAgICAgIGVxdSAxNDAremxpYjEyMjJhZGQNCitkc01hdGNoU3RhcnQgICAgZXF1IDE0NCt6bGliMTIyMmFkZA0KK2RzTG9va2FoZWFkICAgICBlcXUgMTQ4K3psaWIxMjIyYWRkDQorZHNQcmV2TGVuICAgICAgIGVxdSAxNTIremxpYjEyMjJhZGQNCitkc01heENoYWluTGVuICAgZXF1IDE1Nit6bGliMTIyMmFkZA0KK2RzR29vZE1hdGNoICAgICBlcXUgMTcyK3psaWIxMjIyYWRkDQorZHNOaWNlTWF0Y2ggICAgIGVxdSAxNzYremxpYjEyMjJhZGQNCisNCisNCis7IHBhcmFtZXRlciAxIGluIHI4KGRlZmxhdGUgc3RhdGUgcyksIHBhcmFtIDIgaW4gcmR4IChjdXIgbWF0Y2gpDQorDQorOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCis7IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQorOw0KKzsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCis7ICAgcmF4LCByY3gsIHJkeCwgcjgsIHItOSwgcjEwLCBhbmQgcjExLCB3aGljaCBhcmUgc2NyYXRjaC4NCisNCisNCisNCis7OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bw0KKzs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4NCisNCisNCis7OzsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gcjhkIHdpbGwgaG9sZCBjdXJfbWF0Y2gNCis7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KKzs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQ0KKzs7OyBlbnRlcmluZyB0aGUgbWFpbiBsb29wLg0KKw0KKzsgcGFyYW1ldGVyIDEgaW4gcmN4IChkZWZsYXRlX3N0YXRlKiBzKSwgcGFyYW0gMiBpbiBlZHggLT4gcjggKGN1ciBtYXRjaCkNCisNCis7IHRoaXMgY2xlYXIgaGlnaCAzMiBiaXRzIG9mIHI4LCB3aGljaCBjYW4gYmUgZ2FyYmFnZSBpbiBib3RoIHI4IGFuZCByZHgNCisNCisNCisgICAgICAgIG1vdiBbc2F2ZV9yZGldLHJkaQ0KKyAgICAgICAgbW92IFtzYXZlX3JzaV0scnNpDQorICAgICAgICBtb3YgW3NhdmVfcmJ4XSxyYngNCisgICAgICAgIG1vdiBbc2F2ZV9yYnBdLHJicA0KKyAgICAgICAgbW92IHI4ZCxlZHgNCisgICAgICAgIG1vdiBbc2F2ZV9yMTJdLHIxMg0KKyAgICAgICAgbW92IFtzYXZlX3IxM10scjEzDQorOyAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQorOyAgICAgICAgbW92IFtzYXZlX3IxNV0scjE1DQorDQorDQorOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQorOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQorOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQorOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQorOzs7IH0NCisNCisgICAgICAgIG1vdiBlZGksIFtyY3ggKyBkc1ByZXZMZW5dDQorICAgICAgICBtb3YgZXNpLCBbcmN4ICsgZHNHb29kTWF0Y2hdDQorICAgICAgICBtb3YgZWF4LCBbcmN4ICsgZHNXTWFza10NCisgICAgICAgIG1vdiBlYngsIFtyY3ggKyBkc01heENoYWluTGVuXQ0KKyAgICAgICAgY21wIGVkaSwgZXNpDQorICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KKyAgICAgICAgc2hyIGVieCwgMg0KK0xhc3RNYXRjaEdvb2Q6DQorDQorOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCis7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KKzs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KKzs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KKw0KKyAgICAgICAgZGVjIGVieA0KKyAgICAgICAgc2hsIGVieCwgMTYNCisgICAgICAgIG9yICBlYngsIGVheA0KKyAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4DQorDQorOzs7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOw0KKw0KKyAgICAgICAgbW92IGVheCwgW3JjeCArIGRzTmljZU1hdGNoXQ0KKyAgICAgICAgbW92IHIxMGQsIFtyY3ggKyBkc0xvb2thaGVhZF0NCisgICAgICAgIGNtcCByMTBkLCBlYXgNCisgICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCisgICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQorTG9va2FoZWFkTGVzczoNCisNCis7OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCisNCisgICAgICAgIG1vdiByMTAsIFtyY3ggKyBkc1dpbmRvd10NCisgICAgICAgIG1vdiBlYnAsIFtyY3ggKyBkc1N0clN0YXJ0XQ0KKyAgICAgICAgbGVhIHIxMywgW3IxMCArIHJicF0NCisNCis7OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZw0KKzs7OyBkd29yZC1hbGlnbmVkLg0KKw0KKyAgICAgICAgIG1vdiByOSxyMTMNCisgICAgICAgICBuZWcgcjEzDQorICAgICAgICAgYW5kIHIxMywzDQorDQorOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorICAgICAgICBtb3YgZWF4LCBbcmN4ICsgZHNXU2l6ZV0NCisgICAgICAgIHN1YiBlYXgsIE1JTl9MT09LQUhFQUQNCisgICAgICAgIHhvciBlZGksZWRpDQorICAgICAgICBzdWIgZWJwLCBlYXgNCisNCisgICAgICAgIG1vdiByMTFkLCBbcmN4ICsgZHNQcmV2TGVuXQ0KKw0KKyAgICAgICAgY21vdm5nIGVicCxlZGkNCisNCis7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQorDQorDQorOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQorDQorICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KKw0KKzs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCisNCisgICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KKyAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtyOSArIHIxMSAtIDFdDQorICAgICAgICBtb3YgcmRpLCBbcmN4ICsgZHNQcmV2XQ0KKw0KKzs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCisNCisgICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AxOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkxOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AyOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkyOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3A0Og0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnk0Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisgICAgICAgIGptcCBMb29rdXBMb29wSXNaZXJvDQorDQorDQorOzs7IGRvIHsNCis7OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KKzs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQorOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCis7OzsgICAgIFsuLi5dDQorOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KKzs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCis7OzsNCis7OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KKzs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KKzs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCis7OzsNCis7OzsgV2l0aGluIHRoaXMgbG9vcDoNCis7OzsgZWJ4ID0gc2NhbmVuZA0KKzs7OyByOGQgPSBjdXJtYXRjaA0KKzs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCis7OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKzs7OyBlZGkgPSBwcmV2DQorOzs7IGVicCA9IGxpbWl0DQorDQorTG9va3VwTG9vcDoNCisgICAgICAgIGFuZCByOGQsIGVkeA0KKw0KKyAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KKyAgICAgICAgY21wIHI4ZCwgZWJwDQorICAgICAgICBqYmUgTGVhdmVOb3cNCisgICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaA0KKyAgICAgICAganMgIExlYXZlTm93DQorDQorTG9vcEVudHJ5Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCitMb29rdXBMb29wSXNaZXJvOg0KKyAgICAgICAgY21wICAgICByMTJ3LCB3b3JkIHB0ciBbcjEwICsgcjhdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisNCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KKyAgICAgICAgbW92IHJkeCwgMGZmZmZmZmZmZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KKyAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKw0KKyAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCisgICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KKztMb29wQ21wczoNCis7ICAgICAgICBtb3YgZWF4LCBbcnNpICsgcmR4XQ0KKzsgICAgICAgIHhvciBlYXgsIFtyZGkgKyByZHhdDQorOyAgICAgICAgam56IExlYXZlTG9vcENtcHMNCis7ICAgICAgICBtb3YgZWF4LCBbcnNpICsgcmR4ICsgNF0NCis7ICAgICAgICB4b3IgZWF4LCBbcmRpICsgcmR4ICsgNF0NCis7ICAgICAgICBqbnogTGVhdmVMb29wQ21wczQNCis7ICAgICAgICBhZGQgcmR4LCA4DQorOyAgICAgICAgam56IExvb3BDbXBzDQorOyAgICAgICAgam1wIExlbk1heGltdW0NCis7TGVhdmVMb29wQ21wczQ6IGFkZCByZHgsIDQNCis7TGVhdmVMb29wQ21wczogIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCis7ICAgICAgICBqbnogTGVuTG93ZXINCis7ICAgICAgICBhZGQgcmR4LCAgMg0KKzsgICAgICAgIHNociBlYXgsIDE2DQorO0xlbkxvd2VyOiAgIHN1YiBhbCwgMQ0KKzsgICAgICAgIGFkYyByZHgsIDANCisNCisNCitMb29wQ21wczoNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4XQ0KKyAgICAgICAgam56IExlYXZlTG9vcENtcHMNCisNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4XQ0KKyAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeCArIDhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wczgNCisNCisNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4KzhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOCs4XQ0KKyAgICAgICAgam56IExlYXZlTG9vcENtcHMxNg0KKw0KKyAgICAgICAgYWRkIHJkeCw4KzgrOA0KKw0KKyAgICAgICAgam1wIHNob3J0IExvb3BDbXBzDQorTGVhdmVMb29wQ21wczE2OiBhZGQgcmR4LDgNCitMZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4DQorTGVhdmVMb29wQ21wczoNCisNCisgICAgICAgIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KKyAgICAgICAgdGVzdCBlYXgsMGZmZmZmZmZmaA0KKw0KKyAgICAgICAgam56IExlbkxvd2VyMzINCisNCisgICAgICAgIGFkZCByZHgsNA0KKyAgICAgICAgc2hyIHJheCwzMg0KKyAgICAgICAgb3IgYXgsYXgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KK0xlbkxvd2VyMzI6DQorICAgICAgICBzaHIgZWF4LDE2DQorICAgICAgICBhZGQgcmR4LDINCitMZW5Mb3dlcjogICBzdWIgYWwsIDENCisgICAgICAgIGFkYyByZHgsIDANCis7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQorOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KKw0KKyAgICAgICAgbGVhIHJheCwgW3JkaSArIHJkeF0NCisgICAgICAgIHN1YiByYXgsIHI5DQorICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCisgICAgICAgIGpnZSBMZW5NYXhpbXVtDQorDQorOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KKzs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgICAgICBjbXAgZWF4LCByMTFkDQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisNCisgICAgICAgIGxlYSByc2ksW3IxMCtyMTFdDQorDQorICAgICAgICBtb3YgcmRpLCBbcmN4ICsgZHNQcmV2XQ0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOw0KKzs7OyAgICAgICAgIGJlc3RfbGVuID0gbGVuOw0KKzs7OyAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7DQorOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKw0KK0xvbmdlck1hdGNoOg0KKyAgICAgICAgbW92IHIxMWQsIGVheA0KKyAgICAgICAgbW92IFtyY3ggKyBkc01hdGNoU3RhcnRdLCByOGQNCisgICAgICAgIGNtcCBlYXgsIFtuaWNlbWF0Y2hdDQorICAgICAgICBqZ2UgTGVhdmVOb3cNCisNCisgICAgICAgIGxlYSByc2ksW3IxMCtyYXhdDQorDQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW3I5ICsgcmF4IC0gMV0NCisgICAgICAgIG1vdiByZGksIFtyY3ggKyBkc1ByZXZdDQorICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCisgICAgICAgIGptcCBMb29rdXBMb29wDQorDQorOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLg0KKw0KK0xlbk1heGltdW06DQorICAgICAgICBtb3YgcjExZCxNQVhfTUFUQ0gNCisgICAgICAgIG1vdiBbcmN4ICsgZHNNYXRjaFN0YXJ0XSwgcjhkDQorDQorOzs7IGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsNCis7OzsgcmV0dXJuIHMtPmxvb2thaGVhZDsNCisNCitMZWF2ZU5vdzoNCisgICAgICAgIG1vdiBlYXgsIFtyY3ggKyBkc0xvb2thaGVhZF0NCisgICAgICAgIGNtcCByMTFkLCBlYXgNCisgICAgICAgIGNtb3ZuZyBlYXgsIHIxMWQNCisNCisNCis7OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KKw0KKw0KKyAgICAgICAgbW92IHJzaSxbc2F2ZV9yc2ldDQorICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCisgICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KKyAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQorICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCisgICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KKzsgICAgICAgIG1vdiByMTQsW3NhdmVfcjE0XQ0KKzsgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQ0KKw0KKw0KKyAgICAgICAgcmV0IDANCis7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KKzsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDMyIGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCitsb25nZXN0X21hdGNoICAgRU5EUA0KKw0KK21hdGNoX2luaXQgUFJPQw0KKyAgcmV0IDANCittYXRjaF9pbml0IEVORFANCisNCisNCitFTkQNCmRpZmYgLS1naXQgYS9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5vYmogYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5vYmoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhNzNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWFzbXg2NC9ndm1hdDY0Lm9iagpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jIGIvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY3NjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpAQCAtMCwwICsxLDE4NiBAQAorLyogaW5mZmFzODY2NC5jIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLSBmYXN0IGRlY29kaW5nDQorICogdmVyc2lvbiBmb3IgQU1ENjQgb24gV2luZG93cyB1c2luZyBNaWNyb3NvZnQgQyBjb21waWxlcg0KKyAqDQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0Pg0KKyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLg0KKyAqDQorICogMjAwNSAtIEFkYXB0YXRpb24gdG8gTWljcm9zb2Z0IEMgQ29tcGlsZXIgZm9yIEFNRDY0IGJ5IEdpbGxlcyBWb2xsYW50DQorICoNCisgKiBpbmZmYXM4NjY0LmMgY2FsbCBmdW5jdGlvbiBpbmZmYXM4NjY0Zm5jIGluIGluZmZhc3g2NC5hc20NCisgKiAgaW5mZmFzeDY0LmFzbSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgZnJvbSBBTUQ2NCBwb3J0aW9uIG9mIGluZmZhczg2LmMNCisgKg0KKyAqIERlYy0yOS0yMDAzIC0tIEkgYWRkZWQgQU1ENjQgaW5mbGF0ZSBhc20gc3VwcG9ydC4gIFRoaXMgdmVyc2lvbiBpcyBhbHNvDQorICogc2xpZ2h0bHkgcXVpY2tlciBvbiB4ODYgc3lzdGVtcyBiZWNhdXNlLCBpbnN0ZWFkIG9mIHVzaW5nIHJlcCBtb3ZzYiB0byBjb3B5DQorICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQ0KKyAqIGJ5dGVzLiAgSSd2ZSB0ZXN0ZWQgdGhlIEFNRDY0IGNvZGUgb24gYSBGZWRvcmEgQ29yZSAxICsgdGhlIHg4Nl82NCB1cGRhdGVzDQorICogZnJvbSBodHRwOi8vZmVkb3JhLmxpbnV4LmR1a2UuZWR1L2ZjMV94ODZfNjQNCisgKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoDQorICogMUdCIHJhbS4gIFRoZSA2NC1iaXQgdmVyc2lvbiBpcyBhYm91dCA0JSBmYXN0ZXIgdGhhbiB0aGUgMzItYml0IHZlcnNpb24sDQorICogd2hlbiBkZWNvbXByZXNzaW5nIG1vemlsbGEtc291cmNlLTEuMy50YXIuZ3ouDQorICoNCisgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20NCisgKiB0aGUgZ2NjIC1TIG91dHB1dCBvZiB6bGliLTEuMi4wL2luZmZhc3QuYy4gIFpsaWItMS4yLjAgaXMgaW4gYmV0YSByZWxlYXNlIGF0DQorICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LA0KKyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TDQorICogY29tcGlsZWQgd2l0aCBnY2MgLUROT19NTVgsIGJ1dCBpbmZmYXN0LlMgaXMgc3RpbGwgZmFzdGVyIG9uIHRoZSBQMyB3aXRoIE1NWA0KKyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcg0KKyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQNCisgKiBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLw0KKyAqDQorICovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgInp1dGlsLmgiDQorI2luY2x1ZGUgImluZnRyZWVzLmgiDQorI2luY2x1ZGUgImluZmxhdGUuaCINCisjaW5jbHVkZSAiaW5mZmFzdC5oIg0KKw0KKy8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8NCisNCisvKg0KKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcNCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMNCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLg0KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3INCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlDQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuDQorDQorICAgRW50cnkgYXNzdW1wdGlvbnM6DQorDQorICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4NCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYNCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgNCisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dA0KKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4DQorDQorICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6DQorDQorICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQNCisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrDQorICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQ0KKw0KKyAgIE5vdGVzOg0KKw0KKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQ0KKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLA0KKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuDQorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkDQorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4NCisNCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4DQorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpDQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcg0KKyAgICAgIG91dHB1dCBzcGFjZS4NCisgKi8NCisNCisNCisNCisgICAgdHlwZWRlZiBzdHJ1Y3QgaW5mZmFzdF9hciB7DQorLyogNjQgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYgIHg4Nl82NCAqLw0KKy8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovDQorLyogIDAgICAgMCAqLyB2b2lkICplc3A7ICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovDQorLyogIDggICAgNCAqLyB2b2lkICplYnA7ICAgICAgICAgICAgICAgIC8qIGVicCBzYXZlICovDQorLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8NCisvKiAyNCAgIDEyICovIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgLyogICAgIHI5ICAgd2hpbGUgaW4gPCBsYXN0ICovDQorLyogMzIgICAxNiAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgIC8qIGVkaSByZGkgIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovDQorLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8NCisvKiA0OCAgIDI0ICovIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgLyogICAgIHIxMCAgd2hpbGUgb3V0IDwgZW5kICovDQorLyogNTYgICAyOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93Oy8qICAgICAgICAgIHNpemUgb2Ygd2luZG93LCB3c2l6ZSE9MCAqLw0KKy8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovDQorLyogNzIgICAzNiAqLyBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgIC8qICAgICByMTEgIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovDQorLyogODAgICA0MCAqLyBzaXplX3QgLyp1bnNpZ25lZCBsb25nICovaG9sZDsgICAgICAgLyogZWR4IHJkeCAgbG9jYWwgc3RybS0+aG9sZCAqLw0KKy8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovDQorLyogOTIgICA0OCAqLyB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyBzaXplICovDQorLyogOTYgICA1MiAqLyB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyB3cml0ZSBpbmRleCAqLw0KKy8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLw0KKy8qMTA0ICAgNjAgKi8gdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEzICBtYXNrIGZvciBkY29kZSAqLw0KKy8qMTA4ICAgNjQgKi8gdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAvKiAgICAgcjE0ICBtYXRjaCBsZW5ndGggKi8NCisvKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8NCisvKjExNiAgIDcyICovIHVuc2lnbmVkIHN0YXR1czsgICAgICAgICAgLyogICAgICAgICAgc2V0IHdoZW4gc3RhdGUgY2huZyovDQorICAgIH0gdHlwZV9hcjsNCisjaWZkZWYgQVNNSU5GDQorDQordm9pZCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpDQorel9zdHJlYW1wIHN0cm07DQordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLw0KK3sNCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsNCisgICAgdHlwZV9hciBhcjsNCisgICAgdm9pZCBpbmZmYXM4NjY0Zm5jKHN0cnVjdCBpbmZmYXN0X2FyICogcGFyKTsNCisNCisgICAgDQorDQorI2lmIChkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkpIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0FNRDY0KSkNCisjZGVmaW5lIFBBRF9BVkFJTF9JTiA2DQorI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1OCAgICANCisjZWxzZQ0KKyNkZWZpbmUgUEFEX0FWQUlMX0lOIDUNCisjZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU3DQorI2VuZGlmDQorDQorICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovDQorICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOw0KKw0KKyAgICBhci5pbiA9IHN0cm0tPm5leHRfaW47DQorICAgIGFyLmxhc3QgPSBhci5pbiArIChzdHJtLT5hdmFpbF9pbiAtIFBBRF9BVkFJTF9JTik7DQorICAgIGFyLm91dCA9IHN0cm0tPm5leHRfb3V0Ow0KKyAgICBhci5iZWcgPSBhci5vdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOw0KKyAgICBhci5lbmQgPSBhci5vdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gUEFEX0FWQUlMX09VVCk7DQorICAgIGFyLndzaXplID0gc3RhdGUtPndzaXplOw0KKyAgICBhci53cml0ZSA9IHN0YXRlLT53cml0ZTsNCisgICAgYXIud2luZG93ID0gc3RhdGUtPndpbmRvdzsNCisgICAgYXIuaG9sZCA9IHN0YXRlLT5ob2xkOw0KKyAgICBhci5iaXRzID0gc3RhdGUtPmJpdHM7DQorICAgIGFyLmxjb2RlID0gc3RhdGUtPmxlbmNvZGU7DQorICAgIGFyLmRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOw0KKyAgICBhci5sbWFzayA9ICgxVSA8PCBzdGF0ZS0+bGVuYml0cykgLSAxOw0KKyAgICBhci5kbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsNCisNCisgICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoDQorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovDQorDQorICAgIC8qIGFsaWduIGluIG9uIDEvMiBob2xkIHNpemUgYm91bmRhcnkgKi8NCisgICAgd2hpbGUgKCgoc2l6ZV90KSh2b2lkICopYXIuaW4gJiAoc2l6ZW9mKGFyLmhvbGQpIC8gMiAtIDEpKSAhPSAwKSB7DQorICAgICAgICBhci5ob2xkICs9ICh1bnNpZ25lZCBsb25nKSphci5pbisrIDw8IGFyLmJpdHM7DQorICAgICAgICBhci5iaXRzICs9IDg7DQorICAgIH0NCisNCisgICAgaW5mZmFzODY2NGZuYygmYXIpOw0KKw0KKyAgICBpZiAoYXIuc3RhdHVzID4gMSkgew0KKyAgICAgICAgaWYgKGFyLnN0YXR1cyA9PSAyKQ0KKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOw0KKyAgICAgICAgZWxzZSBpZiAoYXIuc3RhdHVzID09IDMpDQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsNCisgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKCBhci5zdGF0dXMgPT0gMSApIHsNCisgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsNCisgICAgfQ0KKw0KKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8NCisgICAgYXIubGVuID0gYXIuYml0cyA+PiAzOw0KKyAgICBhci5pbiAtPSBhci5sZW47DQorICAgIGFyLmJpdHMgLT0gYXIubGVuIDw8IDM7DQorICAgIGFyLmhvbGQgJj0gKDFVIDw8IGFyLmJpdHMpIC0gMTsNCisNCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8NCisgICAgc3RybS0+bmV4dF9pbiA9IGFyLmluOw0KKyAgICBzdHJtLT5uZXh0X291dCA9IGFyLm91dDsNCisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGFyLmluIDwgYXIubGFzdCA/DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gKyAoYXIubGFzdCAtIGFyLmluKSA6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gLSAoYXIuaW4gLSBhci5sYXN0KSk7DQorICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkoYXIub3V0IDwgYXIuZW5kID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUICsgKGFyLmVuZCAtIGFyLm91dCkgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9PVVQgLSAoYXIub3V0IC0gYXIuZW5kKSk7DQorICAgIHN0YXRlLT5ob2xkID0gKHVuc2lnbmVkIGxvbmcpYXIuaG9sZDsNCisgICAgc3RhdGUtPmJpdHMgPSBhci5iaXRzOw0KKyAgICByZXR1cm47DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQuYXNtIGIvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkOTNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQuYXNtCkBAIC0wLDAgKzEsMzkyIEBACis7IGluZmZhc3g2NC5hc20gaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGluZmZhc3QuYyAtIGZhc3QgZGVjb2RpbmcNCis7IHZlcnNpb24gZm9yIEFNRDY0IG9uIFdpbmRvd3MgdXNpbmcgTWljcm9zb2Z0IEMgY29tcGlsZXINCis7DQorOyBpbmZmYXN4NjQuYXNtIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydCBmcm9tIEFNRDY0IHBvcnRpb24gb2YgaW5mZmFzODYuYw0KKzsgaW5mZmFzeDY0LmFzbSBpcyBjYWxsZWQgYnkgaW5mZmFzODY2NC5jLCB3aGljaCBjb250YWluIG1vcmUgaW5mby4NCisNCisNCis7IHRvIGNvbXBpbGUgdGhpcyBmaWxlLCBJIHVzZSBvcHRpb24NCis7ICAgbWw2NC5leGUgL0ZsaW5mZmFzeDY0IC9jIC9aaSBpbmZmYXN4NjQuYXNtDQorOyAgIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQNCis7DQorOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1LCBXaW5kb3dzIDIwMDMgc2VydmVyIERESw0KKzsNCis7ICAgKHlvdSBjYW4gZ2V0IFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLIHdpdGggbWw2NCBhbmQgY2wuZXhlIGZvciBBTUQ2NCBmcm9tIA0KKzsgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9kZXZ0b29scy9kZGsvZGVmYXVsdC5tc3B4IGZvciBsb3cgcHJpY2UpDQorOw0KKw0KKy5jb2RlDQoraW5mZmFzODY2NGZuYyBQUk9DDQorDQorOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCis7IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQorOw0KKzsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCis7ICAgcmF4LCByY3gsIHJkeCwgcjgsIHItOSwgcjEwLCBhbmQgcjExLCB3aGljaCBhcmUgc2NyYXRjaC4NCisNCisNCisJbW92IFtyc3AtOF0scnNpDQorCW1vdiBbcnNwLTE2XSxyZGkNCisJbW92IFtyc3AtMjRdLHIxMg0KKwltb3YgW3JzcC0zMl0scjEzDQorCW1vdiBbcnNwLTQwXSxyMTQNCisJbW92IFtyc3AtNDhdLHIxNQ0KKwltb3YgW3JzcC01Nl0scmJ4DQorDQorCW1vdiByYXgscmN4DQorDQorCW1vdglbcmF4KzhdLCByYnAgICAgICAgOyAvKiBzYXZlIHJlZ3MgcmJwIGFuZCByc3AgKi8NCisJbW92CVtyYXhdLCByc3ANCisNCisJbW92CXJzcCwgcmF4ICAgICAgICAgIDsgLyogbWFrZSByc3AgcG9pbnQgdG8gJmFyICovDQorDQorCW1vdglyc2ksIFtyc3ArMTZdICAgICAgOyAvKiByc2kgID0gaW4gKi8NCisJbW92CXJkaSwgW3JzcCszMl0gICAgICA7IC8qIHJkaSAgPSBvdXQgKi8NCisJbW92CXI5LCBbcnNwKzI0XSAgICAgICA7IC8qIHI5ICAgPSBsYXN0ICovDQorCW1vdglyMTAsIFtyc3ArNDhdICAgICAgOyAvKiByMTAgID0gZW5kICovDQorCW1vdglyYnAsIFtyc3ArNjRdICAgICAgOyAvKiByYnAgID0gbGNvZGUgKi8NCisJbW92CXIxMSwgW3JzcCs3Ml0gICAgICA7IC8qIHIxMSAgPSBkY29kZSAqLw0KKwltb3YJcmR4LCBbcnNwKzgwXSAgICAgIDsgLyogcmR4ICA9IGhvbGQgKi8NCisJbW92CWVieCwgW3JzcCs4OF0gICAgICA7IC8qIGVieCAgPSBiaXRzICovDQorCW1vdglyMTJkLCBbcnNwKzEwMF0gICAgOyAvKiByMTJkID0gbG1hc2sgKi8NCisJbW92CXIxM2QsIFtyc3ArMTA0XSAgICA7IC8qIHIxM2QgPSBkbWFzayAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE0ZCA9IGxlbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE1ZCA9IGRpc3QgKi8NCisNCisNCisJY2xkDQorCWNtcAlyMTAsIHJkaQ0KKwlqZQlMX29uZV90aW1lICAgICAgICAgICA7IC8qIGlmIG9ubHkgb25lIGRlY29kZSBsZWZ0ICovDQorCWNtcAlyOSwgcnNpDQorDQorICAgIGpuZSBMX2RvX2xvb3ANCisNCisNCitMX29uZV90aW1lOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCisJbG9kc2QgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiBlYXggPSAqKHVpbnQgKilpbisrICovDQorCW1vdgljbCwgYmwgICAgICAgICAgICA7IC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQorCWFkZAlibCwgMzIgICAgICAgICAgICAgOyAvKiBiaXRzICs9IDMyICovDQorCXNobAlyYXgsIGNsDQorCW9yCXJkeCwgcmF4ICAgICAgICAgIDsgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLw0KKwlqbXAJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCitBTElHTiA0DQorTF93aGlsZV90ZXN0Og0KKwljbXAJcjEwLCByZGkNCisJamJlCUxfYnJlYWtfbG9vcA0KKwljbXAJcjksIHJzaQ0KKwlqYmUJTF9icmVha19sb29wDQorDQorTF9kb19sb29wOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGUgICAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfbGVuZ3RoX2NvZGU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gIDsgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKw0KKwltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLw0KKwlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KKwlzaHIJcmR4LCBjbCAgICAgICAgICAgOyAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCisNCisJdGVzdAlhbCwgYWwNCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgOyAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCisNCisJbW92CXI4LCByMTIgICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8NCisJc2hyCWVheCwgMTYgICAgICAgICAgICA7IC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovDQorCXN0b3NiDQorDQorTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gOyAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQorDQorTF9kb2xlbjoNCisJbW92CWNsLCBhaCAgICAgICAgICAgIDsgLyogY2wgPSB0aGlzLmJpdHMgKi8NCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorDQorCXRlc3QJYWwsIGFsDQorCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIDsgLyogaWYgKG9wICE9IDApIDQ1LjclICovDQorDQorCXNocgllYXgsIDE2ICAgICAgICAgICAgOyAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLw0KKwlzdG9zYg0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6DQorCW1vdglyMTRkLCBlYXggICAgICAgICA7IC8qIGxlbiA9IHRoaXMgKi8NCisJc2hyCXIxNGQsIDE2ICAgICAgICAgICA7IC8qIGxlbiA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWwNCisNCisJdGVzdAlhbCwgMTYNCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIDsgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLw0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgOyAvKiBpZiAoIW9wKSAqLw0KKw0KK0xfYWRkX2JpdHNfdG9fbGVuOg0KKwlzdWIJYmwsIGNsDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNGQsIGVheCAgICAgICAgIDsgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOg0KKwltb3YJcjgsIHIxMyAgICAgICAgICAgOyAvKiByOCA9IGRtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfZGlzdGFuY2VfY29kZToNCisJYW5kCXI4LCByZHggICAgICAgICAgIDsgLyogcjggJj0gaG9sZCAqLw0KKwltb3YJZWF4LCBbcjExK3I4KjRdIDsgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLw0KKw0KK0xfZG9kaXN0Og0KKwltb3YJcjE1ZCwgZWF4ICAgICAgICAgOyAvKiBkaXN0ID0gdGhpcyAqLw0KKwlzaHIJcjE1ZCwgMTYgICAgICAgICAgIDsgLyogZGlzdCA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWgNCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorCW1vdgljbCwgYWwgICAgICAgICAgICA7IC8qIGNsID0gdGhpcy5vcCAqLw0KKw0KKwl0ZXN0CWFsLCAxNiAgICAgICAgICAgICA7IC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8NCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9jaGVja19kaXN0X29uZQ0KKw0KK0xfYWRkX2JpdHNfdG9fZGlzdDoNCisJc3ViCWJsLCBjbA0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4ICAgICAgICAgICAgICAgICA7IC8qICgxIDw8IG9wKSAtIDEgKi8NCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNWQsIGVheCAgICAgICAgIDsgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovDQorDQorTF9jaGVja193aW5kb3c6DQorCW1vdglyOCwgcnNpICAgICAgICAgICA7IC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovDQorCW1vdglyYXgsIHJkaQ0KKwlzdWIJcmF4LCBbcnNwKzQwXSAgICAgIDsgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9jbGlwX3dpbmRvdyAgICAgICAgOyAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgICA7IC8qIGZyb20gPSBvdXQgLSBkaXN0ICovDQorDQorCXNhcgllY3gsIDENCisJam5jCUxfY29weV90d28gICAgICAgICAgIDsgLyogaWYgbGVuICUgMiA9PSAwICovDQorDQorCXJlcCAgICAgbW92c3cNCisJbW92CWFsLCBbcnNpXQ0KKwltb3YJW3JkaV0sIGFsDQorCWluYwlyZGkNCisNCisJbW92CXJzaSwgcjggICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF9jb3B5X3R3bzoNCisJcmVwICAgICBtb3Zzdw0KKwltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovDQorCWptcAlMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZToNCisJY21wCXIxNWQsIDEgICAgICAgICAgICA7IC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8NCisJam5lCUxfY2hlY2tfd2luZG93DQorCWNtcAlbcnNwKzQwXSwgcmRpICAgICAgOyAvKiBpZiBvdXQgPT0gYmVnLCBvdXRzaWRlIHdpbmRvdyAqLw0KKwlqZQlMX2NoZWNrX3dpbmRvdw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CWFsLCBbcmRpLTFdDQorCW1vdglhaCwgYWwNCisNCisJc2FyCWVjeCwgMQ0KKwlqbmMJTF9zZXRfdHdvDQorCW1vdglbcmRpXSwgYWwNCisJaW5jCXJkaQ0KKw0KK0xfc2V0X3R3bzoNCisJcmVwICAgICBzdG9zdw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoNCisJdGVzdAlhbCwgNjQNCisJam56CUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrIDsgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLw0KKw0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4DQorCWFuZAllYXgsIGVkeCAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJYWRkCWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggKz0gbGVuICovDQorCW1vdgllYXgsIFtyYnArcmF4KjRdIDsgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2xlbg0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Og0KKwl0ZXN0CWFsLCA2NA0KKwlqbnoJTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgOyAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KKwlhZGQJZWF4LCByMTVkICAgICAgICA7IC8qIGVheCArPSBkaXN0ICovDQorCW1vdgllYXgsIFtyMTErcmF4KjRdIDsgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2Rpc3QNCisNCitBTElHTiA0DQorTF9jbGlwX3dpbmRvdzoNCisJbW92CWVjeCwgZWF4ICAgICAgICAgOyAvKiBlY3ggPSBuYnl0ZXMgKi8NCisJbW92CWVheCwgW3JzcCs5Ml0gICAgIDsgLyogZWF4ID0gd3NpemUsIHByZXBhcmUgZm9yIGRpc3QgY21wICovDQorCW5lZwllY3ggICAgICAgICAgICAgICAgOyAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgOyAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLw0KKw0KKwlhZGQJZWN4LCByMTVkICAgICAgICAgOyAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovDQorCWNtcAlkd29yZCBwdHIgW3JzcCs5Nl0sIDANCisJam5lCUxfd3JhcF9hcm91bmRfd2luZG93IDsgLyogaWYgKHdyaXRlICE9IDApICovDQorDQorCW1vdglyc2ksIFtyc3ArNTZdICAgICA7IC8qIGZyb20gID0gd2luZG93ICovDQorCXN1YgllYXgsIGVjeCAgICAgICAgIDsgLyogZWF4ICAtPSBuYnl0ZXMgKi8NCisJYWRkCXJzaSwgcmF4ICAgICAgICAgOyAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovDQorDQorCW1vdgllYXgsIHIxNGQgICAgICAgIDsgLyogZWF4ID0gbGVuICovDQorCWNtcAlyMTRkLCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBlYXggLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9ICZvdXRbIC1kaXN0IF0gKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX3dyYXBfYXJvdW5kX3dpbmRvdzoNCisJbW92CWVheCwgW3JzcCs5Nl0gICAgIDsgLyogZWF4ID0gd3JpdGUgKi8NCisJY21wCWVjeCwgZWF4DQorCWpiZQlMX2NvbnRpZ3VvdXNfaW5fd2luZG93IDsgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8NCisNCisJbW92CWVzaSwgW3JzcCs5Ml0gICAgIDsgLyogZnJvbSAgPSB3c2l6ZSAqLw0KKwlhZGQJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiBmcm9tICs9IHdpbmRvdyAqLw0KKwlhZGQJcnNpLCByYXggICAgICAgICA7IC8qIGZyb20gKz0gd3JpdGUgKi8NCisJc3ViCXJzaSwgcmN4ICAgICAgICAgOyAvKiBmcm9tIC09IG5ieXRlcyAqLw0KKwlzdWIJZWN4LCBlYXggICAgICAgICA7IC8qIG5ieXRlcyAtPSB3cml0ZSAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSA9IHdpbmRvdyAqLw0KKwltb3YJZWN4LCBbcnNwKzk2XSAgICAgOyAvKiBuYnl0ZXMgPSB3cml0ZSAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KKwltb3YJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiByc2kgPSB3aW5kb3cgKi8NCisJYWRkCXJzaSwgcmF4DQorCXN1Yglyc2ksIHJjeCAgICAgICAgIDsgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCitBTElHTiA0DQorTF9kb19jb3B5Og0KKwltb3YJZWN4LCBlYXggICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLw0KKwlyZXAgICAgIG1vdnNiDQorDQorCW1vdglyc2ksIHI4ICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorCXRlc3QJYWwsIDMyDQorCWp6CUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlDQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAxDQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZToNCisJbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDINCisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cw0KKw0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKwltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgMw0KKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzDQorDQorTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCA0DQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2JyZWFrX2xvb3A6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAwDQorDQorTF9icmVha19sb29wX3dpdGhfc3RhdHVzOg0KKzsgLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLw0KKwltb3YJW3JzcCsxNl0sIHJzaSAgICAgOyAvKiBpbiAqLw0KKwltb3YJW3JzcCszMl0sIHJkaSAgICAgOyAvKiBvdXQgKi8NCisJbW92CVtyc3ArODhdLCBlYnggICAgIDsgLyogYml0cyAqLw0KKwltb3YJW3JzcCs4MF0sIHJkeCAgICAgOyAvKiBob2xkICovDQorDQorCW1vdglyYXgsIFtyc3BdICAgICAgIDsgLyogcmVzdG9yZSByYnAgYW5kIHJzcCAqLw0KKwltb3YJcmJwLCBbcnNwKzhdDQorCW1vdglyc3AsIHJheA0KKw0KKw0KKw0KKwltb3YgcnNpLFtyc3AtOF0NCisJbW92IHJkaSxbcnNwLTE2XQ0KKwltb3YgcjEyLFtyc3AtMjRdDQorCW1vdiByMTMsW3JzcC0zMl0NCisJbW92IHIxNCxbcnNwLTQwXQ0KKwltb3YgcjE1LFtyc3AtNDhdDQorCW1vdiByYngsW3JzcC01Nl0NCisJDQorICAgIHJldCAwDQorOyAgICAgICAgICA6DQorOyAgICAgICAgICA6ICJtIiAoYXIpDQorOyAgICAgICAgICA6ICJtZW1vcnkiLCAiJXJheCIsICIlcmJ4IiwgIiVyY3giLCAiJXJkeCIsICIlcnNpIiwgIiVyZGkiLA0KKzsgICAgICAgICAgICAiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLCAiJXIxMiIsICIlcjEzIiwgIiVyMTQiLCAiJXIxNSINCis7ICAgICk7DQorDQoraW5mZmFzODY2NGZuYyAJRU5EUA0KKztfVEVYVAlFTkRTDQorRU5EDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5vYmogYi9jb250cmliL21hc214NjQvaW5mZmFzeDY0Lm9iagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY1ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5vYmoKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9tYXNteDY0L3JlYWRtZS50eHQgYi9jb250cmliL21hc214NjQvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTAzMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9tYXNteDY0L3JlYWRtZS50eHQKQEAgLTAsMCArMSwyOCBAQAorU3VtbWFyeQ0KKy0tLS0tLS0NCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMNCitsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLCBmb3IgNjQgYml0cyB4ODYgKGJvdGggQU1ENjQgYW5kIEludGVsIEVNNjR0KSwNCitmb3IgdXNlIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQgYW5kIE1pY3Jvc29mdCBDKysgNjQgYml0cy4NCisNCitndm1hdDY0LmFzbSBpcyB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50ICgyMDA1KSwgYnkgdXNpbmcgQnJpYW4gUmFpdGVyIDY4Ni8zMiBiaXRzDQorICAgYXNzZW1ibHkgb3B0aW1pemVkIHZlcnNpb24gZnJvbSBKZWFuLWxvdXAgR2FpbGx5IG9yaWdpbmFsIGxvbmdlc3RfbWF0Y2ggZnVuY3Rpb24NCisNCitpbmZmYXN4NjQuYXNtIGFuZCBpbmZmYXM4NjY0LmMgd2VyZSB3cml0dGVuIGJ5IENocmlzIEFuZGVyc29uLCBieSBvcHRpbWl6aW5nDQorICAgb3JpZ2luYWwgZnVuY3Rpb24gZnJvbSBNYXJrIEFkbGVyDQorDQorVXNlIGluc3RydWN0aW9ucw0KKy0tLS0tLS0tLS0tLS0tLS0NCitDb3B5IHRoZXNlIGZpbGVzIGludG8gdGhlIHpsaWIgc291cmNlIGRpcmVjdG9yeS4NCisNCitkZWZpbmUgQVNNViBhbmQgQVNNSU5GIGluIHlvdXIgcHJvamVjdC4gSW5jbHVkZSBpbmZmYXM4NjY0LmMgaW4geW91ciBzb3VyY2UgdHJlZSwNCithbmQgaW5mZmFzeDY0Lm9iaiBhbmQgZ3ZtYXQ2NC5vYmogYXMgb2JqZWN0IHRvIGxpbmsuDQorDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorcnVuIGJsZF82NC5iYXQgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NCAobWw2NC5leGUpDQorDQorbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUsIFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLDQorDQorWW91IGNhbiBnZXQgV2luZG93cyAyMDAzIHNlcnZlciBEREsgd2l0aCBtbDY0IGFuZCBjbCBmb3IgQU1ENjQgZnJvbSANCisgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldnRvb2xzL2Rkay9kZWZhdWx0Lm1zcHggZm9yIGxvdyBwcmljZSkNCmRpZmYgLS1naXQgYS9jb250cmliL21hc214ODYvYmxkX21sMzIuYmF0IGIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE0NGQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdApAQCAtMCwwICsxLDIgQEAKK21sIC9jb2ZmIC9aaSAvYyAvRmxndm1hdDMyLmxzdCAgZ3ZtYXQzMi5hc20gDQorbWwgL2NvZmYgL1ppIC9jIC9GbGluZmZhczMyLmxzdCBpbmZmYXMzMi5hc20gDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9tYXNteDg2L2d2bWF0MzIuYXNtIGIvY29udHJpYi9tYXNteDg2L2d2bWF0MzIuYXNtCmluZGV4IGU4NDFhN2YuLjg3NGJiMmQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyLmFzbQorKysgYi9jb250cmliL21hc214ODYvZ3ZtYXQzMi5hc20KQEAgLTEsOTA5ICsxLDk3MiBAQAotOwotOyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2Ci07IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50LgotOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gKLTsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMKLTsgSXQgbmVlZCB3bWFzayA9PSAweDdmZmYKLTsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spCi07Ci07IEZvciBWaXN1YWwgQysrIDQuMiBhbmQgTUwgNi4xMWMgKHZlcnNpb24gaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREspCi07ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIgotOwotCi07dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQotOyAgICBkZWZsYXRlX3N0YXRlICpzOwotOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotCU5iU3RhY2sgICAgICAgICBlcXUgICAgIDc2Ci0JY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdCi0Jc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdCi07IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQotCWFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQotCXB1c2hlYnAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xMl0KLQlwdXNoZWRpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTZdCi0JcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQotCXB1c2hlYnggICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yNF0KLQotCWNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdCi0JbGltaXQgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zMl0KLQliZXN0X2xlbiAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTM2XQotCXdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdCi0JcHJldiAgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay00NF0KLQlzY2FuX3N0YXJ0ICAgICAgZXF1ICAgICAgd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ4XQotCXdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdCi0JbWF0Y2hfc3RhcnRfcHRyIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay01Nl0KLQluaWNlX21hdGNoICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTYwXQotCXNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdCi0KLQl3aW5kb3dsZW4gICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY4XQotCW1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdCi0Jc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0KLQlOYlN0YWNrQWRkICAgICAgZXF1ICAgICAoTmJTdGFjay0yNCkKLQotICAgIC4zODZwCi0KLSAgICBuYW1lICAgIGd2bWF0Y2gKLSAgICAuTU9ERUwgIEZMQVQKLQotCi0KLTsgIGFsbCB0aGUgK2FkZHN0ciBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIHBlbmRpbmdfYnVmX3NpemUgaW4gemxpYiAxLjA0Ci07ICBhbmQgYWRkaW5nIGd6aGVhZCBhbmQgZ3ppbmRleCBpbiB6bGliIDEuMi4yLjEKLTsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHNldCBhZGRzdHIgdG8gMCkuCi07ICAoaWYgeW91IGNvbXBpbGVyIHdpdGggemxpYiBiZXR3ZWVuIDEuMDQgYW5kIDEuMi4xLCBzZXQgYWRkc3RyIHRvIDQpCi07ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUKLQotICAgIGFkZHN0ciAgICAgICAgICAgICAgZXF1ICAgICA0KzgKLSAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzBoK2FkZHN0cgotICAgIGRlcF93aW5kb3cgICAgICAgICAgZXF1ICAgICAyY2grYWRkc3RyCi0gICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDYwaCthZGRzdHIKLSAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNmNoK2FkZHN0cgotICAgIGRlcF9uaWNlX21hdGNoICAgICAgZXF1ICAgICA4NGgrYWRkc3RyCi0gICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDIwaCthZGRzdHIKLSAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzRoK2FkZHN0cgotICAgIGRlcF93X21hc2sgICAgICAgICAgZXF1ICAgICAyOGgrYWRkc3RyCi0gICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDgwaCthZGRzdHIKLSAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjRoK2FkZHN0cgotICAgIGRlcF9sb29rYWhlYWQgICAgICAgZXF1ICAgICA2OGgrYWRkc3RyCi0KLQotX1RFWFQgICAgICAgICAgICAgICAgICAgc2VnbWVudAotCi1JRkRFRiBOT1VOREVSTElORQotCQkJcHVibGljICBsb25nZXN0X21hdGNoXzdmZmYKLQkJCXB1YmxpYyAgbG9uZ2VzdF9tYXRjaF82ODYKLTsgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG1hdGNoX2luaXQKLUVMU0UKLQkJCXB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfN2ZmZgotCQkJcHVibGljICBfbG9uZ2VzdF9tYXRjaF82ODYKLTsgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIF9tYXRjaF9pbml0Ci1FTkRJRgotCi0gICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OAotICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzCi0gICAgTUlOX0xPT0tBSEVBRCAgICAgICBlcXUgICAgIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCi0KLQotCi1JRkRFRiBOT1VOREVSTElORQotO21hdGNoX2luaXQgICAgICBwcm9jIG5lYXIKLTsgICAgICAgICAgICAgICAgcmV0Ci07bWF0Y2hfaW5pdCAgICAgIGVuZHAKLUVMU0UKLTtfbWF0Y2hfaW5pdCAgICAgcHJvYyBuZWFyCi07ICAgICAgICAgICAgICAgIHJldAotO19tYXRjaF9pbml0ICAgICBlbmRwCi1FTkRJRgotCi0KLUlGREVGIE5PVU5ERVJMSU5FCi1sb25nZXN0X21hdGNoXzdmZmYgICBwcm9jIG5lYXIKLUVMU0UKLV9sb25nZXN0X21hdGNoXzdmZmYgIHByb2MgbmVhcgotRU5ESUYKLQotCW1vdiAgICAgZWR4LFtlc3ArNF0KLQotCi0KLQlwdXNoICAgIGVicAotCXB1c2ggICAgZWRpCi0JcHVzaCAgICBlc2kKLQlwdXNoICAgIGVieAotCi0Jc3ViICAgICBlc3AsTmJTdGFja0FkZAotCi07IGluaXRpYWxpemUgb3IgY2hlY2sgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG1hdGNoLmFzbS4KLQltb3YgICAgIGVicCxlZHgKLQotOyBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoCi07IGlmIChwcmV2X2xlbmd0aD49Z29vZF9tYXRjaCkgY2hhaW5fbGVuZ3RoID4+PSAyCi0JbW92ICAgICBlZHgsW2VicCtkZXBfY2hhaW5fbGVuZ3RoXQotCW1vdiAgICAgZWJ4LFtlYnArZGVwX3ByZXZfbGVuZ3RoXQotCWNtcCAgICAgW2VicCtkZXBfZ29vZF9tYXRjaF0sZWJ4Ci0JamEgICAgICBub3NocgotCXNociAgICAgZWR4LDIKLW5vc2hyOgotOyB3ZSBpbmNyZW1lbnQgY2hhaW5fbGVuZ3RoIGJlY2F1c2UgaW4gdGhlIGFzbSwgdGhlIC0tY2hhaW5fbGVuZ2h0IGlzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AKLQlpbmMgICAgIGVkeAotCW1vdiAgICAgZWRpLFtlYnArZGVwX25pY2VfbWF0Y2hdCi0JbW92ICAgICBjaGFpbl9sZW5ndGgsZWR4Ci0JbW92ICAgICBlYXgsW2VicCtkZXBfbG9va2FoZWFkXQotCWNtcCAgICAgZWF4LGVkaQotOyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKLQlqYWUgICAgIG5vbG9va2FoZWFkbmljZW1hdGNoCi0JbW92ICAgICBlZGksZWF4Ci1ub2xvb2thaGVhZG5pY2VtYXRjaDoKLTsgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aAotCW1vdiAgICAgYmVzdF9sZW4sZWJ4Ci0KLTsgd2luZG93ID0gcy0+d2luZG93Ci0JbW92ICAgICBlc2ksW2VicCtkZXBfd2luZG93XQotCW1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQotCW1vdiAgICAgd2luZG93LGVzaQotCi0JbW92ICAgICBuaWNlX21hdGNoLGVkaQotOyBzY2FuID0gd2luZG93ICsgc3Ryc3RhcnQKLQlhZGQgICAgIGVzaSxlY3gKLQltb3YgICAgIHNjYW4sZXNpCi07IGR4ID0gKndpbmRvdwotCW1vdiAgICAgZHgsd29yZCBwdHIgW2VzaV0KLTsgYnggPSAqKHdpbmRvdytiZXN0X2xlbi0xKQotCW1vdiAgICAgYngsd29yZCBwdHIgW2VzaStlYngtMV0KLQlhZGQgICAgIGVzaSxNQVhfTUFUQ0gtMQotOyBzY2FuX3N0YXJ0ID0gKnNjYW4KLQltb3YgICAgIHNjYW5fc3RhcnQsZHgKLTsgc3RyZW5kID0gc2NhbiArIE1BWF9NQVRDSC0xCi0JbW92ICAgICBzdHJlbmQsZXNpCi07IGJ4ID0gc2Nhbl9lbmQgPSAqKHdpbmRvdytiZXN0X2xlbi0xKQotCi07ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KLTsgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7Ci0KLQltb3YgICAgIGVzaSxbZWJwK2RlcF93X3NpemVdCi0Jc3ViICAgICBlc2ksTUlOX0xPT0tBSEVBRAotOyBoZXJlIGVzaSA9IE1BWF9ESVNUKHMpCi0Jc3ViICAgICBlY3gsZXNpCi0JamEgICAgICBub2Rpc3QKLQl4b3IgICAgIGVjeCxlY3gKLW5vZGlzdDoKLQltb3YgICAgIGxpbWl0LGVjeAotCi07IHByZXYgPSBzLT5wcmV2Ci0JbW92ICAgICBlZHgsW2VicCtkZXBfcHJldl0KLQltb3YgICAgIHByZXYsZWR4Ci0KLTsKLQltb3YgICAgIGVkeCxkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdCi0JbW92ICAgICBicCxzY2FuX3N0YXJ0Ci0JbW92ICAgICBlYXgsY3VyX21hdGNoCi0JbW92ICAgICBtYXRjaF9zdGFydCxlZHgKLQotCW1vdiAgICAgZWR4LHdpbmRvdwotCW1vdiAgICAgZWRpLGVkeAotCWFkZCAgICAgZWRpLGJlc3RfbGVuCi0JbW92ICAgICBlc2kscHJldgotCWRlYyAgICAgZWRpCi07IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuIC0xCi0JbW92ICAgICB3aW5kb3dsZW4sZWRpCi0KLQlqbXAgICAgIGJlZ2lubG9vcDIKLQlhbGlnbiAgIDQKLQotOyBoZXJlLCBpbiB0aGUgbG9vcAotOyAgICAgICBlYXggPSBheCA9IGN1cl9tYXRjaAotOyAgICAgICBlY3ggPSBsaW1pdAotOyAgICAgICAgYnggPSBzY2FuX2VuZAotOyAgICAgICAgYnAgPSBzY2FuX3N0YXJ0Ci07ICAgICAgIGVkaSA9IHdpbmRvd2xlbiAod2luZG93ICsgYmVzdF9sZW4gLTEpCi07ICAgICAgIGVzaSA9IHByZXYKLQotCi07Ly8gaGVyZTsgY2hhaW5fbGVuZ3RoIDw9MTYKLW5vcm1hbGJlZzBhZGQxNjoKLQlhZGQgICAgIGNoYWluX2xlbmd0aCwxNgotCWp6ICAgICAgZXhpdGxvb3AKLW5vcm1hbGJlZzA6Ci0JY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotCWplICAgICAgbm9ybWFsYmVnMm5vcm9sbAotcmNvbnRsYWJub3JvbGw6Ci07IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdCi0JYW5kICAgICBlYXgsN2ZmZmgKLQltb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLTsgaWYgY3VyX21hdGNoID4gbGltaXQsIGdvIHRvIGV4aXRsb29wCi0JY21wICAgICBlY3gsZWF4Ci0Jam5iICAgICBleGl0bG9vcAotOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcAotCWRlYyAgICAgY2hhaW5fbGVuZ3RoCi0Jam56ICAgICBub3JtYWxiZWcwCi0Jam1wICAgICBleGl0bG9vcAotCi1ub3JtYWxiZWcybm9yb2xsOgotOyBpZiAoc2Nhbl9zdGFydD09KihjdXJfbWF0Y2grd2luZG93KSkgZ290byBub3JtYWxiZWcyCi0JY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQotCWpuZSAgICAgcmNvbnRsYWJub3JvbGwKLQlqbXAgICAgIG5vcm1hbGJlZzIKLQotY29udGxvb3AzOgotCW1vdiAgICAgZWRpLHdpbmRvd2xlbgotCi07IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdCi0JYW5kICAgICBlYXgsN2ZmZmgKLQltb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLTsgaWYgY3VyX21hdGNoID4gbGltaXQsIGdvIHRvIGV4aXRsb29wCi0JY21wICAgICBlY3gsZWF4Ci1qbmJleGl0bG9vcHNob3J0MToKLQlqbmIgICAgIGV4aXRsb29wCi07IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wCi0KLQotOyBiZWdpbiB0aGUgbWFpbiBsb29wCi1iZWdpbmxvb3AyOgotCXN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2KzEKLTsgaWYgY2hhaW5fbGVuZ3RoIDw9MTYsIGRvbid0IHVzZSB0aGUgdW5yb2xsZWQgbG9vcAotCWpuYSAgICAgbm9ybWFsYmVnMGFkZDE2Ci0KLWRvMTY6Ci0JY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotCWplICAgICAgbm9ybWFsYmVnMmRjMAotCi1tYWNjbiAgIE1BQ1JPICAgbGFiCi0JYW5kICAgICBlYXgsN2ZmZmgKLQltb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLQljbXAgICAgIGVjeCxlYXgKLQlqbmIgICAgIGV4aXRsb29wCi0JY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotCWplICAgICAgbGFiCi0JRU5ETQotCi1yY29udGxvb3AwOgotCW1hY2NuICAgbm9ybWFsYmVnMmRjMQotCi1yY29udGxvb3AxOgotCW1hY2NuICAgbm9ybWFsYmVnMmRjMgotCi1yY29udGxvb3AyOgotCW1hY2NuICAgbm9ybWFsYmVnMmRjMwotCi1yY29udGxvb3AzOgotCW1hY2NuICAgbm9ybWFsYmVnMmRjNAotCi1yY29udGxvb3A0OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjNQotCi1yY29udGxvb3A1OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjNgotCi1yY29udGxvb3A2OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjNwotCi1yY29udGxvb3A3OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjOAotCi1yY29udGxvb3A4OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjOQotCi1yY29udGxvb3A5OgotCW1hY2NuICAgbm9ybWFsYmVnMmRjMTAKLQotcmNvbnRsb29wMTA6Ci0JbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMQotCi1yY29udGxvb3AxMToKLQltYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEyCi0KLXJjb250bG9vcDEyOgotCW1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTMKLQotcmNvbnRsb29wMTM6Ci0JbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxNAotCi1yY29udGxvb3AxNDoKLQltYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE1Ci0KLXJjb250bG9vcDE1OgotCWFuZCAgICAgZWF4LDdmZmZoCi0JbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdCi0JY21wICAgICBlY3gsZWF4Ci0Jam5iICAgICBleGl0bG9vcAotCi0Jc3ViICAgICBjaGFpbl9sZW5ndGgsMTYKLQlqYSAgICAgIGRvMTYKLQlqbXAgICAgIG5vcm1hbGJlZzBhZGQxNgotCi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1ub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViCi07IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAotCWNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0KLTsgaWYgKG1hdGNoICE9IHNjYW5fc3RhcnQpIGdvdG8gcmNvbnRsYWIKLQlqbmUgICAgIHJjb250bGFiCi07IGNhbGN1bGF0ZSB0aGUgZ29vZCBjaGFpbl9sZW5ndGgsIGFuZCB3ZSdsbCBjb21wYXJlIHNjYW4gYW5kIG1hdGNoIHN0cmluZwotCWFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1YgotCWptcCAgICAgaXNlcQotCUVORE0KLQotCi1ub3JtYWxiZWcyZGMxMToKLQlub3JtYmVnIHJjb250bG9vcDExLDExCi0KLW5vcm1hbGJlZzJkYzEyOgotCW5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTIsMTIKLQotbm9ybWFsYmVnMmRjMTM6Ci0Jbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMywxMwotCi1ub3JtYWxiZWcyZGMxNDoKLQlub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0Ci0KLW5vcm1hbGJlZzJkYzE1OgotCW5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTUsMTUKLQotbm9ybWFsYmVnMmRjMTA6Ci0Jbm9ybWJlZyByY29udGxvb3AxMCwxMAotCi1ub3JtYWxiZWcyZGM5OgotCW5vcm1iZWcgcmNvbnRsb29wOSw5Ci0KLW5vcm1hbGJlZzJkYzg6Ci0Jbm9ybWJlZyByY29udGxvb3A4LDgKLQotbm9ybWFsYmVnMmRjNzoKLQlub3JtYmVnIHJjb250bG9vcDcsNwotCi1ub3JtYWxiZWcyZGM2OgotCW5vcm1iZWcgcmNvbnRsb29wNiw2Ci0KLW5vcm1hbGJlZzJkYzU6Ci0Jbm9ybWJlZyByY29udGxvb3A1LDUKLQotbm9ybWFsYmVnMmRjNDoKLQlub3JtYmVnIHJjb250bG9vcDQsNAotCi1ub3JtYWxiZWcyZGMzOgotCW5vcm1iZWcgcmNvbnRsb29wMywzCi0KLW5vcm1hbGJlZzJkYzI6Ci0Jbm9ybWJlZyByY29udGxvb3AyLDIKLQotbm9ybWFsYmVnMmRjMToKLQlub3JtYmVnIHJjb250bG9vcDEsMQotCi1ub3JtYWxiZWcyZGMwOgotCW5vcm1iZWcgcmNvbnRsb29wMCwwCi0KLQotOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQKLQotbm9ybWFsYmVnMjoKLQltb3YgICAgIGVkaSx3aW5kb3cKLQotCWNtcCAgICAgYnAsd29yZCBwdHJbZWRpK2VheF0KLQlqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUKLQotaXNlcToKLTsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCi07IGFuZCAobWF0Y2ggPT0gc2Nhbl9zdGFydCkKLQotCW1vdiAgICAgZWRpLGVkeAotCW1vdiAgICAgZXNpLHNjYW4gICAgICAgICAgICAgICAgICAgIDsgZXNpID0gc2NhbgotCWFkZCAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgICAgIDsgZWRpID0gd2luZG93ICsgY3VyX21hdGNoID0gbWF0Y2gKLQotCW1vdiAgICAgZWR4LFtlc2krM10gICAgICAgICAgICAgICAgIDsgY29tcGFyZSBtYW51YWxseSBkd29yZCBhdCBtYXRjaCszCi0JeG9yICAgICBlZHgsW2VkaSszXSAgICAgICAgICAgICAgICAgOyBhbmQgc2NhbiArMwotCi0JanogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlCi0KLTsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQotCW9yICAgICAgZGwsZGwKLQlqZSAgICAgIGVxMXJyCi0JbW92ICAgICBlc2ksMwotCWptcCAgICAgdHJmaW52YWwKLWVxMXJyOgotCW9yICAgICAgZHgsZHgKLQlqZSAgICAgIGVxMQotCi0JbW92ICAgICBlc2ksNAotCWptcCAgICAgdHJmaW52YWwKLWVxMToKLQlhbmQgICAgIGVkeCwwZmZmZmZmaAotCWp6ICAgICAgZXExMQotCW1vdiAgICAgZXNpLDUKLQlqbXAgICAgIHRyZmludmFsCi1lcTExOgotCW1vdiAgICAgZXNpLDYKLQlqbXAgICAgIHRyZmludmFsCi0KLWJlZ2luY29tcGFyZToKLQk7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUKLQlhZGQgICAgIGVkaSw2Ci0JYWRkICAgICBlc2ksNgotCW1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMKLQlyZXBlICAgIGNtcHNkICAgICAgICAgICAgICAgICAgICAgICA7IGxvb3AgdW50aWwgbWlzbWF0Y2gKLQotCWplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gKLTsgd2UgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUKLQlzdWIgICAgIGVzaSw0Ci0JbW92ICAgICBlZHgsW2VkaS00XQotCXhvciAgICAgZWR4LFtlc2ldCi0KLQlvciAgICAgIGRsLGRsCi0Jam56ICAgICB0cmZpbgotCWluYyAgICAgZXNpCi0KLQlvciAgICAgIGR4LGR4Ci0Jam56ICAgICB0cmZpbgotCWluYyAgICAgZXNpCi0KLQlhbmQgICAgIGVkeCwwZmZmZmZmaAotCWpueiAgICAgdHJmaW4KLQlpbmMgICAgIGVzaQotCi10cmZpbjoKLQlzdWIgICAgIGVzaSxzY2FuICAgICAgICAgIDsgZXNpID0gbGVuCi10cmZpbnZhbDoKLTsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcKLQljbXAgICAgIGVzaSxiZXN0X2xlbiAgICAgICAgOyBpZiBsZW4gPiBiZXN0X2xlbiwgZ28gbmV3YmVzdGxlbgotCWphICAgICAgc2hvcnQgbmV3YmVzdGxlbgotOyBub3cgd2UgcmVzdG9yZSBlZHgsIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wCi0JbW92ICAgICBlc2kscHJldgotCW1vdiAgICAgZWN4LGxpbWl0Ci0JbW92ICAgICBlZHgsd2luZG93Ci0Jam1wICAgICBjb250bG9vcDMKLQotbmV3YmVzdGxlbjoKLQltb3YgICAgIGJlc3RfbGVuLGVzaSAgICAgICAgOyBsZW4gYmVjb21lIGJlc3RfbGVuCi0KLQltb3YgICAgIG1hdGNoX3N0YXJ0LGVheCAgICAgOyBzYXZlIG5ldyBwb3NpdGlvbiBhcyBtYXRjaF9zdGFydAotCWNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggICAgICA7IGlmIGJlc3RfbGVuID49IG5pY2VfbWF0Y2gsIGV4aXQKLQlqYWUgICAgIGV4aXRsb29wCi0JbW92ICAgICBlY3gsc2NhbgotCW1vdiAgICAgZWR4LHdpbmRvdyAgICAgICAgICA7IHJlc3RvcmUgZWR4PXdpbmRvdwotCWFkZCAgICAgZWN4LGVzaQotCWFkZCAgICAgZXNpLGVkeAotCi0JZGVjICAgICBlc2kKLQltb3YgICAgIHdpbmRvd2xlbixlc2kgICAgICAgOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbi0xCi0JbW92ICAgICBieCxbZWN4LTFdICAgICAgICAgIDsgYnggPSAqKHNjYW4rYmVzdF9sZW4tMSkgPSBzY2FuX2VuZAotCi07IG5vdyB3ZSByZXN0b3JlIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wIDoKLQltb3YgICAgIGVzaSxwcmV2Ci0JbW92ICAgICBlY3gsbGltaXQKLQlqbXAgICAgIGNvbnRsb29wMwotCi1leGl0bG9vcDoKLTsgZXhpdCA6IHMtPm1hdGNoX3N0YXJ0PW1hdGNoX3N0YXJ0Ci0JbW92ICAgICBlYngsbWF0Y2hfc3RhcnQKLQltb3YgICAgIGVicCxzdHJfcwotCW1vdiAgICAgZWN4LGJlc3RfbGVuCi0JbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieAotCW1vdiAgICAgZWF4LGR3b3JkIHB0ciBbZWJwK2RlcF9sb29rYWhlYWRdCi0JY21wICAgICBlY3gsZWF4Ci0JamEgICAgICBtaW5leGxvCi0JbW92ICAgICBlYXgsZWN4Ci1taW5leGxvOgotOyByZXR1cm4gbWluKGJlc3RfbGVuLHMtPmxvb2thaGVhZCkKLQotOyByZXN0b3JlIHN0YWNrIGFuZCByZWdpc3RlciBlYngsZXNpLGVkaSxlYnAKLQlhZGQgICAgIGVzcCxOYlN0YWNrQWRkCi0KLQlwb3AgICAgIGVieAotCXBvcCAgICAgZXNpCi0JcG9wICAgICBlZGkKLQlwb3AgICAgIGVicAotCXJldAotSW5mb0F1dGhvcjoKLTsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhCi07IFlvdXIgYXJlIGZyZWUgdXNlIGd2bWF0MzIgaW4gYW55IGZyZSBvciBjb21tZXJjaWFsIGFwcHMgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhCi0JZGIgICAgIDBkaCwwYWgsIkdWTWF0MzIgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgd3JpdHRlbiAxOTk2LTk4IGJ5IEdpbGxlcyBWb2xsYW50IiwwZGgsMGFoCi0KLQotCi1JRkRFRiBOT1VOREVSTElORQotbG9uZ2VzdF9tYXRjaF83ZmZmICAgZW5kcAotRUxTRQotX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcAotRU5ESUYKLQotCi1JRkRFRiBOT1VOREVSTElORQotY3B1ZGV0ZWN0MzIgICAgIHByb2MgbmVhcgotRUxTRQotX2NwdWRldGVjdDMyICAgIHByb2MgbmVhcgotRU5ESUYKLQotCXB1c2gJZWJ4Ci0KLQlwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTCi0JcG9wICAgICBlYXggICAgICAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTCi0JbW92ICAgICBlY3gsIGVheCAgICAgICAgOyBzYXZlIG9yaWdpbmFsIEVGTEFHUwotCXhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTCi0JcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLQlwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLQlwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTCi0JcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotCXhvciAgICAgZWF4LCBlY3ggICAgICAgIDsgY2FuknQgdG9nZ2xlIEFDIGJpdCwgcHJvY2Vzc29yPTgwMzg2Ci0JanogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3NvcgotCXB1c2ggICAgZWN4Ci0JcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIEFDIGJpdCBpbiBFRkxBR1MgZmlyc3QKLQotCXB1c2hmZAotCXB1c2hmZAotCXBvcCAgICAgZWN4Ci0KLQltb3YgICAgIGVheCwgZWN4ICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MKLQl4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUwotCXB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0JcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCi0JcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUwotCXBvcAkJZWF4CSAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLQlwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgb3JpZ2luYWwgRUZMQUdTCi0JeG9yCQllYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LAotCWplCQlpc19vbGRfNDg2CQk7IHByb2Nlc3Nvcj1vbGQKLQotCW1vdiAgICAgZWF4LDEKLQlkYiAgICAgIDBmaCwwYTJoICAgICAgICA7Q1BVSUQKLQotZXhpdGNwdWRldGVjdDoKLQlwb3AJZWJ4Ci0JcmV0Ci0KLWVuZF9jcHVfaXNfMzg2OgotCW1vdiAgICAgZWF4LDAzMDBoCi0Jam1wICAgICBleGl0Y3B1ZGV0ZWN0Ci0KLWlzX29sZF80ODY6Ci0JbW92ICAgICBlYXgsMDQwMGgKLQlqbXAgICAgIGV4aXRjcHVkZXRlY3QKLQotSUZERUYgTk9VTkRFUkxJTkUKLWNwdWRldGVjdDMyICAgICBlbmRwCi1FTFNFCi1fY3B1ZGV0ZWN0MzIgICAgZW5kcAotRU5ESUYKLQotCi0KLQotTUFYX01BVENIICAgICAgIGVxdSAgICAgMjU4Ci1NSU5fTUFUQ0ggICAgICAgZXF1ICAgICAzCi1NSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKLU1BWF9NQVRDSF84XyAgICAgZXF1ICAgICAoKE1BWF9NQVRDSCArIDcpIEFORCAwRkZGMGgpCi0KLQotOzs7IHN0YWNrIGZyYW1lIG9mZnNldHMKLQotY2hhaW5sZW53bWFzawllcXUgIGVzcCArIDAJOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCi0JCQkJCTsgbG93IHdvcmQ6IHMtPndtYXNrCi13aW5kb3cJCWVxdSAgZXNwICsgNAk7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93Ci13aW5kb3diZXN0bGVuCWVxdSAgZXNwICsgOAk7IHMtPndpbmRvdyArIGJlc3RsZW4KLXNjYW5zdGFydAllcXUgIGVzcCArIDE2CTsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwotc2NhbmVuZAkJZXF1ICBlc3AgKyAxMgk7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwotc2NhbmFsaWduCWVxdSAgZXNwICsgMjAJOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCi1uaWNlbWF0Y2gJZXF1ICBlc3AgKyAyNAk7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQotYmVzdGxlbgkJZXF1ICBlc3AgKyAyOAk7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIKLXNjYW4JCWVxdSAgZXNwICsgMzIJOyBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gKLQotTG9jYWxWYXJzU2l6ZQllcXUgMzYKLTsJc2F2ZWQgZWJ4CWJ5dGUgZXNwICsgMzYKLTsJc2F2ZWQgZWRpCWJ5dGUgZXNwICsgNDAKLTsJc2F2ZWQgZXNpCWJ5dGUgZXNwICsgNDQKLTsJc2F2ZWQgZWJwCWJ5dGUgZXNwICsgNDgKLTsJcmV0dXJuIGFkZHJlc3MJYnl0ZSBlc3AgKyA1MgotZGVmbGF0ZXN0YXRlCWVxdSAgZXNwICsgNTYJOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi1jdXJtYXRjaAllcXUgIGVzcCArIDYwCi0KLTs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzCi07OzsgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlLCB3aXRoIHRoZQotOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywKLTs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzCi07OzsgcHJvZ3JhbSB0byBjcmFzaCBob3JyaWJseSwgd2l0aG91dCBzbyBtdWNoIGFzIGEgd2FybmluZyBhdAotOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pCi0KLWRzV1NpemUJCWVxdSAzNithZGRzdHItNAotZHNXTWFzawkJZXF1IDQ0K2FkZHN0ci00Ci1kc1dpbmRvdwllcXUgNDgrYWRkc3RyLTQKLWRzUHJldgkJZXF1IDU2K2FkZHN0ci00Ci1kc01hdGNoTGVuCWVxdSA4OCthZGRzdHItNAotZHNQcmV2TWF0Y2gJZXF1IDkyK2FkZHN0ci00Ci1kc1N0clN0YXJ0CWVxdSAxMDArYWRkc3RyLTQKLWRzTWF0Y2hTdGFydAllcXUgMTA0K2FkZHN0ci00Ci1kc0xvb2thaGVhZAllcXUgMTA4K2FkZHN0ci00Ci1kc1ByZXZMZW4JZXF1IDExMithZGRzdHItNAotZHNNYXhDaGFpbkxlbgllcXUgMTE2K2FkZHN0ci00Ci1kc0dvb2RNYXRjaAllcXUgMTMyK2FkZHN0ci00Ci1kc05pY2VNYXRjaAllcXUgMTM2K2FkZHN0ci00Ci0KLQotOzs7IG1hdGNoLmFzbSAtLSBQZW50aXVtLVByby1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkKLTs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yCi07OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Ci07OzsgWW91IGNhbiBsb29rIGF0IGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKLTs7OwotOzs7IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotOzs7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLTtHTE9CQUwJX2xvbmdlc3RfbWF0Y2gsIF9tYXRjaF9pbml0Ci0KLQotO1NFQ1RJT04JLnRleHQKLQotOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpCi0KLTtfbG9uZ2VzdF9tYXRjaDoKLUlGREVGIE5PVU5ERVJMSU5FCi1sb25nZXN0X21hdGNoXzY4NiAgIHByb2MgbmVhcgotRUxTRQotX2xvbmdlc3RfbWF0Y2hfNjg2ICBwcm9jIG5lYXIKLUVORElGCi0KLQotOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8KLTs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4KLQotCQlwdXNoCWVicAotCQlwdXNoCWVkaQotCQlwdXNoCWVzaQotCQlwdXNoCWVieAotCQlzdWIJZXNwLCBMb2NhbFZhcnNTaXplCi0KLTs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAotOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUKLTs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQotOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuCi0KLQkJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0KLQkJbW92CWVjeCwgW2N1cm1hdGNoXQotCi07OzsgdUludCB3bWFzayA9IHMtPndfbWFzazsKLTs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwotOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7Ci07OzsgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKLTs7OyB9Ci0KLQkJbW92CWVheCwgW2VkeCArIGRzUHJldkxlbl0KLQkJbW92CWVieCwgW2VkeCArIGRzR29vZE1hdGNoXQotCQljbXAJZWF4LCBlYngKLQkJbW92CWVheCwgW2VkeCArIGRzV01hc2tdCi0JCW1vdgllYngsIFtlZHggKyBkc01heENoYWluTGVuXQotCQlqbAlMYXN0TWF0Y2hHb29kCi0JCXNocgllYngsIDIKLUxhc3RNYXRjaEdvb2Q6Ci0KLTs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCi07OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0LgotOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCi07OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4KLQotCQlkZWMJZWJ4Ci0JCXNobAllYngsIDE2Ci0JCW9yCWVieCwgZWF4Ci0JCW1vdglbY2hhaW5sZW53bWFza10sIGVieAotCi07OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7Ci0KLQkJbW92CWVheCwgW2VkeCArIGRzTmljZU1hdGNoXQotCQltb3YJZWJ4LCBbZWR4ICsgZHNMb29rYWhlYWRdCi0JCWNtcAllYngsIGVheAotCQlqbAlMb29rYWhlYWRMZXNzCi0JCW1vdgllYngsIGVheAotTG9va2FoZWFkTGVzczoJbW92CVtuaWNlbWF0Y2hdLCBlYngKLQotOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7Ci0KLQkJbW92CWVzaSwgW2VkeCArIGRzV2luZG93XQotCQltb3YJW3dpbmRvd10sIGVzaQotCQltb3YJZWJwLCBbZWR4ICsgZHNTdHJTdGFydF0KLQkJbGVhCWVkaSwgW2VzaSArIGVicF0KLQkJbW92CVtzY2FuXSwgZWRpCi0KLTs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nCi07OzsgZHdvcmQtYWxpZ25lZC4KLQotCQltb3YJZWF4LCBlZGkKLQkJbmVnCWVheAotCQlhbmQJZWF4LCAzCi0JCW1vdglbc2NhbmFsaWduXSwgZWF4Ci0KLTs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/Ci07OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7Ci0KLQkJbW92CWVheCwgW2VkeCArIGRzV1NpemVdCi0JCXN1YgllYXgsIE1JTl9MT09LQUhFQUQKLQkJc3ViCWVicCwgZWF4Ci0JCWpnCUxpbWl0UG9zaXRpdmUKLQkJeG9yCWVicCwgZWJwCi1MaW1pdFBvc2l0aXZlOgotCi07OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7Ci0KLQkJbW92CWVheCwgW2VkeCArIGRzUHJldkxlbl0KLQkJbW92CVtiZXN0bGVuXSwgZWF4Ci0KLTs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLgotCi0JCWFkZAllc2ksIGVheAotCQltb3YJW3dpbmRvd2Jlc3RsZW5dLCBlc2kKLQotOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwotOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKLTs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsKLQotCQltb3Z6eAllYngsIHdvcmQgcHRyIFtlZGldCi0JCW1vdglbc2NhbnN0YXJ0XSwgZWJ4Ci0JCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCi0JCW1vdglbc2NhbmVuZF0sIGVieAotCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQotCi07OzsgSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCi0KLQkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdCi0JCWptcAlzaG9ydCBMb29wRW50cnkKLQotYWxpZ24gNAotCi07OzsgZG8gewotOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8Ci07OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotOzs7ICAgICBbLi4uXQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotOzs7Ci07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQotOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi07OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCi07OzsKLTs7OyBXaXRoaW4gdGhpcyBsb29wOgotOzs7IGVieCA9IHNjYW5lbmQKLTs7OyBlY3ggPSBjdXJtYXRjaAotOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLTs7OyBlZGkgPSBwcmV2Ci07OzsgZWJwID0gbGltaXQKLQotTG9va3VwTG9vcDoKLQkJYW5kCWVjeCwgZWR4Ci0JCW1vdnp4CWVjeCwgd29yZCBwdHIgW2VkaSArIGVjeCoyXQotCQljbXAJZWN4LCBlYnAKLQkJamJlCUxlYXZlTm93Ci0JCXN1YgllZHgsIDAwMDEwMDAwaAotCQlqcwlMZWF2ZU5vdwotTG9vcEVudHJ5Ogltb3Z6eAllYXgsIHdvcmQgcHRyIFtlc2kgKyBlY3ggLSAxXQotCQljbXAJZWF4LCBlYngKLQkJam56CUxvb2t1cExvb3AKLQkJbW92CWVheCwgW3dpbmRvd10KLQkJbW92engJZWF4LCB3b3JkIHB0ciBbZWF4ICsgZWN4XQotCQljbXAJZWF4LCBbc2NhbnN0YXJ0XQotCQlqbnoJTG9va3VwTG9vcAotCi07OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uCi0KLQkJbW92CVtjaGFpbmxlbndtYXNrXSwgZWR4Ci0KLTs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlCi07OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQotOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzCi07OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCi0KLQkJbW92CWVzaSwgW3dpbmRvd10KLQkJbW92CWVkaSwgW3NjYW5dCi0JCWFkZAllc2ksIGVjeAotCQltb3YJZWF4LCBbc2NhbmFsaWduXQotCQltb3YJZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQotCQlsZWEJZWRpLCBbZWRpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KLQkJbGVhCWVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdCi0KLTs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi07OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi07OzsKLTs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKLTs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi07Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zCi07OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkKLTs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pCi07OzsKLTs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci07OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUKLTs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKLTs7OyBwZXJmb3JtYW5jZS4KLQotTG9vcENtcHM6Ci0JCW1vdgllYXgsIFtlc2kgKyBlZHhdCi0JCXhvcgllYXgsIFtlZGkgKyBlZHhdCi0JCWpueglMZWF2ZUxvb3BDbXBzCi0JCW1vdgllYXgsIFtlc2kgKyBlZHggKyA0XQotCQl4b3IJZWF4LCBbZWRpICsgZWR4ICsgNF0KLQkJam56CUxlYXZlTG9vcENtcHM0Ci0JCWFkZAllZHgsIDgKLQkJam56CUxvb3BDbXBzCi0JCWptcAlzaG9ydCBMZW5NYXhpbXVtCi1MZWF2ZUxvb3BDbXBzNDoJYWRkCWVkeCwgNAotTGVhdmVMb29wQ21wczoJdGVzdAllYXgsIDAwMDBGRkZGaAotCQlqbnoJTGVuTG93ZXIKLQkJYWRkCWVkeCwgIDIKLQkJc2hyCWVheCwgMTYKLUxlbkxvd2VyOglzdWIJYWwsIDEKLQkJYWRjCWVkeCwgMAotCi07OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCi07OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCi0KLQkJbGVhCWVheCwgW2VkaSArIGVkeF0KLQkJbW92CWVkaSwgW3NjYW5dCi0JCXN1YgllYXgsIGVkaQotCQljbXAJZWF4LCBNQVhfTUFUQ0gKLQkJamdlCUxlbk1heGltdW0KLQotOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQotOzs7IGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4KLQotCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQotCQltb3YJZWJ4LCBbYmVzdGxlbl0KLQkJY21wCWVheCwgZWJ4Ci0JCWpnCUxvbmdlck1hdGNoCi0JCW1vdgllc2ksIFt3aW5kb3diZXN0bGVuXQotCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQotCQltb3YJZWJ4LCBbc2NhbmVuZF0KLQkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdCi0JCWptcAlMb29rdXBMb29wCi0KLTs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47Ci07OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwotOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwotCi1Mb25nZXJNYXRjaDoJbW92CWVieCwgW25pY2VtYXRjaF0KLQkJbW92CVtiZXN0bGVuXSwgZWF4Ci0JCW1vdglbZWR4ICsgZHNNYXRjaFN0YXJ0XSwgZWN4Ci0JCWNtcAllYXgsIGVieAotCQlqZ2UJTGVhdmVOb3cKLQkJbW92CWVzaSwgW3dpbmRvd10KLQkJYWRkCWVzaSwgZWF4Ci0JCW1vdglbd2luZG93YmVzdGxlbl0sIGVzaQotCQltb3Z6eAllYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQotCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQotCQltb3YJW3NjYW5lbmRdLCBlYngKLQkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdCi0JCWptcAlMb29rdXBMb29wCi0KLTs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4KLQotTGVuTWF4aW11bToJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0KLQkJbW92CWR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSAotCQltb3YJW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeAotCi07OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwotOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7Ci0KLUxlYXZlTm93OgotCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQotCQltb3YJZWJ4LCBbYmVzdGxlbl0KLQkJbW92CWVheCwgW2VkeCArIGRzTG9va2FoZWFkXQotCQljbXAJZWJ4LCBlYXgKLQkJamcJTG9va2FoZWFkUmV0Ci0JCW1vdgllYXgsIGVieAotTG9va2FoZWFkUmV0OgotCi07OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLgotCi0JCWFkZAllc3AsIExvY2FsVmFyc1NpemUKLQkJcG9wCWVieAotCQlwb3AJZXNpCi0JCXBvcAllZGkKLQkJcG9wCWVicAotCi0JCXJldAotOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICEKLTsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDMyIGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQotCWRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoCi0KLUlGREVGIE5PVU5ERVJMSU5FCi1sb25nZXN0X21hdGNoXzY4NiAgIGVuZHAKLUVMU0UKLV9sb25nZXN0X21hdGNoXzY4NiAgZW5kcAotRU5ESUYKLQotX1RFWFQgICBlbmRzCi1lbmQKKzsgZ3ZtYXQzMi5hc20gLS0gQXNtIHBvcnRpb24gb2YgdGhlIG9wdGltaXplZCBsb25nZXN0X21hdGNoIGZvciAzMiBiaXRzIHg4Ng0KKzsgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseSBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCis7ICBmcm9tIEplYW4tbG91cCBHYWlsbHkgaW4gZGVmbGF0ZS5jDQorOw0KKzsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQorOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCis7ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzsNCis7IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcg0KKzsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsNCis7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCis7ICAgIGFuZCBpbiBWQysrMjAwMyB0b29sa2l0IGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLw0KKzsNCis7IHRoaXMgZmlsZSBjb250YWluIHR3byBpbXBsZW1lbnRhdGlvbiBvZiBsb25nZXN0X21hdGNoDQorOw0KKzsgIGxvbmdlc3RfbWF0Y2hfN2ZmZiA6IHdyaXR0ZW4gMTk5NiBieSBHaWxsZXMgVm9sbGFudCBvcHRpbWl6ZWQgZm9yIA0KKzsgICAgICAgICAgICBmaXJzdCBQZW50aXVtLiBBc3N1bWUgcy0+d19tYXNrID09IDB4N2ZmZg0KKzsgIGxvbmdlc3RfbWF0Y2hfNjg2IDogd3JpdHRlbiBieSBCcmlhbiByYWl0ZXIgKDE5OTgpLCBvcHRpbWl6ZWQgZm9yIFBlbnRpdW0gUHJvDQorOw0KKzsgIGZvciB1c2luZyBhbiBzZWVtYmx5IHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCwgeW91IG5lZWQgZGVmaW5lIEFTTVYgaW4gcHJvamVjdA0KKzsgIFRoZXJlIGlzIHR3byB3YXkgaW4gdXNpbmcgZ3ZtYXQzMi5hc20NCis7DQorOyAgQSkgU3VnZ2VzdGVkIG1ldGhvZA0KKzsgICAgaWYgeW91IHdhbnQgaW5jbHVkZSBib3RoIGxvbmdlc3RfbWF0Y2hfN2ZmZiBhbmQgbG9uZ2VzdF9tYXRjaF82ODYNCis7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcNCis7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL0ZsZ3ZtYXQzMi5sc3QgL2MgZ3ZtYXQzMi5hc20NCis7ICAgIGFuZCBpbmNsdWRlIGd2bWF0MzJjLmMgaW4geW91ciBwcm9qZWN0DQorOyAgICBpZiB5b3UgaGF2ZSBhbiBvbGQgY3B1ICgzODYsNDg2IG9yIGZpcnN0IFBlbnRpdW0pIGFuZCBzLT53X21hc2s9PTB4N2ZmZiwNCis7ICAgICAgICBsb25nZXN0X21hdGNoXzdmZmYgd2lsbCBiZSB1c2VkDQorOyAgICBpZiB5b3UgaGF2ZSBhIG1vcmUgbW9kZXJuIENQVSAoUGVudGl1bSBQcm8sIElJIGFuZCBoaWdoZXIpDQorOyAgICAgICAgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkDQorOyAgICBvbiBvbGQgY3B1IHdpdGggcy0+d19tYXNrIT0weDdmZmYsIGxvbmdlc3RfbWF0Y2hfNjg2IHdpbGwgYmUgdXNlZCwNCis7ICAgICAgICBidXQgdGhpcyBpcyBub3QgYSBzaXRhdGlvbiB5b3UnbGwgZmluZCBvZnRlbg0KKzsNCis7ICBCKSBBbHRlcm5hdGl2ZQ0KKzsgICAgaWYgeW91IGFyZSBub3QgaW50ZXJyZXNlZCBpbiBvbGQgY3B1IHBlcmZvcm1hbmNlIGFuZCB3YW50IHRoZSBzbWFsbGVyDQorOyAgICAgICBiaW5hcmllcyBwb3NzaWJsZQ0KKzsNCis7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcNCis7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsZ3ZtYXQzMi5sc3QgL0ROT09MRFBFTlRJVU1DT0RFIGd2bWF0MzIuYXNtDQorOyAgICBhbmQgZG8gbm90IGluY2x1ZGUgZ3ZtYXQzMmMuYyBpbiB5b3VyIHByb2plY3QgKG91IGRlZmluZSBhbHNvIA0KKzsgICAgICAgICAgICAgIE5PT0xEUEVOVElVTUNPREUpDQorOw0KKzsgbm90ZSA6IGFzIEkga25vd24sIGxvbmdlc3RfbWF0Y2hfNjg2IGlzIHZlcnkgZmFzdGVyIHRoYW4gbG9uZ2VzdF9tYXRjaF83ZmZmDQorOyAgICAgICAgb24gcGVudGl1bSBQcm8vSUkvSUlJLCBmYXN0ZXIgKGJ1dCBsZXNzKSBpbiBQNCwgYnV0IGl0IHNlZW0NCis7ICAgICAgICBsb25nZXN0X21hdGNoXzdmZmYgY2FuIGJlIGZhc3RlciAodmVyeSB2ZXJ5IGxpdHRlKSBvbiBBTUQgQXRobG9uNjQvSzgNCis7DQorOyBzZWUgYmVsb3cgOiB6bGliMTIyMmFkZCBtdXN0IGJlIGFkanVzdGVyIGlmIHlvdSB1c2UgYSB6bGliIHZlcnNpb24gPCAxLjIuMi4yDQorDQorO3VJbnQgbG9uZ2VzdF9tYXRjaF83ZmZmKHMsIGN1cl9tYXRjaCkNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCisgICAgTmJTdGFjayAgICAgICAgIGVxdSAgICAgNzYNCisgICAgY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdDQorICAgIHN0cl9zICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay00XQ0KKzsgNSBkd29yZCBvbiB0b3AgKHJldCxlYnAsZXNpLGVkaSxlYngpDQorICAgIGFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQ0KKyAgICBwdXNoZWJwICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTJdDQorICAgIHB1c2hlZGkgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0NCisgICAgcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQ0KKyAgICBwdXNoZWJ4ICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMjRdDQorDQorICAgIGNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdDQorICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdDQorICAgIGJlc3RfbGVuICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzZdDQorICAgIHdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdDQorICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdDQorICAgIHNjYW5fc3RhcnQgICAgICBlcXUgICAgICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNDhdDQorICAgIHdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdDQorICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdDQorICAgIG5pY2VfbWF0Y2ggICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjBdDQorICAgIHNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdDQorDQorICAgIHdpbmRvd2xlbiAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdDQorICAgIG1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdDQorICAgIHN0cmVuZCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzZdDQorICAgIE5iU3RhY2tBZGQgICAgICBlcXUgICAgIChOYlN0YWNrLTI0KQ0KKw0KKyAgICAuMzg2cA0KKw0KKyAgICBuYW1lICAgIGd2bWF0Y2gNCisgICAgLk1PREVMICBGTEFUDQorDQorDQorDQorOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCis7ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQorOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQorDQorICAgIHpsaWIxMjIyYWRkICAgICAgICAgZXF1ICAgICA4DQorDQorOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlDQorICAgIGRlcF9jaGFpbl9sZW5ndGggICAgZXF1ICAgICA3NGgremxpYjEyMjJhZGQNCisgICAgZGVwX3dpbmRvdyAgICAgICAgICBlcXUgICAgIDMwaCt6bGliMTIyMmFkZA0KKyAgICBkZXBfc3Ryc3RhcnQgICAgICAgIGVxdSAgICAgNjRoK3psaWIxMjIyYWRkDQorICAgIGRlcF9wcmV2X2xlbmd0aCAgICAgZXF1ICAgICA3MGgremxpYjEyMjJhZGQNCisgICAgZGVwX25pY2VfbWF0Y2ggICAgICBlcXUgICAgIDg4aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfd19zaXplICAgICAgICAgIGVxdSAgICAgMjRoK3psaWIxMjIyYWRkDQorICAgIGRlcF9wcmV2ICAgICAgICAgICAgZXF1ICAgICAzOGgremxpYjEyMjJhZGQNCisgICAgZGVwX3dfbWFzayAgICAgICAgICBlcXUgICAgIDJjaCt6bGliMTIyMmFkZA0KKyAgICBkZXBfZ29vZF9tYXRjaCAgICAgIGVxdSAgICAgODRoK3psaWIxMjIyYWRkDQorICAgIGRlcF9tYXRjaF9zdGFydCAgICAgZXF1ICAgICA2OGgremxpYjEyMjJhZGQNCisgICAgZGVwX2xvb2thaGVhZCAgICAgICBlcXUgICAgIDZjaCt6bGliMTIyMmFkZA0KKw0KKw0KK19URVhUICAgICAgICAgICAgICAgICAgIHNlZ21lbnQNCisNCitJRkRFRiBOT1VOREVSTElORQ0KKyAgIElGREVGIE5PT0xEUEVOVElVTUNPREUNCisgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2gNCisgICAgICAgICAgICBwdWJsaWMgIG1hdGNoX2luaXQNCisgICBFTFNFICAgICAgICAgICAgDQorICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzdmZmYNCisgICAgICAgICAgICBwdWJsaWMgIGNwdWRldGVjdDMyDQorICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzY4Ng0KKyAgIEVORElGDQorRUxTRQ0KKyAgIElGREVGIE5PT0xEUEVOVElVTUNPREUNCisgICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoDQorICAgICAgICAgICAgcHVibGljICBfbWF0Y2hfaW5pdA0KKyAgIEVMU0UNCisgICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoXzdmZmYNCisgICAgICAgICAgICBwdWJsaWMgIF9jcHVkZXRlY3QzMg0KKyAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfNjg2DQorICAgRU5ESUYNCitFTkRJRg0KKw0KKyAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQorICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQorICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQ0KKw0KKw0KKw0KK0lGTkRFRiBOT09MRFBFTlRJVU1DT0RFDQorSUZERUYgTk9VTkRFUkxJTkUNCitsb25nZXN0X21hdGNoXzdmZmYgICBwcm9jIG5lYXINCitFTFNFDQorX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgcHJvYyBuZWFyDQorRU5ESUYNCisNCisgICAgbW92ICAgICBlZHgsW2VzcCs0XQ0KKw0KKw0KKw0KKyAgICBwdXNoICAgIGVicA0KKyAgICBwdXNoICAgIGVkaQ0KKyAgICBwdXNoICAgIGVzaQ0KKyAgICBwdXNoICAgIGVieA0KKw0KKyAgICBzdWIgICAgIGVzcCxOYlN0YWNrQWRkDQorDQorOyBpbml0aWFsaXplIG9yIGNoZWNrIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiBtYXRjaC5hc20uDQorICAgIG1vdiAgICAgZWJwLGVkeA0KKw0KKzsgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aA0KKzsgaWYgKHByZXZfbGVuZ3RoPj1nb29kX21hdGNoKSBjaGFpbl9sZW5ndGggPj49IDINCisgICAgbW92ICAgICBlZHgsW2VicCtkZXBfY2hhaW5fbGVuZ3RoXQ0KKyAgICBtb3YgICAgIGVieCxbZWJwK2RlcF9wcmV2X2xlbmd0aF0NCisgICAgY21wICAgICBbZWJwK2RlcF9nb29kX21hdGNoXSxlYngNCisgICAgamEgICAgICBub3Nocg0KKyAgICBzaHIgICAgIGVkeCwyDQorbm9zaHI6DQorOyB3ZSBpbmNyZW1lbnQgY2hhaW5fbGVuZ3RoIGJlY2F1c2UgaW4gdGhlIGFzbSwgdGhlIC0tY2hhaW5fbGVuZ2h0IGlzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3ANCisgICAgaW5jICAgICBlZHgNCisgICAgbW92ICAgICBlZGksW2VicCtkZXBfbmljZV9tYXRjaF0NCisgICAgbW92ICAgICBjaGFpbl9sZW5ndGgsZWR4DQorICAgIG1vdiAgICAgZWF4LFtlYnArZGVwX2xvb2thaGVhZF0NCisgICAgY21wICAgICBlYXgsZWRpDQorOyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsNCisgICAgamFlICAgICBub2xvb2thaGVhZG5pY2VtYXRjaA0KKyAgICBtb3YgICAgIGVkaSxlYXgNCitub2xvb2thaGVhZG5pY2VtYXRjaDoNCis7IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGgNCisgICAgbW92ICAgICBiZXN0X2xlbixlYngNCisNCis7IHdpbmRvdyA9IHMtPndpbmRvdw0KKyAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93aW5kb3ddDQorICAgIG1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQ0KKyAgICBtb3YgICAgIHdpbmRvdyxlc2kNCisNCisgICAgbW92ICAgICBuaWNlX21hdGNoLGVkaQ0KKzsgc2NhbiA9IHdpbmRvdyArIHN0cnN0YXJ0DQorICAgIGFkZCAgICAgZXNpLGVjeA0KKyAgICBtb3YgICAgIHNjYW4sZXNpDQorOyBkeCA9ICp3aW5kb3cNCisgICAgbW92ICAgICBkeCx3b3JkIHB0ciBbZXNpXQ0KKzsgYnggPSAqKHdpbmRvdytiZXN0X2xlbi0xKQ0KKyAgICBtb3YgICAgIGJ4LHdvcmQgcHRyIFtlc2krZWJ4LTFdDQorICAgIGFkZCAgICAgZXNpLE1BWF9NQVRDSC0xDQorOyBzY2FuX3N0YXJ0ID0gKnNjYW4NCisgICAgbW92ICAgICBzY2FuX3N0YXJ0LGR4DQorOyBzdHJlbmQgPSBzY2FuICsgTUFYX01BVENILTENCisgICAgbW92ICAgICBzdHJlbmQsZXNpDQorOyBieCA9IHNjYW5fZW5kID0gKih3aW5kb3crYmVzdF9sZW4tMSkNCisNCis7ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7ICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KKw0KKyAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93X3NpemVdDQorICAgIHN1YiAgICAgZXNpLE1JTl9MT09LQUhFQUQNCis7IGhlcmUgZXNpID0gTUFYX0RJU1QocykNCisgICAgc3ViICAgICBlY3gsZXNpDQorICAgIGphICAgICAgbm9kaXN0DQorICAgIHhvciAgICAgZWN4LGVjeA0KK25vZGlzdDoNCisgICAgbW92ICAgICBsaW1pdCxlY3gNCisNCis7IHByZXYgPSBzLT5wcmV2DQorICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX3ByZXZdDQorICAgIG1vdiAgICAgcHJldixlZHgNCisNCis7DQorICAgIG1vdiAgICAgZWR4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0NCisgICAgbW92ICAgICBicCxzY2FuX3N0YXJ0DQorICAgIG1vdiAgICAgZWF4LGN1cl9tYXRjaA0KKyAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVkeA0KKw0KKyAgICBtb3YgICAgIGVkeCx3aW5kb3cNCisgICAgbW92ICAgICBlZGksZWR4DQorICAgIGFkZCAgICAgZWRpLGJlc3RfbGVuDQorICAgIG1vdiAgICAgZXNpLHByZXYNCisgICAgZGVjICAgICBlZGkNCis7IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuIC0xDQorICAgIG1vdiAgICAgd2luZG93bGVuLGVkaQ0KKw0KKyAgICBqbXAgICAgIGJlZ2lubG9vcDINCisgICAgYWxpZ24gICA0DQorDQorOyBoZXJlLCBpbiB0aGUgbG9vcA0KKzsgICAgICAgZWF4ID0gYXggPSBjdXJfbWF0Y2gNCis7ICAgICAgIGVjeCA9IGxpbWl0DQorOyAgICAgICAgYnggPSBzY2FuX2VuZA0KKzsgICAgICAgIGJwID0gc2Nhbl9zdGFydA0KKzsgICAgICAgZWRpID0gd2luZG93bGVuICh3aW5kb3cgKyBiZXN0X2xlbiAtMSkNCis7ICAgICAgIGVzaSA9IHByZXYNCisNCisNCis7Ly8gaGVyZTsgY2hhaW5fbGVuZ3RoIDw9MTYNCitub3JtYWxiZWcwYWRkMTY6DQorICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2DQorICAgIGp6ICAgICAgZXhpdGxvb3ANCitub3JtYWxiZWcwOg0KKyAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQorICAgIGplICAgICAgbm9ybWFsYmVnMm5vcm9sbA0KK3Jjb250bGFibm9yb2xsOg0KKzsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10NCisgICAgYW5kICAgICBlYXgsN2ZmZmgNCisgICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQorOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3ANCisgICAgY21wICAgICBlY3gsZWF4DQorICAgIGpuYiAgICAgZXhpdGxvb3ANCis7IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wDQorICAgIGRlYyAgICAgY2hhaW5fbGVuZ3RoDQorICAgIGpueiAgICAgbm9ybWFsYmVnMA0KKyAgICBqbXAgICAgIGV4aXRsb29wDQorDQorbm9ybWFsYmVnMm5vcm9sbDoNCis7IGlmIChzY2FuX3N0YXJ0PT0qKGN1cl9tYXRjaCt3aW5kb3cpKSBnb3RvIG5vcm1hbGJlZzINCisgICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQ0KKyAgICBqbmUgICAgIHJjb250bGFibm9yb2xsDQorICAgIGptcCAgICAgbm9ybWFsYmVnMg0KKw0KK2NvbnRsb29wMzoNCisgICAgbW92ICAgICBlZGksd2luZG93bGVuDQorDQorOyBjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXQ0KKyAgICBhbmQgICAgIGVheCw3ZmZmaA0KKyAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0NCis7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcA0KKyAgICBjbXAgICAgIGVjeCxlYXgNCitqbmJleGl0bG9vcHNob3J0MToNCisgICAgam5iICAgICBleGl0bG9vcA0KKzsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3ANCisNCisNCis7IGJlZ2luIHRoZSBtYWluIGxvb3ANCitiZWdpbmxvb3AyOg0KKyAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNisxDQorOyBpZiBjaGFpbl9sZW5ndGggPD0xNiwgZG9uJ3QgdXNlIHRoZSB1bnJvbGxlZCBsb29wDQorICAgIGpuYSAgICAgbm9ybWFsYmVnMGFkZDE2DQorDQorZG8xNjoNCisgICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieA0KKyAgICBqZSAgICAgIG5vcm1hbGJlZzJkYzANCisNCittYWNjbiAgIE1BQ1JPICAgbGFiDQorICAgIGFuZCAgICAgZWF4LDdmZmZoDQorICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KKyAgICBjbXAgICAgIGVjeCxlYXgNCisgICAgam5iICAgICBleGl0bG9vcA0KKyAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQorICAgIGplICAgICAgbGFiDQorICAgIEVORE0NCisNCityY29udGxvb3AwOg0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzENCisNCityY29udGxvb3AxOg0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzINCisNCityY29udGxvb3AyOg0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzMNCisNCityY29udGxvb3AzOg0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzQNCisNCityY29udGxvb3A0Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzUNCisNCityY29udGxvb3A1Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzYNCisNCityY29udGxvb3A2Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzcNCisNCityY29udGxvb3A3Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzgNCisNCityY29udGxvb3A4Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzkNCisNCityY29udGxvb3A5Og0KKyAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzEwDQorDQorcmNvbnRsb29wMTA6DQorICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTENCisNCityY29udGxvb3AxMToNCisgICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMg0KKw0KK3Jjb250bG9vcDEyOg0KKyAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEzDQorDQorcmNvbnRsb29wMTM6DQorICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTQNCisNCityY29udGxvb3AxNDoNCisgICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxNQ0KKw0KK3Jjb250bG9vcDE1Og0KKyAgICBhbmQgICAgIGVheCw3ZmZmaA0KKyAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0NCisgICAgY21wICAgICBlY3gsZWF4DQorICAgIGpuYiAgICAgZXhpdGxvb3ANCisNCisgICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYNCisgICAgamEgICAgICBkbzE2DQorICAgIGptcCAgICAgbm9ybWFsYmVnMGFkZDE2DQorDQorOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCisNCitub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViDQorOyBpZiB3ZSBhcmUgaGVyZSwgd2Uga25vdyB0aGF0ICoobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCisgICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQ0KKzsgaWYgKG1hdGNoICE9IHNjYW5fc3RhcnQpIGdvdG8gcmNvbnRsYWINCisgICAgam5lICAgICByY29udGxhYg0KKzsgY2FsY3VsYXRlIHRoZSBnb29kIGNoYWluX2xlbmd0aCwgYW5kIHdlJ2xsIGNvbXBhcmUgc2NhbiBhbmQgbWF0Y2ggc3RyaW5nDQorICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1Yg0KKyAgICBqbXAgICAgIGlzZXENCisgICAgRU5ETQ0KKw0KKw0KK25vcm1hbGJlZzJkYzExOg0KKyAgICBub3JtYmVnIHJjb250bG9vcDExLDExDQorDQorbm9ybWFsYmVnMmRjMTI6DQorICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTIsMTINCisNCitub3JtYWxiZWcyZGMxMzoNCisgICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMywxMw0KKw0KK25vcm1hbGJlZzJkYzE0Og0KKyAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0DQorDQorbm9ybWFsYmVnMmRjMTU6DQorICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTUsMTUNCisNCitub3JtYWxiZWcyZGMxMDoNCisgICAgbm9ybWJlZyByY29udGxvb3AxMCwxMA0KKw0KK25vcm1hbGJlZzJkYzk6DQorICAgIG5vcm1iZWcgcmNvbnRsb29wOSw5DQorDQorbm9ybWFsYmVnMmRjODoNCisgICAgbm9ybWJlZyByY29udGxvb3A4LDgNCisNCitub3JtYWxiZWcyZGM3Og0KKyAgICBub3JtYmVnIHJjb250bG9vcDcsNw0KKw0KK25vcm1hbGJlZzJkYzY6DQorICAgIG5vcm1iZWcgcmNvbnRsb29wNiw2DQorDQorbm9ybWFsYmVnMmRjNToNCisgICAgbm9ybWJlZyByY29udGxvb3A1LDUNCisNCitub3JtYWxiZWcyZGM0Og0KKyAgICBub3JtYmVnIHJjb250bG9vcDQsNA0KKw0KK25vcm1hbGJlZzJkYzM6DQorICAgIG5vcm1iZWcgcmNvbnRsb29wMywzDQorDQorbm9ybWFsYmVnMmRjMjoNCisgICAgbm9ybWJlZyByY29udGxvb3AyLDINCisNCitub3JtYWxiZWcyZGMxOg0KKyAgICBub3JtYmVnIHJjb250bG9vcDEsMQ0KKw0KK25vcm1hbGJlZzJkYzA6DQorICAgIG5vcm1iZWcgcmNvbnRsb29wMCwwDQorDQorDQorOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCisNCitub3JtYWxiZWcyOg0KKyAgICBtb3YgICAgIGVkaSx3aW5kb3cNCisNCisgICAgY21wICAgICBicCx3b3JkIHB0cltlZGkrZWF4XQ0KKyAgICBqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUNCisNCitpc2VxOg0KKzsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kDQorOyBhbmQgKG1hdGNoID09IHNjYW5fc3RhcnQpDQorDQorICAgIG1vdiAgICAgZWRpLGVkeA0KKyAgICBtb3YgICAgIGVzaSxzY2FuICAgICAgICAgICAgICAgICAgICA7IGVzaSA9IHNjYW4NCisgICAgYWRkICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICAgICAgOyBlZGkgPSB3aW5kb3cgKyBjdXJfbWF0Y2ggPSBtYXRjaA0KKw0KKyAgICBtb3YgICAgIGVkeCxbZXNpKzNdICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgbWFudWFsbHkgZHdvcmQgYXQgbWF0Y2grMw0KKyAgICB4b3IgICAgIGVkeCxbZWRpKzNdICAgICAgICAgICAgICAgICA7IGFuZCBzY2FuICszDQorDQorICAgIGp6ICAgICAgYmVnaW5jb21wYXJlICAgICAgICAgICAgICAgIDsgaWYgZXF1YWwsIGdvIHRvIGxvbmcgY29tcGFyZQ0KKw0KKzsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQ0KKyAgICBvciAgICAgIGRsLGRsDQorICAgIGplICAgICAgZXExcnINCisgICAgbW92ICAgICBlc2ksMw0KKyAgICBqbXAgICAgIHRyZmludmFsDQorZXExcnI6DQorICAgIG9yICAgICAgZHgsZHgNCisgICAgamUgICAgICBlcTENCisNCisgICAgbW92ICAgICBlc2ksNA0KKyAgICBqbXAgICAgIHRyZmludmFsDQorZXExOg0KKyAgICBhbmQgICAgIGVkeCwwZmZmZmZmaA0KKyAgICBqeiAgICAgIGVxMTENCisgICAgbW92ICAgICBlc2ksNQ0KKyAgICBqbXAgICAgIHRyZmludmFsDQorZXExMToNCisgICAgbW92ICAgICBlc2ksNg0KKyAgICBqbXAgICAgIHRyZmludmFsDQorDQorYmVnaW5jb21wYXJlOg0KKyAgICA7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUNCisgICAgYWRkICAgICBlZGksNg0KKyAgICBhZGQgICAgIGVzaSw2DQorICAgIG1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMNCisgICAgcmVwZSAgICBjbXBzZCAgICAgICAgICAgICAgICAgICAgICAgOyBsb29wIHVudGlsIG1pc21hdGNoDQorDQorICAgIGplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gNCis7IHdlIGRldGVybWluZSB0aGUgdW5tYXRjaCBieXRlDQorICAgIHN1YiAgICAgZXNpLDQNCisgICAgbW92ICAgICBlZHgsW2VkaS00XQ0KKyAgICB4b3IgICAgIGVkeCxbZXNpXQ0KKw0KKyAgICBvciAgICAgIGRsLGRsDQorICAgIGpueiAgICAgdHJmaW4NCisgICAgaW5jICAgICBlc2kNCisNCisgICAgb3IgICAgICBkeCxkeA0KKyAgICBqbnogICAgIHRyZmluDQorICAgIGluYyAgICAgZXNpDQorDQorICAgIGFuZCAgICAgZWR4LDBmZmZmZmZoDQorICAgIGpueiAgICAgdHJmaW4NCisgICAgaW5jICAgICBlc2kNCisNCit0cmZpbjoNCisgICAgc3ViICAgICBlc2ksc2NhbiAgICAgICAgICA7IGVzaSA9IGxlbg0KK3RyZmludmFsOg0KKzsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcNCisgICAgY21wICAgICBlc2ksYmVzdF9sZW4gICAgICAgIDsgaWYgbGVuID4gYmVzdF9sZW4sIGdvIG5ld2Jlc3RsZW4NCisgICAgamEgICAgICBzaG9ydCBuZXdiZXN0bGVuDQorOyBub3cgd2UgcmVzdG9yZSBlZHgsIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wDQorICAgIG1vdiAgICAgZXNpLHByZXYNCisgICAgbW92ICAgICBlY3gsbGltaXQNCisgICAgbW92ICAgICBlZHgsd2luZG93DQorICAgIGptcCAgICAgY29udGxvb3AzDQorDQorbmV3YmVzdGxlbjoNCisgICAgbW92ICAgICBiZXN0X2xlbixlc2kgICAgICAgIDsgbGVuIGJlY29tZSBiZXN0X2xlbg0KKw0KKyAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVheCAgICAgOyBzYXZlIG5ldyBwb3NpdGlvbiBhcyBtYXRjaF9zdGFydA0KKyAgICBjbXAgICAgIGVzaSxuaWNlX21hdGNoICAgICAgOyBpZiBiZXN0X2xlbiA+PSBuaWNlX21hdGNoLCBleGl0DQorICAgIGphZSAgICAgZXhpdGxvb3ANCisgICAgbW92ICAgICBlY3gsc2Nhbg0KKyAgICBtb3YgICAgIGVkeCx3aW5kb3cgICAgICAgICAgOyByZXN0b3JlIGVkeD13aW5kb3cNCisgICAgYWRkICAgICBlY3gsZXNpDQorICAgIGFkZCAgICAgZXNpLGVkeA0KKw0KKyAgICBkZWMgICAgIGVzaQ0KKyAgICBtb3YgICAgIHdpbmRvd2xlbixlc2kgICAgICAgOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbi0xDQorICAgIG1vdiAgICAgYngsW2VjeC0xXSAgICAgICAgICA7IGJ4ID0gKihzY2FuK2Jlc3RfbGVuLTEpID0gc2Nhbl9lbmQNCisNCis7IG5vdyB3ZSByZXN0b3JlIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wIDoNCisgICAgbW92ICAgICBlc2kscHJldg0KKyAgICBtb3YgICAgIGVjeCxsaW1pdA0KKyAgICBqbXAgICAgIGNvbnRsb29wMw0KKw0KK2V4aXRsb29wOg0KKzsgZXhpdCA6IHMtPm1hdGNoX3N0YXJ0PW1hdGNoX3N0YXJ0DQorICAgIG1vdiAgICAgZWJ4LG1hdGNoX3N0YXJ0DQorICAgIG1vdiAgICAgZWJwLHN0cl9zDQorICAgIG1vdiAgICAgZWN4LGJlc3RfbGVuDQorICAgIG1vdiAgICAgZHdvcmQgcHRyIFtlYnArZGVwX21hdGNoX3N0YXJ0XSxlYngNCisgICAgbW92ICAgICBlYXgsZHdvcmQgcHRyIFtlYnArZGVwX2xvb2thaGVhZF0NCisgICAgY21wICAgICBlY3gsZWF4DQorICAgIGphICAgICAgbWluZXhsbw0KKyAgICBtb3YgICAgIGVheCxlY3gNCittaW5leGxvOg0KKzsgcmV0dXJuIG1pbihiZXN0X2xlbixzLT5sb29rYWhlYWQpDQorDQorOyByZXN0b3JlIHN0YWNrIGFuZCByZWdpc3RlciBlYngsZXNpLGVkaSxlYnANCisgICAgYWRkICAgICBlc3AsTmJTdGFja0FkZA0KKw0KKyAgICBwb3AgICAgIGVieA0KKyAgICBwb3AgICAgIGVzaQ0KKyAgICBwb3AgICAgIGVkaQ0KKyAgICBwb3AgICAgIGVicA0KKyAgICByZXQNCitJbmZvQXV0aG9yOg0KKzsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQorOyBZb3VyIGFyZSBmcmVlIHVzZSBndm1hdDMyIGluIGFueSBmcmUgb3IgY29tbWVyY2lhbCBhcHBzIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiR1ZNYXQzMiBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSB3cml0dGVuIDE5OTYtOTggYnkgR2lsbGVzIFZvbGxhbnQiLDBkaCwwYWgNCisNCisNCisNCitJRkRFRiBOT1VOREVSTElORQ0KK2xvbmdlc3RfbWF0Y2hfN2ZmZiAgIGVuZHANCitFTFNFDQorX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcA0KK0VORElGDQorDQorDQorSUZERUYgTk9VTkRFUkxJTkUNCitjcHVkZXRlY3QzMiAgICAgcHJvYyBuZWFyDQorRUxTRQ0KK19jcHVkZXRlY3QzMiAgICBwcm9jIG5lYXINCitFTkRJRg0KKw0KKyAgICBwdXNoICAgIGVieA0KKw0KKyAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTDQorICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KKyAgICBtb3YgICAgIGVjeCwgZWF4ICAgICAgICA7IHNhdmUgb3JpZ2luYWwgRUZMQUdTDQorICAgIHhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTDQorICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrDQorICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQ0KKyAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTDQorICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgNCisgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgQUMgYml0LCBwcm9jZXNzb3I9ODAzODYNCisgICAganogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3Nvcg0KKyAgICBwdXNoICAgIGVjeA0KKyAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgQUMgYml0IGluIEVGTEFHUyBmaXJzdA0KKw0KKyAgICBwdXNoZmQNCisgICAgcHVzaGZkDQorICAgIHBvcCAgICAgZWN4DQorDQorICAgIG1vdiAgICAgZWF4LCBlY3ggICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KKyAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUw0KKyAgICBwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaw0KKyAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUNCisgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUw0KKyAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYDQorICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBvcmlnaW5hbCBFRkxBR1MNCisgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LA0KKyAgICBqZSAgICAgIGlzX29sZF80ODYgICAgICA7IHByb2Nlc3Nvcj1vbGQNCisNCisgICAgbW92ICAgICBlYXgsMQ0KKyAgICBkYiAgICAgIDBmaCwwYTJoICAgICAgICA7Q1BVSUQNCisNCitleGl0Y3B1ZGV0ZWN0Og0KKyAgICBwb3AgZWJ4DQorICAgIHJldA0KKw0KK2VuZF9jcHVfaXNfMzg2Og0KKyAgICBtb3YgICAgIGVheCwwMzAwaA0KKyAgICBqbXAgICAgIGV4aXRjcHVkZXRlY3QNCisNCitpc19vbGRfNDg2Og0KKyAgICBtb3YgICAgIGVheCwwNDAwaA0KKyAgICBqbXAgICAgIGV4aXRjcHVkZXRlY3QNCisNCitJRkRFRiBOT1VOREVSTElORQ0KK2NwdWRldGVjdDMyICAgICBlbmRwDQorRUxTRQ0KK19jcHVkZXRlY3QzMiAgICBlbmRwDQorRU5ESUYNCitFTkRJRg0KKw0KK01BWF9NQVRDSCAgICAgICBlcXUgICAgIDI1OA0KK01JTl9NQVRDSCAgICAgICBlcXUgICAgIDMNCitNSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkNCitNQVhfTUFUQ0hfOF8gICAgIGVxdSAgICAgKChNQVhfTUFUQ0ggKyA3KSBBTkQgMEZGRjBoKQ0KKw0KKw0KKzs7OyBzdGFjayBmcmFtZSBvZmZzZXRzDQorDQorY2hhaW5sZW53bWFzayAgIGVxdSAgZXNwICsgMCAgICA7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4NCisgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQord2luZG93ICAgICAgZXF1ICBlc3AgKyA0ICAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cNCit3aW5kb3diZXN0bGVuICAgZXF1ICBlc3AgKyA4ICAgIDsgcy0+d2luZG93ICsgYmVzdGxlbg0KK3NjYW5zdGFydCAgIGVxdSAgZXNwICsgMTYgICA7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuZW5kICAgICBlcXUgIGVzcCArIDEyICAgOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuYWxpZ24gICBlcXUgIGVzcCArIDIwICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nDQorbmljZW1hdGNoICAgZXF1ICBlc3AgKyAyNCAgIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorYmVzdGxlbiAgICAgZXF1ICBlc3AgKyAyOCAgIDsgc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcg0KK3NjYW4gICAgICAgIGVxdSAgZXNwICsgMzIgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaA0KKw0KK0xvY2FsVmFyc1NpemUgICBlcXUgMzYNCis7ICAgc2F2ZWQgZWJ4ICAgYnl0ZSBlc3AgKyAzNg0KKzsgICBzYXZlZCBlZGkgICBieXRlIGVzcCArIDQwDQorOyAgIHNhdmVkIGVzaSAgIGJ5dGUgZXNwICsgNDQNCis7ICAgc2F2ZWQgZWJwICAgYnl0ZSBlc3AgKyA0OA0KKzsgICByZXR1cm4gYWRkcmVzcyAgYnl0ZSBlc3AgKyA1Mg0KK2RlZmxhdGVzdGF0ZSAgICBlcXUgIGVzcCArIDU2ICAgOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzDQorY3VybWF0Y2ggICAgZXF1ICBlc3AgKyA2MA0KKw0KKzs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQorOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCis7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KKzs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQorOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCis7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCisNCitkc1dTaXplICAgICBlcXUgMzYremxpYjEyMjJhZGQNCitkc1dNYXNrICAgICBlcXUgNDQremxpYjEyMjJhZGQNCitkc1dpbmRvdyAgICBlcXUgNDgremxpYjEyMjJhZGQNCitkc1ByZXYgICAgICBlcXUgNTYremxpYjEyMjJhZGQNCitkc01hdGNoTGVuICBlcXUgODgremxpYjEyMjJhZGQNCitkc1ByZXZNYXRjaCBlcXUgOTIremxpYjEyMjJhZGQNCitkc1N0clN0YXJ0ICBlcXUgMTAwK3psaWIxMjIyYWRkDQorZHNNYXRjaFN0YXJ0ICAgIGVxdSAxMDQremxpYjEyMjJhZGQNCitkc0xvb2thaGVhZCBlcXUgMTA4K3psaWIxMjIyYWRkDQorZHNQcmV2TGVuICAgZXF1IDExMit6bGliMTIyMmFkZA0KK2RzTWF4Q2hhaW5MZW4gICBlcXUgMTE2K3psaWIxMjIyYWRkDQorZHNHb29kTWF0Y2ggZXF1IDEzMit6bGliMTIyMmFkZA0KK2RzTmljZU1hdGNoIGVxdSAxMzYremxpYjEyMjJhZGQNCisNCisNCis7OzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQ0KKzs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQorOzs7IENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKzs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzs7Ow0KKzs7OyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCis7OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisNCis7R0xPQkFMIF9sb25nZXN0X21hdGNoLCBfbWF0Y2hfaW5pdA0KKw0KKw0KKztTRUNUSU9OICAgIC50ZXh0DQorDQorOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpDQorDQorO19sb25nZXN0X21hdGNoOg0KK0lGREVGIE5PT0xEUEVOVElVTUNPREUNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbG9uZ2VzdF9tYXRjaCAgICAgICBwcm9jIG5lYXINCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIHByb2MgbmVhcg0KKyAgICBFTkRJRg0KK0VMU0UNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbG9uZ2VzdF9tYXRjaF82ODYgICBwcm9jIG5lYXINCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaF82ODYgIHByb2MgbmVhcg0KKyAgICBFTkRJRg0KK0VORElGDQorDQorOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCis7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQorDQorICAgICAgICBwdXNoICAgIGVicA0KKyAgICAgICAgcHVzaCAgICBlZGkNCisgICAgICAgIHB1c2ggICAgZXNpDQorICAgICAgICBwdXNoICAgIGVieA0KKyAgICAgICAgc3ViIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KKw0KKzs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaA0KKzs7OyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlDQorOzs7IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlDQorOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuDQorDQorICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGVjeCwgW2N1cm1hdGNoXQ0KKw0KKzs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKzs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOw0KKzs7OyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgew0KKzs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KKzs7OyB9DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KKyAgICAgICAgbW92IGVieCwgW2VkeCArIGRzR29vZE1hdGNoXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXTWFza10NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc01heENoYWluTGVuXQ0KKyAgICAgICAgamwgIExhc3RNYXRjaEdvb2QNCisgICAgICAgIHNociBlYngsIDINCitMYXN0TWF0Y2hHb29kOg0KKw0KKzs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQorOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCis7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCis7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCisNCisgICAgICAgIGRlYyBlYngNCisgICAgICAgIHNobCBlYngsIDE2DQorICAgICAgICBvciAgZWJ4LCBlYXgNCisgICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieA0KKw0KKzs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsNCisNCisgICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc05pY2VNYXRjaF0NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0xvb2thaGVhZF0NCisgICAgICAgIGNtcCBlYngsIGVheA0KKyAgICAgICAgamwgIExvb2thaGVhZExlc3MNCisgICAgICAgIG1vdiBlYngsIGVheA0KK0xvb2thaGVhZExlc3M6ICBtb3YgW25pY2VtYXRjaF0sIGVieA0KKw0KKzs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0Ow0KKw0KKyAgICAgICAgbW92IGVzaSwgW2VkeCArIGRzV2luZG93XQ0KKyAgICAgICAgbW92IFt3aW5kb3ddLCBlc2kNCisgICAgICAgIG1vdiBlYnAsIFtlZHggKyBkc1N0clN0YXJ0XQ0KKyAgICAgICAgbGVhIGVkaSwgW2VzaSArIGVicF0NCisgICAgICAgIG1vdiBbc2Nhbl0sIGVkaQ0KKw0KKzs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQorOzs7IGR3b3JkLWFsaWduZWQuDQorDQorICAgICAgICBtb3YgZWF4LCBlZGkNCisgICAgICAgIG5lZyBlYXgNCisgICAgICAgIGFuZCBlYXgsIDMNCisgICAgICAgIG1vdiBbc2NhbmFsaWduXSwgZWF4DQorDQorOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXU2l6ZV0NCisgICAgICAgIHN1YiBlYXgsIE1JTl9MT09LQUhFQUQNCisgICAgICAgIHN1YiBlYnAsIGVheA0KKyAgICAgICAgamcgIExpbWl0UG9zaXRpdmUNCisgICAgICAgIHhvciBlYnAsIGVicA0KK0xpbWl0UG9zaXRpdmU6DQorDQorOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KKw0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzUHJldkxlbl0NCisgICAgICAgIG1vdiBbYmVzdGxlbl0sIGVheA0KKw0KKzs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLg0KKw0KKyAgICAgICAgYWRkIGVzaSwgZWF4DQorICAgICAgICBtb3YgW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCisNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47DQorOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCis7OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7DQorDQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaV0NCisgICAgICAgIG1vdiBbc2NhbnN0YXJ0XSwgZWJ4DQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQorICAgICAgICBtb3YgW3NjYW5lbmRdLCBlYngNCisgICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdDQorDQorOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgc2hvcnQgTG9vcEVudHJ5DQorDQorYWxpZ24gNA0KKw0KKzs7OyBkbyB7DQorOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCis7OzsgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KKzs7OyAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7DQorOzs7ICAgICBbLi4uXQ0KKzs7OyB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCis7OzsgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQorOzs7DQorOzs7IEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCis7OzsgbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwNCis7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQorOzs7DQorOzs7IFdpdGhpbiB0aGlzIGxvb3A6DQorOzs7IGVieCA9IHNjYW5lbmQNCis7OzsgZWN4ID0gY3VybWF0Y2gNCis7OzsgZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spDQorOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikNCis7OzsgZWRpID0gcHJldg0KKzs7OyBlYnAgPSBsaW1pdA0KKw0KK0xvb2t1cExvb3A6DQorICAgICAgICBhbmQgZWN4LCBlZHgNCisgICAgICAgIG1vdnp4ICAgZWN4LCB3b3JkIHB0ciBbZWRpICsgZWN4KjJdDQorICAgICAgICBjbXAgZWN4LCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCitMb29wRW50cnk6ICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VzaSArIGVjeCAtIDFdDQorICAgICAgICBjbXAgZWF4LCBlYngNCisgICAgICAgIGpueiBMb29rdXBMb29wDQorICAgICAgICBtb3YgZWF4LCBbd2luZG93XQ0KKyAgICAgICAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlYXggKyBlY3hdDQorICAgICAgICBjbXAgZWF4LCBbc2NhbnN0YXJ0XQ0KKyAgICAgICAgam56IExvb2t1cExvb3ANCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbW92IGVzaSwgW3dpbmRvd10NCisgICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KKyAgICAgICAgYWRkIGVzaSwgZWN4DQorICAgICAgICBtb3YgZWF4LCBbc2NhbmFsaWduXQ0KKyAgICAgICAgbW92IGVkeCwgMGZmZmZmZWY4aDsgLShNQVhfTUFUQ0hfOCkNCisgICAgICAgIGxlYSBlZGksIFtlZGkgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKyAgICAgICAgbGVhIGVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeF0NCisgICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeCArIDRdDQorICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4ICsgNF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzNA0KKyAgICAgICAgYWRkIGVkeCwgOA0KKyAgICAgICAgam56IExvb3BDbXBzDQorICAgICAgICBqbXAgc2hvcnQgTGVuTWF4aW11bQ0KK0xlYXZlTG9vcENtcHM0OiBhZGQgZWR4LCA0DQorTGVhdmVMb29wQ21wczogIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKyAgICAgICAgYWRkIGVkeCwgIDINCisgICAgICAgIHNociBlYXgsIDE2DQorTGVuTG93ZXI6ICAgc3ViIGFsLCAxDQorICAgICAgICBhZGMgZWR4LCAwDQorDQorOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILA0KKzs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4NCisNCisgICAgICAgIGxlYSBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBtb3YgZWRpLCBbc2Nhbl0NCisgICAgICAgIHN1YiBlYXgsIGVkaQ0KKyAgICAgICAgY21wIGVheCwgTUFYX01BVENIDQorICAgICAgICBqZ2UgTGVuTWF4aW11bQ0KKw0KKzs7OyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UNCis7OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3diZXN0bGVuXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBlYngsIFtzY2FuZW5kXQ0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOw0KKzs7OyAgICAgICAgIGJlc3RfbGVuID0gbGVuOw0KKzs7OyAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7DQorOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKw0KK0xvbmdlck1hdGNoOiAgICBtb3YgZWJ4LCBbbmljZW1hdGNoXQ0KKyAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4DQorICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZ2UgTGVhdmVOb3cNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddDQorICAgICAgICBhZGQgZXNpLCBlYXgNCisgICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQ0KKyAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCisNCitMZW5NYXhpbXVtOiBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSA0KKyAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCisNCis7OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KKzs7OyByZXR1cm4gcy0+bG9va2FoZWFkOw0KKw0KK0xlYXZlTm93Og0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KKyAgICAgICAgY21wIGVieCwgZWF4DQorICAgICAgICBqZyAgTG9va2FoZWFkUmV0DQorICAgICAgICBtb3YgZWF4LCBlYngNCitMb29rYWhlYWRSZXQ6DQorDQorOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCisNCisgICAgICAgIGFkZCBlc3AsIExvY2FsVmFyc1NpemUNCisgICAgICAgIHBvcCBlYngNCisgICAgICAgIHBvcCBlc2kNCisgICAgICAgIHBvcCBlZGkNCisgICAgICAgIHBvcCBlYnANCisNCisgICAgICAgIHJldA0KKzsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQorOyBZb3VyIGNhbiBmcmVlbHkgdXNlIGd2bWF0MzIgaW4gYW55IGZyZWUgb3IgY29tbWVyY2lhbCBhcHAgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhDQorICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoDQorDQorDQorSUZERUYgTk9PTERQRU5USVVNQ09ERQ0KKyAgICBJRkRFRiBOT1VOREVSTElORQ0KKyAgICBsb25nZXN0X21hdGNoICAgICAgIGVuZHANCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIGVuZHANCisgICAgRU5ESUYNCisNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIG1hdGNoX2luaXQgICAgICBlbmRwDQorICAgIEVMU0UNCisgICAgX21hdGNoX2luaXQgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIF9tYXRjaF9pbml0ICAgICBlbmRwDQorICAgIEVORElGICAgIA0KK0VMU0UNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbG9uZ2VzdF9tYXRjaF82ODYgICBlbmRwDQorICAgIEVMU0UNCisgICAgX2xvbmdlc3RfbWF0Y2hfNjg2ICBlbmRwDQorICAgIEVORElGDQorRU5ESUYNCisNCitfVEVYVCAgIGVuZHMNCitlbmQNCmRpZmYgLS1naXQgYS9jb250cmliL21hc214ODYvZ3ZtYXQzMmMuYyBiL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyYy5jCmluZGV4IDllZDI1ZjMuLjdhZDJiMjcgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyYy5jCisrKyBiL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyYy5jCkBAIC0xLDIwNiArMSw2MiBAQAotLyogZ3ZtYXQzMi5jIC0tIEMgcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4KLSAqIEZpbGUgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudCwgYnkgbW9kaWZpeWluZyB0aGUgbG9uZ2VzdF9tYXRjaAotICogIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMKLSAqICBpdCBwcmVwYXJlIGFsbCBwYXJhbWV0ZXJzIGFuZCBjYWxsIHRoZSBhc3NlbWJseSBsb25nZXN0X21hdGNoX2d2YXNtCi0gKiAgbG9uZ2VzdF9tYXRjaCBleGVjdXRlIHN0YW5kYXJkIEMgY29kZSBpcyB3bWFzayAhPSAweDdmZmYKLSAqICAgICAoYXNzZW1ibHkgY29kZSBpcyBmYXN0ZXIgd2l0aCBhIGZpeGVkIHdtYXNrKQotICoKLSAqLwotCi0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi0jaWZkZWYgQVNNVgotI2RlZmluZSBOSUwgMAotCi0jZGVmaW5lIFVOQUxJR05FRF9PSwotCi0KLS8qIGlmIHlvdXIgQyBjb21waWxlciBkb24ndCBhZGQgdW5kZXJsaW5lIGJlZm9yZSBmdW5jdGlvbiBuYW1lLAotICAgICAgICBkZWZpbmUgQUREX1VOREVSTElORV9BU01GVU5DICovCi0jaWZkZWYgQUREX1VOREVSTElORV9BU01GVU5DCi0jZGVmaW5lIGxvbmdlc3RfbWF0Y2hfN2ZmZiBfbG9uZ2VzdF9tYXRjaF83ZmZmCi0jZGVmaW5lIGxvbmdlc3RfbWF0Y2hfNjg2ICBfbG9uZ2VzdF9tYXRjaF82ODYKLSNkZWZpbmUgY3B1ZGV0ZWN0MzIgICAgICAgIF9jcHVkZXRlY3QzMgotI2VuZGlmCi0KLQotCi12b2lkIG1hdGNoX2luaXQoKQotewotfQotCi11bnNpZ25lZCBsb25nIGNwdWRldGVjdDMyKCk7Ci0KLXVJbnQgbG9uZ2VzdF9tYXRjaF9jKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwotCi0KLXVJbnQgbG9uZ2VzdF9tYXRjaF83ZmZmKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwotCi11SW50IGxvbmdlc3RfbWF0Y2hfNjg2KAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwotCi11SW50IGxvbmdlc3RfbWF0Y2goCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLXsKLSAgICBzdGF0aWMgdUludCBpSXNQUHJvPTI7Ci0KLSAgICBpZiAoKHMtPndfbWFzayA9PSAweDdmZmYpICYmIChpSXNQUHJvPT0wKSkKLSAgICAgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfN2ZmZihzLGN1cl9tYXRjaCk7Ci0KLSAgICBpZiAoaUlzUFBybz09MSkKLSAgICAgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfNjg2KHMsY3VyX21hdGNoKTsKLQotICAgIGlmIChpSXNQUHJvPT0yKQotICAgICAgICBpSXNQUHJvID0gKCgoY3B1ZGV0ZWN0MzIoKS8weDEwMCkmMHhmKT49NikgPyAxIDogMDsKLQotICAgIHJldHVybiBsb25nZXN0X21hdGNoX2MocyxjdXJfbWF0Y2gpOwotfQotCi0KLQotdUludCBsb25nZXN0X21hdGNoX2MocywgY3VyX21hdGNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCi17Ci0gICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KLSAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCi0gICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLwotICAgIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovCi0gICAgaW50IG5pY2VfbWF0Y2ggPSBzLT5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovCi0gICAgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwotICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwotICAgIC8qIFN0b3Agd2hlbiBjdXJfbWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsCi0gICAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4KLSAgICAgKi8KLSAgICBQb3NmICpwcmV2ID0gcy0+cHJldjsKLSAgICB1SW50IHdtYXNrID0gcy0+d19tYXNrOwotCi0jaWZkZWYgVU5BTElHTkVEX09LCi0gICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4KLSAgICAgKiBUcnkgd2l0aCBhbmQgd2l0aG91dCAtRFVOQUxJR05FRF9PSyB0byBjaGVjay4KLSAgICAgKi8KLSAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0ggLSAxOwotICAgIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwotICAgIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKLSNlbHNlCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOwotICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07Ci0gICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07Ci0jZW5kaWYKLQotICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgotICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKLQotICAgIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovCi0gICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKLSAgICAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwotICAgIH0KLSAgICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0gICAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuCi0gICAgICovCi0gICAgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7Ci0KLSAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVlZCBsb29rYWhlYWQiKTsKLQotICAgIGRvIHsKLSAgICAgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7Ci0gICAgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotCi0gICAgICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQotICAgICAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgotICAgICAgICAgKi8KLSNpZiAoZGVmaW5lZChVTkFMSUdORURfT0spICYmIE1BWF9NQVRDSCA9PSAyNTgpCi0gICAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgPT0gMi4gRG8gbm90IHVzZQotICAgICAgICAgKiBVTkFMSUdORURfT0sgaWYgeW91ciBjb21waWxlciB1c2VzIGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKLSAgICAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7Ci0KLSAgICAgICAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkgYXJlCi0gICAgICAgICAqIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdCB0aGUgaGFzaCBrZXlzCi0gICAgICAgICAqIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4gQ29tcGFyZSAyIGJ5dGVzIGF0IGEgdGltZSBhdAotICAgICAgICAgKiBzdHJzdGFydCszLCArNSwgLi4uIHVwIHRvIHN0cnN0YXJ0KzI1Ny4gV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudAotICAgICAgICAgKiBsb29rYWhlYWQgb25seSBldmVyeSA0dGggY29tcGFyaXNvbjsgdGhlIDEyOHRoIGNoZWNrIHdpbGwgYmUgbWFkZQotICAgICAgICAgKiBhdCBzdHJzdGFydCsyNTcuIElmIE1BWF9NQVRDSC0yIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgsIGl0IGlzCi0gICAgICAgICAqIG5lY2Vzc2FyeSB0byBwdXQgbW9yZSBndWFyZCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3csIG9yCi0gICAgICAgICAqIHRvIGNoZWNrIG1vcmUgb2Z0ZW4gZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQuCi0gICAgICAgICAqLwotICAgICAgICBBc3NlcnQoc2NhblsyXSA9PSBtYXRjaFsyXSwgInNjYW5bMl0/Iik7Ci0gICAgICAgIHNjYW4rKywgbWF0Y2grKzsKLSAgICAgICAgZG8gewotICAgICAgICB9IHdoaWxlICgqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCi0gICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7Ci0gICAgICAgIC8qIFRoZSBmdW5ueSAiZG8ge30iIGdlbmVyYXRlcyBiZXR0ZXIgY29kZSBvbiBtb3N0IGNvbXBpbGVycyAqLwotCi0gICAgICAgIC8qIEhlcmUsIHNjYW4gPD0gd2luZG93K3N0cnN0YXJ0KzI1NyAqLwotICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwotICAgICAgICBpZiAoKnNjYW4gPT0gKm1hdGNoKSBzY2FuKys7Ci0KLSAgICAgICAgbGVuID0gKE1BWF9NQVRDSCAtIDEpIC0gKGludCkoc3RyZW5kLXNjYW4pOwotICAgICAgICBzY2FuID0gc3RyZW5kIC0gKE1BWF9NQVRDSC0xKTsKLQotI2Vsc2UgLyogVU5BTElHTkVEX09LICovCi0KLSAgICAgICAgaWYgKG1hdGNoW2Jlc3RfbGVuXSAgICE9IHNjYW5fZW5kICB8fAotICAgICAgICAgICAgbWF0Y2hbYmVzdF9sZW4tMV0gIT0gc2Nhbl9lbmQxIHx8Ci0gICAgICAgICAgICAqbWF0Y2ggICAgICAgICAgICAhPSAqc2NhbiAgICAgfHwKLSAgICAgICAgICAgICorK21hdGNoICAgICAgICAgICE9IHNjYW5bMV0pICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKLSAgICAgICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKLSAgICAgICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKLSAgICAgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAotICAgICAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KLSAgICAgICAgICovCi0gICAgICAgIHNjYW4gKz0gMiwgbWF0Y2grKzsKLSAgICAgICAgQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgIm1hdGNoWzJdPyIpOwotCi0gICAgICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247Ci0gICAgICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgotICAgICAgICAgKi8KLSAgICAgICAgZG8gewotICAgICAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7Ci0KLSAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKLQotICAgICAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLSAgICAgICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKLQotI2VuZGlmIC8qIFVOQUxJR05FRF9PSyAqLwotCi0gICAgICAgIGlmIChsZW4gPiBiZXN0X2xlbikgewotICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7Ci0gICAgICAgICAgICBiZXN0X2xlbiA9IGxlbjsKLSAgICAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7Ci0jaWZkZWYgVU5BTElHTkVEX09LCi0gICAgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Ci0jZWxzZQotICAgICAgICAgICAgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07Ci0gICAgICAgICAgICBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotICAgICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotCi0gICAgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwotICAgIHJldHVybiBzLT5sb29rYWhlYWQ7Ci19Ci0KLSNlbmRpZiAvKiBBU01WICovCisvKiBndm1hdDMyLmMgLS0gQyBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYNCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4NCisgKiBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCisgKiAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYw0KKyAqICBpdCBwcmVwYXJlIGFsbCBwYXJhbWV0ZXJzIGFuZCBjYWxsIHRoZSBhc3NlbWJseSBsb25nZXN0X21hdGNoX2d2YXNtDQorICogIGxvbmdlc3RfbWF0Y2ggZXhlY3V0ZSBzdGFuZGFyZCBDIGNvZGUgaXMgd21hc2sgIT0gMHg3ZmZmDQorICogICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spDQorICoNCisgKiBSZWFkIGNvbW1lbnQgYXQgYmVnaW5uaW5nIG9mIGd2bWF0MzIuYXNtIGZvciBtb3JlIGluZm9ybWF0aW9uDQorICovDQorDQorI2lmIGRlZmluZWQoQVNNVikgJiYgKCFkZWZpbmVkKE5PT0xEUEVOVElVTUNPREUpKQ0KKyNpbmNsdWRlICJkZWZsYXRlLmgiDQorDQorLyogaWYgeW91ciBDIGNvbXBpbGVyIGRvbid0IGFkZCB1bmRlcmxpbmUgYmVmb3JlIGZ1bmN0aW9uIG5hbWUsDQorICAgICAgICBkZWZpbmUgQUREX1VOREVSTElORV9BU01GVU5DICovDQorI2lmZGVmIEFERF9VTkRFUkxJTkVfQVNNRlVOQw0KKyNkZWZpbmUgbG9uZ2VzdF9tYXRjaF83ZmZmIF9sb25nZXN0X21hdGNoXzdmZmYNCisjZGVmaW5lIGxvbmdlc3RfbWF0Y2hfNjg2ICBfbG9uZ2VzdF9tYXRjaF82ODYNCisjZGVmaW5lIGNwdWRldGVjdDMyICAgICAgICBfY3B1ZGV0ZWN0MzINCisjZW5kaWYNCisNCisNCit1bnNpZ25lZCBsb25nIGNwdWRldGVjdDMyKCk7DQorDQordUludCBsb25nZXN0X21hdGNoX2MoDQorICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCisNCit1SW50IGxvbmdlc3RfbWF0Y2hfN2ZmZigNCisgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCisgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KKw0KK3VJbnQgbG9uZ2VzdF9tYXRjaF82ODYoDQorICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCisNCitzdGF0aWMgdUludCBpSXNQUHJvPTI7DQorDQordm9pZCBtYXRjaF9pbml0ICgpDQorew0KKyAgICBpSXNQUHJvID0gKCgoY3B1ZGV0ZWN0MzIoKS8weDEwMCkmMHhmKT49NikgPyAxIDogMDsNCit9DQorDQordUludCBsb25nZXN0X21hdGNoKA0KKyAgICBkZWZsYXRlX3N0YXRlICpzLA0KKyAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCit7DQorICAgIGlmIChpSXNQUHJvIT0wKQ0KKyAgICAgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfNjg2KHMsY3VyX21hdGNoKTsNCisNCisgICAgaWYgKHMtPndfbWFzayAhPSAweDdmZmYpDQorICAgICAgICByZXR1cm4gbG9uZ2VzdF9tYXRjaF82ODYocyxjdXJfbWF0Y2gpOw0KKw0KKyAgICAvKiBub3cgKChzLT53X21hc2sgPT0gMHg3ZmZmKSAmJiAoaUlzUFBybz09MCkpICovDQorICAgICAgICByZXR1cm4gbG9uZ2VzdF9tYXRjaF83ZmZmKHMsY3VyX21hdGNoKTsNCit9DQorDQorDQorI2VuZGlmIC8qIGRlZmluZWQoQVNNVikgJiYgKCFkZWZpbmVkKE5PT0xEUEVOVElVTUNPREUpKSAqLw0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYi9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCmluZGV4IDUzMWJjZWYuLjRhMjA1MTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KKysrIGIvY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbQpAQCAtMSwxMDM2ICsxLDEwODMgQEAKLTsgNzUgImluZmZhc3QuUyIKLTtGSUxFICJpbmZmYXN0LlMiCi0KLTs7O0dMT0JBTCBfaW5mbGF0ZV9mYXN0Ci0KLTs7O1NFQ1RJT04gLnRleHQKLQotCi0KLQkuNTg2cAotCS5tbXgKLQotCW5hbWUJaW5mbGF0ZV9mYXN0X3g4NgotCS5NT0RFTAlGTEFUCi0KLV9EQVRBCQkJc2VnbWVudAotaW5mbGF0ZV9mYXN0X3VzZV9tbXg6Ci0JZGQJMQotCi0KLV9URVhUCQkJc2VnbWVudAotUFVCTElDIF9pbmZsYXRlX2Zhc3QKLQotQUxJR04gNAotX2luZmxhdGVfZmFzdDoKLQlqbXAgaW5mbGF0ZV9mYXN0X2VudHJ5Ci0KLQotCi1BTElHTiA0Ci0JZGIJJ0Zhc3QgZGVjb2RpbmcgQ29kZSBmcm9tIENocmlzIEFuZGVyc29uJwotCWRiCTAKLQotQUxJR04gNAotaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZzoKLQlkYgknaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJwotCWRiCTAKLQotQUxJR04gNAotaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZzoKLQlkYgknaW52YWxpZCBkaXN0YW5jZSBjb2RlJwotCWRiCTAKLQotQUxJR04gNAotaW52YWxpZF9kaXN0YW5jZV90b29fZmFyX21zZzoKLQlkYgknaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snCi0JZGIJMAotCi0KLUFMSUdOIDQKLWluZmxhdGVfZmFzdF9tYXNrOgotZGQJMAotZGQJMQotZGQJMwotZGQJNwotZGQJMTUKLWRkCTMxCi1kZAk2MwotZGQJMTI3Ci1kZAkyNTUKLWRkCTUxMQotZGQJMTAyMwotZGQJMjA0NwotZGQJNDA5NQotZGQJODE5MQotZGQJMTYzODMKLWRkCTMyNzY3Ci1kZAk2NTUzNQotZGQJMTMxMDcxCi1kZAkyNjIxNDMKLWRkCTUyNDI4NwotZGQJMTA0ODU3NQotZGQJMjA5NzE1MQotZGQJNDE5NDMwMwotZGQJODM4ODYwNwotZGQJMTY3NzcyMTUKLWRkCTMzNTU0NDMxCi1kZAk2NzEwODg2MwotZGQJMTM0MjE3NzI3Ci1kZAkyNjg0MzU0NTUKLWRkCTUzNjg3MDkxMQotZGQJMTA3Mzc0MTgyMwotZGQJMjE0NzQ4MzY0NwotZGQJNDI5NDk2NzI5NQotCi0KLTsgaGVhZCB3YXMgYWRkZWQgaW4gemxpYiAxLjIuMi4xLCBzbyB3ZSBhZGQgYWRkc3RyCi07IHNldCBhZGRzdHIgdG8gMCB3aXRoIHpsaWIgMS4yLjEgb2YgYmVsb3cKLWFkZHN0ciAgICAgICAgICAgZXF1ICAgIDQKLQotbW9kZV9zdGF0ZQkgZXF1CTAJOy8qIHN0YXRlLT5tb2RlCSovCi13c2l6ZV9zdGF0ZQkgZXF1CTMyK2FkZHN0cgk7Lyogc3RhdGUtPndzaXplICovCi13cml0ZV9zdGF0ZQkgZXF1CSgzNis0K2FkZHN0cikJOy8qIHN0YXRlLT53cml0ZSAqLwotd2luZG93X3N0YXRlCSBlcXUJKDQwKzQrYWRkc3RyKQk7Lyogc3RhdGUtPndpbmRvdyAqLwotaG9sZF9zdGF0ZQkgZXF1CSg0NCs0K2FkZHN0cikJOy8qIHN0YXRlLT5ob2xkCSovCi1iaXRzX3N0YXRlCSBlcXUJKDQ4KzQrYWRkc3RyKQk7Lyogc3RhdGUtPmJpdHMJKi8KLWxlbmNvZGVfc3RhdGUJIGVxdQkoNjQrNCthZGRzdHIpCTsvKiBzdGF0ZS0+bGVuY29kZSAqLwotZGlzdGNvZGVfc3RhdGUJIGVxdQkoNjgrNCthZGRzdHIpCTsvKiBzdGF0ZS0+ZGlzdGNvZGUgKi8KLWxlbmJpdHNfc3RhdGUJIGVxdQkoNzIrNCthZGRzdHIpCTsvKiBzdGF0ZS0+bGVuYml0cyAqLwotZGlzdGJpdHNfc3RhdGUJIGVxdQkoNzYrNCthZGRzdHIpCTsvKiBzdGF0ZS0+ZGlzdGJpdHMgKi8KLQotCi07O1NFQ1RJT04gLnRleHQKLTsgMjA1ICJpbmZmYXN0LlMiCi07R0xPQkFMCWluZmxhdGVfZmFzdF91c2VfbW14Ci0KLTtTRUNUSU9OIC5kYXRhCi0KLQotOyBHTE9CQUwgaW5mbGF0ZV9mYXN0X3VzZV9tbXg6b2JqZWN0Ci07LnNpemUgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsIDQKLTsgMjI2ICJpbmZmYXN0LlMiCi07U0VDVElPTiAudGV4dAotCi1BTElHTiA0Ci1pbmZsYXRlX2Zhc3RfZW50cnk6Ci0JcHVzaCAgZWRpCi0JcHVzaCAgZXNpCi0JcHVzaCAgZWJwCi0JcHVzaCAgZWJ4Ci0JcHVzaGZkCi0Jc3ViICBlc3AsNjQKLQljbGQKLQotCi0KLQotCW1vdiAgZXNpLCBbZXNwKzg4XQotCW1vdiAgZWRpLCBbZXNpKzI4XQotCi0KLQotCi0KLQotCi0JbW92ICBlZHgsIFtlc2krNF0KLQltb3YgIGVheCwgW2VzaSswXQotCi0JYWRkICBlZHgsZWF4Ci0Jc3ViICBlZHgsMTEKLQotCW1vdiAgW2VzcCs0NF0sZWF4Ci0JbW92ICBbZXNwKzIwXSxlZHgKLQotCW1vdiAgZWJwLCBbZXNwKzkyXQotCW1vdiAgZWN4LCBbZXNpKzE2XQotCW1vdiAgZWJ4LCBbZXNpKzEyXQotCi0Jc3ViICBlYnAsZWN4Ci0JbmVnICBlYnAKLQlhZGQgIGVicCxlYngKLQotCXN1YiAgZWN4LDI1NwotCWFkZCAgZWN4LGVieAotCi0JbW92ICBbZXNwKzYwXSxlYngKLQltb3YgIFtlc3ArNDBdLGVicAotCW1vdiAgW2VzcCsxNl0sZWN4Ci07IDI4NSAiaW5mZmFzdC5TIgotCW1vdiAgZWF4LCBbZWRpK2xlbmNvZGVfc3RhdGVdCi0JbW92ICBlY3gsIFtlZGkrZGlzdGNvZGVfc3RhdGVdCi0KLQltb3YgIFtlc3ArOF0sZWF4Ci0JbW92ICBbZXNwKzEyXSxlY3gKLQotCW1vdiAgZWF4LDEKLQltb3YgIGVjeCwgW2VkaStsZW5iaXRzX3N0YXRlXQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQltb3YgIFtlc3ArMF0sZWF4Ci0KLQltb3YgIGVheCwxCi0JbW92ICBlY3gsIFtlZGkrZGlzdGJpdHNfc3RhdGVdCi0Jc2hsICBlYXgsY2wKLQlkZWMgIGVheAotCW1vdiAgW2VzcCs0XSxlYXgKLQotCW1vdiAgZWF4LCBbZWRpK3dzaXplX3N0YXRlXQotCW1vdiAgZWN4LCBbZWRpK3dyaXRlX3N0YXRlXQotCW1vdiAgZWR4LCBbZWRpK3dpbmRvd19zdGF0ZV0KLQotCW1vdiAgW2VzcCs1Ml0sZWF4Ci0JbW92ICBbZXNwKzQ4XSxlY3gKLQltb3YgIFtlc3ArNTZdLGVkeAotCi0JbW92ICBlYnAsIFtlZGkraG9sZF9zdGF0ZV0KLQltb3YgIGVieCwgW2VkaStiaXRzX3N0YXRlXQotOyAzMjEgImluZmZhc3QuUyIKLQltb3YgIGVzaSwgW2VzcCs0NF0KLQltb3YgIGVjeCwgW2VzcCsyMF0KLQljbXAgIGVjeCxlc2kKLQlqYSAgIExfYWxpZ25fbG9uZwotCi0JYWRkICBlY3gsMTEKLQlzdWIgIGVjeCxlc2kKLQltb3YgIGVheCwxMgotCXN1YiAgZWF4LGVjeAotCWxlYSAgZWRpLCBbZXNwKzI4XQotCXJlcCBtb3ZzYgotCW1vdiAgZWN4LGVheAotCXhvciAgZWF4LGVheAotCXJlcCBzdG9zYgotCWxlYSAgZXNpLCBbZXNwKzI4XQotCW1vdiAgW2VzcCsyMF0sZXNpCi0Jam1wICBMX2lzX2FsaWduZWQKLQotCi1MX2FsaWduX2xvbmc6Ci0JdGVzdCAgZXNpLDMKLQlqeiAgIExfaXNfYWxpZ25lZAotCXhvciAgZWF4LGVheAotCW1vdiAgYWwsIFtlc2ldCi0JaW5jICBlc2kKLQltb3YgIGVjeCxlYngKLQlhZGQgIGVieCw4Ci0Jc2hsICBlYXgsY2wKLQlvciAgZWJwLGVheAotCWptcCBMX2FsaWduX2xvbmcKLQotTF9pc19hbGlnbmVkOgotCW1vdiAgZWRpLCBbZXNwKzYwXQotOyAzNjYgImluZmZhc3QuUyIKLUxfY2hlY2tfbW14OgotCWNtcCAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMgotCWplICAgTF9pbml0X21teAotCWphICAgTF9kb19sb29wCi0KLQlwdXNoICBlYXgKLQlwdXNoICBlYngKLQlwdXNoICBlY3gKLQlwdXNoICBlZHgKLQlwdXNoZmQKLQltb3YgIGVheCwgW2VzcF0KLQl4b3IgIGR3b3JkIHB0ciBbZXNwXSwwMjAwMDAwaAotCi0KLQotCi0JcG9wZmQKLQlwdXNoZmQKLQlwb3AgIGVkeAotCXhvciAgZWR4LGVheAotCWp6ICAgTF9kb250X3VzZV9tbXgKLQl4b3IgIGVheCxlYXgKLQljcHVpZAotCWNtcCAgZWJ4LDA3NTZlNjU0N2gKLQlqbmUgIExfZG9udF91c2VfbW14Ci0JY21wICBlY3gsMDZjNjU3NDZlaAotCWpuZSAgTF9kb250X3VzZV9tbXgKLQljbXAgIGVkeCwwNDk2NTZlNjloCi0Jam5lICBMX2RvbnRfdXNlX21teAotCW1vdiAgZWF4LDEKLQljcHVpZAotCXNociAgZWF4LDgKLQlhbmQgIGVheCwxNQotCWNtcCAgZWF4LDYKLQlqbmUgIExfZG9udF91c2VfbW14Ci0JdGVzdCAgZWR4LDA4MDAwMDBoCi0Jam56ICBMX3VzZV9tbXgKLQlqbXAgIExfZG9udF91c2VfbW14Ci1MX3VzZV9tbXg6Ci0JbW92ICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyCi0Jam1wICBMX2NoZWNrX21teF9wb3AKLUxfZG9udF91c2VfbW14OgotCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMwotTF9jaGVja19tbXhfcG9wOgotCXBvcCAgZWR4Ci0JcG9wICBlY3gKLQlwb3AgIGVieAotCXBvcCAgZWF4Ci0Jam1wICBMX2NoZWNrX21teAotOyA0MjYgImluZmZhc3QuUyIKLUFMSUdOIDQKLUxfZG9fbG9vcDoKLTsgNDM3ICJpbmZmYXN0LlMiCi0JY21wICBibCwxNQotCWphICAgTF9nZXRfbGVuZ3RoX2NvZGUKLQotCXhvciAgZWF4LGVheAotCWxvZHN3Ci0JbW92ICBjbCxibAotCWFkZCAgYmwsMTYKLQlzaGwgIGVheCxjbAotCW9yICBlYnAsZWF4Ci0KLUxfZ2V0X2xlbmd0aF9jb2RlOgotCW1vdiAgZWR4LCBbZXNwKzBdCi0JbW92ICBlY3gsIFtlc3ArOF0KLQlhbmQgIGVkeCxlYnAKLQltb3YgIGVheCwgW2VjeCtlZHgqNF0KLQotTF9kb2xlbjoKLQotCi0KLQotCi0KLQltb3YgIGNsLGFoCi0Jc3ViICBibCxhaAotCXNociAgZWJwLGNsCi0KLQotCi0KLQotCi0JdGVzdCAgYWwsYWwKLQlqbnogICBMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlCi0KLQlzaHIgIGVheCwxNgotCXN0b3NiCi0KLUxfd2hpbGVfdGVzdDoKLQotCi0JY21wICBbZXNwKzE2XSxlZGkKLQlqYmUgIExfYnJlYWtfbG9vcAotCi0JY21wICBbZXNwKzIwXSxlc2kKLQlqYSAgIExfZG9fbG9vcAotCWptcCAgTF9icmVha19sb29wCi0KLUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6Ci07IDUwMiAiaW5mZmFzdC5TIgotCW1vdiAgZWR4LGVheAotCXNociAgZWR4LDE2Ci0JbW92ICBjbCxhbAotCi0JdGVzdCAgYWwsMTYKLQlqeiAgIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aAotCWFuZCAgY2wsMTUKLQlqeiAgIExfc2F2ZV9sZW4KLQljbXAgIGJsLGNsCi0JamFlICBMX2FkZF9iaXRzX3RvX2xlbgotCi0JbW92ICBjaCxjbAotCXhvciAgZWF4LGVheAotCWxvZHN3Ci0JbW92ICBjbCxibAotCWFkZCAgYmwsMTYKLQlzaGwgIGVheCxjbAotCW9yICBlYnAsZWF4Ci0JbW92ICBjbCxjaAotCi1MX2FkZF9iaXRzX3RvX2xlbjoKLQltb3YgIGVheCwxCi0Jc2hsICBlYXgsY2wKLQlkZWMgIGVheAotCXN1YiAgYmwsY2wKLQlhbmQgIGVheCxlYnAKLQlzaHIgIGVicCxjbAotCWFkZCAgZWR4LGVheAotCi1MX3NhdmVfbGVuOgotCW1vdiAgW2VzcCsyNF0sZWR4Ci0KLQotTF9kZWNvZGVfZGlzdGFuY2U6Ci07IDU0OSAiaW5mZmFzdC5TIgotCWNtcCAgYmwsMTUKLQlqYSAgIExfZ2V0X2Rpc3RhbmNlX2NvZGUKLQotCXhvciAgZWF4LGVheAotCWxvZHN3Ci0JbW92ICBjbCxibAotCWFkZCAgYmwsMTYKLQlzaGwgIGVheCxjbAotCW9yICBlYnAsZWF4Ci0KLUxfZ2V0X2Rpc3RhbmNlX2NvZGU6Ci0JbW92ICBlZHgsIFtlc3ArNF0KLQltb3YgIGVjeCwgW2VzcCsxMl0KLQlhbmQgIGVkeCxlYnAKLQltb3YgIGVheCwgW2VjeCtlZHgqNF0KLQotCi1MX2RvZGlzdDoKLQltb3YgIGVkeCxlYXgKLQlzaHIgIGVkeCwxNgotCW1vdiAgY2wsYWgKLQlzdWIgIGJsLGFoCi0Jc2hyICBlYnAsY2wKLTsgNTg0ICJpbmZmYXN0LlMiCi0JbW92ICBjbCxhbAotCi0JdGVzdCAgYWwsMTYKLQlqeiAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdAotCWFuZCAgY2wsMTUKLQlqeiAgTF9jaGVja19kaXN0X29uZQotCWNtcCAgYmwsY2wKLQlqYWUgIExfYWRkX2JpdHNfdG9fZGlzdAotCi0JbW92ICBjaCxjbAotCXhvciAgZWF4LGVheAotCWxvZHN3Ci0JbW92ICBjbCxibAotCWFkZCAgYmwsMTYKLQlzaGwgIGVheCxjbAotCW9yICBlYnAsZWF4Ci0JbW92ICBjbCxjaAotCi1MX2FkZF9iaXRzX3RvX2Rpc3Q6Ci0JbW92ICBlYXgsMQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQlzdWIgIGJsLGNsCi0JYW5kICBlYXgsZWJwCi0Jc2hyICBlYnAsY2wKLQlhZGQgIGVkeCxlYXgKLQlqbXAgIExfY2hlY2tfd2luZG93Ci0KLUxfY2hlY2tfd2luZG93OgotOyA2MjUgImluZmZhc3QuUyIKLQltb3YgIFtlc3ArNDRdLGVzaQotCW1vdiAgZWF4LGVkaQotCXN1YiAgZWF4LCBbZXNwKzQwXQotCi0JY21wICBlYXgsZWR4Ci0JamIgICBMX2NsaXBfd2luZG93Ci0KLQltb3YgIGVjeCwgW2VzcCsyNF0KLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlZHgKLQotCXN1YiAgZWN4LDMKLQltb3YgIGFsLCBbZXNpXQotCW1vdiAgW2VkaV0sYWwKLQltb3YgIGFsLCBbZXNpKzFdCi0JbW92ICBkbCwgW2VzaSsyXQotCWFkZCAgZXNpLDMKLQltb3YgIFtlZGkrMV0sYWwKLQltb3YgIFtlZGkrMl0sZGwKLQlhZGQgIGVkaSwzCi0JcmVwIG1vdnNiCi0KLQltb3YgIGVzaSwgW2VzcCs0NF0KLQlqbXAgIExfd2hpbGVfdGVzdAotCi1BTElHTiA0Ci1MX2NoZWNrX2Rpc3Rfb25lOgotCWNtcCAgZWR4LDEKLQlqbmUgIExfY2hlY2tfd2luZG93Ci0JY21wICBbZXNwKzQwXSxlZGkKLQlqZSAgTF9jaGVja193aW5kb3cKLQotCWRlYyAgZWRpCi0JbW92ICBlY3gsIFtlc3ArMjRdCi0JbW92ICBhbCwgW2VkaV0KLQlzdWIgIGVjeCwzCi0KLQltb3YgIFtlZGkrMV0sYWwKLQltb3YgIFtlZGkrMl0sYWwKLQltb3YgIFtlZGkrM10sYWwKLQlhZGQgIGVkaSw0Ci0JcmVwIHN0b3NiCi0KLQlqbXAgIExfd2hpbGVfdGVzdAotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6Ci0KLQotCi0KLQl0ZXN0ICBhbCw2NAotCWpueiAgIExfdGVzdF9mb3JfZW5kX29mX2Jsb2NrCi0KLQltb3YgIGVheCwxCi0Jc2hsICBlYXgsY2wKLQlkZWMgIGVheAotCWFuZCAgZWF4LGVicAotCWFkZCAgZWF4LGVkeAotCW1vdiAgZWR4LCBbZXNwKzhdCi0JbW92ICBlYXgsIFtlZHgrZWF4KjRdCi0Jam1wICBMX2RvbGVuCi0KLUFMSUdOIDQKLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6Ci0KLQotCi0KLQl0ZXN0ICBhbCw2NAotCWpueiAgIExfaW52YWxpZF9kaXN0YW5jZV9jb2RlCi0KLQltb3YgIGVheCwxCi0Jc2hsICBlYXgsY2wKLQlkZWMgIGVheAotCWFuZCAgZWF4LGVicAotCWFkZCAgZWF4LGVkeAotCW1vdiAgZWR4LCBbZXNwKzEyXQotCW1vdiAgZWF4LCBbZWR4K2VheCo0XQotCWptcCAgTF9kb2Rpc3QKLQotQUxJR04gNAotTF9jbGlwX3dpbmRvdzoKLTsgNzIxICJpbmZmYXN0LlMiCi0JbW92ICBlY3gsZWF4Ci0JbW92ICBlYXgsIFtlc3ArNTJdCi0JbmVnICBlY3gKLQltb3YgIGVzaSwgW2VzcCs1Nl0KLQotCWNtcCAgZWF4LGVkeAotCWpiICAgTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIKLQotCWFkZCAgZWN4LGVkeAotCWNtcCAgZHdvcmQgcHRyIFtlc3ArNDhdLDAKLQlqbmUgIExfd3JhcF9hcm91bmRfd2luZG93Ci0KLQlzdWIgIGVheCxlY3gKLQlhZGQgIGVzaSxlYXgKLTsgNzQ5ICJpbmZmYXN0LlMiCi0JbW92ICBlYXgsIFtlc3ArMjRdCi0JY21wICBlYXgsZWN4Ci0JamJlICBMX2RvX2NvcHkxCi0KLQlzdWIgIGVheCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlZHgKLQlqbXAgIExfZG9fY29weTEKLQotCWNtcCAgZWF4LGVjeAotCWpiZSAgTF9kb19jb3B5MQotCi0Jc3ViICBlYXgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWR4Ci0Jam1wICBMX2RvX2NvcHkxCi0KLUxfd3JhcF9hcm91bmRfd2luZG93OgotOyA3OTMgImluZmZhc3QuUyIKLQltb3YgIGVheCwgW2VzcCs0OF0KLQljbXAgIGVjeCxlYXgKLQlqYmUgIExfY29udGlndW91c19pbl93aW5kb3cKLQotCWFkZCAgZXNpLCBbZXNwKzUyXQotCWFkZCAgZXNpLGVheAotCXN1YiAgZXNpLGVjeAotCXN1YiAgZWN4LGVheAotCi0KLQltb3YgIGVheCwgW2VzcCsyNF0KLQljbXAgIGVheCxlY3gKLQlqYmUgIExfZG9fY29weTEKLQotCXN1YiAgZWF4LGVjeAotCXJlcCBtb3ZzYgotCW1vdiAgZXNpLCBbZXNwKzU2XQotCW1vdiAgZWN4LCBbZXNwKzQ4XQotCWNtcCAgZWF4LGVjeAotCWpiZSAgTF9kb19jb3B5MQotCi0Jc3ViICBlYXgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWR4Ci0Jam1wICBMX2RvX2NvcHkxCi0KLUxfY29udGlndW91c19pbl93aW5kb3c6Ci07IDgzNiAiaW5mZmFzdC5TIgotCWFkZCAgZXNpLGVheAotCXN1YiAgZXNpLGVjeAotCi0KLQltb3YgIGVheCwgW2VzcCsyNF0KLQljbXAgIGVheCxlY3gKLQlqYmUgIExfZG9fY29weTEKLQotCXN1YiAgZWF4LGVjeAotCXJlcCBtb3ZzYgotCW1vdiAgZXNpLGVkaQotCXN1YiAgZXNpLGVkeAotCi1MX2RvX2NvcHkxOgotOyA4NjIgImluZmZhc3QuUyIKLQltb3YgIGVjeCxlYXgKLQlyZXAgbW92c2IKLQotCW1vdiAgZXNpLCBbZXNwKzQ0XQotCWptcCAgTF93aGlsZV90ZXN0Ci07IDg3OCAiaW5mZmFzdC5TIgotQUxJR04gNAotTF9pbml0X21teDoKLQllbW1zCi0KLQotCi0KLQotCW1vdmQgbW0wLGVicAotCW1vdiAgZWJwLGVieAotOyA4OTYgImluZmZhc3QuUyIKLQltb3ZkIG1tNCxbZXNwKzBdCi0JbW92cSBtbTMsbW00Ci0JbW92ZCBtbTUsW2VzcCs0XQotCW1vdnEgbW0yLG1tNQotCXB4b3IgbW0xLG1tMQotCW1vdiAgZWJ4LCBbZXNwKzhdCi0Jam1wICBMX2RvX2xvb3BfbW14Ci0KLUFMSUdOIDQKLUxfZG9fbG9vcF9tbXg6Ci0JcHNybHEgbW0wLG1tMQotCi0JY21wICBlYnAsMzIKLQlqYSAgTF9nZXRfbGVuZ3RoX2NvZGVfbW14Ci0KLQltb3ZkIG1tNixlYnAKLQltb3ZkIG1tNyxbZXNpXQotCWFkZCAgZXNpLDQKLQlwc2xscSBtbTcsbW02Ci0JYWRkICBlYnAsMzIKLQlwb3IgbW0wLG1tNwotCi1MX2dldF9sZW5ndGhfY29kZV9tbXg6Ci0JcGFuZCBtbTQsbW0wCi0JbW92ZCBlYXgsbW00Ci0JbW92cSBtbTQsbW0zCi0JbW92ICBlYXgsIFtlYngrZWF4KjRdCi0KLUxfZG9sZW5fbW14OgotCW1vdnp4ICBlY3gsYWgKLQltb3ZkIG1tMSxlY3gKLQlzdWIgIGVicCxlY3gKLQotCXRlc3QgIGFsLGFsCi0Jam56IExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14Ci0KLQlzaHIgIGVheCwxNgotCXN0b3NiCi0KLUxfd2hpbGVfdGVzdF9tbXg6Ci0KLQotCWNtcCAgW2VzcCsxNl0sZWRpCi0JamJlIExfYnJlYWtfbG9vcAotCi0JY21wICBbZXNwKzIwXSxlc2kKLQlqYSBMX2RvX2xvb3BfbW14Ci0Jam1wIExfYnJlYWtfbG9vcAotCi1MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teDoKLQotCW1vdiAgZWR4LGVheAotCXNociAgZWR4LDE2Ci0KLQl0ZXN0ICBhbCwxNgotCWp6ICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14Ci0JYW5kICBlYXgsMTUKLQlqeiBMX2RlY29kZV9kaXN0YW5jZV9tbXgKLQotCXBzcmxxIG1tMCxtbTEKLQltb3ZkIG1tMSxlYXgKLQltb3ZkIGVjeCxtbTAKLQlzdWIgIGVicCxlYXgKLQlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQotCWFkZCAgZWR4LGVjeAotCi1MX2RlY29kZV9kaXN0YW5jZV9tbXg6Ci0JcHNybHEgbW0wLG1tMQotCi0JY21wICBlYnAsMzIKLQlqYSBMX2dldF9kaXN0X2NvZGVfbW14Ci0KLQltb3ZkIG1tNixlYnAKLQltb3ZkIG1tNyxbZXNpXQotCWFkZCAgZXNpLDQKLQlwc2xscSBtbTcsbW02Ci0JYWRkICBlYnAsMzIKLQlwb3IgbW0wLG1tNwotCi1MX2dldF9kaXN0X2NvZGVfbW14OgotCW1vdiAgZWJ4LCBbZXNwKzEyXQotCXBhbmQgbW01LG1tMAotCW1vdmQgZWF4LG1tNQotCW1vdnEgbW01LG1tMgotCW1vdiAgZWF4LCBbZWJ4K2VheCo0XQotCi1MX2RvZGlzdF9tbXg6Ci0KLQltb3Z6eCAgZWN4LGFoCi0JbW92ICBlYngsZWF4Ci0Jc2hyICBlYngsMTYKLQlzdWIgIGVicCxlY3gKLQltb3ZkIG1tMSxlY3gKLQotCXRlc3QgIGFsLDE2Ci0JanogTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXgKLQlhbmQgIGVheCwxNQotCWp6IExfY2hlY2tfZGlzdF9vbmVfbW14Ci0KLUxfYWRkX2JpdHNfdG9fZGlzdF9tbXg6Ci0JcHNybHEgbW0wLG1tMQotCW1vdmQgbW0xLGVheAotCW1vdmQgZWN4LG1tMAotCXN1YiAgZWJwLGVheAotCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdCi0JYWRkICBlYngsZWN4Ci0KLUxfY2hlY2tfd2luZG93X21teDoKLQltb3YgIFtlc3ArNDRdLGVzaQotCW1vdiAgZWF4LGVkaQotCXN1YiAgZWF4LCBbZXNwKzQwXQotCi0JY21wICBlYXgsZWJ4Ci0JamIgTF9jbGlwX3dpbmRvd19tbXgKLQotCW1vdiAgZWN4LGVkeAotCW1vdiAgZXNpLGVkaQotCXN1YiAgZXNpLGVieAotCi0Jc3ViICBlY3gsMwotCW1vdiAgYWwsIFtlc2ldCi0JbW92ICBbZWRpXSxhbAotCW1vdiAgYWwsIFtlc2krMV0KLQltb3YgIGRsLCBbZXNpKzJdCi0JYWRkICBlc2ksMwotCW1vdiAgW2VkaSsxXSxhbAotCW1vdiAgW2VkaSsyXSxkbAotCWFkZCAgZWRpLDMKLQlyZXAgbW92c2IKLQotCW1vdiAgZXNpLCBbZXNwKzQ0XQotCW1vdiAgZWJ4LCBbZXNwKzhdCi0Jam1wICBMX3doaWxlX3Rlc3RfbW14Ci0KLUFMSUdOIDQKLUxfY2hlY2tfZGlzdF9vbmVfbW14OgotCWNtcCAgZWJ4LDEKLQlqbmUgIExfY2hlY2tfd2luZG93X21teAotCWNtcCAgW2VzcCs0MF0sZWRpCi0JamUgICBMX2NoZWNrX3dpbmRvd19tbXgKLQotCWRlYyAgZWRpCi0JbW92ICBlY3gsZWR4Ci0JbW92ICBhbCwgW2VkaV0KLQlzdWIgIGVjeCwzCi0KLQltb3YgIFtlZGkrMV0sYWwKLQltb3YgIFtlZGkrMl0sYWwKLQltb3YgIFtlZGkrM10sYWwKLQlhZGQgIGVkaSw0Ci0JcmVwIHN0b3NiCi0KLQltb3YgIGVieCwgW2VzcCs4XQotCWptcCAgTF93aGlsZV90ZXN0X21teAotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14OgotCXRlc3QgIGFsLDY0Ci0Jam56IExfdGVzdF9mb3JfZW5kX29mX2Jsb2NrCi0KLQlhbmQgIGVheCwxNQotCXBzcmxxIG1tMCxtbTEKLQltb3ZkIGVjeCxtbTAKLQlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQotCWFkZCAgZWN4LGVkeAotCW1vdiAgZWF4LCBbZWJ4K2VjeCo0XQotCWptcCBMX2RvbGVuX21teAotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDoKLQl0ZXN0ICBhbCw2NAotCWpueiBMX2ludmFsaWRfZGlzdGFuY2VfY29kZQotCi0JYW5kICBlYXgsMTUKLQlwc3JscSBtbTAsbW0xCi0JbW92ZCBlY3gsbW0wCi0JYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0KLQltb3YgIGVheCwgW2VzcCsxMl0KLQlhZGQgIGVjeCxlYngKLQltb3YgIGVheCwgW2VheCtlY3gqNF0KLQlqbXAgIExfZG9kaXN0X21teAotCi1BTElHTiA0Ci1MX2NsaXBfd2luZG93X21teDoKLQotCW1vdiAgZWN4LGVheAotCW1vdiAgZWF4LCBbZXNwKzUyXQotCW5lZyAgZWN4Ci0JbW92ICBlc2ksIFtlc3ArNTZdCi0KLQljbXAgIGVheCxlYngKLQlqYiAgTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIKLQotCWFkZCAgZWN4LGVieAotCWNtcCAgZHdvcmQgcHRyIFtlc3ArNDhdLDAKLQlqbmUgIExfd3JhcF9hcm91bmRfd2luZG93X21teAotCi0Jc3ViICBlYXgsZWN4Ci0JYWRkICBlc2ksZWF4Ci0KLQljbXAgIGVkeCxlY3gKLQlqYmUgIExfZG9fY29weTFfbW14Ci0KLQlzdWIgIGVkeCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlYngKLQlqbXAgIExfZG9fY29weTFfbW14Ci0KLQljbXAgIGVkeCxlY3gKLQlqYmUgIExfZG9fY29weTFfbW14Ci0KLQlzdWIgIGVkeCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlYngKLQlqbXAgIExfZG9fY29weTFfbW14Ci0KLUxfd3JhcF9hcm91bmRfd2luZG93X21teDoKLQotCW1vdiAgZWF4LCBbZXNwKzQ4XQotCWNtcCAgZWN4LGVheAotCWpiZSAgTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXgKLQotCWFkZCAgZXNpLCBbZXNwKzUyXQotCWFkZCAgZXNpLGVheAotCXN1YiAgZXNpLGVjeAotCXN1YiAgZWN4LGVheAotCi0KLQljbXAgIGVkeCxlY3gKLQlqYmUgIExfZG9fY29weTFfbW14Ci0KLQlzdWIgIGVkeCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSwgW2VzcCs1Nl0KLQltb3YgIGVjeCwgW2VzcCs0OF0KLQljbXAgIGVkeCxlY3gKLQlqYmUgIExfZG9fY29weTFfbW14Ci0KLQlzdWIgIGVkeCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlYngKLQlqbXAgIExfZG9fY29weTFfbW14Ci0KLUxfY29udGlndW91c19pbl93aW5kb3dfbW14OgotCi0JYWRkICBlc2ksZWF4Ci0Jc3ViICBlc2ksZWN4Ci0KLQotCWNtcCAgZWR4LGVjeAotCWpiZSAgTF9kb19jb3B5MV9tbXgKLQotCXN1YiAgZWR4LGVjeAotCXJlcCBtb3ZzYgotCW1vdiAgZXNpLGVkaQotCXN1YiAgZXNpLGVieAotCi1MX2RvX2NvcHkxX21teDoKLQotCi0JbW92ICBlY3gsZWR4Ci0JcmVwIG1vdnNiCi0KLQltb3YgIGVzaSwgW2VzcCs0NF0KLQltb3YgIGVieCwgW2VzcCs4XQotCWptcCAgTF93aGlsZV90ZXN0X21teAotOyAxMTc0ICJpbmZmYXN0LlMiCi1MX2ludmFsaWRfZGlzdGFuY2VfY29kZToKLQotCi0KLQotCi0JbW92ICBlY3gsIGludmFsaWRfZGlzdGFuY2VfY29kZV9tc2cKLQltb3YgIGVkeCwyNgotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOgotCi0KLQotCi0KLQl0ZXN0ICBhbCwzMgotCWp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQotCi0JbW92ICBlY3gsMAotCW1vdiAgZWR4LDExCi0Jam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUKLQotTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6Ci0KLQotCi0KLQotCW1vdiAgZWN4LCBpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnCi0JbW92ICBlZHgsMjYKLQlqbXAgIExfdXBkYXRlX3N0cmVhbV9zdGF0ZQotCi1MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKLQotCi0KLQltb3YgIGVzaSwgW2VzcCs0NF0KLQltb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV90b29fZmFyX21zZwotCW1vdiAgZWR4LDI2Ci0Jam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUKLQotTF91cGRhdGVfc3RyZWFtX3N0YXRlOgotCi0JbW92ICBlYXgsIFtlc3ArODhdCi0JdGVzdCAgZWN4LGVjeAotCWp6ICBMX3NraXBfbXNnCi0JbW92ICBbZWF4KzI0XSxlY3gKLUxfc2tpcF9tc2c6Ci0JbW92ICBlYXgsIFtlYXgrMjhdCi0JbW92ICBbZWF4K21vZGVfc3RhdGVdLGVkeAotCWptcCAgTF9icmVha19sb29wCi0KLUFMSUdOIDQKLUxfYnJlYWtfbG9vcDoKLTsgMTI0MyAiaW5mZmFzdC5TIgotCWNtcCAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMgotCWpuZSAgTF91cGRhdGVfbmV4dF9pbgotCi0KLQotCW1vdiAgZWJ4LGVicAotCi1MX3VwZGF0ZV9uZXh0X2luOgotOyAxMjY2ICJpbmZmYXN0LlMiCi0JbW92ICBlYXgsIFtlc3ArODhdCi0JbW92ICBlY3gsZWJ4Ci0JbW92ICBlZHgsIFtlYXgrMjhdCi0Jc2hyICBlY3gsMwotCXN1YiAgZXNpLGVjeAotCXNobCAgZWN4LDMKLQlzdWIgIGVieCxlY3gKLQltb3YgIFtlYXgrMTJdLGVkaQotCW1vdiAgW2VkeCtiaXRzX3N0YXRlXSxlYngKLQltb3YgIGVjeCxlYngKLQotCWxlYSAgZWJ4LCBbZXNwKzI4XQotCWNtcCAgW2VzcCsyMF0sZWJ4Ci0Jam5lICBMX2J1Zl9ub3RfdXNlZAotCi0Jc3ViICBlc2ksZWJ4Ci0JbW92ICBlYngsIFtlYXgrMF0KLQltb3YgIFtlc3ArMjBdLGVieAotCWFkZCAgZXNpLGVieAotCW1vdiAgZWJ4LCBbZWF4KzRdCi0Jc3ViICBlYngsMTEKLQlhZGQgIFtlc3ArMjBdLGVieAotCi1MX2J1Zl9ub3RfdXNlZDoKLQltb3YgIFtlYXgrMF0sZXNpCi0KLQltb3YgIGVieCwxCi0Jc2hsICBlYngsY2wKLQlkZWMgIGVieAotCi0KLQotCi0KLQljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDIKLQlqbmUgIExfdXBkYXRlX2hvbGQKLQotCi0KLQlwc3JscSBtbTAsbW0xCi0JbW92ZCBlYnAsbW0wCi0KLQllbW1zCi0KLUxfdXBkYXRlX2hvbGQ6Ci0KLQotCi0JYW5kICBlYnAsZWJ4Ci0JbW92ICBbZWR4K2hvbGRfc3RhdGVdLGVicAotCi0KLQotCi0JbW92ICBlYngsIFtlc3ArMjBdCi0JY21wICBlYngsZXNpCi0JamJlICBMX2xhc3RfaXNfc21hbGxlcgotCi0Jc3ViICBlYngsZXNpCi0JYWRkICBlYngsMTEKLQltb3YgIFtlYXgrNF0sZWJ4Ci0Jam1wICBMX2ZpeHVwX291dAotTF9sYXN0X2lzX3NtYWxsZXI6Ci0Jc3ViICBlc2ksZWJ4Ci0JbmVnICBlc2kKLQlhZGQgIGVzaSwxMQotCW1vdiAgW2VheCs0XSxlc2kKLQotCi0KLQotTF9maXh1cF9vdXQ6Ci0KLQltb3YgIGVieCwgW2VzcCsxNl0KLQljbXAgIGVieCxlZGkKLQlqYmUgIExfZW5kX2lzX3NtYWxsZXIKLQotCXN1YiAgZWJ4LGVkaQotCWFkZCAgZWJ4LDI1NwotCW1vdiAgW2VheCsxNl0sZWJ4Ci0Jam1wICBMX2RvbmUKLUxfZW5kX2lzX3NtYWxsZXI6Ci0Jc3ViICBlZGksZWJ4Ci0JbmVnICBlZGkKLQlhZGQgIGVkaSwyNTcKLQltb3YgIFtlYXgrMTZdLGVkaQotCi0KLQotCi0KLUxfZG9uZToKLQlhZGQgIGVzcCw2NAotCXBvcGZkCi0JcG9wICBlYngKLQlwb3AgIGVicAotCXBvcCAgZXNpCi0JcG9wICBlZGkKLQlyZXQKLQotCi0KLQotX1RFWFQJZW5kcwotZW5kCis7LyogaW5mZmFzMzIuYXNtIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZw0KKzsgKg0KKzsgKiBpbmZmYXMzMi5hc20gaXMgZGVyaXZhdGVkIGZyb20gaW5mZmFzODYuYywgd2l0aCB0cmFuc2xhdGlvbiBvZiBhc3NlbWJseSBjb2RlDQorOyAqDQorOyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXINCis7ICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaA0KKzsgKg0KKzsgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4NCis7ICogUGxlYXNlIHVzZSB0aGUgY29weXJpZ2h0IGNvbmRpdGlvbnMgYWJvdmUuDQorOyAqDQorOyAqIE1hci0xMy0yMDAzIC0tIE1vc3Qgb2YgdGhpcyBpcyBkZXJpdmVkIGZyb20gaW5mZmFzdC5TIHdoaWNoIGlzIGRlcml2ZWQgZnJvbQ0KKzsgKiB0aGUgZ2NjIC1TIG91dHB1dCBvZiB6bGliLTEuMi4wL2luZmZhc3QuYy4gIFpsaWItMS4yLjAgaXMgaW4gYmV0YSByZWxlYXNlIGF0DQorOyAqIHRoZSBtb21lbnQuICBJIGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGFuZCB0ZXN0ZWQgdGhpcyBjb2RlIHdpdGggZ2NjMi45NiwNCis7ICogZ2NjMy4yLCBpY2M1LjAsIG1zdmM2LjAuICBJdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzcGVlZCBvZiBpbmZmYXN0LlMNCis7ICogY29tcGlsZWQgd2l0aCBnY2MgLUROT19NTVgsIGJ1dCBpbmZmYXN0LlMgaXMgc3RpbGwgZmFzdGVyIG9uIHRoZSBQMyB3aXRoIE1NWA0KKzsgKiBlbmFibGVkLiAgSSB3aWxsIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIE1NWCBjb2RlIGludG8gdGhpcyB2ZXJzaW9uLiAgTmV3ZXINCis7ICogdmVyc2lvbnMgb2YgdGhpcyBhbmQgaW5mZmFzdC5TIGNhbiBiZSBmb3VuZCBhdA0KKzsgKiBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLw0KKzsgKiANCis7ICogMjAwNSA6IG1vZGlmaWNhdGlvbiBieSBHaWxsZXMgVm9sbGFudA0KKzsgKi8NCis7IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcg0KKzsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsNCis7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCis7ICAgIGFuZCBpbiBWQysrMjAwMyB0b29sa2l0IGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLw0KKzsNCis7DQorOyAgIGNvbXBpbGUgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uDQorOyAgIG1sICAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KKw0KKzsgICBpZiB5b3UgZGVmaW5lIE5PX0daSVAgKHNlZSBpbmZsYXRlLmgpLCBjb21waWxlIHdpdGgNCis7ICAgbWwgIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgL0ROT19HVU5aSVAgaW5mZmFzMzIuYXNtDQorDQorDQorOyB6bGliMTIyc3VwIGlzIDAgZm9ydCB6bGliIDEuMi4yLjEgYW5kIGxvd2VyDQorOyB6bGliMTIyc3VwIGlzIDggZm9ydCB6bGliIDEuMi4yLjIgYW5kIG1vcmUgKHdpdGggYWRkaXRpb24gb2YgZG1heCBhbmQgaGVhZCANCis7ICAgICAgICBpbiBpbmZsYXRlX3N0YXRlIGluIGluZmxhdGUuaCkNCit6bGliMTIyMnN1cCAgICAgIGVxdSAgICA4DQorDQorDQorSUZERUYgR1VOWklQDQorICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMTENCisgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAyNg0KK0VMU0UNCisgIElGTkRFRiBOT19HVU5aSVANCisgICAgSU5GTEFURV9NT0RFX1RZUEUgICAgZXF1IDExDQorICAgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAyNg0KKyAgRUxTRQ0KKyAgICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMw0KKyAgICBJTkZMQVRFX01PREVfQkFEICAgICBlcXUgMTcNCisgIEVORElGDQorRU5ESUYNCisNCisNCis7IDc1ICJpbmZmYXN0LlMiDQorO0ZJTEUgImluZmZhc3QuUyINCisNCis7OztHTE9CQUwgX2luZmxhdGVfZmFzdA0KKw0KKzs7O1NFQ1RJT04gLnRleHQNCisNCisNCisNCisJLjU4NnANCisJLm1teA0KKw0KKwluYW1lCWluZmxhdGVfZmFzdF94ODYNCisJLk1PREVMCUZMQVQNCisNCitfREFUQQkJCXNlZ21lbnQNCitpbmZsYXRlX2Zhc3RfdXNlX21teDoNCisJZGQJMQ0KKw0KKw0KK19URVhUCQkJc2VnbWVudA0KK1BVQkxJQyBfaW5mbGF0ZV9mYXN0DQorDQorQUxJR04gNA0KK19pbmZsYXRlX2Zhc3Q6DQorCWptcCBpbmZsYXRlX2Zhc3RfZW50cnkNCisNCisNCisNCitBTElHTiA0DQorCWRiCSdGYXN0IGRlY29kaW5nIENvZGUgZnJvbSBDaHJpcyBBbmRlcnNvbicNCisJZGIJMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnOg0KKwlkYgknaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJw0KKwlkYgkwDQorDQorQUxJR04gNA0KK2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6DQorCWRiCSdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnDQorCWRiCTANCisNCitBTElHTiA0DQoraW52YWxpZF9kaXN0YW5jZV90b29fZmFyX21zZzoNCisJZGIJJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJw0KKwlkYgkwDQorDQorDQorQUxJR04gNA0KK2luZmxhdGVfZmFzdF9tYXNrOg0KK2RkCTANCitkZAkxDQorZGQJMw0KK2RkCTcNCitkZAkxNQ0KK2RkCTMxDQorZGQJNjMNCitkZAkxMjcNCitkZAkyNTUNCitkZAk1MTENCitkZAkxMDIzDQorZGQJMjA0Nw0KK2RkCTQwOTUNCitkZAk4MTkxDQorZGQJMTYzODMNCitkZAkzMjc2Nw0KK2RkCTY1NTM1DQorZGQJMTMxMDcxDQorZGQJMjYyMTQzDQorZGQJNTI0Mjg3DQorZGQJMTA0ODU3NQ0KK2RkCTIwOTcxNTENCitkZAk0MTk0MzAzDQorZGQJODM4ODYwNw0KK2RkCTE2Nzc3MjE1DQorZGQJMzM1NTQ0MzENCitkZAk2NzEwODg2Mw0KK2RkCTEzNDIxNzcyNw0KK2RkCTI2ODQzNTQ1NQ0KK2RkCTUzNjg3MDkxMQ0KK2RkCTEwNzM3NDE4MjMNCitkZAkyMTQ3NDgzNjQ3DQorZGQJNDI5NDk2NzI5NQ0KKw0KKw0KK21vZGVfc3RhdGUJIGVxdQkwCTsvKiBzdGF0ZS0+bW9kZQkqLw0KK3dzaXplX3N0YXRlCSBlcXUJKDMyK3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPndzaXplICovDQord3JpdGVfc3RhdGUJIGVxdQkoMzYrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53cml0ZSAqLw0KK3dpbmRvd19zdGF0ZQkgZXF1CSg0MCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPndpbmRvdyAqLw0KK2hvbGRfc3RhdGUJIGVxdQkoNDQrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5ob2xkCSovDQorYml0c19zdGF0ZQkgZXF1CSg0OCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmJpdHMJKi8NCitsZW5jb2RlX3N0YXRlCSBlcXUJKDY0KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+bGVuY29kZSAqLw0KK2Rpc3Rjb2RlX3N0YXRlCSBlcXUJKDY4KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+ZGlzdGNvZGUgKi8NCitsZW5iaXRzX3N0YXRlCSBlcXUJKDcyKzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+bGVuYml0cyAqLw0KK2Rpc3RiaXRzX3N0YXRlCSBlcXUJKDc2KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+ZGlzdGJpdHMgKi8NCisNCisNCis7O1NFQ1RJT04gLnRleHQNCis7IDIwNSAiaW5mZmFzdC5TIg0KKztHTE9CQUwJaW5mbGF0ZV9mYXN0X3VzZV9tbXgNCisNCis7U0VDVElPTiAuZGF0YQ0KKw0KKw0KKzsgR0xPQkFMIGluZmxhdGVfZmFzdF91c2VfbW14Om9iamVjdA0KKzsuc2l6ZSBpbmZsYXRlX2Zhc3RfdXNlX21teCwgNA0KKzsgMjI2ICJpbmZmYXN0LlMiDQorO1NFQ1RJT04gLnRleHQNCisNCitBTElHTiA0DQoraW5mbGF0ZV9mYXN0X2VudHJ5Og0KKwlwdXNoICBlZGkNCisJcHVzaCAgZXNpDQorCXB1c2ggIGVicA0KKwlwdXNoICBlYngNCisJcHVzaGZkDQorCXN1YiAgZXNwLDY0DQorCWNsZA0KKw0KKw0KKw0KKw0KKwltb3YgIGVzaSwgW2VzcCs4OF0NCisJbW92ICBlZGksIFtlc2krMjhdDQorDQorDQorDQorDQorDQorDQorDQorCW1vdiAgZWR4LCBbZXNpKzRdDQorCW1vdiAgZWF4LCBbZXNpKzBdDQorDQorCWFkZCAgZWR4LGVheA0KKwlzdWIgIGVkeCwxMQ0KKw0KKwltb3YgIFtlc3ArNDRdLGVheA0KKwltb3YgIFtlc3ArMjBdLGVkeA0KKw0KKwltb3YgIGVicCwgW2VzcCs5Ml0NCisJbW92ICBlY3gsIFtlc2krMTZdDQorCW1vdiAgZWJ4LCBbZXNpKzEyXQ0KKw0KKwlzdWIgIGVicCxlY3gNCisJbmVnICBlYnANCisJYWRkICBlYnAsZWJ4DQorDQorCXN1YiAgZWN4LDI1Nw0KKwlhZGQgIGVjeCxlYngNCisNCisJbW92ICBbZXNwKzYwXSxlYngNCisJbW92ICBbZXNwKzQwXSxlYnANCisJbW92ICBbZXNwKzE2XSxlY3gNCis7IDI4NSAiaW5mZmFzdC5TIg0KKwltb3YgIGVheCwgW2VkaStsZW5jb2RlX3N0YXRlXQ0KKwltb3YgIGVjeCwgW2VkaStkaXN0Y29kZV9zdGF0ZV0NCisNCisJbW92ICBbZXNwKzhdLGVheA0KKwltb3YgIFtlc3ArMTJdLGVjeA0KKw0KKwltb3YgIGVheCwxDQorCW1vdiAgZWN4LCBbZWRpK2xlbmJpdHNfc3RhdGVdDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCW1vdiAgW2VzcCswXSxlYXgNCisNCisJbW92ICBlYXgsMQ0KKwltb3YgIGVjeCwgW2VkaStkaXN0Yml0c19zdGF0ZV0NCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJbW92ICBbZXNwKzRdLGVheA0KKw0KKwltb3YgIGVheCwgW2VkaSt3c2l6ZV9zdGF0ZV0NCisJbW92ICBlY3gsIFtlZGkrd3JpdGVfc3RhdGVdDQorCW1vdiAgZWR4LCBbZWRpK3dpbmRvd19zdGF0ZV0NCisNCisJbW92ICBbZXNwKzUyXSxlYXgNCisJbW92ICBbZXNwKzQ4XSxlY3gNCisJbW92ICBbZXNwKzU2XSxlZHgNCisNCisJbW92ICBlYnAsIFtlZGkraG9sZF9zdGF0ZV0NCisJbW92ICBlYngsIFtlZGkrYml0c19zdGF0ZV0NCis7IDMyMSAiaW5mZmFzdC5TIg0KKwltb3YgIGVzaSwgW2VzcCs0NF0NCisJbW92ICBlY3gsIFtlc3ArMjBdDQorCWNtcCAgZWN4LGVzaQ0KKwlqYSAgIExfYWxpZ25fbG9uZw0KKw0KKwlhZGQgIGVjeCwxMQ0KKwlzdWIgIGVjeCxlc2kNCisJbW92ICBlYXgsMTINCisJc3ViICBlYXgsZWN4DQorCWxlYSAgZWRpLCBbZXNwKzI4XQ0KKwlyZXAgbW92c2INCisJbW92ICBlY3gsZWF4DQorCXhvciAgZWF4LGVheA0KKwlyZXAgc3Rvc2INCisJbGVhICBlc2ksIFtlc3ArMjhdDQorCW1vdiAgW2VzcCsyMF0sZXNpDQorCWptcCAgTF9pc19hbGlnbmVkDQorDQorDQorTF9hbGlnbl9sb25nOg0KKwl0ZXN0ICBlc2ksMw0KKwlqeiAgIExfaXNfYWxpZ25lZA0KKwl4b3IgIGVheCxlYXgNCisJbW92ICBhbCwgW2VzaV0NCisJaW5jICBlc2kNCisJbW92ICBlY3gsZWJ4DQorCWFkZCAgZWJ4LDgNCisJc2hsICBlYXgsY2wNCisJb3IgIGVicCxlYXgNCisJam1wIExfYWxpZ25fbG9uZw0KKw0KK0xfaXNfYWxpZ25lZDoNCisJbW92ICBlZGksIFtlc3ArNjBdDQorOyAzNjYgImluZmZhc3QuUyINCitMX2NoZWNrX21teDoNCisJY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQorCWplICAgTF9pbml0X21teA0KKwlqYSAgIExfZG9fbG9vcA0KKw0KKwlwdXNoICBlYXgNCisJcHVzaCAgZWJ4DQorCXB1c2ggIGVjeA0KKwlwdXNoICBlZHgNCisJcHVzaGZkDQorCW1vdiAgZWF4LCBbZXNwXQ0KKwl4b3IgIGR3b3JkIHB0ciBbZXNwXSwwMjAwMDAwaA0KKw0KKw0KKw0KKw0KKwlwb3BmZA0KKwlwdXNoZmQNCisJcG9wICBlZHgNCisJeG9yICBlZHgsZWF4DQorCWp6ICAgTF9kb250X3VzZV9tbXgNCisJeG9yICBlYXgsZWF4DQorCWNwdWlkDQorCWNtcCAgZWJ4LDA3NTZlNjU0N2gNCisJam5lICBMX2RvbnRfdXNlX21teA0KKwljbXAgIGVjeCwwNmM2NTc0NmVoDQorCWpuZSAgTF9kb250X3VzZV9tbXgNCisJY21wICBlZHgsMDQ5NjU2ZTY5aA0KKwlqbmUgIExfZG9udF91c2VfbW14DQorCW1vdiAgZWF4LDENCisJY3B1aWQNCisJc2hyICBlYXgsOA0KKwlhbmQgIGVheCwxNQ0KKwljbXAgIGVheCw2DQorCWpuZSAgTF9kb250X3VzZV9tbXgNCisJdGVzdCAgZWR4LDA4MDAwMDBoDQorCWpueiAgTF91c2VfbW14DQorCWptcCAgTF9kb250X3VzZV9tbXgNCitMX3VzZV9tbXg6DQorCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KKwlqbXAgIExfY2hlY2tfbW14X3BvcA0KK0xfZG9udF91c2VfbW14Og0KKwltb3YgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDMNCitMX2NoZWNrX21teF9wb3A6DQorCXBvcCAgZWR4DQorCXBvcCAgZWN4DQorCXBvcCAgZWJ4DQorCXBvcCAgZWF4DQorCWptcCAgTF9jaGVja19tbXgNCis7IDQyNiAiaW5mZmFzdC5TIg0KK0FMSUdOIDQNCitMX2RvX2xvb3A6DQorOyA0MzcgImluZmZhc3QuUyINCisJY21wICBibCwxNQ0KKwlqYSAgIExfZ2V0X2xlbmd0aF9jb2RlDQorDQorCXhvciAgZWF4LGVheA0KKwlsb2Rzdw0KKwltb3YgIGNsLGJsDQorCWFkZCAgYmwsMTYNCisJc2hsICBlYXgsY2wNCisJb3IgIGVicCxlYXgNCisNCitMX2dldF9sZW5ndGhfY29kZToNCisJbW92ICBlZHgsIFtlc3ArMF0NCisJbW92ICBlY3gsIFtlc3ArOF0NCisJYW5kICBlZHgsZWJwDQorCW1vdiAgZWF4LCBbZWN4K2VkeCo0XQ0KKw0KK0xfZG9sZW46DQorDQorDQorDQorDQorDQorDQorCW1vdiAgY2wsYWgNCisJc3ViICBibCxhaA0KKwlzaHIgIGVicCxjbA0KKw0KKw0KKw0KKw0KKw0KKw0KKwl0ZXN0ICBhbCxhbA0KKwlqbnogICBMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlDQorDQorCXNociAgZWF4LDE2DQorCXN0b3NiDQorDQorTF93aGlsZV90ZXN0Og0KKw0KKw0KKwljbXAgIFtlc3ArMTZdLGVkaQ0KKwlqYmUgIExfYnJlYWtfbG9vcA0KKw0KKwljbXAgIFtlc3ArMjBdLGVzaQ0KKwlqYSAgIExfZG9fbG9vcA0KKwlqbXAgIExfYnJlYWtfbG9vcA0KKw0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6DQorOyA1MDIgImluZmZhc3QuUyINCisJbW92ICBlZHgsZWF4DQorCXNociAgZWR4LDE2DQorCW1vdiAgY2wsYWwNCisNCisJdGVzdCAgYWwsMTYNCisJanogICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGgNCisJYW5kICBjbCwxNQ0KKwlqeiAgIExfc2F2ZV9sZW4NCisJY21wICBibCxjbA0KKwlqYWUgIExfYWRkX2JpdHNfdG9fbGVuDQorDQorCW1vdiAgY2gsY2wNCisJeG9yICBlYXgsZWF4DQorCWxvZHN3DQorCW1vdiAgY2wsYmwNCisJYWRkICBibCwxNg0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKwltb3YgIGNsLGNoDQorDQorTF9hZGRfYml0c190b19sZW46DQorCW1vdiAgZWF4LDENCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJc3ViICBibCxjbA0KKwlhbmQgIGVheCxlYnANCisJc2hyICBlYnAsY2wNCisJYWRkICBlZHgsZWF4DQorDQorTF9zYXZlX2xlbjoNCisJbW92ICBbZXNwKzI0XSxlZHgNCisNCisNCitMX2RlY29kZV9kaXN0YW5jZToNCis7IDU0OSAiaW5mZmFzdC5TIg0KKwljbXAgIGJsLDE1DQorCWphICAgTF9nZXRfZGlzdGFuY2VfY29kZQ0KKw0KKwl4b3IgIGVheCxlYXgNCisJbG9kc3cNCisJbW92ICBjbCxibA0KKwlhZGQgIGJsLDE2DQorCXNobCAgZWF4LGNsDQorCW9yICBlYnAsZWF4DQorDQorTF9nZXRfZGlzdGFuY2VfY29kZToNCisJbW92ICBlZHgsIFtlc3ArNF0NCisJbW92ICBlY3gsIFtlc3ArMTJdDQorCWFuZCAgZWR4LGVicA0KKwltb3YgIGVheCwgW2VjeCtlZHgqNF0NCisNCisNCitMX2RvZGlzdDoNCisJbW92ICBlZHgsZWF4DQorCXNociAgZWR4LDE2DQorCW1vdiAgY2wsYWgNCisJc3ViICBibCxhaA0KKwlzaHIgIGVicCxjbA0KKzsgNTg0ICJpbmZmYXN0LlMiDQorCW1vdiAgY2wsYWwNCisNCisJdGVzdCAgYWwsMTYNCisJanogIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QNCisJYW5kICBjbCwxNQ0KKwlqeiAgTF9jaGVja19kaXN0X29uZQ0KKwljbXAgIGJsLGNsDQorCWphZSAgTF9hZGRfYml0c190b19kaXN0DQorDQorCW1vdiAgY2gsY2wNCisJeG9yICBlYXgsZWF4DQorCWxvZHN3DQorCW1vdiAgY2wsYmwNCisJYWRkICBibCwxNg0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKwltb3YgIGNsLGNoDQorDQorTF9hZGRfYml0c190b19kaXN0Og0KKwltb3YgIGVheCwxDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCXN1YiAgYmwsY2wNCisJYW5kICBlYXgsZWJwDQorCXNociAgZWJwLGNsDQorCWFkZCAgZWR4LGVheA0KKwlqbXAgIExfY2hlY2tfd2luZG93DQorDQorTF9jaGVja193aW5kb3c6DQorOyA2MjUgImluZmZhc3QuUyINCisJbW92ICBbZXNwKzQ0XSxlc2kNCisJbW92ICBlYXgsZWRpDQorCXN1YiAgZWF4LCBbZXNwKzQwXQ0KKw0KKwljbXAgIGVheCxlZHgNCisJamIgICBMX2NsaXBfd2luZG93DQorDQorCW1vdiAgZWN4LCBbZXNwKzI0XQ0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorDQorCXN1YiAgZWN4LDMNCisJbW92ICBhbCwgW2VzaV0NCisJbW92ICBbZWRpXSxhbA0KKwltb3YgIGFsLCBbZXNpKzFdDQorCW1vdiAgZGwsIFtlc2krMl0NCisJYWRkICBlc2ksMw0KKwltb3YgIFtlZGkrMV0sYWwNCisJbW92ICBbZWRpKzJdLGRsDQorCWFkZCAgZWRpLDMNCisJcmVwIG1vdnNiDQorDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwlqbXAgIExfd2hpbGVfdGVzdA0KKw0KK0FMSUdOIDQNCitMX2NoZWNrX2Rpc3Rfb25lOg0KKwljbXAgIGVkeCwxDQorCWpuZSAgTF9jaGVja193aW5kb3cNCisJY21wICBbZXNwKzQwXSxlZGkNCisJamUgIExfY2hlY2tfd2luZG93DQorDQorCWRlYyAgZWRpDQorCW1vdiAgZWN4LCBbZXNwKzI0XQ0KKwltb3YgIGFsLCBbZWRpXQ0KKwlzdWIgIGVjeCwzDQorDQorCW1vdiAgW2VkaSsxXSxhbA0KKwltb3YgIFtlZGkrMl0sYWwNCisJbW92ICBbZWRpKzNdLGFsDQorCWFkZCAgZWRpLDQNCisJcmVwIHN0b3NiDQorDQorCWptcCAgTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoNCisNCisNCisNCisNCisJdGVzdCAgYWwsNjQNCisJam56ICAgTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sNCisNCisJbW92ICBlYXgsMQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwlhbmQgIGVheCxlYnANCisJYWRkICBlYXgsZWR4DQorCW1vdiAgZWR4LCBbZXNwKzhdDQorCW1vdiAgZWF4LCBbZWR4K2VheCo0XQ0KKwlqbXAgIExfZG9sZW4NCisNCitBTElHTiA0DQorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoNCisNCisNCisNCisNCisJdGVzdCAgYWwsNjQNCisJam56ICAgTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUNCisNCisJbW92ICBlYXgsMQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwlhbmQgIGVheCxlYnANCisJYWRkICBlYXgsZWR4DQorCW1vdiAgZWR4LCBbZXNwKzEyXQ0KKwltb3YgIGVheCwgW2VkeCtlYXgqNF0NCisJam1wICBMX2RvZGlzdA0KKw0KK0FMSUdOIDQNCitMX2NsaXBfd2luZG93Og0KKzsgNzIxICJpbmZmYXN0LlMiDQorCW1vdiAgZWN4LGVheA0KKwltb3YgIGVheCwgW2VzcCs1Ml0NCisJbmVnICBlY3gNCisJbW92ICBlc2ksIFtlc3ArNTZdDQorDQorCWNtcCAgZWF4LGVkeA0KKwlqYiAgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQorDQorCWFkZCAgZWN4LGVkeA0KKwljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQorCWpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3cNCisNCisJc3ViICBlYXgsZWN4DQorCWFkZCAgZXNpLGVheA0KKzsgNzQ5ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZXNwKzI0XQ0KKwljbXAgIGVheCxlY3gNCisJamJlICBMX2RvX2NvcHkxDQorDQorCXN1YiAgZWF4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVkeA0KKwlqbXAgIExfZG9fY29weTENCisNCisJY21wICBlYXgsZWN4DQorCWpiZSAgTF9kb19jb3B5MQ0KKw0KKwlzdWIgIGVheCxlY3gNCisJcmVwIG1vdnNiDQorCW1vdiAgZXNpLGVkaQ0KKwlzdWIgIGVzaSxlZHgNCisJam1wICBMX2RvX2NvcHkxDQorDQorTF93cmFwX2Fyb3VuZF93aW5kb3c6DQorOyA3OTMgImluZmZhc3QuUyINCisJbW92ICBlYXgsIFtlc3ArNDhdDQorCWNtcCAgZWN4LGVheA0KKwlqYmUgIExfY29udGlndW91c19pbl93aW5kb3cNCisNCisJYWRkICBlc2ksIFtlc3ArNTJdDQorCWFkZCAgZXNpLGVheA0KKwlzdWIgIGVzaSxlY3gNCisJc3ViICBlY3gsZWF4DQorDQorDQorCW1vdiAgZWF4LCBbZXNwKzI0XQ0KKwljbXAgIGVheCxlY3gNCisJamJlICBMX2RvX2NvcHkxDQorDQorCXN1YiAgZWF4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksIFtlc3ArNTZdDQorCW1vdiAgZWN4LCBbZXNwKzQ4XQ0KKwljbXAgIGVheCxlY3gNCisJamJlICBMX2RvX2NvcHkxDQorDQorCXN1YiAgZWF4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVkeA0KKwlqbXAgIExfZG9fY29weTENCisNCitMX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KKzsgODM2ICJpbmZmYXN0LlMiDQorCWFkZCAgZXNpLGVheA0KKwlzdWIgIGVzaSxlY3gNCisNCisNCisJbW92ICBlYXgsIFtlc3ArMjRdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorDQorTF9kb19jb3B5MToNCis7IDg2MiAiaW5mZmFzdC5TIg0KKwltb3YgIGVjeCxlYXgNCisJcmVwIG1vdnNiDQorDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwlqbXAgIExfd2hpbGVfdGVzdA0KKzsgODc4ICJpbmZmYXN0LlMiDQorQUxJR04gNA0KK0xfaW5pdF9tbXg6DQorCWVtbXMNCisNCisNCisNCisNCisNCisJbW92ZCBtbTAsZWJwDQorCW1vdiAgZWJwLGVieA0KKzsgODk2ICJpbmZmYXN0LlMiDQorCW1vdmQgbW00LFtlc3ArMF0NCisJbW92cSBtbTMsbW00DQorCW1vdmQgbW01LFtlc3ArNF0NCisJbW92cSBtbTIsbW01DQorCXB4b3IgbW0xLG1tMQ0KKwltb3YgIGVieCwgW2VzcCs4XQ0KKwlqbXAgIExfZG9fbG9vcF9tbXgNCisNCitBTElHTiA0DQorTF9kb19sb29wX21teDoNCisJcHNybHEgbW0wLG1tMQ0KKw0KKwljbXAgIGVicCwzMg0KKwlqYSAgTF9nZXRfbGVuZ3RoX2NvZGVfbW14DQorDQorCW1vdmQgbW02LGVicA0KKwltb3ZkIG1tNyxbZXNpXQ0KKwlhZGQgIGVzaSw0DQorCXBzbGxxIG1tNyxtbTYNCisJYWRkICBlYnAsMzINCisJcG9yIG1tMCxtbTcNCisNCitMX2dldF9sZW5ndGhfY29kZV9tbXg6DQorCXBhbmQgbW00LG1tMA0KKwltb3ZkIGVheCxtbTQNCisJbW92cSBtbTQsbW0zDQorCW1vdiAgZWF4LCBbZWJ4K2VheCo0XQ0KKw0KK0xfZG9sZW5fbW14Og0KKwltb3Z6eCAgZWN4LGFoDQorCW1vdmQgbW0xLGVjeA0KKwlzdWIgIGVicCxlY3gNCisNCisJdGVzdCAgYWwsYWwNCisJam56IExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14DQorDQorCXNociAgZWF4LDE2DQorCXN0b3NiDQorDQorTF93aGlsZV90ZXN0X21teDoNCisNCisNCisJY21wICBbZXNwKzE2XSxlZGkNCisJamJlIExfYnJlYWtfbG9vcA0KKw0KKwljbXAgIFtlc3ArMjBdLGVzaQ0KKwlqYSBMX2RvX2xvb3BfbW14DQorCWptcCBMX2JyZWFrX2xvb3ANCisNCitMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teDoNCisNCisJbW92ICBlZHgsZWF4DQorCXNociAgZWR4LDE2DQorDQorCXRlc3QgIGFsLDE2DQorCWp6ICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14DQorCWFuZCAgZWF4LDE1DQorCWp6IExfZGVjb2RlX2Rpc3RhbmNlX21teA0KKw0KKwlwc3JscSBtbTAsbW0xDQorCW1vdmQgbW0xLGVheA0KKwltb3ZkIGVjeCxtbTANCisJc3ViICBlYnAsZWF4DQorCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQorCWFkZCAgZWR4LGVjeA0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlX21teDoNCisJcHNybHEgbW0wLG1tMQ0KKw0KKwljbXAgIGVicCwzMg0KKwlqYSBMX2dldF9kaXN0X2NvZGVfbW14DQorDQorCW1vdmQgbW02LGVicA0KKwltb3ZkIG1tNyxbZXNpXQ0KKwlhZGQgIGVzaSw0DQorCXBzbGxxIG1tNyxtbTYNCisJYWRkICBlYnAsMzINCisJcG9yIG1tMCxtbTcNCisNCitMX2dldF9kaXN0X2NvZGVfbW14Og0KKwltb3YgIGVieCwgW2VzcCsxMl0NCisJcGFuZCBtbTUsbW0wDQorCW1vdmQgZWF4LG1tNQ0KKwltb3ZxIG1tNSxtbTINCisJbW92ICBlYXgsIFtlYngrZWF4KjRdDQorDQorTF9kb2Rpc3RfbW14Og0KKw0KKwltb3Z6eCAgZWN4LGFoDQorCW1vdiAgZWJ4LGVheA0KKwlzaHIgIGVieCwxNg0KKwlzdWIgIGVicCxlY3gNCisJbW92ZCBtbTEsZWN4DQorDQorCXRlc3QgIGFsLDE2DQorCWp6IExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RfbW14DQorCWFuZCAgZWF4LDE1DQorCWp6IExfY2hlY2tfZGlzdF9vbmVfbW14DQorDQorTF9hZGRfYml0c190b19kaXN0X21teDoNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIG1tMSxlYXgNCisJbW92ZCBlY3gsbW0wDQorCXN1YiAgZWJwLGVheA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVieCxlY3gNCisNCitMX2NoZWNrX3dpbmRvd19tbXg6DQorCW1vdiAgW2VzcCs0NF0sZXNpDQorCW1vdiAgZWF4LGVkaQ0KKwlzdWIgIGVheCwgW2VzcCs0MF0NCisNCisJY21wICBlYXgsZWJ4DQorCWpiIExfY2xpcF93aW5kb3dfbW14DQorDQorCW1vdiAgZWN4LGVkeA0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorCXN1YiAgZWN4LDMNCisJbW92ICBhbCwgW2VzaV0NCisJbW92ICBbZWRpXSxhbA0KKwltb3YgIGFsLCBbZXNpKzFdDQorCW1vdiAgZGwsIFtlc2krMl0NCisJYWRkICBlc2ksMw0KKwltb3YgIFtlZGkrMV0sYWwNCisJbW92ICBbZWRpKzJdLGRsDQorCWFkZCAgZWRpLDMNCisJcmVwIG1vdnNiDQorDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwltb3YgIGVieCwgW2VzcCs4XQ0KKwlqbXAgIExfd2hpbGVfdGVzdF9tbXgNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZV9tbXg6DQorCWNtcCAgZWJ4LDENCisJam5lICBMX2NoZWNrX3dpbmRvd19tbXgNCisJY21wICBbZXNwKzQwXSxlZGkNCisJamUgICBMX2NoZWNrX3dpbmRvd19tbXgNCisNCisJZGVjICBlZGkNCisJbW92ICBlY3gsZWR4DQorCW1vdiAgYWwsIFtlZGldDQorCXN1YiAgZWN4LDMNCisNCisJbW92ICBbZWRpKzFdLGFsDQorCW1vdiAgW2VkaSsyXSxhbA0KKwltb3YgIFtlZGkrM10sYWwNCisJYWRkICBlZGksNA0KKwlyZXAgc3Rvc2INCisNCisJbW92ICBlYngsIFtlc3ArOF0NCisJam1wICBMX3doaWxlX3Rlc3RfbW14DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6DQorCXRlc3QgIGFsLDY0DQorCWpueiBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jaw0KKw0KKwlhbmQgIGVheCwxNQ0KKwlwc3JscSBtbTAsbW0xDQorCW1vdmQgZWN4LG1tMA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVjeCxlZHgNCisJbW92ICBlYXgsIFtlYngrZWN4KjRdDQorCWptcCBMX2RvbGVuX21teA0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDoNCisJdGVzdCAgYWwsNjQNCisJam56IExfaW52YWxpZF9kaXN0YW5jZV9jb2RlDQorDQorCWFuZCAgZWF4LDE1DQorCXBzcmxxIG1tMCxtbTENCisJbW92ZCBlY3gsbW0wDQorCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQorCW1vdiAgZWF4LCBbZXNwKzEyXQ0KKwlhZGQgIGVjeCxlYngNCisJbW92ICBlYXgsIFtlYXgrZWN4KjRdDQorCWptcCAgTF9kb2Rpc3RfbW14DQorDQorQUxJR04gNA0KK0xfY2xpcF93aW5kb3dfbW14Og0KKw0KKwltb3YgIGVjeCxlYXgNCisJbW92ICBlYXgsIFtlc3ArNTJdDQorCW5lZyAgZWN4DQorCW1vdiAgZXNpLCBbZXNwKzU2XQ0KKw0KKwljbXAgIGVheCxlYngNCisJamIgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQorDQorCWFkZCAgZWN4LGVieA0KKwljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQorCWpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14DQorDQorCXN1YiAgZWF4LGVjeA0KKwlhZGQgIGVzaSxlYXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCitMX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6DQorDQorCW1vdiAgZWF4LCBbZXNwKzQ4XQ0KKwljbXAgIGVjeCxlYXgNCisJamJlICBMX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teA0KKw0KKwlhZGQgIGVzaSwgW2VzcCs1Ml0NCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKwlzdWIgIGVjeCxlYXgNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisJbW92ICBlY3gsIFtlc3ArNDhdDQorCWNtcCAgZWR4LGVjeA0KKwlqYmUgIExfZG9fY29weTFfbW14DQorDQorCXN1YiAgZWR4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVieA0KKwlqbXAgIExfZG9fY29weTFfbW14DQorDQorTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXg6DQorDQorCWFkZCAgZXNpLGVheA0KKwlzdWIgIGVzaSxlY3gNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorTF9kb19jb3B5MV9tbXg6DQorDQorDQorCW1vdiAgZWN4LGVkeA0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWJ4LCBbZXNwKzhdDQorCWptcCAgTF93aGlsZV90ZXN0X21teA0KKzsgMTE3NCAiaW5mZmFzdC5TIg0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKw0KKw0KKw0KKw0KKw0KKwltb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZw0KKwltb3YgIGVkeCxJTkZMQVRFX01PREVfQkFEDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorDQorDQorDQorDQorDQorCXRlc3QgIGFsLDMyDQorCWp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQ0KKw0KKwltb3YgIGVjeCwwDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9UWVBFDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6DQorDQorDQorDQorDQorDQorCW1vdiAgZWN4LCBpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoNCisNCisNCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWN4LCBpbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX3VwZGF0ZV9zdHJlYW1fc3RhdGU6DQorDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwl0ZXN0ICBlY3gsZWN4DQorCWp6ICBMX3NraXBfbXNnDQorCW1vdiAgW2VheCsyNF0sZWN4DQorTF9za2lwX21zZzoNCisJbW92ICBlYXgsIFtlYXgrMjhdDQorCW1vdiAgW2VheCttb2RlX3N0YXRlXSxlZHgNCisJam1wICBMX2JyZWFrX2xvb3ANCisNCitBTElHTiA0DQorTF9icmVha19sb29wOg0KKzsgMTI0MyAiaW5mZmFzdC5TIg0KKwljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisJam5lICBMX3VwZGF0ZV9uZXh0X2luDQorDQorDQorDQorCW1vdiAgZWJ4LGVicA0KKw0KK0xfdXBkYXRlX25leHRfaW46DQorOyAxMjY2ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwltb3YgIGVjeCxlYngNCisJbW92ICBlZHgsIFtlYXgrMjhdDQorCXNociAgZWN4LDMNCisJc3ViICBlc2ksZWN4DQorCXNobCAgZWN4LDMNCisJc3ViICBlYngsZWN4DQorCW1vdiAgW2VheCsxMl0sZWRpDQorCW1vdiAgW2VkeCtiaXRzX3N0YXRlXSxlYngNCisJbW92ICBlY3gsZWJ4DQorDQorCWxlYSAgZWJ4LCBbZXNwKzI4XQ0KKwljbXAgIFtlc3ArMjBdLGVieA0KKwlqbmUgIExfYnVmX25vdF91c2VkDQorDQorCXN1YiAgZXNpLGVieA0KKwltb3YgIGVieCwgW2VheCswXQ0KKwltb3YgIFtlc3ArMjBdLGVieA0KKwlhZGQgIGVzaSxlYngNCisJbW92ICBlYngsIFtlYXgrNF0NCisJc3ViICBlYngsMTENCisJYWRkICBbZXNwKzIwXSxlYngNCisNCitMX2J1Zl9ub3RfdXNlZDoNCisJbW92ICBbZWF4KzBdLGVzaQ0KKw0KKwltb3YgIGVieCwxDQorCXNobCAgZWJ4LGNsDQorCWRlYyAgZWJ4DQorDQorDQorDQorDQorDQorCWNtcCAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KKwlqbmUgIExfdXBkYXRlX2hvbGQNCisNCisNCisNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIGVicCxtbTANCisNCisJZW1tcw0KKw0KK0xfdXBkYXRlX2hvbGQ6DQorDQorDQorDQorCWFuZCAgZWJwLGVieA0KKwltb3YgIFtlZHgraG9sZF9zdGF0ZV0sZWJwDQorDQorDQorDQorDQorCW1vdiAgZWJ4LCBbZXNwKzIwXQ0KKwljbXAgIGVieCxlc2kNCisJamJlICBMX2xhc3RfaXNfc21hbGxlcg0KKw0KKwlzdWIgIGVieCxlc2kNCisJYWRkICBlYngsMTENCisJbW92ICBbZWF4KzRdLGVieA0KKwlqbXAgIExfZml4dXBfb3V0DQorTF9sYXN0X2lzX3NtYWxsZXI6DQorCXN1YiAgZXNpLGVieA0KKwluZWcgIGVzaQ0KKwlhZGQgIGVzaSwxMQ0KKwltb3YgIFtlYXgrNF0sZXNpDQorDQorDQorDQorDQorTF9maXh1cF9vdXQ6DQorDQorCW1vdiAgZWJ4LCBbZXNwKzE2XQ0KKwljbXAgIGVieCxlZGkNCisJamJlICBMX2VuZF9pc19zbWFsbGVyDQorDQorCXN1YiAgZWJ4LGVkaQ0KKwlhZGQgIGVieCwyNTcNCisJbW92ICBbZWF4KzE2XSxlYngNCisJam1wICBMX2RvbmUNCitMX2VuZF9pc19zbWFsbGVyOg0KKwlzdWIgIGVkaSxlYngNCisJbmVnICBlZGkNCisJYWRkICBlZGksMjU3DQorCW1vdiAgW2VheCsxNl0sZWRpDQorDQorDQorDQorDQorDQorTF9kb25lOg0KKwlhZGQgIGVzcCw2NA0KKwlwb3BmZA0KKwlwb3AgIGVieA0KKwlwb3AgIGVicA0KKwlwb3AgIGVzaQ0KKwlwb3AgIGVkaQ0KKwlyZXQNCisNCitfVEVYVAllbmRzDQorZW5kDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL0NoYW5nZUxvZ1VuemlwIGIvY29udHJpYi9taW5pemlwL0NoYW5nZUxvZ1VuemlwCmluZGV4IDRiZTRkMTYuLmU2MmFmMTQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC9DaGFuZ2VMb2dVbnppcAorKysgYi9jb250cmliL21pbml6aXAvQ2hhbmdlTG9nVW56aXAKQEAgLTEsNjMgKzEsNjcgQEAKLUNoYW5nZSBpbiAxLjAxYiAoMjAgbWF5IDA0KQotLSBJbnRlZ3JhdGUgcGF0Y2ggZnJvbSBEZWJpYW4gcGFja2FnZSAoc3VibWl0ZWQgYnkgTWFyayBCcm93bikKLS0gQWRkIHRvb2xzIG16dG9vbHMgZnJvbSBYYXZpZXIgUm9jaGUKLQotQ2hhbmdlIGluIDEuMDEgKDggbWF5IDA0KQotLSBmaXggYnVmZmVyIG92ZXJydW4gcmlzayBpbiB1bnppcC5jIChYYXZpZXIgUm9jaGUpCi0tIGZpeCBhIG1pbm9yIGJ1ZmZlciBpbnNlY3VyaXR5IGluIG1pbml6aXAuYyAoTWlrZSBXaGl0dGFrZXIpCi0KLUNoYW5nZSBpbiAxLjAwOiAoMTAgc2VwdCAwMykKLS0gcmVuYW1lIHRvIDEuMDAKLS0gY29zbWV0aWMgY29kZSBjaGFuZ2UKLQotQ2hhbmdlIGluIDAuMjI6ICgxOSBNYXkgMDMpCi0tIGNyeXB0aW5nIHN1cHBvcnQgKHVubGVzcyB5b3UgZGVmaW5lIE5PQ1JZUFQpCi0tIGFwcGVuZCBmaWxlIGluIGV4aXN0aW5nIHppcGZpbGUKLQotQ2hhbmdlIGluIDAuMjE6ICgxMCBNYXIgMDMpCi0tIGJ1ZyBmaXhlcwotCi1DaGFuZ2UgaW4gMC4xNzogKDI3IEphbiAwMikKLS0gYnVnIGZpeGVzCi0KLUNoYW5nZSBpbiAwLjE2OiAoMTkgSmFuIDAyKQotLSBTdXBwb3J0IG9mIGlvYXBpIGZvciB2aXJ0dWFsaXplIHppcCBmaWxlIGFjY2VzcwotCi1DaGFuZ2UgaW4gMC4xNTogKDE5IE1hciA5OCkKLS0gZml4IG1lbW9yeSBsZWFrIGluIG1pbml6aXAuYwotCi1DaGFuZ2UgaW4gMC4xNDogKDEwIE1hciA5OCkKLS0gZml4IGJ1Z3MgaW4gbWluaXppcC5jIHNhbXBsZSBmb3IgemlwcGluZyBiaWcgZmlsZQotLSBmaXggcHJvYmxlbSBpbiBtb250aCBpbiBkYXRlIGhhbmRsaW5nCi0tIGZpeCBidWcgaW4gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgaW4gdW56aXAuYyBmb3IKLSAgICBjb21tZW50IGhhbmRsaW5nCi0KLUNoYW5nZSBpbiAwLjEzOiAoNiBNYXIgOTgpCi0tIGZpeCBidWdzIGluIHppcC5jCi0tIGFkZCByZWFsIG1pbml6aXAgc2FtcGxlCi0KLUNoYW5nZSBpbiAwLjEyOiAoNCBNYXIgOTgpCi0tIGFkZCB6aXAuYyBhbmQgemlwLmggZm9yIGNyZWF0ZXMgLnppcCBmaWxlCi0tIGZpeCBjaGFuZ2VfZmlsZV9kYXRlIGluIG1pbml1bnouYyBmb3IgVW5peCAoSmVhbi1sb3VwIEdhaWxseSkKLS0gZml4IG1pbml1bnouYyBmb3IgZmlsZSB3aXRob3V0IHNwZWNpZmljIHJlY29yZCBmb3IgZGlyZWN0b3J5Ci0KLUNoYW5nZSBpbiAwLjExOiAoMyBNYXIgOTgpCi0tIGZpeCBidWcgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvIGZvciBnZXQgZXh0cmEgZmllbGQgYW5kIGNvbW1lbnQKLS0gZW5oYW5jZSBtaW5pdW56IHNhbXBsZSwgcmVtb3ZlIHRoZSBiYWQgdW56dHN0LmMgc2FtcGxlCi0KLUNoYW5nZSBpbiAwLjEwOiAoMiBNYXIgOTgpCi0tIGZpeCBidWcgaW4gdW56UmVhZEN1cnJlbnRGaWxlCi0tIHJlbmFtZSB1bnppcCogdG8gdW56KiBmdW5jdGlvbiBhbmQgc3RydWN0dXJlCi0tIHJlbW92ZSBXaW5kb3dzLWxpa2UgaHVuZ2FyeSBub3RhdGlvbiB2YXJpYWJsZSBuYW1lCi0tIG1vZGlmeSBzb21lIHN0cnVjdHVyZSBpbiB1bnppcC5oCi0tIGFkZCBzb21lcyBjb21tZW50IGluIHNvdXJjZQotLSByZW1vdmUgdW56aXBHZXRjQ3VycmVudEZpbGUgZnVuY3Rpb24KLS0gcmVwbGFjZSBaVU5aRVhQT1JUIGJ5IFpFWFBPUlQKLS0gYWRkIHVuekdldExvY2FsRXh0cmFmaWVsZCBmb3IgZ2V0IHRoZSBsb2NhbCBleHRyYWZpZWxkIGluZm8KLS0gYWRkIGEgbmV3IHNhbXBsZSwgbWluaXVuei5jCi0KLUNoYW5nZSBpbiAwLjQ6ICgyNSBGZWIgOTgpCi0tIHN1cHByZXNzIHRoZSB0eXBlIHVuemlwRmlsZUluWmlwLgotICBPbmx5IG9uIGZpbGUgaW4gdGhlIHppcGZpbGUgY2FuIGJlIG9wZW4gYXQgdGhlIHNhbWUgdGltZQotLSBmaXggc29tZXMgdHlwbyBpbiBjb2RlCi0tIGFkZGVkIHRtX3VueiBzdHJ1Y3R1cmUgaW4gdW56aXBfZmlsZV9pbmZvIChkYXRlL3RpbWUgaW4gcmVhZGFibGUgZm9ybWF0KQorQ2hhbmdlIGluIDEuMDFlICgxMiBmZWIgMDUpDQorLSBGaXggaW4gemlwT3BlbjIgZm9yIGdsb2JhbGNvbW1lbnQgKFJvbGYgS2FsYmVybWF0dGVyKQ0KKy0gRml4IHBvc3NpYmxlIG1lbW9yeSBsZWFrIGluIHVuemlwLmMgKFpvcmFuIFN0ZXZhbm92aWMpDQorDQorQ2hhbmdlIGluIDEuMDFiICgyMCBtYXkgMDQpDQorLSBJbnRlZ3JhdGUgcGF0Y2ggZnJvbSBEZWJpYW4gcGFja2FnZSAoc3VibWl0ZWQgYnkgTWFyayBCcm93bikNCistIEFkZCB0b29scyBtenRvb2xzIGZyb20gWGF2aWVyIFJvY2hlDQorDQorQ2hhbmdlIGluIDEuMDEgKDggbWF5IDA0KQ0KKy0gZml4IGJ1ZmZlciBvdmVycnVuIHJpc2sgaW4gdW56aXAuYyAoWGF2aWVyIFJvY2hlKQ0KKy0gZml4IGEgbWlub3IgYnVmZmVyIGluc2VjdXJpdHkgaW4gbWluaXppcC5jIChNaWtlIFdoaXR0YWtlcikNCisNCitDaGFuZ2UgaW4gMS4wMDogKDEwIHNlcHQgMDMpDQorLSByZW5hbWUgdG8gMS4wMA0KKy0gY29zbWV0aWMgY29kZSBjaGFuZ2UNCisNCitDaGFuZ2UgaW4gMC4yMjogKDE5IE1heSAwMykNCistIGNyeXB0aW5nIHN1cHBvcnQgKHVubGVzcyB5b3UgZGVmaW5lIE5PQ1JZUFQpDQorLSBhcHBlbmQgZmlsZSBpbiBleGlzdGluZyB6aXBmaWxlDQorDQorQ2hhbmdlIGluIDAuMjE6ICgxMCBNYXIgMDMpDQorLSBidWcgZml4ZXMNCisNCitDaGFuZ2UgaW4gMC4xNzogKDI3IEphbiAwMikNCistIGJ1ZyBmaXhlcw0KKw0KK0NoYW5nZSBpbiAwLjE2OiAoMTkgSmFuIDAyKQ0KKy0gU3VwcG9ydCBvZiBpb2FwaSBmb3IgdmlydHVhbGl6ZSB6aXAgZmlsZSBhY2Nlc3MNCisNCitDaGFuZ2UgaW4gMC4xNTogKDE5IE1hciA5OCkNCistIGZpeCBtZW1vcnkgbGVhayBpbiBtaW5pemlwLmMNCisNCitDaGFuZ2UgaW4gMC4xNDogKDEwIE1hciA5OCkNCistIGZpeCBidWdzIGluIG1pbml6aXAuYyBzYW1wbGUgZm9yIHppcHBpbmcgYmlnIGZpbGUNCistIGZpeCBwcm9ibGVtIGluIG1vbnRoIGluIGRhdGUgaGFuZGxpbmcNCistIGZpeCBidWcgaW4gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgaW4gdW56aXAuYyBmb3INCisgICAgY29tbWVudCBoYW5kbGluZw0KKw0KK0NoYW5nZSBpbiAwLjEzOiAoNiBNYXIgOTgpDQorLSBmaXggYnVncyBpbiB6aXAuYw0KKy0gYWRkIHJlYWwgbWluaXppcCBzYW1wbGUNCisNCitDaGFuZ2UgaW4gMC4xMjogKDQgTWFyIDk4KQ0KKy0gYWRkIHppcC5jIGFuZCB6aXAuaCBmb3IgY3JlYXRlcyAuemlwIGZpbGUNCistIGZpeCBjaGFuZ2VfZmlsZV9kYXRlIGluIG1pbml1bnouYyBmb3IgVW5peCAoSmVhbi1sb3VwIEdhaWxseSkNCistIGZpeCBtaW5pdW56LmMgZm9yIGZpbGUgd2l0aG91dCBzcGVjaWZpYyByZWNvcmQgZm9yIGRpcmVjdG9yeQ0KKw0KK0NoYW5nZSBpbiAwLjExOiAoMyBNYXIgOTgpDQorLSBmaXggYnVnIGluIHVuekdldEN1cnJlbnRGaWxlSW5mbyBmb3IgZ2V0IGV4dHJhIGZpZWxkIGFuZCBjb21tZW50DQorLSBlbmhhbmNlIG1pbml1bnogc2FtcGxlLCByZW1vdmUgdGhlIGJhZCB1bnp0c3QuYyBzYW1wbGUNCisNCitDaGFuZ2UgaW4gMC4xMDogKDIgTWFyIDk4KQ0KKy0gZml4IGJ1ZyBpbiB1bnpSZWFkQ3VycmVudEZpbGUNCistIHJlbmFtZSB1bnppcCogdG8gdW56KiBmdW5jdGlvbiBhbmQgc3RydWN0dXJlDQorLSByZW1vdmUgV2luZG93cy1saWtlIGh1bmdhcnkgbm90YXRpb24gdmFyaWFibGUgbmFtZQ0KKy0gbW9kaWZ5IHNvbWUgc3RydWN0dXJlIGluIHVuemlwLmgNCistIGFkZCBzb21lcyBjb21tZW50IGluIHNvdXJjZQ0KKy0gcmVtb3ZlIHVuemlwR2V0Y0N1cnJlbnRGaWxlIGZ1bmN0aW9uDQorLSByZXBsYWNlIFpVTlpFWFBPUlQgYnkgWkVYUE9SVA0KKy0gYWRkIHVuekdldExvY2FsRXh0cmFmaWVsZCBmb3IgZ2V0IHRoZSBsb2NhbCBleHRyYWZpZWxkIGluZm8NCistIGFkZCBhIG5ldyBzYW1wbGUsIG1pbml1bnouYw0KKw0KK0NoYW5nZSBpbiAwLjQ6ICgyNSBGZWIgOTgpDQorLSBzdXBwcmVzcyB0aGUgdHlwZSB1bnppcEZpbGVJblppcC4NCisgIE9ubHkgb24gZmlsZSBpbiB0aGUgemlwZmlsZSBjYW4gYmUgb3BlbiBhdCB0aGUgc2FtZSB0aW1lDQorLSBmaXggc29tZXMgdHlwbyBpbiBjb2RlDQorLSBhZGRlZCB0bV91bnogc3RydWN0dXJlIGluIHVuemlwX2ZpbGVfaW5mbyAoZGF0ZS90aW1lIGluIHJlYWRhYmxlIGZvcm1hdCkNCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvTWFrZWZpbGUgYi9jb250cmliL21pbml6aXAvTWFrZWZpbGUKaW5kZXggODRlYWFkMi4uZmJiYTNhYyAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQpAQCAtMSwyNSArMSwyNSBAQAotQ0M9Y2MKLUNGTEFHUz0tTyAtSS4uLy4uCi0KLVVOWl9PQkpTID0gbWluaXVuei5vIHVuemlwLm8gaW9hcGkubyAuLi8uLi9saWJ6LmEKLVpJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKLQotLmMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1hbGw6IG1pbml1bnogbWluaXppcAotCi1taW5pdW56OiAgJChVTlpfT0JKUykKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgJChVTlpfT0JKUykKLQotbWluaXppcDogICQoWklQX09CSlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAICQoWklQX09CSlMpCi0KLXRlc3Q6CW1pbml1bnogbWluaXppcAotCS4vbWluaXppcCB0ZXN0IHJlYWRtZS50eHQKLQkuL21pbml1bnogLWwgdGVzdC56aXAKLQltdiByZWFkbWUudHh0IHJlYWRtZS5vbGQKLQkuL21pbml1bnogdGVzdC56aXAKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLm8gKn4gbWluaXppcCBtaW5pdW56CitDQz1jYw0KK0NGTEFHUz0tTyAtSS4uLy4uDQorDQorVU5aX09CSlMgPSBtaW5pdW56Lm8gdW56aXAubyBpb2FwaS5vIC4uLy4uL2xpYnouYQ0KK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmENCisNCisuYy5vOg0KKwkkKENDKSAtYyAkKENGTEFHUykgJCouYw0KKw0KK2FsbDogbWluaXVueiBtaW5pemlwDQorDQorbWluaXVuejogICQoVU5aX09CSlMpDQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkKFVOWl9PQkpTKQ0KKw0KK21pbml6aXA6ICAkKFpJUF9PQkpTKQ0KKwkkKENDKSAkKENGTEFHUykgLW8gJEAgJChaSVBfT0JKUykNCisNCit0ZXN0OgltaW5pdW56IG1pbml6aXANCisJLi9taW5pemlwIHRlc3QgcmVhZG1lLnR4dA0KKwkuL21pbml1bnogLWwgdGVzdC56aXANCisJbXYgcmVhZG1lLnR4dCByZWFkbWUub2xkDQorCS4vbWluaXVueiB0ZXN0LnppcA0KKw0KK2NsZWFuOg0KKwkvYmluL3JtIC1mICoubyAqfiBtaW5pemlwIG1pbml1bnoNCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvY3J5cHQuaCBiL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oCmluZGV4IDdmOGE2MzQuLmYxNGE2MjggMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oCisrKyBiL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oCkBAIC0xLDEzMiArMSwxMzIgQEAKLS8qIGNyeXB0LmggLS0gYmFzZSBjb2RlIGZvciBjcnlwdC91bmNyeXB0IFpJUGZpbGUKLQotCi0gICBWZXJzaW9uIDEuMDEsIE1heSA4dGgsIDIwMDQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQKLQotICAgVGhpcyBjb2RlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBjcnlwdGluZyBjb2RlIGluIEluZm96aXAgZGlzdHJpYnV0aW9uCi0KLSAgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKLSAgIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKLSAgIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCi0gICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCi0KLSAgIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCi0gICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKLSAgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQotICAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KLQotICAgSWYgeW91IGRvbid0IG5lZWQgY3J5cHRpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCBkZWZpbmUgc3ltYm9scwotICAgTk9DUllQVCBhbmQgTk9VTkNSWVBULgotCi0gICBUaGlzIGNvZGUgc3VwcG9ydCB0aGUgIlRyYWRpdGlvbmFsIFBLV0FSRSBFbmNyeXB0aW9uIi4KLQotICAgVGhlIG5ldyBBRVMgZW5jcnlwdGlvbiBhZGRlZCBvbiBaaXAgZm9ybWF0IGJ5IFdpbnppcCAoc2VlIHRoZSBwYWdlCi0gICBodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtICkgYW5kIFBLV2FyZSBQS1ppcCA1LnggU3Ryb25nCi0gICBFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0qLwotCi0jZGVmaW5lIENSQzMyKGMsIGIpICgoKihwY3JjXzMyX3RhYisoKChpbnQpKGMpIF4gKGIpKSAmIDB4ZmYpKSkgXiAoKGMpID4+IDgpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlCi0gKi8KLXN0YXRpYyBpbnQgZGVjcnlwdF9ieXRlKHVuc2lnbmVkIGxvbmcqIHBrZXlzLCBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYikKLXsKLSAgICB1bnNpZ25lZCB0ZW1wOyAgLyogUE9URU5USUFMIEJVRzogIHRlbXAqKHRlbXBeMSkgbWF5IG92ZXJmbG93IGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIHVucHJlZGljdGFibGUgbWFubmVyIG9uIDE2LWJpdCBzeXN0ZW1zOyBub3QgYSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAqIHdpdGggYW55IGtub3duIGNvbXBpbGVyIHNvIGZhciwgdGhvdWdoICovCi0KLSAgICB0ZW1wID0gKCh1bnNpZ25lZCkoKihwa2V5cysyKSkgJiAweGZmZmYpIHwgMjsKLSAgICByZXR1cm4gKGludCkoKCh0ZW1wICogKHRlbXAgXiAxKSkgPj4gOCkgJiAweGZmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dAotICovCi1zdGF0aWMgaW50IHVwZGF0ZV9rZXlzKHVuc2lnbmVkIGxvbmcqIHBrZXlzLGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiLGludCBjKQotewotICAgICgqKHBrZXlzKzApKSA9IENSQzMyKCgqKHBrZXlzKzApKSwgYyk7Ci0gICAgKCoocGtleXMrMSkpICs9ICgqKHBrZXlzKzApKSAmIDB4ZmY7Ci0gICAgKCoocGtleXMrMSkpID0gKCoocGtleXMrMSkpICogMTM0Nzc1ODEzTCArIDE7Ci0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGtleXNoaWZ0ID0gKGludCkoKCoocGtleXMrMSkpID4+IDI0KTsKLSAgICAgICgqKHBrZXlzKzIpKSA9IENSQzMyKCgqKHBrZXlzKzIpKSwga2V5c2hpZnQpOwotICAgIH0KLSAgICByZXR1cm4gYzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCi0gKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCi0gKi8KLXN0YXRpYyB2b2lkIGluaXRfa2V5cyhjb25zdCBjaGFyKiBwYXNzd2QsdW5zaWduZWQgbG9uZyogcGtleXMsY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIpCi17Ci0gICAgKihwa2V5cyswKSA9IDMwNTQxOTg5Nkw7Ci0gICAgKihwa2V5cysxKSA9IDU5MTc1MTA0OUw7Ci0gICAgKihwa2V5cysyKSA9IDg3ODA4MjE5Mkw7Ci0gICAgd2hpbGUgKCpwYXNzd2QgIT0gJ1wwJykgewotICAgICAgICB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYiwoaW50KSpwYXNzd2QpOwotICAgICAgICBwYXNzd2QrKzsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgemRlY29kZShwa2V5cyxwY3JjXzMyX3RhYixjKSBcCi0gICAgKHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMgXj0gZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSkpCi0KLSNkZWZpbmUgemVuY29kZShwa2V5cyxwY3JjXzMyX3RhYixjLHQpIFwKLSAgICAodD1kZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpLCB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjKSwgdF4oYykpCi0KLSNpZmRlZiBJTkNMVURFQ1JZUFRJTkdDT0RFX0lGQ1JZUFRBTExPV0VECi0KLSNkZWZpbmUgUkFORF9IRUFEX0xFTiAgMTIKLSAgIC8qICJsYXN0IHJlc29ydCIgc291cmNlIGZvciBzZWNvbmQgcGFydCBvZiBjcnlwdCBzZWVkIHBhdHRlcm4gKi8KLSMgIGlmbmRlZiBaQ1JfU0VFRDIKLSMgICAgZGVmaW5lIFpDUl9TRUVEMiAzMTQxNTkyNjU0VUwgICAgIC8qIHVzZSBQSSBhcyBkZWZhdWx0IHBhdHRlcm4gKi8KLSMgIGVuZGlmCi0KLXN0YXRpYyBpbnQgY3J5cHRoZWFkKHBhc3N3ZCwgYnVmLCBidWZTaXplLCBwa2V5cywgcGNyY18zMl90YWIsIGNyY0ZvckNyeXB0aW5nKQotICAgIGNvbnN0IGNoYXIgKnBhc3N3ZDsgICAgICAgICAvKiBwYXNzd29yZCBzdHJpbmcgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAgICAgICAgLyogd2hlcmUgdG8gd3JpdGUgaGVhZGVyICovCi0gICAgaW50IGJ1ZlNpemU7Ci0gICAgdW5zaWduZWQgbG9uZyogcGtleXM7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7Ci0gICAgdW5zaWduZWQgbG9uZyBjcmNGb3JDcnlwdGluZzsKLXsKLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIHJhbmRvbSBoZWFkZXIgKi8KLSAgICBpbnQgdDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLwotICAgIGludCBjOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuZG9tIGJ5dGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcltSQU5EX0hFQURfTEVOLTJdOyAvKiByYW5kb20gaGVhZGVyICovCi0gICAgc3RhdGljIHVuc2lnbmVkIGNhbGxzID0gMDsgICAvKiBlbnN1cmUgZGlmZmVyZW50IHJhbmRvbSBoZWFkZXIgZWFjaCB0aW1lICovCi0KLSAgICBpZiAoYnVmU2l6ZTxSQU5EX0hFQURfTEVOKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBGaXJzdCBnZW5lcmF0ZSBSQU5EX0hFQURfTEVOLTIgcmFuZG9tIGJ5dGVzLiBXZSBlbmNyeXB0IHRoZQotICAgICAqIG91dHB1dCBvZiByYW5kKCkgdG8gZ2V0IGxlc3MgcHJlZGljdGFiaWxpdHksIHNpbmNlIHJhbmQoKSBpcwotICAgICAqIG9mdGVuIHBvb3JseSBpbXBsZW1lbnRlZC4KLSAgICAgKi8KLSAgICBpZiAoKytjYWxscyA9PSAxKQotICAgIHsKLSAgICAgICAgc3JhbmQoKHVuc2lnbmVkKSh0aW1lKE5VTEwpIF4gWkNSX1NFRUQyKSk7Ci0gICAgfQotICAgIGluaXRfa2V5cyhwYXNzd2QsIHBrZXlzLCBwY3JjXzMyX3RhYik7Ci0gICAgZm9yIChuID0gMDsgbiA8IFJBTkRfSEVBRF9MRU4tMjsgbisrKQotICAgIHsKLSAgICAgICAgYyA9IChyYW5kKCkgPj4gNykgJiAweGZmOwotICAgICAgICBoZWFkZXJbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgYywgdCk7Ci0gICAgfQotICAgIC8qIEVuY3J5cHQgcmFuZG9tIGhlYWRlciAobGFzdCB0d28gYnl0ZXMgaXMgaGlnaCB3b3JkIG9mIGNyYykgKi8KLSAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOwotICAgIGZvciAobiA9IDA7IG4gPCBSQU5EX0hFQURfTEVOLTI7IG4rKykKLSAgICB7Ci0gICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKXplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCBoZWFkZXJbbl0sIHQpOwotICAgIH0KLSAgICBidWZbbisrXSA9IHplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCAoaW50KShjcmNGb3JDcnlwdGluZyA+PiAxNikgJiAweGZmLCB0KTsKLSAgICBidWZbbisrXSA9IHplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCAoaW50KShjcmNGb3JDcnlwdGluZyA+PiAyNCkgJiAweGZmLCB0KTsKLSAgICByZXR1cm4gbjsKLX0KLQotI2VuZGlmCisvKiBjcnlwdC5oIC0tIGJhc2UgY29kZSBmb3IgY3J5cHQvdW5jcnlwdCBaSVBmaWxlDQorDQorDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorDQorICAgVGhpcyBjb2RlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBjcnlwdGluZyBjb2RlIGluIEluZm96aXAgZGlzdHJpYnV0aW9uDQorDQorICAgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwYXJ0cyBvZiB0aGlzIHNvdXJjZSBjb2RlIChhcyBvcHBvc2VkIHRvIHRoZQ0KKyAgIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUNCisgICB3aG9sZSBzb3VyY2UgcGFja2FnZSBjYW4gYmUgZnJlZWx5IGRpc3RyaWJ1dGVkLCBpbmNsdWRpbmcgZnJvbSB0aGUgVVNBLg0KKyAgIChQcmlvciB0byBKYW51YXJ5IDIwMDAsIHJlLWV4cG9ydCBmcm9tIHRoZSBVUyB3YXMgYSB2aW9sYXRpb24gb2YgVVMgbGF3LikNCisNCisgICBUaGlzIGVuY3J5cHRpb24gY29kZSBpcyBhIGRpcmVjdCB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZnJvbQ0KKyAgIFJvZ2VyIFNjaGxhZmx5LCBkZXNjcmliZWQgYnkgUGhpbCBLYXR6IGluIHRoZSBmaWxlIGFwcG5vdGUudHh0LiAgVGhpcw0KKyAgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQ0KKyAgIHZlcnNpb24gd2l0aG91dCBlbmNyeXB0aW9uIGNhcGFiaWxpdGllcykuDQorDQorICAgSWYgeW91IGRvbid0IG5lZWQgY3J5cHRpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCBkZWZpbmUgc3ltYm9scw0KKyAgIE5PQ1JZUFQgYW5kIE5PVU5DUllQVC4NCisNCisgICBUaGlzIGNvZGUgc3VwcG9ydCB0aGUgIlRyYWRpdGlvbmFsIFBLV0FSRSBFbmNyeXB0aW9uIi4NCisNCisgICBUaGUgbmV3IEFFUyBlbmNyeXB0aW9uIGFkZGVkIG9uIFppcCBmb3JtYXQgYnkgV2luemlwIChzZWUgdGhlIHBhZ2UNCisgICBodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtICkgYW5kIFBLV2FyZSBQS1ppcCA1LnggU3Ryb25nDQorICAgRW5jcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkLg0KKyovDQorDQorI2RlZmluZSBDUkMzMihjLCBiKSAoKCoocGNyY18zMl90YWIrKCgoaW50KShjKSBeIChiKSkgJiAweGZmKSkpIF4gKChjKSA+PiA4KSkNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBSZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgcHNldWRvLXJhbmRvbSBzZXF1ZW5jZQ0KKyAqLw0KK3N0YXRpYyBpbnQgZGVjcnlwdF9ieXRlKHVuc2lnbmVkIGxvbmcqIHBrZXlzLCBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYikNCit7DQorICAgIHVuc2lnbmVkIHRlbXA7ICAvKiBQT1RFTlRJQUwgQlVHOiAgdGVtcCoodGVtcF4xKSBtYXkgb3ZlcmZsb3cgaW4gYW4NCisgICAgICAgICAgICAgICAgICAgICAqIHVucHJlZGljdGFibGUgbWFubmVyIG9uIDE2LWJpdCBzeXN0ZW1zOyBub3QgYSBwcm9ibGVtDQorICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFueSBrbm93biBjb21waWxlciBzbyBmYXIsIHRob3VnaCAqLw0KKw0KKyAgICB0ZW1wID0gKCh1bnNpZ25lZCkoKihwa2V5cysyKSkgJiAweGZmZmYpIHwgMjsNCisgICAgcmV0dXJuIChpbnQpKCgodGVtcCAqICh0ZW1wIF4gMSkpID4+IDgpICYgMHhmZik7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIFVwZGF0ZSB0aGUgZW5jcnlwdGlvbiBrZXlzIHdpdGggdGhlIG5leHQgYnl0ZSBvZiBwbGFpbiB0ZXh0DQorICovDQorc3RhdGljIGludCB1cGRhdGVfa2V5cyh1bnNpZ25lZCBsb25nKiBwa2V5cyxjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYixpbnQgYykNCit7DQorICAgICgqKHBrZXlzKzApKSA9IENSQzMyKCgqKHBrZXlzKzApKSwgYyk7DQorICAgICgqKHBrZXlzKzEpKSArPSAoKihwa2V5cyswKSkgJiAweGZmOw0KKyAgICAoKihwa2V5cysxKSkgPSAoKihwa2V5cysxKSkgKiAxMzQ3NzU4MTNMICsgMTsNCisgICAgew0KKyAgICAgIHJlZ2lzdGVyIGludCBrZXlzaGlmdCA9IChpbnQpKCgqKHBrZXlzKzEpKSA+PiAyNCk7DQorICAgICAgKCoocGtleXMrMikpID0gQ1JDMzIoKCoocGtleXMrMikpLCBrZXlzaGlmdCk7DQorICAgIH0NCisgICAgcmV0dXJuIGM7DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvDQorICogdGhlIGdpdmVuIHBhc3N3b3JkLg0KKyAqLw0KK3N0YXRpYyB2b2lkIGluaXRfa2V5cyhjb25zdCBjaGFyKiBwYXNzd2QsdW5zaWduZWQgbG9uZyogcGtleXMsY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIpDQorew0KKyAgICAqKHBrZXlzKzApID0gMzA1NDE5ODk2TDsNCisgICAgKihwa2V5cysxKSA9IDU5MTc1MTA0OUw7DQorICAgICoocGtleXMrMikgPSA4NzgwODIxOTJMOw0KKyAgICB3aGlsZSAoKnBhc3N3ZCAhPSAnXDAnKSB7DQorICAgICAgICB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYiwoaW50KSpwYXNzd2QpOw0KKyAgICAgICAgcGFzc3dkKys7DQorICAgIH0NCit9DQorDQorI2RlZmluZSB6ZGVjb2RlKHBrZXlzLHBjcmNfMzJfdGFiLGMpIFwNCisgICAgKHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMgXj0gZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSkpDQorDQorI2RlZmluZSB6ZW5jb2RlKHBrZXlzLHBjcmNfMzJfdGFiLGMsdCkgXA0KKyAgICAodD1kZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpLCB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjKSwgdF4oYykpDQorDQorI2lmZGVmIElOQ0xVREVDUllQVElOR0NPREVfSUZDUllQVEFMTE9XRUQNCisNCisjZGVmaW5lIFJBTkRfSEVBRF9MRU4gIDEyDQorICAgLyogImxhc3QgcmVzb3J0IiBzb3VyY2UgZm9yIHNlY29uZCBwYXJ0IG9mIGNyeXB0IHNlZWQgcGF0dGVybiAqLw0KKyMgIGlmbmRlZiBaQ1JfU0VFRDINCisjICAgIGRlZmluZSBaQ1JfU0VFRDIgMzE0MTU5MjY1NFVMICAgICAvKiB1c2UgUEkgYXMgZGVmYXVsdCBwYXR0ZXJuICovDQorIyAgZW5kaWYNCisNCitzdGF0aWMgaW50IGNyeXB0aGVhZChwYXNzd2QsIGJ1ZiwgYnVmU2l6ZSwgcGtleXMsIHBjcmNfMzJfdGFiLCBjcmNGb3JDcnlwdGluZykNCisgICAgY29uc3QgY2hhciAqcGFzc3dkOyAgICAgICAgIC8qIHBhc3N3b3JkIHN0cmluZyAqLw0KKyAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAgICAgICAgLyogd2hlcmUgdG8gd3JpdGUgaGVhZGVyICovDQorICAgIGludCBidWZTaXplOw0KKyAgICB1bnNpZ25lZCBsb25nKiBwa2V5czsNCisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7DQorICAgIHVuc2lnbmVkIGxvbmcgY3JjRm9yQ3J5cHRpbmc7DQorew0KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIHJhbmRvbSBoZWFkZXIgKi8NCisgICAgaW50IHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8NCisgICAgaW50IGM7ICAgICAgICAgICAgICAgICAgICAgICAvKiByYW5kb20gYnl0ZSAqLw0KKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcltSQU5EX0hFQURfTEVOLTJdOyAvKiByYW5kb20gaGVhZGVyICovDQorICAgIHN0YXRpYyB1bnNpZ25lZCBjYWxscyA9IDA7ICAgLyogZW5zdXJlIGRpZmZlcmVudCByYW5kb20gaGVhZGVyIGVhY2ggdGltZSAqLw0KKw0KKyAgICBpZiAoYnVmU2l6ZTxSQU5EX0hFQURfTEVOKQ0KKyAgICAgIHJldHVybiAwOw0KKw0KKyAgICAvKiBGaXJzdCBnZW5lcmF0ZSBSQU5EX0hFQURfTEVOLTIgcmFuZG9tIGJ5dGVzLiBXZSBlbmNyeXB0IHRoZQ0KKyAgICAgKiBvdXRwdXQgb2YgcmFuZCgpIHRvIGdldCBsZXNzIHByZWRpY3RhYmlsaXR5LCBzaW5jZSByYW5kKCkgaXMNCisgICAgICogb2Z0ZW4gcG9vcmx5IGltcGxlbWVudGVkLg0KKyAgICAgKi8NCisgICAgaWYgKCsrY2FsbHMgPT0gMSkNCisgICAgew0KKyAgICAgICAgc3JhbmQoKHVuc2lnbmVkKSh0aW1lKE5VTEwpIF4gWkNSX1NFRUQyKSk7DQorICAgIH0NCisgICAgaW5pdF9rZXlzKHBhc3N3ZCwgcGtleXMsIHBjcmNfMzJfdGFiKTsNCisgICAgZm9yIChuID0gMDsgbiA8IFJBTkRfSEVBRF9MRU4tMjsgbisrKQ0KKyAgICB7DQorICAgICAgICBjID0gKHJhbmQoKSA+PiA3KSAmIDB4ZmY7DQorICAgICAgICBoZWFkZXJbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgYywgdCk7DQorICAgIH0NCisgICAgLyogRW5jcnlwdCByYW5kb20gaGVhZGVyIChsYXN0IHR3byBieXRlcyBpcyBoaWdoIHdvcmQgb2YgY3JjKSAqLw0KKyAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOw0KKyAgICBmb3IgKG4gPSAwOyBuIDwgUkFORF9IRUFEX0xFTi0yOyBuKyspDQorICAgIHsNCisgICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKXplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCBoZWFkZXJbbl0sIHQpOw0KKyAgICB9DQorICAgIGJ1ZltuKytdID0gemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIChpbnQpKGNyY0ZvckNyeXB0aW5nID4+IDE2KSAmIDB4ZmYsIHQpOw0KKyAgICBidWZbbisrXSA9IHplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCAoaW50KShjcmNGb3JDcnlwdGluZyA+PiAyNCkgJiAweGZmLCB0KTsNCisgICAgcmV0dXJuIG47DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC9pb2FwaS5jIGIvY29udHJpYi9taW5pemlwL2lvYXBpLmMKaW5kZXggYzllNjlmMi4uN2YyMGMxOCAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL2lvYXBpLmMKKysrIGIvY29udHJpYi9taW5pemlwL2lvYXBpLmMKQEAgLTEsMTc3ICsxLDE3NyBAQAotLyogaW9hcGkuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCi0gICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQotCi0gICBWZXJzaW9uIDEuMDEsIE1heSA4dGgsIDIwMDQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQKLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgImlvYXBpLmgiCi0KLQotCi0vKiBJJ3ZlIGZvdW5kIGFuIG9sZCBVbml4IChhIFN1bk9TIDQuMS4zX1UxKSB3aXRob3V0IGFsbCBTRUVLXyogZGVmaW5lZC4uLi4gKi8KLQotI2lmbmRlZiBTRUVLX0NVUgotI2RlZmluZSBTRUVLX0NVUiAgICAxCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX0VORAotI2RlZmluZSBTRUVLX0VORCAgICAyCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAgICAwCi0jZW5kaWYKLQotdm9pZHBmIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgaW50IG1vZGUpKTsKLQotdUxvbmcgWkNBTExCQUNLIGZyZWFkX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSwKLSAgIHZvaWQqIGJ1ZiwKLSAgIHVMb25nIHNpemUpKTsKLQotdUxvbmcgWkNBTExCQUNLIGZ3cml0ZV9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0sCi0gICBjb25zdCB2b2lkKiBidWYsCi0gICB1TG9uZyBzaXplKSk7Ci0KLWxvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSkpOwotCi1sb25nIFpDQUxMQkFDSyBmc2Vla19maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0sCi0gICB1TG9uZyBvZmZzZXQsCi0gICBpbnQgb3JpZ2luKSk7Ci0KLWludCBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSkpOwotCi1pbnQgWkNBTExCQUNLIGZlcnJvcl9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0pKTsKLQotCi12b2lkcGYgWkNBTExCQUNLIGZvcGVuX2ZpbGVfZnVuYyAob3BhcXVlLCBmaWxlbmFtZSwgbW9kZSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgIGludCBtb2RlOwotewotICAgIEZJTEUqIGZpbGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOwotICAgIGlmICgobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIpPT1aTElCX0ZJTEVGVU5DX01PREVfUkVBRCkKLSAgICAgICAgbW9kZV9mb3BlbiA9ICJyYiI7Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQotICAgICAgICBtb2RlX2ZvcGVuID0gInIrYiI7Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkKLSAgICAgICAgbW9kZV9mb3BlbiA9ICJ3YiI7Ci0KLSAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAobW9kZV9mb3BlbiAhPSBOVUxMKSkKLSAgICAgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCBtb2RlX2ZvcGVuKTsKLSAgICByZXR1cm4gZmlsZTsKLX0KLQotCi11TG9uZyBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci0gICB2b2lkKiBidWY7Ci0gICB1TG9uZyBzaXplOwotewotICAgIHVMb25nIHJldDsKLSAgICByZXQgPSAodUxvbmcpZnJlYWQoYnVmLCAxLCAoc2l6ZV90KXNpemUsIChGSUxFICopc3RyZWFtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLXVMb25nIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci0gICBjb25zdCB2b2lkKiBidWY7Ci0gICB1TG9uZyBzaXplOwotewotICAgIHVMb25nIHJldDsKLSAgICByZXQgPSAodUxvbmcpZndyaXRlKGJ1ZiwgMSwgKHNpemVfdClzaXplLCAoRklMRSAqKXN0cmVhbSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotbG9uZyBaQ0FMTEJBQ0sgZnRlbGxfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotewotICAgIGxvbmcgcmV0OwotICAgIHJldCA9IGZ0ZWxsKChGSUxFICopc3RyZWFtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1sb25nIFpDQUxMQkFDSyBmc2Vla19maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotICAgdUxvbmcgb2Zmc2V0OwotICAgaW50IG9yaWdpbjsKLXsKLSAgICBpbnQgZnNlZWtfb3JpZ2luPTA7Ci0gICAgbG9uZyByZXQ7Ci0gICAgc3dpdGNoIChvcmlnaW4pCi0gICAgewotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6Ci0gICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfQ1VSOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgOgotICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0VORDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUIDoKLSAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19TRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0ID0gMDsKLSAgICBmc2VlaygoRklMRSAqKXN0cmVhbSwgb2Zmc2V0LCBmc2Vla19vcmlnaW4pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLXsKLSAgICBpbnQgcmV0OwotICAgIHJldCA9IGZjbG9zZSgoRklMRSAqKXN0cmVhbSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpDQUxMQkFDSyBmZXJyb3JfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotewotICAgIGludCByZXQ7Ci0gICAgcmV0ID0gZmVycm9yKChGSUxFICopc3RyZWFtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGZpbGxfZm9wZW5fZmlsZWZ1bmMgKHB6bGliX2ZpbGVmdW5jX2RlZikKLSAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLXsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuX2ZpbGUgPSBmb3Blbl9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gZnJlYWRfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSBmd3JpdGVfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGxfZmlsZSA9IGZ0ZWxsX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrX2ZpbGUgPSBmc2Vla19maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IGZjbG9zZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IGZlcnJvcl9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWUgPSBOVUxMOwotfQorLyogaW9hcGkuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwDQorICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkNCisNCisgICBWZXJzaW9uIDEuMDFlLCBGZWJydWFyeSAxMnRoLCAyMDA1DQorDQorICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQNCisqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgInpsaWIuaCINCisjaW5jbHVkZSAiaW9hcGkuaCINCisNCisNCisNCisvKiBJJ3ZlIGZvdW5kIGFuIG9sZCBVbml4IChhIFN1bk9TIDQuMS4zX1UxKSB3aXRob3V0IGFsbCBTRUVLXyogZGVmaW5lZC4uLi4gKi8NCisNCisjaWZuZGVmIFNFRUtfQ1VSDQorI2RlZmluZSBTRUVLX0NVUiAgICAxDQorI2VuZGlmDQorDQorI2lmbmRlZiBTRUVLX0VORA0KKyNkZWZpbmUgU0VFS19FTkQgICAgMg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgU0VFS19TRVQNCisjZGVmaW5lIFNFRUtfU0VUICAgIDANCisjZW5kaWYNCisNCit2b2lkcGYgWkNBTExCQUNLIGZvcGVuX2ZpbGVfZnVuYyBPRigoDQorICAgdm9pZHBmIG9wYXF1ZSwNCisgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwNCisgICBpbnQgbW9kZSkpOw0KKw0KK3VMb25nIFpDQUxMQkFDSyBmcmVhZF9maWxlX2Z1bmMgT0YoKA0KKyAgIHZvaWRwZiBvcGFxdWUsDQorICAgdm9pZHBmIHN0cmVhbSwNCisgICB2b2lkKiBidWYsDQorICAgdUxvbmcgc2l6ZSkpOw0KKw0KK3VMb25nIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIHZvaWRwZiBzdHJlYW0sDQorICAgY29uc3Qgdm9pZCogYnVmLA0KKyAgIHVMb25nIHNpemUpKTsNCisNCitsb25nIFpDQUxMQkFDSyBmdGVsbF9maWxlX2Z1bmMgT0YoKA0KKyAgIHZvaWRwZiBvcGFxdWUsDQorICAgdm9pZHBmIHN0cmVhbSkpOw0KKw0KK2xvbmcgWkNBTExCQUNLIGZzZWVrX2ZpbGVfZnVuYyBPRigoDQorICAgdm9pZHBmIG9wYXF1ZSwNCisgICB2b2lkcGYgc3RyZWFtLA0KKyAgIHVMb25nIG9mZnNldCwNCisgICBpbnQgb3JpZ2luKSk7DQorDQoraW50IFpDQUxMQkFDSyBmY2xvc2VfZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIHZvaWRwZiBzdHJlYW0pKTsNCisNCitpbnQgWkNBTExCQUNLIGZlcnJvcl9maWxlX2Z1bmMgT0YoKA0KKyAgIHZvaWRwZiBvcGFxdWUsDQorICAgdm9pZHBmIHN0cmVhbSkpOw0KKw0KKw0KK3ZvaWRwZiBaQ0FMTEJBQ0sgZm9wZW5fZmlsZV9mdW5jIChvcGFxdWUsIGZpbGVuYW1lLCBtb2RlKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgY29uc3QgY2hhciogZmlsZW5hbWU7DQorICAgaW50IG1vZGU7DQorew0KKyAgICBGSUxFKiBmaWxlID0gTlVMTDsNCisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7DQorICAgIGlmICgobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIpPT1aTElCX0ZJTEVGVU5DX01PREVfUkVBRCkNCisgICAgICAgIG1vZGVfZm9wZW4gPSAicmIiOw0KKyAgICBlbHNlDQorICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQ0KKyAgICAgICAgbW9kZV9mb3BlbiA9ICJyK2IiOw0KKyAgICBlbHNlDQorICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkNCisgICAgICAgIG1vZGVfZm9wZW4gPSAid2IiOw0KKw0KKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAobW9kZV9mb3BlbiAhPSBOVUxMKSkNCisgICAgICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgbW9kZV9mb3Blbik7DQorICAgIHJldHVybiBmaWxlOw0KK30NCisNCisNCit1TG9uZyBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCisgICB2b2lkKiBidWY7DQorICAgdUxvbmcgc2l6ZTsNCit7DQorICAgIHVMb25nIHJldDsNCisgICAgcmV0ID0gKHVMb25nKWZyZWFkKGJ1ZiwgMSwgKHNpemVfdClzaXplLCAoRklMRSAqKXN0cmVhbSk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KKw0KK3VMb25nIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCisgICBjb25zdCB2b2lkKiBidWY7DQorICAgdUxvbmcgc2l6ZTsNCit7DQorICAgIHVMb25nIHJldDsNCisgICAgcmV0ID0gKHVMb25nKWZ3cml0ZShidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitsb25nIFpDQUxMQkFDSyBmdGVsbF9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCit7DQorICAgIGxvbmcgcmV0Ow0KKyAgICByZXQgPSBmdGVsbCgoRklMRSAqKXN0cmVhbSk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK2xvbmcgWkNBTExCQUNLIGZzZWVrX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCisgICB1TG9uZyBvZmZzZXQ7DQorICAgaW50IG9yaWdpbjsNCit7DQorICAgIGludCBmc2Vla19vcmlnaW49MDsNCisgICAgbG9uZyByZXQ7DQorICAgIHN3aXRjaCAob3JpZ2luKQ0KKyAgICB7DQorICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6DQorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgOg0KKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUIDoNCisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiAtMTsNCisgICAgfQ0KKyAgICByZXQgPSAwOw0KKyAgICBmc2VlaygoRklMRSAqKXN0cmVhbSwgb2Zmc2V0LCBmc2Vla19vcmlnaW4pOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitpbnQgWkNBTExCQUNLIGZjbG9zZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCit7DQorICAgIGludCByZXQ7DQorICAgIHJldCA9IGZjbG9zZSgoRklMRSAqKXN0cmVhbSk7DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK2ludCBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pDQorICAgdm9pZHBmIG9wYXF1ZTsNCisgICB2b2lkcGYgc3RyZWFtOw0KK3sNCisgICAgaW50IHJldDsNCisgICAgcmV0ID0gZmVycm9yKChGSUxFICopc3RyZWFtKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorDQordm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpDQorICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOw0KK3sNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gZm9wZW5fZmlsZV9mdW5jOw0KKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSBmcmVhZF9maWxlX2Z1bmM7DQorICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSBmd3JpdGVfZmlsZV9mdW5jOw0KKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSBmdGVsbF9maWxlX2Z1bmM7DQorICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWtfZmlsZSA9IGZzZWVrX2ZpbGVfZnVuYzsNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IGZjbG9zZV9maWxlX2Z1bmM7DQorICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOw0KKyAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oIGIvY29udHJpYi9taW5pemlwL2lvYXBpLmgKaW5kZXggYjc2MTE2MS4uZTczYTNiMiAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL2lvYXBpLmgKKysrIGIvY29udHJpYi9taW5pemlwL2lvYXBpLmgKQEAgLTEsNzUgKzEsNzUgQEAKLS8qIGlvYXBpLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAotICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkKLQotICAgVmVyc2lvbiAxLjAxLCBNYXkgOHRoLCAyMDA0Ci0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50Ci0qLwotCi0jaWZuZGVmIF9aTElCSU9BUElfSAotI2RlZmluZSBfWkxJQklPQVBJX0gKLQotCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgKDEpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgKDIpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgKDApCi0KLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgICAgICAoMSkKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFICAgICAoMikKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUiAoMykKLQotI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcgKDQpCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUgICAoOCkKLQotCi0jaWZuZGVmIFpDQUxMQkFDSwotCi0jaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQgKFdJTkRPV1MpIHx8IGRlZmluZWQgKF9XSU5ET1dTKSkgJiYgZGVmaW5lZChDQUxMQkFDSykgJiYgZGVmaW5lZCAoVVNFV0lORE9XU19DQUxMQkFDSykKLSNkZWZpbmUgWkNBTExCQUNLIENBTExCQUNLCi0jZWxzZQotI2RlZmluZSBaQ0FMTEJBQ0sKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiB2b2lkcGYgKFpDQUxMQkFDSyAqb3Blbl9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKLXR5cGVkZWYgdUxvbmcgIChaQ0FMTEJBQ0sgKnJlYWRfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Ci10eXBlZGVmIHVMb25nICAoWkNBTExCQUNLICp3cml0ZV9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKLXR5cGVkZWYgbG9uZyAgIChaQ0FMTEJBQ0sgKnRlbGxfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotdHlwZWRlZiBsb25nICAgKFpDQUxMQkFDSyAqc2Vla19maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB1TG9uZyBvZmZzZXQsIGludCBvcmlnaW4pKTsKLXR5cGVkZWYgaW50ICAgIChaQ0FMTEJBQ0sgKmNsb3NlX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKLXR5cGVkZWYgaW50ICAgIChaQ0FMTEJBQ0sgKnRlc3RlcnJvcl9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Ci0KLXR5cGVkZWYgc3RydWN0IHpsaWJfZmlsZWZ1bmNfZGVmX3MKLXsKLSAgICBvcGVuX2ZpbGVfZnVuYyAgICAgIHpvcGVuX2ZpbGU7Ci0gICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOwotICAgIHdyaXRlX2ZpbGVfZnVuYyAgICAgendyaXRlX2ZpbGU7Ci0gICAgdGVsbF9maWxlX2Z1bmMgICAgICB6dGVsbF9maWxlOwotICAgIHNlZWtfZmlsZV9mdW5jICAgICAgenNlZWtfZmlsZTsKLSAgICBjbG9zZV9maWxlX2Z1bmMgICAgIHpjbG9zZV9maWxlOwotICAgIHRlc3RlcnJvcl9maWxlX2Z1bmMgemVycm9yX2ZpbGU7Ci0gICAgdm9pZHBmICAgICAgICAgICAgICBvcGFxdWU7Ci19IHpsaWJfZmlsZWZ1bmNfZGVmOwotCi0KLQotdm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIE9GKCh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Ci0KLSNkZWZpbmUgWlJFQUQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgKCgqKChmaWxlZnVuYykuenJlYWRfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQotI2RlZmluZSBaV1JJVEUoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgKCgqKChmaWxlZnVuYykuendyaXRlX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtLGJ1ZixzaXplKSkKLSNkZWZpbmUgWlRFTEwoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuenRlbGxfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQotI2RlZmluZSBaU0VFSyhmaWxlZnVuYyxmaWxlc3RyZWFtLHBvcyxtb2RlKSAoKCooKGZpbGVmdW5jKS56c2Vla19maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSxwb3MsbW9kZSkpCi0jZGVmaW5lIFpDTE9TRShmaWxlZnVuYyxmaWxlc3RyZWFtKSAoKCooKGZpbGVmdW5jKS56Y2xvc2VfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQotI2RlZmluZSBaRVJST1IoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuemVycm9yX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtKSkKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQorLyogaW9hcGkuaCAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwDQorICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkNCisNCisgICBWZXJzaW9uIDEuMDFlLCBGZWJydWFyeSAxMnRoLCAyMDA1DQorDQorICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQNCisqLw0KKw0KKyNpZm5kZWYgX1pMSUJJT0FQSV9IDQorI2RlZmluZSBfWkxJQklPQVBJX0gNCisNCisNCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgKDEpDQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EICgyKQ0KKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCAoMCkNCisNCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEICAgICAgKDEpDQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgICAgICgyKQ0KKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUiAoMykNCisNCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORyAoNCkNCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUgICAoOCkNCisNCisNCisjaWZuZGVmIFpDQUxMQkFDSw0KKw0KKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZCAoV0lORE9XUykgfHwgZGVmaW5lZCAoX1dJTkRPV1MpKSAmJiBkZWZpbmVkKENBTExCQUNLKSAmJiBkZWZpbmVkIChVU0VXSU5ET1dTX0NBTExCQUNLKQ0KKyNkZWZpbmUgWkNBTExCQUNLIENBTExCQUNLDQorI2Vsc2UNCisjZGVmaW5lIFpDQUxMQkFDSw0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgdm9pZHBmIChaQ0FMTEJBQ0sgKm9wZW5fZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBtb2RlKSk7DQordHlwZWRlZiB1TG9uZyAgKFpDQUxMQkFDSyAqcmVhZF9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsNCit0eXBlZGVmIHVMb25nICAoWkNBTExCQUNLICp3cml0ZV9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsNCit0eXBlZGVmIGxvbmcgICAoWkNBTExCQUNLICp0ZWxsX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsNCit0eXBlZGVmIGxvbmcgICAoWkNBTExCQUNLICpzZWVrX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHVMb25nIG9mZnNldCwgaW50IG9yaWdpbikpOw0KK3R5cGVkZWYgaW50ICAgIChaQ0FMTEJBQ0sgKmNsb3NlX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsNCit0eXBlZGVmIGludCAgICAoWkNBTExCQUNLICp0ZXN0ZXJyb3JfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOw0KKw0KK3R5cGVkZWYgc3RydWN0IHpsaWJfZmlsZWZ1bmNfZGVmX3MNCit7DQorICAgIG9wZW5fZmlsZV9mdW5jICAgICAgem9wZW5fZmlsZTsNCisgICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOw0KKyAgICB3cml0ZV9maWxlX2Z1bmMgICAgIHp3cml0ZV9maWxlOw0KKyAgICB0ZWxsX2ZpbGVfZnVuYyAgICAgIHp0ZWxsX2ZpbGU7DQorICAgIHNlZWtfZmlsZV9mdW5jICAgICAgenNlZWtfZmlsZTsNCisgICAgY2xvc2VfZmlsZV9mdW5jICAgICB6Y2xvc2VfZmlsZTsNCisgICAgdGVzdGVycm9yX2ZpbGVfZnVuYyB6ZXJyb3JfZmlsZTsNCisgICAgdm9pZHBmICAgICAgICAgICAgICBvcGFxdWU7DQorfSB6bGliX2ZpbGVmdW5jX2RlZjsNCisNCisNCisNCit2b2lkIGZpbGxfZm9wZW5fZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsNCisNCisjZGVmaW5lIFpSRUFEKGZpbGVmdW5jLGZpbGVzdHJlYW0sYnVmLHNpemUpICgoKigoZmlsZWZ1bmMpLnpyZWFkX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtLGJ1ZixzaXplKSkNCisjZGVmaW5lIFpXUklURShmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAoKCooKGZpbGVmdW5jKS56d3JpdGVfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQ0KKyNkZWZpbmUgWlRFTEwoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuenRlbGxfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQ0KKyNkZWZpbmUgWlNFRUsoZmlsZWZ1bmMsZmlsZXN0cmVhbSxwb3MsbW9kZSkgKCgqKChmaWxlZnVuYykuenNlZWtfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0scG9zLG1vZGUpKQ0KKyNkZWZpbmUgWkNMT1NFKGZpbGVmdW5jLGZpbGVzdHJlYW0pICgoKigoZmlsZWZ1bmMpLnpjbG9zZV9maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSkpDQorI2RlZmluZSBaRVJST1IoZmlsZWZ1bmMsZmlsZXN0cmVhbSkgKCgqKChmaWxlZnVuYykuemVycm9yX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtKSkNCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmDQorDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBiL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmMKaW5kZXggOTQwZGMwYi4uNjk0YmMwMyAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL2lvd2luMzIuYworKysgYi9jb250cmliL21pbml6aXAvaW93aW4zMi5jCkBAIC0xLDI3MCArMSwyNzAgQEAKLS8qIGlvd2luMzIuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCi0gICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQotICAgVGhpcyBJTyBBUEkgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMiBBUEkgKGZvciBNaWNyb3NvZnQgV2luZG93cykKLQotICAgVmVyc2lvbiAxLjAxLCBNYXkgOHRoLCAyMDA0Ci0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50Ci0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJ6bGliLmgiCi0jaW5jbHVkZSAiaW9hcGkuaCIKLSNpbmNsdWRlICJpb3dpbjMyLmgiCi0KLSNpZm5kZWYgSU5WQUxJRF9IQU5ETEVfVkFMVUUKLSNkZWZpbmUgSU5WQUxJRF9IQU5ETEVfVkFMVUUgKDB4RkZGRkZGRkYpCi0jZW5kaWYKLQotI2lmbmRlZiBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIKLSNkZWZpbmUgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICgoRFdPUkQpLTEpCi0jZW5kaWYKLQotdm9pZHBmIFpDQUxMQkFDSyB3aW4zMl9vcGVuX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICBpbnQgbW9kZSkpOwotCi11TG9uZyBaQ0FMTEJBQ0sgd2luMzJfcmVhZF9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0sCi0gICB2b2lkKiBidWYsCi0gICB1TG9uZyBzaXplKSk7Ci0KLXVMb25nIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0sCi0gICBjb25zdCB2b2lkKiBidWYsCi0gICB1TG9uZyBzaXplKSk7Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3RlbGxfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtKSk7Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWtfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtLAotICAgdUxvbmcgb2Zmc2V0LAotICAgaW50IG9yaWdpbikpOwotCi1pbnQgWkNBTExCQUNLIHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSkpOwotCi1pbnQgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSkpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIEhBTkRMRSBoZjsKLSAgICBpbnQgZXJyb3I7Ci19IFdJTjMyRklMRV9JT1dJTjsKLQotdm9pZHBmIFpDQUxMQkFDSyB3aW4zMl9vcGVuX2ZpbGVfZnVuYyAob3BhcXVlLCBmaWxlbmFtZSwgbW9kZSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgIGludCBtb2RlOwotewotICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOwotICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOwotICAgIEhBTkRMRSBoRmlsZSA9IDA7Ci0gICAgdm9pZHBmIHJldD1OVUxMOwotCi0gICAgZHdEZXNpcmVkQWNjZXNzID0gZHdTaGFyZU1vZGUgPSBkd0ZsYWdzQW5kQXR0cmlidXRlcyA9IDA7Ci0KLSAgICBpZiAoKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSKT09WkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQpCi0gICAgewotICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7Ci0gICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7Ci0gICAgICAgIGR3U2hhcmVNb2RlID0gRklMRV9TSEFSRV9SRUFEOwotICAgIH0KLSAgICBlbHNlCi0gICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpCi0gICAgewotICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFEOwotICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQotICAgIHsKLSAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsKLSAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKLSAgICB9Ci0KLSAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQotICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoKExQQ1RTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBkd0ZsYWdzQW5kQXR0cmlidXRlcywgTlVMTCk7Ci0KLSAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICAgIGhGaWxlID0gTlVMTDsKLQotICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgV0lOMzJGSUxFX0lPV0lOIHczMmZpb3c7Ci0gICAgICAgIHczMmZpb3cuaGYgPSBoRmlsZTsKLSAgICAgICAgdzMyZmlvdy5lcnJvciA9IDA7Ci0gICAgICAgIHJldCA9IG1hbGxvYyhzaXplb2YoV0lOMzJGSUxFX0lPV0lOKSk7Ci0gICAgICAgIGlmIChyZXQ9PU5VTEwpCi0gICAgICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0gICAgICAgIGVsc2UgKigoV0lOMzJGSUxFX0lPV0lOKilyZXQpID0gdzMyZmlvdzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi11TG9uZyBaQ0FMTEJBQ0sgd2luMzJfcmVhZF9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBidWYsIHNpemUpCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLSAgIHZvaWQqIGJ1ZjsKLSAgIHVMb25nIHNpemU7Ci17Ci0gICAgdUxvbmcgcmV0PTA7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgICAgICBpZiAoIVJlYWRGaWxlKGhGaWxlLCBidWYsIHNpemUsICZyZXQsIE5VTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOwotICAgICAgICAgICAgaWYgKGR3RXJyID09IEVSUk9SX0hBTkRMRV9FT0YpCi0gICAgICAgICAgICAgICAgZHdFcnIgPSAwOwotICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotCi11TG9uZyBaQ0FMTEJBQ0sgd2luMzJfd3JpdGVfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci0gICBjb25zdCB2b2lkKiBidWY7Ci0gICB1TG9uZyBzaXplOwotewotICAgIHVMb25nIHJldD0wOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKLQotICAgIGlmIChoRmlsZSAhPU5VTEwpCi0gICAgICAgIGlmICghV3JpdGVGaWxlKGhGaWxlLCBidWYsIHNpemUsICZyZXQsIE5VTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOwotICAgICAgICAgICAgaWYgKGR3RXJyID09IEVSUk9SX0hBTkRMRV9FT0YpCi0gICAgICAgICAgICAgICAgZHdFcnIgPSAwOwotICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotbG9uZyBaQ0FMTEJBQ0sgd2luMzJfdGVsbF9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci17Ci0gICAgbG9uZyByZXQ9LTE7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgTlVMTCwgRklMRV9DVVJSRU5UKTsKLSAgICAgICAgaWYgKGR3U2V0ID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXQ9KGxvbmcpZHdTZXQ7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWtfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLSAgIHVMb25nIG9mZnNldDsKLSAgIGludCBvcmlnaW47Ci17Ci0gICAgRFdPUkQgZHdNb3ZlTWV0aG9kPTB4RkZGRkZGRkY7Ci0gICAgSEFORExFIGhGaWxlID0gTlVMTDsKLQotICAgIGxvbmcgcmV0PS0xOwotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7Ci0gICAgc3dpdGNoIChvcmlnaW4pCi0gICAgewotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6Ci0gICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfQ1VSUkVOVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKLSAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9FTkQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6Ci0gICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfQkVHSU47Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERXT1JEIGR3U2V0ID0gU2V0RmlsZVBvaW50ZXIoaEZpbGUsIG9mZnNldCwgTlVMTCwgZHdNb3ZlTWV0aG9kKTsKLSAgICAgICAgaWYgKGR3U2V0ID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXQ9MDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci17Ci0gICAgaW50IHJldD0tMTsKLQotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgewotICAgICAgICBIQU5ETEUgaEZpbGU7Ci0gICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7Ci0gICAgICAgIGlmIChoRmlsZSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0gICAgICAgICAgICByZXQ9MDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHN0cmVhbSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaQ0FMTEJBQ0sgd2luMzJfZXJyb3JfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotewotICAgIGludCByZXQ9LTE7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICB7Ci0gICAgICAgIHJldCA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmMgKHB6bGliX2ZpbGVmdW5jX2RlZikKLSAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLXsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuX2ZpbGUgPSB3aW4zMl9vcGVuX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSB3aW4zMl9yZWFkX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gd2luMzJfd3JpdGVfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGxfZmlsZSA9IHdpbjMyX3RlbGxfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWtfZmlsZSA9IHdpbjMyX3NlZWtfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSB3aW4zMl9jbG9zZV9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZT1OVUxMOwotfQorLyogaW93aW4zMi5jIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXANCisgICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQ0KKyAgIFRoaXMgSU8gQVBJIHZlcnNpb24gdXNlcyB0aGUgV2luMzIgQVBJIChmb3IgTWljcm9zb2Z0IFdpbmRvd3MpDQorDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorKi8NCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorDQorI2luY2x1ZGUgInpsaWIuaCINCisjaW5jbHVkZSAiaW9hcGkuaCINCisjaW5jbHVkZSAiaW93aW4zMi5oIg0KKw0KKyNpZm5kZWYgSU5WQUxJRF9IQU5ETEVfVkFMVUUNCisjZGVmaW5lIElOVkFMSURfSEFORExFX1ZBTFVFICgweEZGRkZGRkZGKQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSDQorI2RlZmluZSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIgKChEV09SRCktMSkNCisjZW5kaWYNCisNCit2b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW5fZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLA0KKyAgIGludCBtb2RlKSk7DQorDQordUxvbmcgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIHZvaWRwZiBzdHJlYW0sDQorICAgdm9pZCogYnVmLA0KKyAgIHVMb25nIHNpemUpKTsNCisNCit1TG9uZyBaQ0FMTEJBQ0sgd2luMzJfd3JpdGVfZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIHZvaWRwZiBzdHJlYW0sDQorICAgY29uc3Qgdm9pZCogYnVmLA0KKyAgIHVMb25nIHNpemUpKTsNCisNCitsb25nIFpDQUxMQkFDSyB3aW4zMl90ZWxsX2ZpbGVfZnVuYyBPRigoDQorICAgdm9pZHBmIG9wYXF1ZSwNCisgICB2b2lkcGYgc3RyZWFtKSk7DQorDQorbG9uZyBaQ0FMTEJBQ0sgd2luMzJfc2Vla19maWxlX2Z1bmMgT0YoKA0KKyAgIHZvaWRwZiBvcGFxdWUsDQorICAgdm9pZHBmIHN0cmVhbSwNCisgICB1TG9uZyBvZmZzZXQsDQorICAgaW50IG9yaWdpbikpOw0KKw0KK2ludCBaQ0FMTEJBQ0sgd2luMzJfY2xvc2VfZmlsZV9mdW5jIE9GKCgNCisgICB2b2lkcGYgb3BhcXVlLA0KKyAgIHZvaWRwZiBzdHJlYW0pKTsNCisNCitpbnQgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyBPRigoDQorICAgdm9pZHBmIG9wYXF1ZSwNCisgICB2b2lkcGYgc3RyZWFtKSk7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIEhBTkRMRSBoZjsNCisgICAgaW50IGVycm9yOw0KK30gV0lOMzJGSUxFX0lPV0lOOw0KKw0KK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgKG9wYXF1ZSwgZmlsZW5hbWUsIG1vZGUpDQorICAgdm9pZHBmIG9wYXF1ZTsNCisgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsNCisgICBpbnQgbW9kZTsNCit7DQorICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOw0KKyAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLGR3U2hhcmVNb2RlLGR3RmxhZ3NBbmRBdHRyaWJ1dGVzIDsNCisgICAgSEFORExFIGhGaWxlID0gMDsNCisgICAgdm9pZHBmIHJldD1OVUxMOw0KKw0KKyAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBkd1NoYXJlTW9kZSA9IGR3RmxhZ3NBbmRBdHRyaWJ1dGVzID0gMDsNCisNCisgICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQ0KKyAgICB7DQorICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7DQorICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOw0KKyAgICAgICAgZHdTaGFyZU1vZGUgPSBGSUxFX1NIQVJFX1JFQUQ7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykNCisgICAgew0KKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsNCisgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpDQorICAgIHsNCisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQ7DQorICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBDUkVBVEVfQUxXQVlTOw0KKyAgICB9DQorDQorICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChkd0Rlc2lyZWRBY2Nlc3MgIT0gMCkpDQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoKExQQ1RTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOw0KKw0KKyAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgICAgICBoRmlsZSA9IE5VTEw7DQorDQorICAgIGlmIChoRmlsZSAhPSBOVUxMKQ0KKyAgICB7DQorICAgICAgICBXSU4zMkZJTEVfSU9XSU4gdzMyZmlvdzsNCisgICAgICAgIHczMmZpb3cuaGYgPSBoRmlsZTsNCisgICAgICAgIHczMmZpb3cuZXJyb3IgPSAwOw0KKyAgICAgICAgcmV0ID0gbWFsbG9jKHNpemVvZihXSU4zMkZJTEVfSU9XSU4pKTsNCisgICAgICAgIGlmIChyZXQ9PU5VTEwpDQorICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOw0KKyAgICAgICAgZWxzZSAqKChXSU4zMkZJTEVfSU9XSU4qKXJldCkgPSB3MzJmaW93Ow0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KKw0KK3VMb25nIFpDQUxMQkFDSyB3aW4zMl9yZWFkX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkNCisgICB2b2lkcGYgb3BhcXVlOw0KKyAgIHZvaWRwZiBzdHJlYW07DQorICAgdm9pZCogYnVmOw0KKyAgIHVMb25nIHNpemU7DQorew0KKyAgICB1TG9uZyByZXQ9MDsNCisgICAgSEFORExFIGhGaWxlID0gTlVMTDsNCisgICAgaWYgKHN0cmVhbSE9TlVMTCkNCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7DQorICAgIGlmIChoRmlsZSAhPSBOVUxMKQ0KKyAgICAgICAgaWYgKCFSZWFkRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOw0KKyAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQ0KKyAgICAgICAgICAgICAgICBkd0VyciA9IDA7DQorICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsNCisgICAgICAgIH0NCisNCisgICAgcmV0dXJuIHJldDsNCit9DQorDQorDQordUxvbmcgWkNBTExCQUNLIHdpbjMyX3dyaXRlX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkNCisgICB2b2lkcGYgb3BhcXVlOw0KKyAgIHZvaWRwZiBzdHJlYW07DQorICAgY29uc3Qgdm9pZCogYnVmOw0KKyAgIHVMb25nIHNpemU7DQorew0KKyAgICB1TG9uZyByZXQ9MDsNCisgICAgSEFORExFIGhGaWxlID0gTlVMTDsNCisgICAgaWYgKHN0cmVhbSE9TlVMTCkNCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7DQorDQorICAgIGlmIChoRmlsZSAhPU5VTEwpDQorICAgICAgICBpZiAoIVdyaXRlRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOw0KKyAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQ0KKyAgICAgICAgICAgICAgICBkd0VyciA9IDA7DQorICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsNCisgICAgICAgIH0NCisNCisgICAgcmV0dXJuIHJldDsNCit9DQorDQorbG9uZyBaQ0FMTEJBQ0sgd2luMzJfdGVsbF9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQ0KKyAgIHZvaWRwZiBvcGFxdWU7DQorICAgdm9pZHBmIHN0cmVhbTsNCit7DQorICAgIGxvbmcgcmV0PS0xOw0KKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOw0KKyAgICBpZiAoc3RyZWFtIT1OVUxMKQ0KKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsNCisgICAgaWYgKGhGaWxlICE9IE5VTEwpDQorICAgIHsNCisgICAgICAgIERXT1JEIGR3U2V0ID0gU2V0RmlsZVBvaW50ZXIoaEZpbGUsIDAsIE5VTEwsIEZJTEVfQ1VSUkVOVCk7DQorICAgICAgICBpZiAoZHdTZXQgPT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7DQorICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsNCisgICAgICAgICAgICByZXQgPSAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXQ9KGxvbmcpZHdTZXQ7DQorICAgIH0NCisgICAgcmV0dXJuIHJldDsNCit9DQorDQorbG9uZyBaQ0FMTEJBQ0sgd2luMzJfc2Vla19maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikNCisgICB2b2lkcGYgb3BhcXVlOw0KKyAgIHZvaWRwZiBzdHJlYW07DQorICAgdUxvbmcgb2Zmc2V0Ow0KKyAgIGludCBvcmlnaW47DQorew0KKyAgICBEV09SRCBkd01vdmVNZXRob2Q9MHhGRkZGRkZGRjsNCisgICAgSEFORExFIGhGaWxlID0gTlVMTDsNCisNCisgICAgbG9uZyByZXQ9LTE7DQorICAgIGlmIChzdHJlYW0hPU5VTEwpDQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOw0KKyAgICBzd2l0Y2ggKG9yaWdpbikNCisgICAgew0KKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOg0KKyAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9DVVJSRU5UOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6DQorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOg0KKyAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsNCisgICAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKGhGaWxlICE9IE5VTEwpDQorICAgIHsNCisgICAgICAgIERXT1JEIGR3U2V0ID0gU2V0RmlsZVBvaW50ZXIoaEZpbGUsIG9mZnNldCwgTlVMTCwgZHdNb3ZlTWV0aG9kKTsNCisgICAgICAgIGlmIChkd1NldCA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpDQorICAgICAgICB7DQorICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsNCisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOw0KKyAgICAgICAgICAgIHJldCA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldD0wOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK2ludCBaQ0FMTEJBQ0sgd2luMzJfY2xvc2VfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkNCisgICB2b2lkcGYgb3BhcXVlOw0KKyAgIHZvaWRwZiBzdHJlYW07DQorew0KKyAgICBpbnQgcmV0PS0xOw0KKw0KKyAgICBpZiAoc3RyZWFtIT1OVUxMKQ0KKyAgICB7DQorICAgICAgICBIQU5ETEUgaEZpbGU7DQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOw0KKyAgICAgICAgaWYgKGhGaWxlICE9IE5VTEwpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOw0KKyAgICAgICAgICAgIHJldD0wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZnJlZShzdHJlYW0pOw0KKyAgICB9DQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK2ludCBaQ0FMTEJBQ0sgd2luMzJfZXJyb3JfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkNCisgICB2b2lkcGYgb3BhcXVlOw0KKyAgIHZvaWRwZiBzdHJlYW07DQorew0KKyAgICBpbnQgcmV0PS0xOw0KKyAgICBpZiAoc3RyZWFtIT1OVUxMKQ0KKyAgICB7DQorICAgICAgICByZXQgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcjsNCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmMgKHB6bGliX2ZpbGVmdW5jX2RlZikNCisgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7DQorew0KKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuX2ZpbGUgPSB3aW4zMl9vcGVuX2ZpbGVfZnVuYzsNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7DQorICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7DQorICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGxfZmlsZSA9IHdpbjMyX3RlbGxfZmlsZV9mdW5jOw0KKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrX2ZpbGUgPSB3aW4zMl9zZWVrX2ZpbGVfZnVuYzsNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsNCisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWU9TlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL2lvd2luMzIuaCBiL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmgKaW5kZXggODc3NGZlNy4uZTljNWY4YiAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL2lvd2luMzIuaAorKysgYi9jb250cmliL21pbml6aXAvaW93aW4zMi5oCkBAIC0xLDIxICsxLDIxIEBACi0vKiBpb3dpbjMyLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAotICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkKLSAgIFRoaXMgSU8gQVBJIHZlcnNpb24gdXNlcyB0aGUgV2luMzIgQVBJIChmb3IgTWljcm9zb2Z0IFdpbmRvd3MpCi0KLSAgIFZlcnNpb24gMS4wMSwgTWF5IDh0aCwgMjAwNAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudAotKi8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgZmlsbF93aW4zMl9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgorLyogaW93aW4zMi5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXANCisgICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQ0KKyAgIFRoaXMgSU8gQVBJIHZlcnNpb24gdXNlcyB0aGUgV2luMzIgQVBJIChmb3IgTWljcm9zb2Z0IFdpbmRvd3MpDQorDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorKi8NCisNCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvbWluaXVuei5jIGIvY29udHJpYi9taW5pemlwL21pbml1bnouYwppbmRleCBhNmIwNmEyLi44MmQ4NzAyIDEwMDY0NAotLS0gYS9jb250cmliL21pbml6aXAvbWluaXVuei5jCisrKyBiL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKQEAgLTEsNTg1ICsxLDU4NSBAQAotLyoKLSAgIG1pbml1bnouYwotICAgVmVyc2lvbiAxLjAxYiwgTWF5IDMwdGgsIDIwMDQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQKLSovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2lmZGVmIHVuaXgKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGluY2x1ZGUgPHV0aW1lLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSMgaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAidW56aXAuaCIKLQotI2RlZmluZSBDQVNFU0VOU0lUSVZJVFkgKDApCi0jZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoODE5MikKLSNkZWZpbmUgTUFYRklMRU5BTUUgKDI1NikKLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIFVTRVdJTjMySU9BUEkKLSNpbmNsdWRlICJpb3dpbjMyLmgiCi0jZW5kaWYKLS8qCi0gIG1pbmkgdW56aXAsIGRlbW8gb2YgdW56aXAgcGFja2FnZQotCi0gIHVzYWdlIDoKLSAgVXNhZ2UgOiBtaW5pdW56IFstZXh2bG9dIGZpbGUuemlwIFtmaWxlX3RvX2V4dHJhY3RdIFstZCBleHRyYWN0ZGlyXQotCi0gIGxpc3QgdGhlIGZpbGUgaW4gdGhlIHppcGZpbGUsIGFuZCBwcmludCB0aGUgY29udGVudCBvZiBGSUxFX0lELlpJUCBvciBSRUFETUUuVFhUCi0gICAgaWYgaXQgZXhpc3RzCi0qLwotCi0KLS8qIGNoYW5nZV9maWxlX2RhdGUgOiBjaGFuZ2UgdGhlIGRhdGUvdGltZSBvZiBhIGZpbGUKLSAgICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSBkYXRlL3RpbWUgbXVzdCBiZSBtb2RpZmllZAotICAgIGRvc2RhdGUgOiB0aGUgbmV3IGRhdGUgYXQgdGhlIE1TRG9zIGZvcm1hdCAoNCBieXRlcykKLSAgICB0bXVfZGF0ZSA6IHRoZSBTQU1FIG5ldyBkYXRlIGF0IHRoZSB0bV91bnogZm9ybWF0ICovCi12b2lkIGNoYW5nZV9maWxlX2RhdGUoZmlsZW5hbWUsZG9zZGF0ZSx0bXVfZGF0ZSkKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICB1TG9uZyBkb3NkYXRlOwotICAgIHRtX3VueiB0bXVfZGF0ZTsKLXsKLSNpZmRlZiBXSU4zMgotICBIQU5ETEUgaEZpbGU7Ci0gIEZJTEVUSU1FIGZ0bSxmdExvY2FsLGZ0Q3JlYXRlLGZ0TGFzdEFjYyxmdExhc3RXcml0ZTsKLQotICBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAwLE5VTEwsT1BFTl9FWElTVElORywwLE5VTEwpOwotICBHZXRGaWxlVGltZShoRmlsZSwmZnRDcmVhdGUsJmZ0TGFzdEFjYywmZnRMYXN0V3JpdGUpOwotICBEb3NEYXRlVGltZVRvRmlsZVRpbWUoKFdPUkQpKGRvc2RhdGU+PjE2KSwoV09SRClkb3NkYXRlLCZmdExvY2FsKTsKLSAgTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmZ0TG9jYWwsJmZ0bSk7Ci0gIFNldEZpbGVUaW1lKGhGaWxlLCZmdG0sJmZ0TGFzdEFjYywmZnRtKTsKLSAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotI2Vsc2UKLSNpZmRlZiB1bml4Ci0gIHN0cnVjdCB1dGltYnVmIHV0OwotICBzdHJ1Y3QgdG0gbmV3ZGF0ZTsKLSAgbmV3ZGF0ZS50bV9zZWMgPSB0bXVfZGF0ZS50bV9zZWM7Ci0gIG5ld2RhdGUudG1fbWluPXRtdV9kYXRlLnRtX21pbjsKLSAgbmV3ZGF0ZS50bV9ob3VyPXRtdV9kYXRlLnRtX2hvdXI7Ci0gIG5ld2RhdGUudG1fbWRheT10bXVfZGF0ZS50bV9tZGF5OwotICBuZXdkYXRlLnRtX21vbj10bXVfZGF0ZS50bV9tb247Ci0gIGlmICh0bXVfZGF0ZS50bV95ZWFyID4gMTkwMCkKLSAgICAgIG5ld2RhdGUudG1feWVhcj10bXVfZGF0ZS50bV95ZWFyIC0gMTkwMDsKLSAgZWxzZQotICAgICAgbmV3ZGF0ZS50bV95ZWFyPXRtdV9kYXRlLnRtX3llYXIgOwotICBuZXdkYXRlLnRtX2lzZHN0PS0xOwotCi0gIHV0LmFjdGltZT11dC5tb2R0aW1lPW1rdGltZSgmbmV3ZGF0ZSk7Ci0gIHV0aW1lKGZpbGVuYW1lLCZ1dCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi0KLS8qIG15bWtkaXIgYW5kIGNoYW5nZV9maWxlX2RhdGUgYXJlIG5vdCAxMDAgJSBwb3J0YWJsZQotICAgQXMgSSBkb24ndCBrbm93IHdlbGwgVW5peCwgSSB3YWl0IGZlZWRiYWNrIGZvciB0aGUgdW5peCBwb3J0aW9uICovCi0KLWludCBteW1rZGlyKGRpcm5hbWUpCi0gICAgY29uc3QgY2hhciogZGlybmFtZTsKLXsKLSAgICBpbnQgcmV0PTA7Ci0jaWZkZWYgV0lOMzIKLSAgICByZXQgPSBta2RpcihkaXJuYW1lKTsKLSNlbHNlCi0jaWZkZWYgdW5peAotICAgIHJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOwotI2VuZGlmCi0jZW5kaWYKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgbWFrZWRpciAobmV3ZGlyKQotICAgIGNoYXIgKm5ld2RpcjsKLXsKLSAgY2hhciAqYnVmZmVyIDsKLSAgY2hhciAqcDsKLSAgaW50ICBsZW4gPSAoaW50KXN0cmxlbihuZXdkaXIpOwotCi0gIGlmIChsZW4gPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICBidWZmZXIgPSAoY2hhciopbWFsbG9jKGxlbisxKTsKLSAgc3RyY3B5KGJ1ZmZlcixuZXdkaXIpOwotCi0gIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgewotICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOwotICB9Ci0gIGlmIChteW1rZGlyKGJ1ZmZlcikgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcCA9IGJ1ZmZlcisxOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyIGhvbGQ7Ci0KLSAgICAgIHdoaWxlKCpwICYmICpwICE9ICdcXCcgJiYgKnAgIT0gJy8nKQotICAgICAgICBwKys7Ci0gICAgICBob2xkID0gKnA7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBpZiAoKG15bWtkaXIoYnVmZmVyKSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwcmludGYoImNvdWxkbid0IGNyZWF0ZSBkaXJlY3RvcnkgJXNcbiIsYnVmZmVyKTsKLSAgICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgIGlmIChob2xkID09IDApCi0gICAgICAgIGJyZWFrOwotICAgICAgKnArKyA9IGhvbGQ7Ci0gICAgfQotICBmcmVlKGJ1ZmZlcik7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIGRvX2Jhbm5lcigpCi17Ci0gICAgcHJpbnRmKCJNaW5pVW56IDEuMDFiLCBkZW1vIG9mIHpMaWIgKyBVbnogcGFja2FnZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50XG4iKTsKLSAgICBwcmludGYoIm1vcmUgaW5mbyBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWxcblxuIik7Ci19Ci0KLXZvaWQgZG9faGVscCgpCi17Ci0gICAgcHJpbnRmKCJVc2FnZSA6IG1pbml1bnogWy1lXSBbLXhdIFstdl0gWy1sXSBbLW9dIFstcCBwYXNzd29yZF0gZmlsZS56aXAgW2ZpbGVfdG9fZXh0ci5dIFstZCBleHRyYWN0ZGlyXVxuXG4iIFwKLSAgICAgICAgICAgIiAgLWUgIEV4dHJhY3Qgd2l0aG91dCBwYXRobmFtZSAoanVuayBwYXRocylcbiIgXAotICAgICAgICAgICAiICAteCAgRXh0cmFjdCB3aXRoIHBhdGhuYW1lXG4iIFwKLSAgICAgICAgICAgIiAgLXYgIGxpc3QgZmlsZXNcbiIgXAotICAgICAgICAgICAiICAtbCAgbGlzdCBmaWxlc1xuIiBcCi0gICAgICAgICAgICIgIC1kICBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvXG4iIFwKLSAgICAgICAgICAgIiAgLW8gIG92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHByb21wdGluZ1xuIiBcCi0gICAgICAgICAgICIgIC1wICBleHRyYWN0IGNyeXB0ZWQgZmlsZSB1c2luZyBwYXNzd29yZFxuXG4iKTsKLX0KLQotCi1pbnQgZG9fbGlzdCh1ZikKLSAgICB1bnpGaWxlIHVmOwotewotICAgIHVMb25nIGk7Ci0gICAgdW56X2dsb2JhbF9pbmZvIGdpOwotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSB1bnpHZXRHbG9iYWxJbmZvICh1ZiwmZ2kpOwotICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsKLSAgICBwcmludGYoIiBMZW5ndGggIE1ldGhvZCAgIFNpemUgIFJhdGlvICAgRGF0ZSAgICBUaW1lICAgQ1JDLTMyICAgICBOYW1lXG4iKTsKLSAgICBwcmludGYoIiAtLS0tLS0gIC0tLS0tLSAgIC0tLS0gIC0tLS0tICAgLS0tLSAgICAtLS0tICAgLS0tLS0tICAgICAtLS0tXG4iKTsKLSAgICBmb3IgKGk9MDtpPGdpLm51bWJlcl9lbnRyeTtpKyspCi0gICAgewotICAgICAgICBjaGFyIGZpbGVuYW1lX2luemlwWzI1Nl07Ci0gICAgICAgIHVuel9maWxlX2luZm8gZmlsZV9pbmZvOwotICAgICAgICB1TG9uZyByYXRpbz0wOwotICAgICAgICBjb25zdCBjaGFyICpzdHJpbmdfbWV0aG9kOwotICAgICAgICBjaGFyIGNoYXJDcnlwdD0nICc7Ci0gICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbyh1ZiwmZmlsZV9pbmZvLGZpbGVuYW1lX2luemlwLHNpemVvZihmaWxlbmFtZV9pbnppcCksTlVMTCwwLE5VTEwsMCk7Ci0gICAgICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvXG4iLGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplPjApCi0gICAgICAgICAgICByYXRpbyA9IChmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplKjEwMCkvZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplOwotCi0gICAgICAgIC8qIGRpc3BsYXkgYSAnKicgaWYgdGhlIGZpbGUgaXMgY3J5cHRlZCAqLwotICAgICAgICBpZiAoKGZpbGVfaW5mby5mbGFnICYgMSkgIT0gMCkKLSAgICAgICAgICAgIGNoYXJDcnlwdD0nKic7Ci0KLSAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PTApCi0gICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJTdG9yZWQiOwotICAgICAgICBlbHNlCi0gICAgICAgIGlmIChmaWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT1aX0RFRkxBVEVEKQotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IGlMZXZlbD0odUludCkoKGZpbGVfaW5mby5mbGFnICYgMHg2KS8yKTsKLSAgICAgICAgICAgIGlmIChpTGV2ZWw9PTApCi0gICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6TiI7Ci0gICAgICAgICAgICBlbHNlIGlmIChpTGV2ZWw9PTEpCi0gICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6WCI7Ci0gICAgICAgICAgICBlbHNlIGlmICgoaUxldmVsPT0yKSB8fCAoaUxldmVsPT0zKSkKLSAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpGIjsgLyogMjpmYXN0ICwgMyA6IGV4dHJhIGZhc3QqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IlVua24uICI7Ci0KLSAgICAgICAgcHJpbnRmKCIlN2x1ICAlNnMlYyU3bHUgJTNsdSUlICAlMi4ybHUtJTIuMmx1LSUyLjJsdSAgJTIuMmx1OiUyLjJsdSAgJTguOGx4ICAgJXNcbiIsCi0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplLHN0cmluZ19tZXRob2QsCi0gICAgICAgICAgICAgICAgY2hhckNyeXB0LAotICAgICAgICAgICAgICAgIGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUsCi0gICAgICAgICAgICAgICAgcmF0aW8sCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tb24gKyAxLAotICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1fbWRheSwKLSAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX3llYXIgJSAxMDAsCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9ob3VyLCh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1fbWluLAotICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8uY3JjLGZpbGVuYW1lX2luemlwKTsKLSAgICAgICAgaWYgKChpKzEpPGdpLm51bWJlcl9lbnRyeSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsKLSAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLWludCBkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgscG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCi0gICAgdW56RmlsZSB1ZjsKLSAgICBjb25zdCBpbnQqIHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7Ci0gICAgaW50KiBwb3B0X292ZXJ3cml0ZTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICBjaGFyIGZpbGVuYW1lX2luemlwWzI1Nl07Ci0gICAgY2hhciogZmlsZW5hbWVfd2l0aG91dHBhdGg7Ci0gICAgY2hhciogcDsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICBGSUxFICpmb3V0PU5VTEw7Ci0gICAgdm9pZCogYnVmOwotICAgIHVJbnQgc2l6ZV9idWY7Ci0KLSAgICB1bnpfZmlsZV9pbmZvIGZpbGVfaW5mbzsKLSAgICB1TG9uZyByYXRpbz0wOwotICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbyh1ZiwmZmlsZV9pbmZvLGZpbGVuYW1lX2luemlwLHNpemVvZihmaWxlbmFtZV9pbnppcCksTlVMTCwwLE5VTEwsMCk7Ci0KLSAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgewotICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzaXplX2J1ZiA9IFdSSVRFQlVGRkVSU0laRTsKLSAgICBidWYgPSAodm9pZCopbWFsbG9jKHNpemVfYnVmKTsKLSAgICBpZiAoYnVmPT1OVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7Ci0gICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLSAgICB9Ci0KLSAgICBwID0gZmlsZW5hbWVfd2l0aG91dHBhdGggPSBmaWxlbmFtZV9pbnppcDsKLSAgICB3aGlsZSAoKCpwKSAhPSAnXDAnKQotICAgIHsKLSAgICAgICAgaWYgKCgoKnApPT0nLycpIHx8ICgoKnApPT0nXFwnKSkKLSAgICAgICAgICAgIGZpbGVuYW1lX3dpdGhvdXRwYXRoID0gcCsxOwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgaWYgKCgqZmlsZW5hbWVfd2l0aG91dHBhdGgpPT0nXDAnKQotICAgIHsKLSAgICAgICAgaWYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZGlyZWN0b3J5OiAlc1xuIixmaWxlbmFtZV9pbnppcCk7Ci0gICAgICAgICAgICBteW1rZGlyKGZpbGVuYW1lX2luemlwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjb25zdCBjaGFyKiB3cml0ZV9maWxlbmFtZTsKLSAgICAgICAgaW50IHNraXA9MDsKLQotICAgICAgICBpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkKLSAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfaW56aXA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfd2l0aG91dHBhdGg7Ci0KLSAgICAgICAgZXJyID0gdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQodWYscGFzc3dvcmQpOwotICAgICAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkXG4iLGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKCgqcG9wdF9vdmVyd3JpdGUpPT0wKSAmJiAoZXJyPT1VTlpfT0spKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIHJlcD0wOwotICAgICAgICAgICAgRklMRSogZnRlc3RleGlzdDsKLSAgICAgICAgICAgIGZ0ZXN0ZXhpc3QgPSBmb3Blbih3cml0ZV9maWxlbmFtZSwicmIiKTsKLSAgICAgICAgICAgIGlmIChmdGVzdGV4aXN0IT1OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZjbG9zZShmdGVzdGV4aXN0KTsKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0cy4gT3ZlcndyaXRlID8gW3ldZXMsIFtuXW8sIFtBXWxsOiAiLHdyaXRlX2ZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NhbmYoIiUxcyIsYW5zd2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXAgPT0gJ04nKQotICAgICAgICAgICAgICAgIHNraXAgPSAxOwotCi0gICAgICAgICAgICBpZiAocmVwID09ICdBJykKLSAgICAgICAgICAgICAgICAqcG9wdF9vdmVyd3JpdGU9MTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoc2tpcD09MCkgJiYgKGVycj09VU5aX09LKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm91dD1mb3Blbih3cml0ZV9maWxlbmFtZSwid2IiKTsKLQotICAgICAgICAgICAgLyogc29tZSB6aXBmaWxlIGRvbid0IGNvbnRhaW4gZGlyZWN0b3J5IGFsb25lIGJlZm9yZSBmaWxlICovCi0gICAgICAgICAgICBpZiAoKGZvdXQ9PU5VTEwpICYmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWVfd2l0aG91dHBhdGghPShjaGFyKilmaWxlbmFtZV9pbnppcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjPSooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk7Ci0gICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT0nXDAnOwotICAgICAgICAgICAgICAgIG1ha2VkaXIod3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk9YzsKLSAgICAgICAgICAgICAgICBmb3V0PWZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91dD09TlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIG9wZW5pbmcgJXNcbiIsd3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvdXQhPU5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiIGV4dHJhY3Rpbmc6ICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB1bnpSZWFkQ3VycmVudEZpbGUodWYsYnVmLHNpemVfYnVmKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyPDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpSZWFkQ3VycmVudEZpbGVcbiIsZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnI+MCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShidWYsZXJyLDEsZm91dCkhPTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gd3JpdGluZyBleHRyYWN0ZWQgZmlsZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChlcnI+MCk7Ci0gICAgICAgICAgICBpZiAoZm91dCkKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZvdXQpOwotCi0gICAgICAgICAgICBpZiAoZXJyPT0wKQotICAgICAgICAgICAgICAgIGNoYW5nZV9maWxlX2RhdGUod3JpdGVfZmlsZW5hbWUsZmlsZV9pbmZvLmRvc0RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2luZm8udG11X2RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpDbG9zZUN1cnJlbnRGaWxlICh1Zik7Ci0gICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56Q2xvc2VDdXJyZW50RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUodWYpOyAvKiBkb24ndCBsb3NlIHRoZSBlcnJvciAqLwotICAgIH0KLQotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLWludCBkb19leHRyYWN0KHVmLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQotICAgIHVuekZpbGUgdWY7Ci0gICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICB1TG9uZyBpOwotICAgIHVuel9nbG9iYWxfaW5mbyBnaTsKLSAgICBpbnQgZXJyOwotICAgIEZJTEUqIGZvdXQ9TlVMTDsKLQotICAgIGVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7Ci0gICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRHbG9iYWxJbmZvIFxuIixlcnIpOwotCi0gICAgZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQotICAgIHsKLSAgICAgICAgaWYgKGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYsJm9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdF9vdmVyd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKSAhPSBVTlpfT0spCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOwotICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBkb19leHRyYWN0X29uZWZpbGUodWYsZmlsZW5hbWUsb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCi0gICAgdW56RmlsZSB1ZjsKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgICBpbnQgb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoOwotICAgIGludCBvcHRfb3ZlcndyaXRlOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotewotICAgIGludCBlcnIgPSBVTlpfT0s7Ci0gICAgaWYgKHVuekxvY2F0ZUZpbGUodWYsZmlsZW5hbWUsQ0FTRVNFTlNJVElWSVRZKSE9VU5aX09LKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJmaWxlICVzIG5vdCBmb3VuZCBpbiB0aGUgemlwZmlsZVxuIixmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkgPT0gVU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAxOwotfQotCi0KLWludCBtYWluKGFyZ2MsYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgY29uc3QgY2hhciAqemlwZmlsZW5hbWU9TlVMTDsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZV90b19leHRyYWN0PU5VTEw7Ci0gICAgY29uc3QgY2hhciAqcGFzc3dvcmQ9TlVMTDsKLSAgICBjaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRSsxNl0gPSAiIjsKLSAgICBpbnQgaTsKLSAgICBpbnQgb3B0X2RvX2xpc3Q9MDsKLSAgICBpbnQgb3B0X2RvX2V4dHJhY3Q9MTsKLSAgICBpbnQgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGg9MDsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOwotICAgIGludCBvcHRfZXh0cmFjdGRpcj0wOwotICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU9TlVMTDsKLSAgICB1bnpGaWxlIHVmPU5VTEw7Ci0KLSAgICBkb19iYW5uZXIoKTsKLSAgICBpZiAoYXJnYz09MSkKLSAgICB7Ci0gICAgICAgIGRvX2hlbHAoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdsJykgfHwgKGM9PSdMJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fbGlzdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J3YnKSB8fCAoYz09J1YnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0neCcpIHx8IChjPT0nWCcpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3QgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdlJykgfHwgKGM9PSdFJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdkJykgfHwgKGM9PSdEJykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9leHRyYWN0ZGlyPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lPWFyZ3ZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWUgPSBhcmd2W2ldOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWxlbmFtZV90b19leHRyYWN0PT1OVUxMKSAmJiAoIW9wdF9leHRyYWN0ZGlyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX3RvX2V4dHJhY3QgPSBhcmd2W2ldIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh6aXBmaWxlbmFtZSE9TlVMTCkKLSAgICB7Ci0KLSMgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKLSAgICAgICAgemxpYl9maWxlZnVuY19kZWYgZmZ1bmM7Ci0jICAgICAgICBlbmRpZgotCi0gICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCB6aXBmaWxlbmFtZSxNQVhGSUxFTkFNRS0xKTsKLSAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgICAgICBmaWxlbmFtZV90cnlbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0jICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJCi0gICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMoJmZmdW5jKTsKLSAgICAgICAgdWYgPSB1bnpPcGVuMih6aXBmaWxlbmFtZSwmZmZ1bmMpOwotIyAgICAgICAgZWxzZQotICAgICAgICB1ZiA9IHVuek9wZW4oemlwZmlsZW5hbWUpOwotIyAgICAgICAgZW5kaWYKLSAgICAgICAgaWYgKHVmPT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7Ci0jICAgICAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICAgICAgdWYgPSB1bnpPcGVuMihmaWxlbmFtZV90cnksJmZmdW5jKTsKLSMgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB1ZiA9IHVuek9wZW4oZmlsZW5hbWVfdHJ5KTsKLSMgICAgICAgICAgICBlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHVmPT1OVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiAlcyBvciAlcy56aXBcbiIsemlwZmlsZW5hbWUsemlwZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcHJpbnRmKCIlcyBvcGVuZWRcbiIsZmlsZW5hbWVfdHJ5KTsKLQotICAgIGlmIChvcHRfZG9fbGlzdD09MSkKLSAgICAgICAgcmV0dXJuIGRvX2xpc3QodWYpOwotICAgIGVsc2UgaWYgKG9wdF9kb19leHRyYWN0PT0xKQotICAgIHsKLSAgICAgICAgaWYgKG9wdF9leHRyYWN0ZGlyICYmIGNoZGlyKGRpcm5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcHJpbnRmKCJFcnJvciBjaGFuZ2luZyBpbnRvICVzLCBhYm9ydGluZ1xuIiwgZGlybmFtZSk7Ci0gICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsZW5hbWVfdG9fZXh0cmFjdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIGRvX2V4dHJhY3QodWYsb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBkb19leHRyYWN0X29uZWZpbGUodWYsZmlsZW5hbWVfdG9fZXh0cmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCk7Ci0gICAgfQotICAgIHVuekNsb3NlQ3VycmVudEZpbGUodWYpOwotCi0gICAgcmV0dXJuIDA7Ci19CisvKg0KKyAgIG1pbml1bnouYw0KKyAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUNCisNCisgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudA0KKyovDQorDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSA8dGltZS5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKw0KKyNpZmRlZiB1bml4DQorIyBpbmNsdWRlIDx1bmlzdGQuaD4NCisjIGluY2x1ZGUgPHV0aW1lLmg+DQorI2Vsc2UNCisjIGluY2x1ZGUgPGRpcmVjdC5oPg0KKyMgaW5jbHVkZSA8aW8uaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAidW56aXAuaCINCisNCisjZGVmaW5lIENBU0VTRU5TSVRJVklUWSAoMCkNCisjZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoODE5MikNCisjZGVmaW5lIE1BWEZJTEVOQU1FICgyNTYpDQorDQorI2lmZGVmIFdJTjMyDQorI2RlZmluZSBVU0VXSU4zMklPQVBJDQorI2luY2x1ZGUgImlvd2luMzIuaCINCisjZW5kaWYNCisvKg0KKyAgbWluaSB1bnppcCwgZGVtbyBvZiB1bnppcCBwYWNrYWdlDQorDQorICB1c2FnZSA6DQorICBVc2FnZSA6IG1pbml1bnogWy1leHZsb10gZmlsZS56aXAgW2ZpbGVfdG9fZXh0cmFjdF0gWy1kIGV4dHJhY3RkaXJdDQorDQorICBsaXN0IHRoZSBmaWxlIGluIHRoZSB6aXBmaWxlLCBhbmQgcHJpbnQgdGhlIGNvbnRlbnQgb2YgRklMRV9JRC5aSVAgb3IgUkVBRE1FLlRYVA0KKyAgICBpZiBpdCBleGlzdHMNCisqLw0KKw0KKw0KKy8qIGNoYW5nZV9maWxlX2RhdGUgOiBjaGFuZ2UgdGhlIGRhdGUvdGltZSBvZiBhIGZpbGUNCisgICAgZmlsZW5hbWUgOiB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgZGF0ZS90aW1lIG11c3QgYmUgbW9kaWZpZWQNCisgICAgZG9zZGF0ZSA6IHRoZSBuZXcgZGF0ZSBhdCB0aGUgTVNEb3MgZm9ybWF0ICg0IGJ5dGVzKQ0KKyAgICB0bXVfZGF0ZSA6IHRoZSBTQU1FIG5ldyBkYXRlIGF0IHRoZSB0bV91bnogZm9ybWF0ICovDQordm9pZCBjaGFuZ2VfZmlsZV9kYXRlKGZpbGVuYW1lLGRvc2RhdGUsdG11X2RhdGUpDQorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOw0KKyAgICB1TG9uZyBkb3NkYXRlOw0KKyAgICB0bV91bnogdG11X2RhdGU7DQorew0KKyNpZmRlZiBXSU4zMg0KKyAgSEFORExFIGhGaWxlOw0KKyAgRklMRVRJTUUgZnRtLGZ0TG9jYWwsZnRDcmVhdGUsZnRMYXN0QWNjLGZ0TGFzdFdyaXRlOw0KKw0KKyAgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsDQorICAgICAgICAgICAgICAgICAgICAgIDAsTlVMTCxPUEVOX0VYSVNUSU5HLDAsTlVMTCk7DQorICBHZXRGaWxlVGltZShoRmlsZSwmZnRDcmVhdGUsJmZ0TGFzdEFjYywmZnRMYXN0V3JpdGUpOw0KKyAgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKChXT1JEKShkb3NkYXRlPj4xNiksKFdPUkQpZG9zZGF0ZSwmZnRMb2NhbCk7DQorICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZSgmZnRMb2NhbCwmZnRtKTsNCisgIFNldEZpbGVUaW1lKGhGaWxlLCZmdG0sJmZ0TGFzdEFjYywmZnRtKTsNCisgIENsb3NlSGFuZGxlKGhGaWxlKTsNCisjZWxzZQ0KKyNpZmRlZiB1bml4DQorICBzdHJ1Y3QgdXRpbWJ1ZiB1dDsNCisgIHN0cnVjdCB0bSBuZXdkYXRlOw0KKyAgbmV3ZGF0ZS50bV9zZWMgPSB0bXVfZGF0ZS50bV9zZWM7DQorICBuZXdkYXRlLnRtX21pbj10bXVfZGF0ZS50bV9taW47DQorICBuZXdkYXRlLnRtX2hvdXI9dG11X2RhdGUudG1faG91cjsNCisgIG5ld2RhdGUudG1fbWRheT10bXVfZGF0ZS50bV9tZGF5Ow0KKyAgbmV3ZGF0ZS50bV9tb249dG11X2RhdGUudG1fbW9uOw0KKyAgaWYgKHRtdV9kYXRlLnRtX3llYXIgPiAxOTAwKQ0KKyAgICAgIG5ld2RhdGUudG1feWVhcj10bXVfZGF0ZS50bV95ZWFyIC0gMTkwMDsNCisgIGVsc2UNCisgICAgICBuZXdkYXRlLnRtX3llYXI9dG11X2RhdGUudG1feWVhciA7DQorICBuZXdkYXRlLnRtX2lzZHN0PS0xOw0KKw0KKyAgdXQuYWN0aW1lPXV0Lm1vZHRpbWU9bWt0aW1lKCZuZXdkYXRlKTsNCisgIHV0aW1lKGZpbGVuYW1lLCZ1dCk7DQorI2VuZGlmDQorI2VuZGlmDQorfQ0KKw0KKw0KKy8qIG15bWtkaXIgYW5kIGNoYW5nZV9maWxlX2RhdGUgYXJlIG5vdCAxMDAgJSBwb3J0YWJsZQ0KKyAgIEFzIEkgZG9uJ3Qga25vdyB3ZWxsIFVuaXgsIEkgd2FpdCBmZWVkYmFjayBmb3IgdGhlIHVuaXggcG9ydGlvbiAqLw0KKw0KK2ludCBteW1rZGlyKGRpcm5hbWUpDQorICAgIGNvbnN0IGNoYXIqIGRpcm5hbWU7DQorew0KKyAgICBpbnQgcmV0PTA7DQorI2lmZGVmIFdJTjMyDQorICAgIHJldCA9IG1rZGlyKGRpcm5hbWUpOw0KKyNlbHNlDQorI2lmZGVmIHVuaXgNCisgICAgcmV0ID0gbWtkaXIgKGRpcm5hbWUsMDc3NSk7DQorI2VuZGlmDQorI2VuZGlmDQorICAgIHJldHVybiByZXQ7DQorfQ0KKw0KK2ludCBtYWtlZGlyIChuZXdkaXIpDQorICAgIGNoYXIgKm5ld2RpcjsNCit7DQorICBjaGFyICpidWZmZXIgOw0KKyAgY2hhciAqcDsNCisgIGludCAgbGVuID0gKGludClzdHJsZW4obmV3ZGlyKTsNCisNCisgIGlmIChsZW4gPD0gMCkNCisgICAgcmV0dXJuIDA7DQorDQorICBidWZmZXIgPSAoY2hhciopbWFsbG9jKGxlbisxKTsNCisgIHN0cmNweShidWZmZXIsbmV3ZGlyKTsNCisNCisgIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgew0KKyAgICBidWZmZXJbbGVuLTFdID0gJ1wwJzsNCisgIH0NCisgIGlmIChteW1rZGlyKGJ1ZmZlcikgPT0gMCkNCisgICAgew0KKyAgICAgIGZyZWUoYnVmZmVyKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKw0KKyAgcCA9IGJ1ZmZlcisxOw0KKyAgd2hpbGUgKDEpDQorICAgIHsNCisgICAgICBjaGFyIGhvbGQ7DQorDQorICAgICAgd2hpbGUoKnAgJiYgKnAgIT0gJ1xcJyAmJiAqcCAhPSAnLycpDQorICAgICAgICBwKys7DQorICAgICAgaG9sZCA9ICpwOw0KKyAgICAgICpwID0gMDsNCisgICAgICBpZiAoKG15bWtkaXIoYnVmZmVyKSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpDQorICAgICAgICB7DQorICAgICAgICAgIHByaW50ZigiY291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixidWZmZXIpOw0KKyAgICAgICAgICBmcmVlKGJ1ZmZlcik7DQorICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgIGlmIChob2xkID09IDApDQorICAgICAgICBicmVhazsNCisgICAgICAqcCsrID0gaG9sZDsNCisgICAgfQ0KKyAgZnJlZShidWZmZXIpOw0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KK3ZvaWQgZG9fYmFubmVyKCkNCit7DQorICAgIHByaW50ZigiTWluaVVueiAxLjAxYiwgZGVtbyBvZiB6TGliICsgVW56IHBhY2thZ2Ugd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudFxuIik7DQorICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsNCit9DQorDQordm9pZCBkb19oZWxwKCkNCit7DQorICAgIHByaW50ZigiVXNhZ2UgOiBtaW5pdW56IFstZV0gWy14XSBbLXZdIFstbF0gWy1vXSBbLXAgcGFzc3dvcmRdIGZpbGUuemlwIFtmaWxlX3RvX2V4dHIuXSBbLWQgZXh0cmFjdGRpcl1cblxuIiBcDQorICAgICAgICAgICAiICAtZSAgRXh0cmFjdCB3aXRob3V0IHBhdGhuYW1lIChqdW5rIHBhdGhzKVxuIiBcDQorICAgICAgICAgICAiICAteCAgRXh0cmFjdCB3aXRoIHBhdGhuYW1lXG4iIFwNCisgICAgICAgICAgICIgIC12ICBsaXN0IGZpbGVzXG4iIFwNCisgICAgICAgICAgICIgIC1sICBsaXN0IGZpbGVzXG4iIFwNCisgICAgICAgICAgICIgIC1kICBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvXG4iIFwNCisgICAgICAgICAgICIgIC1vICBvdmVyd3JpdGUgZmlsZXMgd2l0aG91dCBwcm9tcHRpbmdcbiIgXA0KKyAgICAgICAgICAgIiAgLXAgIGV4dHJhY3QgY3J5cHRlZCBmaWxlIHVzaW5nIHBhc3N3b3JkXG5cbiIpOw0KK30NCisNCisNCitpbnQgZG9fbGlzdCh1ZikNCisgICAgdW56RmlsZSB1ZjsNCit7DQorICAgIHVMb25nIGk7DQorICAgIHVuel9nbG9iYWxfaW5mbyBnaTsNCisgICAgaW50IGVycjsNCisNCisgICAgZXJyID0gdW56R2V0R2xvYmFsSW5mbyAodWYsJmdpKTsNCisgICAgaWYgKGVyciE9VU5aX09LKQ0KKyAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsNCisgICAgcHJpbnRmKCIgTGVuZ3RoICBNZXRob2QgICBTaXplICBSYXRpbyAgIERhdGUgICAgVGltZSAgIENSQy0zMiAgICAgTmFtZVxuIik7DQorICAgIHByaW50ZigiIC0tLS0tLSAgLS0tLS0tICAgLS0tLSAgLS0tLS0gICAtLS0tICAgIC0tLS0gICAtLS0tLS0gICAgIC0tLS1cbiIpOw0KKyAgICBmb3IgKGk9MDtpPGdpLm51bWJlcl9lbnRyeTtpKyspDQorICAgIHsNCisgICAgICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsNCisgICAgICAgIHVuel9maWxlX2luZm8gZmlsZV9pbmZvOw0KKyAgICAgICAgdUxvbmcgcmF0aW89MDsNCisgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ19tZXRob2Q7DQorICAgICAgICBjaGFyIGNoYXJDcnlwdD0nICc7DQorICAgICAgICBlcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm8odWYsJmZpbGVfaW5mbyxmaWxlbmFtZV9pbnppcCxzaXplb2YoZmlsZW5hbWVfaW56aXApLE5VTEwsMCxOVUxMLDApOw0KKyAgICAgICAgaWYgKGVyciE9VU5aX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEN1cnJlbnRGaWxlSW5mb1xuIixlcnIpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZT4wKQ0KKyAgICAgICAgICAgIHJhdGlvID0gKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUqMTAwKS9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU7DQorDQorICAgICAgICAvKiBkaXNwbGF5IGEgJyonIGlmIHRoZSBmaWxlIGlzIGNyeXB0ZWQgKi8NCisgICAgICAgIGlmICgoZmlsZV9pbmZvLmZsYWcgJiAxKSAhPSAwKQ0KKyAgICAgICAgICAgIGNoYXJDcnlwdD0nKic7DQorDQorICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09MCkNCisgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJTdG9yZWQiOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpDQorICAgICAgICB7DQorICAgICAgICAgICAgdUludCBpTGV2ZWw9KHVJbnQpKChmaWxlX2luZm8uZmxhZyAmIDB4NikvMik7DQorICAgICAgICAgICAgaWYgKGlMZXZlbD09MCkNCisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6TiI7DQorICAgICAgICAgICAgZWxzZSBpZiAoaUxldmVsPT0xKQ0KKyAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpYIjsNCisgICAgICAgICAgICBlbHNlIGlmICgoaUxldmVsPT0yKSB8fCAoaUxldmVsPT0zKSkNCisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6RiI7IC8qIDI6ZmFzdCAsIDMgOiBleHRyYSBmYXN0Ki8NCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJVbmtuLiAiOw0KKw0KKyAgICAgICAgcHJpbnRmKCIlN2x1ICAlNnMlYyU3bHUgJTNsdSUlICAlMi4ybHUtJTIuMmx1LSUyLjJsdSAgJTIuMmx1OiUyLjJsdSAgJTguOGx4ICAgJXNcbiIsDQorICAgICAgICAgICAgICAgIGZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSxzdHJpbmdfbWV0aG9kLA0KKyAgICAgICAgICAgICAgICBjaGFyQ3J5cHQsDQorICAgICAgICAgICAgICAgIGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUsDQorICAgICAgICAgICAgICAgIHJhdGlvLA0KKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsDQorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1fbWRheSwNCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV95ZWFyICUgMTAwLA0KKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sDQorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8uY3JjLGZpbGVuYW1lX2luemlwKTsNCisgICAgICAgIGlmICgoaSsxKTxnaS5udW1iZXJfZW50cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsNCisgICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCisNCitpbnQgZG9fZXh0cmFjdF9jdXJyZW50ZmlsZSh1Zixwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLHBvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQ0KKyAgICB1bnpGaWxlIHVmOw0KKyAgICBjb25zdCBpbnQqIHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7DQorICAgIGludCogcG9wdF9vdmVyd3JpdGU7DQorICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOw0KK3sNCisgICAgY2hhciBmaWxlbmFtZV9pbnppcFsyNTZdOw0KKyAgICBjaGFyKiBmaWxlbmFtZV93aXRob3V0cGF0aDsNCisgICAgY2hhciogcDsNCisgICAgaW50IGVycj1VTlpfT0s7DQorICAgIEZJTEUgKmZvdXQ9TlVMTDsNCisgICAgdm9pZCogYnVmOw0KKyAgICB1SW50IHNpemVfYnVmOw0KKw0KKyAgICB1bnpfZmlsZV9pbmZvIGZpbGVfaW5mbzsNCisgICAgdUxvbmcgcmF0aW89MDsNCisgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsNCisNCisgICAgaWYgKGVyciE9VU5aX09LKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsNCisgICAgICAgIHJldHVybiBlcnI7DQorICAgIH0NCisNCisgICAgc2l6ZV9idWYgPSBXUklURUJVRkZFUlNJWkU7DQorICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOw0KKyAgICBpZiAoYnVmPT1OVUxMKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsNCisgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsNCisgICAgfQ0KKw0KKyAgICBwID0gZmlsZW5hbWVfd2l0aG91dHBhdGggPSBmaWxlbmFtZV9pbnppcDsNCisgICAgd2hpbGUgKCgqcCkgIT0gJ1wwJykNCisgICAgew0KKyAgICAgICAgaWYgKCgoKnApPT0nLycpIHx8ICgoKnApPT0nXFwnKSkNCisgICAgICAgICAgICBmaWxlbmFtZV93aXRob3V0cGF0aCA9IHArMTsNCisgICAgICAgIHArKzsNCisgICAgfQ0KKw0KKyAgICBpZiAoKCpmaWxlbmFtZV93aXRob3V0cGF0aCk9PSdcMCcpDQorICAgIHsNCisgICAgICAgIGlmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZGlyZWN0b3J5OiAlc1xuIixmaWxlbmFtZV9pbnppcCk7DQorICAgICAgICAgICAgbXlta2RpcihmaWxlbmFtZV9pbnppcCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBjb25zdCBjaGFyKiB3cml0ZV9maWxlbmFtZTsNCisgICAgICAgIGludCBza2lwPTA7DQorDQorICAgICAgICBpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkNCisgICAgICAgICAgICB3cml0ZV9maWxlbmFtZSA9IGZpbGVuYW1lX2luemlwOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfd2l0aG91dHBhdGg7DQorDQorICAgICAgICBlcnIgPSB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCh1ZixwYXNzd29yZCk7DQorICAgICAgICBpZiAoZXJyIT1VTlpfT0spDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmRcbiIsZXJyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICgoKCpwb3B0X292ZXJ3cml0ZSk9PTApICYmIChlcnI9PVVOWl9PSykpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2hhciByZXA9MDsNCisgICAgICAgICAgICBGSUxFKiBmdGVzdGV4aXN0Ow0KKyAgICAgICAgICAgIGZ0ZXN0ZXhpc3QgPSBmb3Blbih3cml0ZV9maWxlbmFtZSwicmIiKTsNCisgICAgICAgICAgICBpZiAoZnRlc3RleGlzdCE9TlVMTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZjbG9zZShmdGVzdGV4aXN0KTsNCisgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsNCisgICAgICAgICAgICAgICAgICAgIGludCByZXQ7DQorDQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0cy4gT3ZlcndyaXRlID8gW3ldZXMsIFtuXW8sIFtBXWxsOiAiLHdyaXRlX2ZpbGVuYW1lKTsNCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjYW5mKCIlMXMiLGFuc3dlcik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpIA0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmVwID0gYW5zd2VyWzBdIDsNCisgICAgICAgICAgICAgICAgICAgIGlmICgocmVwPj0nYScpICYmIChyZXA8PSd6JykpDQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgd2hpbGUgKChyZXAhPSdZJykgJiYgKHJlcCE9J04nKSAmJiAocmVwIT0nQScpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHJlcCA9PSAnTicpDQorICAgICAgICAgICAgICAgIHNraXAgPSAxOw0KKw0KKyAgICAgICAgICAgIGlmIChyZXAgPT0gJ0EnKQ0KKyAgICAgICAgICAgICAgICAqcG9wdF9vdmVyd3JpdGU9MTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICgoc2tpcD09MCkgJiYgKGVycj09VU5aX09LKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3V0PWZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOw0KKw0KKyAgICAgICAgICAgIC8qIHNvbWUgemlwZmlsZSBkb24ndCBjb250YWluIGRpcmVjdG9yeSBhbG9uZSBiZWZvcmUgZmlsZSAqLw0KKyAgICAgICAgICAgIGlmICgoZm91dD09TlVMTCkgJiYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWVfd2l0aG91dHBhdGghPShjaGFyKilmaWxlbmFtZV9pbnppcCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjaGFyIGM9KihmaWxlbmFtZV93aXRob3V0cGF0aC0xKTsNCisgICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT0nXDAnOw0KKyAgICAgICAgICAgICAgICBtYWtlZGlyKHdyaXRlX2ZpbGVuYW1lKTsNCisgICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT1jOw0KKyAgICAgICAgICAgICAgICBmb3V0PWZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZm91dD09TlVMTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3Igb3BlbmluZyAlc1xuIix3cml0ZV9maWxlbmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGZvdXQhPU5VTEwpDQorICAgICAgICB7DQorICAgICAgICAgICAgcHJpbnRmKCIgZXh0cmFjdGluZzogJXNcbiIsd3JpdGVfZmlsZW5hbWUpOw0KKw0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBlcnIgPSB1bnpSZWFkQ3VycmVudEZpbGUodWYsYnVmLHNpemVfYnVmKTsNCisgICAgICAgICAgICAgICAgaWYgKGVycjwwKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpSZWFkQ3VycmVudEZpbGVcbiIsZXJyKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmIChlcnI+MCkNCisgICAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoYnVmLGVyciwxLGZvdXQpIT0xKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gd3JpdGluZyBleHRyYWN0ZWQgZmlsZVxuIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGVycj4wKTsNCisgICAgICAgICAgICBpZiAoZm91dCkNCisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmb3V0KTsNCisNCisgICAgICAgICAgICBpZiAoZXJyPT0wKQ0KKyAgICAgICAgICAgICAgICBjaGFuZ2VfZmlsZV9kYXRlKHdyaXRlX2ZpbGVuYW1lLGZpbGVfaW5mby5kb3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaW5mby50bXVfZGF0ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoZXJyPT1VTlpfT0spDQorICAgICAgICB7DQorICAgICAgICAgICAgZXJyID0gdW56Q2xvc2VDdXJyZW50RmlsZSAodWYpOw0KKyAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekNsb3NlQ3VycmVudEZpbGVcbiIsZXJyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7IC8qIGRvbid0IGxvc2UgdGhlIGVycm9yICovDQorICAgIH0NCisNCisgICAgZnJlZShidWYpOw0KKyAgICByZXR1cm4gZXJyOw0KK30NCisNCisNCitpbnQgZG9fZXh0cmFjdCh1ZixvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkNCisgICAgdW56RmlsZSB1ZjsNCisgICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsNCisgICAgaW50IG9wdF9vdmVyd3JpdGU7DQorICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOw0KK3sNCisgICAgdUxvbmcgaTsNCisgICAgdW56X2dsb2JhbF9pbmZvIGdpOw0KKyAgICBpbnQgZXJyOw0KKyAgICBGSUxFKiBmb3V0PU5VTEw7DQorDQorICAgIGVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7DQorICAgIGlmIChlcnIhPVVOWl9PSykNCisgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEdsb2JhbEluZm8gXG4iLGVycik7DQorDQorICAgIGZvciAoaT0wO2k8Z2kubnVtYmVyX2VudHJ5O2krKykNCisgICAgew0KKyAgICAgICAgaWYgKGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYsJm9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpICE9IFVOWl9PSykNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGlmICgoaSsxKTxnaS5udW1iZXJfZW50cnkpDQorICAgICAgICB7DQorICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsNCisgICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCitpbnQgZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQ0KKyAgICB1bnpGaWxlIHVmOw0KKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsNCisgICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsNCisgICAgaW50IG9wdF9vdmVyd3JpdGU7DQorICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOw0KK3sNCisgICAgaW50IGVyciA9IFVOWl9PSzsNCisgICAgaWYgKHVuekxvY2F0ZUZpbGUodWYsZmlsZW5hbWUsQ0FTRVNFTlNJVElWSVRZKSE9VU5aX09LKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImZpbGUgJXMgbm90IGZvdW5kIGluIHRoZSB6aXBmaWxlXG4iLGZpbGVuYW1lKTsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9DQorDQorICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKSA9PSBVTlpfT0spDQorICAgICAgICByZXR1cm4gMDsNCisgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIDE7DQorfQ0KKw0KKw0KK2ludCBtYWluKGFyZ2MsYXJndikNCisgICAgaW50IGFyZ2M7DQorICAgIGNoYXIgKmFyZ3ZbXTsNCit7DQorICAgIGNvbnN0IGNoYXIgKnppcGZpbGVuYW1lPU5VTEw7DQorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX3RvX2V4dHJhY3Q9TlVMTDsNCisgICAgY29uc3QgY2hhciAqcGFzc3dvcmQ9TlVMTDsNCisgICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdID0gIiI7DQorICAgIGludCBpOw0KKyAgICBpbnQgb3B0X2RvX2xpc3Q9MDsNCisgICAgaW50IG9wdF9kb19leHRyYWN0PTE7DQorICAgIGludCBvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aD0wOw0KKyAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOw0KKyAgICBpbnQgb3B0X2V4dHJhY3RkaXI9MDsNCisgICAgY29uc3QgY2hhciAqZGlybmFtZT1OVUxMOw0KKyAgICB1bnpGaWxlIHVmPU5VTEw7DQorDQorICAgIGRvX2Jhbm5lcigpOw0KKyAgICBpZiAoYXJnYz09MSkNCisgICAgew0KKyAgICAgICAgZG9faGVscCgpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBmb3IgKGk9MTtpPGFyZ2M7aSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsNCisNCisgICAgICAgICAgICAgICAgd2hpbGUgKCgqcCkhPSdcMCcpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbCcpIHx8IChjPT0nTCcpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J3YnKSB8fCAoYz09J1YnKSkNCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fbGlzdCA9IDE7DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSd4JykgfHwgKGM9PSdYJykpDQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3QgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nZScpIHx8IChjPT0nRScpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0ID0gb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGggPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGU9MTsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2QnKSB8fCAoYz09J0QnKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXh0cmFjdGRpcj0xOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWU9YXJndltpKzFdOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoYz09J3AnKSB8fCAoYz09J1AnKSkgJiYgKGkrMTxhcmdjKSkNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD1hcmd2W2krMV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZSA9PSBOVUxMKQ0KKyAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWUgPSBhcmd2W2ldOw0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoZmlsZW5hbWVfdG9fZXh0cmFjdD09TlVMTCkgJiYgKCFvcHRfZXh0cmFjdGRpcikpDQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfdG9fZXh0cmFjdCA9IGFyZ3ZbaV0gOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAoemlwZmlsZW5hbWUhPU5VTEwpDQorICAgIHsNCisNCisjICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJDQorICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiBmZnVuYzsNCisjICAgICAgICBlbmRpZg0KKw0KKyAgICAgICAgc3RybmNweShmaWxlbmFtZV90cnksIHppcGZpbGVuYW1lLE1BWEZJTEVOQU1FLTEpOw0KKyAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLw0KKyAgICAgICAgZmlsZW5hbWVfdHJ5WyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsNCisNCisjICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jKCZmZnVuYyk7DQorICAgICAgICB1ZiA9IHVuek9wZW4yKHppcGZpbGVuYW1lLCZmZnVuYyk7DQorIyAgICAgICAgZWxzZQ0KKyAgICAgICAgdWYgPSB1bnpPcGVuKHppcGZpbGVuYW1lKTsNCisjICAgICAgICBlbmRpZg0KKyAgICAgICAgaWYgKHVmPT1OVUxMKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmNhdChmaWxlbmFtZV90cnksIi56aXAiKTsNCisjICAgICAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQ0KKyAgICAgICAgICAgIHVmID0gdW56T3BlbjIoZmlsZW5hbWVfdHJ5LCZmZnVuYyk7DQorIyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB1ZiA9IHVuek9wZW4oZmlsZW5hbWVfdHJ5KTsNCisjICAgICAgICAgICAgZW5kaWYNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAodWY9PU5VTEwpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gJXMgb3IgJXMuemlwXG4iLHppcGZpbGVuYW1lLHppcGZpbGVuYW1lKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIHByaW50ZigiJXMgb3BlbmVkXG4iLGZpbGVuYW1lX3RyeSk7DQorDQorICAgIGlmIChvcHRfZG9fbGlzdD09MSkNCisgICAgICAgIHJldHVybiBkb19saXN0KHVmKTsNCisgICAgZWxzZSBpZiAob3B0X2RvX2V4dHJhY3Q9PTEpDQorICAgIHsNCisgICAgICAgIGlmIChvcHRfZXh0cmFjdGRpciAmJiBjaGRpcihkaXJuYW1lKSkgDQorICAgICAgICB7DQorICAgICAgICAgIHByaW50ZigiRXJyb3IgY2hhbmdpbmcgaW50byAlcywgYWJvcnRpbmdcbiIsIGRpcm5hbWUpOw0KKyAgICAgICAgICBleGl0KC0xKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChmaWxlbmFtZV90b19leHRyYWN0ID09IE5VTEwpDQorICAgICAgICAgICAgcmV0dXJuIGRvX2V4dHJhY3QodWYsb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgcmV0dXJuIGRvX2V4dHJhY3Rfb25lZmlsZSh1ZixmaWxlbmFtZV90b19leHRyYWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCk7DQorICAgIH0NCisgICAgdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7DQorDQorICAgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS9jb250cmliL21pbml6aXAvbWluaXppcC5jIGIvY29udHJpYi9taW5pemlwL21pbml6aXAuYwppbmRleCA5MThjMzIyLi43MGZlZTAyIDEwMDY0NAotLS0gYS9jb250cmliL21pbml6aXAvbWluaXppcC5jCisrKyBiL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKQEAgLTEsNDIwICsxLDQyMCBAQAotLyoKLSAgIG1pbml6aXAuYwotICAgVmVyc2lvbiAxLjAxYiwgTWF5IDMwdGgsIDIwMDQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQKLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZmRlZiB1bml4Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDx1dGltZS5oPgotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGRpcmVjdC5oPgotIyBpbmNsdWRlIDxpby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJ6aXAuaCIKLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIFVTRVdJTjMySU9BUEkKLSNpbmNsdWRlICJpb3dpbjMyLmgiCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUgV1JJVEVCVUZGRVJTSVpFICgxNjM4NCkKLSNkZWZpbmUgTUFYRklMRU5BTUUgKDI1NikKLQotI2lmZGVmIFdJTjMyCi11TG9uZyBmaWxldGltZShmLCB0bXppcCwgZHQpCi0gICAgY2hhciAqZjsgICAgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIHRvIGdldCBpbmZvIG9uICovCi0gICAgdG1femlwICp0bXppcDsgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlOiBhY2Nlc3MsIG1vZGlmaWMuIGFuZCBjcmVhdGlvbiB0aW1lcyAqLwotICAgIHVMb25nICpkdDsgICAgICAgICAgICAgLyogZG9zdGltZSAqLwotewotICBpbnQgcmV0ID0gMDsKLSAgewotICAgICAgRklMRVRJTUUgZnRMb2NhbDsKLSAgICAgIEhBTkRMRSBoRmluZDsKLSAgICAgIFdJTjMyX0ZJTkRfREFUQSAgZmYzMjsKLQotICAgICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKGYsJmZmMzIpOwotICAgICAgaWYgKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgewotICAgICAgICBGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmKGZmMzIuZnRMYXN0V3JpdGVUaW1lKSwmZnRMb2NhbCk7Ci0gICAgICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSgmZnRMb2NhbCwoKExQV09SRClkdCkrMSwoKExQV09SRClkdCkrMCk7Ci0gICAgICAgIEZpbmRDbG9zZShoRmluZCk7Ci0gICAgICAgIHJldCA9IDE7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLSNlbHNlCi0jaWZkZWYgdW5peAotdUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQotICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIHRvIGdldCBpbmZvIG9uICovCi0gICAgdG1femlwICp0bXppcDsgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCi0gICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCi17Ci0gIGludCByZXQ9MDsKLSAgc3RydWN0IHN0YXQgczsgICAgICAgIC8qIHJlc3VsdHMgb2Ygc3RhdCgpICovCi0gIHN0cnVjdCB0bSogZmlsZWRhdGU7Ci0gIHRpbWVfdCB0bV90PTA7Ci0KLSAgaWYgKHN0cmNtcChmLCItIikhPTApCi0gIHsKLSAgICBjaGFyIG5hbWVbTUFYRklMRU5BTUUrMV07Ci0gICAgaW50IGxlbiA9IHN0cmxlbihmKTsKLSAgICBpZiAobGVuID4gTUFYRklMRU5BTUUpCi0gICAgICBsZW4gPSBNQVhGSUxFTkFNRTsKLQotICAgIHN0cm5jcHkobmFtZSwgZixNQVhGSUxFTkFNRS0xKTsKLSAgICAvKiBzdHJuY3B5IGRvZXNudCBhcHBlbmQgdGhlIHRyYWlsaW5nIE5VTEwsIG9mIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuICovCi0gICAgbmFtZVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7Ci0KLSAgICBpZiAobmFtZVtsZW4gLSAxXSA9PSAnLycpCi0gICAgICBuYW1lW2xlbiAtIDFdID0gJ1wwJzsKLSAgICAvKiBub3QgYWxsIHN5c3RlbXMgYWxsb3cgc3RhdCdpbmcgYSBmaWxlIHdpdGggLyBhcHBlbmRlZCAqLwotICAgIGlmIChzdGF0KG5hbWUsJnMpPT0wKQotICAgIHsKLSAgICAgIHRtX3QgPSBzLnN0X210aW1lOwotICAgICAgcmV0ID0gMTsKLSAgICB9Ci0gIH0KLSAgZmlsZWRhdGUgPSBsb2NhbHRpbWUoJnRtX3QpOwotCi0gIHRtemlwLT50bV9zZWMgID0gZmlsZWRhdGUtPnRtX3NlYzsKLSAgdG16aXAtPnRtX21pbiAgPSBmaWxlZGF0ZS0+dG1fbWluOwotICB0bXppcC0+dG1faG91ciA9IGZpbGVkYXRlLT50bV9ob3VyOwotICB0bXppcC0+dG1fbWRheSA9IGZpbGVkYXRlLT50bV9tZGF5OwotICB0bXppcC0+dG1fbW9uICA9IGZpbGVkYXRlLT50bV9tb24gOwotICB0bXppcC0+dG1feWVhciA9IGZpbGVkYXRlLT50bV95ZWFyOwotCi0gIHJldHVybiByZXQ7Ci19Ci0jZWxzZQotdUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQotICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLwotICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZTogYWNjZXNzLCBtb2RpZmljLiBhbmQgY3JlYXRpb24gdGltZXMgKi8KLSAgICB1TG9uZyAqZHQ7ICAgICAgICAgICAgIC8qIGRvc3RpbWUgKi8KLXsKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmCi0KLQotCi0KLWludCBjaGVja19leGlzdF9maWxlKGZpbGVuYW1lKQotICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOwotewotICAgIEZJTEUqIGZ0ZXN0ZXhpc3Q7Ci0gICAgaW50IHJldCA9IDE7Ci0gICAgZnRlc3RleGlzdCA9IGZvcGVuKGZpbGVuYW1lLCJyYiIpOwotICAgIGlmIChmdGVzdGV4aXN0PT1OVUxMKQotICAgICAgICByZXQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZG9fYmFubmVyKCkKLXsKLSAgICBwcmludGYoIk1pbmlaaXAgMS4wMWIsIGRlbW8gb2YgekxpYiArIFppcCBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOwotICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsKLX0KLQotdm9pZCBkb19oZWxwKCkKLXsKLSAgICBwcmludGYoIlVzYWdlIDogbWluaXppcCBbLW9dIFstYV0gWy0wIHRvIC05XSBbLXAgcGFzc3dvcmRdIGZpbGUuemlwIFtmaWxlc190b19hZGRdXG5cbiIgXAotICAgICAgICAgICAiICAtbyAgT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUuemlwXG4iIFwKLSAgICAgICAgICAgIiAgLWEgIEFwcGVuZCB0byBleGlzdGluZyBmaWxlLnppcFxuIiBcCi0gICAgICAgICAgICIgIC0wICBTdG9yZSBvbmx5XG4iIFwKLSAgICAgICAgICAgIiAgLTEgIENvbXByZXNzIGZhc3RlclxuIiBcCi0gICAgICAgICAgICIgIC05ICBDb21wcmVzcyBiZXR0ZXJcblxuIik7Ci19Ci0KLS8qIGNhbGN1bGF0ZSB0aGUgQ1JDMzIgb2YgYSBmaWxlLAotICAgYmVjYXVzZSB0byBlbmNyeXB0IGEgZmlsZSwgd2UgbmVlZCBrbm93biB0aGUgQ1JDMzIgb2YgdGhlIGZpbGUgYmVmb3JlICovCi1pbnQgZ2V0RmlsZUNyYyhjb25zdCBjaGFyKiBmaWxlbmFtZWluemlwLHZvaWQqYnVmLHVuc2lnbmVkIGxvbmcgc2l6ZV9idWYsdW5zaWduZWQgbG9uZyogcmVzdWx0X2NyYykKLXsKLSAgIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX2NyYz0wOwotICAgaW50IGVycj1aSVBfT0s7Ci0gICBGSUxFICogZmluID0gZm9wZW4oZmlsZW5hbWVpbnppcCwicmIiKTsKLSAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9yZWFkID0gMDsKLSAgIHVuc2lnbmVkIGxvbmcgdG90YWxfcmVhZCA9IDA7Ci0gICBpZiAoZmluPT1OVUxMKQotICAgewotICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgIH0KLQotICAgIGlmIChlcnIgPT0gWklQX09LKQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBaSVBfT0s7Ci0gICAgICAgICAgICBzaXplX3JlYWQgPSAoaW50KWZyZWFkKGJ1ZiwxLHNpemVfYnVmLGZpbik7Ci0gICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpCi0gICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApCi0gICAgICAgICAgICAgICAgY2FsY3VsYXRlX2NyYyA9IGNyYzMyKGNhbGN1bGF0ZV9jcmMsYnVmLHNpemVfcmVhZCk7Ci0gICAgICAgICAgICB0b3RhbF9yZWFkICs9IHNpemVfcmVhZDsKLQotICAgICAgICB9IHdoaWxlICgoZXJyID09IFpJUF9PSykgJiYgKHNpemVfcmVhZD4wKSk7Ci0KLSAgICBpZiAoZmluKQotICAgICAgICBmY2xvc2UoZmluKTsKLQotICAgICpyZXN1bHRfY3JjPWNhbGN1bGF0ZV9jcmM7Ci0gICAgcHJpbnRmKCJmaWxlICVzIGNyYyAleFxuIixmaWxlbmFtZWluemlwLGNhbGN1bGF0ZV9jcmMpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBtYWluKGFyZ2MsYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgaW50IGk7Ci0gICAgaW50IG9wdF9vdmVyd3JpdGU9MDsKLSAgICBpbnQgb3B0X2NvbXByZXNzX2xldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTjsKLSAgICBpbnQgemlwZmlsZW5hbWVhcmcgPSAwOwotICAgIGNoYXIgZmlsZW5hbWVfdHJ5W01BWEZJTEVOQU1FKzE2XTsKLSAgICBpbnQgemlwb2s7Ci0gICAgaW50IGVycj0wOwotICAgIGludCBzaXplX2J1Zj0wOwotICAgIHZvaWQqIGJ1Zj1OVUxMOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkPU5VTEw7Ci0KLQotICAgIGRvX2Jhbm5lcigpOwotICAgIGlmIChhcmdjPT0xKQotICAgIHsKLSAgICAgICAgZG9faGVscCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpPTE7aTxhcmdjO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCgqYXJndltpXSk9PSctJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjPSoocCsrKTs7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J28nKSB8fCAoYz09J08nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdhJykgfHwgKGM9PSdBJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPj0nMCcpICYmIChjPD0nOScpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsID0gYy0nMCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoYz09J3AnKSB8fCAoYz09J1AnKSkgJiYgKGkrMTxhcmdjKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9YXJndltpKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZWFyZyA9PSAwKQotICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZWFyZyA9IGkgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZV9idWYgPSBXUklURUJVRkZFUlNJWkU7Ci0gICAgYnVmID0gKHZvaWQqKW1hbGxvYyhzaXplX2J1Zik7Ci0gICAgaWYgKGJ1Zj09TlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOwotICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKHppcGZpbGVuYW1lYXJnPT0wKQotICAgICAgICB6aXBvaz0wOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBpLGxlbjsKLSAgICAgICAgaW50IGRvdF9mb3VuZD0wOwotCi0gICAgICAgIHppcG9rID0gMSA7Ci0gICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCBhcmd2W3ppcGZpbGVuYW1lYXJnXSxNQVhGSUxFTkFNRS0xKTsKLSAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgICAgICBmaWxlbmFtZV90cnlbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0gICAgICAgIGxlbj0oaW50KXN0cmxlbihmaWxlbmFtZV90cnkpOwotICAgICAgICBmb3IgKGk9MDtpPGxlbjtpKyspCi0gICAgICAgICAgICBpZiAoZmlsZW5hbWVfdHJ5W2ldPT0nLicpCi0gICAgICAgICAgICAgICAgZG90X2ZvdW5kPTE7Ci0KLSAgICAgICAgaWYgKGRvdF9mb3VuZD09MCkKLSAgICAgICAgICAgIHN0cmNhdChmaWxlbmFtZV90cnksIi56aXAiKTsKLQotICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgdGhlIGZpbGUgZG9uJ3QgZXhpc3QsIHdlIG5vdCBhcHBlbmQgZmlsZSAqLwotICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KT09MCkKLSAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MCkKLSAgICAgICAgICAgIGlmIChjaGVja19leGlzdF9maWxlKGZpbGVuYW1lX3RyeSkhPTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciByZXA9MDsKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgZmlsZSAlcyBleGlzdHMuIE92ZXJ3cml0ZSA/IFt5XWVzLCBbbl1vLCBbYV1wcGVuZCA6ICIsZmlsZW5hbWVfdHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NhbmYoIiUxcyIsYW5zd2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcD09J04nKQotICAgICAgICAgICAgICAgICAgICB6aXBvayA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcD09J0EnKQotICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoemlwb2s9PTEpCi0gICAgewotICAgICAgICB6aXBGaWxlIHpmOwotICAgICAgICBpbnQgZXJyY2xvc2U7Ci0jICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJCi0gICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmIGZmdW5jOwotICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jKCZmZnVuYyk7Ci0gICAgICAgIHpmID0gemlwT3BlbjIoZmlsZW5hbWVfdHJ5LChvcHRfb3ZlcndyaXRlPT0yKSA/IDIgOiAwLE5VTEwsJmZmdW5jKTsKLSMgICAgICAgIGVsc2UKLSAgICAgICAgemYgPSB6aXBPcGVuKGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCk7Ci0jICAgICAgICBlbmRpZgotCi0gICAgICAgIGlmICh6ZiA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoImVycm9yIG9wZW5pbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKLSAgICAgICAgICAgIGVycj0gWklQX0VSUk5POwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKLQotICAgICAgICBmb3IgKGk9emlwZmlsZW5hbWVhcmcrMTsoaTxhcmdjKSAmJiAoZXJyPT1aSVBfT0spO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoKCgoKihhcmd2W2ldKSk9PSctJykgfHwgKCgqKGFyZ3ZbaV0pKT09Jy8nKSkgJiYKLSAgICAgICAgICAgICAgICAgICgoYXJndltpXVsxXT09J28nKSB8fCAoYXJndltpXVsxXT09J08nKSB8fAotICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0nYScpIHx8IChhcmd2W2ldWzFdPT0nQScpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGFyZ3ZbaV1bMV09PSdwJykgfHwgKGFyZ3ZbaV1bMV09PSdQJykgfHwKLSAgICAgICAgICAgICAgICAgICAoKGFyZ3ZbaV1bMV0+PScwJykgfHwgKGFyZ3ZbaV1bMV08PSc5JykpKSAmJgotICAgICAgICAgICAgICAgICAgKHN0cmxlbihhcmd2W2ldKSA9PSAyKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklMRSAqIGZpbjsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZV9yZWFkOwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1laW56aXAgPSBhcmd2W2ldOwotICAgICAgICAgICAgICAgIHppcF9maWxlaW5mbyB6aTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNyY0ZpbGU9MDsKLQotICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX3NlYyA9IHppLnRtel9kYXRlLnRtX21pbiA9IHppLnRtel9kYXRlLnRtX2hvdXIgPQotICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX21kYXkgPSB6aS50bXpfZGF0ZS50bV9tb24gPSB6aS50bXpfZGF0ZS50bV95ZWFyID0gMDsKLSAgICAgICAgICAgICAgICB6aS5kb3NEYXRlID0gMDsKLSAgICAgICAgICAgICAgICB6aS5pbnRlcm5hbF9mYSA9IDA7Ci0gICAgICAgICAgICAgICAgemkuZXh0ZXJuYWxfZmEgPSAwOwotICAgICAgICAgICAgICAgIGZpbGV0aW1lKGZpbGVuYW1laW56aXAsJnppLnRtel9kYXRlLCZ6aS5kb3NEYXRlKTsKLQotLyoKLSAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwKHpmLGZpbGVuYW1laW56aXAsJnppLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8gKiBjb21tZW50ICogLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCk7Ci0qLwotICAgICAgICAgICAgICAgIGlmICgocGFzc3dvcmQgIT0gTlVMTCkgJiYgKGVycj09WklQX09LKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0RmlsZUNyYyhmaWxlbmFtZWluemlwLGJ1ZixzaXplX2J1ZiwmY3JjRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwMyh6ZixmaWxlbmFtZWluemlwLCZ6aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCAvKiBjb21tZW50Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0X2NvbXByZXNzX2xldmVsICE9IDApID8gWl9ERUZMQVRFRCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLGNyY0ZpbGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBaSVBfT0spCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBpbiB6aXBmaWxlXG4iLGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbiA9IGZvcGVuKGZpbGVuYW1laW56aXAsInJiIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW49PU5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIG9wZW5pbmcgJXMgZm9yIHJlYWRpbmdcbiIsZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKLSAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX09LOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9yZWFkID0gKGludClmcmVhZChidWYsMSxzaXplX2J1ZixmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVfcmVhZCA8IHNpemVfYnVmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZW9mKGZpbik9PTApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiByZWFkaW5nICVzXG4iLGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVfcmVhZD4wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHppcFdyaXRlSW5GaWxlSW5aaXAgKHpmLGJ1ZixzaXplX3JlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnI8MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gd3JpdGluZyAlcyBpbiB0aGUgemlwZmlsZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZWluemlwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGVyciA9PSBaSVBfT0spICYmIChzaXplX3JlYWQ+MCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZpbikKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZpbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyPDApCi0gICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gemlwQ2xvc2VGaWxlSW5aaXAoemYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIT1aSVBfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIGNsb3NpbmcgJXMgaW4gdGhlIHppcGZpbGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZWluemlwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZXJyY2xvc2UgPSB6aXBDbG9zZSh6ZixOVUxMKTsKLSAgICAgICAgaWYgKGVycmNsb3NlICE9IFpJUF9PSykKLSAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gY2xvc2luZyAlc1xuIixmaWxlbmFtZV90cnkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIGRvX2hlbHAoKTsKLSAgICB9Ci0KLSAgICBmcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIDA7Ci19CisvKg0KKyAgIG1pbml6aXAuYw0KKyAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUNCisNCisgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudA0KKyovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSA8dGltZS5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKw0KKyNpZmRlZiB1bml4DQorIyBpbmNsdWRlIDx1bmlzdGQuaD4NCisjIGluY2x1ZGUgPHV0aW1lLmg+DQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+DQorI2Vsc2UNCisjIGluY2x1ZGUgPGRpcmVjdC5oPg0KKyMgaW5jbHVkZSA8aW8uaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiemlwLmgiDQorDQorI2lmZGVmIFdJTjMyDQorI2RlZmluZSBVU0VXSU4zMklPQVBJDQorI2luY2x1ZGUgImlvd2luMzIuaCINCisjZW5kaWYNCisNCisNCisNCisjZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoMTYzODQpDQorI2RlZmluZSBNQVhGSUxFTkFNRSAoMjU2KQ0KKw0KKyNpZmRlZiBXSU4zMg0KK3VMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkNCisgICAgY2hhciAqZjsgICAgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIHRvIGdldCBpbmZvIG9uICovDQorICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZTogYWNjZXNzLCBtb2RpZmljLiBhbmQgY3JlYXRpb24gdGltZXMgKi8NCisgICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovDQorew0KKyAgaW50IHJldCA9IDA7DQorICB7DQorICAgICAgRklMRVRJTUUgZnRMb2NhbDsNCisgICAgICBIQU5ETEUgaEZpbmQ7DQorICAgICAgV0lOMzJfRklORF9EQVRBICBmZjMyOw0KKw0KKyAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZShmLCZmZjMyKTsNCisgICAgICBpZiAoaEZpbmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgICAgew0KKyAgICAgICAgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJihmZjMyLmZ0TGFzdFdyaXRlVGltZSksJmZ0TG9jYWwpOw0KKyAgICAgICAgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKCZmdExvY2FsLCgoTFBXT1JEKWR0KSsxLCgoTFBXT1JEKWR0KSswKTsNCisgICAgICAgIEZpbmRDbG9zZShoRmluZCk7DQorICAgICAgICByZXQgPSAxOw0KKyAgICAgIH0NCisgIH0NCisgIHJldHVybiByZXQ7DQorfQ0KKyNlbHNlDQorI2lmZGVmIHVuaXgNCit1TG9uZyBmaWxldGltZShmLCB0bXppcCwgZHQpDQorICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIHRvIGdldCBpbmZvIG9uICovDQorICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgLyogcmV0dXJuIHZhbHVlOiBhY2Nlc3MsIG1vZGlmaWMuIGFuZCBjcmVhdGlvbiB0aW1lcyAqLw0KKyAgICB1TG9uZyAqZHQ7ICAgICAgICAgICAgIC8qIGRvc3RpbWUgKi8NCit7DQorICBpbnQgcmV0PTA7DQorICBzdHJ1Y3Qgc3RhdCBzOyAgICAgICAgLyogcmVzdWx0cyBvZiBzdGF0KCkgKi8NCisgIHN0cnVjdCB0bSogZmlsZWRhdGU7DQorICB0aW1lX3QgdG1fdD0wOw0KKw0KKyAgaWYgKHN0cmNtcChmLCItIikhPTApDQorICB7DQorICAgIGNoYXIgbmFtZVtNQVhGSUxFTkFNRSsxXTsNCisgICAgaW50IGxlbiA9IHN0cmxlbihmKTsNCisgICAgaWYgKGxlbiA+IE1BWEZJTEVOQU1FKQ0KKyAgICAgIGxlbiA9IE1BWEZJTEVOQU1FOw0KKw0KKyAgICBzdHJuY3B5KG5hbWUsIGYsTUFYRklMRU5BTUUtMSk7DQorICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8NCisgICAgbmFtZVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7DQorDQorICAgIGlmIChuYW1lW2xlbiAtIDFdID09ICcvJykNCisgICAgICBuYW1lW2xlbiAtIDFdID0gJ1wwJzsNCisgICAgLyogbm90IGFsbCBzeXN0ZW1zIGFsbG93IHN0YXQnaW5nIGEgZmlsZSB3aXRoIC8gYXBwZW5kZWQgKi8NCisgICAgaWYgKHN0YXQobmFtZSwmcyk9PTApDQorICAgIHsNCisgICAgICB0bV90ID0gcy5zdF9tdGltZTsNCisgICAgICByZXQgPSAxOw0KKyAgICB9DQorICB9DQorICBmaWxlZGF0ZSA9IGxvY2FsdGltZSgmdG1fdCk7DQorDQorICB0bXppcC0+dG1fc2VjICA9IGZpbGVkYXRlLT50bV9zZWM7DQorICB0bXppcC0+dG1fbWluICA9IGZpbGVkYXRlLT50bV9taW47DQorICB0bXppcC0+dG1faG91ciA9IGZpbGVkYXRlLT50bV9ob3VyOw0KKyAgdG16aXAtPnRtX21kYXkgPSBmaWxlZGF0ZS0+dG1fbWRheTsNCisgIHRtemlwLT50bV9tb24gID0gZmlsZWRhdGUtPnRtX21vbiA7DQorICB0bXppcC0+dG1feWVhciA9IGZpbGVkYXRlLT50bV95ZWFyOw0KKw0KKyAgcmV0dXJuIHJldDsNCit9DQorI2Vsc2UNCit1TG9uZyBmaWxldGltZShmLCB0bXppcCwgZHQpDQorICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLw0KKyAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovDQorICAgIHVMb25nICpkdDsgICAgICAgICAgICAgLyogZG9zdGltZSAqLw0KK3sNCisgICAgcmV0dXJuIDA7DQorfQ0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKw0KKw0KKw0KK2ludCBjaGVja19leGlzdF9maWxlKGZpbGVuYW1lKQ0KKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsNCit7DQorICAgIEZJTEUqIGZ0ZXN0ZXhpc3Q7DQorICAgIGludCByZXQgPSAxOw0KKyAgICBmdGVzdGV4aXN0ID0gZm9wZW4oZmlsZW5hbWUsInJiIik7DQorICAgIGlmIChmdGVzdGV4aXN0PT1OVUxMKQ0KKyAgICAgICAgcmV0ID0gMDsNCisgICAgZWxzZQ0KKyAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCit2b2lkIGRvX2Jhbm5lcigpDQorew0KKyAgICBwcmludGYoIk1pbmlaaXAgMS4wMWIsIGRlbW8gb2YgekxpYiArIFppcCBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOw0KKyAgICBwcmludGYoIm1vcmUgaW5mbyBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWxcblxuIik7DQorfQ0KKw0KK3ZvaWQgZG9faGVscCgpDQorew0KKyAgICBwcmludGYoIlVzYWdlIDogbWluaXppcCBbLW9dIFstYV0gWy0wIHRvIC05XSBbLXAgcGFzc3dvcmRdIGZpbGUuemlwIFtmaWxlc190b19hZGRdXG5cbiIgXA0KKyAgICAgICAgICAgIiAgLW8gIE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlLnppcFxuIiBcDQorICAgICAgICAgICAiICAtYSAgQXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUuemlwXG4iIFwNCisgICAgICAgICAgICIgIC0wICBTdG9yZSBvbmx5XG4iIFwNCisgICAgICAgICAgICIgIC0xICBDb21wcmVzcyBmYXN0ZXJcbiIgXA0KKyAgICAgICAgICAgIiAgLTkgIENvbXByZXNzIGJldHRlclxuXG4iKTsNCit9DQorDQorLyogY2FsY3VsYXRlIHRoZSBDUkMzMiBvZiBhIGZpbGUsDQorICAgYmVjYXVzZSB0byBlbmNyeXB0IGEgZmlsZSwgd2UgbmVlZCBrbm93biB0aGUgQ1JDMzIgb2YgdGhlIGZpbGUgYmVmb3JlICovDQoraW50IGdldEZpbGVDcmMoY29uc3QgY2hhciogZmlsZW5hbWVpbnppcCx2b2lkKmJ1Zix1bnNpZ25lZCBsb25nIHNpemVfYnVmLHVuc2lnbmVkIGxvbmcqIHJlc3VsdF9jcmMpDQorew0KKyAgIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX2NyYz0wOw0KKyAgIGludCBlcnI9WklQX09LOw0KKyAgIEZJTEUgKiBmaW4gPSBmb3BlbihmaWxlbmFtZWluemlwLCJyYiIpOw0KKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9yZWFkID0gMDsNCisgICB1bnNpZ25lZCBsb25nIHRvdGFsX3JlYWQgPSAwOw0KKyAgIGlmIChmaW49PU5VTEwpDQorICAgew0KKyAgICAgICBlcnIgPSBaSVBfRVJSTk87DQorICAgfQ0KKw0KKyAgICBpZiAoZXJyID09IFpJUF9PSykNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgICAgZXJyID0gWklQX09LOw0KKyAgICAgICAgICAgIHNpemVfcmVhZCA9IChpbnQpZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsNCisgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpDQorICAgICAgICAgICAgICAgIGlmIChmZW9mKGZpbik9PTApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7DQorICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHNpemVfcmVhZD4wKQ0KKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVfY3JjID0gY3JjMzIoY2FsY3VsYXRlX2NyYyxidWYsc2l6ZV9yZWFkKTsNCisgICAgICAgICAgICB0b3RhbF9yZWFkICs9IHNpemVfcmVhZDsNCisNCisgICAgICAgIH0gd2hpbGUgKChlcnIgPT0gWklQX09LKSAmJiAoc2l6ZV9yZWFkPjApKTsNCisNCisgICAgaWYgKGZpbikNCisgICAgICAgIGZjbG9zZShmaW4pOw0KKw0KKyAgICAqcmVzdWx0X2NyYz1jYWxjdWxhdGVfY3JjOw0KKyAgICBwcmludGYoImZpbGUgJXMgY3JjICV4XG4iLGZpbGVuYW1laW56aXAsY2FsY3VsYXRlX2NyYyk7DQorICAgIHJldHVybiBlcnI7DQorfQ0KKw0KK2ludCBtYWluKGFyZ2MsYXJndikNCisgICAgaW50IGFyZ2M7DQorICAgIGNoYXIgKmFyZ3ZbXTsNCit7DQorICAgIGludCBpOw0KKyAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOw0KKyAgICBpbnQgb3B0X2NvbXByZXNzX2xldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTjsNCisgICAgaW50IHppcGZpbGVuYW1lYXJnID0gMDsNCisgICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdOw0KKyAgICBpbnQgemlwb2s7DQorICAgIGludCBlcnI9MDsNCisgICAgaW50IHNpemVfYnVmPTA7DQorICAgIHZvaWQqIGJ1Zj1OVUxMOw0KKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZD1OVUxMOw0KKw0KKw0KKyAgICBkb19iYW5uZXIoKTsNCisgICAgaWYgKGFyZ2M9PTEpDQorICAgIHsNCisgICAgICAgIGRvX2hlbHAoKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgZm9yIChpPTE7aTxhcmdjO2krKykNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKCphcmd2W2ldKT09Jy0nKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7DQorDQorICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBjaGFyIGM9KihwKyspOzsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J28nKSB8fCAoYz09J08nKSkNCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMTsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2EnKSB8fCAoYz09J0EnKSkNCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsNCisgICAgICAgICAgICAgICAgICAgIGlmICgoYz49JzAnKSAmJiAoYzw9JzknKSkNCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwgPSBjLScwJzsNCisNCisgICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9YXJndltpKzFdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZWFyZyA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWVhcmcgPSBpIDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBzaXplX2J1ZiA9IFdSSVRFQlVGRkVSU0laRTsNCisgICAgYnVmID0gKHZvaWQqKW1hbGxvYyhzaXplX2J1Zik7DQorICAgIGlmIChidWY9PU5VTEwpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOw0KKyAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOw0KKyAgICB9DQorDQorICAgIGlmICh6aXBmaWxlbmFtZWFyZz09MCkNCisgICAgICAgIHppcG9rPTA7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaW50IGksbGVuOw0KKyAgICAgICAgaW50IGRvdF9mb3VuZD0wOw0KKw0KKyAgICAgICAgemlwb2sgPSAxIDsNCisgICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCBhcmd2W3ppcGZpbGVuYW1lYXJnXSxNQVhGSUxFTkFNRS0xKTsNCisgICAgICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8NCisgICAgICAgIGZpbGVuYW1lX3RyeVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7DQorDQorICAgICAgICBsZW49KGludClzdHJsZW4oZmlsZW5hbWVfdHJ5KTsNCisgICAgICAgIGZvciAoaT0wO2k8bGVuO2krKykNCisgICAgICAgICAgICBpZiAoZmlsZW5hbWVfdHJ5W2ldPT0nLicpDQorICAgICAgICAgICAgICAgIGRvdF9mb3VuZD0xOw0KKw0KKyAgICAgICAgaWYgKGRvdF9mb3VuZD09MCkNCisgICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7DQorDQorICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MikNCisgICAgICAgIHsNCisgICAgICAgICAgICAvKiBpZiB0aGUgZmlsZSBkb24ndCBleGlzdCwgd2Ugbm90IGFwcGVuZCBmaWxlICovDQorICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KT09MCkNCisgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgaWYgKG9wdF9vdmVyd3JpdGU9PTApDQorICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KSE9MCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNoYXIgcmVwPTA7DQorICAgICAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGNoYXIgYW5zd2VyWzEyOF07DQorICAgICAgICAgICAgICAgICAgICBpbnQgcmV0Ow0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgZmlsZSAlcyBleGlzdHMuIE92ZXJ3cml0ZSA/IFt5XWVzLCBbbl1vLCBbYV1wcGVuZCA6ICIsZmlsZW5hbWVfdHJ5KTsNCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHNjYW5mKCIlMXMiLGFuc3dlcik7DQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXA+PSdhJykgJiYgKHJlcDw9J3onKSkNCisgICAgICAgICAgICAgICAgICAgICAgICByZXAgLT0gMHgyMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcCE9J1knKSAmJiAocmVwIT0nTicpICYmIChyZXAhPSdBJykpOw0KKyAgICAgICAgICAgICAgICBpZiAocmVwPT0nTicpDQorICAgICAgICAgICAgICAgICAgICB6aXBvayA9IDA7DQorICAgICAgICAgICAgICAgIGlmIChyZXA9PSdBJykNCisgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAoemlwb2s9PTEpDQorICAgIHsNCisgICAgICAgIHppcEZpbGUgemY7DQorICAgICAgICBpbnQgZXJyY2xvc2U7DQorIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQ0KKyAgICAgICAgemxpYl9maWxlZnVuY19kZWYgZmZ1bmM7DQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jKCZmZnVuYyk7DQorICAgICAgICB6ZiA9IHppcE9wZW4yKGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCxOVUxMLCZmZnVuYyk7DQorIyAgICAgICAgZWxzZQ0KKyAgICAgICAgemYgPSB6aXBPcGVuKGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCk7DQorIyAgICAgICAgZW5kaWYNCisNCisgICAgICAgIGlmICh6ZiA9PSBOVUxMKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaW50ZigiZXJyb3Igb3BlbmluZyAlc1xuIixmaWxlbmFtZV90cnkpOw0KKyAgICAgICAgICAgIGVycj0gWklQX0VSUk5POw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsNCisNCisgICAgICAgIGZvciAoaT16aXBmaWxlbmFtZWFyZysxOyhpPGFyZ2MpICYmIChlcnI9PVpJUF9PSyk7aSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghKCgoKCooYXJndltpXSkpPT0nLScpIHx8ICgoKihhcmd2W2ldKSk9PScvJykpICYmDQorICAgICAgICAgICAgICAgICAgKChhcmd2W2ldWzFdPT0nbycpIHx8IChhcmd2W2ldWzFdPT0nTycpIHx8DQorICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0nYScpIHx8IChhcmd2W2ldWzFdPT0nQScpIHx8DQorICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0ncCcpIHx8IChhcmd2W2ldWzFdPT0nUCcpIHx8DQorICAgICAgICAgICAgICAgICAgICgoYXJndltpXVsxXT49JzAnKSB8fCAoYXJndltpXVsxXTw9JzknKSkpICYmDQorICAgICAgICAgICAgICAgICAgKHN0cmxlbihhcmd2W2ldKSA9PSAyKSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBGSUxFICogZmluOw0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZV9yZWFkOw0KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZWluemlwID0gYXJndltpXTsNCisgICAgICAgICAgICAgICAgemlwX2ZpbGVpbmZvIHppOw0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNyY0ZpbGU9MDsNCisNCisgICAgICAgICAgICAgICAgemkudG16X2RhdGUudG1fc2VjID0gemkudG16X2RhdGUudG1fbWluID0gemkudG16X2RhdGUudG1faG91ciA9DQorICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX21kYXkgPSB6aS50bXpfZGF0ZS50bV9tb24gPSB6aS50bXpfZGF0ZS50bV95ZWFyID0gMDsNCisgICAgICAgICAgICAgICAgemkuZG9zRGF0ZSA9IDA7DQorICAgICAgICAgICAgICAgIHppLmludGVybmFsX2ZhID0gMDsNCisgICAgICAgICAgICAgICAgemkuZXh0ZXJuYWxfZmEgPSAwOw0KKyAgICAgICAgICAgICAgICBmaWxldGltZShmaWxlbmFtZWluemlwLCZ6aS50bXpfZGF0ZSwmemkuZG9zRGF0ZSk7DQorDQorLyoNCisgICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcCh6ZixmaWxlbmFtZWluemlwLCZ6aSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyAqIGNvbW1lbnQgKiAvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwpOw0KKyovDQorICAgICAgICAgICAgICAgIGlmICgocGFzc3dvcmQgIT0gTlVMTCkgJiYgKGVycj09WklQX09LKSkNCisgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEZpbGVDcmMoZmlsZW5hbWVpbnppcCxidWYsc2l6ZV9idWYsJmNyY0ZpbGUpOw0KKw0KKyAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwMyh6ZixmaWxlbmFtZWluemlwLCZ6aSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyogY29tbWVudCovLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwsMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLGNyY0ZpbGUpOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFpJUF9PSykNCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBpbiB6aXBmaWxlXG4iLGZpbGVuYW1laW56aXApOw0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGZpbiA9IGZvcGVuKGZpbGVuYW1laW56aXAsInJiIik7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZmluPT1OVUxMKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBvcGVuaW5nICVzIGZvciByZWFkaW5nXG4iLGZpbGVuYW1laW56aXApOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gWklQX09LKQ0KKyAgICAgICAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfT0s7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9yZWFkID0gKGludClmcmVhZChidWYsMSxzaXplX2J1ZixmaW4pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPCBzaXplX2J1ZikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkNCisgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gcmVhZGluZyAlc1xuIixmaWxlbmFtZWluemlwKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApDQorICAgICAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB6aXBXcml0ZUluRmlsZUluWmlwICh6ZixidWYsc2l6ZV9yZWFkKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycjwwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgJXMgaW4gdGhlIHppcGZpbGVcbiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGVyciA9PSBaSVBfT0spICYmIChzaXplX3JlYWQ+MCkpOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoZmluKQ0KKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZpbik7DQorDQorICAgICAgICAgICAgICAgIGlmIChlcnI8MCkNCisgICAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gemlwQ2xvc2VGaWxlSW5aaXAoemYpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciE9WklQX09LKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gY2xvc2luZyAlcyBpbiB0aGUgemlwZmlsZVxuIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZWluemlwKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVycmNsb3NlID0gemlwQ2xvc2UoemYsTlVMTCk7DQorICAgICAgICBpZiAoZXJyY2xvc2UgIT0gWklQX09LKQ0KKyAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gY2xvc2luZyAlc1xuIixmaWxlbmFtZV90cnkpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICBkb19oZWxwKCk7DQorICAgIH0NCisNCisgICAgZnJlZShidWYpOw0KKyAgICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL216dG9vbHMuYyBiL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMKaW5kZXggYzEyNjZiYy4uYmM1Yzc5OCAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL216dG9vbHMuYworKysgYi9jb250cmliL21pbml6aXAvbXp0b29scy5jCkBAIC0xLDI4MSArMSwyODEgQEAKLS8qCi0gIEFkZGl0aW9uYWwgdG9vbHMgZm9yIE1pbml6aXAKLSAgQ29kZTogWGF2aWVyIFJvY2hlICcyMDA0Ci0gIExpY2Vuc2U6IFNhbWUgYXMgWkxJQiAod3d3Lmd6aXAub3JnKQotKi8KLQotLyogQ29kZSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgInVuemlwLmgiCi0KLSNkZWZpbmUgUkVBRF84KGFkcikgICgodW5zaWduZWQgY2hhcikqKGFkcikpCi0jZGVmaW5lIFJFQURfMTYoYWRyKSAoIFJFQURfOChhZHIpIHwgKFJFQURfOChhZHIrMSkgPDwgOCkgKQotI2RlZmluZSBSRUFEXzMyKGFkcikgKCBSRUFEXzE2KGFkcikgfCAoUkVBRF8xNigoYWRyKSsyKSA8PCAxNikgKQotCi0jZGVmaW5lIFdSSVRFXzgoYnVmZiwgbikgZG8geyBcCi0gICooKHVuc2lnbmVkIGNoYXIqKShidWZmKSkgPSAodW5zaWduZWQgY2hhcikgKChuKSAmIDB4ZmYpOyBcCi19IHdoaWxlKDApCi0jZGVmaW5lIFdSSVRFXzE2KGJ1ZmYsIG4pIGRvIHsgXAotICBXUklURV84KCh1bnNpZ25lZCBjaGFyKikoYnVmZiksIG4pOyBcCi0gIFdSSVRFXzgoKCh1bnNpZ25lZCBjaGFyKikoYnVmZikpICsgMSwgKG4pID4+IDgpOyBcCi19IHdoaWxlKDApCi0jZGVmaW5lIFdSSVRFXzMyKGJ1ZmYsIG4pIGRvIHsgXAotICBXUklURV8xNigodW5zaWduZWQgY2hhciopKGJ1ZmYpLCAobikgJiAweGZmZmYpOyBcCi0gIFdSSVRFXzE2KCh1bnNpZ25lZCBjaGFyKikoYnVmZikgKyAyLCAobikgPj4gMTYpOyBcCi19IHdoaWxlKDApCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpSZXBhaXIoZmlsZSwgZmlsZU91dCwgZmlsZU91dFRtcCwgblJlY292ZXJlZCwgYnl0ZXNSZWNvdmVyZWQpCi1jb25zdCBjaGFyKiBmaWxlOwotY29uc3QgY2hhciogZmlsZU91dDsKLWNvbnN0IGNoYXIqIGZpbGVPdXRUbXA7Ci11TG9uZyogblJlY292ZXJlZDsKLXVMb25nKiBieXRlc1JlY292ZXJlZDsKLXsKLSAgaW50IGVyciA9IFpfT0s7Ci0gIEZJTEUqIGZwWmlwID0gZm9wZW4oZmlsZSwgInJiIik7Ci0gIEZJTEUqIGZwT3V0ID0gZm9wZW4oZmlsZU91dCwgIndiIik7Ci0gIEZJTEUqIGZwT3V0Q0QgPSBmb3BlbihmaWxlT3V0VG1wLCAid2IiKTsKLSAgaWYgKGZwWmlwICE9IE5VTEwgJiYgIGZwT3V0ICE9IE5VTEwpIHsKLSAgICBpbnQgZW50cmllcyA9IDA7Ci0gICAgdUxvbmcgdG90YWxCeXRlcyA9IDA7Ci0gICAgY2hhciBoZWFkZXJbMzBdOwotICAgIGNoYXIgZmlsZW5hbWVbMjU2XTsKLSAgICBjaGFyIGV4dHJhWzEwMjRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCBvZmZzZXRDRCA9IDA7Ci0gICAgd2hpbGUgKCBmcmVhZChoZWFkZXIsIDEsIDMwLCBmcFppcCkgPT0gMzAgKSB7Ci0gICAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldDsKLQotICAgICAgLyogRmlsZSBlbnRyeSAqLwotICAgICAgaWYgKFJFQURfMzIoaGVhZGVyKSA9PSAweDA0MDM0YjUwKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gUkVBRF8xNihoZWFkZXIgKyA0KTsKLSAgICAgICAgdW5zaWduZWQgaW50IGdwZmxhZyA9IFJFQURfMTYoaGVhZGVyICsgNik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtZXRob2QgPSBSRUFEXzE2KGhlYWRlciArIDgpOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmlsZXRpbWUgPSBSRUFEXzE2KGhlYWRlciArIDEwKTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZpbGVkYXRlID0gUkVBRF8xNihoZWFkZXIgKyAxMik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBjcmMgPSBSRUFEXzMyKGhlYWRlciArIDE0KTsgLyogY3JjICovCi0gICAgICAgIHVuc2lnbmVkIGludCBjcHNpemUgPSBSRUFEXzMyKGhlYWRlciArIDE4KTsgLyogY29tcHJlc3NlZCBzaXplICovCi0gICAgICAgIHVuc2lnbmVkIGludCB1bmNwc2l6ZSA9IFJFQURfMzIoaGVhZGVyICsgMjIpOyAvKiB1bmNvbXByZXNzZWQgc3ogKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGZuc2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjYpOyAvKiBmaWxlIG5hbWUgbGVuZ3RoICovCi0gICAgICAgIHVuc2lnbmVkIGludCBleHRzaXplID0gUkVBRF8xNihoZWFkZXIgKyAyOCk7IC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAqLwotICAgICAgICBmaWxlbmFtZVswXSA9IGV4dHJhWzBdID0gJ1wwJzsKLQotICAgICAgICAvKiBIZWFkZXIgKi8KLSAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDMwLCBmcE91dCkgPT0gMzApIHsKLSAgICAgICAgICBvZmZzZXQgKz0gMzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGVuYW1lICovCi0gICAgICAgIGlmIChmbnNpemUgPiAwKSB7Ci0gICAgICAgICAgaWYgKGZyZWFkKGZpbGVuYW1lLCAxLCBmbnNpemUsIGZwWmlwKSA9PSBmbnNpemUpIHsKLSAgICAgICAgICAgIGlmIChmd3JpdGUoZmlsZW5hbWUsIDEsIGZuc2l6ZSwgZnBPdXQpID09IGZuc2l6ZSkgewotICAgICAgICAgICAgICBvZmZzZXQgKz0gZm5zaXplOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFeHRyYSBmaWVsZCAqLwotICAgICAgICBpZiAoZXh0c2l6ZSA+IDApIHsKLSAgICAgICAgICBpZiAoZnJlYWQoZXh0cmEsIDEsIGV4dHNpemUsIGZwWmlwKSA9PSBleHRzaXplKSB7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKGV4dHJhLCAxLCBleHRzaXplLCBmcE91dCkgPT0gZXh0c2l6ZSkgewotICAgICAgICAgICAgICBvZmZzZXQgKz0gZXh0c2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGF0YSAqLwotICAgICAgICB7Ci0gICAgICAgICAgaW50IGRhdGFTaXplID0gY3BzaXplOwotICAgICAgICAgIGlmIChkYXRhU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IHVuY3BzaXplOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGF0YVNpemUgPiAwKSB7Ci0gICAgICAgICAgICBjaGFyKiBkYXRhID0gbWFsbG9jKGRhdGFTaXplKTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgaWYgKChpbnQpZnJlYWQoZGF0YSwgMSwgZGF0YVNpemUsIGZwWmlwKSA9PSBkYXRhU2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShkYXRhLCAxLCBkYXRhU2l6ZSwgZnBPdXQpID09IGRhdGFTaXplKSB7Ci0gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZGF0YVNpemU7Ci0gICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGFTaXplOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGZyZWUoZGF0YSk7Ci0gICAgICAgICAgICAgIGlmIChlcnIgIT0gWl9PSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBlcnIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2VudHJhbCBkaXJlY3RvcnkgZW50cnkgKi8KLSAgICAgICAgewotICAgICAgICAgIGNoYXIgaGVhZGVyWzQ2XTsKLSAgICAgICAgICBjaGFyKiBjb21tZW50ID0gIiI7Ci0gICAgICAgICAgaW50IGNvbXNpemUgPSAoaW50KSBzdHJsZW4oY29tbWVudCk7Ci0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyLCAweDAyMDE0YjUwKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA0LCB2ZXJzaW9uKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA2LCB2ZXJzaW9uKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA4LCBncGZsYWcpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEwLCBtZXRob2QpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEyLCBmaWxldGltZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTQsIGZpbGVkYXRlKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAxNiwgY3JjKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyMCwgY3BzaXplKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyNCwgdW5jcHNpemUpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDI4LCBmbnNpemUpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMwLCBleHRzaXplKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzMiwgY29tc2l6ZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzQsIDApOyAgICAgLyogZGlzayAjICovCi0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzYsIDApOyAgICAgLyogaW50IGF0dHJiICovCi0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMzgsIDApOyAgICAgLyogZXh0IGF0dHJiICovCi0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgNDIsIGN1cnJlbnRPZmZzZXQpOwotICAgICAgICAgIC8qIEhlYWRlciAqLwotICAgICAgICAgIGlmIChmd3JpdGUoaGVhZGVyLCAxLCA0NiwgZnBPdXRDRCkgPT0gNDYpIHsKLSAgICAgICAgICAgIG9mZnNldENEICs9IDQ2OwotCi0gICAgICAgICAgICAvKiBGaWxlbmFtZSAqLwotICAgICAgICAgICAgaWYgKGZuc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dENEKSA9PSBmbnNpemUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBmbnNpemU7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBFeHRyYSBmaWVsZCAqLwotICAgICAgICAgICAgaWYgKGV4dHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmIChmd3JpdGUoZXh0cmEsIDEsIGV4dHNpemUsIGZwT3V0Q0QpID09IGV4dHNpemUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBleHRzaXplOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLwotICAgICAgICAgICAgaWYgKGNvbXNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShjb21tZW50LCAxLCBjb21zaXplLCBmcE91dENEKSA9PSBjb21zaXplKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gY29tc2l6ZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU3VjY2VzcyAqLwotICAgICAgICBlbnRyaWVzKys7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmFsIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgIHsKLSAgICAgIGludCBlbnRyaWVzWmlwID0gZW50cmllczsKLSAgICAgIGNoYXIgaGVhZGVyWzIyXTsKLSAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsgLy8gIlpJUCBGaWxlIHJlY292ZXJlZCBieSB6bGliL21pbml6aXAvbXp0b29scyI7Ci0gICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsKLSAgICAgIGlmIChlbnRyaWVzWmlwID4gMHhmZmZmKSB7Ci0gICAgICAgIGVudHJpZXNaaXAgPSAweGZmZmY7Ci0gICAgICB9Ci0gICAgICBXUklURV8zMihoZWFkZXIsIDB4MDYwNTRiNTApOwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNCwgMCk7ICAgIC8qIGRpc2sgIyAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNiwgMCk7ICAgIC8qIGRpc2sgIyAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgOCwgZW50cmllc1ppcCk7ICAgLyogaGFjayAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIGVudHJpZXNaaXApOyAgLyogaGFjayAqLwotICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTIsIG9mZnNldENEKTsgICAgLyogc2l6ZSBvZiBDRCAqLwotICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTYsIG9mZnNldCk7ICAgICAgLyogb2Zmc2V0IHRvIENEICovCi0gICAgICBXUklURV8xNihoZWFkZXIgKyAyMCwgY29tc2l6ZSk7ICAgICAvKiBjb21tZW50ICovCi0KLSAgICAgIC8qIEhlYWRlciAqLwotICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDIyLCBmcE91dENEKSA9PSAyMikgewotCi0gICAgICAgIC8qIENvbW1lbnQgZmllbGQgKi8KLSAgICAgICAgaWYgKGNvbXNpemUgPiAwKSB7Ci0gICAgICAgICAgaWYgKChpbnQpZndyaXRlKGNvbW1lbnQsIDEsIGNvbXNpemUsIGZwT3V0Q0QpICE9IGNvbXNpemUpIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluYWwgbWVyZ2UgKGZpbGUgKyBjZW50cmFsIGRpcmVjdG9yeSkgKi8KLSAgICBmY2xvc2UoZnBPdXRDRCk7Ci0gICAgaWYgKGVyciA9PSBaX09LKSB7Ci0gICAgICBmcE91dENEID0gZm9wZW4oZmlsZU91dFRtcCwgInJiIik7Ci0gICAgICBpZiAoZnBPdXRDRCAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBuUmVhZDsKLSAgICAgICAgY2hhciBidWZmZXJbODE5Ml07Ci0gICAgICAgIHdoaWxlICggKG5SZWFkID0gZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YoYnVmZmVyKSwgZnBPdXRDRCkpID4gMCkgewotICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShidWZmZXIsIDEsIG5SZWFkLCBmcE91dCkgIT0gblJlYWQpIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmNsb3NlKGZwT3V0Q0QpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIENsb3NlICovCi0gICAgZmNsb3NlKGZwWmlwKTsKLSAgICBmY2xvc2UoZnBPdXQpOwotCi0gICAgLyogV2lwZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICh2b2lkKXJlbW92ZShmaWxlT3V0VG1wKTsKLQotICAgIC8qIE51bWJlciBvZiByZWNvdmVyZWQgZW50cmllcyAqLwotICAgIGlmIChlcnIgPT0gWl9PSykgewotICAgICAgaWYgKG5SZWNvdmVyZWQgIT0gTlVMTCkgewotICAgICAgICAqblJlY292ZXJlZCA9IGVudHJpZXM7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZXNSZWNvdmVyZWQgIT0gTlVMTCkgewotICAgICAgICAqYnl0ZXNSZWNvdmVyZWQgPSB0b3RhbEJ5dGVzOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgfQotICByZXR1cm4gZXJyOwotfQorLyoNCisgIEFkZGl0aW9uYWwgdG9vbHMgZm9yIE1pbml6aXANCisgIENvZGU6IFhhdmllciBSb2NoZSAnMjAwNA0KKyAgTGljZW5zZTogU2FtZSBhcyBaTElCICh3d3cuZ3ppcC5vcmcpDQorKi8NCisNCisvKiBDb2RlICovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSAiemxpYi5oIg0KKyNpbmNsdWRlICJ1bnppcC5oIg0KKw0KKyNkZWZpbmUgUkVBRF84KGFkcikgICgodW5zaWduZWQgY2hhcikqKGFkcikpDQorI2RlZmluZSBSRUFEXzE2KGFkcikgKCBSRUFEXzgoYWRyKSB8IChSRUFEXzgoYWRyKzEpIDw8IDgpICkNCisjZGVmaW5lIFJFQURfMzIoYWRyKSAoIFJFQURfMTYoYWRyKSB8IChSRUFEXzE2KChhZHIpKzIpIDw8IDE2KSApDQorDQorI2RlZmluZSBXUklURV84KGJ1ZmYsIG4pIGRvIHsgXA0KKyAgKigodW5zaWduZWQgY2hhciopKGJ1ZmYpKSA9ICh1bnNpZ25lZCBjaGFyKSAoKG4pICYgMHhmZik7IFwNCit9IHdoaWxlKDApDQorI2RlZmluZSBXUklURV8xNihidWZmLCBuKSBkbyB7IFwNCisgIFdSSVRFXzgoKHVuc2lnbmVkIGNoYXIqKShidWZmKSwgbik7IFwNCisgIFdSSVRFXzgoKCh1bnNpZ25lZCBjaGFyKikoYnVmZikpICsgMSwgKG4pID4+IDgpOyBcDQorfSB3aGlsZSgwKQ0KKyNkZWZpbmUgV1JJVEVfMzIoYnVmZiwgbikgZG8geyBcDQorICBXUklURV8xNigodW5zaWduZWQgY2hhciopKGJ1ZmYpLCAobikgJiAweGZmZmYpOyBcDQorICBXUklURV8xNigodW5zaWduZWQgY2hhciopKGJ1ZmYpICsgMiwgKG4pID4+IDE2KTsgXA0KK30gd2hpbGUoMCkNCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56UmVwYWlyKGZpbGUsIGZpbGVPdXQsIGZpbGVPdXRUbXAsIG5SZWNvdmVyZWQsIGJ5dGVzUmVjb3ZlcmVkKQ0KK2NvbnN0IGNoYXIqIGZpbGU7DQorY29uc3QgY2hhciogZmlsZU91dDsNCitjb25zdCBjaGFyKiBmaWxlT3V0VG1wOw0KK3VMb25nKiBuUmVjb3ZlcmVkOw0KK3VMb25nKiBieXRlc1JlY292ZXJlZDsNCit7DQorICBpbnQgZXJyID0gWl9PSzsNCisgIEZJTEUqIGZwWmlwID0gZm9wZW4oZmlsZSwgInJiIik7DQorICBGSUxFKiBmcE91dCA9IGZvcGVuKGZpbGVPdXQsICJ3YiIpOw0KKyAgRklMRSogZnBPdXRDRCA9IGZvcGVuKGZpbGVPdXRUbXAsICJ3YiIpOw0KKyAgaWYgKGZwWmlwICE9IE5VTEwgJiYgIGZwT3V0ICE9IE5VTEwpIHsNCisgICAgaW50IGVudHJpZXMgPSAwOw0KKyAgICB1TG9uZyB0b3RhbEJ5dGVzID0gMDsNCisgICAgY2hhciBoZWFkZXJbMzBdOw0KKyAgICBjaGFyIGZpbGVuYW1lWzI1Nl07DQorICAgIGNoYXIgZXh0cmFbMTAyNF07DQorICAgIGludCBvZmZzZXQgPSAwOw0KKyAgICBpbnQgb2Zmc2V0Q0QgPSAwOw0KKyAgICB3aGlsZSAoIGZyZWFkKGhlYWRlciwgMSwgMzAsIGZwWmlwKSA9PSAzMCApIHsNCisgICAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldDsNCisNCisgICAgICAvKiBGaWxlIGVudHJ5ICovDQorICAgICAgaWYgKFJFQURfMzIoaGVhZGVyKSA9PSAweDA0MDM0YjUwKSB7DQorICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IFJFQURfMTYoaGVhZGVyICsgNCk7DQorICAgICAgICB1bnNpZ25lZCBpbnQgZ3BmbGFnID0gUkVBRF8xNihoZWFkZXIgKyA2KTsNCisgICAgICAgIHVuc2lnbmVkIGludCBtZXRob2QgPSBSRUFEXzE2KGhlYWRlciArIDgpOw0KKyAgICAgICAgdW5zaWduZWQgaW50IGZpbGV0aW1lID0gUkVBRF8xNihoZWFkZXIgKyAxMCk7DQorICAgICAgICB1bnNpZ25lZCBpbnQgZmlsZWRhdGUgPSBSRUFEXzE2KGhlYWRlciArIDEyKTsNCisgICAgICAgIHVuc2lnbmVkIGludCBjcmMgPSBSRUFEXzMyKGhlYWRlciArIDE0KTsgLyogY3JjICovDQorICAgICAgICB1bnNpZ25lZCBpbnQgY3BzaXplID0gUkVBRF8zMihoZWFkZXIgKyAxOCk7IC8qIGNvbXByZXNzZWQgc2l6ZSAqLw0KKyAgICAgICAgdW5zaWduZWQgaW50IHVuY3BzaXplID0gUkVBRF8zMihoZWFkZXIgKyAyMik7IC8qIHVuY29tcHJlc3NlZCBzeiAqLw0KKyAgICAgICAgdW5zaWduZWQgaW50IGZuc2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjYpOyAvKiBmaWxlIG5hbWUgbGVuZ3RoICovDQorICAgICAgICB1bnNpZ25lZCBpbnQgZXh0c2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjgpOyAvKiBleHRyYSBmaWVsZCBsZW5ndGggKi8NCisgICAgICAgIGZpbGVuYW1lWzBdID0gZXh0cmFbMF0gPSAnXDAnOw0KKyAgICAgICAgDQorICAgICAgICAvKiBIZWFkZXIgKi8NCisgICAgICAgIGlmIChmd3JpdGUoaGVhZGVyLCAxLCAzMCwgZnBPdXQpID09IDMwKSB7DQorICAgICAgICAgIG9mZnNldCArPSAzMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvKiBGaWxlbmFtZSAqLw0KKyAgICAgICAgaWYgKGZuc2l6ZSA+IDApIHsNCisgICAgICAgICAgaWYgKGZyZWFkKGZpbGVuYW1lLCAxLCBmbnNpemUsIGZwWmlwKSA9PSBmbnNpemUpIHsNCisgICAgICAgICAgICBpZiAoZndyaXRlKGZpbGVuYW1lLCAxLCBmbnNpemUsIGZwT3V0KSA9PSBmbnNpemUpIHsNCisgICAgICAgICAgICAgIG9mZnNldCArPSBmbnNpemU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyogRXh0cmEgZmllbGQgKi8NCisgICAgICAgIGlmIChleHRzaXplID4gMCkgew0KKyAgICAgICAgICBpZiAoZnJlYWQoZXh0cmEsIDEsIGV4dHNpemUsIGZwWmlwKSA9PSBleHRzaXplKSB7DQorICAgICAgICAgICAgaWYgKGZ3cml0ZShleHRyYSwgMSwgZXh0c2l6ZSwgZnBPdXQpID09IGV4dHNpemUpIHsNCisgICAgICAgICAgICAgIG9mZnNldCArPSBleHRzaXplOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgLyogRGF0YSAqLw0KKyAgICAgICAgew0KKyAgICAgICAgICBpbnQgZGF0YVNpemUgPSBjcHNpemU7DQorICAgICAgICAgIGlmIChkYXRhU2l6ZSA9PSAwKSB7DQorICAgICAgICAgICAgZGF0YVNpemUgPSB1bmNwc2l6ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoZGF0YVNpemUgPiAwKSB7DQorICAgICAgICAgICAgY2hhciogZGF0YSA9IG1hbGxvYyhkYXRhU2l6ZSk7DQorICAgICAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgaWYgKChpbnQpZnJlYWQoZGF0YSwgMSwgZGF0YVNpemUsIGZwWmlwKSA9PSBkYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoKGludClmd3JpdGUoZGF0YSwgMSwgZGF0YVNpemUsIGZwT3V0KSA9PSBkYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBkYXRhU2l6ZTsNCisgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGFTaXplOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBmcmVlKGRhdGEpOw0KKyAgICAgICAgICAgICAgaWYgKGVyciAhPSBaX09LKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBlcnIgPSBaX01FTV9FUlJPUjsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvKiBDZW50cmFsIGRpcmVjdG9yeSBlbnRyeSAqLw0KKyAgICAgICAgew0KKyAgICAgICAgICBjaGFyIGhlYWRlcls0Nl07DQorICAgICAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsNCisgICAgICAgICAgaW50IGNvbXNpemUgPSAoaW50KSBzdHJsZW4oY29tbWVudCk7DQorICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciwgMHgwMjAxNGI1MCk7DQorICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDQsIHZlcnNpb24pOw0KKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA2LCB2ZXJzaW9uKTsNCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgOCwgZ3BmbGFnKTsNCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIG1ldGhvZCk7DQorICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEyLCBmaWxldGltZSk7DQorICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDE0LCBmaWxlZGF0ZSk7DQorICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDE2LCBjcmMpOw0KKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyMCwgY3BzaXplKTsNCisgICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMjQsIHVuY3BzaXplKTsNCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMjgsIGZuc2l6ZSk7DQorICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMwLCBleHRzaXplKTsNCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzIsIGNvbXNpemUpOw0KKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzNCwgMCk7ICAgICAvKiBkaXNrICMgKi8NCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzYsIDApOyAgICAgLyogaW50IGF0dHJiICovDQorICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDM4LCAwKTsgICAgIC8qIGV4dCBhdHRyYiAqLw0KKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyA0MiwgY3VycmVudE9mZnNldCk7DQorICAgICAgICAgIC8qIEhlYWRlciAqLw0KKyAgICAgICAgICBpZiAoZndyaXRlKGhlYWRlciwgMSwgNDYsIGZwT3V0Q0QpID09IDQ2KSB7DQorICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gNDY7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgLyogRmlsZW5hbWUgKi8NCisgICAgICAgICAgICBpZiAoZm5zaXplID4gMCkgew0KKyAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dENEKSA9PSBmbnNpemUpIHsNCisgICAgICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gZm5zaXplOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIC8qIEV4dHJhIGZpZWxkICovDQorICAgICAgICAgICAgaWYgKGV4dHNpemUgPiAwKSB7DQorICAgICAgICAgICAgICBpZiAoZndyaXRlKGV4dHJhLCAxLCBleHRzaXplLCBmcE91dENEKSA9PSBleHRzaXplKSB7DQorICAgICAgICAgICAgICAgIG9mZnNldENEICs9IGV4dHNpemU7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLw0KKyAgICAgICAgICAgIGlmIChjb21zaXplID4gMCkgew0KKyAgICAgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGNvbW1lbnQsIDEsIGNvbXNpemUsIGZwT3V0Q0QpID09IGNvbXNpemUpIHsNCisgICAgICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gY29tc2l6ZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICANCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvKiBTdWNjZXNzICovDQorICAgICAgICBlbnRyaWVzKys7DQorDQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKiBGaW5hbCBjZW50cmFsIGRpcmVjdG9yeSAgKi8NCisgICAgew0KKyAgICAgIGludCBlbnRyaWVzWmlwID0gZW50cmllczsNCisgICAgICBjaGFyIGhlYWRlclsyMl07DQorICAgICAgY2hhciogY29tbWVudCA9ICIiOyAvLyAiWklQIEZpbGUgcmVjb3ZlcmVkIGJ5IHpsaWIvbWluaXppcC9tenRvb2xzIjsNCisgICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsNCisgICAgICBpZiAoZW50cmllc1ppcCA+IDB4ZmZmZikgew0KKyAgICAgICAgZW50cmllc1ppcCA9IDB4ZmZmZjsNCisgICAgICB9DQorICAgICAgV1JJVEVfMzIoaGVhZGVyLCAweDA2MDU0YjUwKTsNCisgICAgICBXUklURV8xNihoZWFkZXIgKyA0LCAwKTsgICAgLyogZGlzayAjICovDQorICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNiwgMCk7ICAgIC8qIGRpc2sgIyAqLw0KKyAgICAgIFdSSVRFXzE2KGhlYWRlciArIDgsIGVudHJpZXNaaXApOyAgIC8qIGhhY2sgKi8NCisgICAgICBXUklURV8xNihoZWFkZXIgKyAxMCwgZW50cmllc1ppcCk7ICAvKiBoYWNrICovDQorICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTIsIG9mZnNldENEKTsgICAgLyogc2l6ZSBvZiBDRCAqLw0KKyAgICAgIFdSSVRFXzMyKGhlYWRlciArIDE2LCBvZmZzZXQpOyAgICAgIC8qIG9mZnNldCB0byBDRCAqLw0KKyAgICAgIFdSSVRFXzE2KGhlYWRlciArIDIwLCBjb21zaXplKTsgICAgIC8qIGNvbW1lbnQgKi8NCisgICAgICANCisgICAgICAvKiBIZWFkZXIgKi8NCisgICAgICBpZiAoZndyaXRlKGhlYWRlciwgMSwgMjIsIGZwT3V0Q0QpID09IDIyKSB7DQorICAgICAgICANCisgICAgICAgIC8qIENvbW1lbnQgZmllbGQgKi8NCisgICAgICAgIGlmIChjb21zaXplID4gMCkgew0KKyAgICAgICAgICBpZiAoKGludClmd3JpdGUoY29tbWVudCwgMSwgY29tc2l6ZSwgZnBPdXRDRCkgIT0gY29tc2l6ZSkgew0KKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlcnIgPSBaX0VSUk5POw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKiBGaW5hbCBtZXJnZSAoZmlsZSArIGNlbnRyYWwgZGlyZWN0b3J5KSAqLw0KKyAgICBmY2xvc2UoZnBPdXRDRCk7DQorICAgIGlmIChlcnIgPT0gWl9PSykgew0KKyAgICAgIGZwT3V0Q0QgPSBmb3BlbihmaWxlT3V0VG1wLCAicmIiKTsNCisgICAgICBpZiAoZnBPdXRDRCAhPSBOVUxMKSB7DQorICAgICAgICBpbnQgblJlYWQ7DQorICAgICAgICBjaGFyIGJ1ZmZlcls4MTkyXTsNCisgICAgICAgIHdoaWxlICggKG5SZWFkID0gKGludClmcmVhZChidWZmZXIsIDEsIHNpemVvZihidWZmZXIpLCBmcE91dENEKSkgPiAwKSB7DQorICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShidWZmZXIsIDEsIG5SZWFkLCBmcE91dCkgIT0gblJlYWQpIHsNCisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBmY2xvc2UoZnBPdXRDRCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICAvKiBDbG9zZSAqLw0KKyAgICBmY2xvc2UoZnBaaXApOw0KKyAgICBmY2xvc2UoZnBPdXQpOw0KKyAgICANCisgICAgLyogV2lwZSB0ZW1wb3JhcnkgZmlsZSAqLw0KKyAgICAodm9pZClyZW1vdmUoZmlsZU91dFRtcCk7DQorICAgIA0KKyAgICAvKiBOdW1iZXIgb2YgcmVjb3ZlcmVkIGVudHJpZXMgKi8NCisgICAgaWYgKGVyciA9PSBaX09LKSB7DQorICAgICAgaWYgKG5SZWNvdmVyZWQgIT0gTlVMTCkgew0KKyAgICAgICAgKm5SZWNvdmVyZWQgPSBlbnRyaWVzOw0KKyAgICAgIH0NCisgICAgICBpZiAoYnl0ZXNSZWNvdmVyZWQgIT0gTlVMTCkgew0KKyAgICAgICAgKmJ5dGVzUmVjb3ZlcmVkID0gdG90YWxCeXRlczsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOw0KKyAgfQ0KKyAgcmV0dXJuIGVycjsNCit9DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL216dG9vbHMuaCBiL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmgKaW5kZXggODhiMzQ1OS4uODJkMTU5NyAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL216dG9vbHMuaAorKysgYi9jb250cmliL21pbml6aXAvbXp0b29scy5oCkBAIC0xLDMxICsxLDMxIEBACi0vKgotICBBZGRpdGlvbmFsIHRvb2xzIGZvciBNaW5pemlwCi0gIENvZGU6IFhhdmllciBSb2NoZSAnMjAwNAotICBMaWNlbnNlOiBTYW1lIGFzIFpMSUIgKHd3dy5nemlwLm9yZykKLSovCi0KLSNpZm5kZWYgX3ppcF90b29sc19ICi0jZGVmaW5lIF96aXBfdG9vbHNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJfSAotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidW56aXAuaCIKLQotLyogUmVwYWlyIGEgWklQIGZpbGUgKG1pc3NpbmcgY2VudHJhbCBkaXJlY3RvcnkpCi0gICBmaWxlOiBmaWxlIHRvIHJlY292ZXIKLSAgIGZpbGVPdXQ6IG91dHB1dCBmaWxlIGFmdGVyIHJlY292ZXJ5Ci0gICBmaWxlT3V0VG1wOiB0ZW1wb3JhcnkgZmlsZSBuYW1lIHVzZWQgZm9yIHJlY292ZXJ5Ci0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0VG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogblJlY292ZXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcqIGJ5dGVzUmVjb3ZlcmVkKTsKLQotI2VuZGlmCisvKg0KKyAgQWRkaXRpb25hbCB0b29scyBmb3IgTWluaXppcA0KKyAgQ29kZTogWGF2aWVyIFJvY2hlICcyMDA0DQorICBMaWNlbnNlOiBTYW1lIGFzIFpMSUIgKHd3dy5nemlwLm9yZykNCisqLw0KKw0KKyNpZm5kZWYgX3ppcF90b29sc19IDQorI2RlZmluZSBfemlwX3Rvb2xzX0gNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9aTElCX0gNCisjaW5jbHVkZSAiemxpYi5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJ1bnppcC5oIg0KKw0KKy8qIFJlcGFpciBhIFpJUCBmaWxlIChtaXNzaW5nIGNlbnRyYWwgZGlyZWN0b3J5KSANCisgICBmaWxlOiBmaWxlIHRvIHJlY292ZXINCisgICBmaWxlT3V0OiBvdXRwdXQgZmlsZSBhZnRlciByZWNvdmVyeQ0KKyAgIGZpbGVPdXRUbXA6IHRlbXBvcmFyeSBmaWxlIG5hbWUgdXNlZCBmb3IgcmVjb3ZlcnkNCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpSZXBhaXIoY29uc3QgY2hhciogZmlsZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVPdXRUbXAsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcqIG5SZWNvdmVyZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogYnl0ZXNSZWNvdmVyZWQpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC91bnppcC5jIGIvY29udHJpYi9taW5pemlwL3VuemlwLmMKaW5kZXggZTE0ZGU5ZS4uM2E3MDYyOSAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL3VuemlwLmMKKysrIGIvY29udHJpYi9taW5pemlwL3VuemlwLmMKQEAgLTEsMTU5NSArMSwxNTk4IEBACi0vKiB1bnppcC5jIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxZCwgU2VwdGVtYmVyIDIydGgsIDIwMDQKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQKLQotICAgUmVhZCB1bnppcC5oIGZvciBtb3JlIGluZm8KLSovCi0KLS8qIERlY3J5cHRpb24gY29kZSBjb21lcyBmcm9tIGNyeXB0LmMgYnkgSW5mby1aSVAgYnV0IGhhcyBiZWVuIGdyZWF0bHkgcmVkdWNlZCBpbiB0ZXJtcyBvZgotY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHNvZnR3YXJlLiBUaGUgZm9sbG93aW5nIGlzIGZyb20gdGhlIG9yaWdpbmFsIGNyeXB0LmMuIENvZGUKLXdvdmVuIGluIGJ5IFRlcnJ5IFRob3JzZW4gMS8yMDAzLgotKi8KLS8qCi0gIENvcHlyaWdodCAoYykgMTk5MC0yMDAwIEluZm8tWklQLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBTZWUgdGhlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0UsIHZlcnNpb24gMjAwMC1BcHItMDkgb3IgbGF0ZXIKLSAgKHRoZSBjb250ZW50cyBvZiB3aGljaCBhcmUgYWxzbyBpbmNsdWRlZCBpbiB6aXAuaCkgZm9yIHRlcm1zIG9mIHVzZS4KLSAgSWYsIGZvciBzb21lIHJlYXNvbiwgYWxsIHRoZXNlIGZpbGVzIGFyZSBtaXNzaW5nLCB0aGUgSW5mby1aSVAgbGljZW5zZQotICBhbHNvIG1heSBiZSBmb3VuZCBhdDogIGZ0cDovL2Z0cC5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvbGljZW5zZS5odG1sCi0qLwotLyoKLSAgY3J5cHQuYyAoZnVsbCB2ZXJzaW9uKSBieSBJbmZvLVpJUC4gICAgICBMYXN0IHJldmlzZWQ6ICBbc2VlIGNyeXB0LmhdCi0KLSAgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwYXJ0cyBvZiB0aGlzIHNvdXJjZSBjb2RlIChhcyBvcHBvc2VkIHRvIHRoZQotICBub24tZWNob2luZyBwYXNzd29yZCBwYXJ0cykgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gRXVyb3BlLiAgVGhlCi0gIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCi0gIChQcmlvciB0byBKYW51YXJ5IDIwMDAsIHJlLWV4cG9ydCBmcm9tIHRoZSBVUyB3YXMgYSB2aW9sYXRpb24gb2YgVVMgbGF3LikKLSAqLwotCi0vKgotICBUaGlzIGVuY3J5cHRpb24gY29kZSBpcyBhIGRpcmVjdCB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZnJvbQotICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKLSAgZmlsZSAoYXBwbm90ZS50eHQpIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIFBLWklQIHByb2dyYW0gKGV2ZW4gaW4gdGhlCi0gIHZlcnNpb24gd2l0aG91dCBlbmNyeXB0aW9uIGNhcGFiaWxpdGllcykuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0jaW5jbHVkZSAidW56aXAuaCIKLQotI2lmZGVmIFNUREMKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIE5PX0VSUk5PX0gKLSAgICBleHRlcm4gaW50IGVycm5vOwotI2Vsc2UKLSMgICBpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLQotI2lmbmRlZiBsb2NhbAotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotI2VuZGlmCi0vKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KLQotCi0jaWZuZGVmIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8KLSMgIGlmICFkZWZpbmVkKHVuaXgpICYmICFkZWZpbmVkKENBU0VTRU5TSVRJVklUWURFRkFVTFRfWUVTKQotIyAgICBkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTwotIyAgZW5kaWYKLSNlbmRpZgotCi0KLSNpZm5kZWYgVU5aX0JVRlNJWkUKLSNkZWZpbmUgVU5aX0JVRlNJWkUgKDE2Mzg0KQotI2VuZGlmCi0KLSNpZm5kZWYgVU5aX01BWEZJTEVOQU1FSU5aSVAKLSNkZWZpbmUgVU5aX01BWEZJTEVOQU1FSU5aSVAgKDI1NikKLSNlbmRpZgotCi0jaWZuZGVmIEFMTE9DCi0jIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQotI2VuZGlmCi0jaWZuZGVmIFRSWUZSRUUKLSMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KLSNlbmRpZgotCi0jZGVmaW5lIFNJWkVDRU5UUkFMRElSSVRFTSAoMHgyZSkKLSNkZWZpbmUgU0laRVpJUExPQ0FMSEVBREVSICgweDFlKQotCi0KLQotCi1jb25zdCBjaGFyIHVuel9jb3B5cmlnaHRbXSA9Ci0gICAiIHVuemlwIDEuMDEgQ29weXJpZ2h0IDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudCAtIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwiOwotCi0vKiB1bnpfZmlsZV9pbmZvX2ludGVybnRhbCBjb250YWluIGludGVybmFsIGluZm8gYWJvdXQgYSBmaWxlIGluIHppcGZpbGUqLwotdHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfaW5mb19pbnRlcm5hbF9zCi17Ci0gICAgdUxvbmcgb2Zmc2V0X2N1cmZpbGU7LyogcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlciA0IGJ5dGVzICovCi19IHVuel9maWxlX2luZm9faW50ZXJuYWw7Ci0KLQotLyogZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MgY29udGFpbiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gemlwZmlsZSwKLSAgICB3aGVuIHJlYWRpbmcgYW5kIGRlY29tcHJlc3MgaXQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgY2hhciAgKnJlYWRfYnVmZmVyOyAgICAgICAgIC8qIGludGVybmFsIGJ1ZmZlciBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0gICAgel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLwotCi0gICAgdUxvbmcgcG9zX2luX3ppcGZpbGU7ICAgICAgIC8qIHBvc2l0aW9uIGluIGJ5dGUgb24gdGhlIHppcGZpbGUsIGZvciBmc2VlayovCi0gICAgdUxvbmcgc3RyZWFtX2luaXRpYWxpc2VkOyAgIC8qIGZsYWcgc2V0IGlmIHN0cmVhbSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGlzZWQqLwotCi0gICAgdUxvbmcgb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7Lyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLwotICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsvKiBzaXplIG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLwotICAgIHVMb25nIHBvc19sb2NhbF9leHRyYWZpZWxkOyAgIC8qIHBvc2l0aW9uIGluIHRoZSBsb2NhbCBleHRyYSBmaWVsZCBpbiByZWFkKi8KLQotICAgIHVMb25nIGNyYzMyOyAgICAgICAgICAgICAgICAvKiBjcmMzMiBvZiBhbGwgZGF0YSB1bmNvbXByZXNzZWQgKi8KLSAgICB1TG9uZyBjcmMzMl93YWl0OyAgICAgICAgICAgLyogY3JjMzIgd2UgbXVzdCBvYnRhaW4gYWZ0ZXIgZGVjb21wcmVzcyBhbGwgKi8KLSAgICB1TG9uZyByZXN0X3JlYWRfY29tcHJlc3NlZDsgLyogbnVtYmVyIG9mIGJ5dGUgdG8gYmUgZGVjb21wcmVzc2VkICovCi0gICAgdUxvbmcgcmVzdF9yZWFkX3VuY29tcHJlc3NlZDsvKm51bWJlciBvZiBieXRlIHRvIGJlIG9idGFpbmVkIGFmdGVyIGRlY29tcCovCi0gICAgemxpYl9maWxlZnVuY19kZWYgel9maWxlZnVuYzsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLwotICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgKDA9PXN0b3JlKSAqLwotICAgIHVMb25nIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLwotICAgIGludCAgIHJhdzsKLX0gZmlsZV9pbl96aXBfcmVhZF9pbmZvX3M7Ci0KLQotLyogdW56X3MgY29udGFpbiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgemlwZmlsZQotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgemxpYl9maWxlZnVuY19kZWYgel9maWxlZnVuYzsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLwotICAgIHVuel9nbG9iYWxfaW5mbyBnaTsgICAgICAgLyogcHVibGljIGdsb2JhbCBpbmZvcm1hdGlvbiAqLwotICAgIHVMb25nIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLwotICAgIHVMb25nIG51bV9maWxlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSovCi0gICAgdUxvbmcgcG9zX2luX2NlbnRyYWxfZGlyOyAgIC8qIHBvcyBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBjZW50cmFsIGRpciovCi0gICAgdUxvbmcgY3VycmVudF9maWxlX29rOyAgICAgIC8qIGZsYWcgYWJvdXQgdGhlIHVzYWJpbGl0eSBvZiB0aGUgY3VycmVudCBmaWxlKi8KLSAgICB1TG9uZyBjZW50cmFsX3BvczsgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VudHJhbCBkaXIqLwotCi0gICAgdUxvbmcgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgIHVMb25nIG9mZnNldF9jZW50cmFsX2RpcjsgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLwotCi0gICAgdW56X2ZpbGVfaW5mbyBjdXJfZmlsZV9pbmZvOyAvKiBwdWJsaWMgaW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlIGluIHppcCovCi0gICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCBjdXJfZmlsZV9pbmZvX2ludGVybmFsOyAvKiBwcml2YXRlIGluZm8gYWJvdXQgaXQqLwotICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZDsgLyogc3RydWN0dXJlIGFib3V0IHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpZiB3ZSBhcmUgZGVjb21wcmVzc2luZyBpdCAqLwotICAgIGludCBlbmNyeXB0ZWQ7Ci0jICAgIGlmbmRlZiBOT1VOQ1JZUFQKLSAgICB1bnNpZ25lZCBsb25nIGtleXNbM107ICAgICAvKiBrZXlzIGRlZmluaW5nIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlICovCi0gICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7Ci0jICAgIGVuZGlmCi19IHVuel9zOwotCi0KLSNpZm5kZWYgTk9VTkNSWVBUCi0jaW5jbHVkZSAiY3J5cHQuaCIKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmVhZCBhIGJ5dGUgZnJvbSBhIGd6X3N0cmVhbTsgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luLiBSZXR1cm4gRU9GCi0gICBmb3IgZW5kIG9mIGZpbGUuCi0gICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYmVlbiBzdWNlc3NmdWxseSBvcGVuZWQgZm9yIHJlYWRpbmcuCi0qLwotCi0KLWxvY2FsIGludCB1bnpsb2NhbF9nZXRCeXRlIE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgIGludCAqcGkpKTsKLQotbG9jYWwgaW50IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scGkpCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLSAgICBpbnQgKnBpOwotewotICAgIHVuc2lnbmVkIGNoYXIgYzsKLSAgICBpbnQgZXJyID0gKGludClaUkVBRCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmMsMSk7Ci0gICAgaWYgKGVycj09MSkKLSAgICB7Ci0gICAgICAgICpwaSA9IChpbnQpYzsKLSAgICAgICAgcmV0dXJuIFVOWl9PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKFpFUlJPUigqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pKQotICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFVOWl9FT0Y7Ci0gICAgfQotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMKLSovCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0U2hvcnQgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0sCi0gICAgdUxvbmcgKnBYKSk7Ci0KLWxvY2FsIGludCB1bnpsb2NhbF9nZXRTaG9ydCAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLSAgICB1TG9uZyAqcFg7Ci17Ci0gICAgdUxvbmcgeCA7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggPSAodUxvbmcpaTsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDw4OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICAqcFggPSB4OwotICAgIGVsc2UKLSAgICAgICAgKnBYID0gMDsKLSAgICByZXR1cm4gZXJyOwotfQotCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0TG9uZyBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICB1TG9uZyAqcFgpKTsKLQotbG9jYWwgaW50IHVuemxvY2FsX2dldExvbmcgKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBYKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci0gICAgdUxvbmcgKnBYOwotewotICAgIHVMb25nIHggOwotICAgIGludCBpOwotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ID0gKHVMb25nKWk7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8ODsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDwxNjsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDwyNDsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgKnBYID0geDsKLSAgICBlbHNlCi0gICAgICAgICpwWCA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKiBNeSBvd24gc3RyY21waSAvIHN0cmNhc2VjbXAgKi8KLWxvY2FsIGludCBzdHJjbXBjYXNlbm9zZW5zaXRpdmVfaW50ZXJuYWwgKGZpbGVOYW1lMSxmaWxlTmFtZTIpCi0gICAgY29uc3QgY2hhciogZmlsZU5hbWUxOwotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMjsKLXsKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgICAgY2hhciBjMT0qKGZpbGVOYW1lMSsrKTsKLSAgICAgICAgY2hhciBjMj0qKGZpbGVOYW1lMisrKTsKLSAgICAgICAgaWYgKChjMT49J2EnKSAmJiAoYzE8PSd6JykpCi0gICAgICAgICAgICBjMSAtPSAweDIwOwotICAgICAgICBpZiAoKGMyPj0nYScpICYmIChjMjw9J3onKSkKLSAgICAgICAgICAgIGMyIC09IDB4MjA7Ci0gICAgICAgIGlmIChjMT09J1wwJykKLSAgICAgICAgICAgIHJldHVybiAoKGMyPT0nXDAnKSA/IDAgOiAtMSk7Ci0gICAgICAgIGlmIChjMj09J1wwJykKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBpZiAoYzE8YzIpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChjMT5jMikKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotCi0jaWZkZWYgIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8KLSNkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFIDIKLSNlbHNlCi0jZGVmaW5lIENBU0VTRU5TSVRJVklUWURFRkFVTFRWQUxVRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04KLSNkZWZpbmUgU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9OIHN0cmNtcGNhc2Vub3NlbnNpdGl2ZV9pbnRlcm5hbAotI2VuZGlmCi0KLS8qCi0gICBDb21wYXJlIHR3byBmaWxlbmFtZSAoZmlsZU5hbWUxLGZpbGVOYW1lMikuCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAxLCBjb21wYXJpc2lvbiBpcyBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcCkKLSAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDIsIGNvbXBhcmlzaW9uIGlzIG5vdCBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdHJjYXNlY21wKQotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMCwgY2FzZSBzZW5zaXRpdml0eSBpcyBkZWZhdXQgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtCi0gICAgICAgIChsaWtlIDEgb24gVW5peCwgMiBvbiBXaW5kb3dzKQotCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAoZmlsZU5hbWUxLGZpbGVOYW1lMixpQ2FzZVNlbnNpdGl2aXR5KQotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMTsKLSAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTI7Ci0gICAgaW50IGlDYXNlU2Vuc2l0aXZpdHk7Ci17Ci0gICAgaWYgKGlDYXNlU2Vuc2l0aXZpdHk9PTApCi0gICAgICAgIGlDYXNlU2Vuc2l0aXZpdHk9Q0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFOwotCi0gICAgaWYgKGlDYXNlU2Vuc2l0aXZpdHk9PTEpCi0gICAgICAgIHJldHVybiBzdHJjbXAoZmlsZU5hbWUxLGZpbGVOYW1lMik7Ci0KLSAgICByZXR1cm4gU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9OKGZpbGVOYW1lMSxmaWxlTmFtZTIpOwotfQotCi0jaWZuZGVmIEJVRlJFQURDT01NRU5UCi0jZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkKLSNlbmRpZgotCi0vKgotICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKLSAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCi0qLwotbG9jYWwgdUxvbmcgdW56bG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSkpOwotCi1sb2NhbCB1TG9uZyB1bnpsb2NhbF9TZWFyY2hDZW50cmFsRGlyKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci17Ci0gICAgdW5zaWduZWQgY2hhciogYnVmOwotICAgIHVMb25nIHVTaXplRmlsZTsKLSAgICB1TG9uZyB1QmFja1JlYWQ7Ci0gICAgdUxvbmcgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KLSAgICB1TG9uZyB1UG9zRm91bmQ9MDsKLQotICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLQotCi0gICAgdVNpemVGaWxlID0gWlRFTEwoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKLQotICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCi0gICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOwotCi0gICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgdUJhY2tSZWFkID0gNDsKLSAgICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVJlYWRTaXplLHVSZWFkUG9zIDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCi0gICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKLSAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsKLQotICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KLSAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1U2l6ZUZpbGUtdVJlYWRQb3MpOwotICAgICAgICBpZiAoWlNFRUsoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKFpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQotICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgotICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBUUllGUkVFKGJ1Zik7Ci0gICAgcmV0dXJuIHVQb3NGb3VuZDsKLX0KLQotLyoKLSAgT3BlbiBhIFppcCBmaWxlLiBwYXRoIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgKGJ5IGV4YW1wbGUsCi0gICAgIG9uIGEgV2luZG93cyBOVCBjb21wdXRlciAiYzpcXHRlc3RcXHpsaWIxMTQuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCi0gICAgICJ6bGliL3psaWIxMTQuemlwIi4KLSAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGluIG5vdCB2YWxpZCksIHRoZQotICAgICAgIHJldHVybiB2YWx1ZSBpcyBOVUxMLgotICAgICBFbHNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdW56RmlsZSBIYW5kbGUsIHVzYWJsZSB3aXRoIG90aGVyIGZ1bmN0aW9uCi0gICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLgotKi8KLWV4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjIgKHBhdGgsIHB6bGliX2ZpbGVmdW5jX2RlZikKLSAgICBjb25zdCBjaGFyICpwYXRoOwotICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci17Ci0gICAgdW56X3MgdXM7Ci0gICAgdW56X3MgKnM7Ci0gICAgdUxvbmcgY2VudHJhbF9wb3MsdUw7Ci0KLSAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgIHVMb25nIG51bWJlcl9kaXNrX3dpdGhfQ0Q7ICAvKiBudW1iZXIgdGhlIHRoZSBkaXNrIHdpdGggY2VudHJhbCBkaXIsIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgIHVMb25nIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLwotCi0gICAgaW50IGVycj1VTlpfT0s7Ci0KLSAgICBpZiAodW56X2NvcHlyaWdodFswXSE9JyAnKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChwemxpYl9maWxlZnVuY19kZWY9PU5VTEwpCi0gICAgICAgIGZpbGxfZm9wZW5fZmlsZWZ1bmMoJnVzLnpfZmlsZWZ1bmMpOwotICAgIGVsc2UKLSAgICAgICAgdXMuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuY19kZWY7Ci0KLSAgICB1cy5maWxlc3RyZWFtPSAoKih1cy56X2ZpbGVmdW5jLnpvcGVuX2ZpbGUpKSh1cy56X2ZpbGVmdW5jLm9wYXF1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpOwotICAgIGlmICh1cy5maWxlc3RyZWFtPT1OVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNlbnRyYWxfcG9zID0gdW56bG9jYWxfU2VhcmNoQ2VudHJhbERpcigmdXMuel9maWxlZnVuYyx1cy5maWxlc3RyZWFtKTsKLSAgICBpZiAoY2VudHJhbF9wb3M9PTApCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAoWlNFRUsodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZGlzaykhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5naS5udW1iZXJfZW50cnkpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeV9DRCkhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT11cy5naS5udW1iZXJfZW50cnkpIHx8Ci0gICAgICAgIChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fAotICAgICAgICAobnVtYmVyX2Rpc2shPTApKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5zaXplX2NlbnRyYWxfZGlyKSE9VU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLwotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5vZmZzZXRfY2VudHJhbF9kaXIpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiB6aXBmaWxlIGNvbW1lbnQgbGVuZ3RoICovCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5naS5zaXplX2NvbW1lbnQpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAoKGNlbnRyYWxfcG9zPHVzLm9mZnNldF9jZW50cmFsX2Rpcit1cy5zaXplX2NlbnRyYWxfZGlyKSAmJgotICAgICAgICAoZXJyPT1VTlpfT0spKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgewotICAgICAgICBaQ0xPU0UodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHVzLmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlID0gY2VudHJhbF9wb3MgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cy5vZmZzZXRfY2VudHJhbF9kaXIrdXMuc2l6ZV9jZW50cmFsX2Rpcik7Ci0gICAgdXMuY2VudHJhbF9wb3MgPSBjZW50cmFsX3BvczsKLSAgICB1cy5wZmlsZV9pbl96aXBfcmVhZCA9IE5VTEw7Ci0gICAgdXMuZW5jcnlwdGVkID0gMDsKLQotCi0gICAgcz0odW56X3MqKUFMTE9DKHNpemVvZih1bnpfcykpOwotICAgICpzPXVzOwotICAgIHVuekdvVG9GaXJzdEZpbGUoKHVuekZpbGUpcyk7Ci0gICAgcmV0dXJuICh1bnpGaWxlKXM7Ci19Ci0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIChwYXRoKQotICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci17Ci0gICAgcmV0dXJuIHVuek9wZW4yKHBhdGgsIE5VTEwpOwotfQotCi0vKgotICBDbG9zZSBhIFppcEZpbGUgb3BlbmVkIHdpdGggdW56aXBPcGVuLgotICBJZiB0aGVyZSBpcyBmaWxlcyBpbnNpZGUgdGhlIC5aaXAgb3BlbmVkIHdpdGggdW56aXBPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCi0gICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnppcENsb3NlQ3VycmVudEZpbGUgYmVmb3JlIGNhbGwgdW56aXBDbG9zZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlIChmaWxlKQotICAgIHVuekZpbGUgZmlsZTsKLXsKLSAgICB1bnpfcyogczsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotCi0gICAgaWYgKHMtPnBmaWxlX2luX3ppcF9yZWFkIT1OVUxMKQotICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKGZpbGUpOwotCi0gICAgWkNMT1NFKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0pOwotICAgIFRSWUZSRUUocyk7Ci0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotCi0vKgotICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KLSAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gKGZpbGUscGdsb2JhbF9pbmZvKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbzsKLXsKLSAgICB1bnpfcyogczsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgICpwZ2xvYmFsX2luZm89cy0+Z2k7Ci0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotCi0vKgotICAgVHJhbnNsYXRlIGRhdGUvdGltZSBmcm9tIERvcyBmb3JtYXQgdG8gdG1fdW56IChyZWFkYWJsZSBtb3JlIGVhc2lsdHkpCi0qLwotbG9jYWwgdm9pZCB1bnpsb2NhbF9Eb3NEYXRlVG9UbXVEYXRlICh1bERvc0RhdGUsIHB0bSkKLSAgICB1TG9uZyB1bERvc0RhdGU7Ci0gICAgdG1fdW56KiBwdG07Ci17Ci0gICAgdUxvbmcgdURhdGU7Ci0gICAgdURhdGUgPSAodUxvbmcpKHVsRG9zRGF0ZT4+MTYpOwotICAgIHB0bS0+dG1fbWRheSA9ICh1SW50KSh1RGF0ZSYweDFmKSA7Ci0gICAgcHRtLT50bV9tb24gPSAgKHVJbnQpKCgoKHVEYXRlKSYweDFFMCkvMHgyMCktMSkgOwotICAgIHB0bS0+dG1feWVhciA9ICh1SW50KSgoKHVEYXRlJjB4MEZFMDApLzB4MDIwMCkrMTk4MCkgOwotCi0gICAgcHRtLT50bV9ob3VyID0gKHVJbnQpICgodWxEb3NEYXRlICYweEY4MDApLzB4ODAwKTsKLSAgICBwdG0tPnRtX21pbiA9ICAodUludCkgKCh1bERvc0RhdGUmMHg3RTApLzB4MjApIDsKLSAgICBwdG0tPnRtX3NlYyA9ICAodUludCkgKDIqKHVsRG9zRGF0ZSYweDFmKSkgOwotfQotCi0vKgotICBHZXQgSW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlLCB3aXRoIGludGVybmFsIG9ubHkgaW5mbwotKi8KLWxvY2FsIGludCB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZmlsZV9pbmZvX2ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKSk7Ci0KLWxvY2FsIGludCB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCAoZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSwgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsIGV4dHJhRmllbGRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCwgIGNvbW1lbnRCdWZmZXJTaXplKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvOwotICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwgKnBmaWxlX2luZm9faW50ZXJuYWw7Ci0gICAgY2hhciAqc3pGaWxlTmFtZTsKLSAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemU7Ci0gICAgdm9pZCAqZXh0cmFGaWVsZDsKLSAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZTsKLSAgICBjaGFyICpzekNvbW1lbnQ7Ci0gICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemU7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgdW56X2ZpbGVfaW5mbyBmaWxlX2luZm87Ci0gICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCBmaWxlX2luZm9faW50ZXJuYWw7Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdUxvbmcgdU1hZ2ljOwotICAgIGxvbmcgbFNlZWs9MDsKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgIHMtPnBvc19pbl9jZW50cmFsX2RpcitzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKLSAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLQotICAgIC8qIHdlIGNoZWNrIHRoZSBtYWdpYyAqLwotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVNYWdpYykgIT0gVU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgZWxzZSBpZiAodU1hZ2ljIT0weDAyMDE0YjUwKQotICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbikgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbl9uZWVkZWQpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmZsYWcpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5kb3NEYXRlKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICB1bnpsb2NhbF9Eb3NEYXRlVG9UbXVEYXRlKGZpbGVfaW5mby5kb3NEYXRlLCZmaWxlX2luZm8udG11X2RhdGUpOwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jcmMpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5kaXNrX251bV9zdGFydCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uaW50ZXJuYWxfZmEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZXh0ZXJuYWxfZmEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlbmFtZTsKLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoc3pGaWxlTmFtZSE9TlVMTCkpCi0gICAgewotICAgICAgICB1TG9uZyB1U2l6ZVJlYWQgOwotICAgICAgICBpZiAoZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU8ZmlsZU5hbWVCdWZmZXJTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAqKHN6RmlsZU5hbWUrZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpPSdcMCc7Ci0gICAgICAgICAgICB1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlbmFtZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1U2l6ZVJlYWQgPSBmaWxlTmFtZUJ1ZmZlclNpemU7Ci0KLSAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlbmFtZT4wKSAmJiAoZmlsZU5hbWVCdWZmZXJTaXplPjApKQotICAgICAgICAgICAgaWYgKFpSRUFEKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc3pGaWxlTmFtZSx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgbFNlZWsgLT0gdVNpemVSZWFkOwotICAgIH0KLQotCi0gICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKGV4dHJhRmllbGQhPU5VTEwpKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKLSAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE8ZXh0cmFGaWVsZEJ1ZmZlclNpemUpCi0gICAgICAgICAgICB1U2l6ZVJlYWQgPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1U2l6ZVJlYWQgPSBleHRyYUZpZWxkQnVmZmVyU2l6ZTsKLQotICAgICAgICBpZiAobFNlZWshPTApCi0gICAgICAgICAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKLSAgICAgICAgICAgICAgICBsU2Vlaz0wOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYT4wKSAmJiAoZXh0cmFGaWVsZEJ1ZmZlclNpemU+MCkpCi0gICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxleHRyYUZpZWxkLHVTaXplUmVhZCkhPXVTaXplUmVhZCkKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBsU2VlayArPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhIC0gdVNpemVSZWFkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOwotCi0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoc3pDb21tZW50IT1OVUxMKSkKLSAgICB7Ci0gICAgICAgIHVMb25nIHVTaXplUmVhZCA7Ci0gICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ8Y29tbWVudEJ1ZmZlclNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICooc3pDb21tZW50K2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCk9J1wwJzsKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1U2l6ZVJlYWQgPSBjb21tZW50QnVmZmVyU2l6ZTsKLQotICAgICAgICBpZiAobFNlZWshPTApCi0gICAgICAgICAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKLSAgICAgICAgICAgICAgICBsU2Vlaz0wOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50PjApICYmIChjb21tZW50QnVmZmVyU2l6ZT4wKSkKLSAgICAgICAgICAgIGlmIChaUkVBRChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCAtIHVTaXplUmVhZDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwotCi0gICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8hPU5VTEwpKQotICAgICAgICAqcGZpbGVfaW5mbz1maWxlX2luZm87Ci0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mb19pbnRlcm5hbCE9TlVMTCkpCi0gICAgICAgICpwZmlsZV9pbmZvX2ludGVybmFsPWZpbGVfaW5mb19pbnRlcm5hbDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotCi0vKgotICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KLSAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLgotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm8gKGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSwgZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsICBjb21tZW50QnVmZmVyU2l6ZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci0gICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbzsKLSAgICBjaGFyICpzekZpbGVOYW1lOwotICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZTsKLSAgICB2b2lkICpleHRyYUZpZWxkOwotICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplOwotICAgIGNoYXIgKnN6Q29tbWVudDsKLSAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZTsKLXsKLSAgICByZXR1cm4gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSxwZmlsZV9pbmZvLE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsY29tbWVudEJ1ZmZlclNpemUpOwotfQotCi0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIGludCBlcnI9VU5aX09LOwotICAgIHVuel9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyPXMtPm9mZnNldF9jZW50cmFsX2RpcjsKLSAgICBzLT5udW1fZmlsZT0wOwotICAgIGVycj11bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7Ci0gICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qCi0gIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBuZXh0IGZpbGUuCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQotICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGFjdHVhbCBmaWxlIHdhcyB0aGUgbGF0ZXN0LgotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvTmV4dEZpbGUgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIHVuel9zKiBzOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0gICAgaWYgKHMtPmdpLm51bWJlcl9lbnRyeSAhPSAweGZmZmYpICAgIC8qIDJeMTYgZmlsZXMgb3ZlcmZsb3cgaGFjayAqLwotICAgICAgaWYgKHMtPm51bV9maWxlKzE9PXMtPmdpLm51bWJlcl9lbnRyeSkKLSAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOwotCi0gICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyICs9IFNJWkVDRU5UUkFMRElSSVRFTSArIHMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlbmFtZSArCi0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYSArIHMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQgOwotICAgIHMtPm51bV9maWxlKys7Ci0gICAgZXJyID0gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKLSAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKgotICBUcnkgbG9jYXRlIHRoZSBmaWxlIHN6RmlsZU5hbWUgaW4gdGhlIHppcGZpbGUuCi0gIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56aXBTdHJpbmdGaWxlTmFtZUNvbXBhcmUKLQotICByZXR1cm4gdmFsdWUgOgotICBVTlpfT0sgaWYgdGhlIGZpbGUgaXMgZm91bmQuIEl0IGJlY29tZXMgdGhlIGN1cnJlbnQgZmlsZS4KLSAgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekxvY2F0ZUZpbGUgKGZpbGUsIHN6RmlsZU5hbWUsIGlDYXNlU2Vuc2l0aXZpdHkpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIgKnN6RmlsZU5hbWU7Ci0gICAgaW50IGlDYXNlU2Vuc2l0aXZpdHk7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgaW50IGVycjsKLQotICAgIC8qIFdlIHJlbWVtYmVyIHRoZSAnY3VycmVudCcgcG9zaXRpb24gaW4gdGhlIGZpbGUgc28gdGhhdCB3ZSBjYW4ganVtcAotICAgICAqIGJhY2sgdGhlcmUgaWYgd2UgZmFpbC4KLSAgICAgKi8KLSAgICB1bnpfZmlsZV9pbmZvIGN1cl9maWxlX2luZm9TYXZlZDsKLSAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsIGN1cl9maWxlX2luZm9faW50ZXJuYWxTYXZlZDsKLSAgICB1TG9uZyBudW1fZmlsZVNhdmVkOwotICAgIHVMb25nIHBvc19pbl9jZW50cmFsX2RpclNhdmVkOwotCi0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHN0cmxlbihzekZpbGVOYW1lKT49VU5aX01BWEZJTEVOQU1FSU5aSVApCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIHM9KHVuel9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0KLSAgICAvKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlICovCi0gICAgbnVtX2ZpbGVTYXZlZCA9IHMtPm51bV9maWxlOwotICAgIHBvc19pbl9jZW50cmFsX2RpclNhdmVkID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOwotICAgIGN1cl9maWxlX2luZm9TYXZlZCA9IHMtPmN1cl9maWxlX2luZm87Ci0gICAgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsKLQotICAgIGVyciA9IHVuekdvVG9GaXJzdEZpbGUoZmlsZSk7Ci0KLSAgICB3aGlsZSAoZXJyID09IFVOWl9PSykKLSAgICB7Ci0gICAgICAgIGNoYXIgc3pDdXJyZW50RmlsZU5hbWVbVU5aX01BWEZJTEVOQU1FSU5aSVArMV07Ci0gICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbyhmaWxlLE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekN1cnJlbnRGaWxlTmFtZSxzaXplb2Yoc3pDdXJyZW50RmlsZU5hbWUpLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwKTsKLSAgICAgICAgaWYgKGVyciA9PSBVTlpfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUoc3pDdXJyZW50RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsaUNhc2VTZW5zaXRpdml0eSk9PTApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9PSzsKLSAgICAgICAgICAgIGVyciA9IHVuekdvVG9OZXh0RmlsZShmaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFdlIGZhaWxlZCwgc28gcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlICdjdXJyZW50IGZpbGUnIHRvIHdoZXJlIHdlCi0gICAgICogd2VyZS4KLSAgICAgKi8KLSAgICBzLT5udW1fZmlsZSA9IG51bV9maWxlU2F2ZWQgOwotICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciA9IHBvc19pbl9jZW50cmFsX2RpclNhdmVkIDsKLSAgICBzLT5jdXJfZmlsZV9pbmZvID0gY3VyX2ZpbGVfaW5mb1NhdmVkOwotICAgIHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwgPSBjdXJfZmlsZV9pbmZvX2ludGVybmFsU2F2ZWQ7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29udHJpYnV0ZWQgYnkgUnlhbiBIYWtzaSAobWFpbHRvOi8vY3J5b2dlbkBpbmZvc2VydmUubmV0KQotLy8gSSBuZWVkIHJhbmRvbSBhY2Nlc3MKLS8vCi0vLyBGdXJ0aGVyIG9wdGltaXphdGlvbiBjb3VsZCBiZSByZWFsaXplZCBieSBhZGRpbmcgYW4gYWJpbGl0eQotLy8gdG8gY2FjaGUgdGhlIGRpcmVjdG9yeSBpbiBtZW1vcnkuIFRoZSBnb2FsIGJlaW5nIGEgc2luZ2xlCi0vLyBjb21wcmVoZW5zaXZlIGZpbGUgcmVhZCB0byBwdXQgdGhlIGZpbGUgSSBuZWVkIGluIGEgbWVtb3J5LgotKi8KLQotLyoKLXR5cGVkZWYgc3RydWN0IHVuel9maWxlX3Bvc19zCi17Ci0gICAgdUxvbmcgcG9zX2luX3ppcF9kaXJlY3Rvcnk7ICAgLy8gb2Zmc2V0IGluIGZpbGUKLSAgICB1TG9uZyBudW1fb2ZfZmlsZTsgICAgICAgICAgICAvLyAjIG9mIGZpbGUKLX0gdW56X2ZpbGVfcG9zOwotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEZpbGVQb3MoZmlsZSwgZmlsZV9wb3MpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3M7Ci17Ci0gICAgdW56X3MqIHM7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCB8fCBmaWxlX3Bvcz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0KLSAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOwotICAgIGZpbGVfcG9zLT5udW1fb2ZfZmlsZSAgICAgICAgICAgPSBzLT5udW1fZmlsZTsKLQotICAgIHJldHVybiBVTlpfT0s7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvcyhmaWxlLCBmaWxlX3BvcykKLSAgICB1bnpGaWxlIGZpbGU7Ci0gICAgdW56X2ZpbGVfcG9zKiBmaWxlX3BvczsKLXsKLSAgICB1bnpfcyogczsKLSAgICBpbnQgZXJyOwotCi0gICAgaWYgKGZpbGU9PU5VTEwgfHwgZmlsZV9wb3M9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLQotICAgIC8qIGp1bXAgdG8gdGhlIHJpZ2h0IHNwb3QgKi8KLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7Ci0gICAgcy0+bnVtX2ZpbGUgICAgICAgICAgID0gZmlsZV9wb3MtPm51bV9vZl9maWxlOwotCi0gICAgLyogc2V0IHRoZSBjdXJyZW50IGZpbGUgKi8KLSAgICBlcnIgPSB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotICAgIC8qIHJldHVybiByZXN1bHRzICovCi0gICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qCi0vLyBVbnppcCBIZWxwZXIgRnVuY3Rpb25zIC0gc2hvdWxkIGJlIGhlcmU/Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0qLwotCi0vKgotICBSZWFkIHRoZSBsb2NhbCBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgemlwZmlsZQotICBDaGVjayB0aGUgY29oZXJlbmN5IG9mIHRoZSBsb2NhbCBoZWFkZXIgYW5kIGluZm8gaW4gdGhlIGVuZCBvZiBjZW50cmFsCi0gICAgICAgIGRpcmVjdG9yeSBhYm91dCB0aGlzIGZpbGUKLSAgc3RvcmUgaW4gKnBpU2l6ZVZhciB0aGUgc2l6ZSBvZiBleHRyYSBpbmZvIGluIGxvY2FsIGhlYWRlcgotICAgICAgICAoZmlsZW5hbWUgYW5kIHNpemUgb2YgZXh0cmEgZmllbGQgZGF0YSkKLSovCi1sb2NhbCBpbnQgdW56bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlciAocyxwaVNpemVWYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplX2xvY2FsX2V4dHJhZmllbGQpCi0gICAgdW56X3MqIHM7Ci0gICAgdUludCogcGlTaXplVmFyOwotICAgIHVMb25nICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7Ci0gICAgdUludCAgKnBzaXplX2xvY2FsX2V4dHJhZmllbGQ7Ci17Ci0gICAgdUxvbmcgdU1hZ2ljLHVEYXRhLHVGbGFnczsKLSAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOwotICAgIHVMb25nIHNpemVfZXh0cmFfZmllbGQ7Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0KLSAgICAqcGlTaXplVmFyID0gMDsKLSAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gMDsKLSAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IDA7Ci0KLSAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVNYWdpYykgIT0gVU5aX09LKQotICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgZWxzZSBpZiAodU1hZ2ljIT0weDA0MDM0YjUwKQotICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotLyoKLSAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby53VmVyc2lvbikpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLSovCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RmxhZ3MpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKLSAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIGRhdGUvdGltZSAqLwotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIGNyYyAqLwotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNyYykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodUZsYWdzICYgOCk9PTApKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogc2l6ZSBjb21wciAqLwotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodUZsYWdzICYgOCk9PTApKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogc2l6ZSB1bmNvbXByICovCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVGbGFncyAmIDgpPT0wKSkKLSAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmIChzaXplX2ZpbGVuYW1lIT1zLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZmlsZW5hbWU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZXh0cmFfZmllbGQpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkPSBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVaSVBMT0NBTEhFQURFUiArIHNpemVfZmlsZW5hbWU7Ci0gICAgKnBzaXplX2xvY2FsX2V4dHJhZmllbGQgPSAodUludClzaXplX2V4dHJhX2ZpZWxkOwotCi0gICAgKnBpU2l6ZVZhciArPSAodUludClzaXplX2V4dHJhX2ZpZWxkOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoKLSAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCi0gIElmIHRoZXJlIGlzIG5vIGVycm9yIGFuZCB0aGUgZmlsZSBpcyBvcGVuZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUzIChmaWxlLCBtZXRob2QsIGxldmVsLCByYXcsIHBhc3N3b3JkKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICBpbnQqIG1ldGhvZDsKLSAgICBpbnQqIGxldmVsOwotICAgIGludCByYXc7Ci0gICAgY29uc3QgY2hhciogcGFzc3dvcmQ7Ci17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdUludCBpU2l6ZVZhcjsKLSAgICB1bnpfcyogczsKLSAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICB1TG9uZyBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsgIC8qIG9mZnNldCBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KLSAgICB1SW50ICBzaXplX2xvY2FsX2V4dHJhZmllbGQ7ICAgIC8qIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0jICAgIGlmbmRlZiBOT1VOQ1JZUFQKLSAgICBjaGFyIHNvdXJjZVsxMl07Ci0jICAgIGVsc2UKLSAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotIyAgICBlbmRpZgotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHMtPnBmaWxlX2luX3ppcF9yZWFkICE9IE5VTEwpCi0gICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7Ci0KLSAgICBpZiAodW56bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlcihzLCZpU2l6ZVZhciwKLSAgICAgICAgICAgICAgICAmb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsJnNpemVfbG9jYWxfZXh0cmFmaWVsZCkhPVVOWl9PSykKLSAgICAgICAgcmV0dXJuIFVOWl9CQURaSVBGSUxFOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbyA9IChmaWxlX2luX3ppcF9yZWFkX2luZm9fcyopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMT0Moc2l6ZW9mKGZpbGVfaW5femlwX3JlYWRfaW5mb19zKSk7Ci0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyPShjaGFyKilBTExPQyhVTlpfQlVGU0laRSk7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+b2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zaXplX2xvY2FsX2V4dHJhZmllbGQgPSBzaXplX2xvY2FsX2V4dHJhZmllbGQ7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQ9MDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXc9cmF3OwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyPT1OVUxMKQotICAgIHsKLSAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKLSAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD0wOwotCi0gICAgaWYgKG1ldGhvZCE9TlVMTCkKLSAgICAgICAgKm1ldGhvZCA9IChpbnQpcy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q7Ci0KLSAgICBpZiAobGV2ZWwhPU5VTEwpCi0gICAgewotICAgICAgICAqbGV2ZWwgPSA2OwotICAgICAgICBzd2l0Y2ggKHMtPmN1cl9maWxlX2luZm8uZmxhZyAmIDB4MDYpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIDYgOiAqbGV2ZWwgPSAxOyBicmVhazsKLSAgICAgICAgICBjYXNlIDQgOiAqbGV2ZWwgPSAyOyBicmVhazsKLSAgICAgICAgICBjYXNlIDIgOiAqbGV2ZWwgPSA5OyBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCi0gICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9ERUZMQVRFRCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyX3dhaXQ9cy0+Y3VyX2ZpbGVfaW5mby5jcmM7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzI9MDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2QgPQotICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbT1zLT5maWxlc3RyZWFtOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmM9cy0+el9maWxlZnVuYzsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZT1zLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgPSAwOwotCi0gICAgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9ERUZMQVRFRCkgJiYKLSAgICAgICAgKCFyYXcpKQotICAgIHsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0gKHZvaWRwZikwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gMDsKLQotICAgICAgZXJyPWluZmxhdGVJbml0MigmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLCAtTUFYX1dCSVRTKTsKLSAgICAgIGlmIChlcnIgPT0gWl9PSykKLSAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPTE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIC8qIHdpbmRvd0JpdHMgaXMgcGFzc2VkIDwgMCB0byB0ZWxsIHRoYXQgdGhlcmUgaXMgbm8gemxpYiBoZWFkZXIuCi0gICAgICAgICAqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgaW5mbGF0ZSAqcmVxdWlyZXMqIGFuIGV4dHJhICJkdW1teSIgYnl0ZQotICAgICAgICAgKiBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0gaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBhbmQKLSAgICAgICAgICogcmV0dXJuIFpfU1RSRUFNX0VORC4KLSAgICAgICAgICogSW4gdW56aXAsIGkgZG9uJ3Qgd2FpdCBhYnNvbHV0ZWx5IFpfU1RSRUFNX0VORCBiZWNhdXNlIEkga25vd24gdGhlCi0gICAgICAgICAqIHNpemUgb2YgYm90aCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgZGF0YQotICAgICAgICAgKi8KLSAgICB9Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQgPQotICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUgOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPQotICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSA7Ci0KLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlID0KLSAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKyBTSVpFWklQTE9DQUxIRUFERVIgKwotICAgICAgICAgICAgICBpU2l6ZVZhcjsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KTA7Ci0KLSAgICBzLT5wZmlsZV9pbl96aXBfcmVhZCA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0KLSMgICAgaWZuZGVmIE5PVU5DUllQVAotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIHMtPnBjcmNfMzJfdGFiID0gZ2V0X2NyY190YWJsZSgpOwotICAgICAgICBpbml0X2tleXMocGFzc3dvcmQscy0+a2V5cyxzLT5wY3JjXzMyX3RhYik7Ci0gICAgICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlICsKLSAgICAgICAgICAgICAgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKLSAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLSAgICAgICAgaWYoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzb3VyY2UsIDEyKTwxMikKLSAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpPDEyOyBpKyspCi0gICAgICAgICAgICB6ZGVjb2RlKHMtPmtleXMscy0+cGNyY18zMl90YWIsc291cmNlW2ldKTsKLQotICAgICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZC0+cG9zX2luX3ppcGZpbGUrPTEyOwotICAgICAgICBzLT5lbmNyeXB0ZWQ9MTsKLSAgICB9Ci0jICAgIGVuZGlmCi0KLQotICAgIHJldHVybiBVTlpfT0s7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgKGZpbGUsIHBhc3N3b3JkKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICByZXR1cm4gdW56T3BlbkN1cnJlbnRGaWxlMyhmaWxlLCBOVUxMLCBOVUxMLCAwLCBwYXNzd29yZCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUyIChmaWxlLG1ldGhvZCxsZXZlbCxyYXcpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIGludCogbWV0aG9kOwotICAgIGludCogbGV2ZWw7Ci0gICAgaW50IHJhdzsKLXsKLSAgICByZXR1cm4gdW56T3BlbkN1cnJlbnRGaWxlMyhmaWxlLCBtZXRob2QsIGxldmVsLCByYXcsIE5VTEwpOwotfQotCi0vKgotICBSZWFkIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZS4KLSAgYnVmIGNvbnRhaW4gYnVmZmVyIHdoZXJlIGRhdGEgbXVzdCBiZSBjb3BpZWQKLSAgbGVuIHRoZSBzaXplIG9mIGJ1Zi4KLQotICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlIGNvcGllZCBpZiBzb21lcyBieXRlcyBhcmUgY29waWVkCi0gIHJldHVybiAwIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZAotICByZXR1cm4gPDAgd2l0aCBlcnJvciBjb2RlIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgKFVOWl9FUlJOTyBmb3IgSU8gZXJyb3IsIG9yIHpMaWIgZXJyb3IgZm9yIHVuY29tcHJlc3MgZXJyb3IpCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlYWRDdXJyZW50RmlsZSAgKGZpbGUsIGJ1ZiwgbGVuKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB2b2lkcCBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIGludCBlcnI9VU5aX09LOwotICAgIHVJbnQgaVJlYWQgPSAwOwotICAgIHVuel9zKiBzOwotICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLQotICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPT0gTlVMTCkpCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLSAgICBpZiAobGVuPT0wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCA9IChCeXRlZiopYnVmOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWxlbjsKLQotICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQpICYmCi0gICAgICAgICghKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdykpKQotICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0KLSAgICAgICAgICAgICh1SW50KXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQ7Ci0KLSAgICBpZiAoKGxlbj5wZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCsKLSAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luKSAmJgotICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdykpCi0gICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPQotICAgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQrCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW47Ci0KLSAgICB3aGlsZSAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dD4wKQotICAgIHsKLSAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW49PTApICYmCi0gICAgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ+MCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgdVJlYWRUaGlzID0gVU5aX0JVRlNJWkU7Ci0gICAgICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ8dVJlYWRUaGlzKQotICAgICAgICAgICAgICAgIHVSZWFkVGhpcyA9ICh1SW50KXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkOwotICAgICAgICAgICAgaWYgKHVSZWFkVGhpcyA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRU9GOwotICAgICAgICAgICAgaWYgKFpTRUVLKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLSAgICAgICAgICAgIGlmIChaUkVBRChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAotICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQotICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLQotIyAgICAgICAgICAgIGlmbmRlZiBOT1VOQ1JZUFQKLSAgICAgICAgICAgIGlmKHMtPmVuY3J5cHRlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1SW50IGk7Ci0gICAgICAgICAgICAgICAgZm9yKGk9MDtpPHVSZWFkVGhpcztpKyspCi0gICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcltpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgemRlY29kZShzLT5rZXlzLHMtPnBjcmNfMzJfdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0pOwotICAgICAgICAgICAgfQotIyAgICAgICAgICAgIGVuZGlmCi0KLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKz0gdVJlYWRUaGlzOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZC09dVJlYWRUaGlzOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9Ci0gICAgICAgICAgICAgICAgKEJ5dGVmKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcjsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVSZWFkVGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT0wKSB8fCAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKLSAgICAgICAgewotICAgICAgICAgICAgdUludCB1RG9Db3B5LGkgOwotCi0gICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSAmJgotICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKLQotICAgICAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbikKLSAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdURvQ29weSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA7Ci0KLSAgICAgICAgICAgIGZvciAoaT0wO2k8dURvQ29weTtpKyspCi0gICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQraSkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbitpKTsKLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1RG9Db3B5KTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQtPXVEb0NvcHk7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gLT0gdURvQ29weTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgLT0gdURvQ29weTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCArPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gKz0gdURvQ29weTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgKz0gdURvQ29weTsKLSAgICAgICAgICAgIGlSZWFkICs9IHVEb0NvcHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUsdVRvdGFsT3V0QWZ0ZXI7Ci0gICAgICAgICAgICBjb25zdCBCeXRlZiAqYnVmQmVmb3JlOwotICAgICAgICAgICAgdUxvbmcgdU91dFRoaXM7Ci0gICAgICAgICAgICBpbnQgZmx1c2g9Wl9TWU5DX0ZMVVNIOwotCi0gICAgICAgICAgICB1VG90YWxPdXRCZWZvcmUgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OwotICAgICAgICAgICAgYnVmQmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0OwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09Ci0gICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0KSAmJgotICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKLSAgICAgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGVycj1pbmZsYXRlKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sZmx1c2gpOwotCi0gICAgICAgICAgICBpZiAoKGVycj49MCkgJiYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5tc2chPU5VTEwpKQotICAgICAgICAgICAgICBlcnIgPSBaX0RBVEFfRVJST1I7Ci0KLSAgICAgICAgICAgIHVUb3RhbE91dEFmdGVyID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKLSAgICAgICAgICAgIHVPdXRUaGlzID0gdVRvdGFsT3V0QWZ0ZXItdVRvdGFsT3V0QmVmb3JlOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9Ci0gICAgICAgICAgICAgICAgY3JjMzIocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIsYnVmQmVmb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVJbnQpKHVPdXRUaGlzKSk7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgLT0KLSAgICAgICAgICAgICAgICB1T3V0VGhpczsKLQotICAgICAgICAgICAgaVJlYWQgKz0gKHVJbnQpKHVUb3RhbE91dEFmdGVyIC0gdVRvdGFsT3V0QmVmb3JlKTsKLQotICAgICAgICAgICAgaWYgKGVycj09Wl9TVFJFQU1fRU5EKQotICAgICAgICAgICAgICAgIHJldHVybiAoaVJlYWQ9PTApID8gVU5aX0VPRiA6IGlSZWFkOwotICAgICAgICAgICAgaWYgKGVyciE9Wl9PSykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnI9PVpfT0spCi0gICAgICAgIHJldHVybiBpUmVhZDsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qCi0gIEdpdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdW5jb21wcmVzc2VkIGRhdGEKLSovCi1leHRlcm4gel9vZmZfdCBaRVhQT1JUIHVuenRlbGwgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIHVuel9zKiBzOwotICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLSAgICByZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKLX0KLQotCi0vKgotICByZXR1cm4gMSBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQsIDAgZWxzZXdoZXJlCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuemVvZiAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApCi0gICAgICAgIHJldHVybiAxOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0vKgotICBSZWFkIGV4dHJhIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkKLSAgVGhpcyBpcyB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkIChzb21ldGltZXMsIHRoZXJlIGlzCi0gICAgbW9yZSBpbmZvIGluIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiB0aGFuIGluIHRoZSBjZW50cmFsLWhlYWRlcikKLQotICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgdGhhdCBjYW4gYmUgcmVhZAotCi0gIGlmIGJ1ZiE9TlVMTCwgbGVuIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIHRoZSBleHRyYSBoZWFkZXIgaXMgY29waWVkIGluCi0gICAgYnVmLgotICB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGluIGJ1Ziwgb3IgKGlmIDwwKQotICAgIHRoZSBlcnJvciBjb2RlCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldExvY2FsRXh0cmFmaWVsZCAoZmlsZSxidWYsbGVuKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB2b2lkcCBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIHVuel9zKiBzOwotICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIHVJbnQgcmVhZF9ub3c7Ci0gICAgdUxvbmcgc2l6ZV90b19yZWFkOwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIHNpemVfdG9fcmVhZCA9IChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zaXplX2xvY2FsX2V4dHJhZmllbGQgLQotICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19sb2NhbF9leHRyYWZpZWxkKTsKLQotICAgIGlmIChidWY9PU5VTEwpCi0gICAgICAgIHJldHVybiAoaW50KXNpemVfdG9fcmVhZDsKLQotICAgIGlmIChsZW4+c2l6ZV90b19yZWFkKQotICAgICAgICByZWFkX25vdyA9ICh1SW50KXNpemVfdG9fcmVhZDsKLSAgICBlbHNlCi0gICAgICAgIHJlYWRfbm93ID0gKHVJbnQpbGVuIDsKLQotICAgIGlmIChyZWFkX25vdz09MCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoWlNFRUsocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKLSAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+b2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgKwotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCwKLSAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLSAgICBpZiAoWlJFQUQocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKLSAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgYnVmLHJlYWRfbm93KSE9cmVhZF9ub3cpCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLSAgICByZXR1cm4gKGludClyZWFkX25vdzsKLX0KLQotLyoKLSAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuemlwT3BlbkN1cnJlbnRGaWxlCi0gIFJldHVybiBVTlpfQ1JDRVJST1IgaWYgYWxsIHRoZSBmaWxlIHdhcyByZWFkIGJ1dCB0aGUgQ1JDIGlzIG5vdCBnb29kCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIGludCBlcnI9VU5aX09LOwotCi0gICAgdW56X3MqIHM7Ci0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotCi0gICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApICYmCi0gICAgICAgICghcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKLSAgICB7Ci0gICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiAhPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0KQotICAgICAgICAgICAgZXJyPVVOWl9DUkNFUlJPUjsKLSAgICB9Ci0KLQotICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIpOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyID0gTlVMTDsKLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkKQotICAgICAgICBpbmZsYXRlRW5kKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0pOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOwotCi0gICAgcy0+cGZpbGVfaW5femlwX3JlYWQ9TlVMTDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoKLSAgR2V0IHRoZSBnbG9iYWwgY29tbWVudCBzdHJpbmcgb2YgdGhlIFppcEZpbGUsIGluIHRoZSBzekNvbW1lbnQgYnVmZmVyLgotICB1U2l6ZUJ1ZiBpcyB0aGUgc2l6ZSBvZiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KLSAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MAotKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxDb21tZW50IChmaWxlLCBzekNvbW1lbnQsIHVTaXplQnVmKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICBjaGFyICpzekNvbW1lbnQ7Ci0gICAgdUxvbmcgdVNpemVCdWY7Ci17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdW56X3MqIHM7Ci0gICAgdUxvbmcgdVJlYWRUaGlzIDsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotCi0gICAgdVJlYWRUaGlzID0gdVNpemVCdWY7Ci0gICAgaWYgKHVSZWFkVGhpcz5zLT5naS5zaXplX2NvbW1lbnQpCi0gICAgICAgIHVSZWFkVGhpcyA9IHMtPmdpLnNpemVfY29tbWVudDsKLQotICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLHMtPmZpbGVzdHJlYW0scy0+Y2VudHJhbF9wb3MrMjIsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0KLSAgICBpZiAodVJlYWRUaGlzPjApCi0gICAgewotICAgICAgKnN6Q29tbWVudD0nXDAnOwotICAgICAgaWYgKFpSRUFEKHMtPnpfZmlsZWZ1bmMscy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQotICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotICAgIH0KLQotICAgIGlmICgoc3pDb21tZW50ICE9IE5VTEwpICYmICh1U2l6ZUJ1ZiA+IHMtPmdpLnNpemVfY29tbWVudCkpCi0gICAgICAgICooc3pDb21tZW50K3MtPmdpLnNpemVfY29tbWVudCk9J1wwJzsKLSAgICByZXR1cm4gKGludCl1UmVhZFRoaXM7Ci19Ci0KLS8qIEFkZGl0aW9ucyBieSBSWCAnMjAwNCAqLwotZXh0ZXJuIHVMb25nIFpFWFBPUlQgdW56R2V0T2Zmc2V0IChmaWxlKQotICAgIHVuekZpbGUgZmlsZTsKLXsKLSAgICB1bnpfcyogczsKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKLSAgICAgIHJldHVybiAwOwotICAgIGlmIChzLT5naS5udW1iZXJfZW50cnkgIT0gMCAmJiBzLT5naS5udW1iZXJfZW50cnkgIT0gMHhmZmZmKQotICAgICAgaWYgKHMtPm51bV9maWxlPT1zLT5naS5udW1iZXJfZW50cnkpCi0gICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcy0+cG9zX2luX2NlbnRyYWxfZGlyOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0IChmaWxlLCBwb3MpCi0gICAgICAgIHVuekZpbGUgZmlsZTsKLSAgICAgICAgdUxvbmcgcG9zOwotewotICAgIHVuel9zKiBzOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotCi0gICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zOwotICAgIHMtPm51bV9maWxlID0gcy0+Z2kubnVtYmVyX2VudHJ5OyAgICAgIC8qIGhhY2sgKi8KLSAgICBlcnIgPSB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKLSAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KKy8qIHVuemlwLmMgLS0gSU8gZm9yIHVuY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorDQorICAgUmVhZCB1bnppcC5oIGZvciBtb3JlIGluZm8NCisqLw0KKw0KKy8qIERlY3J5cHRpb24gY29kZSBjb21lcyBmcm9tIGNyeXB0LmMgYnkgSW5mby1aSVAgYnV0IGhhcyBiZWVuIGdyZWF0bHkgcmVkdWNlZCBpbiB0ZXJtcyBvZg0KK2NvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBzb2Z0d2FyZS4gVGhlIGZvbGxvd2luZyBpcyBmcm9tIHRoZSBvcmlnaW5hbCBjcnlwdC5jLiBDb2RlDQord292ZW4gaW4gYnkgVGVycnkgVGhvcnNlbiAxLzIwMDMuDQorKi8NCisvKg0KKyAgQ29weXJpZ2h0IChjKSAxOTkwLTIwMDAgSW5mby1aSVAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KKyAgU2VlIHRoZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFLCB2ZXJzaW9uIDIwMDAtQXByLTA5IG9yIGxhdGVyDQorICAodGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZSBhbHNvIGluY2x1ZGVkIGluIHppcC5oKSBmb3IgdGVybXMgb2YgdXNlLg0KKyAgSWYsIGZvciBzb21lIHJlYXNvbiwgYWxsIHRoZXNlIGZpbGVzIGFyZSBtaXNzaW5nLCB0aGUgSW5mby1aSVAgbGljZW5zZQ0KKyAgYWxzbyBtYXkgYmUgZm91bmQgYXQ6ICBmdHA6Ly9mdHAuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2xpY2Vuc2UuaHRtbA0KKyovDQorLyoNCisgIGNyeXB0LmMgKGZ1bGwgdmVyc2lvbikgYnkgSW5mby1aSVAuICAgICAgTGFzdCByZXZpc2VkOiAgW3NlZSBjcnlwdC5oXQ0KKw0KKyAgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwYXJ0cyBvZiB0aGlzIHNvdXJjZSBjb2RlIChhcyBvcHBvc2VkIHRvIHRoZQ0KKyAgbm9uLWVjaG9pbmcgcGFzc3dvcmQgcGFydHMpIHdlcmUgb3JpZ2luYWxseSB3cml0dGVuIGluIEV1cm9wZS4gIFRoZQ0KKyAgd2hvbGUgc291cmNlIHBhY2thZ2UgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZCwgaW5jbHVkaW5nIGZyb20gdGhlIFVTQS4NCisgIChQcmlvciB0byBKYW51YXJ5IDIwMDAsIHJlLWV4cG9ydCBmcm9tIHRoZSBVUyB3YXMgYSB2aW9sYXRpb24gb2YgVVMgbGF3LikNCisgKi8NCisNCisvKg0KKyAgVGhpcyBlbmNyeXB0aW9uIGNvZGUgaXMgYSBkaXJlY3QgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGZyb20NCisgIFJvZ2VyIFNjaGxhZmx5LCBkZXNjcmliZWQgYnkgUGhpbCBLYXR6IGluIHRoZSBmaWxlIGFwcG5vdGUudHh0LiAgVGhpcw0KKyAgZmlsZSAoYXBwbm90ZS50eHQpIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIFBLWklQIHByb2dyYW0gKGV2ZW4gaW4gdGhlDQorICB2ZXJzaW9uIHdpdGhvdXQgZW5jcnlwdGlvbiBjYXBhYmlsaXRpZXMpLg0KKyAqLw0KKw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgInpsaWIuaCINCisjaW5jbHVkZSAidW56aXAuaCINCisNCisjaWZkZWYgU1REQw0KKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPg0KKyMgIGluY2x1ZGUgPHN0cmluZy5oPg0KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPg0KKyNlbmRpZg0KKyNpZmRlZiBOT19FUlJOT19IDQorICAgIGV4dGVybiBpbnQgZXJybm87DQorI2Vsc2UNCisjICAgaW5jbHVkZSA8ZXJybm8uaD4NCisjZW5kaWYNCisNCisNCisjaWZuZGVmIGxvY2FsDQorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYw0KKyNlbmRpZg0KKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLw0KKw0KKw0KKyNpZm5kZWYgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTw0KKyMgIGlmICFkZWZpbmVkKHVuaXgpICYmICFkZWZpbmVkKENBU0VTRU5TSVRJVklUWURFRkFVTFRfWUVTKQ0KKyMgICAgZGVmaW5lIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8NCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKw0KKyNpZm5kZWYgVU5aX0JVRlNJWkUNCisjZGVmaW5lIFVOWl9CVUZTSVpFICgxNjM4NCkNCisjZW5kaWYNCisNCisjaWZuZGVmIFVOWl9NQVhGSUxFTkFNRUlOWklQDQorI2RlZmluZSBVTlpfTUFYRklMRU5BTUVJTlpJUCAoMjU2KQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgQUxMT0MNCisjIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQ0KKyNlbmRpZg0KKyNpZm5kZWYgVFJZRlJFRQ0KKyMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30NCisjZW5kaWYNCisNCisjZGVmaW5lIFNJWkVDRU5UUkFMRElSSVRFTSAoMHgyZSkNCisjZGVmaW5lIFNJWkVaSVBMT0NBTEhFQURFUiAoMHgxZSkNCisNCisNCisNCisNCitjb25zdCBjaGFyIHVuel9jb3B5cmlnaHRbXSA9DQorICAgIiB1bnppcCAxLjAxIENvcHlyaWdodCAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQgLSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsIjsNCisNCisvKiB1bnpfZmlsZV9pbmZvX2ludGVybnRhbCBjb250YWluIGludGVybmFsIGluZm8gYWJvdXQgYSBmaWxlIGluIHppcGZpbGUqLw0KK3R5cGVkZWYgc3RydWN0IHVuel9maWxlX2luZm9faW50ZXJuYWxfcw0KK3sNCisgICAgdUxvbmcgb2Zmc2V0X2N1cmZpbGU7LyogcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlciA0IGJ5dGVzICovDQorfSB1bnpfZmlsZV9pbmZvX2ludGVybmFsOw0KKw0KKw0KKy8qIGZpbGVfaW5femlwX3JlYWRfaW5mb19zIGNvbnRhaW4gaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHppcGZpbGUsDQorICAgIHdoZW4gcmVhZGluZyBhbmQgZGVjb21wcmVzcyBpdCAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICBjaGFyICAqcmVhZF9idWZmZXI7ICAgICAgICAgLyogaW50ZXJuYWwgYnVmZmVyIGZvciBjb21wcmVzc2VkIGRhdGEgKi8NCisgICAgel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLw0KKw0KKyAgICB1TG9uZyBwb3NfaW5femlwZmlsZTsgICAgICAgLyogcG9zaXRpb24gaW4gYnl0ZSBvbiB0aGUgemlwZmlsZSwgZm9yIGZzZWVrKi8NCisgICAgdUxvbmcgc3RyZWFtX2luaXRpYWxpc2VkOyAgIC8qIGZsYWcgc2V0IGlmIHN0cmVhbSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGlzZWQqLw0KKw0KKyAgICB1TG9uZyBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovDQorICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsvKiBzaXplIG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLw0KKyAgICB1TG9uZyBwb3NfbG9jYWxfZXh0cmFmaWVsZDsgICAvKiBwb3NpdGlvbiBpbiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgaW4gcmVhZCovDQorDQorICAgIHVMb25nIGNyYzMyOyAgICAgICAgICAgICAgICAvKiBjcmMzMiBvZiBhbGwgZGF0YSB1bmNvbXByZXNzZWQgKi8NCisgICAgdUxvbmcgY3JjMzJfd2FpdDsgICAgICAgICAgIC8qIGNyYzMyIHdlIG11c3Qgb2J0YWluIGFmdGVyIGRlY29tcHJlc3MgYWxsICovDQorICAgIHVMb25nIHJlc3RfcmVhZF9jb21wcmVzc2VkOyAvKiBudW1iZXIgb2YgYnl0ZSB0byBiZSBkZWNvbXByZXNzZWQgKi8NCisgICAgdUxvbmcgcmVzdF9yZWFkX3VuY29tcHJlc3NlZDsvKm51bWJlciBvZiBieXRlIHRvIGJlIG9idGFpbmVkIGFmdGVyIGRlY29tcCovDQorICAgIHpsaWJfZmlsZWZ1bmNfZGVmIHpfZmlsZWZ1bmM7DQorICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovDQorICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgKDA9PXN0b3JlKSAqLw0KKyAgICB1TG9uZyBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8NCisgICAgaW50ICAgcmF3Ow0KK30gZmlsZV9pbl96aXBfcmVhZF9pbmZvX3M7DQorDQorDQorLyogdW56X3MgY29udGFpbiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgemlwZmlsZQ0KKyovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHpsaWJfZmlsZWZ1bmNfZGVmIHpfZmlsZWZ1bmM7DQorICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovDQorICAgIHVuel9nbG9iYWxfaW5mbyBnaTsgICAgICAgLyogcHVibGljIGdsb2JhbCBpbmZvcm1hdGlvbiAqLw0KKyAgICB1TG9uZyBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8NCisgICAgdUxvbmcgbnVtX2ZpbGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlKi8NCisgICAgdUxvbmcgcG9zX2luX2NlbnRyYWxfZGlyOyAgIC8qIHBvcyBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBjZW50cmFsIGRpciovDQorICAgIHVMb25nIGN1cnJlbnRfZmlsZV9vazsgICAgICAvKiBmbGFnIGFib3V0IHRoZSB1c2FiaWxpdHkgb2YgdGhlIGN1cnJlbnQgZmlsZSovDQorICAgIHVMb25nIGNlbnRyYWxfcG9zOyAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZW50cmFsIGRpciovDQorDQorICAgIHVMb25nIHNpemVfY2VudHJhbF9kaXI7ICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgKi8NCisgICAgdUxvbmcgb2Zmc2V0X2NlbnRyYWxfZGlyOyAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLw0KKw0KKyAgICB1bnpfZmlsZV9pbmZvIGN1cl9maWxlX2luZm87IC8qIHB1YmxpYyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gemlwKi8NCisgICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCBjdXJfZmlsZV9pbmZvX2ludGVybmFsOyAvKiBwcml2YXRlIGluZm8gYWJvdXQgaXQqLw0KKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWQ7IC8qIHN0cnVjdHVyZSBhYm91dCB0aGUgY3VycmVudA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlmIHdlIGFyZSBkZWNvbXByZXNzaW5nIGl0ICovDQorICAgIGludCBlbmNyeXB0ZWQ7DQorIyAgICBpZm5kZWYgTk9VTkNSWVBUDQorICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8NCisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7DQorIyAgICBlbmRpZg0KK30gdW56X3M7DQorDQorDQorI2lmbmRlZiBOT1VOQ1JZUFQNCisjaW5jbHVkZSAiY3J5cHQuaCINCisjZW5kaWYNCisNCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICAgIFJlYWQgYSBieXRlIGZyb20gYSBnel9zdHJlYW07IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbi4gUmV0dXJuIEVPRg0KKyAgIGZvciBlbmQgb2YgZmlsZS4NCisgICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYmVlbiBzdWNlc3NmdWxseSBvcGVuZWQgZm9yIHJlYWRpbmcuDQorKi8NCisNCisNCitsb2NhbCBpbnQgdW56bG9jYWxfZ2V0Qnl0ZSBPRigoDQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsDQorICAgIHZvaWRwZiBmaWxlc3RyZWFtLA0KKyAgICBpbnQgKnBpKSk7DQorDQorbG9jYWwgaW50IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scGkpDQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7DQorICAgIHZvaWRwZiBmaWxlc3RyZWFtOw0KKyAgICBpbnQgKnBpOw0KK3sNCisgICAgdW5zaWduZWQgY2hhciBjOw0KKyAgICBpbnQgZXJyID0gKGludClaUkVBRCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmMsMSk7DQorICAgIGlmIChlcnI9PTEpDQorICAgIHsNCisgICAgICAgICpwaSA9IChpbnQpYzsNCisgICAgICAgIHJldHVybiBVTlpfT0s7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAoWkVSUk9SKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkpDQorICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXR1cm4gVU5aX0VPRjsNCisgICAgfQ0KK30NCisNCisNCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICBSZWFkcyBhIGxvbmcgaW4gTFNCIG9yZGVyIGZyb20gdGhlIGdpdmVuIGd6X3N0cmVhbS4gU2V0cw0KKyovDQorbG9jYWwgaW50IHVuemxvY2FsX2dldFNob3J0IE9GKCgNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwNCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sDQorICAgIHVMb25nICpwWCkpOw0KKw0KK2xvY2FsIGludCB1bnpsb2NhbF9nZXRTaG9ydCAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpDQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7DQorICAgIHZvaWRwZiBmaWxlc3RyZWFtOw0KKyAgICB1TG9uZyAqcFg7DQorew0KKyAgICB1TG9uZyB4IDsNCisgICAgaW50IGk7DQorICAgIGludCBlcnI7DQorDQorICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOw0KKyAgICB4ID0gKHVMb25nKWk7DQorDQorICAgIGlmIChlcnI9PVVOWl9PSykNCisgICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOw0KKyAgICB4ICs9ICgodUxvbmcpaSk8PDg7DQorDQorICAgIGlmIChlcnI9PVVOWl9PSykNCisgICAgICAgICpwWCA9IHg7DQorICAgIGVsc2UNCisgICAgICAgICpwWCA9IDA7DQorICAgIHJldHVybiBlcnI7DQorfQ0KKw0KK2xvY2FsIGludCB1bnpsb2NhbF9nZXRMb25nIE9GKCgNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwNCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sDQorICAgIHVMb25nICpwWCkpOw0KKw0KK2xvY2FsIGludCB1bnpsb2NhbF9nZXRMb25nIChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07DQorICAgIHVMb25nICpwWDsNCit7DQorICAgIHVMb25nIHggOw0KKyAgICBpbnQgaTsNCisgICAgaW50IGVycjsNCisNCisgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggPSAodUxvbmcpaTsNCisNCisgICAgaWYgKGVycj09VU5aX09LKQ0KKyAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggKz0gKCh1TG9uZylpKTw8ODsNCisNCisgICAgaWYgKGVycj09VU5aX09LKQ0KKyAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggKz0gKCh1TG9uZylpKTw8MTY7DQorDQorICAgIGlmIChlcnI9PVVOWl9PSykNCisgICAgICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOw0KKyAgICB4ICs9ICgodUxvbmcpaSk8PDI0Ow0KKw0KKyAgICBpZiAoZXJyPT1VTlpfT0spDQorICAgICAgICAqcFggPSB4Ow0KKyAgICBlbHNlDQorICAgICAgICAqcFggPSAwOw0KKyAgICByZXR1cm4gZXJyOw0KK30NCisNCisNCisvKiBNeSBvd24gc3RyY21waSAvIHN0cmNhc2VjbXAgKi8NCitsb2NhbCBpbnQgc3RyY21wY2FzZW5vc2Vuc2l0aXZlX2ludGVybmFsIChmaWxlTmFtZTEsZmlsZU5hbWUyKQ0KKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTE7DQorICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMjsNCit7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICAgIGNoYXIgYzE9KihmaWxlTmFtZTErKyk7DQorICAgICAgICBjaGFyIGMyPSooZmlsZU5hbWUyKyspOw0KKyAgICAgICAgaWYgKChjMT49J2EnKSAmJiAoYzE8PSd6JykpDQorICAgICAgICAgICAgYzEgLT0gMHgyMDsNCisgICAgICAgIGlmICgoYzI+PSdhJykgJiYgKGMyPD0neicpKQ0KKyAgICAgICAgICAgIGMyIC09IDB4MjA7DQorICAgICAgICBpZiAoYzE9PSdcMCcpDQorICAgICAgICAgICAgcmV0dXJuICgoYzI9PSdcMCcpID8gMCA6IC0xKTsNCisgICAgICAgIGlmIChjMj09J1wwJykNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIGlmIChjMTxjMikNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICBpZiAoYzE+YzIpDQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCit9DQorDQorDQorI2lmZGVmICBDQVNFU0VOU0lUSVZJVFlERUZBVUxUX05PDQorI2RlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUUgMg0KKyNlbHNlDQorI2RlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUUgMQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9ODQorI2RlZmluZSBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04gc3RyY21wY2FzZW5vc2Vuc2l0aXZlX2ludGVybmFsDQorI2VuZGlmDQorDQorLyoNCisgICBDb21wYXJlIHR3byBmaWxlbmFtZSAoZmlsZU5hbWUxLGZpbGVOYW1lMikuDQorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApDQorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMiwgY29tcGFyaXNpb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21waQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdHJjYXNlY21wKQ0KKyAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDAsIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVmYXV0IG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbQ0KKyAgICAgICAgKGxpa2UgMSBvbiBVbml4LCAyIG9uIFdpbmRvd3MpDQorDQorKi8NCitleHRlcm4gaW50IFpFWFBPUlQgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlIChmaWxlTmFtZTEsZmlsZU5hbWUyLGlDYXNlU2Vuc2l0aXZpdHkpDQorICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMTsNCisgICAgY29uc3QgY2hhciogZmlsZU5hbWUyOw0KKyAgICBpbnQgaUNhc2VTZW5zaXRpdml0eTsNCit7DQorICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0wKQ0KKyAgICAgICAgaUNhc2VTZW5zaXRpdml0eT1DQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUU7DQorDQorICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0xKQ0KKyAgICAgICAgcmV0dXJuIHN0cmNtcChmaWxlTmFtZTEsZmlsZU5hbWUyKTsNCisNCisgICAgcmV0dXJuIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTihmaWxlTmFtZTEsZmlsZU5hbWUyKTsNCit9DQorDQorI2lmbmRlZiBCVUZSRUFEQ09NTUVOVA0KKyNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQ0KKyNlbmRpZg0KKw0KKy8qDQorICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUNCisgICAgdGhlIGdsb2JhbCBjb21tZW50KQ0KKyovDQorbG9jYWwgdUxvbmcgdW56bG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoDQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsDQorICAgIHZvaWRwZiBmaWxlc3RyZWFtKSk7DQorDQorbG9jYWwgdUxvbmcgdW56bG9jYWxfU2VhcmNoQ2VudHJhbERpcihwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07DQorew0KKyAgICB1bnNpZ25lZCBjaGFyKiBidWY7DQorICAgIHVMb25nIHVTaXplRmlsZTsNCisgICAgdUxvbmcgdUJhY2tSZWFkOw0KKyAgICB1TG9uZyB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLw0KKyAgICB1TG9uZyB1UG9zRm91bmQ9MDsNCisNCisgICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwwLFpMSUJfRklMRUZVTkNfU0VFS19FTkQpICE9IDApDQorICAgICAgICByZXR1cm4gMDsNCisNCisNCisgICAgdVNpemVGaWxlID0gWlRFTEwoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsNCisNCisgICAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkNCisgICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOw0KKw0KKyAgICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7DQorICAgIGlmIChidWY9PU5VTEwpDQorICAgICAgICByZXR1cm4gMDsNCisNCisgICAgdUJhY2tSZWFkID0gNDsNCisgICAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykNCisgICAgew0KKyAgICAgICAgdUxvbmcgdVJlYWRTaXplLHVSZWFkUG9zIDsNCisgICAgICAgIGludCBpOw0KKyAgICAgICAgaWYgKHVCYWNrUmVhZCtCVUZSRUFEQ09NTUVOVD51TWF4QmFjaykNCisgICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOw0KKyAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsNCisNCisgICAgICAgIHVSZWFkU2l6ZSA9ICgoQlVGUkVBRENPTU1FTlQrNCkgPCAodVNpemVGaWxlLXVSZWFkUG9zKSkgPw0KKyAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1U2l6ZUZpbGUtdVJlYWRQb3MpOw0KKyAgICAgICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSx1UmVhZFBvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGlmIChaUkVBRCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGZvciAoaT0oaW50KXVSZWFkU2l6ZS0zOyAoaS0tKT4wOykNCisgICAgICAgICAgICBpZiAoKCgqKGJ1ZitpKSk9PTB4NTApICYmICgoKihidWYraSsxKSk9PTB4NGIpICYmDQorICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkNCisgICAgICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBUUllGUkVFKGJ1Zik7DQorICAgIHJldHVybiB1UG9zRm91bmQ7DQorfQ0KKw0KKy8qDQorICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwNCisgICAgIG9uIGEgV2luZG93cyBOVCBjb21wdXRlciAiYzpcXHRlc3RcXHpsaWIxMTQuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyDQorICAgICAiemxpYi96bGliMTE0LnppcCIuDQorICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlDQorICAgICAgIHJldHVybiB2YWx1ZSBpcyBOVUxMLg0KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHVuekZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbg0KKyAgICAgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuDQorKi8NCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4yIChwYXRoLCBwemxpYl9maWxlZnVuY19kZWYpDQorICAgIGNvbnN0IGNoYXIgKnBhdGg7DQorICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7DQorew0KKyAgICB1bnpfcyB1czsNCisgICAgdW56X3MgKnM7DQorICAgIHVMb25nIGNlbnRyYWxfcG9zLHVMOw0KKw0KKyAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8NCisgICAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLw0KKyAgICB1TG9uZyBudW1iZXJfZW50cnlfQ0Q7ICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLw0KKw0KKyAgICBpbnQgZXJyPVVOWl9PSzsNCisNCisgICAgaWYgKHVuel9jb3B5cmlnaHRbMF0hPScgJykNCisgICAgICAgIHJldHVybiBOVUxMOw0KKw0KKyAgICBpZiAocHpsaWJfZmlsZWZ1bmNfZGVmPT1OVUxMKQ0KKyAgICAgICAgZmlsbF9mb3Blbl9maWxlZnVuYygmdXMuel9maWxlZnVuYyk7DQorICAgIGVsc2UNCisgICAgICAgIHVzLnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOw0KKw0KKyAgICB1cy5maWxlc3RyZWFtPSAoKih1cy56X2ZpbGVmdW5jLnpvcGVuX2ZpbGUpKSh1cy56X2ZpbGVmdW5jLm9wYXF1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpOw0KKyAgICBpZiAodXMuZmlsZXN0cmVhbT09TlVMTCkNCisgICAgICAgIHJldHVybiBOVUxMOw0KKw0KKyAgICBjZW50cmFsX3BvcyA9IHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIoJnVzLnpfZmlsZWZ1bmMsdXMuZmlsZXN0cmVhbSk7DQorICAgIGlmIChjZW50cmFsX3Bvcz09MCkNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmIChaU0VFSyh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8NCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrKSE9VU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMuZ2kubnVtYmVyX2VudHJ5KSE9VU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5X0NEKSE9VU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgaWYgKChudW1iZXJfZW50cnlfQ0QhPXVzLmdpLm51bWJlcl9lbnRyeSkgfHwNCisgICAgICAgIChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fA0KKyAgICAgICAgKG51bWJlcl9kaXNrIT0wKSkNCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsNCisNCisgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8NCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLnNpemVfY2VudHJhbF9kaXIpIT1VTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZQ0KKyAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLw0KKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMub2Zmc2V0X2NlbnRyYWxfZGlyKSE9VU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAqLw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLmdpLnNpemVfY29tbWVudCkhPVVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICgoY2VudHJhbF9wb3M8dXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpICYmDQorICAgICAgICAoZXJyPT1VTlpfT0spKQ0KKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOw0KKw0KKyAgICBpZiAoZXJyIT1VTlpfT0spDQorICAgIHsNCisgICAgICAgIFpDTE9TRSh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorDQorICAgIHVzLmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlID0gY2VudHJhbF9wb3MgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpOw0KKyAgICB1cy5jZW50cmFsX3BvcyA9IGNlbnRyYWxfcG9zOw0KKyAgICB1cy5wZmlsZV9pbl96aXBfcmVhZCA9IE5VTEw7DQorICAgIHVzLmVuY3J5cHRlZCA9IDA7DQorDQorDQorICAgIHM9KHVuel9zKilBTExPQyhzaXplb2YodW56X3MpKTsNCisgICAgKnM9dXM7DQorICAgIHVuekdvVG9GaXJzdEZpbGUoKHVuekZpbGUpcyk7DQorICAgIHJldHVybiAodW56RmlsZSlzOw0KK30NCisNCisNCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4gKHBhdGgpDQorICAgIGNvbnN0IGNoYXIgKnBhdGg7DQorew0KKyAgICByZXR1cm4gdW56T3BlbjIocGF0aCwgTlVMTCk7DQorfQ0KKw0KKy8qDQorICBDbG9zZSBhIFppcEZpbGUgb3BlbmVkIHdpdGggdW56aXBPcGVuLg0KKyAgSWYgdGhlcmUgaXMgZmlsZXMgaW5zaWRlIHRoZSAuWmlwIG9wZW5lZCB3aXRoIHVuemlwT3BlbkN1cnJlbnRGaWxlIChzZWUgbGF0ZXIpLA0KKyAgICB0aGVzZSBmaWxlcyBNVVNUIGJlIGNsb3NlZCB3aXRoIHVuemlwQ2xvc2VDdXJyZW50RmlsZSBiZWZvcmUgY2FsbCB1bnppcENsb3NlLg0KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZSAoZmlsZSkNCisgICAgdW56RmlsZSBmaWxlOw0KK3sNCisgICAgdW56X3MqIHM7DQorICAgIGlmIChmaWxlPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKyAgICBzPSh1bnpfcyopZmlsZTsNCisNCisgICAgaWYgKHMtPnBmaWxlX2luX3ppcF9yZWFkIT1OVUxMKQ0KKyAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZShmaWxlKTsNCisNCisgICAgWkNMT1NFKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0pOw0KKyAgICBUUllGUkVFKHMpOw0KKyAgICByZXR1cm4gVU5aX09LOw0KK30NCisNCisNCisvKg0KKyAgV3JpdGUgaW5mbyBhYm91dCB0aGUgWmlwRmlsZSBpbiB0aGUgKnBnbG9iYWxfaW5mbyBzdHJ1Y3R1cmUuDQorICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZA0KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxJbmZvIChmaWxlLHBnbG9iYWxfaW5mbykNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICB1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbzsNCit7DQorICAgIHVuel9zKiBzOw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgICpwZ2xvYmFsX2luZm89cy0+Z2k7DQorICAgIHJldHVybiBVTlpfT0s7DQorfQ0KKw0KKw0KKy8qDQorICAgVHJhbnNsYXRlIGRhdGUvdGltZSBmcm9tIERvcyBmb3JtYXQgdG8gdG1fdW56IChyZWFkYWJsZSBtb3JlIGVhc2lsdHkpDQorKi8NCitsb2NhbCB2b2lkIHVuemxvY2FsX0Rvc0RhdGVUb1RtdURhdGUgKHVsRG9zRGF0ZSwgcHRtKQ0KKyAgICB1TG9uZyB1bERvc0RhdGU7DQorICAgIHRtX3VueiogcHRtOw0KK3sNCisgICAgdUxvbmcgdURhdGU7DQorICAgIHVEYXRlID0gKHVMb25nKSh1bERvc0RhdGU+PjE2KTsNCisgICAgcHRtLT50bV9tZGF5ID0gKHVJbnQpKHVEYXRlJjB4MWYpIDsNCisgICAgcHRtLT50bV9tb24gPSAgKHVJbnQpKCgoKHVEYXRlKSYweDFFMCkvMHgyMCktMSkgOw0KKyAgICBwdG0tPnRtX3llYXIgPSAodUludCkoKCh1RGF0ZSYweDBGRTAwKS8weDAyMDApKzE5ODApIDsNCisNCisgICAgcHRtLT50bV9ob3VyID0gKHVJbnQpICgodWxEb3NEYXRlICYweEY4MDApLzB4ODAwKTsNCisgICAgcHRtLT50bV9taW4gPSAgKHVJbnQpICgodWxEb3NEYXRlJjB4N0UwKS8weDIwKSA7DQorICAgIHB0bS0+dG1fc2VjID0gICh1SW50KSAoMioodWxEb3NEYXRlJjB4MWYpKSA7DQorfQ0KKw0KKy8qDQorICBHZXQgSW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlLCB3aXRoIGludGVybmFsIG9ubHkgaW5mbw0KKyovDQorbG9jYWwgaW50IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsIE9GKCh1bnpGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsNCisNCitsb2NhbCBpbnQgdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgKGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm9faW50ZXJuYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsIGZpbGVOYW1lQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCwgIGNvbW1lbnRCdWZmZXJTaXplKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm87DQorICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwgKnBmaWxlX2luZm9faW50ZXJuYWw7DQorICAgIGNoYXIgKnN6RmlsZU5hbWU7DQorICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZTsNCisgICAgdm9pZCAqZXh0cmFGaWVsZDsNCisgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemU7DQorICAgIGNoYXIgKnN6Q29tbWVudDsNCisgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemU7DQorew0KKyAgICB1bnpfcyogczsNCisgICAgdW56X2ZpbGVfaW5mbyBmaWxlX2luZm87DQorICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwgZmlsZV9pbmZvX2ludGVybmFsOw0KKyAgICBpbnQgZXJyPVVOWl9PSzsNCisgICAgdUxvbmcgdU1hZ2ljOw0KKyAgICBsb25nIGxTZWVrPTA7DQorDQorICAgIGlmIChmaWxlPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKyAgICBzPSh1bnpfcyopZmlsZTsNCisgICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIrcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsDQorICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorDQorICAgIC8qIHdlIGNoZWNrIHRoZSBtYWdpYyAqLw0KKyAgICBpZiAoZXJyPT1VTlpfT0spDQorICAgICAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spDQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgICAgIGVsc2UgaWYgKHVNYWdpYyE9MHgwMjAxNGI1MCkNCisgICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnZlcnNpb24pICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnZlcnNpb25fbmVlZGVkKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5mbGFnKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZG9zRGF0ZSkgIT0gVU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgdW56bG9jYWxfRG9zRGF0ZVRvVG11RGF0ZShmaWxlX2luZm8uZG9zRGF0ZSwmZmlsZV9pbmZvLnRtdV9kYXRlKTsNCisNCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jcmMpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5kaXNrX251bV9zdGFydCkgIT0gVU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisNCisgICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uaW50ZXJuYWxfZmEpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZXh0ZXJuYWxfZmEpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlbmFtZTsNCisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHN6RmlsZU5hbWUhPU5VTEwpKQ0KKyAgICB7DQorICAgICAgICB1TG9uZyB1U2l6ZVJlYWQgOw0KKyAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPGZpbGVOYW1lQnVmZmVyU2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAqKHN6RmlsZU5hbWUrZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpPSdcMCc7DQorICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZU5hbWVCdWZmZXJTaXplOw0KKw0KKyAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlbmFtZT4wKSAmJiAoZmlsZU5hbWVCdWZmZXJTaXplPjApKQ0KKyAgICAgICAgICAgIGlmIChaUkVBRChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHN6RmlsZU5hbWUsdVNpemVSZWFkKSE9dVNpemVSZWFkKQ0KKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POw0KKyAgICAgICAgbFNlZWsgLT0gdVNpemVSZWFkOw0KKyAgICB9DQorDQorDQorICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChleHRyYUZpZWxkIT1OVUxMKSkNCisgICAgew0KKyAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsNCisgICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhPGV4dHJhRmllbGRCdWZmZXJTaXplKQ0KKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdVNpemVSZWFkID0gZXh0cmFGaWVsZEJ1ZmZlclNpemU7DQorDQorICAgICAgICBpZiAobFNlZWshPTApDQorICAgICAgICAgICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sbFNlZWssWkxJQl9GSUxFRlVOQ19TRUVLX0NVUik9PTApDQorICAgICAgICAgICAgICAgIGxTZWVrPTA7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POw0KKyAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhPjApICYmIChleHRyYUZpZWxkQnVmZmVyU2l6ZT4wKSkNCisgICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxleHRyYUZpZWxkLHVTaXplUmVhZCkhPXVTaXplUmVhZCkNCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgLSB1U2l6ZVJlYWQ7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7DQorDQorDQorICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekNvbW1lbnQhPU5VTEwpKQ0KKyAgICB7DQorICAgICAgICB1TG9uZyB1U2l6ZVJlYWQgOw0KKyAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDxjb21tZW50QnVmZmVyU2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAqKHN6Q29tbWVudCtmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpPSdcMCc7DQorICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGNvbW1lbnRCdWZmZXJTaXplOw0KKw0KKyAgICAgICAgaWYgKGxTZWVrIT0wKQ0KKyAgICAgICAgICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGxTZWVrLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpPT0wKQ0KKyAgICAgICAgICAgICAgICBsU2Vlaz0wOw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50PjApICYmIChjb21tZW50QnVmZmVyU2l6ZT4wKSkNCisgICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVNpemVSZWFkKSE9dVNpemVSZWFkKQ0KKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POw0KKyAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCAtIHVTaXplUmVhZDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50Ow0KKw0KKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mbyE9TlVMTCkpDQorICAgICAgICAqcGZpbGVfaW5mbz1maWxlX2luZm87DQorDQorICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChwZmlsZV9pbmZvX2ludGVybmFsIT1OVUxMKSkNCisgICAgICAgICpwZmlsZV9pbmZvX2ludGVybmFsPWZpbGVfaW5mb19pbnRlcm5hbDsNCisNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorDQorDQorLyoNCisgIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLg0KKyAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQNCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4NCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm8gKGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLCBmaWxlTmFtZUJ1ZmZlclNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDb21tZW50LCAgY29tbWVudEJ1ZmZlclNpemUpDQorICAgIHVuekZpbGUgZmlsZTsNCisgICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbzsNCisgICAgY2hhciAqc3pGaWxlTmFtZTsNCisgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplOw0KKyAgICB2b2lkICpleHRyYUZpZWxkOw0KKyAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZTsNCisgICAgY2hhciAqc3pDb21tZW50Ow0KKyAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZTsNCit7DQorICAgIHJldHVybiB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLHBmaWxlX2luZm8sTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUZpZWxkLGV4dHJhRmllbGRCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCxjb21tZW50QnVmZmVyU2l6ZSk7DQorfQ0KKw0KKy8qDQorICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4NCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQ0KKyovDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgKGZpbGUpDQorICAgIHVuekZpbGUgZmlsZTsNCit7DQorICAgIGludCBlcnI9VU5aX09LOw0KKyAgICB1bnpfcyogczsNCisgICAgaWYgKGZpbGU9PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorICAgIHM9KHVuel9zKilmaWxlOw0KKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXI9cy0+b2Zmc2V0X2NlbnRyYWxfZGlyOw0KKyAgICBzLT5udW1fZmlsZT0wOw0KKyAgICBlcnI9dW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7DQorICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorLyoNCisgIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBuZXh0IGZpbGUuDQorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0NCisgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgYWN0dWFsIGZpbGUgd2FzIHRoZSBsYXRlc3QuDQorKi8NCitleHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub05leHRGaWxlIChmaWxlKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorew0KKyAgICB1bnpfcyogczsNCisgICAgaW50IGVycjsNCisNCisgICAgaWYgKGZpbGU9PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorICAgIHM9KHVuel9zKilmaWxlOw0KKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykNCisgICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsNCisgICAgaWYgKHMtPmdpLm51bWJlcl9lbnRyeSAhPSAweGZmZmYpICAgIC8qIDJeMTYgZmlsZXMgb3ZlcmZsb3cgaGFjayAqLw0KKyAgICAgIGlmIChzLT5udW1fZmlsZSsxPT1zLT5naS5udW1iZXJfZW50cnkpDQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7DQorDQorICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciArPSBTSVpFQ0VOVFJBTERJUklURU0gKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUgKw0KKyAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCA7DQorICAgIHMtPm51bV9maWxlKys7DQorICAgIGVyciA9IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsNCisgICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOw0KKyAgICByZXR1cm4gZXJyOw0KK30NCisNCisNCisvKg0KKyAgVHJ5IGxvY2F0ZSB0aGUgZmlsZSBzekZpbGVOYW1lIGluIHRoZSB6aXBmaWxlLg0KKyAgRm9yIHRoZSBpQ2FzZVNlbnNpdGl2aXR5IHNpZ25pZmljYXRpb24sIHNlZSB1bnppcFN0cmluZ0ZpbGVOYW1lQ29tcGFyZQ0KKw0KKyAgcmV0dXJuIHZhbHVlIDoNCisgIFVOWl9PSyBpZiB0aGUgZmlsZSBpcyBmb3VuZC4gSXQgYmVjb21lcyB0aGUgY3VycmVudCBmaWxlLg0KKyAgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kDQorKi8NCitleHRlcm4gaW50IFpFWFBPUlQgdW56TG9jYXRlRmlsZSAoZmlsZSwgc3pGaWxlTmFtZSwgaUNhc2VTZW5zaXRpdml0eSkNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICBjb25zdCBjaGFyICpzekZpbGVOYW1lOw0KKyAgICBpbnQgaUNhc2VTZW5zaXRpdml0eTsNCit7DQorICAgIHVuel9zKiBzOw0KKyAgICBpbnQgZXJyOw0KKw0KKyAgICAvKiBXZSByZW1lbWJlciB0aGUgJ2N1cnJlbnQnIHBvc2l0aW9uIGluIHRoZSBmaWxlIHNvIHRoYXQgd2UgY2FuIGp1bXANCisgICAgICogYmFjayB0aGVyZSBpZiB3ZSBmYWlsLg0KKyAgICAgKi8NCisgICAgdW56X2ZpbGVfaW5mbyBjdXJfZmlsZV9pbmZvU2F2ZWQ7DQorICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkOw0KKyAgICB1TG9uZyBudW1fZmlsZVNhdmVkOw0KKyAgICB1TG9uZyBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZDsNCisNCisNCisgICAgaWYgKGZpbGU9PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorDQorICAgIGlmIChzdHJsZW4oc3pGaWxlTmFtZSk+PVVOWl9NQVhGSUxFTkFNRUlOWklQKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKw0KKyAgICBzPSh1bnpfcyopZmlsZTsNCisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spDQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7DQorDQorICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgKi8NCisgICAgbnVtX2ZpbGVTYXZlZCA9IHMtPm51bV9maWxlOw0KKyAgICBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZCA9IHMtPnBvc19pbl9jZW50cmFsX2RpcjsNCisgICAgY3VyX2ZpbGVfaW5mb1NhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mbzsNCisgICAgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsNCisNCisgICAgZXJyID0gdW56R29Ub0ZpcnN0RmlsZShmaWxlKTsNCisNCisgICAgd2hpbGUgKGVyciA9PSBVTlpfT0spDQorICAgIHsNCisgICAgICAgIGNoYXIgc3pDdXJyZW50RmlsZU5hbWVbVU5aX01BWEZJTEVOQU1FSU5aSVArMV07DQorICAgICAgICBlcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm8oZmlsZSxOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q3VycmVudEZpbGVOYW1lLHNpemVvZihzekN1cnJlbnRGaWxlTmFtZSktMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwKTsNCisgICAgICAgIGlmIChlcnIgPT0gVU5aX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICh1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUoc3pDdXJyZW50RmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGlDYXNlU2Vuc2l0aXZpdHkpPT0wKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gVU5aX09LOw0KKyAgICAgICAgICAgIGVyciA9IHVuekdvVG9OZXh0RmlsZShmaWxlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKiBXZSBmYWlsZWQsIHNvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSAnY3VycmVudCBmaWxlJyB0byB3aGVyZSB3ZQ0KKyAgICAgKiB3ZXJlLg0KKyAgICAgKi8NCisgICAgcy0+bnVtX2ZpbGUgPSBudW1fZmlsZVNhdmVkIDsNCisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgOw0KKyAgICBzLT5jdXJfZmlsZV9pbmZvID0gY3VyX2ZpbGVfaW5mb1NhdmVkOw0KKyAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsID0gY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkOw0KKyAgICByZXR1cm4gZXJyOw0KK30NCisNCisNCisvKg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDb250cmlidXRlZCBieSBSeWFuIEhha3NpIChtYWlsdG86Ly9jcnlvZ2VuQGluZm9zZXJ2ZS5uZXQpDQorLy8gSSBuZWVkIHJhbmRvbSBhY2Nlc3MNCisvLw0KKy8vIEZ1cnRoZXIgb3B0aW1pemF0aW9uIGNvdWxkIGJlIHJlYWxpemVkIGJ5IGFkZGluZyBhbiBhYmlsaXR5DQorLy8gdG8gY2FjaGUgdGhlIGRpcmVjdG9yeSBpbiBtZW1vcnkuIFRoZSBnb2FsIGJlaW5nIGEgc2luZ2xlDQorLy8gY29tcHJlaGVuc2l2ZSBmaWxlIHJlYWQgdG8gcHV0IHRoZSBmaWxlIEkgbmVlZCBpbiBhIG1lbW9yeS4NCisqLw0KKw0KKy8qDQordHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MNCit7DQorICAgIHVMb25nIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8vIG9mZnNldCBpbiBmaWxlDQorICAgIHVMb25nIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8vICMgb2YgZmlsZQ0KK30gdW56X2ZpbGVfcG9zOw0KKyovDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEZpbGVQb3MoZmlsZSwgZmlsZV9wb3MpDQorICAgIHVuekZpbGUgZmlsZTsNCisgICAgdW56X2ZpbGVfcG9zKiBmaWxlX3BvczsNCit7DQorICAgIHVuel9zKiBzOw0KKw0KKyAgICBpZiAoZmlsZT09TlVMTCB8fCBmaWxlX3Bvcz09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOw0KKw0KKyAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOw0KKyAgICBmaWxlX3Bvcy0+bnVtX29mX2ZpbGUgICAgICAgICAgID0gcy0+bnVtX2ZpbGU7DQorDQorICAgIHJldHVybiBVTlpfT0s7DQorfQ0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvcyhmaWxlLCBmaWxlX3BvcykNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zOw0KK3sNCisgICAgdW56X3MqIHM7DQorICAgIGludCBlcnI7DQorDQorICAgIGlmIChmaWxlPT1OVUxMIHx8IGZpbGVfcG9zPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKyAgICBzPSh1bnpfcyopZmlsZTsNCisNCisgICAgLyoganVtcCB0byB0aGUgcmlnaHQgc3BvdCAqLw0KKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7DQorICAgIHMtPm51bV9maWxlICAgICAgICAgICA9IGZpbGVfcG9zLT5udW1fb2ZfZmlsZTsNCisNCisgICAgLyogc2V0IHRoZSBjdXJyZW50IGZpbGUgKi8NCisgICAgZXJyID0gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOw0KKyAgICAvKiByZXR1cm4gcmVzdWx0cyAqLw0KKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7DQorICAgIHJldHVybiBlcnI7DQorfQ0KKw0KKy8qDQorLy8gVW56aXAgSGVscGVyIEZ1bmN0aW9ucyAtIHNob3VsZCBiZSBoZXJlPw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisqLw0KKw0KKy8qDQorICBSZWFkIHRoZSBsb2NhbCBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgemlwZmlsZQ0KKyAgQ2hlY2sgdGhlIGNvaGVyZW5jeSBvZiB0aGUgbG9jYWwgaGVhZGVyIGFuZCBpbmZvIGluIHRoZSBlbmQgb2YgY2VudHJhbA0KKyAgICAgICAgZGlyZWN0b3J5IGFib3V0IHRoaXMgZmlsZQ0KKyAgc3RvcmUgaW4gKnBpU2l6ZVZhciB0aGUgc2l6ZSBvZiBleHRyYSBpbmZvIGluIGxvY2FsIGhlYWRlcg0KKyAgICAgICAgKGZpbGVuYW1lIGFuZCBzaXplIG9mIGV4dHJhIGZpZWxkIGRhdGEpDQorKi8NCitsb2NhbCBpbnQgdW56bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlciAocyxwaVNpemVWYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpemVfbG9jYWxfZXh0cmFmaWVsZCkNCisgICAgdW56X3MqIHM7DQorICAgIHVJbnQqIHBpU2l6ZVZhcjsNCisgICAgdUxvbmcgKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsNCisgICAgdUludCAgKnBzaXplX2xvY2FsX2V4dHJhZmllbGQ7DQorew0KKyAgICB1TG9uZyB1TWFnaWMsdURhdGEsdUZsYWdzOw0KKyAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOw0KKyAgICB1TG9uZyBzaXplX2V4dHJhX2ZpZWxkOw0KKyAgICBpbnQgZXJyPVVOWl9PSzsNCisNCisgICAgKnBpU2l6ZVZhciA9IDA7DQorICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSAwOw0KKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IDA7DQorDQorICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApDQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POw0KKw0KKw0KKyAgICBpZiAoZXJyPT1VTlpfT0spDQorICAgICAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spDQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgICAgIGVsc2UgaWYgKHVNYWdpYyE9MHgwNDAzNGI1MCkNCisgICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorLyoNCisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8ud1ZlcnNpb24pKQ0KKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOw0KKyovDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUZsYWdzKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spDQorICAgICAgICBlcnI9VU5aX0VSUk5POw0KKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpKQ0KKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOw0KKw0KKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9ERUZMQVRFRCkpDQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBkYXRlL3RpbWUgKi8NCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBjcmMgKi8NCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNyYykgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVGbGFncyAmIDgpPT0wKSkNCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsNCisNCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgY29tcHIgKi8NCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVGbGFncyAmIDgpPT0wKSkNCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsNCisNCisgICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spIC8qIHNpemUgdW5jb21wciAqLw0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpDQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7DQorDQorDQorICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQ0KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsNCisgICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAoc2l6ZV9maWxlbmFtZSE9cy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKSkNCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsNCisNCisgICAgKnBpU2l6ZVZhciArPSAodUludClzaXplX2ZpbGVuYW1lOw0KKw0KKyAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZXh0cmFfZmllbGQpICE9IFVOWl9PSykNCisgICAgICAgIGVycj1VTlpfRVJSTk87DQorICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ9IHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVaSVBMT0NBTEhFQURFUiArIHNpemVfZmlsZW5hbWU7DQorICAgICpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gKHVJbnQpc2l6ZV9leHRyYV9maWVsZDsNCisNCisgICAgKnBpU2l6ZVZhciArPSAodUludClzaXplX2V4dHJhX2ZpZWxkOw0KKw0KKyAgICByZXR1cm4gZXJyOw0KK30NCisNCisvKg0KKyAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuDQorICBJZiB0aGVyZSBpcyBubyBlcnJvciBhbmQgdGhlIGZpbGUgaXMgb3BlbmVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4NCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUzIChmaWxlLCBtZXRob2QsIGxldmVsLCByYXcsIHBhc3N3b3JkKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorICAgIGludCogbWV0aG9kOw0KKyAgICBpbnQqIGxldmVsOw0KKyAgICBpbnQgcmF3Ow0KKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsNCit7DQorICAgIGludCBlcnI9VU5aX09LOw0KKyAgICB1SW50IGlTaXplVmFyOw0KKyAgICB1bnpfcyogczsNCisgICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87DQorICAgIHVMb25nIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLw0KKyAgICB1SW50ICBzaXplX2xvY2FsX2V4dHJhZmllbGQ7ICAgIC8qIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovDQorIyAgICBpZm5kZWYgTk9VTkNSWVBUDQorICAgIGNoYXIgc291cmNlWzEyXTsNCisjICAgIGVsc2UNCisgICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorIyAgICBlbmRpZg0KKw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKw0KKyAgICBpZiAocy0+cGZpbGVfaW5femlwX3JlYWQgIT0gTlVMTCkNCisgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7DQorDQorICAgIGlmICh1bnpsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyKHMsJmlTaXplVmFyLA0KKyAgICAgICAgICAgICAgICAmb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsJnNpemVfbG9jYWxfZXh0cmFmaWVsZCkhPVVOWl9PSykNCisgICAgICAgIHJldHVybiBVTlpfQkFEWklQRklMRTsNCisNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbyA9IChmaWxlX2luX3ppcF9yZWFkX2luZm9fcyopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMTE9DKHNpemVvZihmaWxlX2luX3ppcF9yZWFkX2luZm9fcykpOw0KKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsNCisNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9KGNoYXIqKUFMTE9DKFVOWl9CVUZTSVpFKTsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+b2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gc2l6ZV9sb2NhbF9leHRyYWZpZWxkOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZD0wOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXc9cmF3Ow0KKw0KKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9PU5VTEwpDQorICAgIHsNCisgICAgICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7DQorICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7DQorICAgIH0NCisNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPTA7DQorDQorICAgIGlmIChtZXRob2QhPU5VTEwpDQorICAgICAgICAqbWV0aG9kID0gKGludClzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZDsNCisNCisgICAgaWYgKGxldmVsIT1OVUxMKQ0KKyAgICB7DQorICAgICAgICAqbGV2ZWwgPSA2Ow0KKyAgICAgICAgc3dpdGNoIChzLT5jdXJfZmlsZV9pbmZvLmZsYWcgJiAweDA2KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjYXNlIDYgOiAqbGV2ZWwgPSAxOyBicmVhazsNCisgICAgICAgICAgY2FzZSA0IDogKmxldmVsID0gMjsgYnJlYWs7DQorICAgICAgICAgIGNhc2UgMiA6ICpsZXZlbCA9IDk7IGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmDQorICAgICAgICAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPVpfREVGTEFURUQpKQ0KKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOw0KKw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMl93YWl0PXMtPmN1cl9maWxlX2luZm8uY3JjOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMj0wOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2QgPQ0KKyAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtPXMtPmZpbGVzdHJlYW07DQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmM9cy0+el9maWxlZnVuYzsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU9cy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7DQorDQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgPSAwOw0KKw0KKyAgICBpZiAoKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT1aX0RFRkxBVEVEKSAmJg0KKyAgICAgICAgKCFyYXcpKQ0KKyAgICB7DQorICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7DQorICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOw0KKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7DQorICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gPSAodm9pZHBmKTA7DQorICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gMDsNCisNCisgICAgICBlcnI9aW5mbGF0ZUluaXQyKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sIC1NQVhfV0JJVFMpOw0KKyAgICAgIGlmIChlcnIgPT0gWl9PSykNCisgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZD0xOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOw0KKyAgICAgICAgcmV0dXJuIGVycjsNCisgICAgICB9DQorICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gdGVsbCB0aGF0IHRoZXJlIGlzIG5vIHpsaWIgaGVhZGVyLg0KKyAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlDQorICAgICAgICAgKiBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0gaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBhbmQNCisgICAgICAgICAqIHJldHVybiBaX1NUUkVBTV9FTkQuDQorICAgICAgICAgKiBJbiB1bnppcCwgaSBkb24ndCB3YWl0IGFic29sdXRlbHkgWl9TVFJFQU1fRU5EIGJlY2F1c2UgSSBrbm93biB0aGUNCisgICAgICAgICAqIHNpemUgb2YgYm90aCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgZGF0YQ0KKyAgICAgICAgICovDQorICAgIH0NCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQgPQ0KKyAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3NlZF9zaXplIDsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9DQorICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSA7DQorDQorDQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlID0NCisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlICsgU0laRVpJUExPQ0FMSEVBREVSICsNCisgICAgICAgICAgICAgIGlTaXplVmFyOw0KKw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOw0KKw0KKyAgICBzLT5wZmlsZV9pbl96aXBfcmVhZCA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm87DQorDQorIyAgICBpZm5kZWYgTk9VTkNSWVBUDQorICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQ0KKyAgICB7DQorICAgICAgICBpbnQgaTsNCisgICAgICAgIHMtPnBjcmNfMzJfdGFiID0gZ2V0X2NyY190YWJsZSgpOw0KKyAgICAgICAgaW5pdF9rZXlzKHBhc3N3b3JkLHMtPmtleXMscy0+cGNyY18zMl90YWIpOw0KKyAgICAgICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlICsNCisgICAgICAgICAgICAgICAgICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZC0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsDQorICAgICAgICAgICAgICAgICAgU0VFS19TRVQpIT0wKQ0KKyAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsNCisgICAgICAgIGlmKFpSRUFEKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc291cmNlLCAxMik8MTIpDQorICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOw0KKw0KKyAgICAgICAgZm9yIChpID0gMDsgaTwxMjsgaSsrKQ0KKyAgICAgICAgICAgIHpkZWNvZGUocy0+a2V5cyxzLT5wY3JjXzMyX3RhYixzb3VyY2VbaV0pOw0KKw0KKyAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlKz0xMjsNCisgICAgICAgIHMtPmVuY3J5cHRlZD0xOw0KKyAgICB9DQorIyAgICBlbmRpZg0KKw0KKw0KKyAgICByZXR1cm4gVU5aX09LOw0KK30NCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlIChmaWxlKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorew0KKyAgICByZXR1cm4gdW56T3BlbkN1cnJlbnRGaWxlMyhmaWxlLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkIChmaWxlLCBwYXNzd29yZCkNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsNCit7DQorICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIHBhc3N3b3JkKTsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgKGZpbGUsbWV0aG9kLGxldmVsLHJhdykNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICBpbnQqIG1ldGhvZDsNCisgICAgaW50KiBsZXZlbDsNCisgICAgaW50IHJhdzsNCit7DQorICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIG1ldGhvZCwgbGV2ZWwsIHJhdywgTlVMTCk7DQorfQ0KKw0KKy8qDQorICBSZWFkIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZS4NCisgIGJ1ZiBjb250YWluIGJ1ZmZlciB3aGVyZSBkYXRhIG11c3QgYmUgY29waWVkDQorICBsZW4gdGhlIHNpemUgb2YgYnVmLg0KKw0KKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgaWYgc29tZXMgYnl0ZXMgYXJlIGNvcGllZA0KKyAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkDQorICByZXR1cm4gPDAgd2l0aCBlcnJvciBjb2RlIGlmIHRoZXJlIGlzIGFuIGVycm9yDQorICAgIChVTlpfRVJSTk8gZm9yIElPIGVycm9yLCBvciB6TGliIGVycm9yIGZvciB1bmNvbXByZXNzIGVycm9yKQ0KKyovDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlYWRDdXJyZW50RmlsZSAgKGZpbGUsIGJ1ZiwgbGVuKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorICAgIHZvaWRwIGJ1ZjsNCisgICAgdW5zaWduZWQgbGVuOw0KK3sNCisgICAgaW50IGVycj1VTlpfT0s7DQorICAgIHVJbnQgaVJlYWQgPSAwOw0KKyAgICB1bnpfcyogczsNCisgICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87DQorICAgIGlmIChmaWxlPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKyAgICBzPSh1bnpfcyopZmlsZTsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsNCisNCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorDQorDQorICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPT0gTlVMTCkpDQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7DQorICAgIGlmIChsZW49PTApDQorICAgICAgICByZXR1cm4gMDsNCisNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7DQorDQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClsZW47DQorDQorICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQpICYmDQorICAgICAgICAoIShwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKSkNCisgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPQ0KKyAgICAgICAgICAgICh1SW50KXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQ7DQorDQorICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkKw0KKyAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luKSAmJg0KKyAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQ0KKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9DQorICAgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQrDQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luOw0KKw0KKyAgICB3aGlsZSAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dD4wKQ0KKyAgICB7DQorICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbj09MCkgJiYNCisgICAgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ+MCkpDQorICAgICAgICB7DQorICAgICAgICAgICAgdUludCB1UmVhZFRoaXMgPSBVTlpfQlVGU0laRTsNCisgICAgICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ8dVJlYWRUaGlzKQ0KKyAgICAgICAgICAgICAgICB1UmVhZFRoaXMgPSAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDsNCisgICAgICAgICAgICBpZiAodVJlYWRUaGlzID09IDApDQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRU9GOw0KKyAgICAgICAgICAgIGlmIChaU0VFSyhwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLA0KKyAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsNCisgICAgICAgICAgICBpZiAoWlJFQUQocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywNCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgIHVSZWFkVGhpcykhPXVSZWFkVGhpcykNCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsNCisNCisNCisjICAgICAgICAgICAgaWZuZGVmIE5PVU5DUllQVA0KKyAgICAgICAgICAgIGlmKHMtPmVuY3J5cHRlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVJbnQgaTsNCisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHVSZWFkVGhpcztpKyspDQorICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0gPQ0KKyAgICAgICAgICAgICAgICAgICAgICB6ZGVjb2RlKHMtPmtleXMscy0+cGNyY18zMl90YWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0pOw0KKyAgICAgICAgICAgIH0NCisjICAgICAgICAgICAgZW5kaWYNCisNCisNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArPSB1UmVhZFRoaXM7DQorDQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQtPXVSZWFkVGhpczsNCisNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9DQorICAgICAgICAgICAgICAgIChCeXRlZiopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI7DQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpdVJlYWRUaGlzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2Q9PTApIHx8IChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVJbnQgdURvQ29weSxpIDsNCisNCisgICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSAmJg0KKyAgICAgICAgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQgPT0gMCkpDQorICAgICAgICAgICAgICAgIHJldHVybiAoaVJlYWQ9PTApID8gVU5aX0VPRiA6IGlSZWFkOw0KKw0KKyAgICAgICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0IDwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luKQ0KKyAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luIDsNCisNCisgICAgICAgICAgICBmb3IgKGk9MDtpPHVEb0NvcHk7aSsrKQ0KKyAgICAgICAgICAgICAgICAqKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCtpKSA9DQorICAgICAgICAgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbitpKTsNCisNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdURvQ29weSk7DQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZC09dURvQ29weTsNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gLT0gdURvQ29weTsNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0IC09IHVEb0NvcHk7DQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICs9IHVEb0NvcHk7DQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gKz0gdURvQ29weTsNCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0ICs9IHVEb0NvcHk7DQorICAgICAgICAgICAgaVJlYWQgKz0gdURvQ29weTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUsdVRvdGFsT3V0QWZ0ZXI7DQorICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmJ1ZkJlZm9yZTsNCisgICAgICAgICAgICB1TG9uZyB1T3V0VGhpczsNCisgICAgICAgICAgICBpbnQgZmx1c2g9Wl9TWU5DX0ZMVVNIOw0KKw0KKyAgICAgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7DQorICAgICAgICAgICAgYnVmQmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0Ow0KKw0KKyAgICAgICAgICAgIC8qDQorICAgICAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09DQorICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCkgJiYNCisgICAgICAgICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID09IDApKQ0KKyAgICAgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOw0KKyAgICAgICAgICAgICovDQorICAgICAgICAgICAgZXJyPWluZmxhdGUoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSxmbHVzaCk7DQorDQorICAgICAgICAgICAgaWYgKChlcnI+PTApICYmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubXNnIT1OVUxMKSkNCisgICAgICAgICAgICAgIGVyciA9IFpfREFUQV9FUlJPUjsNCisNCisgICAgICAgICAgICB1VG90YWxPdXRBZnRlciA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7DQorICAgICAgICAgICAgdU91dFRoaXMgPSB1VG90YWxPdXRBZnRlci11VG90YWxPdXRCZWZvcmU7DQorDQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPQ0KKyAgICAgICAgICAgICAgICBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgKHVJbnQpKHVPdXRUaGlzKSk7DQorDQorICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPQ0KKyAgICAgICAgICAgICAgICB1T3V0VGhpczsNCisNCisgICAgICAgICAgICBpUmVhZCArPSAodUludCkodVRvdGFsT3V0QWZ0ZXIgLSB1VG90YWxPdXRCZWZvcmUpOw0KKw0KKyAgICAgICAgICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7DQorICAgICAgICAgICAgaWYgKGVyciE9Wl9PSykNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgaWYgKGVycj09Wl9PSykNCisgICAgICAgIHJldHVybiBpUmVhZDsNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorDQorLyoNCisgIEdpdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdW5jb21wcmVzc2VkIGRhdGENCisqLw0KK2V4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCAoZmlsZSkNCisgICAgdW56RmlsZSBmaWxlOw0KK3sNCisgICAgdW56X3MqIHM7DQorICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7DQorDQorICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKw0KKyAgICByZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsNCit9DQorDQorDQorLyoNCisgIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUNCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgKGZpbGUpDQorICAgIHVuekZpbGUgZmlsZTsNCit7DQorICAgIHVuel9zKiBzOw0KKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsNCisgICAgaWYgKGZpbGU9PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorICAgIHM9KHVuel9zKilmaWxlOw0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOw0KKw0KKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisNCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkNCisgICAgICAgIHJldHVybiAxOw0KKyAgICBlbHNlDQorICAgICAgICByZXR1cm4gMDsNCit9DQorDQorDQorDQorLyoNCisgIFJlYWQgZXh0cmEgZmllbGQgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQ0KKyAgVGhpcyBpcyB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkIChzb21ldGltZXMsIHRoZXJlIGlzDQorICAgIG1vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpDQorDQorICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgdGhhdCBjYW4gYmUgcmVhZA0KKw0KKyAgaWYgYnVmIT1OVUxMLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgdGhlIGV4dHJhIGhlYWRlciBpcyBjb3BpZWQgaW4NCisgICAgYnVmLg0KKyAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkNCisgICAgdGhlIGVycm9yIGNvZGUNCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgKGZpbGUsYnVmLGxlbikNCisgICAgdW56RmlsZSBmaWxlOw0KKyAgICB2b2lkcCBidWY7DQorICAgIHVuc2lnbmVkIGxlbjsNCit7DQorICAgIHVuel9zKiBzOw0KKyAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsNCisgICAgdUludCByZWFkX25vdzsNCisgICAgdUxvbmcgc2l6ZV90b19yZWFkOw0KKw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7DQorDQorICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKw0KKyAgICBzaXplX3RvX3JlYWQgPSAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c2l6ZV9sb2NhbF9leHRyYWZpZWxkIC0NCisgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQpOw0KKw0KKyAgICBpZiAoYnVmPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIChpbnQpc2l6ZV90b19yZWFkOw0KKw0KKyAgICBpZiAobGVuPnNpemVfdG9fcmVhZCkNCisgICAgICAgIHJlYWRfbm93ID0gKHVJbnQpc2l6ZV90b19yZWFkOw0KKyAgICBlbHNlDQorICAgICAgICByZWFkX25vdyA9ICh1SW50KWxlbiA7DQorDQorICAgIGlmIChyZWFkX25vdz09MCkNCisgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICBpZiAoWlNFRUsocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywNCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCArDQorICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZCwNCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsNCisNCisgICAgaWYgKFpSRUFEKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsDQorICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLA0KKyAgICAgICAgICAgICAgYnVmLHJlYWRfbm93KSE9cmVhZF9ub3cpDQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POw0KKw0KKyAgICByZXR1cm4gKGludClyZWFkX25vdzsNCit9DQorDQorLyoNCisgIENsb3NlIHRoZSBmaWxlIGluIHppcCBvcGVuZWQgd2l0aCB1bnppcE9wZW5DdXJyZW50RmlsZQ0KKyAgUmV0dXJuIFVOWl9DUkNFUlJPUiBpZiBhbGwgdGhlIGZpbGUgd2FzIHJlYWQgYnV0IHRoZSBDUkMgaXMgbm90IGdvb2QNCisqLw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZUN1cnJlbnRGaWxlIChmaWxlKQ0KKyAgICB1bnpGaWxlIGZpbGU7DQorew0KKyAgICBpbnQgZXJyPVVOWl9PSzsNCisNCisgICAgdW56X3MqIHM7DQorICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7DQorDQorICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOw0KKw0KKw0KKyAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkgJiYNCisgICAgICAgICghcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkNCisgICAgew0KKyAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyICE9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyX3dhaXQpDQorICAgICAgICAgICAgZXJyPVVOWl9DUkNFUlJPUjsNCisgICAgfQ0KKw0KKw0KKyAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyKTsNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPSBOVUxMOw0KKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkKQ0KKyAgICAgICAgaW5mbGF0ZUVuZCgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtKTsNCisNCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkID0gMDsNCisgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsNCisNCisgICAgcy0+cGZpbGVfaW5femlwX3JlYWQ9TlVMTDsNCisNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorDQorLyoNCisgIEdldCB0aGUgZ2xvYmFsIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBaaXBGaWxlLCBpbiB0aGUgc3pDb21tZW50IGJ1ZmZlci4NCisgIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLg0KKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MA0KKyovDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbENvbW1lbnQgKGZpbGUsIHN6Q29tbWVudCwgdVNpemVCdWYpDQorICAgIHVuekZpbGUgZmlsZTsNCisgICAgY2hhciAqc3pDb21tZW50Ow0KKyAgICB1TG9uZyB1U2l6ZUJ1ZjsNCit7DQorICAgIGludCBlcnI9VU5aX09LOw0KKyAgICB1bnpfcyogczsNCisgICAgdUxvbmcgdVJlYWRUaGlzIDsNCisgICAgaWYgKGZpbGU9PU5VTEwpDQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorICAgIHM9KHVuel9zKilmaWxlOw0KKw0KKyAgICB1UmVhZFRoaXMgPSB1U2l6ZUJ1ZjsNCisgICAgaWYgKHVSZWFkVGhpcz5zLT5naS5zaXplX2NvbW1lbnQpDQorICAgICAgICB1UmVhZFRoaXMgPSBzLT5naS5zaXplX2NvbW1lbnQ7DQorDQorICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLHMtPmZpbGVzdHJlYW0scy0+Y2VudHJhbF9wb3MrMjIsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApDQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POw0KKw0KKyAgICBpZiAodVJlYWRUaGlzPjApDQorICAgIHsNCisgICAgICAqc3pDb21tZW50PSdcMCc7DQorICAgICAgaWYgKFpSRUFEKHMtPnpfZmlsZWZ1bmMscy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQ0KKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsNCisgICAgfQ0KKw0KKyAgICBpZiAoKHN6Q29tbWVudCAhPSBOVUxMKSAmJiAodVNpemVCdWYgPiBzLT5naS5zaXplX2NvbW1lbnQpKQ0KKyAgICAgICAgKihzekNvbW1lbnQrcy0+Z2kuc2l6ZV9jb21tZW50KT0nXDAnOw0KKyAgICByZXR1cm4gKGludCl1UmVhZFRoaXM7DQorfQ0KKw0KKy8qIEFkZGl0aW9ucyBieSBSWCAnMjAwNCAqLw0KK2V4dGVybiB1TG9uZyBaRVhQT1JUIHVuekdldE9mZnNldCAoZmlsZSkNCisgICAgdW56RmlsZSBmaWxlOw0KK3sNCisgICAgdW56X3MqIHM7DQorDQorICAgIGlmIChmaWxlPT1OVUxMKQ0KKyAgICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7DQorICAgIHM9KHVuel9zKilmaWxlOw0KKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykNCisgICAgICByZXR1cm4gMDsNCisgICAgaWYgKHMtPmdpLm51bWJlcl9lbnRyeSAhPSAwICYmIHMtPmdpLm51bWJlcl9lbnRyeSAhPSAweGZmZmYpDQorICAgICAgaWYgKHMtPm51bV9maWxlPT1zLT5naS5udW1iZXJfZW50cnkpDQorICAgICAgICAgcmV0dXJuIDA7DQorICAgIHJldHVybiBzLT5wb3NfaW5fY2VudHJhbF9kaXI7DQorfQ0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKGZpbGUsIHBvcykNCisgICAgICAgIHVuekZpbGUgZmlsZTsNCisgICAgICAgIHVMb25nIHBvczsNCit7DQorICAgIHVuel9zKiBzOw0KKyAgICBpbnQgZXJyOw0KKw0KKyAgICBpZiAoZmlsZT09TlVMTCkNCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsNCisgICAgcz0odW56X3MqKWZpbGU7DQorDQorICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciA9IHBvczsNCisgICAgcy0+bnVtX2ZpbGUgPSBzLT5naS5udW1iZXJfZW50cnk7ICAgICAgLyogaGFjayAqLw0KKyAgICBlcnIgPSB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOw0KKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7DQorICAgIHJldHVybiBlcnI7DQorfQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluaXppcC91bnppcC5oIGIvY29udHJpYi9taW5pemlwL3VuemlwLmgKaW5kZXggMGM3YzZmMS4uYzMyMDZhMCAxMDA2NDQKLS0tIGEvY29udHJpYi9taW5pemlwL3VuemlwLmgKKysrIGIvY29udHJpYi9taW5pemlwL3VuemlwLmgKQEAgLTEsMzUyICsxLDM1NCBAQAotLyogdW56aXAuaCAtLSBJTyBmb3IgdW5jb21wcmVzcyAuemlwIGZpbGVzIHVzaW5nIHpsaWIKLSAgIFZlcnNpb24gMS4wMSwgTWF5IDh0aCwgMjAwNAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudAotCi0gICBUaGlzIHVuemlwIHBhY2thZ2UgYWxsb3cgZXh0cmFjdCBmaWxlIGZyb20gLlpJUCBmaWxlLCBjb21wYXRpYmxlIHdpdGggUEtaaXAgMi4wNGcKLSAgICAgV2luWmlwLCBJbmZvWmlwIHRvb2xzIGFuZCBjb21wYXRpYmxlLgotICAgRW5jcnlwdGlvbiBhbmQgbXVsdGkgdm9sdW1lIFppcEZpbGUgKHNwYW4pIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgT2xkIGNvbXByZXNzaW9ucyB1c2VkIGJ5IG9sZCBQS1ppcCAxLnggYXJlIG5vdCBzdXBwb3J0ZWQKLQotCi0gICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQotICAgVmlzaXQgYWxzbyBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bSBmb3IgZXZvbHV0aW9uCi0KLSAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLQotKi8KLQotLyogZm9yIG1vcmUgaW5mbyBhYm91dCAuWklQIGZvcm1hdCwgc2VlCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvYXBwbm90ZS05ODExMTktaXouemlwCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvCi0gICBQa1dhcmUgaGFzIGFsc28gYSBzcGVjaWZpY2F0aW9uIGF0IDoKLSAgICAgIGZ0cDovL2Z0cC5wa3dhcmUuY29tL3Byb2JkZXNjLnppcAotKi8KLQotI2lmbmRlZiBfdW56X0gKLSNkZWZpbmUgX3Vuel9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBfWkxJQl9ICi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJJT0FQSV9ICi0jaW5jbHVkZSAiaW9hcGkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVFJJQ1RVTlpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkKLS8qIGxpa2UgdGhlIFNUUklDVCBvZiBXSU4zMiwgd2UgZGVmaW5lIGEgcG9pbnRlciB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQKLSAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovCi10eXBlZGVmIHN0cnVjdCBUYWd1bnpGaWxlX18geyBpbnQgdW51c2VkOyB9IHVuekZpbGVfXzsKLXR5cGVkZWYgdW56RmlsZV9fICp1bnpGaWxlOwotI2Vsc2UKLXR5cGVkZWYgdm9pZHAgdW56RmlsZTsKLSNlbmRpZgotCi0KLSNkZWZpbmUgVU5aX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgICAgICAgICAoLTEwMCkKLSNkZWZpbmUgVU5aX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKLSNkZWZpbmUgVU5aX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVU5aX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKLSNkZWZpbmUgVU5aX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKLSNkZWZpbmUgVU5aX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKLSNkZWZpbmUgVU5aX0NSQ0VSUk9SICAgICAgICAgICAgICAgICAgICAoLTEwNSkKLQotLyogdG1fdW56IGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHRtX3Vuel9zCi17Ci0gICAgdUludCB0bV9zZWM7ICAgICAgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCi0gICAgdUludCB0bV9taW47ICAgICAgICAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLwotICAgIHVJbnQgdG1faG91cjsgICAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCi0gICAgdUludCB0bV9tZGF5OyAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVJbnQgdG1fbW9uOyAgICAgICAgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovCi0gICAgdUludCB0bV95ZWFyOyAgICAgICAgICAgLyogeWVhcnMgLSBbMTk4MC4uMjA0NF0gKi8KLX0gdG1fdW56OwotCi0vKiB1bnpfZ2xvYmFsX2luZm8gc3RydWN0dXJlIGNvbnRhaW4gZ2xvYmFsIGRhdGEgYWJvdXQgdGhlIFpJUGZpbGUKLSAgIFRoZXNlIGRhdGEgY29tZXMgZnJvbSB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyICovCi10eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm9fcwotewotICAgIHVMb25nIG51bWJlcl9lbnRyeTsgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCi19IHVuel9nbG9iYWxfaW5mbzsKLQotCi0vKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX3MKLXsKLSAgICB1TG9uZyB2ZXJzaW9uOyAgICAgICAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLwotICAgIHVMb25nIGNyYzsgICAgICAgICAgICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2VkX3NpemU7ICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCi0gICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLwotICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLwotCi0gICAgdUxvbmcgZGlza19udW1fc3RhcnQ7ICAgICAgIC8qIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBleHRlcm5hbF9mYTsgICAgICAgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCi0KLSAgICB0bV91bnogdG11X2RhdGU7Ci19IHVuel9maWxlX2luZm87Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgT0YgKChjb25zdCBjaGFyKiBmaWxlTmFtZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7Ci0vKgotICAgQ29tcGFyZSB0d28gZmlsZW5hbWUgKGZpbGVOYW1lMSxmaWxlTmFtZTIpLgotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KLSAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykKLSovCi0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIE9GKChjb25zdCBjaGFyICpwYXRoKSk7Ci0vKgotICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwKLSAgICAgb24gYSBXaW5kb3dzIFhQIGNvbXB1dGVyICJjOlxcemxpYlxcemxpYjExMy56aXAiIG9yIG9uIGFuIFVuaXggY29tcHV0ZXIKLSAgICAgInpsaWIvemxpYjExMy56aXAiLgotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvbid0IGV4aXN0IG9yIGluIG5vdCB2YWxpZCksIHRoZQotICAgICAgIHJldHVybiB2YWx1ZSBpcyBOVUxMLgotICAgICBFbHNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdW56RmlsZSBIYW5kbGUsIHVzYWJsZSB3aXRoIG90aGVyIGZ1bmN0aW9uCi0gICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLgotKi8KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLS8qCi0gICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56T3BlbiwgYnV0IHByb3ZpZGUgYSBzZXQgb2YgZmlsZSBsb3cgbGV2ZWwgQVBJCi0gICAgICBmb3IgcmVhZC93cml0ZSB0aGUgemlwIGZpbGUgKHNlZSBpb2FwaS5oKQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uCi0gIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnpPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCi0gICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnppcENsb3NlQ3VycmVudEZpbGUgYmVmb3JlIGNhbGwgdW56aXBDbG9zZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsSW5mbyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9nbG9iYWxfaW5mbyAqcGdsb2JhbF9pbmZvKSk7Ci0vKgotICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KLSAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxDb21tZW50IE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVTaXplQnVmKSk7Ci0vKgotICBHZXQgdGhlIGdsb2JhbCBjb21tZW50IHN0cmluZyBvZiB0aGUgWmlwRmlsZSwgaW4gdGhlIHN6Q29tbWVudCBidWZmZXIuCi0gIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLgotICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlIGNvcGllZCBvciBhbiBlcnJvciBjb2RlIDwwCi0qLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBVbnppcCBwYWNrYWdlIGFsbG93IHlvdSBicm93c2UgdGhlIGRpcmVjdG9yeSBvZiB0aGUgemlwZmlsZSAqLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpcnN0RmlsZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub05leHRGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBuZXh0IGZpbGUuCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQotICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGFjdHVhbCBmaWxlIHdhcyB0aGUgbGF0ZXN0LgotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekxvY2F0ZUZpbGUgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN6RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaUNhc2VTZW5zaXRpdml0eSkpOwotLyoKLSAgVHJ5IGxvY2F0ZSB0aGUgZmlsZSBzekZpbGVOYW1lIGluIHRoZSB6aXBmaWxlLgotICBGb3IgdGhlIGlDYXNlU2Vuc2l0aXZpdHkgc2lnbmlmaWNhdGlvbiwgc2VlIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZQotCi0gIHJldHVybiB2YWx1ZSA6Ci0gIFVOWl9PSyBpZiB0aGUgZmlsZSBpcyBmb3VuZC4gSXQgYmVjb21lcyB0aGUgY3VycmVudCBmaWxlLgotICBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQKLSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBSeWFuIHN1cHBsaWVkIGZ1bmN0aW9ucyAqLwotLyogdW56X2ZpbGVfaW5mbyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB0aGUgemlwZmlsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MKLXsKLSAgICB1TG9uZyBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvKiBvZmZzZXQgaW4gemlwIGZpbGUgZGlyZWN0b3J5ICovCi0gICAgdUxvbmcgbnVtX29mX2ZpbGU7ICAgICAgICAgICAgLyogIyBvZiBmaWxlICovCi19IHVuel9maWxlX3BvczsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpOwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsKLS8qCi0gIEdldCBJbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUKLSAgaWYgcGZpbGVfaW5mbyE9TlVMTCwgdGhlICpwZmlsZV9pbmZvIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gc29tZXMgaW5mbyBhYm91dAotICAgICAgICB0aGUgY3VycmVudCBmaWxlCi0gIGlmIHN6RmlsZU5hbWUhPU5VTEwsIHRoZSBmaWxlbWFuZSBzdHJpbmcgd2lsbCBiZSBjb3BpZWQgaW4gc3pGaWxlTmFtZQotICAgICAgICAgICAgKGZpbGVOYW1lQnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQotICBpZiBleHRyYUZpZWxkIT1OVUxMLCB0aGUgZXh0cmEgZmllbGQgaW5mb3JtYXRpb24gd2lsbCBiZSBjb3BpZWQgaW4gZXh0cmFGaWVsZAotICAgICAgICAgICAgKGV4dHJhRmllbGRCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpLgotICAgICAgICAgICAgVGhpcyBpcyB0aGUgQ2VudHJhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQKLSAgaWYgc3pDb21tZW50IT1OVUxMLCB0aGUgY29tbWVudCBzdHJpbmcgb2YgdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW4gc3pDb21tZW50Ci0gICAgICAgICAgICAoY29tbWVudEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmb3IgcmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB6aXBmaWxlLCB5b3UgY2FuIG9wZW4gaXQsIHJlYWQgZGF0YQotICAgZnJvbSBpdCwgYW5kIGNsb3NlIGl0ICh5b3UgY2FuIGNsb3NlIGl0IGJlZm9yZSByZWFkaW5nIGFsbCB0aGUgZmlsZSkKLSAgICovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCi0gIElmIHRoZXJlIGlzIG5vIGVycm9yLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4KLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOwotLyoKLSAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCi0gIHBhc3N3b3JkIGlzIGEgY3J5cHRpbmcgcGFzc3dvcmQKLSAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsKLS8qCi0gIFNhbWUgdGhhbiB1bnpPcGVuQ3VycmVudEZpbGUsIGJ1dCBvcGVuIGZvciByZWFkIHJhdyB0aGUgZmlsZSAobm90IHVuY29tcHJlc3MpCi0gICAgaWYgcmF3PT0xCi0gICptZXRob2Qgd2lsbCByZWNlaXZlIG1ldGhvZCBvZiBjb21wcmVzc2lvbiwgKmxldmVsIHdpbGwgcmVjZWl2ZSBsZXZlbCBvZgotICAgICBjb21wcmVzc2lvbgotICBub3RlIDogeW91IGNhbiBzZXQgbGV2ZWwgcGFyYW1ldGVyIGFzIE5VTEwgKGlmIHlvdSBkaWQgbm90IHdhbnQga25vd24gbGV2ZWwsCi0gICAgICAgICBidXQgeW91IENBTk5PVCBzZXQgbWV0aG9kIHBhcmFtZXRlciBhcyBOVUxMCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOwotLyoKLSAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKLSAgICBpZiByYXc9PTEKLSAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCi0gICAgIGNvbXByZXNzaW9uCi0gIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKLSAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKLSovCi0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQotICBSZXR1cm4gVU5aX0NSQ0VSUk9SIGlmIGFsbCB0aGUgZmlsZSB3YXMgcmVhZCBidXQgdGhlIENSQyBpcyBub3QgZ29vZAotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlYWRDdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQotICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAotICBsZW4gdGhlIHNpemUgb2YgYnVmLgotCi0gIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKLSAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCi0gIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKLSovCi0KLWV4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBHaXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgUmVhZCBleHRyYSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCi0gIFRoaXMgaXMgdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZCAoc29tZXRpbWVzLCB0aGVyZSBpcwotICAgIG1vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpCi0KLSAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkCi0KLSAgaWYgYnVmIT1OVUxMLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgdGhlIGV4dHJhIGhlYWRlciBpcyBjb3BpZWQgaW4KLSAgICBidWYuCi0gIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCi0gICAgdGhlIGVycm9yIGNvZGUKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEdldCB0aGUgY3VycmVudCBmaWxlIG9mZnNldCAqLwotZXh0ZXJuIHVMb25nIFpFWFBPUlQgdW56R2V0T2Zmc2V0ICh1bnpGaWxlIGZpbGUpOwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZmZzZXQgKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKHVuekZpbGUgZmlsZSwgdUxvbmcgcG9zKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfdW56X0ggKi8KKy8qIHVuemlwLmggLS0gSU8gZm9yIHVuY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorDQorICAgVGhpcyB1bnppcCBwYWNrYWdlIGFsbG93IGV4dHJhY3QgZmlsZSBmcm9tIC5aSVAgZmlsZSwgY29tcGF0aWJsZSB3aXRoIFBLWmlwIDIuMDRnDQorICAgICBXaW5aaXAsIEluZm9aaXAgdG9vbHMgYW5kIGNvbXBhdGlibGUuDQorDQorICAgTXVsdGkgdm9sdW1lIFppcEZpbGUgKHNwYW4pIGFyZSBub3Qgc3VwcG9ydGVkLg0KKyAgIEVuY3J5cHRpb24gY29tcGF0aWJsZSB3aXRoIHBremlwIDIuMDRnIG9ubHkgc3VwcG9ydGVkDQorICAgT2xkIGNvbXByZXNzaW9ucyB1c2VkIGJ5IG9sZCBQS1ppcCAxLnggYXJlIG5vdCBzdXBwb3J0ZWQNCisNCisNCisgICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQ0KKyAgIFZpc2l0IGFsc28gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG0gZm9yIGV2b2x1dGlvbg0KKw0KKyAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoNCisNCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkDQorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQorICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KKw0KKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorDQorICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKw0KKw0KKyovDQorDQorLyogZm9yIG1vcmUgaW5mbyBhYm91dCAuWklQIGZvcm1hdCwgc2VlDQorICAgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jL2FwcG5vdGUtOTgxMTE5LWl6LnppcA0KKyAgICAgIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2RvYy8NCisgICBQa1dhcmUgaGFzIGFsc28gYSBzcGVjaWZpY2F0aW9uIGF0IDoNCisgICAgICBmdHA6Ly9mdHAucGt3YXJlLmNvbS9wcm9iZGVzYy56aXANCisqLw0KKw0KKyNpZm5kZWYgX3Vuel9IDQorI2RlZmluZSBfdW56X0gNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9aTElCX0gNCisjaW5jbHVkZSAiemxpYi5oIg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX1pMSUJJT0FQSV9IDQorI2luY2x1ZGUgImlvYXBpLmgiDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoU1RSSUNUVU5aSVApIHx8IGRlZmluZWQoU1RSSUNUWklQVU5aSVApDQorLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZA0KKyAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovDQordHlwZWRlZiBzdHJ1Y3QgVGFndW56RmlsZV9fIHsgaW50IHVudXNlZDsgfSB1bnpGaWxlX187DQordHlwZWRlZiB1bnpGaWxlX18gKnVuekZpbGU7DQorI2Vsc2UNCit0eXBlZGVmIHZvaWRwIHVuekZpbGU7DQorI2VuZGlmDQorDQorDQorI2RlZmluZSBVTlpfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgICAgICAgICAoLTEwMCkNCisjZGVmaW5lIFVOWl9FUlJOTyAgICAgICAgICAgICAgICAgICAgICAgKFpfRVJSTk8pDQorI2RlZmluZSBVTlpfRU9GICAgICAgICAgICAgICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgVU5aX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikNCisjZGVmaW5lIFVOWl9CQURaSVBGSUxFICAgICAgICAgICAgICAgICAgKC0xMDMpDQorI2RlZmluZSBVTlpfSU5URVJOQUxFUlJPUiAgICAgICAgICAgICAgICgtMTA0KQ0KKyNkZWZpbmUgVU5aX0NSQ0VSUk9SICAgICAgICAgICAgICAgICAgICAoLTEwNSkNCisNCisvKiB0bV91bnogY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLw0KK3R5cGVkZWYgc3RydWN0IHRtX3Vuel9zDQorew0KKyAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8NCisgICAgdUludCB0bV9taW47ICAgICAgICAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLw0KKyAgICB1SW50IHRtX2hvdXI7ICAgICAgICAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLw0KKyAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovDQorICAgIHVJbnQgdG1fbW9uOyAgICAgICAgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovDQorICAgIHVJbnQgdG1feWVhcjsgICAgICAgICAgIC8qIHllYXJzIC0gWzE5ODAuLjIwNDRdICovDQorfSB0bV91bno7DQorDQorLyogdW56X2dsb2JhbF9pbmZvIHN0cnVjdHVyZSBjb250YWluIGdsb2JhbCBkYXRhIGFib3V0IHRoZSBaSVBmaWxlDQorICAgVGhlc2UgZGF0YSBjb21lcyBmcm9tIHRoZSBlbmQgb2YgY2VudHJhbCBkaXIgKi8NCit0eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm9fcw0KK3sNCisgICAgdUxvbmcgbnVtYmVyX2VudHJ5OyAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluDQorICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovDQorICAgIHVMb25nIHNpemVfY29tbWVudDsgICAgICAgICAvKiBzaXplIG9mIHRoZSBnbG9iYWwgY29tbWVudCBvZiB0aGUgemlwZmlsZSAqLw0KK30gdW56X2dsb2JhbF9pbmZvOw0KKw0KKw0KKy8qIHVuel9maWxlX2luZm8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gdGhlIHppcGZpbGUgKi8NCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX3MNCit7DQorICAgIHVMb25nIHZlcnNpb247ICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8NCisgICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLw0KKyAgICB1TG9uZyBmbGFnOyAgICAgICAgICAgICAgICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovDQorICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgICAgICAgICAgICAgIDIgYnl0ZXMgKi8NCisgICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLw0KKyAgICB1TG9uZyBjcmM7ICAgICAgICAgICAgICAgICAgLyogY3JjLTMyICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJ5dGVzICovDQorICAgIHVMb25nIGNvbXByZXNzZWRfc2l6ZTsgICAgICAvKiBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8NCisgICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLw0KKyAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOyAgICAgICAgLyogZmlsZW5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAyIGJ5dGVzICovDQorICAgIHVMb25nIHNpemVfZmlsZV9leHRyYTsgICAgICAvKiBleHRyYSBmaWVsZCBsZW5ndGggICAgICAgICAgICAgIDIgYnl0ZXMgKi8NCisgICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLw0KKw0KKyAgICB1TG9uZyBkaXNrX251bV9zdGFydDsgICAgICAgLyogZGlzayBudW1iZXIgc3RhcnQgICAgICAgICAgICAgICAyIGJ5dGVzICovDQorICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8NCisgICAgdUxvbmcgZXh0ZXJuYWxfZmE7ICAgICAgICAgIC8qIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgNCBieXRlcyAqLw0KKw0KKyAgICB0bV91bnogdG11X2RhdGU7DQorfSB1bnpfZmlsZV9pbmZvOw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgT0YgKChjb25zdCBjaGFyKiBmaWxlTmFtZTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHkpKTsNCisvKg0KKyAgIENvbXBhcmUgdHdvIGZpbGVuYW1lIChmaWxlTmFtZTEsZmlsZU5hbWUyKS4NCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAxLCBjb21wYXJpc2lvbiBpcyBjYXNlIHNlbnNpdGl2aXR5IChsaWtlIHN0cmNtcCkNCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdHJjYXNlY21wKQ0KKyAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDAsIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVmYXV0IG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbQ0KKyAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykNCisqLw0KKw0KKw0KK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCkpOw0KKy8qDQorICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwNCisgICAgIG9uIGEgV2luZG93cyBYUCBjb21wdXRlciAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyDQorICAgICAiemxpYi96bGliMTEzLnppcCIuDQorICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvbid0IGV4aXN0IG9yIGluIG5vdCB2YWxpZCksIHRoZQ0KKyAgICAgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4NCisgICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB1bnpGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24NCisgICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLg0KKyovDQorDQorZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7DQorLyoNCisgICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56T3BlbiwgYnV0IHByb3ZpZGUgYSBzZXQgb2YgZmlsZSBsb3cgbGV2ZWwgQVBJDQorICAgICAgZm9yIHJlYWQvd3JpdGUgdGhlIHppcCBmaWxlIChzZWUgaW9hcGkuaCkNCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZSBPRigodW56RmlsZSBmaWxlKSk7DQorLyoNCisgIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uDQorICBJZiB0aGVyZSBpcyBmaWxlcyBpbnNpZGUgdGhlIC5aaXAgb3BlbmVkIHdpdGggdW56T3BlbkN1cnJlbnRGaWxlIChzZWUgbGF0ZXIpLA0KKyAgICB0aGVzZSBmaWxlcyBNVVNUIGJlIGNsb3NlZCB3aXRoIHVuemlwQ2xvc2VDdXJyZW50RmlsZSBiZWZvcmUgY2FsbCB1bnppcENsb3NlLg0KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxJbmZvIE9GKCh1bnpGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9nbG9iYWxfaW5mbyAqcGdsb2JhbF9pbmZvKSk7DQorLyoNCisgIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLg0KKyAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQNCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8NCisNCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsQ29tbWVudCBPRigodW56RmlsZSBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVTaXplQnVmKSk7DQorLyoNCisgIEdldCB0aGUgZ2xvYmFsIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBaaXBGaWxlLCBpbiB0aGUgc3pDb21tZW50IGJ1ZmZlci4NCisgIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLg0KKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MA0KKyovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBVbnppcCBwYWNrYWdlIGFsbG93IHlvdSBicm93c2UgdGhlIGRpcmVjdG9yeSBvZiB0aGUgemlwZmlsZSAqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlyc3RGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsNCisvKg0KKyAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIGZpcnN0IGZpbGUuDQorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0NCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvTmV4dEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOw0KKy8qDQorICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgbmV4dCBmaWxlLg0KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtDQorICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGFjdHVhbCBmaWxlIHdhcyB0aGUgbGF0ZXN0Lg0KKyovDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuekxvY2F0ZUZpbGUgT0YoKHVuekZpbGUgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7DQorLyoNCisgIFRyeSBsb2NhdGUgdGhlIGZpbGUgc3pGaWxlTmFtZSBpbiB0aGUgemlwZmlsZS4NCisgIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlDQorDQorICByZXR1cm4gdmFsdWUgOg0KKyAgVU5aX09LIGlmIHRoZSBmaWxlIGlzIGZvdW5kLiBJdCBiZWNvbWVzIHRoZSBjdXJyZW50IGZpbGUuDQorICBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQNCisqLw0KKw0KKw0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KKy8qIFJ5YW4gc3VwcGxpZWQgZnVuY3Rpb25zICovDQorLyogdW56X2ZpbGVfaW5mbyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB0aGUgemlwZmlsZSAqLw0KK3R5cGVkZWYgc3RydWN0IHVuel9maWxlX3Bvc19zDQorew0KKyAgICB1TG9uZyBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvKiBvZmZzZXQgaW4gemlwIGZpbGUgZGlyZWN0b3J5ICovDQorICAgIHVMb25nIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8qICMgb2YgZmlsZSAqLw0KK30gdW56X2ZpbGVfcG9zOw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKA0KKyAgICB1bnpGaWxlIGZpbGUsDQorICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpOw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvcygNCisgICAgdW56RmlsZSBmaWxlLA0KKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKTsNCisNCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVJbmZvIE9GKCh1bnpGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsNCisvKg0KKyAgR2V0IEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZQ0KKyAgaWYgcGZpbGVfaW5mbyE9TlVMTCwgdGhlICpwZmlsZV9pbmZvIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gc29tZXMgaW5mbyBhYm91dA0KKyAgICAgICAgdGhlIGN1cnJlbnQgZmlsZQ0KKyAgaWYgc3pGaWxlTmFtZSE9TlVMTCwgdGhlIGZpbGVtYW5lIHN0cmluZyB3aWxsIGJlIGNvcGllZCBpbiBzekZpbGVOYW1lDQorICAgICAgICAgICAgKGZpbGVOYW1lQnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQ0KKyAgaWYgZXh0cmFGaWVsZCE9TlVMTCwgdGhlIGV4dHJhIGZpZWxkIGluZm9ybWF0aW9uIHdpbGwgYmUgY29waWVkIGluIGV4dHJhRmllbGQNCisgICAgICAgICAgICAoZXh0cmFGaWVsZEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikuDQorICAgICAgICAgICAgVGhpcyBpcyB0aGUgQ2VudHJhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQNCisgIGlmIHN6Q29tbWVudCE9TlVMTCwgdGhlIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkIGluIHN6Q29tbWVudA0KKyAgICAgICAgICAgIChjb21tZW50QnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQ0KKyovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBmb3IgcmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB6aXBmaWxlLCB5b3UgY2FuIG9wZW4gaXQsIHJlYWQgZGF0YQ0KKyAgIGZyb20gaXQsIGFuZCBjbG9zZSBpdCAoeW91IGNhbiBjbG9zZSBpdCBiZWZvcmUgcmVhZGluZyBhbGwgdGhlIGZpbGUpDQorICAgKi8NCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsNCisvKg0KKyAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuDQorICBJZiB0aGVyZSBpcyBubyBlcnJvciwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suDQorKi8NCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgT0YoKHVuekZpbGUgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7DQorLyoNCisgIE9wZW4gZm9yIHJlYWRpbmcgZGF0YSB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlLg0KKyAgcGFzc3dvcmQgaXMgYSBjcnlwdGluZyBwYXNzd29yZA0KKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLg0KKyovDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgT0YoKHVuekZpbGUgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZXRob2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsNCisvKg0KKyAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykNCisgICAgaWYgcmF3PT0xDQorICAqbWV0aG9kIHdpbGwgcmVjZWl2ZSBtZXRob2Qgb2YgY29tcHJlc3Npb24sICpsZXZlbCB3aWxsIHJlY2VpdmUgbGV2ZWwgb2YNCisgICAgIGNvbXByZXNzaW9uDQorICBub3RlIDogeW91IGNhbiBzZXQgbGV2ZWwgcGFyYW1ldGVyIGFzIE5VTEwgKGlmIHlvdSBkaWQgbm90IHdhbnQga25vd24gbGV2ZWwsDQorICAgICAgICAgYnV0IHlvdSBDQU5OT1Qgc2V0IG1ldGhvZCBwYXJhbWV0ZXIgYXMgTlVMTA0KKyovDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTMgT0YoKHVuekZpbGUgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZXRob2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7DQorLyoNCisgIFNhbWUgdGhhbiB1bnpPcGVuQ3VycmVudEZpbGUsIGJ1dCBvcGVuIGZvciByZWFkIHJhdyB0aGUgZmlsZSAobm90IHVuY29tcHJlc3MpDQorICAgIGlmIHJhdz09MQ0KKyAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mDQorICAgICBjb21wcmVzc2lvbg0KKyAgbm90ZSA6IHlvdSBjYW4gc2V0IGxldmVsIHBhcmFtZXRlciBhcyBOVUxMIChpZiB5b3UgZGlkIG5vdCB3YW50IGtub3duIGxldmVsLA0KKyAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwNCisqLw0KKw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZUN1cnJlbnRGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsNCisvKg0KKyAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQ0KKyAgUmV0dXJuIFVOWl9DUkNFUlJPUiBpZiBhbGwgdGhlIGZpbGUgd2FzIHJlYWQgYnV0IHRoZSBDUkMgaXMgbm90IGdvb2QNCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpSZWFkQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsNCisvKg0KKyAgUmVhZCBieXRlcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpDQorICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZA0KKyAgbGVuIHRoZSBzaXplIG9mIGJ1Zi4NCisNCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQNCisgIHJldHVybiAwIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZA0KKyAgcmV0dXJuIDwwIHdpdGggZXJyb3IgY29kZSBpZiB0aGVyZSBpcyBhbiBlcnJvcg0KKyAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikNCisqLw0KKw0KK2V4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCBPRigodW56RmlsZSBmaWxlKSk7DQorLyoNCisgIEdpdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdW5jb21wcmVzc2VkIGRhdGENCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgT0YoKHVuekZpbGUgZmlsZSkpOw0KKy8qDQorICByZXR1cm4gMSBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQsIDAgZWxzZXdoZXJlDQorKi8NCisNCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0TG9jYWxFeHRyYWZpZWxkIE9GKCh1bnpGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOw0KKy8qDQorICBSZWFkIGV4dHJhIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkNCisgIFRoaXMgaXMgdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZCAoc29tZXRpbWVzLCB0aGVyZSBpcw0KKyAgICBtb3JlIGluZm8gaW4gdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIHRoYW4gaW4gdGhlIGNlbnRyYWwtaGVhZGVyKQ0KKw0KKyAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkDQorDQorICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbg0KKyAgICBidWYuDQorICB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGluIGJ1Ziwgb3IgKGlmIDwwKQ0KKyAgICB0aGUgZXJyb3IgY29kZQ0KKyovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKiBHZXQgdGhlIGN1cnJlbnQgZmlsZSBvZmZzZXQgKi8NCitleHRlcm4gdUxvbmcgWkVYUE9SVCB1bnpHZXRPZmZzZXQgKHVuekZpbGUgZmlsZSk7DQorDQorLyogU2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0ICovDQorZXh0ZXJuIGludCBaRVhQT1JUIHVuelNldE9mZnNldCAodW56RmlsZSBmaWxlLCB1TG9uZyBwb3MpOw0KKw0KKw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLyogX3Vuel9IICovDQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3ppcC5jIGIvY29udHJpYi9taW5pemlwL3ppcC5jCmluZGV4IDJjY2Q3ZmQuLjQwMGUyYmEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC96aXAuYworKysgYi9jb250cmliL21pbml6aXAvemlwLmMKQEAgLTEsMTE4OCArMSwxMjE5IEBACi0vKiB6aXAuYyAtLSBJTyBvbiAuemlwIGZpbGVzIHVzaW5nIHpsaWIKLSAgIFZlcnNpb24gMS4wMSwgTWF5IDh0aCwgMjAwNAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudAotCi0gICBSZWFkIHppcC5oIGZvciBtb3JlIGluZm8KLSovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJ6aXAuaCIKLQotI2lmZGVmIFNUREMKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIE5PX0VSUk5PX0gKLSAgICBleHRlcm4gaW50IGVycm5vOwotI2Vsc2UKLSMgICBpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLQotI2lmbmRlZiBsb2NhbAotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotI2VuZGlmCi0vKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KLQotI2lmbmRlZiBWRVJTSU9OTUFERUJZCi0jIGRlZmluZSBWRVJTSU9OTUFERUJZICAgKDB4MCkgLyogcGxhdGZvcm0gZGVwZWRlbnQgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFpfQlVGU0laRQotI2RlZmluZSBaX0JVRlNJWkUgKDE2Mzg0KQotI2VuZGlmCi0KLSNpZm5kZWYgWl9NQVhGSUxFTkFNRUlOWklQCi0jZGVmaW5lIFpfTUFYRklMRU5BTUVJTlpJUCAoMjU2KQotI2VuZGlmCi0KLSNpZm5kZWYgQUxMT0MKLSMgZGVmaW5lIEFMTE9DKHNpemUpIChtYWxsb2Moc2l6ZSkpCi0jZW5kaWYKLSNpZm5kZWYgVFJZRlJFRQotIyBkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQotI2VuZGlmCi0KLS8qCi0jZGVmaW5lIFNJWkVDRU5UUkFMRElSSVRFTSAoMHgyZSkKLSNkZWZpbmUgU0laRVpJUExPQ0FMSEVBREVSICgweDFlKQotKi8KLQotLyogSSd2ZSBmb3VuZCBhbiBvbGQgVW5peCAoYSBTdW5PUyA0LjEuM19VMSkgd2l0aG91dCBhbGwgU0VFS18qIGRlZmluZWQuLi4uICovCi0KLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19FTkQKLSNkZWZpbmUgU0VFS19FTkQgICAgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgICAgMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01FTV9MRVZFTAotI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAotI2Vsc2UKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCi0jZW5kaWYKLSNlbmRpZgotY29uc3QgY2hhciB6aXBfY29weXJpZ2h0W10gPQotICAgIiB6aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7Ci0KLQotI2RlZmluZSBTSVpFREFUQV9JTkRBVEFCTE9DSyAoNDA5Ni0oNCo0KSkKLQotI2RlZmluZSBMT0NBTEhFQURFUk1BR0lDICAgICgweDA0MDM0YjUwKQotI2RlZmluZSBDRU5UUkFMSEVBREVSTUFHSUMgICgweDAyMDE0YjUwKQotI2RlZmluZSBFTkRIRUFERVJNQUdJQyAgICAgICgweDA2MDU0YjUwKQotCi0jZGVmaW5lIEZMQUdfTE9DQUxIRUFERVJfT0ZGU0VUICgweDA2KQotI2RlZmluZSBDUkNfTE9DQUxIRUFERVJfT0ZGU0VUICAoMHgwZSkKLQotI2RlZmluZSBTSVpFQ0VOVFJBTEhFQURFUiAoMHgyZSkgLyogNDYgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWxfcwotewotICBzdHJ1Y3QgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWxfcyogbmV4dF9kYXRhYmxvY2s7Ci0gIHVMb25nICBhdmFpbF9pbl90aGlzX2Jsb2NrOwotICB1TG9uZyAgZmlsbGVkX2luX3RoaXNfYmxvY2s7Ci0gIHVMb25nICB1bnVzZWQ7IC8qIGZvciBmdXR1cmUgdXNlIGFuZCBhbGlnbmVtZW50ICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YVtTSVpFREFUQV9JTkRBVEFCTE9DS107Ci19IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFfcwotewotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBmaXJzdF9ibG9jazsKLSAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGFzdF9ibG9jazsKLX0gbGlua2VkbGlzdF9kYXRhOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLwotICAgIGludCAgc3RyZWFtX2luaXRpYWxpc2VkOyAgICAvKiAxIGlzIHN0cmVhbSBpcyBpbml0aWFsaXNlZCAqLwotICAgIHVJbnQgcG9zX2luX2J1ZmZlcmVkX2RhdGE7ICAvKiBsYXN0IHdyaXR0ZW4gYnl0ZSBpbiBidWZmZXJlZF9kYXRhICovCi0KLSAgICB1TG9uZyBwb3NfbG9jYWxfaGVhZGVyOyAgICAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBoZWFkZXIgb2YgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50eSB3cml0aW5nICovCi0gICAgY2hhciogY2VudHJhbF9oZWFkZXI7ICAgICAgIC8qIGNlbnRyYWwgaGVhZGVyIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZpbGUgKi8KLSAgICB1TG9uZyBzaXplX2NlbnRyYWxoZWFkZXI7ICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBoZWFkZXIgZm9yIGN1ciBmaWxlICovCi0gICAgdUxvbmcgZmxhZzsgICAgICAgICAgICAgICAgIC8qIGZsYWcgb2YgdGhlIGZpbGUgY3VycmVudGx5IHdyaXRpbmcgKi8KLQotICAgIGludCAgbWV0aG9kOyAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2Qgb2YgZmlsZSBjdXJyZW50eSB3ci4qLwotICAgIGludCAgcmF3OyAgICAgICAgICAgICAgICAgICAvKiAxIGZvciBkaXJlY3RseSB3cml0aW5nIHJhdyBkYXRhICovCi0gICAgQnl0ZSBidWZmZXJlZF9kYXRhW1pfQlVGU0laRV07LyogYnVmZmVyIGNvbnRhaW4gY29tcHJlc3NlZCBkYXRhIHRvIGJlIHdyaXQqLwotICAgIHVMb25nIGRvc0RhdGU7Ci0gICAgdUxvbmcgY3JjMzI7Ci0gICAgaW50ICBlbmNyeXB0OwotI2lmbmRlZiBOT0NSWVBUCi0gICAgdW5zaWduZWQgbG9uZyBrZXlzWzNdOyAgICAgLyoga2V5cyBkZWZpbmluZyB0aGUgcHNldWRvLXJhbmRvbSBzZXF1ZW5jZSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiOwotICAgIGludCBjcnlwdF9oZWFkZXJfc2l6ZTsKLSNlbmRpZgotfSBjdXJmaWxlX2luZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgemxpYl9maWxlZnVuY19kZWYgel9maWxlZnVuYzsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLwotICAgIGxpbmtlZGxpc3RfZGF0YSBjZW50cmFsX2RpcjsvKiBkYXRhYmxvY2sgd2l0aCBjZW50cmFsIGRpciBpbiBjb25zdHJ1Y3Rpb24qLwotICAgIGludCAgaW5fb3BlbmVkX2ZpbGVfaW56aXA7ICAvKiAxIGlmIGEgZmlsZSBpbiB0aGUgemlwIGlzIGN1cnJlbnRseSB3cml0LiovCi0gICAgY3VyZmlsZV9pbmZvIGNpOyAgICAgICAgICAgIC8qIGluZm8gb24gdGhlIGZpbGUgY3VycmV0bHkgd3JpdGluZyAqLwotCi0gICAgdUxvbmcgYmVnaW5fcG9zOyAgICAgICAgICAgIC8qIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHppcGZpbGUgKi8KLSAgICB1TG9uZyBhZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7Ci0gICAgdUxvbmcgbnVtYmVyX2VudHJ5OwotfSB6aXBfaW50ZXJuYWw7Ci0KLQotCi0jaWZuZGVmIE5PQ1JZUFQKLSNkZWZpbmUgSU5DTFVERUNSWVBUSU5HQ09ERV9JRkNSWVBUQUxMT1dFRAotI2luY2x1ZGUgImNyeXB0LmgiCi0jZW5kaWYKLQotbG9jYWwgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGFsbG9jYXRlX25ld19kYXRhYmxvY2soKQotewotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7Ci0gICAgbGRpID0gKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKikKLSAgICAgICAgICAgICAgICAgQUxMT0Moc2l6ZW9mKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKSk7Ci0gICAgaWYgKGxkaSE9TlVMTCkKLSAgICB7Ci0gICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBOVUxMIDsKLSAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayA9IDAgOwotICAgICAgICBsZGktPmF2YWlsX2luX3RoaXNfYmxvY2sgPSBTSVpFREFUQV9JTkRBVEFCTE9DSyA7Ci0gICAgfQotICAgIHJldHVybiBsZGk7Ci19Ci0KLWxvY2FsIHZvaWQgZnJlZV9kYXRhYmxvY2sobGRpKQotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7Ci17Ci0gICAgd2hpbGUgKGxkaSE9TlVMTCkKLSAgICB7Ci0gICAgICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGluZXh0ID0gbGRpLT5uZXh0X2RhdGFibG9jazsKLSAgICAgICAgVFJZRlJFRShsZGkpOwotICAgICAgICBsZGkgPSBsZGluZXh0OwotICAgIH0KLX0KLQotbG9jYWwgdm9pZCBpbml0X2xpbmtlZGxpc3QobGwpCi0gICAgbGlua2VkbGlzdF9kYXRhKiBsbDsKLXsKLSAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Ci19Ci0KLWxvY2FsIHZvaWQgZnJlZV9saW5rZWRsaXN0KGxsKQotICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7Ci17Ci0gICAgZnJlZV9kYXRhYmxvY2sobGwtPmZpcnN0X2Jsb2NrKTsKLSAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Ci19Ci0KLQotbG9jYWwgaW50IGFkZF9kYXRhX2luX2RhdGFibG9jayhsbCxidWYsbGVuKQotICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7Ci0gICAgY29uc3Qgdm9pZCogYnVmOwotICAgIHVMb25nIGxlbjsKLXsKLSAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGZyb21fY29weTsKLQotICAgIGlmIChsbD09TlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotCi0gICAgaWYgKGxsLT5sYXN0X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IGFsbG9jYXRlX25ld19kYXRhYmxvY2soKTsKLSAgICAgICAgaWYgKGxsLT5maXJzdF9ibG9jayA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIGxkaSA9IGxsLT5sYXN0X2Jsb2NrOwotICAgIGZyb21fY29weSA9ICh1bnNpZ25lZCBjaGFyKilidWY7Ci0KLSAgICB3aGlsZSAobGVuPjApCi0gICAgewotICAgICAgICB1SW50IGNvcHlfdGhpczsKLSAgICAgICAgdUludCBpOwotICAgICAgICB1bnNpZ25lZCBjaGFyKiB0b19jb3B5OwotCi0gICAgICAgIGlmIChsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCk7Ci0gICAgICAgICAgICBpZiAobGRpLT5uZXh0X2RhdGFibG9jayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKLSAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2sgOwotICAgICAgICAgICAgbGwtPmxhc3RfYmxvY2sgPSBsZGk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrIDwgbGVuKQotICAgICAgICAgICAgY29weV90aGlzID0gKHVJbnQpbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZW47Ci0KLSAgICAgICAgdG9fY29weSA9ICYobGRpLT5kYXRhW2xkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2tdKTsKLQotICAgICAgICBmb3IgKGk9MDtpPGNvcHlfdGhpcztpKyspCi0gICAgICAgICAgICAqKHRvX2NvcHkraSk9Kihmcm9tX2NvcHkraSk7Ci0KLSAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayArPSBjb3B5X3RoaXM7Ci0gICAgICAgIGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayAtPSBjb3B5X3RoaXM7Ci0gICAgICAgIGZyb21fY29weSArPSBjb3B5X3RoaXMgOwotICAgICAgICBsZW4gLT0gY29weV90aGlzOwotICAgIH0KLSAgICByZXR1cm4gWklQX09LOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgSW5wdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKLSAgIG5iQnl0ZSA9PSAxLCAyIG9yIDQgKGJ5dGUsIHNob3J0IG9yIGxvbmcpCi0qLwotCi1sb2NhbCBpbnQgemlwbG9jYWxfcHV0VmFsdWUgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyB4LCBpbnQgbmJCeXRlKSk7Ci1sb2NhbCBpbnQgemlwbG9jYWxfcHV0VmFsdWUgKHB6bGliX2ZpbGVmdW5jX2RlZiwgZmlsZXN0cmVhbSwgeCwgbmJCeXRlKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci0gICAgdUxvbmcgeDsKLSAgICBpbnQgbmJCeXRlOwotewotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICAgIGludCBuOwotICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKLSAgICB7Ci0gICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKSh4ICYgMHhmZik7Ci0gICAgICAgIHggPj49IDg7Ci0gICAgfQotICAgIGlmICh4ICE9IDApCi0gICAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKFggUm9jaGUpICovCi0gICAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspCi0gICAgICAgIHsKLSAgICAgICAgICBidWZbbl0gPSAweGZmOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoWldSSVRFKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsbmJCeXRlKSE9KHVMb25nKW5iQnl0ZSkKLSAgICAgICAgcmV0dXJuIFpJUF9FUlJOTzsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBaSVBfT0s7Ci19Ci0KLWxvY2FsIHZvaWQgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkgT0YoKHZvaWQqIGRlc3QsIHVMb25nIHgsIGludCBuYkJ5dGUpKTsKLWxvY2FsIHZvaWQgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkgKGRlc3QsIHgsIG5iQnl0ZSkKLSAgICB2b2lkKiBkZXN0OwotICAgIHVMb25nIHg7Ci0gICAgaW50IG5iQnl0ZTsKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBidWY9KHVuc2lnbmVkIGNoYXIqKWRlc3Q7Ci0gICAgaW50IG47Ci0gICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKSB7Ci0gICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKSh4ICYgMHhmZik7Ci0gICAgICAgIHggPj49IDg7Ci0gICAgfQotCi0gICAgaWYgKHggIT0gMCkKLSAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKi8KLSAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspCi0gICAgICAgewotICAgICAgICAgIGJ1ZltuXSA9IDB4ZmY7Ci0gICAgICAgfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotbG9jYWwgdUxvbmcgemlwbG9jYWxfVG16RGF0ZVRvRG9zRGF0ZShwdG0sZG9zRGF0ZSkKLSAgICBjb25zdCB0bV96aXAqIHB0bTsKLSAgICB1TG9uZyBkb3NEYXRlOwotewotICAgIHVMb25nIHllYXIgPSAodUxvbmcpcHRtLT50bV95ZWFyOwotICAgIGlmICh5ZWFyPjE5ODApCi0gICAgICAgIHllYXItPTE5ODA7Ci0gICAgZWxzZSBpZiAoeWVhcj44MCkKLSAgICAgICAgeWVhci09ODA7Ci0gICAgcmV0dXJuCi0gICAgICAodUxvbmcpICgoKHB0bS0+dG1fbWRheSkgKyAoMzIgKiAocHRtLT50bV9tb24rMSkpICsgKDUxMiAqIHllYXIpKSA8PCAxNikgfAotICAgICAgICAoKHB0bS0+dG1fc2VjLzIpICsgKDMyKiBwdG0tPnRtX21pbikgKyAoMjA0OCAqICh1TG9uZylwdG0tPnRtX2hvdXIpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9jYWwgaW50IHppcGxvY2FsX2dldEJ5dGUgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0sCi0gICAgaW50ICpwaSkpOwotCi1sb2NhbCBpbnQgemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwaSkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotICAgIGludCAqcGk7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBjOwotICAgIGludCBlcnIgPSAoaW50KVpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKLSAgICBpZiAoZXJyPT0xKQotICAgIHsKLSAgICAgICAgKnBpID0gKGludCljOwotICAgICAgICByZXR1cm4gWklQX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoWkVSUk9SKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkpCi0gICAgICAgICAgICByZXR1cm4gWklQX0VSUk5POwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gWklQX0VPRjsKLSAgICB9Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBSZWFkcyBhIGxvbmcgaW4gTFNCIG9yZGVyIGZyb20gdGhlIGdpdmVuIGd6X3N0cmVhbS4gU2V0cwotKi8KLWxvY2FsIGludCB6aXBsb2NhbF9nZXRTaG9ydCBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICB1TG9uZyAqcFgpKTsKLQotbG9jYWwgaW50IHppcGxvY2FsX2dldFNob3J0IChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotICAgIHVMb25nICpwWDsKLXsKLSAgICB1TG9uZyB4IDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCA9ICh1TG9uZylpOwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDg7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgICpwWCA9IHg7Ci0gICAgZWxzZQotICAgICAgICAqcFggPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWxvY2FsIGludCB6aXBsb2NhbF9nZXRMb25nIE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgIHVMb25nICpwWCkpOwotCi1sb2NhbCBpbnQgemlwbG9jYWxfZ2V0TG9uZyAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLSAgICB1TG9uZyAqcFg7Ci17Ci0gICAgdUxvbmcgeCA7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggPSAodUxvbmcpaTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDw4OwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDE2OwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDI0OwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICAqcFggPSB4OwotICAgIGVsc2UKLSAgICAgICAgKnBYID0gMDsKLSAgICByZXR1cm4gZXJyOwotfQotCi0jaWZuZGVmIEJVRlJFQURDT01NRU5UCi0jZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkKLSNlbmRpZgotLyoKLSAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCi0gICAgdGhlIGdsb2JhbCBjb21tZW50KQotKi8KLWxvY2FsIHVMb25nIHppcGxvY2FsX1NlYXJjaENlbnRyYWxEaXIgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0pKTsKLQotbG9jYWwgdUxvbmcgemlwbG9jYWxfU2VhcmNoQ2VudHJhbERpcihwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotewotICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKLSAgICB1TG9uZyB1U2l6ZUZpbGU7Ci0gICAgdUxvbmcgdUJhY2tSZWFkOwotICAgIHVMb25nIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCi0gICAgdUxvbmcgdVBvc0ZvdW5kPTA7Ci0KLSAgICBpZiAoWlNFRUsoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLQotICAgIHVTaXplRmlsZSA9IFpURUxMKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7Ci0KLSAgICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQotICAgICAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKLQotICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKLSAgICBpZiAoYnVmPT1OVUxMKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHVCYWNrUmVhZCA9IDQ7Ci0gICAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKLSAgICB7Ci0gICAgICAgIHVMb25nIHVSZWFkU2l6ZSx1UmVhZFBvcyA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQotICAgICAgICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVCYWNrUmVhZCs9QlVGUkVBRENPTU1FTlQ7Ci0gICAgICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7Ci0KLSAgICAgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/Ci0gICAgICAgICAgICAgICAgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodVNpemVGaWxlLXVSZWFkUG9zKTsKLSAgICAgICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSx1UmVhZFBvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChaUkVBRCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGZvciAoaT0oaW50KXVSZWFkU2l6ZS0zOyAoaS0tKT4wOykKLSAgICAgICAgICAgIGlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYKLSAgICAgICAgICAgICAgICAoKCooYnVmK2krMikpPT0weDA1KSAmJiAoKCooYnVmK2krMykpPT0weDA2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1UG9zRm91bmQgPSB1UmVhZFBvcytpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGlmICh1UG9zRm91bmQhPTApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgVFJZRlJFRShidWYpOwotICAgIHJldHVybiB1UG9zRm91bmQ7Ci19Ci0jZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgKHBhdGhuYW1lLCBhcHBlbmQsIGdsb2JhbGNvbW1lbnQsIHB6bGliX2ZpbGVmdW5jX2RlZikKLSAgICBjb25zdCBjaGFyICpwYXRobmFtZTsKLSAgICBpbnQgYXBwZW5kOwotICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudDsKLSAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotewotICAgIHppcF9pbnRlcm5hbCB6aWluaXQ7Ci0gICAgemlwX2ludGVybmFsKiB6aTsKLSAgICBpbnQgZXJyPVpJUF9PSzsKLQotCi0gICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZj09TlVMTCkKLSAgICAgICAgZmlsbF9mb3Blbl9maWxlZnVuYygmemlpbml0LnpfZmlsZWZ1bmMpOwotICAgIGVsc2UKLSAgICAgICAgemlpbml0LnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOwotCi0gICAgemlpbml0LmZpbGVzdHJlYW0gPSAoKih6aWluaXQuel9maWxlZnVuYy56b3Blbl9maWxlKSkKLSAgICAgICAgICAgICAgICAgKHppaW5pdC56X2ZpbGVmdW5jLm9wYXF1ZSwKLSAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgKGFwcGVuZCA9PSBBUFBFTkRfU1RBVFVTX0NSRUFURSkgPwotICAgICAgICAgICAgICAgICAgKFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFIHwgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkgOgotICAgICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpKTsKLQotICAgIGlmICh6aWluaXQuZmlsZXN0cmVhbSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB6aWluaXQuYmVnaW5fcG9zID0gWlRFTEwoemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0pOwotICAgIHppaW5pdC5pbl9vcGVuZWRfZmlsZV9pbnppcCA9IDA7Ci0gICAgemlpbml0LmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0gICAgemlpbml0Lm51bWJlcl9lbnRyeSA9IDA7Ci0gICAgemlpbml0LmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCA9IDA7Ci0gICAgaW5pdF9saW5rZWRsaXN0KCYoemlpbml0LmNlbnRyYWxfZGlyKSk7Ci0KLQotICAgIHppID0gKHppcF9pbnRlcm5hbCopQUxMT0Moc2l6ZW9mKHppcF9pbnRlcm5hbCkpOwotICAgIGlmICh6aT09TlVMTCkKLSAgICB7Ci0gICAgICAgIFpDTE9TRSh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIG5vdyB3ZSBhZGQgZmlsZSBpbiBhIHppcGZpbGUgKi8KLSMgICAgaWZuZGVmIE5PX0FEREZJTEVJTkVYSVNUSU5HWklQCi0gICAgaWYgKGFwcGVuZCA9PSBBUFBFTkRfU1RBVFVTX0FERElOWklQKQotICAgIHsKLSAgICAgICAgdUxvbmcgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0KLSAgICAgICAgdUxvbmcgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgICAgICB1TG9uZyBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIHVMb25nIGNlbnRyYWxfcG9zLHVMOwotCi0gICAgICAgIHVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgICAgICB1TG9uZyBudW1iZXJfZGlza193aXRoX0NEOyAgLyogbnVtYmVyIHRoZSB0aGUgZGlzayB3aXRoIGNlbnRyYWwgZGlyLCB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCi0gICAgICAgIHVMb25nIG51bWJlcl9lbnRyeTsKLSAgICAgICAgdUxvbmcgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1lIHRoYW4gbnVtYmVyX2VudHJ5IG9uIG5vc3BhbikgKi8KLSAgICAgICAgdUxvbmcgc2l6ZV9jb21tZW50OwotCi0gICAgICAgIGNlbnRyYWxfcG9zID0gemlwbG9jYWxfU2VhcmNoQ2VudHJhbERpcigmemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0pOwotICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIGlmIChaU0VFSyh6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLwotICAgICAgICBpZiAoemlwbG9jYWxfZ2V0TG9uZygmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeSkhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZW50cnlfQ0QpIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8Ci0gICAgICAgICAgICAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwKLSAgICAgICAgICAgIChudW1iZXJfZGlzayE9MCkpCi0gICAgICAgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7Ci0KLSAgICAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldExvbmcoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmc2l6ZV9jZW50cmFsX2RpcikhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgICAgIGlmICh6aXBsb2NhbF9nZXRMb25nKCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm9mZnNldF9jZW50cmFsX2RpcikhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAqLwotICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmc2l6ZV9jb21tZW50KSE9WklQX09LKQotICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgICBpZiAoKGNlbnRyYWxfcG9zPG9mZnNldF9jZW50cmFsX2RpcitzaXplX2NlbnRyYWxfZGlyKSAmJgotICAgICAgICAgICAgKGVycj09WklQX09LKSkKLSAgICAgICAgICAgIGVycj1aSVBfQkFEWklQRklMRTsKLQotICAgICAgICBpZiAoZXJyIT1aSVBfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIFpDTE9TRSh6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlX2JlZm9yZV90aGVfemlwZmlsZSA9IGNlbnRyYWxfcG9zIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldF9jZW50cmFsX2RpcitzaXplX2NlbnRyYWxfZGlyKTsKLSAgICAgICAgemlpbml0LmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCA9IGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlIDsKLQotICAgICAgICB7Ci0gICAgICAgICAgICB1TG9uZyBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQgPSBzaXplX2NlbnRyYWxfZGlyOwotICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplID0gU0laRURBVEFfSU5EQVRBQkxPQ0s7Ci0gICAgICAgICAgICB2b2lkKiBidWZfcmVhZCA9ICh2b2lkKilBTExPQyhidWZfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgb2Zmc2V0X2NlbnRyYWxfZGlyICsgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCi0gICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSAhPSAwKQotICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgICAgICAgd2hpbGUgKChzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ+MCkgJiYgKGVycj09WklQX09LKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1TG9uZyByZWFkX3RoaXMgPSBTSVpFREFUQV9JTkRBVEFCTE9DSzsKLSAgICAgICAgICAgICAgICBpZiAocmVhZF90aGlzID4gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkKQotICAgICAgICAgICAgICAgICAgICByZWFkX3RoaXMgPSBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ7Ci0gICAgICAgICAgICAgICAgaWYgKFpSRUFEKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSxidWZfcmVhZCxyZWFkX3RoaXMpICE9IHJlYWRfdGhpcykKLSAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkX2RhdGFfaW5fZGF0YWJsb2NrKCZ6aWluaXQuY2VudHJhbF9kaXIsYnVmX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpcmVhZF90aGlzKTsKLSAgICAgICAgICAgICAgICBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQtPXJlYWRfdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRSWUZSRUUoYnVmX3JlYWQpOwotICAgICAgICB9Ci0gICAgICAgIHppaW5pdC5iZWdpbl9wb3MgPSBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKLSAgICAgICAgemlpbml0Lm51bWJlcl9lbnRyeSA9IG51bWJlcl9lbnRyeV9DRDsKLQotICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgb2Zmc2V0X2NlbnRyYWxfZGlyK2J5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgICB9Ci0jICAgIGVuZGlmIC8qICFOT19BRERGSUxFSU5FWElTVElOR1pJUCovCi0KLSAgICBpZiAoZXJyICE9IFpJUF9PSykKLSAgICB7Ci0gICAgICAgIFRSWUZSRUUoemkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnppID0gemlpbml0OwotICAgICAgICByZXR1cm4gKHppcEZpbGUpemk7Ci0gICAgfQotfQotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKHBhdGhuYW1lLCBhcHBlbmQpCi0gICAgY29uc3QgY2hhciAqcGF0aG5hbWU7Ci0gICAgaW50IGFwcGVuZDsKLXsKLSAgICByZXR1cm4gemlwT3BlbjIocGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsIGNyY0ZvckNyeXB0aW5nKQotICAgIHppcEZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOwotICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWw7Ci0gICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQ7Ci0gICAgaW50IG1ldGhvZDsKLSAgICBpbnQgbGV2ZWw7Ci0gICAgaW50IHJhdzsKLSAgICBpbnQgd2luZG93Qml0czsKLSAgICBpbnQgbWVtTGV2ZWw7Ci0gICAgaW50IHN0cmF0ZWd5OwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotICAgIHVMb25nIGNyY0ZvckNyeXB0aW5nOwotewotICAgIHppcF9pbnRlcm5hbCogemk7Ci0gICAgdUludCBzaXplX2ZpbGVuYW1lOwotICAgIHVJbnQgc2l6ZV9jb21tZW50OwotICAgIHVJbnQgaTsKLSAgICBpbnQgZXJyID0gWklQX09LOwotCi0jICAgIGlmZGVmIE5PQ1JZUFQKLSAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotIyAgICBlbmRpZgotCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIGlmICgobWV0aG9kIT0wKSAmJiAobWV0aG9kIT1aX0RFRkxBVEVEKSkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotCi0gICAgemkgPSAoemlwX2ludGVybmFsKilmaWxlOwotCi0gICAgaWYgKHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyID0gemlwQ2xvc2VGaWxlSW5aaXAgKGZpbGUpOwotICAgICAgICBpZiAoZXJyICE9IFpJUF9PSykKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBpZiAoZmlsZW5hbWU9PU5VTEwpCi0gICAgICAgIGZpbGVuYW1lPSItIjsKLQotICAgIGlmIChjb21tZW50PT1OVUxMKQotICAgICAgICBzaXplX2NvbW1lbnQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgc2l6ZV9jb21tZW50ID0gKHVJbnQpc3RybGVuKGNvbW1lbnQpOwotCi0gICAgc2l6ZV9maWxlbmFtZSA9ICh1SW50KXN0cmxlbihmaWxlbmFtZSk7Ci0KLSAgICBpZiAoemlwZmkgPT0gTlVMTCkKLSAgICAgICAgemktPmNpLmRvc0RhdGUgPSAwOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh6aXBmaS0+ZG9zRGF0ZSAhPSAwKQotICAgICAgICAgICAgemktPmNpLmRvc0RhdGUgPSB6aXBmaS0+ZG9zRGF0ZTsKLSAgICAgICAgZWxzZSB6aS0+Y2kuZG9zRGF0ZSA9IHppcGxvY2FsX1RtekRhdGVUb0Rvc0RhdGUoJnppcGZpLT50bXpfZGF0ZSx6aXBmaS0+ZG9zRGF0ZSk7Ci0gICAgfQotCi0gICAgemktPmNpLmZsYWcgPSAwOwotICAgIGlmICgobGV2ZWw9PTgpIHx8IChsZXZlbD09OSkpCi0gICAgICB6aS0+Y2kuZmxhZyB8PSAyOwotICAgIGlmICgobGV2ZWw9PTIpKQotICAgICAgemktPmNpLmZsYWcgfD0gNDsKLSAgICBpZiAoKGxldmVsPT0xKSkKLSAgICAgIHppLT5jaS5mbGFnIHw9IDY7Ci0gICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCi0gICAgICB6aS0+Y2kuZmxhZyB8PSAxOwotCi0gICAgemktPmNpLmNyYzMyID0gMDsKLSAgICB6aS0+Y2kubWV0aG9kID0gbWV0aG9kOwotICAgIHppLT5jaS5lbmNyeXB0ID0gMDsKLSAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgPSAwOwotICAgIHppLT5jaS5yYXcgPSByYXc7Ci0gICAgemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPSBaVEVMTCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSkgOwotICAgIHppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXIgPSBTSVpFQ0VOVFJBTEhFQURFUiArIHNpemVfZmlsZW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2V4dHJhZmllbGRfZ2xvYmFsICsgc2l6ZV9jb21tZW50OwotICAgIHppLT5jaS5jZW50cmFsX2hlYWRlciA9IChjaGFyKilBTExPQygodUludCl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyKTsKLQotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciwodUxvbmcpQ0VOVFJBTEhFQURFUk1BR0lDLDQpOwotICAgIC8qIHZlcnNpb24gaW5mbyAqLwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis0LCh1TG9uZylWRVJTSU9OTUFERUJZLDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZykyMCwyKTsKLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrOCwodUxvbmcpemktPmNpLmZsYWcsMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzEwLCh1TG9uZyl6aS0+Y2kubWV0aG9kLDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMiwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LCh1TG9uZykwLDQpOyAvKmNyYyovCi0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzIwLCh1TG9uZykwLDQpOyAvKmNvbXByIHNpemUqLwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwodUxvbmcpMCw0KTsgLyp1bmNvbXByIHNpemUqLwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyOCwodUxvbmcpc2l6ZV9maWxlbmFtZSwyKTsKLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzAsKHVMb25nKXNpemVfZXh0cmFmaWVsZF9nbG9iYWwsMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMyLCh1TG9uZylzaXplX2NvbW1lbnQsMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM0LCh1TG9uZykwLDIpOyAvKmRpc2sgbm0gc3RhcnQqLwotCi0gICAgaWYgKHppcGZpPT1OVUxMKQotICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKTAsMik7Ci0gICAgZWxzZQotICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKXppcGZpLT5pbnRlcm5hbF9mYSwyKTsKLQotICAgIGlmICh6aXBmaT09TlVMTCkKLSAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM4LCh1TG9uZykwLDQpOwotICAgIGVsc2UKLSAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM4LCh1TG9uZyl6aXBmaS0+ZXh0ZXJuYWxfZmEsNCk7Ci0KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNDIsKHVMb25nKXppLT5jaS5wb3NfbG9jYWxfaGVhZGVyLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0LDQpOwotCi0gICAgZm9yIChpPTA7aTxzaXplX2ZpbGVuYW1lO2krKykKLSAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIraSkgPSAqKGZpbGVuYW1lK2kpOwotCi0gICAgZm9yIChpPTA7aTxzaXplX2V4dHJhZmllbGRfZ2xvYmFsO2krKykKLSAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZStpKSA9Ci0gICAgICAgICAgICAgICooKChjb25zdCBjaGFyKilleHRyYWZpZWxkX2dsb2JhbCkraSk7Ci0KLSAgICBmb3IgKGk9MDtpPHNpemVfY29tbWVudDtpKyspCi0gICAgICAgICooemktPmNpLmNlbnRyYWxfaGVhZGVyK1NJWkVDRU5UUkFMSEVBREVSK3NpemVfZmlsZW5hbWUrCi0gICAgICAgICAgICAgIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwraSkgPSAqKGNvbW1lbnQraSk7Ci0gICAgaWYgKHppLT5jaS5jZW50cmFsX2hlYWRlciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7Ci0KLSAgICAvKiB3cml0ZSB0aGUgbG9jYWwgaGVhZGVyICovCi0gICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylMT0NBTEhFQURFUk1BR0lDLDQpOwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTIwLDIpOy8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmZsYWcsMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kuZG9zRGF0ZSw0KTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOyAvKiBjcmMgMzIsIHVua25vd24gKi8KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIHVuY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9maWxlbmFtZSwyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2V4dHJhZmllbGRfbG9jYWwsMik7Ci0KLSAgICBpZiAoKGVycj09WklQX09LKSAmJiAoc2l6ZV9maWxlbmFtZT4wKSkKLSAgICAgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxmaWxlbmFtZSxzaXplX2ZpbGVuYW1lKSE9c2l6ZV9maWxlbmFtZSkKLSAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0KLSAgICBpZiAoKGVycj09WklQX09LKSAmJiAoc2l6ZV9leHRyYWZpZWxkX2xvY2FsPjApKQotICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGV4dHJhZmllbGRfbG9jYWwsc2l6ZV9leHRyYWZpZWxkX2xvY2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT1zaXplX2V4dHJhZmllbGRfbG9jYWwpCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgemktPmNpLnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KTA7Ci0gICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7Ci0gICAgemktPmNpLnN0cmVhbS5uZXh0X291dCA9IHppLT5jaS5idWZmZXJlZF9kYXRhOwotICAgIHppLT5jaS5zdHJlYW0udG90YWxfaW4gPSAwOwotICAgIHppLT5jaS5zdHJlYW0udG90YWxfb3V0ID0gMDsKLQotICAgIGlmICgoZXJyPT1aSVBfT0spICYmICh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCi0gICAgewotICAgICAgICB6aS0+Y2kuc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgICAgIHppLT5jaS5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgICAgIHppLT5jaS5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgICAgIGlmICh3aW5kb3dCaXRzPjApCi0gICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7Ci0KLSAgICAgICAgZXJyID0gZGVmbGF0ZUluaXQyKCZ6aS0+Y2kuc3RyZWFtLCBsZXZlbCwKLSAgICAgICAgICAgICAgIFpfREVGTEFURUQsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSk7Ci0KLSAgICAgICAgaWYgKGVycj09Wl9PSykKLSAgICAgICAgICAgIHppLT5jaS5zdHJlYW1faW5pdGlhbGlzZWQgPSAxOwotICAgIH0KLSMgICAgaWZuZGVmIE5PQ1JZUFQKLSAgICB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemUgPSAwOwotICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZkhlYWRbUkFORF9IRUFEX0xFTl07Ci0gICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsKLSAgICAgICAgemktPmNpLmVuY3J5cHQgPSAxOwotICAgICAgICB6aS0+Y2kucGNyY18zMl90YWIgPSBnZXRfY3JjX3RhYmxlKCk7Ci0gICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8KLQotICAgICAgICBzaXplSGVhZD1jcnlwdGhlYWQocGFzc3dvcmQsYnVmSGVhZCxSQU5EX0hFQURfTEVOLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYixjcmNGb3JDcnlwdGluZyk7Ci0gICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IHNpemVIZWFkOwotCi0gICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sYnVmSGVhZCxzaXplSGVhZCkgIT0gc2l6ZUhlYWQpCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgIH0KLSMgICAgZW5kaWYKLQotICAgIGlmIChlcnI9PVpfT0spCi0gICAgICAgIHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9IDE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgcmF3KQotICAgIHppcEZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOwotICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWw7Ci0gICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQ7Ci0gICAgaW50IG1ldGhvZDsKLSAgICBpbnQgbGV2ZWw7Ci0gICAgaW50IHJhdzsKLXsKLSAgICByZXR1cm4gemlwT3Blbk5ld0ZpbGVJblppcDMgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwIChmaWxlLCBmaWxlbmFtZSwgemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwpCi0gICAgemlwRmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOwotICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmk7Ci0gICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbDsKLSAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbDsKLSAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbDsKLSAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWw7Ci0gICAgY29uc3QgY2hhciogY29tbWVudDsKLSAgICBpbnQgbWV0aG9kOwotICAgIGludCBsZXZlbDsKLXsKLSAgICByZXR1cm4gemlwT3Blbk5ld0ZpbGVJblppcDIgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgMCk7Ci19Ci0KLWxvY2FsIGludCB6aXBGbHVzaFdyaXRlQnVmZmVyKHppKQotICB6aXBfaW50ZXJuYWwqIHppOwotewotICAgIGludCBlcnI9WklQX09LOwotCi0gICAgaWYgKHppLT5jaS5lbmNyeXB0ICE9IDApCi0gICAgewotI2lmbmRlZiBOT0NSWVBUCi0gICAgICAgIHVJbnQgaTsKLSAgICAgICAgaW50IHQ7Ci0gICAgICAgIGZvciAoaT0wO2k8emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhO2krKykKLSAgICAgICAgICAgIHppLT5jaS5idWZmZXJlZF9kYXRhW2ldID0gemVuY29kZSh6aS0+Y2kua2V5cywgemktPmNpLnBjcmNfMzJfdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemktPmNpLmJ1ZmZlcmVkX2RhdGFbaV0sdCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhKQotICAgICAgZXJyID0gWklQX0VSUk5POwotICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcFdyaXRlSW5GaWxlSW5aaXAgKGZpbGUsIGJ1ZiwgbGVuKQotICAgIHppcEZpbGUgZmlsZTsKLSAgICBjb25zdCB2b2lkKiBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIHppcF9pbnRlcm5hbCogemk7Ci0gICAgaW50IGVycj1aSVBfT0s7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0gICAgemkgPSAoemlwX2ludGVybmFsKilmaWxlOwotCi0gICAgaWYgKHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9PSAwKQotICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7Ci0KLSAgICB6aS0+Y2kuc3RyZWFtLm5leHRfaW4gPSAodm9pZCopYnVmOwotICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSBsZW47Ci0gICAgemktPmNpLmNyYzMyID0gY3JjMzIoemktPmNpLmNyYzMyLGJ1ZixsZW4pOwotCi0gICAgd2hpbGUgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5zdHJlYW0uYXZhaWxfaW4+MCkpCi0gICAgewotICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKLSAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKLSAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoZXJyICE9IFpJUF9PSykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUgPSB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsKLSAgICAgICAgICAgIGVycj1kZWZsYXRlKCZ6aS0+Y2kuc3RyZWFtLCAgWl9OT19GTFVTSCk7Ci0gICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgY29weV90aGlzLGk7Ci0gICAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9pbiA8IHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0KQotICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29weV90aGlzID0gemktPmNpLnN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBmb3IgKGk9MDtpPGNvcHlfdGhpcztpKyspCi0gICAgICAgICAgICAgICAgKigoKGNoYXIqKXppLT5jaS5zdHJlYW0ubmV4dF9vdXQpK2kpID0KLSAgICAgICAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKXppLT5jaS5zdHJlYW0ubmV4dF9pbikraSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9pbiAtPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQtPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5uZXh0X2luKz0gY29weV90aGlzOwotICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQrPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbis9IGNvcHlfdGhpczsKLSAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dCs9IGNvcHlfdGhpczsKLSAgICAgICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gY29weV90aGlzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3IChmaWxlLCB1bmNvbXByZXNzZWRfc2l6ZSwgY3JjMzIpCi0gICAgemlwRmlsZSBmaWxlOwotICAgIHVMb25nIHVuY29tcHJlc3NlZF9zaXplOwotICAgIHVMb25nIGNyYzMyOwotewotICAgIHppcF9pbnRlcm5hbCogemk7Ci0gICAgdUxvbmcgY29tcHJlc3NlZF9zaXplOwotICAgIGludCBlcnI9WklQX09LOwotCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSAwOwotCi0gICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCi0gICAgICAgIHdoaWxlIChlcnI9PVpJUF9PSykKLSAgICB7Ci0gICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZTsKLSAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh6aXBGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7Ci0gICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7Ci0gICAgICAgIGVycj1kZWZsYXRlKCZ6aS0+Y2kuc3RyZWFtLCAgWl9GSU5JU0gpOwotICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7Ci0gICAgfQotCi0gICAgaWYgKGVycj09Wl9TVFJFQU1fRU5EKQotICAgICAgICBlcnI9WklQX09LOyAvKiB0aGlzIGlzIG5vcm1hbCAqLwotCi0gICAgaWYgKCh6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGE+MCkgJiYgKGVycj09WklQX09LKSkKLSAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpPT1aSVBfRVJSTk8pCi0gICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0KLSAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKLSAgICB7Ci0gICAgICAgIGVycj1kZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsKLSAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCF6aS0+Y2kucmF3KQotICAgIHsKLSAgICAgICAgY3JjMzIgPSAodUxvbmcpemktPmNpLmNyYzMyOwotICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZSA9ICh1TG9uZyl6aS0+Y2kuc3RyZWFtLnRvdGFsX2luOwotICAgIH0KLSAgICBjb21wcmVzc2VkX3NpemUgPSAodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7Ci0jICAgIGlmbmRlZiBOT0NSWVBUCi0gICAgY29tcHJlc3NlZF9zaXplICs9IHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZTsKLSMgICAgZW5kaWYKLQotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxNixjcmMzMiw0KTsgLypjcmMqLwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9zaXplLDQpOyAvKmNvbXByIHNpemUqLwotICAgIGlmICh6aS0+Y2kuc3RyZWFtLmRhdGFfdHlwZSA9PSBaX0FTQ0lJKQotICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKVpfQVNDSUksMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZSw0KTsgLyp1bmNvbXByIHNpemUqLwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSBhZGRfZGF0YV9pbl9kYXRhYmxvY2soJnppLT5jZW50cmFsX2Rpcix6aS0+Y2kuY2VudHJhbF9oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpemktPmNpLnNpemVfY2VudHJhbGhlYWRlcik7Ci0gICAgZnJlZSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIpOwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgIHsKLSAgICAgICAgbG9uZyBjdXJfcG9zX2luemlwID0gWlRFTEwoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOwotICAgICAgICBpZiAoWlNFRUsoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciArIDE0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxjcmMzMiw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCi0KLSAgICAgICAgaWYgKGVycj09WklQX09LKSAvKiBjb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KLSAgICAgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxjb21wcmVzc2VkX3NpemUsNCk7Ci0KLSAgICAgICAgaWYgKGVycj09WklQX09LKSAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotICAgICAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLHVuY29tcHJlc3NlZF9zaXplLDQpOwotCi0gICAgICAgIGlmIChaU0VFSyh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGN1cl9wb3NfaW56aXAsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgfQotCi0gICAgemktPm51bWJlcl9lbnRyeSArKzsKLSAgICB6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPSAwOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwIChmaWxlKQotICAgIHppcEZpbGUgZmlsZTsKLXsKLSAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXcgKGZpbGUsMCwwKTsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIChmaWxlLCBnbG9iYWxfY29tbWVudCkKLSAgICB6aXBGaWxlIGZpbGU7Ci0gICAgY29uc3QgY2hhciogZ2xvYmFsX2NvbW1lbnQ7Ci17Ci0gICAgemlwX2ludGVybmFsKiB6aTsKLSAgICBpbnQgZXJyID0gMDsKLSAgICB1TG9uZyBzaXplX2NlbnRyYWxkaXIgPSAwOwotICAgIHVMb25nIGNlbnRyYWxkaXJfcG9zX2luemlwIDsKLSAgICB1SW50IHNpemVfZ2xvYmFsX2NvbW1lbnQ7Ci0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCi0gICAgICAgIHNpemVfZ2xvYmFsX2NvbW1lbnQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7Ci0KLQotICAgIGNlbnRyYWxkaXJfcG9zX2luemlwID0gWlRFTEwoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOwotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICB7Ci0gICAgICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGkgPSB6aS0+Y2VudHJhbF9kaXIuZmlyc3RfYmxvY2sgOwotICAgICAgICB3aGlsZSAobGRpIT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGVycj09WklQX09LKSAmJiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaz4wKSkKLSAgICAgICAgICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRpLT5kYXRhLGxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPWxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2sgKQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0KLSAgICAgICAgICAgIHNpemVfY2VudHJhbGRpciArPSBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrOwotICAgICAgICAgICAgbGRpID0gbGRpLT5uZXh0X2RhdGFibG9jazsKLSAgICAgICAgfQotICAgIH0KLSAgICBmcmVlX2RhdGFibG9jayh6aS0+Y2VudHJhbF9kaXIuZmlyc3RfYmxvY2spOwotCi0gICAgaWYgKGVycj09WklQX09LKSAvKiBNYWdpYyBFbmQgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylFTkRIRUFERVJNQUdJQyw0KTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOwotCi0gICAgaWYgKGVycj09WklQX09LKSAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPm51bWJlcl9lbnRyeSwyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPm51bWJlcl9lbnRyeSwyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2NlbnRyYWxkaXIsNCk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpKGNlbnRyYWxkaXJfcG9zX2luemlwIC0gemktPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCksNCk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHppcGZpbGUgY29tbWVudCBsZW5ndGggKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2dsb2JhbF9jb21tZW50LDIpOwotCi0gICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZ2xvYmFsX2NvbW1lbnQ+MCkpCi0gICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgZ2xvYmFsX2NvbW1lbnQsc2l6ZV9nbG9iYWxfY29tbWVudCkgIT0gc2l6ZV9nbG9iYWxfY29tbWVudCkKLSAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0KLSAgICBpZiAoWkNMT1NFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKSAhPSAwKQotICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKLSAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotICAgIFRSWUZSRUUoemkpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KKy8qIHppcC5jIC0tIElPIG9uIC56aXAgZmlsZXMgdXNpbmcgemxpYg0KKyAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUNCisNCisgICAyNyBEZWMgMjAwNCBSb2xmIEthbGJlcm1hdHRlcg0KKyAgIE1vZGlmaWNhdGlvbiB0byB6aXBPcGVuMiB0byBzdXBwb3J0IGdsb2JhbENvbW1lbnQgcmV0cmlldmFsLg0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorDQorICAgUmVhZCB6aXAuaCBmb3IgbW9yZSBpbmZvDQorKi8NCisNCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDx0aW1lLmg+DQorI2luY2x1ZGUgInpsaWIuaCINCisjaW5jbHVkZSAiemlwLmgiDQorDQorI2lmZGVmIFNUREMNCisjICBpbmNsdWRlIDxzdGRkZWYuaD4NCisjICBpbmNsdWRlIDxzdHJpbmcuaD4NCisjICBpbmNsdWRlIDxzdGRsaWIuaD4NCisjZW5kaWYNCisjaWZkZWYgTk9fRVJSTk9fSA0KKyAgICBleHRlcm4gaW50IGVycm5vOw0KKyNlbHNlDQorIyAgIGluY2x1ZGUgPGVycm5vLmg+DQorI2VuZGlmDQorDQorDQorI2lmbmRlZiBsb2NhbA0KKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMNCisjZW5kaWYNCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8NCisNCisjaWZuZGVmIFZFUlNJT05NQURFQlkNCisjIGRlZmluZSBWRVJTSU9OTUFERUJZICAgKDB4MCkgLyogcGxhdGZvcm0gZGVwZWRlbnQgKi8NCisjZW5kaWYNCisNCisjaWZuZGVmIFpfQlVGU0laRQ0KKyNkZWZpbmUgWl9CVUZTSVpFICgxNjM4NCkNCisjZW5kaWYNCisNCisjaWZuZGVmIFpfTUFYRklMRU5BTUVJTlpJUA0KKyNkZWZpbmUgWl9NQVhGSUxFTkFNRUlOWklQICgyNTYpDQorI2VuZGlmDQorDQorI2lmbmRlZiBBTExPQw0KKyMgZGVmaW5lIEFMTE9DKHNpemUpIChtYWxsb2Moc2l6ZSkpDQorI2VuZGlmDQorI2lmbmRlZiBUUllGUkVFDQorIyBkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQ0KKyNlbmRpZg0KKw0KKy8qDQorI2RlZmluZSBTSVpFQ0VOVFJBTERJUklURU0gKDB4MmUpDQorI2RlZmluZSBTSVpFWklQTE9DQUxIRUFERVIgKDB4MWUpDQorKi8NCisNCisvKiBJJ3ZlIGZvdW5kIGFuIG9sZCBVbml4IChhIFN1bk9TIDQuMS4zX1UxKSB3aXRob3V0IGFsbCBTRUVLXyogZGVmaW5lZC4uLi4gKi8NCisNCisjaWZuZGVmIFNFRUtfQ1VSDQorI2RlZmluZSBTRUVLX0NVUiAgICAxDQorI2VuZGlmDQorDQorI2lmbmRlZiBTRUVLX0VORA0KKyNkZWZpbmUgU0VFS19FTkQgICAgMg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgU0VFS19TRVQNCisjZGVmaW5lIFNFRUtfU0VUICAgIDANCisjZW5kaWYNCisNCisjaWZuZGVmIERFRl9NRU1fTEVWRUwNCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4DQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOA0KKyNlbHNlDQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwNCisjZW5kaWYNCisjZW5kaWYNCitjb25zdCBjaGFyIHppcF9jb3B5cmlnaHRbXSA9DQorICAgIiB6aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7DQorDQorDQorI2RlZmluZSBTSVpFREFUQV9JTkRBVEFCTE9DSyAoNDA5Ni0oNCo0KSkNCisNCisjZGVmaW5lIExPQ0FMSEVBREVSTUFHSUMgICAgKDB4MDQwMzRiNTApDQorI2RlZmluZSBDRU5UUkFMSEVBREVSTUFHSUMgICgweDAyMDE0YjUwKQ0KKyNkZWZpbmUgRU5ESEVBREVSTUFHSUMgICAgICAoMHgwNjA1NGI1MCkNCisNCisjZGVmaW5lIEZMQUdfTE9DQUxIRUFERVJfT0ZGU0VUICgweDA2KQ0KKyNkZWZpbmUgQ1JDX0xPQ0FMSEVBREVSX09GRlNFVCAgKDB4MGUpDQorDQorI2RlZmluZSBTSVpFQ0VOVFJBTEhFQURFUiAoMHgyZSkgLyogNDYgKi8NCisNCit0eXBlZGVmIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbF9zDQorew0KKyAgc3RydWN0IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsX3MqIG5leHRfZGF0YWJsb2NrOw0KKyAgdUxvbmcgIGF2YWlsX2luX3RoaXNfYmxvY2s7DQorICB1TG9uZyAgZmlsbGVkX2luX3RoaXNfYmxvY2s7DQorICB1TG9uZyAgdW51c2VkOyAvKiBmb3IgZnV0dXJlIHVzZSBhbmQgYWxpZ25lbWVudCAqLw0KKyAgdW5zaWduZWQgY2hhciBkYXRhW1NJWkVEQVRBX0lOREFUQUJMT0NLXTsNCit9IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsOw0KKw0KK3R5cGVkZWYgc3RydWN0IGxpbmtlZGxpc3RfZGF0YV9zDQorew0KKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogZmlyc3RfYmxvY2s7DQorICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsYXN0X2Jsb2NrOw0KK30gbGlua2VkbGlzdF9kYXRhOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovDQorICAgIGludCAgc3RyZWFtX2luaXRpYWxpc2VkOyAgICAvKiAxIGlzIHN0cmVhbSBpcyBpbml0aWFsaXNlZCAqLw0KKyAgICB1SW50IHBvc19pbl9idWZmZXJlZF9kYXRhOyAgLyogbGFzdCB3cml0dGVuIGJ5dGUgaW4gYnVmZmVyZWRfZGF0YSAqLw0KKw0KKyAgICB1TG9uZyBwb3NfbG9jYWxfaGVhZGVyOyAgICAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBoZWFkZXIgb2YgdGhlIGZpbGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHkgd3JpdGluZyAqLw0KKyAgICBjaGFyKiBjZW50cmFsX2hlYWRlcjsgICAgICAgLyogY2VudHJhbCBoZWFkZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsZSAqLw0KKyAgICB1TG9uZyBzaXplX2NlbnRyYWxoZWFkZXI7ICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBoZWFkZXIgZm9yIGN1ciBmaWxlICovDQorICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBmbGFnIG9mIHRoZSBmaWxlIGN1cnJlbnRseSB3cml0aW5nICovDQorDQorICAgIGludCAgbWV0aG9kOyAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2Qgb2YgZmlsZSBjdXJyZW50eSB3ci4qLw0KKyAgICBpbnQgIHJhdzsgICAgICAgICAgICAgICAgICAgLyogMSBmb3IgZGlyZWN0bHkgd3JpdGluZyByYXcgZGF0YSAqLw0KKyAgICBCeXRlIGJ1ZmZlcmVkX2RhdGFbWl9CVUZTSVpFXTsvKiBidWZmZXIgY29udGFpbiBjb21wcmVzc2VkIGRhdGEgdG8gYmUgd3JpdCovDQorICAgIHVMb25nIGRvc0RhdGU7DQorICAgIHVMb25nIGNyYzMyOw0KKyAgICBpbnQgIGVuY3J5cHQ7DQorI2lmbmRlZiBOT0NSWVBUDQorICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8NCisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWI7DQorICAgIGludCBjcnlwdF9oZWFkZXJfc2l6ZTsNCisjZW5kaWYNCit9IGN1cmZpbGVfaW5mbzsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgemxpYl9maWxlZnVuY19kZWYgel9maWxlZnVuYzsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8NCisgICAgbGlua2VkbGlzdF9kYXRhIGNlbnRyYWxfZGlyOy8qIGRhdGFibG9jayB3aXRoIGNlbnRyYWwgZGlyIGluIGNvbnN0cnVjdGlvbiovDQorICAgIGludCAgaW5fb3BlbmVkX2ZpbGVfaW56aXA7ICAvKiAxIGlmIGEgZmlsZSBpbiB0aGUgemlwIGlzIGN1cnJlbnRseSB3cml0LiovDQorICAgIGN1cmZpbGVfaW5mbyBjaTsgICAgICAgICAgICAvKiBpbmZvIG9uIHRoZSBmaWxlIGN1cnJldGx5IHdyaXRpbmcgKi8NCisNCisgICAgdUxvbmcgYmVnaW5fcG9zOyAgICAgICAgICAgIC8qIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHppcGZpbGUgKi8NCisgICAgdUxvbmcgYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0Ow0KKyAgICB1TG9uZyBudW1iZXJfZW50cnk7DQorI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUA0KKyAgICBjaGFyICpnbG9iYWxjb21tZW50Ow0KKyNlbmRpZg0KK30gemlwX2ludGVybmFsOw0KKw0KKw0KKw0KKyNpZm5kZWYgTk9DUllQVA0KKyNkZWZpbmUgSU5DTFVERUNSWVBUSU5HQ09ERV9JRkNSWVBUQUxMT1dFRA0KKyNpbmNsdWRlICJjcnlwdC5oIg0KKyNlbmRpZg0KKw0KK2xvY2FsIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCkNCit7DQorICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7DQorICAgIGxkaSA9IChsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCopDQorICAgICAgICAgICAgICAgICBBTExPQyhzaXplb2YobGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwpKTsNCisgICAgaWYgKGxkaSE9TlVMTCkNCisgICAgew0KKyAgICAgICAgbGRpLT5uZXh0X2RhdGFibG9jayA9IE5VTEwgOw0KKyAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayA9IDAgOw0KKyAgICAgICAgbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrID0gU0laRURBVEFfSU5EQVRBQkxPQ0sgOw0KKyAgICB9DQorICAgIHJldHVybiBsZGk7DQorfQ0KKw0KK2xvY2FsIHZvaWQgZnJlZV9kYXRhYmxvY2sobGRpKQ0KKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOw0KK3sNCisgICAgd2hpbGUgKGxkaSE9TlVMTCkNCisgICAgew0KKyAgICAgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaW5leHQgPSBsZGktPm5leHRfZGF0YWJsb2NrOw0KKyAgICAgICAgVFJZRlJFRShsZGkpOw0KKyAgICAgICAgbGRpID0gbGRpbmV4dDsNCisgICAgfQ0KK30NCisNCitsb2NhbCB2b2lkIGluaXRfbGlua2VkbGlzdChsbCkNCisgICAgbGlua2VkbGlzdF9kYXRhKiBsbDsNCit7DQorICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gTlVMTDsNCit9DQorDQorbG9jYWwgdm9pZCBmcmVlX2xpbmtlZGxpc3QobGwpDQorICAgIGxpbmtlZGxpc3RfZGF0YSogbGw7DQorew0KKyAgICBmcmVlX2RhdGFibG9jayhsbC0+Zmlyc3RfYmxvY2spOw0KKyAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7DQorfQ0KKw0KKw0KK2xvY2FsIGludCBhZGRfZGF0YV9pbl9kYXRhYmxvY2sobGwsYnVmLGxlbikNCisgICAgbGlua2VkbGlzdF9kYXRhKiBsbDsNCisgICAgY29uc3Qgdm9pZCogYnVmOw0KKyAgICB1TG9uZyBsZW47DQorew0KKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOw0KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBmcm9tX2NvcHk7DQorDQorICAgIGlmIChsbD09TlVMTCkNCisgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsNCisNCisgICAgaWYgKGxsLT5sYXN0X2Jsb2NrID09IE5VTEwpDQorICAgIHsNCisgICAgICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gYWxsb2NhdGVfbmV3X2RhdGFibG9jaygpOw0KKyAgICAgICAgaWYgKGxsLT5maXJzdF9ibG9jayA9PSBOVUxMKQ0KKyAgICAgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsNCisgICAgfQ0KKw0KKyAgICBsZGkgPSBsbC0+bGFzdF9ibG9jazsNCisgICAgZnJvbV9jb3B5ID0gKHVuc2lnbmVkIGNoYXIqKWJ1ZjsNCisNCisgICAgd2hpbGUgKGxlbj4wKQ0KKyAgICB7DQorICAgICAgICB1SW50IGNvcHlfdGhpczsNCisgICAgICAgIHVJbnQgaTsNCisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHRvX2NvcHk7DQorDQorICAgICAgICBpZiAobGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrPT0wKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCk7DQorICAgICAgICAgICAgaWYgKGxkaS0+bmV4dF9kYXRhYmxvY2sgPT0gTlVMTCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOw0KKyAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2sgOw0KKyAgICAgICAgICAgIGxsLT5sYXN0X2Jsb2NrID0gbGRpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayA8IGxlbikNCisgICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgY29weV90aGlzID0gKHVJbnQpbGVuOw0KKw0KKyAgICAgICAgdG9fY29weSA9ICYobGRpLT5kYXRhW2xkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2tdKTsNCisNCisgICAgICAgIGZvciAoaT0wO2k8Y29weV90aGlzO2krKykNCisgICAgICAgICAgICAqKHRvX2NvcHkraSk9Kihmcm9tX2NvcHkraSk7DQorDQorICAgICAgICBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrICs9IGNvcHlfdGhpczsNCisgICAgICAgIGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayAtPSBjb3B5X3RoaXM7DQorICAgICAgICBmcm9tX2NvcHkgKz0gY29weV90aGlzIDsNCisgICAgICAgIGxlbiAtPSBjb3B5X3RoaXM7DQorICAgIH0NCisgICAgcmV0dXJuIFpJUF9PSzsNCit9DQorDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUA0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgIElucHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlDQorICAgbmJCeXRlID09IDEsIDIgb3IgNCAoYnl0ZSwgc2hvcnQgb3IgbG9uZykNCisqLw0KKw0KK2xvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSBPRigoY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyB4LCBpbnQgbmJCeXRlKSk7DQorbG9jYWwgaW50IHppcGxvY2FsX3B1dFZhbHVlIChwemxpYl9maWxlZnVuY19kZWYsIGZpbGVzdHJlYW0sIHgsIG5iQnl0ZSkNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07DQorICAgIHVMb25nIHg7DQorICAgIGludCBuYkJ5dGU7DQorew0KKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsNCisgICAgaW50IG47DQorICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykNCisgICAgew0KKyAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpKHggJiAweGZmKTsNCisgICAgICAgIHggPj49IDg7DQorICAgIH0NCisgICAgaWYgKHggIT0gMCkNCisgICAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKFggUm9jaGUpICovDQorICAgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBidWZbbl0gPSAweGZmOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgaWYgKFpXUklURSgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLG5iQnl0ZSkhPSh1TG9uZyluYkJ5dGUpDQorICAgICAgICByZXR1cm4gWklQX0VSUk5POw0KKyAgICBlbHNlDQorICAgICAgICByZXR1cm4gWklQX09LOw0KK30NCisNCitsb2NhbCB2b2lkIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5IE9GKCh2b2lkKiBkZXN0LCB1TG9uZyB4LCBpbnQgbmJCeXRlKSk7DQorbG9jYWwgdm9pZCB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSAoZGVzdCwgeCwgbmJCeXRlKQ0KKyAgICB2b2lkKiBkZXN0Ow0KKyAgICB1TG9uZyB4Ow0KKyAgICBpbnQgbmJCeXRlOw0KK3sNCisgICAgdW5zaWduZWQgY2hhciogYnVmPSh1bnNpZ25lZCBjaGFyKilkZXN0Ow0KKyAgICBpbnQgbjsNCisgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKSB7DQorICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcikoeCAmIDB4ZmYpOw0KKyAgICAgICAgeCA+Pj0gODsNCisgICAgfQ0KKw0KKyAgICBpZiAoeCAhPSAwKQ0KKyAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKi8NCisgICAgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQ0KKyAgICAgICB7DQorICAgICAgICAgIGJ1ZltuXSA9IDB4ZmY7DQorICAgICAgIH0NCisgICAgfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitsb2NhbCB1TG9uZyB6aXBsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKHB0bSxkb3NEYXRlKQ0KKyAgICBjb25zdCB0bV96aXAqIHB0bTsNCisgICAgdUxvbmcgZG9zRGF0ZTsNCit7DQorICAgIHVMb25nIHllYXIgPSAodUxvbmcpcHRtLT50bV95ZWFyOw0KKyAgICBpZiAoeWVhcj4xOTgwKQ0KKyAgICAgICAgeWVhci09MTk4MDsNCisgICAgZWxzZSBpZiAoeWVhcj44MCkNCisgICAgICAgIHllYXItPTgwOw0KKyAgICByZXR1cm4NCisgICAgICAodUxvbmcpICgoKHB0bS0+dG1fbWRheSkgKyAoMzIgKiAocHRtLT50bV9tb24rMSkpICsgKDUxMiAqIHllYXIpKSA8PCAxNikgfA0KKyAgICAgICAgKChwdG0tPnRtX3NlYy8yKSArICgzMiogcHRtLT50bV9taW4pICsgKDIwNDggKiAodUxvbmcpcHRtLT50bV9ob3VyKSk7DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK2xvY2FsIGludCB6aXBsb2NhbF9nZXRCeXRlIE9GKCgNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwNCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sDQorICAgIGludCAqcGkpKTsNCisNCitsb2NhbCBpbnQgemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwaSkNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07DQorICAgIGludCAqcGk7DQorew0KKyAgICB1bnNpZ25lZCBjaGFyIGM7DQorICAgIGludCBlcnIgPSAoaW50KVpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsNCisgICAgaWYgKGVycj09MSkNCisgICAgew0KKyAgICAgICAgKnBpID0gKGludCljOw0KKyAgICAgICAgcmV0dXJuIFpJUF9PSzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmIChaRVJST1IoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkNCisgICAgICAgICAgICByZXR1cm4gWklQX0VSUk5POw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJldHVybiBaSVBfRU9GOw0KKyAgICB9DQorfQ0KKw0KKw0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzDQorKi8NCitsb2NhbCBpbnQgemlwbG9jYWxfZ2V0U2hvcnQgT0YoKA0KKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLA0KKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwNCisgICAgdUxvbmcgKnBYKSk7DQorDQorbG9jYWwgaW50IHppcGxvY2FsX2dldFNob3J0IChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkNCisgICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCisgICAgdm9pZHBmIGZpbGVzdHJlYW07DQorICAgIHVMb25nICpwWDsNCit7DQorICAgIHVMb25nIHggOw0KKyAgICBpbnQgaTsNCisgICAgaW50IGVycjsNCisNCisgICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggPSAodUxvbmcpaTsNCisNCisgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICAgICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggKz0gKCh1TG9uZylpKTw8ODsNCisNCisgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICAgICAgKnBYID0geDsNCisgICAgZWxzZQ0KKyAgICAgICAgKnBYID0gMDsNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorbG9jYWwgaW50IHppcGxvY2FsX2dldExvbmcgT0YoKA0KKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLA0KKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwNCisgICAgdUxvbmcgKnBYKSk7DQorDQorbG9jYWwgaW50IHppcGxvY2FsX2dldExvbmcgKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBYKQ0KKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOw0KKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsNCisgICAgdUxvbmcgKnBYOw0KK3sNCisgICAgdUxvbmcgeCA7DQorICAgIGludCBpOw0KKyAgICBpbnQgZXJyOw0KKw0KKyAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsNCisgICAgeCA9ICh1TG9uZylpOw0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsNCisgICAgeCArPSAoKHVMb25nKWkpPDw4Ow0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsNCisgICAgeCArPSAoKHVMb25nKWkpPDwxNjsNCisNCisgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICAgICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7DQorICAgIHggKz0gKCh1TG9uZylpKTw8MjQ7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgICpwWCA9IHg7DQorICAgIGVsc2UNCisgICAgICAgICpwWCA9IDA7DQorICAgIHJldHVybiBlcnI7DQorfQ0KKw0KKyNpZm5kZWYgQlVGUkVBRENPTU1FTlQNCisjZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkNCisjZW5kaWYNCisvKg0KKyAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlDQorICAgIHRoZSBnbG9iYWwgY29tbWVudCkNCisqLw0KK2xvY2FsIHVMb25nIHppcGxvY2FsX1NlYXJjaENlbnRyYWxEaXIgT0YoKA0KKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLA0KKyAgICB2b2lkcGYgZmlsZXN0cmVhbSkpOw0KKw0KK2xvY2FsIHVMb25nIHppcGxvY2FsX1NlYXJjaENlbnRyYWxEaXIocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pDQorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7DQorICAgIHZvaWRwZiBmaWxlc3RyZWFtOw0KK3sNCisgICAgdW5zaWduZWQgY2hhciogYnVmOw0KKyAgICB1TG9uZyB1U2l6ZUZpbGU7DQorICAgIHVMb25nIHVCYWNrUmVhZDsNCisgICAgdUxvbmcgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8NCisgICAgdUxvbmcgdVBvc0ZvdW5kPTA7DQorDQorICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQ0KKyAgICAgICAgcmV0dXJuIDA7DQorDQorDQorICAgIHVTaXplRmlsZSA9IFpURUxMKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7DQorDQorICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpDQorICAgICAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsNCisNCisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOw0KKyAgICBpZiAoYnVmPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIDA7DQorDQorICAgIHVCYWNrUmVhZCA9IDQ7DQorICAgIHdoaWxlICh1QmFja1JlYWQ8dU1heEJhY2spDQorICAgIHsNCisgICAgICAgIHVMb25nIHVSZWFkU2l6ZSx1UmVhZFBvcyA7DQorICAgICAgICBpbnQgaTsNCisgICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spDQorICAgICAgICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsNCisgICAgICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7DQorDQorICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8NCisgICAgICAgICAgICAgICAgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodVNpemVGaWxlLXVSZWFkUG9zKTsNCisgICAgICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBpZiAoWlJFQUQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1Zix1UmVhZFNpemUpIT11UmVhZFNpemUpDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspDQorICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJg0KKyAgICAgICAgICAgICAgICAoKCooYnVmK2krMikpPT0weDA1KSAmJiAoKCooYnVmK2krMykpPT0weDA2KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgIGlmICh1UG9zRm91bmQhPTApDQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgVFJZRlJFRShidWYpOw0KKyAgICByZXR1cm4gdVBvc0ZvdW5kOw0KK30NCisjZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgKHBhdGhuYW1lLCBhcHBlbmQsIGdsb2JhbGNvbW1lbnQsIHB6bGliX2ZpbGVmdW5jX2RlZikNCisgICAgY29uc3QgY2hhciAqcGF0aG5hbWU7DQorICAgIGludCBhcHBlbmQ7DQorICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudDsNCisgICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsNCit7DQorICAgIHppcF9pbnRlcm5hbCB6aWluaXQ7DQorICAgIHppcF9pbnRlcm5hbCogemk7DQorICAgIGludCBlcnI9WklQX09LOw0KKw0KKw0KKyAgICBpZiAocHpsaWJfZmlsZWZ1bmNfZGVmPT1OVUxMKQ0KKyAgICAgICAgZmlsbF9mb3Blbl9maWxlZnVuYygmemlpbml0LnpfZmlsZWZ1bmMpOw0KKyAgICBlbHNlDQorICAgICAgICB6aWluaXQuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuY19kZWY7DQorDQorICAgIHppaW5pdC5maWxlc3RyZWFtID0gKCooemlpbml0LnpfZmlsZWZ1bmMuem9wZW5fZmlsZSkpDQorICAgICAgICAgICAgICAgICAoemlpbml0LnpfZmlsZWZ1bmMub3BhcXVlLA0KKyAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLA0KKyAgICAgICAgICAgICAgICAgIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19DUkVBVEUpID8NCisgICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKSA6DQorICAgICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpKTsNCisNCisgICAgaWYgKHppaW5pdC5maWxlc3RyZWFtID09IE5VTEwpDQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgemlpbml0LmJlZ2luX3BvcyA9IFpURUxMKHppaW5pdC56X2ZpbGVmdW5jLHppaW5pdC5maWxlc3RyZWFtKTsNCisgICAgemlpbml0LmluX29wZW5lZF9maWxlX2luemlwID0gMDsNCisgICAgemlpbml0LmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7DQorICAgIHppaW5pdC5udW1iZXJfZW50cnkgPSAwOw0KKyAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gMDsNCisgICAgaW5pdF9saW5rZWRsaXN0KCYoemlpbml0LmNlbnRyYWxfZGlyKSk7DQorDQorDQorICAgIHppID0gKHppcF9pbnRlcm5hbCopQUxMT0Moc2l6ZW9mKHppcF9pbnRlcm5hbCkpOw0KKyAgICBpZiAoemk9PU5VTEwpDQorICAgIHsNCisgICAgICAgIFpDTE9TRSh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKw0KKyAgICAvKiBub3cgd2UgYWRkIGZpbGUgaW4gYSB6aXBmaWxlICovDQorIyAgICBpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVANCisgICAgemlpbml0Lmdsb2JhbGNvbW1lbnQgPSBOVUxMOw0KKyAgICBpZiAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQURESU5aSVApDQorICAgIHsNCisgICAgICAgIHVMb25nIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLw0KKw0KKyAgICAgICAgdUxvbmcgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLw0KKyAgICAgICAgdUxvbmcgb2Zmc2V0X2NlbnRyYWxfZGlyOyAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqLw0KKyAgICAgICAgdUxvbmcgY2VudHJhbF9wb3MsdUw7DQorDQorICAgICAgICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovDQorICAgICAgICB1TG9uZyBudW1iZXJfZGlza193aXRoX0NEOyAgLyogbnVtYmVyIHRoZSB0aGUgZGlzayB3aXRoIGNlbnRyYWwgZGlyLCB1c2VkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLw0KKyAgICAgICAgdUxvbmcgbnVtYmVyX2VudHJ5Ow0KKyAgICAgICAgdUxvbmcgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlbnRyYWwgZGlyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLw0KKyAgICAgICAgdUxvbmcgc2l6ZV9jb21tZW50Ow0KKw0KKyAgICAgICAgY2VudHJhbF9wb3MgPSB6aXBsb2NhbF9TZWFyY2hDZW50cmFsRGlyKCZ6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7DQorICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApDQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsNCisNCisgICAgICAgIGlmIChaU0VFSyh6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQ0KKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8NCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRMb25nKCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJnVMKSE9WklQX09LKQ0KKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovDQorICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spDQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsNCisNCisgICAgICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8NCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9WklQX09LKQ0KKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovDQorICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5KSE9WklQX09LKQ0KKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8NCisgICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZW50cnlfQ0QpIT1aSVBfT0spDQorICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsNCisNCisgICAgICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8DQorICAgICAgICAgICAgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8DQorICAgICAgICAgICAgKG51bWJlcl9kaXNrIT0wKSkNCisgICAgICAgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7DQorDQorICAgICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLw0KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldExvbmcoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmc2l6ZV9jZW50cmFsX2RpcikhPVpJUF9PSykNCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POw0KKw0KKyAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUNCisgICAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLw0KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldExvbmcoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmb2Zmc2V0X2NlbnRyYWxfZGlyKSE9WklQX09LKQ0KKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAvKiB6aXBmaWxlIGdsb2JhbCBjb21tZW50IGxlbmd0aCAqLw0KKyAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJnNpemVfY29tbWVudCkhPVpJUF9PSykNCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POw0KKw0KKyAgICAgICAgaWYgKChjZW50cmFsX3BvczxvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2RpcikgJiYNCisgICAgICAgICAgICAoZXJyPT1aSVBfT0spKQ0KKyAgICAgICAgICAgIGVycj1aSVBfQkFEWklQRklMRTsNCisNCisgICAgICAgIGlmIChlcnIhPVpJUF9PSykNCisgICAgICAgIHsNCisgICAgICAgICAgICBaQ0xPU0Uoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtKTsNCisgICAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzaXplX2NvbW1lbnQ+MCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB6aWluaXQuZ2xvYmFsY29tbWVudCA9IEFMTE9DKHNpemVfY29tbWVudCsxKTsNCisgICAgICAgICAgICBpZiAoemlpbml0Lmdsb2JhbGNvbW1lbnQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgIHNpemVfY29tbWVudCA9IFpSRUFEKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSx6aWluaXQuZ2xvYmFsY29tbWVudCxzaXplX2NvbW1lbnQpOw0KKyAgICAgICAgICAgICAgIHppaW5pdC5nbG9iYWxjb21tZW50W3NpemVfY29tbWVudF09MDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBieXRlX2JlZm9yZV90aGVfemlwZmlsZSA9IGNlbnRyYWxfcG9zIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2Rpcik7DQorICAgICAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7DQorDQorICAgICAgICB7DQorICAgICAgICAgICAgdUxvbmcgc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkID0gc2l6ZV9jZW50cmFsX2RpcjsNCisgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUgPSBTSVpFREFUQV9JTkRBVEFCTE9DSzsNCisgICAgICAgICAgICB2b2lkKiBidWZfcmVhZCA9ICh2b2lkKilBTExPQyhidWZfc2l6ZSk7DQorICAgICAgICAgICAgaWYgKFpTRUVLKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwNCisgICAgICAgICAgICAgICAgICBvZmZzZXRfY2VudHJhbF9kaXIgKyBieXRlX2JlZm9yZV90aGVfemlwZmlsZSwNCisgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSAhPSAwKQ0KKyAgICAgICAgICAgICAgICAgIGVycj1aSVBfRVJSTk87DQorDQorICAgICAgICAgICAgd2hpbGUgKChzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ+MCkgJiYgKGVycj09WklQX09LKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHVMb25nIHJlYWRfdGhpcyA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOw0KKyAgICAgICAgICAgICAgICBpZiAocmVhZF90aGlzID4gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkKQ0KKyAgICAgICAgICAgICAgICAgICAgcmVhZF90aGlzID0gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkOw0KKyAgICAgICAgICAgICAgICBpZiAoWlJFQUQoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLGJ1Zl9yZWFkLHJlYWRfdGhpcykgIT0gcmVhZF90aGlzKQ0KKyAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsNCisNCisgICAgICAgICAgICAgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkX2RhdGFfaW5fZGF0YWJsb2NrKCZ6aWluaXQuY2VudHJhbF9kaXIsYnVmX3JlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVMb25nKXJlYWRfdGhpcyk7DQorICAgICAgICAgICAgICAgIHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZC09cmVhZF90aGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBUUllGUkVFKGJ1Zl9yZWFkKTsNCisgICAgICAgIH0NCisgICAgICAgIHppaW5pdC5iZWdpbl9wb3MgPSBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsNCisgICAgICAgIHppaW5pdC5udW1iZXJfZW50cnkgPSBudW1iZXJfZW50cnlfQ0Q7DQorDQorICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgIG9mZnNldF9jZW50cmFsX2RpcitieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POw0KKyAgICB9DQorDQorICAgIGlmIChnbG9iYWxjb21tZW50KQ0KKyAgICB7DQorICAgICAgKmdsb2JhbGNvbW1lbnQgPSB6aWluaXQuZ2xvYmFsY29tbWVudDsNCisgICAgfQ0KKyMgICAgZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8NCisNCisgICAgaWYgKGVyciAhPSBaSVBfT0spDQorICAgIHsNCisjICAgIGlmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUA0KKyAgICAgICAgVFJZRlJFRSh6aWluaXQuZ2xvYmFsY29tbWVudCk7DQorIyAgICBlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLw0KKyAgICAgICAgVFJZRlJFRSh6aSk7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgICp6aSA9IHppaW5pdDsNCisgICAgICAgIHJldHVybiAoemlwRmlsZSl6aTsNCisgICAgfQ0KK30NCisNCitleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKHBhdGhuYW1lLCBhcHBlbmQpDQorICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lOw0KKyAgICBpbnQgYXBwZW5kOw0KK3sNCisgICAgcmV0dXJuIHppcE9wZW4yKHBhdGhuYW1lLGFwcGVuZCxOVUxMLE5VTEwpOw0KK30NCisNCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDMgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgcmF3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsIGNyY0ZvckNyeXB0aW5nKQ0KKyAgICB6aXBGaWxlIGZpbGU7DQorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOw0KKyAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOw0KKyAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsOw0KKyAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbDsNCisgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7DQorICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbDsNCisgICAgY29uc3QgY2hhciogY29tbWVudDsNCisgICAgaW50IG1ldGhvZDsNCisgICAgaW50IGxldmVsOw0KKyAgICBpbnQgcmF3Ow0KKyAgICBpbnQgd2luZG93Qml0czsNCisgICAgaW50IG1lbUxldmVsOw0KKyAgICBpbnQgc3RyYXRlZ3k7DQorICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOw0KKyAgICB1TG9uZyBjcmNGb3JDcnlwdGluZzsNCit7DQorICAgIHppcF9pbnRlcm5hbCogemk7DQorICAgIHVJbnQgc2l6ZV9maWxlbmFtZTsNCisgICAgdUludCBzaXplX2NvbW1lbnQ7DQorICAgIHVJbnQgaTsNCisgICAgaW50IGVyciA9IFpJUF9PSzsNCisNCisjICAgIGlmZGVmIE5PQ1JZUFQNCisgICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpDQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7DQorIyAgICBlbmRpZg0KKw0KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQ0KKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOw0KKyAgICBpZiAoKG1ldGhvZCE9MCkgJiYgKG1ldGhvZCE9Wl9ERUZMQVRFRCkpDQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7DQorDQorICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsNCisNCisgICAgaWYgKHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9PSAxKQ0KKyAgICB7DQorICAgICAgICBlcnIgPSB6aXBDbG9zZUZpbGVJblppcCAoZmlsZSk7DQorICAgICAgICBpZiAoZXJyICE9IFpJUF9PSykNCisgICAgICAgICAgICByZXR1cm4gZXJyOw0KKyAgICB9DQorDQorDQorICAgIGlmIChmaWxlbmFtZT09TlVMTCkNCisgICAgICAgIGZpbGVuYW1lPSItIjsNCisNCisgICAgaWYgKGNvbW1lbnQ9PU5VTEwpDQorICAgICAgICBzaXplX2NvbW1lbnQgPSAwOw0KKyAgICBlbHNlDQorICAgICAgICBzaXplX2NvbW1lbnQgPSAodUludClzdHJsZW4oY29tbWVudCk7DQorDQorICAgIHNpemVfZmlsZW5hbWUgPSAodUludClzdHJsZW4oZmlsZW5hbWUpOw0KKw0KKyAgICBpZiAoemlwZmkgPT0gTlVMTCkNCisgICAgICAgIHppLT5jaS5kb3NEYXRlID0gMDsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAoemlwZmktPmRvc0RhdGUgIT0gMCkNCisgICAgICAgICAgICB6aS0+Y2kuZG9zRGF0ZSA9IHppcGZpLT5kb3NEYXRlOw0KKyAgICAgICAgZWxzZSB6aS0+Y2kuZG9zRGF0ZSA9IHppcGxvY2FsX1RtekRhdGVUb0Rvc0RhdGUoJnppcGZpLT50bXpfZGF0ZSx6aXBmaS0+ZG9zRGF0ZSk7DQorICAgIH0NCisNCisgICAgemktPmNpLmZsYWcgPSAwOw0KKyAgICBpZiAoKGxldmVsPT04KSB8fCAobGV2ZWw9PTkpKQ0KKyAgICAgIHppLT5jaS5mbGFnIHw9IDI7DQorICAgIGlmICgobGV2ZWw9PTIpKQ0KKyAgICAgIHppLT5jaS5mbGFnIHw9IDQ7DQorICAgIGlmICgobGV2ZWw9PTEpKQ0KKyAgICAgIHppLT5jaS5mbGFnIHw9IDY7DQorICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQ0KKyAgICAgIHppLT5jaS5mbGFnIHw9IDE7DQorDQorICAgIHppLT5jaS5jcmMzMiA9IDA7DQorICAgIHppLT5jaS5tZXRob2QgPSBtZXRob2Q7DQorICAgIHppLT5jaS5lbmNyeXB0ID0gMDsNCisgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7DQorICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7DQorICAgIHppLT5jaS5yYXcgPSByYXc7DQorICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID0gWlRFTEwoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pIDsNCisgICAgemktPmNpLnNpemVfY2VudHJhbGhlYWRlciA9IFNJWkVDRU5UUkFMSEVBREVSICsgc2l6ZV9maWxlbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2V4dHJhZmllbGRfZ2xvYmFsICsgc2l6ZV9jb21tZW50Ow0KKyAgICB6aS0+Y2kuY2VudHJhbF9oZWFkZXIgPSAoY2hhciopQUxMT0MoKHVJbnQpemktPmNpLnNpemVfY2VudHJhbGhlYWRlcik7DQorDQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciwodUxvbmcpQ0VOVFJBTEhFQURFUk1BR0lDLDQpOw0KKyAgICAvKiB2ZXJzaW9uIGluZm8gKi8NCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQsKHVMb25nKVZFUlNJT05NQURFQlksMik7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZykyMCwyKTsNCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzgsKHVMb25nKXppLT5jaS5mbGFnLDIpOw0KKyAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTAsKHVMb25nKXppLT5jaS5tZXRob2QsMik7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMiwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxNiwodUxvbmcpMCw0KTsgLypjcmMqLw0KKyAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjAsKHVMb25nKTAsNCk7IC8qY29tcHIgc2l6ZSovDQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwodUxvbmcpMCw0KTsgLyp1bmNvbXByIHNpemUqLw0KKyAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjgsKHVMb25nKXNpemVfZmlsZW5hbWUsMik7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszMCwodUxvbmcpc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwyKTsNCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMyLCh1TG9uZylzaXplX2NvbW1lbnQsMik7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszNCwodUxvbmcpMCwyKTsgLypkaXNrIG5tIHN0YXJ0Ki8NCisNCisgICAgaWYgKHppcGZpPT1OVUxMKQ0KKyAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZykwLDIpOw0KKyAgICBlbHNlDQorICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKXppcGZpLT5pbnRlcm5hbF9mYSwyKTsNCisNCisgICAgaWYgKHppcGZpPT1OVUxMKQ0KKyAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM4LCh1TG9uZykwLDQpOw0KKyAgICBlbHNlDQorICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzgsKHVMb25nKXppcGZpLT5leHRlcm5hbF9mYSw0KTsNCisNCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlci0gemktPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCw0KTsNCisNCisgICAgZm9yIChpPTA7aTxzaXplX2ZpbGVuYW1lO2krKykNCisgICAgICAgICooemktPmNpLmNlbnRyYWxfaGVhZGVyK1NJWkVDRU5UUkFMSEVBREVSK2kpID0gKihmaWxlbmFtZStpKTsNCisNCisgICAgZm9yIChpPTA7aTxzaXplX2V4dHJhZmllbGRfZ2xvYmFsO2krKykNCisgICAgICAgICooemktPmNpLmNlbnRyYWxfaGVhZGVyK1NJWkVDRU5UUkFMSEVBREVSK3NpemVfZmlsZW5hbWUraSkgPQ0KKyAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKWV4dHJhZmllbGRfZ2xvYmFsKStpKTsNCisNCisgICAgZm9yIChpPTA7aTxzaXplX2NvbW1lbnQ7aSsrKQ0KKyAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZSsNCisgICAgICAgICAgICAgIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwraSkgPSAqKGNvbW1lbnQraSk7DQorICAgIGlmICh6aS0+Y2kuY2VudHJhbF9oZWFkZXIgPT0gTlVMTCkNCisgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsNCisNCisgICAgLyogd3JpdGUgdGhlIGxvY2FsIGhlYWRlciAqLw0KKyAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUxPQ0FMSEVBREVSTUFHSUMsNCk7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMjAsMik7LyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5mbGFnLDIpOw0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5tZXRob2QsMik7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY3JjIDMyLCB1bmtub3duICovDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8NCisNCisgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOw0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZXh0cmFmaWVsZF9sb2NhbCwyKTsNCisNCisgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZmlsZW5hbWU+MCkpDQorICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGZpbGVuYW1lLHNpemVfZmlsZW5hbWUpIT1zaXplX2ZpbGVuYW1lKQ0KKyAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87DQorDQorICAgIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2V4dHJhZmllbGRfbG9jYWw+MCkpDQorICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGV4dHJhZmllbGRfbG9jYWwsc2l6ZV9leHRyYWZpZWxkX2xvY2FsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9c2l6ZV9leHRyYWZpZWxkX2xvY2FsKQ0KKyAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87DQorDQorICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOw0KKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsNCisgICAgemktPmNpLnN0cmVhbS5uZXh0X291dCA9IHppLT5jaS5idWZmZXJlZF9kYXRhOw0KKyAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luID0gMDsNCisgICAgemktPmNpLnN0cmVhbS50b3RhbF9vdXQgPSAwOw0KKw0KKyAgICBpZiAoKGVycj09WklQX09LKSAmJiAoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQ0KKyAgICB7DQorICAgICAgICB6aS0+Y2kuc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7DQorICAgICAgICB6aS0+Y2kuc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOw0KKyAgICAgICAgemktPmNpLnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7DQorDQorICAgICAgICBpZiAod2luZG93Qml0cz4wKQ0KKyAgICAgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsNCisNCisgICAgICAgIGVyciA9IGRlZmxhdGVJbml0MigmemktPmNpLnN0cmVhbSwgbGV2ZWwsDQorICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KTsNCisNCisgICAgICAgIGlmIChlcnI9PVpfT0spDQorICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDE7DQorICAgIH0NCisjICAgIGlmbmRlZiBOT0NSWVBUDQorICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IDA7DQorICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpDQorICAgIHsNCisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmSGVhZFtSQU5EX0hFQURfTEVOXTsNCisgICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsNCisgICAgICAgIHppLT5jaS5lbmNyeXB0ID0gMTsNCisgICAgICAgIHppLT5jaS5wY3JjXzMyX3RhYiA9IGdldF9jcmNfdGFibGUoKTsNCisgICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8NCisNCisgICAgICAgIHNpemVIZWFkPWNyeXB0aGVhZChwYXNzd29yZCxidWZIZWFkLFJBTkRfSEVBRF9MRU4semktPmNpLmtleXMsemktPmNpLnBjcmNfMzJfdGFiLGNyY0ZvckNyeXB0aW5nKTsNCisgICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IHNpemVIZWFkOw0KKw0KKyAgICAgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxidWZIZWFkLHNpemVIZWFkKSAhPSBzaXplSGVhZCkNCisgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POw0KKyAgICB9DQorIyAgICBlbmRpZg0KKw0KKyAgICBpZiAoZXJyPT1aX09LKQ0KKyAgICAgICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMTsNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgcmF3KQ0KKyAgICB6aXBGaWxlIGZpbGU7DQorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOw0KKyAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOw0KKyAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsOw0KKyAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbDsNCisgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7DQorICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbDsNCisgICAgY29uc3QgY2hhciogY29tbWVudDsNCisgICAgaW50IG1ldGhvZDsNCisgICAgaW50IGxldmVsOw0KKyAgICBpbnQgcmF3Ow0KK3sNCisgICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXAzIChmaWxlLCBmaWxlbmFtZSwgemlwZmksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7DQorfQ0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwIChmaWxlLCBmaWxlbmFtZSwgemlwZmksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwpDQorICAgIHppcEZpbGUgZmlsZTsNCisgICAgY29uc3QgY2hhciogZmlsZW5hbWU7DQorICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmk7DQorICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWw7DQorICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsOw0KKyAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbDsNCisgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOw0KKyAgICBjb25zdCBjaGFyKiBjb21tZW50Ow0KKyAgICBpbnQgbWV0aG9kOw0KKyAgICBpbnQgbGV2ZWw7DQorew0KKyAgICByZXR1cm4gemlwT3Blbk5ld0ZpbGVJblppcDIgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgMCk7DQorfQ0KKw0KK2xvY2FsIGludCB6aXBGbHVzaFdyaXRlQnVmZmVyKHppKQ0KKyAgemlwX2ludGVybmFsKiB6aTsNCit7DQorICAgIGludCBlcnI9WklQX09LOw0KKw0KKyAgICBpZiAoemktPmNpLmVuY3J5cHQgIT0gMCkNCisgICAgew0KKyNpZm5kZWYgTk9DUllQVA0KKyAgICAgICAgdUludCBpOw0KKyAgICAgICAgaW50IHQ7DQorICAgICAgICBmb3IgKGk9MDtpPHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YTtpKyspDQorICAgICAgICAgICAgemktPmNpLmJ1ZmZlcmVkX2RhdGFbaV0gPSB6ZW5jb2RlKHppLT5jaS5rZXlzLCB6aS0+Y2kucGNyY18zMl90YWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemktPmNpLmJ1ZmZlcmVkX2RhdGFbaV0sdCk7DQorI2VuZGlmDQorICAgIH0NCisgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPXppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSkNCisgICAgICBlcnIgPSBaSVBfRVJSTk87DQorICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7DQorICAgIHJldHVybiBlcnI7DQorfQ0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIChmaWxlLCBidWYsIGxlbikNCisgICAgemlwRmlsZSBmaWxlOw0KKyAgICBjb25zdCB2b2lkKiBidWY7DQorICAgIHVuc2lnbmVkIGxlbjsNCit7DQorICAgIHppcF9pbnRlcm5hbCogemk7DQorICAgIGludCBlcnI9WklQX09LOw0KKw0KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQ0KKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOw0KKyAgICB6aSA9ICh6aXBfaW50ZXJuYWwqKWZpbGU7DQorDQorICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkNCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsNCisNCisgICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKHZvaWQqKWJ1ZjsNCisgICAgemktPmNpLnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsNCisgICAgemktPmNpLmNyYzMyID0gY3JjMzIoemktPmNpLmNyYzMyLGJ1ZixsZW4pOw0KKw0KKyAgICB3aGlsZSAoKGVycj09WklQX09LKSAmJiAoemktPmNpLnN0cmVhbS5hdmFpbF9pbj4wKSkNCisgICAgew0KKyAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID09IDApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykNCisgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POw0KKyAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOw0KKyAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsNCisgICAgICAgIH0NCisNCisNCisgICAgICAgIGlmKGVyciAhPSBaSVBfT0spDQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUgPSB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsNCisgICAgICAgICAgICBlcnI9ZGVmbGF0ZSgmemktPmNpLnN0cmVhbSwgIFpfTk9fRkxVU0gpOw0KKyAgICAgICAgICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSArPSAodUludCkoemktPmNpLnN0cmVhbS50b3RhbF9vdXQgLSB1VG90YWxPdXRCZWZvcmUpIDsNCisNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICB1SW50IGNvcHlfdGhpcyxpOw0KKyAgICAgICAgICAgIGlmICh6aS0+Y2kuc3RyZWFtLmF2YWlsX2luIDwgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQpDQorICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfaW47DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBjb3B5X3RoaXMgPSB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dDsNCisgICAgICAgICAgICBmb3IgKGk9MDtpPGNvcHlfdGhpcztpKyspDQorICAgICAgICAgICAgICAgICooKChjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfb3V0KStpKSA9DQorICAgICAgICAgICAgICAgICAgICAqKCgoY29uc3QgY2hhciopemktPmNpLnN0cmVhbS5uZXh0X2luKStpKTsNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gLT0gY29weV90aGlzOw0KKyAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dC09IGNvcHlfdGhpczsNCisgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5uZXh0X2luKz0gY29weV90aGlzOw0KKyAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0Kz0gY29weV90aGlzOw0KKyAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luKz0gY29weV90aGlzOw0KKyAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dCs9IGNvcHlfdGhpczsNCisgICAgICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9IGNvcHlfdGhpczsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3IChmaWxlLCB1bmNvbXByZXNzZWRfc2l6ZSwgY3JjMzIpDQorICAgIHppcEZpbGUgZmlsZTsNCisgICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7DQorICAgIHVMb25nIGNyYzMyOw0KK3sNCisgICAgemlwX2ludGVybmFsKiB6aTsNCisgICAgdUxvbmcgY29tcHJlc3NlZF9zaXplOw0KKyAgICBpbnQgZXJyPVpJUF9PSzsNCisNCisgICAgaWYgKGZpbGUgPT0gTlVMTCkNCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsNCisgICAgemkgPSAoemlwX2ludGVybmFsKilmaWxlOw0KKw0KKyAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApDQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7DQorICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSAwOw0KKw0KKyAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkNCisgICAgICAgIHdoaWxlIChlcnI9PVpJUF9PSykNCisgICAgew0KKyAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlOw0KKyAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID09IDApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHppcEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykNCisgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POw0KKyAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOw0KKyAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHppLT5jaS5zdHJlYW0udG90YWxfb3V0Ow0KKyAgICAgICAgZXJyPWRlZmxhdGUoJnppLT5jaS5zdHJlYW0sICBaX0ZJTklTSCk7DQorICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7DQorICAgIH0NCisNCisgICAgaWYgKGVycj09Wl9TVFJFQU1fRU5EKQ0KKyAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8NCisNCisgICAgaWYgKCh6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGE+MCkgJiYgKGVycj09WklQX09LKSkNCisgICAgICAgIGlmICh6aXBGbHVzaFdyaXRlQnVmZmVyKHppKT09WklQX0VSUk5PKQ0KKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsNCisNCisgICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpDQorICAgIHsNCisgICAgICAgIGVycj1kZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsNCisgICAgICAgIHppLT5jaS5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOw0KKyAgICB9DQorDQorICAgIGlmICghemktPmNpLnJhdykNCisgICAgew0KKyAgICAgICAgY3JjMzIgPSAodUxvbmcpemktPmNpLmNyYzMyOw0KKyAgICAgICAgdW5jb21wcmVzc2VkX3NpemUgPSAodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9pbjsNCisgICAgfQ0KKyAgICBjb21wcmVzc2VkX3NpemUgPSAodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7DQorIyAgICBpZm5kZWYgTk9DUllQVA0KKyAgICBjb21wcmVzc2VkX3NpemUgKz0gemktPmNpLmNyeXB0X2hlYWRlcl9zaXplOw0KKyMgICAgZW5kaWYNCisNCisgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LGNyYzMyLDQpOyAvKmNyYyovDQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfc2l6ZSw0KTsgLypjb21wciBzaXplKi8NCisgICAgaWYgKHppLT5jaS5zdHJlYW0uZGF0YV90eXBlID09IFpfQVNDSUkpDQorICAgICAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKVpfQVNDSUksMik7DQorICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZF9zaXplLDQpOyAvKnVuY29tcHIgc2l6ZSovDQorDQorICAgIGlmIChlcnI9PVpJUF9PSykNCisgICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmemktPmNlbnRyYWxfZGlyLHppLT5jaS5jZW50cmFsX2hlYWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpemktPmNpLnNpemVfY2VudHJhbGhlYWRlcik7DQorICAgIGZyZWUoemktPmNpLmNlbnRyYWxfaGVhZGVyKTsNCisNCisgICAgaWYgKGVycj09WklQX09LKQ0KKyAgICB7DQorICAgICAgICBsb25nIGN1cl9wb3NfaW56aXAgPSBaVEVMTCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7DQorICAgICAgICBpZiAoWlNFRUsoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgemktPmNpLnBvc19sb2NhbF9oZWFkZXIgKyAxNCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87DQorDQorICAgICAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgICAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNyYzMyLDQpOyAvKiBjcmMgMzIsIHVua25vd24gKi8NCisNCisgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovDQorICAgICAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNvbXByZXNzZWRfc2l6ZSw0KTsNCisNCisgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8NCisgICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sdW5jb21wcmVzc2VkX3NpemUsNCk7DQorDQorICAgICAgICBpZiAoWlNFRUsoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgY3VyX3Bvc19pbnppcCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkNCisgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87DQorICAgIH0NCisNCisgICAgemktPm51bWJlcl9lbnRyeSArKzsNCisgICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMDsNCisNCisgICAgcmV0dXJuIGVycjsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwIChmaWxlKQ0KKyAgICB6aXBGaWxlIGZpbGU7DQorew0KKyAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXcgKGZpbGUsMCwwKTsNCit9DQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIChmaWxlLCBnbG9iYWxfY29tbWVudCkNCisgICAgemlwRmlsZSBmaWxlOw0KKyAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudDsNCit7DQorICAgIHppcF9pbnRlcm5hbCogemk7DQorICAgIGludCBlcnIgPSAwOw0KKyAgICB1TG9uZyBzaXplX2NlbnRyYWxkaXIgPSAwOw0KKyAgICB1TG9uZyBjZW50cmFsZGlyX3Bvc19pbnppcDsNCisgICAgdUludCBzaXplX2dsb2JhbF9jb21tZW50Ow0KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQ0KKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOw0KKyAgICB6aSA9ICh6aXBfaW50ZXJuYWwqKWZpbGU7DQorDQorICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkNCisgICAgew0KKyAgICAgICAgZXJyID0gemlwQ2xvc2VGaWxlSW5aaXAgKGZpbGUpOw0KKyAgICB9DQorDQorI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUA0KKyAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpDQorICAgICAgICBnbG9iYWxfY29tbWVudCA9IHppLT5nbG9iYWxjb21tZW50Ow0KKyNlbmRpZg0KKyAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpDQorICAgICAgICBzaXplX2dsb2JhbF9jb21tZW50ID0gMDsNCisgICAgZWxzZQ0KKyAgICAgICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7DQorDQorICAgIGNlbnRyYWxkaXJfcG9zX2luemlwID0gWlRFTEwoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOw0KKyAgICBpZiAoZXJyPT1aSVBfT0spDQorICAgIHsNCisgICAgICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGkgPSB6aS0+Y2VudHJhbF9kaXIuZmlyc3RfYmxvY2sgOw0KKyAgICAgICAgd2hpbGUgKGxkaSE9TlVMTCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKGVycj09WklQX09LKSAmJiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaz4wKSkNCisgICAgICAgICAgICAgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGktPmRhdGEsbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPWxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2sgKQ0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POw0KKw0KKyAgICAgICAgICAgIHNpemVfY2VudHJhbGRpciArPSBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrOw0KKyAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2s7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZnJlZV9kYXRhYmxvY2soemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrKTsNCisNCisgICAgaWYgKGVycj09WklQX09LKSAvKiBNYWdpYyBFbmQgKi8NCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpRU5ESEVBREVSTUFHSUMsNCk7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLw0KKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOw0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8NCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCwyKTsNCisNCisgICAgaWYgKGVycj09WklQX09LKSAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8NCisgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9jZW50cmFsZGlyLDQpOw0KKw0KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovDQorICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpKGNlbnRyYWxkaXJfcG9zX2luemlwIC0gemktPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCksNCk7DQorDQorICAgIGlmIChlcnI9PVpJUF9PSykgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAqLw0KKyAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2dsb2JhbF9jb21tZW50LDIpOw0KKw0KKyAgICBpZiAoKGVycj09WklQX09LKSAmJiAoc2l6ZV9nbG9iYWxfY29tbWVudD4wKSkNCisgICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sDQorICAgICAgICAgICAgICAgICAgIGdsb2JhbF9jb21tZW50LHNpemVfZ2xvYmFsX2NvbW1lbnQpICE9IHNpemVfZ2xvYmFsX2NvbW1lbnQpDQorICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsNCisNCisgICAgaWYgKFpDTE9TRSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSkgIT0gMCkNCisgICAgICAgIGlmIChlcnIgPT0gWklQX09LKQ0KKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsNCisNCisjaWZuZGVmIE5PX0FEREZJTEVJTkVYSVNUSU5HWklQDQorICAgIFRSWUZSRUUoemktPmdsb2JhbGNvbW1lbnQpOw0KKyNlbmRpZg0KKyAgICBUUllGUkVFKHppKTsNCisNCisgICAgcmV0dXJuIGVycjsNCit9DQpkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL3ppcC5oIGIvY29udHJpYi9taW5pemlwL3ppcC5oCmluZGV4IGQ1MTEyYzQuLmNkMzhiNjcgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbWluaXppcC96aXAuaAorKysgYi9jb250cmliL21pbml6aXAvemlwLmgKQEAgLTEsMjM0ICsxLDIzNSBAQAotLyogemlwLmggLS0gSU8gZm9yIGNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxLCBNYXkgOHRoLCAyMDA0Ci0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50Ci0KLSAgIFRoaXMgdW56aXAgcGFja2FnZSBhbGxvdyBjcmVhdGVzIC5aSVAgZmlsZSwgY29tcGF0aWJsZSB3aXRoIFBLWmlwIDIuMDRnCi0gICAgIFdpblppcCwgSW5mb1ppcCB0b29scyBhbmQgY29tcGF0aWJsZS4KLSAgIEVuY3J5cHRpb24gYW5kIG11bHRpIHZvbHVtZSBaaXBGaWxlIChzcGFuKSBhcmUgbm90IHN1cHBvcnRlZC4KLSAgIE9sZCBjb21wcmVzc2lvbnMgdXNlZCBieSBvbGQgUEtaaXAgMS54IGFyZSBub3Qgc3VwcG9ydGVkCi0KLSAgRm9yIHVuY29tcHJlc3MgLnppcCBmaWxlLCBsb29rIGF0IHVuemlwLmgKLQotCi0gICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQotICAgVmlzaXQgYWxzbyBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwgZm9yIGV2b2x1dGlvbgotCi0gICBDb25kaXRpb24gb2YgdXNlIGFuZCBkaXN0cmlidXRpb24gYXJlIHRoZSBzYW1lIHRoYW4gemxpYiA6Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0KLSovCi0KLS8qIGZvciBtb3JlIGluZm8gYWJvdXQgLlpJUCBmb3JtYXQsIHNlZQotICAgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jL2FwcG5vdGUtOTgxMTE5LWl6LnppcAotICAgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jLwotICAgUGtXYXJlIGhhcyBhbHNvIGEgc3BlY2lmaWNhdGlvbiBhdCA6Ci0gICAgICBmdHA6Ly9mdHAucGt3YXJlLmNvbS9wcm9iZGVzYy56aXAKLSovCi0KLSNpZm5kZWYgX3ppcF9ICi0jZGVmaW5lIF96aXBfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJfSAotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0jaWZuZGVmIF9aTElCSU9BUElfSAotI2luY2x1ZGUgImlvYXBpLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU1RSSUNUWklQKSB8fCBkZWZpbmVkKFNUUklDVFpJUFVOWklQKQotLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZAotICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8KLXR5cGVkZWYgc3RydWN0IFRhZ3ppcEZpbGVfXyB7IGludCB1bnVzZWQ7IH0gemlwRmlsZV9fOwotdHlwZWRlZiB6aXBGaWxlX18gKnppcEZpbGU7Ci0jZWxzZQotdHlwZWRlZiB2b2lkcCB6aXBGaWxlOwotI2VuZGlmCi0KLSNkZWZpbmUgWklQX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgWklQX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgWklQX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKLSNkZWZpbmUgWklQX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKLSNkZWZpbmUgWklQX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKLSNkZWZpbmUgWklQX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKLQotI2lmbmRlZiBERUZfTUVNX0xFVkVMCi0jICBpZiBNQVhfTUVNX0xFVkVMID49IDgKLSMgICAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAotIyAgZWxzZQotIyAgICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAotIyAgZW5kaWYKLSNlbmRpZgotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotCi0vKiB0bV96aXAgY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3QgdG1femlwX3MKLXsKLSAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KLSAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCi0gICAgdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLSAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCi0gICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KLSAgICB1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLwotfSB0bV96aXA7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdG1femlwICAgICAgdG16X2RhdGU7ICAgICAgIC8qIGRhdGUgaW4gdW5kZXJzdGFuZGFibGUgZm9ybWF0ICAgICAgICAgICAqLwotICAgIHVMb25nICAgICAgIGRvc0RhdGU7ICAgICAgIC8qIGlmIGRvc19kYXRlID09IDAsIHRtdV9kYXRlIGlzIHVzZWQgICAgICAqLwotLyogICAgdUxvbmcgICAgICAgZmxhZzsgICAgICAgICovICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovCi0KLSAgICB1TG9uZyAgICAgICBpbnRlcm5hbF9mYTsgICAgLyogaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgICAgICAgZXh0ZXJuYWxfZmE7ICAgIC8qIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgNCBieXRlcyAqLwotfSB6aXBfZmlsZWluZm87Ci0KLXR5cGVkZWYgY29uc3QgY2hhciogemlwY2hhcnBjOwotCi0KLSNkZWZpbmUgQVBQRU5EX1NUQVRVU19DUkVBVEUgICAgICAgICgwKQotI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSICAgKDEpCi0jZGVmaW5lIEFQUEVORF9TVEFUVVNfQURESU5aSVAgICAgICAoMikKLQotZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGFwcGVuZCkpOwotLyoKLSAgQ3JlYXRlIGEgemlwZmlsZS4KLSAgICAgcGF0aG5hbWUgY29udGFpbiBvbiBXaW5kb3dzIFhQIGEgZmlsZW5hbWUgbGlrZSAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbgotICAgICAgIGFuIFVuaXggY29tcHV0ZXIgInpsaWIvemxpYjExMy56aXAiLgotICAgICBpZiB0aGUgZmlsZSBwYXRobmFtZSBleGlzdCBhbmQgYXBwZW5kPT1BUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSLCB0aGUgemlwCi0gICAgICAgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICAgICAodXNlZnVsIGlmIHRoZSBmaWxlIGNvbnRhaW4gYSBzZWxmIGV4dHJhY3RvciBjb2RlKQotICAgICBpZiB0aGUgZmlsZSBwYXRobmFtZSBleGlzdCBhbmQgYXBwZW5kPT1BUFBFTkRfU1RBVFVTX0FERElOWklQLCB3ZSB3aWxsCi0gICAgICAgYWRkIGZpbGVzIGluIGV4aXN0aW5nIHppcCAoYmUgc3VyZSB5b3UgZG9uJ3QgYWRkIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0KQotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCi0gICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB6aXBGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KLSAgICAgICBvZiB0aGlzIHppcCBwYWNrYWdlLgotKi8KLQotLyogTm90ZSA6IHRoZXJlIGlzIG5vIGRlbGV0ZSBmdW5jdGlvbiBpbnRvIGEgemlwZmlsZS4KLSAgIElmIHlvdSB3YW50IGRlbGV0ZSBmaWxlIGludG8gYSB6aXBmaWxlLCB5b3UgbXVzdCBvcGVuIGEgemlwZmlsZSwgYW5kIGNyZWF0ZSBhbm90aGVyCi0gICBPZiBjb3VzZSwgeW91IGNhbiB1c2UgUkFXIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gY29weSB0aGUgZmlsZSB5b3UgZGlkIG5vdCB3YW50IGRlbHRlCi0qLwotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4yIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7Ci0vKgotICBPcGVuIGEgZmlsZSBpbiB0aGUgWklQIGZvciB3cml0aW5nLgotICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBpbiB6aXAgKGlmIE5VTEwsICctJyB3aXRob3V0IHF1b3RlIHdpbGwgYmUgdXNlZAotICAqemlwZmkgY29udGFpbiBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24KLSAgaWYgZXh0cmFmaWVsZF9sb2NhbCE9TlVMTCBhbmQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsPjAsIGV4dHJhZmllbGRfbG9jYWwKLSAgICBjb250YWlucyB0aGUgZXh0cmFmaWVsZCBkYXRhIHRoZSB0aGUgbG9jYWwgaGVhZGVyCi0gIGlmIGV4dHJhZmllbGRfZ2xvYmFsIT1OVUxMIGFuZCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsPjAsIGV4dHJhZmllbGRfZ2xvYmFsCi0gICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcgotICBpZiBjb21tZW50ICE9IE5VTEwsIGNvbW1lbnQgY29udGFpbiB0aGUgY29tbWVudCBzdHJpbmcKLSAgbWV0aG9kIGNvbnRhaW4gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAoMCBmb3Igc3RvcmUsIFpfREVGTEFURUQgZm9yIGRlZmxhdGUpCi0gIGxldmVsIGNvbnRhaW4gdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIChjYW4gYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQotKi8KLQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDIgT0YoKHppcEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsKLQotLyoKLSAgU2FtZSB0aGFuIHppcE9wZW5OZXdGaWxlSW5aaXAsIGV4Y2VwdCBpZiByYXc9MSwgd2Ugd3JpdGUgcmF3IGZpbGUKLSAqLwotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDMgT0YoKHppcEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVtTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNyY0ZvckN0eXB0aW5nKSk7Ci0KLS8qCi0gIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwMiwgZXhjZXB0Ci0gICAgd2luZG93Qml0cyxtZW1MZXZlbCwsc3RyYXRlZ3kgOiBzZWUgcGFyYW1ldGVyIHN0cmF0ZWd5IGluIGRlZmxhdGVJbml0MgotICAgIHBhc3N3b3JkIDogY3J5cHRpbmcgcGFzc3dvcmQgKE5VTEwgZm9yIG5vIGNyeXB0aW5nKQotICAgIGNyY0ZvckN0eXB0aW5nIDogY3JjIG9mIGZpbGUgdG8gY29tcHJlc3MgKG5lZWRlZCBmb3IgY3J5cHRpbmcpCi0gKi8KLQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgV3JpdGUgZGF0YSBpbiB0aGUgemlwZmlsZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUpKTsKLS8qCi0gIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1bmNvbXByZXNzZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjMzIpKTsKLS8qCi0gIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUsIGZvciBmaWVsIG9wZW5lZCB3aXRoCi0gICAgcGFyYW1ldGVyIHJhdz0xIGluIHppcE9wZW5OZXdGaWxlSW5aaXAyCi0gIHVuY29tcHJlc3NlZF9zaXplIGFuZCBjcmMzMiBhcmUgdmFsdWUgZm9yIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2xvYmFsX2NvbW1lbnQpKTsKLS8qCi0gIENsb3NlIHRoZSB6aXBmaWxlCi0qLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX3ppcF9IICovCisvKiB6aXAuaCAtLSBJTyBmb3IgY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliDQorICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQ0KKw0KKyAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50DQorDQorICAgVGhpcyB1bnppcCBwYWNrYWdlIGFsbG93IGNyZWF0ZXMgLlpJUCBmaWxlLCBjb21wYXRpYmxlIHdpdGggUEtaaXAgMi4wNGcNCisgICAgIFdpblppcCwgSW5mb1ppcCB0b29scyBhbmQgY29tcGF0aWJsZS4NCisgICBNdWx0aSB2b2x1bWUgWmlwRmlsZSAoc3BhbikgYXJlIG5vdCBzdXBwb3J0ZWQuDQorICAgRW5jcnlwdGlvbiBjb21wYXRpYmxlIHdpdGggcGt6aXAgMi4wNGcgb25seSBzdXBwb3J0ZWQNCisgICBPbGQgY29tcHJlc3Npb25zIHVzZWQgYnkgb2xkIFBLWmlwIDEueCBhcmUgbm90IHN1cHBvcnRlZA0KKw0KKyAgRm9yIHVuY29tcHJlc3MgLnppcCBmaWxlLCBsb29rIGF0IHVuemlwLmgNCisNCisNCisgICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQ0KKyAgIFZpc2l0IGFsc28gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sIGZvciBldm9sdXRpb24NCisNCisgICBDb25kaXRpb24gb2YgdXNlIGFuZCBkaXN0cmlidXRpb24gYXJlIHRoZSBzYW1lIHRoYW4gemxpYiA6DQorDQorICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCisNCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLA0KKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOg0KKw0KKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCisNCisNCisqLw0KKw0KKy8qIGZvciBtb3JlIGluZm8gYWJvdXQgLlpJUCBmb3JtYXQsIHNlZQ0KKyAgICAgIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2RvYy9hcHBub3RlLTk4MTExOS1pei56aXANCisgICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvDQorICAgUGtXYXJlIGhhcyBhbHNvIGEgc3BlY2lmaWNhdGlvbiBhdCA6DQorICAgICAgZnRwOi8vZnRwLnBrd2FyZS5jb20vcHJvYmRlc2MuemlwDQorKi8NCisNCisjaWZuZGVmIF96aXBfSA0KKyNkZWZpbmUgX3ppcF9IDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorI2lmbmRlZiBfWkxJQl9IDQorI2luY2x1ZGUgInpsaWIuaCINCisjZW5kaWYNCisNCisjaWZuZGVmIF9aTElCSU9BUElfSA0KKyNpbmNsdWRlICJpb2FwaS5oIg0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFNUUklDVFpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkNCisvKiBsaWtlIHRoZSBTVFJJQ1Qgb2YgV0lOMzIsIHdlIGRlZmluZSBhIHBvaW50ZXIgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkDQorICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8NCit0eXBlZGVmIHN0cnVjdCBUYWd6aXBGaWxlX18geyBpbnQgdW51c2VkOyB9IHppcEZpbGVfXzsNCit0eXBlZGVmIHppcEZpbGVfXyAqemlwRmlsZTsNCisjZWxzZQ0KK3R5cGVkZWYgdm9pZHAgemlwRmlsZTsNCisjZW5kaWYNCisNCisjZGVmaW5lIFpJUF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDApDQorI2RlZmluZSBaSVBfRU9GICAgICAgICAgICAgICAgICAgICAgICAgICgwKQ0KKyNkZWZpbmUgWklQX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykNCisjZGVmaW5lIFpJUF9QQVJBTUVSUk9SICAgICAgICAgICAgICAgICAgKC0xMDIpDQorI2RlZmluZSBaSVBfQkFEWklQRklMRSAgICAgICAgICAgICAgICAgICgtMTAzKQ0KKyNkZWZpbmUgWklQX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkNCisNCisjaWZuZGVmIERFRl9NRU1fTEVWRUwNCisjICBpZiBNQVhfTUVNX0xFVkVMID49IDgNCisjICAgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgNCisjICBlbHNlDQorIyAgICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTA0KKyMgIGVuZGlmDQorI2VuZGlmDQorLyogZGVmYXVsdCBtZW1MZXZlbCAqLw0KKw0KKy8qIHRtX3ppcCBjb250YWluIGRhdGUvdGltZSBpbmZvICovDQordHlwZWRlZiBzdHJ1Y3QgdG1femlwX3MNCit7DQorICAgIHVJbnQgdG1fc2VjOyAgICAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLw0KKyAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovDQorICAgIHVJbnQgdG1faG91cjsgICAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovDQorICAgIHVJbnQgdG1fbWRheTsgICAgICAgICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8NCisgICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8NCisgICAgdUludCB0bV95ZWFyOyAgICAgICAgICAgLyogeWVhcnMgLSBbMTk4MC4uMjA0NF0gKi8NCit9IHRtX3ppcDsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdG1femlwICAgICAgdG16X2RhdGU7ICAgICAgIC8qIGRhdGUgaW4gdW5kZXJzdGFuZGFibGUgZm9ybWF0ICAgICAgICAgICAqLw0KKyAgICB1TG9uZyAgICAgICBkb3NEYXRlOyAgICAgICAvKiBpZiBkb3NfZGF0ZSA9PSAwLCB0bXVfZGF0ZSBpcyB1c2VkICAgICAgKi8NCisvKiAgICB1TG9uZyAgICAgICBmbGFnOyAgICAgICAgKi8gICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8NCisNCisgICAgdUxvbmcgICAgICAgaW50ZXJuYWxfZmE7ICAgIC8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgMiBieXRlcyAqLw0KKyAgICB1TG9uZyAgICAgICBleHRlcm5hbF9mYTsgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovDQorfSB6aXBfZmlsZWluZm87DQorDQordHlwZWRlZiBjb25zdCBjaGFyKiB6aXBjaGFycGM7DQorDQorDQorI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURSAgICAgICAgKDApDQorI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSICAgKDEpDQorI2RlZmluZSBBUFBFTkRfU1RBVFVTX0FERElOWklQICAgICAgKDIpDQorDQorZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGFwcGVuZCkpOw0KKy8qDQorICBDcmVhdGUgYSB6aXBmaWxlLg0KKyAgICAgcGF0aG5hbWUgY29udGFpbiBvbiBXaW5kb3dzIFhQIGEgZmlsZW5hbWUgbGlrZSAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbg0KKyAgICAgICBhbiBVbml4IGNvbXB1dGVyICJ6bGliL3psaWIxMTMuemlwIi4NCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIsIHRoZSB6aXANCisgICAgICAgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuDQorICAgICAgICAgKHVzZWZ1bCBpZiB0aGUgZmlsZSBjb250YWluIGEgc2VsZiBleHRyYWN0b3IgY29kZSkNCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQURESU5aSVAsIHdlIHdpbGwNCisgICAgICAgYWRkIGZpbGVzIGluIGV4aXN0aW5nIHppcCAoYmUgc3VyZSB5b3UgZG9uJ3QgYWRkIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0KQ0KKyAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBOVUxMLg0KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHppcEZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbg0KKyAgICAgICBvZiB0aGlzIHppcCBwYWNrYWdlLg0KKyovDQorDQorLyogTm90ZSA6IHRoZXJlIGlzIG5vIGRlbGV0ZSBmdW5jdGlvbiBpbnRvIGEgemlwZmlsZS4NCisgICBJZiB5b3Ugd2FudCBkZWxldGUgZmlsZSBpbnRvIGEgemlwZmlsZSwgeW91IG11c3Qgb3BlbiBhIHppcGZpbGUsIGFuZCBjcmVhdGUgYW5vdGhlcg0KKyAgIE9mIGNvdXNlLCB5b3UgY2FuIHVzZSBSQVcgcmVhZGluZyBhbmQgd3JpdGluZyB0byBjb3B5IHRoZSBmaWxlIHlvdSBkaWQgbm90IHdhbnQgZGVsdGUNCisqLw0KKw0KK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsNCisNCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwNCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkpOw0KKy8qDQorICBPcGVuIGEgZmlsZSBpbiB0aGUgWklQIGZvciB3cml0aW5nLg0KKyAgZmlsZW5hbWUgOiB0aGUgZmlsZW5hbWUgaW4gemlwIChpZiBOVUxMLCAnLScgd2l0aG91dCBxdW90ZSB3aWxsIGJlIHVzZWQNCisgICp6aXBmaSBjb250YWluIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbg0KKyAgaWYgZXh0cmFmaWVsZF9sb2NhbCE9TlVMTCBhbmQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsPjAsIGV4dHJhZmllbGRfbG9jYWwNCisgICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcg0KKyAgaWYgZXh0cmFmaWVsZF9nbG9iYWwhPU5VTEwgYW5kIHNpemVfZXh0cmFmaWVsZF9nbG9iYWw+MCwgZXh0cmFmaWVsZF9nbG9iYWwNCisgICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcg0KKyAgaWYgY29tbWVudCAhPSBOVUxMLCBjb21tZW50IGNvbnRhaW4gdGhlIGNvbW1lbnQgc3RyaW5nDQorICBtZXRob2QgY29udGFpbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kICgwIGZvciBzdG9yZSwgWl9ERUZMQVRFRCBmb3IgZGVmbGF0ZSkNCisgIGxldmVsIGNvbnRhaW4gdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIChjYW4gYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQ0KKyovDQorDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyIE9GKCh6aXBGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOw0KKw0KKy8qDQorICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcCwgZXhjZXB0IGlmIHJhdz0xLCB3ZSB3cml0ZSByYXcgZmlsZQ0KKyAqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyBPRigoemlwRmlsZSBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3R5cHRpbmcpKTsNCisNCisvKg0KKyAgU2FtZSB0aGFuIHppcE9wZW5OZXdGaWxlSW5aaXAyLCBleGNlcHQNCisgICAgd2luZG93Qml0cyxtZW1MZXZlbCwsc3RyYXRlZ3kgOiBzZWUgcGFyYW1ldGVyIHN0cmF0ZWd5IGluIGRlZmxhdGVJbml0Mg0KKyAgICBwYXNzd29yZCA6IGNyeXB0aW5nIHBhc3N3b3JkIChOVUxMIGZvciBubyBjcnlwdGluZykNCisgICAgY3JjRm9yQ3R5cHRpbmcgOiBjcmMgb2YgZmlsZSB0byBjb21wcmVzcyAobmVlZGVkIGZvciBjcnlwdGluZykNCisgKi8NCisNCisNCitleHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7DQorLyoNCisgIFdyaXRlIGRhdGEgaW4gdGhlIHppcGZpbGUNCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcCBPRigoemlwRmlsZSBmaWxlKSk7DQorLyoNCisgIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUNCisqLw0KKw0KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyBPRigoemlwRmlsZSBmaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmMzMikpOw0KKy8qDQorICBDbG9zZSB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlLCBmb3IgZmllbCBvcGVuZWQgd2l0aA0KKyAgICBwYXJhbWV0ZXIgcmF3PTEgaW4gemlwT3Blbk5ld0ZpbGVJblppcDINCisgIHVuY29tcHJlc3NlZF9zaXplIGFuZCBjcmMzMiBhcmUgdmFsdWUgZm9yIHRoZSB1bmNvbXByZXNzZWQgc2l6ZQ0KKyovDQorDQorZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlIE9GKCh6aXBGaWxlIGZpbGUsDQorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdsb2JhbF9jb21tZW50KSk7DQorLyoNCisgIENsb3NlIHRoZSB6aXBmaWxlDQorKi8NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmIC8qIF96aXBfSCAqLw0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHpsaWIvcmR0c2M2NC5hc20gYi9jb250cmliL3Rlc3R6bGliL3JkdHNjNjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzhhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3Rlc3R6bGliL3JkdHNjNjQuYXNtCkBAIC0wLDAgKzEsMTggQEAKKzsgcmR0c2M2NC5hc20NCis7DQorOyB1bnNpZ25lZCBfaW50NjQgbXlyZHRzYygpOw0KKzsNCis7IHJldHVybiB0aGUgcGVyZm9ybWFuY2UgcmR0c2MgdmFsdWUsIG9uIEFNRDY0L0ludGVsIEVNNjRUDQorOw0KKzsgY29tcGlsZSB3aXRoIDoNCis7ICAgIG1sNjQuZXhlIiAvRmxyZHRzYzY0ICAgL2MgL1ppIHJkdHNjNjQuYXNtDQorOw0KKy5jb2RlDQorbXlyZHRzYyBQUk9DDQorICAgICAgICAgIHJkdHNjDQorICAgICAgICAgIHNobCByZHgsMzINCisgICAgICAgICAgb3IgcmF4LHJkeA0KKyAgICAgICAgICByZXQNCitteXJkdHNjIEVORFANCisNCitFTkQNCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3R6bGliL3JkdHNjNjQub2JqIGIvY29udHJpYi90ZXN0emxpYi9yZHRzYzY0Lm9iagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA1MTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90ZXN0emxpYi9yZHRzYzY0Lm9iagpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMgYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMKaW5kZXggZmRhYmM1Yy4uNmMzZmY5ZiAxMDA2NDQKLS0tIGEvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCisrKyBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIuYwpAQCAtMSwxNDkgKzEsMjU4IEBACi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLWludCBSZWFkRmlsZU1lbW9yeShjb25zdCBjaGFyKiBmaWxlbmFtZSxsb25nKiBwbEZpbGVTaXplLHZvaWQqKiBwRmlsZVB0cikKLXsKLSAgICBGSUxFKiBzdHJlYW07Ci0gICAgdm9pZCogcHRyOwotICAgIGludCByZXRWYWw9MTsKLSAgICBzdHJlYW09Zm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICAgIGlmIChzdHJlYW09PU5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZnNlZWsoc3RyZWFtLDAsU0VFS19FTkQpOwotCi0gICAgKnBsRmlsZVNpemU9ZnRlbGwoc3RyZWFtKTsKLSAgICBmc2VlayhzdHJlYW0sMCxTRUVLX1NFVCk7Ci0gICAgcHRyPW1hbGxvYygoKnBsRmlsZVNpemUpKzEpOwotICAgIGlmIChwdHI9PU5VTEwpCi0gICAgICAgIHJldFZhbD0wOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmcmVhZChwdHIsIDEsICpwbEZpbGVTaXplLHN0cmVhbSkgIT0gKCpwbEZpbGVTaXplKSkKLSAgICAgICAgICAgIHJldFZhbD0wOwotICAgIH0KLSAgICBmY2xvc2Uoc3RyZWFtKTsKLSAgICAqcEZpbGVQdHI9cHRyOwotICAgIHJldHVybiByZXRWYWw7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgaW50IEJsb2NrU2l6ZUNvbXByZXNzPTB4ODAwMDsKLSAgICBpbnQgQmxvY2tTaXplVW5jb21wcmVzcz0weDgwMDA7Ci0gICAgaW50IGNwckxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiA7Ci0gICAgbG9uZyBsRmlsZVNpemU7Ci0gICAgdW5zaWduZWQgY2hhciogRmlsZVB0cjsKLSAgICBsb25nIGxCdWZmZXJTaXplQ3ByOwotICAgIGxvbmcgbEJ1ZmZlclNpemVVbmNwcjsKLSAgICBsb25nIGxDb21wcmVzc2VkU2l6ZT0wOwotICAgIHVuc2lnbmVkIGNoYXIqIENwclB0cjsKLSAgICB1bnNpZ25lZCBjaGFyKiBVbmNwclB0cjsKLSAgICBsb25nIGxTaXplQ3ByLGxTaXplVW5jcHI7Ci0gICAgRFdPUkQgZHdHZXRUaWNrOwotCi0gICAgaWYgKGFyZ2M8PTEpCi0gICAgewotICAgICAgICBwcmludGYoInJ1biBUZXN0WmxpYiA8RmlsZT4gW0Jsb2NrU2l6ZUNvbXByZXNzXSBbQmxvY2tTaXplVW5jb21wcmVzc10gW2NvbXByZXMuIGxldmVsXVxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChSZWFkRmlsZU1lbW9yeShhcmd2WzFdLCZsRmlsZVNpemUsJkZpbGVQdHIpPT0wKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJlcnJvciByZWFkaW5nICVzXG4iLGFyZ3ZbMV0pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBwcmludGYoImZpbGUgJXMgcmVhZCwgJXUgYnl0ZXNcbiIsYXJndlsxXSxsRmlsZVNpemUpOwotCi0gICAgaWYgKGFyZ2M+PTMpCi0gICAgICAgIEJsb2NrU2l6ZUNvbXByZXNzPWF0b2woYXJndlsyXSk7Ci0KLSAgICBpZiAoYXJnYz49NCkKLSAgICAgICAgQmxvY2tTaXplVW5jb21wcmVzcz1hdG9sKGFyZ3ZbM10pOwotCi0gICAgaWYgKGFyZ2M+PTUpCi0gICAgICAgIGNwckxldmVsPShpbnQpYXRvbChhcmd2WzRdKTsKLQotICAgIGxCdWZmZXJTaXplQ3ByID0gbEZpbGVTaXplICsgKGxGaWxlU2l6ZS8weDEwKSArIDB4MjAwOwotICAgIGxCdWZmZXJTaXplVW5jcHIgPSBsQnVmZmVyU2l6ZUNwcjsKLQotICAgIENwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplQ3ByICsgQmxvY2tTaXplQ29tcHJlc3MpOwotICAgIFVuY3ByUHRyPSh1bnNpZ25lZCBjaGFyKiltYWxsb2MobEJ1ZmZlclNpemVVbmNwciArIEJsb2NrU2l6ZVVuY29tcHJlc3MpOwotCi0gICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOwotICAgIHsKLSAgICAgICAgel9zdHJlYW0gemNwcjsKLSAgICAgICAgaW50IHJldD1aX09LOwotICAgICAgICBsb25nIGxPcmlnVG9EbyA9IGxGaWxlU2l6ZTsKLSAgICAgICAgbG9uZyBsT3JpZ0RvbmUgPSAwOwotICAgICAgICBpbnQgc3RlcD0wOwotICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsKLSAgICAgICAgZGVmbGF0ZUluaXQoJnpjcHIsY3ByTGV2ZWwpOwotCi0gICAgICAgIHpjcHIubmV4dF9pbiA9IEZpbGVQdHI7Ci0gICAgICAgIHpjcHIubmV4dF9vdXQgPSBDcHJQdHI7Ci0KLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGFsbF9yZWFkX2JlZm9yZSA9IHpjcHIudG90YWxfaW47Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX2luID0gbWluKGxPcmlnVG9EbyxCbG9ja1NpemVDb21wcmVzcyk7Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZUNvbXByZXNzOwotICAgICAgICAgICAgcmV0PWRlZmxhdGUoJnpjcHIsKHpjcHIuYXZhaWxfaW49PWxPcmlnVG9EbykgPyBaX0ZJTklTSCA6IFpfU1lOQ19GTFVTSCk7Ci0gICAgICAgICAgICBsT3JpZ0RvbmUgKz0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsKLSAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOwotICAgICAgICAgICAgc3RlcCsrOwotICAgICAgICB9IHdoaWxlIChyZXQ9PVpfT0spOwotCi0gICAgICAgIGxTaXplQ3ByPXpjcHIudG90YWxfb3V0OwotICAgICAgICBkZWZsYXRlRW5kKCZ6Y3ByKTsKLSAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsKLSAgICAgICAgcHJpbnRmKCJ0b3RhbCBjb21wcmVzcyBzaXplID0gJXUsIGluICV1IHN0ZXBcbiIsbFNpemVDcHIsc3RlcCk7Ci0gICAgICAgIHByaW50ZigidGltZSA9ICV1IG1zZWMgPSAlZiBzZWNcblxuIixkd0dldFRpY2ssZHdHZXRUaWNrLyhkb3VibGUpMTAwMC4pOwotICAgIH0KLQotICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKTsKLSAgICB7Ci0gICAgICAgIHpfc3RyZWFtIHpjcHI7Ci0gICAgICAgIGludCByZXQ9Wl9PSzsKLSAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsU2l6ZUNwcjsKLSAgICAgICAgbG9uZyBsT3JpZ0RvbmUgPSAwOwotICAgICAgICBpbnQgc3RlcD0wOwotICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsKLSAgICAgICAgaW5mbGF0ZUluaXQoJnpjcHIpOwotCi0gICAgICAgIHpjcHIubmV4dF9pbiA9IENwclB0cjsKLSAgICAgICAgemNwci5uZXh0X291dCA9IFVuY3ByUHRyOwotCi0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOwotICAgICAgICAgICAgemNwci5hdmFpbF9pbiA9IG1pbihsT3JpZ1RvRG8sQmxvY2tTaXplVW5jb21wcmVzcyk7Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZVVuY29tcHJlc3M7Ci0gICAgICAgICAgICByZXQ9aW5mbGF0ZSgmemNwcixaX1NZTkNfRkxVU0gpOwotICAgICAgICAgICAgbE9yaWdEb25lICs9ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7Ci0gICAgICAgICAgICBsT3JpZ1RvRG8gLT0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsKLSAgICAgICAgICAgIHN0ZXArKzsKLSAgICAgICAgfSB3aGlsZSAocmV0PT1aX09LKTsKLQotICAgICAgICBsU2l6ZVVuY3ByPXpjcHIudG90YWxfb3V0OwotICAgICAgICBpbmZsYXRlRW5kKCZ6Y3ByKTsKLSAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsKLSAgICAgICAgcHJpbnRmKCJ0b3RhbCB1bmNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZVVuY3ByLHN0ZXApOwotICAgICAgICBwcmludGYoInRpbWUgPSAldSBtc2VjID0gJWYgc2VjXG5cbiIsZHdHZXRUaWNrLGR3R2V0VGljay8oZG91YmxlKTEwMDAuKTsKLSAgICB9Ci0KLSAgICBpZiAobFNpemVVbmNwcj09bEZpbGVTaXplKQotICAgIHsKLSAgICAgICAgaWYgKG1lbWNtcChGaWxlUHRyLFVuY3ByUHRyLGxGaWxlU2l6ZSk9PTApCi0gICAgICAgICAgICBwcmludGYoImNvbXBhcmUgb2tcbiIpOwotCi0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0KLX0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlICJ6bGliLmgiDQorDQorDQordm9pZCBNeURvTWludXM2NChMQVJHRV9JTlRFR0VSICpSLExBUkdFX0lOVEVHRVIgQSxMQVJHRV9JTlRFR0VSIEIpDQorew0KKyAgICBSLT5IaWdoUGFydCA9IEEuSGlnaFBhcnQgLSBCLkhpZ2hQYXJ0Ow0KKyAgICBpZiAoQS5Mb3dQYXJ0ID49IEIuTG93UGFydCkNCisgICAgICAgIFItPkxvd1BhcnQgPSBBLkxvd1BhcnQgLSBCLkxvd1BhcnQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgUi0+TG93UGFydCA9IEEuTG93UGFydCAtIEIuTG93UGFydDsNCisgICAgICAgIFItPkhpZ2hQYXJ0IC0tOw0KKyAgICB9DQorfQ0KKw0KKyNpZmRlZiBfQU1ENjRfDQordW5zaWduZWQgX2ludDY0IG15cmR0c2MoKTsNCit2b2lkIEJlZ2luQ291bnRSZHRzYyhMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQ0KK3sNCisgLy8gICBwcmludGYoInJkdHNjID0gJUk2NHhcbiIsbXlyZHRzYygpKTsNCisgICBwYmVnaW5UaW1lNjQtPlF1YWRQYXJ0PW15cmR0c2MoKTsNCit9DQorDQorTEFSR0VfSU5URUdFUiBHZXRSZXNSZHRzYyhMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQ0KK3sNCisgICAgTEFSR0VfSU5URUdFUiBMSXJlczsNCisgICAgdW5zaWduZWQgX2ludDY0IHJlcz1teXJkdHNjKCktKCh1bnNpZ25lZCBfaW50NjQpKGJlZ2luVGltZTY0LlF1YWRQYXJ0KSk7DQorICAgIExJcmVzLlF1YWRQYXJ0PXJlczsNCisgICAvLyBwcmludGYoInJkdHNjID0gJUk2NHhcbiIsbXlyZHRzYygpKTsNCisgICAgcmV0dXJuIExJcmVzOw0KK30NCisjZWxzZQ0KK3ZvaWQgbXlHZXRSRFRTQzMyKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpDQorew0KKyAgICBEV09SRCBkd0VkeCxkd0VheDsNCisgICAgX2FzbQ0KKyAgICB7DQorICAgICAgICByZHRzYw0KKyAgICAgICAgbW92IGR3RWF4LGVheA0KKyAgICAgICAgbW92IGR3RWR4LGVkeA0KKyAgICB9DQorICAgIHBiZWdpblRpbWU2NC0+TG93UGFydD1kd0VheDsNCisgICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydD1kd0VkeDsNCit9DQorDQordm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorICAgIG15R2V0UkRUU0MzMihwYmVnaW5UaW1lNjQpOw0KK30NCisNCitMQVJHRV9JTlRFR0VSIEdldFJlc1JkdHNjKExBUkdFX0lOVEVHRVIgYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpDQorew0KKyAgICBMQVJHRV9JTlRFR0VSIExJcmVzLGVuZFRpbWU2NDsNCisgICAgbXlHZXRSRFRTQzMyKCZlbmRUaW1lNjQpOw0KKw0KKyAgICBMSXJlcy5Mb3dQYXJ0PUxJcmVzLkhpZ2hQYXJ0PTA7DQorICAgIE15RG9NaW51czY0KCZMSXJlcyxlbmRUaW1lNjQsYmVnaW5UaW1lNjQpOw0KKyAgICByZXR1cm4gTElyZXM7DQorfQ0KKyNlbmRpZg0KKw0KKw0KK3ZvaWQgQmVnaW5Db3VudFBlcmZDb3VudGVyKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpDQorew0KKyAgICBpZiAoKCFmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpIHx8ICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIocGJlZ2luVGltZTY0KSkpDQorICAgIHsNCisgICAgICAgIHBiZWdpblRpbWU2NC0+TG93UGFydCA9IEdldFRpY2tDb3VudCgpOw0KKyAgICAgICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydCA9IDA7DQorICAgIH0NCit9DQorDQorRFdPUkQgR2V0TXNlY1NpbmNlUGVyZkNvdW50ZXIoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIExBUkdFX0lOVEVHRVIgZW5kVGltZTY0LHRpY2tzUGVyU2Vjb25kLHRpY2tzOw0KKyAgICBEV09SRExPTkcgdGlja3NTaGlmdGVkLHRpY2tTZWNTaGlmdGVkOw0KKyAgICBEV09SRCBkd0xvZz0xNiswOw0KKyAgICBEV09SRCBkd1JldDsNCisgICAgaWYgKCghZkNvbXB1dGVUaW1lUXVlcnlQZXJmKSB8fCAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZlbmRUaW1lNjQpKSkNCisgICAgICAgIGR3UmV0ID0gKEdldFRpY2tDb3VudCgpIC0gYmVnaW5UaW1lNjQuTG93UGFydCkqMTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBNeURvTWludXM2NCgmdGlja3MsZW5kVGltZTY0LGJlZ2luVGltZTY0KTsNCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJnRpY2tzUGVyU2Vjb25kKTsNCisNCisgICAgDQorICAgICAgICB7DQorICAgICAgICAgICAgdGlja3NTaGlmdGVkID0gSW50NjRTaHJsTW9kMzIoKihEV09SRExPTkcqKSZ0aWNrcyxkd0xvZyk7DQorICAgICAgICAgICAgdGlja1NlY1NoaWZ0ZWQgPSBJbnQ2NFNocmxNb2QzMigqKERXT1JETE9ORyopJnRpY2tzUGVyU2Vjb25kLGR3TG9nKTsNCisgICAgICAgIA0KKyAgICAgICAgfSANCisNCisgICAgICAgIGR3UmV0ID0gKERXT1JEKSgoKChEV09SRCl0aWNrc1NoaWZ0ZWQpKjEwMDApLyhEV09SRCkodGlja1NlY1NoaWZ0ZWQpKTsNCisgICAgICAgIGR3UmV0ICo9MTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZXQ7DQorfQ0KKw0KK2ludCBSZWFkRmlsZU1lbW9yeShjb25zdCBjaGFyKiBmaWxlbmFtZSxsb25nKiBwbEZpbGVTaXplLHZvaWQqKiBwRmlsZVB0cikNCit7DQorICAgIEZJTEUqIHN0cmVhbTsNCisgICAgdm9pZCogcHRyOw0KKyAgICBpbnQgcmV0VmFsPTE7DQorICAgIHN0cmVhbT1mb3BlbihmaWxlbmFtZSwgInJiIik7DQorICAgIGlmIChzdHJlYW09PU5VTEwpDQorICAgICAgICByZXR1cm4gMDsNCisNCisgICAgZnNlZWsoc3RyZWFtLDAsU0VFS19FTkQpOw0KKw0KKyAgICAqcGxGaWxlU2l6ZT1mdGVsbChzdHJlYW0pOw0KKyAgICBmc2VlayhzdHJlYW0sMCxTRUVLX1NFVCk7DQorICAgIHB0cj1tYWxsb2MoKCpwbEZpbGVTaXplKSsxKTsNCisgICAgaWYgKHB0cj09TlVMTCkNCisgICAgICAgIHJldFZhbD0wOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmIChmcmVhZChwdHIsIDEsICpwbEZpbGVTaXplLHN0cmVhbSkgIT0gKCpwbEZpbGVTaXplKSkNCisgICAgICAgICAgICByZXRWYWw9MDsNCisgICAgfQ0KKyAgICBmY2xvc2Uoc3RyZWFtKTsNCisgICAgKnBGaWxlUHRyPXB0cjsNCisgICAgcmV0dXJuIHJldFZhbDsNCit9DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCit7DQorICAgIGludCBCbG9ja1NpemVDb21wcmVzcz0weDgwMDA7DQorICAgIGludCBCbG9ja1NpemVVbmNvbXByZXNzPTB4ODAwMDsNCisgICAgaW50IGNwckxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiA7DQorICAgIGxvbmcgbEZpbGVTaXplOw0KKyAgICB1bnNpZ25lZCBjaGFyKiBGaWxlUHRyOw0KKyAgICBsb25nIGxCdWZmZXJTaXplQ3ByOw0KKyAgICBsb25nIGxCdWZmZXJTaXplVW5jcHI7DQorICAgIGxvbmcgbENvbXByZXNzZWRTaXplPTA7DQorICAgIHVuc2lnbmVkIGNoYXIqIENwclB0cjsNCisgICAgdW5zaWduZWQgY2hhciogVW5jcHJQdHI7DQorICAgIGxvbmcgbFNpemVDcHIsbFNpemVVbmNwcjsNCisgICAgRFdPUkQgZHdHZXRUaWNrLGR3TXNlY1FQOw0KKyAgICBMQVJHRV9JTlRFR0VSIGxpX3FwLGxpX3JkdHNjLGR3UmVzUmR0c2M7DQorDQorICAgIGlmIChhcmdjPD0xKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoInJ1biBUZXN0WmxpYiA8RmlsZT4gW0Jsb2NrU2l6ZUNvbXByZXNzXSBbQmxvY2tTaXplVW5jb21wcmVzc10gW2NvbXByZXMuIGxldmVsXVxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoUmVhZEZpbGVNZW1vcnkoYXJndlsxXSwmbEZpbGVTaXplLCZGaWxlUHRyKT09MCkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlcnJvciByZWFkaW5nICVzXG4iLGFyZ3ZbMV0pOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgZWxzZSBwcmludGYoImZpbGUgJXMgcmVhZCwgJXUgYnl0ZXNcbiIsYXJndlsxXSxsRmlsZVNpemUpOw0KKw0KKyAgICBpZiAoYXJnYz49MykNCisgICAgICAgIEJsb2NrU2l6ZUNvbXByZXNzPWF0b2woYXJndlsyXSk7DQorDQorICAgIGlmIChhcmdjPj00KQ0KKyAgICAgICAgQmxvY2tTaXplVW5jb21wcmVzcz1hdG9sKGFyZ3ZbM10pOw0KKw0KKyAgICBpZiAoYXJnYz49NSkNCisgICAgICAgIGNwckxldmVsPShpbnQpYXRvbChhcmd2WzRdKTsNCisNCisgICAgbEJ1ZmZlclNpemVDcHIgPSBsRmlsZVNpemUgKyAobEZpbGVTaXplLzB4MTApICsgMHgyMDA7DQorICAgIGxCdWZmZXJTaXplVW5jcHIgPSBsQnVmZmVyU2l6ZUNwcjsNCisNCisgICAgQ3ByUHRyPSh1bnNpZ25lZCBjaGFyKiltYWxsb2MobEJ1ZmZlclNpemVDcHIgKyBCbG9ja1NpemVDb21wcmVzcyk7DQorDQorICAgIEJlZ2luQ291bnRQZXJmQ291bnRlcigmbGlfcXAsVFJVRSk7DQorICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKTsNCisgICAgQmVnaW5Db3VudFJkdHNjKCZsaV9yZHRzYyk7DQorICAgIHsNCisgICAgICAgIHpfc3RyZWFtIHpjcHI7DQorICAgICAgICBpbnQgcmV0PVpfT0s7DQorICAgICAgICBsb25nIGxPcmlnVG9EbyA9IGxGaWxlU2l6ZTsNCisgICAgICAgIGxvbmcgbE9yaWdEb25lID0gMDsNCisgICAgICAgIGludCBzdGVwPTA7DQorICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsNCisgICAgICAgIGRlZmxhdGVJbml0KCZ6Y3ByLGNwckxldmVsKTsNCisNCisgICAgICAgIHpjcHIubmV4dF9pbiA9IEZpbGVQdHI7DQorICAgICAgICB6Y3ByLm5leHRfb3V0ID0gQ3ByUHRyOw0KKw0KKw0KKyAgICAgICAgZG8NCisgICAgICAgIHsNCisgICAgICAgICAgICBsb25nIGFsbF9yZWFkX2JlZm9yZSA9IHpjcHIudG90YWxfaW47DQorICAgICAgICAgICAgemNwci5hdmFpbF9pbiA9IG1pbihsT3JpZ1RvRG8sQmxvY2tTaXplQ29tcHJlc3MpOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfb3V0ID0gQmxvY2tTaXplQ29tcHJlc3M7DQorICAgICAgICAgICAgcmV0PWRlZmxhdGUoJnpjcHIsKHpjcHIuYXZhaWxfaW49PWxPcmlnVG9EbykgPyBaX0ZJTklTSCA6IFpfU1lOQ19GTFVTSCk7DQorICAgICAgICAgICAgbE9yaWdEb25lICs9ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7DQorICAgICAgICAgICAgbE9yaWdUb0RvIC09ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7DQorICAgICAgICAgICAgc3RlcCsrOw0KKyAgICAgICAgfSB3aGlsZSAocmV0PT1aX09LKTsNCisNCisgICAgICAgIGxTaXplQ3ByPXpjcHIudG90YWxfb3V0Ow0KKyAgICAgICAgZGVmbGF0ZUVuZCgmemNwcik7DQorICAgICAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCktZHdHZXRUaWNrOw0KKyAgICAgICAgZHdNc2VjUVA9R2V0TXNlY1NpbmNlUGVyZkNvdW50ZXIobGlfcXAsVFJVRSk7DQorICAgICAgICBkd1Jlc1JkdHNjPUdldFJlc1JkdHNjKGxpX3JkdHNjLFRSVUUpOw0KKyAgICAgICAgcHJpbnRmKCJ0b3RhbCBjb21wcmVzcyBzaXplID0gJXUsIGluICV1IHN0ZXBcbiIsbFNpemVDcHIsc3RlcCk7DQorICAgICAgICBwcmludGYoInRpbWUgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7DQorICAgICAgICBwcmludGYoImRlZmNwciB0aW1lIFFQID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd01zZWNRUCxkd01zZWNRUC8oZG91YmxlKTEwMDAuKTsNCisgICAgICAgIHByaW50ZigiZGVmY3ByIHJlc3VsdCByZHRzYyA9ICVJNjR4XG5cbiIsZHdSZXNSZHRzYy5RdWFkUGFydCk7DQorICAgIH0NCisNCisgICAgQ3ByUHRyPSh1bnNpZ25lZCBjaGFyKilyZWFsbG9jKENwclB0cixsU2l6ZUNwcik7DQorICAgIFVuY3ByUHRyPSh1bnNpZ25lZCBjaGFyKiltYWxsb2MobEJ1ZmZlclNpemVVbmNwciArIEJsb2NrU2l6ZVVuY29tcHJlc3MpOw0KKw0KKyAgICBCZWdpbkNvdW50UGVyZkNvdW50ZXIoJmxpX3FwLFRSVUUpOw0KKyAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCk7DQorICAgIEJlZ2luQ291bnRSZHRzYygmbGlfcmR0c2MpOw0KKyAgICB7DQorICAgICAgICB6X3N0cmVhbSB6Y3ByOw0KKyAgICAgICAgaW50IHJldD1aX09LOw0KKyAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsU2l6ZUNwcjsNCisgICAgICAgIGxvbmcgbE9yaWdEb25lID0gMDsNCisgICAgICAgIGludCBzdGVwPTA7DQorICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsNCisgICAgICAgIGluZmxhdGVJbml0KCZ6Y3ByKTsNCisNCisgICAgICAgIHpjcHIubmV4dF9pbiA9IENwclB0cjsNCisgICAgICAgIHpjcHIubmV4dF9vdXQgPSBVbmNwclB0cjsNCisNCisNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfaW4gPSBtaW4obE9yaWdUb0RvLEJsb2NrU2l6ZVVuY29tcHJlc3MpOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfb3V0ID0gQmxvY2tTaXplVW5jb21wcmVzczsNCisgICAgICAgICAgICByZXQ9aW5mbGF0ZSgmemNwcixaX1NZTkNfRkxVU0gpOw0KKyAgICAgICAgICAgIGxPcmlnRG9uZSArPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIHN0ZXArKzsNCisgICAgICAgIH0gd2hpbGUgKHJldD09Wl9PSyk7DQorDQorICAgICAgICBsU2l6ZVVuY3ByPXpjcHIudG90YWxfb3V0Ow0KKyAgICAgICAgaW5mbGF0ZUVuZCgmemNwcik7DQorICAgICAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCktZHdHZXRUaWNrOw0KKyAgICAgICAgZHdNc2VjUVA9R2V0TXNlY1NpbmNlUGVyZkNvdW50ZXIobGlfcXAsVFJVRSk7DQorICAgICAgICBkd1Jlc1JkdHNjPUdldFJlc1JkdHNjKGxpX3JkdHNjLFRSVUUpOw0KKyAgICAgICAgcHJpbnRmKCJ0b3RhbCB1bmNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZVVuY3ByLHN0ZXApOw0KKyAgICAgICAgcHJpbnRmKCJ0aW1lID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd0dldFRpY2ssZHdHZXRUaWNrLyhkb3VibGUpMTAwMC4pOw0KKyAgICAgICAgcHJpbnRmKCJ1bmNwciAgdGltZSBRUCA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdNc2VjUVAsZHdNc2VjUVAvKGRvdWJsZSkxMDAwLik7DQorICAgICAgICBwcmludGYoInVuY3ByICByZXN1bHQgcmR0c2MgPSAlSTY0eFxuXG4iLGR3UmVzUmR0c2MuUXVhZFBhcnQpOw0KKyAgICB9DQorDQorICAgIGlmIChsU2l6ZVVuY3ByPT1sRmlsZVNpemUpDQorICAgIHsNCisgICAgICAgIGlmIChtZW1jbXAoRmlsZVB0cixVbmNwclB0cixsRmlsZVNpemUpPT0wKQ0KKyAgICAgICAgICAgIHByaW50ZigiY29tcGFyZSBva1xuIik7DQorDQorICAgIH0NCisNCisgICAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0IGIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyNThmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0CkBAIC0wLDAgKzEsMTAgQEAKK1RvIGJ1aWxkIHRlc3R6TGliIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1Og0KKw0KK2NvcHkgdG8gYSBkaXJlY3RvcnkgZmlsZSBmcm9tIDoNCistIHJvb3Qgb2YgekxpYiB0cmVlDQorLSBjb250cmliL3Rlc3R6bGliDQorLSBjb250cmliL21hc214ODYNCistIGNvbnRyaWIvbWFzbXg2NA0KKy0gY29udHJpYi92c3R1ZGlvL3ZjNw0KKw0KK2FuZCBvcGVuIHRlc3R6bGliOC5zbG4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliOC5zbG4gYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliOC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0ZjcyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWI4LnNsbgpAQCAtMCwwICsxLDMyIEBACivvu78NCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDUNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R6bGliOCIsICJ0ZXN0emxpYjgudmNwcm9qIiwgIntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCURlYnVnfFdpbjY0IChBTUQ2NCkgPSBEZWJ1Z3xXaW42NCAoQU1ENjQpDQorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KKwkJUmVsZWFzZXxXaW42NCAoQU1ENjQpID0gUmVsZWFzZXxXaW42NCAoQU1ENjQpDQorCQlSZWxlYXNlQXNtfFdpbjMyID0gUmVsZWFzZUFzbXxXaW4zMg0KKwkJUmVsZWFzZUFzbXxXaW42NCAoQU1ENjQpID0gUmVsZWFzZUFzbXxXaW42NCAoQU1ENjQpDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjY0IChBTUQ2NCkuQWN0aXZlQ2ZnID0gRGVidWd8V2luNjQgKEFNRDY0KQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luNjQgKEFNRDY0KS5CdWlsZC4wID0gRGVidWd8V2luNjQgKEFNRDY0KQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjY0IChBTUQ2NCkuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW42NCAoQU1ENjQpDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjY0IChBTUQ2NCkuQnVpbGQuMCA9IFJlbGVhc2V8V2luNjQgKEFNRDY0KQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZUFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQXNtfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlQXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlQXNtfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlQXNtfFdpbjY0IChBTUQ2NCkuQWN0aXZlQ2ZnID0gUmVsZWFzZUFzbXxXaW42NCAoQU1ENjQpDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlQXNtfFdpbjY0IChBTUQ2NCkuQnVpbGQuMCA9IFJlbGVhc2VBc218V2luNjQgKEFNRDY0KQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWI4LnZjcHJvaiBiL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWI4LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FiNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYjgudmNwcm9qCkBAIC0wLDAgKzEsNjM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOCwwMCINCisJTmFtZT0idGVzdHpsaWI4Ig0KKwlQcm9qZWN0R1VJRD0ie0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0iDQorCUtleXdvcmQ9IldpbjMyUHJvaiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luNjQgKEFNRDY0KSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwkJPERlZmF1bHRUb29sRmlsZQ0KKwkJCUZpbGVOYW1lPSJtYXNtLnRvb2wiDQorCQkvPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9Ik1BU00iDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJUUlVFIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSI0Ig0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZ3ZtYXQzMi5vYmogaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luNjQgKEFNRDY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImFtZDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjRcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJNQVNNIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iQVNNVjtBU01JTkY7V0lOMzI7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJTWluaW1hbFJlYnVpbGQ9IlRSVUUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjQiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJndm1hdDY0Lm9iaiBpbmZmYXN4NjQub2JqIHJkdHNjNjQub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iTUFTTSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9IlRSVUUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luNjQgKEFNRDY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImFtZDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjRcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJNQVNNIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9IlRSVUUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0icmR0c2M2NC5vYmoiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBc218V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJNQVNNIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0iVFJVRSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJndm1hdDMyLm9iaiBpbmZmYXMzMi5vYmoiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlQXNtfFdpbjY0IChBTUQ2NCkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJhbWQ2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iTUFTTSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJUUlVFIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iQVNNVjtBU01JTkY7V0lOMzI7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSI0Ig0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iVFJVRSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZ3ZtYXQ2NC5vYmogaW5mZmFzeDY0Lm9iaiByZHRzYzY0Lm9iaiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGFkbGVyMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY3JjMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZGVmbGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxndm1hdDMyYy5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luNjQgKEFNRDY0KSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjY0IChBTUQ2NCkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZUFzbXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZUFzbXxXaW42NCAoQU1ENjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mYmFjay5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZmYXM4NjY0LmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlQXNtfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5mZmFzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluZnRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJ0ZXN0emxpYi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHp1dGlsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNy9ndm1hdDMyLm9iaiBiL2NvbnRyaWIvdnN0dWRpby92YzcvZ3ZtYXQzMi5vYmoKaW5kZXggNWIyZjg1Ni4uZWJiMzI2MiAxMDA2NDQKLS0tIGEvY29udHJpYi92c3R1ZGlvL3ZjNy9ndm1hdDMyLm9iagorKysgYi9jb250cmliL3ZzdHVkaW8vdmM3L2d2bWF0MzIub2JqCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdnN0dWRpby92YzcvaW5mZmFzMzIub2JqIGIvY29udHJpYi92c3R1ZGlvL3ZjNy9pbmZmYXMzMi5vYmoKaW5kZXggYTU0MWE1YS4uYmQ2NjY0ZCAxMDA2NDQKLS0tIGEvY29udHJpYi92c3R1ZGlvL3ZjNy9pbmZmYXMzMi5vYmoKKysrIGIvY29udHJpYi92c3R1ZGlvL3ZjNy9pbmZmYXMzMi5vYmoKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjIGIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjCmluZGV4IGQzNWNlZjAuLmQwNjUxZWMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdnN0dWRpby92YzcvemxpYi5yYworKysgYi9jb250cmliL3ZzdHVkaW8vdmM3L3psaWIucmMKQEAgLTIsOCArMiw4IEBACiANCiAjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KIElEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KLSAgRklMRVZFUlNJT04JIDEsMiwyLDINCi0gIFBST0RVQ1RWRVJTSU9OIDEsMiwyLDINCisgIEZJTEVWRVJTSU9OCSAxLDIsMiwzDQorICBQUk9EVUNUVkVSU0lPTiAxLDIsMiwzDQogICBGSUxFRkxBR1NNQVNLCVZTX0ZGSV9GSUxFRkxBR1NNQVNLDQogICBGSUxFRkxBR1MJMA0KICAgRklMRU9TCVZPU19ET1NfV0lORE9XUzMyDQpAQCAtMTcsNyArMTcsNyBAQAogDQogICAgIEJFR0lODQogICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeVwwIg0KLSAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuMi4yXDAiDQorICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJIjEuMi4yLjNcMCINCiAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWJcMCINCiAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGliLmRsbFwwIg0KICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIg0KZGlmZiAtLWdpdCBhL2NyYzMyLmMgYi9jcmMzMi5jCmluZGV4IDYyYjAyNWYuLjliMWRlMDQgMTAwNjQ0Ci0tLSBhL2NyYzMyLmMKKysrIGIvY3JjMzIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqCiAgKiBUaGFua3MgdG8gUm9kbmV5IEJyb3duIDxyYnJvd242NEBjc2MuY29tLmF1PiBmb3IgaGlzIGNvbnRyaWJ1dGlvbiBvZiBmYXN0ZXIKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgICBsZW4tLTsKICAgICB9CiAKLSAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKWJ1ZjsKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKICAgICB3aGlsZSAobGVuID49IDMyKSB7CiAgICAgICAgIERPTElUMzI7CiAgICAgICAgIGxlbiAtPSAzMjsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICBsZW4tLTsKICAgICB9CiAKLSAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKWJ1ZjsKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKICAgICBidWY0LS07CiAgICAgd2hpbGUgKGxlbiA+PSAzMikgewogICAgICAgICBET0JJRzMyOwpkaWZmIC0tZ2l0IGEvZGVmbGF0ZS5jIGIvZGVmbGF0ZS5jCmluZGV4IDE1OWY5NDYuLjVjZDlhOTIgMTAwNjQ0Ci0tLSBhL2RlZmxhdGUuYworKysgYi9kZWZsYXRlLmMKQEAgLTEsNSArMSw1IEBACiAvKiBkZWZsYXRlLmMgLS0gY29tcHJlc3MgZGF0YSB1c2luZyB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgImRlZmxhdGUuaCIKIAogY29uc3QgY2hhciBkZWZsYXRlX2NvcHlyaWdodFtdID0KLSAgICIgZGVmbGF0ZSAxLjIuMi4yIENvcHlyaWdodCAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseSAiOworICAgIiBkZWZsYXRlIDEuMi4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5ICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTMzNCw5ICszMzQsNyBAQAogICAgIGlmIChsZW5ndGggPCBNSU5fTUFUQ0gpIHJldHVybiBaX09LOwogICAgIGlmIChsZW5ndGggPiBNQVhfRElTVChzKSkgewogICAgICAgICBsZW5ndGggPSBNQVhfRElTVChzKTsKLSNpZm5kZWYgVVNFX0RJQ1RfSEVBRAogICAgICAgICBkaWN0aW9uYXJ5ICs9IGRpY3RMZW5ndGggLSBsZW5ndGg7IC8qIHVzZSB0aGUgdGFpbCBvZiB0aGUgZGljdGlvbmFyeSAqLwotI2VuZGlmCiAgICAgfQogICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOwogICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOwpAQCAtNDUyLDYgKzQ1MCwyNSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVUdW5lKHN0cm0sIGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbikKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgZ29vZF9sZW5ndGg7CisgICAgaW50IG1heF9sYXp5OworICAgIGludCBuaWNlX2xlbmd0aDsKKyAgICBpbnQgbWF4X2NoYWluOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgcyA9IHN0cm0tPnN0YXRlOworICAgIHMtPmdvb2RfbWF0Y2ggPSBnb29kX2xlbmd0aDsKKyAgICBzLT5tYXhfbGF6eV9tYXRjaCA9IG1heF9sYXp5OworICAgIHMtPm5pY2VfbWF0Y2ggPSBuaWNlX2xlbmd0aDsKKyAgICBzLT5tYXhfY2hhaW5fbGVuZ3RoID0gbWF4X2NoYWluOworICAgIHJldHVybiBaX09LOworfQorCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGb3IgdGhlIGRlZmF1bHQgd2luZG93Qml0cyBvZiAxNSBhbmQgbWVtTGV2ZWwgb2YgOCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCiAgKiBhIGNsb3NlIHRvIGV4YWN0LCBhcyB3ZWxsIGFzIHNtYWxsLCB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplLgpAQCAtOTg2LDkgKzEwMDMsMTEgQEAKICAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOwogICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICAgcy0+aW5zX2ggPSAwOworI2lmbmRlZiBGQVNURVNUCiAjaWZkZWYgQVNNVgogICAgIG1hdGNoX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aGUgYXNtIGNvZGUgKi8KICNlbmRpZgorI2VuZGlmCiB9CiAKICNpZm5kZWYgRkFTVEVTVApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzIGIvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCmluZGV4IDEwODQ1MjUuLjc1ZTk5NzAgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcworKysgYi9leGFtcGxlcy9SRUFETUUuZXhhbXBsZXMKQEAgLTQsNiArNCwxMyBAQAogICAgIGNvbXByZXNzIGp1c3QgZW5vdWdoIGlucHV0IHRvIG5lYXJseSBmaWxsIGEgcmVxdWVzdGVkIG91dHB1dCBzaXplCiAgICAgLSB6bGliIGlzbid0IGRlc2lnbmVkIHRvIGRvIHRoaXMsIGJ1dCBmaXRibGsgZG9lcyBpdCBhbnl3YXkKIAorZ3VuLmMKKyAgICB1bmNvbXByZXNzIGEgZ3ppcCBmaWxlCisgICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGluZmxhdGVCYWNrKCkgZm9yIGhpZ2ggc3BlZWQgZmlsZS10by1maWxlCisgICAgICBkZWNvbXByZXNzaW9uIHVzaW5nIGNhbGwtYmFjayBmdW5jdGlvbnMKKyAgICAtIGlzIGFwcHJveGltYXRlbHkgdHdpY2UgYXMgZmFzdCBhcyBnemlwIC1kCisgICAgLSBhbHNvIHByb3ZpZGVzIFVuaXggdW5jb21wcmVzcyBmdW5jdGlvbmFsaXR5LCBhZ2FpbiB0d2ljZSBhcyBmYXN0CisKIGd6YXBwZW5kLmMKICAgICBhcHBlbmQgdG8gYSBnemlwIGZpbGUKICAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlKCkKQEAgLTI3LDMgKzM0LDQgQEAKIHpwaXBlLmMKICAgICByZWFkcyBhbmQgd3JpdGVzIHpsaWIgc3RyZWFtcyBmcm9tIHN0ZGluIHRvIHN0ZG91dAogICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHByb3BlciB1c2Ugb2YgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkKKyAgICAtIGRlZXBseSBjb21tZW50ZWQgaW4gemxpYl9ob3cuaHRtbCAoc2VlIGFib3ZlKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZ3VuLmMgYi9leGFtcGxlcy9ndW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBkOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZ3VuLmMKQEAgLTAsMCArMSw2OTIgQEAKKy8qIGd1bi5jIC0tIHNpbXBsZSBndW56aXAgdG8gZ2l2ZSBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgaW5mbGF0ZUJhY2soKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAgIFZlcnNpb24gMS4yICAyMCBNYXJjaCAyMDA1ICBNYXJrIEFkbGVyICovCisKKy8qIFZlcnNpb24gaGlzdG9yeToKKyAgIDEuMCAgMTYgRmViIDIwMDMgIEZpcnN0IHZlcnNpb24gZm9yIHRlc3Rpbmcgb2YgaW5mbGF0ZUJhY2soKQorICAgMS4xICAyMSBGZWIgMjAwNSAgRGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zCisgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdXNlIG9mICJ0aGlzIiB2YXJpYWJsZSAoQysrIGtleXdvcmQpCisgICAgICAgICAgICAgICAgICAgICBGaXggcmV0dXJuIHZhbHVlIGZvciBpbigpCisgICAgICAgICAgICAgICAgICAgICBJbXByb3ZlIGFsbG9jYXRpb24gZmFpbHVyZSBjaGVja2luZworICAgICAgICAgICAgICAgICAgICAgQWRkIHR5cGVjYXN0aW5nIGZvciB2b2lkICogc3RydWN0dXJlcworICAgICAgICAgICAgICAgICAgICAgQWRkIC1oIG9wdGlvbiBmb3IgY29tbWFuZCB2ZXJzaW9uIGFuZCB1c2FnZQorICAgICAgICAgICAgICAgICAgICAgQWRkIGEgYnVuY2ggb2YgY29tbWVudHMKKyAgIDEuMiAgMjAgTWFyIDIwMDUgIEFkZCBVbml4IGNvbXByZXNzIChMWlcpIGRlY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgIENvcHkgZmlsZSBhdHRyaWJ1dGVzIGZyb20gaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZQorICovCisKKy8qCisgICBndW4gWyAtdCBdIFsgbmFtZSAuLi4gXQorCisgICBkZWNvbXByZXNzZXMgdGhlIGRhdGEgaW4gdGhlIG5hbWVkIGd6aXAgZmlsZXMuICBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAorICAgZ3VuIHdpbGwgZGVjb21wcmVzcyBmcm9tIHN0ZGluIHRvIHN0ZG91dC4gIFRoZSBuYW1lcyBtdXN0IGVuZCBpbiAuZ3osIC1neiwKKyAgIC56LCAteiwgX3osIG9yIC5aLiAgVGhlIHVuY29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0byBhIGZpbGUgbmFtZQorICAgd2l0aCB0aGUgc3VmZml4IHN0cmlwcGVkLiAgT24gc3VjY2VzcywgdGhlIG9yaWdpbmFsIGZpbGUgaXMgZGVsZXRlZC4gIE9uCisgICBmYWlsdXJlLCB0aGUgb3V0cHV0IGZpbGUgaXMgZGVsZXRlZC4gIEZvciBtb3N0IGZhaWx1cmVzLCB0aGUgY29tbWFuZCB3aWxsCisgICBjb250aW51ZSB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIEEgbWVtb3J5CisgICBhbGxvY2F0aW9uIGZhaWx1cmUgd2lsbCBhYm9ydCB0aGUgY29tbWFuZC4gIElmIC10IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUKKyAgIGxpc3RlZCBmaWxlcyBvciBzdGRpbiB3aWxsIGJlIHRlc3RlZCBhcyBnemlwIGZpbGVzIGZvciBpbnRlZ3JpdHkgKHdpdGhvdXQKKyAgIGNoZWNraW5nIGZvciBhIHByb3BlciBzdWZmaXgpLCBubyBvdXRwdXQgd2lsbCBiZSB3cml0dGVuLCBhbmQgbm8gZmlsZXMKKyAgIHdpbGwgYmUgZGVsZXRlZC4KKworICAgTGlrZSBnemlwLCBndW4gYWxsb3dzIGNvbmNhdGVuYXRlZCBnemlwIHN0cmVhbXMgYW5kIHdpbGwgZGVjb21wcmVzcyB0aGVtLAorICAgd3JpdGluZyBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQuICBVbmxpa2UgZ3ppcCwgZ3VuIGFsbG93cworICAgYW4gZW1wdHkgZmlsZSBvbiBpbnB1dCwgYW5kIHdpbGwgcHJvZHVjZSBubyBlcnJvciB3cml0aW5nIGFuIGVtcHR5IG91dHB1dAorICAgZmlsZS4KKworICAgZ3VuIHdpbGwgYWxzbyBkZWNvbXByZXNzIGZpbGVzIG1hZGUgYnkgVW5peCBjb21wcmVzcywgd2hpY2ggdXNlcyBMWlcKKyAgIGNvbXByZXNzaW9uLiAgVGhlc2UgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYnkgdmlydHVlIG9mIHRoZWlyCisgICBtYWdpYyBoZWFkZXIgYnl0ZXMuICBTaW5jZSB0aGUgZW5kIG9mIFVuaXggY29tcHJlc3Mgc3RyZWFtIGlzIG1hcmtlZCBieSB0aGUKKyAgIGVuZC1vZi1maWxlLCB0aGV5IGNhbm5vdCBiZSBjb25jYW50ZW5hdGVkLiAgSWYgYSBVbml4IGNvbXByZXNzIHN0cmVhbSBpcworICAgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgaXQgaXMgdGhlIGxhc3Qgc3RyZWFtIGluIHRoYXQgZmlsZS4KKworICAgTGlrZSBndW56aXAgYW5kIHVuY29tcHJlc3MsIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIG9yaWduYWwgY29tcHJlc3NlZAorICAgZmlsZSBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgZmluYWwgdW5jb21wcmVzc2VkIGZpbGUsIHRvIHRoZSBleHRlbnQgdGhhdCB0aGUKKyAgIHVzZXIgcGVybWlzc2lvbnMgYWxsb3cgaXQuCisKKyAgIE9uIG15IE1hYyBPUyBYIFBvd2VyUEMgRzQsIGd1biBpcyBhbG1vc3QgdHdpY2UgYXMgZmFzdCBhcyBndW56aXAgKHZlcnNpb24KKyAgIDEuMi40KSBpcyBvbiB0aGUgc2FtZSBmaWxlLCB3aGVuIGd1biBpcyBsaW5rZWQgd2l0aCB6bGliIDEuMi4yLiAgQWxzbyB0aGUKKyAgIExaVyBkZWNvbXByZXNzaW9uIHByb3ZpZGVkIGJ5IGd1biBpcyBhYm91dCB0d2ljZSBhcyBmYXN0IGFzIHRoZSBzdGFuZGFyZAorICAgVW5peCB1bmNvbXByZXNzIGNvbW1hbmQuCisgKi8KKworLyogZXh0ZXJuYWwgZnVuY3Rpb25zIGFuZCByZWxhdGVkIHR5cGVzIGFuZCBjb25zdGFudHMgKi8KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgICAvKiBmcHJpbnRmKCkgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAvKiBtYWxsb2MoKSwgZnJlZSgpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgLyogc3RyZXJyb3IoKSwgc3RyY21wKCksIHN0cmxlbigpLCBtZW1jcHkoKSAqLworI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgICAgIC8qIGVycm5vICovCisjaW5jbHVkZSA8ZmNudGwuaD4gICAgICAgICAgLyogb3BlbigpICovCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogcmVhZCgpLCB3cml0ZSgpLCBjbG9zZSgpLCBjaG93bigpLCB1bmxpbmsoKSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAgICAgIC8qIHN0YXQoKSwgY2htb2QoKSAqLworI2luY2x1ZGUgPHV0aW1lLmg+ICAgICAgICAgIC8qIHV0aW1lKCkgKi8KKyNpbmNsdWRlICJ6bGliLmgiICAgICAgICAgICAvKiBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlQmFja0VuZCgpLCBjcmMzMigpICovCisKKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9uICovCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBidWZmZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFNJWkUgMzI3NjhVICAgICAgICAgLyogaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgc2l6ZXMgKi8KKyNkZWZpbmUgUElFQ0UgMTYzODQgICAgICAgICAvKiBsaW1pdHMgaS9vIGNodW5rcyBmb3IgMTYtYml0IGludCBjYXNlICovCisKKy8qIHN0cnVjdHVyZSBmb3IgaW5mYmFjaygpIHRvIHBhc3MgdG8gaW5wdXQgZnVuY3Rpb24gaW4oKSAtLSBpdCBtYWludGFpbnMgdGhlCisgICBpbnB1dCBmaWxlIGFuZCBhIGJ1ZmZlciBvZiBzaXplIFNJWkUgKi8KK3N0cnVjdCBpbmQgeworICAgIGludCBpbmZpbGU7CisgICAgdW5zaWduZWQgY2hhciAqaW5idWY7Cit9OworCisvKiBMb2FkIGlucHV0IGJ1ZmZlciwgYXNzdW1lZCB0byBiZSBlbXB0eSwgYW5kIHJldHVybiBieXRlcyBsb2FkZWQgYW5kIGEKKyAgIHBvaW50ZXIgdG8gdGhlbS4gIHJlYWQoKSBpcyBjYWxsZWQgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxsLCBvciB1bnRpbCBpdAorICAgcmV0dXJucyBlbmQtb2YtZmlsZSBvciBlcnJvci4gIFJldHVybiAwIG9uIGVycm9yLiAqLworbG9jYWwgdW5zaWduZWQgaW4odm9pZCAqaW5fZGVzYywgdW5zaWduZWQgY2hhciAqKmJ1ZikKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpuZXh0OworICAgIHN0cnVjdCBpbmQgKm1lID0gKHN0cnVjdCBpbmQgKilpbl9kZXNjOworCisgICAgbmV4dCA9IG1lLT5pbmJ1ZjsKKyAgICAqYnVmID0gbmV4dDsKKyAgICBsZW4gPSAwOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gUElFQ0U7CisgICAgICAgIGlmICgodW5zaWduZWQpcmV0ID4gU0laRSAtIGxlbikKKyAgICAgICAgICAgIHJldCA9IChpbnQpKFNJWkUgLSBsZW4pOworICAgICAgICByZXQgPSAoaW50KXJlYWQobWUtPmluZmlsZSwgbmV4dCwgcmV0KTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5leHQgKz0gcmV0OworICAgICAgICBsZW4gKz0gcmV0OworICAgIH0gd2hpbGUgKHJldCAhPSAwICYmIGxlbiA8IFNJWkUpOworICAgIHJldHVybiBsZW47Cit9CisKKy8qIHN0cnVjdHVyZSBmb3IgaW5mYmFjaygpIHRvIHBhc3MgdG8gb3V0cHV0IGZ1bmN0aW9uIG91dCgpIC0tIGl0IG1haW50YWlucyB0aGUKKyAgIG91dHB1dCBmaWxlLCBhIHJ1bm5pbmcgQ1JDLTMyIGNoZWNrIG9uIHRoZSBvdXRwdXQgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAgIGJ5dGVzIG91dHB1dCwgYm90aCBmb3IgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZ3ppcCB0cmFpbGVyLiAgKFRoZSBsZW5ndGggaW4KKyAgIHRoZSBnemlwIHRyYWlsZXIgaXMgc3RvcmVkIG1vZHVsbyAyXjMyLCBzbyBpdCdzIG9rIGlmIGEgbG9uZyBpcyAzMiBiaXRzIGFuZAorICAgdGhlIG91dHB1dCBpcyBncmVhdGVyIHRoYW4gNCBHQi4pICovCitzdHJ1Y3Qgb3V0ZCB7CisgICAgaW50IG91dGZpbGU7CisgICAgaW50IGNoZWNrOyAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgY2hlY2tpbmcgY3JjIGFuZCB0b3RhbCAqLworICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7Cit9OworCisvKiBXcml0ZSBvdXRwdXQgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIENSQy0zMiBhbmQgdG90YWwgYnl0ZXMgd3JpdHRlbi4gIHdyaXRlKCkKKyAgIGlzIGNhbGxlZCB1bnRpbCBhbGwgb2YgdGhlIG91dHB1dCBpcyB3cml0dGVuIG9yIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgorICAgT24gc3VjY2VzcyBvdXQoKSByZXR1cm5zIDAuICBGb3IgYSB3cml0ZSBmYWlsdXJlLCBvdXQoKSByZXR1cm5zIDEuICBJZiB0aGUKKyAgIG91dHB1dCBmaWxlIGRlc2NyaXB0b3IgaXMgLTEsIHRoZW4gbm90aGluZyBpcyB3cml0dGVuLgorICovCitsb2NhbCBpbnQgb3V0KHZvaWQgKm91dF9kZXNjLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBvdXRkICptZSA9IChzdHJ1Y3Qgb3V0ZCAqKW91dF9kZXNjOworCisgICAgaWYgKG1lLT5jaGVjaykgeworICAgICAgICBtZS0+Y3JjID0gY3JjMzIobWUtPmNyYywgYnVmLCBsZW4pOworICAgICAgICBtZS0+dG90YWwgKz0gbGVuOworICAgIH0KKyAgICBpZiAobWUtPm91dGZpbGUgIT0gLTEpCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IFBJRUNFOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClyZXQgPiBsZW4pCisgICAgICAgICAgICAgICAgcmV0ID0gKGludClsZW47CisgICAgICAgICAgICByZXQgPSAoaW50KXdyaXRlKG1lLT5vdXRmaWxlLCBidWYsIHJldCk7CisgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogbmV4dCBpbnB1dCBieXRlIG1hY3JvIGZvciB1c2UgaW5zaWRlIGx1bnBpcGUoKSBhbmQgZ3VucGlwZSgpICovCisjZGVmaW5lIE5FWFQoKSAoaGF2ZSA/IDAgOiAoaGF2ZSA9IGluKGluZHAsICZuZXh0KSksIFwKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGF2ZSA/IChoYXZlLS0sIChpbnQpKCpuZXh0KyspKSA6IC0xKQorCisvKiBtZW1vcnkgZm9yIGd1bnBpcGUoKSBhbmQgbHVucGlwZSgpIC0tCisgICB0aGUgZmlyc3QgMjU2IGVudHJpZXMgb2YgcHJlZml4W10gYW5kIHN1ZmZpeFtdIGFyZSBuZXZlciB1c2VkLCBjb3VsZAorICAgaGF2ZSBvZmZzZXQgdGhlIGluZGV4LCBidXQgaXQncyBmYXN0ZXIgdG8gd2FzdGUgdGhlIG1lbW9yeSAqLwordW5zaWduZWQgY2hhciBpbmJ1ZltTSVpFXTsgICAgICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwordW5zaWduZWQgY2hhciBvdXRidWZbU0laRV07ICAgICAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KK3Vuc2lnbmVkIHNob3J0IHByZWZpeFs2NTUzNl07ICAgICAgICAgICAvKiBpbmRleCB0byBMWlcgcHJlZml4IHN0cmluZyAqLwordW5zaWduZWQgY2hhciBzdWZmaXhbNjU1MzZdOyAgICAgICAgICAgIC8qIG9uZS1jaGFyYWN0ZXIgTFpXIHN1ZmZpeCAqLwordW5zaWduZWQgY2hhciBtYXRjaFs2NTI4MCArIDJdOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmV2ZXJzZWQgbWF0Y2ggb3IgZ3ppcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMySyBzbGlkaW5nIHdpbmRvdyAqLworCisvKiB0aHJvdyBvdXQgd2hhdCdzIGxlZnQgaW4gdGhlIGN1cnJlbnQgYml0cyBieXRlIGJ1ZmZlciAodGhpcyBpcyBhIHZlc3RpZ2lhbAorICAgYXNwZWN0IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IGRlcml2ZWQgZnJvbSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0CisgICBtYWRlIHVzZSBvZiBhIHNwZWNpYWwgVkFYIG1hY2hpbmUgaW5zdHJ1Y3Rpb24hKSAqLworI2RlZmluZSBGTFVTSENPREUoKSBcCisgICAgZG8geyBcCisgICAgICAgIGxlZnQgPSAwOyBcCisgICAgICAgIHJlbSA9IDA7IFwKKyAgICAgICAgaWYgKGNodW5rID4gaGF2ZSkgeyBcCisgICAgICAgICAgICBjaHVuayAtPSBoYXZlOyBcCisgICAgICAgICAgICBoYXZlID0gMDsgXAorICAgICAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgXAorICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICBjaHVuay0tOyBcCisgICAgICAgICAgICBpZiAoY2h1bmsgPiBoYXZlKSB7IFwKKyAgICAgICAgICAgICAgICBjaHVuayA9IGhhdmUgPSAwOyBcCisgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgaGF2ZSAtPSBjaHVuazsgXAorICAgICAgICBuZXh0ICs9IGNodW5rOyBcCisgICAgICAgIGNodW5rID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIERlY29tcHJlc3MgYSBjb21wcmVzcyAoTFpXKSBmaWxlIGZyb20gaW5kcCB0byBvdXRmaWxlLiAgVGhlIGNvbXByZXNzIG1hZ2ljCisgICBoZWFkZXIgKHR3byBieXRlcykgaGFzIGFscmVhZHkgYmVlbiByZWFkIGFuZCB2ZXJpZmllZC4gIFRoZXJlIGFyZSBoYXZlIGJ5dGVzCisgICBvZiBidWZmZXJlZCBpbnB1dCBhdCBuZXh0LiAgc3RybSBpcyB1c2VkIGZvciBwYXNzaW5nIGVycm9yIGluZm9ybWF0aW9uIGJhY2sKKyAgIHRvIGd1bnBpcGUoKS4KKworICAgbHVucGlwZSgpIHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9CVUZfRVJST1IgZm9yIGFuIHVuZXhwZWN0ZWQgZW5kIG9mCisgICBmaWxlLCByZWFkIGVycm9yLCBvciB3cml0ZSBlcnJvciAoYSB3cml0ZSBlcnJvciBpbmRpY2F0ZWQgYnkgc3RybS0+bmV4dF9pbgorICAgbm90IGVxdWFsIHRvIFpfTlVMTCksIG9yIFpfREFUQV9FUlJPUiBmb3IgaW52YWxpZCBpbnB1dC4KKyAqLworbG9jYWwgaW50IGx1bnBpcGUodW5zaWduZWQgaGF2ZSwgdW5zaWduZWQgY2hhciAqbmV4dCwgc3RydWN0IGluZCAqaW5kcCwKKyAgICAgICAgICAgICAgICAgIGludCBvdXRmaWxlLCB6X3N0cmVhbSAqc3RybSkKK3sKKyAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogbGFzdCBieXRlIHJlYWQgYnkgTkVYVCgpLCBvciAtMSBpZiBFT0YgKi8KKyAgICBpbnQgY2h1bms7ICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgbGVmdCBpbiBjdXJyZW50IGNodW5rICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiByZW0gKi8KKyAgICB1bnNpZ25lZCByZW07ICAgICAgICAgICAgICAgLyogdW51c2VkIGJpdHMgZnJvbSBpbnB1dCAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgcGVyIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgICAgICAgICAgLyogY29kZSwgdGFibGUgdHJhdmVyc2FsIGluZGV4ICovCisgICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGN1cnJlbnQgYml0cyBjb2RlcyAqLworICAgIGludCBtYXg7ICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgcGVyIGNvZGUgZm9yIHRoaXMgc3RyZWFtICovCisgICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzIGZsYWdzLCB0aGVuIGJsb2NrIGNvbXByZXNzIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBlbmQ7ICAgICAgICAgICAgICAgLyogbGFzdCB2YWxpZCBlbnRyeSBpbiBwcmVmaXgvc3VmZml4IHRhYmxlcyAqLworICAgIHVuc2lnbmVkIHRlbXA7ICAgICAgICAgICAgICAvKiBjdXJyZW50IGNvZGUgKi8KKyAgICB1bnNpZ25lZCBwcmV2OyAgICAgICAgICAgICAgLyogcHJldmlvdXMgY29kZSAqLworICAgIHVuc2lnbmVkIGZpbmFsOyAgICAgICAgICAgICAvKiBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGZvciBwcmV2aW91cyBjb2RlICovCisgICAgdW5zaWduZWQgc3RhY2s7ICAgICAgICAgICAgIC8qIG5leHQgcG9zaXRpb24gZm9yIHJldmVyc2VkIHN0cmluZyAqLworICAgIHVuc2lnbmVkIG91dGNudDsgICAgICAgICAgICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisgICAgc3RydWN0IG91dGQgb3V0ZDsgICAgICAgICAgIC8qIG91dHB1dCBzdHJ1Y3R1cmUgKi8KKworICAgIC8qIHNldCB1cCBvdXRwdXQgKi8KKyAgICBvdXRkLm91dGZpbGUgPSBvdXRmaWxlOworICAgIG91dGQuY2hlY2sgPSAwOworCisgICAgLyogcHJvY2VzcyByZW1haW5kZXIgb2YgY29tcHJlc3MgaGVhZGVyIC0tIGEgZmxhZ3MgYnl0ZSAqLworICAgIGZsYWdzID0gTkVYVCgpOworICAgIGlmIChsYXN0ID09IC0xKQorICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgaWYgKGZsYWdzICYgMHg2MCkgeworICAgICAgICBzdHJtLT5tc2cgPSAidW5rbm93biBsencgZmxhZ3Mgc2V0IjsKKyAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICB9CisgICAgbWF4ID0gZmxhZ3MgJiAweDFmOworICAgIGlmIChtYXggPCA5IHx8IG1heCA+IDE2KSB7CisgICAgICAgIHN0cm0tPm1zZyA9ICJsencgYml0cyBvdXQgb2YgcmFuZ2UiOworICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIH0KKyAgICBpZiAobWF4ID09IDkpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOSBkb2Vzbid0IHJlYWxseSBtZWFuIDkgKi8KKyAgICAgICAgbWF4ID0gMTA7CisgICAgZmxhZ3MgJj0gMHg4MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgYmxvY2sgY29tcHJlc3MgKi8KKworICAgIC8qIGNsZWFyIHRhYmxlICovCisgICAgYml0cyA9IDk7CisgICAgbWFzayA9IDB4MWZmOworICAgIGVuZCA9IGZsYWdzID8gMjU2IDogMjU1OworCisgICAgLyogc2V0IHVwOiBnZXQgZmlyc3QgOS1iaXQgY29kZSwgd2hpY2ggaXMgdGhlIGZpcnN0IGRlY29tcHJlc3NlZCBieXRlLCBidXQKKyAgICAgICBkb24ndCBjcmVhdGUgYSB0YWJsZSBlbnRyeSB1bnRpbCB0aGUgbmV4dCBjb2RlICovCisgICAgaWYgKE5FWFQoKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNvbXByZXNzZWQgZGF0YSBpcyBvayAqLworICAgICAgICByZXR1cm4gWl9PSzsKKyAgICBmaW5hbCA9IHByZXYgPSAodW5zaWduZWQpbGFzdDsgICAgICAgICAgLyogbG93IDggYml0cyBvZiBjb2RlICovCisgICAgaWYgKE5FWFQoKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pc3NpbmcgYSBiaXQgKi8KKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgIGlmIChsYXN0ICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIG11c3QgYmUgPCAyNTYgKi8KKyAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgbHp3IGNvZGUiOworICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIH0KKyAgICByZW0gPSAodW5zaWduZWQpbGFzdCA+PiAxOyAgICAgICAgICAgICAgLyogcmVtYWluaW5nIDcgYml0cyAqLworICAgIGxlZnQgPSA3OworICAgIGNodW5rID0gYml0cyAtIDI7ICAgICAgICAgICAgICAgICAgICAgICAvKiA3IGJ5dGVzIGxlZnQgaW4gdGhpcyBjaHVuayAqLworICAgIG91dGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOyAgICAgICAvKiB3cml0ZSBmaXJzdCBkZWNvbXByZXNzZWQgYnl0ZSAqLworICAgIG91dGNudCA9IDE7CisKKyAgICAvKiBkZWNvZGUgY29kZXMgKi8KKyAgICBzdGFjayA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBpZiB0aGUgdGFibGUgd2lsbCBiZSBmdWxsIGFmdGVyIHRoaXMsIGluY3JlbWVudCB0aGUgY29kZSBzaXplICovCisgICAgICAgIGlmIChlbmQgPj0gbWFzayAmJiBiaXRzIDwgbWF4KSB7CisgICAgICAgICAgICBGTFVTSENPREUoKTsKKyAgICAgICAgICAgIGJpdHMrKzsKKyAgICAgICAgICAgIG1hc2sgPDw9IDE7CisgICAgICAgICAgICBtYXNrKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgYSBjb2RlIG9mIGxlbmd0aCBiaXRzICovCisgICAgICAgIGlmIChjaHVuayA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIGRlY3JlbWVudCBjaHVuayBtb2R1bG8gYml0cyAqLworICAgICAgICAgICAgY2h1bmsgPSBiaXRzOworICAgICAgICBjb2RlID0gcmVtOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBvZiBjb2RlICovCisgICAgICAgIGlmIChORVhUKCkgPT0gLTEpIHsgICAgICAgICAgICAgICAgIC8qIEVPRiBpcyBlbmQgb2YgY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgICAgICAvKiB3cml0ZSByZW1haW5pbmcgYnVmZmVyZWQgb3V0cHV0ICovCisgICAgICAgICAgICBpZiAob3V0Y250ICYmIG91dCgmb3V0ZCwgb3V0YnVmLCBvdXRjbnQpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IG91dGJ1ZjsgICAgIC8qIHNpZ25hbCB3cml0ZSBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICB9CisgICAgICAgIGNvZGUgKz0gKHVuc2lnbmVkKWxhc3QgPDwgbGVmdDsgICAgIC8qIG1pZGRsZSAob3IgaGlnaCkgYml0cyBvZiBjb2RlICovCisgICAgICAgIGxlZnQgKz0gODsKKyAgICAgICAgY2h1bmstLTsKKyAgICAgICAgaWYgKGJpdHMgPiBsZWZ0KSB7ICAgICAgICAgICAgICAgICAgLyogbmVlZCBtb3JlIGJpdHMgKi8KKyAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgLyogY2FuJ3QgZW5kIGluIG1pZGRsZSBvZiBjb2RlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgICAgICAgICAgY29kZSArPSAodW5zaWduZWQpbGFzdCA8PCBsZWZ0OyAvKiBoaWdoIGJpdHMgb2YgY29kZSAqLworICAgICAgICAgICAgbGVmdCArPSA4OworICAgICAgICAgICAgY2h1bmstLTsKKyAgICAgICAgfQorICAgICAgICBjb2RlICY9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHRvIGN1cnJlbnQgY29kZSBsZW5ndGggKi8KKyAgICAgICAgbGVmdCAtPSBiaXRzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHVudXNlZCBiaXRzICovCisgICAgICAgIHJlbSA9ICh1bnNpZ25lZClsYXN0ID4+ICg4IC0gbGVmdCk7IC8qIHVudXNlZCBiaXRzIGZyb20gbGFzdCBieXRlICovCisKKyAgICAgICAgLyogcHJvY2VzcyBjbGVhciBjb2RlICgyNTYpICovCisgICAgICAgIGlmIChjb2RlID09IDI1NiAmJiBmbGFncykgeworICAgICAgICAgICAgRkxVU0hDT0RFKCk7CisgICAgICAgICAgICBiaXRzID0gOTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYml0cyBhbmQgbWFzayAqLworICAgICAgICAgICAgbWFzayA9IDB4MWZmOworICAgICAgICAgICAgZW5kID0gMjU1OyAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSB0YWJsZSAqLworICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBjb2RlICovCisgICAgICAgIH0KKworICAgICAgICAvKiBzcGVjaWFsIGNvZGUgdG8gcmV1c2UgbGFzdCBtYXRjaCAqLworICAgICAgICB0ZW1wID0gY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICAgICAgaWYgKGNvZGUgPiBlbmQpIHsKKyAgICAgICAgICAgIC8qIEJlIHBpY2t5IG9uIHRoZSBhbGxvd2VkIGNvZGUgaGVyZSwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlCisgICAgICAgICAgICAgICB3ZSBkcm9wIHRocm91Z2ggKHByZXYpIHdpbGwgYmUgYSB2YWxpZCBpbmRleCBzbyB0aGF0IHJhbmRvbQorICAgICAgICAgICAgICAgaW5wdXQgZG9lcyBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLiAgVGhlIGNvZGUgIT0gZW5kICsgMSBjaGVjayBpcworICAgICAgICAgICAgICAgZW1waXJpY2FsbHkgZGVyaXZlZCwgYW5kIG5vdCBjaGVja2VkIGluIHRoZSBvcmlnaW5hbCB1bmNvbXByZXNzCisgICAgICAgICAgICAgICBjb2RlLiAgSWYgdGhpcyBldmVyIGNhdXNlcyBhIHByb2JsZW0sIHRoYXQgY2hlY2sgY291bGQgYmUgc2FmZWx5CisgICAgICAgICAgICAgICByZW1vdmVkLiAgTGVhdmluZyB0aGlzIGNoZWNrIGluIGdyZWF0bHkgaW1wcm92ZXMgZ3VuJ3MgYWJpbGl0eQorICAgICAgICAgICAgICAgdG8gZGV0ZWN0IHJhbmRvbSBvciBjb3JydXB0ZWQgaW5wdXQgYWZ0ZXIgYSBjb21wcmVzcyBoZWFkZXIuCisgICAgICAgICAgICAgICBJbiBhbnkgY2FzZSwgdGhlIHByZXYgPiBlbmQgY2hlY2sgbXVzdCBiZSByZXRhaW5lZC4gKi8KKyAgICAgICAgICAgIGlmIChjb2RlICE9IGVuZCArIDEgfHwgcHJldiA+IGVuZCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGx6dyBjb2RlIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hbc3RhY2srK10gPSAodW5zaWduZWQgY2hhcilmaW5hbDsKKyAgICAgICAgICAgIGNvZGUgPSBwcmV2OworICAgICAgICB9CisKKyAgICAgICAgLyogd2FsayB0aHJvdWdoIGxpbmtlZCBsaXN0IHRvIGdlbmVyYXRlIG91dHB1dCBpbiByZXZlcnNlIG9yZGVyICovCisgICAgICAgIHdoaWxlIChjb2RlID49IDI1NikgeworICAgICAgICAgICAgbWF0Y2hbc3RhY2srK10gPSBzdWZmaXhbY29kZV07CisgICAgICAgICAgICBjb2RlID0gcHJlZml4W2NvZGVdOworICAgICAgICB9CisgICAgICAgIG1hdGNoW3N0YWNrKytdID0gKHVuc2lnbmVkIGNoYXIpY29kZTsKKyAgICAgICAgZmluYWwgPSBjb2RlOworCisgICAgICAgIC8qIGxpbmsgbmV3IHRhYmxlIGVudHJ5ICovCisgICAgICAgIGlmIChlbmQgPCBtYXNrKSB7CisgICAgICAgICAgICBlbmQrKzsKKyAgICAgICAgICAgIHByZWZpeFtlbmRdID0gKHVuc2lnbmVkIHNob3J0KXByZXY7CisgICAgICAgICAgICBzdWZmaXhbZW5kXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHByZXZpb3VzIGNvZGUgZm9yIG5leHQgaXRlcmF0aW9uICovCisgICAgICAgIHByZXYgPSB0ZW1wOworCisgICAgICAgIC8qIHdyaXRlIG91dHB1dCBpbiBmb3J3YXJkIG9yZGVyICovCisgICAgICAgIHdoaWxlIChzdGFjayA+IFNJWkUgLSBvdXRjbnQpIHsKKyAgICAgICAgICAgIHdoaWxlIChvdXRjbnQgPCBTSVpFKQorICAgICAgICAgICAgICAgIG91dGJ1ZltvdXRjbnQrK10gPSBtYXRjaFstLXN0YWNrXTsKKyAgICAgICAgICAgIGlmIChvdXQoJm91dGQsIG91dGJ1Ziwgb3V0Y250KSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBvdXRidWY7IC8qIHNpZ25hbCB3cml0ZSBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dGNudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgb3V0YnVmW291dGNudCsrXSA9IG1hdGNoWy0tc3RhY2tdOworICAgICAgICB9IHdoaWxlIChzdGFjayk7CisKKyAgICAgICAgLyogbG9vcCBmb3IgbmV4dCBjb2RlIHdpdGggZmluYWwgYW5kIHByZXYgYXMgdGhlIGxhc3QgbWF0Y2gsIHJlbSBhbmQKKyAgICAgICAgICAgbGVmdCBwcm92aWRlIHRoZSBmaXJzdCAwLi43IGJpdHMgb2YgdGhlIG5leHQgY29kZSwgZW5kIGlzIHRoZSBsYXN0CisgICAgICAgICAgIHZhbGlkIHRhYmxlIGVudHJ5ICovCisgICAgfQorfQorCisvKiBEZWNvbXByZXNzIGEgZ3ppcCBmaWxlIGZyb20gaW5maWxlIHRvIG91dGZpbGUuICBzdHJtIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuCisgICBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgd2l0aCBpbmZsYXRlQmFja0luaXQoKS4gIFRoZSBpbnB1dCBmaWxlIG1heSBjb25zaXN0CisgICBvZiBhIHNlcmllcyBvZiBnemlwIHN0cmVhbXMsIGluIHdoaWNoIGNhc2UgYWxsIG9mIHRoZW0gd2lsbCBiZSBkZWNvbXByZXNzZWQKKyAgIHRvIHRoZSBvdXRwdXQgZmlsZS4gIElmIG91dGZpbGUgaXMgLTEsIHRoZW4gdGhlIGd6aXAgc3RyZWFtKHMpIGludGVncml0eSBpcworICAgY2hlY2tlZCBhbmQgbm90aGluZyBpcyB3cml0dGVuLgorCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgemxpYiBlcnJvciBjb2RlOiBaX01FTV9FUlJPUiBpZiBvdXQgb2YgbWVtb3J5LAorICAgWl9EQVRBX0VSUk9SIGlmIHRoZSBoZWFkZXIgb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBpbnZhbGlkLCBvciBpZiB0aGUKKyAgIHRyYWlsZXIgQ1JDLTMyIGNoZWNrIG9yIGxlbmd0aCBkb2Vzbid0IG1hdGNoLCBaX0JVRl9FUlJPUiBpZiB0aGUgaW5wdXQgZW5kcworICAgcHJlbWF0dXJlbHkgb3IgYSB3cml0ZSBlcnJvciBvY2N1cnMsIG9yIFpfRVJSTk8gaWYganVuayAobm90IGEgYW5vdGhlciBnemlwCisgICBzdHJlYW0pIGZvbGxvd3MgYSB2YWxpZCBnemlwIHN0cmVhbS4KKyAqLworbG9jYWwgaW50IGd1bnBpcGUoel9zdHJlYW0gKnN0cm0sIGludCBpbmZpbGUsIGludCBvdXRmaWxlKQoreworICAgIGludCByZXQsIGZpcnN0LCBsYXN0OworICAgIHVuc2lnbmVkIGhhdmUsIGZsYWdzLCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqbmV4dDsKKyAgICBzdHJ1Y3QgaW5kIGluZCwgKmluZHA7CisgICAgc3RydWN0IG91dGQgb3V0ZDsKKworICAgIC8qIHNldHVwIGlucHV0IGJ1ZmZlciAqLworICAgIGluZC5pbmZpbGUgPSBpbmZpbGU7CisgICAgaW5kLmluYnVmID0gaW5idWY7CisgICAgaW5kcCA9ICZpbmQ7CisKKyAgICAvKiBkZWNvbXByZXNzIGNvbmNhdGVuYXRlZCBnemlwIHN0cmVhbXMgKi8KKyAgICBoYXZlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gaW5wdXQgZGF0YSByZWFkIGluIHlldCAqLworICAgIGZpcnN0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29raW5nIGZvciBmaXJzdCBnemlwIGhlYWRlciAqLworICAgIHN0cm0tPm5leHRfaW4gPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBzbyBaX0JVRl9FUlJPUiBtZWFucyBFT0YgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGxvb2sgZm9yIHRoZSB0d28gbWFnaWMgaGVhZGVyIGJ5dGVzIGZvciBhIGd6aXAgc3RyZWFtICovCisgICAgICAgIGlmIChORVhUKCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldCA9IFpfT0s7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVtcHR5IGd6aXAgc3RyZWFtIGlzIG9rICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhc3QgIT0gMzEgfHwgKE5FWFQoKSAhPSAxMzkgJiYgbGFzdCAhPSAxNTcpKSB7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7CisgICAgICAgICAgICByZXQgPSBmaXJzdCA/IFpfREFUQV9FUlJPUiA6IFpfRVJSTk87CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhIGd6aXAgb3IgY29tcHJlc3MgaGVhZGVyICovCisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBub24taGVhZGVyIGlzIGp1bmsgKi8KKworICAgICAgICAvKiBwcm9jZXNzIGEgY29tcHJlc3MgKExaVykgZmlsZSAtLSBjYW4ndCBiZSBjb25jYXRlbmF0ZWQgYWZ0ZXIgdGhpcyAqLworICAgICAgICBpZiAobGFzdCA9PSAxNTcpIHsKKyAgICAgICAgICAgIHJldCA9IGx1bnBpcGUoaGF2ZSwgbmV4dCwgaW5kcCwgb3V0ZmlsZSwgc3RybSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByb2Nlc3MgcmVtYWluZGVyIG9mIGd6aXAgaGVhZGVyICovCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICBpZiAoTkVYVCgpICE9IDgpIHsgICAgICAgICAgICAgICAgICAvKiBvbmx5IGRlZmxhdGUgbWV0aG9kIGFsbG93ZWQgKi8KKyAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IE5FWFQoKTsgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgZmxhZ3MgKi8KKyAgICAgICAgTkVYVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBtb2QgdGltZSwgeGZsZ3MsIG9zICovCisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBORVhUKCk7CisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgIGlmIChmbGFncyAmIDB4ZTApIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiOworICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgNCkgeyAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgZmllbGQgKi8KKyAgICAgICAgICAgIGxlbiA9IE5FWFQoKTsKKyAgICAgICAgICAgIGxlbiArPSAodW5zaWduZWQpKE5FWFQoKSkgPDwgODsKKyAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiBoYXZlKSB7CisgICAgICAgICAgICAgICAgbGVuIC09IGhhdmU7CisgICAgICAgICAgICAgICAgaGF2ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICBoYXZlIC09IGxlbjsKKyAgICAgICAgICAgIG5leHQgKz0gbGVuOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAmIDgpICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGUgbmFtZSAqLworICAgICAgICAgICAgd2hpbGUgKE5FWFQoKSAhPSAwICYmIGxhc3QgIT0gLTEpCisgICAgICAgICAgICAgICAgOworICAgICAgICBpZiAoZmxhZ3MgJiAxNikgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50ICovCisgICAgICAgICAgICB3aGlsZSAoTkVYVCgpICE9IDAgJiYgbGFzdCAhPSAtMSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIGlmIChmbGFncyAmIDIpIHsgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBjcmMgKi8KKyAgICAgICAgICAgIE5FWFQoKTsKKyAgICAgICAgICAgIE5FWFQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisKKyAgICAgICAgLyogc2V0IHVwIG91dHB1dCAqLworICAgICAgICBvdXRkLm91dGZpbGUgPSBvdXRmaWxlOworICAgICAgICBvdXRkLmNoZWNrID0gMTsKKyAgICAgICAgb3V0ZC5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgb3V0ZC50b3RhbCA9IDA7CisKKyAgICAgICAgLyogZGVjb21wcmVzcyBkYXRhIHRvIG91dHB1dCAqLworICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOworICAgICAgICByZXQgPSBpbmZsYXRlQmFjayhzdHJtLCBpbiwgaW5kcCwgb3V0LCAmb3V0ZCk7CisgICAgICAgIGlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47CisgICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IFpfTlVMTDsgICAgICAgICAgICAgLyogc28gWl9CVUZfRVJST1IgbWVhbnMgRU9GICovCisKKyAgICAgICAgLyogY2hlY2sgdHJhaWxlciAqLworICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKyAgICAgICAgaWYgKE5FWFQoKSAhPSAob3V0ZC5jcmMgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC5jcmMgPj4gOCkgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC5jcmMgPj4gMTYpICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQuY3JjID4+IDI0KSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAvKiBjcmMgZXJyb3IgKi8KKyAgICAgICAgICAgIGlmIChsYXN0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoTkVYVCgpICE9IChvdXRkLnRvdGFsICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQudG90YWwgPj4gOCkgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC50b3RhbCA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC50b3RhbCA+PiAyNCkgJiAweGZmKSkgeworICAgICAgICAgICAgLyogbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICBpZiAobGFzdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdvIGJhY2sgYW5kIGxvb2sgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0gKi8KKyAgICB9CisKKyAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICAgcmV0dXJuIHJldDsKK30KKworLyogQ29weSBmaWxlIGF0dHJpYnV0ZXMsIGZyb20gLT4gdG8sIGFzIGJlc3Qgd2UgY2FuLiAgVGhpcyBpcyBiZXN0IGVmZm9ydCwgc28KKyAgIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQuICBUaGUgbW9kZSBiaXRzLCBpbmNsdWRpbmcgc3VpZCwgc2dpZCwgYW5kIHRoZSBzdGlja3kKKyAgIGJpdCBhcmUgY29waWVkIChpZiBhbGxvd2VkKSwgdGhlIG93bmVyJ3MgdXNlciBpZCBhbmQgZ3JvdXAgaWQgYXJlIGNvcGllZAorICAgKGFnYWluIGlmIGFsbG93ZWQpLCBhbmQgdGhlIGFjY2VzcyBhbmQgbW9kaWZ5IHRpbWVzIGFyZSBjb3BpZWQuICovCitsb2NhbCB2b2lkIGNvcHltZXRhKGNoYXIgKmZyb20sIGNoYXIgKnRvKQoreworICAgIHN0cnVjdCBzdGF0IHdhczsKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiB3aGVuOworCisgICAgLyogZ2V0IGFsbCBvZiBmcm9tJ3MgVW5peCBtZXRhIGRhdGEsIHJldHVybiBpZiBub3QgYSByZWd1bGFyIGZpbGUgKi8KKyAgICBpZiAoc3RhdChmcm9tLCAmd2FzKSAhPSAwIHx8ICh3YXMuc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogc2V0IHRvJ3MgbW9kZSBiaXRzLCBpZ25vcmUgZXJyb3JzICovCisgICAgKHZvaWQpY2htb2QodG8sIHdhcy5zdF9tb2RlICYgMDc3NzcpOworCisgICAgLyogY29weSBvd25lcidzIHVzZXIgYW5kIGdyb3VwLCBpZ25vcmUgZXJyb3JzICovCisgICAgKHZvaWQpY2hvd24odG8sIHdhcy5zdF91aWQsIHdhcy5zdF9naWQpOworCisgICAgLyogY29weSBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcywgaWdub3JlIGVycm9ycyAqLworICAgIHdoZW4uYWN0aW1lID0gd2FzLnN0X2F0aW1lOworICAgIHdoZW4ubW9kdGltZSA9IHdhcy5zdF9tdGltZTsKKyAgICAodm9pZCl1dGltZSh0bywgJndoZW4pOworfQorCisvKiBEZWNvbXByZXNzIHRoZSBmaWxlIGlubmFtZSB0byB0aGUgZmlsZSBvdXRubmFtZSwgb2YgaWYgdGVzdCBpcyB0cnVlLCBqdXN0CisgICBkZWNvbXByZXNzIHdpdGhvdXQgd3JpdGluZyBhbmQgY2hlY2sgdGhlIGd6aXAgdHJhaWxlciBmb3IgaW50ZWdyaXR5LiAgSWYKKyAgIGlubmFtZSBpcyBOVUxMIG9yIGFuIGVtcHR5IHN0cmluZywgcmVhZCBmcm9tIHN0ZGluLiAgSWYgb3V0bmFtZSBpcyBOVUxMIG9yCisgICBhbiBlbXB0eSBzdHJpbmcsIHdyaXRlIHRvIHN0ZG91dC4gIHN0cm0gaXMgYSBwcmUtaW5pdGlhbGl6ZWQgaW5mbGF0ZUJhY2sKKyAgIHN0cnVjdHVyZS4gIFdoZW4gYXBwcm9wcmlhdGUsIGNvcHkgdGhlIGZpbGUgYXR0cmlidXRlcyBmcm9tIGlubmFtZSB0bworICAgb3V0bmFtZS4KKworICAgZ3VuemlwKCkgcmV0dXJucyAxIGlmIHRoZXJlIGlzIGFuIG91dC1vZi1tZW1vcnkgZXJyb3Igb3IgYW4gdW5leHBlY3RlZAorICAgcmV0dXJuIGNvZGUgZnJvbSBndW5waXBlKCkuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLgorICovCitsb2NhbCBpbnQgZ3VuemlwKHpfc3RyZWFtICpzdHJtLCBjaGFyICppbm5hbWUsIGNoYXIgKm91dG5hbWUsIGludCB0ZXN0KQoreworICAgIGludCByZXQ7CisgICAgaW50IGluZmlsZSwgb3V0ZmlsZTsKKworICAgIC8qIG9wZW4gZmlsZXMgKi8KKyAgICBpZiAoaW5uYW1lID09IE5VTEwgfHwgKmlubmFtZSA9PSAwKSB7CisgICAgICAgIGlubmFtZSA9ICItIjsKKyAgICAgICAgaW5maWxlID0gMDsgICAgIC8qIHN0ZGluICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbmZpbGUgPSBvcGVuKGlubmFtZSwgT19SRE9OTFksIDApOworICAgICAgICBpZiAoaW5maWxlID09IC0xKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBjYW5ub3Qgb3BlbiAlc1xuIiwgaW5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0ZXN0KQorICAgICAgICBvdXRmaWxlID0gLTE7CisgICAgZWxzZSBpZiAob3V0bmFtZSA9PSBOVUxMIHx8ICpvdXRuYW1lID09IDApIHsKKyAgICAgICAgb3V0bmFtZSA9ICItIjsKKyAgICAgICAgb3V0ZmlsZSA9IDE7ICAgIC8qIHN0ZG91dCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3V0ZmlsZSA9IG9wZW4ob3V0bmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDY2Nik7CisgICAgICAgIGlmIChvdXRmaWxlID09IC0xKSB7CisgICAgICAgICAgICBjbG9zZShpbmZpbGUpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gY2Fubm90IGNyZWF0ZSAlc1xuIiwgb3V0bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlcnJubyA9IDA7CisKKyAgICAvKiBkZWNvbXByZXNzICovCisgICAgcmV0ID0gZ3VucGlwZShzdHJtLCBpbmZpbGUsIG91dGZpbGUpOworICAgIGlmIChvdXRmaWxlID4gMikgY2xvc2Uob3V0ZmlsZSk7CisgICAgaWYgKGluZmlsZSA+IDIpIGNsb3NlKGluZmlsZSk7CisKKyAgICAvKiBpbnRlcnByZXQgcmVzdWx0ICovCisgICAgc3dpdGNoIChyZXQpIHsKKyAgICBjYXNlIFpfT0s6CisgICAgY2FzZSBaX0VSUk5POgorICAgICAgICBpZiAoaW5maWxlID4gMiAmJiBvdXRmaWxlID4gMikgeworICAgICAgICAgICAgY29weW1ldGEoaW5uYW1lLCBvdXRuYW1lKTsgICAgICAgICAgLyogY29weSBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICB1bmxpbmsoaW5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IFpfRVJSTk8pCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biB3YXJuaW5nOiB0cmFpbGluZyBnYXJiYWdlIGlnbm9yZWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZGF0YSBlcnJvciBvbiAlczogJXNcbiIsIGlubmFtZSwgc3RybS0+bXNnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBaX0JVRl9FUlJPUjoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGlmIChzdHJtLT5uZXh0X2luICE9IFpfTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gd3JpdGUgZXJyb3Igb24gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBvdXRuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGVycm5vKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biByZWFkIGVycm9yIG9uICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gaW50ZXJuYWwgZXJyb3ItLWFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBQcm9jZXNzIHRoZSBndW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNlZSB0aGUgY29tbWFuZCBzeW50YXggbmVhciB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBmaWxlLiAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQsIGxlbiwgdGVzdDsKKyAgICBjaGFyICpvdXRuYW1lOworICAgIHVuc2lnbmVkIGNoYXIgKndpbmRvdzsKKyAgICB6X3N0cmVhbSBzdHJtOworCisgICAgLyogaW5pdGlhbGl6ZSBpbmZsYXRlQmFjayBzdGF0ZSBmb3IgcmVwZWF0ZWQgdXNlICovCisgICAgd2luZG93ID0gbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldXNlIExaVyBtYXRjaCBidWZmZXIgKi8KKyAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdCgmc3RybSwgMTUsIHdpbmRvdyk7CisgICAgaWYgKHJldCAhPSBaX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogZGVjb21wcmVzcyBlYWNoIGZpbGUgdG8gdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBzdWZmaXggcmVtb3ZlZCAqLworICAgIGFyZ2MtLTsKKyAgICBhcmd2Kys7CisgICAgdGVzdCA9IDA7CisgICAgaWYgKGFyZ2MgJiYgc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIDEuMiAoMjAgTWFyIDIwMDUpXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3B5cmlnaHQgKGMpIDIwMDUgTWFyayBBZGxlclxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGd1biBbLXRdIFtmaWxlMS5neiBbZmlsZTIuWiAuLi5dXVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYXJnYyAmJiBzdHJjbXAoKmFyZ3YsICItdCIpID09IDApIHsKKyAgICAgICAgdGVzdCA9IDE7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgIH0KKyAgICBpZiAoYXJnYykKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHRlc3QpCisgICAgICAgICAgICAgICAgb3V0bmFtZSA9IE5VTEw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbigqYXJndik7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICIuZ3oiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICItZ3oiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLnoiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIteiIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMiwgIl96IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLloiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZXJyb3I6IG5vIGd6IHR5cGUgb24gJXMtLXNraXBwaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dG5hbWUgPSBtYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKG91dG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0bmFtZSwgKmFyZ3YsIGxlbik7CisgICAgICAgICAgICAgICAgb3V0bmFtZVtsZW5dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGd1bnppcCgmc3RybSwgKmFyZ3YsIG91dG5hbWUsIHRlc3QpOworICAgICAgICAgICAgaWYgKG91dG5hbWUgIT0gTlVMTCkgZnJlZShvdXRuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQpIGJyZWFrOworICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBndW56aXAoJnN0cm0sIE5VTEwsIE5VTEwsIHRlc3QpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBpbmZsYXRlQmFja0VuZCgmc3RybSk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3psaWJfaG93Lmh0bWwgYi9leGFtcGxlcy96bGliX2hvdy5odG1sCmluZGV4IGIyYmRhNmIuLjQwOTk4ZGIgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3psaWJfaG93Lmh0bWwKKysrIGIvZXhhbXBsZXMvemxpYl9ob3cuaHRtbApAQCAtNDIwLDEwICs0MjAsMTEgQEAKICAgICAgICAgICAgIH0KIDwvYj48L3ByZT4KIFRoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIGVuZHMgd2hlbiA8dHQ+aW5mbGF0ZSgpPC90dD4gaGFzIG5vIG1vcmUgb3V0cHV0IGFzIGluZGljYXRlZAotYnkgbm90IGZpbGxpbmcgdGhlIG91dHB1dCBidWZmZXIsIGp1c3QgYXMgZm9yIDx0dD5kZWZsYXRlKCk8L3R0Pi4KK2J5IG5vdCBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyLCBqdXN0IGFzIGZvciA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdAorYXNzZXJ0IHRoYXQgPHR0PnN0cm0uYXZhaWxfaW48L3R0PiB3aWxsIGJlIHplcm8sIHNpbmNlIHRoZSBkZWZsYXRlIHN0cmVhbSBtYXkgZW5kIGJlZm9yZSB0aGUgZmlsZQorZG9lcy4KIDxwcmU+PGI+CiAgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOwotICAgICAgICBhc3NlcnQoc3RybS5hdmFpbF9pbiA9PSAwKTsgICAgIC8qIGFsbCBpbnB1dCB3aWxsIGJlIHVzZWQgKi8KIDwvYj48L3ByZT48IS0tIC0tPgogVGhlIG91dGVyIDx0dD5kbzwvdHQ+LWxvb3AgZW5kcyB3aGVuIDx0dD5pbmZsYXRlKCk8L3R0PiByZXBvcnRzIHRoYXQgaXQgaGFzIHJlYWNoZWQgdGhlCiBlbmQgb2YgdGhlIGlucHV0IDxlbT56bGliPC9lbT4gc3RyZWFtLCBoYXMgY29tcGxldGVkIHRoZSBkZWNvbXByZXNzaW9uIGFuZCBpbnRlZ3JpdHkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3pwaXBlLmMgYi9leGFtcGxlcy96cGlwZS5jCmluZGV4IGE2MDJkNTkuLjI2YWJiNTYgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3pwaXBlLmMKKysrIGIvZXhhbXBsZXMvenBpcGUuYwpAQCAtNyw2ICs3LDcgQEAKICAgIDEuMSAgIDggTm92IDIwMDQgIEFkZCB2b2lkIGNhc3RpbmcgZm9yIHVudXNlZCByZXR1cm4gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICBVc2Ugc3dpdGNoIHN0YXRlbWVudCBmb3IgaW5mbGF0ZSgpIHJldHVybiB2YWx1ZXMKICAgIDEuMiAgIDkgTm92IDIwMDQgIEFkZCBhc3NlcnRpb25zIHRvIGRvY3VtZW50IHpsaWIgZ3VhcmFudGVlcworICAgMS4zICAgNiBBcHIgMjAwNSAgUmVtb3ZlIGluY29ycmVjdCBhc3NlcnRpb24gaW4gaW5mKCkKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTEyNyw3ICsxMjgsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwogICAgICAgICAgICAgfQogICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0KHN0cm0uYXZhaWxfaW4gPT0gMCk7ICAgICAvKiBhbGwgaW5wdXQgd2lsbCBiZSB1c2VkICovCiAKICAgICAgICAgLyogZG9uZSB3aGVuIGluZmxhdGUoKSBzYXlzIGl0J3MgZG9uZSAqLwogICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOwpkaWZmIC0tZ2l0IGEvZ3ppby5jIGIvZ3ppby5jCmluZGV4IDIxN2E0Y2MuLmIwNjliN2EgMTAwNjQ0Ci0tLSBhL2d6aW8uYworKysgYi9nemlvLmMKQEAgLTEsNSArMSw1IEBACiAvKiBnemlvLmMgLS0gSU8gb24gLmd6IGZpbGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqCiAgKiBDb21waWxlIHRoaXMgZmlsZSB3aXRoIC1ETk9fR1pDT01QUkVTUyB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgIGlmIChzLT56X2VvZikgcmV0dXJuIEVPRjsKICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKKyAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7CiAgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgewogICAgICAgICAgICAgcy0+el9lb2YgPSAxOwogICAgICAgICAgICAgaWYgKGZlcnJvcihzLT5maWxlKSkgcy0+el9lcnIgPSBaX0VSUk5POwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgaWYgKGxlbiA8IDIpIHsKICAgICAgICAgaWYgKGxlbikgcy0+aW5idWZbMF0gPSBzLT5zdHJlYW0ubmV4dF9pblswXTsKICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBsZW4gPSBmcmVhZChzLT5pbmJ1ZiArIGxlbiwgMSwgWl9CVUZTSVpFID4+IGxlbiwgcy0+ZmlsZSk7CisgICAgICAgIGxlbiA9ICh1SW50KWZyZWFkKHMtPmluYnVmICsgbGVuLCAxLCBaX0JVRlNJWkUgPj4gbGVuLCBzLT5maWxlKTsKICAgICAgICAgaWYgKGxlbiA9PSAwICYmIGZlcnJvcihzLT5maWxlKSkgcy0+el9lcnIgPSBaX0VSUk5POwogICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gKz0gbGVuOwogICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwpAQCAtNDE1LDYgKzQxNSw3IEBACiAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQtLTsKICAgICAgICAgcy0+YmFjayA9IEVPRjsKICAgICAgICAgcy0+b3V0Kys7CisgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgIGlmIChzLT5sYXN0KSB7CiAgICAgICAgICAgICBzLT56X2VyciA9IFpfU1RSRUFNX0VORDsKICAgICAgICAgICAgIHJldHVybiAxOwpAQCAtNDM2LDggKzQzNyw4IEBACiAgICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luICAtPSBuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCAtPSBmcmVhZChuZXh0X291dCwgMSwgcy0+c3RyZWFtLmF2YWlsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpbGUpOworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgLT0KKyAgICAgICAgICAgICAgICAgICAgKHVJbnQpZnJlYWQobmV4dF9vdXQsIDEsIHMtPnN0cmVhbS5hdmFpbF9vdXQsIHMtPmZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGVuIC09IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CiAgICAgICAgICAgICBzLT5pbiAgKz0gbGVuOwpAQCAtNDQ4LDE3ICs0NDksMTMgQEAKICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwICYmICFzLT56X2VvZikgewogCiAgICAgICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOwogICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcy0+el9lb2YgPSAxOwogICAgICAgICAgICAgICAgIGlmIChmZXJyb3Iocy0+ZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZlb2Yocy0+ZmlsZSkpIHsgICAgICAgIC8qIGF2b2lkIGVycm9yIGZvciBlbXB0eSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9TVFJFQU1fRU5EOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwogICAgICAgICB9CkBAIC05MDMsNiArOTAwLDE4IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIDEgaWYgcmVhZGluZyBhbmQgZG9pbmcgc28gdHJhbnNwYXJlbnRseSwgb3RoZXJ3aXNlIHplcm8uCisqLworaW50IFpFWFBPUlQgZ3pkaXJlY3QgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAwOworICAgIHJldHVybiBzLT50cmFuc3BhcmVudDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBPdXRwdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKICovCiBsb2NhbCB2b2lkIHB1dExvbmcgKGZpbGUsIHgpCmRpZmYgLS1naXQgYS9pbmZsYXRlLmMgYi9pbmZsYXRlLmMKaW5kZXggNTczMzQzNy4uN2RjY2M5ZCAxMDA2NDQKLS0tIGEvaW5mbGF0ZS5jCisrKyBiL2luZmxhdGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC0xMzM0LDExICsxMzM0LDE1IEBACiAgICAgLyogY29weSBzdGF0ZSAqLwogICAgIHptZW1jcHkoZGVzdCwgc291cmNlLCBzaXplb2Yoel9zdHJlYW0pKTsKICAgICB6bWVtY3B5KGNvcHksIHN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKLSAgICBjb3B5LT5sZW5jb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmxlbmNvZGUgLSBzdGF0ZS0+Y29kZXMpOwotICAgIGNvcHktPmRpc3Rjb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmRpc3Rjb2RlIC0gc3RhdGUtPmNvZGVzKTsKKyAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCisgICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpCisgICAgeworICAgICAgICBjb3B5LT5sZW5jb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmxlbmNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgICAgICBjb3B5LT5kaXN0Y29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5kaXN0Y29kZSAtIHN0YXRlLT5jb2Rlcyk7CisgICAgfQogICAgIGNvcHktPm5leHQgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+bmV4dCAtIHN0YXRlLT5jb2Rlcyk7CiAgICAgaWYgKHdpbmRvdyAhPSBaX05VTEwpCi0gICAgICAgIHptZW1jcHkod2luZG93LCBzdGF0ZS0+d2luZG93LCAxVSA8PCBzdGF0ZS0+d2JpdHMpOworICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgKHVJbnQpKDFVIDw8IHN0YXRlLT53Yml0cykpOwogICAgIGNvcHktPndpbmRvdyA9IHdpbmRvdzsKICAgICBkZXN0LT5zdGF0ZSA9ICh2b2lkcGYpY29weTsKICAgICByZXR1cm4gWl9PSzsKZGlmZiAtLWdpdCBhL2luZnRyZWVzLmMgYi9pbmZ0cmVlcy5jCmluZGV4IDcyYzViNzUuLjQ3MWY3MzUgMTAwNjQ0Ci0tLSBhL2luZnRyZWVzLmMKKysrIGIvaW5mdHJlZXMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZnRyZWVzLmMgLS0gZ2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtOSw3ICs5LDcgQEAKICNkZWZpbmUgTUFYQklUUyAxNQogCiBjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMi4yLjIgQ29weXJpZ2h0IDE5OTUtMjAwNCBNYXJrIEFkbGVyICI7CisgICAiIGluZmxhdGUgMS4yLjIuMyBDb3B5cmlnaHQgMTk5NS0yMDA1IE1hcmsgQWRsZXIgIjsKIC8qCiAgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKICAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdApAQCAtNjIsNyArNjIsNyBAQAogICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KICAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCi0gICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgMTk5fTsKKyAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDY2LCA3MX07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLwogICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCiAgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKQEAgLTI2Miw3ICsyNjIsNyBAQAogICAgICAgICAgICAgICAgIGRyb3AgPSByb290OwogCiAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCi0gICAgICAgICAgICBuZXh0ICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBuZXh0ICs9ICh1bnNpZ25lZCkoMVUgPDwgY3Vycik7CiAKICAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLwogICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CmRpZmYgLS1naXQgYS9taW5pZ3ppcC5jIGIvbWluaWd6aXAuYwppbmRleCA0YmE1ZTUwLi40NTI0Yjk2IDEwMDY0NAotLS0gYS9taW5pZ3ppcC5jCisrKyBiL21pbmlnemlwLmMKQEAgLTEsNSArMSw1IEBACiAvKiBtaW5pZ3ppcC5jIC0tIHNpbXVsYXRlIGd6aXAgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtMjk1LDYgKzI5NSw4IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgYXJnYy0tLCBhcmd2Kys7CiAgICAgfQorICAgIGlmIChvdXRtb2RlWzNdID09ICcgJykKKyAgICAgICAgb3V0bW9kZVszXSA9IDA7CiAgICAgaWYgKGFyZ2MgPT0gMCkgewogICAgICAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOwogICAgICAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKZGlmZiAtLWdpdCBhL3FueC9wYWNrYWdlLnFwZyBiL3FueC9wYWNrYWdlLnFwZwppbmRleCAwM2NkMzUxLi5iMDg3NzhkIDEwMDY0NAotLS0gYS9xbngvcGFja2FnZS5xcGcKKysrIGIvcW54L3BhY2thZ2UucXBnCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICAgIDxRUEc6RmlsZXM+CiAgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96Y29uZi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+CiAgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96bGliLmgiIGluc3RhbGw9Ii9vcHQvaW5jbHVkZS8iIHVzZXI9InJvb3Q6c3lzIiBwZXJtaXNzaW9uPSI2NDQiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjIuMiIgaW5zdGFsbD0iL29wdC9saWIvIiB1c2VyPSJyb290OmJpbiIgcGVybWlzc2lvbj0iNjQ0Ii8+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSJsaWJ6LnNvIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0iZGV2IiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4yLjIiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4yLjIiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjIuMiIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9InNsaWIiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjIuMyIgaW5zdGFsbD0iL29wdC9saWIvIiB1c2VyPSJyb290OmJpbiIgcGVybWlzc2lvbj0iNjQ0Ii8+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSJsaWJ6LnNvIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0iZGV2IiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4yLjMiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4yLjMiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjIuMyIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9InNsaWIiLz4KICAgICAgIDwvUVBHOkZpbGVzPgogCiAgICAgICA8UVBHOlBhY2thZ2VGaWx0ZXI+CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICA8L1FQTTpQcm9kdWN0RGVzY3JpcHRpb24+CiAKICAgICAgICAgICAgIDxRUE06UmVsZWFzZURlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlVmVyc2lvbj4xLjIuMi4yPC9RUE06UmVsZWFzZVZlcnNpb24+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VWZXJzaW9uPjEuMi4yLjM8L1FQTTpSZWxlYXNlVmVyc2lvbj4KICAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UmVsZWFzZVVyZ2VuY3k+CiAgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VTdGFiaWxpdHk+U3RhYmxlPC9RUE06UmVsZWFzZVN0YWJpbGl0eT4KICAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNaW5vcj48L1FQTTpSZWxlYXNlTm90ZU1pbm9yPgpkaWZmIC0tZ2l0IGEvd2luMzIvemxpYjEucmMgYi93aW4zMi96bGliMS5yYwppbmRleCAxZDM3Njk0Li5lNDlhODFjIDEwMDY0NAotLS0gYS93aW4zMi96bGliMS5yYworKysgYi93aW4zMi96bGliMS5yYwpAQCAtNSw4ICs1LDggQEAKICNlbHNlCiBWU19WRVJTSU9OX0lORk8JCVZFUlNJT05JTkZPCU1PVkVBQkxFIElNUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFCiAjZW5kaWYKLSAgRklMRVZFUlNJT04JCTEsMiwyLDIKLSAgUFJPRFVDVFZFUlNJT04JMSwyLDIsMgorICBGSUxFVkVSU0lPTgkJMSwyLDIsMworICBQUk9EVUNUVkVSU0lPTgkxLDIsMiwzCiAgIEZJTEVGTEFHU01BU0sJCVZTX0ZGSV9GSUxFRkxBR1NNQVNLCiAjaWZkZWYgX0RFQlVHCiAgIEZJTEVGTEFHUwkJMQpAQCAtMjMsMTIgKzIzLDEyIEBACiAgICAgLy9sYW5ndWFnZSBJRCA9IFUuUy4gRW5nbGlzaCwgY2hhciBzZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwKICAgICBCRUdJTgogICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsCSJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeVwwIgotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJIjEuMi4yLjJcMCIKKyAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuMi4zXDAiCiAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWIxLmRsbFwwIgogICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwJIihDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseSAmIE1hcmsgQWRsZXJcMCIKICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIxLmRsbFwwIgogICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwJInpsaWJcMCIKLSAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsCSIxLjIuMi4yXDAiCisgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLAkiMS4yLjIuM1wwIgogICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIgogICAgIEVORAogICBFTkQKZGlmZiAtLWdpdCBhL3pjb25mLmggYi96Y29uZi5oCmluZGV4IDY4OTdiZjAuLjAzYTk0MzEgMTAwNjQ0Ci0tLSBhL3pjb25mLmgKKysrIGIvemNvbmYuaApAQCAtMSw1ICsxLDUgQEAKIC8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC02OCw4ICs2OCwxMCBAQAogI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCiAjICBkZWZpbmUgV0lORE9XUwogI2VuZGlmCi0jaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKFdJTjMyKQotIyAgZGVmaW5lIFdJTjMyCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgogI2VuZGlmCiAjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKICMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKZGlmZiAtLWdpdCBhL3pjb25mLmluLmggYi96Y29uZi5pbi5oCmluZGV4IDY4OTdiZjAuLjAzYTk0MzEgMTAwNjQ0Ci0tLSBhL3pjb25mLmluLmgKKysrIGIvemNvbmYuaW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC02OCw4ICs2OCwxMCBAQAogI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCiAjICBkZWZpbmUgV0lORE9XUwogI2VuZGlmCi0jaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKFdJTjMyKQotIyAgZGVmaW5lIFdJTjMyCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgogI2VuZGlmCiAjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKICMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKZGlmZiAtLWdpdCBhL3psaWIuMyBiL3psaWIuMwppbmRleCAxNzQ5MWNjLi40MWU1ZmVkIDEwMDY0NAotLS0gYS96bGliLjMKKysrIGIvemxpYi4zCkBAIC0xLDQgKzEsNCBAQAotLlRIIFpMSUIgMyAiMzAgRGVjZW1iZXIgMjAwNCIKKy5USCBaTElCIDMgIjI3IE1heSAyMDA1IgogLlNIIE5BTUUKIHpsaWIgXC0gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBsaWJyYXJ5CiAuU0ggU1lOT1BTSVMKQEAgLTEzMyw3ICsxMzMsNyBAQAogU2VuZCBxdWVzdGlvbnMgYW5kL29yIGNvbW1lbnRzIHRvIHpsaWJAZ3ppcC5vcmcsCiBvciAoZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uKSB0byBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLgogLlNIIEFVVEhPUlMKLVZlcnNpb24gMS4yLjIuMgorVmVyc2lvbiAxLjIuMi4zCiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykKIGFuZCBNYXJrIEFkbGVyIChtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KS4KIC5MUApkaWZmIC0tZ2l0IGEvemxpYi5oIGIvemxpYi5oCmluZGV4IGIxM2NhNmYuLjliYjY5MzEgMTAwNjQ0Ci0tLSBhL3psaWIuaAorKysgYi96bGliLmgKQEAgLTEsNyArMSw3IEBACiAvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgdmVyc2lvbiAxLjIuMi4yLCBEZWNlbWJlciAzMHRoLCAyMDA0CisgIHZlcnNpb24gMS4yLjIuMywgTWF5IDI3dGgsIDIwMDUKIAotICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKIAogICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCkBAIC0zNyw4ICszNyw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjIuMiIKLSNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjIyCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjIuMyIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjIzCiAKIC8qCiAgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCkBAIC01NTYsNyArNTU2LDkgQEAKICAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKICAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCiAgICBkZWZsYXRlIG9yIGRlZmxhdGUyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBzaG91bGQgYmUKLSAgIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LgorICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuIEluIGFkZGl0aW9uLCB0aGUKKyAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZSBtaW51cworICAgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgogCiAgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQogICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQpAQCAtNjIyLDYgKzYyNCwyMyBAQAogICAgaWYgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgogKi8KIAorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7CisvKgorICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKKyAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKKyAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKKyAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQorICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgorCisgICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKKyAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KKyAqLworCiBaRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOwogLyoKQEAgLTcwMyw3ICs3MjIsNyBAQAogICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gQWRkCiAgICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgogICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAotICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcworICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMKICAgIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgogCiAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKQEAgLTExODUsNiArMTIwNCwxMiBAQAogICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KICovCiAKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIDEgaWYgZmlsZSBpcyBiZWluZyByZWFkIGRpcmVjdGx5IHdpdGhvdXQgZGVjb21wcmVzc2lvbiwgb3RoZXJ3aXNlCisgICB6ZXJvLgorKi8KKwogWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemNsb3NlIE9GKChnekZpbGUgZmlsZSkpOwogLyoKICAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQpkaWZmIC0tZ2l0IGEvenV0aWwuaCBiL3p1dGlsLmgKaW5kZXggNTIwOWQ2NS4uYzgwMGZhYiAxMDA2NDQKLS0tIGEvenV0aWwuaAorKysgYi96dXRpbC5oCkBAIC0xLDUgKzEsNSBAQAogLyogenV0aWwuaCAtLSBpbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTE3LDcgKzE3LDkgQEAKICNpbmNsdWRlICJ6bGliLmgiCiAKICNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGlmbmRlZiBfV0lOMzJfV0NFCisjICAgIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyAgZW5kaWYKICMgIGluY2x1ZGUgPHN0cmluZy5oPgogIyAgaW5jbHVkZSA8c3RkbGliLmg+CiAjZW5kaWYKQEAgLTMyLDcgKzM0LDkgQEAKICMgICBlbmRpZgogICAgIGV4dGVybiBpbnQgZXJybm87CiAjZWxzZQotIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICBpZm5kZWYgX1dJTjMyX1dDRQorIyAgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIGxvY2FsCg==