IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKIyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KIwoKIwojIE1ha2VmaWxlIGZvciBzbm1wbGliCiMKCnRvcF9idWlsZGRpcj0uLgoKIyB1c2UgR05VIHZwYXRoLCBpZiBhdmFpbGFibGUsIHRvIG9ubHkgc2V0IGEgcGF0aCBmb3Igc291cmNlIGFuZCBoZWFkZXJzCiMgVlBBVEggd2lsbCBwaWNrIHVwIG9iamVjdHMgdG9vLCB3aGljaCBpcyBiYWQgaWYgeW91IGFyZSBzaGFyaW5nIGEKIyBzb3VyY2UgZGlyLi4uCkBHTlVfdnBhdGhAICUuaCAkKHNyY2RpcikKQEdOVV92cGF0aEAgJS5jICQoc3JjZGlyKQpAR05VX3ZwYXRoQCAlLnJjICQoc3JjZGlyKQojIGZhbGxiYWNrIHRvIHJlZ3VsYXIgVlBBVEggZm9yIG5vbi1nbnUuLi4KQE5PTl9HTlVfVlBBVEhAICQoc3JjZGlyKQoKCiMKIyBUaGluZ3MgdG8gaW5zdGFsbAojCgojIGhlYWRlcnMKSU5TVEFMTEhFQURFUlM9XAoJbmV0LXNubXAtaW5jbHVkZXMuaCBcCgljb25maWdfYXBpLmggIFwKCW1pYl9hcGkuaCAgICAgXAoJb3V0cHV0X2FwaS5oICBcCglwZHVfYXBpLmggICAgIFwKCXNlc3Npb25fYXBpLmggXAoJc25tcHYzX2FwaS5oICBcCgl2YXJiaW5kX2FwaS5oIFwKCXR5cGVzLmggICAgICAgXAoJdXRpbGl0aWVzLmggICBcCgl2ZXJzaW9uLmggICAgIFwKCWRlZmluaXRpb25zLmgKCklOQ0xVREVTVUJESVI9bGlicmFyeQpJTkNMVURFU1VCRElSSEVBREVSUz1SRUFETUUgXAoJYXNuMS5oIFwKCWNhbGxiYWNrLmggXAoJY29udGFpbmVyLmggXAoJY29udGFpbmVyX2JpbmFyeV9hcnJheS5oIFwKCWNvbnRhaW5lcl9saXN0X3NzbGwuaCBcCgljb250YWluZXJfaXRlcmF0b3IuaCBcCgljb250YWluZXJfbnVsbC5oIFwKCWZhY3RvcnkuaCBcCglkYXRhX2xpc3QuaCBcCglkZWZhdWx0X3N0b3JlLmggXAoJZmRfZXZlbnRfbWFuYWdlci5oIFwKCWZpbGVfdXRpbHMuaCBcCglpbnQ2NC5oIFwKCWtleXRvb2xzLmggXAoJbWliLmggXAoJbWQ1LmggXAoJcGFyc2UuaCBcCglyZWFkX2NvbmZpZy5oIFwKCXNjYXBpLmggXAoJc25tcC5oIFwKCXNubXBfYWxhcm0uaCBcCglzbm1wX2FwaS5oIFwKCXNubXBfYXNzZXJ0LmggXAoJc25tcF9jbGllbnQuaCBcCglzbm1wX2RlYnVnLmggXAoJc25tcF9pbXBsLmggXAoJc25tcF9sb2dnaW5nLmggXAoJc25tcF9wYXJzZV9hcmdzLmggXAoJc25tcF9zZXJ2aWNlLmggXAoJc25tcC10Yy5oIFwKCXNubXB2My5oIFwKCXN5c3RlbS5oIFwKCXRleHRfdXRpbHMuaCBcCgl0b29scy5oIFwKCXRyYW5zZm9ybV9vaWRzLmggXAogICAgICAgIGNtdV9jb21wYXQuaCBcCiAgICAgICAgZ2V0b3B0LmggXAogICAgICAgIGxjZF90aW1lLmggXAogICAgICAgIG10X3N1cHBvcnQuaCBcCiAgICAgICAgb2lkX3N0YXNoLmggXAogICAgICAgIHNubXBfZW51bS5oIFwKICAgICAgICBzbm1wX3NlY21vZC5oIFwKICAgICAgICB1Y2RfY29tcGF0LmggXAogICAgICAgIHZhY20uaCBcCgljaGVja192YXJiaW5kLmggXAoJc25tcF90cmFuc3BvcnQuaCBcCgl3aW5waXBlLmggXAoJd2luc2VydmljZS5oIFwKCUB0cmFuc3BvcnRfaGRyX2xpc3RAIFwKCUBzZWN1cml0eV9oZHJfbGlzdEAKCklOU1RBTExCVUlMVFNVQkRJUkhFQURFUlM9Li4vaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5L3NubXB2My1zZWN1cml0eS1pbmNsdWRlcy5oCklOU1RBTExCVUlMVFNVQkRJUj1saWJyYXJ5CgoKSU5TVEFMTFVDREhFQURFUlM9IGFzbjEuaCBcCgljYWxsYmFjay5oCVwKCWRlZmF1bHRfc3RvcmUuaAlcCglpbnQ2NC5oCQlcCglrZXl0b29scy5oCVwKCW1pYi5oCQlcCglwYXJzZS5oCQlcCglyZWFkX2NvbmZpZy5oCVwKCXNjYXBpLmgJCVwKCXNubXBfYWxhcm0uaAlcCglzbm1wX2FwaS5oCVwKCXNubXBfY2xpZW50LmgJXAoJc25tcF9kZWJ1Zy5oCVwKCXNubXAuaAkJXAoJc25tcF9pbXBsLmgJXAoJc25tcF9sb2dnaW5nLmgJXAoJc25tcF9wYXJzZV9hcmdzLmggXAoJc25tcC10Yy5oCVwKCXNubXB1c20uaAlcCglzbm1wdjMuaAlcCglzbm1wX3ZhcnMuaAlcCglzdHJ1Y3QuaAlcCglzeXN0ZW0uaAlcCgl0b29scy5oCQlcCgl0cmFuc2Zvcm1fb2lkcy5oCgojIGxpYnJhcmllcwpJTlNUQUxMTElCUz1saWJuZXRzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQpJTlNUQUxMVUNETElCUz1saWJzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQoKIwojIFRoaW5ncyB0byBidWlsZAojCkNTUkNTPQlzbm1wX2NsaWVudC5jIG1pYi5jIHBhcnNlLmMgc25tcF9hcGkuYyBzbm1wLmMgCQlcCglzbm1wX2F1dGguYyBhc24xLmMgbWQ1LmMgc25tcF9wYXJzZV9hcmdzLmMJCVwKCXN5c3RlbS5jIHZhY20uYyBpbnQ2NC5jIHJlYWRfY29uZmlnLmMgcGtjcy5jCQlcCglzbm1wX2RlYnVnLmMgdG9vbHMuYyAgc25tcF9sb2dnaW5nLmMgdGV4dF91dGlscy5jCVwKCXNubXB2My5jIGxjZF90aW1lLmMga2V5dG9vbHMuYyBmaWxlX3V0aWxzLmMJCVwKCXNjYXBpLmMgY2FsbGJhY2suYyBkZWZhdWx0X3N0b3JlLmMgc25tcF9hbGFybS5jCQlcCglkYXRhX2xpc3QuYyBvaWRfc3Rhc2guYyBmZF9ldmVudF9tYW5hZ2VyLmMgCQlcCgltdF9zdXBwb3J0LmMgc25tcF9lbnVtLmMgc25tcC10Yy5jIHNubXBfc2VydmljZS5jCVwKCXNucHJpbnRmLmMgc3RybGNhdC5jIHN0cmxjcHkuYyBzdHJ0b2wuYyBzdHJ0b3VsLmMJXAoJc3RydG9rX3IuYyBzbm1wX3RyYW5zcG9ydC5jIEB0cmFuc3BvcnRfc3JjX2xpc3RACVwKCXNubXBfc2VjbW9kLmMgQHNlY3VyaXR5X3NyY19saXN0QCBzbm1wX3ZlcnNpb24uYyAgICAgICAgXAoJY2hlY2tfdmFyYmluZC5jIGNvbnRhaW5lci5jIGNvbnRhaW5lcl9iaW5hcnlfYXJyYXkuYwlcCgljb250YWluZXJfbnVsbC5jIGNvbnRhaW5lcl9saXN0X3NzbGwuYyBjb250YWluZXJfaXRlcmF0b3IuYyBcCgljbXVfY29tcGF0LmMgdWNkX2NvbXBhdC5jIEBvdGhlcl9zcmNfbGlzdEAKCk9CSlM9CXNubXBfY2xpZW50Lm8gbWliLm8gcGFyc2UubyBzbm1wX2FwaS5vIHNubXAubyAJCVwKCXNubXBfYXV0aC5vIGFzbjEubyBtZDUubyBzbm1wX3BhcnNlX2FyZ3MubwkJXAoJc3lzdGVtLm8gdmFjbS5vIGludDY0Lm8gcmVhZF9jb25maWcubyBwa2NzLm8gCQlcCglzbm1wX2RlYnVnLm8gdG9vbHMubyAgc25tcF9sb2dnaW5nLm8gdGV4dF91dGlscy5vCVwKCXNubXB2My5vIGxjZF90aW1lLm8ga2V5dG9vbHMubyBmaWxlX3V0aWxzLm8JCVwKCXNjYXBpLm8gY2FsbGJhY2subyBkZWZhdWx0X3N0b3JlLm8gc25tcF9hbGFybS5vCQlcCglkYXRhX2xpc3QubyBvaWRfc3Rhc2gubyBmZF9ldmVudF9tYW5hZ2VyLm8JCVwKCW10X3N1cHBvcnQubyBzbm1wX2VudW0ubyBzbm1wLXRjLm8gc25tcF9zZXJ2aWNlLm8JXAoJc25wcmludGYubyBzdHJsY2F0Lm8gc3RybGNweS5vIHN0cnRvbC5vIHN0cnRvdWwubwlcCglzdHJ0b2tfci5vIHNubXBfdHJhbnNwb3J0Lm8gQHRyYW5zcG9ydF9vYmpfbGlzdEAJXAoJc25tcF9zZWNtb2QubyBAc2VjdXJpdHlfb2JqX2xpc3RAIHNubXBfdmVyc2lvbi5vICAgICAgICBcCgljaGVja192YXJiaW5kLm8gY29udGFpbmVyLm8gY29udGFpbmVyX2JpbmFyeV9hcnJheS5vCVwKCWNvbnRhaW5lcl9udWxsLm8gY29udGFpbmVyX2xpc3Rfc3NsbC5vIGNvbnRhaW5lcl9pdGVyYXRvci5vIFwKCWNtdV9jb21wYXQubyB1Y2RfY29tcGF0Lm8gQG90aGVyX29ianNfbGlzdEAKCkxPQkpTPQlzbm1wX2NsaWVudC5sbyBtaWIubG8gcGFyc2UubG8gc25tcF9hcGkubG8gc25tcC5sbyAJXAoJc25tcF9hdXRoLmxvIGFzbjEubG8gbWQ1LmxvIHNubXBfcGFyc2VfYXJncy5sbwkJXAoJc3lzdGVtLmxvIHZhY20ubG8gaW50NjQubG8gcmVhZF9jb25maWcubG8gcGtjcy5sbwlcCglzbm1wX2RlYnVnLmxvIHRvb2xzLmxvICBzbm1wX2xvZ2dpbmcubG8JIHRleHRfdXRpbHMubG8JXAoJc25tcHYzLmxvIGxjZF90aW1lLmxvIGtleXRvb2xzLmxvIGZpbGVfdXRpbHMubG8JCVwKCXNjYXBpLmxvIGNhbGxiYWNrLmxvIGRlZmF1bHRfc3RvcmUubG8gc25tcF9hbGFybS5sbwkJXAoJZGF0YV9saXN0LmxvIG9pZF9zdGFzaC5sbyBmZF9ldmVudF9tYW5hZ2VyLmxvCQlcCgltdF9zdXBwb3J0LmxvIHNubXBfZW51bS5sbyBzbm1wLXRjLmxvIHNubXBfc2VydmljZS5sbwlcCglzbnByaW50Zi5sbyBzdHJsY2F0LmxvIHN0cmxjcHkubG8gc3RydG9sLmxvIHN0cnRvdWwubG8JXAoJc3RydG9rX3IubG8gc25tcF90cmFuc3BvcnQubG8gQHRyYW5zcG9ydF9sb2JqX2xpc3RACVwKCXNubXBfc2VjbW9kLmxvIEBzZWN1cml0eV9sb2JqX2xpc3RAIHNubXBfdmVyc2lvbi5sbyAgICAgICBcCgljaGVja192YXJiaW5kLmxvIGNvbnRhaW5lci5sbyBjb250YWluZXJfYmluYXJ5X2FycmF5LmxvCVwKCWNvbnRhaW5lcl9udWxsLmxvIGNvbnRhaW5lcl9saXN0X3NzbGwubG8gY29udGFpbmVyX2l0ZXJhdG9yLmxvIFwKCWNtdV9jb21wYXQubG8gdWNkX2NvbXBhdC5sbyBAb3RoZXJfbG9ianNfbGlzdEAKCiMganVzdCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gcmVtb3ZlIGxpYnRvb2wsIGNoYW5nZSB0aGlzIHRvIE9CSlMuClRPQkpTPSQoTE9CSlMpCgojIApDUFBGTEFHUyA9ICQoVE9QX0lOQ0xVREVTKSAtSS4gCSQoU05NUExJQl9JTkNMVURFUykgQENQUEZMQUdTQAoKYWxsOiBzdGFuZGFyZGFsbAoKIyBob3cgdG8gYnVpbGQgdGhlIGxpYnJhcmllcy4KbGlibmV0c25tcC4kKExJQl9FWFRFTlNJT04pJChMSUJfVkVSU0lPTik6ICAgICQoVE9CSlMpCgkkKExJQl9MRF9DTUQpICRAICQoVE9CSlMpICQoTERGTEFHUykgQExORVRTTk1QTElCU0AKCSQoUkFOTElCKSAkQAoKbGlic25tcC4kKExJQl9FWFRFTlNJT04pJChMSUJfVkVSU0lPTik6ICAgICQoVE9CSlMpCgkkKExJQl9MRF9DTUQpICRAICQoVE9CSlMpICQoTERGTEFHUykgQExORVRTTk1QTElCU0AKCSQoUkFOTElCKSAkQAoKIwojIGludGVybmFsIHRlc3Qgb2JqZWN0cwojCnBhcnNlOiAgbWliLm8gcGFyc2UuYwoJJChDQykgJChDRkxBR1MpIC1EVEVTVCBwYXJzZS5jIC1vICRAIFwKCQlgJCh0b3Bfc3JjZGlyKS9uZXQtc25tcC1jb25maWcgLS1saWJzYAoKdGVzdF9iaW5hcnlfYXJyYXk6IHRlc3RfYmluYXJ5X2FycmF5LmMKCSQoQ0MpICQoQ0ZMQUdTKSB0ZXN0X2JpbmFyeV9hcnJheS5jIC1vICRAIFwKCQlgJCh0b3Bfc3JjZGlyKS9uZXQtc25tcC1jb25maWcgLS1saWJzYAo=