IyEvdXNyL2Jpbi9lbnYgdGNsc2gKIyAtKi1UQ0wtKi0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgICAgICAgICAgICAgICAgICAgQ0FERU5DRSBDT1BZUklHSFQgTk9USUNFCiMgICAgICAgICCpIDIwMDgtMjAxMyBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgRm91bmRhdGlvbiBGbG93IGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHBlcmZvcm0gc3BlY2lhbGl6ZWQKIyB0YXNrcy4KIwojIFRoaXMgd29yayBtYXkgbm90IGJlIGNvcGllZCwgcmUtcHVibGlzaGVkLCB1cGxvYWRlZCwgb3IgZGlzdHJpYnV0ZWQgaW4gYW55IHdheSwKIyBpbiBhbnkgbWVkaXVtLCB3aGV0aGVyIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCiMgZnJvbSBDYWRlbmNlLiBOb3R3aXRoc3RhbmRpbmcgYW55IHJlc3RyaWN0aW9ucyBoZXJlaW4sIHN1YmplY3QgdG8gY29tcGxpYW5jZQojIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDYWRlbmNlIHNvZnR3YXJlIGxpY2Vuc2UgYWdyZWVtZW50IHVuZGVyCiMgd2hpY2ggdGhpcyBtYXRlcmlhbCB3YXMgcHJvdmlkZWQsIHRoaXMgbWF0ZXJpYWwgbWF5IGJlIGNvcGllZCBhbmQgaW50ZXJuYWxseQojIGRpc3RyaWJ1dGVkIHNvbGVseSBmb3IgaW50ZXJuYWwgcHVycG9zZXMgZm9yIHVzZSB3aXRoIENhZGVuY2UgdG9vbHMuCiMKIyBUaGlzIHdvcmsgaXMgQ2FkZW5jZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIG1heSB1bmRlciBubyBjaXJjdW1zdGFuY2VzIGJlCiMgZ2l2ZW4gdG8gdGhpcmQgcGFydGllcywgbmVpdGhlciBpbiBvcmlnaW5hbCBub3IgaW4gbW9kaWZpZWQgdmVyc2lvbnMsIHdpdGhvdXQKIyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBDYWRlbmNlLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcwojIHRoZSBwcm9wcmlldGFyeSBhbmQgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIENhZGVuY2Ugb3IgaXRzIGxpY2Vuc29ycywgYW5kCiMgaXMgc3VwcGxpZWQgc3ViamVjdCB0bywgYW5kIG1heSBiZSB1c2VkIG9ubHkgYnkgQ2FkZW5jZSdzIGN1cnJlbnQgY3VzdG9tZXJzCiMgaW4gYWNjb3JkYW5jZSB3aXRoLCBhIHByZXZpb3VzbHkgZXhlY3V0ZWQgbGljZW5zZSBhZ3JlZW1lbnQgYmV0d2VlbiBDYWRlbmNlCiMgYW5kIGl0cyBjdXN0b21lci4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVEhJUyBNQVRFUklBTCBJUyBQUk9WSURFRCBCWSBDQURFTkNFICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiMgSU4gTk8gRVZFTlQgU0hBTEwgQ0FERU5DRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMCiMgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTICBNQVRFUklBTCwgRVZFTiBJRgojIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgRm91bmRhdGlvbiBGbG93IENvZGUgR2VuZXJhdG9yCiMgVmVyc2lvbiA6IDE3LjEwLXAwMDNfMQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFBhcnNlIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluIHRvIHRoZSBzY3JpcHQuICBUaGVzZSBzZXQgdXAgdGhlIGVudmlyb25tZW50ICMKIyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgeyhbZmlsZSB0YWlsIFtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXSA9PSAiZW5jb3VudGVyIikgfHwgKFtmaWxlIHRhaWwgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dID09ICJ2ZWxvY2l0eSIpIHx8XAogICAgKFtmaWxlIHRhaWwgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dID09ICJnZW51cyIpIHx8IChbZmlsZSB0YWlsIFtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXSA9PSAiaW5ub3Z1cyIpfSB7CiAgIHB1dHMgIjxGRj4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICBwdXRzICI8RkY+IExvYWRpbmcgdGhlIEZvdW5kYXRpb24gRmxvdyBDb2RlIEdlbmVyYXRvciIKICAgcHV0cyAiPEZGPiBWZXJzaW9uIDogMTcuMTAtcDAwM18xIgojICAgcHV0cyAiPEZGPiBBdmFpbGFibGUgUHJvY2VkdXJlczoiCiAgIHB1dHMgIjxGRj4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2NyaXB0X3Jvb3QpXX0geyAKICAgICBzZXQgZGVmYXVsdF9zY3JpcHRfcGF0aCAgJHZhcnMoc2NyaXB0X3Jvb3QpCiAgICAgc2V0IHZhcnMoZXhlY3V0ZV9zdHJpbmcpIFtmb3JtYXQgIiVzICVzIiAkdmFycyhzY3JpcHRfcm9vdCkvZ2VuX2VkaV9mbG93LnRjbCAkYXJndl0KICAgfSBlbHNlIHsKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNjcmlwdF9wYXRoKV19IHsKICAgICAgICAgc2V0IHZhcnMoc2NyaXB0X3Jvb3QpICAkdmFycyhzY3JpcHRfcGF0aCkKICAgICAgICAgc2V0IGRlZmF1bHRfc2NyaXB0X3BhdGggICR2YXJzKHNjcmlwdF9wYXRoKQogICAgICAgICBzZXQgdmFycyhleGVjdXRlX3N0cmluZykgW2Zvcm1hdCAiJXMgJXMiICR2YXJzKHNjcmlwdF9wYXRoKS9nZW5fZWRpX2Zsb3cudGNsICRhcmd2XQogICAgICB9IGVsc2UgeyAKIyAgICAgIHB1dHMgIjxGRj4gVmFyaWFibGUgdmFycyhzY3JpcHRfcm9vdCkgcmVxdWlyZWQgZm9yIE1ha2VmaWxlIGdlbmVyYXRpb24gLi4uIgogICAgICAgICBwdXRzICI8RkY+IFZhcmlhYmxlIHZhcnMoc2NyaXB0X3Jvb3QpIG5vdCBkZWZpbmVkIC4uLiBzZXR0aW5nIHRvIFtmaWxlIGRpcm5hbWUgW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFtmaWxlIGRpcm5hbWUgW2ZpbGUgZGlybmFtZSBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXV1dXV1dL3NoYXJlL0ZvdW5kYXRpb25GbG93cy9TQ1JJUFRTIgogICAgICAgICBzZXQgZGVmYXVsdF9zY3JpcHRfcGF0aCBbZmlsZSBkaXJuYW1lIFtmaWxlIGRpcm5hbWUgW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFtmaWxlIGRpcm5hbWUgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dXV1dXS9zaGFyZS9Gb3VuZGF0aW9uRmxvd3MvU0NSSVBUUwogICAgICAgICBzZXQgdmFycyhzY3JpcHRfcm9vdCkgJGRlZmF1bHRfc2NyaXB0X3BhdGgKICAgICAgfQogICB9Cn0gZWxzZSB7CiAgIHNldCB2YXJzKGV4ZWN1dGVfc3RyaW5nKSBbZm9ybWF0ICIlcyAlcyAlcyIgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV0gW2ZpbGUgbm9ybWFsaXplICRhcmd2MF0gJGFyZ3ZdCiAgIAogICBzZXQgbm9ybWFsaXplZCBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXQogICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJG5vcm1hbGl6ZWRdfSB7CiAgICAgIHNldCBkZWZhdWx0X3NjcmlwdF9wYXRoICRub3JtYWxpemVkCiAgIH0gZWxzZWlmIHtbZmlsZSBpc2RpcmVjdG9yeSBbZmlsZSBkaXJuYW1lICRub3JtYWxpemVkXV19IHsKICAgICAgc2V0IGRlZmF1bHRfc2NyaXB0X3BhdGggW2ZpbGUgZGlybmFtZSAkbm9ybWFsaXplZF0KICAgfQogICAKfQoKc2V0IHZhcnMoc2NyaXB0X3BhdGgpICRkZWZhdWx0X3NjcmlwdF9wYXRoCiNwdXRzICR2YXJzKHNjcmlwdF9wYXRoKQojCiMgQ2hlY2sgdGhlIHBhdGhzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlcyB0aGF0IHdlIG5lZWQgYWN0dWFsbHkgZXhpc3QKIwppZiB7IVtmaWxlIGV4aXN0cyAkdmFycyhzY3JpcHRfcGF0aCkvSU5OT1ZVUy9wcm9jcy50Y2xdfSB7CiAgIHB1dHMgW2Zvcm1hdCAkRkZNTTo6bWlzc2luZ0ZpbGVzICR2YXJzKHNjcmlwdF9wYXRoKS9JTk5PVlVTL3Byb2NzLnRjbF0KICAgZXhpdCAtMQp9CmlmIHshW2ZpbGUgZXhpc3RzICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvdXRpbHMudGNsXX0gewogICBwdXRzIFtmb3JtYXQgJEZGTU06Om1pc3NpbmdGaWxlcyAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL3V0aWxzLnRjbF0KICAgZXhpdCAtMQp9CgojCiMgU291cmNlIHRoZSBvdGhlciBUY2wgZmlsZXMgdG8gZXhlY3V0ZSB0aGUgZmxvdy4gIFRoZW4gZG8gc28KIwojcHV0cyAiPEZGPiBTb3VyY2luZyAkdmFycyhzY3JpcHRfcGF0aCkvSU5OT1ZVUy9wcm9jcy50Y2wiCnNvdXJjZSAiJHZhcnMoc2NyaXB0X3BhdGgpL0lOTk9WVVMvcHJvY3MudGNsIgppZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHNjcmlwdF9wYXRoKS9SQy9wcm9jcy50Y2xdfSB7CiMgICBwdXRzICI8RkY+IFNvdXJjaW5nICR2YXJzKHNjcmlwdF9wYXRoKS9SQy9wcm9jcy50Y2wiCiAgIHNvdXJjZSAiJHZhcnMoc2NyaXB0X3BhdGgpL1JDL3Byb2NzLnRjbCIKfQojcHV0cyAiPEZGPiBTb3VyY2luZyAkdmFycyhzY3JpcHRfcGF0aCkvSU5OT1ZVUy91dGlscy50Y2wiCnNvdXJjZSAiJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy91dGlscy50Y2wiCgppZiB7KFtmaWxlIHRhaWwgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dID09ICJ0Y2xzaCIpfSB7CiAgIHNldCBjb21tYW5kICJGRjo6Z2VuX2Zsb3cgJGFyZ3YiCiAgIGV2YWwgJGNvbW1hbmQKICAgZXhpdCAwCn0K