LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ0ZHX0RSQU1fU0laRQoKLyogd2FpdCBmb3IgY29wcm9jZXNzb3Igd3JpdGUgY29tcGxldGUgKi8KCS5tYWNybyBDUFdBSVQgcmVnCgltcmMgIHAxNSwwLFxyZWcsYzIsYzAsMAoJbW92ICBccmVnLFxyZWcKCXN1YiAgcGMscGMsIzQKCS5lbmRtCgovKgogKglNZW1vcnkgc2V0dXAKICovCi5nbG9ibCBsb3dsZXZlbF9pbml0Cmxvd2xldmVsX2luaXQ6CgoJbW92ICAgICAgcjEwLCBscgoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogM3JkIGJsaW5rICovCglibAlibGluawojZW5kaWYKCgkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglsZHIJCXIwLAk9R1BTUjAKCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjEKCWxkcgkJcjEsCT1DRkdfR1BTUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjIKCWxkcgkJcjEsCT1DRkdfR1BTUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjAKCWxkcgkJcjEsCT1DRkdfR1BDUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjEKCWxkcgkJcjEsCT1DRkdfR1BDUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjIKCWxkcgkJcjEsCT1DRkdfR1BDUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjAKCWxkcgkJcjEsCT1DRkdfR1BEUjBfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjEKCWxkcgkJcjEsCT1DRkdfR1BEUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjIKCWxkcgkJcjEsCT1DRkdfR1BEUjJfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfTAoJbGRyCQlyMSwJPUNGR19HQUZSMF9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjBfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIxX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjFfVQoJbGRyCQlyMSwJPUNGR19HQUZSMV9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIyX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjJfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJcjAsCT1QU1NSCQkvKiBlbmFibGUgR1BJTyBwaW5zICovCglsZHIJCXIxLAk9Q0ZHX1BTU1JfVkFMCglzdHIJCXIxLCAgIFtyMF0KCiNpZmRlZiBERUJVR19CTElOS19FTkFCTEUKCS8qIDR0aCBkZWJ1ZyBibGluayAqLwoJYmwJYmxpbmsKI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5hYmxlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogVGhlIHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzICAgICAgICAqLwoJLyogZGV0YWlsZWQgaW4gdGhlIEludGVsIFBYQTI1MCBPcGVyYXRpbmcgU3lzdGVtcyBEZXZlbG9wZXJzIEd1aWRlLCAqLwoJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRlcm5hbCAgICAgKi8KCS8qICAgICAgICAgY2xvY2tzIHRvIHNldHRsZS4gT25seSBuZWNlc3NhcnkgYWZ0ZXIgaGFyZCByZXNldC4uLiAgICAgKi8KCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCglsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KCW1vdiByMiwgIzAKCXN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CglsZHIgcjIsIFtyM10KCWNtcCByNCwgcjIKCWJndCAxYgoKbWVtX2luaXQ6CgoJbGRyICAgICByMSwgID1NRU1DX0JBU0UJCS8qIGdldCBtZW1vcnkgY29udHJvbGxlciBiYXNlIGFkZHIuICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYTogSW5pdGlhbGl6ZSBBc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1TQyByZWdpc3RlcnM6IHRpbWluZywgYnVzIHdpZHRoLCBtZW0gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiBNU0MwOiBuQ1MoMCwxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgID1DRkdfTVNDMF9WQUwKCXN0ciAgICAgcjIsICAgW3IxLCAjTVNDMF9PRkZTRVRdCglsZHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJlICAgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMgICAgICAgICovCgkvKiBNU0MxOiBuQ1MoMiwzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNGR19NU0MxX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoJbGRyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoKCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01TQzJfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCglsZHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYjogSW5pdGlhbGl6ZSBDYXJkIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01FQ1JfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUVDUl9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQoKCS8qIE1DTUVNMDogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAwIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DTUVNMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ01FTTBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQoKCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DTUVNMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ01FTTFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTFfT0ZGU0VUXQoKCS8qIE1DQVRUMDogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAwICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DQVRUMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DQVRUMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DSU8wX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DSU8wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzBfT0ZGU0VUXQoKCS8qIE1DSU8xOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q0ZHX01DSU8xX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogNXRoIGJsaW5rICovCglibAlibGluawojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIEJlZm9yZSBhY2Nlc3NpbmcgTURSRUZSIHdlIG5lZWQgYSB2YWxpZCBEUkkgZmllbGQsIHNvIHdlIHNldCAgICAgKi8KCS8qIHRoaXMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKyBEUkkgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIzLCAgICAgPUNGR19NRFJFRlJfVkFMCglsZHIgICAgIHIyLCAgICAgPTB4RkZGCglhbmQgICAgIHIzLCAgICAgcjMsICByMgoJbGRyCXI0LAk9MHgwM2NhNDAwMAoJb3JyICAgICByNCwgICAgIHI0LCAgcjMKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAzOiBJbml0aWFsaXplIFN5bmNocm9ub3VzIFN0YXRpYyBNZW1vcnkgKEZsYXNoL1BlcmlwaGVyYWxzKSAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIEluaXRpYWxpemUgU1hDTkZHIHJlZ2lzdGVyLiBBc3NlcnQgdGhlIGVuYWJsZSBiaXRzICAgICAgICAgICAgICAgKi8KCgkvKiBXcml0ZSBTWE1SUyB0byBjYXVzZSBhbiBNUlMgY29tbWFuZCB0byBhbGwgZW5hYmxlZCBiYW5rcyBvZiAgICAgICovCgkvKiBzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5LiBOb3RlIHRoYXQgU1hMQ1IgbmVlZCBub3QgYmUgd3JpdHRlbiAgICovCgkvKiBhdCB0aGlzIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogRklYTUU6IHdlIHVzZSBhc3luYyBtb2RlIGZvciBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBzZXQgTURSRUZSIGFjY29yZGluZyB0byB1c2VyIGRlZmluZSB3aXRoIGV4Y2VwdGlvbiBvZiBhIGZldyBiaXRzICovCgoJbGRyICAgICByNCwgICAgID1DRkdfTURSRUZSX1ZBTAoJb3JyCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQoJYmljCXI0LAlyNCwJIyhNRFJFRlJfRTFQSU58TURSRUZSX0UwUElOKQoJc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWJpYwlyNCwJcjQsCSMoTURSRUZSX1NMRlJTSCkKCXN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KCWxkciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPIGFzIGRlc2lyZWQgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHI0LCAgICAgPUNGR19NRFJFRlJfVkFMCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcglyNCwJPUNGR19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsICAgICAgICAgICovCgkvKiAgICAgICAgICAxMDAuLjIwMCC1c2VjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCgltb3YgcjIsICMwCgkgICAgc3RyIHIyLCBbcjNdCglsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KMToKCSAgICBsZHIgcjIsIFtyM10KCSAgICBjbXAgcjQsIHIyCgkgICAgYmd0IDFiCgoJLyogU3RlcCA0ZjogVHJpZ2dlciBhIG51bWJlciAodXN1YWxseSA4KSByZWZyZXNoIGN5Y2xlcyBieSAgICAgICAgICAqLwoJLyogICAgICAgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLwoJLyogICAgICAgICAgU0RSQU0sIGFzIGNvbW1vbmx5IHNwZWNpZmllZCBpbiB0aGUgcG93ZXIgdXAgc2VxdWVuY2UgICAqLwoJLyogICAgICAgICAgZG9jdW1lbnRlZCBpbiBTRFJBTSBkYXRhIHNoZWV0cy4gVGhlIGFkZHJlc3MoZXMpIHVzZWQgICAqLwoJLyogICAgICAgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuICAgICAgICAgICAgICAgICAqLwoKCWxkcglyMywJPUNGR19EUkFNX0JBU0UKCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCgoJLyogU3RlcCA0ZzogV3JpdGUgTURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjMsICBbcjEsICNNRENORkdfT0ZGU0VUXQoJb3JyCXIzLAlyMywJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCglzdHIgICAgIHIzLCAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgkvKiBTdGVwIDRoOiBXcml0ZSBNRE1SUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyICAgICByMiwgID1DRkdfTURNUlNfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTURNUlNfT0ZGU0VUXQoKCS8qIFdlIGFyZSBmaW5pc2hlZCB3aXRoIEludGVsJ3MgbWVtb3J5IGNvbnRyb2xsZXIgaW5pdGlhbGlzYXRpb24gICAgKi8KI2lmIDAKCS8qIEZJWE1FIHR1cm4gb24gc2VyaWFsIHBvcnRzICovCgkvKiBsb29rIGludG8gbW92aW5nIHRoaXMgdG8gYm9hcmRfaW5pdCgpICovCglsZHIJcjIsID0oUFhBX0NTNV9QSFlTICsgMHgwM0MwMDAyYykKCW1vdglyMywgIzB4MTMKCXN0cglyMywgW3IyXQojZW5kaWYKCiNpZmRlZiBERUJVR19CTElOS19FTkFCTEUKCS8qIDZ0aCBibGluayAqLwoJYmwJYmxpbmsKI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGlycXM6CgoJbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KCWxkciAgICAgcjIsICA9SUNMUgoJc3RyICAgICByMSwgIFtyMl0KCglsZHIgICAgIHIyLCAgPUlDTVIJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAgICAqLwoJc3RyICAgICByMSwgIFtyMl0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppbml0Y2xrczoKCgkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcywgYW5kIHNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgICovCgkvKiAoaGFyZC1jb2RpbmcgYXQgMzk4LjEyTUh6IGZvciBub3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogVHVybiBPZmYgQUxMIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgZm9yIHJlLWNvbmZpZ3VyYXRpb24gICAgICAqLwoJLyogTm90ZTogU2VlIGxhYmVsICdFTkFCTEVDTEtTJyBmb3IgdGhlIHJlLWVuYWJsaW5nICAgICAgICAgICAgICAgICAqLwojaWYgMAoJbGRyICAgICByMSwgID1DS0VOCgltb3YgICAgIHIyLCAgIzAKCXN0ciAgICAgcjIsICBbcjFdCgoJLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwoJbGRyICAgICByMiwgPShDQ0NSX0wyN3xDQ0NSX00yfENDQ1JfTjEwKSAgLyogREVGQVVMVDogezIwMC8yMDAvMTAwfSAqLwoKCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUgY2xvY2sgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsICA9Q0NDUgoJc3RyICAgICByMiwgIFtyMV0KCiNlbmRpZgoKI2lmZGVmIFJUQwoJLyogZW5hYmxlIHRoZSAzMktoeiBvc2NpbGxhdG9yIGZvciBSVEMgYW5kIFBvd2VyTWFuYWdlciAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjEsICA9T1NDQwoJbW92ICAgICByMiwgICNPU0NDX09PTgoJc3RyICAgICByMiwgIFtyMV0KCgkvKiBOT1RFOiAgc3BpbiBoZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTCAgICAgICAgICovCgkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCjYwOgoJbGRyICAgICByMiwgW3IxXQoJYW5kcyAgICByMiwgcjIsICMxCgliZXEgICAgIDYwYgojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogU2F2ZSBTRFJBTSBzaXplICovCglsZHIgICAgIHIxLCA9RFJBTV9TSVpFCglzdHIgICAgIHI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyCXIwLCA9SUNNUiAvKiBlbmFibGUgbm8gc291cmNlcyAqLwoJbW92IHIxLCAjMAoJc3RyIHIxLCBbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5kIG1lbXNldHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogN3RoIGJsaW5rICovCglibAlibGluawojZW5kaWYKCmVuZGxvd2xldmVsX2luaXQ6CgoJbW92ICAgICBwYywgcjEwCgoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoKLyogZGVidWcgTEVEIGNvZGUgKi8KCi8qIGRlbGF5IGFib3V0IDIwMG1zICovCmRlbGF5OgoKCS8qIHJlc2V0IE9TQ1IgdG8gMCAqLwoJbGRyCXI4LCA9T1NDUgoJbW92CXI5LCAjMAoJc3RyCXI5LCBbcjhdCgoJLyogbWFrZSBzdXJlIG5ldyB2YWx1ZSBoYXMgc3R1Y2sgKi8KMToKCWxkcglyOCwgPU9TQ1IKCWxkcglyOSwgW3I4XQoJbW92CXI4LCAjMHgxMDAwMAoJY21wCXI5LCByOAoJYmd0CTFiCgoJLyogbm93LCB3YWl0IGZvciBkZWxheSB0byBleHBpcmUgKi8KMToKCWxkcglyOCwgPU9TQ1IKCWxkcglyOSwgW3I4XQoJbW92CXI4LCAjMHhkNDAwMAoJY21wCXI4LCByOQoJYmd0CTFiCgoJbW92CXBjLCBscgoKLyogYmxpbmsgY29kZSAtLSB0cmFzaGVzIHI3LCByOCwgcjkgKi8KCi5nbG9ibCBibGluawpibGluazoKCgltb3YJcjcsIGxyCgoJLyogc2V0IEdQSU8xMCBhcyBvdXRvdXQgKi8KCWxkcglyOCwgID1HUERSMAoJbGRyCXI5LCAgW3I4XQoJb3JyCXI5LCAgcjksICMoMTw8MTApCglzdHIJcjksICBbcjhdCgoJLyogdHVybiBMRUQgb2ZmICovCgltb3YJcjksICAjKDE8PDEwKQoJbGRyCXI4LCAgPUdQQ1IwCglzdHIJcjksIFtyOF0KCWJsCWRlbGF5CgoJLyogdHVybiBMRUQgb24gKi8KCW1vdglyOSwgICMoMTw8MTApCglsZHIJcjgsICA9R1BTUjAKCXN0cglyOSwgW3I4XQoJYmwJZGVsYXkKCgkvKiB0dXJuIExFRCBvZmYgKi8KCW1vdglyOSwgICMoMTw8MTApCglsZHIJcjgsICA9R1BDUjAKCXN0cglyOSwgW3I4XQoKCW1vdglwYywgcjcKCiNlbmRpZgo=