LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL21lbXNldHVwLlMgZm9yIGFub3RoZXIgUFhBMjUwIHNldHVwIHRoYXQgaXMKICogbXVjaCBjbGVhbmVyLgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CgpEUkFNX1NJWkU6ICAubG9uZyAgIENGR19EUkFNX1NJWkUKCi8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCiAgIC5tYWNybyBDUFdBSVQgcmVnCiAgIG1yYyAgcDE1LDAsXHJlZyxjMixjMCwwCiAgIG1vdiAgXHJlZyxccmVnCiAgIHN1YiAgcGMscGMsIzQKICAgLmVuZG0KCgovKgogKiAJTWVtb3J5IHNldHVwCiAqLwoKLmdsb2JsIG1lbXNldHVwCm1lbXNldHVwOgoKICAgIG1vdiAgICAgIHIxMCwgbHIKCgkvKiBTZXQgdXAgR1BJTyBwaW5zIGZpcnN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyCQlyMCwJPUdQU1IwCglsZHIJCXIxLAk9Q0ZHX0dQU1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IxCglsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQU1IyCglsZHIJCXIxLAk9Q0ZHX0dQU1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q0ZHX0dQQ1IwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IxCglsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IyCglsZHIJCXIxLAk9Q0ZHX0dQQ1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q0ZHX0dQRFIwX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIxCglsZHIJCXIxLAk9Q0ZHX0dQRFIxX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIyCglsZHIJCXIxLAk9Q0ZHX0dQRFIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DRkdfR0FGUjBfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMF9VCglsZHIJCXIxLAk9Q0ZHX0dBRlIwX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjFfTAoJbGRyCQlyMSwJPUNGR19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DRkdfR0FGUjFfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9MCglsZHIJCXIxLAk9Q0ZHX0dBRlIyX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfVQoJbGRyCQlyMSwJPUNGR19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCXIwLAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNGR19QU1NSX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgovKglsZHIJcjMsCT1NU0MxCQkvICBsb3cgLSBiYW5rIDIgTHViYm9jayBSZWdpc3RlcnMgLyBTUkFNICovCi8qCWxkcglyMiwJPUNGR19NU0MxX1ZBTAkvICBoaWdoIC0gYmFuayAzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KLyoJc3RyCXIyLAlbcjNdCQkvICBuZWVkIHRvIHNldCBNU0MxIGJlZm9yZSB0cnlpbmcgdG8gd3JpdGUgdG8gdGhlIEhFWCBMRURzICovCi8qCWxkcglyMiwJW3IzXQkJLyAgbmVlZCB0byByZWFkIGl0IGJhY2sgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBsYXRjaGVzIChzZWUgTVNDIHNlY3Rpb24gb2YgbWFudWFsKSAqLwovKiAqLwovKglsZHIJcjEsCT1MRURfQkxBTksgKi8KLyoJbW92CXIwLAkjMHhGRiAqLwovKglzdHIJcjAsCVtyMV0JCS8gIHR1cm4gb24gaGV4IGxlZHMgKi8KLyogKi8KLypsb29wOiAqLwovKiAqLwovKiAgIGxkcglyMCwgPTB4QjAwNzAwMDEgKi8KLyogICBsZHIgICAgCXIxLCA9X0xFRCAqLwovKiAgIHN0ciAgICAJcjAsIFtyMV0JCS8gIGhleCBkaXNwbGF5ICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KCS8qIENoYXB0ZXIgMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCgkvKiAgICAgICAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4gICAgICovCgkvKiAgICAgICAgIEZJWE1FOiBjYW4gYmUgb3B0aW1pemVkIGxhdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCgltb3YgcjIsICMwCglzdHIgcjIsIFtyM10KCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLwoxOgoJbGRyIHIyLCBbcjNdCgljbXAgcjQsIHIyCgliZ3QgMWIKCm1lbV9pbml0OgoKICAgICAgICBsZHIgICAgIHIxLCAgPU1FTUNfQkFTRQkJLyogZ2V0IG1lbW9yeSBjb250cm9sbGVyIGJhc2UgYWRkci4gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJhOiBJbml0aWFsaXplIEFzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTVNDIHJlZ2lzdGVyczogdGltaW5nLCBidXMgd2lkdGgsIG1lbSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAvKiBNU0MwOiBuQ1MoMCwxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgICA9Q0ZHX01TQzBfVkFMCiAgICAgICAgc3RyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0KICAgICAgICBsZHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJlICAgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMgICAgICAgICovCiAgICAgICAgLyogTVNDMTogbkNTKDIsMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01TQzFfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01TQzFfT0ZGU0VUXQogICAgICAgIGxkciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCgkvKiBNU0MyOiBuQ1MoNCw1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTVNDMl9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCiAgICAgICAgbGRyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMmI6IEluaXRpYWxpemUgQ2FyZCBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBNRUNSOiBNZW1vcnkgRXhwYW5zaW9uIENhcmQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUVDUl9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUVDUl9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQoKCS8qIE1DTUVNMDogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAwIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ01FTTBfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DTUVNMF9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DTUVNMF9PRkZTRVRdCgogICAgICAgIC8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ01FTTFfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DTUVNMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCgoJLyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DQVRUMF9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNBVFQwX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNBVFQwX09GRlNFVF0KCgkvKiBNQ0FUVDE6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICovCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNBVFQxX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDFfT0ZGU0VUXQoKCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ0lPMF9WQUwKICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNJTzBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCgoJLyogTUNJTzE6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DSU8xX1ZBTAogICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0lPMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DSU8xX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyogU3RlcCAyYzogV3JpdGUgRkxZQ05GRyAgRklYTUU6IHdoYXQncyB0aGF0Pz8/ICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qIFN0ZXAgMmQ6IEluaXRpYWxpemUgVGltaW5nIGZvciBTeW5jIE1lbW9yeSAoU0RDTEswKSAgICAgICAgICAgICAgKi8KICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogQmVmb3JlIGFjY2Vzc2luZyBNRFJFRlIgd2UgbmVlZCBhIHZhbGlkIERSSSBmaWVsZCwgc28gd2Ugc2V0ICAgICAqLwoJLyogdGhpcyB0byBwb3dlciBvbiBkZWZhdWx0cyArIERJUiBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkcglyNCwJPTB4MDNjYTRmZmYKCXN0cglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCiAgICAgICAgbGRyICAgICByNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KCglsZHIJcjQsCT0weDAzY2E0MDMwCglzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQoKICAgICAgICAvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUgYml0cyAgICAgICAgICAgICAgICovCgoJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIEZJWE1FOiB3ZSB1c2UgYXN5bmMgbW9kZSBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgogICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAvKiBTdGVwIDQ6IEluaXRpYWxpemUgU0RSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIFN0ZXAgNGE6IGFzc2VydCBNRFJFRlI6SzFSVU4gYW5kIE1EUkVGUjpLMlJVTiBhbmQgY29uZmlndXJlICAgICAgKi8KCS8qICAgICAgICAgIE1EUkVGUjpLMURCMiBhbmQgTURSRUZSOksyREIyIGFzIGRlc2lyZWQuICAgICAgICAgICAgICAgKi8KCglvcnIJcjQsCXI0LAkjKE1EUkVGUl9LMVJVTnxNRFJFRlJfSzBSVU4pCgoJc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoKCS8qIFN0ZXAgNGI6IGRlLWFzc2VydCBNRFJFRlI6U0xGUlNILiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgliaWMJcjQsCXI0LAkjKE1EUkVGUl9TTEZSU0gpCgogICAgICAgIHN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0YzogYXNzZXJ0IE1EUkVGUjpFMVBJTiBhbmQgRTBQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCW9ycglyNCwJcjQsCSMoTURSRUZSX0UxUElOfE1EUkVGUl9FMFBJTikKCiAgICAgICAgc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXQoKCgkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCgkvKiAgICAgICAgICBjb25maWd1cmUgYnV0IG5vdCBlbmFibGUgZWFjaCBTRFJBTSBwYXJ0aXRpb24gcGFpci4gICAgICovCgoJbGRyCXI0LAk9Q0ZHX01EQ05GR19WQUwKCWJpYwlyNCwJcjQsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQoKICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCiAgICAgICAgbGRyICAgICByNCwgICAgIFtyMSwgI01EQ05GR19PRkZTRVRdCgoKCS8qIFN0ZXAgNGU6IFdhaXQgZm9yIHRoZSBjbG9jayB0byB0aGUgU0RSQU1zIHRvIHN0YWJpbGl6ZSwgICAgICAgICAgKi8KCS8qICAgICAgICAgIDEwMC4uMjAwILVzZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KCW1vdiByMiwgIzAKCXN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CglsZHIgcjIsIFtyM10KCWNtcCByNCwgcjIKCWJndCAxYgoKCgkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCgkvKiAgICAgICAgICBhdHRlbXB0aW5nIG5vbi1idXJzdCByZWFkIG9yIHdyaXRlIGFjY2Vzc2VzIHRvIGRpc2FibGVkICovCgkvKiAgICAgICAgICBTRFJBTSwgYXMgY29tbW9ubHkgc3BlY2lmaWVkIGluIHRoZSBwb3dlciB1cCBzZXF1ZW5jZSAgICovCgkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCgkvKiAgICAgICAgICBmb3IgdGhpcyBwdXJwb3NlIG11c3Qgbm90IGJlIGNhY2hlYWJsZS4gICAgICAgICAgICAgICAgICovCgoJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCgoJLyogU3RlcCA0ZzogV3JpdGUgTURDTkZHIHdpdGggZW5hYmxlIGJpdHMgYXNzZXJ0ZWQgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkcglyMywgW3IxLCAjTURDTkZHX09GRlNFVF0KCW9ycglyMywJcjMsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQoJc3RyCXIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQoKCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgbGRyICAgICByMiwgID1DRkdfTURNUlNfVkFMCiAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KCgoJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLwoKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBEaXNhYmxlIChtYXNrKSBhbGwgaW50ZXJydXB0cyBhdCBpbnRlcnJ1cHQgY29udHJvbGxlciAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppbml0aXJxczoKCiAgICAgICAgbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KICAgICAgICBsZHIgICAgIHIyLCAgPUlDTFIKICAgICAgICBzdHIgICAgIHIxLCAgW3IyXQoKICAgICAgICBsZHIgICAgIHIyLCAgPUlDTVIJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAgICAqLwogICAgICAgIHN0ciAgICAgcjEsICBbcjJdCgoKICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGNsa3M6CgoJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9ja3MsIGFuZCBzZXQgdGhlIGNvcmUgY2xvY2sgZnJlcXVlbmN5ICAqLwoJLyogKGhhcmQtY29kaW5nIGF0IDM5OC4xMk1IeiBmb3Igbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIFR1cm4gT2ZmIEFMTCBvbi1jaGlwIHBlcmlwaGVyYWwgY2xvY2tzIGZvciByZS1jb25maWd1cmF0aW9uICAgICAgKi8KCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KICAgICAgICBsZHIgICAgIHIxLCAgPUNLRU4KICAgICAgICBtb3YgICAgIHIyLCAgIzAKICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQoKCiAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwogICAgICAgIGxkciAgICAgcjIsID0oQ0NDUl9MMjd8Q0NDUl9NMnxDQ0NSX04xMCkgIC8qIERFRkFVTFQ6IHsyMDAvMjAwLzEwMH0gKi8KCiAgICAgICAgLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIGxkciAgICAgcjEsICA9Q0NDUgogICAgICAgIHN0ciAgICAgcjIsICBbcjFdCgoJLyogZW5hYmxlIHRoZSAzMktoeiBvc2NpbGxhdG9yIGZvciBSVEMgYW5kIFBvd2VyTWFuYWdlciAgICAgICAgICAgICAqLwovKgogICAgICAgIGxkciAgICAgcjEsICA9T1NDQwogICAgICAgIG1vdiAgICAgcjIsICAjT1NDQ19PT04KICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQoqLwoJLyogTk9URTogIHNwaW4gaGVyZSB1bnRpbCBPU0NDLk9PSyBnZXQgc2V0LCBtZWFuaW5nIHRoZSBQTEwgICAgICAgICAqLwoJLyogaGFzIHNldHRsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo2MDoKICAgICAgICBsZHIgICAgIHIyLCBbcjFdCiAgICAgICAgYW5kcyAgICByMiwgcjIsICMxCiAgICAgICAgYmVxICAgICA2MGIKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIFNhdmUgU0RSQU0gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkcglyMSwgPURSQU1fU0laRQoJc3RyCXI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyCXIwLCA9SUNNUgkJCS8qIGVuYWJsZSBubyBzb3VyY2VzICAgICAgICAqLwoJbW92CXIxLCAjMAoJc3RyCXIxLCBbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KCiNlbmRpZgoKICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmQgbWVtc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZW5kbWVtc2V0dXA6CgogICAgbW92ICAgICBwYywgbHIKCg==