LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ09ORklHX1NZU19EUkFNX1NJWkUKCi8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCiAgIC5tYWNybyBDUFdBSVQgcmVnCiAgIG1yYyAgcDE1LDAsXHJlZyxjMixjMCwwCiAgIG1vdiAgXHJlZyxccmVnCiAgIHN1YiAgcGMscGMsIzQKICAgLmVuZG0KCgovKgogKglNZW1vcnkgc2V0dXAKICovCgouZ2xvYmwgbG93bGV2ZWxfaW5pdApsb3dsZXZlbF9pbml0OgoKICAgIG1vdiAgICAgIHIxMCwgbHIKCgkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyCQlyMCwJPUdQU1IwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUFNSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BTUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQU1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUENSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BDUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQQ1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUERSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BEUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQRFIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIwX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfVQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjBfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIxX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfTAoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjJfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCXIwLAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNPTkZJR19TWVNfUFNTUl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KCS8qIENoYXB0ZXIgMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCgkvKiAgICAgICAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4gICAgICovCgkvKiAgICAgICAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCgltb3YgcjIsICMwCglzdHIgcjIsIFtyM10KCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLwoxOgoJbGRyIHIyLCBbcjNdCgljbXAgcjQsIHIyCgliZ3QgMWIKCm1lbV9pbml0OgoKCWxkciAgICAgcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogTVNDMDogbkNTKDAsMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgICA9Q09ORklHX1NZU19NU0MwX1ZBTAoJc3RyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0KCWxkciAgICAgcjIsICAgW3IxLCAjTVNDMF9PRkZTRVRdCS8qIHJlYWQgYmFjayB0byBlbnN1cmUgICAgICAqLwoJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcyAgICAgICAgKi8KCS8qIE1TQzE6IG5DUygyLDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NU0MxX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoJbGRyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQoKCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NU0MyX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoJbGRyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmI6IEluaXRpYWxpemUgQ2FyZCBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNRUNSOiBNZW1vcnkgRXhwYW5zaW9uIENhcmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTUVDUl9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNRUNSX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUVDUl9PRkZTRVRdCgoJLyogTUNNRU0wOiBDYXJkIEludGVyZmFjZSBzbG90IDAgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DT05GSUdfU1lTX01DTUVNMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ01FTTBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQoKCS8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NQ01FTTFfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0xX09GRlNFVF0KCgkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTUNBVFQwX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DQVRUMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DQVRUMF9PRkZTRVRdCgoJLyogTUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DT05GSUdfU1lTX01DQVRUMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NQ0lPMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0lPMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DSU8wX09GRlNFVF0KCgkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTUNJTzFfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNJTzFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0lPMV9PRkZTRVRdCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyYzogV3JpdGUgRkxZQ05GRyAgRklYTUU6IHdoYXQncyB0aGF0Pz8/ICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJkOiBJbml0aWFsaXplIFRpbWluZyBmb3IgU3luYyBNZW1vcnkgKFNEQ0xLMCkgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZhbGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0ICAgICAqLwoJLyogdGhpcyB0byBwb3dlciBvbiBkZWZhdWx0cyArIERSSSBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjMsICAgICA9Q09ORklHX1NZU19NRFJFRlJfVkFMCglsZHIgICAgIHIyLCAgICAgPTB4RkZGCglhbmQgICAgIHIzLCAgICAgcjMsICByMgoJbGRyCXI0LAk9MHgwM2NhNDAwMAoJb3JyICAgICByNCwgICAgIHI0LCAgcjMKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUgYml0cyAgICAgICAgICAgICAgICovCgoJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIEZJWE1FOiB3ZSB1c2UgYXN5bmMgbW9kZSBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCA0OiBJbml0aWFsaXplIFNEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIHNldCBNRFJFRlIgYWNjb3JkaW5nIHRvIHVzZXIgZGVmaW5lIHdpdGggZXhjZXB0aW9uIG9mIGEgZmV3IGJpdHMgKi8KCglsZHIgICAgIHI0LCAgICAgPUNPTkZJR19TWVNfTURSRUZSX1ZBTAoJb3JyCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQoJYmljCXI0LAlyNCwJIyhNRFJFRlJfRTFQSU58TURSRUZSX0UwUElOKQoJc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWJpYwlyNCwJcjQsCSMoTURSRUZSX1NMRlJTSCkKCXN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KCWxkciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCgkvKiBTdGVwIDRjOiBhc3NlcnQgTURSRUZSOkUxUElOIGFuZCBFMFBJTyBhcyBkZXNpcmVkICAgICAgICAgICAgICAgICovCgoJbGRyICAgICByNCwgICAgID1DT05GSUdfU1lTX01EUkVGUl9WQUwKCXN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KCWxkciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCgkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCgkvKiAgICAgICAgICBjb25maWd1cmUgYnV0IG5vdCBlbmFibGUgZWFjaCBTRFJBTSBwYXJ0aXRpb24gcGFpci4gICAgICovCgoJbGRyCXI0LAk9Q09ORklHX1NZU19NRENORkdfVkFMCgliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0KCgoJLyogU3RlcCA0ZTogV2FpdCBmb3IgdGhlIGNsb2NrIHRvIHRoZSBTRFJBTXMgdG8gc3RhYmlsaXplLCAgICAgICAgICAqLwoJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJICAgIHN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CgkgICAgbGRyIHIyLCBbcjNdCgkgICAgY21wIHI0LCByMgoJICAgIGJndCAxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCgkvKiAgICAgICAgICBhdHRlbXB0aW5nIG5vbi1idXJzdCByZWFkIG9yIHdyaXRlIGFjY2Vzc2VzIHRvIGRpc2FibGVkICovCgkvKiAgICAgICAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKiAgICAgICAgICBmb3IgdGhpcyBwdXJwb3NlIG11c3Qgbm90IGJlIGNhY2hlYWJsZS4gICAgICAgICAgICAgICAgICovCgoJbGRyCXIzLAk9Q09ORklHX1NZU19EUkFNX0JBU0UKCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCgoKCS8qIFN0ZXAgNGc6IFdyaXRlIE1EQ05GRyB3aXRoIGVuYWJsZSBiaXRzIGFzc2VydGVkICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgIChNRENORkc6REV4IHNldCB0byAxKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIzLCAgW3IxLCAjTURDTkZHX09GRlNFVF0KCW9ycglyMywJcjMsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQoJc3RyICAgICByMywgIFtyMSwgI01EQ05GR19PRkZTRVRdCgoJLyogU3RlcCA0aDogV3JpdGUgTURNUlMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NRE1SU19WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNRE1SU19PRkZTRVRdCgoKCS8qIFdlIGFyZSBmaW5pc2hlZCB3aXRoIEludGVsJ3MgbWVtb3J5IGNvbnRyb2xsZXIgaW5pdGlhbGlzYXRpb24gICAgKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGlycXM6CgoJbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KCWxkciAgICAgcjIsICA9SUNMUgoJc3RyICAgICByMSwgIFtyMl0KCglsZHIgICAgIHIyLCAgPUlDTVIJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAgICAqLwoJc3RyICAgICByMSwgIFtyMl0KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogQ2xvY2sgaW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoJLyogKGhhcmQtY29kaW5nIGF0IDM5OC4xMk1IeiBmb3Igbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIFR1cm4gT2ZmIEFMTCBvbi1jaGlwIHBlcmlwaGVyYWwgY2xvY2tzIGZvciByZS1jb25maWd1cmF0aW9uICAgICAgKi8KCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsICA9Q0tFTgoJbW92ICAgICByMiwgICMwCglzdHIgICAgIHIyLCAgW3IxXQoKCgkvKiBkZWZhdWx0IHZhbHVlIGluIGNhc2Ugbm8gdmFsaWQgcm90YXJ5IHN3aXRjaCBzZXR0aW5nIGlzIGZvdW5kICAgICovCglsZHIgICAgIHIyLCA9KENDQ1JfTDI3fENDQ1JfTTJ8Q0NDUl9OMTApICAvKiBERUZBVUxUOiB7MjAwLzIwMC8xMDB9ICovCgoJLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMSwgID1DQ0NSCglzdHIgICAgIHIyLCAgW3IxXQoKI2lmZGVmIFJUQwoJLyogZW5hYmxlIHRoZSAzMktoeiBvc2NpbGxhdG9yIGZvciBSVEMgYW5kIFBvd2VyTWFuYWdlciAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjEsICA9T1NDQwoJbW92ICAgICByMiwgICNPU0NDX09PTgoJc3RyICAgICByMiwgIFtyMV0KCgkvKiBOT1RFOiAgc3BpbiBoZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTCAgICAgICAgICovCgkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCjYwOgoJbGRyICAgICByMiwgW3IxXQoJYW5kcyAgICByMiwgcjIsICMxCgliZXEgICAgIDYwYgojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogU2F2ZSBTRFJBTSBzaXplICovCiAgICBsZHIgICAgIHIxLCA9RFJBTV9TSVpFCgkgc3RyCSAgIHI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgbGRyCXIwLCA9SUNNUiAvKiBlbmFibGUgbm8gc291cmNlcyAqLwoJbW92IHIxLCAjMAogICAgc3RyIHIxLCBbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KCiNlbmRpZgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuZCBsb3dsZXZlbF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZW5kbG93bGV2ZWxfaW5pdDoKCiAgICBtb3YgICAgIHBjLCBscgo=