LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9yY2MuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFJDQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUkNDIA0KICAqIEBicmllZiBSQ0MgZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLyANCg0KLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyogLS0tLS0tLS0tLS0tIFJDQyByZWdpc3RlcnMgYml0IGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbiAtLS0tLS0tLS0tLSAqLw0KI2RlZmluZSBSQ0NfT0ZGU0VUICAgICAgICAgICAgICAgIChSQ0NfQkFTRSAtIFBFUklQSF9CQVNFKQ0KDQovKiAtLS0gQ1IgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEhTSU9OIGJpdCAqLw0KI2RlZmluZSBDUl9PRkZTRVQgICAgICAgICAgICAgICAgIChSQ0NfT0ZGU0VUICsgMHgwMCkNCiNkZWZpbmUgSFNJT05fQml0TnVtYmVyICAgICAgICAgICAweDAwDQojZGVmaW5lIENSX0hTSU9OX0JCICAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSX09GRlNFVCAqIDMyKSArIChIU0lPTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFBMTE9OIGJpdCAqLw0KI2RlZmluZSBQTExPTl9CaXROdW1iZXIgICAgICAgICAgIDB4MTgNCiNkZWZpbmUgQ1JfUExMT05fQkIgICAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1JfT0ZGU0VUICogMzIpICsgKFBMTE9OX0JpdE51bWJlciAqIDQpKQ0KDQojaWZkZWYgU1RNMzJGMTBYX0NMDQogLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIFBMTDJPTiBiaXQgKi8NCiAjZGVmaW5lIFBMTDJPTl9CaXROdW1iZXIgICAgICAgICAgMHgxQQ0KICNkZWZpbmUgQ1JfUExMMk9OX0JCICAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ1JfT0ZGU0VUICogMzIpICsgKFBMTDJPTl9CaXROdW1iZXIgKiA0KSkNCg0KIC8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBQTEwzT04gYml0ICovDQogI2RlZmluZSBQTEwzT05fQml0TnVtYmVyICAgICAgICAgIDB4MUMNCiAjZGVmaW5lIENSX1BMTDNPTl9CQiAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENSX09GRlNFVCAqIDMyKSArIChQTEwzT05fQml0TnVtYmVyICogNCkpDQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovIA0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ1NTT04gYml0ICovDQojZGVmaW5lIENTU09OX0JpdE51bWJlciAgICAgICAgICAgMHgxMw0KI2RlZmluZSBDUl9DU1NPTl9CQiAgICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDUl9PRkZTRVQgKiAzMikgKyAoQ1NTT05fQml0TnVtYmVyICogNCkpDQoNCi8qIC0tLSBDRkdSIFJlZ2lzdGVyIC0tLSovDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBVU0JQUkUgYml0ICovDQojZGVmaW5lIENGR1JfT0ZGU0VUICAgICAgICAgICAgICAgKFJDQ19PRkZTRVQgKyAweDA0KQ0KDQojaWZuZGVmIFNUTTMyRjEwWF9DTA0KICNkZWZpbmUgVVNCUFJFX0JpdE51bWJlciAgICAgICAgICAweDE2DQogI2RlZmluZSBDRkdSX1VTQlBSRV9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDRkdSX09GRlNFVCAqIDMyKSArIChVU0JQUkVfQml0TnVtYmVyICogNCkpDQojZWxzZQ0KICNkZWZpbmUgT1RHRlNQUkVfQml0TnVtYmVyICAgICAgICAweDE2DQogI2RlZmluZSBDRkdSX09UR0ZTUFJFX0JCICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChDRkdSX09GRlNFVCAqIDMyKSArIChPVEdGU1BSRV9CaXROdW1iZXIgKiA0KSkNCiNlbmRpZiAvKiBTVE0zMkYxMFhfQ0wgKi8gDQoNCi8qIC0tLSBCRENSIFJlZ2lzdGVyIC0tLSovDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSVENFTiBiaXQgKi8NCiNkZWZpbmUgQkRDUl9PRkZTRVQgICAgICAgICAgICAgICAoUkNDX09GRlNFVCArIDB4MjApDQojZGVmaW5lIFJUQ0VOX0JpdE51bWJlciAgICAgICAgICAgMHgwRg0KI2RlZmluZSBCRENSX1JUQ0VOX0JCICAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChCRENSX09GRlNFVCAqIDMyKSArIChSVENFTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEJEUlNUIGJpdCAqLw0KI2RlZmluZSBCRFJTVF9CaXROdW1iZXIgICAgICAgICAgIDB4MTANCiNkZWZpbmUgQkRDUl9CRFJTVF9CQiAgICAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQkRDUl9PRkZTRVQgKiAzMikgKyAoQkRSU1RfQml0TnVtYmVyICogNCkpDQoNCi8qIC0tLSBDU1IgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIExTSU9OIGJpdCAqLw0KI2RlZmluZSBDU1JfT0ZGU0VUICAgICAgICAgICAgICAgIChSQ0NfT0ZGU0VUICsgMHgyNCkNCiNkZWZpbmUgTFNJT05fQml0TnVtYmVyICAgICAgICAgICAweDAwDQojZGVmaW5lIENTUl9MU0lPTl9CQiAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENTUl9PRkZTRVQgKiAzMikgKyAoTFNJT05fQml0TnVtYmVyICogNCkpDQoNCiNpZmRlZiBTVE0zMkYxMFhfQ0wNCi8qIC0tLSBDRkdSMiBSZWdpc3RlciAtLS0qLw0KDQogLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEkyUzJTUkMgYml0ICovDQogI2RlZmluZSBDRkdSMl9PRkZTRVQgICAgICAgICAgICAgIChSQ0NfT0ZGU0VUICsgMHgyQykNCiAjZGVmaW5lIEkyUzJTUkNfQml0TnVtYmVyICAgICAgICAgMHgxMQ0KICNkZWZpbmUgQ0ZHUjJfSTJTMlNSQ19CQiAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0ZHUjJfT0ZGU0VUICogMzIpICsgKEkyUzJTUkNfQml0TnVtYmVyICogNCkpDQoNCiAvKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgSTJTM1NSQyBiaXQgKi8NCiAjZGVmaW5lIEkyUzNTUkNfQml0TnVtYmVyICAgICAgICAgMHgxMg0KICNkZWZpbmUgQ0ZHUjJfSTJTM1NSQ19CQiAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ0ZHUjJfT0ZGU0VUICogMzIpICsgKEkyUzNTUkNfQml0TnVtYmVyICogNCkpDQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUkNDIHJlZ2lzdGVycyBiaXQgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyogQ1IgcmVnaXN0ZXIgYml0IG1hc2sgKi8NCiNkZWZpbmUgQ1JfSFNFQllQX1Jlc2V0ICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGQkZGRkYpDQojZGVmaW5lIENSX0hTRUJZUF9TZXQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwKQ0KI2RlZmluZSBDUl9IU0VPTl9SZXNldCAgICAgICAgICAgICgodWludDMyX3QpMHhGRkZFRkZGRikNCiNkZWZpbmUgQ1JfSFNFT05fU2V0ICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDApDQojZGVmaW5lIENSX0hTSVRSSU1fTWFzayAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRjA3KQ0KDQovKiBDRkdSIHJlZ2lzdGVyIGJpdCBtYXNrICovDQojaWYgZGVmaW5lZCAoU1RNMzJGMTBYX0xEX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfTURfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9IRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX0NMKSANCiAjZGVmaW5lIENGR1JfUExMX01hc2sgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZDMkZGRkYpDQojZWxzZQ0KICNkZWZpbmUgQ0ZHUl9QTExfTWFzayAgICAgICAgICAgICgodWludDMyX3QpMHhGRkMwRkZGRikNCiNlbmRpZiAvKiBTVE0zMkYxMFhfQ0wgKi8gDQoNCiNkZWZpbmUgQ0ZHUl9QTExNdWxsX01hc2sgICAgICAgICAoKHVpbnQzMl90KTB4MDAzQzAwMDApDQojZGVmaW5lIENGR1JfUExMU1JDX01hc2sgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDEwMDAwKQ0KI2RlZmluZSBDRkdSX1BMTFhUUFJFX01hc2sgICAgICAgICgodWludDMyX3QpMHgwMDAyMDAwMCkNCiNkZWZpbmUgQ0ZHUl9TV1NfTWFzayAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEMpDQojZGVmaW5lIENGR1JfU1dfTWFzayAgICAgICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRkZDKQ0KI2RlZmluZSBDRkdSX0hQUkVfUmVzZXRfTWFzayAgICAgICgodWludDMyX3QpMHhGRkZGRkYwRikNCiNkZWZpbmUgQ0ZHUl9IUFJFX1NldF9NYXNrICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRjApDQojZGVmaW5lIENGR1JfUFBSRTFfUmVzZXRfTWFzayAgICAgKCh1aW50MzJfdCkweEZGRkZGOEZGKQ0KI2RlZmluZSBDRkdSX1BQUkUxX1NldF9NYXNrICAgICAgICgodWludDMyX3QpMHgwMDAwMDcwMCkNCiNkZWZpbmUgQ0ZHUl9QUFJFMl9SZXNldF9NYXNrICAgICAoKHVpbnQzMl90KTB4RkZGRkM3RkYpDQojZGVmaW5lIENGR1JfUFBSRTJfU2V0X01hc2sgICAgICAgKCh1aW50MzJfdCkweDAwMDAzODAwKQ0KI2RlZmluZSBDRkdSX0FEQ1BSRV9SZXNldF9NYXNrICAgICgodWludDMyX3QpMHhGRkZGM0ZGRikNCiNkZWZpbmUgQ0ZHUl9BRENQUkVfU2V0X01hc2sgICAgICAoKHVpbnQzMl90KTB4MDAwMEMwMDApDQoNCi8qIENTUiByZWdpc3RlciBiaXQgbWFzayAqLw0KI2RlZmluZSBDU1JfUk1WRl9TZXQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMTAwMDAwMCkNCg0KI2lmIGRlZmluZWQgKFNUTTMyRjEwWF9MRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX01EX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9DTCkgDQovKiBDRkdSMiByZWdpc3RlciBiaXQgbWFzayAqLw0KICNkZWZpbmUgQ0ZHUjJfUFJFRElWMVNSQyAgICAgICAgICgodWludDMyX3QpMHgwMDAxMDAwMCkNCiAjZGVmaW5lIENGR1IyX1BSRURJVjEgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEYpDQojZW5kaWYNCiNpZmRlZiBTVE0zMkYxMFhfQ0wNCiAjZGVmaW5lIENGR1IyX1BSRURJVjIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwRjApDQogI2RlZmluZSBDRkdSMl9QTEwyTVVMICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwRjAwKQ0KICNkZWZpbmUgQ0ZHUjJfUExMM01VTCAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRjAwMCkNCiNlbmRpZiAvKiBTVE0zMkYxMFhfQ0wgKi8gDQoNCi8qIFJDQyBGbGFnIE1hc2sgKi8NCiNkZWZpbmUgRkxBR19NYXNrICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxRikNCg0KLyogQ0lSIHJlZ2lzdGVyIGJ5dGUgMiAoQml0c1sxNTo4XSkgYmFzZSBhZGRyZXNzICovDQojZGVmaW5lIENJUl9CWVRFMl9BRERSRVNTICAgICAgICAgKCh1aW50MzJfdCkweDQwMDIxMDA5KQ0KDQovKiBDSVIgcmVnaXN0ZXIgYnl0ZSAzIChCaXRzWzIzOjE2XSkgYmFzZSBhZGRyZXNzICovDQojZGVmaW5lIENJUl9CWVRFM19BRERSRVNTICAgICAgICAgKCh1aW50MzJfdCkweDQwMDIxMDBBKQ0KDQovKiBDRkdSIHJlZ2lzdGVyIGJ5dGUgNCAoQml0c1szMToyNF0pIGJhc2UgYWRkcmVzcyAqLw0KI2RlZmluZSBDRkdSX0JZVEU0X0FERFJFU1MgICAgICAgICgodWludDMyX3QpMHg0MDAyMTAwNykNCg0KLyogQkRDUiByZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8NCiNkZWZpbmUgQkRDUl9BRERSRVNTICAgICAgICAgICAgICAoUEVSSVBIX0JBU0UgKyBCRENSX09GRlNFVCkNCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8gDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovIA0KDQpzdGF0aWMgX19JIHVpbnQ4X3QgQVBCQUhCUHJlc2NUYWJsZVsxNl0gPSB7MCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgMSwgMiwgMywgNCwgNiwgNywgOCwgOX07DQpzdGF0aWMgX19JIHVpbnQ4X3QgQURDUHJlc2NUYWJsZVs0XSA9IHsyLCA0LCA2LCA4fTsNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgUmVzZXRzIHRoZSBSQ0MgY2xvY2sgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCByZXNldCBzdGF0ZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0RlSW5pdCh2b2lkKQ0Kew0KICAvKiBTZXQgSFNJT04gYml0ICovDQogIFJDQy0+Q1IgfD0gKHVpbnQzMl90KTB4MDAwMDAwMDE7DQoNCiAgLyogUmVzZXQgU1csIEhQUkUsIFBQUkUxLCBQUFJFMiwgQURDUFJFIGFuZCBNQ08gYml0cyAqLw0KI2lmbmRlZiBTVE0zMkYxMFhfQ0wNCiAgUkNDLT5DRkdSICY9ICh1aW50MzJfdCkweEY4RkYwMDAwOw0KI2Vsc2UNCiAgUkNDLT5DRkdSICY9ICh1aW50MzJfdCkweEYwRkYwMDAwOw0KI2VuZGlmIC8qIFNUTTMyRjEwWF9DTCAqLyAgIA0KICANCiAgLyogUmVzZXQgSFNFT04sIENTU09OIGFuZCBQTExPTiBiaXRzICovDQogIFJDQy0+Q1IgJj0gKHVpbnQzMl90KTB4RkVGNkZGRkY7DQoNCiAgLyogUmVzZXQgSFNFQllQIGJpdCAqLw0KICBSQ0MtPkNSICY9ICh1aW50MzJfdCkweEZGRkJGRkZGOw0KDQogIC8qIFJlc2V0IFBMTFNSQywgUExMWFRQUkUsIFBMTE1VTCBhbmQgVVNCUFJFL09UR0ZTUFJFIGJpdHMgKi8NCiAgUkNDLT5DRkdSICY9ICh1aW50MzJfdCkweEZGODBGRkZGOw0KDQojaWZkZWYgU1RNMzJGMTBYX0NMDQogIC8qIFJlc2V0IFBMTDJPTiBhbmQgUExMM09OIGJpdHMgKi8NCiAgUkNDLT5DUiAmPSAodWludDMyX3QpMHhFQkZGRkZGRjsNCg0KICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBjbGVhciBwZW5kaW5nIGJpdHMgICovDQogIFJDQy0+Q0lSID0gMHgwMEZGMDAwMDsNCg0KICAvKiBSZXNldCBDRkdSMiByZWdpc3RlciAqLw0KICBSQ0MtPkNGR1IyID0gMHgwMDAwMDAwMDsNCiNlbGlmIGRlZmluZWQgKFNUTTMyRjEwWF9MRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX01EX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpDQogIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIGNsZWFyIHBlbmRpbmcgYml0cyAgKi8NCiAgUkNDLT5DSVIgPSAweDAwOUYwMDAwOw0KDQogIC8qIFJlc2V0IENGR1IyIHJlZ2lzdGVyICovDQogIFJDQy0+Q0ZHUjIgPSAweDAwMDAwMDAwOyAgICAgIA0KI2Vsc2UNCiAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgY2xlYXIgcGVuZGluZyBiaXRzICAqLw0KICBSQ0MtPkNJUiA9IDB4MDA5RjAwMDA7DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovDQoNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkuDQogICogQG5vdGUgICBIU0UgY2FuIG5vdCBiZSBzdG9wcGVkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgUExMIGFzIHN5c3RlbSBjbG9jay4NCiAgKiBAcGFyYW0gIFJDQ19IU0U6IHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19IU0VfT0ZGOiBIU0Ugb3NjaWxsYXRvciBPRkYNCiAgKiAgICAgQGFyZyBSQ0NfSFNFX09OOiBIU0Ugb3NjaWxsYXRvciBPTg0KICAqICAgICBAYXJnIFJDQ19IU0VfQnlwYXNzOiBIU0Ugb3NjaWxsYXRvciBieXBhc3NlZCB3aXRoIGV4dGVybmFsIGNsb2NrDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19IU0VDb25maWcodWludDMyX3QgUkNDX0hTRSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0UoUkNDX0hTRSkpOw0KICAvKiBSZXNldCBIU0VPTiBhbmQgSFNFQllQIGJpdHMgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBIU0UgLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogUmVzZXQgSFNFT04gYml0ICovDQogIFJDQy0+Q1IgJj0gQ1JfSFNFT05fUmVzZXQ7DQogIC8qIFJlc2V0IEhTRUJZUCBiaXQgKi8NCiAgUkNDLT5DUiAmPSBDUl9IU0VCWVBfUmVzZXQ7DQogIC8qIENvbmZpZ3VyZSBIU0UgKFJDQ19IU0VfT0ZGIGlzIGFscmVhZHkgY292ZXJlZCBieSB0aGUgY29kZSBzZWN0aW9uIGFib3ZlKSAqLw0KICBzd2l0Y2goUkNDX0hTRSkNCiAgew0KICAgIGNhc2UgUkNDX0hTRV9PTjoNCiAgICAgIC8qIFNldCBIU0VPTiBiaXQgKi8NCiAgICAgIFJDQy0+Q1IgfD0gQ1JfSFNFT05fU2V0Ow0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIFJDQ19IU0VfQnlwYXNzOg0KICAgICAgLyogU2V0IEhTRUJZUCBhbmQgSFNFT04gYml0cyAqLw0KICAgICAgUkNDLT5DUiB8PSBDUl9IU0VCWVBfU2V0IHwgQ1JfSFNFT05fU2V0Ow0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBkZWZhdWx0Og0KICAgICAgYnJlYWs7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBXYWl0cyBmb3IgSFNFIHN0YXJ0LXVwLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bXVyYXRpb24gdmFsdWU6DQogICogLSBTVUNDRVNTOiBIU0Ugb3NjaWxsYXRvciBpcyBzdGFibGUgYW5kIHJlYWR5IHRvIHVzZQ0KICAqIC0gRVJST1I6IEhTRSBvc2NpbGxhdG9yIG5vdCB5ZXQgcmVhZHkNCiAgKi8NCkVycm9yU3RhdHVzIFJDQ19XYWl0Rm9ySFNFU3RhcnRVcCh2b2lkKQ0Kew0KICBfX0lPIHVpbnQzMl90IFN0YXJ0VXBDb3VudGVyID0gMDsNCiAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7DQogIEZsYWdTdGF0dXMgSFNFU3RhdHVzID0gUkVTRVQ7DQogIA0KICAvKiBXYWl0IHRpbGwgSFNFIGlzIHJlYWR5IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8NCiAgZG8NCiAgew0KICAgIEhTRVN0YXR1cyA9IFJDQ19HZXRGbGFnU3RhdHVzKFJDQ19GTEFHX0hTRVJEWSk7DQogICAgU3RhcnRVcENvdW50ZXIrKzsgIA0KICB9IHdoaWxlKChTdGFydFVwQ291bnRlciAhPSBIU0VfU1RBUlRVUF9USU1FT1VUKSAmJiAoSFNFU3RhdHVzID09IFJFU0VUKSk7DQogIA0KICBpZiAoUkNDX0dldEZsYWdTdGF0dXMoUkNDX0ZMQUdfSFNFUkRZKSAhPSBSRVNFVCkNCiAgew0KICAgIHN0YXR1cyA9IFNVQ0NFU1M7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgc3RhdHVzID0gRVJST1I7DQogIH0gIA0KICByZXR1cm4gKHN0YXR1cyk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLg0KICAqIEBwYXJhbSAgSFNJQ2FsaWJyYXRpb25WYWx1ZTogc3BlY2lmaWVzIHRoZSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAweDFGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQWRqdXN0SFNJQ2FsaWJyYXRpb25WYWx1ZSh1aW50OF90IEhTSUNhbGlicmF0aW9uVmFsdWUpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQ0FMSUJSQVRJT05fVkFMVUUoSFNJQ2FsaWJyYXRpb25WYWx1ZSkpOw0KICB0bXByZWcgPSBSQ0MtPkNSOw0KICAvKiBDbGVhciBIU0lUUklNWzQ6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gQ1JfSFNJVFJJTV9NYXNrOw0KICAvKiBTZXQgdGhlIEhTSVRSSU1bNDowXSBiaXRzIGFjY29yZGluZyB0byBIU0lDYWxpYnJhdGlvblZhbHVlIHZhbHVlICovDQogIHRtcHJlZyB8PSAodWludDMyX3QpSFNJQ2FsaWJyYXRpb25WYWx1ZSA8PCAzOw0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q1IgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLg0KICAqIEBub3RlICAgSFNJIGNhbiBub3QgYmUgc3RvcHBlZCBpZiBpdCBpcyB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIFBMTCBhcyBzeXN0ZW0gY2xvY2suDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBIU0kuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19IU0lDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAqKF9fSU8gdWludDMyX3QgKikgQ1JfSFNJT05fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgUExMIGNsb2NrIHNvdXJjZSBhbmQgbXVsdGlwbGljYXRpb24gZmFjdG9yLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTEwgaXMgZGlzYWJsZWQuDQogICogQHBhcmFtICBSQ0NfUExMU291cmNlOiBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuDQogICogICBGb3IgQGIgU1RNMzJfQ29ubmVjdGl2aXR5X2xpbmVfZGV2aWNlcyBvciBAYiBTVE0zMl9WYWx1ZV9saW5lX2RldmljZXMsIA0KICAqICAgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfUExMU291cmNlX0hTSV9EaXYyOiBIU0kgb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5DQogICogICAgIEBhcmcgUkNDX1BMTFNvdXJjZV9QUkVESVYxOiBQUkVESVYxIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQ0KICAqICAgRm9yIEBiIG90aGVyX1NUTTMyX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX1BMTFNvdXJjZV9IU0lfRGl2MjogSFNJIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQ0KICAqICAgICBAYXJnIFJDQ19QTExTb3VyY2VfSFNFX0RpdjE6IEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQ0KICAqICAgICBAYXJnIFJDQ19QTExTb3VyY2VfSFNFX0RpdjI6IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkgDQogICogQHBhcmFtICBSQ0NfUExMTXVsOiBzcGVjaWZpZXMgdGhlIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IuDQogICogICBGb3IgQGIgU1RNMzJfQ29ubmVjdGl2aXR5X2xpbmVfZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFJDQ19QTExNdWxfeCB3aGVyZSB4OntbNCw5XSwgNl81fQ0KICAqICAgRm9yIEBiIG90aGVyX1NUTTMyX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBSQ0NfUExMTXVsX3ggd2hlcmUgeDpbMiwxNl0gIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUExMQ29uZmlnKHVpbnQzMl90IFJDQ19QTExTb3VyY2UsIHVpbnQzMl90IFJDQ19QTExNdWwpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExfU09VUkNFKFJDQ19QTExTb3VyY2UpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExfTVVMKFJDQ19QTExNdWwpKTsNCg0KICB0bXByZWcgPSBSQ0MtPkNGR1I7DQogIC8qIENsZWFyIFBMTFNSQywgUExMWFRQUkUgYW5kIFBMTE1VTFszOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IENGR1JfUExMX01hc2s7DQogIC8qIFNldCB0aGUgUExMIGNvbmZpZ3VyYXRpb24gYml0cyAqLw0KICB0bXByZWcgfD0gUkNDX1BMTFNvdXJjZSB8IFJDQ19QTExNdWw7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBMTC4NCiAgKiBAbm90ZSAgIFRoZSBQTEwgY2FuIG5vdCBiZSBkaXNhYmxlZCBpZiBpdCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBMTC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BMTENtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIENSX1BMTE9OX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQojaWYgZGVmaW5lZCAoU1RNMzJGMTBYX0xEX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfTURfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9IRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX0NMKQ0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBQUkVESVYxIGRpdmlzaW9uIGZhY3Rvci4NCiAgKiBAbm90ZSANCiAgKiAgIC0gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTEwgaXMgZGlzYWJsZWQuDQogICogICAtIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIFNUTTMyIENvbm5lY3Rpdml0eSBsaW5lIGFuZCBWYWx1ZSBsaW5lIA0KICAqICAgICBkZXZpY2VzLg0KICAqIEBwYXJhbSAgUkNDX1BSRURJVjFfU291cmNlOiBzcGVjaWZpZXMgdGhlIFBSRURJVjEgY2xvY2sgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfUFJFRElWMV9Tb3VyY2VfSFNFOiBIU0Ugc2VsZWN0ZWQgYXMgUFJFRElWMSBjbG9jaw0KICAqICAgICBAYXJnIFJDQ19QUkVESVYxX1NvdXJjZV9QTEwyOiBQTEwyIHNlbGVjdGVkIGFzIFBSRURJVjEgY2xvY2sNCiAgKiBAbm90ZSANCiAgKiAgIEZvciBAYiBTVE0zMl9WYWx1ZV9saW5lX2RldmljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgYWx3YXlzIFJDQ19QUkVESVYxX1NvdXJjZV9IU0UgIA0KICAqIEBwYXJhbSAgUkNDX1BSRURJVjFfRGl2OiBzcGVjaWZpZXMgdGhlIFBSRURJVjEgY2xvY2sgZGl2aXNpb24gZmFjdG9yLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFJDQ19QUkVESVYxX0Rpdnggd2hlcmUgeDpbMSwxNl0NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BSRURJVjFDb25maWcodWludDMyX3QgUkNDX1BSRURJVjFfU291cmNlLCB1aW50MzJfdCBSQ0NfUFJFRElWMV9EaXYpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BSRURJVjFfU09VUkNFKFJDQ19QUkVESVYxX1NvdXJjZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BSRURJVjEoUkNDX1BSRURJVjFfRGl2KSk7DQoNCiAgdG1wcmVnID0gUkNDLT5DRkdSMjsNCiAgLyogQ2xlYXIgUFJFRElWMVszOjBdIGFuZCBQUkVESVYxU1JDIGJpdHMgKi8NCiAgdG1wcmVnICY9IH4oQ0ZHUjJfUFJFRElWMSB8IENGR1IyX1BSRURJVjFTUkMpOw0KICAvKiBTZXQgdGhlIFBSRURJVjEgY2xvY2sgc291cmNlIGFuZCBkaXZpc2lvbiBmYWN0b3IgKi8NCiAgdG1wcmVnIHw9IFJDQ19QUkVESVYxX1NvdXJjZSB8IFJDQ19QUkVESVYxX0RpdiA7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSMiA9IHRtcHJlZzsNCn0NCiNlbmRpZg0KDQojaWZkZWYgU1RNMzJGMTBYX0NMDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFBSRURJVjIgZGl2aXNpb24gZmFjdG9yLg0KICAqIEBub3RlIA0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gYm90aCBQTEwyIGFuZCBQTEwzIGFyZSBkaXNhYmxlZC4NCiAgKiAgIC0gVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gU1RNMzIgQ29ubmVjdGl2aXR5IGxpbmUgZGV2aWNlcy4NCiAgKiBAcGFyYW0gIFJDQ19QUkVESVYyX0Rpdjogc3BlY2lmaWVzIHRoZSBQUkVESVYyIGNsb2NrIGRpdmlzaW9uIGZhY3Rvci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBSQ0NfUFJFRElWMl9EaXZ4IHdoZXJlIHg6WzEsMTZdDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19QUkVESVYyQ29uZmlnKHVpbnQzMl90IFJDQ19QUkVESVYyX0RpdikNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BSRURJVjIoUkNDX1BSRURJVjJfRGl2KSk7DQoNCiAgdG1wcmVnID0gUkNDLT5DRkdSMjsNCiAgLyogQ2xlYXIgUFJFRElWMlszOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IH5DRkdSMl9QUkVESVYyOw0KICAvKiBTZXQgdGhlIFBSRURJVjIgZGl2aXNpb24gZmFjdG9yICovDQogIHRtcHJlZyB8PSBSQ0NfUFJFRElWMl9EaXY7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSMiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBQTEwyIG11bHRpcGxpY2F0aW9uIGZhY3Rvci4NCiAgKiBAbm90ZQ0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIFBMTDIgaXMgZGlzYWJsZWQuDQogICogICAtIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIFNUTTMyIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXMuDQogICogQHBhcmFtICBSQ0NfUExMMk11bDogc3BlY2lmaWVzIHRoZSBQTEwyIG11bHRpcGxpY2F0aW9uIGZhY3Rvci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBSQ0NfUExMMk11bF94IHdoZXJlIHg6e1s4LDE0XSwgMTYsIDIwfQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUExMMkNvbmZpZyh1aW50MzJfdCBSQ0NfUExMMk11bCkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTDJfTVVMKFJDQ19QTEwyTXVsKSk7DQoNCiAgdG1wcmVnID0gUkNDLT5DRkdSMjsNCiAgLyogQ2xlYXIgUExMMk11bFszOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IH5DRkdSMl9QTEwyTVVMOw0KICAvKiBTZXQgdGhlIFBMTDIgY29uZmlndXJhdGlvbiBiaXRzICovDQogIHRtcHJlZyB8PSBSQ0NfUExMMk11bDsNCiAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLw0KICBSQ0MtPkNGR1IyID0gdG1wcmVnOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUExMMi4NCiAgKiBAbm90ZSANCiAgKiAgIC0gVGhlIFBMTDIgY2FuIG5vdCBiZSBkaXNhYmxlZCBpZiBpdCBpcyB1c2VkIGluZGlyZWN0bHkgYXMgc3lzdGVtIGNsb2NrDQogICogICAgIChpLmUuIGl0IGlzIHVzZWQgYXMgUExMIGNsb2NrIGVudHJ5IHRoYXQgaXMgdXNlZCBhcyBTeXN0ZW0gY2xvY2spLg0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUExMMi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BMTDJDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogICooX19JTyB1aW50MzJfdCAqKSBDUl9QTEwyT05fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBQTEwzIG11bHRpcGxpY2F0aW9uIGZhY3Rvci4NCiAgKiBAbm90ZSANCiAgKiAgIC0gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTEwzIGlzIGRpc2FibGVkLg0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgUkNDX1BMTDNNdWw6IHNwZWNpZmllcyB0aGUgUExMMyBtdWx0aXBsaWNhdGlvbiBmYWN0b3IuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgUkNDX1BMTDNNdWxfeCB3aGVyZSB4OntbOCwxNF0sIDE2LCAyMH0NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BMTDNDb25maWcodWludDMyX3QgUkNDX1BMTDNNdWwpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTEwzX01VTChSQ0NfUExMM011bCkpOw0KDQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjI7DQogIC8qIENsZWFyIFBMTDNNdWxbMzowXSBiaXRzICovDQogIHRtcHJlZyAmPSB+Q0ZHUjJfUExMM01VTDsNCiAgLyogU2V0IHRoZSBQTEwzIGNvbmZpZ3VyYXRpb24gYml0cyAqLw0KICB0bXByZWcgfD0gUkNDX1BMTDNNdWw7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSMiA9IHRtcHJlZzsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBMTDMuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUExMMy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BMTDNDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogICooX19JTyB1aW50MzJfdCAqKSBDUl9QTEwzT05fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgc3lzdGVtIGNsb2NrIChTWVNDTEspLg0KICAqIEBwYXJhbSAgUkNDX1NZU0NMS1NvdXJjZTogc3BlY2lmaWVzIHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19TWVNDTEtTb3VyY2VfSFNJOiBIU0kgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrDQogICogICAgIEBhcmcgUkNDX1NZU0NMS1NvdXJjZV9IU0U6IEhTRSBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sNCiAgKiAgICAgQGFyZyBSQ0NfU1lTQ0xLU291cmNlX1BMTENMSzogUExMIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfU1lTQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19TWVNDTEtTb3VyY2UpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfU1lTQ0xLX1NPVVJDRShSQ0NfU1lTQ0xLU291cmNlKSk7DQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCiAgLyogQ2xlYXIgU1dbMTowXSBiaXRzICovDQogIHRtcHJlZyAmPSBDRkdSX1NXX01hc2s7DQogIC8qIFNldCBTV1sxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFJDQ19TWVNDTEtTb3VyY2UgdmFsdWUgKi8NCiAgdG1wcmVnIHw9IFJDQ19TWVNDTEtTb3VyY2U7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGNsb2NrIHNvdXJjZSB1c2VkIGFzIHN5c3RlbSBjbG9jay4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4NCiAgKiAgIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KICAqICAgICAtIDB4MDA6IEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqICAgICAtIDB4MDQ6IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqICAgICAtIDB4MDg6IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jaw0KICAqLw0KdWludDhfdCBSQ0NfR2V0U1lTQ0xLU291cmNlKHZvaWQpDQp7DQogIHJldHVybiAoKHVpbnQ4X3QpKFJDQy0+Q0ZHUiAmIENGR1JfU1dTX01hc2spKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBBSEIgY2xvY2sgKEhDTEspLg0KICAqIEBwYXJhbSAgUkNDX1NZU0NMSzogZGVmaW5lcyB0aGUgQUhCIGNsb2NrIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIA0KICAqICAgdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX1NZU0NMS19EaXYxOiBBSEIgY2xvY2sgPSBTWVNDTEsNCiAgKiAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjI6IEFIQiBjbG9jayA9IFNZU0NMSy8yDQogICogICAgIEBhcmcgUkNDX1NZU0NMS19EaXY0OiBBSEIgY2xvY2sgPSBTWVNDTEsvNA0KICAqICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2ODogQUhCIGNsb2NrID0gU1lTQ0xLLzgNCiAgKiAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjE2OiBBSEIgY2xvY2sgPSBTWVNDTEsvMTYNCiAgKiAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjY0OiBBSEIgY2xvY2sgPSBTWVNDTEsvNjQNCiAgKiAgICAgQGFyZyBSQ0NfU1lTQ0xLX0RpdjEyODogQUhCIGNsb2NrID0gU1lTQ0xLLzEyOA0KICAqICAgICBAYXJnIFJDQ19TWVNDTEtfRGl2MjU2OiBBSEIgY2xvY2sgPSBTWVNDTEsvMjU2DQogICogICAgIEBhcmcgUkNDX1NZU0NMS19EaXY1MTI6IEFIQiBjbG9jayA9IFNZU0NMSy81MTINCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0hDTEtDb25maWcodWludDMyX3QgUkNDX1NZU0NMSykNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IQ0xLKFJDQ19TWVNDTEspKTsNCiAgdG1wcmVnID0gUkNDLT5DRkdSOw0KICAvKiBDbGVhciBIUFJFWzM6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gQ0ZHUl9IUFJFX1Jlc2V0X01hc2s7DQogIC8qIFNldCBIUFJFWzM6MF0gYml0cyBhY2NvcmRpbmcgdG8gUkNDX1NZU0NMSyB2YWx1ZSAqLw0KICB0bXByZWcgfD0gUkNDX1NZU0NMSzsNCiAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLw0KICBSQ0MtPkNGR1IgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgTG93IFNwZWVkIEFQQiBjbG9jayAoUENMSzEpLg0KICAqIEBwYXJhbSAgUkNDX0hDTEs6IGRlZmluZXMgdGhlIEFQQjEgY2xvY2sgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gDQogICogICB0aGUgQUhCIGNsb2NrIChIQ0xLKS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX0hDTEtfRGl2MTogQVBCMSBjbG9jayA9IEhDTEsNCiAgKiAgICAgQGFyZyBSQ0NfSENMS19EaXYyOiBBUEIxIGNsb2NrID0gSENMSy8yDQogICogICAgIEBhcmcgUkNDX0hDTEtfRGl2NDogQVBCMSBjbG9jayA9IEhDTEsvNA0KICAqICAgICBAYXJnIFJDQ19IQ0xLX0Rpdjg6IEFQQjEgY2xvY2sgPSBIQ0xLLzgNCiAgKiAgICAgQGFyZyBSQ0NfSENMS19EaXYxNjogQVBCMSBjbG9jayA9IEhDTEsvMTYNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BDTEsxQ29uZmlnKHVpbnQzMl90IFJDQ19IQ0xLKQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0hDTEspKTsNCiAgdG1wcmVnID0gUkNDLT5DRkdSOw0KICAvKiBDbGVhciBQUFJFMVsyOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IENGR1JfUFBSRTFfUmVzZXRfTWFzazsNCiAgLyogU2V0IFBQUkUxWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUkNDX0hDTEsgdmFsdWUgKi8NCiAgdG1wcmVnIHw9IFJDQ19IQ0xLOw0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q0ZHUiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBIaWdoIFNwZWVkIEFQQiBjbG9jayAoUENMSzIpLg0KICAqIEBwYXJhbSAgUkNDX0hDTEs6IGRlZmluZXMgdGhlIEFQQjIgY2xvY2sgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gDQogICogICB0aGUgQUhCIGNsb2NrIChIQ0xLKS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX0hDTEtfRGl2MTogQVBCMiBjbG9jayA9IEhDTEsNCiAgKiAgICAgQGFyZyBSQ0NfSENMS19EaXYyOiBBUEIyIGNsb2NrID0gSENMSy8yDQogICogICAgIEBhcmcgUkNDX0hDTEtfRGl2NDogQVBCMiBjbG9jayA9IEhDTEsvNA0KICAqICAgICBAYXJnIFJDQ19IQ0xLX0Rpdjg6IEFQQjIgY2xvY2sgPSBIQ0xLLzgNCiAgKiAgICAgQGFyZyBSQ0NfSENMS19EaXYxNjogQVBCMiBjbG9jayA9IEhDTEsvMTYNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX1BDTEsyQ29uZmlnKHVpbnQzMl90IFJDQ19IQ0xLKQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BDTEsoUkNDX0hDTEspKTsNCiAgdG1wcmVnID0gUkNDLT5DRkdSOw0KICAvKiBDbGVhciBQUFJFMlsyOjBdIGJpdHMgKi8NCiAgdG1wcmVnICY9IENGR1JfUFBSRTJfUmVzZXRfTWFzazsNCiAgLyogU2V0IFBQUkUyWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUkNDX0hDTEsgdmFsdWUgKi8NCiAgdG1wcmVnIHw9IFJDQ19IQ0xLIDw8IDM7DQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgUkNDLT5DRkdSID0gdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBSQ0MgaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIFJDQ19JVDogc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiAgKiANCiAgKiAgIEZvciBAYiBTVE0zMl9Db25uZWN0aXZpdHlfbGluZV9kZXZpY2VzLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uDQogICogICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAgICAgICAgDQogICogICAgIEBhcmcgUkNDX0lUX0xTSVJEWTogTFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9MU0VSRFk6IExTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfSFNJUkRZOiBIU0kgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTRVJEWTogSFNFIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9QTExSRFk6IFBMTCByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMMlJEWTogUExMMiByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMM1JEWTogUExMMyByZWFkeSBpbnRlcnJ1cHQNCiAgKiANCiAgKiAgIEZvciBAYiBvdGhlcl9TVE0zMl9kZXZpY2VzLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSANCiAgKiAgIGZvbGxvd2luZyB2YWx1ZXMgICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19JVF9MU0lSRFk6IExTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTSVJEWTogSFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9IU0VSRFk6IEhTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBQTEwgcmVhZHkgaW50ZXJydXB0DQogICogICAgICAgDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgUkNDIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfSVRDb25maWcodWludDhfdCBSQ0NfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JVChSQ0NfSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBQZXJmb3JtIEJ5dGUgYWNjZXNzIHRvIFJDQ19DSVIgYml0cyB0byBlbmFibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8NCiAgICAqKF9fSU8gdWludDhfdCAqKSBDSVJfQllURTJfQUREUkVTUyB8PSBSQ0NfSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUGVyZm9ybSBCeXRlIGFjY2VzcyB0byBSQ0NfQ0lSIGJpdHMgdG8gZGlzYWJsZSB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyAqLw0KICAgICooX19JTyB1aW50OF90ICopIENJUl9CWVRFMl9BRERSRVNTICY9ICh1aW50OF90KX5SQ0NfSVQ7DQogIH0NCn0NCg0KI2lmbmRlZiBTVE0zMkYxMFhfQ0wNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVVNCIGNsb2NrIChVU0JDTEspLg0KICAqIEBwYXJhbSAgUkNDX1VTQkNMS1NvdXJjZTogc3BlY2lmaWVzIHRoZSBVU0IgY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzIA0KICAqICAgZGVyaXZlZCBmcm9tIHRoZSBQTEwgb3V0cHV0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfVVNCQ0xLU291cmNlX1BMTENMS18xRGl2NTogUExMIGNsb2NrIGRpdmlkZWQgYnkgMSw1IHNlbGVjdGVkIGFzIFVTQiANCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBzb3VyY2UNCiAgKiAgICAgQGFyZyBSQ0NfVVNCQ0xLU291cmNlX1BMTENMS19EaXYxOiBQTEwgY2xvY2sgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrIHNvdXJjZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfVVNCQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19VU0JDTEtTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfVVNCQ0xLX1NPVVJDRShSQ0NfVVNCQ0xLU291cmNlKSk7DQoNCiAgKihfX0lPIHVpbnQzMl90ICopIENGR1JfVVNCUFJFX0JCID0gUkNDX1VTQkNMS1NvdXJjZTsNCn0NCiNlbHNlDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFVTQiBPVEcgRlMgY2xvY2sgKE9UR0ZTQ0xLKS4NCiAgKiAgIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmx5IHRvIFNUTTMyIENvbm5lY3Rpdml0eSBsaW5lIGRldmljZXMuDQogICogQHBhcmFtICBSQ0NfT1RHRlNDTEtTb3VyY2U6IHNwZWNpZmllcyB0aGUgVVNCIE9URyBGUyBjbG9jayBzb3VyY2UuDQogICogICBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgUExMIG91dHB1dC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgIFJDQ19PVEdGU0NMS1NvdXJjZV9QTExWQ09fRGl2MzogUExMIFZDTyBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgVVNCIE9URyBGUyBjbG9jayBzb3VyY2UNCiAgKiAgICAgQGFyZyAgUkNDX09UR0ZTQ0xLU291cmNlX1BMTFZDT19EaXYyOiBQTEwgVkNPIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBVU0IgT1RHIEZTIGNsb2NrIHNvdXJjZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfT1RHRlNDTEtDb25maWcodWludDMyX3QgUkNDX09UR0ZTQ0xLU291cmNlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX09UR0ZTQ0xLX1NPVVJDRShSQ0NfT1RHRlNDTEtTb3VyY2UpKTsNCg0KICAqKF9fSU8gdWludDMyX3QgKikgQ0ZHUl9PVEdGU1BSRV9CQiA9IFJDQ19PVEdGU0NMS1NvdXJjZTsNCn0NCiNlbmRpZiAvKiBTVE0zMkYxMFhfQ0wgKi8gDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgQURDIGNsb2NrIChBRENDTEspLg0KICAqIEBwYXJhbSAgUkNDX1BDTEsyOiBkZWZpbmVzIHRoZSBBREMgY2xvY2sgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gDQogICogICB0aGUgQVBCMiBjbG9jayAoUENMSzIpLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfUENMSzJfRGl2MjogQURDIGNsb2NrID0gUENMSzIvMg0KICAqICAgICBAYXJnIFJDQ19QQ0xLMl9EaXY0OiBBREMgY2xvY2sgPSBQQ0xLMi80DQogICogICAgIEBhcmcgUkNDX1BDTEsyX0RpdjY6IEFEQyBjbG9jayA9IFBDTEsyLzYNCiAgKiAgICAgQGFyZyBSQ0NfUENMSzJfRGl2ODogQURDIGNsb2NrID0gUENMSzIvOA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQURDQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19QQ0xLMikNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BRENDTEsoUkNDX1BDTEsyKSk7DQogIHRtcHJlZyA9IFJDQy0+Q0ZHUjsNCiAgLyogQ2xlYXIgQURDUFJFWzE6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gQ0ZHUl9BRENQUkVfUmVzZXRfTWFzazsNCiAgLyogU2V0IEFEQ1BSRVsxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFJDQ19QQ0xLMiB2YWx1ZSAqLw0KICB0bXByZWcgfD0gUkNDX1BDTEsyOw0KICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovDQogIFJDQy0+Q0ZHUiA9IHRtcHJlZzsNCn0NCg0KI2lmZGVmIFNUTTMyRjEwWF9DTA0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBJMlMyIGNsb2NrIHNvdXJjZShJMlMyQ0xLKS4NCiAgKiBAbm90ZQ0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyBJMlMyIEFQQiBjbG9jay4NCiAgKiAgIC0gVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gU1RNMzIgQ29ubmVjdGl2aXR5IGxpbmUgZGV2aWNlcy4NCiAgKiBAcGFyYW0gIFJDQ19JMlMyQ0xLU291cmNlOiBzcGVjaWZpZXMgdGhlIEkyUzIgY2xvY2sgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfSTJTMkNMS1NvdXJjZV9TWVNDTEs6IHN5c3RlbSBjbG9jayBzZWxlY3RlZCBhcyBJMlMyIGNsb2NrIGVudHJ5DQogICogICAgIEBhcmcgUkNDX0kyUzJDTEtTb3VyY2VfUExMM19WQ086IFBMTDMgVkNPIGNsb2NrIHNlbGVjdGVkIGFzIEkyUzIgY2xvY2sgZW50cnkNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0kyUzJDTEtDb25maWcodWludDMyX3QgUkNDX0kyUzJDTEtTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfSTJTMkNMS19TT1VSQ0UoUkNDX0kyUzJDTEtTb3VyY2UpKTsNCg0KICAqKF9fSU8gdWludDMyX3QgKikgQ0ZHUjJfSTJTMlNSQ19CQiA9IFJDQ19JMlMyQ0xLU291cmNlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEkyUzMgY2xvY2sgc291cmNlKEkyUzJDTEspLg0KICAqIEBub3RlDQogICogICAtIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVuYWJsaW5nIEkyUzMgQVBCIGNsb2NrLg0KICAqICAgLSBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgb25seSB0byBTVE0zMiBDb25uZWN0aXZpdHkgbGluZSBkZXZpY2VzLg0KICAqIEBwYXJhbSAgUkNDX0kyUzNDTEtTb3VyY2U6IHNwZWNpZmllcyB0aGUgSTJTMyBjbG9jayBzb3VyY2UuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19JMlMzQ0xLU291cmNlX1NZU0NMSzogc3lzdGVtIGNsb2NrIHNlbGVjdGVkIGFzIEkyUzMgY2xvY2sgZW50cnkNCiAgKiAgICAgQGFyZyBSQ0NfSTJTM0NMS1NvdXJjZV9QTEwzX1ZDTzogUExMMyBWQ08gY2xvY2sgc2VsZWN0ZWQgYXMgSTJTMyBjbG9jayBlbnRyeQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfSTJTM0NMS0NvbmZpZyh1aW50MzJfdCBSQ0NfSTJTM0NMS1NvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMlMzQ0xLX1NPVVJDRShSQ0NfSTJTM0NMS1NvdXJjZSkpOw0KDQogICooX19JTyB1aW50MzJfdCAqKSBDRkdSMl9JMlMzU1JDX0JCID0gUkNDX0kyUzNDTEtTb3VyY2U7DQp9DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkuDQogICogQHBhcmFtICBSQ0NfTFNFOiBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfTFNFX09GRjogTFNFIG9zY2lsbGF0b3IgT0ZGDQogICogICAgIEBhcmcgUkNDX0xTRV9PTjogTFNFIG9zY2lsbGF0b3IgT04NCiAgKiAgICAgQGFyZyBSQ0NfTFNFX0J5cGFzczogTFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfTFNFQ29uZmlnKHVpbnQ4X3QgUkNDX0xTRSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0UoUkNDX0xTRSkpOw0KICAvKiBSZXNldCBMU0VPTiBhbmQgTFNFQllQIGJpdHMgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBMU0UgLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogUmVzZXQgTFNFT04gYml0ICovDQogICooX19JTyB1aW50OF90ICopIEJEQ1JfQUREUkVTUyA9IFJDQ19MU0VfT0ZGOw0KICAvKiBSZXNldCBMU0VCWVAgYml0ICovDQogICooX19JTyB1aW50OF90ICopIEJEQ1JfQUREUkVTUyA9IFJDQ19MU0VfT0ZGOw0KICAvKiBDb25maWd1cmUgTFNFIChSQ0NfTFNFX09GRiBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGNvZGUgc2VjdGlvbiBhYm92ZSkgKi8NCiAgc3dpdGNoKFJDQ19MU0UpDQogIHsNCiAgICBjYXNlIFJDQ19MU0VfT046DQogICAgICAvKiBTZXQgTFNFT04gYml0ICovDQogICAgICAqKF9fSU8gdWludDhfdCAqKSBCRENSX0FERFJFU1MgPSBSQ0NfTFNFX09OOw0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIFJDQ19MU0VfQnlwYXNzOg0KICAgICAgLyogU2V0IExTRUJZUCBhbmQgTFNFT04gYml0cyAqLw0KICAgICAgKihfX0lPIHVpbnQ4X3QgKikgQkRDUl9BRERSRVNTID0gUkNDX0xTRV9CeXBhc3MgfCBSQ0NfTFNFX09OOw0KICAgICAgYnJlYWs7ICAgICAgICAgICAgDQogICAgICANCiAgICBkZWZhdWx0Og0KICAgICAgYnJlYWs7ICAgICAgDQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJKS4NCiAgKiBAbm90ZSAgIExTSSBjYW4gbm90IGJlIGRpc2FibGVkIGlmIHRoZSBJV0RHIGlzIHJ1bm5pbmcuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBMU0kuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19MU0lDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAqKF9fSU8gdWludDMyX3QgKikgQ1NSX0xTSU9OX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFJUQyBjbG9jayAoUlRDQ0xLKS4NCiAgKiBAbm90ZSAgIE9uY2UgdGhlIFJUQyBjbG9jayBpcyBzZWxlY3RlZCBpdCBjYW6SdCBiZSBjaGFuZ2VkIHVubGVzcyB0aGUgQmFja3VwIGRvbWFpbiBpcyByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19SVENDTEtTb3VyY2U6IHNwZWNpZmllcyB0aGUgUlRDIGNsb2NrIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX1JUQ0NMS1NvdXJjZV9MU0U6IExTRSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sNCiAgKiAgICAgQGFyZyBSQ0NfUlRDQ0xLU291cmNlX0xTSTogTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jaw0KICAqICAgICBAYXJnIFJDQ19SVENDTEtTb3VyY2VfSFNFX0RpdjEyODogSFNFIGNsb2NrIGRpdmlkZWQgYnkgMTI4IHNlbGVjdGVkIGFzIFJUQyBjbG9jaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUlRDQ0xLQ29uZmlnKHVpbnQzMl90IFJDQ19SVENDTEtTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfUlRDQ0xLX1NPVVJDRShSQ0NfUlRDQ0xLU291cmNlKSk7DQogIC8qIFNlbGVjdCB0aGUgUlRDIGNsb2NrIHNvdXJjZSAqLw0KICBSQ0MtPkJEQ1IgfD0gUkNDX1JUQ0NMS1NvdXJjZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBSVEMgY2xvY2suDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBSVEMgY2xvY2sgd2FzIHNlbGVjdGVkIHVzaW5nIHRoZSBSQ0NfUlRDQ0xLQ29uZmlnIGZ1bmN0aW9uLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUlRDIGNsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfUlRDQ0xLQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgKihfX0lPIHVpbnQzMl90ICopIEJEQ1JfUlRDRU5fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyB0aGUgZnJlcXVlbmNpZXMgb2YgZGlmZmVyZW50IG9uIGNoaXAgY2xvY2tzLg0KICAqIEBwYXJhbSAgUkNDX0Nsb2NrczogcG9pbnRlciB0byBhIFJDQ19DbG9ja3NUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGhvbGQNCiAgKiAgICAgICAgIHRoZSBjbG9ja3MgZnJlcXVlbmNpZXMuDQogICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgbm90IGNvcnJlY3Qgd2hlbiB1c2luZyANCiAgKiAgICAgICAgIGZyYWN0aW9uYWwgdmFsdWUgZm9yIEhTRSBjcnlzdGFsLiAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19HZXRDbG9ja3NGcmVxKFJDQ19DbG9ja3NUeXBlRGVmKiBSQ0NfQ2xvY2tzKQ0Kew0KICB1aW50MzJfdCB0bXAgPSAwLCBwbGxtdWxsID0gMCwgcGxsc291cmNlID0gMCwgcHJlc2MgPSAwOw0KDQojaWZkZWYgIFNUTTMyRjEwWF9DTA0KICB1aW50MzJfdCBwcmVkaXYxc291cmNlID0gMCwgcHJlZGl2MWZhY3RvciA9IDAsIHByZWRpdjJmYWN0b3IgPSAwLCBwbGwybXVsbCA9IDA7DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovDQoNCiNpZiBkZWZpbmVkIChTVE0zMkYxMFhfTERfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9NRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX0hEX1ZMKQ0KICB1aW50MzJfdCBwcmVkaXYxZmFjdG9yID0gMDsNCiNlbmRpZg0KICAgIA0KICAvKiBHZXQgU1lTQ0xLIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgdG1wID0gUkNDLT5DRkdSICYgQ0ZHUl9TV1NfTWFzazsNCiAgDQogIHN3aXRjaCAodG1wKQ0KICB7DQogICAgY2FzZSAweDAwOiAgLyogSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovDQogICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gSFNJX1ZBTFVFOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAweDA0OiAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovDQogICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gSFNFX1ZBTFVFOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAweDA4OiAgLyogUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovDQoNCiAgICAgIC8qIEdldCBQTEwgY2xvY2sgc291cmNlIGFuZCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgICBwbGxtdWxsID0gUkNDLT5DRkdSICYgQ0ZHUl9QTExNdWxsX01hc2s7DQogICAgICBwbGxzb3VyY2UgPSBSQ0MtPkNGR1IgJiBDRkdSX1BMTFNSQ19NYXNrOw0KICAgICAgDQojaWZuZGVmIFNUTTMyRjEwWF9DTCAgICAgIA0KICAgICAgcGxsbXVsbCA9ICggcGxsbXVsbCA+PiAxOCkgKyAyOw0KICAgICAgDQogICAgICBpZiAocGxsc291cmNlID09IDB4MDApDQogICAgICB7LyogSFNJIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAyIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeSAqLw0KICAgICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gKEhTSV9WQUxVRSA+PiAxKSAqIHBsbG11bGw7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogI2lmIGRlZmluZWQgKFNUTTMyRjEwWF9MRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX01EX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpDQogICAgICAgcHJlZGl2MWZhY3RvciA9IChSQ0MtPkNGR1IyICYgQ0ZHUjJfUFJFRElWMSkgKyAxOw0KICAgICAgIC8qIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBSRURJVjEgY2xvY2sgZW50cnkgKi8NCiAgICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gKEhTRV9WQUxVRSAvIHByZWRpdjFmYWN0b3IpICogcGxsbXVsbDsgDQogI2Vsc2UNCiAgICAgICAgLyogSFNFIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeSAqLw0KICAgICAgICBpZiAoKFJDQy0+Q0ZHUiAmIENGR1JfUExMWFRQUkVfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgICAgICB7LyogSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAyICovDQogICAgICAgICAgUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSA9IChIU0VfVkFMVUUgPj4gMSkgKiBwbGxtdWxsOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSBIU0VfVkFMVUUgKiBwbGxtdWxsOw0KICAgICAgICB9DQogI2VuZGlmDQogICAgICB9DQojZWxzZQ0KICAgICAgcGxsbXVsbCA9IHBsbG11bGwgPj4gMTg7DQogICAgICANCiAgICAgIGlmIChwbGxtdWxsICE9IDB4MEQpDQogICAgICB7DQogICAgICAgICBwbGxtdWxsICs9IDI7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7IC8qIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgPSBQTEwgaW5wdXQgY2xvY2sgKiA2LjUgKi8NCiAgICAgICAgcGxsbXVsbCA9IDEzIC8gMjsgDQogICAgICB9DQogICAgICAgICAgICANCiAgICAgIGlmIChwbGxzb3VyY2UgPT0gMHgwMCkNCiAgICAgIHsvKiBIU0kgb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5ICovDQogICAgICAgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSAoSFNJX1ZBTFVFID4+IDEpICogcGxsbXVsbDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsvKiBQUkVESVYxIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeSAqLw0KICAgICAgICANCiAgICAgICAgLyogR2V0IFBSRURJVjEgY2xvY2sgc291cmNlIGFuZCBkaXZpc2lvbiBmYWN0b3IgKi8NCiAgICAgICAgcHJlZGl2MXNvdXJjZSA9IFJDQy0+Q0ZHUjIgJiBDRkdSMl9QUkVESVYxU1JDOw0KICAgICAgICBwcmVkaXYxZmFjdG9yID0gKFJDQy0+Q0ZHUjIgJiBDRkdSMl9QUkVESVYxKSArIDE7DQogICAgICAgIA0KICAgICAgICBpZiAocHJlZGl2MXNvdXJjZSA9PSAwKQ0KICAgICAgICB7IC8qIEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBSRURJVjEgY2xvY2sgZW50cnkgKi8NCiAgICAgICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gKEhTRV9WQUxVRSAvIHByZWRpdjFmYWN0b3IpICogcGxsbXVsbDsgICAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7LyogUExMMiBjbG9jayBzZWxlY3RlZCBhcyBQUkVESVYxIGNsb2NrIGVudHJ5ICovDQogICAgICAgICAgDQogICAgICAgICAgLyogR2V0IFBSRURJVjIgZGl2aXNpb24gZmFjdG9yIGFuZCBQTEwyIG11bHRpcGxpY2F0aW9uIGZhY3RvciAqLw0KICAgICAgICAgIHByZWRpdjJmYWN0b3IgPSAoKFJDQy0+Q0ZHUjIgJiBDRkdSMl9QUkVESVYyKSA+PiA0KSArIDE7DQogICAgICAgICAgcGxsMm11bGwgPSAoKFJDQy0+Q0ZHUjIgJiBDRkdSMl9QTEwyTVVMKSA+PiA4ICkgKyAyOyANCiAgICAgICAgICBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID0gKCgoSFNFX1ZBTFVFIC8gcHJlZGl2MmZhY3RvcikgKiBwbGwybXVsbCkgLyBwcmVkaXYxZmFjdG9yKSAqIHBsbG11bGw7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgICB9DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovIA0KICAgICAgYnJlYWs7DQoNCiAgICBkZWZhdWx0Og0KICAgICAgUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsNCiAgICAgIGJyZWFrOw0KICB9DQoNCiAgLyogQ29tcHV0ZSBIQ0xLLCBQQ0xLMSwgUENMSzIgYW5kIEFEQ0NMSyBjbG9ja3MgZnJlcXVlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCBIQ0xLIHByZXNjYWxlciAqLw0KICB0bXAgPSBSQ0MtPkNGR1IgJiBDRkdSX0hQUkVfU2V0X01hc2s7DQogIHRtcCA9IHRtcCA+PiA0Ow0KICBwcmVzYyA9IEFQQkFIQlByZXNjVGFibGVbdG1wXTsNCiAgLyogSENMSyBjbG9jayBmcmVxdWVuY3kgKi8NCiAgUkNDX0Nsb2Nrcy0+SENMS19GcmVxdWVuY3kgPSBSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5ID4+IHByZXNjOw0KICAvKiBHZXQgUENMSzEgcHJlc2NhbGVyICovDQogIHRtcCA9IFJDQy0+Q0ZHUiAmIENGR1JfUFBSRTFfU2V0X01hc2s7DQogIHRtcCA9IHRtcCA+PiA4Ow0KICBwcmVzYyA9IEFQQkFIQlByZXNjVGFibGVbdG1wXTsNCiAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovDQogIFJDQ19DbG9ja3MtPlBDTEsxX0ZyZXF1ZW5jeSA9IFJDQ19DbG9ja3MtPkhDTEtfRnJlcXVlbmN5ID4+IHByZXNjOw0KICAvKiBHZXQgUENMSzIgcHJlc2NhbGVyICovDQogIHRtcCA9IFJDQy0+Q0ZHUiAmIENGR1JfUFBSRTJfU2V0X01hc2s7DQogIHRtcCA9IHRtcCA+PiAxMTsNCiAgcHJlc2MgPSBBUEJBSEJQcmVzY1RhYmxlW3RtcF07DQogIC8qIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLw0KICBSQ0NfQ2xvY2tzLT5QQ0xLMl9GcmVxdWVuY3kgPSBSQ0NfQ2xvY2tzLT5IQ0xLX0ZyZXF1ZW5jeSA+PiBwcmVzYzsNCiAgLyogR2V0IEFEQ0NMSyBwcmVzY2FsZXIgKi8NCiAgdG1wID0gUkNDLT5DRkdSICYgQ0ZHUl9BRENQUkVfU2V0X01hc2s7DQogIHRtcCA9IHRtcCA+PiAxNDsNCiAgcHJlc2MgPSBBRENQcmVzY1RhYmxlW3RtcF07DQogIC8qIEFEQ0NMSyBjbG9jayBmcmVxdWVuY3kgKi8NCiAgUkNDX0Nsb2Nrcy0+QURDQ0xLX0ZyZXF1ZW5jeSA9IFJDQ19DbG9ja3MtPlBDTEsyX0ZyZXF1ZW5jeSAvIHByZXNjOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrLg0KICAqIEBwYXJhbSAgUkNDX0FIQlBlcmlwaDogc3BlY2lmaWVzIHRoZSBBSEIgcGVyaXBoZXJhbCB0byBnYXRlcyBpdHMgY2xvY2suDQogICogICANCiAgKiAgIEZvciBAYiBTVE0zMl9Db25uZWN0aXZpdHlfbGluZV9kZXZpY2VzLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uDQogICogICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRE1BMQ0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRE1BMg0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfU1JBTQ0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRkxJVEYNCiAgKiAgICAgQGFyZyBSQ0NfQUhCUGVyaXBoX0NSQw0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfT1RHX0ZTICAgIA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRVRIX01BQyAgIA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRVRIX01BQ19UeA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRVRIX01BQ19SeA0KICAqIA0KICAqICAgRm9yIEBiIG90aGVyX1NUTTMyX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIA0KICAqICAgZm9sbG93aW5nIHZhbHVlczogICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRE1BMQ0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRE1BMg0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfU1JBTQ0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRkxJVEYNCiAgKiAgICAgQGFyZyBSQ0NfQUhCUGVyaXBoX0NSQw0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRlNNQw0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfU0RJTw0KICAqICAgDQogICogQG5vdGUgU1JBTSBhbmQgRkxJVEYgY2xvY2sgY2FuIGJlIGRpc2FibGVkIG9ubHkgZHVyaW5nIHNsZWVwIG1vZGUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19BSEJQZXJpcGhDbG9ja0NtZCh1aW50MzJfdCBSQ0NfQUhCUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQUhCX1BFUklQSChSQ0NfQUhCUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFIQkVOUiB8PSBSQ0NfQUhCUGVyaXBoOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFJDQy0+QUhCRU5SICY9IH5SQ0NfQUhCUGVyaXBoOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSGlnaCBTcGVlZCBBUEIgKEFQQjIpIHBlcmlwaGVyYWwgY2xvY2suDQogICogQHBhcmFtICBSQ0NfQVBCMlBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIyIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfQVBCMlBlcmlwaF9BRklPLCBSQ0NfQVBCMlBlcmlwaF9HUElPQSwgUkNDX0FQQjJQZXJpcGhfR1BJT0IsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfR1BJT0MsIFJDQ19BUEIyUGVyaXBoX0dQSU9ELCBSQ0NfQVBCMlBlcmlwaF9HUElPRSwNCiAgKiAgICAgICAgICBSQ0NfQVBCMlBlcmlwaF9HUElPRiwgUkNDX0FQQjJQZXJpcGhfR1BJT0csIFJDQ19BUEIyUGVyaXBoX0FEQzEsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfQURDMiwgUkNDX0FQQjJQZXJpcGhfVElNMSwgUkNDX0FQQjJQZXJpcGhfU1BJMSwNCiAgKiAgICAgICAgICBSQ0NfQVBCMlBlcmlwaF9USU04LCBSQ0NfQVBCMlBlcmlwaF9VU0FSVDEsIFJDQ19BUEIyUGVyaXBoX0FEQzMsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfVElNMTUsIFJDQ19BUEIyUGVyaXBoX1RJTTE2LCBSQ0NfQVBCMlBlcmlwaF9USU0xNywNCiAgKiAgICAgICAgICBSQ0NfQVBCMlBlcmlwaF9USU05LCBSQ0NfQVBCMlBlcmlwaF9USU0xMCwgUkNDX0FQQjJQZXJpcGhfVElNMTEgICAgIA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgY2xvY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKHVpbnQzMl90IFJDQ19BUEIyUGVyaXBoLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfQVBCMl9QRVJJUEgoUkNDX0FQQjJQZXJpcGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSQ0MtPkFQQjJFTlIgfD0gUkNDX0FQQjJQZXJpcGg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUkNDLT5BUEIyRU5SICY9IH5SQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIExvdyBTcGVlZCBBUEIgKEFQQjEpIHBlcmlwaGVyYWwgY2xvY2suDQogICogQHBhcmFtICBSQ0NfQVBCMVBlcmlwaDogc3BlY2lmaWVzIHRoZSBBUEIxIHBlcmlwaGVyYWwgdG8gZ2F0ZXMgaXRzIGNsb2NrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0yLCBSQ0NfQVBCMVBlcmlwaF9USU0zLCBSQ0NfQVBCMVBlcmlwaF9USU00LA0KICAqICAgICAgICAgIFJDQ19BUEIxUGVyaXBoX1RJTTUsIFJDQ19BUEIxUGVyaXBoX1RJTTYsIFJDQ19BUEIxUGVyaXBoX1RJTTcsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfV1dERywgUkNDX0FQQjFQZXJpcGhfU1BJMiwgUkNDX0FQQjFQZXJpcGhfU1BJMywNCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9VU0FSVDIsIFJDQ19BUEIxUGVyaXBoX1VTQVJUMywgUkNDX0FQQjFQZXJpcGhfVVNBUlQ0LCANCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9VU0FSVDUsIFJDQ19BUEIxUGVyaXBoX0kyQzEsIFJDQ19BUEIxUGVyaXBoX0kyQzIsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfVVNCLCBSQ0NfQVBCMVBlcmlwaF9DQU4xLCBSQ0NfQVBCMVBlcmlwaF9CS1AsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfUFdSLCBSQ0NfQVBCMVBlcmlwaF9EQUMsIFJDQ19BUEIxUGVyaXBoX0NFQywNCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9USU0xMiwgUkNDX0FQQjFQZXJpcGhfVElNMTMsIFJDQ19BUEIxUGVyaXBoX1RJTTE0DQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBjbG9jay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQodWludDMyX3QgUkNDX0FQQjFQZXJpcGgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BUEIxX1BFUklQSChSQ0NfQVBCMVBlcmlwaCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJDQy0+QVBCMUVOUiB8PSBSQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjFFTlIgJj0gflJDQ19BUEIxUGVyaXBoOw0KICB9DQp9DQoNCiNpZmRlZiBTVE0zMkYxMFhfQ0wNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIG9yIHJlbGVhc2VzIEFIQiBwZXJpcGhlcmFsIHJlc2V0Lg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIG9ubHkgdG8gU1RNMzIgQ29ubmVjdGl2aXR5IGxpbmUgZGV2aWNlcy4NCiAgKiBAcGFyYW0gIFJDQ19BSEJQZXJpcGg6IHNwZWNpZmllcyB0aGUgQUhCIHBlcmlwaGVyYWwgdG8gcmVzZXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfT1RHX0ZTIA0KICAqICAgICBAYXJnIFJDQ19BSEJQZXJpcGhfRVRIX01BQw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgcmVzZXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQUhCUGVyaXBoUmVzZXRDbWQodWludDMyX3QgUkNDX0FIQlBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FIQl9QRVJJUEhfUkVTRVQoUkNDX0FIQlBlcmlwaCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BSEJSU1RSIHw9IFJDQ19BSEJQZXJpcGg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUkNDLT5BSEJSU1RSICY9IH5SQ0NfQUhCUGVyaXBoOw0KICB9DQp9DQojZW5kaWYgLyogU1RNMzJGMTBYX0NMICovIA0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyBvciByZWxlYXNlcyBIaWdoIFNwZWVkIEFQQiAoQVBCMikgcGVyaXBoZXJhbCByZXNldC4NCiAgKiBAcGFyYW0gIFJDQ19BUEIyUGVyaXBoOiBzcGVjaWZpZXMgdGhlIEFQQjIgcGVyaXBoZXJhbCB0byByZXNldC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX0FQQjJQZXJpcGhfQUZJTywgUkNDX0FQQjJQZXJpcGhfR1BJT0EsIFJDQ19BUEIyUGVyaXBoX0dQSU9CLA0KICAqICAgICAgICAgIFJDQ19BUEIyUGVyaXBoX0dQSU9DLCBSQ0NfQVBCMlBlcmlwaF9HUElPRCwgUkNDX0FQQjJQZXJpcGhfR1BJT0UsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfR1BJT0YsIFJDQ19BUEIyUGVyaXBoX0dQSU9HLCBSQ0NfQVBCMlBlcmlwaF9BREMxLA0KICAqICAgICAgICAgIFJDQ19BUEIyUGVyaXBoX0FEQzIsIFJDQ19BUEIyUGVyaXBoX1RJTTEsIFJDQ19BUEIyUGVyaXBoX1NQSTEsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfVElNOCwgUkNDX0FQQjJQZXJpcGhfVVNBUlQxLCBSQ0NfQVBCMlBlcmlwaF9BREMzLA0KICAqICAgICAgICAgIFJDQ19BUEIyUGVyaXBoX1RJTTE1LCBSQ0NfQVBCMlBlcmlwaF9USU0xNiwgUkNDX0FQQjJQZXJpcGhfVElNMTcsDQogICogICAgICAgICAgUkNDX0FQQjJQZXJpcGhfVElNOSwgUkNDX0FQQjJQZXJpcGhfVElNMTAsIFJDQ19BUEIyUGVyaXBoX1RJTTExICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIHJlc2V0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FQQjJQZXJpcGhSZXNldENtZCh1aW50MzJfdCBSQ0NfQVBCMlBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FQQjJfUEVSSVBIKFJDQ19BUEIyUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BUEIyUlNUUiB8PSBSQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjJSU1RSICY9IH5SQ0NfQVBCMlBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyBvciByZWxlYXNlcyBMb3cgU3BlZWQgQVBCIChBUEIxKSBwZXJpcGhlcmFsIHJlc2V0Lg0KICAqIEBwYXJhbSAgUkNDX0FQQjFQZXJpcGg6IHNwZWNpZmllcyB0aGUgQVBCMSBwZXJpcGhlcmFsIHRvIHJlc2V0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSQ0NfQVBCMVBlcmlwaF9USU0yLCBSQ0NfQVBCMVBlcmlwaF9USU0zLCBSQ0NfQVBCMVBlcmlwaF9USU00LA0KICAqICAgICAgICAgIFJDQ19BUEIxUGVyaXBoX1RJTTUsIFJDQ19BUEIxUGVyaXBoX1RJTTYsIFJDQ19BUEIxUGVyaXBoX1RJTTcsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfV1dERywgUkNDX0FQQjFQZXJpcGhfU1BJMiwgUkNDX0FQQjFQZXJpcGhfU1BJMywNCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9VU0FSVDIsIFJDQ19BUEIxUGVyaXBoX1VTQVJUMywgUkNDX0FQQjFQZXJpcGhfVVNBUlQ0LCANCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9VU0FSVDUsIFJDQ19BUEIxUGVyaXBoX0kyQzEsIFJDQ19BUEIxUGVyaXBoX0kyQzIsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfVVNCLCBSQ0NfQVBCMVBlcmlwaF9DQU4xLCBSQ0NfQVBCMVBlcmlwaF9CS1AsDQogICogICAgICAgICAgUkNDX0FQQjFQZXJpcGhfUFdSLCBSQ0NfQVBCMVBlcmlwaF9EQUMsIFJDQ19BUEIxUGVyaXBoX0NFQywNCiAgKiAgICAgICAgICBSQ0NfQVBCMVBlcmlwaF9USU0xMiwgUkNDX0FQQjFQZXJpcGhfVElNMTMsIFJDQ19BUEIxUGVyaXBoX1RJTTE0ICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGNsb2NrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0FQQjFQZXJpcGhSZXNldENtZCh1aW50MzJfdCBSQ0NfQVBCMVBlcmlwaCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUkNDX0FQQjFfUEVSSVBIKFJDQ19BUEIxUGVyaXBoKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgUkNDLT5BUEIxUlNUUiB8PSBSQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSQ0MtPkFQQjFSU1RSICY9IH5SQ0NfQVBCMVBlcmlwaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyBvciByZWxlYXNlcyB0aGUgQmFja3VwIGRvbWFpbiByZXNldC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfQmFja3VwUmVzZXRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAqKF9fSU8gdWludDMyX3QgKikgQkRDUl9CRFJTVF9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0Nsb2NrU2VjdXJpdHlTeXN0ZW1DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAqKF9fSU8gdWludDMyX3QgKikgQ1JfQ1NTT05fQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VsZWN0cyB0aGUgY2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08gcGluLg0KICAqIEBwYXJhbSAgUkNDX01DTzogc3BlY2lmaWVzIHRoZSBjbG9jayBzb3VyY2UgdG8gb3V0cHV0Lg0KICAqICAgDQogICogICBGb3IgQGIgU1RNMzJfQ29ubmVjdGl2aXR5X2xpbmVfZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUNCiAgKiAgIGZvbGxvd2luZyB2YWx1ZXM6ICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19NQ09fTm9DbG9jazogTm8gY2xvY2sgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBSQ0NfTUNPX1NZU0NMSzogU3lzdGVtIGNsb2NrIHNlbGVjdGVkDQogICogICAgIEBhcmcgUkNDX01DT19IU0k6IEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkDQogICogICAgIEBhcmcgUkNDX01DT19IU0U6IEhTRSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkDQogICogICAgIEBhcmcgUkNDX01DT19QTExDTEtfRGl2MjogUExMIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZA0KICAqICAgICBAYXJnIFJDQ19NQ09fUExMMkNMSzogUExMMiBjbG9jayBzZWxlY3RlZCAgICAgICAgICAgICAgICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19NQ09fUExMM0NMS19EaXYyOiBQTEwzIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCAgIA0KICAqICAgICBAYXJnIFJDQ19NQ09fWFQxOiBFeHRlcm5hbCAzLTI1IE1IeiBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkICANCiAgKiAgICAgQGFyZyBSQ0NfTUNPX1BMTDNDTEs6IFBMTDMgY2xvY2sgc2VsZWN0ZWQgDQogICogDQogICogICBGb3IgIEBiIG90aGVyX1NUTTMyX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgICAgICANCiAgKiAgICAgQGFyZyBSQ0NfTUNPX05vQ2xvY2s6IE5vIGNsb2NrIHNlbGVjdGVkDQogICogICAgIEBhcmcgUkNDX01DT19TWVNDTEs6IFN5c3RlbSBjbG9jayBzZWxlY3RlZA0KICAqICAgICBAYXJnIFJDQ19NQ09fSFNJOiBIU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZA0KICAqICAgICBAYXJnIFJDQ19NQ09fSFNFOiBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZA0KICAqICAgICBAYXJnIFJDQ19NQ09fUExMQ0xLX0RpdjI6IFBMTCBjbG9jayBkaXZpZGVkIGJ5IDIgc2VsZWN0ZWQNCiAgKiAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSQ0NfTUNPQ29uZmlnKHVpbnQ4X3QgUkNDX01DTykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08oUkNDX01DTykpOw0KDQogIC8qIFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8gTUNPIGJpdHMgdG8gc2VsZWN0IHRoZSBNQ08gc291cmNlICovDQogICooX19JTyB1aW50OF90ICopIENGR1JfQllURTRfQUREUkVTUyA9IFJDQ19NQ087DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSQ0MgZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgUkNDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCiAgKiAgIA0KICAqICAgRm9yIEBiIFNUTTMyX0Nvbm5lY3Rpdml0eV9saW5lX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlDQogICogICBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19GTEFHX0hTSVJEWTogSFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19IU0VSRFk6IEhTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQogICogICAgIEBhcmcgUkNDX0ZMQUdfUExMUkRZOiBQTEwgY2xvY2sgcmVhZHkNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19QTEwyUkRZOiBQTEwyIGNsb2NrIHJlYWR5ICAgICAgDQogICogICAgIEBhcmcgUkNDX0ZMQUdfUExMM1JEWTogUExMMyBjbG9jayByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19GTEFHX0xTRVJEWTogTFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19MU0lSRFk6IExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQogICogICAgIEBhcmcgUkNDX0ZMQUdfUElOUlNUOiBQaW4gcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19QT1JSU1Q6IFBPUi9QRFIgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19TRlRSU1Q6IFNvZnR3YXJlIHJlc2V0DQogICogICAgIEBhcmcgUkNDX0ZMQUdfSVdER1JTVDogSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19XV0RHUlNUOiBXaW5kb3cgV2F0Y2hkb2cgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19MUFdSUlNUOiBMb3cgUG93ZXIgcmVzZXQNCiAgKiANCiAgKiAgIEZvciBAYiBvdGhlcl9TVE0zMl9kZXZpY2VzLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICAgICAgDQogICogICAgIEBhcmcgUkNDX0ZMQUdfSFNJUkRZOiBIU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQ0KICAqICAgICBAYXJnIFJDQ19GTEFHX0hTRVJEWTogSFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19QTExSRFk6IFBMTCBjbG9jayByZWFkeQ0KICAqICAgICBAYXJnIFJDQ19GTEFHX0xTRVJEWTogTFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19MU0lSRFk6IExTSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5DQogICogICAgIEBhcmcgUkNDX0ZMQUdfUElOUlNUOiBQaW4gcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19QT1JSU1Q6IFBPUi9QRFIgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19TRlRSU1Q6IFNvZnR3YXJlIHJlc2V0DQogICogICAgIEBhcmcgUkNDX0ZMQUdfSVdER1JTVDogSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19XV0RHUlNUOiBXaW5kb3cgV2F0Y2hkb2cgcmVzZXQNCiAgKiAgICAgQGFyZyBSQ0NfRkxBR19MUFdSUlNUOiBMb3cgUG93ZXIgcmVzZXQNCiAgKiAgIA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBSQ0NfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgUkNDX0dldEZsYWdTdGF0dXModWludDhfdCBSQ0NfRkxBRykNCnsNCiAgdWludDMyX3QgdG1wID0gMDsNCiAgdWludDMyX3Qgc3RhdHVzcmVnID0gMDsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19GTEFHKFJDQ19GTEFHKSk7DQoNCiAgLyogR2V0IHRoZSBSQ0MgcmVnaXN0ZXIgaW5kZXggKi8NCiAgdG1wID0gUkNDX0ZMQUcgPj4gNTsNCiAgaWYgKHRtcCA9PSAxKSAgICAgICAgICAgICAgIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIENSIHJlZ2lzdGVyICovDQogIHsNCiAgICBzdGF0dXNyZWcgPSBSQ0MtPkNSOw0KICB9DQogIGVsc2UgaWYgKHRtcCA9PSAyKSAgICAgICAgICAvKiBUaGUgZmxhZyB0byBjaGVjayBpcyBpbiBCRENSIHJlZ2lzdGVyICovDQogIHsNCiAgICBzdGF0dXNyZWcgPSBSQ0MtPkJEQ1I7DQogIH0NCiAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZsYWcgdG8gY2hlY2sgaXMgaW4gQ1NSIHJlZ2lzdGVyICovDQogIHsNCiAgICBzdGF0dXNyZWcgPSBSQ0MtPkNTUjsNCiAgfQ0KDQogIC8qIEdldCB0aGUgZmxhZyBwb3NpdGlvbiAqLw0KICB0bXAgPSBSQ0NfRkxBRyAmIEZMQUdfTWFzazsNCiAgaWYgKChzdGF0dXNyZWcgJiAoKHVpbnQzMl90KTEgPDwgdG1wKSkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQoNCiAgLyogUmV0dXJuIHRoZSBmbGFnIHN0YXR1cyAqLw0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgUkNDIHJlc2V0IGZsYWdzLg0KICAqIEBub3RlICAgVGhlIHJlc2V0IGZsYWdzIGFyZTogUkNDX0ZMQUdfUElOUlNULCBSQ0NfRkxBR19QT1JSU1QsIFJDQ19GTEFHX1NGVFJTVCwNCiAgKiAgIFJDQ19GTEFHX0lXREdSU1QsIFJDQ19GTEFHX1dXREdSU1QsIFJDQ19GTEFHX0xQV1JSU1QNCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUkNDX0NsZWFyRmxhZyh2b2lkKQ0Kew0KICAvKiBTZXQgUk1WRiBiaXQgdG8gY2xlYXIgdGhlIHJlc2V0IGZsYWdzICovDQogIFJDQy0+Q1NSIHw9IENTUl9STVZGX1NldDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJDQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gIFJDQ19JVDogc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiAgKiAgIA0KICAqICAgRm9yIEBiIFNUTTMyX0Nvbm5lY3Rpdml0eV9saW5lX2RldmljZXMsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlDQogICogICBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJDQ19JVF9MU0lSRFk6IExTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTSVJEWTogSFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9IU0VSRFk6IEhTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBQTEwgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX1BMTDJSRFk6IFBMTDIgcmVhZHkgaW50ZXJydXB0IA0KICAqICAgICBAYXJnIFJDQ19JVF9QTEwzUkRZOiBQTEwzIHJlYWR5IGludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICANCiAgKiAgICAgQGFyZyBSQ0NfSVRfQ1NTOiBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0DQogICogDQogICogICBGb3IgQGIgb3RoZXJfU1RNMzJfZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19JVF9MU0lSRFk6IExTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTSVJEWTogSFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9IU0VSRFk6IEhTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBQTEwgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0NTUzogQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdA0KICAqICAgDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFJDQ19JVCAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCklUU3RhdHVzIFJDQ19HZXRJVFN0YXR1cyh1aW50OF90IFJDQ19JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfR0VUX0lUKFJDQ19JVCkpOw0KDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBSQ0MgaW50ZXJydXB0ICovDQogIGlmICgoUkNDLT5DSVIgJiBSQ0NfSVQpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KDQogIC8qIFJldHVybiB0aGUgUkNDX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFJDQ5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBSQ0NfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KICAqICAgDQogICogICBGb3IgQGIgU1RNMzJfQ29ubmVjdGl2aXR5X2xpbmVfZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbg0KICAqICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgUkNDX0lUX0xTSVJEWTogTFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9MU0VSRFk6IExTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfSFNJUkRZOiBIU0kgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTRVJEWTogSFNFIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9QTExSRFk6IFBMTCByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMMlJEWTogUExMMiByZWFkeSBpbnRlcnJ1cHQgDQogICogICAgIEBhcmcgUkNDX0lUX1BMTDNSRFk6IFBMTDMgcmVhZHkgaW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19JVF9DU1M6IENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQNCiAgKiANCiAgKiAgIEZvciBAYiBvdGhlcl9TVE0zMl9kZXZpY2VzLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZQ0KICAqICAgZm9sbG93aW5nIHZhbHVlczogICAgICAgIA0KICAqICAgICBAYXJnIFJDQ19JVF9MU0lSRFk6IExTSSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfTFNFUkRZOiBMU0UgcmVhZHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgUkNDX0lUX0hTSVJEWTogSFNJIHJlYWR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFJDQ19JVF9IU0VSRFk6IEhTRSByZWFkeSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBSQ0NfSVRfUExMUkRZOiBQTEwgcmVhZHkgaW50ZXJydXB0DQogICogICANCiAgKiAgICAgQGFyZyBSQ0NfSVRfQ1NTOiBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0DQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJDQ19DbGVhcklUUGVuZGluZ0JpdCh1aW50OF90IFJDQ19JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DTEVBUl9JVChSQ0NfSVQpKTsNCg0KICAvKiBQZXJmb3JtIEJ5dGUgYWNjZXNzIHRvIFJDQ19DSVJbMjM6MTZdIGJpdHMgdG8gY2xlYXIgdGhlIHNlbGVjdGVkIGludGVycnVwdA0KICAgICBwZW5kaW5nIGJpdHMgKi8NCiAgKihfX0lPIHVpbnQ4X3QgKikgQ0lSX0JZVEUzX0FERFJFU1MgPSBSQ0NfSVQ7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=