IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKIyBIaXN0b3J5OgojIE1hciAzMSAxOTk5IC0gT3ZlIEvldmVuCiMgIEZpcnN0IHZlcnNpb24KIyBEZWMgOSAxOTk5IC0gT3ZlIEvldmVuCiMgIHJlcXVpcmUgWHBtCiMgRmViIDI1IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0by1hZGQgL3Vzci9sb2NhbC9saWIgdG8gL2V0Yy9sZC5zby5jb25mCiMgTWFyIDIgMjAwMCAtIE92ZSBL5XZlbgojICBzb3VyY2UgcmF0aGVyIHRoYW4gZ3JlcCBjb25maWcuY2FjaGUKIyAgdXNlIHNvdXJjZWQgY29uZmlnLmNhY2hlIHRvIHN0YXJ0IGxkY29uZmlnCiMgIHJlY29uZmlndXJlIGlmIGNvbmZpZy5jYWNoZSBkb2Vzbid0IGV4aXN0CiMgTWFyIDMwIDIwMDAgLSBPdmUgS+V2ZW4KIyAgYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxzCiMgIGRvIG5vdCBpbnN0YWxsIHJlZ2lzdHJ5IG9uIHJlYWwtd2luZG93cyBpbnN0YWxscwojICBzb21lIHN1cHBvcnQgZm9yIGJpbmFyeSBwYWNrYWdlIGluc3RhbGxzCiMgIHNldCBhbmQgdGVsbCB1c2VyIGFib3V0IExEX0xJQlJBUllfUEFUSCBpZiBuZWNlc3NhcnkKIyAgc2V0IEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiB3aW5lLmNvbmYKIyBBcHIgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCiMgTWF5IDkgMjAwMCAtIE92ZSBL5XZlbgojICB1c2UgdHR5ZHJ2IHdoZW4gcnVubmluZyByZWdhcGksIHNvIHdlIGRvbid0IGhhdmUgdG8gcnVuIGZyb20gWAojICBjaGFuZ2UgZGVidWdnZXIgcGF0aCBpbiByZWdpc3RyeQojIE9jdCAyOSAyMDAwIC0gT3ZlIEvldmVuCiMgIGFkZGVkIC0tZW5hYmxlLW9wZW5nbCB0byBkZWZhdWx0IGNvbmZhcmdzCiMgIGFkZGVkIGNvbmZfcXVlc3Rpb24sIGNvbmZfeWVzbm9fYW5zd2VyLCBhbmQgY29uZl9zdHJpbmdfYW5zd2VyIGZ1bmN0aW9ucwojICBhZGRlZCBERUZDQVQgdmFyaWFibGUKIyAobGF0ZXIgdGhhdCBkYXkuLi4pCiMgIGFkZGVkIGNvbmZfcmVzZXRfcXVlc3Rpb24gZnVuY3Rpb24KIyAgYWRkZWQgZmlsZSBleGlzdGVuY2UgY2hlY2tzIHRvIHRoZSByZWdpc3RyeSBjb3B5aW5nCiMgIGZpeGVkIHByb2JsZW0gd2l0aCBuby13aW5kb3dzIGRpcmVjdG9yeSBjcmVhdGlvbgojICBzb21lIHRleHQgcmVmb3JtYXR0aW5nIGZyb20gRXJpYyBNYXJ5bmlhawojIEphbiA1IDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgdXNlIGRlZmF1bHQgY29uZmlnIGZpbGUgaW4gL2RvY3VtZW50YXRpb24vc2FtcGxlcy9jb25maWcKIyAgcmVwbGFjZSAud2luZXJjIHdpdGggfi8ud2luZS9jb25maWcgaW4gcHJpbnRlZCB0ZXh0CiMgIGFkZGVkIHVzZXIgcXVlc3Rpb24gdG8gY29udmVydCAud2luZXJjIGZpbGUoaWYgZXhpc3RzKSBvciB1c2UgdGhlIGRlZmF1bHQKIyAgICBjb25maWcgZmlsZQojICBhZGQgY29uZl9xdWVzdGlvbiB0byBhbGxvdyByb290IHRvIGluc3RhbGwgYSBsb2NhbCBjb25maWcgZmlsZSBhbmQKIyAgICByZWdpc3RyeQojIEphbiAxMiAyMDAwIC0gQ2hyaXMgTW9yZ2FuCiMgIGRpc3Rpbmd1aXNoIGJldHdlZW4gY3JlYXRpbmcgbG9jYWwgYW5kIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgZGlzcGxheSBhIG1lc3NhZ2UgYWJvdXQgdGhlIHN0YXR1cyBvZiBnbG9iYWwgY29uZmlnIGZpbGVzCiMgIG1pc2MgY2xlYW51cHMgYW5kIHJlb3JkZXJpbmcgb2YgcXVlc3Rpb25zCiMgIGFkZGVkIGNoZWNrIHRvIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGEgbm9ybWFsCiMgICAgdXNlciBhbmQgcHJpbnQgYSBtZXNzYWdlIGlmIHdpbmUgY2Fubm90IGJlIGZvdW5kCiMgRmViIDE2IDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgVXNlIGNvbmZpZy5zdGF0dXMgaW5zdGVhZCBvZiBjb25maWcuY2FjaGUgdG8gY2hlY2sgd2hldGhlciB3ZSdyZQojICAgIGNvbmZpZ3VyZWQvY29tcGlsZWQgYW5kIHRvIHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uCiMgRmViIDIwIDIwMDIgLSBBZGFtIEQuIE1vc3MKIyAgUGFydGlhbGx5IHJldmVydCBwcmV2aW91cyBjaGFuZ2VzLCBmb3JjZSBjb25maWd1cmUgdG8gd3JpdGUgYW4KIyAgICBvbGQtc3R5bGUgY29uZmlnLmNhY2hlCiMgTWFyIDI3IDIwMDIgLSBDaHJpcyBNb3JnYW4KIyAgcHJldmVudCB0aGUgdXNlciBmcm9tIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdAojICBhZGQgc2NyaXB0IGNvbW1hbmRzIHNvIHdlIHN1IHJvb3QgZm9yICdtYWtlIGluc3RhbGwnIGFuZCBvdGhlciBjb21tYW5kcwojICAgIHRoYXQgcmVxdWlyZSByb290IGFjY2VzcwojICBhZGQgdGV4dCB0byB0ZWxsIHRoZSB1c2VyIHdlIG5lZWQgdG8gcnVuIHN0dWZmIGFzIHJvb3Qgc28gdGhleSBkb24ndAojICAgIHRoaW5rIHdlIGFyZSB0cnlpbmcgdG8gcHVsbCBzb21ldGhpbmcgZnVubnkKIyBBcHIgMTQgMjAwMiAtIER1c3RpbiBOYXZlYQojICBGaXggc2VkIGNvbW1hbmQgd2hlbiBmaW5kaW5nIHJlYWwtd2luZG93cyByZWdpc3RyeSBzbyBpdCBhY3R1YWxseQojICAgYWNjZXNzZXMgYSBmaWxlICh+Ly53aW5lL2NvbmZpZykgaW5zdGVhZCBvZiBudWxsICgkQ09ORj8hKQojICBBZGRlZCBzZWFyY2ggZm9yIGNsZWFuLWluc3RhbGwgKG5vdCB1cGdyYWRlKSBXaW4yayByZWdpc3RyeQojICAobmV4dCBkYXksIGFmdGVyIHNvbWUgc2xlZXApCiMgIEZpeCBzZWQgc3RyaW5nIHdoZW4gZmluZGluZyByZWFsLXdpbmRvd3MgcmVnaXN0cnkgdG8gYWN0dWFsbHkgZmluZAojICAgd2luZG93cyBwYXJ0aXRpb24gbmFtZSBpbiBbRHJpdmUgQ10gc2VjdGlvbgojICBpdCBzaG91bGQgbm93IGFsbW9zdCBhbHdheXMgZmluZCB0aGUgd2luZG93cyBwYXJ0aXRpb24gYW5kIHJlYWwtd2luZG93cwojICByZWdpc3RyeSAoaWYgbm90LCBsZXQgbWUga25vdykKIyBBdWcgMjkgMjAwMiAtIFJvayBNYW5kZWxqYyA8cm9rLm1hbmRlbGpjQGdpbWIub3JnPgojICAtYWRkZWQgdHdvIHN5bWxpbmtzOyB3aW5kb3dzL3dpbmhlbHAuZXhlIGFuZCB3aW5kb3dzL3dpbmhscDMyLmV4ZSBiZWNhdXNlIGl0IHNlZW1zCiMgICB0aGF0IHNvbWUgYXBwcyBsb29rIGZvciB3aW5obHAzMi5leGUvd2luaGVscCB0byBkaXNwbGF5IGhlbHAKIwoKIy0tLSBkZWZhdWx0cyAoY2hhbmdlIHRoZXNlIGlmIHlvdSBhcmUgYSBwYWNrYWdlcikKQ09ORkFSR1M9Ii0tZW5hYmxlLW9wZW5nbCIgICAgIyBjb25maWd1cmUgYXJncywgZS5nLiAtLXByZWZpeD0vdXNyIC0tc3lzY29uZmRpcj0vZXRjCnByZWZpeD0vdXNyL2xvY2FsICAgICAgICAgICAgICMgaW5zdGFsbGF0aW9uIHByZWZpeApzeXNjb25mZGlyPSRwcmVmaXgvZXRjICAgICAgICAjIHdoZXJlIHdpbmUuY29uZiBhbmQgdGhlIGdsb2JhbCByZWdpc3RyeSBhcmUgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgYXJlKSBpbnN0YWxsZWQKbGliZGlyPSRwcmVmaXgvbGliICAgICAgICAgICAgIyB3aGVyZSBsaWJ3aW5lLnNvIHdpbGwgYmUgKG9yIGlzKSBpbnN0YWxsZWQKZXhkaXI9ZG9jdW1lbnRhdGlvbi9zYW1wbGVzICAgIyB3aGVyZSB0aGUgc2FtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpHQ09ORj0kc3lzY29uZmRpci93aW5lLmNvbmYgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mIGdsb2JhbCBjb25maWcgZmlsZQpMQ09ORj1+Ly53aW5lL2NvbmZpZyAgICAgICAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgbG9jYWwgY29uZmlnIGZpbGUKQklORElTVD1ubyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGNhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UgY29uZmlnIHNjcmlwdApET0dMT0JBTENPTkY9YXV0byAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIHdpbmUuY29uZgpET0xPQ0FMQ09ORj1hdXRvICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2dlbmVyYXRlIGxvY2FsY29uZgpET1dDSEs9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBleGlzdGluZy13aW5kb3dzIGluc3RhbGxhdGlvbgpET1dJTkU9YXV0byAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gYXV0b2NvbmZpZ3VyZSBuby13aW5kb3dzIGluc3RhbGxhdGlvbgpET1JFRz1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CkRPQVBQPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGFwcGxpY2F0aW9ucywgZGlzdHJpYnV0ZWQgd2l0aCBXaW5lClNZU1JFRz15ZXMgICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwgKHN5c3RlbS1kZWZhdWx0KQpDT05WQ09ORj1ubwkJICAgICAgIyB3aGV0aGVyIHdlIGFyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIC53aW5lcmMgb3Igbm90CgojICJtYWtlIGluc3RhbGwiIHN0aWxsIGluc3RhbGxzIHRoZSBkbGxzIGludG8gJGxpYmRpciwgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCiMgKERMTFBBVEggc2hvdWxkIHBvaW50IHRvIHRoZW0gaWYvd2hlbiB0aGV5IGFyZSBub3QgaW4gc3RhbmRhcmQgbGQuc28gcGF0aHMpCkRMTFBBVEg9JGxpYmRpci93aW5lICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBkbGwgLnNvIGZpbGVzIChleGNlcHQgbGlid2luZS5zbykKCiMgaGF2aW5nIHRoZSBXaW5lIGRlYnVnZ2VyIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkgd2lsbCBiZSBhIHBsdXMgZm9yIHVzCkRFQlVHR0VSPSRiaW5kaXIvd2luZWRiZyAgICAgICMgdGhlIChpbnN0YWxsZWQpIHBhdGggb2Ygd2luZWRiZwpIREVCVUdHRVI9ZGVidWdnZXIvd2luZWRiZyAgICAjIHRoZSAobm9uLWluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCgojIHRoaXMgaXMgb25seSBmb3IgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxscwpXSU5FQ09ORj10b29scy93aW5lY29uZiAgICAgICAjIHBhdGggdG8gdGhlIHdpbmVjb25mIHBlcmwgc2NyaXB0CgojIHRoaXMgaXMgb25seSBmb3Igbm8td2luZG93cyBpbnN0YWxscwpXSU5FSU5JPSRleGRpci9jb25maWcgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luZSBjb25maWcgZmlsZSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHBhdGggdG8gdGhlIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdFRElUPSRiaW5kaXIvcmVnZWRpdCAgICAgICAjIHBhdGggdG8gdGhlIHJlZ2VkaXQgd2luZWxpYiBhcHBsaWNhdGlvbgpERUZSRUc9d2luZWRlZmF1bHQucmVnICAgICAgICAjIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2VkaXQKIyBDUk9PVD0vdmFyL3dpbmUgICAgICAgICAgICAgIyBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgbG4gLXNmICRsaWJkaXIvd2luZS8kMS5leGUuc28gJDIKfQoKI3B1dHMgd2luZG93cyBhcHBsaWNhdGlvbnMgcmVwbGFjZW1lbnRzIHRvIHdpbmRvd3MgZGlyZWN0b3JpZXMsCiNjb25maWd1cmVzIHRoZW0KZnVuY3Rpb24gY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zIHsKICBsaW5rX2FwcCByZWdlZGl0ICAgICAgIiRDUk9PVC93aW5kb3dzL3JlZ2VkaXQuZXhlIgogIGxpbmtfYXBwIHVuaW5zdGFsbGVyICAiJENST09UL3dpbmRvd3MvdW5pbnN0YWxsLmV4ZSIKICBsaW5rX2FwcCB3Y21kICAgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2NtZC5leGUiCiAgbGlua19hcHAgY29udHJvbCAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb250cm9sLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2hlbHAuZXhlIgogIGxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvbm90ZXBhZC5leGUiCiAgbGlua19hcHAgcHJvZ21hbiAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9wcm9nbWFuLmV4ZSIKICBsaW5rX2FwcCByZWdzdnIzMiAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3JlZ3N2cjMyLmV4ZSIKICBsaW5rX2FwcCB3aW5lbWluZSAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3dpbm1pbmUuZXhlIgogIGxpbmtfYXBwIHdpbnZlciAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvd2ludmVyLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3dpbmhlbHAuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjczIgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgogIGlmICEgWyAtZiBjb25maWd1cmUgXQogIHRoZW4gewogICAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogICAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogICAgZXhpdCAxCiAgfQogIGZpCgogIGlmIFsgYHdob2FtaWAgPT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyB3aW5laW5zdGFsbCBhcyByb290LCB0aGlzIGlzIG5vdCBhZHZpc2FibGUuIFBsZWFzZSByZXJ1biBhcyBhIHVzZXIuIgogICAgZWNobyAiQWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCgogICMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgogIGhhc2ggcnBtICY+L2Rldi9udWxsCiAgUkVUPSQ/CiAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyBEb25lLgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgogICAgICAgICAgZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzIGJldHdlZW4gUlBNIgogICAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgd2luZSBiaW5hcnkgc3RpbGwgYXZhaWxhYmxlCiAgaWYgWyAtbiAiYHdoaWNoIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAnL3dpbmUnYCIgXTsgdGhlbgogICAgZWNobyAiV2FybmluZyAhISB3aW5lIGJpbmFyeSAoc3RpbGwpIGZvdW5kLCB3aGljaCBtYXkgaW5kaWNhdGUiCiAgICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICAgIGVjaG8gIllvdSBtaWdodCB3YW50IHRvIGFib3J0IGFuZCB1bmluc3RhbGwgV2luZSBmaXJzdC4iCiAgICBzdGRfc2xlZXAKICBmaQoKICAjIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgogIGlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgICBzdGRfc2xlZXAKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogIH0KICBlbHNlIHsKICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogICAgZWNobwogICAgaWYgISAuL2NvbmZpZ3VyZSAtQyAkQ09ORkFSR1MKICAgIHRoZW4gewogICAgICBlY2hvCiAgICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogICAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICAgIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogICMgbm93IGRvIHRoZSBjb21waWxhdGlvbiBhbmQgaW5zdGFsbCwgd2UgbmVlZCB0byBhbHdheXMgZG8gdGhpcyBiZWNhdXNlIHdlCiAgIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICAjIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgd2luZQogICAgZWNobwogICAgZWNobyAiV2UgbmVlZCB0byBpbnN0YWxsIHdpbmUgYXMgcm9vdCB1c2VyLCBkbyB5b3Ugd2FudCB1cyB0byBidWlsZCB3aW5lLCIKICAgIGVjaG8gIidzdSByb290JyBhbmQgaW5zdGFsbCBXaW5lPyAgRW50ZXIgJ25vJyB0byBjb250aW51ZSB3aXRob3V0IGluc3RhbGxpbmciCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgoKICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgICMgc3RhcnQgb3V0IHdpdGggdGhlIGJhc2ljIGNvbW1hbmQKICAgICAgc3Vjb21tYW5kPSJtYWtlIGluc3RhbGwiCgogICAgICAjIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSAkbGliZGlyIGluIHRoZWlyIGxkLnNvLmNvbmYgYWRkIHRoaXMKICAgICAgIyB0byBvdXIgc3Vjb21tYW5kIHN0cmluZwogICAgICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdCiAgICAgIHRoZW4KICAgICAgICBpZiAhIGdyZXAgLXFzICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYKICAgICAgICB0aGVuIHsKICAgICAgICAgIGVjaG8KICAgICAgICAgIGVjaG8gIiRsaWJkaXIgZG9lc24ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgaXQgd2lsbCBiZSBhZGRlZCIKICAgICAgICAgIGVjaG8gIndoZW4gd2UgcGVyZm9ybSB0aGUgaW5zdGFsbC4uLiIKICAgICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDtlY2hvICRsaWJkaXI+Pi9ldGMvbGQuc28uY29uZiIKICAgICAgICB9CiAgICAgICAgZmkKICAgICAgICAjIHJ1biBsZGNvbmZpZyBhbHdheXMganVzdCBpbiBjYXNlIHNvbWUgdXBkYXRlZCBmaWxlcyBkb250IGdldCBsaW5rZWQKICAgICAgICBzdWNvbW1hbmQ9IiRzdWNvbW1hbmQ7JGFjX2N2X3BhdGhfTERDT05GSUciCiAgICAgIGZpCgogICAgICBlY2hvCgogICAgICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgICAgIGVjaG8gImluIHRoZSBtZWFudGltZS4uLiIKICAgICAgZWNobwogICAgICBzdGRfc2xlZXAKCiAgICAgICMgdHJ5IHRvIGp1c3QgbWFrZSB3aW5lLCBpZiB0aGlzIGZhaWxzICdtYWtlIGRlcGVuZCcgYW5kIHRyeSB0byByZW1ha2UKICAgICAgaWYgISB7IG1ha2U7IH0KICAgICAgdGhlbiB7CiAgICAgICAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICAgICAgICB0aGVuIHsKICAgICAgICAgIGVjaG8KICAgICAgICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgICAgICBleGl0IDEKICAgICAgICB9CiAgICAgICAgZmkKICAgICAgfQogICAgICBmaQogICAgICBlY2hvCgogICAgICBlY2hvICJQZXJmb3JtaW5nICdtYWtlIGluc3RhbGwnIGFzIHJvb3QgdG8gaW5zdGFsbCBiaW5hcmllcywgZW50ZXIgcm9vdCBwYXNzd29yZCIKCiAgICAgIHN0ZF9zbGVlcAoKICAgICAgaWYgISBzdSByb290IC1jICIkc3Vjb21tYW5kIgogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiRWl0aGVyIHlvdSBlbnRlcmVkIGFuIGluY29ycmVjdCBwYXNzd29yZCBvciB3ZSBmYWlsZWQgdG8gcnVuIgogICAgICAgIGVjaG8gIickc3Vjb21tYW5kJyBjb3JyZWN0bHkuIgogICAgICAgIGVjaG8gIklmIHlvdSBkaWRuJ3QgZW50ZXIgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIHRoZW4gcGxlYXNlIHJlcG9ydCB0aGlzIgogICAgICAgIGVjaG8gImVycm9yIGFuZCBhbnkgc3RlcHMgdG8gcG9zc2libHkgcmVwcm9kdWNlIGl0IHRvIgogICAgICAgIGVjaG8gImh0dHA6Ly9idWdzLndpbmVocS5jb20vIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKCiAgICAgIGVjaG8KCiAgICAgICMgc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIG9uIHRoZSB1c2VycyBzeXN0ZW0sIGlmIG5vdCBwcm9tcHQgdGhlbQogICAgICAjIGFuZCB0aGVuIGV4aXQKICAgICAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgICAgIHRoZW4KICAgICAgICBlY2hvICJDb3VsZCBub3QgZmluZCB3aW5lIG9uIHlvdXIgc3lzdGVtLiAgUnVuIHdpbmVpbnN0YWxsIGFzIHJvb3QgdG8gaW5zdGFsbCB3aW5lIgogICAgICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkV4aXRpbmcgd2luZWluc3RhbGwiCiAgICAgICAgZXhpdCAxOwogICAgICBmaQogICAgfQogICAgZWxzZSB7CiAgICAgICMgdXNlciBkaWRuJ3Qgd2FudCB0byBpbnN0YWxsIHdpbmUgc28gdGVsbCB0aGVtIGFib3V0IHJ1bm5pbmcgZnJvbSB0aGUKICAgICAgIyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2V0IHNvbWUgc3R1ZmYgdXAgZm9yIHRoZW0KCiAgICAgICMgc2V0dXAgdG8gcnVuIGZyb20gY3VycmVudCBkaXJlY3RvcnkKICAgICAgRExMUEFUSD0iJFBXRC9kbGxzIgogICAgICBpZiBbIC16ICIkTERfTElCUkFSWV9QQVRIIiBdCiAgICAgIHRoZW4gTERfTElCUkFSWV9QQVRIPSIkUFdEOiRETExQQVRIIgogICAgICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogICAgICBmaQogICAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgICAgIERFQlVHR0VSPSIkUFdELyRIREVCVUdHRVIiCiAgICAgIGVjaG8KICAgICAgZWNobyAiTk9URSEgVG8gcnVuIFdpbmUgd2l0aG91dCBpbnN0YWxsaW5nLCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgogICAgICBlY2hvICJMRF9MSUJSQVJZX1BBVEggdG8gJFBXRDokRExMUEFUSCIKICAgICAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKICAgICAgZWNobwogICAgfQogICAgZmkKICB9CiAgZmkgIyBbIGB3aG9hbWlgICE9ICdyb290JyBdCgp9CmZpICMgQklORElTVAoKIyBub3cgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgZ2VuZXJhdGUgd2luZS5jb25mCmlmIFsgLXogIiRET0dMT0JBTENPTkYiIF0KdGhlbgogIERPR0xPQkFMQ09ORj1hdXRvCmZpCgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN5c3RlbSB3aW5lLmNvbmYKICBpZiBbICEgLWYgJEdDT05GIF0gJiYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgRE9HTE9CQUxDT05GPW5vCiAgICBlY2hvICJDcmVhdGlvbiBvZiBhIGdsb2JhbCBjb25maWcgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHdpbmVpbnN0YWxsIGF0IHRoaXMiCiAgICBlY2hvICJ0aW1lLiAgV2hlbiB0aGUgY29uZmlndXJhdGlvbiBhcmNoaXRlY3R1cmUgaXMgY2xlYW5lZCB1cCB0aGlzIGZ1bmN0aW9uYWxpdHkiCiAgICBlY2hvICJ3aWxsIGJlIHJlc3RvcmVkIHRvIHdpbmVpbnN0YWxsLiIKICAgIGVjaG8KICBmaQp9CmZpCgppZiBbICIkRE9MT0NBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgdGhlIHVzZXIgaXMgcm9vdCwgaWYgc28sIGV4cGxpY2l0bHkgYXNrIHRoZW0gaWYgdGhleSB3YW50IGEKICAjIGxvY2FsIGNvbmZpZyBmaWxlCiAgaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIGFzIHJvb3QuICBEbyB5b3Ugd2FudCBhIGxvY2FsIGNvbmZpZyBmaWxlLCIKICAgIGVjaG8gImZpbGUsIH4vLndpbmUvY29uZmlnLCBjcmVhdGVkPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICBlbHNlCiAgICAjIGlmIHRoZSB1c2VyIGhhcyBhbiBleGlzdGluZyBjb25maWcgZmlsZSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdXMgdG8KICAgICMgb3ZlcndyaXRlIGl0LCBvdGhlcndpc2UganVzdCBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdG8gY3JlYXRlIG9uZQogICAgaWYgWyAtZiAiJExDT05GIiBdCiAgICB0aGVuCiAgICAgIGVjaG8gIkZvdW5kIGV4aXN0aW5nICRMQ09ORiwgZG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoaXMiCiAgICAgIGVjaG8gImV4aXN0aW5nIFdpbmUgY29uZmlndXJhdGlvbiBmaWxlPyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICAgIGVjaG8KICAgICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICAgIHRoZW4KICAgICAgewogICAgICAgIGVjaG8gIldvdWxkIHlvdSBsaWtlIHRvIG1ha2UgYSBiYWNrdXAgb2YgdGhpcyBvbGQgY29uZmlnIGZpbGU/IgogICAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgICAgZWNobwogICAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICAgIHRoZW4KICAgICAgICB7CiAgICAgICAgICBlY2hvICJSZW5hbWluZyAkTENPTkYgdG8gJExDT05GLm9sZCIKICAgICAgICAgIG12IC1mICIkTENPTkYiICIkTENPTkYub2xkIgogICAgICAgICAgZWNobwogICAgICAgIH0KICAgICAgICBmaQogICAgICB9CiAgICAgIGZpCiAgICBlbHNlCiAgICB7CiAgICAgIGVjaG8gIkNyZWF0ZSBsb2NhbCBjb25maWcgZmlsZSB+Ly53aW5lL2NvbmZpZz8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4KICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgfQogICAgZmkKICBmaQp9CmZpCgojIGdlbmVyYXRlICRUTVBDT05GIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gLW4gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiAtaW5pZmlsZSAiJFdJTkVJTkkiID4gJFRNUENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHID4gL2Rldi9udWxsCgogICAgICBlY2hvICIgbm90IGZvdW5kLiAobm8gbWF0Y2hpbmcgL2V0Yy9mc3RhYiBtb3VudCBlbnRyeSBmb3VuZCkiCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgbm90IGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBzbyBJIGFzc3VtZSB5b3Ugd2FudCIgXAogICAgICAgImEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4gQW0gSSBjb3JyZWN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHdpbmRvd3Nfbm90X2ZvdW5kIFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIE1ha2Ugc3VyZSB5b3VyIFdpbmRvd3MgcGFydGl0aW9uIGlzIG1vdW50ZWQgYW5kIHRyeSBhZ2FpbiwiIFwKICAgICAgICAgIm9yIGNyZWF0ZSAkTENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgoKICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiB3aW5kb3dzX2ZvdW5kCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IHdpbmRvd3NfZm91bmQgXAogICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogICAgICBET1dJTkU9bm8KICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4KICBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICAjIHNldCBhbiBhcHByb3ByaWF0ZSBEQ1JPT1QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQoKICBpZiBbIC1mIH4vLndpbmVyYyBdCiAgdGhlbiB7CiAgICBjb25mX3F1ZXN0aW9uIG1lZGl1bSBjb252ZXJ0X2NvbmZpZyBcCiAgICAgIkkgZm91bmQgdGhlIG9sZCB2ZXJzaW9uIFdpbmUgY29uZmlnIGZpbGUsIC53aW5lcmMsIGluIHlvdXIgIiBcCiAgICAgImhvbWUgZGlyZWN0b3J5LiAgSSBjYW4gY29udmVydCB0aGlzIHRvIHRoZSBuZXcgZm9ybWF0IG9yIHVzZSB0aGUiIFwKICAgICAibmV3IGRlZmF1bHQgV2luZSBjb25maWcgZmlsZS4gQ29udmVydD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdCiAgICB0aGVuIHsKICAgICAgV0lORUlOST1+Ly53aW5lcmMKICAgICAgQ09OVkNPTkY9eWVzCiAgICB9CiAgICBmaQogIH0KICBlbHNlIHsKCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkcml2ZWNfcGF0aCBcCiAgICAgIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiIgXAogICAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICAgInN0YXJ0IG1lbnUgZW50cmllcywgYW5kIG90aGVyIHRoaW5ncyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIgXAogICAgICJXaGVyZSB3b3VsZCB5b3UgbGlrZSB5b3VyIGZha2UgQyBkcml2ZSB0byBiZSBwbGFjZWQ/IgogICAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgICBkbyB7CiAgICAgIGNvbmZfc3RyaW5nX2Fuc3dlciAiKGRlZmF1bHQgaXMgJERDUk9PVCkgIgogICAgICBbIC16ICIkQU5TV0VSIiBdICYmIEFOU1dFUj0iJERDUk9PVCIKICAgICAgaWYgISBbIC1kICIkQU5TV0VSIiBdCiAgICAgIHRoZW4gewogICAgICAgIGlmIG1rZGlyIC1wICIkQU5TV0VSIgogICAgICAgIHRoZW4gQ1JPT1Q9IiRBTlNXRVIiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRGlyZWN0b3J5ICRBTlNXRVIgY2FuJ3QgYmUgY3JlYXRlZCAhIgogICAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiBkcml2ZWNfcGF0aAogICAgICAgIGZpCiAgICAgIH0KICAgICAgZWxzZSBDUk9PVD0iJEFOU1dFUiIKICAgICAgZmkKICAgIH0KICAgIGRvbmUKICAgIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKCiAgICBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcwogICAgY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zCiAgfQogIGZpCgogICMgY3JlYXRlICRMQ09ORiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSAkV0lORUlOSQogIGlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdICYmIFsgIiRDT05WQ09ORiIgPSAnbm8nIF0KICB0aGVuIHsKICAgIHNlZCAic3xcIlBhdGhcIiA9IFwiL2NcIlwkfFwiUGF0aFwiID0gXCIke0NST09UfVwifCIgJFdJTkVJTkkgPiAkVE1QQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iIFwKICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQoKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmZpCmVjaG8KCiNpbnN0YWxsIHRoZSBsb2NhbCBjb25maWcgZmlsZSAkTENPTkYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtdyB+Ly53aW5lIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lCiAgZmkKCiAgaWYgWyAiJENPTlZDT05GIiA9ICdubycgXQogIHRoZW4KICAgIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAogIGZpCmVsc2UKICBET1JFRz1ubwpmaQoKI2luc3RhbGwgdGhlIGdsb2JhbCBjb25maWcgZmlsZSAkR0NPTkYKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLWYgJHN5c2NvbmZkaXIgXQogIHRoZW4KICAgIG1rZGlyIC1wICRzeXNjb25mZGlyCiAgZmkKCiAgY3AgJFRNUENPTkYgJEdDT05GID4gL2Rldi9udWxsCmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBDUk9PVD1gc2VkIC1uICcvXlxbRHJpdmUgQ1xdJC8sL15cWy4qXF0kLyBzL15cIlBhdGhcIiA9IFwiXCguKlwpXCIvXDEvcCcgJExDT05GYAogIGVjaG8gIkNoZWNraW5nIGZvciByZWFsIFdpbmRvd3MgcmVnaXN0cnkuLi4iCiAgaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmRhdCIgXQogIHRoZW4gRE9SRUc9bm8KICBlbGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1QvV0lOTlQvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdlZGl0Li4uIgogICAgKGNkIHByb2dyYW1zL3JlZ2VkaXQ7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgZWRpdCBjb25maWcgZmlsZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gcmVnZWRpdCB1bmRlciBYCiAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICB0aGVuCiAgICBtdiAkV0lORUlOSSAkV0lORUlOSS5uZXcKICAgIHNlZCAicy9HcmFwaGljc0RyaXZlcj0uKi9HcmFwaGljc0RyaXZlcj10dHlkcnYvIiAkV0lORUlOSS5uZXcgPiAkV0lORUlOSQogIGVsc2UKICAgIG12ICRMQ09ORiAkTENPTkYubmV3CiAgICBzZWQgInMvXCJHcmFwaGljc0RyaXZlclwiID0gLiovXCJHcmFwaGljc0RyaXZlclwiID0gXCJ0dHlkcnZcIi8iICRMQ09ORi5uZXcgPiAkTENPTkYKICBmaQoKICAjIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aW5laW5zdGFsbC5yZWcgd2l0aCBmaXhlZCBkZWJ1Z2dlciBwYXRoCiAgJERFRkNBVCAkREVGUkVHIHwgc2VkICJzfGRlYnVnZ2VyL3dpbmVkYmd8JHtERUJVR0dFUn18IiA+ICRUTVBSRUcKCiAgZWNobyAiSW5zdGFsbGluZyBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKICBlY2hvCiAgaWYgISAkUkVHRURJVCAkVE1QUkVHID4gL2Rldi9udWxsCiAgdGhlbiB7CiAgICBybSAtZiAkVE1QUkVHCiAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2VkaXRfZXJyb3IKICAgIGNvbmZfcXVlc3Rpb24gaGlnaCByZWdlZGl0X2Vycm9yCiAgICBleGl0IDEKICB9CiAgZWxzZSB7CiAgICAjIGlmIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gYSAud2luZXJjIGZpbGUsIHJ1bm5pbmcgcmVnZWRpdCBvbmNlCiAgICAjIHdpbGwgT05MWSBjb252ZXJ0IC53aW5lcmMgLT4gfi8ud2luZS9jb25maWcsIGl0IHdpbGwgbm90IGltcG9ydCB0aGUKICAgICMgcmVnaXN0cnkgZGF0YS4gIHNvIGlmIHdlIGFyZSBjb252ZXJ0aW5nIHdlIG5lZWQgdG8gcnVuIHJlZ2VkaXQgdHdpY2UKICAgIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgICB0aGVuCiAgICAgIGlmICEgJFJFR0VESVQgJFRNUFJFRyA+IC9kZXYvbnVsbAogICAgICB0aGVuCiAgICAgICAgcm0gLWYgJFRNUFJFRwogICAgICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2VkaXRfZXJyb3IKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnZWRpdF9lcnJvcgogICAgICAgIGV4aXQgMQogICAgICBlbHNlCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGVjaG8KICAgICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgIGZpCiAgfQogIGZpCiAgcm0gLWYgJFRNUFJFRwogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQoKICAjIGlmIHdlIGNvbnZlcnRlZCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgZ3JhcGhpY3MgZHJpdmVyIGJhY2sgYW5kCiAgIyByZXN0b3JlIHRoZSBvcmlnaW5hbCAud2luZXJjIGZpbGUKICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogIHRoZW4KICAgICBtdiAkV0lORUlOSS5uZXcgJFdJTkVJTkkKICBmaQoKICBzZWQgInMvXCJHcmFwaGljc0RyaXZlclwiID0gLiovXCJHcmFwaGljc0RyaXZlclwiID0gXCJ4MTFkcnZcIi8iICRMQ09ORiA+ICRMQ09ORi5uZXcKICBtdiAkTENPTkYubmV3ICRMQ09ORgp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJERPUkVHIiA9ICd5ZXMnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBjbGVhbnVwIGFueSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBtYXkgcmVtYWluCmlmIFsgLWYgJFRNUENPTkYgXQp0aGVuIHJtIC1mICRUTVBDT05GCmZpCmlmIFsgLWYgJFRNUFJFRyBdCnRoZW4gcm0gLWYgJFRNUFJFRwpmaQoKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIKCmV4aXQgMAo=