LyoKICogKEMpIENvcHlyaWdodCAyMDA4LTIwMTEKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgPGRhbmllbEBvbWljcm9uLnNlPgogKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgTGludXgga2VybmVsIHNvdXJjZQogKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgoKI2RlZmluZSBERUNMQVJFX0lOVEVSUlVQVCh4KSBcCgkiLmdsb2JsIGlycV8iI3giXG4iIFwKCSIuaGlkZGVuIGlycV8iI3giXG4iIFwKCSIudHlwZSBpcnFfIiN4IiwgQGZ1bmN0aW9uXG4iIFwKCSJpcnFfIiN4IjpcbiIgXAoJInB1c2hsICQiI3giXG4iIFwKCSJqbXAgaXJxX2NvbW1vbl9lbnRyeVxuIgoKLyoKICogVm9sYXRpbGUgaXNuJ3QgZW5vdWdoIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gcmVvcmRlcmluZyB0aGUKICogcmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgbWVzc2luZyBldmVyeXRoaW5nIHVwLgogKiBBIG1lbW9yeSBjbG9iYmVyIHdvdWxkIHNvbHZlIHRoZSBwcm9ibGVtLCBidXQgd291bGQgcHJldmVudCByZW9yZGVyaW5nIG9mCiAqIGFsbCBsb2FkcyBzdG9yZXMgYXJvdW5kIGl0LCB3aGljaCBjYW4gaHVydCBwZXJmb3JtYW5jZS4gU29sdXRpb24gaXMgdG8KICogdXNlIGEgdmFyaWFibGUgYW5kIG1pbWljIHJlYWRzIGFuZCB3cml0ZXMgdG8gaXQgdG8gZW5mb3JjZSBzZXJpYWxpc2F0aW9uCiAqLwpzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2ZvcmNlX29yZGVyOwoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfY3IwKHZvaWQpCnsKCXVuc2lnbmVkIGxvbmcgdmFsOwoJYXNtIHZvbGF0aWxlKCJtb3YgJSVjcjAsJTBcblx0IiA6ICI9ciIgKHZhbCksICI9bSIgKF9fZm9yY2Vfb3JkZXIpKTsKCXJldHVybiB2YWw7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyMih2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIHZhbDsKCWFzbSB2b2xhdGlsZSgibW92ICUlY3IyLCUwXG5cdCIgOiAiPXIiICh2YWwpLCAiPW0iIChfX2ZvcmNlX29yZGVyKSk7CglyZXR1cm4gdmFsOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9jcjModm9pZCkKewoJdW5zaWduZWQgbG9uZyB2YWw7Cglhc20gdm9sYXRpbGUoIm1vdiAlJWNyMywlMFxuXHQiIDogIj1yIiAodmFsKSwgIj1tIiAoX19mb3JjZV9vcmRlcikpOwoJcmV0dXJuIHZhbDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfY3I0KHZvaWQpCnsKCXVuc2lnbmVkIGxvbmcgdmFsOwoJYXNtIHZvbGF0aWxlKCJtb3YgJSVjcjQsJTBcblx0IiA6ICI9ciIgKHZhbCksICI9bSIgKF9fZm9yY2Vfb3JkZXIpKTsKCXJldHVybiB2YWw7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZGVidWdyZWcoaW50IHJlZ25vKQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CS8qIERhbW4geW91LCBnY2MhICovCgoJc3dpdGNoIChyZWdubykgewoJY2FzZSAwOgoJCWFzbSgibW92ICUlZGIwLCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWFzbSgibW92ICUlZGIxLCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJY2FzZSAyOgoJCWFzbSgibW92ICUlZGIyLCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJY2FzZSAzOgoJCWFzbSgibW92ICUlZGIzLCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJY2FzZSA2OgoJCWFzbSgibW92ICUlZGI2LCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJY2FzZSA3OgoJCWFzbSgibW92ICUlZGI3LCAlMCIgOiI9ciIgKHZhbCkpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQl2YWwgPSAwOwoJfQoJcmV0dXJuIHZhbDsKfQoKdm9pZCBkdW1wX3JlZ3Moc3RydWN0IGlycV9yZWdzICpyZWdzKQp7Cgl1bnNpZ25lZCBsb25nIGNyMCA9IDBMLCBjcjIgPSAwTCwgY3IzID0gMEwsIGNyNCA9IDBMOwoJdW5zaWduZWQgbG9uZyBkMCwgZDEsIGQyLCBkMywgZDYsIGQ3OwoJdW5zaWduZWQgbG9uZyBzcDsKCglwcmludGYoIkVJUDogJTA0eDpbPCUwOGx4Pl0gRUZMQUdTOiAlMDhseFxuIiwKCQkJKHUxNilyZWdzLT54Y3MsIHJlZ3MtPmVpcCwgcmVncy0+ZWZsYWdzKTsKCglwcmludGYoIkVBWDogJTA4bHggRUJYOiAlMDhseCBFQ1g6ICUwOGx4IEVEWDogJTA4bHhcbiIsCgkJcmVncy0+ZWF4LCByZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4KTsKCXByaW50ZigiRVNJOiAlMDhseCBFREk6ICUwOGx4IEVCUDogJTA4bHggRVNQOiAlMDhseFxuIiwKCQlyZWdzLT5lc2ksIHJlZ3MtPmVkaSwgcmVncy0+ZWJwLCByZWdzLT5lc3ApOwoJcHJpbnRmKCIgRFM6ICUwNHggRVM6ICUwNHggRlM6ICUwNHggR1M6ICUwNHggU1M6ICUwNHhcbiIsCgkgICAgICAgKHUxNilyZWdzLT54ZHMsICh1MTYpcmVncy0+eGVzLCAodTE2KXJlZ3MtPnhmcywgKHUxNilyZWdzLT54Z3MsICh1MTYpcmVncy0+eHNzKTsKCgljcjAgPSByZWFkX2NyMCgpOwoJY3IyID0gcmVhZF9jcjIoKTsKCWNyMyA9IHJlYWRfY3IzKCk7CgljcjQgPSByZWFkX2NyNCgpOwoKCXByaW50ZigiQ1IwOiAlMDhseCBDUjI6ICUwOGx4IENSMzogJTA4bHggQ1I0OiAlMDhseFxuIiwKCQkJY3IwLCBjcjIsIGNyMywgY3I0KTsKCglkMCA9IGdldF9kZWJ1Z3JlZygwKTsKCWQxID0gZ2V0X2RlYnVncmVnKDEpOwoJZDIgPSBnZXRfZGVidWdyZWcoMik7CglkMyA9IGdldF9kZWJ1Z3JlZygzKTsKCglwcmludGYoIkRSMDogJTA4bHggRFIxOiAlMDhseCBEUjI6ICUwOGx4IERSMzogJTA4bHhcbiIsCgkJCWQwLCBkMSwgZDIsIGQzKTsKCglkNiA9IGdldF9kZWJ1Z3JlZyg2KTsKCWQ3ID0gZ2V0X2RlYnVncmVnKDcpOwoJcHJpbnRmKCJEUjY6ICUwOGx4IERSNzogJTA4bHhcbiIsCgkJCWQ2LCBkNyk7CgoJcHJpbnRmKCJTdGFjazpcbiIpOwoJc3AgPSByZWdzLT5lc3A7CgoJc3AgKz0gNjQ7CgoJd2hpbGUgKHNwID4gKHJlZ3MtPmVzcCAtIDE2KSkgewoJCWlmIChzcCA9PSByZWdzLT5lc3ApCgkJCXByaW50ZigiLS0tPiIpOwoJCWVsc2UKCQkJcHJpbnRmKCIgICAgIik7CgkJcHJpbnRmKCIweCU4LjhseCA6IDB4JTguOGx4XG4iLCBzcCwgKHVsb25nKXJlYWRsKHNwKSk7CgkJc3AgLT0gNDsKCX0KfQoKc3RydWN0IGlkdF9lbnRyeSB7Cgl1MTYJYmFzZV9sb3c7Cgl1MTYJc2VsZWN0b3I7Cgl1OAlyZXM7Cgl1OAlhY2Nlc3M7Cgl1MTYJYmFzZV9oaWdoOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKCnN0cnVjdCBkZXNjX3B0ciB7Cgl1bnNpZ25lZCBzaG9ydCBzaXplOwoJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwoJdW5zaWduZWQgc2hvcnQgc2VnbWVudDsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCnN0cnVjdCBpZHRfZW50cnkgaWR0WzI1Nl07CgpzdHJ1Y3QgZGVzY19wdHIgaWR0X3B0cjsKCnN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2lkdChjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKmR0cikKewoJYXNtIHZvbGF0aWxlKCJjcyBsaWR0ICUwIjo6Im0iICgqZHRyKSk7Cn0KCnZvaWQgc2V0X3ZlY3Rvcih1OCBpbnRudW0sIHZvaWQgKnJvdXRpbmUpCnsKCWlkdFtpbnRudW1dLmJhc2VfaGlnaCA9ICh1MTYpKCh1MzIpKHJvdXRpbmUpID4+IDE2KTsKCWlkdFtpbnRudW1dLmJhc2VfbG93ID0gKHUxNikoKHUzMikocm91dGluZSkgJiAweGZmZmYpOwp9Cgp2b2lkIGlycV8wKHZvaWQpOwp2b2lkIGlycV8xKHZvaWQpOwoKaW50IGNwdV9pbml0X2ludGVycnVwdHModm9pZCkKewoJaW50IGk7CgoJaW50IGlycV9lbnRyeV9zaXplID0gaXJxXzEgLSBpcnFfMDsKCXZvaWQgKmlycV9lbnRyeSA9ICh2b2lkICopaXJxXzA7CgoJLyogSnVzdCBpbiBjYXNlLi4uICovCglkaXNhYmxlX2ludGVycnVwdHMoKTsKCgkvKiBTZXR1cCB0aGUgSURUICovCglmb3IgKGk9MDtpPDI1NjtpKyspIHsKCQlpZHRbaV0uYWNjZXNzID0gMHg4ZTsKCQlpZHRbaV0ucmVzID0gMDsKCQlpZHRbaV0uc2VsZWN0b3IgPSAweDEwOwoJCXNldF92ZWN0b3IoaSwgaXJxX2VudHJ5KTsKCQlpcnFfZW50cnkgKz0gaXJxX2VudHJ5X3NpemU7Cgl9CgoJaWR0X3B0ci5zaXplID0gMjU2ICogODsKCWlkdF9wdHIuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBpZHQ7CglpZHRfcHRyLnNlZ21lbnQgPSAweDE4OwoKCWxvYWRfaWR0KCZpZHRfcHRyKTsKCgkvKiBJdCBpcyBub3cgc2FmZSB0byBlbmFibGUgaW50ZXJydXB0cyAqLwoJZW5hYmxlX2ludGVycnVwdHMoKTsKCglyZXR1cm4gMDsKfQoKdm9pZCBfX2RvX2lycShpbnQgaXJxKQp7CglwcmludGYoIlVuaGFuZGxlZCBJUlEgOiAlZFxuIiwgaXJxKTsKfQp2b2lkIGRvX2lycShpbnQgaXJxKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19kb19pcnEiKSkpOwoKdm9pZCBlbmFibGVfaW50ZXJydXB0cyh2b2lkKQp7Cglhc20oInN0aVxuIik7Cn0KCmludCBkaXNhYmxlX2ludGVycnVwdHModm9pZCkKewoJbG9uZyBmbGFnczsKCglhc20gdm9sYXRpbGUgKCJwdXNoZmwgOyBwb3BsICUwIDsgY2xpXG4iIDogIj1nIiAoZmxhZ3MpIDogKTsKCglyZXR1cm4gZmxhZ3MgJiBYODZfRUZMQUdTX0lGOyAvKiBJRSBmbGFncyBpcyBiaXQgOSAqLwp9CgovKiBJUlEgTG93LUxldmVsIFNlcnZpY2UgUm91dGluZSAqLwp2b2lkIGlycV9sbHNyKHN0cnVjdCBpcnFfcmVncyAqcmVncykKewoJLyoKCSAqIEZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBlYWNoIGV4Y2VwdGlvbiwgcmVmZXIgdG86CgkgKiBJbnRlbK4gNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsCgkgKiBWb2x1bWUgMTogQmFzaWMgQXJjaGl0ZWN0dXJlCgkgKiBPcmRlciBOdW1iZXI6IDI1MzY2NS0wMjlVUywgTm92ZW1iZXIgMjAwOAoJICogVGFibGUgNi0xLiBFeGNlcHRpb25zIGFuZCBJbnRlcnJ1cHRzCgkgKi8KCXN3aXRjaCAocmVncy0+aXJxX2lkKSB7CgljYXNlIDB4MDA6CgkJcHJpbnRmKCJEaXZpZGUgRXJyb3IgKERpdmlzaW9uIGJ5IHplcm8pXG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJd2hpbGUoMSk7CgkJYnJlYWs7CgljYXNlIDB4MDE6CgkJcHJpbnRmKCJEZWJ1ZyBJbnRlcnJ1cHQgKFNpbmdsZSBzdGVwKVxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDAyOgoJCXByaW50ZigiTk1JIEludGVycnVwdFxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDAzOgoJCXByaW50ZigiQnJlYWtwb2ludFxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDA0OgoJCXByaW50ZigiT3ZlcmZsb3dcbiIpOwoJCWR1bXBfcmVncyhyZWdzKTsKCQl3aGlsZSgxKTsKCQlicmVhazsKCWNhc2UgMHgwNToKCQlwcmludGYoIkJPVU5EIFJhbmdlIEV4Y2VlZGVkXG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJd2hpbGUoMSk7CgkJYnJlYWs7CgljYXNlIDB4MDY6CgkJcHJpbnRmKCJJbnZhbGlkIE9wY29kZSAoVW5EZWZpbmVkIE9wY29kZSlcbiIpOwoJCWR1bXBfcmVncyhyZWdzKTsKCQl3aGlsZSgxKTsKCQlicmVhazsKCWNhc2UgMHgwNzoKCQlwcmludGYoIkRldmljZSBOb3QgQXZhaWxhYmxlIChObyBNYXRoIENvcHJvY2Vzc29yKVxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCXdoaWxlKDEpOwoJCWJyZWFrOwoJY2FzZSAweDA4OgoJCXByaW50ZigiRG91YmxlIGZhdWx0XG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJd2hpbGUoMSk7CgkJYnJlYWs7CgljYXNlIDB4MDk6CgkJcHJpbnRmKCJDby1wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuXG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJd2hpbGUoMSk7CgkJYnJlYWs7CgljYXNlIDB4MGE6CgkJcHJpbnRmKCJJbnZhbGlkIFRTU1xuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDBiOgoJCXByaW50ZigiU2VnbWVudCBOb3QgUHJlc2VudFxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCXdoaWxlKDEpOwoJCWJyZWFrOwoJY2FzZSAweDBjOgoJCXByaW50ZigiU3RhY2sgU2VnbWVudCBGYXVsdFxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCXdoaWxlKDEpOwoJCWJyZWFrOwoJY2FzZSAweDBkOgoJCXByaW50ZigiR2VuZXJhbCBQcm90ZWN0aW9uXG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJYnJlYWs7CgljYXNlIDB4MGU6CgkJcHJpbnRmKCJQYWdlIGZhdWx0XG4iKTsKCQlkdW1wX3JlZ3MocmVncyk7CgkJd2hpbGUoMSk7CgkJYnJlYWs7CgljYXNlIDB4MGY6CgkJcHJpbnRmKCJGbG9hdGluZy1Qb2ludCBFcnJvciAoTWF0aCBGYXVsdClcbiIpOwoJCWR1bXBfcmVncyhyZWdzKTsKCQlicmVhazsKCWNhc2UgMHgxMDoKCQlwcmludGYoIkFsaWdubWVudCBjaGVja1xuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDExOgoJCXByaW50ZigiTWFjaGluZSBDaGVja1xuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoJY2FzZSAweDEyOgoJCXByaW50ZigiU0lNRCBGbG9hdGluZy1Qb2ludCBFeGNlcHRpb25cbiIpOwoJCWR1bXBfcmVncyhyZWdzKTsKCQlicmVhazsKCWNhc2UgMHgxMzoKCWNhc2UgMHgxNDoKCWNhc2UgMHgxNToKCWNhc2UgMHgxNjoKCWNhc2UgMHgxNzoKCWNhc2UgMHgxODoKCWNhc2UgMHgxOToKCWNhc2UgMHgxYToKCWNhc2UgMHgxYjoKCWNhc2UgMHgxYzoKCWNhc2UgMHgxZDoKCWNhc2UgMHgxZToKCWNhc2UgMHgxZjoKCQlwcmludGYoIlJlc2VydmVkIEV4Y2VwdGlvblxuIik7CgkJZHVtcF9yZWdzKHJlZ3MpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJLyogSGFyZHdhcmUgb3IgVXNlciBJUlEgKi8KCQlkb19pcnEocmVncy0+aXJxX2lkKTsKCX0KfQoKLyoKICogT0sgLSBUaGlzIGxvb2tzIHJlYWxseSBob3JyaWJsZSwgYnV0IGl0IHNlcnZlcyBhIHB1cnBvc2UgLSBJdCBoZWxwcyBjcmVhdGUKICogZnVsbHkgcmVsb2NhdGFibGUgY29kZS4KICogIC0gVGhlIGNhbGwgdG8gaXJxX2xsc3Igd2lsbCBiZSBhIHJlbGF0aXZlIGp1bXAKICogIC0gVGhlIElSUSBlbnRyaWVzIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBpbiBvcmRlcgogKiAgSW50ZXJydXB0IGVudHJpZXMgYXJlIG5vdyB2ZXJ5IHNtYWxsIChhIHB1c2ggYW5kIGEganVtcCkgYnV0IHRoZXkgYXJlCiAqICBub3cgc2xvd2VyIChhbGwgcmVnaXN0ZXJzIHB1c2hlZCBvbiBzdGFjayB3aGljaCBwcm92aWRlcyBjb21wbGV0ZQogKiAgY3Jhc2ggZHVtcHMgaW4gdGhlIGxvdyBsZXZlbCBoYW5kbGVycwogKgogKiBJbnRlcnJ1cHQgRW50cnkgUG9pbnQ6CiAqICAtIEludGVycnVwdCBoYXMgY2F1c2VkIGVmbGFncywgQ1MgYW5kIEVJUCB0byBiZSBwdXNoZWQKICogIC0gSW50ZXJydXB0IFZlY3RvciBIYW5kbGVyIGhhcyBwdXNoZWQgb3JpZ19lYXgKICogIC0gcHRfcmVncy5lc3AgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgNDAgYnl0ZXM6CiAqICAgICAgMTIgYnl0ZXMgcHVzaGVkIGJ5IENQVSAoRUZMQUdTRiwgQ1MsIEVJUCkKICogICAgICA0IGJ5dGVzIHB1c2hlZCBieSB2ZWN0b3IgaGFuZGxlciAoaXJxX2lkKQogKiAgICAgIDI0IGJ5dGVzIHB1c2hlZCBiZWZvcmUgU1AgKFNTLCBHUywgRlMsIEVTLCBEUywgRUFYKQogKiAgICAgIE5PVEU6IE9ubHkgbG9uZ3MgYXJlIHB1c2hlZCBvbi9wb3BwZWQgb2ZmIHRoZSBzdGFjayEKICovCmFzbSgiLmdsb2JsIGlycV9jb21tb25fZW50cnlcbiIgXAoJIi5oaWRkZW4gaXJxX2NvbW1vbl9lbnRyeVxuIiBcCgkiLnR5cGUgaXJxX2NvbW1vbl9lbnRyeSwgQGZ1bmN0aW9uXG4iIFwKCSJpcnFfY29tbW9uX2VudHJ5OlxuIiBcCgkiY2xkXG4iIFwKCSJwdXNobCAlc3NcbiIgXAoJInB1c2hsICVnc1xuIiBcCgkicHVzaGwgJWZzXG4iIFwKCSJwdXNobCAlZXNcbiIgXAoJInB1c2hsICVkc1xuIiBcCgkicHVzaGwgJWVheFxuIiBcCgkibW92bCAgJWVzcCwgJWVheFxuIiBcCgkiYWRkbCAgJDQwLCAlZWF4XG4iIFwKCSJwdXNobCAlZWF4XG4iIFwKCSJwdXNobCAlZWJwXG4iIFwKCSJwdXNobCAlZWRpXG4iIFwKCSJwdXNobCAlZXNpXG4iIFwKCSJwdXNobCAlZWR4XG4iIFwKCSJwdXNobCAlZWN4XG4iIFwKCSJwdXNobCAlZWJ4XG4iIFwKCSJtb3YgICAlZXNwLCAlZWF4XG4iIFwKCSJjYWxsIGlycV9sbHNyXG4iIFwKCSJwb3BsICVlYnhcbiIgXAoJInBvcGwgJWVjeFxuIiBcCgkicG9wbCAlZWR4XG4iIFwKCSJwb3BsICVlc2lcbiIgXAoJInBvcGwgJWVkaVxuIiBcCgkicG9wbCAlZWJwXG4iIFwKCSJwb3BsICVlYXhcbiIgXAoJInBvcGwgJWVheFxuIiBcCgkicG9wbCAlZHNcbiIgXAoJInBvcGwgJWVzXG4iIFwKCSJwb3BsICVmc1xuIiBcCgkicG9wbCAlZ3NcbiIgXAoJInBvcGwgJXNzXG4iIFwKCSJhZGQgICQ0LCAlZXNwXG4iIFwKCSJpcmV0XG4iIFwKCURFQ0xBUkVfSU5URVJSVVBUKDApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEzKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyOSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMzApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDMxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgzMikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMzMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDM0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgzNSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMzYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDM3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgzOCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMzkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDQwKSBcCglERUNMQVJFX0lOVEVSUlVQVCg0MSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNDIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDQzKSBcCglERUNMQVJFX0lOVEVSUlVQVCg0NCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNDUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDQ2KSBcCglERUNMQVJFX0lOVEVSUlVQVCg0NykgXAoJREVDTEFSRV9JTlRFUlJVUFQoNDgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDQ5KSBcCglERUNMQVJFX0lOVEVSUlVQVCg1MCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNTEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDUyKSBcCglERUNMQVJFX0lOVEVSUlVQVCg1MykgXAoJREVDTEFSRV9JTlRFUlJVUFQoNTQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDU1KSBcCglERUNMQVJFX0lOVEVSUlVQVCg1NikgXAoJREVDTEFSRV9JTlRFUlJVUFQoNTcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDU4KSBcCglERUNMQVJFX0lOVEVSUlVQVCg1OSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNjApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDYxKSBcCglERUNMQVJFX0lOVEVSUlVQVCg2MikgXAoJREVDTEFSRV9JTlRFUlJVUFQoNjMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDY0KSBcCglERUNMQVJFX0lOVEVSUlVQVCg2NSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNjYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDY3KSBcCglERUNMQVJFX0lOVEVSUlVQVCg2OCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNjkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDcwKSBcCglERUNMQVJFX0lOVEVSUlVQVCg3MSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNzIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDczKSBcCglERUNMQVJFX0lOVEVSUlVQVCg3NCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoNzUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDc2KSBcCglERUNMQVJFX0lOVEVSUlVQVCg3NykgXAoJREVDTEFSRV9JTlRFUlJVUFQoNzgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDc5KSBcCglERUNMQVJFX0lOVEVSUlVQVCg4MCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoODEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDgyKSBcCglERUNMQVJFX0lOVEVSUlVQVCg4MykgXAoJREVDTEFSRV9JTlRFUlJVUFQoODQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDg1KSBcCglERUNMQVJFX0lOVEVSUlVQVCg4NikgXAoJREVDTEFSRV9JTlRFUlJVUFQoODcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDg4KSBcCglERUNMQVJFX0lOVEVSUlVQVCg4OSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoOTApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDkxKSBcCglERUNMQVJFX0lOVEVSUlVQVCg5MikgXAoJREVDTEFSRV9JTlRFUlJVUFQoOTMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDk0KSBcCglERUNMQVJFX0lOVEVSUlVQVCg5NSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoOTcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDk2KSBcCglERUNMQVJFX0lOVEVSUlVQVCg5OCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoOTkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEwMCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTAxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMDIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEwMykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTA0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMDUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEwNikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTA3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMDgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEwOSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTEwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMTEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDExMikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTEzKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMTQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDExNSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTE2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMTcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDExOCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTE5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMjApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEyMSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTIyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMjMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEyNCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTI1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMjYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEyNykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTI4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMjkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEzMCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTMxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMzIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEzMykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTM0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMzUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEzNikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTM3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxMzgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDEzOSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTQwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNDEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE0MikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTQzKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNDQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE0NSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTQ2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNDcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE0OCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTQ5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNTApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE1MSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTUyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNTMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE1NCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTU1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNTYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE1NykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTU4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNTkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE2MCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTYxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNjIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE2MykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTY0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNjUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE2NikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTY3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNjgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE2OSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTcwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNzEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE3MikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTczKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNzQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE3NSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTc2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxNzcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE3OCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTc5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxODApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE4MSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTgyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxODMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE4NCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTg1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxODYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE4NykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTg4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxODkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE5MCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTkxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgxOTIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE5MykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTk0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxOTUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE5NikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMTk3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgxOTgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDE5OSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjAwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMDEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIwMikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjAzKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMDQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIwNSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjA2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMDcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIwOCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjA5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMTApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIxMSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjEyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMTMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIxNCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjE1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMTYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIxNykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjE4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMTkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIyMCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjIxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMjIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIyMykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjI0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMjUpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIyNikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjI3KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMjgpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIyOSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjMwKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMzEpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIzMikgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjMzKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMzQpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIzNSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjM2KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyMzcpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDIzOCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjM5KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNDApIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI0MSkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjQyKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNDMpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI0NCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjQ1KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNDYpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI0NykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjQ4KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNDkpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI1MCkgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjUxKSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNTIpIFwKCURFQ0xBUkVfSU5URVJSVVBUKDI1MykgXAoJREVDTEFSRV9JTlRFUlJVUFQoMjU0KSBcCglERUNMQVJFX0lOVEVSUlVQVCgyNTUpKTsK