ZGlmZiAtLWdpdCBhL2NvZGVycy9ibXAuYyBiL2NvZGVycy9ibXAuYwppbmRleCBhMTIyMGMwLi5lZGMyOTM5IDEwMDY0NAotLS0gYS9jb2RlcnMvYm1wLmMKKysrIGIvY29kZXJzL2JtcC5jCkBAIC02MjAsOCArNjIwLDggQEAKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgICAiICBGb3JtYXQ6IE9TLzIgQml0bWFwIik7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgR2VvbWV0cnk6ICVsdXglbHUiLCh1bnNpZ25lZCBsb25nKSBibXBfaW5mby53aWR0aCwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGJtcF9pbmZvLmhlaWdodCk7CisgICAgICAgICAgICAgICIgIEdlb21ldHJ5OiAlLjIwZ3glLjIwZyIsKGRvdWJsZSkgYm1wX2luZm8ud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgICAgYm1wX2luZm8uaGVpZ2h0KTsKICAgICAgICAgICB9CiAgICAgICB9CiAgICAgZWxzZQpAQCAtNjQ4LDEwICs2NDgsMTAgQEAKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgICAiICBGb3JtYXQ6IE1TIFdpbmRvd3MgYml0bWFwIik7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgR2VvbWV0cnk6ICVsdXglbHUiLCh1bnNpZ25lZCBsb25nKSBibXBfaW5mby53aWR0aCwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGJtcF9pbmZvLmhlaWdodCk7CisgICAgICAgICAgICAgICIgIEdlb21ldHJ5OiAlLjIwZ3glLjIwZyIsKGRvdWJsZSkgYm1wX2luZm8ud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgICAgYm1wX2luZm8uaGVpZ2h0KTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICBCaXRzIHBlciBwaXhlbDogJWx1IiwodW5zaWduZWQgbG9uZykgYm1wX2luZm8uYml0c19wZXJfcGl4ZWwpOworICAgICAgICAgICAgICAiICBCaXRzIHBlciBwaXhlbDogJS4yMGciLChkb3VibGUpIGJtcF9pbmZvLmJpdHNfcGVyX3BpeGVsKTsKICAgICAgICAgICAgIHN3aXRjaCAoKGludCkgYm1wX2luZm8uY29tcHJlc3Npb24pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGNhc2UgQklfUkdCOgpAQCAtODU3LDcgKzg1Nyw3IEBACiAgICAgICAgICovCiAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAiICBSZWFkaW5nIGNvbG9ybWFwIG9mICVsdSBjb2xvcnMiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzKTsKKyAgICAgICAgICAgICIgIFJlYWRpbmcgY29sb3JtYXAgb2YgJS4yMGcgY29sb3JzIiwoZG91YmxlKSBpbWFnZS0+Y29sb3JzKTsKICAgICAgICAgaWYgKEFjcXVpcmVJbWFnZUNvbG9ybWFwKGltYWdlLGltYWdlLT5jb2xvcnMpID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICAgICAgICBibXBfY29sb3JtYXA9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkoKHNpemVfdCkKQEAgLTkwNyw3ICs5MDcsNyBAQAogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgIiAgUmVhZGluZyBwaXhlbHMgKCVsdSBieXRlcykiLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAgICAgIiAgUmVhZGluZyBwaXhlbHMgKCUuMjBnIGJ5dGVzKSIsKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgICAgY291bnQ9UmVhZEJsb2IoaW1hZ2UsbGVuZ3RoLHBpeGVscyk7CiAgICAgICAgIGlmIChjb3VudCAhPSAoc3NpemVfdCkgbGVuZ3RoKQogICAgICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKENvcnJ1cHRJbWFnZUVycm9yLCJJbnN1ZmZpY2llbnRJbWFnZURhdGFJbkZpbGUiKTsKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgIHsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgIFdyaXRpbmcgQk1QIHZlcnNpb24gJWxkIGRhdGFzdHJlYW0iLChsb25nKSB0eXBlKTsKKyAgICAgICAgICAiICAgV3JpdGluZyBCTVAgdmVyc2lvbiAlLjIwZyBkYXRhc3RyZWFtIiwoZG91YmxlKSB0eXBlKTsKICAgICAgICAgaWYgKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IERpcmVjdENsYXNzKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgIiAgIFN0b3JhZ2UgY2xhc3M9RGlyZWN0Q2xhc3MiKTsKQEAgLTE4MzgsNyArMTgzOCw3IEBACiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAiICAgU3RvcmFnZSBjbGFzcz1Qc2V1ZG9DbGFzcyIpOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgSW1hZ2UgZGVwdGg9JWx1IiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICAgICAiICAgSW1hZ2UgZGVwdGg9JS4yMGciLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICAgIGlmIChpbWFnZS0+bWF0dGUgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAiICAgTWF0dGU9VHJ1ZSIpOwpAQCAtMTg0Niw3ICsxODQ2LDcgQEAKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICIgICBNYXR0ZT1NYWdpY2tGYWxzZSIpOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgQk1QIGJpdHNfcGVyX3BpeGVsPSVsdSIsKHVuc2lnbmVkIGxvbmcpIGJtcF9pbmZvLmJpdHNfcGVyX3BpeGVsKTsKKyAgICAgICAgICAiICAgQk1QIGJpdHNfcGVyX3BpeGVsPSUuMjBnIiwoZG91YmxlKSBibXBfaW5mby5iaXRzX3Blcl9waXhlbCk7CiAgICAgICAgIHN3aXRjaCAoKGludCkgYm1wX2luZm8uY29tcHJlc3Npb24pCiAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBCSV9SR0I6CkBAIC0yMDAxLDcgKzIwMDEsNyBAQAogICAgICAgICAqLwogICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgIiAgQ29sb3JtYXA6ICVsdSBlbnRyaWVzIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbG9ycyk7CisgICAgICAgICAgICAiICBDb2xvcm1hcDogJS4yMGcgZW50cmllcyIsKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICAgIGJtcF9jb2xvcm1hcD0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeSgoc2l6ZV90KSAoMVVMIDw8CiAgICAgICAgICAgYm1wX2luZm8uYml0c19wZXJfcGl4ZWwpLDQqc2l6ZW9mKCpibXBfY29sb3JtYXApKTsKICAgICAgICAgaWYgKGJtcF9jb2xvcm1hcCA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQpkaWZmIC0tZ2l0IGEvY29kZXJzL2JyYWlsbGUuYyBiL2NvZGVycy9icmFpbGxlLmMKaW5kZXggOWRhYzhlNS4uZDU1MDljZiAxMDA2NDQKLS0tIGEvY29kZXJzL2JyYWlsbGUuYworKysgYi9jb2RlcnMvYnJhaWxsZS5jCkBAIC0yMjgsMjEgKzIyOCwyMSBAQAogICAgICAgfQogICAgICAgaWYgKGltYWdlLT5wYWdlLngpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlg6ICVsZFxuIiwobG9uZykgCisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlg6ICUuMjBnXG4iLChkb3VibGUpIAogICAgICAgICAgIGltYWdlLT5wYWdlLngpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgICBpZiAoaW1hZ2UtPnBhZ2UueSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiWTogJWxkXG4iLChsb25nKSAKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiWTogJS4yMGdcbiIsKGRvdWJsZSkgCiAgICAgICAgICAgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIldpZHRoOiAlbHVcbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSAoaW1hZ2UtPmNvbHVtbnMrKGltYWdlLT5jb2x1bW5zICUgMikpKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIldpZHRoOiAlLjIwZ1xuIiwKKyAgICAgICAgKGRvdWJsZSkgKGltYWdlLT5jb2x1bW5zKyhpbWFnZS0+Y29sdW1ucyAlIDIpKSk7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJIZWlnaHQ6ICVsdVxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIkhlaWdodDogJS4yMGdcbiIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29kZXJzL2Npbi5jIGIvY29kZXJzL2Npbi5jCmluZGV4IDIyNjU2ZTMuLmU5ZjA1NWEgMTAwNjQ0Ci0tLSBhL2NvZGVycy9jaW4uYworKysgYi9jb2RlcnMvY2luLmMKQEAgLTU4NCwxMyArNTg0LDEzIEBACiAgIGNpbi5vcmlnaW5hdGlvbi54X29mZnNldD0oc3NpemVfdCkgUmVhZEJsb2JMb25nKGltYWdlKTsKICAgb2Zmc2V0Kz00OwogICBpZiAoKHNpemVfdCkgY2luLm9yaWdpbmF0aW9uLnhfb2Zmc2V0ICE9IH4wVUwpCi0gICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpvcmlnaW5hdGlvbi54X29mZnNldCIsIiVsZCIsCi0gICAgICAobG9uZykgY2luLm9yaWdpbmF0aW9uLnhfb2Zmc2V0KTsKKyAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiY2luOm9yaWdpbmF0aW9uLnhfb2Zmc2V0IiwiJS4yMGciLAorICAgICAgKGRvdWJsZSkgY2luLm9yaWdpbmF0aW9uLnhfb2Zmc2V0KTsKICAgY2luLm9yaWdpbmF0aW9uLnlfb2Zmc2V0PShzc2l6ZV90KSBSZWFkQmxvYkxvbmcoaW1hZ2UpOwogICBvZmZzZXQrPTQ7CiAgIGlmICgoc2l6ZV90KSBjaW4ub3JpZ2luYXRpb24ueV9vZmZzZXQgIT0gfjBVTCkKLSAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiY2luOm9yaWdpbmF0aW9uLnlfb2Zmc2V0IiwiJWxkIiwKLSAgICAgIChsb25nKSBjaW4ub3JpZ2luYXRpb24ueV9vZmZzZXQpOworICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46b3JpZ2luYXRpb24ueV9vZmZzZXQiLCIlLjIwZyIsCisgICAgICAoZG91YmxlKSBjaW4ub3JpZ2luYXRpb24ueV9vZmZzZXQpOwogICBvZmZzZXQrPVJlYWRCbG9iKGltYWdlLHNpemVvZihjaW4ub3JpZ2luYXRpb24uZmlsZW5hbWUpLCh1bnNpZ25lZCBjaGFyICopCiAgICAgY2luLm9yaWdpbmF0aW9uLmZpbGVuYW1lKTsKICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpvcmlnaW5hdGlvbi5maWxlbmFtZSIsCkBAIC02NDcsNyArNjQ3LDcgQEAKICAgICAgIGNpbi5maWxtLnByZWZpeD1SZWFkQmxvYkxvbmcoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kz00OwogICAgICAgaWYgKGNpbi5maWxtLnByZWZpeCAhPSB+MFVMKQotICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiY2luOmZpbG0ucHJlZml4IiwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpmaWxtLnByZWZpeCIsIiUuMjBnIiwoZG91YmxlKQogICAgICAgICAgIGNpbi5maWxtLnByZWZpeCk7CiAgICAgICBjaW4uZmlsbS5jb3VudD1SZWFkQmxvYkxvbmcoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kz00OwpAQCAtNjU3LDggKzY1Nyw4IEBACiAgICAgICBjaW4uZmlsbS5mcmFtZV9wb3NpdGlvbj1SZWFkQmxvYkxvbmcoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kz00OwogICAgICAgaWYgKGNpbi5maWxtLmZyYW1lX3Bvc2l0aW9uICE9IH4wVUwpCi0gICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46ZmlsbS5mcmFtZV9wb3NpdGlvbiIsIiVsdSIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNpbi5maWxtLmZyYW1lX3Bvc2l0aW9uKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpmaWxtLmZyYW1lX3Bvc2l0aW9uIiwiJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIGNpbi5maWxtLmZyYW1lX3Bvc2l0aW9uKTsKICAgICAgIGNpbi5maWxtLmZyYW1lX3JhdGU9UmVhZEJsb2JGbG9hdChpbWFnZSk7CiAgICAgICBvZmZzZXQrPTQ7CiAgICAgICBpZiAoSXNGbG9hdERlZmluZWQoY2luLmZpbG0uZnJhbWVfcmF0ZSkgIT0gTWFnaWNrRmFsc2UpCmRpZmYgLS1naXQgYS9jb2RlcnMvY2lwLmMgYi9jb2RlcnMvY2lwLmMKaW5kZXggY2U3Zjk3My4uMzE4ZWIzMSAxMDA2NDQKLS0tIGEvY29kZXJzL2NpcC5jCisrKyBiL2NvZGVycy9jaXAuYwpAQCAtMjEyLDE3ICsyMTIsMTcgQEAKICAgICAgICAgYmFzZW5hbWUpOwogICAgIH0KICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8TG9jYXRpb25YPiVsZDwvTG9jYXRpb25YPlxuIiwKLSAgICAobG9uZykgaW1hZ2UtPnBhZ2UueCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCisgICAgIjxMb2NhdGlvblg+JS4yMGc8L0xvY2F0aW9uWD5cbiIsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiPExvY2F0aW9uWT4lbGQ8L0xvY2F0aW9uWT5cbiIsCi0gICAgKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICI8TG9jYXRpb25ZPiUuMjBnPC9Mb2NhdGlvblk+XG4iLChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxXaWR0aD4lbHU8L1dpZHRoPlxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgKGltYWdlLT5jb2x1bW5zKyhpbWFnZS0+Y29sdW1ucyAlIDIpKSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxXaWR0aD4lLjIwZzwvV2lkdGg+XG4iLAorICAgIChkb3VibGUpIChpbWFnZS0+Y29sdW1ucysoaW1hZ2UtPmNvbHVtbnMgJSAyKSkpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxIZWlnaHQ+JWx1PC9IZWlnaHQ+XG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxIZWlnaHQ+JS4yMGc8L0hlaWdodD5cbiIsCisgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxEZXB0aD4yPC9EZXB0aD5cbiIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9jb2RlcnMvZGp2dS5jIGIvY29kZXJzL2RqdnUuYwppbmRleCAyZmYyZTA3Li5iYTBlNTA4IDEwMDY0NAotLS0gYS9jb2RlcnMvZGp2dS5jCisrKyBiL2NvZGVycy9kanZ1LmMKQEAgLTY1OSw3ICs2NTksOCBAQAogICAgICAgICAgICAgICAgIC8qIGlzIHRoaXMgdXNlZnVsPyAqLwogICAgICAgICB9CiAjaWYgREVCVUcKLSAgICAgICAgcHJpbnRmKCJub3cgZmlsbGluZyAlbGQgeCAlbGRcbiIsIGltYWdlLT5jb2x1bW5zLGltYWdlLT5yb3dzKTsKKyAgICAgICAgcHJpbnRmKCJub3cgZmlsbGluZyAlLjIwZyB4ICUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnJvd3MpOwogI2VuZGlmCiAKIApAQCAtNjg0LDcgKzY4NSw4IEBACiAKIAogI2lmIERFQlVHCi0gICAgICAgIHByaW50ZigiRU5EOiBmaW5pc2hlZCBmaWxsaW5nICVsZCB4ICVsZFxuIiwgaW1hZ2UtPmNvbHVtbnMsaW1hZ2UtPnJvd3MpOworICAgICAgICBwcmludGYoIkVORDogZmluaXNoZWQgZmlsbGluZyAlLjIwZyB4ICUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5yb3dzKTsKICNlbmRpZgogCiAgICAgICAgIFN5bmNJbWFnZShpbWFnZSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvZHB4LmMgYi9jb2RlcnMvZHB4LmMKaW5kZXggMmU4MDI2MC4uYzBmMmY1YyAxMDA2NDQKLS0tIGEvY29kZXJzL2RweC5jCisrKyBiL2NvZGVycy9kcHguYwpAQCAtOTAwLDE4ICs5MDAsMTggQEAKICAgICAgIGRweC50ZWxldmlzaW9uLmludGVybGFjZT0odW5zaWduZWQgY2hhcikgUmVhZEJsb2JCeXRlKGltYWdlKTsKICAgICAgIG9mZnNldCsrOwogICAgICAgaWYgKGRweC50ZWxldmlzaW9uLmludGVybGFjZSAhPSAwKQotICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiZHB4OnRlbGV2aXNpb24uaW50ZXJsYWNlIiwiJWxkIiwKLSAgICAgICAgICAobG9uZykgZHB4LnRlbGV2aXNpb24uaW50ZXJsYWNlKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImRweDp0ZWxldmlzaW9uLmludGVybGFjZSIsIiUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBkcHgudGVsZXZpc2lvbi5pbnRlcmxhY2UpOwogICAgICAgZHB4LnRlbGV2aXNpb24uZmllbGRfbnVtYmVyPSh1bnNpZ25lZCBjaGFyKSBSZWFkQmxvYkJ5dGUoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kys7CiAgICAgICBpZiAoZHB4LnRlbGV2aXNpb24uZmllbGRfbnVtYmVyICE9IDApCi0gICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJkcHg6dGVsZXZpc2lvbi5maWVsZF9udW1iZXIiLCIlbGQiLAotICAgICAgICAgIChsb25nKSBkcHgudGVsZXZpc2lvbi5maWVsZF9udW1iZXIpOworICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiZHB4OnRlbGV2aXNpb24uZmllbGRfbnVtYmVyIiwiJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIGRweC50ZWxldmlzaW9uLmZpZWxkX251bWJlcik7CiAgICAgICBkcHgudGVsZXZpc2lvbi52aWRlb19zaWduYWw9KHVuc2lnbmVkIGNoYXIpIFJlYWRCbG9iQnl0ZShpbWFnZSk7CiAgICAgICBvZmZzZXQrKzsKICAgICAgIGlmIChkcHgudGVsZXZpc2lvbi52aWRlb19zaWduYWwgIT0gMCkKLSAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImRweDp0ZWxldmlzaW9uLnZpZGVvX3NpZ25hbCIsIiVsZCIsCi0gICAgICAgICAgKGxvbmcpIGRweC50ZWxldmlzaW9uLnZpZGVvX3NpZ25hbCk7CisgICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJkcHg6dGVsZXZpc2lvbi52aWRlb19zaWduYWwiLCIlLjIwZyIsCisgICAgICAgICAgKGRvdWJsZSkgZHB4LnRlbGV2aXNpb24udmlkZW9fc2lnbmFsKTsKICAgICAgIGRweC50ZWxldmlzaW9uLnBhZGRpbmc9KHVuc2lnbmVkIGNoYXIpIFJlYWRCbG9iQnl0ZShpbWFnZSk7CiAgICAgICBvZmZzZXQrKzsKICAgICAgIGlmIChkcHgudGVsZXZpc2lvbi5wYWRkaW5nICE9IDApCmRpZmYgLS1naXQgYS9jb2RlcnMvaHRtbC5jIGIvY29kZXJzL2h0bWwuYwppbmRleCA5ZmVlNGQ1Li43YmM2ZDQwIDEwMDY0NAotLS0gYS9jb2RlcnMvaHRtbC5jCisrKyBiL2NvZGVycy9odG1sLmMKQEAgLTM0MCw5ICszNDAsOSBAQAogICAgICAgaWYgKGltYWdlLT5kaXJlY3RvcnkgPT0gKGNoYXIgKikgTlVMTCkKICAgICAgICAgewogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiJXNcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCIwLDAsJWx1LCVsdVwiIGFsdD1cIlwiIC8+XG4iLAotICAgICAgICAgICAgaW1hZ2UtPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aC0xLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgZ2VvbWV0cnkuaGVpZ2h0LTEpOworICAgICAgICAgICAgIiVzXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiMCwwLCUuMjBnLCUuMjBnXCIgYWx0PVwiXCIgLz5cbiIsCisgICAgICAgICAgICBpbWFnZS0+ZmlsZW5hbWUsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgtMSwoZG91YmxlKSBnZW9tZXRyeS5oZWlnaHQtCisgICAgICAgICAgICAxKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgIH0KICAgICAgIGVsc2UKQEAgLTM1Miw5ICszNTIsOSBAQAogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAiXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiJWxkLCVsZCwlbGQsJWxkXCIgYWx0PVwiXCIgLz5cbiIsCi0gICAgICAgICAgICAgICAgKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5LnksKGxvbmcpIChnZW9tZXRyeS54KwotICAgICAgICAgICAgICAgIGdlb21ldHJ5LndpZHRoLTEpLChsb25nKSAoZ2VvbWV0cnkueStnZW9tZXRyeS5oZWlnaHQtMSkpOworICAgICAgICAgICAgICAgICJcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCIlLjIwZywlLjIwZywlLjIwZywlLjIwZ1wiIGFsdD1cIlwiIC8+XG4iLAorICAgICAgICAgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSwoZG91YmxlKSAoZ2VvbWV0cnkueCsKKyAgICAgICAgICAgICAgICBnZW9tZXRyeS53aWR0aC0xKSwoZG91YmxlKSAoZ2VvbWV0cnkueStnZW9tZXRyeS5oZWlnaHQtMSkpOwogICAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgICAgIGlmICgqKHArMSkgIT0gJ1wwJykKICAgICAgICAgICAgICAgICB7CkBAIC00MTYsOSArNDE2LDggQEAKICAgaWYgKGltYWdlLT5kaXJlY3RvcnkgPT0gKGNoYXIgKikgTlVMTCkKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiJXNcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCIwLDAsJWx1LCVsdVwiIGFsdD1cIlwiIC8+XG4iLAotICAgICAgICBpbWFnZS0+ZmlsZW5hbWUsKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLTEsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgIGdlb21ldHJ5LmhlaWdodC0xKTsKKyAgICAgICAgIiVzXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiMCwwLCUuMjBnLCUuMjBnXCIgYWx0PVwiXCIgLz5cbiIsCisgICAgICAgIGltYWdlLT5maWxlbmFtZSwoZG91YmxlKSBnZW9tZXRyeS53aWR0aC0xLChkb3VibGUpIGdlb21ldHJ5LmhlaWdodC0xKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICB9CiAgIGVsc2UKQEAgLTQyOCw5ICs0MjcsOSBAQAogICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICJcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCIlbGQsJWxkLCVsZCwlbGRcIiBhbHQ9XCJcIiAvPlxuIiwKLSAgICAgICAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGxvbmcpCi0gICAgICAgICAgICBnZW9tZXRyeS53aWR0aC0xLGdlb21ldHJ5LnkrKGxvbmcpIGdlb21ldHJ5LmhlaWdodC0xKTsKKyAgICAgICAgICAgICJcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCIlLjIwZywlLjIwZywlLjIwZywlLjIwZ1wiIGFsdD1cIlwiIC8+XG4iLAorICAgICAgICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGRvdWJsZSkKKyAgICAgICAgICAgIGdlb21ldHJ5LndpZHRoLTEsZ2VvbWV0cnkueSsoZG91YmxlKSBnZW9tZXRyeS5oZWlnaHQtMSk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIGlmICgqKHArMSkgIT0gJ1wwJykKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2NvZGVycy9pY29uLmMgYi9jb2RlcnMvaWNvbi5jCmluZGV4IGNmNTVlYWEuLmIzN2FmYTUgMTAwNjQ0Ci0tLSBhL2NvZGVycy9pY29uLmMKKysrIGIvY29kZXJzL2ljb24uYwpAQCAtMzI0LDE5ICszMjQsMTkgQEAKICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICB7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiBzY2VuZSAgICA9ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGkpOworICAgICAgICAgICAgICAiIHNjZW5lICAgID0gJS4yMGciLChkb3VibGUpIGkpOwogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgICBzaXplICAgPSAlbHUiLCh1bnNpZ25lZCBsb25nKSBpY29uX2luZm8uc2l6ZSk7CisgICAgICAgICAgICAgICIgICBzaXplICAgPSAlLjIwZyIsKGRvdWJsZSkgaWNvbl9pbmZvLnNpemUpOwogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgICB3aWR0aCAgPSAlbHUiLCh1bnNpZ25lZCBsb25nKSBpY29uX2ZpbGUuZGlyZWN0b3J5W2ldLndpZHRoKTsKKyAgICAgICAgICAgICAgIiAgIHdpZHRoICA9ICUuMjBnIiwoZG91YmxlKSBpY29uX2ZpbGUuZGlyZWN0b3J5W2ldLndpZHRoKTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgaGVpZ2h0ID0gJWx1IiwodW5zaWduZWQgbG9uZykgaWNvbl9maWxlLmRpcmVjdG9yeVtpXS5oZWlnaHQpOworICAgICAgICAgICAgICAiICAgaGVpZ2h0ID0gJS4yMGciLChkb3VibGUpIGljb25fZmlsZS5kaXJlY3RvcnlbaV0uaGVpZ2h0KTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgY29sb3JzID0gJWx1IiwodW5zaWduZWQgbG9uZyApIGljb25faW5mby5udW1iZXJfY29sb3JzKTsKKyAgICAgICAgICAgICAgIiAgIGNvbG9ycyA9ICUuMjBnIiwoZG91YmxlICkgaWNvbl9pbmZvLm51bWJlcl9jb2xvcnMpOwogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgICBwbGFuZXMgPSAlbHUiLCh1bnNpZ25lZCBsb25nKSBpY29uX2luZm8ucGxhbmVzKTsKKyAgICAgICAgICAgICAgIiAgIHBsYW5lcyA9ICUuMjBnIiwoZG91YmxlKSBpY29uX2luZm8ucGxhbmVzKTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgYnBwICAgID0gJWx1IiwodW5zaWduZWQgbG9uZykgaWNvbl9pbmZvLmJpdHNfcGVyX3BpeGVsKTsKKyAgICAgICAgICAgICAgIiAgIGJwcCAgICA9ICUuMjBnIiwoZG91YmxlKSBpY29uX2luZm8uYml0c19wZXJfcGl4ZWwpOwogICAgICAgICAgIH0KICAgICAgIGlmICgoaWNvbl9pbmZvLm51bWJlcl9jb2xvcnMgIT0gMCkgfHwgKGljb25faW5mby5iaXRzX3Blcl9waXhlbCA8PSAxNikpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2NvZGVycy9pcGwuYyBiL2NvZGVycy9pcGwuYwppbmRleCA3NTgzODhhLi4xYTBiODM0IDEwMDY0NAotLS0gYS9jb2RlcnMvaXBsLmMKKysrIGIvY29kZXJzL2lwbC5jCkBAIC0zMTQsNyArMzE0LDggQEAKICAgICAgIGlmIChpbWFnZS0+c2NlbmUgPj0gKGltYWdlX2luZm8tPnNjZW5lK2ltYWdlX2luZm8tPm51bWJlcl9zY2VuZXMtMSkpCiAgICAgICAgIGJyZWFrOwogLyoKLSAgIHByaW50ZigiTGVuZ3RoOiAlbHUsIE1lbW9yeSBzaXplOiAlbHVcbiIsIGxlbmd0aCwoc2l6ZV90KShpbWFnZS0+ZGVwdGgpKTsKKyAgIHByaW50ZigiTGVuZ3RoOiAlLjIwZywgTWVtb3J5IHNpemU6ICUuMjBnXG4iLCAoZG91YmxlKSBsZW5ndGgsKGRvdWJsZSkKKyAgICAgaW1hZ2UtPmRlcHRoKTsKICovCiAgICAgIHF1YW50dW1faW5mbz1BY3F1aXJlUXVhbnR1bUluZm8oaW1hZ2VfaW5mbyxpbWFnZSk7CiAgICAgIGlmIChxdWFudHVtX2luZm8gPT0gKFF1YW50dW1JbmZvICopIE5VTEwpCkBAIC0zMjUsOCArMzI2LDggQEAKICAgICAgcGl4ZWxzPUdldFF1YW50dW1QaXhlbHMocXVhbnR1bV9pbmZvKTsgCiAgICAgIGlmKGltYWdlLT5jb2x1bW5zICE9IGlwbF9pbmZvLndpZHRoKXsKIC8qCi0gICAgIHByaW50ZigiQ29sdW1ucyBub3Qgc2V0IGNvcnJlY3RseSEgIFdhbnRlZDogJWx1LCBnb3Q6ICVsdVxuIiwKLSAgICAgICBpcGxfaW5mby53aWR0aCwgaW1hZ2UtPmNvbHVtbnMpOworICAgICBwcmludGYoIkNvbHVtbnMgbm90IHNldCBjb3JyZWN0bHkhICBXYW50ZWQ6ICUuMjBnLCBnb3Q6ICUuMjBnXG4iLAorICAgICAgIChkb3VibGUpIGlwbF9pbmZvLndpZHRoLCAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucyk7CiAqLwogICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvZGVycy9qcDIuYyBiL2NvZGVycy9qcDIuYwppbmRleCBhMGFkMjVlLi41ZTNhZmEzIDEwMDY0NAotLS0gYS9jb2RlcnMvanAyLmMKKysrIGIvY29kZXJzL2pwMi5jCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICAgICAgICBibG9iPShqYXNfc3RyZWFtX21lbW9ial90ICopIGljY19zdHJlYW0tPm9ial87CiAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiUHJvZmlsZTogSUNDLCAlbHUgYnl0ZXMiLCh1bnNpZ25lZCBsb25nKSBibG9iLT5sZW5fKTsKKyAgICAgICAgICAgICAgIlByb2ZpbGU6IElDQywgJS4yMGcgYnl0ZXMiLChkb3VibGUpIGJsb2ItPmxlbl8pOwogICAgICAgICAgIHByb2ZpbGU9QWNxdWlyZVN0cmluZ0luZm8oYmxvYi0+bGVuXyk7CiAgICAgICAgICAgU2V0U3RyaW5nSW5mb0RhdHVtKHByb2ZpbGUsYmxvYi0+YnVmXyk7CiAgICAgICAgICAgaWNjX3Byb2ZpbGU9KFN0cmluZ0luZm8gKikgR2V0SW1hZ2VQcm9maWxlKGltYWdlLCJpY2MiKTsKZGlmZiAtLWdpdCBhL2NvZGVycy9qcGVnLmMgYi9jb2RlcnMvanBlZy5jCmluZGV4IDhjNjIzMjYuLmIyZDc2OGEgMTAwNjQ0Ci0tLSBhL2NvZGVycy9qcGVnLmMKKysrIGIvY29kZXJzL2pwZWcuYwpAQCAtNDMyLDcgKzQzMiw3IEBACiAgICAgfQogICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgIlByb2ZpbGU6IElDQywgJWx1IGJ5dGVzIiwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICJQcm9maWxlOiBJQ0MsICUuMjBnIGJ5dGVzIiwoZG91YmxlKSBsZW5ndGgpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAKQEAgLTUyOCw3ICs1MjgsNyBAQAogICAgIH0KICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICJQcm9maWxlOiBpcHRjLCAlbHUgYnl0ZXMiLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgIlByb2ZpbGU6IGlwdGMsICUuMjBnIGJ5dGVzIiwoZG91YmxlKSBsZW5ndGgpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAKQEAgLTYxMiw3ICs2MTIsNyBAQAogICAgICAgaW1hZ2UtPmZpbGVuYW1lKTsKICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICJQcm9maWxlOiAlcywgJWx1IGJ5dGVzIixuYW1lLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgIlByb2ZpbGU6ICVzLCAlLjIwZyBieXRlcyIsbmFtZSwoZG91YmxlKSBsZW5ndGgpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAKQEAgLTczNyw3ICs3MzcsNyBAQAogICAgICAgICAgICAgIGltYWdlLT5xdWFsaXR5PShzaXplX3QpIGkrMTsKICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICJRdWFsaXR5OiAlbGQgKCVzKSIsKGxvbmcpIGkrMSwocXZhbHVlIDw9IGhhc2hbaV0pICYmCisgICAgICAgICAgICAgICAiUXVhbGl0eTogJS4yMGcgKCVzKSIsKGRvdWJsZSkgaSsxLChxdmFsdWUgPD0gaGFzaFtpXSkgJiYKICAgICAgICAgICAgICAgIChzdW0gPD0gc3Vtc1tpXSkgPyAiZXhhY3QiIDogImFwcHJveGltYXRlIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQpAQCAtNzg2LDcgKzc4Niw3IEBACiAgICAgICAgICAgICAgICBpbWFnZS0+cXVhbGl0eT0oc2l6ZV90KSBpKzE7CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAiUXVhbGl0eTogJWxkICglcykiLChsb25nKSBpKzEsKHF2YWx1ZSA8PSBoYXNoW2ldKSAmJgorICAgICAgICAgICAgICAgICAiUXVhbGl0eTogJS4yMGcgKCVzKSIsKGRvdWJsZSkgaSsxLChxdmFsdWUgPD0gaGFzaFtpXSkgJiYKICAgICAgICAgICAgICAgICAgKHN1bSA8PSBzdW1zW2ldKSA/ICJleGFjdCIgOiAiYXBwcm94aW1hdGUiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQpAQCAtMTAxNCw4ICsxMDE0LDggQEAKICAgICAgIGpwZWdfaW5mby5zY2FsZV9kZW5vbT0odW5zaWduZWQgaW50KSBzY2FsZV9mYWN0b3I7CiAgICAgICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoJmpwZWdfaW5mbyk7CiAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQotICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiU2NhbGUgZmFjdG9yOiAlbGQiLAotICAgICAgICAgIChsb25nKSBzY2FsZV9mYWN0b3IpOworICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKKyAgICAgICAgICAiU2NhbGUgZmFjdG9yOiAlLjIwZyIsKGRvdWJsZSkgc2NhbGVfZmFjdG9yKTsKICAgICB9CiAgIHByZWNpc2lvbj0oc2l6ZV90KSBqcGVnX2luZm8uZGF0YV9wcmVjaXNpb247CiAjaWYgKEpQRUdfTElCX1ZFUlNJT04gPj0gNjEpICYmIGRlZmluZWQoRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQpCkBAIC0xMTI3LDcgKzExMjcsNyBAQAogICAgIH0KICAgSlBFR1NldEltYWdlUXVhbGl0eSgmanBlZ19pbmZvLGltYWdlKTsKICAgSlBFR1NldEltYWdlU2FtcGxpbmdGYWN0b3IoJmpwZWdfaW5mbyxpbWFnZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWxkIiwobG9uZykKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICBqcGVnX2luZm8ub3V0X2NvbG9yX3NwYWNlKTsKICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkoaW1hZ2UsImpwZWc6Y29sb3JzcGFjZSIsdmFsdWUpOwogICBpZiAoaW1hZ2VfaW5mby0+cGluZyAhPSBNYWdpY2tGYWxzZSkKQEAgLTE1OTAsOCArMTU5MCw4IEBACiAgICAgICAgIH0KICAgICAgICAgeG1wX3Byb2ZpbGU9RGVzdHJveVN0cmluZ0luZm8oeG1wX3Byb2ZpbGUpOwogICAgICAgfQotICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyBwcm9maWxlOiAlbHUgYnl0ZXMiLAotICAgICAgbmFtZSwodW5zaWduZWQgbG9uZykgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKSk7CisgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCisgICAgICAiJXMgcHJvZmlsZTogJS4yMGcgYnl0ZXMiLG5hbWUsKGRvdWJsZSkgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKSk7CiAgICAgbmFtZT1HZXROZXh0SW1hZ2VQcm9maWxlKGltYWdlKTsKICAgfQogICBjdXN0b21fcHJvZmlsZT1EZXN0cm95U3RyaW5nSW5mbyhjdXN0b21fcHJvZmlsZSk7CkBAIC0xNzgwLDggKzE3ODAsOCBAQAogICBqcGVnX2luZm8uZGVuc2l0eV91bml0PShVSU5UOCkgMTsKICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICJJbWFnZSByZXNvbHV0aW9uOiAlbGQsJWxkIiwobG9uZykgZmxvb3IoaW1hZ2UtPnhfcmVzb2x1dGlvbiswLjUpLAotICAgICAgKGxvbmcpIGZsb29yKGltYWdlLT55X3Jlc29sdXRpb24rMC41KSk7CisgICAgICAiSW1hZ2UgcmVzb2x1dGlvbjogJS4yMGcsJS4yMGciLGZsb29yKGltYWdlLT54X3Jlc29sdXRpb24rMC41KSwKKyAgICAgIGZsb29yKGltYWdlLT55X3Jlc29sdXRpb24rMC41KSk7CiAgIGlmICgoaW1hZ2UtPnhfcmVzb2x1dGlvbiAhPSAwLjApICYmIChpbWFnZS0+eV9yZXNvbHV0aW9uICE9IDAuMCkpCiAgICAgewogICAgICAgLyoKQEAgLTE5MTksOCArMTkxOSw4IEBACiAgICAgICBlbHNlCiAgICAgICAgIGpwZWdfc2V0X3F1YWxpdHkoJmpwZWdfaW5mbywoaW50KSBpbWFnZS0+cXVhbGl0eSxNYWdpY2tUcnVlKTsKICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCi0gICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCJRdWFsaXR5OiAlbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cXVhbGl0eSk7CisgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCJRdWFsaXR5OiAlLjIwZyIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnF1YWxpdHkpOwogICAgIH0KICAgZWxzZQogICAgIHsKQEAgLTIwMjUsMTEgKzIwMjUsMTEgQEAKICAgICAgIGVsc2UKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgIlN0b3JhZ2UgY2xhc3M6IERpcmVjdENsYXNzIik7Ci0gICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiRGVwdGg6ICVsdSIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVwdGgpOworICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIkRlcHRoOiAlLjIwZyIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICBpZiAoaW1hZ2UtPmNvbG9ycyAhPSAwKQogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiTnVtYmVyIG9mIGNvbG9yczogJWx1IiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbG9ycyk7CisgICAgICAgICAgIk51bWJlciBvZiBjb2xvcnM6ICUuMjBnIiwoZG91YmxlKSBpbWFnZS0+Y29sb3JzKTsKICAgICAgIGVsc2UKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgIk51bWJlciBvZiBjb2xvcnM6IHVuc3BlY2lmaWVkIik7CmRpZmYgLS1naXQgYS9jb2RlcnMvbWF0LmMgYi9jb2RlcnMvbWF0LmMKaW5kZXggZWVkNTkxYS4uNjNhYjI5NCAxMDA2NDQKLS0tIGEvY29kZXJzL21hdC5jCisrKyBiL2NvZGVycy9tYXQuYwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAgICAgQ2VsbFR5cGUgPSBSZWFkQmxvYlhYWExvbmcoaW1hZ2UyKTsgICAgLyogQWRkaXRpb25hbCBvYmplY3QgdHlwZSAqLwogICAgIGlmIChsb2dnaW5nKQogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICJNQVRMQUJfSERSLkNlbGxUeXBlOiAlbGQiLChsb25nKSBDZWxsVHlwZSk7CisgICAgICAgICJNQVRMQUJfSERSLkNlbGxUeXBlOiAlLjIwZyIsKGRvdWJsZSkgQ2VsbFR5cGUpOwogICAKICAgICAodm9pZCkgUmVhZEJsb2IoaW1hZ2UyLCA0LCAodW5zaWduZWQgY2hhciAqKSAmc2l6ZSk7ICAgICAvKiBkYXRhIHNpemUgKi8KIApkaWZmIC0tZ2l0IGEvY29kZXJzL21pZmYuYyBiL2NvZGVycy9taWZmLmMKaW5kZXggMjdkNzhiMS4uNTNlNzRkOSAxMDA2NDQKLS0tIGEvY29kZXJzL21pZmYuYworKysgYi9jb2RlcnMvbWlmZi5jCkBAIC0xODE4LDEzICsxODE4LDEzIEBACiAgICAgKi8KICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJpZD1JbWFnZU1hZ2ljayAgdmVyc2lvbj0xLjBcbiIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAiY2xhc3M9JXMgIGNvbG9ycz0lbHUgIG1hdHRlPSVzXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoCi0gICAgICBNYWdpY2tDbGFzc09wdGlvbnMsaW1hZ2UtPnN0b3JhZ2VfY2xhc3MpLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzLAorICAgICAgImNsYXNzPSVzICBjb2xvcnM9JS4yMGcgIG1hdHRlPSVzXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoCisgICAgICBNYWdpY2tDbGFzc09wdGlvbnMsaW1hZ2UtPnN0b3JhZ2VfY2xhc3MpLChkb3VibGUpIGltYWdlLT5jb2xvcnMsCiAgICAgICBNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja0Jvb2xlYW5PcHRpb25zLChzc2l6ZV90KSBpbWFnZS0+bWF0dGUpKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiY29sdW1ucz0lbHUgIHJvd3M9JWx1ICAiCi0gICAgICAiZGVwdGg9JWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJjb2x1bW5zPSUuMjBnICByb3dzPSUuMjBnICAiCisgICAgICAiZGVwdGg9JS4yMGdcbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGRvdWJsZSkKKyAgICAgIGltYWdlLT5kZXB0aCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGlmIChpbWFnZS0+dHlwZSAhPSBVbmRlZmluZWRUeXBlKQogICAgICAgewpAQCAtMTg0MSw4ICsxODQxLDggQEAKICAgICBpZiAoY29tcHJlc3Npb24gIT0gVW5kZWZpbmVkQ29tcHJlc3Npb24pCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsImNvbXByZXNzaW9uPSVzICAiCi0gICAgICAgICAgInF1YWxpdHk9JWx1XG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrQ29tcHJlc3NPcHRpb25zLAotICAgICAgICAgIGNvbXByZXNzaW9uKSwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnF1YWxpdHkpOworICAgICAgICAgICJxdWFsaXR5PSUuMjBnXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrQ29tcHJlc3NPcHRpb25zLAorICAgICAgICAgIGNvbXByZXNzaW9uKSwoZG91YmxlKSBpbWFnZS0+cXVhbGl0eSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBpZiAoaW1hZ2UtPnVuaXRzICE9IFVuZGVmaW5lZFJlc29sdXRpb24pCkBAIC0xODU5LDkgKzE4NTksOSBAQAogICAgICAgfQogICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgfHwgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwicGFnZT0lbHV4JWx1JStsZCUrbGRcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGltYWdlLT5wYWdlLngsKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICJwYWdlPSUuMjBneCUuMjBnJSsuMjBnJSsuMjBnXG4iLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnBhZ2UuaGVpZ2h0LChkb3VibGUpIGltYWdlLT5wYWdlLngsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBlbHNlCkBAIC0xODgxLDQxICsxODgxLDQwIEBACiAgICAgICAgIChHZXRQcmV2aW91c0ltYWdlSW5MaXN0KGltYWdlKSAhPSAoSW1hZ2UgKikgTlVMTCkpCiAgICAgICB7CiAgICAgICAgIGlmIChpbWFnZS0+c2NlbmUgPT0gMCkKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJpdGVyYXRpb25zPSVsdSAgIgotICAgICAgICAgICAgImRlbGF5PSVsdSAgdGlja3MtcGVyLXNlY29uZD0lbHVcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgaW1hZ2UtPml0ZXJhdGlvbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZWxheSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiaXRlcmF0aW9ucz0lLjIwZyAgIgorICAgICAgICAgICAgImRlbGF5PSUuMjBnICB0aWNrcy1wZXItc2Vjb25kPSUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zLAorICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmRlbGF5LChkb3VibGUpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInNjZW5lPSVsdSAgIgotICAgICAgICAgICAgIml0ZXJhdGlvbnM9JWx1ICBkZWxheT0lbHUgIHRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgaW1hZ2UtPnNjZW5lLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+aXRlcmF0aW9ucywodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgIGltYWdlLT5kZWxheSwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInNjZW5lPSUuMjBnICAiCisgICAgICAgICAgICAiaXRlcmF0aW9ucz0lLjIwZyAgZGVsYXk9JS4yMGcgIHRpY2tzLXBlci1zZWNvbmQ9JS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgICAgICAgIGltYWdlLT5zY2VuZSwoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucywoZG91YmxlKSBpbWFnZS0+ZGVsYXksCisgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIGlmIChpbWFnZS0+c2NlbmUgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJzY2VuZT0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwic2NlbmU9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPml0ZXJhdGlvbnMgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJpdGVyYXRpb25zPSVsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5pdGVyYXRpb25zKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIml0ZXJhdGlvbnM9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgIGlmIChpbWFnZS0+ZGVsYXkgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJkZWxheT0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiZGVsYXk9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5kZWxheSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQgIT0gVW5kZWZpbmVkVGlja3NQZXJTZWNvbmQpCiAgICAgICAgICAgewogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgInRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CisgICAgICAgICAgICAgICJ0aWNrcy1wZXItc2Vjb25kPSUuMjBnXG4iLChkb3VibGUpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICB9CkBAIC0xOTg2LDggKzE5ODUsOSBAQAogICAgICAgICAgIHByb2ZpbGU9R2V0SW1hZ2VQcm9maWxlKGltYWdlLG5hbWUpOwogICAgICAgICAgIGlmIChwcm9maWxlICE9IChTdHJpbmdJbmZvICopIE5VTEwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInByb2ZpbGU6JXM9JWx1XG4iLAotICAgICAgICAgICAgICAgIG5hbWUsKHVuc2lnbmVkIGxvbmcpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOworICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgICAgICJwcm9maWxlOiVzPSUuMjBnXG4iLG5hbWUsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpKTsKICAgICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgIG5hbWU9R2V0TmV4dEltYWdlUHJvZmlsZShpbWFnZSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvbXBjLmMgYi9jb2RlcnMvbXBjLmMKaW5kZXggMGQ1OTI3OC4uMmI1Mzc2YyAxMDA2NDQKLS0tIGEvY29kZXJzL21wYy5jCisrKyBiL2NvZGVycy9tcGMuYwpAQCAtMTA4MCwxMyArMTA4MCwxMyBAQAogICAgICAgTUFHSUNLQ09SRV9RVUFOVFVNX0RFUFRIKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICJjbGFzcz0lcyAgY29sb3JzPSVsdSAgbWF0dGU9JXNcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKLSAgICAgIE1hZ2lja0NsYXNzT3B0aW9ucyxpbWFnZS0+c3RvcmFnZV9jbGFzcyksKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2xvcnMsCisgICAgICAiY2xhc3M9JXMgIGNvbG9ycz0lLjIwZyAgbWF0dGU9JXNcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKKyAgICAgIE1hZ2lja0NsYXNzT3B0aW9ucyxpbWFnZS0+c3RvcmFnZV9jbGFzcyksKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycywKICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrQm9vbGVhbk9wdGlvbnMsKHNzaXplX3QpIGltYWdlLT5tYXR0ZSkpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgImNvbHVtbnM9JWx1ICByb3dzPSVsdSAgZGVwdGg9JWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICJjb2x1bW5zPSUuMjBnICByb3dzPSUuMjBnIGRlcHRoPSUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGRvdWJsZSkgaW1hZ2UtPmRlcHRoKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKGltYWdlLT50eXBlICE9IFVuZGVmaW5lZFR5cGUpCiAgICAgICB7CkBAIC0xMTA5LDkgKzExMDksOCBAQAogICAgIGlmIChpbWFnZS0+Y29tcHJlc3Npb24gIT0gVW5kZWZpbmVkQ29tcHJlc3Npb24pCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgImNvbXByZXNzaW9uPSVzICBxdWFsaXR5PSVsdVxuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKAotICAgICAgICAgIE1hZ2lja0NvbXByZXNzT3B0aW9ucyxpbWFnZS0+Y29tcHJlc3Npb24pLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIGltYWdlLT5xdWFsaXR5KTsKKyAgICAgICAgICAiY29tcHJlc3Npb249JXMgIHF1YWxpdHk9JS4yMGdcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKKyAgICAgICAgICBNYWdpY2tDb21wcmVzc09wdGlvbnMsaW1hZ2UtPmNvbXByZXNzaW9uKSwoZG91YmxlKSBpbWFnZS0+cXVhbGl0eSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBpZiAoaW1hZ2UtPnVuaXRzICE9IFVuZGVmaW5lZFJlc29sdXRpb24pCkBAIC0xMTI4LDkgKzExMjcsOSBAQAogICAgICAgfQogICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgfHwgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwicGFnZT0lbHV4JWx1JStsZCUrbGRcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGltYWdlLT5wYWdlLngsKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICJwYWdlPSUuMjBneCUuMjBnJSsuMjBnJSsuMjBnXG4iLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnBhZ2UuaGVpZ2h0LChkb3VibGUpIGltYWdlLT5wYWdlLngsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBlbHNlCkBAIC0xMTUxLDQwICsxMTUwLDQwIEBACiAgICAgICB7CiAgICAgICAgIGlmIChpbWFnZS0+c2NlbmUgPT0gMCkKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgIml0ZXJhdGlvbnM9JWx1ICBkZWxheT0lbHUgIHRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLChsb25nKQotICAgICAgICAgICAgaW1hZ2UtPml0ZXJhdGlvbnMsKGxvbmcpIGltYWdlLT5kZWxheSwobG9uZykKKyAgICAgICAgICAgICJpdGVyYXRpb25zPSUuMjBnICBkZWxheT0lLjIwZyAgdGlja3MtcGVyLXNlY29uZD0lLjIwZ1xuIiwoZG91YmxlKQorICAgICAgICAgICAgaW1hZ2UtPml0ZXJhdGlvbnMsKGRvdWJsZSkgaW1hZ2UtPmRlbGF5LChkb3VibGUpCiAgICAgICAgICAgICBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgInNjZW5lPSVsdSAgaXRlcmF0aW9ucz0lbHUgIGRlbGF5PSVsdSAgdGlja3MtcGVyLXNlY29uZD0lbHVcbiIsCi0gICAgICAgICAgICAobG9uZykgaW1hZ2UtPnNjZW5lLChsb25nKSBpbWFnZS0+aXRlcmF0aW9ucywobG9uZykgaW1hZ2UtPmRlbGF5LAotICAgICAgICAgICAgKGxvbmcpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKKyAgICAgICAgICAgICJzY2VuZT0lLjIwZyAgaXRlcmF0aW9ucz0lLjIwZyAgZGVsYXk9JS4yMGcgIHRpY2tzLXBlci1zZWNvbmQ9JS4yMGdcbiIsCisgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUsKGRvdWJsZSkgaW1hZ2UtPml0ZXJhdGlvbnMsKGRvdWJsZSkKKyAgICAgICAgICAgIGltYWdlLT5kZWxheSwoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIGlmIChpbWFnZS0+c2NlbmUgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJzY2VuZT0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwic2NlbmU9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPml0ZXJhdGlvbnMgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJpdGVyYXRpb25zPSVsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5pdGVyYXRpb25zKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIml0ZXJhdGlvbnM9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgIGlmIChpbWFnZS0+ZGVsYXkgIT0gMCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJkZWxheT0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiZGVsYXk9JS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5kZWxheSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQgIT0gVW5kZWZpbmVkVGlja3NQZXJTZWNvbmQpCiAgICAgICAgICAgewogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgInRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CisgICAgICAgICAgICAgICJ0aWNrcy1wZXItc2Vjb25kPSUuMjBnXG4iLChkb3VibGUpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICB9CkBAIC0xMjU1LDggKzEyNTQsOSBAQAogICAgICAgICAgIHByb2ZpbGU9R2V0SW1hZ2VQcm9maWxlKGltYWdlLG5hbWUpOwogICAgICAgICAgIGlmIChwcm9maWxlICE9IChTdHJpbmdJbmZvICopIE5VTEwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInByb2ZpbGU6JXM9JWx1XG4iLAotICAgICAgICAgICAgICAgIG5hbWUsKHVuc2lnbmVkIGxvbmcpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOworICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgICAgICJwcm9maWxlOiVzPSUuMjBnXG4iLG5hbWUsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpKTsKICAgICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgIG5hbWU9R2V0TmV4dEltYWdlUHJvZmlsZShpbWFnZSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvbXBlZy5jIGIvY29kZXJzL21wZWcuYwppbmRleCBkZmZlNjA2Li40ZjQ4OWUwIDEwMDY0NAotLS0gYS9jb2RlcnMvbXBlZy5jCisrKyBiL2NvZGVycy9tcGVnLmMKQEAgLTUzOSwxMiArNTM5LDEyIEBACiAgICAgICAgICAgSW1hZ2UKICAgICAgICAgICAgICpmcmFtZTsKIAotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocC0+ZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXMlbHUuJXMiLAotICAgICAgICAgICAgYmFzZW5hbWUsKHVuc2lnbmVkIGxvbmcpIHAtPnNjZW5lLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmaWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyVsdS4lcyIsCi0gICAgICAgICAgICBiYXNlbmFtZSwodW5zaWduZWQgbG9uZykgcC0+c2NlbmUsV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHAtPmZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJS4yMGcuJXMiLAorICAgICAgICAgICAgYmFzZW5hbWUsKGRvdWJsZSkgcC0+c2NlbmUsV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJS4yMGcuJXMiLAorICAgICAgICAgICAgYmFzZW5hbWUsKGRvdWJsZSkgcC0+c2NlbmUsV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0KTsKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByZXZpb3VzX2ltYWdlLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiJXMlbHUuJXMiLGJhc2VuYW1lLCh1bnNpZ25lZCBsb25nKSBwLT5zY2VuZSwKKyAgICAgICAgICAgICIlcyUuMjBnLiVzIixiYXNlbmFtZSwoZG91YmxlKSBwLT5zY2VuZSwKICAgICAgICAgICAgIFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CiAgICAgICAgICAgZnJhbWU9Q2xvbmVJbWFnZShwLDAsMCxNYWdpY2tUcnVlLCZwLT5leGNlcHRpb24pOwogICAgICAgICAgIGlmIChmcmFtZSA9PSAoSW1hZ2UgKikgTlVMTCkKQEAgLTU2MCw4ICs1NjAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJWx1LiVzIiwKLSAgICAgICAgICAgIGJhc2VuYW1lLCh1bnNpZ25lZCBsb25nKSBwLT5zY2VuZSxXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXMlLjIwZy4lcyIsCisgICAgICAgICAgICBiYXNlbmFtZSwoZG91YmxlKSBwLT5zY2VuZSxXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOwogICAgICAgICAgIGlmIChsZW5ndGggPiAwKQogICAgICAgICAgICAgc3RhdHVzPUJsb2JUb0ZpbGUoZmlsZW5hbWUsYmxvYixsZW5ndGgsJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgICAgIGJyZWFrOwpAQCAtNTcxLDE0ICs1NzEsMTMgQEAKICAgICAgICAgewogICAgICAgICAgIGlmIChzdGF0dXMgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiVsdS4gV3JvdGUgJXMgZmlsZSBmb3Igc2NlbmUgJWx1OiIsKHVuc2lnbmVkIGxvbmcpIGksCi0gICAgICAgICAgICAgIFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCwodW5zaWduZWQgbG9uZykgcC0+c2NlbmUpOworICAgICAgICAgICAgICAiJS4yMGcuIFdyb3RlICVzIGZpbGUgZm9yIHNjZW5lICUuMjBnOiIsKGRvdWJsZSkgaSwKKyAgICAgICAgICAgICAgV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0LChkb3VibGUpIHAtPnNjZW5lKTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiVsdS4gRmFpbGVkIHRvIHdyaXRlICVzIGZpbGUgZm9yIHNjZW5lICVsdToiLCh1bnNpZ25lZCBsb25nKSBpLAotICAgICAgICAgICAgICBXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQsKHVuc2lnbmVkIGxvbmcpIHAtPnNjZW5lKTsKLSAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMiLAotICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAiJS4yMGcuIEZhaWxlZCB0byB3cml0ZSAlcyBmaWxlIGZvciBzY2VuZSAlLjIwZzoiLChkb3VibGUpIGksCisgICAgICAgICAgICAgIFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCwoZG91YmxlKSBwLT5zY2VuZSk7CisgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIixmaWxlbmFtZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcC0+c2NlbmU9c2NlbmU7CkBAIC02MTIsOCArNjExLDggQEAKICAgICBkZWxheT0xMDAuMCpwLT5kZWxheS9NYWdpY2tNYXgoMS4wKnAtPnRpY2tzX3Blcl9zZWNvbmQsMS4wKTsKICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBNYWdpY2tNYXgoKDEuMCpkZWxheSsxLjApLzMuMCwxLjApOyBpKyspCiAgICAgewotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwLT5maWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyVsdS4lcyIsCi0gICAgICAgIGJhc2VuYW1lLCh1bnNpZ25lZCBsb25nKSBjb3VudCsrLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHAtPmZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJS4yMGcuJXMiLAorICAgICAgICBiYXNlbmFtZSwoZG91YmxlKSBjb3VudCsrLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CiAgICAgICAodm9pZCkgUmVsaW5xdWlzaFVuaXF1ZUZpbGVSZXNvdXJjZShwLT5maWxlbmFtZSk7CiAgICAgfQogICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHAtPmZpbGVuYW1lLGltYWdlX2luZm8tPmZpbGVuYW1lLE1heFRleHRFeHRlbnQpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL21zbC5jIGIvY29kZXJzL21zbC5jCmluZGV4IDA1M2Q5ZTUuLjY5NTQyYzYgMTAwNjQ0Ci0tLSBhL2NvZGVycy9tc2wuYworKysgYi9jb2RlcnMvbXNsLmMKQEAgLTEwNjEsOSArMTA2MSw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LmhlaWdodCwKLSAgICAgICAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZyUrLjIwZyIsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgIGdlb21ldHJ5LmhlaWdodCwoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICAgICAgICAgIENsb25lU3RyaW5nKCZkcmF3X2luZm8tPmdlb21ldHJ5LHRleHQpOwogICAgICAgICAgIGRyYXdfaW5mby0+YWZmaW5lLnN4PWN1cnJlbnQuc3gqYWZmaW5lLnN4K2N1cnJlbnQucnkqYWZmaW5lLnJ4OwogICAgICAgICAgIGRyYXdfaW5mby0+YWZmaW5lLnJ4PWN1cnJlbnQucngqYWZmaW5lLnN4K2N1cnJlbnQuc3kqYWZmaW5lLnJ4OwpAQCAtMjA0MCw4ICsyMDQwLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICBpbWFnZT1tc2xfaW5mby0+aW1hZ2Vbbl07CiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhjb21wb3NpdGVfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICIlbHV4JWx1JStsZCUrbGQiLCh1bnNpZ25lZCBsb25nKSBjb21wb3NpdGVfaW1hZ2UtPmNvbHVtbnMsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY29tcG9zaXRlX2ltYWdlLT5yb3dzLChsb25nKSBnZW9tZXRyeS54LChsb25nKQorICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBjb21wb3NpdGVfaW1hZ2UtPmNvbHVtbnMsCisgICAgICAgICAgICAoZG91YmxlKSBjb21wb3NpdGVfaW1hZ2UtPnJvd3MsKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKQogICAgICAgICAgICAgZ2VvbWV0cnkueSk7CiAgICAgICAgICAgZmxhZ3M9UGFyc2VHcmF2aXR5R2VvbWV0cnkoaW1hZ2UsY29tcG9zaXRlX2dlb21ldHJ5LCZnZW9tZXRyeSwKICAgICAgICAgICAgICZleGNlcHRpb24pOwpAQCAtMjY1MSw5ICsyNjUxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aCwodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkuaGVpZ2h0LAotICAgICAgICAgICAgKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5LnkpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBnZW9tZXRyeS53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgZ2VvbWV0cnkuaGVpZ2h0LChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSk7CiAgICAgICAgICAgQ2xvbmVTdHJpbmcoJmRyYXdfaW5mby0+Z2VvbWV0cnksdGV4dCk7CiAgICAgICAgICAgZHJhd19pbmZvLT5hZmZpbmUuc3g9Y3VycmVudC5zeCphZmZpbmUuc3grY3VycmVudC5yeSphZmZpbmUucng7CiAgICAgICAgICAgZHJhd19pbmZvLT5hZmZpbmUucng9Y3VycmVudC5yeCphZmZpbmUuc3grY3VycmVudC5zeSphZmZpbmUucng7CkBAIC0zMjY1LDggKzMyNjUsOCBAQAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoa2V5d29yZCwiaGVpZ2h0IikgPT0gMCkKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBtc2xfaW5mby0+aW1hZ2Vbbl0tPnJvd3MpOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiUuMjBnIiwKKyAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtc2xfaW5mby0+aW1hZ2Vbbl0tPnJvd3MpOwogICAgICAgICAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eShtc2xfaW5mby0+YXR0cmlidXRlc1tuXSxrZXksdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgIH0KQEAgLTMyNzcsOCArMzI3Nyw4IEBACiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoTG9jYWxlQ29tcGFyZShrZXl3b3JkLCJ3aWR0aCIpID09IDApCiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbXNsX2luZm8tPmltYWdlW25dLT5jb2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsCisgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbXNsX2luZm8tPmltYWdlW25dLT5jb2x1bW5zKTsKICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkobXNsX2luZm8tPmF0dHJpYnV0ZXNbbl0sa2V5LHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICB9CkBAIC00Nzk0LDkgKzQ3OTQsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGdlb21ldHJ5LndpZHRoLChkb3VibGUpCisgICAgICAgICAgICBnZW9tZXRyeS5oZWlnaHQsKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55KTsKICAgICAgICAgICBDbG9uZVN0cmluZygmZHJhd19pbmZvLT5nZW9tZXRyeSx0ZXh0KTsKICAgICAgICAgICBkcmF3X2luZm8tPmFmZmluZS5zeD1jdXJyZW50LnN4KmFmZmluZS5zeCtjdXJyZW50LnJ5KmFmZmluZS5yeDsKICAgICAgICAgICBkcmF3X2luZm8tPmFmZmluZS5yeD1jdXJyZW50LnJ4KmFmZmluZS5zeCtjdXJyZW50LnN5KmFmZmluZS5yeDsKQEAgLTYwNDgsMTMgKzYwNDgsMTIgQEAKICAgICAgICAgICAgICAgICBpZiAoaW1hZ2Vfb3B0aW9uICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAgICAgICAgICAgICAgICBmbGFncz1QYXJzZUFic29sdXRlR2VvbWV0cnkoaW1hZ2Vfb3B0aW9uLCZnZW9tZXRyeSk7CiAgICAgICAgICAgICAgICAgZmxhZ3M9UGFyc2VBYnNvbHV0ZUdlb21ldHJ5KHZhbHVlLCZnZW9tZXRyeSk7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlLE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2UsTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsKGRvdWJsZSkgZ2VvbWV0cnkuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICBpZiAoKChmbGFncyAmIFhWYWx1ZSkgIT0gMCkgfHwgKChmbGFncyAmIFlWYWx1ZSkgIT0gMCkpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2UsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgIiVsdXglbHUlK2xkJStsZCIsKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkuaGVpZ2h0LChsb25nKSBnZW9tZXRyeS54LChsb25nKQorICAgICAgICAgICAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGdlb21ldHJ5LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBnZW9tZXRyeS5oZWlnaHQsKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKQogICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS55KTsKICAgICAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VPcHRpb24obXNsX2luZm8tPmltYWdlX2luZm9bbl0sa2V5d29yZCxwYWdlKTsKICAgICAgICAgICAgICAgICBtc2xfaW5mby0+aW1hZ2VfaW5mb1tuXS0+cGFnZT1HZXRQYWdlR2VvbWV0cnkocGFnZSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvbXR2LmMgYi9jb2RlcnMvbXR2LmMKaW5kZXggYTllM2NmZi4uNzJhMjkwOSAxMDA2NDQKLS0tIGEvY29kZXJzL210di5jCisrKyBiL2NvZGVycy9tdHYuYwpAQCAtMzY5LDggKzM2OSw4IEBACiAgICAgLyoKICAgICAgIEluaXRpYWxpemUgcmFzdGVyIGZpbGUgaGVhZGVyLgogICAgICovCi0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1ICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4iLChkb3VibGUpCisgICAgICBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgewpkaWZmIC0tZ2l0IGEvY29kZXJzL3BjbC5jIGIvY29kZXJzL3BjbC5jCmluZGV4IDg1OGQ5OTQuLjJjNjQyN2UgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wY2wuYworKysgYi9jb2RlcnMvcGNsLmMKQEAgLTMwNSw4ICszMDUsOCBAQAogICAgICh2b2lkKSBQYXJzZUFic29sdXRlR2VvbWV0cnkoUFNQYWdlR2VvbWV0cnksJnBhZ2UpOwogICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICh2b2lkKSBQYXJzZUFic29sdXRlR2VvbWV0cnkoaW1hZ2VfaW5mby0+cGFnZSwmcGFnZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpIHBhZ2UuaGVpZ2h0KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsKGRvdWJsZSkKKyAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICAgaWYgKGltYWdlX2luZm8tPm1vbm9jaHJvbWUgIT0gTWFnaWNrRmFsc2UpCiAgICAgZGVsZWdhdGVfaW5mbz1HZXREZWxlZ2F0ZUluZm8oInBjbDptb25vIiwoY2hhciAqKSBOVUxMLGV4Y2VwdGlvbik7CiAgIGVsc2UKQEAgLTMyNiwyMCArMzI2LDIwIEBACiAgIHBhZ2Uud2lkdGg9KHNpemVfdCkgZmxvb3IocGFnZS53aWR0aCppbWFnZS0+eF9yZXNvbHV0aW9uL2RlbHRhLngrMC41KTsKICAgcGFnZS5oZWlnaHQ9KHNpemVfdCkgZmxvb3IocGFnZS5oZWlnaHQqaW1hZ2UtPnlfcmVzb2x1dGlvbi9kZWx0YS55KwogICAgIDAuNSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZyVsdXglbHUgIiwKLSAgICAodW5zaWduZWQgbG9uZykgcGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgcGFnZS5oZWlnaHQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclLjIwZ3glLjIwZyAiLChkb3VibGUpCisgICAgIHBhZ2Uud2lkdGgsKGRvdWJsZSkgcGFnZS5oZWlnaHQpOwogICBpbWFnZT1EZXN0cm95SW1hZ2UoaW1hZ2UpOwogICByZWFkX2luZm89Q2xvbmVJbWFnZUluZm8oaW1hZ2VfaW5mbyk7CiAgICpyZWFkX2luZm8tPm1hZ2ljaz0nXDAnOwogICBpZiAocmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzICE9IDApCiAgICAgewogICAgICAgaWYgKHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAxKQotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWRMYXN0UGFnZT0lbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1kTGFzdFBhZ2U9JS4yMGciLAorICAgICAgICAgIChkb3VibGUpIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgZWxzZQogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiLWRGaXJzdFBhZ2U9JWx1IC1kTGFzdFBhZ2U9JWx1IiwodW5zaWduZWQgbG9uZykgcmVhZF9pbmZvLT5zY2VuZSsxLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKKyAgICAgICAgICAiLWRGaXJzdFBhZ2U9JS4yMGcgLWRMYXN0UGFnZT0lLjIwZyIsKGRvdWJsZSkgcmVhZF9pbmZvLT5zY2VuZSsxLAorICAgICAgICAgIChkb3VibGUpIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzPTA7CiAgICAgICBpZiAocmVhZF9pbmZvLT5zY2VuZXMgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICAgKnJlYWRfaW5mby0+c2NlbmVzPSdcMCc7CkBAIC03MjEsMTAgKzcyMSwxMSBAQAogICAgICovCiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXDAzM0UiKTsgIC8qIHByaW50ZXIgcmVzZXQgKi8KICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcMDMzKnIzRiIpOyAgLyogc2V0IHByZXNlbnRhdGlvbiBtb2RlICovCi0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMypyJWx1cyVsdVQiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMypyJS4yMGdzJS4yMGdUIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMyp0JWxkUiIsKGxvbmcpIGRlbnNpdHkpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqdCUuMjBnUiIsKGRvdWJsZSkKKyAgICAgIGRlbnNpdHkpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcMDMzJmwwRSIpOyAgLyogdG9wIG1hcmdpbiAwICovCiAgICAgaWYgKElzTW9ub2Nocm9tZUltYWdlKGltYWdlLCZpbWFnZS0+ZXhjZXB0aW9uKSAhPSBNYWdpY2tGYWxzZSkKQEAgLTc3NiwxNSArNzc3LDE2IEBACiAgICAgICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgaW1hZ2UtPmNvbG9yczsgaSsrKQogICAgICAgICAgIHsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICJcMDMzKnYlZGElZGIlZGMlbGRJIixTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLnJlZCksCisgICAgICAgICAgICAgICJcMDMzKnYlZGElZGIlZGMlLjIwZ0kiLAorICAgICAgICAgICAgICBTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLnJlZCksCiAgICAgICAgICAgICAgIFNjYWxlUXVhbnR1bVRvQ2hhcihpbWFnZS0+Y29sb3JtYXBbaV0uZ3JlZW4pLAotICAgICAgICAgICAgICBTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLmJsdWUpLChsb25nKSBpKTsKKyAgICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKGltYWdlLT5jb2xvcm1hcFtpXS5ibHVlKSwoZG91YmxlKSBpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZm9yICggOyBpIDwgKDFMIDw8IGJpdHNfcGVyX3BpeGVsKTsgaSsrKQogICAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqdiVsdUkiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaSk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKnYlLjIwZ0kiLAorICAgICAgICAgICAgICAoZG91YmxlKSBpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTkxMiw4ICs5MTQsOCBAQAogICAgICAgewogICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgIHsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlbHVXIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqYiUuMjBnVyIsCisgICAgICAgICAgICAoZG91YmxlKSBsZW5ndGgpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iKGltYWdlLGxlbmd0aCxwaXhlbHMpOwogICAgICAgICAgIGJyZWFrOwpAQCAtOTIyLDggKzkyNCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICBwYWNrZXRzPVBDTFBhY2tiaXRzQ29tcHJlc3NJbWFnZShsZW5ndGgscGl4ZWxzLAogICAgICAgICAgICAgY29tcHJlc3NfcGl4ZWxzKTsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlbHVXIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwYWNrZXRzKTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlLjIwZ1ciLAorICAgICAgICAgICAgKGRvdWJsZSkgcGFja2V0cyk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2IoaW1hZ2UscGFja2V0cyxjb21wcmVzc19waXhlbHMpOwogICAgICAgICAgIGJyZWFrOwpAQCAtOTM1LDggKzkzNyw4IEBACiAgICAgICAgICAgICAgIHByZXZpb3VzX3BpeGVsc1tpXT0ofnBpeGVsc1tpXSk7CiAgICAgICAgICAgcGFja2V0cz1QQ0xEZWx0YUNvbXByZXNzSW1hZ2UobGVuZ3RoLHByZXZpb3VzX3BpeGVscyxwaXhlbHMsCiAgICAgICAgICAgICBjb21wcmVzc19waXhlbHMpOwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqYiVsdVciLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBhY2tldHMpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqYiUuMjBnVyIsCisgICAgICAgICAgICAoZG91YmxlKSBwYWNrZXRzKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSxwYWNrZXRzLGNvbXByZXNzX3BpeGVscyk7CiAgICAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tNZW1vcnkocHJldmlvdXNfcGl4ZWxzLHBpeGVscyxsZW5ndGgqCmRpZmYgLS1naXQgYS9jb2RlcnMvcGRmLmMgYi9jb2RlcnMvcGRmLmMKaW5kZXggYjEzYmYyZC4uNWU0YWQ4MiAxMDA2NDQKLS0tIGEvY29kZXJzL3BkZi5jCisrKyBiL2NvZGVycy9wZGYuYwpAQCAtNDU2LDggKzQ1Niw4IEBACiAgICAgICAgIC8qCiAgICAgICAgICAgTm90ZSBzcG90IG5hbWVzLgogICAgICAgICAqLwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByb3BlcnR5LE1heFRleHRFeHRlbnQsInBkZjpTcG90Q29sb3ItJWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3BvdGNvbG9yKyspOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByb3BlcnR5LE1heFRleHRFeHRlbnQsInBkZjpTcG90Q29sb3ItJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIHNwb3Rjb2xvcisrKTsKICAgICAgICAgaT0wOwogICAgICAgICBmb3IgKGM9UmVhZEJsb2JCeXRlKGltYWdlKTsgYyAhPSBFT0Y7IGM9UmVhZEJsb2JCeXRlKGltYWdlKSkKICAgICAgICAgewpAQCAtNTk2LDggKzU5Niw4IEBACiAgICAgICAgIDAuNSk7CiAgICAgICBwYWdlLmhlaWdodD0oc2l6ZV90KSBmbG9vcihwYWdlLmhlaWdodCppbWFnZS0+eV9yZXNvbHV0aW9uL2RlbHRhLnkrCiAgICAgICAgIDAuNSk7Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclbHV4JWx1ICIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBwYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBwYWdlLmhlaWdodCk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclLjIwZ3glLjIwZyAiLAorICAgICAgICAoZG91YmxlKSBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICAgICB9CiAgIGlmIChjbXlrICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhvcHRpb25zLCItZFVzZUNJRUNvbG9yICIsTWF4VGV4dEV4dGVudCk7CkBAIC02MTIsOCArNjEyLDggQEAKICAgICAgIGNoYXIKICAgICAgICAgcGFnZXNbTWF4VGV4dEV4dGVudF07CiAKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZXMsTWF4VGV4dEV4dGVudCwiLWRGaXJzdFBhZ2U9JWx1ICIKLSAgICAgICAgIi1kTGFzdFBhZ2U9JWx1IiwodW5zaWduZWQgbG9uZykgcmVhZF9pbmZvLT5zY2VuZSsxLCh1bnNpZ25lZCBsb25nKQorICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlcyxNYXhUZXh0RXh0ZW50LCItZEZpcnN0UGFnZT0lLjIwZyAiCisgICAgICAgICItZExhc3RQYWdlPSUuMjBnIiwoZG91YmxlKSByZWFkX2luZm8tPnNjZW5lKzEsKGRvdWJsZSkKICAgICAgICAgKHJlYWRfaW5mby0+c2NlbmUrcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzKSk7CiAgICAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucyxwYWdlcyxNYXhUZXh0RXh0ZW50KTsKICAgICAgIHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcz0wOwpAQCAtMTA1NSw4ICsxMDU1LDggQEAKICAgICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNCk7CiAgIGlmIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpID09IDApCiAgICAgdmVyc2lvbj0oc2l6ZV90KSBNYWdpY2tNYXgodmVyc2lvbiw2KTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSVQREYtMS4lbHUgXG4iLAotICAgICh1bnNpZ25lZCBsb25nKSB2ZXJzaW9uKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSVQREYtMS4lLjIwZyBcbiIsCisgICAgKGRvdWJsZSkgdmVyc2lvbik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCkKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIl4uPP01xuIik7CkBAIC0xMDY1LDIwICsxMDY1LDIwIEBACiAgICovCiAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgcm9vdF9pZD1vYmplY3Q7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKKyAgICBvYmplY3QpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgIT0gMCkKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUGFnZXMgJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgZWxzZQogICAgIHsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9NZXRhZGF0YSAlbHUgMCBSXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzEpOworICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL01ldGFkYXRhICUuMjBnIDAgUlxuIiwKKyAgICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICVsdSAwIFJcbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMik7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUGFnZXMgJS4yMGcgMCBSXG4iLAorICAgICAgICAoZG91YmxlKSBvYmplY3QrMik7CiAgICAgfQogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9DYXRhbG9nXG4iKTsKQEAgLTEwOTksOCArMTA5OSw4IEBACiAgICAgICAgIFdyaXRlIFhNUCBvYmplY3QuCiAgICAgICAqLwogICAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLAorICAgICAgICAoZG91YmxlKSBvYmplY3QpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL1hNTFxuIik7CkBAIC0xMTE2LDcgKzExMTYsOCBAQAogICAgICAgaT1Gb3JtYXRNYWdpY2tTdHJpbmcoeG1wX3Byb2ZpbGUsTWF4VGV4dEV4dGVudCxYTVBQcm9maWxlLAogICAgICAgICBYTVBQcm9maWxlTWFnaWNrLG1vZGlmeV9kYXRlLGNyZWF0ZV9kYXRlLHRpbWVzdGFtcCwKICAgICAgICAgR2V0TWFnaWNrVmVyc2lvbigmdmVyc2lvbiksR2V0TWFnaWNrVmVyc2lvbigmdmVyc2lvbikpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlbHVcbiIsMVVMKmkpOworICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZ1xuIiwKKyAgICAgICAgKGRvdWJsZSkgaSk7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvTWV0YWRhdGFcbiIpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbnN0cmVhbVxuIik7CkBAIC0xMTI5LDEzICsxMTMwLDEzIEBACiAgICovCiAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgcGFnZXNfaWQ9b2JqZWN0OwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgb2JqZWN0KTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9QYWdlc1xuIik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9LaWRzIFsgJWx1IDAgUiAiLAotICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9LaWRzIFsgJS4yMGcgMCBSICIsCisgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgIGNvdW50PShzc2l6ZV90KSAocGFnZXNfaWQrT2JqZWN0c1BlckltYWdlKzEpOwogICBpZiAoaW1hZ2VfaW5mby0+YWRqb2luICE9IE1hZ2lja0ZhbHNlKQpAQCAtMTE0OSw3ICsxMTUwLDggQEAKICAgICAgIGtpZF9pbWFnZT1pbWFnZTsKICAgICAgIGZvciAoIDsgR2V0TmV4dEltYWdlSW5MaXN0KGtpZF9pbWFnZSkgIT0gKEltYWdlICopIE5VTEw7IGNvdW50Kz1PYmplY3RzUGVySW1hZ2UpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCAwIFIgIiwobG9uZykgY291bnQpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIFIgIiwoZG91YmxlKQorICAgICAgICAgIGNvdW50KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICBraWRfaW1hZ2U9R2V0TmV4dEltYWdlSW5MaXN0KGtpZF9pbWFnZSk7CiAgICAgICB9CkBAIC0xMTU5LDggKzExNjEsOCBAQAogICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICB9CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIl1cbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ291bnQgJWx1XG4iLAotICAgICh1bnNpZ25lZCBsb25nKSAoKGNvdW50LXBhZ2VzX2lkKS9PYmplY3RzUGVySW1hZ2UpKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvdW50ICUuMjBnXG4iLAorICAgIChkb3VibGUpICgoY291bnQtcGFnZXNfaWQpL09iamVjdHNQZXJJbWFnZSkpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKQEAgLTEyNTksMTUgKzEyNjEsMTYgQEAKICAgICAgICAgcmVzb2x1dGlvbi55PShzaXplX3QpICgxMDAuMCoyLjU0KnJlc29sdXRpb24ueSswLjUpLzEwMC4wOwogICAgICAgfQogICAgIFNldEdlb21ldHJ5KGltYWdlLCZnZW9tZXRyeSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxpbWFnZV9pbmZvLT5wYWdlLE1heFRleHRFeHRlbnQpOwogICAgIGVsc2UKICAgICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgJiYgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGltYWdlLT5wYWdlLngsKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICBlbHNlCiAgICAgICAgIGlmICgoaW1hZ2UtPmdyYXZpdHkgIT0gVW5kZWZpbmVkR3Jhdml0eSkgJiYKICAgICAgICAgICAgIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGIikgPT0gMCkpCkBAIC0xMjk4LDEzICsxMzAxLDEzIEBACiAgICAgICBXcml0ZSBQYWdlIG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvUGFnZVxuIik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhcmVudCAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2VzX2lkKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUGFyZW50ICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIHBhZ2VzX2lkKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1Jlc291cmNlcyA8PFxuIik7CiAgICAgbGFiZWxzPShjaGFyICoqKSBOVUxMOwpAQCAtMTMxNCwxNiArMTMxNywxNiBAQAogICAgIGlmIChsYWJlbHMgIT0gKGNoYXIgKiopIE5VTEwpCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIi9Gb250IDw8IC9GJWx1ICVsdSAwIFIgPj5cbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzQpOworICAgICAgICAgICIvRm9udCA8PCAvRiUuMjBnICUuMjBnIDAgUiA+PlxuIiwoZG91YmxlKSBpbWFnZS0+c2NlbmUsKGRvdWJsZSkKKyAgICAgICAgICBvYmplY3QrNCk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgIi9YT2JqZWN0IDw8IC9JbSVsdSAlbHUgMCBSID4+XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzUpOworICAgICAgIi9YT2JqZWN0IDw8IC9JbSUuMjBnICUuMjBnIDAgUiA+PlxuIiwoZG91YmxlKSBpbWFnZS0+c2NlbmUsKGRvdWJsZSkKKyAgICAgIG9iamVjdCs1KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Byb2NTZXQgJWx1IDAgUiA+PlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Byb2NTZXQgJS4yMGcgMCBSID4+XG4iLAorICAgICAgKGRvdWJsZSkgb2JqZWN0KzMpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgIi9NZWRpYUJveCBbMCAwICVnICVnXVxuIiw3Mi4wKm1lZGlhX2luZm8ud2lkdGgvcmVzb2x1dGlvbi54LApAQCAtMTMzMywxMSArMTMzNiwxMSBAQAogICAgICAgIi9Dcm9wQm94IFswIDAgJWcgJWddXG4iLDcyLjAqbWVkaWFfaW5mby53aWR0aC9yZXNvbHV0aW9uLngsCiAgICAgICA3Mi4wKm1lZGlhX2luZm8uaGVpZ2h0L3Jlc29sdXRpb24ueSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db250ZW50cyAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsxKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29udGVudHMgJS4yMGcgMCBSXG4iLAorICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvVGh1bWIgJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrOCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1RodW1iICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCs4KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CkBAIC0xMzQ1LDEyICsxMzQ4LDEyIEBACiAgICAgICBXcml0ZSBDb250ZW50cyBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsxKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CkBAIC0xMzYwLDIyICsxMzYzLDIzIEBACiAgICAgICBmb3IgKGk9MDsgbGFiZWxzW2ldICE9IChjaGFyICopIE5VTEw7IGkrKykKICAgICAgIHsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiQlRcbiIpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRiVsdSAlZyBUZlxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lLHBvaW50c2l6ZSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9GJS4yMGcgJWcgVGZcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLHBvaW50c2l6ZSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWxkICVsZCBUZFxuIiwobG9uZykKLSAgICAgICAgICBnZW9tZXRyeS54LChsb25nKSAoZ2VvbWV0cnkueStnZW9tZXRyeS5oZWlnaHQraSpwb2ludHNpemUrMTIpKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgJS4yMGcgVGRcbiIsCisgICAgICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSAoZ2VvbWV0cnkueStnZW9tZXRyeS5oZWlnaHQraSpwb2ludHNpemUrCisgICAgICAgICAgMTIpKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIoJXMpIFRqXG4iLGxhYmVsc1tpXSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiRVRcbiIpOwogICAgICAgICBsYWJlbHNbaV09RGVzdHJveVN0cmluZyhsYWJlbHNbaV0pOwogICAgICAgfQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVnIDAgMCAlZyAlbGQgJWxkIGNtXG4iLAotICAgICAgc2NhbGUueCxzY2FsZS55LChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlZyAwIDAgJWcgJS4yMGcgJS4yMGcgY21cbiIsCisgICAgICBzY2FsZS54LHNjYWxlLnksKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0ltJWx1IERvXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0ltJS4yMGcgRG9cbiIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJRXG4iKTsKICAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLW9mZnNldDsKQEAgLTEzODUsMTkgKzEzODksMTggQEAKICAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2Zmc2V0KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKSBvZmZzZXQpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgIC8qCiAgICAgICBXcml0ZSBQcm9jc2V0IG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGlmICgoaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgPT0gRGlyZWN0Q2xhc3MpIHx8IChpbWFnZS0+Y29sb3JzID4gMjU2KSkKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiWyAvUERGIC9UZXh0IC9JbWFnZUMiLE1heFRleHRFeHRlbnQpOwpAQCAtMTQxMywxNiArMTQxNiwxNiBAQAogICAgICAgV3JpdGUgRm9udCBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICAgaWYgKGxhYmVscyAhPSAoY2hhciAqKikgTlVMTCkKICAgICAgIHsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL0ZvbnRcbiIpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvU3VidHlwZSAvVHlwZTFcbiIpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvRiVsdVxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL0YlLjIwZ1xuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9CYXNlRm9udCAvSGVsdmV0aWNhXG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nXG4iKTsKQEAgLTE0MzQsMTQgKzE0MzcsMTQgQEAKICAgICAgIFdyaXRlIFhPYmplY3Qgb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9YT2JqZWN0XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvU3VidHlwZSAvSW1hZ2VcbiIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9OYW1lIC9JbSVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9OYW1lIC9JbSUuMjBnXG4iLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICB7CkBAIC0xNDg3LDggKzE0OTAsOCBAQAogICAgICAgICAgIE1heFRleHRFeHRlbnQpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9EZWNvZGVQYXJtcyBbIDw8ICIKLSAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICVsZCAvUm93cyAlbGQgPj4gXVxuIixDQ0lUVFBhcmFtLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAgICIvSyAlcyAvQmxhY2tJczEgZmFsc2UgL0NvbHVtbnMgJS4yMGcgL1Jvd3MgJS4yMGcgPj4gXVxuIixDQ0lUVFBhcmFtLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBkZWZhdWx0OgpAQCAtMTQ5OSwxNCArMTUwMiwxNCBAQAogICAgICAgfQogICAgIH0KICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICUuMjBnXG4iLChkb3VibGUpCisgICAgICBpbWFnZS0+Y29sdW1ucyk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSGVpZ2h0ICUuMjBnXG4iLChkb3VibGUpCisgICAgICBpbWFnZS0+cm93cyk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db2xvclNwYWNlICVsdSAwIFJcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzIpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db2xvclNwYWNlICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCsyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0JpdHNQZXJDb21wb25lbnQgJWRcbiIsCiAgICAgICAoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgPwpAQCAtMTUxNCwxMiArMTUxNywxMiBAQAogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKQogICAgICAgewotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvU01hc2sgJWx1IDAgUlxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzcpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvU01hc2sgJS4yMGcgMCBSXG4iLAorICAgICAgICAgIChkb3VibGUpIG9iamVjdCs3KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgfQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwpAQCAtMTg0NywxOCArMTg1MCwxOCBAQAogICAgICAgV3JpdGUgTGVuZ3RoIG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLAorICAgICAgKGRvdWJsZSkgb2Zmc2V0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgICAvKgogICAgICAgV3JpdGUgQ29sb3JzcGFjZSBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpCkBAIC0xODc2LDggKzE4NzksOCBAQAogICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiL0RldmljZVJHQlxuIixNYXhUZXh0RXh0ZW50KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiWyAvSW5kZXhlZCAvRGV2aWNlUkdCICVsdSAlbHUgMCBSIF1cbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICBpbWFnZS0+Y29sb3JzLTEsKHVuc2lnbmVkIGxvbmcpIG9iamVjdCszKTsKKyAgICAgICAgICAgICJbIC9JbmRleGVkIC9EZXZpY2VSR0IgJS4yMGcgJS4yMGcgMCBSIF1cbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycy0KKyAgICAgICAgICAgIDEsKGRvdWJsZSkgb2JqZWN0KzMpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgIC8qCkBAIC0xODkxLDcgKzE4OTQsNyBAQAogICAgIGlmICh0aWxlX2ltYWdlID09IChJbWFnZSAqKSBOVUxMKQogICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLGltYWdlLT5leGNlcHRpb24ucmVhc29uKTsKICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CkBAIC0xOTM5LDggKzE5NDIsOCBAQAogICAgICAgICAgIE1heFRleHRFeHRlbnQpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9EZWNvZGVQYXJtcyBbIDw8ICIKLSAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICVsdSAvUm93cyAlbHUgPj4gXVxuIixDQ0lUVFBhcmFtLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlX2ltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSB0aWxlX2ltYWdlLT5yb3dzKTsKKyAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICUuMjBnIC9Sb3dzICUuMjBnID4+IF1cbiIsQ0NJVFRQYXJhbSwKKyAgICAgICAgICAoZG91YmxlKSB0aWxlX2ltYWdlLT5jb2x1bW5zLChkb3VibGUpIHRpbGVfaW1hZ2UtPnJvd3MpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGRlZmF1bHQ6CkBAIC0xOTUxLDIxICsxOTU0LDIxIEBACiAgICAgICB9CiAgICAgfQogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGVfaW1hZ2UtPmNvbHVtbnMpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9XaWR0aCAlLjIwZ1xuIiwoZG91YmxlKQorICAgICAgdGlsZV9pbWFnZS0+Y29sdW1ucyk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGVfaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgIHRpbGVfaW1hZ2UtPnJvd3MpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29sb3JTcGFjZSAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdC0xKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29sb3JTcGFjZSAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QtMSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9CaXRzUGVyQ29tcG9uZW50ICVkXG4iLAogICAgICAgKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fCAoY29tcHJlc3Npb24gPT0gR3JvdXA0Q29tcHJlc3Npb24pID8KICAgICAgIDEgOiA4KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsxKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CkBAIC0yMjYyLDE1ICsyMjY1LDE0IEBACiAgICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9mZnNldCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgb2Zmc2V0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzICE9IERpcmVjdENsYXNzKSAmJiAoaW1hZ2UtPmNvbG9ycyA8PSAyNTYpICYmCkBAIC0yMjgyLDggKzIyODQsOCBAQAogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBOb0NvbXByZXNzaW9uKQogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZSBdXG4iKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlbHUgMCBSXG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAorICAgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CkBAIC0yMzE2LDEwICsyMzE4LDEwIEBACiAgICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgICBvZmZzZXQpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwpAQCAtMjMyNyw3ICsyMzI5LDcgQEAKICAgICAgIFdyaXRlIHNvZnRtYXNrIG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKQEAgLTIzMzcsOCArMjMzOSw4IEBACiAgICAgICB7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9YT2JqZWN0XG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL0ltYWdlXG4iKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL01hJWx1XG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvTWElLjIwZ1xuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgIHsKQEAgLTIzNjcsMTkgKzIzNjksMTkgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJWx1XG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucyk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9XaWR0aCAlLjIwZ1xuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucyk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL0NvbG9yU3BhY2UgL0RldmljZUdyYXlcbiIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQml0c1BlckNvbXBvbmVudCAlZFxuIiwKICAgICAgICAgICAoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikKICAgICAgICAgICA/IDEgOiA4KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICVsdSAwIFJcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsxKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCisgICAgICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwic3RyZWFtXG4iKTsKQEAgLTI0NjYsMTEgKzI0NjgsMTAgQEAKICAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICBvZmZzZXQpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAgaWYgKEdldE5leHRJbWFnZUluTGlzdChpbWFnZSkgPT0gKEltYWdlICopIE5VTEwpCkBAIC0yNDg2LDcgKzI0ODcsNyBAQAogICAqLwogICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgIGluZm9faWQ9b2JqZWN0OwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgb2JqZWN0KTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CkBAIC0yNTE2LDcgKzI1MTcsNyBAQAogICAqLwogICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLXhyZWZbMF0rMTA7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInhyZWZcbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIwICVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiMCAlLjIwZ1xuIiwoZG91YmxlKQogICAgIG9iamVjdCsxKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIwMDAwMDAwMDAwIDY1NTM1IGYgXG4iKTsKQEAgLTI1MjgsMTkgKzI1MjksMTggQEAKICAgfQogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ0cmFpbGVyXG4iKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvU2l6ZSAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9TaXplICUuMjBnXG4iLChkb3VibGUpCiAgICAgb2JqZWN0KzEpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JbmZvICVsdSAwIFJcbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIGluZm9faWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSW5mbyAlLjIwZyAwIFJcbiIsKGRvdWJsZSkKKyAgICBpbmZvX2lkKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUm9vdCAlbHUgMCBSXG4iLAotICAgICh1bnNpZ25lZCBsb25nKSByb290X2lkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Jvb3QgJS4yMGcgMCBSXG4iLChkb3VibGUpCisgICAgcm9vdF9pZCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdGFydHhyZWZcbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIG9mZnNldCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFT0ZcbiIpOwogICB4cmVmPShNYWdpY2tPZmZzZXRUeXBlICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkoeHJlZik7CmRpZmYgLS1naXQgYS9jb2RlcnMvcGljdC5jIGIvY29kZXJzL3BpY3QuYwppbmRleCBhNDJiODdjLi4yMmQ4YjZlIDEwMDY0NAotLS0gYS9jb2RlcnMvcGljdC5jCisrKyBiL2NvZGVycy9waWN0LmMKQEAgLTEzODAsOSArMTM4MCw5IEBACiAgICAgICAgIHJlYWRfaW5mbz1EZXN0cm95SW1hZ2VJbmZvKHJlYWRfaW5mbyk7CiAgICAgICAgIGlmICh0aWxlX2ltYWdlID09IChJbWFnZSAqKSBOVUxMKQogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBNYWdpY2tNYXgoaW1hZ2UtPmNvbHVtbnMsdGlsZV9pbWFnZS0+Y29sdW1ucyksCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIE1hZ2lja01heChpbWFnZS0+cm93cyx0aWxlX2ltYWdlLT5yb3dzKSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLAorICAgICAgICAgIChkb3VibGUpIE1hZ2lja01heChpbWFnZS0+Y29sdW1ucyx0aWxlX2ltYWdlLT5jb2x1bW5zKSwKKyAgICAgICAgICAoZG91YmxlKSBNYWdpY2tNYXgoaW1hZ2UtPnJvd3MsdGlsZV9pbWFnZS0+cm93cykpOwogICAgICAgICAodm9pZCkgU2V0SW1hZ2VFeHRlbnQoaW1hZ2UsCiAgICAgICAgICAgTWFnaWNrTWF4KGltYWdlLT5jb2x1bW5zLHRpbGVfaW1hZ2UtPmNvbHVtbnMpLAogICAgICAgICAgIE1hZ2lja01heChpbWFnZS0+cm93cyx0aWxlX2ltYWdlLT5yb3dzKSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvcG5nLmMgYi9jb2RlcnMvcG5nLmMKaW5kZXggMGJhNzg1Ni4uNmUyNTc2NSAxMDA2NDQKLS0tIGEvY29kZXJzL3BuZy5jCisrKyBiL2NvZGVycy9wbmcuYwpAQCAtNTQ5LDggKzU0OSw4IEBACiAgIGFzc2VydChpbWFnZS0+c2lnbmF0dXJlID09IE1hZ2lja1NpZ25hdHVyZSk7CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiICAgIENvbXByZXNzQ29sb3JNYXBUcmFuc0ZpcnN0ICVzICglbHUgY29sb3JzKSIsaW1hZ2UtPmZpbGVuYW1lLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2xvcnMpOworICAgICAgIiAgICBDb21wcmVzc0NvbG9yTWFwVHJhbnNGaXJzdCAlcyAoJS4yMGcgY29sb3JzKSIsaW1hZ2UtPmZpbGVuYW1lLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycyk7CiAgIGlmIChpbWFnZS0+c3RvcmFnZV9jbGFzcyAhPSBQc2V1ZG9DbGFzcyB8fCBpbWFnZS0+Y29sb3JzID4gMjU2IHx8CiAgICAgICBpbWFnZS0+Y29sb3JzIDwgMikKICAgICB7CkBAIC0xMDU1LDggKzEwNTUsOCBAQAogewogICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICIgIFdyaXRpbmcgJWMlYyVjJWMgY2h1bmssIGxlbmd0aDogJWx1IiwKLSAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAiICBXcml0aW5nICVjJWMlYyVjIGNodW5rLCBsZW5ndGg6ICUuMjBnIiwKKyAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKGRvdWJsZSkgbGVuZ3RoKTsKIH0KICNlbmRpZiAvKiBQTkdfTElCUE5HX1ZFUiA+IDEwMDExICovCiAKQEAgLTExNzgsOCArMTE3OCw4IEBACiAgICAgICAgICAgICBtc2dbTWF4VGV4dEV4dGVudF07CiAKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1zZyxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgIkV4cGVjdGVkICVsdSBieXRlczsgZm91bmQgJWx1IGJ5dGVzIiwodW5zaWduZWQgbG9uZykgbGVuZ3RoLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoZWNrKTsKKyAgICAgICAgICAgICJFeHBlY3RlZCAlLjIwZyBieXRlczsgZm91bmQgJS4yMGcgYnl0ZXMiLChkb3VibGUpIGxlbmd0aCwKKyAgICAgICAgICAgIChkb3VibGUpIGNoZWNrKTsKICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLG1zZyk7CiAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIlJlYWQgRXhjZXB0aW9uIik7CiAgICAgICAgIH0KQEAgLTE4OTQsOCArMTg5NCw4IEBACiAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgIHsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIFBORyB3aWR0aDogJWx1LCBoZWlnaHQ6ICVsdSIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBwaW5nX3dpZHRoLCAodW5zaWduZWQgbG9uZykgcGluZ19oZWlnaHQpOworICAgICAgICAiICAgIFBORyB3aWR0aDogJS4yMGcsIGhlaWdodDogJS4yMGciLAorICAgICAgICAoZG91YmxlKSBwaW5nX3dpZHRoLCAoZG91YmxlKSBwaW5nX2hlaWdodCk7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgIiAgICBQTkcgY29sb3JfdHlwZTogJWQsIGJpdF9kZXB0aDogJWQiLAogICAgICAgICBwaW5nX2NvbG9yX3R5cGUsIHBpbmdfYml0X2RlcHRoKTsKQEAgLTIwMTUsOCArMjAxNSw4IEBACiAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgaWYgKGltYWdlLT5wYWdlLnggfHwgaW1hZ2UtPnBhZ2UueSkKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICIgICAgUmVhZGluZyBQTkcgb0ZGcyBjaHVuazogeDogJWxkLCB5OiAlbGQuIiwobG9uZykgaW1hZ2UtPnBhZ2UueCwKLSAgICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgICAgICIgICAgUmVhZGluZyBQTkcgb0ZGcyBjaHVuazogeDogJS4yMGcsIHk6ICUuMjBnLiIsKGRvdWJsZSkKKyAgICAgICAgICAgIGltYWdlLT5wYWdlLngsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueSk7CiAgICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChQTkdfcEhZc19TVVBQT1JURUQpCkBAIC0yMDU1LDggKzIwNTUsOCBAQAogICAgICAgICB9CiAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgICBSZWFkaW5nIFBORyBwSFlzIGNodW5rOiB4cmVzOiAlbHUsIHlyZXM6ICVsdSwgdW5pdHM6ICVkLiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHhfcmVzb2x1dGlvbiwodW5zaWduZWQgbG9uZykgeV9yZXNvbHV0aW9uLHVuaXRfdHlwZSk7CisgICAgICAgICAgIiAgICBSZWFkaW5nIFBORyBwSFlzIGNodW5rOiB4cmVzOiAlLjIwZywgeXJlczogJS4yMGcsIHVuaXRzOiAlZC4iLAorICAgICAgICAgIChkb3VibGUpIHhfcmVzb2x1dGlvbiwoZG91YmxlKSB5X3Jlc29sdXRpb24sdW5pdF90eXBlKTsKICAgICB9CiAjZW5kaWYKICAgaWYgKHBuZ19nZXRfdmFsaWQocGluZyxwaW5nX2luZm8sUE5HX0lORk9fUExURSkpCkBAIC0yMTgwLDkgKzIxODAsMTAgQEAKIAogICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgICAgaW1hZ2UtPmJhY2tncm91bmRfY29sb3I9KCVkLCVkLCVkKS4iLAotICAgICAgICAgICAgICBpbWFnZS0+YmFja2dyb3VuZF9jb2xvci5yZWQsCi0gICAgICAgICAgICAgIGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yLmdyZWVuLGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yLmJsdWUpOworICAgICAgICAgICAgICAiICAgIGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yPSglLjIwZywlLjIwZywlLjIwZykuIiwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmJhY2tncm91bmRfY29sb3IucmVkLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+YmFja2dyb3VuZF9jb2xvci5ncmVlbiwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmJhY2tncm91bmRfY29sb3IuYmx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYKQEAgLTIzNDksNyArMjM1MCw3IEBACiAgICAgewogICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICIgICAgU2tpcHBpbmcgUE5HIGltYWdlIGRhdGEgZm9yIHNjZW5lICVsZCIsKGxvbmcpCisgICAgICAgICAgIiAgICBTa2lwcGluZyBQTkcgaW1hZ2UgZGF0YSBmb3Igc2NlbmUgJS4yMGciLChkb3VibGUpCiAgICAgICAgICAgbW5nX2luZm8tPnNjZW5lc19mb3VuZC0xKTsKICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwaW5nLCZwaW5nX2luZm8sJmVuZF9pbmZvKTsKICNpZiBkZWZpbmVkKFBOR19TRVRKTVBfTk9UX1RIUkVBRF9TQUZFKQpAQCAtMzI3Nyw4ICszMjc4LDggQEAKIAogICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgIFJlYWRpbmcgSk5HIGNodW5rIHR5cGUgJWMlYyVjJWMsIGxlbmd0aDogJWx1IiwKLSAgICAgICAgdHlwZVswXSx0eXBlWzFdLHR5cGVbMl0sdHlwZVszXSwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgIiAgUmVhZGluZyBKTkcgY2h1bmsgdHlwZSAlYyVjJWMlYywgbGVuZ3RoOiAlLjIwZyIsCisgICAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKGRvdWJsZSkgbGVuZ3RoKTsKIAogICAgIGlmIChsZW5ndGggPiBQTkdfVUlOVF8zMV9NQVggfHwgY291bnQgPT0gMCkKICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKENvcnJ1cHRJbWFnZUVycm9yLCJDb3JydXB0SW1hZ2UiKTsKQEAgLTQwODcsOCArNDA4OCw4IEBACiAKICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICIgIFJlYWRpbmcgTU5HIGNodW5rIHR5cGUgJWMlYyVjJWMsIGxlbmd0aDogJWx1IiwKLSAgICAgICAgICAgdHlwZVswXSx0eXBlWzFdLHR5cGVbMl0sdHlwZVszXSwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgICAgIiAgUmVhZGluZyBNTkcgY2h1bmsgdHlwZSAlYyVjJWMlYywgbGVuZ3RoOiAlLjIwZyIsCisgICAgICAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKGRvdWJsZSkgbGVuZ3RoKTsKIAogICAgICAgICBpZiAobGVuZ3RoID4gUE5HX1VJTlRfMzFfTUFYKQogICAgICAgICAgIHN0YXR1cz1NYWdpY2tGYWxzZTsKQEAgLTQxNDcsOSArNDE0OCw5IEBACiAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgTU5HIHdpZHRoOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBtbmdfaW5mby0+bW5nX3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICIgIE1ORyB3aWR0aDogJS4yMGciLChkb3VibGUpIG1uZ19pbmZvLT5tbmdfd2lkdGgpOwogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgTU5HIGhlaWdodDogJWx1IiwodW5zaWduZWQgbG9uZykgbW5nX2luZm8tPm1uZ19oZWlnaHQpOworICAgICAgICAgICAgICAgICAgIiAgTU5HIGhlaWdodDogJS4yMGciLChkb3VibGUpIG1uZ19pbmZvLT5tbmdfaGVpZ2h0KTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgcCs9ODsKICAgICAgICAgICAgIG1uZ19pbmZvLT50aWNrc19wZXJfc2Vjb25kPShzaXplX3QpIG1uZ19nZXRfbG9uZyhwKTsKQEAgLTQxODksOCArNDE5MCw4IEBACiAgICAgICAgICAgICBpZiAoKG1uZ19pbmZvLT5tbmdfd2lkdGggPiA2NTUzNUwpIHx8CiAgICAgICAgICAgICAgICAgKG1uZ19pbmZvLT5tbmdfaGVpZ2h0ID4gNjU1MzVMKSkKICAgICAgICAgICAgICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oSW1hZ2VFcnJvciwiV2lkdGhPckhlaWdodEV4Y2VlZHNMaW1pdCIpOwotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUrMCswIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1uZ19pbmZvLT5tbmdfd2lkdGgsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgIiUuMjBneCUuMjBnKzArMCIsKGRvdWJsZSkgbW5nX2luZm8tPm1uZ193aWR0aCwoZG91YmxlKQogICAgICAgICAgICAgICBtbmdfaW5mby0+bW5nX2hlaWdodCk7CiAgICAgICAgICAgICBtbmdfaW5mby0+ZnJhbWUubGVmdD0wOwogICAgICAgICAgICAgbW5nX2luZm8tPmZyYW1lLnJpZ2h0PShzc2l6ZV90KSBtbmdfaW5mby0+bW5nX3dpZHRoOwpAQCAtNDIyNSw5ICs0MjI2LDkgQEAKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICAgICAgICIgICAgcmVwZWF0PSVkIixyZXBlYXQpOwogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgICBmaW5hbF9kZWxheT0lbGQiLChsb25nKSBmaW5hbF9kZWxheSk7CisgICAgICAgICAgICAgICAgICAiICAgIGZpbmFsX2RlbGF5PSUuMjBnIiwoZG91YmxlKSBmaW5hbF9kZWxheSk7CiAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAiICAgIGltYWdlLT5pdGVyYXRpb25zPSVsZCIsKGxvbmcpIGltYWdlLT5pdGVyYXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICIgICAgaW1hZ2UtPml0ZXJhdGlvbnM9JS4yMGciLChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2h1bms9KHVuc2lnbmVkIGNoYXIgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShjaHVuayk7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQyNzgsMTAgKzQyNzksMTAgQEAKICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgIiAgeF9vZmZbJWRdOiAlbHUiLG9iamVjdF9pZCwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAiICB4X29mZlslZF06ICUuMjBnIixvYmplY3RfaWQsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW5mby0+eF9vZmZbb2JqZWN0X2lkXSk7CiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICIgIHlfb2ZmWyVkXTogJWx1IixvYmplY3RfaWQsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgIiAgeV9vZmZbJWRdOiAlLjIwZyIsb2JqZWN0X2lkLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgICAgbW5nX2luZm8tPnlfb2ZmW29iamVjdF9pZF0pOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CkBAIC00NTA0LDcgKzQ1MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcCs9NDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1pbmdfZGVsYXk9JWxkIiwobG9uZykgZnJhbWVfZGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRnJhbWluZ19kZWxheT0lLjIwZyIsKGRvdWJsZSkgZnJhbWVfZGVsYXkpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZV90aW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTQ1MTksNyArNDUyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwKz00OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRnJhbWluZ190aW1lb3V0PSVsZCIsKGxvbmcpIGZyYW1lX3RpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRnJhbWluZ190aW1lb3V0PSUuMjBnIiwoZG91YmxlKSBmcmFtZV90aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VfY2xpcHBpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtNDUyOCw5ICs0NTI5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2ZiPWZiOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRnJhbWVfY2xpcHBpbmc6IEw9JWxkIFI9JWxkIFQ9JWxkIEI9JWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgZmIubGVmdCwobG9uZykgZmIucmlnaHQsKGxvbmcpIGZiLnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgZmIuYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1lX2NsaXBwaW5nOiBMPSUuMjBnIFI9JS4yMGcgVD0lLjIwZyBCPSUuMjBnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBmYi5sZWZ0LChkb3VibGUpIGZiLnJpZ2h0LChkb3VibGUpIGZiLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBmYi5ib3R0b20pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZV9jbGlwcGluZyA9PSAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZiPWZiOwogICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQ1NDgsOCArNDU0OSw4IEBACiAjaWYgZGVmaW5lZChNTkdfSU5TRVJUX0xBWUVSUykKICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAiICAgc3ViZnJhbWVfd2lkdGg9JWx1LCBzdWJmcmFtZV9oZWlnaHQ9JWx1IiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgICBzdWJmcmFtZV93aWR0aCwodW5zaWduZWQgbG9uZykgc3ViZnJhbWVfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAiICAgc3ViZnJhbWVfd2lkdGg9JS4yMGcsIHN1YmZyYW1lX2hlaWdodD0lLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBzdWJmcmFtZV93aWR0aCwoZG91YmxlKSBzdWJmcmFtZV9oZWlnaHQpOwogICAgICAgICAgICAgaWYgKGluc2VydF9sYXllcnMgJiYgKG1uZ19pbmZvLT5mcmFtaW5nX21vZGUgPT0gNCkgJiYKICAgICAgICAgICAgICAgICAoc3ViZnJhbWVfd2lkdGgpICYmIChzdWJmcmFtZV9oZWlnaHQpKQogICAgICAgICAgICAgICB7CkBAIC00NTg4LDkgKzQ1ODksOSBAQAogICAgICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZUJhY2tncm91bmRDb2xvcihpbWFnZSk7CiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgSW5zZXJ0ZWQgYmFja2dyb3VuZCBsYXllciwgTD0lbGQsIFI9JWxkLCBUPSVsZCwgQj0lbGQiLAotICAgICAgICAgICAgICAgICAgICAobG9uZykgbW5nX2luZm8tPmNsaXAubGVmdCwobG9uZykgbW5nX2luZm8tPmNsaXAucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIChsb25nKSBtbmdfaW5mby0+Y2xpcC50b3AsKGxvbmcpIG1uZ19pbmZvLT5jbGlwLmJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgICIgIEluc2VydGVkIGJhY2tncm91bmQgbGF5ZXIsIEw9JS4yMGcsIFI9JS4yMGcgVD0lLjIwZywgQj0lLjIwZyIsCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLmxlZnQsKGRvdWJsZSkgbW5nX2luZm8tPmNsaXAucmlnaHQsCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLnRvcCwoZG91YmxlKSBtbmdfaW5mby0+Y2xpcC5ib3R0b20pOwogICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgIGNodW5rPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkoY2h1bmspOwpAQCAtNDcwNSw4ICs0NzA2LDggQEAKICAgICAgICAgICAgIGxvb3BfaXRlcnM9bW5nX2dldF9sb25nKCZjaHVua1sxXSk7CiAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgIiAgTE9PUCBsZXZlbCAlbGQgIGhhcyAlbGQgaXRlcmF0aW9ucyAiLChsb25nKSBsb29wX2xldmVsLAotICAgICAgICAgICAgICAgIChsb25nKSBsb29wX2l0ZXJzKTsKKyAgICAgICAgICAgICAgICAiICBMT09QIGxldmVsICUuMjBnIGhhcyAlLjIwZyBpdGVyYXRpb25zICIsKGRvdWJsZSkgbG9vcF9sZXZlbCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBsb29wX2l0ZXJzKTsKICAgICAgICAgICAgIGlmIChsb29wX2l0ZXJzID09IDApCiAgICAgICAgICAgICAgIHNraXBwaW5nX2xvb3A9bG9vcF9sZXZlbDsKICAgICAgICAgICAgIGVsc2UKQEAgLTQ3NDAsOCArNDc0MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1uZ19pbmZvLT5sb29wX2l0ZXJhdGlvbltsb29wX2xldmVsXSsrOwogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIEVOREw6IExPT1AgbGV2ZWwgJWxkICBoYXMgJWxkIHJlbWFpbmluZyBpdGVyYXRpb25zICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgbG9vcF9sZXZlbCwobG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIEVOREw6IExPT1AgbGV2ZWwgJS4yMGcgaGFzICUuMjBnIHJlbWFpbmluZyBpdGVyYXRpb25zICIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBsb29wX2xldmVsLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICBtbmdfaW5mby0+bG9vcF9jb3VudFtsb29wX2xldmVsXSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtbmdfaW5mby0+bG9vcF9jb3VudFtsb29wX2xldmVsXSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTUwNzAsOSArNTA3MSw4IEBACiAgICAgICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlQmFja2dyb3VuZENvbG9yKGltYWdlKTsKICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAiICBJbnNlcnRlZCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIGxheWVyLCBXPSVsdWQsIEg9JWx1ZCIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBtbmdfaW5mby0+bW5nX3dpZHRoLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgICAgICBtbmdfaW5mby0+bW5nX2hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICIgIEluc2VydGVkIHRyYW5zcGFyZW50IGJhY2tncm91bmQgbGF5ZXIsIFc9JS4yMGcsIEg9JS4yMGciLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtbmdfaW5mby0+bW5nX3dpZHRoLChkb3VibGUpIG1uZ19pbmZvLT5tbmdfaGVpZ2h0KTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgLyoKQEAgLTUxMTgsOSArNTExOCw5IEBACiAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VCYWNrZ3JvdW5kQ29sb3IoaW1hZ2UpOwogICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICIgIEluc2VydGVkIGJhY2tncm91bmQgbGF5ZXIsIEw9JWxkLCBSPSVsZCwgVD0lbGQsIEI9JWxkIiwKLSAgICAgICAgICAgICAgICAobG9uZykgbW5nX2luZm8tPmNsaXAubGVmdCwobG9uZykgbW5nX2luZm8tPmNsaXAucmlnaHQsCi0gICAgICAgICAgICAgICAgKGxvbmcpIG1uZ19pbmZvLT5jbGlwLnRvcCwobG9uZykgbW5nX2luZm8tPmNsaXAuYm90dG9tKTsKKyAgICAgICAgICAgICAgICAiICBJbnNlcnRlZCBiYWNrZ3JvdW5kIGxheWVyLCBMPSUuMjBnLCBSPSUuMjBnIFQ9JS4yMGcsIEI9JS4yMGciLAorICAgICAgICAgICAgICAgIChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLmxlZnQsKGRvdWJsZSkgbW5nX2luZm8tPmNsaXAucmlnaHQsCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgbW5nX2luZm8tPmNsaXAudG9wLChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLmJvdHRvbSk7CiAgICAgICAgICAgfQogI2VuZGlmIC8qIE1OR19JTlNFUlRfTEFZRVJTICovCiAgICAgICAgIGZpcnN0X21uZ19vYmplY3Q9TWFnaWNrRmFsc2U7CkBAIC01MzU0LDggKzUzNTQsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgICBNYWduaWZ5IHRoZSByb3dzIHRvICVsdSIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlLT5yb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgIiAgICBNYWduaWZ5IHRoZSByb3dzIHRvICUuMjBnIiwoZG91YmxlKSBsYXJnZV9pbWFnZS0+cm93cyk7CiAgICAgICAgICAgICAgICAgbT0oc3NpemVfdCkgbW5nX2luZm8tPm1hZ25fbXQ7CiAgICAgICAgICAgICAgICAgeXk9MDsKICAgICAgICAgICAgICAgICBsZW5ndGg9KHNpemVfdCkgaW1hZ2UtPmNvbHVtbnM7CkBAIC01NDg3LDggKzU0ODYsNyBAQAogICAgICAgICAgICAgICAgIC8qIG1hZ25pZnkgdGhlIGNvbHVtbnMgKi8KICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAiICAgIE1hZ25pZnkgdGhlIGNvbHVtbnMgdG8gJWx1IiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbHVtbnMpOworICAgICAgICAgICAgICAgICAgICAiICAgIE1hZ25pZnkgdGhlIGNvbHVtbnMgdG8gJS4yMGciLChkb3VibGUpIGltYWdlLT5jb2x1bW5zKTsKIAogICAgICAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgICAgICAgewpAQCAtNTg4MCw4ICs1ODc4LDggQEAKICAgaW1hZ2UtPmRlbGF5PWZpbmFsX2RlbGF5OwogICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICBpbWFnZS0+ZGVsYXk9JWx1LCBmaW5hbF9kZWxheT0lbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXksCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBmaW5hbF9kZWxheSk7CisgICAgICAgICIgIGltYWdlLT5kZWxheT0lLjIwZywgZmluYWxfZGVsYXk9JS4yMGciLChkb3VibGUpIGltYWdlLT5kZWxheSwKKyAgICAgICAgKGRvdWJsZSkgZmluYWxfZGVsYXkpOwogICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICB7CiAgICAgICBpbnQKQEAgLTU4OTIsMTMgKzU4OTAsMTIgQEAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAiICBCZWZvcmUgY29hbGVzY2U6Iik7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBzY2VuZSAwIGRlbGF5PSVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZWxheSk7CisgICAgICAgICIgICAgc2NlbmUgMCBkZWxheT0lLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPmRlbGF5KTsKICAgICAgIHdoaWxlIChHZXROZXh0SW1hZ2VJbkxpc3QoaW1hZ2UpICE9IChJbWFnZSAqKSBOVUxMKQogICAgICAgewogICAgICAgICBpbWFnZT1HZXROZXh0SW1hZ2VJbkxpc3QoaW1hZ2UpOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgIHNjZW5lICVsZCBkZWxheT0lbHUiLChsb25nKSBzY2VuZSsrLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIGltYWdlLT5kZWxheSk7CisgICAgICAgICAgIiAgICBzY2VuZSAlLjIwZyBkZWxheT0lLjIwZyIsKGRvdWJsZSkgc2NlbmUrKywoZG91YmxlKSBpbWFnZS0+ZGVsYXkpOwogICAgICAgfQogICAgIH0KIApAQCAtNTk1OSwxNCArNTk1NiwxNCBAQAogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICIgIEFmdGVyIGNvYWxlc2NlOiIpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgc2NlbmUgMCBkZWxheT0lbHUgZGlzcG9zZT0lbGQiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXksCi0gICAgICAgIChsb25nKSBpbWFnZS0+ZGlzcG9zZSk7CisgICAgICAgICIgICAgc2NlbmUgMCBkZWxheT0lLjIwZyBkaXNwb3NlPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVsYXksCisgICAgICAgIChkb3VibGUpIGltYWdlLT5kaXNwb3NlKTsKICAgICAgIHdoaWxlIChHZXROZXh0SW1hZ2VJbkxpc3QoaW1hZ2UpICE9IChJbWFnZSAqKSBOVUxMKQogICAgICAgewogICAgICAgICBpbWFnZT1HZXROZXh0SW1hZ2VJbkxpc3QoaW1hZ2UpOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgIHNjZW5lICVsZCBkZWxheT0lbHUgZGlzcG9zZT0lbGQiLChsb25nKSBzY2VuZSsrLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXksKGxvbmcpIGltYWdlLT5kaXNwb3NlKTsKKyAgICAgICAgICAiICAgIHNjZW5lICUuMjBnIGRlbGF5PSUuMjBnIGRpc3Bvc2U9JS4yMGciLChkb3VibGUpIHNjZW5lKyssCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmRlbGF5LChkb3VibGUpIGltYWdlLT5kaXNwb3NlKTsKICAgICAgIH0KICAgIH0KICAgaW1hZ2U9R2V0Rmlyc3RJbWFnZUluTGlzdChpbWFnZSk7CkBAIC02Mjg0LDggKzYyODEsOCBAQAogCiAgICBpZiAoaW1hZ2VfaW5mby0+dmVyYm9zZSkKICAgICAgewotICAgICAodm9pZCkgcHJpbnRmKCJ3cml0aW5nIHJhdyBwcm9maWxlOiB0eXBlPSVzLCBsZW5ndGg9JWx1XG4iLAotICAgICAgIChjaGFyICopIHByb2ZpbGVfdHlwZSwgbGVuZ3RoKTsKKyAgICAgKHZvaWQpIHByaW50Zigid3JpdGluZyByYXcgcHJvZmlsZTogdHlwZT0lcywgbGVuZ3RoPSUuMjBnXG4iLAorICAgICAgIChjaGFyICopIHByb2ZpbGVfdHlwZSwgKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgfQogICAgdGV4dD0ocG5nX3RleHRwKSBwbmdfbWFsbG9jKHBpbmcsKHBuZ191aW50XzMyKSBzaXplb2YocG5nX3RleHQpKTsKICAgIGRlc2NyaXB0aW9uX2xlbmd0aD0ocG5nX3VpbnRfMzIpIHN0cmxlbigoY29uc3QgY2hhciAqKSBwcm9maWxlX2Rlc2NyaXB0aW9uKTsKQEAgLTY1NTcsMTUgKzY1NTQsMTUgQEAKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICB3aWR0aD0lbHUiLCh1bnNpZ25lZCBsb25nKSBwaW5nX3dpZHRoKTsKKyAgICAgICAgIiAgICB3aWR0aD0lLjIwZyIsKGRvdWJsZSkgcGluZ193aWR0aCk7CiAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIGhlaWdodD0lbHUiLCh1bnNpZ25lZCBsb25nKSBwaW5nX2hlaWdodCk7CisgICAgICAgICIgICAgaGVpZ2h0PSUuMjBnIiwoZG91YmxlKSBwaW5nX2hlaWdodCk7CiAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIGltYWdlX21hdHRlPSVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5tYXR0ZSk7CisgICAgICAgICIgICAgaW1hZ2VfbWF0dGU9JS4yMGciLChkb3VibGUpIGltYWdlLT5tYXR0ZSk7CiAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIGltYWdlX2RlcHRoPSVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAgICIgICAgaW1hZ2VfZGVwdGg9JS4yMGciLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIHJlcXVlc3RlZCBQTkcgaW1hZ2VfZGVwdGg9JWx1IiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICAgIiAgICByZXF1ZXN0ZWQgUE5HIGltYWdlX2RlcHRoPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVwdGgpOwogICAgIH0KICAgc2F2ZV9pbWFnZV9kZXB0aD1pbWFnZV9kZXB0aDsKICAgcGluZ19iaXRfZGVwdGg9KHBuZ19ieXRlKSBzYXZlX2ltYWdlX2RlcHRoOwpAQCAtNjY4Miw3ICs2Njc5LDcgQEAKICAgICAgICAgICAgICAgKHZvaWQpIFN5bmNJbWFnZShpbWFnZSk7CiAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgICBDb2xvcnMgcXVhbnRpemVkIHRvICVsZCIsKHVuc2lnbmVkIGxvbmcpIG51bWJlcl9jb2xvcnMpOworICAgICAgICAgICAgICAgICAgIiAgICBDb2xvcnMgcXVhbnRpemVkIHRvICUuMjBnIiwoZG91YmxlKSBudW1iZXJfY29sb3JzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBpZiAobWF0dGUpCiAgICAgICAgICAgICBwbmdfc2V0X2ludmFsaWQocGluZyxwaW5nX2luZm8sUE5HX0lORk9fdFJOUyk7CkBAIC02ODg3LDcgKzY4ODQsNyBAQAogICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAiICAgIE51bWJlciBvZiBjb2xvcnM6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlX2NvbG9ycyk7CisgICAgICAgICAgICAgICAgIiAgICBOdW1iZXIgb2YgY29sb3JzOiAlLjIwZyIsKGRvdWJsZSkgaW1hZ2VfY29sb3JzKTsKICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgICAgICIgICAgVGVudGF0aXZlIFBORyBiaXQgZGVwdGg6ICVkIixwaW5nX2JpdF9kZXB0aCk7CiAgICAgICAgICAgICAgfQpAQCAtNjkwMyw3ICs2OTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIENvbG9ycyBpbmNyZWFzZWQgdG8gJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQ29sb3JzIGluY3JlYXNlZCB0byAlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2NvbG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KQEAgLTY5MTQsMTMgKzY5MTEsMTMgQEAKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgVGVudGF0aXZlIFBORyBjb2xvciB0eXBlOiAlZCIscGluZ19jb2xvcl90eXBlKTsKKyAgICAgICAgIiAgICBUZW50YXRpdmUgUE5HIGNvbG9yIHR5cGU6ICUuMjBnIiwoZG91YmxlKSBwaW5nX2NvbG9yX3R5cGUpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgaW1hZ2VfaW5mby0+dHlwZTogJWQiLGltYWdlX2luZm8tPnR5cGUpOworICAgICAgICAiICAgIGltYWdlX2luZm8tPnR5cGU6ICUuMjBnIiwoZG91YmxlKSBpbWFnZV9pbmZvLT50eXBlKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIGltYWdlX2RlcHRoOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZV9kZXB0aCk7CisgICAgICAgICIgICAgaW1hZ2VfZGVwdGg6ICUuMjBnIiwoZG91YmxlKSBpbWFnZV9kZXB0aCk7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBwaW5nX2JpdF9kZXB0aDogJWQiLHBpbmdfYml0X2RlcHRoKTsKKyAgICAgICAgIiAgICBwaW5nX2JpdF9kZXB0aDogJS4yMGciLChkb3VibGUpIHBpbmdfYml0X2RlcHRoKTsKICAgICB9CiAKICAgaWYgKG1hdHRlICYmIChtbmdfaW5mby0+b3B0aW1pemUgfHwgbW5nX2luZm8tPklzUGFsZXR0ZSkpCkBAIC03NjM1LDggKzc2MzIsNyBAQAogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICIgIFdyaXRpbmcgUE5HIGltYWdlIGRhdGEiKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIEFsbG9jYXRpbmcgJWx1IGJ5dGVzIG9mIG1lbW9yeSBmb3IgcGl4ZWxzIiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgcm93Ynl0ZXMpOworICAgICAgICAiICAgIEFsbG9jYXRpbmcgJS4yMGcgYnl0ZXMgb2YgbWVtb3J5IGZvciBwaXhlbHMiLChkb3VibGUpIHJvd2J5dGVzKTsKICAgICB9CiAgIHBuZ19waXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkocm93Ynl0ZXMsCiAgICAgc2l6ZW9mKCpwbmdfcGl4ZWxzKSk7CkBAIC03ODcyLDkgKzc4NjgsOSBAQAogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICIgIFdyb3RlIFBORyBpbWFnZSBkYXRhIik7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBXaWR0aDogJWx1IiwodW5zaWduZWQgbG9uZykgcGluZ193aWR0aCk7CisgICAgICAgICIgICAgV2lkdGg6ICUuMjBnIiwoZG91YmxlKSBwaW5nX3dpZHRoKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIEhlaWdodDogJWx1IiwodW5zaWduZWQgbG9uZykgcGluZ19oZWlnaHQpOworICAgICAgICAiICAgIEhlaWdodDogJS4yMGciLChkb3VibGUpIHBpbmdfaGVpZ2h0KTsKICAgICAgIGlmIChtbmdfaW5mby0+d3JpdGVfcG5nX2RlcHRoKQogICAgICAgICB7CiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCkBAIC04Mzg0LDggKzgzODAsOCBAQAogICAgICAgICAgIGpuZ19hbHBoYV9zYW1wbGVfZGVwdGg9ODsKICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICBTdWNjZXNzZnVsbHkgcmVhZCBqcGVnX2ltYWdlIGludG8gYSBibG9iLCBsZW5ndGg9JWx1LiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAgICAgICAiICBTdWNjZXNzZnVsbHkgcmVhZCBqcGVnX2ltYWdlIGludG8gYSBibG9iLCBsZW5ndGg9JS4yMGcuIiwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgbGVuZ3RoKTsKIAogICAgICAgICB9CiAgICAgICAvKiBEZXN0cm95IEpQRUcgaW1hZ2UgYW5kIGltYWdlX2luZm8gKi8KQEAgLTg2MDksNyArODYwNSw3IEBACiAgICAgICAgICAgLyogV3JpdGUgSURBVCBjaHVuayBoZWFkZXIgKi8KICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICBXcml0ZSBJREFUIGNodW5rcyBmcm9tIGJsb2IsIGxlbmd0aD0lbHUuIiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAgICAgIiAgV3JpdGUgSURBVCBjaHVua3MgZnJvbSBibG9iLCBsZW5ndGg9JS4yMGcuIiwoZG91YmxlKQogICAgICAgICAgICAgICBsZW5ndGgpOwogCiAgICAgICAgICAgLyogQ29weSBJREFUIGNodW5rcyAqLwpAQCAtODYzMiw4ICs4NjI4LDggQEAKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICIgICAgU2tpcHBpbmcgJWMlYyVjJWMgY2h1bmssIGxlbmd0aD0lbHUuIiwKLSAgICAgICAgICAgICAgICAgICAgKihwKSwqKHArMSksKihwKzIpLCoocCszKSwodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgIiAgICBTa2lwcGluZyAlYyVjJWMlYyBjaHVuaywgbGVuZ3RoPSUuMjBnLiIsCisgICAgICAgICAgICAgICAgICAgICoocCksKihwKzEpLCoocCsyKSwqKHArMyksKGRvdWJsZSkgbGVuKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgcCs9KDgrbGVuKTsKICAgICAgICAgICB9CkBAIC04NjQzLDcgKzg2MzksNyBAQAogICAgICAgICAgIC8qIFdyaXRlIEpEQUEgY2h1bmsgaGVhZGVyICovCiAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgV3JpdGUgSkRBQSBjaHVuaywgbGVuZ3RoPSVsdS4iLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAgICAgICAiICBXcml0ZSBKREFBIGNodW5rLCBsZW5ndGg9JS4yMGcuIiwoZG91YmxlKSBsZW5ndGgpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JNU0JVTG9uZyhpbWFnZSwoc2l6ZV90KSBsZW5ndGgpOwogICAgICAgICAgIFBOR1R5cGUoY2h1bmssbW5nX0pEQUEpOwogICAgICAgICAgIExvZ1BOR0NodW5rKChpbnQpIGxvZ2dpbmcsbW5nX0pEQUEsbGVuZ3RoKTsKQEAgLTg2ODIsOCArODY3OCw4IEBACiAKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiICBDcmVhdGVkIGpwZWdfaW1hZ2UsICVsdSB4ICVsdS4iLCh1bnNpZ25lZCBsb25nKSBqcGVnX2ltYWdlLT5jb2x1bW5zLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGpwZWdfaW1hZ2UtPnJvd3MpOworICAgICAgIiAgQ3JlYXRlZCBqcGVnX2ltYWdlLCAlLjIwZyB4ICUuMjBnLiIsKGRvdWJsZSkganBlZ19pbWFnZS0+Y29sdW1ucywKKyAgICAgIChkb3VibGUpIGpwZWdfaW1hZ2UtPnJvd3MpOwogCiAgIGlmIChqbmdfY29sb3JfdHlwZSA9PSA4IHx8IGpuZ19jb2xvcl90eXBlID09IDEyKQogICAgIGpwZWdfaW1hZ2VfaW5mby0+dHlwZT1HcmF5c2NhbGVUeXBlOwpAQCAtODY5NywxMSArODY5MywxMSBAQAogICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICB7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgU3VjY2Vzc2Z1bGx5IHJlYWQganBlZ19pbWFnZSBpbnRvIGEgYmxvYiwgbGVuZ3RoPSVsdS4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgIiAgU3VjY2Vzc2Z1bGx5IHJlYWQganBlZ19pbWFnZSBpbnRvIGEgYmxvYiwgbGVuZ3RoPSUuMjBnLiIsCisgICAgICAgIChkb3VibGUpIGxlbmd0aCk7CiAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICBXcml0ZSBKREFUIGNodW5rLCBsZW5ndGg9JWx1LiIsKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAgICIgIFdyaXRlIEpEQVQgY2h1bmssIGxlbmd0aD0lLjIwZy4iLChkb3VibGUpIGxlbmd0aCk7CiAgICAgfQogICAvKiBXcml0ZSBKREFUIGNodW5rKHMpICovCiAgICh2b2lkKSBXcml0ZUJsb2JNU0JVTG9uZyhpbWFnZSwoc2l6ZV90KSBsZW5ndGgpOwpAQCAtODk0MSw3ICs4OTM3LDcgQEAKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgIiAgICBPcHRpbWl6ZTogRkFMU0UiKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIEltYWdlX2luZm8gZGVwdGg6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlX2luZm8tPmRlcHRoKTsKKyAgICAgICAgIiAgICBJbWFnZV9pbmZvIGRlcHRoOiAlLjIwZyIsKGRvdWJsZSkgaW1hZ2VfaW5mby0+ZGVwdGgpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICIgICAgVHlwZTogJWQiLGltYWdlX2luZm8tPnR5cGUpOwogCkBAIC04OTQ5LDkgKzg5NDUsOSBAQAogICAgICAgZm9yIChwPWltYWdlOyBwICE9IChJbWFnZSAqKSBOVUxMOyBwPUdldE5leHRJbWFnZUluTGlzdChwKSkKICAgICAgIHsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgICBTY2VuZTogJWx1IiwodW5zaWduZWQgbG9uZykgc2NlbmUrKyk7CisgICAgICAgICAgIiAgICBTY2VuZTogJS4yMGciLChkb3VibGUpIHNjZW5lKyspOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgICAgSW1hZ2UgZGVwdGg6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIHAtPmRlcHRoKTsKKyAgICAgICAgICAiICAgICAgSW1hZ2UgZGVwdGg6ICUuMjBnIiwoZG91YmxlKSBwLT5kZXB0aCk7CiAgICAgICAgIGlmIChwLT5tYXR0ZSkKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICIgICAgICBNYXR0ZTogVHJ1ZSIpOwpAQCAtODk2Niw3ICs4OTYyLDcgQEAKICAgICAgICAgICAgICIgICAgICBTdG9yYWdlIGNsYXNzOiBEaXJlY3RDbGFzcyIpOwogICAgICAgICBpZiAocC0+Y29sb3JzKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgIiAgICAgIE51bWJlciBvZiBjb2xvcnM6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIHAtPmNvbG9ycyk7CisgICAgICAgICAgICAiICAgICAgTnVtYmVyIG9mIGNvbG9yczogJS4yMGciLChkb3VibGUpIHAtPmNvbG9ycyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICIgICAgICBOdW1iZXIgb2YgY29sb3JzOiB1bnNwZWNpZmllZCIpOwpAQCAtOTI5OSwxNSArOTI5NSwxNCBAQAogICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICIgICAgIFRFUk0gZGVsYXk6ICVsdSIsCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgKG1uZ19pbmZvLT50aWNrc19wZXJfc2Vjb25kKgotICAgICAgICAgICAgICAgICAgZmluYWxfZGVsYXkvTWFnaWNrTWF4KGltYWdlLT50aWNrc19wZXJfc2Vjb25kLDEpKSk7CisgICAgICAgICAgICAgICAiICAgICBURVJNIGRlbGF5OiAlLjIwZyIsKGRvdWJsZSkgKG1uZ19pbmZvLT50aWNrc19wZXJfc2Vjb25kKgorICAgICAgICAgICAgICBmaW5hbF9kZWxheS9NYWdpY2tNYXgoaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQsMSkpKTsKICAgICAgICAgICAgICBpZiAoaW1hZ2UtPml0ZXJhdGlvbnMgPT0gMCkKICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAiICAgICBURVJNIGl0ZXJhdGlvbnM6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIFBOR19VSU5UXzMxX01BWCk7CisgICAgICAgICAgICAgICAgICIgICAgIFRFUk0gaXRlcmF0aW9uczogJS4yMGciLChkb3VibGUpIFBOR19VSU5UXzMxX01BWCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICIgICAgIEltYWdlIGl0ZXJhdGlvbnM6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5pdGVyYXRpb25zKTsKKyAgICAgICAgICAgICAgICAgIiAgICAgSW1hZ2UgaXRlcmF0aW9uczogJS4yMGciLChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSwxNCxjaHVuayk7CiAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iTVNCVUxvbmcoaW1hZ2UsY3JjMzIoMCxjaHVuaywxNCkpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3BubS5jIGIvY29kZXJzL3BubS5jCmluZGV4IDkzMTNiNzIuLjkxZDY3ZjMgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wbm0uYworKysgYi9jb2RlcnMvcG5tLmMKQEAgLTE1NzAsOCArMTU3MCw4IEBACiAgICAgICB7CiAgICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBSR0JDb2xvcnNwYWNlKQogICAgICAgICAgICh2b2lkKSBUcmFuc2Zvcm1JbWFnZUNvbG9yc3BhY2UoaW1hZ2UsUkdCQ29sb3JzcGFjZSk7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4iLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgfQogICAgIGVsc2UKQEAgLTE1ODMsOCArMTU4Myw4IEBACiAgICAgICAgICAgUEFNIGhlYWRlci4KICAgICAgICAgKi8KICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiV0lEVEggJWx1XG5IRUlHSFQgJWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAgICJXSURUSCAlLjIwZ1xuSEVJR0hUICUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnJvd3MpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgIHF1YW50dW1fdHlwZT1HZXRRdWFudHVtVHlwZShpbWFnZSwmaW1hZ2UtPmV4Y2VwdGlvbik7CiAgICAgICAgIHN3aXRjaCAocXVhbnR1bV90eXBlKQpAQCAtMTYyMSw3ICsxNjIxLDcgQEAKICAgICAgICAgaWYgKGltYWdlLT5kZXB0aCA+IDE2KQogICAgICAgICAgIGltYWdlLT5kZXB0aD0xNjsKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiREVQVEggJWx1XG5NQVhWQUwgJWx1XG4iLCh1bnNpZ25lZCBsb25nKSBwYWNrZXRfc2l6ZSwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAiREVQVEggJS4yMGdcbk1BWFZBTCAlLjIwZ1xuIiwoZG91YmxlKSBwYWNrZXRfc2l6ZSwoZG91YmxlKQogICAgICAgICAgIEdldFF1YW50dW1SYW5nZShpbWFnZS0+ZGVwdGgpKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJUVVBMVFlQRSAlc1xuRU5ESERSXG4iLApAQCAtMTg1Myw3ICsxODUzLDcgQEAKICAgICAgICAgKi8KICAgICAgICAgaWYgKGltYWdlLT5kZXB0aCA+IDgpCiAgICAgICAgICAgaW1hZ2UtPmRlcHRoPTE2OwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgICAgR2V0UXVhbnR1bVJhbmdlKGltYWdlLT5kZXB0aCkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgIHF1YW50dW1faW5mbz1BY3F1aXJlUXVhbnR1bUluZm8oKGNvbnN0IEltYWdlSW5mbyAqKSBOVUxMLGltYWdlKTsKQEAgLTE5MzYsNyArMTkzNiw3IEBACiAgICAgICAgICovCiAgICAgICAgIGlmIChpbWFnZS0+ZGVwdGggPiA4KQogICAgICAgICAgIGltYWdlLT5kZXB0aD0xNjsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgIEdldFF1YW50dW1SYW5nZShpbWFnZS0+ZGVwdGgpKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICBxdWFudHVtX2luZm89QWNxdWlyZVF1YW50dW1JbmZvKChjb25zdCBJbWFnZUluZm8gKikgTlVMTCxpbWFnZSk7CmRpZmYgLS1naXQgYS9jb2RlcnMvcHMuYyBiL2NvZGVycy9wcy5jCmluZGV4IGNkZDA5ODguLjg2Y2M4NTkgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wcy5jCisrKyBiL2NvZGVycy9wcy5jCkBAIC02MjIsOCArNjIyLDggQEAKICAgICAgICAgLyoKICAgICAgICAgICBOb3RlIHNwb3QgbmFtZXMuCiAgICAgICAgICovCi0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocHJvcGVydHksTWF4VGV4dEV4dGVudCwicHM6U3BvdENvbG9yLSVsdSIsCi0gICAgICAgICAgc3BvdGNvbG9yKyspOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByb3BlcnR5LE1heFRleHRFeHRlbnQsInBzOlNwb3RDb2xvci0lLjIwZyIsCisgICAgICAgICAgKGRvdWJsZSkgKHNwb3Rjb2xvcisrKSk7CiAgICAgICAgIGZvciAocD1jb21tYW5kOyAqcCAhPSAnXDAnOyBwKyspCiAgICAgICAgICAgaWYgKGlzc3BhY2UoKGludCkgKHVuc2lnbmVkIGNoYXIpICpwKSAhPSAwKQogICAgICAgICAgICAgYnJlYWs7CkBAIC03MzEsOCArNzMxLDggQEAKICAgcGFnZS53aWR0aD0oc2l6ZV90KSBmbG9vcihwYWdlLndpZHRoKmltYWdlLT54X3Jlc29sdXRpb24vZGVsdGEueCswLjUpOwogICBwYWdlLmhlaWdodD0oc2l6ZV90KSBmbG9vcihwYWdlLmhlaWdodCppbWFnZS0+eV9yZXNvbHV0aW9uL2RlbHRhLnkrCiAgICAgMC41KTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJWx1eCVsdSAiLAotICAgICh1bnNpZ25lZCBsb25nKSBwYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBwYWdlLmhlaWdodCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZyUuMjBneCUuMjBnICIsKGRvdWJsZSkKKyAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICAgcmVhZF9pbmZvPUNsb25lSW1hZ2VJbmZvKGltYWdlX2luZm8pOwogICAqcmVhZF9pbmZvLT5tYWdpY2s9J1wwJzsKICAgaWYgKHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAwKQpAQCAtNzQwLDggKzc0MCw4IEBACiAgICAgICBjaGFyCiAgICAgICAgIHBhZ2VzW01heFRleHRFeHRlbnRdOwogCi0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VzLE1heFRleHRFeHRlbnQsIi1kRmlyc3RQYWdlPSVsdSAiCi0gICAgICAgICItZExhc3RQYWdlPSVsdSIsKHVuc2lnbmVkIGxvbmcpIHJlYWRfaW5mby0+c2NlbmUrMSwodW5zaWduZWQgbG9uZykKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZXMsTWF4VGV4dEV4dGVudCwiLWRGaXJzdFBhZ2U9JS4yMGcgIgorICAgICAgICAiLWRMYXN0UGFnZT0lLjIwZyIsKGRvdWJsZSkgcmVhZF9pbmZvLT5zY2VuZSsxLChkb3VibGUpCiAgICAgICAgIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgKHZvaWQpIENvbmNhdGVuYXRlTWFnaWNrU3RyaW5nKG9wdGlvbnMscGFnZXMsTWF4VGV4dEV4dGVudCk7CiAgICAgICByZWFkX2luZm8tPm51bWJlcl9zY2VuZXM9MDsKQEAgLTE0MjQsMTUgKzE0MjQsMTUgQEAKICAgICAgICAgcmVzb2x1dGlvbi55PShzaXplX3QpICgxMDAuMCoyLjU0KnJlc29sdXRpb24ueSswLjUpLzEwMC4wOwogICAgICAgfQogICAgIFNldEdlb21ldHJ5KGltYWdlLCZnZW9tZXRyeSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxpbWFnZV9pbmZvLT5wYWdlLE1heFRleHRFeHRlbnQpOwogICAgIGVsc2UKICAgICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgJiYgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGltYWdlLT5wYWdlLngsKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgZWxzZQogICAgICAgICBpZiAoKGltYWdlLT5ncmF2aXR5ICE9IFVuZGVmaW5lZEdyYXZpdHkpICYmCiAgICAgICAgICAgICAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBTIikgPT0gMCkpCkBAIC0xNDkwLDkgKzE0OTAsOCBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgIiUlJSVCb3VuZGluZ0JveDogJWxkICVsZCAlbGQgJWxkXG4iLChsb25nKSBjZWlsKGJvdW5kcy54MS0wLjUpLAotICAgICAgICAgICAgICAobG9uZykgY2VpbChib3VuZHMueTEtMC41KSwobG9uZykgZmxvb3IoYm91bmRzLngyKzAuNSksKGxvbmcpCi0gICAgICAgICAgICAgIGZsb29yKGJvdW5kcy55MiswLjUpKTsKKyAgICAgICAgICAgICAgIiUlJSVCb3VuZGluZ0JveDogJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcbiIsY2VpbChib3VuZHMueDEtMC41KSwKKyAgICAgICAgICAgICAgY2VpbChib3VuZHMueTEtMC41KSxmbG9vcihib3VuZHMueDIrMC41KSxmbG9vcihib3VuZHMueTIrMC41KSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgICAgICAgICAiJSUlJUhpUmVzQm91bmRpbmdCb3g6ICVnICVnICVnICVnXG4iLGJvdW5kcy54MSwKQEAgLTE1MDYsOCArMTUwNSw3IEBACiAgICAgICAgICAgICAgIEVtYmVkIFBob3Rvc2hvcCBwcm9maWxlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlJUJlZ2luUGhvdG9zaG9wOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBHZXRTdHJpbmdJbmZvTGVuZ3RoKAotICAgICAgICAgICAgICBwcm9maWxlKSk7CisgICAgICAgICAgICAgICIlJUJlZ2luUGhvdG9zaG9wOiAlLjIwZyIsKGRvdWJsZSkgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpOyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xNTI3LDcgKzE1MjUsNyBAQAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuJWJlZ2luX3htbF9jb2RlXG4iKTsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICAiXG4lJWJlZ2luX3htbF9wYWNrZXQ6ICVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAgICAgICJcbiUlYmVnaW5feG1sX3BhY2tldDogJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgICAgICAgICAgIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKTsgaSsrKQpAQCAtMTU0OSw5ICsxNTQ3LDkgQEAKICAgICAgICAgICAgICovCiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIlJU9yaWVudGF0aW9uOiBQb3J0cmFpdFxuIik7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIlJVBhZ2VPcmRlcjogQXNjZW5kXG4iKTsKLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlczogJWx1XG4iLAotICAgICAgICAgICAgICBpbWFnZV9pbmZvLT5hZGpvaW4gIT0gTWFnaWNrRmFsc2UgPyAoc2l6ZV90KQotICAgICAgICAgICAgICBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpIDogMVVMKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlczogJS4yMGdcbiIsCisgICAgICAgICAgICAgIGltYWdlX2luZm8tPmFkam9pbiAhPSBNYWdpY2tGYWxzZSA/IChkb3VibGUpCisgICAgICAgICAgICAgIEdldEltYWdlTGlzdExlbmd0aChpbWFnZSkgOiAxLjApOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFbmRDb21tZW50c1xuIik7CkBAIC0xNTgzLDEwICsxNTgxLDEwIEBACiAgICAgICAgICAgICAgIER1bXAgaW1hZ2UgYXMgYml0bWFwLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlJSUlQmVnaW5QcmV2aWV3OiAlbHUgJWx1ICVsdSAlbHVcbiUlICAiLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICBwcmV2aWV3X2ltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBwcmV2aWV3X2ltYWdlLT5yb3dzLDFVTCwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgoKChwcmV2aWV3X2ltYWdlLT5jb2x1bW5zKzcpID4+IDMpKgotICAgICAgICAgICAgICBwcmV2aWV3X2ltYWdlLT5yb3dzKzM1KS8zNikpOworICAgICAgICAgICAgICAiJSUlJUJlZ2luUHJldmlldzogJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcbiUlICAiLChkb3VibGUpCisgICAgICAgICAgICAgIHByZXZpZXdfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgcHJldmlld19pbWFnZS0+cm93cywxLjAsCisgICAgICAgICAgICAgIChkb3VibGUpICgoKChwcmV2aWV3X2ltYWdlLT5jb2x1bW5zKzcpID4+IDMpKnByZXZpZXdfaW1hZ2UtPnJvd3MrCisgICAgICAgICAgICAgIDM1KS8zNikpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQpAQCAtMTY2OCwxMiArMTY2NiwxMiBAQAogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ9IGJpbmQgZGVmXG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFbmRQcm9sb2dcbiIpOwogICAgICAgfQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlOiAgMSAlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgcGFnZSsrKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogIDEgJS4yMGdcbiIsCisgICAgICAoZG91YmxlKSAocGFnZSsrKSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAiJSUlJVBhZ2VCb3VuZGluZ0JveDogJWxkICVsZCAlbGQgJWxkXG4iLChsb25nKSBnZW9tZXRyeS54LChsb25nKQotICAgICAgZ2VvbWV0cnkueSxnZW9tZXRyeS54Kyhsb25nKSBnZW9tZXRyeS53aWR0aCxnZW9tZXRyeS55Kyhsb25nKQorICAgICAgIiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLChkb3VibGUpIGdlb21ldHJ5LngsCisgICAgICAoZG91YmxlKSBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsZ2VvbWV0cnkueSsoZG91YmxlKQogICAgICAgKGdlb21ldHJ5LmhlaWdodCt0ZXh0X3NpemUpKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKChkb3VibGUpIGdlb21ldHJ5LnggPCBib3VuZHMueDEpCkBAIC0xNjkzLDggKzE2OTEsOCBAQAogICAgIC8qCiAgICAgICBPdXRwdXQgaW1hZ2UgZGF0YS4KICAgICAqLwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCAlbGRcbiVnICVnXG4lZ1xuIiwKLSAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55LHNjYWxlLngsc2NhbGUueSxwb2ludHNpemUpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4lZyAlZ1xuJWdcbiIsCisgICAgICAoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5Lnksc2NhbGUueCxzY2FsZS55LHBvaW50c2l6ZSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGxhYmVscz0oY2hhciAqKikgTlVMTDsKICAgICB2YWx1ZT1HZXRJbWFnZVByb3BlcnR5KGltYWdlLCJsYWJlbCIpOwpAQCAtMTcyNyw4ICsxNzI1LDggQEAKICAgICAgICAgICAgICAgRHVtcCBpbWFnZSBhcyBncmF5c2NhbGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgIiVsdSAlbHVcbjFcbjFcbjFcbjhcbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAgICAgICAiJS4yMGcgJS4yMGdcbjFcbjFcbjFcbjhcbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgICAgICAgaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQpAQCAtMTc3Niw4ICsxNzc0LDggQEAKICAgICAgICAgICAgICAgRHVtcCBpbWFnZSBhcyBiaXRtYXAuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgIiVsdSAlbHVcbjFcbjFcbjFcbjFcbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAgICAgICAiJS4yMGcgJS4yMGdcbjFcbjFcbjFcbjFcbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgICAgICAgaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQpAQCAtMTg0Myw4ICsxODQxLDggQEAKICAgICAgICAgICAvKgogICAgICAgICAgICAgRHVtcCBEaXJlY3RDbGFzcyBpbWFnZS4KICAgICAgICAgICAqLwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbjBcbiVkXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuMFxuJWRcbiIsCisgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cywKICAgICAgICAgICAgIGltYWdlX2luZm8tPmNvbXByZXNzaW9uID09IFJMRUNvbXByZXNzaW9uID8gMSA6IDApOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICBzd2l0Y2ggKGltYWdlX2luZm8tPmNvbXByZXNzaW9uKQpAQCAtMTk2OCwxNSArMTk2NiwxNSBAQAogICAgICAgICAgIC8qCiAgICAgICAgICAgICBEdW1wIFBzZXVkb0NsYXNzIGltYWdlLgogICAgICAgICAgICovCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1ICVsdVxuJWRcbiVkXG4wXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywKLSAgICAgICAgICAgIGltYWdlLT5zdG9yYWdlX2NsYXNzID09IFBzZXVkb0NsYXNzID8gMSA6IDAsCisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICIlLjIwZyAlLjIwZ1xuJWRcbiVkXG4wXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgICBpbWFnZS0+cm93cyxpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBQc2V1ZG9DbGFzcyA/IDEgOiAwLAogICAgICAgICAgICAgaW1hZ2VfaW5mby0+Y29tcHJlc3Npb24gPT0gUkxFQ29tcHJlc3Npb24gPyAxIDogMCk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIC8qCiAgICAgICAgICAgICBEdW1wIG51bWJlciBvZiBjb2xvcnMgYW5kIGNvbG9ybWFwLgogICAgICAgICAgICovCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgICAgICBpbWFnZS0+Y29sb3JzKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgaW1hZ2UtPmNvbG9yczsgaSsrKQpAQCAtMjEwNiw5ICsyMTA0LDggQEAKICAgaWYgKHBhZ2UgPiAyKQogICAgIHsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgY2VpbChib3VuZHMueDEtMC41KSwKLSAgICAgICAgKGxvbmcpIGNlaWwoYm91bmRzLnkxLTAuNSksKGxvbmcpIGZsb29yKGJvdW5kcy54MiswLjUpLChsb25nKQotICAgICAgICBmbG9vcihib3VuZHMueTIrMC41KSk7CisgICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLGNlaWwoYm91bmRzLngxLTAuNSksCisgICAgICAgIGNlaWwoYm91bmRzLnkxLTAuNSksZmxvb3IoYm91bmRzLngyKzAuNSksZmxvb3IoYm91bmRzLnkyKzAuNSkpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgICAgIiUlJSVIaVJlc0JvdW5kaW5nQm94OiAlZyAlZyAlZyAlZ1xuIixib3VuZHMueDEsYm91bmRzLnkxLApkaWZmIC0tZ2l0IGEvY29kZXJzL3BzMi5jIGIvY29kZXJzL3BzMi5jCmluZGV4IGU3NWM1NDguLjgzMzUxZDAgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wczIuYworKysgYi9jb2RlcnMvcHMyLmMKQEAgLTUxNSwxNSArNTE1LDE1IEBACiAgICAgICAgIHJlc29sdXRpb24ueT0oc2l6ZV90KSAoMTAwLjAqMi41NCpyZXNvbHV0aW9uLnkrMC41KS8xMDAuMDsKICAgICAgIH0KICAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksaW1hZ2VfaW5mby0+cGFnZSxNYXhUZXh0RXh0ZW50KTsKICAgICBlbHNlCiAgICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCi0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgZWxzZQogICAgICAgICBpZiAoKGltYWdlLT5ncmF2aXR5ICE9IFVuZGVmaW5lZEdyYXZpdHkpICYmCiAgICAgICAgICAgICAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBTIikgPT0gMCkpCkBAIC01ODEsOSArNTgxLDggQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgY2VpbChib3VuZHMueDEtMC41KSwKLSAgICAgICAgICAgICAgKGxvbmcpIGNlaWwoYm91bmRzLnkxLTAuNSksKGxvbmcpIGZsb29yKGJvdW5kcy54MiswLjUpLChsb25nKQotICAgICAgICAgICAgICBmbG9vcihib3VuZHMueTIrMC41KSk7CisgICAgICAgICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLGNlaWwoYm91bmRzLngxLTAuNSksCisgICAgICAgICAgICAgIGNlaWwoYm91bmRzLnkxLTAuNSksZmxvb3IoYm91bmRzLngyKzAuNSksZmxvb3IoYm91bmRzLnkyKzAuNSkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgICAgICAgICAgIiUlJSVIaVJlc0JvdW5kaW5nQm94OiAlZyAlZyAlZyAlZ1xuIixib3VuZHMueDEsCkBAIC02MDQsOCArNjAzLDggQEAKICAgICAgICAgICAgIGlmIChpbWFnZV9pbmZvLT5hZGpvaW4gPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiJSVQYWdlczogMVxuIixNYXhUZXh0RXh0ZW50KTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSUlJVBhZ2VzOiAlbHVcbiIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIEdldEltYWdlTGlzdExlbmd0aChpbWFnZSkpOworICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgICAgICIlJSUlUGFnZXM6ICUuMjBnXG4iLChkb3VibGUpIEdldEltYWdlTGlzdExlbmd0aChpbWFnZSkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFbmRDb21tZW50c1xuIik7CkBAIC02NzIsMTIgKzY3MSwxMiBAQAogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ9IGJpbmQgZGVmXG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFbmRQcm9sb2dcbiIpOwogICAgICAgfQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlOiAgMSAlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgcGFnZSsrKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogIDEgJS4yMGdcbiIsCisgICAgICAoZG91YmxlKSBwYWdlKyspOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgIiUlJSVQYWdlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgZ2VvbWV0cnkueCwobG9uZykKLSAgICAgIGdlb21ldHJ5LnksIGdlb21ldHJ5LngrKGxvbmcpIGdlb21ldHJ5LndpZHRoLGdlb21ldHJ5LnkrKGxvbmcpCisgICAgICAiJSUlJVBhZ2VCb3VuZGluZ0JveDogJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcbiIsKGRvdWJsZSkgZ2VvbWV0cnkueCwKKyAgICAgIChkb3VibGUpIGdlb21ldHJ5LnksZ2VvbWV0cnkueCsoZG91YmxlKSBnZW9tZXRyeS53aWR0aCxnZW9tZXRyeS55Kyhkb3VibGUpCiAgICAgICAoZ2VvbWV0cnkuaGVpZ2h0K3RleHRfc2l6ZSkpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoKGRvdWJsZSkgZ2VvbWV0cnkueCA8IGJvdW5kcy54MSkKQEAgLTcwMyw4ICs3MDIsOCBAQAogICAgIC8qCiAgICAgICBPdXRwdXQgaW1hZ2UgZGF0YS4KICAgICAqLwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCAlbGRcbiVnICVnXG4lZ1xuIiwKLSAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55LHNjYWxlLngsc2NhbGUueSxwb2ludHNpemUpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4lZyAlZ1xuJWdcbiIsCisgICAgICAoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5Lnksc2NhbGUueCxzY2FsZS55LHBvaW50c2l6ZSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGxhYmVscz0oY2hhciAqKikgTlVMTDsKICAgICB2YWx1ZT1HZXRJbWFnZVByb3BlcnR5KGltYWdlLCJsYWJlbCIpOwpAQCAtNzI4LDggKzcyNyw4IEBACiAgICAgICAgICgoaW1hZ2VfaW5mby0+dHlwZSAhPSBUcnVlQ29sb3JUeXBlKSAmJgogICAgICAgICAgKElzR3JheUltYWdlKGltYWdlLCZpbWFnZS0+ZXhjZXB0aW9uKSAhPSBNYWdpY2tGYWxzZSkpKQogICAgICAgewotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgJWx1XG4xXG4lZFxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzLChpbnQpCisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4xXG4lZFxuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cywoaW50KQogICAgICAgICAgIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVkXG4iLApAQCAtODI2LDcgKzgyNSw4IEBACiAgICAgICAgICAgICAgICAgICBTY2FsZVF1YW50dW1Ub0NoYXIoUGl4ZWxJbnRlbnNpdHlUb1F1YW50dW0ocCkpKTsKICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJvZ3Jlc3M9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VUYWcsKE1hZ2lja09mZnNldFR5cGUpIHksaW1hZ2UtPnJvd3MpOworICAgICAgICAgICAgICBwcm9ncmVzcz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZVRhZywoTWFnaWNrT2Zmc2V0VHlwZSkKKyAgICAgICAgICAgICAgICB5LGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtODM5LDggKzgzOSw4IEBACiAgICAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IERpcmVjdENsYXNzKSB8fCAoaW1hZ2UtPmNvbG9ycyA+IDI1NikgfHwKICAgICAgICAgICAoY29tcHJlc3Npb24gPT0gSlBFR0NvbXByZXNzaW9uKSB8fCAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKSkKICAgICAgICAgewotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbjBcbiVkXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywoaW50KQorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4wXG4lZFxuIiwKKyAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzLChpbnQpCiAgICAgICAgICAgICAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWRcbiIsCkBAIC05NzksMTQgKzk3OSwxNCBAQAogICAgICAgICAgIC8qCiAgICAgICAgICAgICBEdW1wIG51bWJlciBvZiBjb2xvcnMgYW5kIGNvbG9ybWFwLgogICAgICAgICAgICovCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1ICVsdVxuMVxuJWRcbiIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzLChpbnQpCisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgJS4yMGdcbjFcbiVkXG4iLAorICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGludCkKICAgICAgICAgICAgIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlZFxuIiwKICAgICAgICAgICAgIChpbnQpIChjb21wcmVzc2lvbiA9PSBOb0NvbXByZXNzaW9uKSk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgICAgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGltYWdlLT5jb2xvcnM7IGkrKykKQEAgLTEwOTUsOSArMTA5NSw4IEBACiAgIGlmIChwYWdlID4gMSkKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIGNlaWwoYm91bmRzLngxLTAuNSksCi0gICAgICAgIChsb25nKSBjZWlsKGJvdW5kcy55MS0wLjUpLChsb25nKSBmbG9vcihib3VuZHMueDIrMC41KSwobG9uZykKLSAgICAgICAgZmxvb3IoYm91bmRzLnkyKzAuNSkpOworICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1xuIixjZWlsKGJvdW5kcy54MS0wLjUpLAorICAgICAgICBjZWlsKGJvdW5kcy55MS0wLjUpLGZsb29yKGJvdW5kcy54MiswLjUpLGZsb29yKGJvdW5kcy55MiswLjUpKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICAgICIlJSUlSGlSZXNCb3VuZGluZ0JveDogJWcgJWcgJWcgJWdcbiIsYm91bmRzLngxLGJvdW5kcy55MSwKZGlmZiAtLWdpdCBhL2NvZGVycy9wczMuYyBiL2NvZGVycy9wczMuYwppbmRleCBiZDcyMGY4Li5mMTUwOGJmIDEwMDY0NAotLS0gYS9jb2RlcnMvcHMzLmMKKysrIGIvY29kZXJzL3BzMy5jCkBAIC00NzgsMzcgKzQ3OCwzNyBAQAogICAgIGRlZmF1bHQ6CiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgImN1cnJlbnRmaWxlICVsdSAlbHUgIlBTM19Ob0NvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgImN1cnJlbnRmaWxlICUuMjBnICUuMjBnICJQUzNfTm9Db21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKKyAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRmF4Q29tcHJlc3Npb246CiAgICAgY2FzZSBHcm91cDRDb21wcmVzc2lvbjoKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiY3VycmVudGZpbGUgJWx1ICVsdSAiUFMzX0ZheENvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgImN1cnJlbnRmaWxlICUuMjBnICUuMjBnICJQUzNfRmF4Q29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgIHsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICJjdXJyZW50ZmlsZSAlbHUgJWx1ICJQUzNfTFpXQ29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAiY3VycmVudGZpbGUgJS4yMGcgJS4yMGcgIlBTM19MWldDb21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKKyAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgUkxFQ29tcHJlc3Npb246CiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgImN1cnJlbnRmaWxlICVsdSAlbHUgIlBTM19STEVDb21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICJjdXJyZW50ZmlsZSAlLjIwZyAlLjIwZyAiUFMzX1JMRUNvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBaaXBDb21wcmVzc2lvbjoKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiY3VycmVudGZpbGUgJWx1ICVsdSAiUFMzX1ppcENvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgImN1cnJlbnRmaWxlICUuMjBnICUuMjBnICJQUzNfWmlwQ29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpAQCAtOTM5LDE1ICs5MzksMTUgQEAKICAgICAgICAgcmVzb2x1dGlvbi55PShzaXplX3QpICgxMDAuMCoyLjU0KnJlc29sdXRpb24ueSswLjUpLzEwMC4wOwogICAgICAgfQogICAgIFNldEdlb21ldHJ5KGltYWdlLCZnZW9tZXRyeSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxpbWFnZV9pbmZvLT5wYWdlLE1heFRleHRFeHRlbnQpOwogICAgIGVsc2UKICAgICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgJiYgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGltYWdlLT5wYWdlLngsKGxvbmcpIGltYWdlLT5wYWdlLnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPnBhZ2UuaGVpZ2h0LChkb3VibGUpIGltYWdlLT5wYWdlLngsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICBlbHNlCiAgICAgICAgIGlmICgoaW1hZ2UtPmdyYXZpdHkgIT0gVW5kZWZpbmVkR3Jhdml0eSkgJiYKICAgICAgICAgICAgIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUFMiKSA9PSAwKSkKQEAgLTEwNDUsOCArMTA0NSw4IEBACiAgICAgICAgICAgICBpZiAoaW1hZ2VfaW5mby0+YWRqb2luID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIiUlUGFnZXM6IDFcbiIsTWF4VGV4dEV4dGVudCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlczogJWx1XG4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKKyAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgICAiJSUlJVBhZ2VzOiAlLjIwZ1xuIiwoZG91YmxlKSBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kQ29tbWVudHNcbiIpOwpAQCAtMTA4NiwxNiArMTA4NiwxNiBAQAogICAgICAgICB9CiAgICAgICAgICh2b2lkKVdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFbmRQcm9sb2dcbiIpOwogICAgICAgfQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlOiAxICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogMSAlLjIwZ1xuIiwKKyAgICAgIChkb3VibGUpIHBhZ2UpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAvKgogICAgICAgUGFnZSBib3VuZGluZyBib3guCiAgICAgKi8KICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgIiUlJSVQYWdlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgZ2VvbWV0cnkueCwobG9uZykKLSAgICAgICBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGxvbmcpIGdlb21ldHJ5LndpZHRoLGdlb21ldHJ5LnkrKGxvbmcpCi0gICAgICAgKGdlb21ldHJ5LmhlaWdodCt0ZXh0X3NpemUpKTsKKyAgICAgICIlJSUlUGFnZUJvdW5kaW5nQm94OiAlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1xuIiwoZG91YmxlKSBnZW9tZXRyeS54LAorICAgICAgIChkb3VibGUpIGdlb21ldHJ5LnksZ2VvbWV0cnkueCsoZG91YmxlKSBnZW9tZXRyeS53aWR0aCxnZW9tZXRyeS55KworICAgICAgIChkb3VibGUpIChnZW9tZXRyeS5oZWlnaHQrdGV4dF9zaXplKSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIC8qCiAgICAgICBQYWdlIHByb2Nlc3MgY29sb3JzIGlmIG5vdCBSR0IuCkBAIC0xMTY3LDggKzExNjcsOCBAQAogICAgIC8qCiAgICAgICBUcmFuc2xhdGUsIHNjYWxlLCBhbmQgZm9udCBwb2ludCBzaXplLgogICAgICovCi0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWxkICVsZFxuJWcgJWdcbiVnXG4iLAotICAgICAgKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5Lnksc2NhbGUueCxzY2FsZS55LHBvaW50c2l6ZSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgJS4yMGdcbiVnICVnXG4lZ1xuIiwKKyAgICAgIChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSxzY2FsZS54LHNjYWxlLnkscG9pbnRzaXplKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgLyoKICAgICAgIE91dHB1dCBsYWJlbHMuCkBAIC0xMjE1LDggKzEyMTUsOCBAQAogICAgIC8qCiAgICAgICBJbWFnZSBjb2x1bW5zLCByb3dzLCBhbmQgY29sb3Igc3BhY2UuCiAgICAgKi8KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgJWx1XG4lc1xuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgJS4yMGdcbiVzXG4iLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsCiAgICAgICBpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSA/IFBTM19DTVlLQ29sb3JzcGFjZSA6CiAgICAgICBQUzNfUkdCQ29sb3JzcGFjZSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwpAQCAtMTQ3MSw4ICsxNDcxLDggQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIE51bWJlciBvZiBjb2xvcnMgaW4gY29sb3IgbWFwLgogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2xvcnMpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2xvcnMpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgQ29sb3IgbWFwIC0gdW5jb21wcmVzc2VkLgpkaWZmIC0tZ2l0IGEvY29kZXJzL3BzZC5jIGIvY29kZXJzL3BzZC5jCmluZGV4IDgxNjc4MDIuLjcyMjcyMzggMTAwNjQ0Ci0tLSBhL2NvZGVycy9wc2QuYworKysgYi9jb2RlcnMvcHNkLmMKQEAgLTc3NCwxMCArNzc0LDEwIEBACiAgIHBzZF9pbmZvLm1vZGU9UmVhZEJsb2JNU0JTaG9ydChpbWFnZSk7CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiICBJbWFnZSBpcyAlbHUgeCAlbHUgd2l0aCBjaGFubmVscz0lbHUsIGRlcHRoPSVsdSwgbW9kZT0lcyIsCi0gICAgICAodW5zaWduZWQgbG9uZykgcHNkX2luZm8uY29sdW1ucywodW5zaWduZWQgbG9uZykgcHNkX2luZm8ucm93cywKLSAgICAgICh1bnNpZ25lZCBsb25nKSBwc2RfaW5mby5jaGFubmVscywodW5zaWduZWQgbG9uZykgcHNkX2luZm8uZGVwdGgsCi0gICAgICBNb2RlVG9TdHJpbmcoKFBTREltYWdlVHlwZSkgcHNkX2luZm8ubW9kZSkpOworICAgICAgIiAgSW1hZ2UgaXMgJS4yMGcgeCAlLjIwZyB3aXRoIGNoYW5uZWxzPSUuMjBnLCBkZXB0aD0lLjIwZywgbW9kZT0lcyIsCisgICAgICAoZG91YmxlKSBwc2RfaW5mby5jb2x1bW5zLChkb3VibGUpIHBzZF9pbmZvLnJvd3MsKGRvdWJsZSkKKyAgICAgIHBzZF9pbmZvLmNoYW5uZWxzLChkb3VibGUpIHBzZF9pbmZvLmRlcHRoLE1vZGVUb1N0cmluZygoUFNESW1hZ2VUeXBlKQorICAgICAgcHNkX2luZm8ubW9kZSkpOwogICAvKgogICAgIEluaXRpYWxpemUgaW1hZ2UuCiAgICovCkBAIC04NjMsNyArODYzLDcgQEAKICAgICAgICovCiAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICByZWFkaW5nIGltYWdlIHJlc291cmNlIGJsb2NrcyAtICVsdSBieXRlcyIsKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAgICAgIiAgcmVhZGluZyBpbWFnZSByZXNvdXJjZSBibG9ja3MgLSAlLjIwZyBieXRlcyIsKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgIGJsb2Nrcz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeSgoc2l6ZV90KSBsZW5ndGgsCiAgICAgICAgIHNpemVvZigqYmxvY2tzKSk7CiAgICAgICBpZiAoYmxvY2tzID09ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCkBAIC05MzYsNyArOTM2LDcgQEAKICAgICAgICAgICBudW1iZXJfbGF5ZXJzPShzaG9ydCkgUmVhZEJsb2JNU0JTaG9ydChpbWFnZSk7CiAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICBpbWFnZSBjb250YWlucyAlbGQgbGF5ZXJzIiwobG9uZykgbnVtYmVyX2xheWVycyk7CisgICAgICAgICAgICAgICIgIGltYWdlIGNvbnRhaW5zICUuMjBnIGxheWVycyIsKGRvdWJsZSkgbnVtYmVyX2xheWVycyk7CiAgICAgICAgICAgaWYgKG51bWJlcl9sYXllcnMgPCAwKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKgpAQCAtOTYzLDcgKzk2Myw3IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgIiAgcmVhZGluZyBsYXllciAjJWxkIiwobG9uZykgaSsxKTsKKyAgICAgICAgICAgICAgICAiICByZWFkaW5nIGxheWVyICMlLjIwZyIsKGRvdWJsZSkgaSsxKTsKICAgICAgICAgICAgIGxheWVyX2luZm9baV0ucGFnZS55PShzc2l6ZV90KSBSZWFkQmxvYk1TQkxvbmcoaW1hZ2UpOwogICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5wYWdlLng9KHNzaXplX3QpIFJlYWRCbG9iTVNCTG9uZyhpbWFnZSk7CiAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLnBhZ2UuaGVpZ2h0PShzaXplX3QpCkBAIC05NzksMTAgKzk3OSwxMCBAQAogICAgICAgICAgICAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihDb3JydXB0SW1hZ2VFcnJvciwiTWF4aW11bUNoYW5uZWxzRXhjZWVkZWQiKTsKICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICIgICAgb2Zmc2V0KCVsZCwlbGQpLCBzaXplKCVsZCwlbGQpLCBjaGFubmVscz0lbGQiLAotICAgICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLnBhZ2UueCwobG9uZykgbGF5ZXJfaW5mb1tpXS5wYWdlLnksCi0gICAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0ucGFnZS5oZWlnaHQsKGxvbmcpCi0gICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5wYWdlLndpZHRoLChsb25nKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAiICAgIG9mZnNldCglLjIwZywlLjIwZyksIHNpemUoJS4yMGcsJS4yMGcpLCBjaGFubmVscz0lLjIwZyIsCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5wYWdlLngsKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5wYWdlLnksCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5wYWdlLmhlaWdodCwoZG91YmxlKQorICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0ucGFnZS53aWR0aCwoZG91YmxlKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxzKTsKICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgKHNzaXplX3QpIGxheWVyX2luZm9baV0uY2hhbm5lbHM7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5jaGFubmVsX2luZm9bal0udHlwZT0oc2hvcnQpCkBAIC05OTEsOSArOTkxLDkgQEAKICAgICAgICAgICAgICAgICBHZXRQU0RTaXplKCZwc2RfaW5mbyxpbWFnZSk7CiAgICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAiICAgIGNoYW5uZWxbJWxkXTogdHlwZT0lbGQsIHNpemU9JWxkIiwobG9uZykgaiwKLSAgICAgICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxfaW5mb1tqXS50eXBlLAotICAgICAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0uY2hhbm5lbF9pbmZvW2pdLnNpemUpOworICAgICAgICAgICAgICAgICAgIiAgICBjaGFubmVsWyUuMjBnXTogdHlwZT0lLjIwZywgc2l6ZT0lLjIwZyIsKGRvdWJsZSkgaiwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0uY2hhbm5lbF9pbmZvW2pdLnR5cGUsCisgICAgICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxfaW5mb1tqXS5zaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvdW50PVJlYWRCbG9iKGltYWdlLDQsKHVuc2lnbmVkIGNoYXIgKikgdHlwZSk7CiAgICAgICAgICAgICBpZiAoKGNvdW50ID09IDApIHx8IChMb2NhbGVOQ29tcGFyZSh0eXBlLCI4QklNIiw0KSAhPSAwKSkKQEAgLTEwMTEsOCArMTAxMSw4IEBACiAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLnZpc2libGU9IShsYXllcl9pbmZvW2ldLmZsYWdzICYgMHgwMik7CiAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAiICAgYmxlbmQ9JS40cywgb3BhY2l0eT0lbHUsIGNsaXBwaW5nPSVzLCBmbGFncz0lZCwgdmlzaWJsZT0lcyIsCi0gICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5ibGVuZGtleSwobG9uZykgbGF5ZXJfaW5mb1tpXS5vcGFjaXR5LAorICAgICAgICAgICAgICAgICIgICBibGVuZD0lLjRzLCBvcGFjaXR5PSUuMjBnLCBjbGlwcGluZz0lcywgZmxhZ3M9JWQsIHZpc2libGU9JXMiLAorICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0uYmxlbmRrZXksKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5vcGFjaXR5LAogICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0uY2xpcHBpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiLGxheWVyX2luZm9baV0uZmxhZ3MsCiAgICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS52aXNpYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgICAgICAodm9pZCkgUmVhZEJsb2JCeXRlKGltYWdlKTsgIC8qIGZpbGxlciAqLwpAQCAtMTA0MSwxMCArMTA0MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0ubWFzay53aWR0aCs9NDI5NDk2NzI5NVVMOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGxheWVyIG1hc2s6IG9mZnNldCglbGQsJWxkKSwgc2l6ZSglbGQsJWxkKSwgbGVuZ3RoPSVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgbGF5ZXJfaW5mb1tpXS5tYXNrLngsKGxvbmcpIGxheWVyX2luZm9baV0ubWFzay55LAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0ubWFzay53aWR0aCwobG9uZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0ubWFzay5oZWlnaHQsKGxvbmcpIGxlbmd0aC0xNik7CisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbGF5ZXIgbWFzazogb2Zmc2V0KCUuMjBnLCUuMjBnKSwgc2l6ZSglLjIwZywlLjIwZyksIGxlbmd0aD0lLjIwZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLm1hc2sueCwoZG91YmxlKSBsYXllcl9pbmZvW2ldLm1hc2sueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0ubWFzay53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5tYXNrLmhlaWdodCwoZG91YmxlKSBsZW5ndGgtMTYpOwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGUgbGF5ZXIgbWFzayBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwNjAsNyArMTA2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbGF5ZXIgYmxlbmRpbmcgcmFuZ2VzOiBsZW5ndGg9JWxkIiwobG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBsYXllciBibGVuZGluZyByYW5nZXM6IGxlbmd0aD0lLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgV2UgcmVhZCBpdCwgYnV0IGRvbid0IHVzZSBpdC4uLgpAQCAtMTExMSw4ICsxMTExLDggQEAKICAgICAgICAgICAgICAgewogICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBhZGp1c3RtZW50IGxheWVyIGtleTogJS40cywgZGF0YSBsZW5ndGg9JWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGtleSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgYWRqdXN0bWVudCBsYXllciBrZXk6ICUuNHMsIGRhdGEgbGVuZ3RoPSUuMjBnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGtleSwgKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIGlmICggbGVuZ3RoICkgewpAQCAtMTEyOSw3ICsxMTI5LDcgQEAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIHVuc3VwcG9ydGVkIGRhdGE6IGxlbmd0aD0lbGQiLChsb25nKQorICAgICAgICAgICAgICAgICAgICAiICAgICAgdW5zdXBwb3J0ZWQgZGF0YTogbGVuZ3RoPSUuMjBnIiwoZG91YmxlKQogICAgICAgICAgICAgICAgICAgICAoc2l6ZS1jb21iaW5lZGxlbmd0aCkpOwogICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgKHNzaXplX3QpIChzaXplLWNvbWJpbmVkbGVuZ3RoKTsgaisrKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIFJlYWRCbG9iQnl0ZShpbWFnZSk7CkBAIC0xMTQ1LDcgKzExNDUsNyBAQAogICAgICAgICAgICAgICAgICAgbGF5ZXJfaW5mb1tqXS5pbWFnZT1EZXN0cm95SW1hZ2UobGF5ZXJfaW5mb1tqXS5pbWFnZSk7CiAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAiICBhbGxvY2F0aW9uIG9mIGltYWdlIGZvciBsYXllciAlbGQgZmFpbGVkIiwobG9uZykgaSk7CisgICAgICAgICAgICAgICAgICAgICIgIGFsbG9jYXRpb24gb2YgaW1hZ2UgZm9yIGxheWVyICUuMjBnIGZhaWxlZCIsKGRvdWJsZSkgaSk7CiAgICAgICAgICAgICAgICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLAogICAgICAgICAgICAgICAgICAgIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgICAgfQpAQCAtMTE2OSwxNCArMTE2OSwxNCBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgU2V0IHVwIHNvbWUgaGlkZGVuIGF0dHJpYnV0ZXMgZm9yIGZvbGtzIHRoYXQgbmVlZCB0aGVtLgogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlbGQiLAotICAgICAgICAgICAgICAobG9uZykgbGF5ZXJfaW5mb1tpXS5wYWdlLngpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiUuMjBnbGQiLAorICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLnBhZ2UueCk7CiAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VBcnRpZmFjdChsYXllcl9pbmZvW2ldLmltYWdlLCJwc2Q6bGF5ZXIueCIsbWVzc2FnZSk7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJWxkIiwKLSAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0ucGFnZS55KTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsCisgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0ucGFnZS55KTsKICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZUFydGlmYWN0KGxheWVyX2luZm9baV0uaW1hZ2UsInBzZDpsYXllci55IixtZXNzYWdlKTsKLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGF5ZXJfaW5mb1tpXS5vcGFjaXR5KTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsCisgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0ub3BhY2l0eSk7CiAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VBcnRpZmFjdChsYXllcl9pbmZvW2ldLmltYWdlLCJwc2Q6bGF5ZXIub3BhY2l0eSIsCiAgICAgICAgICAgICAgIG1lc3NhZ2UpOwogICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkobGF5ZXJfaW5mb1tpXS5pbWFnZSwibGFiZWwiLChjaGFyICopCkBAIC0xMTkyLDEyICsxMTkyLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgIHJlYWRpbmcgZGF0YSBmb3IgbGF5ZXIgJWxkIiwobG9uZykgaSk7CisgICAgICAgICAgICAgICIgIHJlYWRpbmcgZGF0YSBmb3IgbGF5ZXIgJS4yMGciLChkb3VibGUpIGkpOwogICAgICAgICAgICAgZm9yIChqPTA7IGogPCAoc3NpemVfdCkgbGF5ZXJfaW5mb1tpXS5jaGFubmVsczsgaisrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgICByZWFkaW5nIGRhdGEgZm9yIGNoYW5uZWwgJWxkIiwobG9uZykgaik7CisgICAgICAgICAgICAgICAgICAiICAgIHJlYWRpbmcgZGF0YSBmb3IgY2hhbm5lbCAlLjIwZyIsKGRvdWJsZSkgaik7CiAjaWYgICAgIDEKICAgICAgICAgICAgICAgaWYgKGxheWVyX2luZm9baV0uY2hhbm5lbF9pbmZvW2pdLnNpemUgPD0gKDIqbGF5ZXJfaW5mb1tpXS5pbWFnZS0+cm93cykpCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvY29kZXJzL3N2Zy5jIGIvY29kZXJzL3N2Zy5jCmluZGV4IDdlNTMzYWUuLjc4NGQ5N2MgMTAwNjQ0Ci0tLSBhL2NvZGVycy9zdmcuYworKysgYi9jb2RlcnMvc3ZnLmMKQEAgLTIxMTYsOCArMjExNiw4IEBACiAgICAgICAgICAgICBzdmdfaW5mby0+dmlld19ib3g9c3ZnX2luZm8tPmJvdW5kczsKICAgICAgICAgICBzdmdfaW5mby0+d2lkdGg9KHNpemVfdCkgZmxvb3Ioc3ZnX2luZm8tPmJvdW5kcy53aWR0aCswLjUpOwogICAgICAgICAgIHN2Z19pbmZvLT5oZWlnaHQ9KHNpemVfdCkgZmxvb3Ioc3ZnX2luZm8tPmJvdW5kcy5oZWlnaHQrMC41KTsKLSAgICAgICAgICBNVkdQcmludGYoc3ZnX2luZm8tPmZpbGUsInZpZXdib3ggMCAwICVsdSAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICBzdmdfaW5mby0+d2lkdGgsKHVuc2lnbmVkIGxvbmcpIHN2Z19pbmZvLT5oZWlnaHQpOworICAgICAgICAgIE1WR1ByaW50ZihzdmdfaW5mby0+ZmlsZSwidmlld2JveCAwIDAgJS4yMGcgJS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgICAgICAgIHN2Z19pbmZvLT53aWR0aCwoZG91YmxlKSBzdmdfaW5mby0+aGVpZ2h0KTsKICAgICAgICAgICBzeD0oZG91YmxlKSBzdmdfaW5mby0+d2lkdGgvc3ZnX2luZm8tPnZpZXdfYm94LndpZHRoOwogICAgICAgICAgIHN5PShkb3VibGUpIHN2Z19pbmZvLT5oZWlnaHQvc3ZnX2luZm8tPnZpZXdfYm94LmhlaWdodDsKICAgICAgICAgICBNVkdQcmludGYoc3ZnX2luZm8tPmZpbGUsImFmZmluZSAlZyAwIDAgJWcgMC4wIDAuMFxuIixzeCxzeSk7CkBAIC0yNDExLDcgKzI0MTEsNyBAQAogICAgIFJlY2VpdmluZyBzb21lIGNoYXJhY3RlcnMgZnJvbSB0aGUgcGFyc2VyLgogICAqLwogICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAiICBTQVguY2hhcmFjdGVycyglcywlbHUpIixjLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICIgIFNBWC5jaGFyYWN0ZXJzKCVzLCUuMjBnKSIsYywoZG91YmxlKSBsZW5ndGgpOwogICBzdmdfaW5mbz0oU1ZHSW5mbyAqKSBjb250ZXh0OwogICBpZiAoc3ZnX2luZm8tPnRleHQgIT0gKGNoYXIgKikgTlVMTCkKICAgICBzdmdfaW5mby0+dGV4dD0oY2hhciAqKSBSZXNpemVRdWFudHVtTWVtb3J5KHN2Z19pbmZvLT50ZXh0LApAQCAtMzMyMCw4ICszMzIwLDggQEAKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLAogICAgICAgIiAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZFwiPlxuIik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsCi0gICAgICAiPHN2ZyB3aWR0aD1cIiVsdVwiIGhlaWdodD1cIiVsdVwiPlxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgIjxzdmcgd2lkdGg9XCIlLjIwZ1wiIGhlaWdodD1cIiUuMjBnXCI+XG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsbWVzc2FnZSk7CiAgICAgR2V0TWFnaWNrUGl4ZWxQYWNrZXQoaW1hZ2UsJnBpeGVsKTsKICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQpAQCAtMzMzNiw4ICszMzM2LDggQEAKICAgICAgICAgKHZvaWQpIFF1ZXJ5TWFnaWNrQ29sb3JuYW1lKGltYWdlLCZwaXhlbCxTVkdDb21wbGlhbmNlLHR1cGxlLAogICAgICAgICAgICZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIiAgPGNpcmNsZSBjeD1cIiVsZFwiIGN5PVwiJWxkXCIgcj1cIjFcIiBmaWxsPVwiJXNcIi8+XG4iLChsb25nKSB4LAotICAgICAgICAgIChsb25nKSB5LHR1cGxlKTsKKyAgICAgICAgICAiICA8Y2lyY2xlIGN4PVwiJS4yMGdcIiBjeT1cIiUuMjBnXCIgcj1cIjFcIiBmaWxsPVwiJXNcIi8+XG4iLAorICAgICAgICAgIChkb3VibGUpIHgsKGRvdWJsZSkgeSx0dXBsZSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsbWVzc2FnZSk7CiAgICAgICAgIHArKzsKICAgICAgIH0KQEAgLTM0MzIsOCArMzQzMiw4IEBACiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsCiAgICAgIiAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZFwiPlxuIik7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LAotICAgICI8c3ZnIHdpZHRoPVwiJWx1XCIgaGVpZ2h0PVwiJWx1XCI+XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICI8c3ZnIHdpZHRoPVwiJS4yMGdcIiBoZWlnaHQ9XCIlLjIwZ1wiPlxuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgIGltYWdlLT5yb3dzKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxtZXNzYWdlKTsKICAgLyoKICAgICBBbGxvY2F0ZSBwcmltaXRpdmUgaW5mbyBtZW1vcnkuCmRpZmYgLS1naXQgYS9jb2RlcnMvdGlmZi5jIGIvY29kZXJzL3RpZmYuYwppbmRleCBkMDI5ODA2Li40OGY4YjhhIDEwMDY0NAotLS0gYS9jb2RlcnMvdGlmZi5jCisrKyBiL2NvZGVycy90aWZmLmMKQEAgLTkyNyw4ICs5MjcsOCBAQAogICAgIGltYWdlLT5yb3dzPShzaXplX3QpIGhlaWdodDsKICAgICBpbWFnZS0+ZGVwdGg9KHNpemVfdCkgYml0c19wZXJfc2FtcGxlOwogICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCi0gICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiSW1hZ2UgZGVwdGg6ICVsdSIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVwdGgpOworICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIkltYWdlIGRlcHRoOiAlLjIwZyIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgbHNiX2ZpcnN0PTE7CiAgICAgaW1hZ2UtPmVuZGlhbj1NU0JFbmRpYW47CiAgICAgaWYgKChpbnQpICgqKGNoYXIgKikgJmxzYl9maXJzdCkgIT0gMCkKZGlmZiAtLWdpdCBhL2NvZGVycy90dGYuYyBiL2NvZGVycy90dGYuYwppbmRleCBlM2U0ODliLi41NDk3OTVlIDEwMDY0NAotLS0gYS9jb2RlcnMvdHRmLmMKKysrIGIvY29kZXJzL3R0Zi5jCkBAIC0yNDksMTEgKzI0OSwxMSBAQAogICBkcmF3X2luZm89Q2xvbmVEcmF3SW5mbyhpbWFnZV9pbmZvLChEcmF3SW5mbyAqKSBOVUxMKTsKICAgZHJhd19pbmZvLT5mb250PUFjcXVpcmVTdHJpbmcoaW1hZ2UtPmZpbGVuYW1lKTsKICAgQ29uY2F0ZW5hdGVTdHJpbmcoJmRyYXdfaW5mby0+cHJpbWl0aXZlLCJwdXNoIGdyYXBoaWMtY29udGV4dFxuIik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB2aWV3Ym94IDAgMCAlbHUgJWx1XG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgdmlld2JveCAwIDAgJS4yMGcgJS4yMGdcbiIsCisgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICBDb25jYXRlbmF0ZVN0cmluZygmZHJhd19pbmZvLT5wcmltaXRpdmUsYnVmZmVyKTsKICAgQ29uY2F0ZW5hdGVTdHJpbmcoJmRyYXdfaW5mby0+cHJpbWl0aXZlLCIgZm9udC1zaXplIDE4XG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIHRleHQgMTAsJWxkICciLChsb25nKSB5KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIHRleHQgMTAsJS4yMGcgJyIsKGRvdWJsZSkgeSk7CiAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSxidWZmZXIpOwogICB0ZXh0PUVzY2FwZVN0cmluZyhUZXh0LCciJyk7CiAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSx0ZXh0KTsKQEAgLTI2NSwxMyArMjY1LDE0IEBACiAgIHsKICAgICB5Kz1pKzEyOwogICAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSwiIGZvbnQtc2l6ZSAxOFxuIik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIHRleHQgMTAsJWxkICclbGQnXG4iLAotICAgICAgKGxvbmcpIHksKGxvbmcpIGkpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDEwLCUuMjBnICclLjIwZydcbiIsCisgICAgICAoZG91YmxlKSB5LChkb3VibGUpIGkpOwogICAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiBmb250LXNpemUgJWxkXG4iLChsb25nKSBpKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgZm9udC1zaXplICUuMjBnXG4iLAorICAgICAgKGRvdWJsZSkgaSk7CiAgICAgQ29uY2F0ZW5hdGVTdHJpbmcoJmRyYXdfaW5mby0+cHJpbWl0aXZlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIHRleHQgNTAsJWxkICIKLSAgICAgICInVGhhdCB3aGljaCBkb2VzIG5vdCBkZXN0cm95IG1lLCBvbmx5IG1ha2VzIG1lIHN0cm9uZ2VyLidcbiIsKGxvbmcpIHkpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDUwLCUuMjBnICIKKyAgICAgICInVGhhdCB3aGljaCBkb2VzIG5vdCBkZXN0cm95IG1lLCBvbmx5IG1ha2VzIG1lIHN0cm9uZ2VyLidcbiIsKGRvdWJsZSkgeSk7CiAgICAgQ29uY2F0ZW5hdGVTdHJpbmcoJmRyYXdfaW5mby0+cHJpbWl0aXZlLGJ1ZmZlcik7CiAgICAgaWYgKGkgPj0gMjQpCiAgICAgICBpKz02OwpkaWZmIC0tZ2l0IGEvY29kZXJzL3R4dC5jIGIvY29kZXJzL3R4dC5jCmluZGV4IDZlYzFhNmUuLjY0NDhkYmMgMTAwNjQ0Ci0tLSBhL2NvZGVycy90eHQuYworKysgYi9jb2RlcnMvdHh0LmMKQEAgLTY1OSw4ICs2NTksOCBAQAogICAgIGlmIChpbWFnZS0+bWF0dGUgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcoY29sb3JzcGFjZSwiYSIsTWF4VGV4dEV4dGVudCk7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICIjIEltYWdlTWFnaWNrIHBpeGVsIGVudW1lcmF0aW9uOiAlbHUsJWx1LCVsdSwlc1xuIiwodW5zaWduZWQgbG9uZykKLSAgICAgIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywodW5zaWduZWQgbG9uZykKKyAgICAgICIjIEltYWdlTWFnaWNrIHBpeGVsIGVudW1lcmF0aW9uOiAlLjIwZywlLjIwZywlLjIwZywlc1xuIiwoZG91YmxlKQorICAgICAgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGRvdWJsZSkKICAgICAgIEdldFF1YW50dW1SYW5nZShpbWFnZS0+ZGVwdGgpLGNvbG9yc3BhY2UpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBHZXRNYWdpY2tQaXhlbFBhY2tldChpbWFnZSwmcGl4ZWwpOwpAQCAtNjcyLDggKzY3Miw4IEBACiAgICAgICBpbmRleGVzPUdldFZpcnR1YWxJbmRleFF1ZXVlKGltYWdlKTsKICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCwlbGQ6ICIsKGxvbmcpIHgsCi0gICAgICAgICAgKGxvbmcpIHkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZywlLjIwZzogIiwoZG91YmxlKQorICAgICAgICAgIHgsKGRvdWJsZSkgeSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgU2V0TWFnaWNrUGl4ZWxQYWNrZXQoaW1hZ2UscCxpbmRleGVzK3gsJnBpeGVsKTsKICAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcodHVwbGUsIigiLE1heFRleHRFeHRlbnQpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3ZpY2FyLmMgYi9jb2RlcnMvdmljYXIuYwppbmRleCBmZjk5MTY1Li41NGYxZGNkIDEwMDY0NAotLS0gYS9jb2RlcnMvdmljYXIuYworKysgYi9jb2RlcnMvdmljYXIuYwpAQCAtNDYyLDEwICs0NjIsMTAgQEAKICAgKi8KICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGhlYWRlciwnICcsTWF4VGV4dEV4dGVudCk7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoaGVhZGVyLE1heFRleHRFeHRlbnQsCi0gICAgIkxCTFNJWkU9JWx1IEZPUk1BVD0nQllURScgVFlQRT0nSU1BR0UnIEJVRlNJWkU9MjAwMDAgRElNPTIgRU9MPTAgIgotICAgICJSRUNTSVpFPSVsdSBPUkc9J0JTUScgTkw9JWx1IE5TPSVsdSBOQj0xIE4xPTAgTjI9MCBOMz0wIE40PTAgTkJCPTAgIgotICAgICJOTEI9MCBUQVNLPSdJbWFnZU1hZ2ljayciLCh1bnNpZ25lZCBsb25nKSBNYXhUZXh0RXh0ZW50LCh1bnNpZ25lZCBsb25nKQotICAgIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMpOworICAgICJMQkxTSVpFPSUuMjBnIEZPUk1BVD0nQllURScgVFlQRT0nSU1BR0UnIEJVRlNJWkU9MjAwMDAgRElNPTIgRU9MPTAgIgorICAgICJSRUNTSVpFPSUuMjBnIE9SRz0nQlNRJyBOTD0lLjIwZyBOUz0lLjIwZyBOQj0xIE4xPTAgTjI9MCBOMz0wIE40PTAgTkJCPTAgIgorICAgICJOTEI9MCBUQVNLPSdJbWFnZU1hZ2ljayciLChkb3VibGUpIE1heFRleHRFeHRlbnQsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsCisgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMpOwogICAodm9pZCkgV3JpdGVCbG9iKGltYWdlLE1heFRleHRFeHRlbnQsKHVuc2lnbmVkIGNoYXIgKikgaGVhZGVyKTsKICAgLyoKICAgICBXcml0ZSBWSUNBUiBwaXhlbHMuCmRpZmYgLS1naXQgYS9jb2RlcnMvdmlkLmMgYi9jb2RlcnMvdmlkLmMKaW5kZXggMjE1ZjA4ZS4uNmQ1OTQxMyAxMDA2NDQKLS0tIGEvY29kZXJzL3ZpZC5jCisrKyBiL2NvZGVycy92aWQuYwpAQCAtMTc0LDggKzE3NCw5IEBACiAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkobmV4dF9pbWFnZSwibGFiZWwiLGxhYmVsKTsKICAgICBsYWJlbD1EZXN0cm95U3RyaW5nKGxhYmVsKTsKICAgICBpZiAoaW1hZ2VfaW5mby0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCi0gICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiZ2VvbWV0cnk6ICVsdXglbHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgbmV4dF9pbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgbmV4dF9pbWFnZS0+cm93cyk7CisgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKKyAgICAgICAgImdlb21ldHJ5OiAlLjIwZ3glLjIwZyIsKGRvdWJsZSkgbmV4dF9pbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICBuZXh0X2ltYWdlLT5yb3dzKTsKICAgICBTZXRHZW9tZXRyeShuZXh0X2ltYWdlLCZnZW9tZXRyeSk7CiAgICAgKHZvaWQpIFBhcnNlTWV0YUdlb21ldHJ5KHJlYWRfaW5mby0+c2l6ZSwmZ2VvbWV0cnkueCwmZ2VvbWV0cnkueSwKICAgICAgICZnZW9tZXRyeS53aWR0aCwmZ2VvbWV0cnkuaGVpZ2h0KTsKQEAgLTE4OCw4ICsxODksOCBAQAogICAgICAgfQogICAgIGlmIChpbWFnZV9pbmZvLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAidGh1bWJuYWlsIGdlb21ldHJ5OiAlbHV4JWx1IiwodW5zaWduZWQgbG9uZykgbmV4dF9pbWFnZS0+Y29sdW1ucywKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG5leHRfaW1hZ2UtPnJvd3MpOworICAgICAgICAidGh1bWJuYWlsIGdlb21ldHJ5OiAlLjIwZ3glLjIwZyIsKGRvdWJsZSkgbmV4dF9pbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICBuZXh0X2ltYWdlLT5yb3dzKTsKICAgICBBcHBlbmRJbWFnZVRvTGlzdCgmaW1hZ2VzLG5leHRfaW1hZ2UpOwogICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlcyxMb2FkSW1hZ2VzVGFnLGksbnVtYmVyX2ZpbGVzKTsKICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQpkaWZmIC0tZ2l0IGEvY29kZXJzL3dwZy5jIGIvY29kZXJzL3dwZy5jCmluZGV4IGRkMWU1MTcuLmM5YjRhNjQgMTAwNjQ0Ci0tLSBhL2NvZGVycy93cGcuYworKysgYi9jb2RlcnMvd3BnLmMKQEAgLTU5Nyw4ICs1OTcsOCBAQAogICAgICAgICAgIGlmKHghPTApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuVW5zdXBwb3J0ZWQgV1BHMiB1bmFsaWduZWQgdG9rZW4gUlNUIHg9JWx1LCBwbGVhc2UgcmVwb3J0IVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsKHVuc2lnbmVkIGxvbmcpIHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5VbnN1cHBvcnRlZCBXUEcyIHVuYWxpZ25lZCB0b2tlbiBSU1QgeD0lLjIwZywgcGxlYXNlIHJlcG9ydCFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLChkb3VibGUpIHgpOwogICAgICAgICAgICAgICByZXR1cm4oLTMpOwogICAgICAgICAgICAgfQogICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2NvZGVycy94Ym0uYyBiL2NvZGVycy94Ym0uYwppbmRleCA0YWVmMWZjLi5lOTRmMmQ5IDEwMDY0NAotLS0gYS9jb2RlcnMveGJtLmMKKysrIGIvY29kZXJzL3hibS5jCkBAIC01MTYsMTEgKzUxNiwxMSBAQAogICAgIFdyaXRlIFggYml0bWFwIGhlYWRlci4KICAgKi8KICAgR2V0UGF0aENvbXBvbmVudChpbWFnZS0+ZmlsZW5hbWUsQmFzZVBhdGgsYmFzZW5hbWUpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIjZGVmaW5lICVzX3dpZHRoICVsdVxuIiwKLSAgICBiYXNlbmFtZSwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIjZGVmaW5lICVzX3dpZHRoICUuMjBnXG4iLAorICAgIGJhc2VuYW1lLChkb3VibGUpIGltYWdlLT5jb2x1bW5zKTsKICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSxzdHJsZW4oYnVmZmVyKSwodW5zaWduZWQgY2hhciAqKSBidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIjZGVmaW5lICVzX2hlaWdodCAlbHVcbiIsCi0gICAgYmFzZW5hbWUsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiI2RlZmluZSAlc19oZWlnaHQgJS4yMGdcbiIsCisgICAgYmFzZW5hbWUsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAodm9pZCkgV3JpdGVCbG9iKGltYWdlLHN0cmxlbihidWZmZXIpLCh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcik7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgInN0YXRpYyBjaGFyICVzX2JpdHNbXSA9IHtcbiIsYmFzZW5hbWUpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3hwbS5jIGIvY29kZXJzL3hwbS5jCmluZGV4IGEzYmMzODMuLjk0YTE2MDcgMTAwNjQ0Ci0tLSBhL2NvZGVycy94cG0uYworKysgYi9jb2RlcnMveHBtLmMKQEAgLTc0Miw5ICs3NDIsOSBAQAogICAgICJzdGF0aWMgY2hhciAqJXNbXSA9IHtcbiIsYmFzZW5hbWUpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi8qIGNvbHVtbnMgcm93cyBjb2xvcnMgY2hhcnMtcGVyLXBpeGVsICovXG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXCIlbHUgJWx1ICVsdSAlbHVcIixcbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHBpY29uLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBwaWNvbi0+cm93cywodW5zaWduZWQgbG9uZykKLSAgICBjb2xvcnMsKHVuc2lnbmVkIGxvbmcpIGNoYXJhY3RlcnNfcGVyX3BpeGVsKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAiXCIlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1wiLFxuIiwoZG91YmxlKSBwaWNvbi0+Y29sdW1ucywoZG91YmxlKQorICAgIHBpY29uLT5yb3dzLChkb3VibGUpIGNvbG9ycywoZG91YmxlKSBjaGFyYWN0ZXJzX3Blcl9waXhlbCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgR2V0TWFnaWNrUGl4ZWxQYWNrZXQoaW1hZ2UsJnBpeGVsKTsKICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgY29sb3JzOyBpKyspCkBAIC05NzUsOSArOTc1LDkgQEAKICAgICAic3RhdGljIGNoYXIgKiVzW10gPSB7XG4iLGJhc2VuYW1lKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqL1xuIik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwiJWx1ICVsdSAlbHUgJWx1XCIsXG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsKHVuc2lnbmVkIGxvbmcpCi0gICAgaW1hZ2UtPmNvbG9ycywodW5zaWduZWQgbG9uZykgY2hhcmFjdGVyc19wZXJfcGl4ZWwpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICJcIiUuMjBnICUuMjBnICUuMjBnICUuMjBnIFwiLFxuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgIGltYWdlLT5yb3dzLChkb3VibGUpIGltYWdlLT5jb2xvcnMsKGRvdWJsZSkgY2hhcmFjdGVyc19wZXJfcGl4ZWwpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgIEdldE1hZ2lja1BpeGVsUGFja2V0KGltYWdlLCZwaXhlbCk7CiAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGltYWdlLT5jb2xvcnM7IGkrKykKZGlmZiAtLWdpdCBhL2NvZGVycy94cHMuYyBiL2NvZGVycy94cHMuYwppbmRleCAzNDkzYjg2Li5lYWE2YzU3IDEwMDY0NAotLS0gYS9jb2RlcnMveHBzLmMKKysrIGIvY29kZXJzL3hwcy5jCkBAIC0yNjMsOCArMjYzLDggQEAKICAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KFBTUGFnZUdlb21ldHJ5LCZwYWdlKTsKICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KGltYWdlX2luZm8tPnBhZ2UsJnBhZ2UpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICh1bnNpZ25lZCBsb25nKSBwYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBwYWdlLmhlaWdodCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLChkb3VibGUpCisgICAgcGFnZS53aWR0aCwoZG91YmxlKSBwYWdlLmhlaWdodCk7CiAgIGlmIChpbWFnZV9pbmZvLT5tb25vY2hyb21lICE9IE1hZ2lja0ZhbHNlKQogICAgIGRlbGVnYXRlX2luZm89R2V0RGVsZWdhdGVJbmZvKCJ4cHM6bW9ubyIsKGNoYXIgKikgTlVMTCxleGNlcHRpb24pOwogICBlbHNlCkBAIC0yODIsMjAgKzI4MiwyMCBAQAogICBwYWdlLndpZHRoPShzaXplX3QpIGZsb29yKHBhZ2Uud2lkdGgqaW1hZ2UtPnlfcmVzb2x1dGlvbi9kZWx0YS54KzAuNSk7CiAgIHBhZ2UuaGVpZ2h0PShzaXplX3QpIGZsb29yKHBhZ2UuaGVpZ2h0KmltYWdlLT55X3Jlc29sdXRpb24vZGVsdGEueSsKICAgICAwLjUpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclbHV4JWx1ICIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpIHBhZ2UuaGVpZ2h0KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJS4yMGd4JS4yMGcgIiwoZG91YmxlKQorICAgIHBhZ2Uud2lkdGgsKGRvdWJsZSkgcGFnZS5oZWlnaHQpOwogICBpbWFnZT1EZXN0cm95SW1hZ2UoaW1hZ2UpOwogICByZWFkX2luZm89Q2xvbmVJbWFnZUluZm8oaW1hZ2VfaW5mbyk7CiAgICpyZWFkX2luZm8tPm1hZ2ljaz0nXDAnOwogICBpZiAocmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzICE9IDApCiAgICAgewogICAgICAgaWYgKHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAxKQotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWRMYXN0UGFnZT0lbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1kTGFzdFBhZ2U9JS4yMGciLAorICAgICAgICAgIChkb3VibGUpIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgZWxzZQogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiLWRGaXJzdFBhZ2U9JWx1IC1kTGFzdFBhZ2U9JWx1IiwodW5zaWduZWQgbG9uZykgcmVhZF9pbmZvLT5zY2VuZSsxLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKKyAgICAgICAgICAiLWRGaXJzdFBhZ2U9JS4yMGcgLWRMYXN0UGFnZT0lLjIwZyIsKGRvdWJsZSkgcmVhZF9pbmZvLT5zY2VuZSsxLAorICAgICAgICAgIChkb3VibGUpIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzPTA7CiAgICAgICBpZiAocmVhZF9pbmZvLT5zY2VuZXMgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICAgKnJlYWRfaW5mby0+c2NlbmVzPSdcMCc7Cg==