LyoKICogVGhpcyB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSBMdWJib2NrIHUtYm9vdCBwb3J0LgogKgogKiBNb3N0IG9mIHRoaXMgdGFrZW4gZnJvbSBSZWRib290IGhhbF9wbGF0Zm9ybV9zZXR1cC5oIHdpdGggY2xlYW51cAogKgogKiBOT1RFOiBJIGhhdmVuJ3QgY2xlYW4gdGhpcyB1cCBjb25zaWRlcmFibHksIGp1c3QgZW5vdWdoIHRvIGdldCBpdAogKiBydW5uaW5nLiBTZWUgaGFsX3BsYXRmb3JtX3NldHVwLmggZm9yIHRoZSBzb3VyY2UuIFNlZQogKiBib2FyZC9jcmFkbGUvbG93bGV2ZWxfaW5pdC5TIGZvciBhbm90aGVyIFBYQTI1MCBzZXR1cCB0aGF0IGlzCiAqIG11Y2ggY2xlYW5lci4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDx2ZXJzaW9uLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KICAgLm1hY3JvIENQV0FJVCByZWcKICAgbXJjCXAxNSwwLFxyZWcsYzIsYzAsMAogICBtb3YJXHJlZyxccmVnCiAgIHN1YglwYyxwYywjNAogICAuZW5kbQoKCi8qCiAqCU1lbW9yeSBzZXR1cAogKi8KCi5nbG9ibCBsb3dsZXZlbF9pbml0Cmxvd2xldmVsX2luaXQ6CgoJLyogU2V0IHVwIEdQSU8gcGlucyBmaXJzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCWxkcgkJcjAsCT1HUFNSMAoJbGRyCQlyMSwJPUNGR19HUFNSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMQoJbGRyCQlyMSwJPUNGR19HUFNSMV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMgoJbGRyCQlyMSwJPUNGR19HUFNSMl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMwoJbGRyCQlyMSwJPUNGR19HUFNSM19WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMAoJbGRyCQlyMSwJPUNGR19HUENSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMQoJbGRyCQlyMSwJPUNGR19HUENSMV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMgoJbGRyCQlyMSwJPUNGR19HUENSMl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMwoJbGRyCQlyMSwJPUNGR19HUENSM19WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMAoJbGRyCQlyMSwJPUNGR19HUERSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMQoJbGRyCQlyMSwJPUNGR19HUERSMV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMgoJbGRyCQlyMSwJPUNGR19HUERSMl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMwoJbGRyCQlyMSwJPUNGR19HUERSM19WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMF9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIwX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfVQoJbGRyCQlyMSwJPUNGR19HQUZSMF9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjFfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIxX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfTAoJbGRyCQlyMSwJPUNGR19HQUZSMl9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIyX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjJfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSM19MCglsZHIJCXIxLAk9Q0ZHX0dBRlIzX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjNfVQoJbGRyCQlyMSwJPUNGR19HQUZSM19VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPVBTU1IJCS8qIGVuYWJsZSBHUElPIHBpbnMgKi8KCWxkcgkJcjEsCT1DRkdfUFNTUl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlCQkJCQkgICAgKi8KCS8qCQkJCQkJCQkgICAgKi8KCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcwkgICAgKi8KCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KCS8qIENoYXB0ZXIgMTAuCQkJCQkJCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRlcm5hbAkgICAgKi8KCS8qCSAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4JICAgICovCgkvKgkgICBGSVhNRTogY2FuIGJlIG9wdGltaXplZCBsYXRlcgkJCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJc3RyIHIyLCBbcjNdCglsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eQkgICAgKi8KMToKCWxkciByMiwgW3IzXQoJY21wIHI0LCByMgoJYmd0IDFiCgptZW1faW5pdDoKCglsZHIJcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlcgkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUJCQkgICAgKi8KCgkvKiBNU0MwOiBuQ1MoMCwxKQkJCQkJCSAgICAqLwoJbGRyCXIyLCAgID1DRkdfTVNDMF9WQUwKCXN0cglyMiwgICBbcjEsICNNU0MwX09GRlNFVF0KCWxkcglyMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBiYWNrIHRvIGVuc3VyZQkgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMJICAgICovCgkvKiBNU0MxOiBuQ1MoMiwzKQkJCQkJCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NU0MxX1ZBTAoJc3RyCXIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdCglsZHIJcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCgkvKiBNU0MyOiBuQ1MoNCw1KQkJCQkJCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NU0MyX1ZBTAoJc3RyCXIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCglsZHIJcjIsICBbcjEsICNNU0MyX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJiOiBJbml0aWFsaXplIENhcmQgSW50ZXJmYWNlCQkJCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlcgkJCQkgICAgKi8KCWxkcglyMiwgID1DRkdfTUVDUl9WQUwKCXN0cglyMiwgIFtyMSwgI01FQ1JfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNRUNSX09GRlNFVF0KCgkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcJCQkJICAgICovCglsZHIJcjIsICA9Q0ZHX01DTUVNMF9WQUwKCXN0cglyMiwgIFtyMSwgI01DTUVNMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DTUVNMF9PRkZTRVRdCgoJLyogTUNNRU0xOiBDYXJkIEludGVyZmFjZSBzbG90IDEgdGltaW5nCQkJCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NQ01FTTFfVkFMCglzdHIJcjIsICBbcjEsICNNQ01FTTFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTFfT0ZGU0VUXQoKCS8qIE1DQVRUMDogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAwCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NQ0FUVDBfVkFMCglzdHIJcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NQ0FUVDFfVkFMCglzdHIJcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAJCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NQ0lPMF9WQUwKCXN0cglyMiwgIFtyMSwgI01DSU8wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzBfT0ZGU0VUXQoKCS8qIE1DSU8xOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDEJCSAgICAqLwoJbGRyCXIyLCAgPUNGR19NQ0lPMV9WQUwKCXN0cglyMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PwkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglsZHIJcjIsICA9Q0ZHX0ZMWUNORkdfVkFMCglzdHIJcjIsICBbcjEsICNGTFlDTkZHX09GRlNFVF0KCXN0cglyMiwJW3IxLCAjRkxZQ05GR19PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApCQkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBCZWZvcmUgYWNjZXNzaW5nIE1EUkVGUiB3ZSBuZWVkIGEgdmFsaWQgRFJJIGZpZWxkLCBzbyB3ZSBzZXQJICAgICovCgkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRFJJIGZpZWxkLgkJCSAgICAqLwoKCWxkcglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KCWxkcglyMiwJPTB4RkZGCgliaWMJcjQsCXI0LCByMgoKCWxkcglyMywJPUNGR19NRFJFRlJfVkFMCglhbmQJcjMsCXIzLCAgcjIKCglvcnIJcjQsCXI0LCByMwoJc3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUgkgICAgKi8KCglvcnIJcjQsICByNCwgI01EUkVGUl9LMFJVTgoJb3JyCXI0LCAgcjQsICNNRFJFRlJfSzBEQjQKCW9ycglyNCwgIHI0LCAjTURSRUZSX0swRlJFRQoJb3JyCXI0LCAgcjQsICNNRFJFRlJfSzBEQjIKCW9ycglyNCwgIHI0LCAjTURSRUZSX0sxREIyCgliaWMJcjQsICByNCwgI01EUkVGUl9LMUZSRUUKCWJpYwlyNCwgIHI0LCAjTURSRUZSX0syRlJFRQoKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIJICAgICovCglsZHIJcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCS8qIE5vdGU6IHByZXNlcnZlIHRoZSBtZHJlZnIgdmFsdWUgaW4gcjQJCQkgICAgKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAzOiBJbml0aWFsaXplIFN5bmNocm9ub3VzIFN0YXRpYyBNZW1vcnkgKEZsYXNoL1BlcmlwaGVyYWxzKSAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIEluaXRpYWxpemUgU1hDTkZHIHJlZ2lzdGVyLiBBc3NlcnQgdGhlIGVuYWJsZSBiaXRzCQkgICAgKi8KCgkvKiBXcml0ZSBTWE1SUyB0byBjYXVzZSBhbiBNUlMgY29tbWFuZCB0byBhbGwgZW5hYmxlZCBiYW5rcyBvZgkgICAgKi8KCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5vdGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8KCS8qIGF0IHRoaXMgdGltZS4JCQkJCQkgICAgKi8KCglsZHIJcjIsICA9Q0ZHX1NYQ05GR19WQUwKCXN0cglyMiwgIFtyMSwgI1NYQ05GR19PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNCQkJCQkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgliaWMJcjQsIHI0LCAjKE1EUkVGUl9LMkZSRUUgfE1EUkVGUl9LMUZSRUUgfCBNRFJFRlJfSzBGUkVFKQoKCW9ycglyNCwgcjQsICNNRFJFRlJfSzFSVU4KCWJpYwlyNCwgcjQsICNNRFJFRlJfSzJEQjIKCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCWxkcglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCgliaWMJcjQsIHI0LCAjTURSRUZSX1NMRlJTSAoJc3RyCXI0LCBbcjEsICNNRFJFRlJfT0ZGU0VUXQoJbGRyCXI0LCBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCW9ycglyNCwgcjQsICNNRFJFRlJfRTFQSU4KCXN0cglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCWxkcglyNCwgW3IxLCAjTURSRUZSX09GRlNFVF0KCglub3AKCW5vcAoKCgkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCgkvKgkgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuCSAgICAqLwoKCWxkcglyNCwJPUNGR19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCWJpYwlyNCwJcjQsCSMoTURDTkZHX0RFMnxNRENORkdfREUzKQoKCXN0cglyNCwJW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcJICAgICovCglsZHIJcjQsCVtyMSwgI01EQ05GR19PRkZTRVRdCgoKCS8qIFN0ZXAgNGU6IFdhaXQgZm9yIHRoZSBjbG9jayB0byB0aGUgU0RSQU1zIHRvIHN0YWJpbGl6ZSwJICAgICovCgkvKgkgICAgMTAwLi4yMDAgtXNlYy4JCQkJCSAgICAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJc3RyIHIyLCBbcjNdCglsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eQkgICAgKi8KMToKCSAgICBsZHIgcjIsIFtyM10KCSAgICBjbXAgcjQsIHIyCgkgICAgYmd0IDFiCgoKCS8qIFN0ZXAgNGY6IFRyaWdnZXIgYSBudW1iZXIgKHVzdWFsbHkgOCkgcmVmcmVzaCBjeWNsZXMgYnkJICAgICovCgkvKgkgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLwoJLyoJICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KCS8qCSAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKgkgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuCQkgICAgKi8KCglsZHIJcjMsCT1DRkdfRFJBTV9CQVNFCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoKCgkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZAkJICAgICovCgkvKgkgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLgkJCQkgICAgKi8KCglsZHIJcjMsCVtyMSwgI01EQ05GR19PRkZTRVRdCgltb3YJcjQsIHIzCglvcnIJcjMsCXIzLAkjTURDTkZHX0RFMAoJc3RyCXIzLAlbcjEsICNNRENORkdfT0ZGU0VUXQoJbW92CXIwLCByMwoKCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLgkJCQkJICAgICovCgoJbGRyCXIyLCAgPUNGR19NRE1SU19WQUwKCXN0cglyMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KCgkvKiBlbmFibGUgQVBEICovCglsZHIJcjMsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoJb3JyCXIzLCAgcjMsICAjTURSRUZSX0FQRAoJc3RyCXIzLCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBXZSBhcmUgZmluaXNoZWQgd2l0aCBJbnRlbCdzIG1lbW9yeSBjb250cm9sbGVyIGluaXRpYWxpc2F0aW9uICAgICovCgpzZXR2b2x0YWdlOgoKCW1vdglyMTAsCWxyCglibAlpbml0UFhBdm9sdGFnZQkvKiBJbiBjYXNlIHRoZSBib2FyZCBpcyByZWJvb3Rpbmcgd2l0aCBhICAgICovCgltb3YJbHIsCXIxMAkvKiBsb3cgdm9sdGFnZSByYWlzZSBpdCB1cCB0byBhIGdvb2Qgb25lLiAgICovCgp3YWtldXA6CgkvKiBBcmUgd2Ugd2FraW5nIGZyb20gc2xlZXA/ICovCglsZHIJcjAsCT1SQ1NSCglsZHIJcjEsCVtyMF0KCWFuZAlyMSwJcjEsICMoUkNTUl9HUFIgfCBSQ1NSX1NNUiB8IFJDU1JfV0RSIHwgUkNTUl9IV1IpCglzdHIJcjEsCVtyMF0KCXRlcQlyMSwJI1JDU1JfU01SCgoJYm5lCWluaXRpcnFzCgoJbGRyCXIwLAk9UFNTUgoJbW92CXIxLAkjUFNTUl9QSAoJc3RyCXIxLAlbcjBdCgoJLyogaWYgc28sIHJlc3VtZSBhdCBQU1BSICovCglsZHIJcjAsCT1QU1BSCglsZHIJcjEsCVtyMF0KCW1vdglwYywJcjEKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEaXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlcgkgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmluaXRpcnFzOgoKCW1vdglyMSwgICMwCQkvKiBjbGVhciBpbnQuIGxldmVsIHJlZ2lzdGVyIChJUlEsIG5vdCBGSVEpICovCglsZHIJcjIsICA9SUNMUgoJc3RyCXIxLCAgW3IyXQoKCWxkcglyMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KCXN0cglyMSwgIFtyMl0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbgkJCQkJCSAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoKCS8qIFR1cm4gT2ZmIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgKGV4Y2VwdCBmb3IgbWVtb3J5KQkgICAgKi8KCS8qIGZvciByZS1jb25maWd1cmF0aW9uLgkJCQkJICAgICovCglsZHIJcjEsICA9Q0tFTgoJbGRyCXIyLCAgPUNGR19DS0VOCglzdHIJcjIsICBbcjFdCgoJLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIJCQkgICAgKi8KCWxkcglyMiwgID1DRkdfQ0NDUgoJbGRyCXIxLCAgPUNDQ1IKCXN0cglyMiwgIFtyMV0KCgkvKiBUdXJuIG9uIHR1cmJvIG1vZGUgKi8KCW1yYwlwMTQsIDAsIHIyLCBjNiwgYzAsIDAKCW9ycglyMiwgcjIsICMweEIJCS8qIFR1cmJvLCBGYXN0LUJ1cywgRnJlcSBjaGFuZ2UqKi8KCW1jcglwMTQsIDAsIHIyLCBjNiwgYzAsIDAKCgkvKiBSZS13cml0ZSBNRFJFRlIgKi8KCWxkcglyMSwgPU1FTUNfQkFTRQoJbGRyCXIyLCBbcjEsICNNRFJFRlJfT0ZGU0VUXQoJc3RyCXIyLCBbcjEsICNNRFJFRlJfT0ZGU0VUXQojaWZkZWYgUlRDCgkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9yIFJUQyBhbmQgUG93ZXJNYW5hZ2VyCQkgICAgKi8KCWxkcglyMSwgID1PU0NDCgltb3YJcjIsICAjT1NDQ19PT04KCXN0cglyMiwgIFtyMV0KCgkvKiBOT1RFOiAgc3BpbiBoZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTAkgICAgKi8KCS8qIGhhcyBzZXR0bGVkLgkJCQkJCQkgICAgKi8KNjA6CglsZHIJcjIsIFtyMV0KCWFuZHMJcjIsIHIyLCAjMQoJYmVxCTYwYgojZWxzZQojZXJyb3IgIlJUQyBub3QgZGVmaW5lZCIKI2VuZGlmCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMJCQkJICAgICovCiAgICBsZHIgcjAsID1JQ01SIC8qIGVuYWJsZSBubyBzb3VyY2VzICovCgltb3YgcjEsICMwCiAgICBzdHIgcjEsIFtyMF0KCS8qIEZJWE1FICovCgojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5kIGxvd2xldmVsX2luaXQJCQkJCQkJICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgplbmRsb3dsZXZlbF9pbml0OgoKCW1vdglwYywgbHIK