IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCiMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAojIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CiMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKIyBmdWxseS4KCgojIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCiMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CiMKIyAgIEJVSUxEX0RJUiAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKIyAgICAgICAgICAgICAgICBgZnJlZXR5cGUvYnVpbGRzLyQoUExBVEZPUk0pJyBidXQgY2FuIGJlIGRpZmZlcmVudCBmb3IKIyAgICAgICAgICAgICAgICBjdXN0b20gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCiMgICAgICAgICAgICAgICAgb24gdGhlIGNvbXBpbGVyIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENPTVBJTEVSX1NFUCBUaGUgc2VwYXJhdG9yIHVzZWQgaW4gYXJndW1lbnRzIG9mIHRoZSBjb21waWxhdGlvbiB0b29scy4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUF9ESVIgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBTZXQgYXV0by1kZXRlY3Rpb24gZGVmYXVsdCB0byBgYW5zaScgcmVzcC4gVU5JWC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zLgojClBMQVRGT1JNICAgICA6PSBhbnNpCkRFTEVURSAgICAgICA6PSAkKFJNKQpDT1BZICAgICAgICAgOj0gY3AKU0VQICAgICAgICAgIDo9IC8KCkJVSUxEX0NPTkZJRyA6PSAkKFRPUF9ESVIpL2J1aWxkcwoKIyBUaGVzZSB0d28gYXNzaWdubWVudHMgbXVzdCBiZSBkZWxheWVkLgpCVUlMRF9ESVIgICAgPSAkKEJVSUxEX0NPTkZJRykvJChQTEFURk9STSkKQ09ORklHX1JVTEVTID0gJChCVUlMRF9ESVIpLyQoQ09ORklHX0ZJTEUpCgojIFdlIGRlZmluZSB0aGUgQkFDS1NMQVNIIHZhcmlhYmxlIHRvIGhvbGQgYSBzaW5nbGUgYmFjay1zbGFzaCBjaGFyYWN0ZXIuCiMgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhIGxpbmUgbGlrZQojCiMgICBTRVAgOj0gXAojCiMgZG9lcyBub3Qgd29yayB3aXRoIEdOVSBNYWtlICh0aGUgYmFja3NsYXNoIGlzIGludGVycHJldGVkIGFzIGEgbGluZQojIGNvbnRpbnVhdGlvbikuICBXaGlsZSBhIGxpbmUgbGlrZQojCiMgICBTRVAgOj0gXFwKIwojIHJlYWxseSBkZWZpbmVzICQoU0VQKSBhcyBgXCcgb24gVW5peCwgYW5kIGBcXCcgb24gRG9zIGFuZCBXaW5kb3dzIQojCkJBQ0tTTEFTSCA6PSAkKHN0cmlwIFwgKQoKIyBGaW5kIGFsbCBhdXRvLWRldGVjdGFibGUgcGxhdGZvcm1zLgojClBMQVRGT1JNUyA6PSAkKG5vdGRpciAkKHN1YnN0IC9kZXRlY3QubWssLCQod2lsZGNhcmQgJChCVUlMRF9DT05GSUcpLyovZGV0ZWN0Lm1rKSkpCi5QSE9OWTogJChQTEFURk9STVMpIGFuc2kKCiMgRmlsdGVyIG91dCBwbGF0Zm9ybSBzcGVjaWZpZWQgYXMgc2V0dXAgdGFyZ2V0LgojClBMQVRGT1JNIDo9ICQoZmlyc3R3b3JkICQoZmlsdGVyICQoTUFLRUNNREdPQUxTKSwkKFBMQVRGT1JNUykpKQoKIyBJZiBubyBzZXR1cCB0YXJnZXQgcGxhdGZvcm0gd2FzIHNwZWNpZmllZCwgZW5hYmxlIGF1dG8tZGV0ZWN0aW9uLwojIGRlZmF1bHQgcGxhdGZvcm0uCiMKaWZlcSAoJChQTEFURk9STSksKQogIFBMQVRGT1JNIDo9IGFuc2kKZW5kaWYKCiMgSWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYXNrZWQgZm9yIGBhbnNpJyBvbiB0aGUgY29tbWFuZCBsaW5lLAojIGRpc2FibGUgYXV0by1kZXRlY3Rpb24uCiMKaWZlcSAoJChmaW5kc3RyaW5nIGFuc2ksJChNQUtFQ01ER09BTFMpKSwpCiAgIyBOb3csIGluY2x1ZGUgYWxsIGRldGVjdGlvbiBydWxlIGZpbGVzIGZvdW5kIGluIHRoZSBgYnVpbGRzLzxzeXN0ZW0+JwogICMgZGlyZWN0b3JpZXMuICBOb3RlIHRoYXQgdGhlIGNhbGxpbmcgb3JkZXIgb2YgdGhlIHZhcmlvdXMgYGRldGVjdC5taycKICAjIGZpbGVzIGlzbid0IHByZWRpY3RhYmxlLgogICMKICBpbmNsdWRlICQod2lsZGNhcmQgJChCVUlMRF9DT05GSUcpLyovZGV0ZWN0Lm1rKQplbmRpZgoKIyBJbiBjYXNlIG5vIGRldGVjdGlvbiBydWxlIGZpbGUgd2FzIHN1Y2Nlc3NmdWwsIHVzZSB0aGUgZGVmYXVsdC4KIwppZm5kZWYgQ09ORklHX0ZJTEUKICBDT05GSUdfRklMRSA6PSBhbnNpLm1rCiAgc2V0dXA6IHN0ZF9zZXR1cAogIC5QSE9OWTogc2V0dXAKZW5kaWYKCiMgVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBlcXVpdmFsZW50LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGV5IHVzZQojIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN5bnRheCBmb3IgdGhlIGBlY2hvJyBjb21tYW5kLgojCiMgc3RkX3NldHVwOiBkZWZpbmVkIGZvciBtb3N0IChpLmUuIFVuaXgtbGlrZSkgcGxhdGZvcm1zCiMgZG9zX3NldHVwOiBkZWZpbmVkIGZvciBEb3MtaXNoIHBsYXRmb3JtcyBsaWtlIERvcywgV2luZG93cyAmIE9TLzIKIwouUEhPTlk6IHN0ZF9zZXR1cCBkb3Nfc2V0dXAKCnN0ZF9zZXR1cDoKCUBlY2hvICIiCglAZWNobyAiJChQUk9KRUNUX1RJVExFKSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24iCglAZWNobyAiIgoJQGVjaG8gIlRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQ6IgoJQGVjaG8gIiIKCUBlY2hvICIgIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAkKFBMQVRGT1JNKSIKCUBlY2hvICIgIGNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAkKENDKSIKCUBlY2hvICIgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5ICAgICAkKEJVSUxEX0RJUikiCglAZWNobyAiICBjb25maWd1cmF0aW9uIHJ1bGVzICAgICAgICAgJChDT05GSUdfUlVMRVMpIgoJQGVjaG8gIiIKCUBlY2hvICJJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKCUBlY2hvICJcYCQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4iCglAZWNobyAiIgoJQGVjaG8gIk90aGVyd2lzZSwgc2ltcGx5IHR5cGUgXGAkKE1BS0UpJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeSwiCglAZWNobyAib3IgXGAkKE1BS0UpIHJlZmRvYycgdG8gYnVpbGQgdGhlIEFQSSByZWZlcmVuY2UgKHRoZSBsYXR0ZXIgbmVlZHMgcHl0aG9uKS4iCglAZWNobyAiIgoJQCQoQ09QWSkgJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKQoKCiMgU3BlY2lhbCBjYXNlIGZvciBEb3MsIFdpbmRvd3MsIE9TLzIsIHdoZXJlIGVjaG8gIiIgZG9lc24ndCB3b3JrIGNvcnJlY3RseSEKIwpkb3Nfc2V0dXA6CglAdHlwZSBidWlsZHNcbmV3bGluZQoJQGVjaG8gJChQUk9KRUNUX1RJVExFKSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOgoJQHR5cGUgYnVpbGRzXG5ld2xpbmUKCUBlY2hvICAgcGxhdGZvcm3///////////////////////////8kKFBMQVRGT1JNKQoJQGVjaG8gICBjb21waWxlcv///////////////////////////yQoQ0MpCglAZWNobyAgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5////////JChzdWJzdCAvLFwsJChCVUlMRF9ESVIpKQoJQGVjaG8gICBjb25maWd1cmF0aW9uIHJ1bGVz/////////////yQoc3Vic3QgLyxcLCQoQ09ORklHX1JVTEVTKSkKCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZQoJQGVjaG8gJyQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBPdGhlcndpc2UsIHNpbXBseSB0eXBlICdtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeS4KCUBlY2hvIG9yICdtYWtlIHJlZmRvYycgdG8gYnVpbGQgdGhlIEFQSSByZWZlcmVuY2UgKHRoZSBsYXR0ZXIgbmVlZHMgcHl0aG9uKS4KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAJChDT1BZKSAkKHN1YnN0IC8sXCwkKENPTkZJR19SVUxFUykgJChDT05GSUdfTUspKSA+IG51bAoKCiMgRU9GCg==