ZGlmZiAtLWdpdCBhL21rc2gvQW5kcm9pZC5tayBiL21rc2gvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzYjg2My4uMDAwMDAwMAotLS0gYS9ta3NoL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIENvcHlyaWdodCDCqSAyMDEwCi0jCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgotIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KLQotTE9DQUxfUEFUSDo9CQkkKGNhbGwgbXktZGlyKQotCi0KLSMgL3N5c3RlbS9ldGMvbWtzaHJjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PQkJbWtzaHJjCi1MT0NBTF9NT0RVTEVfVEFHUzo9CXNoZWxsX21rc2gKLUxPQ0FMX01PRFVMRV9DTEFTUzo9CUVUQwotTE9DQUxfTU9EVUxFX1BBVEg6PQkkKFRBUkdFVF9PVVQpL2V0YwotTE9DQUxfU1JDX0ZJTEVTOj0JJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLQotIyAvc3lzdGVtL2Jpbi9ta3NoCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PQkJbWtzaAotTE9DQUxfTU9EVUxFX1RBR1M6PQlzaGVsbF9ta3NoCi0KLSMgbWtzaCBzb3VyY2UgZmlsZXMKLUxPQ0FMX1NSQ19GSUxFUzo9CXNyYy9sYWxsb2MuYyBzcmMvZWRpdC5jIHNyYy9ldmFsLmMgc3JjL2V4ZWMuYyBcCi0JCQlzcmMvZXhwci5jIHNyYy9mdW5jcy5jIHNyYy9oaXN0cmFwLmMgc3JjL2pvYnMuYyBcCi0JCQlzcmMvbGV4LmMgc3JjL21haW4uYyBzcmMvbWlzYy5jIHNyYy9zaGYuYyBcCi0JCQlzcmMvc3luLmMgc3JjL3RyZWUuYyBzcmMvdmFyLmMKLQotTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJjCi0KLUxPQ0FMX0NfSU5DTFVERVM6PQkkKExPQ0FMX1BBVEgpL3NyYwotIyBhZGRpdGlvbmFsIGZsYWdzIGZpcnN0LCB0aGVuIGZyb20gTWFrZWZyYWcuaW5jOiBDRkxBR1MsIENQUEZMQUdTCi1MT0NBTF9DRkxBR1M6PQkJLURNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMPVwiL3N5c3RlbS9iaW4vc2hcIiBcCi0JCQktRE1LU0hfREVGQVVMVF9UTVBESVI9XCIvc3FsaXRlX3N0bXRfam91cm5hbHNcIiBcCi0JCQktRE1LU0hSQ19QQVRIPVwiL3N5c3RlbS9ldGMvbWtzaHJjXCIgXAotCQkJLWZ3cmFwdiBcCi0JCQktRE1LU0hfQVNTVU1FX1VURjg9MCAtRE1LU0hfTk9QV05BTSBcCi0JCQktRF9HTlVfU09VUkNFIFwKLQkJCS1ESEFWRV9BVFRSSUJVVEVfQk9VTkRFRD0wIC1ESEFWRV9BVFRSSUJVVEVfRk9STUFUPTEgXAotCQkJLURIQVZFX0FUVFJJQlVURV9OT05OVUxMPTEgLURIQVZFX0FUVFJJQlVURV9OT1JFVFVSTj0xIFwKLQkJCS1ESEFWRV9BVFRSSUJVVEVfVU5VU0VEPTEgLURIQVZFX0FUVFJJQlVURV9VU0VEPTEgXAotCQkJLURIQVZFX1NZU19QQVJBTV9IPTEgLURIQVZFX1NZU19NS0RFVl9IPTAgXAotCQkJLURIQVZFX1NZU19NTUFOX0g9MSAtREhBVkVfU1lTX1NZU01BQ1JPU19IPTEgXAotCQkJLURIQVZFX0dSUF9IPTEgLURIQVZFX0xJQkdFTl9IPTEgLURIQVZFX0xJQlVUSUxfSD0wIFwKLQkJCS1ESEFWRV9QQVRIU19IPTEgLURIQVZFX1NUREJPT0xfSD0xIC1ESEFWRV9TVERJTlRfSD0xIFwKLQkJCS1ESEFWRV9TVFJJTkdTX0g9MSAtREhBVkVfVUxJTUlUX0g9MCAtREhBVkVfVkFMVUVTX0g9MCBcCi0JCQktREhBVkVfQ0FOX0lOVFRZUEVTPTEgLURIQVZFX0NBTl9VQ0JJTlRTPTEgXAotCQkJLURIQVZFX0NBTl9JTlQ4VFlQRT0xIC1ESEFWRV9DQU5fVUNCSU5UOD0xIFwKLQkJCS1ESEFWRV9STElNX1Q9MSAtREhBVkVfU0lHX1Q9MSAtREhBVkVfU1lTX1NJR05BTUU9MSBcCi0JCQktREhBVkVfU1lTX1NJR0xJU1Q9MSAtREhBVkVfU1RSU0lHTkFMPTAgXAotCQkJLURIQVZFX0dFVFJVU0FHRT0xIC1ESEFWRV9LSUxMUEc9MSAtREhBVkVfTUtOT0Q9MCBcCi0JCQktREhBVkVfTUtTVEVNUD0xIC1ESEFWRV9OSUNFPTEgLURIQVZFX1JFVk9LRT0wIFwKLQkJCS1ESEFWRV9TRVRMT0NBTEVfQ1RZUEU9MCAtREhBVkVfTEFOR0lORk9fQ09ERVNFVD0wIFwKLQkJCS1ESEFWRV9TRVRNT0RFPTEgLURIQVZFX1NFVFJFU1VHSUQ9MSBcCi0JCQktREhBVkVfU0VUR1JPVVBTPTEgLURIQVZFX1NUUkNBU0VTVFI9MSBcCi0JCQktREhBVkVfU1RSTENQWT0xIC1ESEFWRV9GTE9DS19ERUNMPTEgXAotCQkJLURIQVZFX1JFVk9LRV9ERUNMPTEgLURIQVZFX1NZU19TSUdMSVNUX0RFQ0w9MSBcCi0JCQktREhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTAKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ta3NoL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbWtzaC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ta3NoL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21rc2gvTk9USUNFIGIvbWtzaC9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDA2MWYuLjAwMDAwMDAKLS0tIGEvbWtzaC9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1ta3NoIGlzIGNvdmVyZWQgYnkgVGhlIE1pck9TIExpY2VuY2U6Ci0KLS8qLQotICogQ29weXJpZ2h0IMKpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbuKAmXMgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KZGlmZiAtLWdpdCBhL21rc2gvbWttZi5zaCBiL21rc2gvbWttZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMDQzMi4uMDAwMDAwMAotLS0gYS9ta3NoL21rbWYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgwqkgMjAxMAotIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KLSMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCi0jLQotIyBIZWxwZXIgc2NyaXB0IHRvIGxldCBzcmMvQnVpbGQuc2ggZ2VuZXJhdGUgTWFrZWZyYWcuaW5jCi0jIHdoaWNoIHdlIGluIHR1cm4gdXNlIGluIHRoZSBtYW51YWwgY3JlYXRpb24gb2YgQW5kcm9pZC5tawotIwotIyBUaGlzIHNjcmlwdCBpcyBzdXBwb3NlZCB0byBiZSBydW4gZnJvbS9pbnNpZGUgQU9TUCBieSB0aGUKLSMgcG9ydGVyIG9mIG1rc2ggdG8gQW5kcm9pZCAoYW5kIG9ubHkgbWFudWFsbHkpLgotCi1jZCAiJChkaXJuYW1lICIkMCIpIgotc3JjZGlyPSQocHdkKQotcm0gLXJmIHRtcAotbWtkaXIgdG1wCi1jZCAuLi8uLi8uLgotYW9zcGRpcj0kKHB3ZCkKLWNkICRzcmNkaXIvdG1wCi0KLWFkZHZhcigpIHsKLQlfdm49JDE7IHNoaWZ0Ci0KLQlldmFsICRfdm49XCJcJCRfdm4gJyQqIicKLX0KLQotQ0ZMQUdTPQotQ1BQRkxBR1M9Ci1MREZMQUdTPQotTElCUz0KLQotIyBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgd2VyZSBnZW5lcmF0ZWQgYnkgZXhhbWluaW5nIHRoZQotIyBvdXRwdXQgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotIyBtYWtlIHNob3djb21tYW5kcyBvdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9zeXN0ZW0vYmluL21rc2ggMj4mMSB8IHRlZSBsb2cKLSMKLSMgVGhleSBhcmUgb25seSB1c2VkIHRvIGxldCBCdWlsZC5zaCBmaW5kIHRoZSBjb21waWxlciwgaGVhZGVyCi0jIGZpbGVzLCBsaW5rZXIgYW5kIGxpYnJhcmllcyB0byBnZW5lcmF0ZSBNYWtlZnJhZy5pbmMgKHNpbWlsYXIKLSMgdG8gd2hhdCBHTlUgYXV0b3Rvb2xz4oCZIGNvbmZpZ3VyZSBzY3JpcHRzIGRvKSwgYW5kIG5ldmVyIHVzZWQKLSMgZHVyaW5nIHRoZSByZWFsIGJ1aWxkIHByb2Nlc3MuIFdlIG5lZWQgdGhpcyB0byBwb3J0IG1rc2ggdG8KLSMgdGhlIEFuZHJvaWQgcGxhdGZvcm0gYW5kIGl0IGlzIGNydWNpYWwgdGhlc2UgYXJlIGFzIGNsb3NlIGFzCi0jIHBvc3NpYmxlIHRvIHRoZSB2YWx1ZXMgdXNlZCBsYXRlci4gKFlvdSBhbHNvIG11c3QgZXhhbXBsZSB0aGUKLSMgcmVzdWx0cyBnYXRoZXJlZCBmcm9tIE1ha2VmcmFnLmluYyB0byBzZWUgdGhleSBhcmUgdGhlIHNhbWUKLSMgYWNyb3NzIGFsbCBBbmRyb2lkIHBsYXRmb3Jtcywgb3IgYWRkIGFwcHJvcHJpYXRlIGlmZGVmcy4pCi0jIFNpbmNlIHdlIG5vIGxvbmdlciB1c2UgdGhlIE5ESywgdGhlIEFPU1AgaGFzIHRvIGhhdmUgYmVlbgotIyBidWlsdCBiZWZvcmUgdXNpbmcgdGhpcyBzY3JpcHQgKHRhcmdldHRpbmcgZ2VuZXJpYy9lbXVsYXRvcikuCi0KLUNDPSRhb3NwZGlyL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktNC40LjAvYmluL2FybS1lYWJpLWdjYwotYWRkdmFyIENQUEZMQUdTIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9oYXJkd2FyZS9yaWwvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9kYWx2aWsvbGlibmF0aXZlaGVscGVyL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2V4dGVybmFsL3NraWEvaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovaW5jbHVkZSBcCi0gICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMva2VybmVsL2FyY2gtYXJtIFwKLSAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJtL2luY2x1ZGUgXAotICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYm0vaW5jbHVkZS9hcmNoL2FybSBcCi0gICAgLUkkYW9zcGRpci9iaW9uaWMvbGlidGhyZWFkX2RiL2luY2x1ZGUgXAotICAgIC1EX19BUk1fQVJDSF81X18gLURfX0FSTV9BUkNIXzVUX18gLURfX0FSTV9BUkNIXzVFX18gLURfX0FSTV9BUkNIXzVURV9fIFwKLSAgICAtSSRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vIFwKLSAgICAtaW5jbHVkZSAkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaCBcCi0gICAgLURBTkRST0lEIC1ETkRFQlVHIC1VREVCVUcKLWFkZHZhciBDRkxBR1MgLWZuby1leGNlcHRpb25zIC1Xbm8tbXVsdGljaGFyIC1tc29mdC1mbG9hdCAtZnBpYyBcCi0gICAgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZnVud2luZC10YWJsZXMgLWZzdGFjay1wcm90ZWN0b3IgLWZuby1zaG9ydC1lbnVtcyBcCi0gICAgLW1hcmNoPWFybXY1dGUgLW10dW5lPXhzY2FsZSAtbXRodW1iLWludGVyd29yayAtZm1lc3NhZ2UtbGVuZ3RoPTAgXAotICAgIC1XIC1XYWxsIC1Xbm8tdW51c2VkIC1XaW5pdC1zZWxmIC1XcG9pbnRlci1hcml0aCAtV2Vycm9yPXJldHVybi10eXBlIFwKLSAgICAtV2Vycm9yPW5vbi12aXJ0dWFsLWR0b3IgLVdlcnJvcj1hZGRyZXNzIC1XZXJyb3I9c2VxdWVuY2UtcG9pbnQgXAotICAgIC1Xc3RyaWN0LWFsaWFzaW5nPTIgLWZpbmxpbmUtZnVuY3Rpb25zIC1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSBcCi0gICAgLWZnY3NlLWFmdGVyLXJlbG9hZCAtZnJlcnVuLWNzZS1hZnRlci1sb29wIC1mcmVuYW1lLXJlZ2lzdGVycyAtbXRodW1iIFwKLSAgICAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZpbmxpbmUtbGltaXQ9NjQKLWFkZHZhciBMREZMQUdTIC1ub3N0ZGxpYiAtQmR5bmFtaWMgLVdsLC1ULCRhb3NwZGlyL2J1aWxkL2NvcmUvYXJtZWxmLnggXAotICAgIC1XbCwtZHluYW1pYy1saW5rZXIsL3N5c3RlbS9iaW4vbGlua2VyIC1XbCwtLWdjLXNlY3Rpb25zIFwKLSAgICAtV2wsLXosbm9jb3B5cmVsb2MgLVdsLC0tbm8tdW5kZWZpbmVkIFwKLSAgICAkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliL2NydGJlZ2luX2R5bmFtaWMubwotYWRkdmFyIExJQlMgLUwkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliIFwKLSAgICAtV2wsLXJwYXRoLWxpbms9JGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2xpYiAtbGMgXAotICAgICRhb3NwZGlyL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktNC40LjAvYmluLy4uL2xpYi9nY2MvYXJtLWVhYmkvNC40LjAvaW50ZXJ3b3JrL2xpYmdjYy5hIFwKLSAgICAkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliL2NydGVuZF9hbmRyb2lkLm8KLQotCi0jIyMgT3ZlcnJpZGUgZmxhZ3MKLSMgV2UgZG9u4oCZdCBldmVuICpzdXBwb3J0KiBVVEYtOCBieSBkZWZhdWx0IOKYuQotYWRkdmFyIENQUEZMQUdTIC1ETUtTSF9BU1NVTUVfVVRGOD0wCi0jIE5vIGdldHB3bmFtKCkgY2FsbHMgKGFmZmVjdHMgImNkIH51c2VybmFtZS8iIG9ubHkpCi1hZGR2YXIgQ1BQRkxBR1MgLURNS1NIX05PUFdOQU0KLSMgQ29tcGlsZSBhbiBleHRyYSBzbWFsbCBta3NoIChvcHRpb25hbCkKLSNhZGR2YXIgQ1BQRkxBR1MgLURNS1NIX1NNQUxMCi0jIExlYXZlIG91dCB0aGUgdWxpbWl0IGJ1aWx0aW4KLSNhZGR2YXIgQ1BQRkxBR1MgLURNS1NIX05PX0xJTUlUUwotCi0jIFNldCB0YXJnZXQgcGxhdGZvcm0KLVRBUkdFVF9PUz1MaW51eAotIyBCdWlsZGluZyB3aXRoIC1zdGQ9Yzk5IG9yIC1zdGQ9Z251OTkgY2xhc2hlcyB3aXRoIEJpb25pYyBoZWFkZXJzCi1IQVZFX0NBTl9TVERHOTk9MAotSEFWRV9DQU5fU1REQzk5PTAKLWV4cG9ydCBIQVZFX0NBTl9TVERHOTkgSEFWRV9DQU5fU1REQzk5Ci0KLSMgQW5kcm9pZC14ODYgZG9lcyBub3QgaGF2ZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBQcm9Qb2xpY2UgU1NQCi0jIGFuZCBBT1NQIGFkZHMgdGhlIGZsYWdzIGJ5IGl0c2VsZiAoc2FtZSBmb3Igd2FybmluZyBmbGFncykKLUhBVkVfQ0FOX0ZOT1NUUklDVEFMSUFTSU5HPTAKLUhBVkVfQ0FOX0ZTVEFDS1BST1RFQ1RPUkFMTD0wCi1IQVZFX0NBTl9XQUxMPTAKLWV4cG9ydCBIQVZFX0NBTl9GTk9TVFJJQ1RBTElBU0lORyBIQVZFX0NBTl9GU1RBQ0tQUk9URUNUT1JBTEwgSEFWRV9DQU5fV0FMTAotCi0jIGRpc2FibGUgdGhlIG1rbm9kKDgpIGJ1aWx0LWluIHRvIGdldCByaWQgb2YgbmVlZGluZyBzZXRtb2RlLmMKLUhBVkVfTUtOT0Q9MDsgZXhwb3J0IEhBVkVfTUtOT0QKLQotIyBldmVuIHRoZSBpZGVhIG9mIHBlcnNpc3RlbnQgaGlzdG9yeSBvbiBhIHBob25lIGlzIGZ1bm55Ci1IQVZFX1BFUlNJU1RFTlRfSElTVE9SWT0wOyBleHBvcnQgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQotIyAuLi4gYW5kIHJ1biBpdCEKLWV4cG9ydCBDQyBDUFBGTEFHUyBDRkxBR1MgTERGTEFHUyBMSUJTIFRBUkdFVF9PUwotc2ggLi4vc3JjL0J1aWxkLnNoIC1NCi1ydj0kPwotdGVzdCB4MCA9IHgiJHJ2IiAmJiBtdiAtZiBNYWtlZnJhZy5pbmMgLi4vCi1jZCAuLgotcm0gLXJmIHRtcAotZXhpdCAkcnYKZGlmZiAtLWdpdCBhL21rc2gvbWtzaHJjIGIvbWtzaC9ta3NocmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTVlYTYuLjAwMDAwMDAKLS0tIGEvbWtzaC9ta3NocmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAxMAotIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KLSMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCi0jLQotIyBNaW5pbWFsIC9zeXN0ZW0vZXRjL21rc2hyYyBmb3IgQW5kcm9pZAotCi06ICR7VEVSTTo9dnQxMDB9ICR7SE9NRTo9L2RhdGF9ICR7TUtTSDo9L3N5c3RlbS9iaW4vc2h9ICR7SE9TVE5BTUU6PWFuZHJvaWR9Ci06ICR7U0hFTEw6PSRNS1NIfSAke1VTRVI6PSQodHlwZXNldCB4PSQoaWQpOyB4PSR7eCMqXCh9OyBwcmludCAtciAtLSAke3glJVwpKn0pfQotaWYgKCggVVNFUl9JRCApKTsgdGhlbiBQUzE9JyQnOyBlbHNlIFBTMT0nIyc7IGZpCi1mdW5jdGlvbiBwcmVjbWQgewotCXR5cGVzZXQgZT0kPwotCi0JKCggZSApKSAmJiBwcmludCAtbiAiJGV8IgotfQotUFMxPSckKHByZWNtZCkkVVNFUkAkSE9TVE5BTUU6JHtQV0Q6LT99ICciJFBTMSAiCi1leHBvcnQgSE9NRSBIT1NUTkFNRSBNS1NIIFBTMSBTSEVMTCBURVJNIFVTRVIKLWFsaWFzIGw9J2xzJwotYWxpYXMgbGE9J2wgLWEnCi1hbGlhcyBsbD0nbCAtbCcKLWFsaWFzIGxvPSdsIC1hIC1sJwotCi1mb3IgcCBpbiB+Ly5iaW47IGRvCi0JW1sgLWQgJHAvLiBdXSB8fCBjb250aW51ZQotCVtbIDokUEFUSDogPSAqOiRwOiogXV0gfHwgUEFUSD0kcDokUEFUSAotZG9uZQotCi11bnNldCBwCi0KLTogcGxhY2UgY3VzdG9taXNhdGlvbnMgYWJvdmUgdGhpcyBsaW5lCmRpZmYgLS1naXQgYS9ta3NoL3NyYy8wMC1OT1RFLnR4dCBiL21rc2gvc3JjLzAwLU5PVEUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFkNTQxLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjLzAwLU5PVEUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotVGhpcyBpcyBta3NoIGZyb20gQW5vbkNWUyBvbiAyMDEwLTA4LTI0IHdpdGggdGhlCi1mb2xsb3dpbmcgZmlsZXMgcmVtb3ZlZDoKLeKAoiBNYWtlZmlsZQotICAobm90IHBhcnQgb2YgcmVndWxhciBta3NoIHJlbGVhc2VzIGFueXdheSkKLeKAoiBkb3QubWtzaHJjCi0gIChub3QgbmVlZGVkLCB3ZSB1c2Ugb3VyIG93biBmb3IgQW5kcm9pZCkKLeKAoiBta3NoLjEKLSAgKG1hbnBhZ2U7IGFsc28gYXZhaWxhYmxlIGZyb20gdGhlIHdlYikKLeKAoiBzZXRtb2RlLmMKLSAgKG5vdCBuZWVkZWQsIHdlIGRvbuKAmXQgdXNlIHRoZSBta25vZCBidWlsdGluKQot4oCiIHN0cmxjcHkuYwotICAobm90IG5lZWRlZCwgYmlvbmljIHByb3ZpZGVzIHRoaXMpCi0KLVRoZSBtYW51YWwgcGFnZSBjYW4gYmUgZG93bmxvYWRlZCBhcyBQREYgKElTTyBBNCBwYXBlcikgZnJvbQotaHR0cHM6Ly93d3cubWlyYnNkLm9yZy9NaXJPUy9kaXN0L21pci9ta3NoL21rc2gucGRmIG9yIHJlYWQKLW9ubGluZSBhdCBodHRwczovL3d3dy5taXJic2Qub3JnL21hbjEvbWtzaCAoSFRNTCkuCi0KLVRoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgZG9uZSB0byBjb2RlIGluIHRoaXMgc3ViZGlyZWN0b3J5Ci1hdCB0aGUgbW9tZW50Ogot4oCiIGNoZWNrLnQgbWFpbi5zaDogcmVtb3ZlIHRoZSAnc3RvcCcgYWxpYXMgdG8gJ2tpbGwgLVNUT1AnCi0gIHNpbmNlIEFuZHJvaWQgaGFzIGEgYnVpbHQgaW4gc3RvcCBjb21tYW5kIHRoYXQgdGhlIGFsaWFzCi0gIG92ZXJyaWRlcywgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHRlc3RpbmcgdG9vbHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9CdWlsZC5zaCBiL21rc2gvc3JjL0J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThiMWNhLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL0J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYwMCArMCwwIEBACi0jIS9iaW4vc2gKLXNyY3ZlcnNpb249JyRNaXJPUzogc3JjL2Jpbi9ta3NoL0J1aWxkLnNoLHYgMS40NTkgMjAxMC8wOC8yNCAxNTo0NjowNiB0ZyBFeHAgJCcKLSMtCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0jCi0jIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0jIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotIwotIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0jIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0jIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSMgb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSMtCi0jIFBlb3BsZSBhbmFseXNpbmcgdGhlIG91dHB1dCBtdXN0IHdoaXRlbGlzdCBjb25mdGVzdC5jIGZvciBhbnkga2luZAotIyBvZiBjb21waWxlciB3YXJuaW5nIGNoZWNrcyAobWlydG9jb25mIGlzIGJ5IGRlc2lnbiBub3QgcXVpZXQpLgotIwotIyBFbnZpcm9ubWVudCB1c2VkOglDQyBDRkxBR1MgQ1BQRkxBR1MgTERGTEFHUyBMSUJTIE5PV0FSTiBOUk9GRgotIwkJCVRBUkdFVF9PUyBUQVJHRVRfT1NSRVYKLSMgRmVhdHVyZSBzZWxlY3RvcnM6CVVTRV9QUklOVEZfQlVJTFRJTgotIyBDUFBGTEFHUyByZWNvZ25pc2VkOglNS1NIX0FTU1VNRV9VVEY4IE1LU0hfQklOU0hSRURVQ0VEIE1LU0hfQ0xTX1NUUklORwotIwkJCU1LU0hfQ09OU0VSVkFUSVZFX0ZEUyBNS1NIX01JRE5JR0hUQlNEMDFBU0hfQ09NUEFUCi0jCQkJTUtTSF9OT1BXTkFNIE1LU0hfTk9fTElNSVRTIE1LU0hfU01BTEwgTUtTSF9TX05PVkkKLSMJCQlNS1NIX1VORU1QTE9ZRUQgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTCBNS1NIUkNfUEFUSAotIwkJCU1LU0hfREVGQVVMVF9UTVBESVIgTUtTSF9DTFJUT0VPTF9TVFJJTkcgTUtTSF9BNFBCCi0KLUxDX0FMTD1DCi1leHBvcnQgTENfQUxMCi0KLXYoKSB7Ci0JJGUgIiQqIgotCWV2YWwgIiRAIgotfQotCi12digpIHsKLQlfYz0kMQotCXNoaWZ0Ci0JJGUgIlwkICQqIiAyPiYxCi0JZXZhbCAiJEAiID52di5vdXQgMj4mMQotCXNlZCAicwdeByR7X2N9IAciIDx2di5vdXQKLX0KLQotdnEoKSB7Ci0JZXZhbCAiJEAiCi19Ci0KLXJtZigpIHsKLQlmb3IgX2YgaW4gIiRAIjsgZG8KLQkJY2FzZSAke19mfSBpbgotCQlta3NoLjEpIDs7Ci0JCSopIHJtIC1mICIke19mfSIgOzsKLQkJZXNhYwotCWRvbmUKLX0KLQotaWYgdGVzdCAtZCAvdXNyL3hwZzQvYmluLy4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JIyBTb2xhcmlzOiBzb21lIG9mIHRoZSB0b29scyBoYXZlIHdlaXJkIGJlaGF2aW91ciwgdXNlIHBvcnRhYmxlIG9uZXMKLQlQQVRIPS91c3IveHBnNC9iaW46JFBBVEgKLQlleHBvcnQgUEFUSAotZmkKLQotaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTit4fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCWVtdWxhdGUgc2gKLQlOVUxMQ01EPToKLWZpCi0KLWFsbHU9UVdFUlRZVUlPUEFTREZHSEpLTFpYQ1ZCTk0KLWFsbGw9cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0KLWFsbG49MDEyMzQ1Njc4OQotYWxscz1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotbmw9JwotJwotdGNmbj1ubwotYmk9Ci11aT0KLWFvPQotZng9Ci1tZT1gYmFzZW5hbWUgIiQwImAKLW9yaWdfQ0ZMQUdTPSRDRkxBR1MKLXBoYXNlPXgKLW9sZGlzaF9lZD1zdGRvdXQtZWQsbm8tc3RkZXJyLWVkCi0KLWlmIHRlc3QgLXQgMTsgdGhlbgotCWJpPScbWzFtJwotCXVpPScbWzRtJwotCWFvPScbWzBtJwotZmkKLQotdXBwZXIoKSB7Ci0JZWNobyA6IiRAIiB8IHNlZCAncy9eOi8vJyB8IHRyICRhbGxsICRhbGx1Ci19Ci0KLSMgY2xlYW4gdXAgYWZ0ZXIgYWNfdGVzdHJ1bigpCi1hY190ZXN0ZG9uZSgpIHsKLQlldmFsIEhBVkVfJGZ1PSRmdgotCWZyPW5vCi0JdGVzdCAwID0gJGZ2IHx8IGZyPXllcwotCSRlICIkYmk9PT4gJGZkLi4uJGFvICR1aSRmciRhbyRmeCIKLQlmeD0KLX0KLQotIyBhY19jYWNoZSBsYWJlbDogc2V0cyBmLCBmdSwgZnY/PTAKLWFjX2NhY2hlKCkgewotCWY9JDEKLQlmdT1gdXBwZXIgJGZgCi0JZXZhbCBmdj1cJEhBVkVfJGZ1Ci0JY2FzZSAkZnYgaW4KLQkwfDEpCi0JCWZ4PScgKGNhY2hlZCknCi0JCXJldHVybiAwCi0JCTs7Ci0JZXNhYwotCWZ2PTAKLQlyZXR1cm4gMQotfQotCi0jIGFjX3Rlc3Rpbml0IGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0Ci0jIHJldHVybnMgMSBpZiB2YWx1ZSB3YXMgY2FjaGVkL2ltcGxpZWQsIDAgb3RoZXJ3aXNlOiBjYWxsIGFjX3Rlc3Rkb25lCi1hY190ZXN0aW5pdCgpIHsKLQlpZiBhY19jYWNoZSAkMTsgdGhlbgotCQl0ZXN0IHgiJDIiID0geCIhIiAmJiBzaGlmdAotCQl0ZXN0IHgiJDIiID0geCIiIHx8IHNoaWZ0Ci0JCWZkPSR7My0kZn0KLQkJYWNfdGVzdGRvbmUKLQkJcmV0dXJuIDEKLQlmaQotCWZjPTAKLQlpZiB0ZXN0IHgiJDIiID0geCIiOyB0aGVuCi0JCWZ0PTEKLQllbHNlCi0JCWlmIHRlc3QgeCIkMiIgPSB4IiEiOyB0aGVuCi0JCQlmYz0xCi0JCQlzaGlmdAotCQlmaQotCQlldmFsIGZ0PVwkSEFWRV9gdXBwZXIgJDJgCi0JCXNoaWZ0Ci0JZmkKLQlmZD0kezMtJGZ9Ci0JaWYgdGVzdCAkZmMgPSAiJGZ0IjsgdGhlbgotCQlmdj0kMgotCQlmeD0nIChpbXBsaWVkKScKLQkJYWNfdGVzdGRvbmUKLQkJcmV0dXJuIDEKLQlmaQotCSRlIC4uLiAkZmQKLQlyZXR1cm4gMAotfQotCi0jIHBpcGUgLmMgfCBhY190ZXN0W25dIFshXSBsYWJlbCBbIV0gY2hlY2tpZlshXTAgW3NldGxhYmVsaWZjaGVja2lzWyFdMF0gdXNlcm91dHB1dAotYWNfdGVzdG4oKSB7Ci0JaWYgdGVzdCB4IiQxIiA9IHgiISI7IHRoZW4KLQkJZnI9MQotCQlzaGlmdAotCWVsc2UKLQkJZnI9MAotCWZpCi0JYWNfdGVzdGluaXQgIiRAIiB8fCByZXR1cm4KLQljYXQgPmNvbmZ0ZXN0LmMKLQl2diAnXScgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMgJExJQlMgJGNjcHIiCi0JdGVzdCAkdGNmbiA9IG5vICYmIHRlc3QgLWYgYS5vdXQgJiYgdGNmbj1hLm91dAotCXRlc3QgJHRjZm4gPSBubyAmJiB0ZXN0IC1mIGEuZXhlICYmIHRjZm49YS5leGUKLQl0ZXN0ICR0Y2ZuID0gbm8gJiYgdGVzdCAtZiBjb25mdGVzdCAmJiB0Y2ZuPWNvbmZ0ZXN0Ci0JaWYgdGVzdCAtZiAkdGNmbjsgdGhlbgotCQl0ZXN0IDEgPSAkZnIgfHwgZnY9MQotCWVsc2UKLQkJdGVzdCAwID0gJGZyIHx8IGZ2PTEKLQlmaQotCXZzY2FuPQotCWlmIHRlc3QgJHBoYXNlID0gdTsgdGhlbgotCQl0ZXN0ICRjdCA9IGdjYyAmJiB2c2Nhbj0ndW5yZWNvZ25pW3N6XWVkJwotCQl0ZXN0ICRjdCA9IGhwY2MgJiYgdnNjYW49J3Vuc3VwcG9ydGVkJwotCQl0ZXN0ICRjdCA9IHBjYyAmJiB2c2Nhbj0ndW5zdXBwb3J0ZWQnCi0JCXRlc3QgJGN0ID0gc3VucHJvICYmIHZzY2FuPSctZSBpZ25vcmVkIC1lIHR1cm5lZC5vZmYnCi0JZmkKLQl0ZXN0IC1uICIkdnNjYW4iICYmIGdyZXAgJHZzY2FuIHZ2Lm91dCA+L2Rldi9udWxsIDI+JjEgJiYgZnY9JGZyCi0Jcm1mIGNvbmZ0ZXN0LmMgY29uZnRlc3QubyAke3RjZm59KiB2di5vdXQKLQlhY190ZXN0ZG9uZQotfQotCi0jIGFjX2lmY3BwIGNwcGV4cHIgWyFdIGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0Ci1hY19pZmNwcCgpIHsKLQlleHByPSQxOyBzaGlmdAotCWFjX3Rlc3RuICIkQCIgPDwtRU9GCi0JCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgKLQkJIyRleHByCi0JCSAgICAwCi0JCSNlbHNlCi0JCS8qIGZvcmNlIGEgZmFpbHVyZTogZXhwciBpcyBmYWxzZSAqLwotCQkgICAgdGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkKLQkJI2VuZGlmCi0JCSAgICApOyB9Ci1FT0YKLQl0ZXN0IHgiJDEiID0geCIhIiAmJiBzaGlmdAotCWY9JDEKLQlmdT1gdXBwZXIgJGZgCi0JZXZhbCBmdj1cJEhBVkVfJGZ1Ci0JdGVzdCB4IiRmdiIgPSB4IjEiCi19Ci0KLWFjX2NwcGZsYWdzKCkgewotCXRlc3QgeCIkMSIgPSB4IiIgfHwgZnU9JDEKLQlmdj0kMgotCXRlc3QgeCIkMiIgPSB4IiIgJiYgZXZhbCBmdj1cJEhBVkVfJGZ1Ci0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfJGZ1PSRmdiIKLX0KLQotYWNfdGVzdCgpIHsKLQlhY190ZXN0biAiJEAiCi0JYWNfY3BwZmxhZ3MKLX0KLQotIyBhY19mbGFncyBbLV0gYWRkIHZhcm5hbWUgZmxhZ3MgW3RleHRdCi1hY19mbGFncygpIHsKLQlpZiB0ZXN0IHgiJDEiID0geCItIjsgdGhlbgotCQlzaGlmdAotCQloZj0xCi0JZWxzZQotCQloZj0wCi0JZmkKLQlmYT0kMQotCXZuPSQyCi0JZj0kMwotCWZ0PSQ0Ci0JdGVzdCB4IiRmdCIgPSB4IiIgJiYgZnQ9ImlmICRmIGNhbiBiZSB1c2VkIgotCXNhdmVfQ0ZMQUdTPSRDRkxBR1MKLQlDRkxBR1M9IiRDRkxBR1MgJGYiCi0JaWYgdGVzdCAxID0gJGhmOyB0aGVuCi0JCWFjX3Rlc3RuIGNhbl8kdm4gJycgIiRmdCIKLQllbHNlCi0JCWFjX3Rlc3RuIGNhbl8kdm4gJycgIiRmdCIgPDwtJ0VPRicKLQkJCS8qIGV2aWwgYXBvJ3N0cm9waCBpbiBjb21tZW50IHRlc3QgKi8KLQkJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQotCQlFT0YKLQlmaQotCWV2YWwgZnY9XCRIQVZFX0NBTl9gdXBwZXIgJHZuYAotCXRlc3QgMTEgPSAkZmEkZnYgfHwgQ0ZMQUdTPSRzYXZlX0NGTEFHUwotfQotCi0jIGFjX2hlYWRlciBbIV0gaGVhZGVyIFtwcmVyZXEgLi4uXQotYWNfaGVhZGVyKCkgewotCWlmIHRlc3QgeCIkMSIgPSB4IiEiOyB0aGVuCi0JCW5hPTEKLQkJc2hpZnQKLQllbHNlCi0JCW5hPTAKLQlmaQotCWhmPSQxOyBzaGlmdAotCWh2PWBlY2hvICIkaGYiIHwgdHIgLWQgJ1wwMTJcMDE1JyB8IHRyIC1jICRhbGxsJGFsbHUkYWxsbiAkYWxsc2AKLQlmb3IgaQotCWRvCi0JCWVjaG8gIiNpbmNsdWRlIDwkaT4iID4+eAotCWRvbmUKLQllY2hvICIjaW5jbHVkZSA8JGhmPiIgPj54Ci0JZWNobyAnaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+PngKLQlhY190ZXN0biAiJGh2IiAiIiAiPCRoZj4iIDx4Ci0Jcm1mIHgKLQl0ZXN0IDEgPSAkbmEgfHwgYWNfY3BwZmxhZ3MKLX0KLQotYWRkc3JjcygpIHsKLQlpZiB0ZXN0IHgiJDEiID0geCIhIjsgdGhlbgotCQlmcj0wCi0JCXNoaWZ0Ci0JZWxzZQotCQlmcj0xCi0JZmkKLQlldmFsIGk9XCQkMQotCXRlc3QgJGZyID0gIiRpIiAmJiBjYXNlICIgJFNSQ1MgIiBpbgotCSpcICQyXCAqKQk7OwotCSopCQlTUkNTPSIkU1JDUyAkMiIgOzsKLQllc2FjCi19Ci0KLQotaWYgdGVzdCAtZCBta3NoIHx8IHRlc3QgLWQgbWtzaC5leGU7IHRoZW4KLQllY2hvICIkbWU6IEVycm9yOiAuL21rc2ggaXMgYSBkaXJlY3RvcnkhIiA+JjIKLQlleGl0IDEKLWZpCi1ybWYgYS5leGUqIGEub3V0KiBjb25mdGVzdC5jICpjb3JlIGxmdCBta3NoKiBubyAqLmJjICoubGwgKi5vIFwKLSAgICBSZWJ1aWxkLnNoIHNpZ25hbWVzLmluYyB0ZXN0LnNoIHggdnYub3V0Ci0KLWN1cmRpcj1gcHdkYCBzcmNkaXI9YGRpcm5hbWUgIiQwImAgY2hlY2tfY2F0ZWdvcmllcz0KLXRlc3QgLW4gIiRkaXJuYW1lIiB8fCBkaXJuYW1lPS4KLWRzdHZlcnNpb249YHNlZCAtbiAnL2RlZmluZSBNS1NIX1ZFUlNJT04vcy9eLioiXCguKlwpIi4qJC9cMS9wJyAkc3JjZGlyL3NoLmhgCi0KLWU9ZWNobwotcj0wCi1lcT0wCi1wbT0wCi1jbT1ub3JtYWwKLW9wdGZsYWdzPS1zdGQtY29tcGlsZS1vcHRzCi1sYXN0PQotCi1mb3IgaQotZG8KLQljYXNlICRsYXN0OiRpIGluCi0JYzpjb21iaW5lfGM6ZHJhZ29uZWdnfGM6bGx2bSkKLQkJY209JGkKLQkJbGFzdD0KLQkJOzsKLQljOiopCi0JCWVjaG8gIiRtZTogVW5rbm93biBvcHRpb24gLWMgJyRpJyEiID4mMgotCQlleGl0IDEKLQkJOzsKLQlvOiopCi0JCW9wdGZsYWdzPSRpCi0JCWxhc3Q9Ci0JCTs7Ci0JOi1jKQotCQlsYXN0PWMKLQkJOzsKLQk6LWNvbWJpbmUpCi0JCWNtPWNvbWJpbmUKLQkJZWNobyAiJG1lOiBXYXJuaW5nOiAnJGknIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWMgY29tYmluZScgaW5zdGVhZCEiID4mMgotCQk7OwotCTotZykKLQkJIyBjaGVja2VyLCBkZWJ1ZywgdmFsZ3JpbmQgYnVpbGQKLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRERFQlVHIgotCQlDRkxBR1M9IiRDRkxBR1MgLWczIC1mbm8tYnVpbHRpbiIKLQkJOzsKLQk6LWopCi0JCXBtPTEKLQkJOzsKLQk6LWxsdm0pCi0JCWNtPWxsdm0KLQkJb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKLQkJZWNobyAiJG1lOiBXYXJuaW5nOiAnJGknIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWMgbGx2bSAtTycgaW5zdGVhZCEiID4mMgotCQk7OwotCTotbGx2bT0qKQotCQljbT1sbHZtCi0JCW9wdGZsYWdzPWBlY2hvICJ4JGkiIHwgc2VkICdzL154LWxsdm09Ly8nYAotCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBsbHZtIC1vICRsbHZtJyBpbnN0ZWFkISIgPiYyCi0JCTs7Ci0JOi1NKQotCQljbT1tYWtlZmlsZQotCQk7OwotCTotTykKLQkJb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKLQkJOzsKLQk6LW8pCi0JCWxhc3Q9bwotCQk7OwotCTotUSkKLQkJZXE9MQotCQk7OwotCTotcikKLQkJcj0xCi0JCTs7Ci0JOi12KQotCQllY2hvICJCdWlsZC5zaCAkc3JjdmVyc2lvbiIKLQkJZWNobyAiZm9yIG1rc2ggJGRzdHZlcnNpb24iCi0JCWV4aXQgMAotCQk7OwotCToqKQotCQllY2hvICIkbWU6IFVua25vd24gb3B0aW9uICckaSchIiA+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JKikKLQkJZWNobyAiJG1lOiBVbmtub3duIG9wdGlvbiAtJyRsYXN0JyAnJGknISIgPiYyCi0JCWV4aXQgMQotCQk7OwotCWVzYWMKLWRvbmUKLWlmIHRlc3QgLW4gIiRsYXN0IjsgdGhlbgotCWVjaG8gIiRtZTogT3B0aW9uIC0nJGxhc3QnIG5vdCBmb2xsb3dlZCBieSBhcmd1bWVudCEiID4mMgotCWV4aXQgMQotZmkKLQotU1JDUz0ibGFsbG9jLmMgZWRpdC5jIGV2YWwuYyBleGVjLmMgZXhwci5jIGZ1bmNzLmMgaGlzdHJhcC5jIgotU1JDUz0iJFNSQ1Mgam9icy5jIGxleC5jIG1haW4uYyBtaXNjLmMgc2hmLmMgc3luLmMgdHJlZS5jIHZhci5jIgotCi1pZiB0ZXN0IHgiJHNyY2RpciIgPSB4Ii4iOyB0aGVuCi0JQ1BQRkxBR1M9Ii1JLiAkQ1BQRkxBR1MiCi1lbHNlCi0JQ1BQRkxBR1M9Ii1JLiAtSSckc3JjZGlyJyAkQ1BQRkxBR1MiCi1maQotCi10ZXN0IHgiJFRBUkdFVF9PUyIgPSB4IiIgJiYgVEFSR0VUX09TPWB1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCB1bmFtZWAKLW9zd2Fybj0KLWNjcGM9LVdjLAotY2NwbD0tV2wsCi10c3RzPQotY2Nwcj0nfHwgZm9yIF9mIGluICR7dGNmbn0qOyBkbyB0ZXN0IHgiJHtfZn0iID0geCJta3NoLjEiIHx8IHJtIC1mICIke19mfSI7IGRvbmUnCi0KLSMgQ29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gT1MgcmV2aXNpb24sIG9uIE9TZXMgdGhhdCBuZWVkIHRoZW0KLWNhc2UgJFRBUkdFVF9PUyBpbgotUU5YKQotCXRlc3QgeCIkVEFSR0VUX09TUkVWIiA9IHgiIiAmJiBUQVJHRVRfT1NSRVY9YHVuYW1lIC1yYAotCTs7Ci1lc2FjCi0KLSMgQ29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gT1MgbmFtZQotY2FzZSAkVEFSR0VUX09TIGluCi1BSVgpCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9BTExfU09VUkNFIgotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1CZU9TKQotCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKLQk7OwotQlNEL09TKQotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1DWUdXSU4qKQotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1EYXJ3aW4pCi0JOzsKLURyYWdvbkZseSkKLQk7OwotRnJlZUJTRCkKLQk7OwotR05VKQotCSMgZGVmaW5lIE5PX1BBVEhfTUFYIHRvIHVzZSBIdXJkLW9ubHkgZnVuY3Rpb25zCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIC1ETk9fUEFUSF9NQVgiCi0JOzsKLUdOVS9rRnJlZUJTRCkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCi0JOzsKLUhhaWt1KQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4IgotCTs7Ci1IUC1VWCkKLQk7OwotSW50ZXJpeCkKLQljY3BjPSctWCAnCi0JY2NwbD0nLVkgJwotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQUxMX1NPVVJDRSIKLQk6ICR7TElCUz0nLWxjcnlwdCd9Ci0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLUlSSVgqKQotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1MaW51eCkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCi0JOiAke0hBVkVfUkVWT0tFPTB9Ci0JOzsKLU1pZG5pZ2h0QlNEKQotCTs7Ci1NaW5peCkKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9VTkVNUExPWUVEIC1ETUtTSF9DT05TRVJWQVRJVkVfRkRTIgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfUE9TSVhfU09VUkNFIC1EX1BPU0lYXzFfU09VUkNFPTIgLURfTUlOSVgiCi0Jb2xkaXNoX2VkPW5vLXN0ZGVyci1lZAkJIyAvdXNyL2Jpbi9lZCghKSBpcyBicm9rZW4KLQk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KLQk7OwotTWlyQlNEKQotCTs7Ci1OZXRCU0QpCi0JOzsKLU9wZW5CU0QpCi0JOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9Ci0JOzsKLU9TRjEpCi0JSEFWRV9TSUdfVD0wCSMgaW5jb21wYXRpYmxlCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9PU0ZfU09VUkNFIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMkwiCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9YT1BFTl9TT1VSQ0U9NjAwIC1EX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCIKLQk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KLQk7OwotUGxhbjkpCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9QT1NJWF9TT1VSQ0UgLURfTElNSVRTX0VYVEVOU0lPTiIKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0JTRF9FWFRFTlNJT04gLURfU1VTVjJfU09VUkNFIgotCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9BU1NVTUVfVVRGOCAtRE1LU0hfVU5FTVBMT1lFRCIKLQk7OwotUFczMiopCi0JSEFWRV9TSUdfVD0wCSMgaW5jb21wYXRpYmxlCi0Jb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJwotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1RTlgpCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9fTk9fRVhUX1FOWCIKLQljYXNlICRUQVJHRVRfT1NSRVYgaW4KLQlbMDEyMzQ1XS4qfDYuWzAxMjNdLip8Ni40LlswMV0pCi0JCW9sZGlzaF9lZD1uby1zdGRlcnItZWQJCSMgb2xkaXNoIC9iaW4vZWQgaXMgYnJva2VuCi0JCTs7Ci0JZXNhYwotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci1TdW5PUykKLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0JTRF9TT1VSQ0UgLURfX0VYVEVOU0lPTlNfXyIKLQk7Owotc3lsbGFibGUpCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIgotCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKLQk7OwotVUxUUklYKQotCTogJHtDQz1jYyAtWVBPU0lYfQotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzc2l6ZV90PWludCIKLQk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KLQk7OwotVVdJTiopCi0JY2NwYz0nLVljLCcKLQljY3BsPSctWWwsJwotCXRzdHM9IiAzPD4vZGV2L3R0eSIKLQlvc3dhcm49IjsgaXQgd2lsbCBjb21waWxlLCBidXQgdGhlIHRhcmdldCIKLQlvc3dhcm49IiRvc3dhcm4ke25sfXBsYXRmb3JtIGl0c2VsZiBpcyB2ZXJ5IGZsYWtleS91bnJlbGlhYmxlIgotCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotCTs7Ci0qKQotCW9zd2Fybj0nOyBpdCBtYXkgb3IgbWF5IG5vdCB3b3JrJwotCTs7Ci1lc2FjCi0KLTogJHtDQz1jY30gJHtOUk9GRj1ucm9mZn0KLXRlc3QgMCA9ICRyICYmIGVjaG8gfCAkTlJPRkYgLXYgMj4mMSB8IGdyZXAgR05VID4vZGV2L251bGwgMj4mMSAmJiBcCi0gICAgTlJPRkY9IiROUk9GRiAtYyIKLQotIyB0aGlzIGFpZHMgbWUgaW4gdHJhY2luZyBGVEJGU2VuIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBidWlsZGQKLSRlICJIaSBmcm9tJGFvICRiaSRzcmN2ZXJzaW9uJGFvIG9uOiIKLWNhc2UgJFRBUkdFVF9PUyBpbgotRGFyd2luKQotCXZ2ICd8JyAiaHdwcmVmcyBtYWNoaW5lX3R5cGUgb3NfdHlwZSBvc19jbGFzcyA+JjIiCi0JdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCi0JOzsKLUlSSVgqKQotCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgotCXZ2ICd8JyAiaGludiAtdiA+JjIiCi0JOzsKLU9TRjEpCi0JdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCi0JdnYgJ3wnICIvdXNyL3NiaW4vc2l6ZXIgLXYgPiYyIgotCTs7Ci0qKQotCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgotCTs7Ci1lc2FjCi10ZXN0IC16ICIkb3N3YXJuIiB8fCBlY2hvID4mMiAiCi1XYXJuaW5nOiBta3NoIGhhcyBub3QgeWV0IGJlZW4gcG9ydGVkIHRvIG9yIHRlc3RlZCBvbiB5b3VyCi1vcGVyYXRpbmcgc3lzdGVtICckVEFSR0VUX09TJyRvc3dhcm4uIElmIHlvdSBjYW4gcHJvdmlkZQotYSBzaGVsbCBhY2NvdW50IHRvIHRoZSBkZXZlbG9wZXIsIHRoaXMgbWF5IGltcHJvdmU7IHBsZWFzZQotZHJvcCB1cyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBub3RpY2Ugb3IgZXZlbiBzZW5kIGluIGRpZmZzLgotIgotJGUgIiRiaSRtZTogQnVpbGRpbmcgdGhlIE1pckJTRCBLb3JuIFNoZWxsJGFvICR1aSRkc3R2ZXJzaW9uJGFvIgotCi0jCi0jIEJlZ2luIG9mIG1pcnRvY29uZiBjaGVja3MKLSMKLSRlICRiaSRtZTogU2Nhbm5pbmcgZm9yIGZ1bmN0aW9ucy4uLiBwbGVhc2UgaWdub3JlIGFueSBlcnJvcnMuJGFvCi0KLSMKLSMgQ29tcGlsZXI6IHdoaWNoIG9uZT8KLSMKLSMgbm90ZXM6Ci0jIC0gSUNDIGRlZmluZXMgX19HTlVDX18gdG9vCi0jIC0gR0NDIGRlZmluZXMgX19ocHV4IHRvbwotIyAtIExMVk0rY2xhbmcgZGVmaW5lcyBfX0dOVUNfXyB0b28KLSMgLSBud2NjIGRlZmluZXMgX19HTlVDX18gdG9vCi1DUFA9IiRDQyAtRSIKLSRlIC4uLiB3aGljaCBjb21waWxlciBzZWVtcyB0byBiZSB1c2VkCi1jYXQgPmNvbmZ0ZXN0LmMgPDwnRU9GJwotI2lmIGRlZmluZWQoX19JQ0MpIHx8IGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKLWN0PWljYwotI2VsaWYgZGVmaW5lZChfX3hsQ19fKSB8fCBkZWZpbmVkKF9fSUJNQ19fKQotY3Q9eGxjCi0jZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpCi1jdD1zdW5wcm8KLSNlbGlmIGRlZmluZWQoX19BQ0tfXykKLWN0PWFjawotI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi1jdD1iY2MKLSNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCi1jdD13YXRjb20KLSNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKLWN0PW1ldHJvd2Vya3MKLSNlbGlmIGRlZmluZWQoX19IUF9jYykKLWN0PWhwY2MKLSNlbGlmIGRlZmluZWQoX19ERUNDKSB8fCAoZGVmaW5lZChfX29zZl9fKSAmJiAhZGVmaW5lZChfX0dOVUNfXykpCi1jdD1kZWMKLSNlbGlmIGRlZmluZWQoX19QR0kpCi1jdD1wZ2kKLSNlbGlmIGRlZmluZWQoX19ETUNfXykKLWN0PWRtYwotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLWN0PW1zYwotI2VsaWYgZGVmaW5lZChfX0FEU1BCTEFDS0ZJTl9fKSB8fCBkZWZpbmVkKF9fQURTUFRTX18pIHx8IGRlZmluZWQoX19BRFNQMjEwMDBfXykKLWN0PWFkc3AKLSNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKLWN0PWlhcgotI2VsaWYgZGVmaW5lZChTRENDKQotY3Q9c2RjYwotI2VsaWYgZGVmaW5lZChfX1BDQ19fKQotY3Q9cGNjCi0jZWxpZiBkZWZpbmVkKF9fVGVuRFJBX18pCi1jdD10ZW5kcmEKLSNlbGlmIGRlZmluZWQoX19USU5ZQ19fKQotY3Q9dGNjCi0jZWxpZiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykKLWN0PWNsYW5nCi0jZWxpZiBkZWZpbmVkKF9fTldDQ19fKQotY3Q9bndjYwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLWN0PWdjYwotI2VsaWYgZGVmaW5lZChfQ09NUElMRVJfVkVSU0lPTikKLWN0PW1pcHNwcm8KLSNlbGlmIGRlZmluZWQoX19zZ2kpCi1jdD1taXBzcHJvCi0jZWxpZiBkZWZpbmVkKF9faHB1eCkgfHwgZGVmaW5lZChfX2hwdWEpCi1jdD1ocGNjCi0jZWxpZiBkZWZpbmVkKF9fdWx0cml4KQotY3Q9dWNvZGUKLSNlbHNlCi1jdD11bmtub3duCi0jZW5kaWYKLUVPRgotY3Q9dW5rbm93bgotdnYgJ10nICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gY29uZnRlc3QuYyB8IGdyZXAgY3Q9IHwgdHIgLWQgXFxcXDAxNSA+eCIKLXNlZCAncy9eL1sgLycgeAotZXZhbCBgY2F0IHhgCi1ybWYgeCB2di5vdXQKLWVjaG8gJ2ludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfScgPmNvbmZ0ZXN0LmMKLWNhc2UgJGN0IGluCi1hY2spCi0JIyB3b3JrIGFyb3VuZCAidGhlIGZhbW91cyBBQ0sgY29uc3QgYnVnIgotCUNQUEZMQUdTPSItRGNvbnN0PSAkQ1BQRkxBR1MiCi0JOzsKLWFkc3ApCi0JZWNobyA+JjIgJ1dhcm5pbmc6IEFuYWxvZyBEZXZpY2VzIEMrKyBjb21waWxlciBmb3IgQmxhY2tmaW4sIFRpZ2VyU0hBUkMKLSAgICBhbmQgU0hBUkMgKDIxMDAwKSBEU1BzIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7OwotYmNjKQotCWVjaG8gPiYyICJXYXJuaW5nOiBCb3JsYW5kIEMrKyBCdWlsZGVyIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIG1pZ2h0Ci0gICAgcHJvZHVjZSBicm9rZW4gZXhlY3V0YWJsZXMuIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2ssCi0gICAgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuIgotCTs7Ci1jbGFuZykKLQkjIGRvZXMgbm90IHdvcmsgd2l0aCBjdXJyZW50ICJjY2MiIGNvbXBpbGVyIGRyaXZlcgotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXZlcnNpb24iCi0JIyB0aGlzIHdvcmtzLCBmb3Igbm93Ci0JdnYgJ3wnICIke0NMQU5HLWNsYW5nfSAtdmVyc2lvbiIKLQkjIGVuc3VyZSBjb21waWxlciBhbmQgbGlua2VyIGFyZSBpbiBzeW5jIHVubGVzcyBvdmVycmlkZGVuCi0JY2FzZSAkQ0NDX0NDOiRDQ0NfTEQgaW4KLQk6KikJOzsKLQkqOikJQ0NDX0xEPSRDQ0NfQ0M7IGV4cG9ydCBDQ0NfTEQgOzsKLQllc2FjCi0JOzsKLWRlYykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIgotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVdsLC1WIGNvbmZ0ZXN0LmMgJExJQlMiCi0JOzsKLWRtYykKLQllY2hvID4mMiAiV2FybmluZzogRGlnaXRhbCBNYXJzIENvbXBpbGVyIGRldGVjdGVkLiBXaGVuIHJ1bm5pbmcgdW5kZXIiCi0JZWNobyA+JjIgIiAgICBVV0lOLCBta3NoIHRlbmRzIHRvIGJlIHVuc3RhYmxlIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMiCi0JZWNobyA+JjIgIiAgICBvZiB0aGlzIHBsYXRmb3JtLiBDb250aW51ZSBhdCB5b3VyIG93biByaXNrLCIKLQllY2hvID4mMiAiICAgIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLiIKLQk7OwotZ2NjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLXYgY29uZnRlc3QuYyAkTElCUyIKLQl2diAnfCcgJ2VjaG8gYCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIFwKLQkgICAgLWR1bXBtYWNoaW5lYCBnY2NgJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gXAotCSAgICAkTElCUyAtZHVtcHZlcnNpb25gJwotCTs7Ci1ocGNjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVYgY29uZnRlc3QuYyAkTElCUyIKLQk7OwotaWFyKQotCWVjaG8gPiYyICdXYXJuaW5nOiBJQVIgU3lzdGVtcyAoaHR0cDovL3d3dy5pYXIuY29tKSBjb21waWxlciBmb3IgZW1iZWRkZWQKLSAgICBzeXN0ZW1zIGRldGVjdGVkLiBUaGlzIHVuc3VwcG9ydGVkIGNvbXBpbGVyIGhhcyBub3QgeWV0Ci0gICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCi0gICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKLQk7OwotaWNjKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCi0JOzsKLW1ldHJvd2Vya3MpCi0JZWNobyA+JjIgJ1dhcm5pbmc6IE1ldHJvd2Vya3MgQyBjb21waWxlciBkZXRlY3RlZC4gVGhpcyBoYXMgbm90IHlldAotICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgotICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCi0JOzsKLW1pcHNwcm8pCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdmVyc2lvbiIKLQk7OwotbXNjKQotCWNjcHI9CQkjIGVycm9ybGV2ZWxzIGFyZSBub3QgcmVsaWFibGUKLQljYXNlICRUQVJHRVRfT1MgaW4KLQlJbnRlcml4KQotCQlpZiBbWyAtbiAkQzg5X0NPTVBJTEVSIF1dOyB0aGVuCi0JCQlDODlfQ09NUElMRVI9YG50cGF0aDJwb3NpeCAtYyAiJEM4OV9DT01QSUxFUiJgCi0JCWVsc2UKLQkJCUM4OV9DT01QSUxFUj1DTC5FWEUKLQkJZmkKLQkJaWYgW1sgLW4gJEM4OV9MSU5LRVIgXV07IHRoZW4KLQkJCUM4OV9MSU5LRVI9YG50cGF0aDJwb3NpeCAtYyAiJEM4OV9MSU5LRVIiYAotCQllbHNlCi0JCQlDODlfTElOS0VSPUxJTksuRVhFCi0JCWZpCi0JCXZ2ICd8JyAiJEM4OV9DT01QSUxFUiAvSEVMUCA+JjIiCi0JCXZ2ICd8JyAiJEM4OV9MSU5LRVIgL0xJTksgPiYyIgotCQk7OwotCWVzYWMKLQk7OwotbndjYykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12ZXJzaW9uIgotCTs7Ci1wY2MpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdiIKLQk7OwotcGdpKQotCWVjaG8gPiYyICdXYXJuaW5nOiBQR0kgZGV0ZWN0ZWQuIFRoaXMgdW5rbm93biBjb21waWxlciBoYXMgbm90IHlldAotICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgotICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCi0JOzsKLXNkY2MpCi0JZWNobyA+JjIgJ1dhcm5pbmc6IHNkY2MgKGh0dHA6Ly9zZGNjLnNvdXJjZWZvcmdlLm5ldCksIHRoZSBzbWFsbCBkZXZpY2VzCi0gICAgQyBjb21waWxlciBmb3IgZW1iZWRkZWQgc3lzdGVtcyBkZXRlY3RlZC4gVGhpcyBoYXMgbm90IHlldAotICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgotICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCi0JOzsKLXN1bnBybykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1WIGNvbmZ0ZXN0LmMgJExJQlMiCi0JOzsKLXRjYykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12IgotCTs7Ci10ZW5kcmEpCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViAyPiYxIHwgXAotCSAgICBmZ3JlcCAtaSAtZSB2ZXJzaW9uIC1lIHJlbGVhc2UiCi0JOzsKLXVjb2RlKQotCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCi0JdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtV2wsLVYgY29uZnRlc3QuYyAkTElCUyIKLQk7Owotd2F0Y29tKQotCWVjaG8gPiYyICdXYXJuaW5nOiBXYXRjb20gQyBDb21waWxlciBkZXRlY3RlZC4gVGhpcyBjb21waWxlciBoYXMgbm90IHlldAotICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgotICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCi0JOzsKLXhsYykKLQl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1xdmVyc2lvbj12ZXJib3NlIgotCXZ2ICd8JyAibGQgLVYiCi0JOzsKLSopCi0JY3Q9dW5rbm93bgotCTs7Ci1lc2FjCi1jYXNlICRjbSBpbgotZHJhZ29uZWdnfGxsdm0pCi0JdnYgJ3wnICJsbGMgLXZlcnNpb24iCi0JOzsKLWVzYWMKLSRlICIkYmk9PT4gd2hpY2ggY29tcGlsZXIgc2VlbXMgdG8gYmUgdXNlZC4uLiRhbyAkdWkkY3QkYW8iCi1ybWYgY29uZnRlc3QuYyBjb25mdGVzdC5vIGNvbmZ0ZXN0IGEub3V0KiBhLmV4ZSogdnYub3V0Ci0KLSMKLSMgQ29tcGlsZXI6IHdvcmtzIGFzLWlzLCB3aXRoIC1Xbm8tZXJyb3IgYW5kIC1XZXJyb3IKLSMKLXNhdmVfTk9XQVJOPSROT1dBUk4KLU5PV0FSTj0KLURPV0FSTj0KLWFjX2ZsYWdzIDAgY29tcGlsZXJfd29ya3MgJycgJ2lmIHRoZSBjb21waWxlciB3b3JrcycKLXRlc3QgMSA9ICRIQVZFX0NBTl9DT01QSUxFUl9XT1JLUyB8fCBleGl0IDEKLUhBVkVfQ09NUElMRVJfS05PV049MAotdGVzdCAkY3QgPSB1bmtub3duIHx8IEhBVkVfQ09NUElMRVJfS05PV049MQotaWYgYWNfaWZjcHAgJ2lmIDAnIGNvbXBpbGVyX2ZhaWxzICcnIFwKLSAgICAnaWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGZhaWwgY29ycmVjdGx5JzsgdGhlbgotCXNhdmVfQ0ZMQUdTPSRDRkxBR1MKLQk6ICR7SEFWRV9DQU5fREVMRVhFPXh9Ci0JaWYgdGVzdCAkY3QgPSBkbWM7IHRoZW4KLQkJQ0ZMQUdTPSIkQ0ZMQUdTICR7Y2NwbH0vREVMRVhFQ1VUQUJMRSIKLQkJYWNfdGVzdG4gY2FuX2RlbGV4ZSBjb21waWxlcl9mYWlscyAwICdmb3IgdGhlIC9ERUxFWEVDVVRBQkxFIGxpbmtlciBvcHRpb24nIDw8LUVPRgotCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9Ci0JCUVPRgotCWVsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KLQkJQ0ZMQUdTPSIkQ0ZMQUdTICR7Y2NwbH0tbm9uX3NoYXJlZCIKLQkJYWNfdGVzdG4gY2FuX2RlbGV4ZSBjb21waWxlcl9mYWlscyAwICdmb3IgdGhlIC1ub25fc2hhcmVkIGxpbmtlciBvcHRpb24nIDw8LUVPRgotCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9Ci0JCUVPRgotCWVsc2UKLQkJZXhpdCAxCi0JZmkKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fREVMRVhFIHx8IENGTEFHUz0kc2F2ZV9DRkxBR1MKLQlhY190ZXN0biBjb21waWxlcl9zdGlsbF9mYWlscyAnJyAnaWYgdGhlIGNvbXBpbGVyIHN0aWxsIGRvZXMgbm90IGZhaWwgY29ycmVjdGx5JyA8PC1FT0YKLQlFT0YKLQl0ZXN0IDEgPSAkSEFWRV9DT01QSUxFUl9TVElMTF9GQUlMUyAmJiBleGl0IDEKLWZpCi1pZiBhY19pZmNwcCAnaWZkZWYgX19USU5ZQ19fJyBjb3VsZGJlX3RjYyAnIScgY29tcGlsZXJfa25vd24gMCBcCi0gICAgJ2lmIHRoaXMgY291bGQgYmUgdGNjJzsgdGhlbgotCWN0PXRjYwotCUNQUD0nY3BwIC1EX19USU5ZQ19fJwotZmkKLQotaWYgdGVzdCAkY3QgPSBzdW5wcm87IHRoZW4KLQl0ZXN0IHgiJHNhdmVfTk9XQVJOIiA9IHgiIiAmJiBzYXZlX05PV0FSTj0nLWVycndhcm49JW5vbmUnCi0JYWNfZmxhZ3MgMCBlcnJ3YXJubm9uZSAiJHNhdmVfTk9XQVJOIgotCXRlc3QgMSA9ICRIQVZFX0NBTl9FUlJXQVJOTk9ORSB8fCBzYXZlX05PV0FSTj0KLQlhY19mbGFncyAwIGVycndhcm5hbGwgIi1lcnJ3YXJuPSVhbGwiCi0JdGVzdCAxID0gJEhBVkVfQ0FOX0VSUldBUk5BTEwgJiYgRE9XQVJOPSItZXJyd2Fybj0lYWxsIgotZWxpZiB0ZXN0ICRjdCA9IGhwY2M7IHRoZW4KLQlzYXZlX05PV0FSTj0KLQlET1dBUk49K1dlCi1lbGlmIHRlc3QgJGN0ID0gbWlwc3BybzsgdGhlbgotCXNhdmVfTk9XQVJOPQotCURPV0FSTj0iLWRpYWdfZXJyb3IgMS0xMDAwMCIKLWVsaWYgdGVzdCAkY3QgPSBtc2M7IHRoZW4KLQlzYXZlX05PV0FSTj0iJHtjY3BjfS93IgotCURPV0FSTj0iJHtjY3BjfS9XWCIKLWVsaWYgdGVzdCAkY3QgPSBkbWM7IHRoZW4KLQlzYXZlX05PV0FSTj0iJHtjY3BjfS13IgotCURPV0FSTj0iJHtjY3BjfS13eCIKLWVsaWYgdGVzdCAkY3QgPSBiY2M7IHRoZW4KLQlzYXZlX05PV0FSTj0iJHtjY3BjfS13IgotCURPV0FSTj0iJHtjY3BjfS13ISIKLWVsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KLQk6IC1tc2dfKiBmbGFncyBub3QgdXNlZCB5ZXQsIG9yIGlzIC13MiBjb3JyZWN0PwotZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgotCXNhdmVfTk9XQVJOPS1xZmxhZz1pOmUKLQlET1dBUk49LXFmbGFnPWk6aQotZWxpZiB0ZXN0ICRjdCA9IHRlbmRyYTsgdGhlbgotCXNhdmVfTk9XQVJOPS13Ci1lbGlmIHRlc3QgJGN0ID0gdWNvZGU7IHRoZW4KLQlzYXZlX05PV0FSTj0KLQlET1dBUk49LXcyCi1lbHNlCi0JdGVzdCB4IiRzYXZlX05PV0FSTiIgPSB4IiIgJiYgc2F2ZV9OT1dBUk49LVduby1lcnJvcgotCWFjX2ZsYWdzIDAgd25vZXJyb3IgIiRzYXZlX05PV0FSTiIKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fV05PRVJST1IgfHwgc2F2ZV9OT1dBUk49Ci0JYWNfZmxhZ3MgMCB3ZXJyb3IgLVdlcnJvcgotCXRlc3QgMSA9ICRIQVZFX0NBTl9XRVJST1IgJiYgRE9XQVJOPS1XZXJyb3IKLWZpCi0KLXRlc3QgJGN0ID0gaWNjICYmIERPV0FSTj0iJERPV0FSTiAtd2QxNDE5IgotTk9XQVJOPSRzYXZlX05PV0FSTgotCi0jCi0jIENvbXBpbGVyOiBleHRyYSBmbGFncyAoLU8yIC1mKiAtVyogZXRjLikKLSMKLWk9YGVjaG8gOiIkb3JpZ19DRkxBR1MiIHwgc2VkICdzL146Ly8nIHwgdHIgLWMgLWQgJGFsbGwkYWxsdSRhbGxuYAotIyBvcHRpbWlzYXRpb246IG9ubHkgaWYgb3JpZ19DRkxBR1MgaXMgZW1wdHkKLXRlc3QgeCIkaSIgPSB4IiIgJiYgaWYgdGVzdCAkY3QgPSBzdW5wcm87IHRoZW4KLQljYXQgPnggPDwtJ0VPRicKLQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9Ci0JCSNkZWZpbmUgX19JRFNUUklOR19DT05DQVQobCxwKQlfX0xJTlRFRF9fICMjIGwgIyMgXyAjIyBwCi0JCSNkZWZpbmUgX19JRFNUUklOR19FWFBBTkQobCxwKQlfX0lEU1RSSU5HX0NPTkNBVChsLHApCi0JCSNkZWZpbmUgcGFkCQkJdm9pZCBfX0lEU1RSSU5HX0VYUEFORChfX0xJTkVfXyx4KSh2b2lkKSB7IH0KLQlFT0YKLQl5ZXMgcGFkIHwgaGVhZCAtbiAyNTYgPj54Ci0JYWNfZmxhZ3MgLSAxIG90d28gLXhPMiA8eAotCXJtZiB4Ci1lbGlmIHRlc3QgJGN0ID0gaHBjYzsgdGhlbgotCXBoYXNlPXUKLQlhY19mbGFncyAxIG90d28gK08yCi0JcGhhc2U9eAotZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgotCWFjX2ZsYWdzIDEgb3RocmVlICItTzMgLXFzdHJpY3QiCi0JdGVzdCAxID0gJEhBVkVfQ0FOX09USFJFRSB8fCBhY19mbGFncyAxIG90d28gLU8yCi1lbGlmIHRlc3QgJGN0ID0gdGNjIHx8IHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCi0JOiBubyBzcGVjaWFsIG9wdGltaXNhdGlvbgotZWxzZQotCWFjX2ZsYWdzIDEgb3R3byAtTzIKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fT1RXTyB8fCBhY19mbGFncyAxIG9wdGltaXNlIC1PCi1maQotIyBvdGhlciBmbGFnczoganVzdCBhZGQgdGhlbSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQKLWk9MAotaWYgdGVzdCAkY3QgPSBnY2M7IHRoZW4KLQkjIFRoZSBmb2xsb3dpbmcgdGVzdHMgcnVuIHdpdGggLVdlcnJvciAoZ2NjIG9ubHkpIGlmIHBvc3NpYmxlCi0JTk9XQVJOPSRET1dBUk47IHBoYXNlPXUKLQlhY19mbGFncyAxIGZub3N0cmljdGFsaWFzaW5nIC1mbm8tc3RyaWN0LWFsaWFzaW5nCi0JYWNfZmxhZ3MgMSBmc3RhY2twcm90ZWN0b3JhbGwgLWZzdGFjay1wcm90ZWN0b3ItYWxsCi0JYWNfZmxhZ3MgMSBmd3JhcHYgLWZ3cmFwdgotCXRlc3QgJGNtID0gY29tYmluZSAmJiBhY19mbGFncyAwIGNvbWJpbmUgXAotCSAgICAnLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZScgXAotCSAgICAnaWYgZ2NjIHN1cHBvcnRzIC1md2hvbGUtcHJvZ3JhbSAtLWNvbWJpbmUnCi0JaT0xCi1lbGlmIHRlc3QgJGN0ID0gaWNjOyB0aGVuCi0JYWNfZmxhZ3MgMSBmbm9idWlsdGluc2V0bW9kZSAtZm5vLWJ1aWx0aW4tc2V0bW9kZQotCWFjX2ZsYWdzIDEgZm5vc3RyaWN0YWxpYXNpbmcgLWZuby1zdHJpY3QtYWxpYXNpbmcKLQlhY19mbGFncyAxIGZzdGFja3NlY3VyaXR5Y2hlY2sgLWZzdGFjay1zZWN1cml0eS1jaGVjawotCWk9MQotZWxpZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgotCXBoYXNlPXUKLQlhY19mbGFncyAxIHYgLXYKLQlhY19mbGFncyAxIHhjOTkgLXhjOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCi0JYWNfZmxhZ3MgMSBpcG8gLXhpcG8gJ2ZvciBjcm9zcy1tb2R1bGUgb3B0aW1pc2F0aW9uJwotCXBoYXNlPXgKLWVsaWYgdGVzdCAkY3QgPSBocGNjOyB0aGVuCi0JcGhhc2U9dQotCWFjX2ZsYWdzIDEgYWdjYyAtQWdjYyAnZm9yIHN1cHBvcnQgb2YgR0NDIGV4dGVuc2lvbnMnCi0JYWNfZmxhZ3MgMSBhYzk5IC1BQzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JwotCXBoYXNlPXgKLWVsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KLQlhY19mbGFncyAwIHZlcmIgLXZlcmJvc2UKLQlhY19mbGFncyAxIHJvZGF0YSAtcmVhZG9ubHlfc3RyaW5ncwotZWxpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgotCWFjX2ZsYWdzIDEgZGVjbCAiJHtjY3BjfS1yIiAnZm9yIHN0cmljdCBwcm90b3R5cGUgY2hlY2tzJwotCWFjX2ZsYWdzIDEgc2NoayAiJHtjY3BjfS1zIiAnZm9yIHN0YWNrIG92ZXJmbG93IGNoZWNraW5nJwotZWxpZiB0ZXN0ICRjdCA9IGJjYzsgdGhlbgotCWFjX2ZsYWdzIDEgc3RycG9vbCAiJHtjY3BjfS1kIiAnaWYgc3RyaW5nIHBvb2xpbmcgY2FuIGJlIGVuYWJsZWQnCi1lbGlmIHRlc3QgJGN0ID0gbWlwc3BybzsgdGhlbgotCWFjX2ZsYWdzIDEgeGM5OSAtYzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JwotCWFjX2ZsYWdzIDEgZnVsbHdhcm4gLWZ1bGx3YXJuICdmb3IgcmVtYXJrIG91dHB1dCBzdXBwb3J0JwotZWxpZiB0ZXN0ICRjdCA9IG1zYzsgdGhlbgotCWFjX2ZsYWdzIDEgc3RycG9vbCAiJHtjY3BjfS9HRiIgJ2lmIHN0cmluZyBwb29saW5nIGNhbiBiZSBlbmFibGVkJwotCWVjaG8gJ2ludCBtYWluKHZvaWQpIHsgY2hhciB0ZXN0WzY0XSA9ICIiOyByZXR1cm4gKCp0ZXN0KTsgfScgPngKLQlhY19mbGFncyAtIDEgc3RhY2tvbiAiJHtjY3BjfS9HWiIgJ2lmIHN0YWNrIGNoZWNrcyBjYW4gYmUgZW5hYmxlZCcgPHgKLQlhY19mbGFncyAtIDEgc3Rja2FsbCAiJHtjY3BjfS9HZSIgJ3N0YWNrIGNoZWNrcyBmb3IgYWxsIGZ1bmN0aW9ucycgPHgKLQlhY19mbGFncyAtIDEgc2VjdWNoayAiJHtjY3BjfS9HUyIgJ2ZvciBjb21waWxlciBzZWN1cml0eSBjaGVja3MnIDx4Ci0Jcm1mIHgKLQlhY19mbGFncyAxIHdhbGwgIiR7Y2NwY30vV2FsbCIgJ3RvIGVuYWJsZSBhbGwgd2FybmluZ3MnCi0JYWNfZmxhZ3MgMSB3cDY0ICIke2NjcGN9L1dwNjQiICd0byBlbmFibGUgNjQtYml0IHdhcm5pbmdzJwotZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgotCWFjX2ZsYWdzIDEgeDk5IC1xbGFuZ2x2bD1leHRjOTkKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fWDk5IHx8IGFjX2ZsYWdzIDEgYzk5IC1xbGFuZ2x2bD1zdGRjOTkKLQlhY19mbGFncyAxIHJvZGF0YSAiLXFybyAtcXJvY29uc3QgLXFyb3B0ciIKLQlhY19mbGFncyAxIHJ0Y2hlY2sgLXFjaGVjaz1hbGwKLQlhY19mbGFncyAxIHJ0Y2hrYyAtcWV4dGNoawotCWFjX2ZsYWdzIDEgd2Zvcm1hdCAiLXFmb3JtYXQ9YWxsIC1xZm9ybWF0PW5vemxuIgotCSNhY19mbGFncyAxIHdwNjQgLXF3YXJuNjQJIyB0b28gdmVyYm9zZSBmb3Igbm93Ci1lbGlmIHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCi0JYWNfZmxhZ3MgMCB5c3lzdGVtIC1Zc3lzdGVtCi0JdGVzdCAxID0gJEhBVkVfQ0FOX1lTWVNURU0gJiYgQ1BQRkxBR1M9Ii1Zc3lzdGVtICRDUFBGTEFHUyIKLQlhY19mbGFncyAxIGV4dGFuc2kgLVhhCi1lbGlmIHRlc3QgJGN0ID0gdGNjOyB0aGVuCi0JYWNfZmxhZ3MgMSBib3VuZHNjaGsgLWIKLWVsaWYgdGVzdCAkY3QgPSBjbGFuZzsgdGhlbgotCWk9MQotZWxpZiB0ZXN0ICRjdCA9IG53Y2M7IHRoZW4KLQlpPTEKLQkjYnJva2VuIyBhY19mbGFncyAxIHNzcCAtc3RhY2twcm90ZWN0Ci1maQotIyBmbGFncyBjb21tb24gdG8gYSBzdWJzZXQgb2YgY29tcGlsZXJzIChydW4gd2l0aCAtV2Vycm9yIG9uIGdjYykKLWlmIHRlc3QgMSA9ICRpOyB0aGVuCi0JYWNfZmxhZ3MgMSBzdGRnOTkgLXN0ZD1nbnU5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OSArIEdDQyBleHRlbnNpb25zJwotCXRlc3QgMSA9ICRIQVZFX0NBTl9TVERHOTkgfHwgXAotCSAgICBhY19mbGFncyAxIHN0ZGM5OSAtc3RkPWM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKLQlhY19mbGFncyAxIHdhbGwgLVdhbGwKLWZpCi1waGFzZT14Ci0KLSMgVGhlIGZvbGxvd2luZyB0ZXN0cyBydW4gd2l0aCAtV2Vycm9yIG9yIHNpbWlsYXIgKGFsbCBjb21waWxlcnMpIGlmIHBvc3NpYmxlCi1OT1dBUk49JERPV0FSTgotdGVzdCAkY3QgPSBwY2MgJiYgcGhhc2U9dQotCi0jCi0jIENvbXBpbGVyOiBjaGVjayBmb3Igc3R1ZmYgdGhhdCBvbmx5IGdlbmVyYXRlcyB3YXJuaW5ncwotIwotYWNfdGVzdCBhdHRyaWJ1dGVfYm91bmRlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKGJvdW5kZWQpKScgPDwtJ0VPRicKLQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKLQkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JI3VuZGVmIF9fYXR0cmlidXRlX18KLQlpbnQgeGNvcHkoY29uc3Qgdm9pZCAqLCB2b2lkICosIHNpemVfdCkKLQkgICAgX19hdHRyaWJ1dGVfXygoYm91bmRlZCAoYnVmZmVyLCAxLCAzKSkpCi0JICAgIF9fYXR0cmlidXRlX18oKGJvdW5kZWQgKGJ1ZmZlciwgMiwgMykpKTsKLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuICh4Y29weShhdlswXSwgYXZbLS1hY10sIDEpKTsgfQotCWludCB4Y29weShjb25zdCB2b2lkICpzLCB2b2lkICpkLCBzaXplX3QgbikgewotCQltZW1tb3ZlKGQsIHMsIG4pOyByZXR1cm4gKChpbnQpbik7Ci0JfQotCSNlbmRpZgotRU9GCi1hY190ZXN0IGF0dHJpYnV0ZV9mb3JtYXQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChmb3JtYXQpKScgPDwtJ0VPRicKLQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKLQkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQkjaW5jbHVkZSA8c3RkaW8uaD4KLQkjdW5kZWYgX19hdHRyaWJ1dGVfXwotCSN1bmRlZiBwcmludGYKLQlleHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0JaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuIChwcmludGYoIiVzJWQiLCAqYXYsIGFjKSk7IH0KLQkjZW5kaWYKLUVPRgotYWNfdGVzdCBhdHRyaWJ1dGVfbm9ubnVsbCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKG5vbm51bGwpKScgPDwtJ0VPRicKLQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKLQkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQlpbnQgZm9vKGNoYXIgKnMxLCBjaGFyICpzMikgX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpOwotCWludCBiYXIoY2hhciAqczEsIGNoYXIgKnMyKSBfX2F0dHJpYnV0ZV9fKChub25udWxsICgxLCAyKSkpOwotCWludCBiYXooY2hhciAqcykgX19hdHRyaWJ1dGVfXygobm9ubnVsbCAoMSkpKTsKLQlpbnQgZm9vKGNoYXIgKnMxLCBjaGFyICpzMikgeyByZXR1cm4gKGJhcihzMiwgczEpKTsgfQotCWludCBiYXIoY2hhciAqczEsIGNoYXIgKnMyKSB7IHJldHVybiAoYmF6KHMxKSAtIGJheihzMikpOyB9Ci0JaW50IGJheihjaGFyICpzKSB7IHJldHVybiAoKnMpOyB9Ci0JaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuIChhYyA9PSBmb28oYXZbMF0sIGF2W2FjLTFdKSk7IH0KLQkjZW5kaWYKLUVPRgotYWNfdGVzdCBhdHRyaWJ1dGVfbm9yZXR1cm4gJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpJyA8PC0nRU9GJwotCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KLQkjZWxzZQotCSNpbmNsdWRlIDxzdGRsaWIuaD4KLQkjdW5kZWYgX19hdHRyaWJ1dGVfXwotCXZvaWQgZm5vcmQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLQlpbnQgbWFpbih2b2lkKSB7IGZub3JkKCk7IH0KLQl2b2lkIGZub3JkKHZvaWQpIHsgZXhpdCgwKTsgfQotCSNlbmRpZgotRU9GCi1hY190ZXN0IGF0dHJpYnV0ZV91bnVzZWQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKScgPDwtJ0VPRicKLQkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKLQkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQlpbnQgbWFpbihpbnQgYWMgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGNoYXIgKiphdgotCSAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkgeyByZXR1cm4gKDApOyB9Ci0JI2VuZGlmCi1FT0YKLWFjX3Rlc3QgYXR0cmlidXRlX3VzZWQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKCh1c2VkKSknIDw8LSdFT0YnCi0JI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCi0JLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCi0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQotCSNlbHNlCi0Jc3RhdGljIGNvbnN0IGNoYXIgZm5vcmRbXSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgPSAiNDIiOwotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQotCSNlbmRpZgotRU9GCi0KLSMgRW5kIG9mIHRlc3RzIHJ1biB3aXRoIC1XZXJyb3IKLU5PV0FSTj0kc2F2ZV9OT1dBUk4KLXBoYXNlPXgKLQotIwotIyBta3NoOiBmbGF2b3VycyAoZnVsbC9zbWFsbCBta3NoLCBvbWl0IGNlcnRhaW4gc3R1ZmYpCi0jCi1pZiBhY19pZmNwcCAnaWZkZWYgTUtTSF9TTUFMTCcgaXNzZXRfTUtTSF9TTUFMTCAnJyBcCi0gICAgImlmIGEgcmVkdWNlZC1mZWF0dXJlIG1rc2ggaXMgcmVxdWVzdGVkIjsgdGhlbgotCSNYWFggdGhpcyBzdWNrczsgZml4IGl0IGZvciAqYWxsKiBjb21waWxlcnMKLQljYXNlICRjdCBpbgotCWNsYW5nfGljY3xud2NjKQotCQlhY19mbGFncyAxIGZub2lubGluZSAtZm5vLWlubGluZQotCQk7OwotCWdjYykKLQkJTk9XQVJOPSRET1dBUk47IHBoYXNlPXUKLQkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLWZuby1pbmxpbmUKLQkJTk9XQVJOPSRzYXZlX05PV0FSTjsgcGhhc2U9eAotCQk7OwotCXN1bnBybykKLQkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLXhpbmxpbmU9Ci0JCTs7Ci0JeGxjKQotCQlhY19mbGFncyAxIGZub2lubGluZSAtcW5vaW5saW5lCi0JCTs7Ci0JZXNhYwotCi0JOiAke0hBVkVfTUtOT0Q9MH0KLQk6ICR7SEFWRV9OSUNFPTB9Ci0JOiAke0hBVkVfUkVWT0tFPTB9Ci0JOiAke0hBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTB9Ci0JY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxzbWtzaAotCUhBVkVfSVNTRVRfTUtTSF9DT05TRVJWQVRJVkVfRkRTPTEJIyBmcm9tIHNoLmgKLWZpCi1hY19pZmNwcCAnaWZkZWYgTUtTSF9CSU5TSFJFRFVDRUQnIGlzc2V0X01LU0hfQklOU0hSRURVQ0VEICcnIFwKLSAgICAiaWYgYSByZWR1Y2VkLWZlYXR1cmUgc2ggaXMgcmVxdWVzdGVkIiAmJiBcCi0gICAgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxiaW5zaAotYWNfaWZjcHAgJ2lmZGVmIE1LU0hfVU5FTVBMT1lFRCcgaXNzZXRfTUtTSF9VTkVNUExPWUVEICcnIFwKLSAgICAiaWYgbWtzaCB3aWxsIGJlIGJ1aWx0IHdpdGhvdXQgam9iIGNvbnRyb2wiICYmIFwKLSAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGFyZ2UKLWFjX2lmY3BwICdpZmRlZiBNS1NIX0FTU1VNRV9VVEY4JyBpc3NldF9NS1NIX0FTU1VNRV9VVEY4ICcnIFwKLSAgICAnaWYgdGhlIGRlZmF1bHQgVVRGLTggbW9kZSBpcyBzcGVjaWZpZWQnICYmIDogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQotYWNfaWZjcHAgJ2lmZGVmIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUycgaXNzZXRfTUtTSF9DT05TRVJWQVRJVkVfRkRTICcnIFwKLSAgICAnaWYgdHJhZGl0aW9uYWwvY29uc2VydmF0aXZlIGZkIHVzZSBpcyByZXF1ZXN0ZWQnICYmIFwKLSAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGNvbnZmZHMKLQotIwotIyBFbnZpcm9ubWVudDogaGVhZGVycwotIwotYWNfaGVhZGVyIHN5cy9wYXJhbS5oCi1hY19oZWFkZXIgc3lzL21rZGV2Lmggc3lzL3R5cGVzLmgKLWFjX2hlYWRlciBzeXMvbW1hbi5oIHN5cy90eXBlcy5oCi1hY19oZWFkZXIgc3lzL3N5c21hY3Jvcy5oCi1hY19oZWFkZXIgZ3JwLmggc3lzL3R5cGVzLmgKLWFjX2hlYWRlciBsaWJnZW4uaAotYWNfaGVhZGVyIGxpYnV0aWwuaCBzeXMvdHlwZXMuaAotYWNfaGVhZGVyIHBhdGhzLmgKLWFjX2hlYWRlciBzdGRib29sLmgKLWFjX2hlYWRlciBzdGRpbnQuaCBzdGRhcmcuaAotYWNfaGVhZGVyIHN0cmluZ3MuaCBzeXMvdHlwZXMuaAotYWNfaGVhZGVyIHVsaW1pdC5oIHN5cy90eXBlcy5oCi1hY19oZWFkZXIgdmFsdWVzLmgKLQotIwotIyBFbnZpcm9ubWVudDogZGVmaW5pdGlvbnMKLSMKLWVjaG8gJyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLS8qIGNoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyXjYzLTEgY29ycmVjdGx5LCB0aHggRlNGICovCi0jZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KTEgPDwgNjIpIC0gMSArICgob2ZmX3QpMSA8PCA2MikpCi1pbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEgJiYKLSAgICBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkgPyAxIDogLTFdOwotaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+bGZ0LmMKLWFjX3Rlc3RuIGNhbl9sZnMgJycgImZvciBsYXJnZSBmaWxlIHN1cHBvcnQiIDxsZnQuYwotc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKLUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfRklMRV9PRkZTRVRfQklUUz02NCIKLWFjX3Rlc3RuIGNhbl9sZnNfc3VzICchJyBjYW5fbGZzIDAgIi4uLiB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiIDxsZnQuYwotaWYgdGVzdCAwID0gJEhBVkVfQ0FOX0xGU19TVVM7IHRoZW4KLQlDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MgLURfTEFSR0VfRklMRVM9MSIKLQlhY190ZXN0biBjYW5fbGZzX2FpeCAnIScgY2FuX2xmcyAwICIuLi4gd2l0aCAtRF9MQVJHRV9GSUxFUz0xIiA8bGZ0LmMKLQl0ZXN0IDEgPSAkSEFWRV9DQU5fTEZTX0FJWCB8fCBDUFBGTEFHUz0kc2F2ZV9DUFBGTEFHUwotZmkKLXJtZiBsZnQqCSMgZW5kIG9mIGxhcmdlIGZpbGUgc3VwcG9ydCB0ZXN0Ci0KLSMKLSMgRW52aXJvbm1lbnQ6IHR5cGVzCi0jCi1hY190ZXN0IGNhbl9pbnR0eXBlcyAnIScgc3RkaW50X2ggMSAiZm9yIHN0YW5kYXJkIDMyLWJpdCBpbnRlZ2VyIHR5cGVzIiA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c3RkZGVmLmg+Ci0JaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuICgodWludDMyX3QpKHB0cmRpZmZfdCkqYXYgKyAoaW50MzJfdClhYyk7IH0KLUVPRgotYWNfdGVzdCBjYW5fdWNiaW50cyAnIScgY2FuX2ludHR5cGVzIDEgImZvciBVQ0IgMzItYml0IGludGVnZXIgdHlwZXMiIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1X2ludDMyX3QpKHB0cmRpZmZfdCkqYXYgKyAoaW50MzJfdClhYyk7IH0KLUVPRgotYWNfdGVzdCBjYW5faW50OHR5cGUgJyEnIHN0ZGludF9oIDEgImZvciBzdGFuZGFyZCA4LWJpdCBpbnRlZ2VyIHR5cGUiIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1aW50OF90KShwdHJkaWZmX3QpYXZbYWNdKTsgfQotRU9GCi1hY190ZXN0IGNhbl91Y2JpbnQ4ICchJyBjYW5faW50OHR5cGUgMSAiZm9yIFVDQiA4LWJpdCBpbnRlZ2VyIHR5cGUiIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1X2ludDhfdCkocHRyZGlmZl90KWF2W2FjXSk7IH0KLUVPRgotCi1hY190ZXN0IHJsaW1fdCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQkjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShybGltX3QpMCk7IH0KLUVPRgotCi0jIG9ubHkgdGVzdG46IGFkZGVkIGxhdGVyIGJlbG93Ci1hY190ZXN0biBzaWdfdCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c2lnbmFsLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHNpZ190KWtpbGwoMCwwKSk7IH0KLUVPRgotCi1hY190ZXN0biBzaWdoYW5kbGVyX3QgJyEnIHNpZ190IDAgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHNpZ25hbC5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KShzaWdoYW5kbGVyX3Qpa2lsbCgwLDApKTsgfQotRU9GCi1pZiB0ZXN0IDEgPSAkSEFWRV9TSUdIQU5ETEVSX1Q7IHRoZW4KLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9c2lnaGFuZGxlcl90IgotCUhBVkVfU0lHX1Q9MQotZmkKLQotYWNfdGVzdG4gX19zaWdoYW5kbGVyX3QgJyEnIHNpZ190IDAgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHNpZ25hbC5oPgotCSNpbmNsdWRlIDxzdGRkZWYuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KShfX3NpZ2hhbmRsZXJfdClraWxsKDAsMCkpOyB9Ci1FT0YKLWlmIHRlc3QgMSA9ICRIQVZFX19fU0lHSEFORExFUl9UOyB0aGVuCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNpZ190PV9fc2lnaGFuZGxlcl90IgotCUhBVkVfU0lHX1Q9MQotZmkKLQotdGVzdCAxID0gJEhBVkVfU0lHX1QgfHwgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNpZ190PW5vc2lnX3QiCi1hY19jcHBmbGFncyBTSUdfVAotCi0jCi0jIEVudmlyb25tZW50OiBzaWduYWxzCi0jCi10ZXN0IHgiTmV0QlNEIiA9IHgiJFRBUkdFVF9PUyIgJiYgJGUgSWdub3JlIHRoZSBjb21wYXRpYmlsaXR5IHdhcm5pbmcuCi0KLWZvciB3aGF0IGluIG5hbWUgbGlzdDsgZG8KLQl1d2hhdD1gdXBwZXIgJHdoYXRgCi0JYWNfdGVzdG4gc3lzX3NpZyR3aGF0ICcnICJ0aGUgc3lzX3NpZyR7d2hhdH1bXSBhcnJheSIgPDwtRU9GCi0JCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBzeXNfc2lnJHt3aGF0fVtdOwotCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3lzX3NpZyR7d2hhdH1bMF1bMF0pOyB9Ci0JRU9GCi0JYWNfdGVzdG4gX3N5c19zaWckd2hhdCAnIScgc3lzX3NpZyR3aGF0IDAgInRoZSBfc3lzX3NpZyR7d2hhdH1bXSBhcnJheSIgPDwtRU9GCi0JCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBfc3lzX3NpZyR7d2hhdH1bXTsKLQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKF9zeXNfc2lnJHt3aGF0fVswXVswXSk7IH0KLQlFT0YKLQlpZiBldmFsICJ0ZXN0IDEgPSBcJEhBVkVfX1NZU19TSUckdXdoYXQiOyB0aGVuCi0JCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzeXNfc2lnJHdoYXQ9X3N5c19zaWckd2hhdCIKLQkJZXZhbCAiSEFWRV9TWVNfU0lHJHV3aGF0PTEiCi0JZmkKLQlhY19jcHBmbGFncyBTWVNfU0lHJHV3aGF0Ci1kb25lCi0KLWFjX3Rlc3Qgc3Ryc2lnbmFsICchJyBzeXNfc2lnbGlzdCAwIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCSNpbmNsdWRlIDxzaWduYWwuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3Ryc2lnbmFsKDEpWzBdKTsgfQotRU9GCi0KLSMKLSMgRW52aXJvbm1lbnQ6IGxpYnJhcnkgZnVuY3Rpb25zCi0jCi1hY190ZXN0biBmbG9ja19leCAnJyAnZmxvY2sgYW5kIG1tYXAnIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCSNpbmNsdWRlIDxmY250bC5oPgotCSNpbmNsdWRlIDxzdGRsaWIuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKHZvaWQgKiltbWFwKE5VTEwsIChzaXplX3QpZmxvY2soMCwgTE9DS19FWCksCi0JICAgIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIDAsIChvZmZfdCkwKSA9PSAodm9pZCAqKU5VTEwgPyAxIDoKLQkgICAgbXVubWFwKE5VTEwsIDApKTsgfQotRU9GCi0KLWFjX3Rlc3QgZ2V0cnVzYWdlIDw8LSdFT0YnCi0JI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKLQkjaW5jbHVkZSAic2guaCIKLQlpbnQgbWFpbih2b2lkKSB7Ci0JCXN0cnVjdCBydXNhZ2UgcnU7Ci0JCXJldHVybiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUpICsKLQkJICAgIGdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydSkpOwotCX0KLUVPRgotCi1hY190ZXN0IGtpbGxwZyA8PC0nRU9GJwotCSNpbmNsdWRlIDxzaWduYWwuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChhdlswXVtraWxscGcoMTIzLCBhYyldKTsgfQotRU9GCi0KLWFjX3Rlc3QgbWtub2QgJycgJ2lmIHRvIHVzZSBta25vZCgpLCBtYWtlZGV2KCkgYW5kIGZyaWVuZHMnIDw8LSdFT0YnCi0JI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKLQkjaW5jbHVkZSAic2guaCIKLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsKLQkJZGV2X3QgZHY7Ci0JCWR2ID0gbWFrZWRldigodW5zaWduZWQgaW50KWFjLCAodW5zaWduZWQgaW50KWF2WzBdWzBdKTsKLQkJcmV0dXJuIChta25vZChhdlswXSwgKG1vZGVfdCkwLCBkdikgPyAoaW50KW1ham9yKGR2KSA6Ci0JCSAgICAoaW50KW1pbm9yKGR2KSk7Ci0JfQotRU9GCi0KLWFjX3Rlc3QgbWtzdGVtcCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzdGRsaWIuaD4KLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50IG1haW4odm9pZCkgeyBjaGFyIHRtcGxbXSA9ICJYIjsgcmV0dXJuIChta3N0ZW1wKHRtcGwpKTsgfQotRU9GCi0KLWFjX3Rlc3QgbmljZSA8PC0nRU9GJwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAobmljZSg0KSk7IH0KLUVPRgotCi1hY190ZXN0IHJldm9rZSA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaWYgSEFWRV9MSUJVVElMX0gKLQkjaW5jbHVkZSA8bGlidXRpbC5oPgotCSNlbmRpZgotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChhYyArIHJldm9rZShhdlswXSkpOyB9Ci1FT0YKLQotYWNfdGVzdCBzZXRsb2NhbGVfY3R5cGUgJycgJ3NldGxvY2FsZShMQ19DVFlQRSwgIiIpJyA8PC0nRU9GJwotCSNpbmNsdWRlIDxsb2NhbGUuaD4KLQkjaW5jbHVkZSA8c3RkZGVmLmg+Ci0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkodm9pZCAqKXNldGxvY2FsZShMQ19DVFlQRSwgIiIpKTsgfQotRU9GCi0KLWFjX3Rlc3QgbGFuZ2luZm9fY29kZXNldCBzZXRsb2NhbGVfY3R5cGUgMCAnbmxfbGFuZ2luZm8oQ09ERVNFVCknIDw8LSdFT0YnCi0JI2luY2x1ZGUgPGxhbmdpbmZvLmg+Ci0JI2luY2x1ZGUgPHN0ZGRlZi5oPgotCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHZvaWQgKilubF9sYW5naW5mbyhDT0RFU0VUKSk7IH0KLUVPRgotCi1hY190ZXN0IHNldG1vZGUgbWtub2QgMSA8PC0nRU9GJwotCS8qIFhYWCBpbWFrZSBzdHlsZSAqLwotCS8qIFhYWCBjb25kaXRpb25zIGNvcnJlY3Q/ICovCi0JI2lmIGRlZmluZWQoX19NU1ZDUlRfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCS8qIGZvcmNlIGEgZmFpbHVyZTogV2luMzIgc2V0bW9kZSgpIGlzIG5vdCB3aGF0IHdlIHdhbnQuLi4gKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9Ci0JI2Vsc2UKLQkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGdldG1vZGUoc2V0bW9kZShhdlswXSksCi0JICAgIChtb2RlX3QpYWMpKTsgfQotCSNlbmRpZgotRU9GCi0KLWFjX3Rlc3Qgc2V0cmVzdWdpZCA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50IG1haW4odm9pZCkgeyBzZXRyZXN1aWQoMCwwLDApOyByZXR1cm4gKHNldHJlc2dpZCgwLDAsMCkpOyB9Ci1FT0YKLQotYWNfdGVzdCBzZXRncm91cHMgc2V0cmVzdWdpZCAwIDw8LSdFT0YnCi0JI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCSNpZiBIQVZFX0dSUF9ICi0JI2luY2x1ZGUgPGdycC5oPgotCSNlbmRpZgotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQgbWFpbih2b2lkKSB7IGdpZF90IGdpZCA9IDA7IHJldHVybiAoc2V0Z3JvdXBzKDAsICZnaWQpKTsgfQotRU9GCi0KLWFjX3Rlc3Qgc3RyY2FzZXN0ciA8PC0nRU9GJwotCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkjaW5jbHVkZSA8c3RkZGVmLmg+Ci0JI2luY2x1ZGUgPHN0cmluZy5oPgotCSNpZiBIQVZFX1NUUklOR1NfSAotCSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0JI2VuZGlmCi0JaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7Ci0JCXJldHVybiAoKGludCkocHRyZGlmZl90KSh2b2lkICopc3RyY2FzZXN0cigqYXYsIGF2W2FjXSkpOwotCX0KLUVPRgotCi1hY190ZXN0IHN0cmxjcHkgPDwtJ0VPRicKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoc3RybGNweSgqYXYsIGF2WzFdLAotCSAgICAoc2l6ZV90KWFjKSk7IH0KLUVPRgotCi0jCi0jIGNoZWNrIGhlYWRlcnMgZm9yIGRlY2xhcmF0aW9ucwotIwotc2F2ZV9DQz0kQ0M7IHNhdmVfTERGTEFHUz0kTERGTEFHUzsgc2F2ZV9MSUJTPSRMSUJTCi1DQz0iJENDIC1jIC1vICR0Y2ZuIjsgTERGTEFHUz07IExJQlM9Ci1hY190ZXN0ICchJyBmbG9ja19kZWNsIGZsb2NrX2V4IDEgJ2lmIGZsb2NrKCkgZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKLQkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQotCSNpbmNsdWRlICJzaC5oIgotCWxvbmcgZmxvY2sodm9pZCk7CQkvKiB0aGlzIGNsYXNoZXMgaWYgZGVmaW5lZCBiZWZvcmUgKi8KLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludClmbG9jaygpKTsgfQotRU9GCi1hY190ZXN0ICchJyByZXZva2VfZGVjbCByZXZva2UgMSAnaWYgcmV2b2tlKCkgZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKLQkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQotCSNpbmNsdWRlICJzaC5oIgotCWxvbmcgcmV2b2tlKHZvaWQpOwkJLyogdGhpcyBjbGFzaGVzIGlmIGRlZmluZWQgYmVmb3JlICovCi0JaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpcmV2b2tlKCkpOyB9Ci1FT0YKLWFjX3Rlc3Qgc3lzX3NpZ2xpc3RfZGVjbCBzeXNfc2lnbGlzdCAxICdpZiBzeXNfc2lnbGlzdFtdIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQnIDw8LSdFT0YnCi0JI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKLQkjaW5jbHVkZSAic2guaCIKLQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3lzX3NpZ2xpc3RbMF1bMF0pOyB9Ci1FT0YKLUNDPSRzYXZlX0NDOyBMREZMQUdTPSRzYXZlX0xERkxBR1M7IExJQlM9JHNhdmVfTElCUwotCi0jCi0jIG90aGVyIGNoZWNrcwotIwotZmQ9J2lmIHRvIHVzZSBwZXJzaXN0ZW50IGhpc3RvcnknCi1hY19jYWNoZSBQRVJTSVNURU5UX0hJU1RPUlkgfHwgdGVzdCAwID0gJEhBVkVfRkxPQ0tfRVggfHwgZnY9MQotdGVzdCAxID0gJGZ2IHx8IGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsbm8taGlzdGZpbGUKLWFjX3Rlc3Rkb25lCi1hY19jcHBmbGFncwotCi0jCi0jIENvbXBpbGVyOiBQcmFlcHJvY2Vzc29yIChvbmx5IGlmIG5lZWRlZCkKLSMKLXRlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FICYmIGlmIGFjX3Rlc3Rpbml0IGNwcF9kZCAnJyBcCi0gICAgJ2NoZWNraW5nIGlmIHRoZSBDIFByZXByb2Nlc3NvciBzdXBwb3J0cyAtZEQnOyB0aGVuCi0JZWNobyAnI2RlZmluZSBmb28gYmFyJyA+Y29uZnRlc3QuYwotCXZ2ICddJyAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIC1kRCBjb25mdGVzdC5jID54IgotCWdyZXAgJyNkZWZpbmUgZm9vIGJhcicgeCA+L2Rldi9udWxsIDI+JjEgJiYgZnY9MQotCXJtZiBjb25mdGVzdC5jIHggdnYub3V0Ci0JYWNfdGVzdGRvbmUKLWZpCi0KLSMKLSMgRW5kIG9mIG1pcnRvY29uZiBjaGVja3MKLSMKLSRlIC4uLiBkb25lLgotCi0jIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBhbmNpZW50IHZlcnNpb25zIG9mIGVkKDEpIHdyaXRpbmcKLSMgdGhlIGNoYXJhY3RlciBjb3VudCB0byBzdGFuZGFyZCBvdXRwdXQ7IGNvcGUgZm9yIHRoYXQKLWVjaG8gd3EgPngKLWVkIHggPHggMj4vZGV2L251bGwgfCBncmVwIDMgPi9kZXYvbnVsbCAyPiYxICYmIFwKLSAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLCRvbGRpc2hfZWQKLXJtZiB4IHZ2Lm91dAotCi1pZiB0ZXN0IDAgPSAkSEFWRV9TWVNfU0lHTkFNRTsgdGhlbgotCWlmIHRlc3QgMSA9ICRIQVZFX0NQUF9ERDsgdGhlbgotCQkkZSBHZW5lcmF0aW5nIGxpc3Qgb2Ygc2lnbmFsIG5hbWVzLi4uCi0JZWxzZQotCQkkZSBObyBsaXN0IG9mIHNpZ25hbCBuYW1lcyBhdmFpbGFibGUgdmlhIGNwcC4gRmFsbGluZyBiYWNrLi4uCi0JZmkKLQlzaWdzZWVuPToKLQllY2hvICcjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZuZGVmIE5TSUcKLSNpZiBkZWZpbmVkKF9OU0lHKQotI2RlZmluZSBOU0lHIF9OU0lHCi0jZWxpZiBkZWZpbmVkKFNJR01BWCkKLSNkZWZpbmUgTlNJRyAoU0lHTUFYKzEpCi0jZW5kaWYKLSNlbmRpZgotbWtzaF9jZmc6IE5TSUcnID5jb25mdGVzdC5jCi0JTlNJRz1gdnEgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIiB8IFwKLQkgICAgZ3JlcCBta3NoX2NmZzogfCBzZWQgJ3MvXm1rc2hfY2ZnOlsJIF0qXChbMC05eCAoKSstXSpcKS4qJC9cMS8nYAotCWNhc2UgJE5TSUcgaW4KLQkqW1wgXChcKSstXSopIE5TSUc9YGF3ayAiQkVHSU4geyBwcmludCAkTlNJRyB9ImAgOzsKLQllc2FjCi0JcHJpbnRmPXByaW50ZgotCShwcmludGYgaGFsbG8pID4vZGV2L251bGwgMj4mMSB8fCBwcmludGY9ZWNobwotCXRlc3QgJHByaW50ZiA9IGVjaG8gfHwgTlNJRz1gcHJpbnRmICVkICIkTlNJRyIgMj4vZGV2L251bGxgCi0JJHByaW50ZiAiTlNJRz0kTlNJRyAuLi4gIgotCXNpZ3M9IkFCUlQgQUxSTSBCVVMgQ0hMRCBDTEQgQ09OVCBESUwgRU1UIEZQRSBIVVAgSUxMIElORk8gSU5UIElPIElPVCIKLQlzaWdzPSIkc2lncyBLSUxMIExPU1QgUElQRSBQUk9GIFBXUiBRVUlUIFJFU1YgU0FLIFNFR1YgU1RPUCBTWVMgVEVSTSIKLQlzaWdzPSIkc2lncyBUUkFQIFRTVFAgVFRJTiBUVE9VIFVSRyBVU1IxIFVTUjIgVlRBTFJNIFdJTkNIIFhDUFUgWEZTWiIKLQl0ZXN0IDEgPSAkSEFWRV9DUFBfREQgJiYgdGVzdCAkTlNJRyAtZ3QgMSAmJiBzaWdzPSIkc2lncyAiYHZxIFwKLQkgICAgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiAtZEQgY29uZnRlc3QuYyIgfCBcCi0JICAgIGdyZXAgJ1sJIF1TSUdbQS1aMC05XSpbCSBdJyB8IFwKLQkgICAgc2VkICdzL15cKC4qWwkgXVNJR1wpXChbQS1aMC05XSpcKVwoWwkgXS4qXCkkL1wyLycgfCBzb3J0YAotCXRlc3QgJE5TSUcgLWd0IDEgfHwgc2lncz0KLQlmb3IgbmFtZSBpbiAkc2lnczsgZG8KLQkJZWNobyAnI2luY2x1ZGUgPHNpZ25hbC5oPicgPmNvbmZ0ZXN0LmMKLQkJZWNobyBta3NoX2NmZzogU0lHJG5hbWUgPj5jb25mdGVzdC5jCi0JCXZxICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gY29uZnRlc3QuYyIgfCBcCi0JCSAgICBncmVwIG1rc2hfY2ZnOiB8IFwKLQkJICAgIHNlZCAncy9ebWtzaF9jZmc6WwkgXSpcKFswLTl4XSpcKS4qJC9cMTonJG5hbWUvCi0JZG9uZSB8IGdyZXAgLXYgJ146JyB8IHdoaWxlIElGUz06IHJlYWQgbnIgbmFtZTsgZG8KLQkJdGVzdCAkcHJpbnRmID0gZWNobyB8fCBucj1gcHJpbnRmICVkICIkbnIiIDI+L2Rldi9udWxsYAotCQl0ZXN0ICRuciAtZ3QgMCAmJiB0ZXN0ICRuciAtbGUgJE5TSUcgfHwgY29udGludWUKLQkJY2FzZSAkc2lnc2VlbiBpbgotCQkqOiRucjoqKSA7OwotCQkqKQllY2hvICIJCXsgXCIkbmFtZVwiLCAkbnIgfSwiCi0JCQlzaWdzZWVuPSRzaWdzZWVuJG5yOgotCQkJJHByaW50ZiAiJG5hbWU9JG5yICIgPiYyCi0JCQk7OwotCQllc2FjCi0JZG9uZSAyPiYxID5zaWduYW1lcy5pbmMKLQlybWYgY29uZnRlc3QuYwotCSRlIGRvbmUuCi1maQotCi1hZGRzcmNzICchJyBIQVZFX1NFVE1PREUgc2V0bW9kZS5jCi1hZGRzcmNzICchJyBIQVZFX1NUUkxDUFkgc3RybGNweS5jCi1hZGRzcmNzIFVTRV9QUklOVEZfQlVJTFRJTiBwcmludGYuYwotdGVzdCAxID0gIiRVU0VfUFJJTlRGX0JVSUxUSU4iICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX1BSSU5URl9CVUlMVElOIgotdGVzdCAwID0gIiRIQVZFX1NFVE1PREUiICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0NPTkZJR19IIC1EQ09ORklHX0hfRklMRU5BTUU9XFxcInNoLmhcXFwiIgotdGVzdCAxID0gIiRIQVZFX0NBTl9WRVJCIiAmJiBDRkxBR1M9IiRDRkxBR1MgLXZlcmJvc2UiCi0KLSRlICRiaSRtZTogRmluaXNoZWQgY29uZmlndXJhdGlvbiB0ZXN0aW5nLCBub3cgcHJvZHVjaW5nIG91dHB1dC4kYW8KLQotZmlsZXM9Ci1vYmpzPQotc3A9Ci1jYXNlICRjdXJkaXIgaW4KLSpcICopCWVjaG8gIiMhLi9ta3NoIiA+dGVzdC5zaCA7OwotKikJZWNobyAiIyEkY3VyZGlyL21rc2giID50ZXN0LnNoIDs7Ci1lc2FjCi1jYXQgPj50ZXN0LnNoIDw8LUVPRgotCUxDX0FMTD1DIFBBVEg9JyRQQVRIJzsgZXhwb3J0IExDX0FMTCBQQVRICi0JdGVzdCAtbiAiXCRLU0hfVkVSU0lPTiIgfHwgZXhpdCAxCi0JY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcwotCXByaW50IFRlc3RpbmcgbWtzaCBmb3IgY29uZm9ybWFuY2U6Ci0JZmdyZXAgTWlyT1M6ICckc3JjZGlyL2NoZWNrLnQnCi0JZmdyZXAgTUlSQlNEICckc3JjZGlyL2NoZWNrLnQnCi0JcHJpbnQgIlRoaXMgc2hlbGwgaXMgYWN0dWFsbHk6XFxuXFx0XCRLU0hfVkVSU0lPTiIKLQlwcmludCAndGVzdC5zaCBidWlsdCBmb3IgbWtzaCAkZHN0dmVyc2lvbicKLQljc3RyPSdcJG9zID0gZGVmaW5lZCBcJF5PID8gXCReTyA6ICJ1bmtub3duIjsnCi0JY3N0cj0iXCRjc3RyIidwcmludCBcJG9zIC4gIiwgUGVybCB2ZXJzaW9uICIgLiBcJF07JwotCWZvciBwZXJsaSBpbiBcJFBFUkwgcGVybDUgcGVybCBubzsgZG8KLQkJW1sgXCRwZXJsaSA9IG5vIF1dICYmIGV4aXQgMQotCQlwZXJsb3M9XCQoXCRwZXJsaSAtZSAiXCRjc3RyIikgMj4mLSB8fCBjb250aW51ZQotCQlwcmludCAiUGVybCBpbnRlcnByZXRlciAnXCRwZXJsaScgcnVubmluZyBvbiAnXCRwZXJsb3MnIgotCQlbWyAtbiBcJHBlcmxvcyBdXSAmJiBicmVhawotCWRvbmUKLQlleGVjIFwkcGVybGkgJyRzcmNkaXIvY2hlY2sucGwnIC1zICckc3JjZGlyL2NoZWNrLnQnIC1wICckY3VyZGlyL21rc2gnIFwke2NoZWNrX2NhdGVnb3JpZXM6Ky1DfSBcJHtjaGVja19jYXRlZ29yaWVzIyx9IFwkKiR0c3RzCi1FT0YKLWNobW9kIDc1NSB0ZXN0LnNoCi10ZXN0ICRIQVZFX0NBTl9DT01CSU5FJGNtID0gMGNvbWJpbmUgJiYgY209bm9ybWFsCi1pZiB0ZXN0ICRjbSA9IGxsdm07IHRoZW4KLQllbWl0YmM9Ii1lbWl0LWxsdm0gLWMiCi1lbGlmIHRlc3QgJGNtID0gZHJhZ29uZWdnOyB0aGVuCi0JZW1pdGJjPSItUyAtZmx0byIKLWVsc2UKLQllbWl0YmM9LWMKLWZpCi1lY2hvIHNldCAteCA+UmVidWlsZC5zaAotZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCi0Jb3A9YGVjaG8geCIkZmlsZSIgfCBzZWQgJ3MvXnhcKC4qXClcLmMkL1wxLi8nYAotCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCi0JZmlsZXM9IiRmaWxlcyRzcCRmaWxlIgotCXNwPScgJwotCWVjaG8gIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkZW1pdGJjICRmaWxlIHx8IGV4aXQgMSIgPj5SZWJ1aWxkLnNoCi0JaWYgdGVzdCAkY20gPSBkcmFnb25lZ2c7IHRoZW4KLQkJZWNobyAibXYgJHtvcH1zICR7b3B9bGwiID4+UmVidWlsZC5zaAotCQllY2hvICJsbHZtLWFzICR7b3B9bGwgfHwgZXhpdCAxIiA+PlJlYnVpbGQuc2gKLQkJb2Jqcz0iJG9ianMkc3Ake29wfWJjIgotCWVsc2UKLQkJb2Jqcz0iJG9ianMkc3Ake29wfW8iCi0JZmkKLWRvbmUKLWNhc2UgJGNtIGluCi1kcmFnb25lZ2d8bGx2bSkKLQllY2hvICJybSAtZiBta3NoLnMiID4+UmVidWlsZC5zaAotCWVjaG8gImxsdm0tbGluayAtbyAtICRvYmpzIHwgb3B0ICRvcHRmbGFncyB8IGxsYyAtbyBta3NoLnMiID4+UmVidWlsZC5zaAotCWxvYmpzPW1rc2gucwotCTs7Ci0qKQotCWxvYmpzPSRvYmpzCi0JOzsKLWVzYWMKLWNhc2UgJHRjZm4gaW4KLWEuZXhlKQlta3NoZXhlPW1rc2guZXhlIDs7Ci0qKQlta3NoZXhlPW1rc2ggOzsKLWVzYWMKLWVjaG8gdGNmbj0kbWtzaGV4ZSA+PlJlYnVpbGQuc2gKLWVjaG8gIiRDQyAkQ0ZMQUdTICRMREZMQUdTIC1vIFwkdGNmbiAkbG9ianMgJExJQlMgJGNjcHIiID4+UmVidWlsZC5zaAotZWNobyAndGVzdCAtZiAkdGNmbiB8fCBleGl0IDE7IHNpemUgJHRjZm4nID4+UmVidWlsZC5zaAotaWYgdGVzdCAkY20gPSBtYWtlZmlsZTsgdGhlbgotCWV4dHJhcz0nZW1hY3Nmbi5oIHNoLmggc2hfZmxhZ3MuaCB2YXJfc3BlYy5oJwotCXRlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FICYmIGV4dHJhcz0iJGV4dHJhcyBzaWduYW1lcy5pbmMiCi0JY2F0ID5NYWtlZnJhZy5pbmMgPDxFT0YKLSMgTWFrZWZpbGUgZnJhZ21lbnQgZm9yIGJ1aWxkaW5nIG1rc2ggJGRzdHZlcnNpb24KLQotUFJPRz0JCSRta3NoZXhlCi1NQU49CQlta3NoLjEKLVNSQ1M9CQkkU1JDUwotU1JDU19GUD0JJGZpbGVzCi1PQkpTX0JQPQkkb2JqcwotSU5EU1JDUz0JJGV4dHJhcwotTk9OU1JDU19JTlNUPQlkb3QubWtzaHJjIFwkKE1BTikKLU5PTlNSQ1NfTk9JTlNUPQlCdWlsZC5zaCBNYWtlZmlsZSBSZWJ1aWxkLnNoIGNoZWNrLnBsIGNoZWNrLnQgdGVzdC5zaAotQ0M9CQkkQ0MKLUNGTEFHUz0JCSRDRkxBR1MKLUNQUEZMQUdTPQkkQ1BQRkxBR1MKLUxERkxBR1M9CSRMREZMQUdTCi1MSUJTPQkJJExJQlMKLQotIyBub3QgQlNEIG1ha2Ugb25seToKLSNWUEFUSD0JCSRzcmNkaXIKLSNhbGw6IFwkKFBST0cpCi0jXCQoUFJPRyk6IFwkKE9CSlNfQlApCi0jCVwkKENDKSBcJChDRkxBR1MpIFwkKExERkxBR1MpIC1vIFwkQCBcJChPQkpTX0JQKSBcJChMSUJTKQotI1wkKE9CSlNfQlApOiBcJChTUkNTX0ZQKSBcJChOT05TUkNTKQotIy5jLm86Ci0jCVwkKENDKSBcJChDRkxBR1MpIFwkKENQUEZMQUdTKSAtYyBcJDwKLQotIyBmb3IgYWxsIG1ha2UgdmFyaWFudHM6Ci0jUkVHUkVTU19GTEFHUz0JLXYKLSNyZWdyZXNzOgotIwkuL3Rlc3Quc2ggXCQoUkVHUkVTU19GTEFHUykKLQotIyBmb3IgQlNEIG1ha2Ugb25seToKLSMuUEFUSDogJHNyY2RpcgotIy5pbmNsdWRlIDxic2QucHJvZy5taz4KLUVPRgotCSRlCi0JJGUgR2VuZXJhdGVkIE1ha2VmcmFnLmluYyBzdWNjZXNzZnVsbHkuCi0JZXhpdCAwCi1maQotaWYgdGVzdCAkY20gPSBjb21iaW5lOyB0aGVuCi0Jb2Jqcz0iLW8gJG1rc2hleGUiCi0JZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCi0JCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCi0JCW9ianM9IiRvYmpzICRmaWxlIgotCWRvbmUKLQllbWl0YmM9Ii1md2hvbGUtcHJvZ3JhbSAtLWNvbWJpbmUiCi0JdiAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICRlbWl0YmMgJG9ianMgJExJQlMgJGNjcHIiCi1lbGlmIHRlc3QgMSA9ICRwbTsgdGhlbgotCWZvciBmaWxlIGluICRTUkNTOyBkbwotCQl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQotCQl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJGVtaXRiYyAkZmlsZSIgJgotCWRvbmUKLQl3YWl0Ci1lbHNlCi0JZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCi0JCXRlc3QgJGNtID0gZHJhZ29uZWdnICYmIFwKLQkJICAgIG9wPWBlY2hvIHgiJGZpbGUiIHwgc2VkICdzL154XCguKlwpXC5jJC9cMS4vJ2AKLQkJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKLQkJdiAiJENDICRDRkxBR1MgJENQUEZMQUdTICRlbWl0YmMgJGZpbGUiIHx8IGV4aXQgMQotCQlpZiB0ZXN0ICRjbSA9IGRyYWdvbmVnZzsgdGhlbgotCQkJdiAibXYgJHtvcH1zICR7b3B9bGwiCi0JCQl2ICJsbHZtLWFzICR7b3B9bGwiIHx8IGV4aXQgMQotCQlmaQotCWRvbmUKLWZpCi1jYXNlICRjbSBpbgotZHJhZ29uZWdnfGxsdm0pCi0Jcm1mIG1rc2gucwotCXYgImxsdm0tbGluayAtbyAtICRvYmpzIHwgb3B0ICRvcHRmbGFncyB8IGxsYyAtbyBta3NoLnMiCi0JOzsKLWVzYWMKLXRjZm49JG1rc2hleGUKLXRlc3QgJGNtID0gY29tYmluZSB8fCB2ICIkQ0MgJENGTEFHUyAkTERGTEFHUyAtbyAkdGNmbiAkbG9ianMgJExJQlMgJGNjcHIiCi10ZXN0IC1mICR0Y2ZuIHx8IGV4aXQgMQotdGVzdCAxID0gJHIgfHwgdiAiJE5ST0ZGIC1tZG9jIDwnJHNyY2Rpci9ta3NoLjEnID5ta3NoLmNhdDEiIHx8IFwKLSAgICBybWYgbWtzaC5jYXQxCi10ZXN0IDAgPSAkZXEgJiYgdiBzaXplICR0Y2ZuCi1pPWluc3RhbGwKLXRlc3QgLWYgL3Vzci91Y2IvJGkgJiYgaT0vdXNyL3VjYi8kaQotdGVzdCAxID0gJGVxICYmIGU9OgotJGUKLSRlIEluc3RhbGxpbmcgdGhlIHNoZWxsOgotJGUgIiMgJGkgLWMgLXMgLW8gcm9vdCAtZyBiaW4gLW0gNTU1IG1rc2ggL2Jpbi9ta3NoIgotJGUgIiMgZ3JlcCAteCAvYmluL21rc2ggL2V0Yy9zaGVsbHMgPi9kZXYvbnVsbCB8fCBlY2hvIC9iaW4vbWtzaCA+Pi9ldGMvc2hlbGxzIgotJGUgIiMgJGkgLWMgLW8gcm9vdCAtZyBiaW4gLW0gNDQ0IGRvdC5ta3NocmMgL3Vzci9zaGFyZS9kb2MvbWtzaC9leGFtcGxlcy8iCi0kZQotJGUgSW5zdGFsbGluZyB0aGUgbWFudWFsOgotaWYgdGVzdCAtZiBta3NoLmNhdDE7IHRoZW4KLQkkZSAiIyAkaSAtYyAtbyByb290IC1nIGJpbiAtbSA0NDQgbWtzaC5jYXQxIiBcCi0JICAgICIvdXNyL3NoYXJlL21hbi9jYXQxL21rc2guMCIKLQkkZSBvcgotZmkKLSRlICIjICRpIC1jIC1vIHJvb3QgLWcgYmluIC1tIDQ0NCBta3NoLjEgL3Vzci9zaGFyZS9tYW4vbWFuMS9ta3NoLjEiCi0kZQotJGUgUnVuIHRoZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGU6IC4vdGVzdC5zaAotJGUgUGxlYXNlIGFsc28gcmVhZCB0aGUgc2FtcGxlIGZpbGUgZG90Lm1rc2hyYyBhbmQgdGhlIGZpbmUgbWFudWFsLgotZXhpdCAwCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9jaGVjay5wbCBiL21rc2gvc3JjL2NoZWNrLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzkzZTk1Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2NoZWNrLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MSArMCwwIEBACi0jICRNaXJPUzogc3JjL2Jpbi9ta3NoL2NoZWNrLnBsLHYgMS4yMyAyMDA5LzA2LzEwIDE4OjEyOjQzIHRnIFJlbCAkCi0jICRPcGVuQlNEOiB0aCx2IDEuMTMgMjAwNi8wNS8xOCAyMToyNzoyMyBtaW9kIEV4cCAkCi0jLQotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKLSMJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotIwotIyBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSMgYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0jIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotIyBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSMgbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSMKLSMgVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0jIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotIyBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSMgbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0jIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotIyBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSMgZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0jIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0jLQotIyBFeGFtcGxlIHRlc3Q6Ci0jCQluYW1lOiBhLXRlc3QKLSMJCWRlc2NyaXB0aW9uOgotIwkJCWEgdGVzdCB0byBzaG93IGhvdyB0ZXN0cyBhcmUgZG9uZQotIwkJYXJndW1lbnRzOiAhLXghLWYhCi0jCQlzdGRpbjoKLSMJCQllY2hvIC1uICoKLSMJCQlmYWxzZQotIwkJZXhwZWN0ZWQtc3Rkb3V0OiAhCi0jCQkJKgotIwkJZXhwZWN0ZWQtc3RkZXJyOgotIwkJCSsgZWNobyAtbiAqCi0jCQkJKyBmYWxzZQotIwkJZXhwZWN0ZWQtZXhpdDogMQotIwkJLS0tCi0jCVRoaXMgcnVucyB0aGUgdGVzdC1wcm9ncmFtIChlZywgbWtzaCkgd2l0aCB0aGUgYXJndW1lbnRzIC14IGFuZCAtZiwKLSMJc3RhbmRhcmQgaW5wdXQgaXMgYSBmaWxlIGNvbnRhaW5pbmcgImVjaG8gaGkqXG5mYWxzZVxuIi4gVGhlIHByb2dyYW0KLSMJaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSAiaGkqIiAobm8gdHJhaWxpbmcgbmV3bGluZSkgb24gc3RhbmRhcmQgb3V0cHV0LAotIwkiKyBlY2hvIGhpKlxuK2ZhbHNlXG4iIG9uIHN0YW5kYXJkIGVycm9yLCBhbmQgYW4gZXhpdCBjb2RlIG9mIDEuCi0jCi0jCi0jIEZvcm1hdCBvZiB0ZXN0IGZpbGVzOgotIyAtIGJsYW5rIGxpbmVzIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGlnbm9yZWQKLSMgLSBhIHRlc3QgZmlsZSBjb250YWlucyBhIHNlcmllcyBvZiB0ZXN0cwotIyAtIGEgdGVzdCBpcyBhIHNlcmllcyBvZiB0YWc6dmFsdWUgcGFpcnMgZW5kZWQgd2l0aCBhICItLS0iIGxpbmUKLSMgICAobGVhZGluZy90cmFpbGluZyBzcGFjZXMgYXJlIHN0cmlwcGVkIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdmFsdWUpCi0jIC0gdGVzdCB0YWdzIGFyZToKLSMJVGFnCQkJRmxhZwlEZXNjcmlwdGlvbgotIwktLS0tLQkJCS0tLS0JLS0tLS0tLS0tLS0KLSMJbmFtZQkJCXIJVGhlIG5hbWUgb2YgdGhlIHRlc3Q7IHNob3VsZCBiZSB1bmlxdWUKLSMJZGVzY3JpcHRpb24JCW0JV2hhdCB0ZXN0IGRvZXMKLSMJYXJndW1lbnRzCQlNCUFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtOwotIwkJCQkJZGVmYXVsdCBpcyBubyBhcmd1bWVudHMuCi0jCXNjcmlwdAkJCW0JVmFsdWUgaXMgd3JpdHRlbiB0byBhIGZpbGUgd2hpY2gKLSMJCQkJCWlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvZ3JhbQotIwkJCQkJKGFmdGVyIHRoZSBhcmd1bWVudHMgYXJndW1lbnRzKQotIwlzdGRpbgkJCW0JVmFsdWUgaXMgd3JpdHRlbiB0byBhIGZpbGUgd2hpY2ggaXMKLSMJCQkJCXVzZWQgYXMgc3RhbmRhcmQtaW5wdXQgZm9yIHRoZSBwcm9ncmFtOwotIwkJCQkJZGVmYXVsdCBpcyB0byB1c2UgL2Rldi9udWxsLgotIwlwZXJsLXNldHVwCQltCVZhbHVlIGlzIGEgcGVybCBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQKLSMJCQkJCWp1c3QgYmVmb3JlIHRoZSB0ZXN0IGlzIHJ1bi4gVHJ5IHRvCi0jCQkJCQlhdm9pZCB1c2luZyB0aGlzLi4uCi0jCXBlcmwtY2xlYW51cAkJbQlWYWx1ZSBpcyBhIHBlcmwgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkCi0jCQkJCQlqdXN0IGFmdGVyIHRoZSB0ZXN0IGlzIHJ1bi4gVHJ5IHRvCi0jCQkJCQlhdm9pZCB1c2luZyB0aGlzLi4uCi0jCWVudi1zZXR1cAkJTQlWYWx1ZSBpcyBhIGxpc3Qgb2YgTkFNRT1WQUxVRSBlbGVtZW50cwotIwkJCQkJd2hpY2ggYXJlIHB1dCBpbiB0aGUgZW52aXJvbm1lbnQgYmVmb3JlCi0jCQkJCQl0aGUgdGVzdCBpcyBydW4uIElmIHRoZSA9VkFMVUUgaXMKLSMJCQkJCW1pc3NpbmcsIE5BTUUgaXMgcmVtb3ZlZCBmcm9tIHRoZQotIwkJCQkJZW52aXJvbm1lbnQuIFByb2dyYW1zIGFyZSBydW4gd2l0aAotIwkJCQkJdGhlIGZvbGxvd2luZyBtaW5pbWFsIGVudmlyb25tZW50OgotIwkJCQkJICAgIEhPTUUsIExEX0xJQlJBUllfUEFUSCwgTE9DUEFUSCwKLSMJCQkJCSAgICBMT0dOQU1FLCBQQVRILCBTSEVMTCwgVVNFUgotIwkJCQkJKHZhbHVlcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZgotIwkJCQkJdGhlIHRlc3QgaGFybmVzcykuCi0jCQkJCQlFTlYgaXMgc2V0IHRvIC9ub25leGlzdGFudC4KLSMJCQkJCV9fcHJvZ25hbWUgaXMgc2V0IHRvIHRoZSAtcCBhcmd1bWVudC4KLSMJCQkJCV9fcGVybG5hbWUgaXMgc2V0IHRvICReWCAocGVybGV4ZSkuCi0jCWZpbGUtc2V0dXAJCW1wcwlVc2VkIHRvIGNyZWF0ZSBmaWxlcywgZGlyZWN0b3JpZXMKLSMJCQkJCWFuZCBzeW1saW5rcy4gRmlyc3Qgd29yZCBpcyBlaXRoZXIKLSMJCQkJCWZpbGUsIGRpciBvciBzeW1saW5rOyBzZWNvbmQgd29yZCBpcwotIwkJCQkJcGVybWlzc2lvbnM7IHRoaXMgaXMgZm9sbG93ZWQgYnkgYQotIwkJCQkJcXVvdGVkIHdvcmQgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUKLSMJCQkJCWZpbGU7IHRoZSBlbmQtcXVvdGUgc2hvdWxkIGJlIGZvbGxvd2VkCi0jCQkJCQlieSBhIG5ld2xpbmUsIHRoZW4gdGhlIGZpbGUgZGF0YQotIwkJCQkJKGlmIGFueSkuIFRoZSBmaXJzdCB3b3JkIG1heSBiZQotIwkJCQkJcHJlY2VkZWQgYnkgYSAhIHRvIHN0cmlwIHRoZSB0cmFpbGluZwotIwkJCQkJbmV3bGluZSBpbiBhIHN5bWxpbmsuCi0jCWZpbGUtcmVzdWx0CQltcHMJVXNlZCB0byB2ZXJpZnkgYSBmaWxlLCBzeW1saW5rIG9yCi0jCQkJCQlkaXJlY3RvcnkgaXMgY3JlYXRlZCBjb3JyZWN0bHkuCi0jCQkJCQlUaGUgZmlyc3Qgd29yZCBpcyBlaXRoZXIKLSMJCQkJCWZpbGUsIGRpciBvciBzeW1saW5rOyBzZWNvbmQgd29yZCBpcwotIwkJCQkJZXhwZWN0ZWQgcGVybWlzc2lvbnM7IHRoaXJkIHdvcmQKLSMJCQkJCWlzIHVzZXItaWQ7IGZvdXJ0aCBpcyBncm91cC1pZDsKLSMJCQkJCWZpZnRoIGlzICJleGFjdCIgb3IgInBhdHRlcm4iCi0jCQkJCQlpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY29udGVudHMKLSMJCQkJCXdoaWNoIGZvbGxvdyBpcyB0byBiZSBtYXRjaGVkIGV4YWN0bHkKLSMJCQkJCW9yIGlmIGl0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLgotIwkJCQkJVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBxdW90ZWQgbmFtZQotIwkJCQkJb2YgdGhlIGZpbGUgdGhhdCBzaG91bGQgYmUgY3JlYXRlZC4KLSMJCQkJCVRoZSBlbmQtcXVvdGUgc2hvdWxkIGJlIGZvbGxvd2VkCi0jCQkJCQlieSBhIG5ld2xpbmUsIHRoZW4gdGhlIGZpbGUgZGF0YQotIwkJCQkJKGlmIGFueSkuIFRoZSBmaXJzdCB3b3JkIG1heSBiZQotIwkJCQkJcHJlY2VkZWQgYnkgYSAhIHRvIHN0cmlwIHRoZSB0cmFpbGluZwotIwkJCQkJbmV3bGluZSBpbiB0aGUgZmlsZSBjb250ZW50cy4KLSMJCQkJCVRoZSBwZXJtaXNzaW9ucywgdXNlciBhbmQgZ3JvdXAgZmllbGRzCi0jCQkJCQltYXkgYmUgKiBtZWFuaW5nIGFjY2VwdCBhbnkgdmFsdWUuCi0jCXRpbWUtbGltaXQJCQlUaW1lIGxpbWl0IC0gdGhlIHByb2dyYW0gaXMgc2VudCBhCi0jCQkJCQlTSUdLSUxMIE4gc2Vjb25kcy4gRGVmYXVsdCBpcyBubwotIwkJCQkJbGltaXQuCi0jCWV4cGVjdGVkLWZhaWwJCQkneWVzJyBpZiB0aGUgdGVzdCBpcyBleHBlY3RlZCB0byBmYWlsLgotIwlleHBlY3RlZC1leGl0CQkJZXhwZWN0ZWQgZXhpdCBjb2RlLiBDYW4gYmUgYSBudW1iZXIsCi0jCQkJCQlvciBhIEMgZXhwcmVzc2lvbiB1c2luZyB0aGUgdmFyaWFibGVzCi0jCQkJCQllLCBzIGFuZCB3IChleGl0IGNvZGUsIHRlcm1pbmF0aW9uCi0jCQkJCQlzaWduYWwsIGFuZCBzdGF0dXMgY29kZSkuCi0jCWV4cGVjdGVkLXN0ZG91dAkJbQlXaGF0IHRoZSB0ZXN0IHNob3VsZCBnZW5lcmF0ZSBvbiBzdGRvdXQ7Ci0jCQkJCQlkZWZhdWx0IGlzIHRvIGV4cGVjdCBubyBvdXRwdXQuCi0jCWV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuCW0JQSBwZXJsIHBhdHRlcm4gd2hpY2ggbWF0Y2hlcyB0aGUKLSMJCQkJCWV4cGVjdGVkIG91dHB1dC4KLSMJZXhwZWN0ZWQtc3RkZXJyCQltCVdoYXQgdGhlIHRlc3Qgc2hvdWxkIGdlbmVyYXRlIG9uIHN0ZGVycjsKLSMJCQkJCWRlZmF1bHQgaXMgdG8gZXhwZWN0IG5vIG91dHB1dC4KLSMJZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4JbQlBIHBlcmwgcGF0dGVybiB3aGljaCBtYXRjaGVzIHRoZQotIwkJCQkJZXhwZWN0ZWQgc3RhbmRhcmQgZXJyb3IuCi0jCWNhdGVnb3J5CQltCVNwZWNpZnkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZgotIwkJCQkJJ2NhdGVnb3JpZXMnIG9mIHByb2dyYW0gdGhhdCB0aGUgdGVzdAotIwkJCQkJaXMgdG8gYmUgcnVuIGZvci4gQSBjYXRlZ29yeSBjYW4gYmUKLSMJCQkJCW5lZ2F0ZWQgYnkgcHJlZml4aW5nIHRoZSBuYW1lIHdpdGggYSAhLgotIwkJCQkJVGhlIGlkZWEgaXMgdGhhdCBzb21lIHRlc3RzIGluIGEKLSMJCQkJCXRlc3Qgc3VpdGUgbWF5IGFwcGx5IHRvIGEgcGFydGljdWxhcgotIwkJCQkJcHJvZ3JhbSB2ZXJzaW9uIGFuZCBzaG91bGRuJ3QgYmUgcnVuCi0jCQkJCQlvbiBvdGhlciB2ZXJzaW9ucy4gVGhlIGNhdGVnb3J5KHMpIG9mCi0jCQkJCQl0aGUgcHJvZ3JhbSBiZWluZyB0ZXN0ZWQgY2FuIGJlCi0jCQkJCQlzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSMJCQkJCU9uZSBjYXRlZ29yeSBvczpYWFggaXMgcHJlZGVmaW5lZAotIwkJCQkJKFhYWCBpcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lLAotIwkJCQkJZWcsIGxpbnV4LCBkZWNfb3NmKS4KLSMgRmxhZyBtZWFuaW5nczoKLSMJcgl0YWcgaXMgcmVxdWlyZWQgKGVnLCBhIHRlc3QgbXVzdCBoYXZlIGEgbmFtZSB0YWcpLgotIwltCXZhbHVlIGNhbiBiZSBtdWx0aXBsZSBsaW5lcy4gTGluZXMgbXVzdCBiZSBwcmVmaXhlZCB3aXRoCi0jCQlhIHRhYi4gSWYgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIGluaXRpYWwgdGFnOnZhbHVlIGxpbmUgaXMKLSMJCQktIGVtcHR5OiB0aGUgaW5pdGlhbCBibGFuayBsaW5lIGlzIHN0cmlwcGVkLgotIwkJCS0gYSBsb25lICE6IHRoZSBsYXN0IG5ld2xpbmUgaW4gdGhlIHZhbHVlIGlzIHN0cmlwcGVkOwotIwlNCXZhbHVlIGNhbiBiZSBtdWx0aXBsZSBsaW5lcyAocHJlZml4ZWQgYnkgYSB0YWIpIGFuZCBjb25zaXN0cwotIwkJb2YgbXVsdGlwbGUgZmllbGRzLCBkZWxpbWl0ZWQgYnkgYSBmaWVsZCBzZXBhcmF0b3IgY2hhcmFjdGVyLgotIwkJVGhlIHZhbHVlIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIHRoZSBmLXMtYy4KLSMJcAl0YWcgdGFrZXMgcGFyYW1ldGVycyAodXNlZCB3aXRoIG0pLgotIwlzCXRhZyBjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzLgotCi11c2UgUE9TSVggcXcoRUlOVFIpOwotdXNlIEdldG9wdDo6U3RkOwotdXNlIENvbmZpZzsKLQotJG9zID0gZGVmaW5lZCAkXk8gPyAkXk8gOiAndW5rbm93bic7Ci0KLSgkcHJvZyA9ICQwKSA9fiBzIy4qLyMjOwotCi0kVXNhZ2UgPSA8PEVPRiA7Ci1Vc2FnZTogJHByb2cgWy1zIHRlc3Qtc2V0XSBbLUMgY2F0ZWdvcnldIFstcCBwcm9nXSBbLXZdIFstZSBlPXZdIG5hbWUgLi4uCi0JLXAgcAlVc2UgcCBhcyB0aGUgcHJvZ3JhbSB0byB0ZXN0Ci0JLUMgYwlTcGVjaWZ5IHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjYXRlZ29yaWVzIHRoZSBwcm9ncmFtCi0JCWJlbG9uZ3MgdG8gKHNlZSBjYXRlZ29yeSBmaWVsZCkuCi0JLXMgcwlSZWFkIHRlc3RzIGZyb20gZmlsZSBzOyBpZiBzIGlzIGEgZGlyZWN0b3J5LCBpdCBpcyByZWN1cnNpdmVseQotCQlzY2FuZWQgZm9yIHRlc3QgZmlsZXMgKHdoaWNoIGVuZCBpbiAudCkuCi0JLXQgdAlVc2UgdCBhcyBkZWZhdWx0IHRpbWUgbGltaXQgZm9yIHRlc3RzIChkZWZhdWx0IGlzIHVubGltaXRlZCkKLQktUAlwcm9ncmFtICgtcCkgc3RyaW5nIGhhcyBtdWx0aXBsZSB3b3JkcywgYW5kIHRoZSBwcm9ncmFtIGlzIGluCi0JCXRoZSBwYXRoIChrbHVkZ2Ugb3B0aW9uKQotCS12CVZlcmJvc2UgbW9kZTogcHJpbnQgcmVhc29uIHRlc3QgZmFpbGVkLgotCS1lIGU9dglTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGUgdG8gdiBmb3IgYWxsIHRlc3RzCi0JCShpZiBubyA9diBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdXNlZCkKLQkJT25seSBvbmUgLWUgb3B0aW9uIGNhbiBiZSBnaXZlbiBhdCB0aGUgbW9tZW50LCBzYWRseS4KLQluYW1lCXNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgdGVzdChzKSB0byBydW47IGlmIG5vbmUgYXJlCi0JCXNwZWNpZmllZCwgYWxsIHRlc3RzIGFyZSBydW4uCi1FT0YKLQotIyBTZWUgY29tbWVudCBhYm92ZSBmb3IgZmxhZyBtZWFuaW5ncwotJXRlc3RfZmllbGRzID0gKAotCSduYW1lJywJCQkJJ3InLAotCSdkZXNjcmlwdGlvbicsCQkJJ20nLAotCSdhcmd1bWVudHMnLAkJCSdNJywKLQknc2NyaXB0JywJCQknbScsCi0JJ3N0ZGluJywJCQknbScsCi0JJ3Blcmwtc2V0dXAnLAkJCSdtJywKLQkncGVybC1jbGVhbnVwJywJCQknbScsCi0JJ2Vudi1zZXR1cCcsCQkJJ00nLAotCSdmaWxlLXNldHVwJywJCQknbXBzJywKLQknZmlsZS1yZXN1bHQnLAkJCSdtcHMnLAotCSd0aW1lLWxpbWl0JywJCQknJywKLQknZXhwZWN0ZWQtZmFpbCcsCQknJywKLQknZXhwZWN0ZWQtZXhpdCcsCQknJywKLQknZXhwZWN0ZWQtc3Rkb3V0JywJCSdtJywKLQknZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4nLAknbScsCi0JJ2V4cGVjdGVkLXN0ZGVycicsCQknbScsCi0JJ2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuJywJJ20nLAotCSdjYXRlZ29yeScsCQkJJ20nLAotCSk7Ci0jIEZpbGxlZCBpbiBieSByZWFkX3Rlc3QoKQotJWludGVybmFsX3Rlc3RfZmllbGRzID0gKAotCSc6ZnVsbC1uYW1lJywgMSwJCSMgZmlsZTpuYW1lCi0JJzpsb25nLW5hbWUnLCAxLAkJIyBkaXIvZmlsZTpsaW5lbm86bmFtZQotCSk7Ci0KLSMgQ2F0ZWdvcmllcyBvZiB0aGUgcHJvZ3JhbSB1bmRlciB0ZXN0LiBQcm92aWRlIHRoZSBjdXJyZW50Ci0jIG9zIGJ5IGRlZmF1bHQuCi0lY2F0ZWdvcmllcyA9ICgKLQkib3M6JG9zIiwgJzEnCi0JKTsKLQotJHRlbXBzID0gIi90bXAvcnRzJCQiOwotJHRlbXBpID0gIi90bXAvcnRpJCQiOwotJHRlbXBvID0gIi90bXAvcnRvJCQiOwotJHRlbXBlID0gIi90bXAvcnRlJCQiOwotJHRlbXBkaXIgPSAiL3RtcC9ydGQkJCI7Ci0KLSRuZmFpbGVkID0gMDsKLSRueGZhaWxlZCA9IDA7Ci0kbnBhc3NlZCA9IDA7Ci0kbnhwYXNzZWQgPSAwOwotCi0la25vd25fdGVzdHMgPSAoKTsKLQotaWYgKCFnZXRvcHRzKCdDOnA6UHM6dDp2ZTonKSkgewotICAgIHByaW50IFNUREVSUiAkVXNhZ2U7Ci0gICAgZXhpdCAxOwotfQotCi1kaWUgIiRwcm9nOiBubyBwcm9ncmFtIHNwZWNpZmllZCAodXNlIC1wKVxuIiBpZiAhZGVmaW5lZCAkb3B0X3A7Ci1kaWUgIiRwcm9nOiBubyB0ZXN0IHNldCBzcGVjaWZpZWQgKHVzZSAtcylcbiIgaWYgIWRlZmluZWQgJG9wdF9zOwotJHRlc3RfcHJvZyA9ICRvcHRfcDsKLSR2ZXJib3NlID0gZGVmaW5lZCAkb3B0X3YgJiYgJG9wdF92OwotJHRlc3Rfc2V0ID0gJG9wdF9zOwotaWYgKGRlZmluZWQgJG9wdF90KSB7Ci0gICAgZGllICIkcHJvZzogYmFkIC10IGFyZ3VtZW50IChzaG91bGQgYmUgbnVtYmVyID4gMCk6ICRvcHRfdFxuIgotCWlmICRvcHRfdCAhfiAvXlxkKyQvIHx8ICRvcHRfdCA8PSAwOwotICAgICRkZWZhdWx0X3RpbWVfbGltaXQgPSAkb3B0X3Q7Ci19Ci0kcHJvZ3JhbV9rbHVkZ2UgPSBkZWZpbmVkICRvcHRfUCA/ICRvcHRfUCA6IDA7Ci0KLWlmIChkZWZpbmVkICRvcHRfQykgewotICAgIGZvcmVhY2ggJGMgKHNwbGl0KCcsJywgJG9wdF9DKSkgewotCSRjID1+IHMvXHMrLy87Ci0JZGllICIkcHJvZzogY2F0ZWdvcmllcyBjYW4ndCBiZSBuZWdhdGVkIG9uIHRoZSBjb21tYW5kIGxpbmVcbiIKLQkgICAgaWYgKCRjID1+IC9eIS8pOwotCSRjYXRlZ29yaWVzeyRjfSA9IDE7Ci0gICAgfQotfQotCi0jIE5vdGUgd2hpY2ggdGVzdHMgYXJlIHRvIGJlIHJ1bi4KLSVkb190ZXN0ID0gKCk7Ci1ncmVwKCRkb190ZXN0eyRffSA9IDEsIEBBUkdWKTsKLSRhbGxfdGVzdHMgPSBAQVJHViA9PSAwOwotCi0jIFNldCB1cCBhIHZlcnkgbWluaW1hbCBlbnZpcm9ubWVudAotJW5ld19lbnYgPSAoKTsKLWZvcmVhY2ggJGVudiAoKCdIT01FJywgJ0xEX0xJQlJBUllfUEFUSCcsICdMT0NQQVRIJywgJ0xPR05BTUUnLAotICAnUEFUSCcsICdTSEVMTCcsICdVU0VSJykpIHsKLSAgICAkbmV3X2VudnskZW52fSA9ICRFTlZ7JGVudn0gaWYgZGVmaW5lZCAkRU5WeyRlbnZ9OwotfQotJG5ld19lbnZ7J0VOVid9ID0gJy9ub25leGlzdGFudCc7Ci1pZiAoKCRvcyBlcSAnVk1TJykgfHwgKCRDb25maWd7cGVybHBhdGh9ID1+IG0vJENvbmZpZ3tfZXhlfSQvaSkpIHsKLQkkbmV3X2VudnsnX19wZXJsbmFtZSd9ID0gJENvbmZpZ3twZXJscGF0aH07Ci19IGVsc2UgewotCSRuZXdfZW52eydfX3BlcmxuYW1lJ30gPSAkQ29uZmlne3BlcmxwYXRofSAuICRDb25maWd7X2V4ZX07Ci19Ci1pZiAoZGVmaW5lZCAkb3B0X2UpIHsKLSAgICAjIFhYWCBuZWVkIGEgd2F5IHRvIGFsbG93IG1hbnkgLWUgYXJndW1lbnRzLi4uCi0gICAgaWYgKCRvcHRfZSA9fiAvXihbYS16QS1aX11cdyopKHw9KC4qKSkkLykgewotCSRuZXdfZW52eyQxfSA9ICQyIGVxICcnID8gJEVOVnskMX0gOiAkMzsKLSAgICB9IGVsc2UgewotCWRpZSAiJDA6IGJhZCAtZSBhcmd1bWVudDogJG9wdF9lXG4iOwotICAgIH0KLX0KLSVvbGRfZW52ID0gJUVOVjsKLQotZGllICIkcHJvZzogY291bGRuJ3QgbWFrZSBkaXJlY3RvcnkgJHRlbXBkaXIgLSAkIVxuIiBpZiAhbWtkaXIoJHRlbXBkaXIsIDA3NzcpOwotCi1jaG9wKCRwd2QgPSBgcHdkIDI+L2Rldi9udWxsYCk7Ci1kaWUgIiRwcm9nOiBjb3VsZG4ndCBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuIiBpZiAkcHdkIGVxICcnOwotZGllICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHB3ZCAtICQhXG4iIGlmICFjaGRpcigkcHdkKTsKLQotaWYgKCEkcHJvZ3JhbV9rbHVkZ2UpIHsKLSAgICAkdGVzdF9wcm9nID0gIiRwd2QvJHRlc3RfcHJvZyIgaWYgc3Vic3RyKCR0ZXN0X3Byb2csIDAsIDEpIG5lICcvJzsKLSAgICBkaWUgIiRwcm9nOiAkdGVzdF9wcm9nIGlzIG5vdCBleGVjdXRhYmxlIC0gYnllXG4iCi0JaWYgKCEgLXggJHRlc3RfcHJvZyAmJiAkb3MgbmUgJ29zMicpOwotfQotCi1AdHJhcF9zaWdzID0gKCdURVJNJywgJ1FVSVQnLCAnSU5UJywgJ1BJUEUnLCAnSFVQJyk7Ci1AU0lHe0B0cmFwX3NpZ3N9ID0gKCdjbGVhbnVwX2V4aXQnKSB4IEB0cmFwX3NpZ3M7Ci0kY2hpbGRfa2lsbF9vayA9IDA7Ci0kU0lHeydBTFJNJ30gPSAnY2F0Y2hfc2lnYWxybSc7Ci0KLSR8ID0gMTsKLQotaWYgKC1kICR0ZXN0X3NldCkgewotICAgICRmaWxlX3ByZWZpeF9za2lwID0gbGVuZ3RoKCR0ZXN0X3NldCkgKyAxOwotICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2RpcigkdGVzdF9zZXQpOwotfSBlbHNlIHsKLSAgICAkZmlsZV9wcmVmaXhfc2tpcCA9IDA7Ci0gICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZmlsZSgkdGVzdF9zZXQpOwotfQotJmNsZWFudXBfZXhpdCgpIGlmICFkZWZpbmVkICRyZXQ7Ci0KLSR0b3RfZmFpbGVkID0gJG5mYWlsZWQgKyAkbnhmYWlsZWQ7Ci0kdG90X3Bhc3NlZCA9ICRucGFzc2VkICsgJG54cGFzc2VkOwotaWYgKCR0b3RfZmFpbGVkIHx8ICR0b3RfcGFzc2VkKSB7Ci0gICAgcHJpbnQgIlRvdGFsIGZhaWxlZDogJHRvdF9mYWlsZWQiOwotICAgIHByaW50ICIgKCRueGZhaWxlZCB1bmV4cGVjdGVkKSIgaWYgJG54ZmFpbGVkOwotICAgIHByaW50ICIgKGFzIGV4cGVjdGVkKSIgaWYgJG5mYWlsZWQgJiYgISRueGZhaWxlZDsKLSAgICBwcmludCAiXG5Ub3RhbCBwYXNzZWQ6ICR0b3RfcGFzc2VkIjsKLSAgICBwcmludCAiICgkbnhwYXNzZWQgdW5leHBlY3RlZCkiIGlmICRueHBhc3NlZDsKLSAgICBwcmludCAiXG4iOwotfQotCi0mY2xlYW51cF9leGl0KCdvaycpOwotCi1zdWIKLWNsZWFudXBfZXhpdAotewotICAgIGxvY2FsKCRzaWcsICRleGl0Y29kZSkgPSAoJycsIDEpOwotCi0gICAgaWYgKCRfWzBdIGVxICdvaycpIHsKLQkkZXhpdGNvZGUgPSAwOwotICAgIH0gZWxzaWYgKCRfWzBdIG5lICcnKSB7Ci0JJHNpZyA9ICRfWzBdOwotICAgIH0KLQotICAgIHVubGluaygkdGVtcGksICR0ZW1wbywgJHRlbXBlLCAkdGVtcHMpOwotICAgICZzY3J1Yl9kaXIoJHRlbXBkaXIpIGlmIGRlZmluZWQgJHRlbXBkaXI7Ci0gICAgcm1kaXIoJHRlbXBkaXIpIGlmIGRlZmluZWQgJHRlbXBkaXI7Ci0KLSAgICBpZiAoJHNpZykgewotCSRTSUd7JHNpZ30gPSAnREVGQVVMVCc7Ci0Ja2lsbCAkc2lnLCAkJDsKLQlyZXR1cm47Ci0gICAgfQotICAgIGV4aXQgJGV4aXRjb2RlOwotfQotCi1zdWIKLWNhdGNoX3NpZ2Fscm0KLXsKLSAgICAkU0lHeydBTFJNJ30gPSAnY2F0Y2hfc2lnYWxybSc7Ci0gICAga2lsbCg5LCAkY2hpbGRfcGlkKSBpZiAkY2hpbGRfa2lsbF9vazsKLSAgICAkY2hpbGRfa2lsbGVkID0gMTsKLX0KLQotc3ViCi1wcm9jZXNzX3Rlc3RfZGlyCi17Ci0gICAgbG9jYWwoJGRpcikgPSBAXzsKLSAgICBsb2NhbCgkcmV0LCAkZmlsZSk7Ci0gICAgbG9jYWwoQHRvZG8pID0gKCk7Ci0KLSAgICBpZiAoIW9wZW5kaXIoRElSLCAkZGlyKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gZGlyZWN0b3J5ICRkaXIgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotICAgIHdoaWxlIChkZWZpbmVkICgkZmlsZSA9IHJlYWRkaXIoRElSKSkpIHsKLQlwdXNoKEB0b2RvLCAkZmlsZSkgaWYgJGZpbGUgPX4gL15bXi5dLipcLnQkLzsKLSAgICB9Ci0gICAgY2xvc2VkaXIoRElSKTsKLQotICAgIGZvcmVhY2ggJGZpbGUgKEB0b2RvKSB7Ci0JJGZpbGUgPSAiJGRpci8kZmlsZSI7Ci0JaWYgKC1kICRmaWxlKSB7Ci0JICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2RpcigkZmlsZSk7Ci0JfSBlbHNpZiAoLWYgXykgewotCSAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9maWxlKCRmaWxlKTsKLQl9Ci0JbGFzdCBpZiAhZGVmaW5lZCAkcmV0OwotICAgIH0KLQotICAgIHJldHVybiAkcmV0OwotfQotCi1zdWIKLXByb2Nlc3NfdGVzdF9maWxlCi17Ci0gICAgbG9jYWwoJGZpbGUpID0gQF87Ci0gICAgbG9jYWwoJHJldCk7Ci0KLSAgICBpZiAoIW9wZW4oSU4sICRmaWxlKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gJGZpbGUgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotICAgIGJpbm1vZGUoSU4pOwotICAgIHdoaWxlICgxKSB7Ci0JJHJldCA9ICZyZWFkX3Rlc3QoJGZpbGUsIElOLCAqdGVzdCk7Ci0JbGFzdCBpZiAhZGVmaW5lZCAkcmV0IHx8ICEkcmV0OwotCW5leHQgaWYgISRhbGxfdGVzdHMgJiYgISRkb190ZXN0eyR0ZXN0eyduYW1lJ319OwotCW5leHQgaWYgISZjYXRlZ29yeV9jaGVjaygqdGVzdCk7Ci0JJHJldCA9ICZydW5fdGVzdCgqdGVzdCk7Ci0JbGFzdCBpZiAhZGVmaW5lZCAkcmV0OwotICAgIH0KLSAgICBjbG9zZShJTik7Ci0KLSAgICByZXR1cm4gJHJldDsKLX0KLQotc3ViCi1ydW5fdGVzdAotewotICAgIGxvY2FsKCp0ZXN0KSA9IEBfOwotICAgIGxvY2FsKCRuYW1lKSA9ICR0ZXN0eyc6ZnVsbC1uYW1lJ307Ci0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnc3RkaW4nfSkgewotCXJldHVybiB1bmRlZiBpZiAhJndyaXRlX2ZpbGUoJHRlbXBpLCAkdGVzdHsnc3RkaW4nfSk7Ci0JJGlmaWxlID0gJHRlbXBpOwotICAgIH0gZWxzZSB7Ci0JJGlmaWxlID0gJy9kZXYvbnVsbCc7Ci0gICAgfQotCi0gICAgaWYgKGRlZmluZWQgJHRlc3R7J3NjcmlwdCd9KSB7Ci0JcmV0dXJuIHVuZGVmIGlmICEmd3JpdGVfZmlsZSgkdGVtcHMsICR0ZXN0eydzY3JpcHQnfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHVuZGVmIGlmICEmc2NydWJfZGlyKCR0ZW1wZGlyKTsKLQotICAgIGlmICghY2hkaXIoJHRlbXBkaXIpKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHRlbXBkaXIgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotCi0gICAgaWYgKGRlZmluZWQgJHRlc3R7J2ZpbGUtc2V0dXAnfSkgewotCWxvY2FsKCRpKTsKLQlsb2NhbCgkdHlwZSwgJHBlcm0sICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOwotCi0JZm9yICgkaSA9IDA7ICRpIDwgJHRlc3R7J2ZpbGUtc2V0dXAnfTsgJGkrKykgewotCSAgICAkdmFsID0gJHRlc3R7ImZpbGUtc2V0dXA6JGkifTsKLQotCSAgICAjIGZvcm1hdCBpczogdHlwZSBwZXJtICJuYW1lIgotCSAgICAoJHR5cGUsICRwZXJtLCAkcmVzdCkgPQotCQlzcGxpdCgnICcsICR2YWwsIDMpOwotCSAgICAkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7Ci0JICAgICRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMTsKLQkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOwotCSAgICAkcmVzdCA9IHN1YnN0cigkcmVzdCwgMiArICRsZW4pOwotCSAgICAkcGVybSA9IG9jdCgkcGVybSkgaWYgJHBlcm0gPX4gL15cZCskLzsKLQkgICAgaWYgKCR0eXBlIGVxICdmaWxlJykgewotCQlyZXR1cm4gdW5kZWYgaWYgISZ3cml0ZV9maWxlKCRuYW1lLCAkcmVzdCk7Ci0JCWlmICghY2htb2QoJHBlcm0sICRuYW1lKSkgewotCQkgICAgcHJpbnQgU1RERVJSCi0JCSAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IGNobW9kICRwZXJtICRuYW1lIC0gJCFcbiI7Ci0JCSAgICByZXR1cm4gdW5kZWY7Ci0JCX0KLQkgICAgfSBlbHNpZiAoJHR5cGUgZXEgJ2RpcicpIHsKLQkJaWYgKCFta2RpcigkbmFtZSwgJHBlcm0pKSB7Ci0JCSAgICBwcmludCBTVERFUlIKLQkJICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgbWtkaXIgJHBlcm0gJG5hbWUgLSAkIVxuIjsKLQkJICAgIHJldHVybiB1bmRlZjsKLQkJfQotCSAgICB9IGVsc2lmICgkdHlwZSBlcSAnc3ltbGluaycpIHsKLQkJbG9jYWwoJG91bWFzaykgPSB1bWFzaygkcGVybSk7Ci0JCWxvY2FsKCRyZXQpID0gc3ltbGluaygkcmVzdCwgJG5hbWUpOwotCQl1bWFzaygkb3VtYXNrKTsKLQkJaWYgKCEkcmV0KSB7Ci0JCSAgICBwcmludCBTVERFUlIKLQkgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNvdWxkbid0IGNyZWF0ZSBzeW1saW5rICRuYW1lIC0gJCFcbiI7Ci0JCSAgICByZXR1cm4gdW5kZWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsncGVybC1zZXR1cCd9KSB7Ci0JZXZhbCAkdGVzdHsncGVybC1zZXR1cCd9OwotCWlmICgkQCBuZSAnJykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGVycm9yIHJ1bm5pbmcgcGVybC1zZXR1cCAtICRAXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotICAgIH0KLQotICAgICRwaWQgPSBmb3JrOwotICAgIGlmICghZGVmaW5lZCAkcGlkKSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3QgZm9yayAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgaWYgKCEkcGlkKSB7Ci0JQFNJR3tAdHJhcF9zaWdzfSA9ICgnREVGQVVMVCcpIHggQHRyYXBfc2lnczsKLQkkU0lHeydBTFJNJ30gPSAnREVGQVVMVCc7Ci0JaWYgKGRlZmluZWQgJHRlc3R7J2Vudi1zZXR1cCd9KSB7Ci0JICAgIGxvY2FsKCR2YXIsICR2YWwsICRpKTsKLQotCSAgICBmb3JlYWNoICR2YXIgKHNwbGl0KHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIDAsIDEpLAotCQkkdGVzdHsnZW52LXNldHVwJ30pKQotCSAgICB7Ci0JCSRpID0gaW5kZXgoJHZhciwgJz0nKTsKLQkJbmV4dCBpZiAkaSA9PSAwIHx8ICR2YXIgZXEgJyc7Ci0JCWlmICgkaSA8IDApIHsKLQkJICAgIGRlbGV0ZSAkbmV3X2VudnskdmFyfTsKLQkJfSBlbHNlIHsKLQkJICAgICRuZXdfZW52e3N1YnN0cigkdmFyLCAwLCAkaSl9ID0gc3Vic3RyKCR2YXIsICRpICsgMSk7Ci0JCX0KLQkgICAgfQotCX0KLQlpZiAoIW9wZW4oU1RESU4sICI8ICRpZmlsZSIpKSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gJGlmaWxlIGluIGNoaWxkIC0gJCFcbiI7Ci0JCWtpbGwoJ1RFUk0nLCAkJCk7Ci0JfQotCWJpbm1vZGUoU1RESU4pOwotCWlmICghb3BlbihTVERPVVQsICI+ICR0ZW1wbyIpKSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gJHRlbXBvIGluIGNoaWxkIC0gJCFcbiI7Ci0JCWtpbGwoJ1RFUk0nLCAkJCk7Ci0JfQotCWJpbm1vZGUoU1RET1VUKTsKLQlpZiAoIW9wZW4oU1RERVJSLCAiPiAkdGVtcGUiKSkgewotCQlwcmludCBTVERPVVQgIiRwcm9nOiBjb3VsZG4ndCBvcGVuICR0ZW1wZSBpbiBjaGlsZCAtICQhXG4iOwotCQlraWxsKCdURVJNJywgJCQpOwotCX0KLQliaW5tb2RlKFNUREVSUik7Ci0JaWYgKCRwcm9ncmFtX2tsdWRnZSkgewotCSAgICBAYXJndiA9IHNwbGl0KCcgJywgJHRlc3RfcHJvZyk7Ci0JfSBlbHNlIHsKLQkgICAgQGFyZ3YgPSAoJHRlc3RfcHJvZyk7Ci0JfQotCWlmIChkZWZpbmVkICR0ZXN0eydhcmd1bWVudHMnfSkgewotCQlwdXNoKEBhcmd2LAotCQkgICAgIHNwbGl0KHN1YnN0cigkdGVzdHsnYXJndW1lbnRzJ30sIDAsIDEpLAotCQkJICAgc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMSkpKTsKLQl9Ci0JcHVzaChAYXJndiwgJHRlbXBzKSBpZiBkZWZpbmVkICR0ZXN0eydzY3JpcHQnfTsKLQotCSNYWFggcmVhbHBhdGhpc2UsIHVzZSB3aGljaC93aGVuY2UgLXAsIG9yIHN0aC4gbGlrZSB0aGF0Ci0JI1hYWCBpZiAhJHByb2dyYW1fa2x1ZGdlLCB3ZSBnZXQgYnkgd2l0aCBub3QgZG9pbmcgaXQgZm9yIG5vdyB0aG8KLQkkbmV3X2VudnsnX19wcm9nbmFtZSd9ID0gJGFyZ3ZbMF07Ci0KLQkjIFRoZSBmb2xsb3dpbmcgZG9lc24ndCB3b3JrIHdpdGggcGVybDUuLi4gIE5lZWQgdG8gZG8gaXQgZXhwbGljaXRseSAtIHl1Y2suCi0JIyVFTlYgPSAlbmV3X2VudjsKLQlmb3JlYWNoICRrIChrZXlzKCVFTlYpKSB7Ci0JICAgIGRlbGV0ZSAkRU5WeyRrfTsKLQl9Ci0JJEVOVnska30gPSAkdiB3aGlsZSAoJGssJHYpID0gZWFjaCAlbmV3X2VudjsKLQotCWV4ZWMgeyAkYXJndlswXSB9IEBhcmd2OwotCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IGV4ZWN1dGUgJHRlc3RfcHJvZyAtICQhXG4iOwotCWtpbGwoJ1RFUk0nLCAkJCk7Ci0JZXhpdCg5NSk7Ci0gICAgfQotICAgICRjaGlsZF9waWQgPSAkcGlkOwotICAgICRjaGlsZF9raWxsZWQgPSAwOwotICAgICRjaGlsZF9raWxsX29rID0gMTsKLSAgICBhbGFybSgkdGVzdHsndGltZS1saW1pdCd9KSBpZiBkZWZpbmVkICR0ZXN0eyd0aW1lLWxpbWl0J307Ci0gICAgd2hpbGUgKDEpIHsKLQkkeHBpZCA9IHdhaXRwaWQoJHBpZCwgMCk7Ci0JJGNoaWxkX2tpbGxfb2sgPSAwOwotCWlmICgkeHBpZCA8IDApIHsKLQkgICAgbmV4dCBpZiAkISA9PSBFSU5UUjsKLQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzogZXJyb3Igd2FpdGluZyBmb3IgY2hpbGQgLSAkIVxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQlsYXN0OwotICAgIH0KLSAgICAkc3RhdHVzID0gJD87Ci0gICAgYWxhcm0oMCkgaWYgZGVmaW5lZCAkdGVzdHsndGltZS1saW1pdCd9OwotCi0gICAgJGZhaWxlZCA9IDA7Ci0gICAgJHdoeSA9ICcnOwotCi0gICAgaWYgKCRjaGlsZF9raWxsZWQpIHsKLQkkZmFpbGVkID0gMTsKLQkkd2h5IC49ICJcdHRlc3QgdGltZWQgb3V0IChsaW1pdCBvZiAkdGVzdHsndGltZS1saW1pdCd9IHNlY29uZHMpXG4iOwotICAgIH0KLQotICAgICRyZXQgPSAmZXZhbF9leGl0KCR0ZXN0eydsb25nLW5hbWUnfSwgJHN0YXR1cywgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfSk7Ci0gICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICRyZXQ7Ci0gICAgaWYgKCEkcmV0KSB7Ci0JbG9jYWwoJGV4cGwpOwotCi0JJGZhaWxlZCA9IDE7Ci0JaWYgKCgkc3RhdHVzICYgMHhmZikgPT0gMHg3ZikgewotCSAgICAkZXhwbCA9ICJzdG9wcGVkIjsKLQl9IGVsc2lmICgoJHN0YXR1cyAmIDB4ZmYpKSB7Ci0JICAgICRleHBsID0gInNpZ25hbCAiIC4gKCRzdGF0dXMgJiAweDdmKTsKLQl9IGVsc2UgewotCSAgICAkZXhwbCA9ICJleGl0LWNvZGUgIiAuICgoJHN0YXR1cyA+PiA4KSAmIDB4ZmYpOwotCX0KLQkkd2h5IC49Ci0JIlx0dW5leHBlY3RlZCBleGl0IHN0YXR1cyAkc3RhdHVzICgkZXhwbCksIGV4cGVjdGVkICR0ZXN0eydleHBlY3RlZC1leGl0J31cbiI7Ci0gICAgfQotCi0gICAgJHRtcCA9ICZjaGVja19vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkdGVtcG8sICdzdGRvdXQnLAotCQkkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0J30sICR0ZXN0eydleHBlY3RlZC1zdGRvdXQtcGF0dGVybid9KTsKLSAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHRtcDsKLSAgICBpZiAoJHRtcCBuZSAnJykgewotCSRmYWlsZWQgPSAxOwotCSR3aHkgLj0gJHRtcDsKLSAgICB9Ci0KLSAgICAkdG1wID0gJmNoZWNrX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sICR0ZW1wZSwgJ3N0ZGVycicsCi0JCSR0ZXN0eydleHBlY3RlZC1zdGRlcnInfSwgJHRlc3R7J2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuJ30pOwotICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOwotICAgIGlmICgkdG1wIG5lICcnKSB7Ci0JJGZhaWxlZCA9IDE7Ci0JJHdoeSAuPSAkdG1wOwotICAgIH0KLQotICAgICR0bXAgPSAmY2hlY2tfZmlsZV9yZXN1bHQoKnRlc3QpOwotICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOwotICAgIGlmICgkdG1wIG5lICcnKSB7Ci0JJGZhaWxlZCA9IDE7Ci0JJHdoeSAuPSAkdG1wOwotICAgIH0KLQotICAgIGlmIChkZWZpbmVkICR0ZXN0eydwZXJsLWNsZWFudXAnfSkgewotCWV2YWwgJHRlc3R7J3BlcmwtY2xlYW51cCd9OwotCWlmICgkQCBuZSAnJykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGVycm9yIHJ1bm5pbmcgcGVybC1jbGVhbnVwIC0gJEBcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfQotCi0gICAgaWYgKCFjaGRpcigkcHdkKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IGNkIHRvICRwd2QgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotCi0gICAgaWYgKCRmYWlsZWQpIHsKLQlpZiAoISR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKLQkgICAgcHJpbnQgIkZBSUwgJG5hbWVcbiI7Ci0JICAgICRueGZhaWxlZCsrOwotCX0gZWxzZSB7Ci0JICAgIHByaW50ICJmYWlsICRuYW1lIChhcyBleHBlY3RlZClcbiI7Ci0JICAgICRuZmFpbGVkKys7Ci0JfQotCSR3aHkgPSAiXHREZXNjcmlwdGlvbiIKLQkJLiAmd3JhcF9saW5lcygkdGVzdHsnZGVzY3JpcHRpb24nfSwgIiAobWlzc2luZylcbiIpCi0JCS4gJHdoeTsKLSAgICB9IGVsc2lmICgkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9KSB7Ci0JcHJpbnQgIlBBU1MgJG5hbWUgKHVuZXhwZWN0ZWRseSlcbiI7Ci0JJG54cGFzc2VkKys7Ci0gICAgfSBlbHNlIHsKLQlwcmludCAicGFzcyAkbmFtZVxuIjsKLQkkbnBhc3NlZCsrOwotICAgIH0KLSAgICBwcmludCAkd2h5IGlmICR2ZXJib3NlOwotICAgIHJldHVybiAwOwotfQotCi1zdWIKLWNhdGVnb3J5X2NoZWNrCi17Ci0gICAgbG9jYWwoKnRlc3QpID0gQF87Ci0gICAgbG9jYWwoJGMpOwotCi0gICAgcmV0dXJuIDEgaWYgKCFkZWZpbmVkICR0ZXN0eydjYXRlZ29yeSd9KTsKLSAgICBsb2NhbCgkb2spID0gMDsKLSAgICBmb3JlYWNoICRjIChzcGxpdCgnLCcsICR0ZXN0eydjYXRlZ29yeSd9KSkgewotCSRjID1+IHMvXHMrLy87Ci0JaWYgKCRjID1+IC9eIS8pIHsKLQkgICAgJGMgPSAkJzsKLQkgICAgcmV0dXJuIDAgaWYgKGRlZmluZWQgJGNhdGVnb3JpZXN7JGN9KTsKLQkgICAgJG9rID0gMTsKLQl9IGVsc2UgewotCSAgICAkb2sgPSAxIGlmIChkZWZpbmVkICRjYXRlZ29yaWVzeyRjfSk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gJG9rOwotfQotCi1zdWIKLXNjcnViX2RpcgotewotICAgIGxvY2FsKCRkaXIpID0gQF87Ci0gICAgbG9jYWwoQHRvZG8pID0gKCk7Ci0gICAgbG9jYWwoJGZpbGUpOwotCi0gICAgaWYgKCFvcGVuZGlyKERJUiwgJGRpcikpIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBvcGVuIGRpcmVjdG9yeSAkZGlyIC0gJCFcbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICB3aGlsZSAoZGVmaW5lZCAoJGZpbGUgPSByZWFkZGlyKERJUikpKSB7Ci0JcHVzaChAdG9kbywgJGZpbGUpIGlmICRmaWxlIG5lICcuJyAmJiAkZmlsZSBuZSAnLi4nOwotICAgIH0KLSAgICBjbG9zZWRpcihESVIpOwotICAgIGZvcmVhY2ggJGZpbGUgKEB0b2RvKSB7Ci0JJGZpbGUgPSAiJGRpci8kZmlsZSI7Ci0JaWYgKC1kICRmaWxlKSB7Ci0JICAgIHJldHVybiB1bmRlZiBpZiAhJnNjcnViX2RpcigkZmlsZSk7Ci0JICAgIGlmICghcm1kaXIoJGZpbGUpKSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IHJtZGlyICRmaWxlIC0gJCFcbiI7Ci0JCXJldHVybiB1bmRlZjsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIGlmICghdW5saW5rKCRmaWxlKSkgewotCQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCB1bmxpbmsgJGZpbGUgLSAkIVxuIjsKLQkJcmV0dXJuIHVuZGVmOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3ViCi13cml0ZV9maWxlCi17Ci0gICAgbG9jYWwoJGZpbGUsICRzdHIpID0gQF87Ci0KLSAgICBpZiAoIW9wZW4oVEVNUCwgIj4gJGZpbGUiKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IG9wZW4gJGZpbGUgLSAkIVxuIjsKLQlyZXR1cm4gdW5kZWY7Ci0gICAgfQotICAgIGJpbm1vZGUoVEVNUCk7Ci0gICAgcHJpbnQgVEVNUCAkc3RyOwotICAgIGlmICghY2xvc2UoVEVNUCkpIHsKLQlwcmludCBTVERFUlIgIiRwcm9nOiBlcnJvciB3cml0aW5nICRmaWxlIC0gJCFcbiI7Ci0JcmV0dXJuIHVuZGVmOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3ViCi1jaGVja19vdXRwdXQKLXsKLSAgICBsb2NhbCgkbmFtZSwgJGZpbGUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCkgPSBAXzsKLSAgICBsb2NhbCgkZ290KSA9ICcnOwotICAgIGxvY2FsKCR3aHkpID0gJyc7Ci0gICAgbG9jYWwoJHJldCk7Ci0KLSAgICBpZiAoIW9wZW4oVEVNUCwgIjwgJGZpbGUiKSkgewotCXByaW50IFNUREVSUiAiJHByb2c6JG5hbWUoJHdoYXQpOiBjb3VsZG4ndCBvcGVuICRmaWxlIGFmdGVyIHJ1bm5pbmcgcHJvZ3JhbSAtICQhXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgYmlubW9kZShURU1QKTsKLSAgICB3aGlsZSAoPFRFTVA+KSB7Ci0JJGdvdCAuPSAkXzsKLSAgICB9Ci0gICAgY2xvc2UoVEVNUCk7Ci0gICAgcmV0dXJuIGNvbXBhcmVfb3V0cHV0KCRuYW1lLCAkd2hhdCwgJGV4cGVjdCwgJGV4cGVjdF9wYXQsICRnb3QpOwotfQotCi1zdWIKLWNvbXBhcmVfb3V0cHV0Ci17Ci0gICAgbG9jYWwoJG5hbWUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCwgJGdvdCkgPSBAXzsKLSAgICBsb2NhbCgkd2h5KSA9ICcnOwotCi0gICAgaWYgKGRlZmluZWQgJGV4cGVjdF9wYXQpIHsKLQkkXyA9ICRnb3Q7Ci0JJHJldCA9IGV2YWwgIiRleHBlY3RfcGF0IjsKLQlpZiAoJEAgbmUgJycpIHsKLQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokbmFtZSgkd2hhdCk6IGVycm9yIGV2YWx1YXRpbmcgJHdoYXQgcGF0dGVybjogJGV4cGVjdF9wYXQgLSAkQFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQlpZiAoISRyZXQpIHsKLQkgICAgJHdoeSA9ICJcdHVuZXhwZWN0ZWQgJHdoYXQgLSB3YW50ZWQgcGF0dGVybiI7Ci0JICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGV4cGVjdF9wYXQpOwotCSAgICAkd2h5IC49ICJcdGdvdCI7Ci0JICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGdvdCk7Ci0JfQotICAgIH0gZWxzZSB7Ci0JJGV4cGVjdCA9ICcnIGlmICFkZWZpbmVkICRleHBlY3Q7Ci0JaWYgKCRnb3QgbmUgJGV4cGVjdCkgewotCSAgICAkd2h5IC49ICJcdHVuZXhwZWN0ZWQgJHdoYXQgLSAiIC4gJmZpcnN0X2RpZmYoJGV4cGVjdCwgJGdvdCkgLiAiXG4iOwotCSAgICAkd2h5IC49ICJcdHdhbnRlZCI7Ci0JICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGV4cGVjdCk7Ci0JICAgICR3aHkgLj0gIlx0Z290IjsKLQkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZ290KTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAkd2h5OwotfQotCi1zdWIKLXdyYXBfbGluZXMKLXsKLSAgICBsb2NhbCgkc3RyLCAkZW1wdHkpID0gQF87Ci0gICAgbG9jYWwoJG5vbmwpID0gc3Vic3RyKCRzdHIsIC0xLCAxKSBuZSAiXG4iOwotCi0gICAgcmV0dXJuIChkZWZpbmVkICRlbXB0eSA/ICRlbXB0eSA6ICIgbm90aGluZ1xuIikgaWYgJHN0ciBlcSAnJzsKLSAgICBzdWJzdHIoJHN0ciwgMCwgMCkgPSAiOlxuIjsKLSAgICAkc3RyID1+IHMvXG4vXG5cdFx0L2c7Ci0gICAgaWYgKCRub25sKSB7Ci0JJHN0ciAuPSAiXG5cdFtpbmNvbXBsZXRlIGxhc3QgbGluZV1cbiI7Ci0gICAgfSBlbHNlIHsKLQljaG9wKCRzdHIpOwotCWNob3AoJHN0cik7Ci0gICAgfQotICAgIHJldHVybiAkc3RyOwotfQotCi1zdWIKLWZpcnN0X2RpZmYKLXsKLSAgICBsb2NhbCgkZXhwLCAkZ290KSA9IEBfOwotICAgIGxvY2FsKCRsaW5lbm8sICRjaGFyKSA9ICgxLCAxKTsKLSAgICBsb2NhbCgkaSwgJGV4cF9sZW4sICRnb3RfbGVuKTsKLSAgICBsb2NhbCgkY2UsICRjZyk7Ci0KLSAgICAkZXhwX2xlbiA9IGxlbmd0aCgkZXhwKTsKLSAgICAkZ290X2xlbiA9IGxlbmd0aCgkZ290KTsKLSAgICBpZiAoJGV4cF9sZW4gIT0gJGdvdF9sZW4pIHsKLQlpZiAoJGV4cF9sZW4gPCAkZ290X2xlbikgewotCSAgICBpZiAoc3Vic3RyKCRnb3QsIDAsICRleHBfbGVuKSBlcSAkZXhwKSB7Ci0JCXJldHVybiAiZ290IHRvbyBtdWNoIG91dHB1dCI7Ci0JICAgIH0KLQl9IGVsc2lmIChzdWJzdHIoJGV4cCwgMCwgJGdvdF9sZW4pIGVxICRnb3QpIHsKLQkgICAgcmV0dXJuICJnb3QgdG9vIGxpdHRsZSBvdXRwdXQiOwotCX0KLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJGV4cF9sZW47ICRpKyspIHsKLQkkY2UgPSBzdWJzdHIoJGV4cCwgJGksIDEpOwotCSRjZyA9IHN1YnN0cigkZ290LCAkaSwgMSk7Ci0JbGFzdCBpZiAkY2UgbmUgJGNnOwotCSRjaGFyKys7Ci0JaWYgKCRjZSBlcSAiXG4iKSB7Ci0JICAgICRsaW5lbm8rKzsKLQkgICAgJGNoYXIgPSAxOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuICJmaXJzdCBkaWZmZXJlbmNlOiBsaW5lICRsaW5lbm8sIGNoYXIgJGNoYXIgKHdhbnRlZCAnIgotCS4gJmZvcm1hdF9jaGFyKCRjZSkgLiAiJywgZ290ICciCi0JLiAmZm9ybWF0X2NoYXIoJGNnKSAuICInIjsKLX0KLQotc3ViCi1mb3JtYXRfY2hhcgotewotICAgIGxvY2FsKCRjaCwgJHMpOwotCi0gICAgJGNoID0gb3JkKCRfWzBdKTsKLSAgICBpZiAoJGNoID09IDEwKSB7Ci0JcmV0dXJuICdcbic7Ci0gICAgfSBlbHNpZiAoJGNoID09IDEzKSB7Ci0JcmV0dXJuICdccic7Ci0gICAgfSBlbHNpZiAoJGNoID09IDgpIHsKLQlyZXR1cm4gJ1xiJzsKLSAgICB9IGVsc2lmICgkY2ggPT0gOSkgewotCXJldHVybiAnXHQnOwotICAgIH0gZWxzaWYgKCRjaCA+IDEyNykgewotCSRjaCAtPSAxMjc7Ci0JJHMgPSAiTS0iOwotICAgIH0gZWxzZSB7Ci0JJHMgPSAnJzsKLSAgICB9Ci0gICAgaWYgKCRjaCA8IDMyKSB7Ci0JJHMgLj0gJ14nOwotCSRjaCArPSBvcmQoJ0AnKTsKLSAgICB9IGVsc2lmICgkY2ggPT0gMTI3KSB7Ci0JcmV0dXJuICRzIC4gIl4/IjsKLSAgICB9Ci0gICAgcmV0dXJuICRzIC4gc3ByaW50ZigiJWMiLCAkY2gpOwotfQotCi1zdWIKLWV2YWxfZXhpdAotewotICAgIGxvY2FsKCRuYW1lLCAkc3RhdHVzLCAkZXhwZWN0KSA9IEBfOwotICAgIGxvY2FsKCRleHByKTsKLSAgICBsb2NhbCgkdywgJGUsICRzKSA9ICgkc3RhdHVzLCAoJHN0YXR1cyA+PiA4KSAmIDB4ZmYsICRzdGF0dXMgJiAweDdmKTsKLQotICAgICRlID0gLTEwMDAgaWYgJHN0YXR1cyAmIDB4ZmY7Ci0gICAgJHMgPSAtMTAwMCBpZiAkcyA9PSAweDdmOwotICAgIGlmICghZGVmaW5lZCAkZXhwZWN0KSB7Ci0JJGV4cHIgPSAnJHcgPT0gMCc7Ci0gICAgfSBlbHNpZiAoJGV4cGVjdCA9fiAvXih8LSlcZCskLykgewotCSRleHByID0gIlwkZSA9PSAkZXhwZWN0IjsKLSAgICB9IGVsc2UgewotCSRleHByID0gJGV4cGVjdDsKLQkkZXhwciA9fiBzL1xiKFt3c2VdKVxiL1wkJDEvZzsKLQkkZXhwciA9fiBzL1xiKFNJR1tBLVowLTldKylcYi8mJDEvZzsKLSAgICB9Ci0gICAgJHcgPSBldmFsICRleHByOwotICAgIGlmICgkQCBuZSAnJykgewotCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIGV4cGVjdGVkLWV4aXQgZXhwcmVzc2lvbjogJGV4cGVjdCAoJEApXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgcmV0dXJuICR3OwotfQotCi1zdWIKLXJlYWRfdGVzdAotewotICAgIGxvY2FsKCRmaWxlLCAkaW4sICp0ZXN0KSA9IEBfOwotICAgIGxvY2FsKCRmaWVsZCwgJHZhbCwgJGZsYWdzLCAkZG9fY2hvcCwgJG5lZWRfcmVkbywgJHN0YXJ0X2xpbmVubyk7Ci0gICAgbG9jYWwoJWNudCwgJHNmaWVsZCk7Ci0KLSAgICAldGVzdCA9ICgpOwotICAgICVjbnQgPSAoKTsKLSAgICB3aGlsZSAoPCRpbj4pIHsKLQluZXh0IGlmIC9eXHMqJC87Ci0JbmV4dCBpZiAvXiAqIy87Ci0JbGFzdCBpZiAvXlxzKi0tLVxzKiQvOwotCSRzdGFydF9saW5lbm8gPSAkLiBpZiAhZGVmaW5lZCAkc3RhcnRfbGluZW5vOwotCWlmICghL14oWy1cd10rKTpccyoofFxTfFxTLipcUylccyokLykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRmaWxlOiQuOiB1bnJlY29nbmlzZWQgbGluZVxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQkoJGZpZWxkLCAkdmFsKSA9ICgkMSwgJDIpOwotCSRzZmllbGQgPSAkZmllbGQ7Ci0JJGZsYWdzID0gJHRlc3RfZmllbGRzeyRmaWVsZH07Ci0JaWYgKCFkZWZpbmVkICRmbGFncykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRmaWxlOiQuOiB1bnJlY29nbmlzZWQgZmllbGQgXCIkZmllbGRcIlxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQlpZiAoJGZsYWdzID1+IC9zLykgewotCSAgICBsb2NhbCgkY250KSA9ICRjbnR7JGZpZWxkfSsrOwotCSAgICAkdGVzdHskZmllbGR9ID0gJGNudHskZmllbGR9OwotCSAgICAkY250ID0gMCBpZiAkY250IGVxICcnOwotCSAgICAkc2ZpZWxkIC49ICI6JGNudCI7Ci0JfSBlbHNpZiAoZGVmaW5lZCAkdGVzdHskZmllbGR9KSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IG11bHRpcGxlIFwiJGZpZWxkXCIgZmllbGRzXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotCSRkb19jaG9wID0gJGZsYWdzICF+IC9tLzsKLQkkbmVlZF9yZWRvID0gMDsKLQlpZiAoJHZhbCBlcSAnJyB8fCAkdmFsIGVxICchJyB8fCAkZmxhZ3MgPX4gL3AvKSB7Ci0JICAgIGlmICgkZmxhZ3MgPX4gL1tNbV0vKSB7Ci0JCWlmICgkZmxhZ3MgPX4gL3AvKSB7Ci0JCSAgICBpZiAoJHZhbCA9fiAvXiEvKSB7Ci0JCQkkZG9fY2hvcCA9IDE7Ci0JCQkkdmFsID0gJCc7Ci0JCSAgICB9IGVsc2UgewotCQkJJGRvX2Nob3AgPSAwOwotCQkgICAgfQotCQkgICAgaWYgKCR2YWwgZXEgJycpIHsKLQkJCXByaW50IFNUREVSUgotCQkiJHByb2c6JGZpbGU6JC46IG5vIHBhcmFtZXRlcnMgZ2l2ZW4gZm9yIGZpZWxkIFwiJGZpZWxkXCJcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoJHZhbCBlcSAnIScpIHsKLQkJCSRkb19jaG9wID0gMTsKLQkJICAgIH0KLQkJICAgICR2YWwgPSAnJzsKLQkJfQotCQl3aGlsZSAoPCRpbj4pIHsKLQkJICAgIGxhc3QgaWYgIS9eXHQvOwotCQkgICAgJHZhbCAuPSAkJzsKLQkJfQotCQljaG9wICR2YWwgaWYgJGRvX2Nob3A7Ci0JCSRkb19jaG9wID0gMTsKLQkJJG5lZWRfcmVkbyA9IDE7Ci0KLQkJIyBTeW50YXggY2hlY2sgb24gZmllbGRzIHRoYXQgY2FuIHNldmVyYWwgaW5zdGFuY2VzCi0JCSMgKGNhbiBnaXZlIHVzZWZ1bCBsaW5lIG51bWJlcnMgdGhpcyB3YXkpCi0KLQkJaWYgKCRmaWVsZCBlcSAnZmlsZS1zZXR1cCcpIHsKLQkJICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7Ci0KLQkJICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCi0JCSAgICBpZiAoJHZhbCAhfiAvXlsgXHRdKihcUyspWyBcdF0rKFxTKylbIFx0XSsoW14gXHRdLiopLykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwYXJhbWV0ZXIgbGluZSBmb3IgZmlsZS1zZXR1cCBmaWVsZFxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgICgkdHlwZSwgJHBlcm0sICRyZXN0KSA9ICgkMSwgJDIsICQzKTsKLQkJICAgIGlmICgkdHlwZSAhfiAvXihmaWxlfGRpcnxzeW1saW5rKSQvKSB7Ci0JCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIGZpbGUgdHlwZSBmb3IgZmlsZS1zZXR1cDogJHR5cGVcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICBpZiAoJHBlcm0gIX4gL15cZCskLykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwZXJtaXNzaW9ucyBmb3IgZmlsZS1zZXR1cDogJHR5cGVcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICAkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7Ci0JCSAgICBpZiAoKCRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMSkgPD0gMCkgewotCQkJcHJpbnQgU1RERVJSCi0gICAgIiRwcm9nOiRmaWxlOiQuOiBtaXNzaW5nIGVuZCBxdW90ZSBmb3IgZmlsZSBuYW1lIGluIGZpbGUtc2V0dXA6ICRyZXN0XG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOwotCQkgICAgaWYgKCRuYW1lID1+IC9eXC8vIHx8ICRuYW1lID1+IC8oXnxcLylcLlwuKFwvfCQpLykgewotCQkJIyBOb3RlOiB0aGlzIGlzIG5vdCBhIHNlY3VyaXR5IHRoaW5nIC0ganVzdCBhIHNhbml0eQotCQkJIyBjaGVjayAtIGEgdGVzdCBjYW4gc3RpbGwgdXNlIHN5bWxpbmtzIHRvIGdldCBhdCBmaWxlcwotCQkJIyBvdXRzaWRlIHRoZSB0ZXN0IGRpcmVjdG9yeS4KLQkJCXByaW50IFNUREVSUgotIiRwcm9nOiRmaWxlOiQuOiBmaWxlIG5hbWUgaW4gZmlsZS1zZXR1cCBpcyBhYnNvbHV0ZSBvciBjb250YWlucyAuLjogJG5hbWVcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCX0KLQkJaWYgKCRmaWVsZCBlcSAnZmlsZS1yZXN1bHQnKSB7Ci0JCSAgICBsb2NhbCgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRtYXRjaFR5cGUsCi0JCQkgICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOwotCi0JCSAgICAjIGZvcm1hdCBpczogdHlwZSBwZXJtIHVpZCBnaWQgbWF0Y2hUeXBlICJuYW1lIgotCQkgICAgaWYgKCR2YWwgIX4gL15ccyooXFMrKVxzKyhcUyspXHMrKFxTKylccysoXFMrKVxzKyhcUyspXHMrKFxTLiopLykgewotCQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwYXJhbWV0ZXIgbGluZSBmb3IgZmlsZS1yZXN1bHQgZmllbGRcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICAoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkbWF0Y2hUeXBlLCAkcmVzdCkKLQkJCT0gKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYpOwotCQkgICAgaWYgKCR0eXBlICF+IC9eKGZpbGV8ZGlyfHN5bWxpbmspJC8pIHsKLQkJCXByaW50IFNUREVSUgotCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZmlsZSB0eXBlIGZvciBmaWxlLXJlc3VsdDogJHR5cGVcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICBpZiAoJHBlcm0gIX4gL15cZCskLyAmJiAkcGVybSBuZSAnKicpIHsKLQkJCXByaW50IFNUREVSUgotCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgcGVybWlzc2lvbnMgZm9yIGZpbGUtcmVzdWx0OiAkcGVybVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgIGlmICgkdWlkICF+IC9eXGQrJC8gJiYgJHVpZCBuZSAnKicpIHsKLQkJCXByaW50IFNUREVSUgotCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgdXNlci1pZCBmb3IgZmlsZS1yZXN1bHQ6ICR1aWRcbiI7Ci0JCQlyZXR1cm4gdW5kZWY7Ci0JCSAgICB9Ci0JCSAgICBpZiAoJGdpZCAhfiAvXlxkKyQvICYmICRnaWQgbmUgJyonKSB7Ci0JCQlwcmludCBTVERFUlIKLQkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIGdyb3VwLWlkIGZvciBmaWxlLXJlc3VsdDogJGdpZFxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgIGlmICgkbWF0Y2hUeXBlICF+IC9eKGV4YWN0fHBhdHRlcm4pJC8pIHsKLQkJCXByaW50IFNUREVSUgotCQkiJHByb2c6JGZpbGU6JC46IGJhZCBtYXRjaCB0eXBlIGZvciBmaWxlLXJlc3VsdDogJG1hdGNoVHlwZVxuIjsKLQkJCXJldHVybiB1bmRlZjsKLQkJICAgIH0KLQkJICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKLQkJICAgIGlmICgoJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxKSA8PSAwKSB7Ci0JCQlwcmludCBTVERFUlIKLSAgICAiJHByb2c6JGZpbGU6JC46IG1pc3NpbmcgZW5kIHF1b3RlIGZvciBmaWxlIG5hbWUgaW4gZmlsZS1yZXN1bHQ6ICRyZXN0XG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQkgICAgJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOwotCQkgICAgaWYgKCRuYW1lID1+IC9eXC8vIHx8ICRuYW1lID1+IC8oXnxcLylcLlwuKFwvfCQpLykgewotCQkJIyBOb3RlOiB0aGlzIGlzIG5vdCBhIHNlY3VyaXR5IHRoaW5nIC0ganVzdCBhIHNhbml0eQotCQkJIyBjaGVjayAtIGEgdGVzdCBjYW4gc3RpbGwgdXNlIHN5bWxpbmtzIHRvIGdldCBhdCBmaWxlcwotCQkJIyBvdXRzaWRlIHRoZSB0ZXN0IGRpcmVjdG9yeS4KLQkJCXByaW50IFNUREVSUgotIiRwcm9nOiRmaWxlOiQuOiBmaWxlIG5hbWUgaW4gZmlsZS1yZXN1bHQgaXMgYWJzb2x1dGUgb3IgY29udGFpbnMgLi46ICRuYW1lXG4iOwotCQkJcmV0dXJuIHVuZGVmOwotCQkgICAgfQotCQl9Ci0JICAgIH0gZWxzaWYgKCR2YWwgZXEgJycpIHsKLQkJcHJpbnQgU1RERVJSCi0JCSAgICAiJHByb2c6JGZpbGU6JC46IG5vIHZhbHVlIGdpdmVuIGZvciBmaWVsZCBcIiRmaWVsZFwiXG4iOwotCQlyZXR1cm4gdW5kZWY7Ci0JICAgIH0KLQl9Ci0JJHZhbCAuPSAiXG4iIGlmICEkZG9fY2hvcDsKLQkkdGVzdHskc2ZpZWxkfSA9ICR2YWw7Ci0JcmVkbyBpZiAkbmVlZF9yZWRvOwotICAgIH0KLSAgICBpZiAoJF8gZXEgJycpIHsKLQlpZiAoJXRlc3QpIHsKLQkgICAgcHJpbnQgU1RERVJSCi0JICAgICAgIiRwcm9nOiRmaWxlOiRzdGFydF9saW5lbm86IGVuZC1vZi1maWxlIHdoaWxlIHJlYWRpbmcgdGVzdFxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKCRmaWVsZCwgJHZhbCkgPSBlYWNoICV0ZXN0X2ZpZWxkcykgewotCWlmICgkdmFsID1+IC9yLyAmJiAhZGVmaW5lZCAkdGVzdHskZmllbGR9KSB7Ci0JICAgIHByaW50IFNUREVSUgotCSAgICAgICIkcHJvZzokZmlsZTokc3RhcnRfbGluZW5vOiByZXF1aXJlZCBmaWVsZCBcIiRmaWVsZFwiIG1pc3NpbmdcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfQotCi0gICAgJHRlc3R7JzpmdWxsLW5hbWUnfSA9IHN1YnN0cigkZmlsZSwgJGZpbGVfcHJlZml4X3NraXApIC4gIjokdGVzdHsnbmFtZSd9IjsKLSAgICAkdGVzdHsnOmxvbmctbmFtZSd9ID0gIiRmaWxlOiRzdGFydF9saW5lbm86JHRlc3R7J25hbWUnfSI7Ci0KLSAgICAjIFN5bnRheCBjaGVjayBvbiBzcGVjaWZpYyBmaWVsZHMKLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9KSB7Ci0JaWYgKCR0ZXN0eydleHBlY3RlZC1mYWlsJ30gIX4gL14oeWVzfG5vKSQvKSB7Ci0JICAgIHByaW50IFNUREVSUgotCSAgICAgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgdmFsdWUgZm9yIGV4cGVjdGVkLWZhaWwgZmllbGRcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0JJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSA9ICQxIGVxICd5ZXMnOwotICAgIH0gZWxzZSB7Ci0JJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSA9IDA7Ci0gICAgfQotICAgIGlmIChkZWZpbmVkICR0ZXN0eydhcmd1bWVudHMnfSkgewotCWxvY2FsKCRmaXJzdGMpID0gc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMCwgMSk7Ci0KLQlpZiAoc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgLTEsIDEpIG5lICRmaXJzdGMpIHsKLQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBhcmd1bWVudHMgZmllbGQgZG9lc24ndCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyXG4iOwotCSAgICByZXR1cm4gdW5kZWY7Ci0JfQotICAgIH0KLSAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZW52LXNldHVwJ30pIHsKLQlsb2NhbCgkZmlyc3RjKSA9IHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIDAsIDEpOwotCi0JaWYgKHN1YnN0cigkdGVzdHsnZW52LXNldHVwJ30sIC0xLCAxKSBuZSAkZmlyc3RjKSB7Ci0JICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZW52LXNldHVwIGZpZWxkIGRvZXNuJ3Qgc3RhcnQgYW5kIGVuZCB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlclxuIjsKLQkgICAgcmV0dXJuIHVuZGVmOwotCX0KLSAgICB9Ci0gICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfSkgewotCWxvY2FsKCR2YWwpID0gJHRlc3R7J2V4cGVjdGVkLWV4aXQnfTsKLQotCWlmICgkdmFsID1+IC9eKHwtKVxkKyQvKSB7Ci0JICAgIGlmICgkdmFsIDwgMCB8fCAkdmFsID4gMjU1KSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXhwZWN0ZWQtZXhpdCB2YWx1ZSAkdmFsIG5vdCBpbiAwLi4yNTVcbiI7Ci0JCXJldHVybiB1bmRlZjsKLQkgICAgfQotCX0gZWxzaWYgKCR2YWwgIX4gL14oW1xzPD4rLT0qJVwvJnwhKCldfFxiW3dzZV1cYnxcYlNJR1tBLVowLTldK1xiKSskLykgewotCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCBleHBlY3RlZC1leGl0IGV4cHJlc3Npb246ICR2YWxcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfSBlbHNlIHsKLQkkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9ID0gMDsKLSAgICB9Ci0gICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZG91dCd9Ci0JJiYgZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4nfSkKLSAgICB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCB1c2UgYm90aCBleHBlY3RlZC1zdGRvdXQgYW5kIGV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZGVycid9Ci0JJiYgZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nfSkKLSAgICB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCB1c2UgYm90aCBleHBlY3RlZC1zdGRlcnIgYW5kIGV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuXG4iOwotCXJldHVybiB1bmRlZjsKLSAgICB9Ci0gICAgaWYgKGRlZmluZWQgJHRlc3R7J3RpbWUtbGltaXQnfSkgewotCWlmICgkdGVzdHsndGltZS1saW1pdCd9ICF+IC9eXGQrJC8gfHwgJHRlc3R7J3RpbWUtbGltaXQnfSA9PSAwKSB7Ci0JICAgIHByaW50IFNUREVSUgotCSAgICAgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgdmFsdWUgZm9yIHRpbWUtbGltaXQgZmllbGRcbiI7Ci0JICAgIHJldHVybiB1bmRlZjsKLQl9Ci0gICAgfSBlbHNpZiAoZGVmaW5lZCAkZGVmYXVsdF90aW1lX2xpbWl0KSB7Ci0JJHRlc3R7J3RpbWUtbGltaXQnfSA9ICRkZWZhdWx0X3RpbWVfbGltaXQ7Ci0gICAgfQotCi0gICAgaWYgKGRlZmluZWQgJGtub3duX3Rlc3RzeyR0ZXN0eyduYW1lJ319KSB7Ci0JcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiB3YXJuaW5nOiBkdXBsaWNhdGUgdGVzdCBuYW1lICR7dGVzdHsnbmFtZSd9fVxuIjsKLSAgICB9Ci0gICAgJGtub3duX3Rlc3RzeyR0ZXN0eyduYW1lJ319ID0gMTsKLQotICAgIHJldHVybiAxOwotfQotCi1zdWIKLXR0eV9tc2cKLXsKLSAgICBsb2NhbCgkbXNnKSA9IEBfOwotCi0gICAgb3BlbihUVFksICI+IC9kZXYvdHR5IikgfHwgcmV0dXJuIDA7Ci0gICAgcHJpbnQgVFRZICRtc2c7Ci0gICAgY2xvc2UoVFRZKTsKLSAgICByZXR1cm4gMTsKLX0KLQotc3ViCi1uZXZlcl9jYWxsZWRfZnVuY3MKLXsKLQlyZXR1cm4gMDsKLQkmdHR5X21zZygiaGlcbiIpOwotCSZuZXZlcl9jYWxsZWRfZnVuY3MoKTsKLQkmY2F0Y2hfc2lnYWxybSgpOwotCSRvbGRfZW52eydmb28nfSA9ICdiYXInOwotCSRpbnRlcm5hbF90ZXN0X2ZpZWxkc3snZm9vJ30gPSAnYmFyJzsKLX0KLQotc3ViCi1jaGVja19maWxlX3Jlc3VsdAotewotICAgIGxvY2FsKCp0ZXN0KSA9IEBfOwotCi0gICAgcmV0dXJuICcnIGlmICghZGVmaW5lZCAkdGVzdHsnZmlsZS1yZXN1bHQnfSk7Ci0KLSAgICBsb2NhbCgkd2h5KSA9ICcnOwotICAgIGxvY2FsKCRpKTsKLSAgICBsb2NhbCgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOwotICAgIGxvY2FsKEBzdGJ1Zik7Ci0KLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkdGVzdHsnZmlsZS1yZXN1bHQnfTsgJGkrKykgewotCSR2YWwgPSAkdGVzdHsiZmlsZS1yZXN1bHQ6JGkifTsKLQotCSMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCi0JKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJG1hdGNoVHlwZSwgJHJlc3QpID0KLQkgICAgc3BsaXQoJyAnLCAkdmFsLCA2KTsKLQkkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7Ci0JJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxOwotCSRuYW1lID0gc3Vic3RyKCRyZXN0LCAxLCAkbGVuKTsKLQkkcmVzdCA9IHN1YnN0cigkcmVzdCwgMiArICRsZW4pOwotCSRwZXJtID0gb2N0KCRwZXJtKSBpZiAkcGVybSA9fiAvXlxkKyQvOwotCi0JQHN0YnVmID0gbHN0YXQoJG5hbWUpOwotCWlmICghQHN0YnVmKSB7Ci0JICAgICR3aHkgLj0gIlx0ZXhwZWN0ZWQgJHR5cGUgXCIkbmFtZVwiIG5vdCBjcmVhdGVkXG4iOwotCSAgICBuZXh0OwotCX0KLQlpZiAoJHBlcm0gbmUgJyonICYmICgkc3RidWZbMl0gJiAwNzc3NykgIT0gJHBlcm0pIHsKLQkgICAgJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaGFzIHVuZXhwZWN0ZWQgcGVybWlzc2lvbnNcbiI7Ci0JICAgICR3aHkgLj0gc3ByaW50ZigiXHRcdGV4cGVjdGVkIDAlbywgZm91bmQgMCVvXG4iLAotCQkgICAgJHBlcm0sICRzdGJ1ZlsyXSAmIDA3Nzc3KTsKLQl9Ci0JaWYgKCR1aWQgbmUgJyonICYmICRzdGJ1Zls0XSAhPSAkdWlkKSB7Ci0JICAgICR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGhhcyB1bmV4cGVjdGVkIHVzZXItaWRcbiI7Ci0JICAgICR3aHkgLj0gc3ByaW50ZigiXHRcdGV4cGVjdGVkICVkLCBmb3VuZCAlZFxuIiwKLQkJICAgICR1aWQsICRzdGJ1Zls0XSk7Ci0JfQotCWlmICgkZ2lkIG5lICcqJyAmJiAkc3RidWZbNV0gIT0gJGdpZCkgewotCSAgICAkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBoYXMgdW5leHBlY3RlZCBncm91cC1pZFxuIjsKLQkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgJWQsIGZvdW5kICVkXG4iLAotCQkgICAgJGdpZCwgJHN0YnVmWzVdKTsKLQl9Ci0KLQlpZiAoJHR5cGUgZXEgJ2ZpbGUnKSB7Ci0JICAgIGlmICgtbCBfIHx8ICEgLWYgXykgewotCQkkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBpcyBub3QgYSByZWd1bGFyIGZpbGVcbiI7Ci0JICAgIH0gZWxzZSB7Ci0JCWxvY2FsICR0bXAgPSAmY2hlY2tfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwgJG5hbWUsCi0JCQkgICAgIiR0eXBlIGNvbnRlbnRzIGluIFwiJG5hbWVcIiIsCi0JCQkgICAgJG1hdGNoVHlwZSBlcSAnZXhhY3QnID8gJHJlc3QgOiB1bmRlZgotCQkJICAgICRtYXRjaFR5cGUgZXEgJ3BhdHRlcm4nID8gJHJlc3QgOiB1bmRlZik7Ci0JCXJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQgJHRtcCk7Ci0JCSR3aHkgLj0gJHRtcDsKLQkgICAgfQotCX0gZWxzaWYgKCR0eXBlIGVxICdkaXInKSB7Ci0JICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7Ci0JCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZmlsZS1yZXN1bHQgdGVzdCBmb3IgZGlyZWN0b3J5ICRuYW1lIHNob3VsZCBub3QgaGF2ZSBjb250ZW50IHNwZWNpZmllZFxuIjsKLQkJcmV0dXJuIHVuZGVmOwotCSAgICB9Ci0JICAgIGlmICgtbCBfIHx8ICEgLWQgXykgewotCQkkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiI7Ci0JICAgIH0KLQl9IGVsc2lmICgkdHlwZSBlcSAnc3ltbGluaycpIHsKLQkgICAgaWYgKCEtbCBfKSB7Ci0JCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIHN5bWxpbmtcbiI7Ci0JICAgIH0gZWxzZSB7Ci0JCWxvY2FsICRjb250ZW50ID0gcmVhZGxpbmsoJG5hbWUpOwotCQlpZiAoIWRlZmluZWQgJGNvbnRlbnQpIHsKLQkJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZmlsZS1yZXN1bHQgdGVzdCBmb3IgJHR5cGUgJG5hbWUgZmFpbGVkIC0gY291bGQgbm90IHJlYWRsaW5rIC0gJCFcbiI7Ci0JCSAgICByZXR1cm4gdW5kZWY7Ci0JCX0KLQkJbG9jYWwgJHRtcCA9ICZjb21wYXJlX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sCi0JCQkgICAgIiR0eXBlIGNvbnRlbnRzIGluIFwiJG5hbWVcIiIsCi0JCQkgICAgJG1hdGNoVHlwZSBlcSAnZXhhY3QnID8gJHJlc3QgOiB1bmRlZgotCQkJICAgICRtYXRjaFR5cGUgZXEgJ3BhdHRlcm4nID8gJHJlc3QgOiB1bmRlZik7Ci0JCXJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQgJHRtcCk7Ci0JCSR3aHkgLj0gJHRtcDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gJHdoeTsKLX0KLQotc3ViCi1IRUxQX01FU1NBR0UKLXsKLSAgICBwcmludCBTVERFUlIgJFVzYWdlOwotICAgIGV4aXQgMDsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2NoZWNrLnQgYi9ta3NoL3NyYy9jaGVjay50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU4Y2FmLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2NoZWNrLnQKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQzICswLDAgQEAKLSMgJE1pck9TOiBzcmMvYmluL21rc2gvY2hlY2sudCx2IDEuMzg4IDIwMTAvMDgvMjQgMTU6NDc6NDQgdGcgRXhwICQKLSMgJE9wZW5CU0Q6IGJrc2wtbmwudCx2IDEuMiAyMDAxLzAxLzI4IDIzOjA0OjU2IG5pa2xhcyBFeHAgJAotIyAkT3BlbkJTRDogaGlzdG9yeS50LHYgMS41IDIwMDEvMDEvMjggMjM6MDQ6NTYgbmlrbGFzIEV4cCAkCi0jICRPcGVuQlNEOiByZWFkLnQsdiAxLjMgMjAwMy8wMy8xMCAwMzo0ODoxNiBkYXZpZCBFeHAgJAotIy0KLSMgQ29weXJpZ2h0IMKpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSMJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotIwotIyBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSMgYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0jIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVu4oCQCi0jIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotIwotIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0jIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotIyBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSMgbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0jIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotIyBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSMgZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0jIG9mIHNhaWQgcGVyc29u4oCZcyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSMtCi0jIFlvdSBtYXkgYWxzbyB3YW50IHRvIHRlc3QgSUZTIHdpdGggdGhlIHNjcmlwdCBhdAotIyBodHRwOi8vd3d3LnJlc2VhcmNoLmF0dC5jb20vfmdzZi9wdWJsaWMvaWZzLnNoCi0KLWV4cGVjdGVkLXN0ZG91dDoKLQlAKCMpTUlSQlNEIEtTSCBSMzkgMjAxMC8wOC8yNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdmVyc2lvbiBvZiBzaGVsbC4KLXN0ZGluOgotCWVjaG8gJEtTSF9WRVJTSU9OCi1uYW1lOiBLU0hfVkVSU0lPTgotLS0tCi1uYW1lOiBzZWxmdGVzdC0xCi1kZXNjcmlwdGlvbjoKLQlSZWdyZXNzaW9uIHRlc3Qgc2VsZi10ZXN0aW5nCi1zdGRpbjoKLQllY2hvICR7Zm9vOi1iYXp9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYmF6Ci0tLS0KLW5hbWU6IHNlbGZ0ZXN0LTIKLWRlc2NyaXB0aW9uOgotCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKLWVudi1zZXR1cDogIWZvbz1iYXIhCi1zdGRpbjoKLQllY2hvICR7Zm9vOi1iYXp9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYmFyCi0tLS0KLW5hbWU6IHNlbGZ0ZXN0LTMKLWRlc2NyaXB0aW9uOgotCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKLWVudi1zZXR1cDogIUVOVj1mbm9yZCEKLXN0ZGluOgotCWVjaG8gIjwkRU5WPiIKLWV4cGVjdGVkLXN0ZG91dDoKLQk8Zm5vcmQ+Ci0tLS0KLW5hbWU6IHNlbGZ0ZXN0LWVudgotZGVzY3JpcHRpb246Ci0JSnVzdCBvdXRwdXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgKGFsd2F5cyBmYWlscykKLWNhdGVnb3J5OiBkaXNhYmxlZAotc3RkaW46Ci0Jc2V0Ci0tLS0KLW5hbWU6IGFsaWFzLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KLXN0ZGluOgotCWFsaWFzIGZvb0Jhcj1mb29CYXIKLQlmb29CYXIKLQlleGl0IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9mb29CYXIuKm5vdCBmb3VuZC4qLwotLS0tCi1uYW1lOiBhbGlhcy0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCi1zdGRpbjoKLQlhbGlhcyBmb29CYXI9YmFyRm9vCi0JYWxpYXMgYmFyRm9vPWZvb0JhcgotCWZvb0JhcgotCWJhckZvbwotCWV4aXQgMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL2Zvb0Jhci4qbm90IGZvdW5kLipcbi4qYmFyRm9vLipub3QgZm91bmQvCi0tLS0KLW5hbWU6IGFsaWFzLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KLXN0ZGluOgotCWFsaWFzIEVjaG89J2VjaG8gJwotCWFsaWFzIGZvb0Jhcj1iYXJGb28KLQlhbGlhcyBiYXJGb289Zm9vQmFyCi0JRWNobyBmb29CYXIKLQl1bmFsaWFzIGJhckZvbwotCUVjaG8gZm9vQmFyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZm9vQmFyCi0JYmFyRm9vCi0tLS0KLW5hbWU6IGFsaWFzLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGlzbid0IGRvbmUgb24ga2V5d29yZHMgKGluIGtleXdvcmQKLQlwb3N0aXRpb25zKS4KLXN0ZGluOgotCWFsaWFzIEVjaG89J2VjaG8gJwotCWFsaWFzIHdoaWxlPVdoaWxlCi0Jd2hpbGUgZmFsc2U7IGRvIGVjaG8gaGkgOyBkb25lCi0JRWNobyB3aGlsZQotZXhwZWN0ZWQtc3Rkb3V0OgotCVdoaWxlCi0tLS0KLW5hbWU6IGFsaWFzLTUKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZS4KLXN0ZGluOgotCWFsaWFzIEVjaG89J2VjaG8gJwotCWFsaWFzIGZvbz0nYmFyIHN0dWZmICcKLQlhbGlhcyBiYXI9J0JhcjEgQmFyMiAnCi0JYWxpYXMgc3R1ZmY9J1N0dWZmJwotCWFsaWFzIGJsYWg9J0JsYWgnCi0JRWNobyBmb28gYmxhaAotZXhwZWN0ZWQtc3Rkb3V0OgotCUJhcjEgQmFyMiBTdHVmZiBCbGFoCi0tLS0KLW5hbWU6IGFsaWFzLTYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZS4KLXN0ZGluOgotCWFsaWFzIEVjaG89J2VjaG8gJwotCWFsaWFzIGZvbz0nYmFyIGJhcicKLQlhbGlhcyBiYXI9J0JhciAnCi0JYWxpYXMgYmxhaD1CbGFoCi0JRWNobyBmb28gYmxhaAotZXhwZWN0ZWQtc3Rkb3V0OgotCUJhciBCYXIgQmxhaAotLS0tCi1uYW1lOiBhbGlhcy03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiBkb25lIGFmdGVyIGFsaWFzIHdpdGggdHJhaWxpbmcgc3BhY2UKLQlhZnRlciBhIGtleXdvcmQuCi1zdGRpbjoKLQlhbGlhcyBYPSdjYXNlICcKLQlhbGlhcyBZPVoKLQlYIFkgaW4gJ1knKSBlY2hvIGlzIHkgOzsgWikgZWNobyBpcyB6IDsgZXNhYwotZXhwZWN0ZWQtc3Rkb3V0OgotCWlzIHoKLS0tLQotbmFtZTogYWxpYXMtOAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBuZXdsaW5lcyBpbiBhbiBhbGlhcyBkb24ndCBjYXVzZSB0aGUgY29tbWFuZCB0byBiZSBsb3N0Lgotc3RkaW46Ci0JYWxpYXMgZm9vPScKLQkKLQkKLQllY2hvIGhpCi0JCi0JCi0JCi0JZWNobyB0aGVyZQotCQotCQotCScKLQlmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCXRoZXJlCi0tLS0KLW5hbWU6IGFsaWFzLTkKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KLQlUaGlzIGNoZWNrIGZhaWxzIGZvciBzbG93IG1hY2hpbmVzIG9yIEN5Z3dpbiwgcmFpc2UKLQl0aGUgdGltZS1saW1pdCBjbGF1c2UgKGUuZy4gdG8gNykgaWYgdGhpcyBvY2N1cnMuCi10aW1lLWxpbWl0OiAzCi1zdGRpbjoKLQllY2hvIC1uID50ZgotCWFsaWFzIGxzPWxzCi0JbHMKLQllY2hvICQobHMpCi0JZXhpdCAwCi1leHBlY3RlZC1zdGRvdXQ6Ci0JdGYKLQl0ZgotLS0tCi1uYW1lOiBhbGlhcy0xMAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgotCVJlZ3Jlc3Npb24sIGludHJvZHVjZWQgZHVyaW5nIGFuIG9sZCBidWdmaXguCi1zdGRpbjoKLQlhbGlhcyBmb289J3ByaW50IGhlbGxvICcKLQlhbGlhcyBiYXI9J2ZvbyB3b3JsZCcKLQllY2hvICQoYmFyKQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhlbGxvIHdvcmxkCi0tLS0KLW5hbWU6IGFyaXRoLWxhenktMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBvbmx5IG9uZSBzaWRlIG9mIHRlcm5hcnkgb3BlcmF0b3IgaXMgZXZhbHVhdGVkCi1zdGRpbjoKLQl4PWkrPTIKLQl5PWorPTIKLQl0eXBlc2V0IC1pIGk9MSBqPTEKLQllY2hvICQoKDEgPyAyMCA6ICh4Kz0yKSkpCi0JZWNobyAkaSwkeAotCWVjaG8gJCgoMCA/ICh5Kz0yKSA6IDMwKSkKLQllY2hvICRqLCR5Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMjAKLQkxLGkrPTIKLQkzMAotCTEsais9MgotLS0tCi1uYW1lOiBhcml0aC1sYXp5LTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgbm90IGRvbmUgb24gbm9uLWV2YWx1YXRlZCBzaWRlIG9mIHRlcm5hcnkKLQlvcGVyYXRvcgotc3RkaW46Ci0JeD1pKz0yCi0JeT1qKz0yCi0JdHlwZXNldCAtaSBpPTEgaj0xCi0JZWNobyAkKCgxID8gMjAgOiAoeCs9MikpKQotCWVjaG8gJGksJHgKLQllY2hvICQoKDAgPyAoeSs9MikgOiAzMCkpCi0JZWNobyAkaSwkeQotZXhwZWN0ZWQtc3Rkb3V0OgotCTIwCi0JMSxpKz0yCi0JMzAKLQkxLGorPTIKLS0tLQotbmFtZTogYXJpdGgtbGF6eS0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGFzc2lnbm1lbnRzIG5vdCBkb25lIG9uIG5vbi1ldmFsdWF0ZWQgc2lkZSBvZiB0ZXJuYXJ5Ci0Jb3BlcmF0b3IgYW5kIHRoaXMgY29uc3RydWN0IGlzIHBhcnNlZCBjb3JyZWN0bHkgKERlYmlhbiAjNDQ1NjUxKQotc3RkaW46Ci0JeD00Ci0JeT0kKCgwID8geD0xIDogMikpCi0JZWNobyA9ICR4ICR5ID0KLWV4cGVjdGVkLXN0ZG91dDoKLQk9IDQgMiA9Ci0tLS0KLW5hbWU6IGFyaXRoLXRlcm5hcnktcHJlYy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBwcmVjZWRlbmNlIG9mIHRlcm5hcnkgb3BlcmF0b3IgdnMgYXNzaWdubWVudAotc3RkaW46Ci0JdHlwZXNldCAtaSB4PTIKLQl5PSQoKDEgPyAyMCA6IHgrPTIpKQotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLio6LioxIFw/IDIwIDogeFwrPTIuKmx2YWx1ZS4qXG4kLwotLS0tCi1uYW1lOiBhcml0aC10ZXJuYXJ5LXByZWMtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcHJlY2VkZW5jZSBvZiB0ZXJuYXJ5IG9wZXJhdG9yIHZzIGFzc2lnbm1lbnQKLXN0ZGluOgotCXR5cGVzZXQgLWkgeD0yCi0JZWNobyAkKCgwID8geCs9MiA6IDIwKSkKLWV4cGVjdGVkLXN0ZG91dDoKLQkyMAotLS0tCi1uYW1lOiBhcml0aC1kaXYtYXNzb2MtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgYXNzb2NpYXRpdml0eSBvZiBkaXZpc2lvbiBvcGVyYXRvcgotc3RkaW46Ci0JZWNobyAkKCgyMCAvIDIgLyAyKSkKLWV4cGVjdGVkLXN0ZG91dDoKLQk1Ci0tLS0KLW5hbWU6IGFyaXRoLWFzc29wLWFzc29jLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGFzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgotc3RkaW46Ci0JdHlwZXNldCAtaSBpPTEgaj0yIGs9MwotCWVjaG8gJCgoaSArPSBqICs9IGspKQotCWVjaG8gJGksJGosJGsKLWV4cGVjdGVkLXN0ZG91dDoKLQk2Ci0JNiw1LDMKLS0tLQotbmFtZTogYXJpdGgtdW5zaWduZWQtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgdW5zaWduZWQgYXJpdGhtZXRpY3Mgd29yawotc3RkaW46Ci0JIyBzaWduZWQgdnMgdW5zaWduZWQKLQllY2hvIHgxICQoKC0xKSkgJCgoIy0xKSkKLQkjIGNhbGN1bGF0aW5nCi0JdHlwZXNldCAtaSB2cwotCXR5cGVzZXQgLVVpIHZ1Ci0JdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQotCWVjaG8geDIgJHZzICR2dQotCSgoIHZzICU9IDIxNDc0ODM2NDcgKSkKLQkoKCB2dSAlPSAyMTQ3NDgzNjQ3ICkpCi0JZWNobyB4MyAkdnMgJHZ1Ci0JdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQotCSgoICMgdnMgJT0gMjE0NzQ4MzY0NyApKQotCSgoICMgdnUgJT0gMjE0NzQ4MzY0NyApKQotCWVjaG8geDQgJHZzICR2dQotCSMgbWFrZSBzdXJlIHRoZSBjYWxjdWxhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdW5zaWduZWQgZmxhZwotCXZzPTQxMjM0NTY3ODk7IHZ1PTQxMjM0NTY3ODkKLQllY2hvIHg1ICR2cyAkdnUKLQkjIHNob3J0IGZvcm0KLQllY2hvIHg2ICQoKCMgdnMgJSAyMTQ3NDgzNjQ3KSkgJCgoIyB2dSAlIDIxNDc0ODM2NDcpKQotCSMgYXJyYXkgcmVmcwotCXNldCAtQSB2YQotCXZhWzE5NzU5NzMxNDJdPXJpZ2h0Ci0JdmFbNDEyMzQ1Njc4OV09d3JvbmcKLQllY2hvIHg3ICR7dmFbIzQxMjM0NTY3ODklMjE0NzQ4MzY0N119Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JeDEgLTEgNDI5NDk2NzI5NQotCXgyIC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQotCXgzIC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQotCXg0IDE5NzU5NzMxNDIgMTk3NTk3MzE0MgotCXg1IC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQotCXg2IDE5NzU5NzMxNDIgMTk3NTk3MzE0MgotCXg3IHJpZ2h0Ci0tLS0KLW5hbWU6IGFyaXRoLWxpbWl0MzItMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYXJpdGhtZXRpY3MgYXJlIDMyIGJpdAotc3RkaW46Ci0JIyBzaWduZWQgdnMgdW5zaWduZWQKLQllY2hvIHgxICQoKC0xKSkgJCgoIy0xKSkKLQkjIGNhbGN1bGF0aW5nCi0JdHlwZXNldCAtaSB2cwotCXR5cGVzZXQgLVVpIHZ1Ci0JdnM9MjE0NzQ4MzY0NzsgdnU9MjE0NzQ4MzY0NwotCWVjaG8geDIgJHZzICR2dQotCWxldCB2cysrIHZ1KysKLQllY2hvIHgzICR2cyAkdnUKLQl2cz00Mjk0OTY3Mjk1OyB2dT00Mjk0OTY3Mjk1Ci0JZWNobyB4NCAkdnMgJHZ1Ci0JbGV0IHZzKysgdnUrKwotCWVjaG8geDUgJHZzICR2dQotCWxldCB2cysrIHZ1KysKLQllY2hvIHg2ICR2cyAkdnUKLWV4cGVjdGVkLXN0ZG91dDoKLQl4MSAtMSA0Mjk0OTY3Mjk1Ci0JeDIgMjE0NzQ4MzY0NyAyMTQ3NDgzNjQ3Ci0JeDMgLTIxNDc0ODM2NDggMjE0NzQ4MzY0OAotCXg0IC0xIDQyOTQ5NjcyOTUKLQl4NSAwIDAKLQl4NiAxIDEKLS0tLQotbmFtZTogYmtzbC1ubC1pZ24tMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBub3QgY29sbGFzcGVkIGFmdGVyICMKLXN0ZGluOgotCWVjaG8gaGkgI3RoZXJlIFwKLQllY2hvIGZvbGtzCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQlmb2xrcwotLS0tCi1uYW1lOiBia3NsLW5sLWlnbi0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgaW5zaWRlIHNpbmdsZSBxdW90ZXMKLXN0ZGluOgotCWVjaG8gJ2hpIFwKLQl0aGVyZScKLQllY2hvIGZvbGtzCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkgXAotCXRoZXJlCi0JZm9sa3MKLS0tLQotbmFtZTogYmtzbC1ubC1pZ24tMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBub3QgY29sbGFzcGVkIGluc2lkZSBzaW5nbGUgcXVvdGVzCi1zdGRpbjoKLQljYXQgPDwgXEVPRgotCWhpIFwKLQl0aGVyZQotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpIFwKLQl0aGVyZQotLS0tCi1uYW1lOiBia3NsLW5sLWlnbi00Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpbnRlcmFjdGlvbiBvZiBhbGlhc2VzLCBzaW5nbGUgcXVvdGVzIGFuZCBoZXJlLWRvY3VtZW50cwotCXdpdGggYmFja3NsYXNoLW5ld2xpbmUKLQkoZG9uJ3Qga25vdyB3aGF0IFBPU0lYIGhhcyB0byBzYXkgYWJvdXQgdGhpcykKLXN0ZGluOgotCWE9MgotCWFsaWFzIHg9J2VjaG8gaGkKLQljYXQgPDwgIkVPRiIKLQlmb29cCi0JYmFyCi0Jc29tZScKLQl4Ci0JbW9yZVwKLQlzdHVmZiRhCi0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQlmb29cCi0JYmFyCi0Jc29tZQotCW1vcmVcCi0Jc3R1ZmYkYQotLS0tCi1uYW1lOiBia3NsLW5sLWlnbi01Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB3aGF0IGhhcHBlbnMgd2l0aCBiYWNrc2xhc2ggYXQgZW5kIG9mIGlucHV0Ci0JKHRoZSBvbGQgQm91cm5lIHNoZWxsIHRyYXNoZXMgdGhlbTsgc28gZG8gd2UpCi1zdGRpbjogIQotCWVjaG8gYGVjaG8gZm9vXFxgYmFyCi0JZWNobyBoaVwKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29iYXIKLQloaQotLS0tCi0jCi0jIFBsYWNlcyBcbmV3bGluZSBzaG91bGQgYmUgY29sbGFwc2VkCi0jCi1uYW1lOiBia3NsLW5sLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGJlZm9yZSwgaW4gdGhlIG1pZGRsZSBvZiwgYW5kCi0JYWZ0ZXIgd29yZHMKLXN0ZGluOgotCSAJIAlcCi0JCQkgZWNobyBoaVwKLQlUaGVyZSwgXAotCWZvbGtzCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGlUaGVyZSwgZm9sa3MKLS0tLQotbmFtZTogYmtzbC1ubC0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiAkIHNlcXVlbmNlcwotCShrc2g5MyBmYWlscyB0aGlzKQotc3RkaW46Ci0JYT0xMgotCWFiPTE5Ci0JZWNobyAkXAotCWEKLQllY2hvICRhXAotCWIKLQllY2hvICRcCi0Je2F9Ci0JZWNobyAke2FcCi0JYn0KLQllY2hvICR7YWJcCi0JfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEyCi0JMTkKLQkxMgotCTE5Ci0JMTkKLS0tLQotbmFtZTogYmtzbC1ubC0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiAkKC4uKSBhbmQgYC4uLmAgc2VxdWVuY2VzCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQllY2hvICRcCi0JKGVjaG8gZm9vYmFyMSkKLQllY2hvICQoXAotCWVjaG8gZm9vYmFyMikKLQllY2hvICQoZWNobyBmb29cCi0JYmFyMykKLQllY2hvICQoZWNobyBmb29iYXI0XAotCSkKLQllY2hvIGAKLQllY2hvIHN0dWZmMWAKLQllY2hvIGBlY2hvIHN0XAotCXVmZjJgCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZm9vYmFyMQotCWZvb2JhcjIKLQlmb29iYXIzCi0JZm9vYmFyNAotCXN0dWZmMQotCXN0dWZmMgotLS0tCi1uYW1lOiBia3NsLW5sLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQoKC4uKSkgc2VxdWVuY2VzCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQllY2hvICRcCi0JKCgxKzIpKQotCWVjaG8gJChcCi0JKDErMiszKSkKLQllY2hvICQoKFwKLQkxKzIrMys0KSkKLQllY2hvICQoKDErXAotCTIrMys0KzUpKQotCWVjaG8gJCgoMSsyKzMrNCs1KzYpXAotCSkKLWV4cGVjdGVkLXN0ZG91dDoKLQkzCi0JNgotCTEwCi0JMTUKLQkyMQotLS0tCi1uYW1lOiBia3NsLW5sLTUKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGRvdWJsZSBxdW90ZWQgc3RyaW5ncwotc3RkaW46Ci0JZWNobyAiXAotCWhpIgotCWVjaG8gImZvb1wKLQliYXIiCi0JZWNobyAiZm9sa3NcCi0JIgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JZm9vYmFyCi0JZm9sa3MKLS0tLQotbmFtZTogYmtzbC1ubC02Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiBoZXJlIGRvY3VtZW50IGRlbGltaXRlcnMKLQkoa3NoOTMgZmFpbHMgc2Vjb25kIHBhcnQgb2YgdGhpcykKLXN0ZGluOgotCWE9MTIKLQljYXQgPDwgRU9cCi0JRgotCWE9JGEKLQlmb29cCi0JYmFyCi0JRU9GCi0JY2F0IDw8IEVfT19GCi0JZm9vCi0JRV9PX1wKLQlGCi0JZWNobyBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYT0xMgotCWZvb2JhcgotCWZvbwotCWRvbmUKLS0tLQotbmFtZTogYmtzbC1ubC03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiBkb3VibGUtcXVvdGVkIGhlcmUtZG9jdW1lbnQKLQlkZWxpbWl0ZXIuCi1zdGRpbjoKLQlhPTEyCi0JY2F0IDw8ICJFT1wKLQlGIgotCWE9JGEKLQlmb29cCi0JYmFyCi0JRU9GCi0JZWNobyBkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYT0kYQotCWZvb1wKLQliYXIKLQlkb25lCi0tLS0KLW5hbWU6IGJrc2wtbmwtOAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gdmFyaW91cyAyKyBjaGFyYWN0ZXIgdG9rZW5zCi0JZGVsaW1pdGVyLgotCShrc2g5MyBmYWlscyB0aGlzKQotc3RkaW46Ci0JZWNobyBoaSAmXAotCSYgZWNobyB0aGVyZQotCWVjaG8gZm9vIHxcCi0JfCBlY2hvIGJhcgotCWNhdCA8XAotCTwgRU9GCi0Jc3R1ZmYKLQlFT0YKLQljYXQgPFwKLQk8XAotCS0gRU9GCi0JCW1vcmUgc3R1ZmYKLQlFT0YKLQljYXQgPDxcCi0JRU9GCi0JYWJjZGVmCi0JRU9GCi0JZWNobyBoaSA+XAotCT4gL2Rldi9udWxsCi0JZWNobyAkPwotCWk9MQotCWNhc2UgJGkgaW4KLQkoXAotCXh8XAotCTFcCi0JKSBlY2hvIGhpO1wKLQk7Ci0JKCopIGVjaG8gb29wcwotCWVzYWMKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCXRoZXJlCi0JZm9vCi0Jc3R1ZmYKLQltb3JlIHN0dWZmCi0JYWJjZGVmCi0JMAotCWhpCi0tLS0KLW5hbWU6IGJrc2wtbmwtOQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBcIGF0IHRoZSBlbmQgb2YgYW4gYWxpYXMgaXMgY29sbGFwc2VkIHdoZW4gZm9sbG93ZWQKLQlieSBhIG5ld2xpbmUKLQkoZG9uJ3Qga25vdyB3aGF0IFBPU0lYIGhhcyB0byBzYXkgYWJvdXQgdGhpcykKLXN0ZGluOgotCWFsaWFzIHg9J2VjaG8gaGlcJwotCXgKLQllY2hvIHRoZXJlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGllY2hvIHRoZXJlCi0tLS0KLW5hbWU6IGJrc2wtbmwtMTAKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaW4gYSBrZXl3b3JkIGlzIGNvbGxhcHNlZAotc3RkaW46Ci0JaVwKLQlmIHRydWU7IHRoZW5cCi0JIGVjaG8gcGFzczsgZWxcCi0Jc2UgZWNobyBmYWlsOyBmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCXBhc3MKLS0tLQotIwotIyBQbGFjZXMgXG5ld2xpbmUgc2hvdWxkIGJlIGNvbGxhcHNlZCAoa3NoIGV4dGVuc2lvbnMpCi0jCi1uYW1lOiBia3NsLW5sLWtzaC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhcHNlZCBpbiBleHRlbmRlZCBnbG9iYmluZwotCShrc2g5MyBmYWlscyB0aGlzKQotc3RkaW46Ci0JeHh4PWZvbwotCWNhc2UgJHh4eCBpbgotCShmKlwKLQkoXAotCW9cCi0JKVwKLQkpIGVjaG8gb2sgOzsKLQkqKSBlY2hvIGJhZAotCWVzYWMKLWV4cGVjdGVkLXN0ZG91dDoKLQlvawotLS0tCi1uYW1lOiBia3NsLW5sLWtzaC0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhcHNlZCBpbiAoKC4uLikpIGV4cHJlc3Npb25zCi0JKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQlpPTEKLQkoXAotCShcCi0JaT1pKzJcCi0JKVwKLQkpCi0JZWNobyAkaQotZXhwZWN0ZWQtc3Rkb3V0OgotCTMKLS0tLQotbmFtZTogYnJlYWstMQotZGVzY3JpcHRpb246Ci0JU2VlIGlmIGJyZWFrIGJyZWFrcyBvdXQgb2YgbG9vcHMKLXN0ZGluOgotCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBicmVhazsgZWNobyBiYWQtJGk7IGRvbmUKLQllY2hvIGVuZC0xCi0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIDE7IGVjaG8gYmFkLSRpOyBkb25lCi0JZWNobyBlbmQtMgotCWZvciBpIGluIGEgYiBjOyBkbwotCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KLQkJZWNobyAkaTokagotCQlicmVhawotCQllY2hvIGJhZC0kaQotCSAgICBkb25lCi0JICAgIGVjaG8gZW5kLSRpCi0JZG9uZQotCWVjaG8gZW5kLTMKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi0JZW5kLTEKLQlhCi0JZW5kLTIKLQlhOngKLQllbmQtYQotCWI6eAotCWVuZC1iCi0JYzp4Ci0JZW5kLWMKLQllbmQtMwotLS0tCi1uYW1lOiBicmVhay0yCi1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgYnJlYWsgYnJlYWtzIG91dCBvZiBuZXN0ZWQgbG9vcHMKLXN0ZGluOgotCWZvciBpIGluIGEgYiBjOyBkbwotCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KLQkJZWNobyAkaTokagotCQlicmVhayAyCi0JCWVjaG8gYmFkLSRpCi0JICAgIGRvbmUKLQkgICAgZWNobyBlbmQtJGkKLQlkb25lCi0JZWNobyBlbmQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhOngKLQllbmQKLS0tLQotbmFtZTogYnJlYWstMwotZGVzY3JpcHRpb246Ci0JV2hhdCBpZiBicmVhayB1c2VkIG91dHNpZGUgb2YgYW55IGxvb3BzCi0JKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCi1zdGRpbjoKLQlicmVhawotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLy4qYnJlYWsuKi8KLS0tLQotbmFtZTogYnJlYWstNAotZGVzY3JpcHRpb246Ci0JV2hhdCBpZiBicmVhayBOIHVzZWQgd2hlbiBvbmx5IE4tMSBsb29wcwotCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIDI7IGVjaG8gYmFkLSRpOyBkb25lCi0JZWNobyBlbmQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi0JZW5kCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipicmVhay4qLwotLS0tCi1uYW1lOiBicmVhay01Ci1kZXNjcmlwdGlvbjoKLQlFcnJvciBpZiBicmVhayBhcmd1bWVudCBpc24ndCBhIG51bWJlcgotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIGFiYzsgZWNobyBtb3JlLSRpOyBkb25lCi0JZWNobyBlbmQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKmJyZWFrLiovCi0tLS0KLW5hbWU6IGNvbnRpbnVlLTEKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiBjb250aW51ZSBjb250aW51ZXMgbG9vcHMKLXN0ZGluOgotCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZTsgZWNobyBiYWQtJGkgOyBkb25lCi0JZWNobyBlbmQtMQotCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSAxOyBlY2hvIGJhZC0kaTsgZG9uZQotCWVjaG8gZW5kLTIKLQlmb3IgaSBpbiBhIGIgYzsgZG8KLQkgICAgZm9yIGogaW4geCB5IHo7IGRvCi0JCWVjaG8gJGk6JGoKLQkJY29udGludWUKLQkJZWNobyBiYWQtJGktJGoKLQkgICAgZG9uZQotCSAgICBlY2hvIGVuZC0kaQotCWRvbmUKLQllY2hvIGVuZC0zCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYQotCWIKLQljCi0JZW5kLTEKLQlhCi0JYgotCWMKLQllbmQtMgotCWE6eAotCWE6eQotCWE6egotCWVuZC1hCi0JYjp4Ci0JYjp5Ci0JYjp6Ci0JZW5kLWIKLQljOngKLQljOnkKLQljOnoKLQllbmQtYwotCWVuZC0zCi0tLS0KLW5hbWU6IGNvbnRpbnVlLTIKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiBjb250aW51ZSBicmVha3Mgb3V0IG9mIG5lc3RlZCBsb29wcwotc3RkaW46Ci0JZm9yIGkgaW4gYSBiIGM7IGRvCi0JICAgIGZvciBqIGluIHggeSB6OyBkbwotCQllY2hvICRpOiRqCi0JCWNvbnRpbnVlIDIKLQkJZWNobyBiYWQtJGktJGoKLQkgICAgZG9uZQotCSAgICBlY2hvIGVuZC0kaQotCWRvbmUKLQllY2hvIGVuZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWE6eAotCWI6eAotCWM6eAotCWVuZAotLS0tCi1uYW1lOiBjb250aW51ZS0zCi1kZXNjcmlwdGlvbjoKLQlXaGF0IGlmIGNvbnRpbnVlIHVzZWQgb3V0c2lkZSBvZiBhbnkgbG9vcHMKLQkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKLXN0ZGluOgotCWNvbnRpbnVlCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipjb250aW51ZS4qLwotLS0tCi1uYW1lOiBjb250aW51ZS00Ci1kZXNjcmlwdGlvbjoKLQlXaGF0IGlmIGNvbnRpbnVlIE4gdXNlZCB3aGVuIG9ubHkgTi0xIGxvb3BzCi0JKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCi1zdGRpbjoKLQlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgY29udGludWUgMjsgZWNobyBiYWQtJGk7IGRvbmUKLQllY2hvIGVuZAotZXhwZWN0ZWQtc3Rkb3V0OgotCWEKLQliCi0JYwotCWVuZAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLy4qY29udGludWUuKi8KLS0tLQotbmFtZTogY29udGludWUtNQotZGVzY3JpcHRpb246Ci0JRXJyb3IgaWYgY29udGludWUgYXJndW1lbnQgaXNuJ3QgYSBudW1iZXIKLXN0ZGluOgotCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSBhYmM7IGVjaG8gbW9yZS0kaTsgZG9uZQotCWVjaG8gZW5kCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYQotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipjb250aW51ZS4qLwotLS0tCi1uYW1lOiBjZC1oaXN0b3J5Ci1kZXNjcmlwdGlvbjoKLQlUZXN0IHNvbWVvbmUncyBDRCBoaXN0b3J5IHBhY2thZ2UgKHVzZXMgYXJyYXlzKQotc3RkaW46Ci0JIyBnbyB0byBrbm93biBwbGFjZSBiZWZvcmUgZG9pbmcgYW55dGhpbmcKLQljZCAvCi0JCi0JYWxpYXMgY2Q9X2NkCi0JZnVuY3Rpb24gX2NkCi0JewotCQl0eXBlc2V0IC1pIGNkbGVuIGkKLQkJdHlwZXNldCB0Ci0JCi0JCWlmIFsgJCMgLWVxIDAgXQotCQl0aGVuCi0JCQlzZXQgLS0gJEhPTUUKLQkJZmkKLQkKLQkJaWYgWyAiJENESElTVEZJTEUiIC1hIC1yICIkQ0RISVNURklMRSIgXSAjIGlmIGRpcmVjdG9yeSBoaXN0b3J5IGV4aXN0cwotCQl0aGVuCi0JCQl0eXBlc2V0IENESElTVAotCQkJaT0tMQotCQkJd2hpbGUgcmVhZCAtciB0CQkJIyByZWFkIGRpcmVjdG9yeSBoaXN0b3J5IGZpbGUKLQkJCWRvCi0JCQkJQ0RISVNUW2k9aSsxXT0kdAotCQkJZG9uZSA8JENESElTVEZJTEUKLQkJZmkKLQkKLQkJaWYgWyAiJHtDREhJU1RbMF19IiAhPSAiJFBXRCIgLWEgIiRQV0QiICE9ICIiIF0KLQkJdGhlbgotCQkJX2NkaW5zCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5Ci0JCWZpCi0JCi0JCWNkbGVuPSR7I0NESElTVFsqXX0JCQkjIG51bWJlciBvZiBlbGVtZW50cyBpbiBoaXN0b3J5Ci0JCi0JCWNhc2UgIiRAIiBpbgotCQktKQkJCQkJIyBjZCB0byBuZXcgZGlyCi0JCQlpZiBbICIkT0xEUFdEIiA9ICIiIF0gJiYgKChjZGxlbj4xKSkKLQkJCXRoZW4KLQkJCQkncHJpbnQnICR7Q0RISVNUWzFdfQotCQkJCSdjZCcgJHtDREhJU1RbMV19Ci0JCQkJX3B3ZAotCQkJZWxzZQotCQkJCSdjZCcgJEAKLQkJCQlfcHdkCi0JCQlmaQotCQkJOzsKLQkJLWwpCQkJCQkjIHByaW50IGRpcmVjdG9yeSBsaXN0Ci0JCQl0eXBlc2V0IC1SMyBudW0KLQkJCSgoaT1jZGxlbikpCi0JCQl3aGlsZSAoKChpPWktMSk+PTApKQotCQkJZG8KLQkJCQludW09JGkKLQkJCQkncHJpbnQnICIkbnVtICR7Q0RISVNUW2ldfSIKLQkJCWRvbmUKLQkJCXJldHVybgotCQkJOzsKLQkJLVswLTldfC1bMC05XVswLTldKQkJCSMgY2QgdG8gZGlyIGluIGxpc3QKLQkJCWlmICgoKGk9JHsxIy19KTxjZGxlbikpCi0JCQl0aGVuCi0JCQkJJ3ByaW50JyAke0NESElTVFtpXX0KLQkJCQknY2QnICR7Q0RISVNUW2ldfQotCQkJCV9wd2QKLQkJCWVsc2UKLQkJCQknY2QnICRACi0JCQkJX3B3ZAotCQkJZmkKLQkJCTs7Ci0JCS0qKQkJCQkJIyBjZCB0byBtYXRjaGVkIGRpciBpbiBsaXN0Ci0JCQl0PSR7MSMtfQotCQkJaT0xCi0JCQl3aGlsZSAoKGk8Y2RsZW4pKQotCQkJZG8KLQkJCQljYXNlICR7Q0RISVNUW2ldfSBpbgotCQkJCSokdCopCi0JCQkJCSdwcmludCcgJHtDREhJU1RbaV19Ci0JCQkJCSdjZCcgJHtDREhJU1RbaV19Ci0JCQkJCV9wd2QKLQkJCQkJYnJlYWsKLQkJCQkJOzsKLQkJCQllc2FjCi0JCQkJKChpPWkrMSkpCi0JCQlkb25lCi0JCQlpZiAoKGk+PWNkbGVuKSkKLQkJCXRoZW4KLQkJCQknY2QnICRACi0JCQkJX3B3ZAotCQkJZmkKLQkJCTs7Ci0JCSopCQkJCQkjIGNkIHRvIG5ldyBkaXIKLQkJCSdjZCcgJEAKLQkJCV9wd2QKLQkJCTs7Ci0JCWVzYWMKLQkKLQkJX2NkaW5zCQkJCQkjIGluc2VydCAkUFdEIGludG8gY2QgaGlzdG9yeQotCQotCQlpZiBbICIkQ0RISVNURklMRSIgXQotCQl0aGVuCi0JCQljZGxlbj0keyNDREhJU1RbKl19CQkjIG51bWJlciBvZiBlbGVtZW50cyBpbiBoaXN0b3J5Ci0JCi0JCQlpPTAKLQkJCXdoaWxlICgoaTxjZGxlbikpCi0JCQlkbwotCQkJCSdwcmludCcgLXIgJHtDREhJU1RbaV19CSMgdXBkYXRlIGRpcmVjdG9yeSBoaXN0b3J5Ci0JCQkJKChpPWkrMSkpCi0JCQlkb25lID4kQ0RISVNURklMRQotCQlmaQotCX0KLQkKLQlmdW5jdGlvbiBfY2RpbnMJCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5Ci0JewkJCQkJCSMgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgYnkgX2NkCi0JCXR5cGVzZXQgLWkgaQotCQotCQkoKGk9MCkpCi0JCXdoaWxlICgoaTwkeyNDREhJU1RbKl19KSkJCSMgc2VlIGlmIGRpciBpcyBhbHJlYWR5IGluIGxpc3QKLQkJZG8KLQkJCWlmIFsgIiR7Q0RISVNUWyRpXX0iID0gIiRQV0QiIF0KLQkJCXRoZW4KLQkJCQlicmVhawotCQkJZmkKLQkJCSgoaT1pKzEpKQotCQlkb25lCi0JCi0JCWlmICgoaT4yMikpCQkJCSMgbGltaXQgbWF4IHNpemUgb2YgbGlzdAotCQl0aGVuCi0JCQlpPTIyCi0JCWZpCi0JCi0JCXdoaWxlICgoKGk9aS0xKT49MCkpCQkJIyBidW1wIG9sZCBkaXJzIGluIGxpc3QKLQkJZG8KLQkJCUNESElTVFtpKzFdPSR7Q0RISVNUW2ldfQotCQlkb25lCi0JCi0JCUNESElTVFswXT0kUFdECQkJCSMgaW5zZXJ0IG5ldyBkaXJlY3RvcnkgaW4gbGlzdAotCX0KLQkKLQkKLQlmdW5jdGlvbiBfcHdkCi0JewotCQlpZiBbIC1uICIkRUNEIiBdCi0JCXRoZW4KLQkJCXB3ZCAxPiY2Ci0JCWZpCi0JfQotCSMgU3RhcnQgb2YgdGVzdAotCWNkIC90bXAKLQljZCAvYmluCi0JY2QgL2V0YwotCWNkIC0KLQljZCAtMgotCWNkIC1sCi1leHBlY3RlZC1zdGRvdXQ6Ci0JL2JpbgotCS90bXAKLQkgIDMgLwotCSAgMiAvZXRjCi0JICAxIC9iaW4KLQkgIDAgL3RtcAotLS0tCi1uYW1lOiBlbnYtcHJvbXB0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHByb21wdCBub3QgcHJpbnRlZCB3aGVuIHByb2Nlc3NpbmcgRU5WCi1lbnYtc2V0dXA6ICFFTlY9Li9mb28hCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZm9vIgotCVhYWD1fCi0JUFMxPVgKLQlmYWxzZSAmJiBlY2hvIGhtbW0KLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JZWNobyBoaSR7WFhYfXRoZXJlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGlfdGhlcmUKLWV4cGVjdGVkLXN0ZGVycjogIQotCVhYCi0tLS0KLW5hbWU6IGV4cGFuZC11Z2x5Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHdlaXJkICR7Zm9vK2Jhcn0gY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQotc3RkaW46Ci0JKGVjaG8gMSAke0lGUysnfSd6fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxCi0JKGVjaG8gMiAiJHtJRlMrJ30nen0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIKLQkoZWNobyAzICJmb28gJHtJRlMrJ2Jhcn0gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzCi0JKGVjaG8gLW4gJzQgJzsgcHJpbnRmICclc1xuJyAiZm9vICR7SUZTKyJiICAgYyJ9IGJheiIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNAotCShlY2hvIC1uICc1ICc7IHByaW50ZiAnJXNcbicgImZvbyAke0lGUytiICAgY30gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA1Ci0JKGVjaG8gNiAke0lGUysifSJ6fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA2Ci0JKGVjaG8gNyAiJHtJRlMrIn0ien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDcKLQkoZWNobyA4ICIke0lGUytcIn1cInp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA4Ci0JKGVjaG8gOSAiJHtJRlMrXCJcfVwien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDkKLQkoZWNobyAxMCBmb28gJHtJRlMrJ2Jhcn0gYmF6J30pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTAKLQkoZWNobyAxMSAiJChlY2hvICIke0lGUysnfSd6fSIpIikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMQotCShlY2hvIDEyICIkKGVjaG8gJHtJRlMrJ30nen0pIikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMgotCShlY2hvIDEzICR7SUZTK1x9en0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTMKLQkoZWNobyAxNCAiJHtJRlMrXH16fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTQKLQl1PXg7IChlY2hvIC1uICcxNSAnOyBwcmludGYgJzwlcz4gJyAiZm9vICR7SUZTK2EiYiR1eyB7Int7XH1ifSBjICR7SUZTK2R7fX0gYmFyIiAke0lGUy1le319IGJhejsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE1Ci0JbD10OyAoZWNobyAxNiAke0lGUytoYGVjaG8gLW4gaSAke0lGUyskbH1oYGVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTYKLQlsPXQ7IChlY2hvIDE3ICR7SUZTK2gkKGVjaG8gLW4gaSAke0lGUyskbH1oKWVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTcKLQlsPXQ7IChlY2hvIDE4ICIke0lGUytoYGVjaG8gLW4gaSAke0lGUyskbH1oYGVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE4Ci0JbD10OyAoZWNobyAxOSAiJHtJRlMraCQoZWNobyAtbiBpICR7SUZTKyRsfWgpZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTkKLQlsPXQ7IChlY2hvIDIwICR7SUZTK2hgZWNobyAtbiBpICIke0lGUyskbH0iaGBlcmV9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIwCi0JbD10OyAoZWNobyAyMSAke0lGUytoJChlY2hvIC1uIGkgIiR7SUZTKyRsfSJoKWVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjEKLQlsPXQ7IChlY2hvIDIyICIke0lGUytoYGVjaG8gLW4gaSAiJHtJRlMrJGx9ImhgZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjIKLQlsPXQ7IChlY2hvIDIzICIke0lGUytoJChlY2hvIC1uIGkgIiR7SUZTKyRsfSJoKWVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIzCi0Ja2V5PXZhbHVlOyAoZWNobyAtbiAnMjQgJzsgcHJpbnRmICclc1xuJyAiJHtJRlMrJyRrZXknfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjQKLQlrZXk9dmFsdWU7IChlY2hvIC1uICcyNSAnOyBwcmludGYgJyVzXG4nICIke0lGUysiJyRrZXknIn0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI1CSMga3NoOTM6IOKAnCcka2V5J+KAnQotCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI2ICc7IHByaW50ZiAnJXNcbicgJHtJRlMrJyRrZXknfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNgotCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI3ICc7IHByaW50ZiAnJXNcbicgJHtJRlMrIicka2V5JyJ9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI3Ci0JKGVjaG8gLW4gJzI4ICc7IHByaW50ZiAnJXNcbicgIiR7SUZTKyInInggfiB4J30neCInfSJ4fSIgIycpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjgKLQl1PXg7IChlY2hvIC1uICcyOSAnOyBwcmludGYgJzwlcz4gJyBmb28gJHtJRlMrYSJiJHV7IHsieyB7XH1ifSBjICR7SUZTK2R7fX0gYmFyICR7SUZTLWV7fX0gYmF6OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjkKLQkoZWNobyAtbiAnMzAgJzsgcHJpbnRmICc8JXM+ICcgJHtJRlMrZm9vICdiXAotCWFyJyBiYXp9OyBlY2hvIC4pIDI+Ji0gfHwgKGVjaG8gZmFpbGVkIGluIDMwOyBlY2hvIGZhaWxlZCBpbiAzMSkKLQkoZWNobyAtbiAnMzIgJzsgcHJpbnRmICc8JXM+ICcgJHtJRlMrZm9vICJiXAotCWFyIiBiYXp9OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzIKLQkoZWNobyAtbiAnMzMgJzsgcHJpbnRmICc8JXM+ICcgIiR7SUZTK2ZvbyAnYlwKLQlhcicgYmF6fSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzMwotCShlY2hvIC1uICczNCAnOyBwcmludGYgJzwlcz4gJyAiJHtJRlMrZm9vICJiXAotCWFyIiBiYXp9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM0Ci0JKGVjaG8gLW4gJzM1ICc7IHByaW50ZiAnPCVzPiAnICR7dj1hXCBifSB4ICR7dj1jXCBkfTsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM1Ci0JKGVjaG8gLW4gJzM2ICc7IHByaW50ZiAnPCVzPiAnICIke3Y9YVwgYn0iIHggIiR7dj1jXCBkfSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNgotCShlY2hvIC1uICczNyAnOyBwcmludGYgJzwlcz4gJyAke3YtYVwgYn0geCAke3YtY1wgZH07IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNwotCShlY2hvIDM4ICR7SUZTK3gnYSd5fSAvICIke0lGUyt4J2EneX0iIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzgKLQlmb289IngnYSd5IjsgKGVjaG8gMzkgJHtmb28lKidhJyp9IC8gIiR7Zm9vJSonYScqfSIgLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzOQotCWZvbz0iYSBiIGMiOyAoZWNobyAtbiAnNDAgJzsgcHJpbnRmICc8JXM+ICcgIiR7Zm9vI2F9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDQwCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSB9egotCTIgJyd6fQotCTMgZm9vICdiYXIgYmF6Ci0JNCBmb28gYiAgIGMgYmF6Ci0JNSBmb28gYiAgIGMgYmF6Ci0JNiB9egotCTcgfXoKLQk4ICIien0KLQk5ICJ9InoKLQkxMCBmb28gYmFyfSBiYXoKLQkxMSAnJ3p9Ci0JMTIgfXoKLQkxMyB9egotCTE0IH16Ci0JMTUgPGZvbyBhYnh7IHt7e31iIGMgZHt9IGJhcj4gPH0+IDxiYXo+IC4KLQkxNiBoaSB0aGVyZQotCTE3IGhpIHRoZXJlCi0JMTggaGkgdGhlcmUKLQkxOSBoaSB0aGVyZQotCTIwIGhpIHRoZXJlCi0JMjEgaGkgdGhlcmUKLQkyMiBoaSB0aGVyZQotCTIzIGhpIHRoZXJlCi0JMjQgJ3ZhbHVlJwotCTI1ICd2YWx1ZScKLQkyNiAka2V5Ci0JMjcgJ3ZhbHVlJwotCTI4ICd4IH4geCcneH0ieH0iICMKLQkyOSA8Zm9vPiA8YWJ4eyB7ez4gPHt9Yj4gPGM+IDxke30+IDxiYXI+IDx9PiA8YmF6PiAuCi0JMzAgPGZvbz4gPGJcCi0JYXI+IDxiYXo+IC4KLQkzMiA8Zm9vPiA8YmFyPiA8YmF6PiAuCi0JMzMgPGZvbyAnYmFyJyBiYXo+IC4KLQkzNCA8Zm9vIGJhciBiYXo+IC4KLQkzNSA8YT4gPGI+IDx4PiA8YT4gPGI+IC4KLQkzNiA8YVwgYj4gPHg+IDxhXCBiPiAuCi0JMzcgPGEgYj4gPHg+IDxjIGQ+IC4KLQkzOCB4YXkgLyB4J2EneSAuCi0JMzkgeCcgLyB4JyAuCi0JNDAgPCBiIGM+IC4KLS0tLQotbmFtZTogZXhwYW5kLXVuZ2xvYi1kYmxxCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHJlZ3VsYXIgIiR7Zm9vK2Jhcn0iIGNvbnN0cnVjdHMgYXJlIHBhcnNlZCBjb3JyZWN0bHkKLXN0ZGluOgotCXU9eAotCXRsX25vcm0oKSB7Ci0JCXY9JDIKLQkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgotCQkoZWNobyAiJDEgcGx1cyBub3JtIGZvbyAke3YrJ2Jhcid9IGJheiIpCi0JCShlY2hvICIkMSBkYXNoIG5vcm0gZm9vICR7di0nYmFyJ30gYmF6IikKLQkJKGVjaG8gIiQxIGVxYWwgbm9ybSBmb28gJHt2PSdiYXInfSBiYXoiKQotCQkoZWNobyAiJDEgcXN0biBub3JtIGZvbyAke3Y/J2Jhcid9IGJheiIpIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgcXN0biBub3JtIC0+IGVycm9yIgotCQkoZWNobyAiJDEgUExVUyBub3JtIGZvbyAke3Y6KydiYXInfSBiYXoiKQotCQkoZWNobyAiJDEgREFTSCBub3JtIGZvbyAke3Y6LSdiYXInfSBiYXoiKQotCQkoZWNobyAiJDEgRVFBTCBub3JtIGZvbyAke3Y6PSdiYXInfSBiYXoiKQotCQkoZWNobyAiJDEgUVNUTiBub3JtIGZvbyAke3Y6PydiYXInfSBiYXoiKSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gbm9ybSAtPiBlcnJvciIKLQl9Ci0JdGxfcGFyZW4oKSB7Ci0JCXY9JDIKLQkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgotCQkoZWNobyAiJDEgcGx1cyBwYXJuIGZvbyAke3YrKGJhcil9IGJheiIpCi0JCShlY2hvICIkMSBkYXNoIHBhcm4gZm9vICR7di0oYmFyKX0gYmF6IikKLQkJKGVjaG8gIiQxIGVxYWwgcGFybiBmb28gJHt2PShiYXIpfSBiYXoiKQotCQkoZWNobyAiJDEgcXN0biBwYXJuIGZvbyAke3Y/KGJhcil9IGJheiIpIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgcXN0biBwYXJuIC0+IGVycm9yIgotCQkoZWNobyAiJDEgUExVUyBwYXJuIGZvbyAke3Y6KyhiYXIpfSBiYXoiKQotCQkoZWNobyAiJDEgREFTSCBwYXJuIGZvbyAke3Y6LShiYXIpfSBiYXoiKQotCQkoZWNobyAiJDEgRVFBTCBwYXJuIGZvbyAke3Y6PShiYXIpfSBiYXoiKQotCQkoZWNobyAiJDEgUVNUTiBwYXJuIGZvbyAke3Y6PyhiYXIpfSBiYXoiKSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gcGFybiAtPiBlcnJvciIKLQl9Ci0JdGxfYnJhY2UoKSB7Ci0JCXY9JDIKLQkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgotCQkoZWNobyAiJDEgcGx1cyBicmFjIGZvbyAke3YrYSR1e3t7XH1ifSBjICR7ditke319IGJheiIpCi0JCShlY2hvICIkMSBkYXNoIGJyYWMgZm9vICR7di1hJHV7e3tcfWJ9IGMgJHt2LWR7fX0gYmF6IikKLQkJKGVjaG8gIiQxIGVxYWwgYnJhYyBmb28gJHt2PWEkdXt7e1x9Yn0gYyAke3Y9ZHt9fSBiYXoiKQotCQkoZWNobyAiJDEgcXN0biBicmFjIGZvbyAke3Y/YSR1e3t7XH1ifSBjICR7dj9ke319IGJheiIpIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgcXN0biBicmFjIC0+IGVycm9yIgotCQkoZWNobyAiJDEgUExVUyBicmFjIGZvbyAke3Y6K2EkdXt7e1x9Yn0gYyAke3Y6K2R7fX0gYmF6IikKLQkJKGVjaG8gIiQxIERBU0ggYnJhYyBmb28gJHt2Oi1hJHV7e3tcfWJ9IGMgJHt2Oi1ke319IGJheiIpCi0JCShlY2hvICIkMSBFUUFMIGJyYWMgZm9vICR7djo9YSR1e3t7XH1ifSBjICR7djo9ZHt9fSBiYXoiKQotCQkoZWNobyAiJDEgUVNUTiBicmFjIGZvbyAke3Y6P2EkdXt7e1x9Yn0gYyAke3Y6P2R7fX0gYmF6IikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBRU1ROIGJyYWMgLT4gZXJyb3IiCi0JfQotCXRsX25vcm0gMSAtCi0JdGxfbm9ybSAyICcnCi0JdGxfbm9ybSAzIHgKLQl0bF9wYXJlbiA0IC0KLQl0bF9wYXJlbiA1ICcnCi0JdGxfcGFyZW4gNiB4Ci0JdGxfYnJhY2UgNyAtCi0JdGxfYnJhY2UgOCAnJwotCXRsX2JyYWNlIDkgeAotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgcGx1cyBub3JtIGZvbyAgYmF6Ci0JMSBkYXNoIG5vcm0gZm9vICdiYXInIGJhegotCTEgZXFhbCBub3JtIGZvbyAnYmFyJyBiYXoKLQkxIHFzdG4gbm9ybSAtPiBlcnJvcgotCTEgUExVUyBub3JtIGZvbyAgYmF6Ci0JMSBEQVNIIG5vcm0gZm9vICdiYXInIGJhegotCTEgRVFBTCBub3JtIGZvbyAnYmFyJyBiYXoKLQkxIFFTVE4gbm9ybSAtPiBlcnJvcgotCTIgcGx1cyBub3JtIGZvbyAnYmFyJyBiYXoKLQkyIGRhc2ggbm9ybSBmb28gIGJhegotCTIgZXFhbCBub3JtIGZvbyAgYmF6Ci0JMiBxc3RuIG5vcm0gZm9vICBiYXoKLQkyIFBMVVMgbm9ybSBmb28gIGJhegotCTIgREFTSCBub3JtIGZvbyAnYmFyJyBiYXoKLQkyIEVRQUwgbm9ybSBmb28gJ2JhcicgYmF6Ci0JMiBRU1ROIG5vcm0gLT4gZXJyb3IKLQkzIHBsdXMgbm9ybSBmb28gJ2JhcicgYmF6Ci0JMyBkYXNoIG5vcm0gZm9vIHggYmF6Ci0JMyBlcWFsIG5vcm0gZm9vIHggYmF6Ci0JMyBxc3RuIG5vcm0gZm9vIHggYmF6Ci0JMyBQTFVTIG5vcm0gZm9vICdiYXInIGJhegotCTMgREFTSCBub3JtIGZvbyB4IGJhegotCTMgRVFBTCBub3JtIGZvbyB4IGJhegotCTMgUVNUTiBub3JtIGZvbyB4IGJhegotCTQgcGx1cyBwYXJuIGZvbyAgYmF6Ci0JNCBkYXNoIHBhcm4gZm9vIChiYXIpIGJhegotCTQgZXFhbCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk0IHFzdG4gcGFybiAtPiBlcnJvcgotCTQgUExVUyBwYXJuIGZvbyAgYmF6Ci0JNCBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegotCTQgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk0IFFTVE4gcGFybiAtPiBlcnJvcgotCTUgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKLQk1IGRhc2ggcGFybiBmb28gIGJhegotCTUgZXFhbCBwYXJuIGZvbyAgYmF6Ci0JNSBxc3RuIHBhcm4gZm9vICBiYXoKLQk1IFBMVVMgcGFybiBmb28gIGJhegotCTUgREFTSCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk1IEVRQUwgcGFybiBmb28gKGJhcikgYmF6Ci0JNSBRU1ROIHBhcm4gLT4gZXJyb3IKLQk2IHBsdXMgcGFybiBmb28gKGJhcikgYmF6Ci0JNiBkYXNoIHBhcm4gZm9vIHggYmF6Ci0JNiBlcWFsIHBhcm4gZm9vIHggYmF6Ci0JNiBxc3RuIHBhcm4gZm9vIHggYmF6Ci0JNiBQTFVTIHBhcm4gZm9vIChiYXIpIGJhegotCTYgREFTSCBwYXJuIGZvbyB4IGJhegotCTYgRVFBTCBwYXJuIGZvbyB4IGJhegotCTYgUVNUTiBwYXJuIGZvbyB4IGJhegotCTcgcGx1cyBicmFjIGZvbyAgYyB9IGJhegotCTcgZGFzaCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTcgZXFhbCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6Ci0JNyBxc3RuIGJyYWMgLT4gZXJyb3IKLQk3IFBMVVMgYnJhYyBmb28gIGMgfSBiYXoKLQk3IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk3IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegotCTcgUVNUTiBicmFjIC0+IGVycm9yCi0JOCBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOCBkYXNoIGJyYWMgZm9vICBjIH0gYmF6Ci0JOCBlcWFsIGJyYWMgZm9vICBjIH0gYmF6Ci0JOCBxc3RuIGJyYWMgZm9vICBjIH0gYmF6Ci0JOCBQTFVTIGJyYWMgZm9vICBjIH0gYmF6Ci0JOCBEQVNIIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOCBFUUFMIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKLQk4IFFTVE4gYnJhYyAtPiBlcnJvcgotCTkgcGx1cyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTkgZGFzaCBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBlcWFsIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IHFzdG4gYnJhYyBmb28geCBjIHh9IGJhegotCTkgUExVUyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegotCTkgREFTSCBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBFUUFMIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IFFTVE4gYnJhYyBmb28geCBjIHh9IGJhegotLS0tCi1uYW1lOiBleHBhbmQtdW5nbG9iLXVucQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZWd1bGFyICR7Zm9vK2Jhcn0gY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQotc3RkaW46Ci0JdT14Ci0JdGxfbm9ybSgpIHsKLQkJdj0kMgotCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2Ci0JCShlY2hvICQxIHBsdXMgbm9ybSBmb28gJHt2KydiYXInfSBiYXopCi0JCShlY2hvICQxIGRhc2ggbm9ybSBmb28gJHt2LSdiYXInfSBiYXopCi0JCShlY2hvICQxIGVxYWwgbm9ybSBmb28gJHt2PSdiYXInfSBiYXopCi0JCShlY2hvICQxIHFzdG4gbm9ybSBmb28gJHt2PydiYXInfSBiYXopIDI+Ji0gfHwgXAotCQkgICAgZWNobyAiJDEgcXN0biBub3JtIC0+IGVycm9yIgotCQkoZWNobyAkMSBQTFVTIG5vcm0gZm9vICR7djorJ2Jhcid9IGJheikKLQkJKGVjaG8gJDEgREFTSCBub3JtIGZvbyAke3Y6LSdiYXInfSBiYXopCi0JCShlY2hvICQxIEVRQUwgbm9ybSBmb28gJHt2Oj0nYmFyJ30gYmF6KQotCQkoZWNobyAkMSBRU1ROIG5vcm0gZm9vICR7djo/J2Jhcid9IGJheikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBRU1ROIG5vcm0gLT4gZXJyb3IiCi0JfQotCXRsX3BhcmVuKCkgewotCQl2PSQyCi0JCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKLQkJKGVjaG8gJDEgcGx1cyBwYXJuIGZvbyAke3YrXChiYXInKSd9IGJheikKLQkJKGVjaG8gJDEgZGFzaCBwYXJuIGZvbyAke3YtXChiYXInKSd9IGJheikKLQkJKGVjaG8gJDEgZXFhbCBwYXJuIGZvbyAke3Y9XChiYXInKSd9IGJheikKLQkJKGVjaG8gJDEgcXN0biBwYXJuIGZvbyAke3Y/XChiYXInKSd9IGJheikgMj4mLSB8fCBcCi0JCSAgICBlY2hvICIkMSBxc3RuIHBhcm4gLT4gZXJyb3IiCi0JCShlY2hvICQxIFBMVVMgcGFybiBmb28gJHt2OitcKGJhcicpJ30gYmF6KQotCQkoZWNobyAkMSBEQVNIIHBhcm4gZm9vICR7djotXChiYXInKSd9IGJheikKLQkJKGVjaG8gJDEgRVFBTCBwYXJuIGZvbyAke3Y6PVwoYmFyJyknfSBiYXopCi0JCShlY2hvICQxIFFTVE4gcGFybiBmb28gJHt2Oj9cKGJhcicpJ30gYmF6KSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gcGFybiAtPiBlcnJvciIKLQl9Ci0JdGxfYnJhY2UoKSB7Ci0JCXY9JDIKLQkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgotCQkoZWNobyAkMSBwbHVzIGJyYWMgZm9vICR7dithJHV7e3tcfWJ9IGMgJHt2K2R7fX0gYmF6KQotCQkoZWNobyAkMSBkYXNoIGJyYWMgZm9vICR7di1hJHV7e3tcfWJ9IGMgJHt2LWR7fX0gYmF6KQotCQkoZWNobyAkMSBlcWFsIGJyYWMgZm9vICR7dj1hJHV7e3tcfWJ9IGMgJHt2PWR7fX0gYmF6KQotCQkoZWNobyAkMSBxc3RuIGJyYWMgZm9vICR7dj9hJHV7e3tcfWJ9IGMgJHt2P2R7fX0gYmF6KSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIHFzdG4gYnJhYyAtPiBlcnJvciIKLQkJKGVjaG8gJDEgUExVUyBicmFjIGZvbyAke3Y6K2EkdXt7e1x9Yn0gYyAke3Y6K2R7fX0gYmF6KQotCQkoZWNobyAkMSBEQVNIIGJyYWMgZm9vICR7djotYSR1e3t7XH1ifSBjICR7djotZHt9fSBiYXopCi0JCShlY2hvICQxIEVRQUwgYnJhYyBmb28gJHt2Oj1hJHV7e3tcfWJ9IGMgJHt2Oj1ke319IGJheikKLQkJKGVjaG8gJDEgUVNUTiBicmFjIGZvbyAke3Y6P2EkdXt7e1x9Yn0gYyAke3Y6P2R7fX0gYmF6KSAyPiYtIHx8IFwKLQkJICAgIGVjaG8gIiQxIFFTVE4gYnJhYyAtPiBlcnJvciIKLQl9Ci0JdGxfbm9ybSAxIC0KLQl0bF9ub3JtIDIgJycKLQl0bF9ub3JtIDMgeAotCXRsX3BhcmVuIDQgLQotCXRsX3BhcmVuIDUgJycKLQl0bF9wYXJlbiA2IHgKLQl0bF9icmFjZSA3IC0KLQl0bF9icmFjZSA4ICcnCi0JdGxfYnJhY2UgOSB4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBwbHVzIG5vcm0gZm9vIGJhegotCTEgZGFzaCBub3JtIGZvbyBiYXIgYmF6Ci0JMSBlcWFsIG5vcm0gZm9vIGJhciBiYXoKLQkxIHFzdG4gbm9ybSAtPiBlcnJvcgotCTEgUExVUyBub3JtIGZvbyBiYXoKLQkxIERBU0ggbm9ybSBmb28gYmFyIGJhegotCTEgRVFBTCBub3JtIGZvbyBiYXIgYmF6Ci0JMSBRU1ROIG5vcm0gLT4gZXJyb3IKLQkyIHBsdXMgbm9ybSBmb28gYmFyIGJhegotCTIgZGFzaCBub3JtIGZvbyBiYXoKLQkyIGVxYWwgbm9ybSBmb28gYmF6Ci0JMiBxc3RuIG5vcm0gZm9vIGJhegotCTIgUExVUyBub3JtIGZvbyBiYXoKLQkyIERBU0ggbm9ybSBmb28gYmFyIGJhegotCTIgRVFBTCBub3JtIGZvbyBiYXIgYmF6Ci0JMiBRU1ROIG5vcm0gLT4gZXJyb3IKLQkzIHBsdXMgbm9ybSBmb28gYmFyIGJhegotCTMgZGFzaCBub3JtIGZvbyB4IGJhegotCTMgZXFhbCBub3JtIGZvbyB4IGJhegotCTMgcXN0biBub3JtIGZvbyB4IGJhegotCTMgUExVUyBub3JtIGZvbyBiYXIgYmF6Ci0JMyBEQVNIIG5vcm0gZm9vIHggYmF6Ci0JMyBFUUFMIG5vcm0gZm9vIHggYmF6Ci0JMyBRU1ROIG5vcm0gZm9vIHggYmF6Ci0JNCBwbHVzIHBhcm4gZm9vIGJhegotCTQgZGFzaCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk0IGVxYWwgcGFybiBmb28gKGJhcikgYmF6Ci0JNCBxc3RuIHBhcm4gLT4gZXJyb3IKLQk0IFBMVVMgcGFybiBmb28gYmF6Ci0JNCBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegotCTQgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk0IFFTVE4gcGFybiAtPiBlcnJvcgotCTUgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKLQk1IGRhc2ggcGFybiBmb28gYmF6Ci0JNSBlcWFsIHBhcm4gZm9vIGJhegotCTUgcXN0biBwYXJuIGZvbyBiYXoKLQk1IFBMVVMgcGFybiBmb28gYmF6Ci0JNSBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegotCTUgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKLQk1IFFTVE4gcGFybiAtPiBlcnJvcgotCTYgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKLQk2IGRhc2ggcGFybiBmb28geCBiYXoKLQk2IGVxYWwgcGFybiBmb28geCBiYXoKLQk2IHFzdG4gcGFybiBmb28geCBiYXoKLQk2IFBMVVMgcGFybiBmb28gKGJhcikgYmF6Ci0JNiBEQVNIIHBhcm4gZm9vIHggYmF6Ci0JNiBFUUFMIHBhcm4gZm9vIHggYmF6Ci0JNiBRU1ROIHBhcm4gZm9vIHggYmF6Ci0JNyBwbHVzIGJyYWMgZm9vIGMgfSBiYXoKLQk3IGRhc2ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk3IGVxYWwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegotCTcgcXN0biBicmFjIC0+IGVycm9yCi0JNyBQTFVTIGJyYWMgZm9vIGMgfSBiYXoKLQk3IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk3IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegotCTcgUVNUTiBicmFjIC0+IGVycm9yCi0JOCBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOCBkYXNoIGJyYWMgZm9vIGMgfSBiYXoKLQk4IGVxYWwgYnJhYyBmb28gYyB9IGJhegotCTggcXN0biBicmFjIGZvbyBjIH0gYmF6Ci0JOCBQTFVTIGJyYWMgZm9vIGMgfSBiYXoKLQk4IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKLQk4IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegotCTggUVNUTiBicmFjIC0+IGVycm9yCi0JOSBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOSBkYXNoIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IGVxYWwgYnJhYyBmb28geCBjIHh9IGJhegotCTkgcXN0biBicmFjIGZvbyB4IGMgeH0gYmF6Ci0JOSBQTFVTIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6Ci0JOSBEQVNIIGJyYWMgZm9vIHggYyB4fSBiYXoKLQk5IEVRQUwgYnJhYyBmb28geCBjIHh9IGJhegotCTkgUVNUTiBicmFjIGZvbyB4IGMgeH0gYmF6Ci0tLS0KLW5hbWU6IGVnbG9iLWJhZC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGdsb2JiaW5nIGlzbid0IGRvbmUgd2hlbiBnbG9iIGhhcyBzeW50YXggZXJyb3IKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN4IgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3oiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgotc3RkaW46Ci0JZWNobyAhKFsqKSoKLQllY2hvICsoYXxiWykqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JIShbKikqCi0JKyhhfGJbKSoKLS0tLQotbmFtZTogZWdsb2ItYmFkLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgotCShBVCZUIGtzaCBmYWlscyB0aGlzIHRlc3QpCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeCIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN6IgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKLXN0ZGluOgotCWVjaG8gW2EqKF0qKXoKLWV4cGVjdGVkLXN0ZG91dDoKLQlbYSooXSopegotLS0tCi1uYW1lOiBlZ2xvYi1pbmZpbml0ZS1wbHVzCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHNoZWxsIGRvZXNuJ3QgZ28gaW50byBpbmZpbml0ZSBsb29wIGV4cGFuZGluZyArKC4uLikKLQlleHByZXNzaW9ucy4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCi10aW1lLWxpbWl0OiAzCi1zdGRpbjoKLQllY2hvICsoKWMKLQllY2hvICsoKXgKLQllY2hvICsoKiljCi0JZWNobyArKCopeAotZXhwZWN0ZWQtc3Rkb3V0OgotCSsoKWMKLQkrKCl4Ci0JYWJjCi0JKygqKXgKLS0tLQotbmFtZTogZWdsb2Itc3Vic3QtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBlZ2xvYmJpbmcgaXNuJ3QgZG9uZSBvbiBzdWJzdGl0dXRpb24gcmVzdWx0cwotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKLXN0ZGluOgotCXg9J0AoKiknCi0JZWNobyAkeAotZXhwZWN0ZWQtc3Rkb3V0OgotCUAoKikKLS0tLQotbmFtZTogZWdsb2Itbm9tYXRjaC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2gKLXN0ZGluOgotCWVjaG8gMTogbm8tZmlsZSsoYXxiKXN0dWZmCi0JZWNobyAyOiBuby1maWxlKyhhKihjKXxiKXN0dWZmCi0JZWNobyAzOiBuby1maWxlKygoKChjKSkpfGIpc3R1ZmYKLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiBuby1maWxlKyhhfGIpc3R1ZmYKLQkyOiBuby1maWxlKyhhKihjKXxiKXN0dWZmCi0JMzogbm8tZmlsZSsoKCgoYykpKXxiKXN0dWZmCi0tLS0KLW5hbWU6IGVnbG9iLW1hdGNoLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHBhdHRlcm4gbWF0Y2hlcyBjb3JyZWN0bHkKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmQiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWNkIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYWMiCi1zdGRpbjoKLQllY2hvIDE6IGErKGJ8YylkCi0JZWNobyAyOiBhIShAKGJ8QikpZAotCWVjaG8gMzogKihhKGJ8YykpCQkjICguLi58Li4uKSBjYW4gYmUgdXNlZCB3aXRoaW4gWCguLikKLQllY2hvIDQ6IGFbYiooZm9vfGJhcildZAkJIyBwYXR0ZXJucyBub3Qgc3BlY2lhbCBpbnNpZGUgWy4uLl0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiBhYmQgYWNkCi0JMjogYWNkCi0JMzogYWJhYwotCTQ6IGFiZAotLS0tCi1uYW1lOiBlZ2xvYi1jYXNlLTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSBuZWdhdGlvbiB0ZXN0cwotc3RkaW46Ci0JY2FzZSBmb28gaW4gIShmb298YmFyKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYwotCWNhc2UgYmFyIGluICEoZm9vfGJhcikpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKLWV4cGVjdGVkLXN0ZG91dDoKLQlubwotCW5vCi0tLS0KLW5hbWU6IGVnbG9iLWNhc2UtMgotZGVzY3JpcHRpb246Ci0JU2ltcGxlIGtsZWVuZSB0ZXN0cwotc3RkaW46Ci0JY2FzZSBmb28gaW4gKihhfGJbKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYwotCWNhc2UgZm9vIGluICooYXxiWyl8ZiopIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKLQljYXNlICcqKGF8YlspJyBpbiAqKGF8YlspKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jbm8KLQl5ZXMKLQl5ZXMKLS0tLQotbmFtZTogZWdsb2ItdHJpbS0xCi1kZXNjcmlwdGlvbjoKLQlFZ2xvYmJpbmcgaW4gdHJpbSBleHByZXNzaW9ucy4uLgotCShBVCZUIGtzaCBmYWlscyB0aGlzIC0gZG9jcyBzYXkgIyBtYXRjaGVzIHNob3J0ZXN0IHN0cmluZywgIyMgbWF0Y2hlcwotCWxvbmdlc3QuLi4pCi1zdGRpbjoKLQl4PWFiY2RlZgotCWVjaG8gMTogJHt4I2F8YWJjfQotCWVjaG8gMjogJHt4IyNhfGFiY30KLQllY2hvIDM6ICR7eCVkZWZ8Zn0KLQllY2hvIDQ6ICR7eCUlZnxkZWZ9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMTogYmNkZWYKLQkyOiBkZWYKLQkzOiBhYmNkZQotCTQ6IGFiYwotLS0tCi1uYW1lOiBlZ2xvYi10cmltLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGVnbG9iYmluZyB3b3JrcyBpbiB0cmltcy4uLgotc3RkaW46Ci0JeD1hYmNkZWYKLQllY2hvIDE6ICR7eCMqKGF8YiljZH0KLQllY2hvIDI6ICIke3gjKihhfGIpY2R9IgotCWVjaG8gMzogJHt4IyIqKGF8YiljZCJ9Ci0JZWNobyA0OiAke3gjYShifGMpfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IGVmCi0JMjogZWYKLQkzOiBhYmNkZWYKLQk0OiBjZGVmCi0tLS0KLW5hbWU6IGVnbG9iLXN1YnN0cnBsLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGVnbG9iYmluZyB3b3JrcyBpbiBzdWJzdHMuLi4gYW5kIHRoZXkgd29yayBhdCBhbGwKLXN0ZGluOgotCVtbIC1uICRCQVNIX1ZFUlNJT04gXV0gJiYgc2hvcHQgLXMgZXh0Z2xvYgotCXg9MTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQl5PXh5egotCWVjaG8gMTogJHt4LzJ9Ci0JZWNobyAyOiAke3gvLzJ9Ci0JZWNobyAzOiAke3gvKygyKX0KLQllY2hvIDQ6ICR7eC8vKygyKX0KLQllY2hvIDU6ICR7eC8yLzR9Ci0JZWNobyA2OiAke3gvLzIvNH0KLQllY2hvIDc6ICR7eC8rKDIpLzR9Ci0JZWNobyA4OiAke3gvLysoMikvNH0KLQllY2hvIDk6ICR7eC9iL2MvZS9mfQotCWVjaG8gMTA6ICR7eC9iXC9jL2UvZn0KLQllY2hvIDExOiAke3gvYlwvYy9lXC9mfQotCWVjaG8gMTI6ICR7eC9iXC9jL2VcXC9mfQotCWVjaG8gMTM6ICR7eC9iXFwvYy9lXFwvZn0KLQllY2hvIDE0OiAke3gvL2IvYy9lL2Z9Ci0JZWNobyAxNTogJHt4Ly9iXC9jL2UvZn0KLQllY2hvIDE2OiAke3gvL2JcL2MvZVwvZn0KLQllY2hvIDE3OiAke3gvL2JcL2MvZVxcL2Z9Ci0JZWNobyAxODogJHt4Ly9iXFwvYy9lXFwvZn0KLQllY2hvIDE5OiAke3gvYlwvKlwvYy94fQotCWVjaG8gMjA6ICR7eC9cLy8ufQotCWVjaG8gMjE6ICR7eC8vXC8vLn0KLQllY2hvIDIyOiAke3gvLy8ufQotCWVjaG8gMjM6ICR7eC8vIzEvOX0KLQllY2hvIDI0OiAke3gvLyUxLzl9Ci0JZWNobyAyNTogJHt4Ly9cJTEvOX0KLQllY2hvIDI2OiAke3gvL1xcJTEvOX0KLQllY2hvIDI3OiAke3gvL1xhLzl9Ci0JZWNobyAyODogJHt4Ly9cXGEvOX0KLQllY2hvIDI5OiAke3gvMi8keX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiAxMjIzMjFfYWIvY2RlX2IvY18xMjIxCi0JMjogMTMxX2FiL2NkZV9iL2NfMTEKLQkzOiAxMzIxX2FiL2NkZV9iL2NfMTIyMQotCTQ6IDEzMV9hYi9jZGVfYi9jXzExCi0JNTogMTQyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQk2OiAxNDQ0MzQxX2FiL2NkZV9iL2NfMTQ0MQotCTc6IDE0MzIxX2FiL2NkZV9iL2NfMTIyMQotCTg6IDE0MzQxX2FiL2NkZV9iL2NfMTQxCi0JOTogMTIyMjMyMV9hYy9lL2YvY2RlX2IvY18xMjIxCi0JMTA6IDEyMjIzMjFfYWUvZmRlX2IvY18xMjIxCi0JMTE6IDEyMjIzMjFfYWUvZmRlX2IvY18xMjIxCi0JMTI6IDEyMjIzMjFfYWVcL2ZkZV9iL2NfMTIyMQotCTEzOiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQotCTE0OiAxMjIyMzIxX2FjL2UvZi9jZGVfYy9lL2YvY18xMjIxCi0JMTU6IDEyMjIzMjFfYWUvZmRlX2UvZl8xMjIxCi0JMTY6IDEyMjIzMjFfYWUvZmRlX2UvZl8xMjIxCi0JMTc6IDEyMjIzMjFfYWVcL2ZkZV9lXC9mXzEyMjEKLQkxODogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLQkxOTogMTIyMjMyMV9heF8xMjIxCi0JMjA6IDEyMjIzMjFfYWIuY2RlX2IvY18xMjIxCi0JMjE6IDEyMjIzMjFfYWIuY2RlX2IuY18xMjIxCi0JMjI6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCi0JMjM6IDkyMjIzMjFfYWIvY2RlX2IvY18xMjIxCi0JMjQ6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjI5Ci0JMjU6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjI5Ci0JMjY6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCi0JMjc6IDEyMjIzMjFfOWIvY2RlX2IvY18xMjIxCi0JMjg6IDEyMjIzMjFfOWIvY2RlX2IvY18xMjIxCi0JMjk6IDF4eXoyMjMyMV9hYi9jZGVfYi9jXzEyMjEKLS0tLQotbmFtZTogZWdsb2Itc3Vic3RycGwtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgYW5jaG9yZWQgc3Vic3RyaW5nIHJlcGxhY2VtZW50IHdvcmtzLCBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCWZvbz0xMjMKLQllY2hvIDE6ICR7Zm9vLyMveH0KLQllY2hvIDI6ICR7Zm9vLyUveH0KLQllY2hvIDM6ICR7Zm9vLyMvfQotCWVjaG8gNDogJHtmb28vI30KLQllY2hvIDU6ICR7Zm9vLyUvfQotCWVjaG8gNjogJHtmb28vJX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiB4MTIzCi0JMjogMTIzeAotCTM6IDEyMwotCTQ6IDEyMwotCTU6IDEyMwotCTY6IDEyMwotLS0tCi1uYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3Vic3RyaW5nIHJlcGxhY2VtZW50IHdvcmtzIHdpdGggdmFyaWFibGVzIGFuZCBzbGFzaGVzLCB0b28KLXN0ZGluOgotCXBmeD0vaG9tZS91c2VyCi0Jd2Q9L2hvbWUvdXNlci90bXAKLQllY2hvICIke3dkLyMkcGZ4L359IgotCWVjaG8gIiR7d2QvI1wkcGZ4L359IgotCWVjaG8gIiR7d2QvIyIkcGZ4Ii9+fSIKLQllY2hvICIke3dkLyMnJHBmeCcvfn0iCi0JZWNobyAiJHt3ZC8jIlwkcGZ4Ii9+fSIKLQllY2hvICIke3dkLyMnXCRwZngnL359IgotZXhwZWN0ZWQtc3Rkb3V0OgotCX4vdG1wCi0JL2hvbWUvdXNlci90bXAKLQl+L3RtcAotCS9ob21lL3VzZXIvdG1wCi0JL2hvbWUvdXNlci90bXAKLQkvaG9tZS91c2VyL3RtcAotLS0tCi1uYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYgotZGVzY3JpcHRpb246Ci0JTW9yZSBvZiB0aGlzLCBiYXNoIGZhaWxzIGl0IChiYXNoNCBwYXNzZXMpCi1zdGRpbjoKLQlwZng9L2hvbWUvdXNlcgotCXdkPS9ob21lL3VzZXIvdG1wCi0JZWNobyAiJHt3ZC8jJChlY2hvIC9ob21lL3VzZXIpL359IgotCWVjaG8gIiR7d2QvIyIkKGVjaG8gL2hvbWUvdXNlcikiL359IgotCWVjaG8gIiR7d2QvIyckKGVjaG8gL2hvbWUvdXNlciknL359IgotZXhwZWN0ZWQtc3Rkb3V0OgotCX4vdG1wCi0Jfi90bXAKLQkvaG9tZS91c2VyL3RtcAotLS0tCi1uYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYwotZGVzY3JpcHRpb246Ci0JRXZlbiBtb3JlIHdlaXJkIGNhc2VzCi1zdGRpbjoKLQlwZng9L2hvbWUvdXNlcgotCXdkPSckcGZ4L3RtcCcKLQllY2hvIDE6ICR7d2QvIyRwZngvfn0KLQllY2hvIDI6ICR7d2QvI1wkcGZ4L359Ci0JZWNobyAzOiAke3dkLyMiJHBmeCIvfn0KLQllY2hvIDQ6ICR7d2QvIyckcGZ4Jy9+fQotCWVjaG8gNTogJHt3ZC8jIlwkcGZ4Ii9+fQotCWVjaG8gNjogJHt3ZC8jJ1wkcGZ4Jy9+fQotCXRzPSdhL2JhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCknCi0JdHA9YS9iCi0JdHI9Yy9kCi0JW1sgLW4gJEJBU0hfVkVSU0lPTiBdXSAmJiBzaG9wdCAtcyBleHRnbG9iCi0JZWNobyA3OiAke3RzL2FcL2IvJHRyfQotCWVjaG8gODogJHt0cy9hXC9iL1wkdHJ9Ci0JZWNobyA5OiAke3RzLyR0cC8kdHJ9Ci0JZWNobyAxMDogJHt0cy9cJHRwLyR0cn0KLQllY2hvIDExOiAke3RzL1xcJHRwLyR0cn0KLQllY2hvIDEyOiAke3RzLyR0cC9jL2R9Ci0JZWNobyAxMzogJHt0cy8kdHAvY1wvZH0KLQllY2hvIDE0OiAke3RzLyR0cC9jXFwvZH0KLQllY2hvIDE1OiAke3RzLysoYVwvYikvJHRyfQotCWVjaG8gMTY6ICR7dHMvKyhhXC9iKS9cJHRyfQotCWVjaG8gMTc6ICR7dHMvKygkdHApLyR0cn0KLQllY2hvIDE4OiAke3RzLysoJHRwKS9jL2R9Ci0JZWNobyAxOTogJHt0cy8rKCR0cCkvY1wvZH0KLQllY2hvIDI1OiAke3RzLy9hXC9iLyR0cn0KLQllY2hvIDI2OiAke3RzLy9hXC9iL1wkdHJ9Ci0JZWNobyAyNzogJHt0cy8vJHRwLyR0cn0KLQllY2hvIDI4OiAke3RzLy8kdHAvYy9kfQotCWVjaG8gMjk6ICR7dHMvLyR0cC9jXC9kfQotCWVjaG8gMzA6ICR7dHMvLysoYVwvYikvJHRyfQotCWVjaG8gMzE6ICR7dHMvLysoYVwvYikvXCR0cn0KLQllY2hvIDMyOiAke3RzLy8rKCR0cCkvJHRyfQotCWVjaG8gMzM6ICR7dHMvLysoJHRwKS9jL2R9Ci0JZWNobyAzNDogJHt0cy8vKygkdHApL2NcL2R9Ci0JdHA9IisoJHRwKSIKLQllY2hvIDQwOiAke3RzLyR0cC8kdHJ9Ci0JZWNobyA0MTogJHt0cy8vJHRwLyR0cn0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiAkcGZ4L3RtcAotCTI6IH4vdG1wCi0JMzogJHBmeC90bXAKLQk0OiB+L3RtcAotCTU6IH4vdG1wCi0JNjogfi90bXAKLQk3OiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQk4OiAkdHJhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQk5OiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxMDogYS9iYS9iYy9kJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTE6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTEyOiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxMzogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTQ6IGNcL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxNTogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTY6ICR0ciR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTE3OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKLQkxODogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JMTk6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotCTI1OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLQkyNjogJHRyJHRyJHRwJHRwXyR0ciR0cF8qKCR0cilfKigkdHApCi0JMjc6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTI4OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLQkyOTogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0JMzA6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTMxOiAkdHIkdHAkdHBfJHRyJHRwXyooJHRyKV8qKCR0cCkKLQkzMjogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0JMzM6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQotCTM0OiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKLQk0MDogYS9iYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCi0JNDE6IGEvYmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotIwlUaGlzIGlzIHdoYXQgR05VIGJhc2ggZG9lczoKLSMJNDA6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQotIwk0MTogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCi0tLS0KLW5hbWU6IGVnbG9iLXV0ZjgtMQotZGVzY3JpcHRpb246Ci0JVVRGLTggbW9kZSBkaWZmZXJlbmNlcyBmb3IgZWdsb2JiaW5nCi1zdGRpbjoKLQlzPWJsw7ZkCi0Jc2V0ICtVCi0JcHJpbnQgMTogJHtzJT8/P30gLgotCXByaW50IDI6ICR7cy9iPz8/ZC94fSAuCi0Jc2V0IC1VCi0JcHJpbnQgMzogJHtzJT8/P30gLgotCXByaW50IDQ6ICR7cy9iPz9kL3h9IC4KLQl4PW7DtgotCXByaW50IDU6ICR7eCU/fSAke3glJT99IC4KLQl4PcOkaAotCXByaW50IDY6ICR7eCM/fSAke3gjIz99IC4KLQl4PYGCCi0JcHJpbnQgNzogJHt4JT99ICR7eCUlP30gLgotCXg9bcOkgAotCXByaW50IDg6ICR7eCU/fSAke3glJT99IC4KLQl4PeS9lQotCXByaW50IDk6ICR7eCU/fSAke3glJT99IC4KLWV4cGVjdGVkLXN0ZG91dDoKLQkxOiBibCAuCi0JMjogeCAuCi0JMzogYiAuCi0JNDogeCAuCi0JNTogbiBuIC4KLQk2OiBoIGggLgotCTc6IIEggSAuCi0JODogbcOkIG3DpCAuCi0JOTogLgotLS0tCi1uYW1lOiBnbG9iLWJhZC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGdsb2JiaW5nIGlzbid0IGRvbmUgd2hlbiBnbG9iIGhhcyBzeW50YXggZXJyb3IKLWZpbGUtc2V0dXA6IGRpciA3NTUgIlt4IgotZmlsZS1zZXR1cDogZmlsZSA2NDQgIlt4L2ZvbyIKLXN0ZGluOgotCWVjaG8gWyoKLQllY2hvICpbeAotCWVjaG8gW3gvKgotZXhwZWN0ZWQtc3Rkb3V0OgotCVsqCi0JKlt4Ci0JW3gvZm9vCi0tLS0KLW5hbWU6IGdsb2ItYmFkLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc3ltYm9saWMgbGlua3MgYXJlbid0IHN0YXQoKSdkCi1maWxlLXNldHVwOiBkaXIgNzU1ICJkaXIiCi1maWxlLXNldHVwOiBzeW1saW5rIDY0NCAiZGlyL2FiYyIKLQlub24tZXhpc3RlbnQtZmlsZQotc3RkaW46Ci0JZWNobyBkKi8qCi0JZWNobyBkKi9hYmMKLWV4cGVjdGVkLXN0ZG91dDoKLQlkaXIvYWJjCi0JZGlyL2FiYwotLS0tCi1uYW1lOiBnbG9iLXJhbmdlLTEKLWRlc2NyaXB0aW9uOgotCVRlc3QgcmFuZ2UgbWF0Y2hpbmcKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIuYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJjYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiLWJjIgotc3RkaW46Ci0JZWNobyBbYWItXSoKLQllY2hvIFstYWJdKgotCWVjaG8gWyEtYWJdKgotCWVjaG8gWyFhYl0qCi0JZWNobyBbXWFiXSoKLWV4cGVjdGVkLXN0ZG91dDoKLQktYmMgYWJjIGJiYwotCS1iYyBhYmMgYmJjCi0JY2JjCi0JLWJjIGNiYwotCWFiYyBiYmMKLS0tLQotbmFtZTogZ2xvYi1yYW5nZS0yCi1kZXNjcmlwdGlvbjoKLQlUZXN0IHJhbmdlIG1hdGNoaW5nCi0JKEFUJlQga3NoIGZhaWxzIHRoaXM7IFBPU0lYIHNheXMgaW52YWxpZCkKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCi1zdGRpbjoKLQllY2hvIFthLS1dKgotZXhwZWN0ZWQtc3Rkb3V0OgotCVthLS1dKgotLS0tCi1uYW1lOiBnbG9iLXJhbmdlLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZ2xvYmJpbmcgbWF0Y2hlcyB0aGUgcmlnaHQgdGhpbmdzLi4uCi0jIGJyZWFrcyBvbiBNYWMgT1NYIChIRlMrIG5vbi1zdGFuZGFyZCBVbmljb2RlIGNhbm9uaWNhbCBkZWNvbXBvc2l0aW9uKQotY2F0ZWdvcnk6ICFvczpkYXJ3aW4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhwmMiCi1zdGRpbjoKLQllY2hvIGFbwS3aXSoKLWV4cGVjdGVkLXN0ZG91dDoKLQlhwmMKLS0tLQotbmFtZTogZ2xvYi1yYW5nZS00Ci1kZXNjcmlwdGlvbjoKLQlSZXN1bHRzIHVuc3BlY2lmaWVkIGFjY29yZGluZyB0byBQT1NJWAotZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5iYyIKLXN0ZGluOgotCWVjaG8gW2EuXSoKLWV4cGVjdGVkLXN0ZG91dDoKLQlbYS5dKgotLS0tCi1uYW1lOiBnbG9iLXJhbmdlLTUKLWRlc2NyaXB0aW9uOgotCVJlc3VsdHMgdW5zcGVjaWZpZWQgYWNjb3JkaW5nIHRvIFBPU0lYCi0JKEFUJlQga3NoIHRyZWF0cyB0aGlzIGxpa2UgW2EtY2MtZV0qKQotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiY2JjIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImRiYyIKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlYmMiCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiLWJjIgotc3RkaW46Ci0JZWNobyBbYS1jLWVdKgotZXhwZWN0ZWQtc3Rkb3V0OgotCS1iYyBhYmMgYmJjIGNiYyBlYmMKLS0tLQotbmFtZTogaGVyZWRvYy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBvcmRlcmluZy9jb250ZW50IG9mIHJlZHVuZGVudCBoZXJlIGRvY3VtZW50cy4KLXN0ZGluOgotCWNhdCA8PCBFT0YxIDw8IEVPRjIKLQloaQotCUVPRjEKLQl0aGVyZQotCUVPRjIKLWV4cGVjdGVkLXN0ZG91dDoKLQl0aGVyZQotLS0tCi1uYW1lOiBoZXJlZG9jLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHF1b3RlZCBoZXJlLWRvYyBpcyBwcm90ZWN0ZWQuCi1zdGRpbjoKLQlhPWZvbwotCWNhdCA8PCAnRU9GJwotCWhpXAotCXRoZXJlJGEKLQlzdHVmZgotCUVPXAotCUYKLQlFT0YKLWV4cGVjdGVkLXN0ZG91dDoKLQloaVwKLQl0aGVyZSRhCi0Jc3R1ZmYKLQlFT1wKLQlGCi0tLS0KLW5hbWU6IGhlcmVkb2MtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBuZXdsaW5lIGlzbid0IG5lZWRlZCBhZnRlciBoZXJlZG9jLWRlbGltaXRlciBtYXJrZXIuCi1zdGRpbjogIQotCWNhdCA8PCBFT0YKLQloaQotCXRoZXJlCi0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQl0aGVyZQotLS0tCi1uYW1lOiBoZXJlZG9jLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBoZXJlZG9jLWRlbGltaXRlciBpcyBtaXNzaW5nLgotc3RkaW46ICEKLQljYXQgPDwgRU9GCi0JaGkKLQl0aGVyZQotZXhwZWN0ZWQtZXhpdDogZSA+IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLiovCi0tLS0KLW5hbWU6IGhlcmVkb2MtNQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBiYWNrc2xhc2ggcXVvdGVzIGEgJCwgYCBhbmQgXCBhbmQga2lsbHMgYSBcbmV3bGluZQotc3RkaW46Ci0JYT1CQUQKLQliPW9rCi0JY2F0IDw8IEVPRgotCWhcJHthfWkKLQloXFwke2J9aQotCXRoXGBlY2hvIG5vdC1ydW5cYGVyZQotCXRoXFxgZWNobyBpcy1ydW5gZXJlCi0JZm9sXFxrcwotCW1vcmVcXAotCWxhc3QgXAotCWxpbmUKLQlFT0YKLWV4cGVjdGVkLXN0ZG91dDoKLQloJHthfWkKLQloXG9raQotCXRoYGVjaG8gbm90LXJ1bmBlcmUKLQl0aFxpcy1ydW5lcmUKLQlmb2xca3MKLQltb3JlXAotCWxhc3QgbGluZQotLS0tCi1uYW1lOiBoZXJlZG9jLTYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgXG5ld2xpbmUgaW4gaW5pdGlhbCBoZXJlLWRlbGltIHdvcmQgZG9lc24ndCBpbXBseQotCWEgcXVvdGVkIGhlcmUtZG9jLgotc3RkaW46Ci0JYT1pCi0JY2F0IDw8IEVPXAotCUYKLQloJGEKLQl0aGVyZQotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JdGhlcmUKLS0tLQotbmFtZTogaGVyZWRvYy03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGRvdWJsZSBxdW90ZWQgJCBleHByZXNzaW9ucyBpbiBoZXJlIGRlbGltaXRlcnMgYXJlCi0Jbm90IGV4cGFuZGVkIGFuZCBtYXRjaCB0aGUgZGVsaW1pdGVyLgotCVBPU0lYIHNheXMgb25seSBxdW90ZSByZW1vdmFsIGlzIGFwcGxpZWQgdG8gdGhlIGRlbGltaXRlci4KLXN0ZGluOgotCWE9YgotCWNhdCA8PCAiRSRhIgotCWhpCi0JaCRhCi0JaGIKLQlFJGEKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWgkYQotCWhiCi0JZG9uZQotLS0tCi1uYW1lOiBoZXJlZG9jLTgKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZG91YmxlIHF1b3RlZCBlc2NhcGVkICQgZXhwcmVzc2lvbnMgaW4gaGVyZQotCWRlbGltaXRlcnMgYXJlIG5vdCBleHBhbmRlZCBhbmQgbWF0Y2ggdGhlIGRlbGltaXRlci4KLQlQT1NJWCBzYXlzIG9ubHkgcXVvdGUgcmVtb3ZhbCBpcyBhcHBsaWVkIHRvIHRoZSBkZWxpbWl0ZXIKLQkoXCBjb3VudHMgYXMgYSBxdW90ZSkuCi1zdGRpbjoKLQlhPWIKLQljYXQgPDwgIkVcJGEiCi0JaGkKLQloJGEKLQloXCRhCi0JaGIKLQloXGIKLQlFJGEKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWgkYQotCWhcJGEKLQloYgotCWhcYgotCWRvbmUKLS0tLQotbmFtZTogaGVyZWRvYy05YQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlIHN0cmluZ3Mgd29yay4KLXN0ZGluOgotCWJhcj0iYmFyCi0JCWJheiIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxmb28KLQkiJF9fcHJvZ25hbWUiIC1jICJ0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxmb28iCi0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8IiRiYXIiCi0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JyRiYXInCi0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8XCRiYXIKLQl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwtZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jc2JiCi0Jc2JiCi0Jb25lCi0JCW9ubQotCSRvbmUKLQkkb25lCi0JLXNiYgotLS0tCi1uYW1lOiBoZXJlZG9jLTliCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGEgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzIHdvcmtzIGxpa2UgYmFzaAotc3RkaW46Ci0JZm5vcmQ9NDIKLQliYXI9ImJhcgotCQkgXCRmbm9yZCBiYXoiCi0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JGJhcgotZXhwZWN0ZWQtc3Rkb3V0OgotCW9uZSAkc2FiZXEgb25tCi1jYXRlZ29yeTogYmFzaAotLS0tCi1uYW1lOiBoZXJlZG9jLTljCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGEgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzIHdvcmtzIGxpa2Uga3NoOTMsIHpzaAotc3RkaW46Ci0JZm5vcmQ9NDIKLQliYXI9ImJhcgotCQkgXCRmbm9yZCBiYXoiCi0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JGJhcgotZXhwZWN0ZWQtc3Rkb3V0OgotCW9uZQotCQkgJHNhYmVxIG9ubQotLS0tCi1uYW1lOiBoZXJlZG9jLTlkCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBhbm90aGVyIGNvcm5lciBjYXNlIG9mIGhlcmUgc3RyaW5ncwotc3RkaW46Ci0JdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8IGJhcgotZXhwZWN0ZWQtc3Rkb3V0OgotCW9uZQotLS0tCi1uYW1lOiBoZXJlZG9jLXF1b3RpbmctdW5zdWJzdAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgcXVvdGVkIGNoYXJhY3RlcnMgaW4KLQloZXJlIGRvY3VtZW50cyB3aXRob3V0IHN1YnN0aXR1dGlvbiAobWFya2VyIGlzIHF1b3RlZCkuCi1zdGRpbjoKLQlmb289YmFyCi0JY2F0IDw8LSdFT0YnCi0JCXggIiBcIiBcIFxcICQgXCQgYGVjaG8gYmF6YCBcYGVjaG8gYmF6XGAgJGZvbyBcJGZvbyB4Ci0JRU9GCi1leHBlY3RlZC1zdGRvdXQ6Ci0JeCAiIFwiIFwgXFwgJCBcJCBgZWNobyBiYXpgIFxgZWNobyBiYXpcYCAkZm9vIFwkZm9vIHgKLS0tLQotbmFtZTogaGVyZWRvYy1xdW90aW5nLXN1YnN0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBxdW90ZWQgY2hhcmFjdGVycyBpbgotCWhlcmUgZG9jdW1lbnRzIHdpdGggc3Vic3RpdHV0aW9uIChtYXJrZXIgaXMgbm90IHF1b3RlZCkuCi1zdGRpbjoKLQlmb289YmFyCi0JY2F0IDw8LUVPRgotCQl4ICIgXCIgXCBcXCAkIFwkIGBlY2hvIGJhemAgXGBlY2hvIGJhelxgICRmb28gXCRmb28geAotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCXggIiBcIiBcIFwgJCAkIGJheiBgZWNobyBiYXpgIGJhciAkZm9vIHgKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUhlcmVkb2MgaW4gc2ltcGxlIGNvbW1hbmQuCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCWV2YWwgJwotCQljYXQgPDwtIEVPRgotCQloaQotCQlFT0YKLQkJZm9yIGkgaW4gYSBiIDsgZG8KLQkJCWNhdCA8PC0gRU9GCi0JCQltb3JlCi0JCQlFT0YKLQkJZG9uZQotCSAgICAnICYKLQlzbGVlcCAxCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQltb3JlCi0JbW9yZQotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUhlcmVkb2MgaW4gZnVuY3Rpb24sIG11bHRpcGxlIGNhbGxzIHRvIGZ1bmN0aW9uLgotc3RkaW46Ci0JVE1QRElSPSRQV0QKLQlldmFsICcKLQkJZm9vKCkgewotCQkJY2F0IDw8LSBFT0YKLQkJCWhpCi0JCQlFT0YKLQkJfQotCQlmb28KLQkJZm9vCi0JICAgICcgJgotCXNsZWVwIDEKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWhpCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCi0JSGVyZWRvYyBpbiBmdW5jdGlvbiBpbiBsb29wLCBtdWx0aXBsZSBjYWxscyB0byBmdW5jdGlvbi4KLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JCWZvbygpIHsKLQkJCWNhdCA8PC0gRU9GCi0JCQloaQotCQkJRU9GCi0JCX0KLQkJZm9yIGkgaW4gYSBiOyBkbwotCQkJZm9vCi0JCQlmb28oKSB7Ci0JCQkJY2F0IDw8LSBFT0YKLQkJCQlmb2xrcyAkaQotCQkJCUVPRgotCQkJfQotCQlkb25lCi0JCWZvbwotCSAgICAnICYKLQlzbGVlcCAxCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQlmb2xrcyBiCi0JZm9sa3MgYgotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUJhY2tncm91bmRlZCBzaW1wbGUgY29tbWFuZCB3aXRoIGhlcmUgZG9jCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCWV2YWwgJwotCQljYXQgPDwtIEVPRiAmCi0JCWhpCi0JCUVPRgotCSAgICAnICYKLQlzbGVlcCAxCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQlMZWZ0IG92ZXJzOiAqCi0tLS0KLW5hbWU6IGhlcmVkb2MtdG1wZmlsZS01Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KLQlCYWNrZ3JvdW5kZWQgc3Vic2hlbGwgY29tbWFuZCB3aXRoIGhlcmUgZG9jCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCWV2YWwgJwotCSAgICAgICgKLQkJc2xlZXAgMQkjIHNvIHBhcmVudCBleGl0cwotCQllY2hvIEEKLQkJY2F0IDw8LSBFT0YKLQkJaGkKLQkJRU9GCi0JCWVjaG8gQgotCSAgICAgICkgJgotCSAgICAnICYKLQlzbGVlcCAyCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQQotCWhpCi0JQgotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGVyZWRvYy10bXBmaWxlLTYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgotCUhlcmVkb2MgaW4gcGlwZWxpbmUuCi1zdGRpbjoKLQlUTVBESVI9JFBXRAotCWV2YWwgJwotCQljYXQgPDwtIEVPRiB8IHNlZCAicy9oaS9ISS8iCi0JCWhpCi0JCUVPRgotCSAgICAnICYKLQlzbGVlcCAxCi0JZWNobyBMZWZ0IG92ZXJzOiAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JSEkKLQlMZWZ0IG92ZXJzOiAqCi0tLS0KLW5hbWU6IGhlcmVkb2MtdG1wZmlsZS03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KLQlIZXJlZG9jIGluIGJhY2tncm91bmRlZCBwaXBlbGluZS4KLXN0ZGluOgotCVRNUERJUj0kUFdECi0JZXZhbCAnCi0JCWNhdCA8PC0gRU9GIHwgc2VkICdzL2hpL0hJLycgJgotCQloaQotCQlFT0YKLQkgICAgJyAmCi0Jc2xlZXAgMQotCWVjaG8gTGVmdCBvdmVyczogKgotZXhwZWN0ZWQtc3Rkb3V0OgotCUhJCi0JTGVmdCBvdmVyczogKgotLS0tCi1uYW1lOiBoZXJlZG9jLXRtcGZpbGUtOAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vCi0JbGF0ZS4gSGVyZWRvYyBpbiBmdW5jdGlvbiwgYmFja2dyb3VuZGVkIGNhbGwgdG8gZnVuY3Rpb24uCi0JVGhpcyBjaGVjayBjYW4gZmFpbCBvbiBzbG93IG1hY2hpbmVzICg8MTAwIE1IeiksIG9yIEN5Z3dpbiwKLQl0aGF0J3Mgbm9ybWFsLgotc3RkaW46Ci0JVE1QRElSPSRQV0QKLQkjIEJhY2tncm91bmQgZXZhbCBzbyBtYWluIHNoZWxsIGRvZXNuJ3QgZG8gcGFyc2luZwotCWV2YWwgJwotCQlmb28oKSB7Ci0JCQljYXQgPDwtIEVPRgotCQkJaGkKLQkJCUVPRgotCQl9Ci0JCWZvbwotCQkjIHNsZWVwIHNvIGV2YWwgY2FuIGRpZQotCQkoc2xlZXAgMTsgZm9vKSAmCi0JCShzbGVlcCAxOyBmb28pICYKLQkJZm9vCi0JICAgICcgJgotCXNsZWVwIDIKLQllY2hvIExlZnQgb3ZlcnM6ICoKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCWhpCi0JaGkKLQloaQotCUxlZnQgb3ZlcnM6ICoKLS0tLQotbmFtZTogaGlzdG9yeS1iYXNpYwotZGVzY3JpcHRpb246Ci0JU2VlIGlmIHdlIGNhbiB0ZXN0IGhpc3RvcnkgYXQgYWxsCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGhpCi0JZmMgLWwKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotCTEJZWNobyBoaQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZHVwcwotZGVzY3JpcHRpb246Ci0JVmVyaWZ5IGR1cGxpY2F0ZXMgYW5kIHNwYWNlcyBhcmUgbm90IGVudGVyZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gaGkKLQkgZWNobyB5bwotCWVjaG8gaGkKLQlmYyAtbAotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JeW8KLQloaQotCTEJZWNobyBoaQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktdW5saW5rCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBicm9rZW4gSElTVEZJTEVzIGRvIG5vdCBjYXVzZSB0cm91YmxlCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1mb28vaGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotZmlsZS1zZXR1cDogZGlyIDc1NSAiZm9vIgotZmlsZS1zZXR1cDogZmlsZSA2NDQgImZvby9oaXN0LmZpbGUiCi0Jc29tZXRleHQKLXRpbWUtbGltaXQ6IDUKLXBlcmwtc2V0dXA6IGNobW9kKDA1NTUsICJmb28iKTsKLXN0ZGluOgotCWVjaG8gaGkKLQlmYyAtbAotCWNobW9kIDA3NTUgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQkxCWVjaG8gaGkKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8oLipjYW5ub3QgdW5saW5rIEhJU1RGSUxFLipcbik/WCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWUtbWludXMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgbW9yZSByZWNlbnQgY29tbWFuZCBpcyBleGVjdXRlZAotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBoaQotCWVjaG8gdGhlcmUKLQlmYyAtZSAtCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQl0aGVyZQotCXRoZXJlCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyB0aGVyZVxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWUtbWludXMtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCByZXBlYXRlZCBjb21tYW5kIGlzIHByaW50ZWQgYmVmb3JlIGNvbW1hbmQKLQlpcyByZS1leGVjdXRlZC4KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWV4ZWMgMj4mMQotCWVjaG8gaGkKLQllY2hvIHRoZXJlCi0JZmMgLWUgLQotZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46Ci0JL1gqaGlcblgqdGhlcmVcblgqZWNobyB0aGVyZVxudGhlcmVcblgqLwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZS1taW51cy0zCi1kZXNjcmlwdGlvbjoKLQlmYyAtZSAtIGZhaWxzIHdoZW4gdGhlcmUgaXMgbm8gaGlzdG9yeQotCShrc2g5MyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgdGhpcyB0byBmYWlsKQotCShrc2g4OCBsb29wcyBvbiB0aGlzKQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZmMgLWUgLQotCWVjaG8gb2sKLWV4cGVjdGVkLXN0ZG91dDoKLQlvawotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKi4qOi4qaGlzdG9yeS4qXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZS1taW51cy00Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiAiZmMgLWUgLSIgY29tbWFuZCBvdXRwdXQgZ29lcyB0byBzdGRvdXQuCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYwotCWZjIC1lIC0gfCAocmVhZCB4OyBlY2hvICJBICR4IikKLQllY2hvIG9rCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjCi0JQSBhYmMKLQlvawotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gYWJjXG5YKi8KLS0tLQotbmFtZTogaGlzdG9yeS1lLW1pbnVzLTUKLWRlc2NyaXB0aW9uOgotCWZjIGlzIHJlcGxhY2VkIGluIGhpc3RvcnkgYnkgbmV3IGNvbW1hbmQuCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQllY2hvIGdoaSBqa2wKLQk6Ci0JZmMgLWUgLSBlY2hvCi0JZmMgLWwgMiA1Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCWdoaSBqa2wKLQlnaGkgamtsCi0JMgllY2hvIGdoaSBqa2wKLQkzCToKLQk0CWVjaG8gZ2hpIGprbAotCTUJZmMgLWwgMiA1Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBnaGkgamtsXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC0xCi1kZXNjcmlwdGlvbjoKLQlMaXN0IGxpc3RzIGNvcnJlY3QgcmFuZ2UKLQkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZmMgLWwgLS0gLTIKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQkyCWVjaG8gbGluZSAyCi0JMwllY2hvIGxpbmUgMwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC0yCi1kZXNjcmlwdGlvbjoKLQlMaXN0cyBvbGRlc3QgaGlzdG9yeSBpZiBnaXZlbiBwcmUtaGlzdG9yaWMgbnVtYmVyCi0JKGtzaDkzIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyB0aGlzIHRvIGZhaWwpCi0JKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWZjIC1sIC0tIC00MAotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCTEJZWNobyBsaW5lIDEKLQkyCWVjaG8gbGluZSAyCi0JMwllY2hvIGxpbmUgMwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC0zCi1kZXNjcmlwdGlvbjoKLQlDYW4gZ2l2ZSBudW1iZXIgJ29wdGlvbnMnIHRvIGZjCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWZjIC1sIC0zIC0yCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyCi0JbGluZSAzCi0JbGluZSA0Ci0JMgllY2hvIGxpbmUgMgotCTMJZWNobyBsaW5lIDMKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWxpc3QtNAotZGVzY3JpcHRpb246Ci0JLTEgcmVmZXJzIHRvIHByZXZpb3VzIGNvbW1hbmQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZmMgLWwgLTEgLTEKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQk0CWVjaG8gbGluZSA0Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LTUKLWRlc2NyaXB0aW9uOgotCUxpc3QgY29tbWFuZCBzdGF5cyBpbiBoaXN0b3J5Ci1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWZjIC1sIC0xIC0xCi0JZmMgLWwgLTIgLTEKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQk0CWVjaG8gbGluZSA0Ci0JNAllY2hvIGxpbmUgNAotCTUJZmMgLWwgLTEgLTEKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWxpc3QtNgotZGVzY3JpcHRpb246Ci0JSElTVFNJWkUgbGltaXRzIGFib3V0IG9mIGhpc3Rvcnkga2VwdC4KLQkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIUhJU1RTSVpFPTMhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWVjaG8gbGluZSA1Ci0JZmMgLWwKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQlsaW5lIDUKLQk0CWVjaG8gbGluZSA0Ci0JNQllY2hvIGxpbmUgNQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC03Ci1kZXNjcmlwdGlvbjoKLQlmYyBhbGxvd3MgdG9vIG9sZC9uZXcgZXJyb3JzIGluIHJhbmdlIHNwZWNpZmljYXRpb24KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSFISVNUU0laRT0zIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQllY2hvIGxpbmUgNQotCWZjIC1sIDEgMzAKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIKLQlsaW5lIDMKLQlsaW5lIDQKLQlsaW5lIDUKLQk0CWVjaG8gbGluZSA0Ci0JNQllY2hvIGxpbmUgNQotCTYJZmMgLWwgMSAzMAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC1yLTEKLWRlc2NyaXB0aW9uOgotCXRlc3QgLXIgZmxhZyBpbiBoaXN0b3J5Ci1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyCi0JZWNobyBsaW5lIDMKLQllY2hvIGxpbmUgNAotCWVjaG8gbGluZSA1Ci0JZmMgLWwgLXIgMiA0Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyCi0JbGluZSAzCi0JbGluZSA0Ci0JbGluZSA1Ci0JNAllY2hvIGxpbmUgNAotCTMJZWNobyBsaW5lIDMKLQkyCWVjaG8gbGluZSAyCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1saXN0LXItMgotZGVzY3JpcHRpb246Ci0JSWYgZmlyc3QgaXMgbmV3ZXIgdGhhbiBsYXN0LCAtciBpcyBpbXBsaWVkLgotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQllY2hvIGxpbmUgNQotCWZjIC1sIDQgMgotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCWxpbmUgNQotCTQJZWNobyBsaW5lIDQKLQkzCWVjaG8gbGluZSAzCi0JMgllY2hvIGxpbmUgMgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktbGlzdC1yLTMKLWRlc2NyaXB0aW9uOgotCUlmIGZpcnN0IGlzIG5ld2VyIHRoYW4gbGFzdCwgLXIgaXMgY2FuY2VsbGVkLgotYXJndW1lbnRzOiAhLWkhCi1lbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZWNobyBsaW5lIDEKLQllY2hvIGxpbmUgMgotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQllY2hvIGxpbmUgNQotCWZjIC1sIC1yIDQgMgotZXhwZWN0ZWQtc3Rkb3V0OgotCWxpbmUgMQotCWxpbmUgMgotCWxpbmUgMwotCWxpbmUgNAotCWxpbmUgNQotCTIJZWNobyBsaW5lIDIKLQkzCWVjaG8gbGluZSAzCi0JNAllY2hvIGxpbmUgNAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IGhpc3Rvcnktc3Vic3QtMQotZGVzY3JpcHRpb246Ci0JQmFzaWMgc3Vic3RpdHV0aW9uCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQllY2hvIGdoaSBqa2wKLQlmYyAtZSAtIGFiYz1BQiAnZWNobyBhJwotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYKLQlnaGkgamtsCi0JQUIgZGVmCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBBQiBkZWZcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1zdWJzdC0yCi1kZXNjcmlwdGlvbjoKLQlEb2VzIHN1YnN0IGZpbmQgcHJldmlvdXMgY29tbWFuZD8KLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWVjaG8gZ2hpIGprbAotCWZjIC1lIC0gamtsPVhZWlFSVCAnZWNobyBnJwotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYKLQlnaGkgamtsCi0JZ2hpIFhZWlFSVAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gZ2hpIFhZWlFSVFxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LXN1YnN0LTMKLWRlc2NyaXB0aW9uOgotCURvZXMgc3Vic3QgZmluZCBwcmV2aW91cyBjb21tYW5kIHdoZW4gbm8gYXJndW1lbnRzIGdpdmVuCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQllY2hvIGdoaSBqa2wKLQlmYyAtZSAtIGprbD1YWVpRUlQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JZ2hpIGprbAotCWdoaSBYWVpRUlQKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIGdoaSBYWVpRUlRcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1zdWJzdC00Ci1kZXNjcmlwdGlvbjoKLQlHbG9iYWwgc3Vic3RpdHV0aW9ucyB3b3JrCi0JKGtzaDg4IGFuZCBrc2g5MyBkbyBub3QgaGF2ZSAtZyBvcHRpb24pCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYgYXNqaiBzYWRqaGFzZGpoIGFzZGpoYXNkCi0JZmMgLWUgLSAtZyBhPUZvb0JBUgotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYgYXNqaiBzYWRqaGFzZGpoIGFzZGpoYXNkCi0JRm9vQkFSYmMgZGVmIEZvb0JBUnNqaiBzRm9vQkFSZGpoRm9vQkFSc2RqaCBGb29CQVJzZGpoRm9vQkFSc2QKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIEZvb0JBUmJjIGRlZiBGb29CQVJzamogc0Zvb0JBUmRqaEZvb0JBUnNkamggRm9vQkFSc2RqaEZvb0JBUnNkXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3Rvcnktc3Vic3QtNQotZGVzY3JpcHRpb246Ci0JTWFrZSBzdXJlIHNlYXJjaGVzIGRvbid0IGZpbmQgY3VycmVudCAoZmMpIGNvbW1hbmQKLQkoa3NoODgva3NoOTMgZG9uJ3QgaGF2ZSB0aGUgPyBwcmVmaXggdGhpbmcgc28gdGhleSBmYWlsIHRoaXMgdGVzdCkKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWVjaG8gZ2hpIGprbAotCWZjIC1lIC0gYWJjPUFCIFw/YWJjCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCWdoaSBqa2wKLQlBQiBkZWYKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIEFCIGRlZlxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWVkLTEtb2xkCi1kZXNjcmlwdGlvbjoKLQlCYXNpYyAoZWQpIGVkaXRpbmcgd29ya3MgKGFzc3VtZXMgeW91IGhhdmUgZ2VuZXJpYyBlZCBlZGl0b3IKLQl0aGF0IHByaW50cyBubyBwcm9tcHRzKS4gVGhpcyBpcyBmb3Igb2xkaXNoIGVkKDEpIHdoaWNoIHdyaXRlCi0JdGhlIGNoYXJhY3RlciBjb3VudCB0byBzdGRvdXQuCi1jYXRlZ29yeTogc3Rkb3V0LWVkCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQlmYyBlY2hvCi0Jcy9hYmMvRk9PQkFSLwotCXcKLQlxCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCTEzCi0JMTYKLQlGT09CQVIgZGVmCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXlgqZWNobyBGT09CQVIgZGVmXG5YKiQvCi0tLS0KLW5hbWU6IGhpc3RvcnktZWQtMi1vbGQKLWRlc2NyaXB0aW9uOgotCUNvcnJlY3QgY29tbWFuZCBpcyBlZGl0ZWQgd2hlbiBudW1iZXIgZ2l2ZW4KLWNhdGVnb3J5OiBzdGRvdXQtZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gbGluZSAxCi0JZWNobyBsaW5lIDIgaXMgaGVyZQotCWVjaG8gbGluZSAzCi0JZWNobyBsaW5lIDQKLQlmYyAyCi0Jcy9pcyBoZXJlL2lzIGNoYW5nZWQvCi0JdwotCXEKLWV4cGVjdGVkLXN0ZG91dDoKLQlsaW5lIDEKLQlsaW5lIDIgaXMgaGVyZQotCWxpbmUgMwotCWxpbmUgNAotCTIwCi0JMjMKLQlsaW5lIDIgaXMgY2hhbmdlZAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKmVjaG8gbGluZSAyIGlzIGNoYW5nZWRcblgqJC8KLS0tLQotbmFtZTogaGlzdG9yeS1lZC0zLW9sZAotZGVzY3JpcHRpb246Ci0JTmV3bHkgY3JlYXRlZCBtdWx0aSBsaW5lIGNvbW1hbmRzIHNob3cgdXAgYXMgc2luZ2xlIGNvbW1hbmQKLQlpbiBoaXN0b3J5LgotCShOT1RFOiBhZGp1c3RlZCBmb3IgQ09NUExFWCBISVNUT1JZIGNvbXBpbGUgdGltZSBvcHRpb24pCi0JKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKLWNhdGVnb3J5OiBzdGRvdXQtZWQKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWVjaG8gYWJjIGRlZgotCWZjIGVjaG8KLQlzL2FiYy9GT09CQVIvCi0JJGEKLQllY2hvIGEgbmV3IGxpbmUKLQkuCi0JdwotCXEKLQlmYyAtbAotZXhwZWN0ZWQtc3Rkb3V0OgotCWFiYyBkZWYKLQkxMwotCTMyCi0JRk9PQkFSIGRlZgotCWEgbmV3IGxpbmUKLQkxCWVjaG8gYWJjIGRlZgotCTIJZWNobyBGT09CQVIgZGVmCi0JMwllY2hvIGEgbmV3IGxpbmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCplY2hvIEZPT0JBUiBkZWZcbmVjaG8gYSBuZXcgbGluZVxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWVkLTEKLWRlc2NyaXB0aW9uOgotCUJhc2ljIChlZCkgZWRpdGluZyB3b3JrcyAoYXNzdW1lcyB5b3UgaGF2ZSBnZW5lcmljIGVkIGVkaXRvcgotCXRoYXQgcHJpbnRzIG5vIHByb21wdHMpLiBUaGlzIGlzIGZvciBuZXdpc2ggZWQoMSkgYW5kIHN0ZGVyci4KLWNhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQlmYyBlY2hvCi0Jcy9hYmMvRk9PQkFSLwotCXcKLQlxCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjIGRlZgotCUZPT0JBUiBkZWYKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCoxM1xuMTZcbmVjaG8gRk9PQkFSIGRlZlxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWVkLTIKLWRlc2NyaXB0aW9uOgotCUNvcnJlY3QgY29tbWFuZCBpcyBlZGl0ZWQgd2hlbiBudW1iZXIgZ2l2ZW4KLWNhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGxpbmUgMQotCWVjaG8gbGluZSAyIGlzIGhlcmUKLQllY2hvIGxpbmUgMwotCWVjaG8gbGluZSA0Ci0JZmMgMgotCXMvaXMgaGVyZS9pcyBjaGFuZ2VkLwotCXcKLQlxCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxCi0JbGluZSAyIGlzIGhlcmUKLQlsaW5lIDMKLQlsaW5lIDQKLQlsaW5lIDIgaXMgY2hhbmdlZAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKjIwXG4yM1xuZWNobyBsaW5lIDIgaXMgY2hhbmdlZFxuWCokLwotLS0tCi1uYW1lOiBoaXN0b3J5LWVkLTMKLWRlc2NyaXB0aW9uOgotCU5ld2x5IGNyZWF0ZWQgbXVsdGkgbGluZSBjb21tYW5kcyBzaG93IHVwIGFzIHNpbmdsZSBjb21tYW5kCi0JaW4gaGlzdG9yeS4KLWNhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCi1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgotCVBTMT1YCi1zdGRpbjoKLQllY2hvIGFiYyBkZWYKLQlmYyBlY2hvCi0Jcy9hYmMvRk9PQkFSLwotCSRhCi0JZWNobyBhIG5ldyBsaW5lCi0JLgotCXcKLQlxCi0JZmMgLWwKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYmMgZGVmCi0JRk9PQkFSIGRlZgotCWEgbmV3IGxpbmUKLQkxCWVjaG8gYWJjIGRlZgotCTIJZWNobyBGT09CQVIgZGVmCi0JMwllY2hvIGEgbmV3IGxpbmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9eWCoxM1xuMzJcbmVjaG8gRk9PQkFSIGRlZlxuZWNobyBhIG5ldyBsaW5lXG5YKiQvCi0tLS0KLW5hbWU6IElGUy1zcGFjZS0xCi1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgZGVmYXVsdCBJRlMKLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0Jc2V0IC0tIEEgQiBDCi0Jc2hvd2FyZ3MgMSAkKgotCXNob3dhcmdzIDIgIiQqIgotCXNob3dhcmdzIDMgJEAKLQlzaG93YXJncyA0ICIkQCIKLWV4cGVjdGVkLXN0ZG91dDoKLQkgPDE+IDxBPiA8Qj4gPEM+Ci0JIDwyPiA8QSBCIEM+Ci0JIDwzPiA8QT4gPEI+IDxDPgotCSA8ND4gPEE+IDxCPiA8Qz4KLS0tLQotbmFtZTogSUZTLWNvbG9uLTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBJRlM9Ogotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlJRlM9OgotCXNldCAtLSBBIEIgQwotCXNob3dhcmdzIDEgJCoKLQlzaG93YXJncyAyICIkKiIKLQlzaG93YXJncyAzICRACi0Jc2hvd2FyZ3MgNCAiJEAiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JIDwxPiA8QT4gPEI+IDxDPgotCSA8Mj4gPEE6QjpDPgotCSA8Mz4gPEE+IDxCPiA8Qz4KLQkgPDQ+IDxBPiA8Qj4gPEM+Ci0tLS0KLW5hbWU6IElGUy1udWxsLTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBJRlM9IiIKLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIiCi0Jc2V0IC0tIEEgQiBDCi0Jc2hvd2FyZ3MgMSAkKgotCXNob3dhcmdzIDIgIiQqIgotCXNob3dhcmdzIDMgJEAKLQlzaG93YXJncyA0ICIkQCIKLWV4cGVjdGVkLXN0ZG91dDoKLQkgPDE+IDxBIEIgQz4KLQkgPDI+IDxBQkM+Ci0JIDwzPiA8QSBCIEM+Ci0JIDw0PiA8QSBCIEM+Ci0tLS0KLW5hbWU6IElGUy1zcGFjZS1jb2xvbi0xCi1kZXNjcmlwdGlvbjoKLQlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46Ci1zdGRpbjoKLQlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQotCUlGUz0iJElGUzoiCi0Jc2V0IC0tCi0Jc2hvd2FyZ3MgMSAkKgotCXNob3dhcmdzIDIgIiQqIgotCXNob3dhcmdzIDMgJEAKLQlzaG93YXJncyA0ICIkQCIKLQlzaG93YXJncyA1IDogIiRAIgotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8MT4KLQkgPDI+IDw+Ci0JIDwzPgotCSA8ND4KLQkgPDU+IDw6PgotLS0tCi1uYW1lOiBJRlMtc3BhY2UtY29sb24tMgotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgotCUFUJlQga3NoIGZhaWxzIHRoaXMsIFBPU0lYIHNheXMgdGhlIHRlc3QgaXMgY29ycmVjdC4KLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIkSUZTOiIKLQlzZXQgLS0KLQlzaG93YXJncyA6IiRAIgotZXhwZWN0ZWQtc3Rkb3V0OgotCSA8Oj4KLS0tLQotbmFtZTogSUZTLXNwYWNlLWNvbG9uLTMKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKLQlwZGtzaCBmYWlscyBib3RoIG9mIHRoZXNlIHRlc3RzCi0Jbm90IHN1cmUgd2hldGhlciAjMiBpcyBjb3JyZWN0Ci1zdGRpbjoKLQlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQotCUlGUz0iJElGUzoiCi0JeD0KLQlzZXQgLS0KLQlzaG93YXJncyAiJHgkQCIgMQotCXNob3dhcmdzICIkQCR4IiAyCi1leHBlY3RlZC1mYWlsOiB5ZXMKLWV4cGVjdGVkLXN0ZG91dDoKLQkgPD4gPDE+Ci0JIDw+IDwyPgotLS0tCi1uYW1lOiBJRlMtc3BhY2UtY29sb24tNAotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+Ogotc3RkaW46Ci0Jc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KLQlJRlM9IiRJRlM6IgotCXNldCAtLQotCXNob3dhcmdzICIkQCRAIgotZXhwZWN0ZWQtc3Rkb3V0OgotCQotLS0tCi1uYW1lOiBJRlMtc3BhY2UtY29sb24tNQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgotCURvbid0IGtub3cgd2hhdCBQT1NJWCB0aGlua3Mgb2YgdGhpcy4gIEFUJlQga3NoIGRvZXMgbm90IGRvIHRoaXMuCi1zdGRpbjoKLQlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQotCUlGUz0iJElGUzoiCi0Jc2V0IC0tCi0Jc2hvd2FyZ3MgIiR7QDotfSIKLWV4cGVjdGVkLXN0ZG91dDoKLQkgPD4KLS0tLQotbmFtZTogSUZTLXN1YnN0LTEKLWRlc2NyaXB0aW9uOgotCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKLXN0ZGluOgotCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9Ci0JSUZTPSIkSUZTOiIKLQl4PSI6YjogOiIKLQllY2hvIC1uICcxOic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KLQllY2hvIC1uICcyOic7IGZvciBpIGluIDpiOjogOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCXNob3dhcmdzIDMgJHgKLQlzaG93YXJncyA0IDpiOjoKLQl4PSJhOmI6IgotCWVjaG8gLW4gJzU6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCXNob3dhcmdzIDYgJHgKLQl4PSJhOjpjIgotCWVjaG8gLW4gJzc6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobwotCXNob3dhcmdzIDggJHgKLQllY2hvIC1uICc5Oic7IGZvciBpIGluICR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KLQlzaG93YXJncyAxMCAke0ZPTy1gZWNobyAtbiBoOmlgdGg6ZXJlfQotCXNob3dhcmdzIDExICIke0ZPTy1gZWNobyAtbiBoOmlgdGg6ZXJlfSIKLQl4PSIgQSA6ICBCOjpEIgotCWVjaG8gLW4gJzEyOic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KLQlzaG93YXJncyAxMyAkeAotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IFtdIFtiXSBbXQotCTI6IFs6Yjo6XQotCSA8Mz4gPD4gPGI+IDw+Ci0JIDw0PiA8OmI6Oj4KLQk1OiBbYV0gW2JdCi0JIDw2PiA8YT4gPGI+Ci0JNzogW2FdIFtdIFtjXQotCSA8OD4gPGE+IDw+IDxjPgotCTk6IFtoXSBbaXRoXSBbZXJlXQotCSA8MTA+IDxoPiA8aXRoPiA8ZXJlPgotCSA8MTE+IDxoOml0aDplcmU+Ci0JMTI6IFtBXSBbQl0gW10gW0RdCi0JIDwxMz4gPEE+IDxCPiA8PiA8RD4KLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLWVyci0xCi1kZXNjcmlwdGlvbjoKLQlDYW4ndCBoYXZlIDAgYmFzZSAoY2F1c2VzIHNoZWxsIHRvIGV4aXQpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLXN0ZGluOgotCXR5cGVzZXQgLWkgaQotCWk9MwotCWk9MCM0Ci0JZWNobyAkaQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL14uKjouKjAjNC4qXG4kLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTIKLWRlc2NyaXB0aW9uOgotCUNhbid0IGhhdmUgbXVsdGlwbGUgYmFzZXMgaW4gYSAnY29uc3RhbnQnIChjYXVzZXMgc2hlbGwgdG8gZXhpdCkKLQkoa3NoODggZmFpbHMgdGhpcyB0ZXN0KQotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1zdGRpbjoKLQl0eXBlc2V0IC1pIGkKLQlpPTMKLQlpPTIjMTEwIzExCi0JZWNobyAkaQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL14uKjouKjIjMTEwIzExLipcbiQvCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1lcnItMwotZGVzY3JpcHRpb246Ci0JU3ludGF4IGVycm9ycyBpbiBleHByZXNzaW9ucyBhbmQgZWZmZWN0cyBvbiBiYXNlcwotCShpbnRlcmFjdGl2ZSBzbyBlcnJvcnMgZG9uJ3QgY2F1c2UgZXhpdHMpCi0JKGtzaDg4IGZhaWxzIHRoaXMgdGVzdCAtIHNoZWxsIGV4aXRzLCBldmVuIHdpdGggLWkpCi1hcmd1bWVudHM6ICEtaSEKLXN0ZGluOgotCVBTMT0gIyBtaW5pbWlzZSBwcm9tcHQgaGFzc2xlcwotCXR5cGVzZXQgLWk0IGE9MTAKLQl0eXBlc2V0IC1pIGE9MisKLQllY2hvICRhCi0JdHlwZXNldCAtaTQgYT0xMAotCXR5cGVzZXQgLWkyIGE9MisKLQllY2hvICRhCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXihbI1wkXSApPy4qOi4qMisuKlxuLio6LioyKy4qXG4kLwotZXhwZWN0ZWQtc3Rkb3V0OgotCTQjMjIKLQk0IzIyCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1lcnItNAotZGVzY3JpcHRpb246Ci0JQXJlIGludmFsaWQgZGlnaXRzIChhY2NvcmRpbmcgdG8gYmFzZSkgZXJyb3JzPwotCShrc2g5MyBmYWlscyB0aGlzIHRlc3QpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLXN0ZGluOgotCXR5cGVzZXQgLWkgaTsKLQlpPTMjNAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL14oWyNcJF0gKT8uKjouKjMjNC4qXG4kLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtMQotZGVzY3JpcHRpb246Ci0JTWlzc2luZyBudW1iZXIgYWZ0ZXIgYmFzZSBpcyB0cmVhdGVkIGFzIDAuCi1zdGRpbjoKLQl0eXBlc2V0IC1pIGkKLQlpPTMKLQlpPTIjCi0JZWNobyAkaQotZXhwZWN0ZWQtc3Rkb3V0OgotCTAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrICdzdGlja3luZXNzJyBvZiBiYXNlIGluIHZhcmlvdXMgc2l0dWF0aW9ucwotc3RkaW46Ci0JdHlwZXNldCAtaSBpPTgKLQllY2hvICRpCi0JZWNobyAtLS0tLS0tLS0tIEEKLQl0eXBlc2V0IC1pNCBqPTgKLQllY2hvICRqCi0JZWNobyAtLS0tLS0tLS0tIEIKLQl0eXBlc2V0IC1pIGs9OAotCXR5cGVzZXQgLWk0IGs9OAotCWVjaG8gJGsKLQllY2hvIC0tLS0tLS0tLS0gQwotCXR5cGVzZXQgLWk0IGwKLQlsPTMjMTAKLQllY2hvICRsCi0JZWNobyAtLS0tLS0tLS0tIEQKLQl0eXBlc2V0IC1pIG0KLQltPTMjMTAKLQllY2hvICRtCi0JZWNobyAtLS0tLS0tLS0tIEUKLQluPTIjMTEKLQl0eXBlc2V0IC1pIG4KLQllY2hvICRuCi0Jbj0xMAotCWVjaG8gJG4KLQllY2hvIC0tLS0tLS0tLS0gRgotCXR5cGVzZXQgLWk4IG89MTIKLQl0eXBlc2V0IC1pNCBvCi0JZWNobyAkbwotCWVjaG8gLS0tLS0tLS0tLSBHCi0JdHlwZXNldCAtaSBwCi0JbGV0IHA9OCMxMgotCWVjaG8gJHAKLWV4cGVjdGVkLXN0ZG91dDoKLQk4Ci0JLS0tLS0tLS0tLSBBCi0JNCMyMAotCS0tLS0tLS0tLS0gQgotCTQjMjAKLQktLS0tLS0tLS0tIEMKLQk0IzMKLQktLS0tLS0tLS0tIEQKLQkzIzEwCi0JLS0tLS0tLS0tLSBFCi0JMiMxMQotCTIjMTAxMAotCS0tLS0tLS0tLS0gRgotCTQjMzAKLQktLS0tLS0tLS0tIEcKLQk4IzEyCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS0zCi1kZXNjcmlwdGlvbjoKLQlNb3JlIGJhc2UgcGFyc2luZyAoaG1tIGRvZXNuJ3QgdGVzdCBtdWNoLi4pCi1zdGRpbjoKLQl0eXBlc2V0IC1pIGFhCi0JYWE9MSsxMiMxMCsyCi0JZWNobyAkYWEKLQl0eXBlc2V0IC1pIGJiCi0JYmI9MSskYWEKLQllY2hvICRiYgotCXR5cGVzZXQgLWkgYmIKLQliYj0kYWEKLQllY2hvICRiYgotCXR5cGVzZXQgLWkgY2MKLQljYz0kYWEKLQllY2hvICRjYwotZXhwZWN0ZWQtc3Rkb3V0OgotCTE1Ci0JMTYKLQkxNQotCTE1Ci0tLS0KLW5hbWU6IGludGVnZXItYmFzZS00Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoaW5ncyBub3QgZGVjbGFyZWQgYXMgaW50ZWdlcnMgYXJlIG5vdCBtYWRlIGludGVnZXJzLAotCWFsc28sIGNoZWNrIGlmIGJhc2UgaXMgbm90IHJlc2V0IGJ5IC1pIHdpdGggbm8gYXJndW1lbnRzLgotCShrc2g5MyBmYWlscyAtIHByaW50cyAxMCMyMCAtIGdvIGZpZ3VyZSkKLXN0ZGluOgotCXh4PTIwCi0JbGV0IHh4PTEwCi0JdHlwZXNldCAtaSB8IGdyZXAgJ154eD0nCi0JdHlwZXNldCAtaTQgYT0xMAotCXR5cGVzZXQgLWkgYT0yMAotCWVjaG8gJGEKLWV4cGVjdGVkLXN0ZG91dDoKLQk0IzExMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtNQotZGVzY3JpcHRpb246Ci0JTW9yZSBiYXNlIHN0dWZmCi1zdGRpbjoKLQl0eXBlc2V0IC1pNCBhPTMjMTAKLQllY2hvICRhCi0JZWNobyAtLQotCXR5cGVzZXQgLWkgaj0zCi0Jaj0nfjMnCi0JZWNobyAkagotCWVjaG8gLS0KLQl0eXBlc2V0IC1pIGs9MQotCXhbaz1rKzFdPTMKLQllY2hvICRrCi0JZWNobyAtLQotCXR5cGVzZXQgLWkgbAotCWZvciBsIGluIDEgMiszIDQ7IGRvIGVjaG8gJGw7IGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQk0IzMKLQktLQotCS00Ci0JLS0KLQkyCi0JLS0KLQkxCi0JNQotCTQKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLTYKLWRlc2NyaXB0aW9uOgotCUV2ZW4gbW9yZSBiYXNlIHN0dWZmCi0JKGtzaDkzIGZhaWxzIHRoaXMgdGVzdCAtIHByaW50cyAwKQotc3RkaW46Ci0JdHlwZXNldCAtaTcgaQotCWk9Ci0JZWNobyAkaQotZXhwZWN0ZWQtc3Rkb3V0OgotCTcjMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2UtNwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBub24taW50ZWdlciBwYXJhbWV0ZXJzIGRvbid0IGdldCBiYXNlcyBhc3NpZ25lZAotc3RkaW46Ci0JZWNobyAkKCggenogPSA4IzEwMCApKQotCWVjaG8gJHp6Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JNjQKLQk2NAotLS0tCi1uYW1lOiBsaW5lbm8tc3RkaW4KLWRlc2NyaXB0aW9uOgotCVNlZSBpZiAkTElORU5PIGlzIHVwZGF0ZWQgYW5kIGNhbiBiZSBtb2RpZmllZC4KLXN0ZGluOgotCWVjaG8gQSAkTElORU5PCi0JZWNobyBCICRMSU5FTk8KLQlMSU5FTk89MjAKLQllY2hvIEMgJExJTkVOTwotZXhwZWN0ZWQtc3Rkb3V0OgotCUEgMQotCUIgMgotCUMgMjAKLS0tLQotbmFtZTogbGluZW5vLWluYwotZGVzY3JpcHRpb246Ci0JU2VlIGlmICRMSU5FTk8gaXMgc2V0IGZvciAuJ2QgZmlsZXMuCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZG90ZmlsZSIKLQllY2hvIGRvdCBBICRMSU5FTk8KLQllY2hvIGRvdCBCICRMSU5FTk8KLQlMSU5FTk89MjAKLQllY2hvIGRvdCBDICRMSU5FTk8KLXN0ZGluOgotCWVjaG8gQSAkTElORU5PCi0JZWNobyBCICRMSU5FTk8KLQkuIC4vZG90ZmlsZQotZXhwZWN0ZWQtc3Rkb3V0OgotCUEgMQotCUIgMgotCWRvdCBBIDEKLQlkb3QgQiAyCi0JZG90IEMgMjAKLS0tLQotbmFtZTogbGluZW5vLWZ1bmMKLWRlc2NyaXB0aW9uOgotCVNlZSBpZiAkTElORU5PIGlzIHNldCBmb3IgY29tbWFuZHMgaW4gYSBmdW5jdGlvbi4KLXN0ZGluOgotCWVjaG8gQSAkTElORU5PCi0JZWNobyBCICRMSU5FTk8KLQliYXIoKSB7Ci0JICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KLQkgICAgZWNobyBmdW5jIEIgJExJTkVOTwotCX0KLQliYXIKLQllY2hvIEMgJExJTkVOTwotZXhwZWN0ZWQtc3Rkb3V0OgotCUEgMQotCUIgMgotCWZ1bmMgQSA0Ci0JZnVuYyBCIDUKLQlDIDgKLS0tLQotbmFtZTogbGluZW5vLXVuc2V0Ci1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgdW5zZXR0aW5nIExJTkVOTyBtYWtlcyBpdCBub24tbWFnaWMuCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZG90ZmlsZSIKLQllY2hvIGRvdCBBICRMSU5FTk8KLQllY2hvIGRvdCBCICRMSU5FTk8KLXN0ZGluOgotCXVuc2V0IExJTkVOTwotCWVjaG8gQSAkTElORU5PCi0JZWNobyBCICRMSU5FTk8KLQliYXIoKSB7Ci0JICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KLQkgICAgZWNobyBmdW5jIEIgJExJTkVOTwotCX0KLQliYXIKLQkuIC4vZG90ZmlsZQotCWVjaG8gQyAkTElORU5PCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQQotCUIKLQlmdW5jIEEKLQlmdW5jIEIKLQlkb3QgQQotCWRvdCBCCi0JQwotLS0tCi1uYW1lOiBsaW5lbm8tdW5zZXQtdXNlCi1kZXNjcmlwdGlvbjoKLQlTZWUgaWYgdW5zZXR0aW5nIExJTkVOTyBtYWtlcyBpdCBub24tbWFnaWMgZXZlbgotCXdoZW4gaXQgaXMgcmUtdXNlZC4KLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgotCWVjaG8gZG90IEEgJExJTkVOTwotCWVjaG8gZG90IEIgJExJTkVOTwotc3RkaW46Ci0JdW5zZXQgTElORU5PCi0JTElORU5PPTMKLQllY2hvIEEgJExJTkVOTwotCWVjaG8gQiAkTElORU5PCi0JYmFyKCkgewotCSAgICBlY2hvIGZ1bmMgQSAkTElORU5PCi0JICAgIGVjaG8gZnVuYyBCICRMSU5FTk8KLQl9Ci0JYmFyCi0JLiAuL2RvdGZpbGUKLQllY2hvIEMgJExJTkVOTwotZXhwZWN0ZWQtc3Rkb3V0OgotCUEgMwotCUIgMwotCWZ1bmMgQSAzCi0JZnVuYyBCIDMKLQlkb3QgQSAzCi0JZG90IEIgMwotCUMgMwotLS0tCi1uYW1lOiBsaW5lbm8tdHJhcAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgTElORU5PIGlzIHRyYWNrZWQgaW4gdHJhcHMKLXN0ZGluOgotCWZhaWwoKSB7Ci0JCWVjaG8gImxpbmUgPCQxPiIKLQkJZXhpdCAxCi0JfQotCXRyYXAgJ2ZhaWwgJExJTkVOTycgSU5UIEVSUgotCWZhbHNlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSA8Nj4KLWV4cGVjdGVkLWV4aXQ6IDEKLS0tLQotbmFtZTogcmVhZC1JRlMtMQotZGVzY3JpcHRpb246Ci0JU2ltcGxlIHRlc3QsIGRlZmF1bHQgSUZTCi1zdGRpbjoKLQllY2hvICJBIEIgIiA+IElOCi0JdW5zZXQgeCB5IHoKLQlyZWFkIHggeSB6IDwgSU4KLQllY2hvIDE6ICJ4WyR4XSB5WyR5XSB6WyR6XSIKLQllY2hvIDFhOiAke3oteiBub3Qgc2V0fQotCXJlYWQgeCA8IElOCi0JZWNobyAyOiAieFskeF0iCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMTogeFtBXSB5W0JdIHpbXQotCTFhOgotCTI6IHhbQSBCXQotLS0tCi1uYW1lOiByZWFkLWtzaC0xCi1kZXNjcmlwdGlvbjoKLQlJZiBubyB2YXIgc3BlY2lmaWVkLCBSRVBMWSBpcyB1c2VkCi1zdGRpbjoKLQllY2hvICJhYmMiID4gSU4KLQlyZWFkIDwgSU4KLQllY2hvICJbJFJFUExZXSI7Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JW2FiY10KLS0tLQotbmFtZTogcmVncmVzc2lvbi0xCi1kZXNjcmlwdGlvbjoKLQlMZXggYXJyYXkgY29kZSBoYWQgcHJvYmxlbXMgd2l0aCB0aGlzLgotc3RkaW46Ci0JZWNobyBmb29bCi0Jbj1iYXIKLQllY2hvICJoaVsgJG4gXT0xIgotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvb1sKLQloaVsgYmFyIF09MQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTIKLWRlc2NyaXB0aW9uOgotCVdoZW4gUEFUSCBpcyBzZXQgYmVmb3JlIHJ1bm5pbmcgYSBjb21tYW5kLCB0aGUgbmV3IHBhdGggaXMKLQlub3QgdXNlZCBpbiBkb2luZyB0aGUgcGF0aCBzZWFyY2gKLQkJJCBlY2hvIGVjaG8gaGkgPiAvdG1wL3EgOyBjaG1vZCBhK3J4IC90bXAvcQotCQkkIFBBVEg9L3RtcCBxCi0JCXE6IG5vdCBmb3VuZAotCQkkCi0JaW4gY29tZXhlYygpIHRoZSB0d28gbGluZXMKLQkJd2hpbGUgKCp2cCAhPSBOVUxMKQotCQkJKHZvaWQpIHR5cGVzZXQoKnZwKyssIHh4eCwgMCk7Ci0JbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgdGhlIHN3aXRjaCB0byBiZWZvcmUgZmluZGNvbSgpIGlzCi0JY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyB3aWxsIGJyZWFrLgotc3RkaW46Ci0JOiAke1BXRDotYHB3ZCAyPiAvZGV2L251bGxgfQotCTogJHtQV0Q6PyJQV0Qgbm90IHNldCAtIGNhbid0IGRvIHRlc3QifQotCW1rZGlyIFkKLQljYXQgPiBZL3h4eHNjcmlwdCA8PCBFT0YKLQkjIS9iaW4vc2gKLQkjIE5lZWQgdG8gcmVzdG9yZSBwYXRoIHNvIGVjaG8gY2FuIGJlIGZvdW5kIChzb21lIHNoZWxscyBkb24ndCBoYXZlCi0JIyBpdCBhcyBhIGJ1aWx0LWluKQotCVBBVEg9XCRPTERQQVRICi0JZWNobyBoaQotCWV4aXQgMAotCUVPRgotCWNobW9kIGErcnggWS94eHhzY3JpcHQKLQlleHBvcnQgT0xEUEFUSD0iJFBBVEgiCi0JUEFUSD0kUFdEL1kgeHh4c2NyaXB0Ci0JZXhpdCAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNgotZGVzY3JpcHRpb246Ci0JUGFyc2luZyBvZiAkKC4uKSBleHByZXNzaW9ucyBpcyBub24tb3B0aW1hbC4gIEl0IGlzCi0JaW1wb3NzaWJsZSB0byBoYXZlIGFueSBwYXJlbnRoZXNlcyBpbnNpZGUgdGhlIGV4cHJlc3Npb24uCi0JSS5lLiwKLQkJJCBrc2ggLWMgJ2VjaG8gJChlY2hvIFwoICknCi0JCW5vIGNsb3NpbmcgcXVvdGUKLQkJJCBrc2ggLWMgJ2VjaG8gJChlY2hvICIoIiApJwotCQlubyBjbG9zaW5nIHF1b3RlCi0JCSQKLQlUaGUgc29sdXRpb24gaXMgdG8gaGFjayB0aGUgcGFyc2luZyBjbG9kZSBpbiBsZXguYywgdGhlCi0JcXVlc3Rpb24gaXMgaG93IHRvIGhhY2sgaXQ6IHNob3VsZCBhbnkgcGFyZW50aGVzZXMgYmUKLQllc2NhcGVkIGJ5IGEgYmFja3NsYXNoLCBvciBzaG91bGQgcmVjdXJzaXZlIHBhcnNpbmcgYmUgZG9uZQotCShzbyBxdW90ZXMgY291bGQgYWxzbyBiZSB1c2VkIHRvIGhpZGUgaGVtKS4gIFRoZSBmb3JtZXIgaXMKLQllYXNpZXIsIHRoZSBsYXRlciBiZXR0ZXIuLi4KLXN0ZGluOgotCWVjaG8gJChlY2hvIFwoKQotZXhwZWN0ZWQtc3Rkb3V0OgotCSgKLS0tLQotbmFtZTogcmVncmVzc2lvbi05Ci1kZXNjcmlwdGlvbjoKLQlDb250aW51ZSBpbiBhIGZvciBsb29wIGRvZXMgbm90IHdvcmsgcmlnaHQ6Ci0JCWZvciBpIGluIGEgYiBjIDsgZG8KLQkJCWlmIFsgJGkgPSBiIF0gOyB0aGVuCi0JCQkJY29udGludWUKLQkJCWZpCi0JCQllY2hvICRpCi0JCWRvbmUKLQlQcmludHMgYSBmb3JldmVyLi4uCi1zdGRpbjoKLQlmaXJzdD15ZXMKLQlmb3IgaSBpbiBhIGIgYyA7IGRvCi0JCWlmIFsgJGkgPSBiIF0gOyB0aGVuCi0JCQlpZiBbICRmaXJzdCA9IG5vIF0gOyB0aGVuCi0JCQkJZWNobyAnY29udGludWUgaW4gZm9yIGxvb3AgYnJva2VuJwotCQkJCWJyZWFrCSMgaG9wZSBicmVhayBpc24ndCBicm9rZW4gdG9vIDotKQotCQkJZmkKLQkJCWZpcnN0PW5vCi0JCQljb250aW51ZQotCQlmaQotCWRvbmUKLQllY2hvIGJ5ZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWJ5ZQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTEwCi1kZXNjcmlwdGlvbjoKLQlUaGUgZm9sbG93aW5nOgotCQlzZXQgLS0gYGZhbHNlYAotCQllY2hvICQ/Ci0Jc2hvdWxkIHByaW50IDAgYWNjb3JkaW5nIHRvIFBPU0lYIChkYXNoLCBiYXNoLCBrc2g5MywgcG9zaCkKLQlidXQgbm90IDAgYWNjb3JkaW5nIHRvIHRoZSBnZXRvcHQoMSkgbWFudWFsIHBhZ2UsIGtzaDg4LCBhbmQKLQlCb3VybmUgc2ggKHN1Y2ggYXMgL2Jpbi9zaCBvbiBTb2xhcmlzKS4KLQlJbiBta3NoIFIzOWIsIHdlIGhvbm91ciBQT1NJWCBleGNlcHQgd2hlbiAtbyBzaCBpcyBzZXQuCi1zdGRpbjoKLQlzaG93ZigpIHsKLQkJW1sgLW8gcG9zaXggXV07IEZQT1NJWD0kKCgxLSQ/KSkKLQkJW1sgLW8gc2ggXV07IEZTSD0kKCgxLSQ/KSkKLQkJZWNobyAtbiAiRlBPU0lYPSRGUE9TSVggRlNIPSRGU0ggIgotCX0KLQlzZXQgK28gcG9zaXggK28gc2gKLQlzaG93ZgotCXNldCAtLSBgZmFsc2VgCi0JZWNobyBydj0kPwotCXNldCAtbyBzaAotCXNob3dmCi0Jc2V0IC0tIGBmYWxzZWAKLQllY2hvIHJ2PSQ/Ci0Jc2V0IC1vIHBvc2l4Ci0Jc2hvd2YKLQlzZXQgLS0gYGZhbHNlYAotCWVjaG8gcnY9JD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlGUE9TSVg9MCBGU0g9MCBydj0wCi0JRlBPU0lYPTAgRlNIPTEgcnY9MQotCUZQT1NJWD0xIEZTSD0wIHJ2PTAKLS0tLQotbmFtZTogcmVncmVzc2lvbi0xMQotZGVzY3JpcHRpb246Ci0JVGhlIGZvbGxvd2luZzoKLQkJeD0vZm9vL2Jhci9ibGFoCi0JCWVjaG8gJHt4IyMqL30KLQlzaG91bGQgZWNobyBibGFoIGJ1dCBvbiBzb21lIG1hY2hpbmVzIGVjaG9zIC9mb28vYmFyL2JsYWguCi1zdGRpbjoKLQl4PS9mb28vYmFyL2JsYWgKLQllY2hvICR7eCMjKi99Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYmxhaAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTEyCi1kZXNjcmlwdGlvbjoKLQlCb3RoIG9mIHRoZSBmb2xsb3dpbmcgZWNob3MgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgdW5kZXIgc2gva3NoLmF0dDoKLQkJIyEvYmluL3NoCi0JCXg9ImZvbwliYXIiCi0JCWVjaG8gImBlY2hvIFwiJHhcImAiCi0JCWVjaG8gImBlY2hvICIkeCJgIgotCXBka3NoIHByb2R1Y2VzIGRpZmZlcmVudCBvdXRwdXQgZm9yIHRoZSBmb3JtZXIgKGZvbyBpbnN0ZWFkIG9mIGZvb1x0YmFyKQotc3RkaW46Ci0JeD0iZm9vCWJhciIKLQllY2hvICJgZWNobyBcIiR4XCJgIgotCWVjaG8gImBlY2hvICIkeCJgIgotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvbwliYXIKLQlmb28JYmFyCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMTMKLWRlc2NyaXB0aW9uOgotCVRoZSBmb2xsb3dpbmcgY29tbWFuZCBoYW5ncyBmb3JldmVyOgotCQkkICg6IDsgY2F0IC9ldGMvdGVybWNhcCkgfCBzbGVlcCAyCi0JVGhpcyBpcyBiZWNhdXNlIHRoZSBzaGVsbCBmb3JrcyBhIHNoZWxsIHRvIHJ1biB0aGUgKC4uKSBjb21tYW5kCi0JYW5kIHRoaXMgc2hlbGwgaGFzIHRoZSBwaXBlIG9wZW4uICBXaGVuIHRoZSBzbGVlcCBkaWVzLCB0aGUgY2F0Ci0JZG9lc24ndCBnZXQgYSBTSUdQSVBFICdjYXVzZSBhIHByb2Nlc3MgKGllLCB0aGUgc2Vjb25kIHNoZWxsKQotCXN0aWxsIGhhcyB0aGUgcGlwZSBvcGVuLgotCQotCU5PVEU6IHRoaXMgdGVzdCBwcm92b2tlcyBhIGJpemFycmUgYnVnIGluIGtzaDkzIChzaGVsbCBzdGFydHMgcmVhZGluZwotCSAgICAgIGNvbW1hbmRzIGZyb20gL2V0Yy90ZXJtY2FwLi4pCi10aW1lLWxpbWl0OiAxMAotc3RkaW46Ci0JZWNobyBBIGxpbmUgb2YgdGV4dCB0aGF0IHdpbGwgYmUgZHVwbGljYXRlZCBxdWl0ZSBhIG51bWJlciBvZiB0aW1lcy4+IHQxCi0JY2F0IHQxIHQxIHQxIHQxICB0MSB0MSB0MSB0MSAgdDEgdDEgdDEgdDEgIHQxIHQxIHQxIHQxICA+IHQyCi0JY2F0IHQyIHQyIHQyIHQyICB0MiB0MiB0MiB0MiAgdDIgdDIgdDIgdDIgIHQyIHQyIHQyIHQyICA+IHQxCi0JY2F0IHQxIHQxIHQxIHQxID4gdDIKLQkoOiA7IGNhdCB0MiAyPiYtKSB8IHNsZWVwIDEKLS0tLQotbmFtZTogcmVncmVzc2lvbi0xNAotZGVzY3JpcHRpb246Ci0JVGhlIGNvbW1hbmQKLQkJJCAoZm9vYmFyKSAyPiAvZGV2L251bGwKLQlnZW5lcmF0ZXMgbm8gb3V0cHV0IHVuZGVyIC9iaW4vc2gsIGJ1dCBwZGtzaCBwcm9kdWNlcyB0aGUgZXJyb3IKLQkJZm9vYmFyOiBub3QgZm91bmQKLQlBbHNvLCB0aGUgY29tbWFuZAotCQkkIGZvb2JhciAyPiAvZGV2L251bGwKLQlnZW5lcmF0ZXMgYW4gZXJyb3IgdW5kZXIgL2Jpbi9zaCBhbmQgcGRrc2gsIGJ1dCBBVCZUIGtzaDg4IHByb2R1Y2VzCi0Jbm8gZXJyb3IgKHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsKS4KLXN0ZGluOgotCSh5b3Uvc2hvdWxkL25vdC9zZWUvdGhpcy9lcnJvci8xKSAyPiAvZGV2L251bGwKLQl5b3Uvc2hvdWxkL25vdC9zZWUvdGhpcy9lcnJvci8yIDI+IC9kZXYvbnVsbAotCXRydWUKLS0tLQotbmFtZTogcmVncmVzc2lvbi0xNQotZGVzY3JpcHRpb246Ci0JVGhlIGNvbW1hbmQKLQkJJCB3aGVuY2UgZm9vYmFyCi0JZ2VuZXJhdGVzIGEgYmxhbmsgbGluZSB1bmRlciBwZGtzaCBhbmQgc2V0cyB0aGUgZXhpdCBzdGF0dXMgdG8gMC4KLQlBVCZUIGtzaDg4IGdlbmVyYXRlcyBubyBvdXRwdXQgYW5kIHNldHMgdGhlIGV4aXQgc3RhdHVzIHRvIDEuICBBbHNvLAotCXRoZSBjb21tYW5kCi0JCSQgd2hlbmNlIGZvb2JhciBjYXQKLQlnZW5lcmF0ZXMgbm8gb3V0cHV0IHVuZGVyIEFUJlQga3NoODggKHBka3NoIGdlbmVyYXRlcyBhIGJsYW5rIGxpbmUKLQlhbmQgL2Jpbi9jYXQpLgotc3RkaW46Ci0Jd2hlbmNlIGRvZXMvbm90L2V4aXN0ID4gL2Rldi9udWxsCi0JZWNobyAxOiAkPwotCWVjaG8gMjogJCh3aGVuY2UgZG9lcy9ub3QvZXhpc3QgfCB3YyAtbCkKLQllY2hvIDM6ICQod2hlbmNlIGRvZXMvbm90L2V4aXN0IGNhdCB8IHdjIC1sKQotZXhwZWN0ZWQtc3Rkb3V0OgotCTE6IDEKLQkyOiAwCi0JMzogMAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTE2Ci1kZXNjcmlwdGlvbjoKLQkke3ZhciUlZXhwcn0gc2VlbXMgdG8gYmUgYnJva2VuIGluIG1hbnkgcGxhY2VzLiAgT24gdGhlIG1pcHMKLQl0aGUgY29tbWFuZHMKLQkJJCByZWFkIGxpbmUgPCAvZXRjL3Bhc3N3ZAotCQkkIGVjaG8gJGxpbmUKLQkJcm9vdDowOjE6Li4uCi0JCSQgZWNobyAke2xpbmUlJToqfQotCQlyb290Ci0JCSQgZWNobyAkbGluZQotCQlyb290Ci0JCSQKLQljaGFuZ2UgdGhlIHZhbHVlIG9mIGxpbmUuICBPbiBzdW40cyAmIHBhcywgdGhlIGVjaG8gJHtsaW5lJSU6Kn0gZG9lc24ndAotCXdvcmsuICBIYXZlbid0IGNoZWNrZWQgZWxzZXdoZXJlLi4uCi1zY3JpcHQ6Ci0JcmVhZCB4Ci0JeT0keAotCWVjaG8gJHt4JSU6Kn0KLQllY2hvICR4Ci1zdGRpbjoKLQlyb290OmFzZGpoYXNkYXNqaHM6MDoxOlJvb3Q6LzovYmluL3NoCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jcm9vdAotCXJvb3Q6YXNkamhhc2Rhc2poczowOjE6Um9vdDovOi9iaW4vc2gKLS0tLQotbmFtZTogcmVncmVzc2lvbi0xNwotZGVzY3JpcHRpb246Ci0JVGhlIGNvbW1hbmQKLQkJLiAvZm9vL2JhcgotCXNob3VsZCBzZXQgdGhlIGV4aXQgc3RhdHVzIHRvIG5vbi16ZXJvIChzaCBhbmQgQVQmVCBrc2g4OCBkbykuCi0JWFhYIGRvdGluZyBhIG5vbiBleGlzdGVudCBmaWxlIGlzIGEgZmF0YWwgZXJyb3IgZm9yIGEgc2NyaXB0Ci1zdGRpbjoKLQkuIGRvZXMvbm90L2V4aXN0Ci1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLj8vCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMTkKLWRlc2NyaXB0aW9uOgotCUJvdGggb2YgdGhlIGZvbGxvd2luZyBlY2hvcyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSB0aGluZywgYnV0IGRvbid0OgotCQkkIHg9Zm9vL2JhcgotCQkkIGVjaG8gJHt4JS8qfQotCQlmb28KLQkJJCBlY2hvICIke3glLyp9IgotCQlmb28vYmFyCi1zdGRpbjoKLQl4PWZvby9iYXIKLQllY2hvICIke3glLyp9IgotZXhwZWN0ZWQtc3Rkb3V0OgotCWZvbwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTIxCi1kZXNjcmlwdGlvbjoKLQliYWNrc2xhc2ggZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCBpbiBjYXNlIGxhYmVsczoKLQkkIHg9Jy14JwotCSQgY2FzZSAkeCBpbgotCS1cPykgZWNobyBoaQotCWVzYWMKLQloaQotCSQgeD0nLT8nCi0JJCBjYXNlICR4IGluCi0JLVxcPykgZWNobyBoaQotCWVzYWMKLQloaQotCSQKLXN0ZGluOgotCWNhc2UgLXggaW4KLQktXD8pCWVjaG8gZmFpbAotCWVzYWMKLS0tLQotbmFtZTogcmVncmVzc2lvbi0yMgotZGVzY3JpcHRpb246Ci0JUXVvdGluZyBiYWNrcXVvdGVzIGluc2lkZSBiYWNrcXVvdGVzIGRvZXNuJ3Qgd29yazoKLQkkIGVjaG8gYGVjaG8gaGkgXGBlY2hvIHRoZXJlXGAgZm9sa3NgCi0JYXNrcyBmb3IgbW9yZSBpbmZvLiAgc2ggYW5kIEFUJlQga3NoODggYm90aCBlY2hvCi0JaGkgdGhlcmUgZm9sa3MKLXN0ZGluOgotCWVjaG8gYGVjaG8gaGkgXGBlY2hvIHRoZXJlXGAgZm9sa3NgCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkgdGhlcmUgZm9sa3MKLS0tLQotbmFtZTogcmVncmVzc2lvbi0yMwotZGVzY3JpcHRpb246Ci0JKSkgaXMgbm90IHRyZWF0ZWQgYGNvcnJlY3RseSc6Ci0JICAgICQgKGVjaG8gaGkgOyAoZWNobyB0aGVyZSA7IGVjaG8gZm9sa3MpKQotCSAgICBtaXNzaW5nICgoCi0JICAgICQKLQlpbnN0ZWFkIG9mIChhcyBzaCBhbmQga3NoLmF0dCkKLQkgICAgJCAoZWNobyBoaSA7IChlY2hvIHRoZXJlIDsgZWNobyBmb2xrcykpCi0JICAgIGhpCi0JICAgIHRoZXJlCi0JICAgIGZvbGtzCi0JICAgICQKLXN0ZGluOgotCSggOiA7ICggOiA7IGVjaG8gaGkpKQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMjUKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHJlYWRpbmcgc3RkaW4gaW4gYSB3aGlsZSBsb29wLiAgVGhlIHJlYWQgc2hvdWxkIG9ubHkgcmVhZAotCWEgc2luZ2xlIGxpbmUsIG5vdCBhIHdob2xlIHN0ZGlvIGJ1ZmZlcjsgdGhlIGNhdCBzaG91bGQgZ2V0Ci0JdGhlIHJlc3QuCi1zdGRpbjoKLQkoZWNobyBhOyBlY2hvIGIpIHwgd2hpbGUgcmVhZCB4IDsgZG8KLQkgICAgZWNobyAkeAotCSAgICBjYXQgPiAvZGV2L251bGwKLQlkb25lCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTI2Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayByZWFkaW5nIHN0ZGluIGluIGEgd2hpbGUgbG9vcC4gIFRoZSByZWFkIHNob3VsZCByZWFkIGJvdGgKLQlsaW5lcywgbm90IGp1c3QgdGhlIGZpcnN0Lgotc2NyaXB0OgotCWE9Ci0Jd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KLQkgICAgbGFzdD0keAotCSAgICByZWFkIHgKLQkgICAgY2F0IC9kZXYvbnVsbCB8IHNlZCAncy94L3kvJwotCSAgICBhPXgkYQotCWRvbmUKLQllY2hvICRsYXN0Ci1zdGRpbjoKLQlhCi0JYgotZXhwZWN0ZWQtc3Rkb3V0OgotCWIKLS0tLQotbmFtZTogcmVncmVzc2lvbi0yNwotZGVzY3JpcHRpb246Ci0JVGhlIGNvbW1hbmQKLQkJLiAvZG9lcy9ub3QvZXhpc3QKLQlzaG91bGQgY2F1c2UgYSBzY3JpcHQgdG8gZXhpdC4KLXN0ZGluOgotCS4gZG9lcy9ub3QvZXhpc3QKLQllY2hvIGhpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvZG9lc1wvbm90XC9leGlzdC8KLS0tLQotbmFtZTogcmVncmVzc2lvbi0yOAotZGVzY3JpcHRpb246Ci0JdmFyaWFibGUgYXNzaWduZW1lbnRzIG5vdCBkZXRlY3RlZCB3ZWxsCi1zdGRpbjoKLQlhLng9MSBlY2hvIGhpCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvYVwueD0xLwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTI5Ci1kZXNjcmlwdGlvbjoKLQlhbGlhcyBleHBhbnNpb24gZGlmZmVyZW50IGZyb20gQVQmVCBrc2g4OAotc3RkaW46Ci0JYWxpYXMgYT0nZm9yICcgYj0naSBpbicKLQlhIGIgaGkgOyBkbyBlY2hvICRpIDsgZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzAKLWRlc2NyaXB0aW9uOgotCXN0cmFuZ2UgY2hhcmFjdGVycyBhbGxvd2VkIGluc2lkZSAkey4uLn0KLXN0ZGluOgotCWVjaG8gJHthe2J9fQotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4/LwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTMxCi1kZXNjcmlwdGlvbjoKLQlEb2VzIHJlYWQgaGFuZGxlIHBhcnRpYWwgbGluZXMgY29ycmVjdGx5Ci1zY3JpcHQ6Ci0JYT0gcmV0PQotCXdoaWxlIFsgIiRhIiAhPSB4eHggXSA7IGRvCi0JICAgIHJlYWQgeCB5IHoKLQkgICAgcmV0PSQ/Ci0JICAgIGE9eCRhCi0JZG9uZQotCWVjaG8gIlskeF0iCi0JZWNobyAkcmV0Ci1zdGRpbjogIQotCWEgQSBhQQotCWIgQiBCYgotCWMKLWV4cGVjdGVkLXN0ZG91dDoKLQlbY10KLQkxCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tMzIKLWRlc2NyaXB0aW9uOgotCURvZXMgcmVhZCBzZXQgdmFyaWFibGVzIHRvIG51bGwgYXQgZW9mPwotc2NyaXB0OgotCWE9Ci0Jd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KLQkgICAgcmVhZCB4IHkgegotCSAgICBhPXgkYQotCWRvbmUKLQllY2hvIDE6ICR7eC14IG5vdCBzZXR9ICR7eS15IG5vdCBzZXR9ICR7ei16IG5vdCBzZXR9Ci0JZWNobyAyOiAke3g6K3ggbm90IG51bGx9ICR7eToreSBub3QgbnVsbH0gJHt6Oit6IG5vdCBudWxsfQotc3RkaW46Ci0JYSBBIEFhCi0JYiBCIEJiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMToKLQkyOgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTMzCi1kZXNjcmlwdGlvbjoKLQlEb2VzIHVtYXNrIHByaW50IGEgbGVhZGluZyAwIHdoZW4gdW1hc2sgaXMgMyBkaWdpdHM/Ci1zdGRpbjoKLQl1bWFzayAyMjIKLQl1bWFzawotZXhwZWN0ZWQtc3Rkb3V0OgotCTAyMjIKLS0tLQotbmFtZTogcmVncmVzc2lvbi0zNQotZGVzY3JpcHRpb246Ci0JVGVtcG9yeSBmaWxlcyB1c2VkIGZvciBoZXJlLWRvY3MgaW4gZnVuY3Rpb25zIGdldCB0cmFzaGVkIGFmdGVyCi0JdGhlIGZ1bmN0aW9uIGlzIHBhcnNlZCAoYmVmb3JlIGl0IGlzIGV4ZWN1dGVkKQotc3RkaW46Ci0JZjEoKSB7Ci0JCWNhdCA8PC0gRU9GCi0JCQlGMQotCQlFT0YKLQkJZjIoKSB7Ci0JCQljYXQgPDwtIEVPRgotCQkJCUYyCi0JCQlFT0YKLQkJfQotCX0KLQlmMQotCWYyCi0JdW5zZXQgLWYgZjEKLQlmMgotZXhwZWN0ZWQtc3Rkb3V0OgotCUYxCi0JRjIKLQlGMgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTM2Ci1kZXNjcmlwdGlvbjoKLQlDb21tYW5kIHN1YnN0aXR1dGlvbiBicmVha3MgcmVhZGluZyBpbiB3aGlsZSBsb29wCi0JKHRlc3QgZnJvbSA8c2pnQHZvaWQuemVuLm96LmF1PikKLXN0ZGluOgotCShlY2hvIGFiY2RlZjsgZWNobzsgZWNobyAxMjMpIHwKLQkgICAgd2hpbGUgcmVhZCBsaW5lCi0JICAgIGRvCi0JICAgICAgIyB0aGUgZm9sbG93aW5nIGxpbmUgYnJlYWtzIGl0Ci0JICAgICAgYz1gZWNobyAkbGluZSB8IHdjIC1jYAotCSAgICAgIGVjaG8gJGMKLQkgICAgZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCTcKLQkxCi0JNAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTM3Ci1kZXNjcmlwdGlvbjoKLQlNYWNoaW5lcyB3aXRoIGJyb2tlbiB0aW1lcygpIChyZXBvcnRlZCBieSA8c2pnQHZvaWQuemVuLm96LmF1PikKLQl0aW1lIGRvZXMgbm90IHJlcG9ydCBjb3JyZWN0IHJlYWwgdGltZQotc3RkaW46Ci0JdGltZSBzbGVlcCAxCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjogIS9eXHMqMFwuMFtcc1xkXStyZWFsfF5ccypyZWFsW1xzXSswK1wuMC8KLS0tLQotbmFtZTogcmVncmVzc2lvbi0zOAotZGVzY3JpcHRpb246Ci0Jc2V0IC1lIGRvZXNuJ3QgaWdub3JlIGV4aXQgY29kZXMgZm9yIGlmL3doaWxlL3VudGlsLyYmL3x8LyEuCi1hcmd1bWVudHM6ICEtZSEKLXN0ZGluOgotCWlmIGZhbHNlOyB0aGVuIGVjaG8gaGkgOyBmaQotCWZhbHNlIHx8IHRydWUKLQlmYWxzZSAmJiB0cnVlCi0Jd2hpbGUgZmFsc2U7IGRvIGVjaG8gaGk7IGRvbmUKLQllY2hvIG9rCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb2sKLS0tLQotbmFtZTogcmVncmVzc2lvbi0zOQotZGVzY3JpcHRpb246Ci0Jc2V0IC1lOiBlcnJvcnMgaW4gY29tbWFuZCBzdWJzdGl0dXRpb25zIGFyZW4ndCBpZ25vcmVkCi0JTm90IGNsZWFyIGlmIHRoZXkgc2hvdWxkIGJlIG9yIG5vdC4uLiBiYXNoIHBhc3NlcyBoZXJlCi0JdGhpcyBtYXkgYWN0dWFsbHkgYmUgcmVxdWlyZWQgZm9yIG1ha2UsIHNvIGNoYW5nZWQgdGhlCi0JdGVzdCB0byBtYWtlIHRoaXMgYW4gbWtzaCBmZWF0dXJlLCBub3QgYSBidWcKLWFyZ3VtZW50czogIS1lIQotc3RkaW46Ci0JZWNobyBgZmFsc2U7IGVjaG8gaGlgCi0jZXhwZWN0ZWQtZmFpbDogeWVzCi0jZXhwZWN0ZWQtc3Rkb3V0OgotIwloaQotZXhwZWN0ZWQtc3Rkb3V0OgotCQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQwCi1kZXNjcmlwdGlvbjoKLQlUaGlzIHVzZWQgdG8gY2F1c2UgYSBjb3JlIGR1bXAKLWVudi1zZXR1cDogIVJBTkRPTT0xMiEKLXN0ZGluOgotCWVjaG8gaGkKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQxCi1kZXNjcmlwdGlvbjoKLQlmb28gc2hvdWxkIGJlIHNldCB0byBiYXIgKHNob3VsZCBub3QgYmUgZW1wdHkpCi1zdGRpbjoKLQlmb289YAotCWVjaG8gYmFyYAotCWVjaG8gIigkZm9vKSIKLWV4cGVjdGVkLXN0ZG91dDoKLQkoYmFyKQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQyCi1kZXNjcmlwdGlvbjoKLQlDYW4ndCB1c2UgY29tbWFuZCBsaW5lIGFzc2lnbm1lbnRzIHRvIGFzc2lnbiByZWFkb25seSBwYXJhbWV0ZXJzLgotc3RkaW46Ci0JZm9vPWJhcgotCXJlYWRvbmx5IGZvbwotCWZvbz1zdHVmZiBlbnYgfCBncmVwICdeZm9vJwotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLipyZWFkICpvbmx5LiovCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDMKLWRlc2NyaXB0aW9uOgotCUNhbiBzdWJzaGVsbHMgYmUgcHJlZml4ZWQgYnkgcmVkaXJlY3Rpb25zIChoaXN0b3JpY2FsIHNoZWxscyBhbGxvdwotCXRoaXMpCi1zdGRpbjoKLQk8IC9kZXYvbnVsbCAoc2VkICdzL14vWC8nKQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQ1Ci1kZXNjcmlwdGlvbjoKLQlQYXJhbWV0ZXIgYXNzaWdubWVudHMgd2l0aCBbXSByZWNvZ25pc2VkIGNvcnJlY3RseQotc3RkaW46Ci0JRk9PPSpbMTJdCi0JQkFSPWFiY1sKLQlNT1JFPVthYmNdCi0JSlVOSz1hW2JjCi0JZWNobyAiPCRGT08+IgotCWVjaG8gIjwkQkFSPiIKLQllY2hvICI8JE1PUkU+IgotCWVjaG8gIjwkSlVOSz4iCi1leHBlY3RlZC1zdGRvdXQ6Ci0JPCpbMTJdPgotCTxhYmNbPgotCTxbYWJjXT4KLQk8YVtiYz4KLS0tLQotbmFtZTogcmVncmVzc2lvbi00NgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gd29ya3MgaW4gY29tbWFuZCBzdWJzdGl0dXRpb25zIGFuZAotCWF0IHRoZSBlbmQgb2YgZmlsZS4KLXN0ZGluOgotCWFsaWFzIHg9J2VjaG8gaGknCi0JRk9PPSJgeGAgIgotCWVjaG8gIlskRk9PXSIKLQl4Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JW2hpIF0KLQloaQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTQ3Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGFsaWFzZXMgYXJlIGZ1bGx5IHJlYWQuCi1zdGRpbjoKLQlhbGlhcyB4PSdlY2hvIGhpOwotCWVjaG8gdGhlcmUnCi0JeAotCWVjaG8gZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0JdGhlcmUKLQlkb25lCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNDgKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgKGhlcmUgZG9jKSB0ZW1wIGZpbGVzIGFyZSBub3QgbGVmdCBiZWhpbmQgYWZ0ZXIgYW4gZXhlYy4KLXN0ZGluOgotCW1rZGlyIGZvbyB8fCBleGl0IDEKLQlUTVBESVI9JFBXRC9mb28gIiRfX3Byb2duYW1lIiA8PC0gJ0VPRicKLQkJeCgpIHsKLQkJCXNlZCAncy9eL1ggLycgPDwgRV9PX0YKLQkJCWhpCi0JCQl0aGVyZQotCQkJZm9sa3MKLQkJCUVfT19GCi0JCQllY2hvICJkb25lICgkPykiCi0JCX0KLQkJZWNobz1lY2hvOyBbIC14IC9iaW4vZWNobyBdICYmIGVjaG89L2Jpbi9lY2hvCi0JCWV4ZWMgJGVjaG8gc3VidGVzdC0xIGhpCi0JRU9GCi0JZWNobyBzdWJ0ZXN0LTEgZm9vLyoKLQlUTVBESVI9JFBXRC9mb28gIiRfX3Byb2duYW1lIiA8PC0gJ0VPRicKLQkJZWNobz1lY2hvOyBbIC14IC9iaW4vZWNobyBdICYmIGVjaG89L2Jpbi9lY2hvCi0JCXNlZCAncy9eL1ggLycgPDwgRV9PX0Y7IGV4ZWMgJGVjaG8gc3VidGVzdC0yIGhpCi0JCWEKLQkJZmV3Ci0JCWxpbmVzCi0JCUVfT19GCi0JRU9GCi0JZWNobyBzdWJ0ZXN0LTIgZm9vLyoKLWV4cGVjdGVkLXN0ZG91dDoKLQlzdWJ0ZXN0LTEgaGkKLQlzdWJ0ZXN0LTEgZm9vLyoKLQlYIGEKLQlYIGZldwotCVggbGluZXMKLQlzdWJ0ZXN0LTIgaGkKLQlzdWJ0ZXN0LTIgZm9vLyoKLS0tLQotbmFtZTogcmVncmVzc2lvbi00OQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB1bnNldCBwYXJhbXMgd2l0aCBhdHRyaWJ1dGVzIGFyZSByZXBvcnRlZCBieSBzZXQsIHRob3NlCi0Jc2FucyBhdHRyaWJ1dGVzIGFyZSBub3QuCi1zdGRpbjoKLQl1bnNldCBGT08gQkFSCi0JZWNobyBYJEZPTwotCWV4cG9ydCBCQVIKLQl0eXBlc2V0IC1pIEJMQUgKLQlzZXQgfCBncmVwIEZPTwotCXNldCB8IGdyZXAgQkFSCi0Jc2V0IHwgZ3JlcCBCTEFICi1leHBlY3RlZC1zdGRvdXQ6Ci0JWAotCUJBUgotCUJMQUgKLS0tLQotbmFtZTogcmVncmVzc2lvbi01MAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBhbGlhc2VzIGRvIG5vdCB1c2UgY29udGludWF0aW9uIHByb21wdCBhZnRlciB0cmFpbGluZwotCXNlbWktY29sb24uCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiZW52IgotCVBTMT1ZCi0JUFMyPVgKLWVudi1zZXR1cDogIUVOVj0uL2VudiEKLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JYWxpYXMgZm9vPSdlY2hvIGhpIDsgJwotCWZvbwotCWZvbyBlY2hvIHRoZXJlCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaGkKLQloaQotCXRoZXJlCi1leHBlY3RlZC1zdGRlcnI6ICEKLQlZWVlZCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc2V0IGFsbG93cyBib3RoICtvIGFuZCAtbyBvcHRpb25zIG9uIHNhbWUgY29tbWFuZCBsaW5lLgotc3RkaW46Ci0Jc2V0IGEgYiBjCi0Jc2V0IC1vIG5vZ2xvYiArbyBhbGxleHBvcnQKLQllY2hvIEE6ICQqLCAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQTogYSBiIGMsICoKLS0tLQotbmFtZTogcmVncmVzc2lvbi01MgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBnbG9iYmluZyB3b3JrcyBpbiBwaXBlbGluZWQgY29tbWFuZHMKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlbnYiCi0JUFMxPVAKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCi0Jc3R1ZmYKLWVudi1zZXR1cDogIUVOVj0uL2VudiEKLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0Jc2VkICdzL14vWCAvJyA8IGFiKgotCWVjaG8gbWFyayAxCi0Jc2VkICdzL14vWCAvJyA8IGFiKiB8IHNlZCAncy9eL1kgLycKLQllY2hvIG1hcmsgMgotZXhwZWN0ZWQtc3Rkb3V0OgotCVggc3R1ZmYKLQltYXJrIDEKLQlZIFggc3R1ZmYKLQltYXJrIDIKLWV4cGVjdGVkLXN0ZGVycjogIQotCVBQUFBQCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgZ2V0b3B0cyB3b3JrcyBpbiBmdW5jdGlvbnMKLXN0ZGluOgotCWJmdW5jKCkgewotCSAgICBlY2hvIGJmdW5jOiBlbnRlciAiKGFyZ3M6ICQqOyBPUFRJTkQ9JE9QVElORCkiCi0JICAgIHdoaWxlIGdldG9wdHMgQiBvYzsgZG8KLQkJY2FzZSAkb2MgaW4KLQkJICAoQikKLQkJICAgIGVjaG8gYmZ1bmM6IEIgb3B0aW9uCi0JCSAgICA7OwotCQkgICgqKQotCQkgICAgZWNobyBiZnVuYzogb2RkIG9wdGlvbiAiKCRvYykiCi0JCSAgICA7OwotCQllc2FjCi0JICAgIGRvbmUKLQkgICAgZWNobyBiZnVuYzogbGVhdmUKLQl9Ci0JCi0JZnVuY3Rpb24ga2Z1bmMgewotCSAgICBlY2hvIGtmdW5jOiBlbnRlciAiKGFyZ3M6ICQqOyBPUFRJTkQ9JE9QVElORCkiCi0JICAgIHdoaWxlIGdldG9wdHMgSyBvYzsgZG8KLQkJY2FzZSAkb2MgaW4KLQkJICAoSykKLQkJICAgIGVjaG8ga2Z1bmM6IEsgb3B0aW9uCi0JCSAgICA7OwotCQkgICgqKQotCQkgICAgZWNobyBiZnVuYzogb2RkIG9wdGlvbiAiKCRvYykiCi0JCSAgICA7OwotCQllc2FjCi0JICAgIGRvbmUKLQkgICAgZWNobyBrZnVuYzogbGVhdmUKLQl9Ci0JCi0Jc2V0IC0tIC1mIC1iIC1rIC1sCi0JZWNobyAibGluZSAxOiBPUFRJTkQ9JE9QVElORCIKLQlnZXRvcHRzIGtiZmwgb3B0YwotCWVjaG8gImxpbmUgMjogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKLQliZnVuYyAtQkJCIGJsYWgKLQllY2hvICJsaW5lIDM6IE9QVElORD0kT1BUSU5EIgotCWdldG9wdHMga2JmbCBvcHRjCi0JZWNobyAibGluZSA0OiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgotCWtmdW5jIC1LS0sgYmxhaAotCWVjaG8gImxpbmUgNTogT1BUSU5EPSRPUFRJTkQiCi0JZ2V0b3B0cyBrYmZsIG9wdGMKLQllY2hvICJsaW5lIDY6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCi0JZWNobwotCQotCU9QVElORD0xCi0Jc2V0IC0tIC1mYmtsCi0JZWNobyAibGluZSAxMDogT1BUSU5EPSRPUFRJTkQiCi0JZ2V0b3B0cyBrYmZsIG9wdGMKLQllY2hvICJsaW5lIDIwOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgotCWJmdW5jIC1CQkIgYmxhaAotCWVjaG8gImxpbmUgMzA6IE9QVElORD0kT1BUSU5EIgotCWdldG9wdHMga2JmbCBvcHRjCi0JZWNobyAibGluZSA0MDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKLQlrZnVuYyAtS0tLIGJsYWgKLQllY2hvICJsaW5lIDUwOiBPUFRJTkQ9JE9QVElORCIKLQlnZXRvcHRzIGtiZmwgb3B0YwotCWVjaG8gImxpbmUgNjA6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbGluZSAxOiBPUFRJTkQ9MQotCWxpbmUgMjogcmV0PTAsIG9wdGM9ZiwgT1BUSU5EPTIKLQliZnVuYzogZW50ZXIgKGFyZ3M6IC1CQkIgYmxhaDsgT1BUSU5EPTIpCi0JYmZ1bmM6IEIgb3B0aW9uCi0JYmZ1bmM6IEIgb3B0aW9uCi0JYmZ1bmM6IGxlYXZlCi0JbGluZSAzOiBPUFRJTkQ9MgotCWxpbmUgNDogcmV0PTAsIG9wdGM9YiwgT1BUSU5EPTMKLQlrZnVuYzogZW50ZXIgKGFyZ3M6IC1LS0sgYmxhaDsgT1BUSU5EPTEpCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IGxlYXZlCi0JbGluZSA1OiBPUFRJTkQ9MwotCWxpbmUgNjogcmV0PTAsIG9wdGM9aywgT1BUSU5EPTQKLQkKLQlsaW5lIDEwOiBPUFRJTkQ9MQotCWxpbmUgMjA6IHJldD0wLCBvcHRjPWYsIE9QVElORD0yCi0JYmZ1bmM6IGVudGVyIChhcmdzOiAtQkJCIGJsYWg7IE9QVElORD0yKQotCWJmdW5jOiBCIG9wdGlvbgotCWJmdW5jOiBCIG9wdGlvbgotCWJmdW5jOiBsZWF2ZQotCWxpbmUgMzA6IE9QVElORD0yCi0JbGluZSA0MDogcmV0PTEsIG9wdGM9PywgT1BUSU5EPTIKLQlrZnVuYzogZW50ZXIgKGFyZ3M6IC1LS0sgYmxhaDsgT1BUSU5EPTEpCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IEsgb3B0aW9uCi0Ja2Z1bmM6IGxlYXZlCi0JbGluZSA1MDogT1BUSU5EPTIKLQlsaW5lIDYwOiByZXQ9MSwgb3B0Yz0/LCBPUFRJTkQ9MgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTU0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IDsgaXMgbm90IHJlcXVpcmVkIGJlZm9yZSB0aGUgdGhlbiBpbiBpZiAoKCAuLi4gKSkgdGhlbiAuLi4KLXN0ZGluOgotCWlmICgoIDEgKSkgdGhlbgotCSAgICBlY2hvIG9rIGRwYXJlbgotCWZpCi0JaWYgW1sgLW4gMSBdXSB0aGVuCi0JICAgIGVjaG8gb2sgZGJyYWNrZXRzCi0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlvayBkcGFyZW4KLQlvayBkYnJhY2tldHMKLS0tLQotbmFtZTogcmVncmVzc2lvbi01NQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgJHtmb286JWJhcn0gaXMgYWxsb3dlZCAoa3NoODggYWxsb3dzIGl0Li4uKQotc3RkaW46Ci0JeD1mb29YYmFyWGJsYWgKLQllY2hvIDEgJHt4JVgqfQotCWVjaG8gMiAke3g6JVgqfQotCWVjaG8gMyAke3glJVgqfQotCWVjaG8gNCAke3g6JSVYKn0KLQllY2hvIDUgJHt4IypYfQotCWVjaG8gNiAke3g6IypYfQotCWVjaG8gNyAke3gjIypYfQotCWVjaG8gOCAke3g6IyMqWH0KLWV4cGVjdGVkLXN0ZG91dDoKLQkxIGZvb1hiYXIKLQkyIGZvb1hiYXIKLQkzIGZvbwotCTQgZm9vCi0JNSBiYXJYYmxhaAotCTYgYmFyWGJsYWgKLQk3IGJsYWgKLQk4IGJsYWgKLS0tLQotbmFtZTogcmVncmVzc2lvbi01NwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgdHlwZXNldCBvdXRwdXQgaXMgY29ycmVjdCBmb3IKLQl1bmluaXRpYWxpc2VkIGFycmF5IGVsZW1lbnRzLgotc3RkaW46Ci0JdHlwZXNldCAtaSB4eHhbNF0KLQllY2hvIEEKLQl0eXBlc2V0IC1pIHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKLQllY2hvIEIKLQl0eXBlc2V0IHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKLQkKLQl4eHhbMV09Mis1Ci0JZWNobyBNCi0JdHlwZXNldCAtaSB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCi0JZWNobyBOCi0JdHlwZXNldCB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCi1leHBlY3RlZC1zdGRvdXQ6Ci0JQQotCSAgICB4eHgKLQlCCi0JICAgIHR5cGVzZXQgLWkgeHh4Ci0JTQotCSAgICB4eHhbMV09NwotCU4KLQkgICAgdHlwZXNldCAtaSB4eHgKLS0tLQotbmFtZTogcmVncmVzc2lvbi01OAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgdHJhcCBleGl0IGlzIG9rIChleGl0IG5vdCBtaXN0YWtlbiBmb3Igc2lnbmFsIG5hbWUpCi1zdGRpbjoKLQl0cmFwICdlY2hvIGhpJyBleGl0Ci0JdHJhcCBleGl0IDEKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTU5Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiAkeyNhcnJheVsqXX0gaXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkuCi1zdGRpbjoKLQlhWzEyXT1oaQotCWFbOF09dGhlcmUKLQllY2hvICR7I2FbKl19Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMgotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTYwCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBkZWZhdWx0IGV4aXQgc3RhdHVzIGlzIHByZXZpb3VzIGNvbW1hbmQKLXN0ZGluOgotCSh0cnVlOyBleGl0KQotCWVjaG8gQSAkPwotCShmYWxzZTsgZXhpdCkKLQllY2hvIEIgJD8KLQkoIChleGl0IDEwMykgOyBleGl0KQotCWVjaG8gQyAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCUEgMAotCUIgMQotCUMgMTAzCi0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNjEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEVYSVQgdHJhcCBpcyBleGVjdXRlZCBmb3Igc3ViIHNoZWxscy4KLXN0ZGluOgotCXRyYXAgJ2VjaG8gcGFyZW50IGV4aXQnIEVYSVQKLQllY2hvIHN0YXJ0Ci0JKGVjaG8gQTsgZWNobyBBIGxhc3QpCi0JZWNobyBCCi0JKGVjaG8gQzsgdHJhcCAnZWNobyBzdWIgZXhpdCcgRVhJVDsgZWNobyBDIGxhc3QpCi0JZWNobyBwYXJlbnQgbGFzdAotZXhwZWN0ZWQtc3Rkb3V0OgotCXN0YXJ0Ci0JQQotCUEgbGFzdAotCUIKLQlDCi0JQyBsYXN0Ci0Jc3ViIGV4aXQKLQlwYXJlbnQgbGFzdAotCXBhcmVudCBleGl0Ci0tLS0KLW5hbWU6IHJlZ3Jlc3Npb24tNjIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHRlc3QgLW50Ly1vdCBzdWNjZWVkcyBpZiBzZWNvbmQoZmlyc3QpIGZpbGUgaXMgbWlzc2luZy4KLXN0ZGluOgotCXRvdWNoIGEKLQl0ZXN0IGEgLW50IGIgJiYgZWNobyBudCBPSyB8fCBlY2hvIG50IEJBRAotCXRlc3QgYiAtb3QgYSAmJiBlY2hvIG90IE9LIHx8IGVjaG8gb3QgQkFECi1leHBlY3RlZC1zdGRvdXQ6Ci0JbnQgT0sKLQlvdCBPSwotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTYzCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB0eXBlc2V0LCBleHBvcnQsIGFuZCByZWFkb25seSB3b3JrCi1zdGRpbjoKLQl7Ci0JCWVjaG8gRk5PUkQtMAotCQlGTk9SRF9BPTEKLQkJRk5PUkRfQj0yCi0JCUZOT1JEX0M9MwotCQlGTk9SRF9EPTQKLQkJRk5PUkRfRT01Ci0JCUZOT1JEX0Y9NgotCQlGTk9SRF9HPTcKLQkJRk5PUkRfSD04Ci0JCWludGVnZXIgRk5PUkRfRSBGTk9SRF9GIEZOT1JEX0cgRk5PUkRfSAotCQlleHBvcnQgRk5PUkRfQyBGTk9SRF9EIEZOT1JEX0cgRk5PUkRfSAotCQlyZWFkb25seSBGTk9SRF9CIEZOT1JEX0QgRk5PUkRfRiBGTk9SRF9ICi0JCWVjaG8gRk5PUkQtMQotCQlleHBvcnQKLQkJZWNobyBGTk9SRC0yCi0JCWV4cG9ydCAtcAotCQllY2hvIEZOT1JELTMKLQkJcmVhZG9ubHkKLQkJZWNobyBGTk9SRC00Ci0JCXJlYWRvbmx5IC1wCi0JCWVjaG8gRk5PUkQtNQotCQl0eXBlc2V0Ci0JCWVjaG8gRk5PUkQtNgotCQl0eXBlc2V0IC1wCi0JCWVjaG8gRk5PUkQtNwotCQl0eXBlc2V0IC0KLQkJZWNobyBGTk9SRC04Ci0JfSB8IGZncmVwIEZOT1JECi1leHBlY3RlZC1zdGRvdXQ6Ci0JRk5PUkQtMAotCUZOT1JELTEKLQlGTk9SRF9DCi0JRk5PUkRfRAotCUZOT1JEX0cKLQlGTk9SRF9ICi0JRk5PUkQtMgotCWV4cG9ydCBGTk9SRF9DPTMKLQlleHBvcnQgRk5PUkRfRD00Ci0JZXhwb3J0IEZOT1JEX0c9NwotCWV4cG9ydCBGTk9SRF9IPTgKLQlGTk9SRC0zCi0JRk5PUkRfQgotCUZOT1JEX0QKLQlGTk9SRF9GCi0JRk5PUkRfSAotCUZOT1JELTQKLQlyZWFkb25seSBGTk9SRF9CPTIKLQlyZWFkb25seSBGTk9SRF9EPTQKLQlyZWFkb25seSBGTk9SRF9GPTYKLQlyZWFkb25seSBGTk9SRF9IPTgKLQlGTk9SRC01Ci0JdHlwZXNldCBGTk9SRF9BCi0JdHlwZXNldCAtciBGTk9SRF9CCi0JdHlwZXNldCAteCBGTk9SRF9DCi0JdHlwZXNldCAteCAtciBGTk9SRF9ECi0JdHlwZXNldCAtaSBGTk9SRF9FCi0JdHlwZXNldCAtaSAtciBGTk9SRF9GCi0JdHlwZXNldCAtaSAteCBGTk9SRF9HCi0JdHlwZXNldCAtaSAteCAtciBGTk9SRF9ICi0JRk5PUkQtNgotCXR5cGVzZXQgRk5PUkRfQT0xCi0JdHlwZXNldCAtciBGTk9SRF9CPTIKLQl0eXBlc2V0IC14IEZOT1JEX0M9MwotCXR5cGVzZXQgLXggLXIgRk5PUkRfRD00Ci0JdHlwZXNldCAtaSBGTk9SRF9FPTUKLQl0eXBlc2V0IC1pIC1yIEZOT1JEX0Y9NgotCXR5cGVzZXQgLWkgLXggRk5PUkRfRz03Ci0JdHlwZXNldCAtaSAteCAtciBGTk9SRF9IPTgKLQlGTk9SRC03Ci0JRk5PUkRfQT0xCi0JRk5PUkRfQj0yCi0JRk5PUkRfQz0zCi0JRk5PUkRfRD00Ci0JRk5PUkRfRT01Ci0JRk5PUkRfRj02Ci0JRk5PUkRfRz03Ci0JRk5PUkRfSD04Ci0JRk5PUkQtOAotLS0tCi1uYW1lOiByZWdyZXNzaW9uLTY0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHdlIGNhbiByZWRlZmluZSBmdW5jdGlvbnMgY2FsbGluZyB0aW1lIGJ1aWx0aW4KLXN0ZGluOgotCXQoKSB7Ci0JCXRpbWUgPi9kZXYvbnVsbAotCX0KLQl0IDI+L2Rldi9udWxsCi0JdCgpIHsKLQkJdGltZQotCX0KLS0tLQotbmFtZTogc3ludGF4LTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgbG9uZSBhbXBlcnNhbmQgaXMgYSBzeW50YXggZXJyb3IKLXN0ZGluOgotCSAmCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9zeW50YXggZXJyb3IvCi0tLS0KLW5hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgaW5zaWRlIG9mICR7fQotc3RkaW46Ci0JYWJjPTIKLQllY2hvICR7YWJcCi0JY30KLWV4cGVjdGVkLXN0ZG91dDoKLQkyCi0tLS0KLW5hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgYXQgdGhlIHN0YXJ0IG9mIGEgaGVyZSBkb2N1bWVudAotc3RkaW46Ci0JY2F0IDw8IEVPXAotCUYKLQloaQotCUVPRgotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi0tLS0KLW5hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgYXQgdGhlIGVuZCBvZiBhIGhlcmUgZG9jdW1lbnQKLXN0ZGluOgotCWNhdCA8PCBFT0YKLQloaQotCUVPXAotCUYKLWV4cGVjdGVkLXN0ZG91dDoKLQloaQotLS0tCi1uYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1jbWQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgaW4gYSBjb21tYW5kIGFmZmVjdCBzdWJzZXF1ZW50IGFzc2lnbm1lbnRzCi0JaW4gdGhlIHNhbWUgY29tbWFuZAotc3RkaW46Ci0JRk9PPWFiYwotCUZPTz0xMjMgQkFSPSRGT08KLQllY2hvICRCQVIKLWV4cGVjdGVkLXN0ZG91dDoKLQkxMjMKLS0tLQotbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtY21kCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIHdpdGggYQotCWNvbW1hbmQgbmFtZSBtYXRjaGVzIFBPU0lYLiBTZWU6Ci0JaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5zdGFuZGFyZHMucG9zaXguYXVzdGluLmdlbmVyYWwvMTkyNQotc3RkaW46Ci0JWD1hIFk9YjsgWD0kWSBZPSRYICIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gMSAkWCAkWSAuJzsgZWNobyAyICRYICRZIC4KLQl1bnNldCBYIFkgWgotCVg9YSBZPSR7WD1ifSBaPSRYICIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gMyAkWiAuJwotCXVuc2V0IFggWSBaCi0JWD1hIFk9JHtYPWJ9IFo9JFg7IGVjaG8gNCAkWiAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBiIGEgLgotCTIgYSBiIC4KLQkzIGIgLgotCTQgYSAuCi0tLS0KLW5hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LXBvc2l4LW5vY21kCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIHdpdGggbm8KLQljb21tYW5kIG5hbWUgbWF0Y2hlcyBQT1NJWCAoRGViaWFuICMzMzQxODIpLiBTZWU6Ci0JaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5zdGFuZGFyZHMucG9zaXguYXVzdGluLmdlbmVyYWwvMTkyNQotc3RkaW46Ci0JWD1hIFk9YjsgWD0kWSBZPSRYOyBlY2hvIDEgJFggJFkgLgotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgYiBiIC4KLS0tLQotbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtc3ViYXNzaWduCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIG1hdGNoZXMgUE9TSVg6Ci0JLSBUaGUgYXNzaWdubWVudCB3b3JkcyBzaGFsbCBiZSBleHBhbmRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24KLQkgIGVudmlyb25tZW50LgotCS0gVGhlIGFzc2lnbm1lbnRzIGhhcHBlbiBpbiB0aGUgdGVtcG9yYXJ5IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KLXN0ZGluOgotCXVuc2V0IFggWSBaCi0JWj1hIFk9JHtYOj1ifSBzaCAtYyAnZWNobyArJFgrICskWSsgKyRaKycKLQllY2hvIC8kWC8KLQkjIE5vdyBmb3IgdGhlIHNwZWNpYWwgY2FzZToKLQl1bnNldCBYIFkgWgotCVg9IFk9JHtYOj1ifSBzaCAtYyAnZWNobyArJFgrICskWSsnCi0JZWNobyAvJFgvCi1leHBlY3RlZC1zdGRvdXQ6Ci0JKysgK2IrICthKwotCS9iLwotCSsrICtiKwotCS9iLwotLS0tCi1uYW1lOiB4eHgtZXhlYy1lbnZpcm9ubWVudC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0byBzZWUgaWYgZXhlYyBzZXRzIGl0J3MgZW52aXJvbm1lbnQgY29ycmVjdGx5Ci1zdGRpbjoKLQlGT089YmFyIGV4ZWMgZW52Ci1leHBlY3RlZC1zdGRvdXQtcGF0dGVybjoKLQkvKF58LipcbilGT089YmFyXG4vCi0tLS0KLW5hbWU6IHh4eC1leGVjLWVudmlyb25tZW50LTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRvIG1ha2Ugc3VyZSBleGVjIGRvZXNuJ3QgY2hhbmdlIGVudmlyb25tZW50IGlmIGEgcHJvZ3JhbQotCWlzbid0IGV4ZWMtZWQKLXN0ZGluOgotCXNvcnRwcm9nPSQod2hlbmNlIC1wIHNvcnQpIHx8IHNvcnRwcm9nPWNhdAotCWVudiB8ICRzb3J0cHJvZyB8IGdyZXAgLXYgJ15SQU5ET009JyA+YmFyMQotCUZPTz1iYXIgZXhlYzsgZW52IHwgJHNvcnRwcm9nIHwgZ3JlcCAtdiAnXlJBTkRPTT0nID5iYXIyCi0JY21wIC1zIGJhcjEgYmFyMgotLS0tCi1uYW1lOiBleGVjLWZ1bmN0aW9uLWVudmlyb25tZW50LTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGFzc2lnbm1lbnRzIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCB3aGV0aGVyIHRoZXkgYWZmZWN0Ci0JdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50IChrc2g5MywgU1VTdjQpCi1zdGRpbjoKLQlmKCkgeyBhPTI7IH07IGcoKSB7IGI9MzsgZWNobyB5JGMtOyB9OyBhPTEgZjsgYj0yOyBjPTEgZwotCWVjaG8geCRhLSRiLSB6JGMtCi1leHBlY3RlZC1zdGRvdXQ6Ci0JeTEtCi0JeDItMy0gejEtCi0tLS0KLW5hbWU6IHh4eC13aGF0LWRvLXlvdS1jYWxsLXRoaXMtMQotc3RkaW46Ci0JZWNobyAiJHtmb286LSJhIn0qIgotZXhwZWN0ZWQtc3Rkb3V0OgotCWEqCi0tLS0KLW5hbWU6IHh4eC1wcmVmaXgtc3RyaXAtMQotc3RkaW46Ci0JZm9vPSdhIGNkZWYnCi0JZWNobyAke2ZvbyNhIGN9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JZGVmCi0tLS0KLW5hbWU6IHh4eC1wcmVmaXgtc3RyaXAtMgotc3RkaW46Ci0Jc2V0IGEgYwotCXg9J2EgY2RlZicKLQllY2hvICR7eCMkKn0KLWV4cGVjdGVkLXN0ZG91dDoKLQlkZWYKLS0tLQotbmFtZTogeHh4LXZhcmlhYmxlLXN5bnRheC0xCi1zdGRpbjoKLQllY2hvICR7On0KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTIKLXN0ZGluOgotCXNldCAwCi0JZWNobyAkeyo6MH0KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTMKLXN0ZGluOgotCXNldCAtQSBmb28gMAotCWVjaG8gJHtmb29bKl06MH0KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB4eHgtc3Vic3RpdHV0aW9uLWV2YWwtb3JkZXIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIG9yZGVyIG9mIGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMKLXN0ZGluOgotCWk9MSB4PSB5PQotCXNldCAtQSBBIGFiYyBkZWYgR0hJIGogRyBrCi0JZWNobyAke0FbeD0oaSs9MSldIyR7QVt5PShpKz0yKV19fQotCWVjaG8gJHggJHkKLWV4cGVjdGVkLXN0ZG91dDoKLQlISQotCTIgNAotLS0tCi1uYW1lOiB4eHgtc2V0LW9wdGlvbi0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBvcHRpb24gcGFyc2luZyBpbiBzZXQKLXN0ZGluOgotCXNldCAtdnNBIGZvbyAtLSBBIDEgMyAyCi0JZWNobyAke2Zvb1sqXX0KLWV4cGVjdGVkLXN0ZGVycjoKLQllY2hvICR7Zm9vWypdfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgMiAzIEEKLS0tLQotbmFtZTogeHh4LWV4ZWMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBleGVjIGV4aXRzIGZvciBidWlsdC1pbnMKLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JZXhlYyBlY2hvIGhpCi0JZWNobyBzdGlsbCBoZXJyZQotZXhwZWN0ZWQtc3Rkb3V0OgotCWhpCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLwotLS0tCi1uYW1lOiB4eHgtd2hpbGUtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB3aGlsZSBsb29wcwotCVhYWCBuZWVkIHRvIGRvIHNhbWUgZm9yIGZvci9zZWxlY3QvdW50aWwgbG9vcHMKLXN0ZGluOgotCWk9eAotCXdoaWxlIFsgJGkgIT0geHh4IF0gOyBkbwotCSAgICBpPXgkaQotCSAgICBpZiBbICRpID0geHh4IF0gOyB0aGVuCi0JCWZhbHNlCi0JCWNvbnRpbnVlCi0JICAgIGZpCi0JZG9uZQotCWVjaG8gbG9vcDE9JD8KLQkKLQlpPXgKLQl3aGlsZSBbICRpICE9IHh4eCBdIDsgZG8KLQkgICAgaT14JGkKLQkgICAgaWYgWyAkaSA9IHh4eCBdIDsgdGhlbgotCQlmYWxzZQotCQlicmVhawotCSAgICBmaQotCWRvbmUKLQllY2hvIGxvb3AyPSQ/Ci0JCi0JaT14Ci0Jd2hpbGUgWyAkaSAhPSB4eHggXSA7IGRvCi0JICAgIGk9eCRpCi0JICAgIGZhbHNlCi0JZG9uZQotCWVjaG8gbG9vcDM9JD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlsb29wMT0wCi0JbG9vcDI9MAotCWxvb3AzPTEKLS0tLQotbmFtZTogeHh4LXN0YXR1cy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IGJsYW5rIGxpbmVzIGRvbid0IGNsZWFyICQ/Ci1hcmd1bWVudHM6ICEtaSEKLXN0ZGluOgotCShleGl0IDEpCi0JZWNobyAkPwotCShleGl0IDEpCi0JCi0JZWNobyAkPwotCXRydWUKLWV4cGVjdGVkLXN0ZG91dDoKLQkxCi0JMQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi8KLS0tLQotbmFtZTogeHh4LXN0YXR1cy0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICQ/IGlzIHByZXNlcnZlZCBpbiBzdWJzaGVsbHMsIGluY2x1ZGVzLCB0cmFwcy4KLXN0ZGluOgotCShleGl0IDEpCi0JCi0JZWNobyBibGFuazogJD8KLQkKLQkoZXhpdCAyKQotCShlY2hvIHN1YnNoZWxsOiAkPykKLQkKLQllY2hvICdlY2hvIGluY2x1ZGU6ICQ/JyA+IGZvbwotCShleGl0IDMpCi0JLiAuL2ZvbwotCQotCXRyYXAgJ2VjaG8gdHJhcDogJD8nIEVSUgotCShleGl0IDQpCi0JZWNobyBleGl0OiAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWJsYW5rOiAxCi0Jc3Vic2hlbGw6IDIKLQlpbmNsdWRlOiAzCi0JdHJhcDogNAotCWV4aXQ6IDQKLS0tLQotbmFtZTogeHh4LWNsZWFuLWNoYXJzLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIE1BR0lDIGNoYXJhY3RlciBpcyBzdHVmZmVkIGNvcnJlY3RseQotc3RkaW46Ci0JZWNobyBgZWNobyBbo2AKLWV4cGVjdGVkLXN0ZG91dDoKLQlbowotLS0tCi1uYW1lOiB4eHgtcGFyYW0tc3Vic3QtcW1hcmstMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcHJlc2lvbiBvZiBlcnJvciBtZXNzYWdlIHdpdGggbnVsbCBzdHJpbmcuICBBY2NvcmRpbmcgdG8KLQlQT1NJWCwgaXQgc2hvdWxkbid0IHByaW50IHRoZSBlcnJvciBhcyAnd29yZCcgaXNuJ3Qgb21taXR0ZWQuCi0Ja3NoODgvOTMsIFNvbGFyaXMgL2Jpbi9zaCBhbmQgL3Vzci94cGc0L2Jpbi9zaCBhbGwgcHJpbnQgdGhlIGVycm9yLAotCXRoYXQncyB3aHkgdGhlIGNvbmRpdGlvbiBpcyByZXZlcnNlZC4KLXN0ZGluOgotCXVuc2V0IGZvbwotCXg9Ci0JZWNobyB4JHtmb28/JHh9Ci1leHBlY3RlZC1leGl0OiAxCi0jIFBPU0lYCi0jZXhwZWN0ZWQtZmFpbDogeWVzCi0jZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46ICEvbm90IHNldC8KLSMgY29tbW9uIHVzZQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9wYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0LwotLS0tCi1uYW1lOiB4eHgtcGFyYW0tXy0xCi0jIGZhaWxzIGR1ZSB0byB3ZWlyZG5lc3Mgb2YgZXhlY3Ygc3R1ZmYKLWNhdGVnb3J5OiAhb3M6dXdpbi1udAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgYyBmbGFnIGlzIHNldC4KLWFyZ3VtZW50czogIS1jIWVjaG8gIlskLV0iIQotZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46IC9eXFsuKmMuKlxdJC8KLS0tLQotbmFtZTogdGlsZGUtZXhwYW5kLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRpbGRlIGV4cGFuc2lvbiBhZnRlciBlcXVhbCBzaWducwotZW52LXNldHVwOiAhSE9NRT0vc3dlZXQhCi1zdGRpbjoKLQllY2hvICR7QT1hPX1+IGI9fiBjPWR+IH4KLQlzZXQgK28gYnJhY2VleHBhbmQKLQllY2hvICR7QT1hPX1+IGI9fiBjPWR+IH4KLWV4cGVjdGVkLXN0ZG91dDoKLQlhPS9zd2VldCBiPS9zd2VldCBjPWR+IC9zd2VldAotCWE9fiBiPX4gYz1kfiAvc3dlZXQKLS0tLQotbmFtZTogZXhpdC1lcnItMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSAiZXhpdCBvbiBlcnJvciIgY29uZGl0aW9ucwotc3RkaW46Ci0Jc2V0IC1leAotCS91c3IvYmluL2VudiBmYWxzZSAmJiBlY2hvIHNvbWV0aGluZwotCWVjaG8gRU5ECi1leHBlY3RlZC1zdGRvdXQ6Ci0JRU5ECi1leHBlY3RlZC1zdGRlcnI6Ci0JKyAvdXNyL2Jpbi9lbnYgZmFsc2UKLQkrIGVjaG8gRU5ECi0tLS0KLW5hbWU6IGV4aXQtZXJyLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHNvbWUgImV4aXQgb24gZXJyb3IiIGVkZ2UgY29uZGl0aW9ucyAoUE9TSVhseSkKLXN0ZGluOgotCXNldCAtZXgKLQlpZiAvdXNyL2Jpbi9lbnYgdHJ1ZTsgdGhlbgotCQkvdXNyL2Jpbi9lbnYgZmFsc2UgJiYgZWNobyBzb21ldGhpbmcKLQlmaQotCWVjaG8gRU5ECi1leHBlY3RlZC1zdGRvdXQ6Ci0JRU5ECi1leHBlY3RlZC1zdGRlcnI6Ci0JKyAvdXNyL2Jpbi9lbnYgdHJ1ZQotCSsgL3Vzci9iaW4vZW52IGZhbHNlCi0JKyBlY2hvIEVORAotLS0tCi1uYW1lOiBleGl0LWVyci0zCi1kZXNjcmlwdGlvbjoKLQlwZGtzaCByZWdyZXNzaW9uIHdoaWNoIEFUJlQga3NoIGRvZXMgcmlnaHQKLQlURk0gc2F5czogW3NldF0gLWUgfCBlcnJleGl0Ci0JCUV4aXQgKGFmdGVyIGV4ZWN1dGluZyB0aGUgRVJSIHRyYXApIC4uLgotc3RkaW46Ci0JdHJhcCAnZWNobyBFWElUJyBFWElUCi0JdHJhcCAnZWNobyBFUlInIEVSUgotCXNldCAtZQotCWNkIC9YWFhYWCAyPi9kZXYvbnVsbAotCWVjaG8gRE9ORQotCWV4aXQgMAotZXhwZWN0ZWQtc3Rkb3V0OgotCUVSUgotCUVYSVQKLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotLS0tCi1uYW1lOiBleGl0LWVyci00Ci1kZXNjcmlwdGlvbjoKLQkic2V0IC1lIiB0ZXN0IHN1aXRlIChQT1NJWCkKLXN0ZGluOgotCXNldCAtZQotCWVjaG8gcHJlCi0JaWYgdHJ1ZSA7IHRoZW4KLQkJZmFsc2UgJiYgZWNobyBmb28KLQlmaQotCWVjaG8gYmFyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JcHJlCi0JYmFyCi0tLS0KLW5hbWU6IGV4aXQtZXJyLTUKLWRlc2NyaXB0aW9uOgotCSJzZXQgLWUiIHRlc3Qgc3VpdGUgKFBPU0lYKQotc3RkaW46Ci0Jc2V0IC1lCi0JZm9vKCkgewotCQl3aGlsZSBbICIkMSIgXTsgZG8KLQkJCWZvciBFIGluICR4OyBkbwotCQkJCVsgIiQxIiA9ICIkRSIgXSAmJiB7IHNoaWZ0IDsgY29udGludWUgMiA7IH0KLQkJCWRvbmUKLQkJCXg9IiR4ICQxIgotCQkJc2hpZnQKLQkJZG9uZQotCQllY2hvICR4Ci0JfQotCWVjaG8gcHJlCi0JZm9vIGEgYiBiIGMKLQllY2hvIHBvc3QKLWV4cGVjdGVkLXN0ZG91dDoKLQlwcmUKLQlhIGIgYwotCXBvc3QKLS0tLQotbmFtZTogZXhpdC1lcnItNgotZGVzY3JpcHRpb246Ci0JInNldCAtZSIgdGVzdCBzdWl0ZSAoQlNEIG1ha2UpCi1jYXRlZ29yeTogb3M6bWlyYnNkCi1zdGRpbjoKLQlta2RpciB6ZCB6ZC9hIHpkL2IKLQlwcmludCAnYWxsOlxuXHRAZWNobyBlaW5zXG5cdEBleGl0IDQyXG4nID56ZC9hL01ha2VmaWxlCi0JcHJpbnQgJ2FsbDpcblx0QGVjaG8gendlaVxuJyA+emQvYi9NYWtlZmlsZQotCXdkPSQocHdkKQotCXNldCAtZQotCWZvciBlbnRyeSBpbiBhIGI7IGRvICggIHNldCAtZTsgIGlmIFtbIC1kICR3ZC96ZC8kZW50cnkuaTM4NiBdXTsgdGhlbiAgX25ld2Rpcl89IiRlbnRyeS5pMzg2IjsgIGVsc2UgIF9uZXdkaXJfPSIkZW50cnkiOyAgZmk7ICBpZiBbWyAteiAkX1RISVNESVJfIF1dOyB0aGVuICBfbmV4dGRpcl89IiRfbmV3ZGlyXyI7ICBlbHNlICBfbmV4dGRpcl89IiRfVEhJU0RJUl8vJF9uZXdkaXJfIjsgIGZpOyAgX21ha2VmaWxlX3NwZWNfPTsgIFtbICEgLWYgJHdkL3pkLyRfbmV3ZGlyXy9NYWtlZmlsZS5ic2Qtd3JhcHBlciBdXSAgfHwgX21ha2VmaWxlX3NwZWNfPSItZiBNYWtlZmlsZS5ic2Qtd3JhcHBlciI7ICBzdWJza2lwZGlyPTsgIGZvciBza2lwZGlyIGluIDsgZG8gIHN1YmVudHJ5PSR7c2tpcGRpciMkZW50cnl9OyAgaWYgW1sgJHN1YmVudHJ5ICE9ICRza2lwZGlyIF1dOyB0aGVuICBpZiBbWyAteiAkc3ViZW50cnkgXV07IHRoZW4gIGVjaG8gIigkX25leHRkaXJfIHNraXBwZWQpIjsgIGJyZWFrOyAgZmk7ICBzdWJza2lwZGlyPSIkc3Vic2tpcGRpciAke3N1YmVudHJ5Iy99IjsgIGZpOyAgZG9uZTsgIGlmIFtbIC16ICRza2lwZGlyIHx8IC1uICRzdWJlbnRyeSBdXTsgdGhlbiAgZWNobyAiPT09PiAkX25leHRkaXJfIjsgIGNkICR3ZC96ZC8kX25ld2Rpcl87ICBtYWtlIFNLSVBESVI9IiRzdWJza2lwZGlyIiAkX21ha2VmaWxlX3NwZWNfICBfVEhJU0RJUl89IiRfbmV4dGRpcl8iICAgYWxsOyAgZmk7ICApIGRvbmUgMj4mMSB8IHNlZCAicyEkd2QhV0QhZyIKLWV4cGVjdGVkLXN0ZG91dDoKLQk9PT0+IGEKLQllaW5zCi0JKioqIEVycm9yIGNvZGUgNDIKLQkKLQlTdG9wIGluIFdEL3pkL2EgKGxpbmUgMiBvZiBNYWtlZmlsZSkuCi0tLS0KLW5hbWU6IGV4aXQtZW5vZW50LTEKLWRlc2NyaXB0aW9uOgotCVNVU3Y0IHNheXMgdGhhdCB0aGUgc2hlbGwgc2hvdWxkIGV4aXQgd2l0aCAxMjYvMTI3IGluIHNvbWUgc2l0dWF0aW9ucwotc3RkaW46Ci0JaT0wCi0JKGVjaG87IGVjaG8gOikgPngKLQkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgotCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCi0JZWNobyBleGl0IDQyID54Ci0JIiRfX3Byb2duYW1lIiAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KLQkiJF9fcHJvZ25hbWUiIC1jIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgotCXJtIC1mIHgKLQkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgotCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMCAwIC4KLQkxIDEyNiAuCi0JMiA0MiAuCi0JMyAxMjYgLgotCTQgMTI3IC4KLQk1IDEyNyAuCi0tLS0KLW5hbWU6IGV4aXQtZXZhbC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBldmFsIHZzIHN1YnN0aXR1dGlvbiBleGl0IGNvZGVzIChrc2g5MyBhbGlrZSkKLXN0ZGluOgotCWV2YWwgJChmYWxzZSkKLQllY2hvIEEgJD8KLQlldmFsICcgJChmYWxzZSknCi0JZWNobyBCICQ/Ci0JZXZhbCAiICQoZmFsc2UpIgotCWVjaG8gQyAkPwotCWV2YWwgImV2YWwgJChmYWxzZSkiCi0JZWNobyBEICQ/Ci0JZXZhbCAnZXZhbCAnIiQoZmFsc2UpIgotCWVjaG8gRSAkPwotCUlGUz0iJElGUzoiCi0JZXZhbCAkKGVjaG8gOjsgZmFsc2UpCi0JZWNobyBGICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JQSAwCi0JQiAxCi0JQyAwCi0JRCAwCi0JRSAwCi0JRiAwCi0tLS0KLW5hbWU6IHRlc3Qtc3RsdC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRlc3QgYWxzbyBjYW4gaGFuZGxlIHN0cmluZzEgPCBzdHJpbmcyIGV0Yy4KLXN0ZGluOgotCXRlc3QgMjAwNS8xMC8wOCAnPCcgMjAwNS8wOC8yMSAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgotCXRlc3QgMjAwNS8wOC8yMSBcPCAyMDA1LzEwLzA4ICYmIGVjaG8gamEgfHwgZWNobyBuZWluCi0JdGVzdCAyMDA1LzEwLzA4ICc+JyAyMDA1LzA4LzIxICYmIGVjaG8gamEgfHwgZWNobyBuZWluCi0JdGVzdCAyMDA1LzA4LzIxIFw+IDIwMDUvMTAvMDggJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KLWV4cGVjdGVkLXN0ZG91dDoKLQluZWluCi0JamEKLQlqYQotCW5laW4KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAhL3VuZXhwZWN0ZWQgb3AvCi0tLS0KLW5hbWU6IHRlc3QtcHJlY2VkZW5jZS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBhIHdlaXJkIHByZWNlZGVuY2UgY2FzZSAoYW5kIFBPU0lYIGVjaG8pCi1zdGRpbjoKLQl0ZXN0IFwoIC1mID0gLWYgXCkKLQlydj0kPwotCXRlc3QgLW4gIiRQT1NIX1ZFUlNJT04iIHx8IHNldCAtbyBzaAotCWVjaG8gLWUgJHJ2Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JLWUgMAotLS0tCi1uYW1lOiB0ZXN0LW9wdGlvbi0xCi1kZXNjcmlwdGlvbjoKLQlUZXN0IHRoZSB0ZXN0IC1vIG9wZXJhdG9yCi1zdGRpbjoKLQlydW50ZXN0KCkgewotCQl0ZXN0IC1vICQxOyBlY2hvICQ/Ci0JCVsgLW8gJDEgXTsgZWNobyAkPwotCQlbWyAtbyAkMSBdXTsgZWNobyAkPwotCX0KLQlpZl90ZXN0KCkgewotCQl0ZXN0IC1vICQxIC1vIC1vICEkMTsgZWNobyAkPwotCQlbIC1vICQxIC1vIC1vICEkMSBdOyBlY2hvICQ/Ci0JCVtbIC1vICQxIHx8IC1vICEkMSBdXTsgZWNobyAkPwotCQl0ZXN0IC1vID8kMTsgZWNobyAkPwotCX0KLQllY2hvIDB5ICQoaWZfdGVzdCB1dGY4LW1vZGUpID0KLQllY2hvIDBuICQoaWZfdGVzdCB1dGY4LWhhY2spID0KLQllY2hvIDE9ICQocnVudGVzdCB1dGY4LWhhY2spID0KLQllY2hvIDI9ICQocnVudGVzdCAhdXRmOC1oYWNrKSA9Ci0JZWNobyAzPSAkKHJ1bnRlc3QgP3V0ZjgtaGFjaykgPQotCXNldCArVQotCWVjaG8gMSsgJChydW50ZXN0IHV0ZjgtbW9kZSkgPQotCWVjaG8gMisgJChydW50ZXN0ICF1dGY4LW1vZGUpID0KLQllY2hvIDMrICQocnVudGVzdCA/dXRmOC1tb2RlKSA9Ci0Jc2V0IC1VCi0JZWNobyAxLSAkKHJ1bnRlc3QgdXRmOC1tb2RlKSA9Ci0JZWNobyAyLSAkKHJ1bnRlc3QgIXV0ZjgtbW9kZSkgPQotCWVjaG8gMy0gJChydW50ZXN0ID91dGY4LW1vZGUpID0KLQllY2hvID0gc2hvcnQgZmxhZ3MgPQotCWVjaG8gMHkgJChpZl90ZXN0IC1VKSA9Ci0JZWNobyAweSAkKGlmX3Rlc3QgK1UpID0KLQllY2hvIDBuICQoaWZfdGVzdCAtXykgPQotCWVjaG8gMG4gJChpZl90ZXN0IC1VLSkgPQotCWVjaG8gMT0gJChydW50ZXN0IC1fKSA9Ci0JZWNobyAyPSAkKHJ1bnRlc3QgIS1fKSA9Ci0JZWNobyAzPSAkKHJ1bnRlc3QgPy1fKSA9Ci0Jc2V0ICtVCi0JZWNobyAxKyAkKHJ1bnRlc3QgLVUpID0KLQllY2hvIDIrICQocnVudGVzdCAhLVUpID0KLQllY2hvIDMrICQocnVudGVzdCA/LVUpID0KLQllY2hvIDErICQocnVudGVzdCArVSkgPQotCWVjaG8gMisgJChydW50ZXN0ICErVSkgPQotCWVjaG8gMysgJChydW50ZXN0ID8rVSkgPQotCXNldCAtVQotCWVjaG8gMS0gJChydW50ZXN0IC1VKSA9Ci0JZWNobyAyLSAkKHJ1bnRlc3QgIS1VKSA9Ci0JZWNobyAzLSAkKHJ1bnRlc3QgPy1VKSA9Ci0JZWNobyAxLSAkKHJ1bnRlc3QgK1UpID0KLQllY2hvIDItICQocnVudGVzdCAhK1UpID0KLQllY2hvIDMtICQocnVudGVzdCA/K1UpID0KLWV4cGVjdGVkLXN0ZG91dDoKLQkweSAwIDAgMCAwID0KLQkwbiAxIDEgMSAxID0KLQkxPSAxIDEgMSA9Ci0JMj0gMSAxIDEgPQotCTM9IDEgMSAxID0KLQkxKyAxIDEgMSA9Ci0JMisgMCAwIDAgPQotCTMrIDAgMCAwID0KLQkxLSAwIDAgMCA9Ci0JMi0gMSAxIDEgPQotCTMtIDAgMCAwID0KLQk9IHNob3J0IGZsYWdzID0KLQkweSAwIDAgMCAwID0KLQkweSAwIDAgMCAwID0KLQkwbiAxIDEgMSAxID0KLQkwbiAxIDEgMSAxID0KLQkxPSAxIDEgMSA9Ci0JMj0gMSAxIDEgPQotCTM9IDEgMSAxID0KLQkxKyAxIDEgMSA9Ci0JMisgMCAwIDAgPQotCTMrIDAgMCAwID0KLQkxKyAxIDEgMSA9Ci0JMisgMCAwIDAgPQotCTMrIDAgMCAwID0KLQkxLSAwIDAgMCA9Ci0JMi0gMSAxIDEgPQotCTMtIDAgMCAwID0KLQkxLSAwIDAgMCA9Ci0JMi0gMSAxIDEgPQotCTMtIDAgMCAwID0KLS0tLQotbmFtZTogbWtzaHJjLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KLQlQYXJ0IDE6IHZlcmlmeSB1c2VyIGVudmlyb25tZW50IGlzIG5vdCByZWFkIChpbnRlcm5hbCkKLXN0ZGluOgotCWVjaG8geCAkRk5PUkQKLWV4cGVjdGVkLXN0ZG91dDoKLQl4Ci0tLS0KLW5hbWU6IG1rc2hyYy0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgotCVBhcnQgMjogdmVyaWZ5IG1rc2hyYyBpcyBub3QgcmVhZCAobm9uLWludGVyYWN0aXZlIHNoZWxscykKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIubWtzaHJjIgotCUZOT1JEPTQyCi1lbnYtc2V0dXA6ICFIT01FPS4hRU5WPSEKLXN0ZGluOgotCWVjaG8geCAkRk5PUkQKLWV4cGVjdGVkLXN0ZG91dDoKLQl4Ci0tLS0KLW5hbWU6IG1rc2hyYy0yYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgotCVBhcnQgMjogdmVyaWZ5IG1rc2hyYyBjYW4gYmUgcmVhZCAoaW50ZXJhY3RpdmUgc2hlbGxzKQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5ta3NocmMiCi0JRk5PUkQ9NDIKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhSE9NRT0uIUVOVj0hUFMxPSEKLXN0ZGluOgotCWVjaG8geCAkRk5PUkQKLWV4cGVjdGVkLXN0ZG91dDoKLQl4IDQyCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvKCMgKSovCi0tLS0KLW5hbWU6IG1rc2hyYy0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCi0JUGFydCAzOiB2ZXJpZnkgbWtzaHJjIGNhbiBiZSB0dXJuZWQgb2ZmCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiLm1rc2hyYyIKLQlGTk9SRD00MgotZW52LXNldHVwOiAhSE9NRT0uIUVOVj1ub25leGlzdGFudCEKLXN0ZGluOgotCWVjaG8geCAkRk5PUkQKLWV4cGVjdGVkLXN0ZG91dDoKLQl4Ci0tLS0KLW5hbWU6IHNoLW1vZGUtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBzaCBtb2RlIHR1cm5zIGJyYWNlZXhwYW5kIG9mZgotCWFuZCB0aGF0IHRoYXQgd29ya3MgY29ycmVjdGx5Ci1zdGRpbjoKLQlzZXQgLW8gYnJhY2VleHBhbmQKLQlzZXQgK28gc2gKLQlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCi0JW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKLQllY2hvIHthLGIsY30KLQlzZXQgK28gYnJhY2VleHBhbmQKLQllY2hvIHthLGIsY30KLQlzZXQgLW8gYnJhY2VleHBhbmQKLQllY2hvIHthLGIsY30KLQlzZXQgLW8gc2gKLQllY2hvIHthLGIsY30KLQlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCi0JW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKLQlzZXQgLW8gYnJhY2VleHBhbmQKLQllY2hvIHthLGIsY30KLQlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCi0JW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKLWV4cGVjdGVkLXN0ZG91dDoKLQlub3NoCi0JYnJleAotCWEgYiBjCi0Je2EsYixjfQotCWEgYiBjCi0Je2EsYixjfQotCXNoCi0Jbm9icmV4Ci0JYSBiIGMKLQlzaAotCWJyZXgKLS0tLQotbmFtZTogc2gtbW9kZS0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCBzaCBtb2RlIGlzICpub3QqIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uCi1jYXRlZ29yeTogIWJpbnNoCi1zdGRpbjoKLQlsbiAtcyAiJF9fcHJvZ25hbWUiIGtzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgc2gKLQlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLWtzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgLi8tc2gKLQlmb3Igc2hlbGwgaW4geywtfXssa31zaDsgZG8KLQkJcHJpbnQgLS0gJHNoZWxsICQoLi8kc2hlbGwgK2wgLWMgXAotCQkgICAgJ1tbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gnKQotCWRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlzaCBub3NoCi0Ja3NoIG5vc2gKLQktc2ggbm9zaAotCS1rc2ggbm9zaAotLS0tCi1uYW1lOiBzaC1tb2RlLTJiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHNoIG1vZGUgKmlzKiBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbgotY2F0ZWdvcnk6IGJpbnNoCi1zdGRpbjoKLQlsbiAtcyAiJF9fcHJvZ25hbWUiIGtzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgc2gKLQlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLWtzaAotCWxuIC1zICIkX19wcm9nbmFtZSIgLi8tc2gKLQlmb3Igc2hlbGwgaW4geywtfXssa31zaDsgZG8KLQkJcHJpbnQgLS0gJHNoZWxsICQoLi8kc2hlbGwgK2wgLWMgXAotCQkgICAgJ1tbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gnKQotCWRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlzaCBzaAotCWtzaCBub3NoCi0JLXNoIHNoCi0JLWtzaCBub3NoCi0tLS0KLW5hbWU6IHBpcGVsaW5lLTEKLWRlc2NyaXB0aW9uOgotCXBka3NoIGJ1ZzogbGFzdCBjb21tYW5kIG9mIGEgcGlwZWxpbmUgaXMgZXhlY3V0ZWQgaW4gYQotCXN1YnNoZWxsIC0gbWFrZSBzdXJlIGl0IHN0aWxsIGlzLCBzY3JpcHRzIGRlcGVuZCBvbiBpdAotZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3giCi1maWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeSIKLXN0ZGluOgotCWVjaG8gKgotCWVjaG8gYSB8IHdoaWxlIHJlYWQgZDsgZG8KLQkJZWNobyAkZAotCQllY2hvICRkKgotCQllY2hvICoKLQkJc2V0IC1vIG5vZ2xvYgotCQllY2hvICRkKgotCQllY2hvICoKLQlkb25lCi0JZWNobyAqCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYWJjeCBhYmN5Ci0JYQotCWFiY3ggYWJjeQotCWFiY3ggYWJjeQotCWEqCi0JKgotCWFiY3ggYWJjeQotLS0tCi1uYW1lOiBwaXBlbGluZS0yCi1kZXNjcmlwdGlvbjoKLQljaGVjayB0aGF0IGNvLXByb2Nlc3NlcyB3b3JrIHdpdGggVENPTXMsIFRQSVBFcyBhbmQgVFBBUkVOcwotc3RkaW46Ci0JIiRfX3Byb2duYW1lIiAtYyAnaT0xMDA7IGVjaG8gaGkgfCYgd2hpbGUgcmVhZCAtcCBsaW5lOyBkbyBlY2hvICIkKChpKyspKSAkbGluZSI7IGRvbmUnCi0JIiRfX3Byb2duYW1lIiAtYyAnaT0yMDA7IGVjaG8gaGkgfCBjYXQgfCYgd2hpbGUgcmVhZCAtcCBsaW5lOyBkbyBlY2hvICIkKChpKyspKSAkbGluZSI7IGRvbmUnCi0JIiRfX3Byb2duYW1lIiAtYyAnaT0zMDA7IChlY2hvIGhpIHwgY2F0KSB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKLWV4cGVjdGVkLXN0ZG91dDoKLQkxMDAgaGkKLQkyMDAgaGkKLQkzMDAgaGkKLS0tLQotbmFtZTogcGVyc2lzdC1oaXN0b3J5LTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHBlcnNpc3RlbnQgaGlzdG9yeSBzYXZpbmcgd29ya3MKLWNhdGVnb3J5OiAhbm8taGlzdGZpbGUKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKLWZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCi0JUFMxPVgKLXN0ZGluOgotCWNhdCBoaXN0LmZpbGUKLWV4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOgotCS9jYXQgaGlzdC5maWxlLwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL15YKiQvCi0tLS0KLW5hbWU6IHR5cGVzZXQtcGFkZGluZy0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBsZWZ0L3JpZ2h0IGp1c3RpZmljYXRpb24gd29ya3MgYXMgcGVyIFRGTQotc3RkaW46Ci0JdHlwZXNldCAtTDEwIGxuPTBoYWxsMAotCXR5cGVzZXQgLVIxMCBybj0waGFsbDAKLQl0eXBlc2V0IC1aTDEwIGx6PTBoYWxsMAotCXR5cGVzZXQgLVpSMTAgcno9MGhhbGwwCi0JdHlwZXNldCAtWjEwIHJ4PSIgaGFsbG8gIgotCWVjaG8gIjwkbG4+IDwkcm4+IDwkbHo+IDwkcno+IDwkcng+IgotZXhwZWN0ZWQtc3Rkb3V0OgotCTwwaGFsbDAgICAgPiA8ICAgIDBoYWxsMD4gPGhhbGwwICAgICA+IDwwMDAwMGhhbGwwPiA8MDAwMCBoYWxsbz4KLS0tLQotbmFtZTogdHlwZXNldC1wYWRkaW5nLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGJhc2UtITEwIGludGVnZXJzIGFyZSBwYWRkZWQgcmlnaHQKLXN0ZGluOgotCXR5cGVzZXQgLVV1aTE2IC1MOSBsbj0xNiMxCi0JdHlwZXNldCAtVXVpMTYgLVI5IHJuPTE2IzEKLQl0eXBlc2V0IC1VdWkxNiAtWjkgem49MTYjMQotCXR5cGVzZXQgLUw5IGxzPTE2IzEKLQl0eXBlc2V0IC1SOSBycz0xNiMxCi0JdHlwZXNldCAtWjkgenM9MTYjMQotCWVjaG8gIjwkbG4+IDwkcm4+IDwkem4+IDwkbHM+IDwkcnM+IDwkenM+IgotZXhwZWN0ZWQtc3Rkb3V0OgotCTwxNiMxICAgICA+IDwgICAgIDE2IzE+IDwxNiMwMDAwMDE+IDwxNiMxICAgICA+IDwgICAgIDE2IzE+IDwwMDAwMDE2IzE+Ci0tLS0KLW5hbWU6IHV0Zjhib20tMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCB0aGUgVVRGLTggQnl0ZSBPcmRlciBNYXJrIGlzIGlnbm9yZWQgYXMgdGhlIGZpcnN0Ci0JbXVsdGlieXRlIGNoYXJhY3RlciBvZiB0aGUgc2hlbGwgaW5wdXQgKHdpdGggLWMsIGZyb20gc3RhbmRhcmQKLQlpbnB1dCwgYXMgZmlsZSwgb3IgYXMgZXZhbCBhcmd1bWVudCksIGJ1dCBub3doZXJlIGVsc2UKLSMgYnJlYWtzIG9uIE1hYyBPU1ggKEhGUysgbm9uLXN0YW5kYXJkIFVuaWNvZGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24pCi1jYXRlZ29yeTogIW9zOmRhcndpbgotc3RkaW46Ci0JbWtkaXIgZm9vCi0JcHJpbnQgJyMhL2Jpbi9zaFxuZWNobyBvaG5lJyA+Zm9vL2Zub3JkCi0JcHJpbnQgJyMhL2Jpbi9zaFxuZWNobyBtaXQnID5mb28v77u/Zm5vcmQKLQlwcmludCAn77u/Zm5vcmRcbmZub3JkXG7vu79mbm9yZFxuZm5vcmQnID5mb28vYmFyCi0JcHJpbnQgZXZhbCBcJyfvu79mbm9yZFxuZm5vcmRcbu+7v2Zub3JkXG5mbm9yZCdcJyA+Zm9vL3pvbwotCXNldCAtQSBhbnphaGwgLS0gZm9vLyoKLQllY2hvIGdvdCAkeyNhbnphaGxbKl19IGZpbGVzCi0JY2htb2QgK3ggZm9vLyoKLQlleHBvcnQgUEFUSD0kKHB3ZCkvZm9vOiRQQVRICi0JIiRfX3Byb2duYW1lIiAtYyAn77u/Zm5vcmQnCi0JZWNobyA9Ci0JIiRfX3Byb2duYW1lIiAtYyAn77u/Zm5vcmQ7IGZub3JkOyDvu79mbm9yZDsgZm5vcmQnCi0JZWNobyA9Ci0JIiRfX3Byb2duYW1lIiBmb28vYmFyCi0JZWNobyA9Ci0JIiRfX3Byb2duYW1lIiA8Zm9vL2JhcgotCWVjaG8gPQotCSIkX19wcm9nbmFtZSIgZm9vL3pvbwotCWVjaG8gPQotCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8g77u/OiAkKO+7v2Zub3JkKScKLQlybSAtcmYgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZ290IDQgZmlsZXMKLQlvaG5lCi0JPQotCW9obmUKLQlvaG5lCi0JbWl0Ci0Jb2huZQotCT0KLQlvaG5lCi0Jb2huZQotCW1pdAotCW9obmUKLQk9Ci0Jb2huZQotCW9obmUKLQltaXQKLQlvaG5lCi0JPQotCW9obmUKLQlvaG5lCi0JbWl0Ci0Jb2huZQotCT0KLQnvu786IG1pdAotLS0tCi1uYW1lOiB1dGY4Ym9tLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgd2UgY2FuIGV4ZWN1dGUgQk9NLXNoZWJhbmdzIChmYWlsdXJlcyBub3QgZmF0YWwpCi0JWFhYIGlmIHRoZSBPUyBjYW4gYWxyZWFkeSBleGVjdXRlIHRoZW0sIHdlIGxvc2UKLQlub3RlOiBjeWd3aW4gZXhlY3ZlKDIpIGRvZXNuJ3QgcmV0dXJuIHRvIHVzIHdpdGggRU5PRVhFQywgd2UgbG9zZQotCW5vdGU6IFVsdHJpeCBwZXJsNSB0NCByZXR1cm5zIDY1MjgwIChleGl0LWNvZGUgMjU1KSBhbmQgbm8gdGV4dAotY2F0ZWdvcnk6ICFvczpjeWd3aW4sIW9zOnV3aW4tbnQsIW9zOnVsdHJpeCwhc21rc2gKLWVudi1zZXR1cDogIUZPTz1CQVIhCi1zdGRpbjoKLQlwcmludCAnIyEnIiRfX3Byb2duYW1lIidcbnByaW50ICIxIGE9JEVOVntGT099IjsnID50MQotCXByaW50ICfvu78jISciJF9fcHJvZ25hbWUiJ1xucHJpbnQgIjIgYT0kRU5We0ZPT30iOycgPnQyCi0JcHJpbnQgJyMhJyIkX19wZXJsbmFtZSInXG5wcmludCAiMyBhPSRFTlZ7Rk9PfVxuIjsnID50MwotCXByaW50ICfvu78jISciJF9fcGVybG5hbWUiJ1xucHJpbnQgIjQgYT0kRU5We0ZPT31cbiI7JyA+dDQKLQljaG1vZCAreCB0PwotCS4vdDEKLQkuL3QyCi0JLi90MwotCS4vdDQKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIGE9L25vbmV4aXN0YW50e0ZPT30KLQkyIGE9L25vbmV4aXN0YW50e0ZPT30KLQkzIGE9QkFSCi0JNCBhPUJBUgotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLyhVbnJlY29nbml6ZWQgY2hhcmFjdGVyIC4uLi4gaWdub3JlZCBhdCBcLi50NCBsaW5lIDEpKi8KLS0tLQotbmFtZTogdXRmOGJvbS0zCi1kZXNjcmlwdGlvbjoKLQlSZWFkaW5nIHRoZSBVVEYtOCBCT00gc2hvdWxkIGVuYWJsZSB0aGUgdXRmOC1tb2RlIGZsYWcKLXN0ZGluOgotCSIkX19wcm9nbmFtZSIgLWMgJzo7IGlmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gMSBvbjsgZWxzZSBlY2hvIDEgb2ZmOyBmaScKLQkiJF9fcHJvZ25hbWUiIC1jICfvu786OyBpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbiBlY2hvIDIgb247IGVsc2UgZWNobyAyIG9mZjsgZmknCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSBvZmYKLQkyIG9uCi0tLS0KLW5hbWU6IHV0ZjhvcHQtMWEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIG5vdCBzZXQgYXQgbm9uLWludGVyYWN0aXZlIHN0YXJ0dXAKLWNhdGVnb3J5OiAhb3M6aHB1eAotZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLlVURi04IQotc3RkaW46Ci0JaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KLQkJZWNobyBpcyBzZXQKLQllbHNlCi0JCWVjaG8gaXMgbm90IHNldAotCWZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaXMgbm90IHNldAotLS0tCi1uYW1lOiB1dGY4b3B0LTFiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBub3Qgc2V0IGF0IG5vbi1pbnRlcmFjdGl2ZSBzdGFydHVwCi1jYXRlZ29yeTogb3M6aHB1eAotZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLnV0ZjghCi1zdGRpbjoKLQlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgotCQllY2hvIGlzIHNldAotCWVsc2UKLQkJZWNobyBpcyBub3Qgc2V0Ci0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlpcyBub3Qgc2V0Ci0tLS0KLW5hbWU6IHV0ZjhvcHQtMmEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIHNldCBhdCBpbnRlcmFjdGl2ZSBzdGFydHVwLgotCS1ETUtTSF9BU1NVTUVfVVRGOD0wID0+IGV4cGVjdGVkIGZhaWx1cmUsIHBsZWFzZSBpZ25vcmUKLQktRE1LU0hfQVNTVU1FX1VURjg9MSA9PiBub3QgZXhwZWN0ZWQsIHBsZWFzZSBpbnZlc3RpZ2F0ZQotCS1VTUtTSF9BU1NVTUVfVVRGOCA9PiBub3QgZXhwZWN0ZWQsIGJ1dCBpZiB5b3VyIE9TIGlzIG9sZCwKLQkgdHJ5IHBhc3NpbmcgSEFWRV9TRVRMT0NBTEVfQ1RZUEU9MCB0byBCdWlsZC5zaAotY2F0ZWdvcnk6ICFvczpocHV4Ci1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy5VVEYtOCEKLXN0ZGluOgotCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCi0JCWVjaG8gaXMgc2V0Ci0JZWxzZQotCQllY2hvIGlzIG5vdCBzZXQKLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWlzIHNldAotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLygjICkqLwotLS0tCi1uYW1lOiB1dGY4b3B0LTJiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBzZXQgYXQgaW50ZXJhY3RpdmUgc3RhcnR1cAotCUV4cGVjdGVkIGZhaWx1cmUgaWYgLURNS1NIX0FTU1VNRV9VVEY4PTAKLWNhdGVnb3J5OiBvczpocHV4Ci1hcmd1bWVudHM6ICEtaSEKLWVudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy51dGY4IQotc3RkaW46Ci0JaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KLQkJZWNobyBpcyBzZXQKLQllbHNlCi0JCWVjaG8gaXMgbm90IHNldAotCWZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaXMgc2V0Ci1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvKCMgKSovCi0tLS0KLW5hbWU6IHV0ZjhvcHQtMwotZGVzY3JpcHRpb246Ci0JRW5zdXJlIMKxVSBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGhvbm91cmVkCi0JKHRoaXMgdGVzdCBtYXkgcGFzcyBmYWxzZWx5IGRlcGVuZGluZyBvbiBDUFBGTEFHUykKLXN0ZGluOgotCWV4cG9ydCBpPTAKLQljb2RlPSdpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbiBlY2hvICRpIG9uOyBlbHNlIGVjaG8gJGkgb2ZmOyBmaScKLQlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiIC1VIC1jICIkY29kZSIKLQlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiICtVIC1jICIkY29kZSIKLQlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiIC1VIC1pYyAiJGNvZGUiCi0JbGV0IGkrKzsgIiRfX3Byb2duYW1lIiArVSAtaWMgIiRjb2RlIgotCWVjaG8gJCgoKytpKSkgZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgb24KLQkyIG9mZgotCTMgb24KLQk0IG9mZgotCTUgZG9uZQotLS0tCi1uYW1lOiBhbGlhc2VzLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGJ1aWx0LWluIHNoZWxsIGFsaWFzZXMgYXJlIG9rYXkKLWNhdGVnb3J5OiAhYXJnZQotc3RkaW46Ci0JYWxpYXMKLQl0eXBlc2V0IC1mCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JwotCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKLQloYXNoPSdhbGlhcyAtdCcKLQloaXN0b3J5PSdmYyAtbCcKLQlpbnRlZ2VyPSd0eXBlc2V0IC1pJwotCWxvY2FsPXR5cGVzZXQKLQlsb2dpbj0nZXhlYyBsb2dpbicKLQluYW1lcmVmPSd0eXBlc2V0IC1uJwotCW5vaHVwPSdub2h1cCAnCi0Jcj0nZmMgLWUgLScKLQlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCi0Jc3VzcGVuZD0na2lsbCAtU1RPUCAkJCcKLQl0eXBlPSd3aGVuY2UgLXYnCi0tLS0KLW5hbWU6IGFsaWFzZXMtMS1oYXJ0ejQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGJ1aWx0LWluIHNoZWxsIGFsaWFzZXMgYXJlIG9rYXkKLWNhdGVnb3J5OiBhcmdlCi1zdGRpbjoKLQlhbGlhcwotCXR5cGVzZXQgLWYKLWV4cGVjdGVkLXN0ZG91dDoKLQlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCi0JZnVuY3Rpb25zPSd0eXBlc2V0IC1mJwotCWhhc2g9J2FsaWFzIC10JwotCWhpc3Rvcnk9J2ZjIC1sJwotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotCWxvZ2luPSdleGVjIGxvZ2luJwotCW5hbWVyZWY9J3R5cGVzZXQgLW4nCi0Jbm9odXA9J25vaHVwICcKLQlyPSdmYyAtZSAtJwotCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKLQl0eXBlPSd3aGVuY2UgLXYnCi0tLS0KLW5hbWU6IGFsaWFzZXMtMmEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIOKAnHNldCAtbyBzaOKAnSBkaXNhYmxlcyBidWlsdC1pbiBhbGlhc2VzIChleGNlcHQgYSBmZXcpCi1jYXRlZ29yeTogZGlzYWJsZWQKLWFyZ3VtZW50czogIS1vIXNoIQotc3RkaW46Ci0JYWxpYXMKLQl0eXBlc2V0IC1mCi1leHBlY3RlZC1zdGRvdXQ6Ci0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0tLS0KLW5hbWU6IGFsaWFzZXMtM2EKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHJ1bm5pbmcgYXMgc2ggZGlzYWJsZXMgYnVpbHQtaW4gYWxpYXNlcyAoZXhjZXB0IGEgZmV3KQotY2F0ZWdvcnk6IGRpc2FibGVkCi1hcmd1bWVudHM6ICEtbyFzaCEKLXN0ZGluOgotCWNwICIkX19wcm9nbmFtZSIgc2gKLQkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKLQlybSAtZiBzaAotZXhwZWN0ZWQtc3Rkb3V0OgotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotLS0tCi1uYW1lOiBhbGlhc2VzLTJiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKLWNhdGVnb3J5OiAhYXJnZQotYXJndW1lbnRzOiAhLW8hc2ghCi1zdGRpbjoKLQlhbGlhcwotCXR5cGVzZXQgLWYKLWV4cGVjdGVkLXN0ZG91dDoKLQlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCi0JZnVuY3Rpb25zPSd0eXBlc2V0IC1mJwotCWhhc2g9J2FsaWFzIC10JwotCWhpc3Rvcnk9J2ZjIC1sJwotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotCWxvZ2luPSdleGVjIGxvZ2luJwotCW5hbWVyZWY9J3R5cGVzZXQgLW4nCi0Jbm9odXA9J25vaHVwICcKLQlyPSdmYyAtZSAtJwotCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKLQlzdXNwZW5kPSdraWxsIC1TVE9QICQkJwotCXR5cGU9J3doZW5jZSAtdicKLS0tLQotbmFtZTogYWxpYXNlcy0zYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgcnVubmluZyBhcyBzaCBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcwotY2F0ZWdvcnk6ICFhcmdlCi1hcmd1bWVudHM6ICEtbyFzaCEKLXN0ZGluOgotCWNwICIkX19wcm9nbmFtZSIgc2gKLQkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKLQlybSAtZiBzaAotZXhwZWN0ZWQtc3Rkb3V0OgotCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKLQlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCi0JaGFzaD0nYWxpYXMgLXQnCi0JaGlzdG9yeT0nZmMgLWwnCi0JaW50ZWdlcj0ndHlwZXNldCAtaScKLQlsb2NhbD10eXBlc2V0Ci0JbG9naW49J2V4ZWMgbG9naW4nCi0JbmFtZXJlZj0ndHlwZXNldCAtbicKLQlub2h1cD0nbm9odXAgJwotCXI9J2ZjIC1lIC0nCi0Jc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJwotCXN1c3BlbmQ9J2tpbGwgLVNUT1AgJCQnCi0JdHlwZT0nd2hlbmNlIC12JwotLS0tCi1uYW1lOiBhbGlhc2VzLTJiLWhhcnR6NAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYg4oCcc2V0IC1vIHNo4oCdIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCi1jYXRlZ29yeTogYXJnZQotYXJndW1lbnRzOiAhLW8hc2ghCi1zdGRpbjoKLQlhbGlhcwotCXR5cGVzZXQgLWYKLWV4cGVjdGVkLXN0ZG91dDoKLQlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCi0JZnVuY3Rpb25zPSd0eXBlc2V0IC1mJwotCWhhc2g9J2FsaWFzIC10JwotCWhpc3Rvcnk9J2ZjIC1sJwotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotCWxvZ2luPSdleGVjIGxvZ2luJwotCW5hbWVyZWY9J3R5cGVzZXQgLW4nCi0Jbm9odXA9J25vaHVwICcKLQlyPSdmYyAtZSAtJwotCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKLQl0eXBlPSd3aGVuY2UgLXYnCi0tLS0KLW5hbWU6IGFsaWFzZXMtM2ItaGFydHo0Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBydW5uaW5nIGFzIHNoIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCi1jYXRlZ29yeTogYXJnZQotYXJndW1lbnRzOiAhLW8hc2ghCi1zdGRpbjoKLQljcCAiJF9fcHJvZ25hbWUiIHNoCi0JLi9zaCAtYyAnYWxpYXM7IHR5cGVzZXQgLWYnCi0Jcm0gLWYgc2gKLWV4cGVjdGVkLXN0ZG91dDoKLQlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCi0JZnVuY3Rpb25zPSd0eXBlc2V0IC1mJwotCWhhc2g9J2FsaWFzIC10JwotCWhpc3Rvcnk9J2ZjIC1sJwotCWludGVnZXI9J3R5cGVzZXQgLWknCi0JbG9jYWw9dHlwZXNldAotCWxvZ2luPSdleGVjIGxvZ2luJwotCW5hbWVyZWY9J3R5cGVzZXQgLW4nCi0Jbm9odXA9J25vaHVwICcKLQlyPSdmYyAtZSAtJwotCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKLQl0eXBlPSd3aGVuY2UgLXYnCi0tLS0KLW5hbWU6IGFsaWFzZXMtZnVuY2RlZi0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBQT1NJWCBmdW5jdGlvbnMgdGFrZSBwcmVjZWRlbmNlcyBvdmVyIGFsaWFzZXMKLXN0ZGluOgotCWFsaWFzIGZvbz0nZWNobyBtYWtybycKLQlmb28oKSB7Ci0JCWVjaG8gZnVua3Rpb24KLQl9Ci0JZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZnVua3Rpb24KLS0tLQotbmFtZTogYWxpYXNlcy1mdW5jZGVmLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIFBPU0lYIGZ1bmN0aW9ucyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgYWxpYXNlcwotc3RkaW46Ci0JYWxpYXMgZm9vPSdlY2hvIG1ha3JvJwotCWZvbyAoKSB7Ci0JCWVjaG8gZnVua3Rpb24KLQl9Ci0JZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JZnVua3Rpb24KLS0tLQotbmFtZTogYWxpYXNlcy1mdW5jZGVmLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGFsaWFzZXMgdGFrZSBwcmVjZWRlbmNlcyBvdmVyIEtvcm4gZnVuY3Rpb25zCi1zdGRpbjoKLQlhbGlhcyBmb289J2VjaG8gbWFrcm8nCi0JZnVuY3Rpb24gZm9vIHsKLQkJZWNobyBmdW5rdGlvbgotCX0KLQlmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQltYWtybwotLS0tCi1uYW1lOiBhcnJheXMtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgS29ybiBTaGVsbCBhcnJheXMgd29yayBhcyBleHBlY3RlZAotc3RkaW46Ci0Jdj0iYyBkIgotCXNldCAtQSBmb28gLS0gYSBcJHYgIiR2IiAnJHYnIGIKLQllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18IgotZXhwZWN0ZWQtc3Rkb3V0OgotCTV8YXwkdnxjIGR8JHZ8YnwKLS0tLQotbmFtZTogYXJyYXlzLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGJhc2gtc3R5bGUgYXJyYXlzIHdvcmsgYXMgZXhwZWN0ZWQKLWNhdGVnb3J5OiAhc21rc2gKLXN0ZGluOgotCXY9ImMgZCIKLQlmb289KGEgXCR2ICIkdiIgJyR2JyBiKQotCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNXxhfCR2fGMgZHwkdnxifAotLS0tCi1uYW1lOiBhcnJheXMtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYXJyYXkgYm91bmRzIGFyZSB1aW50MzJfdAotc3RkaW46Ci0Jc2V0IC1BIGZvbyBhIGIgYwotCWZvb1s0MDk3XT1kCi0JZm9vWzIxNDc0ODM2MzddPWUKLQllY2hvICR7Zm9vWypdfQotCWZvb1stMV09ZgotCWVjaG8gJHtmb29bNDI5NDk2NzI5NV19IGcgJHtmb29bKl19Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JYSBiIGMgZCBlCi0JZiBnIGEgYiBjIGQgZSBmCi0tLS0KLW5hbWU6IGFycmF5cy00Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiBLb3JuIFNoZWxsIGFycmF5cyB3aXRoIHNwZWNpZmllZCBpbmRpY2VzIHdvcmsgYXMgZXhwZWN0ZWQKLWNhdGVnb3J5OiAhc21rc2gKLXN0ZGluOgotCXY9ImMgZCIKLQlzZXQgLUEgZm9vIC0tIFsxXT1cJHYgWzJdPSIkdiIgWzRdPSckdicgWzBdPWEgWzVdPWIKLQllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18JHtmb29bNV19fCIKLWV4cGVjdGVkLXN0ZG91dDoKLQk1fGF8JHZ8YyBkfHwkdnxifAotLS0tCi1uYW1lOiBhcnJheXMtNQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYmFzaC1zdHlsZSBhcnJheXMgd2l0aCBzcGVjaWZpZWQgaW5kaWNlcyB3b3JrIGFzIGV4cGVjdGVkCi1jYXRlZ29yeTogIXNta3NoCi1zdGRpbjoKLQl2PSJjIGQiCi0JZm9vPShbMV09XCR2IFsyXT0iJHYiIFs0XT0nJHYnIFswXT1hIFs1XT1iKQotCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwke2Zvb1s1XX18IgotCXg9KFsxMjhdPWZvbyBiYXIgYmF6KQotCWVjaG8gaz0gJHsheFsqXX0gLgotCWVjaG8gdj0gJHt4WypdfSAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JNXxhfCR2fGMgZHx8JHZ8YnwKLQlrPSAxMjggMTI5IDEzMCAuCi0Jdj0gZm9vIGJhciBiYXogLgotLS0tCi1uYW1lOiBhcnJheXMtNgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgd2UgY2FuIGdldCB0aGUgYXJyYXkga2V5cyAoaW5kaWNlcykgZm9yIGluZGV4ZWQgYXJyYXlzLAotCUtvcm4gc2hlbGwgc3R5bGUKLXN0ZGluOgotCW9mKCkgewotCQlpPTAKLQkJZm9yIHggaW4gIiRAIjsgZG8KLQkJCWVjaG8gLW4gIiQoKGkrKykpPCR4PiIKLQkJZG9uZQotCQllY2hvCi0JfQotCWZvb1sxXT1laW5zCi0Jc2V0IHwgZ3JlcCAnXmZvbycKLQllY2hvID0KLQlmb29bMF09endlaQotCWZvb1s0XT1kcmVpCi0Jc2V0IHwgZ3JlcCAnXmZvbycKLQllY2hvID0KLQllY2hvIGEgJChvZiAke2Zvb1sqXX0pID0gJChvZiAke2JhclsqXX0pIGEKLQllY2hvIGIgJChvZiAiJHtmb29bKl19IikgPSAkKG9mICIke2JhclsqXX0iKSBiCi0JZWNobyBjICQob2YgJHtmb29bQF19KSA9ICQob2YgJHtiYXJbQF19KSBjCi0JZWNobyBkICQob2YgIiR7Zm9vW0BdfSIpID0gJChvZiAiJHtiYXJbQF19IikgZAotCWVjaG8gZSAkKG9mICR7IWZvb1sqXX0pID0gJChvZiAkeyFiYXJbKl19KSBlCi0JZWNobyBmICQob2YgIiR7IWZvb1sqXX0iKSA9ICQob2YgIiR7IWJhclsqXX0iKSBmCi0JZWNobyBnICQob2YgJHshZm9vW0BdfSkgPSAkKG9mICR7IWJhcltAXX0pIGcKLQllY2hvIGggJChvZiAiJHshZm9vW0BdfSIpID0gJChvZiAiJHshYmFyW0BdfSIpIGgKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29bMV09ZWlucwotCT0KLQlmb29bMF09endlaQotCWZvb1sxXT1laW5zCi0JZm9vWzRdPWRyZWkKLQk9Ci0JYSAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBhCi0JYiAwPHp3ZWkgZWlucyBkcmVpPiA9IDA8PiBiCi0JYyAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBjCi0JZCAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBkCi0JZSAwPDA+MTwxPjI8ND4gPSBlCi0JZiAwPDAgMSA0PiA9IDA8PiBmCi0JZyAwPDA+MTwxPjI8ND4gPSBnCi0JaCAwPDA+MTwxPjI8ND4gPSBoCi0tLS0KLW5hbWU6IGFycmF5cy03Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB3ZSBjYW4gZ2V0IHRoZSBhcnJheSBrZXlzIChpbmRpY2VzKSBmb3IgaW5kZXhlZCBhcnJheXMsCi0JS29ybiBzaGVsbCBzdHlsZSwgaW4gc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCWVjaG8gIWFyejogJHshYXJ6fQotCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQotCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQotCWFyej1mb28KLQllY2hvICFhcno6ICR7IWFyen0KLQllY2hvICFhcnpbMF06ICR7IWFyelswXX0KLQllY2hvICFhcnpbMV06ICR7IWFyelsxXX0KLQl1bnNldCBhcnoKLQllY2hvICFhcno6ICR7IWFyen0KLQllY2hvICFhcnpbMF06ICR7IWFyelswXX0KLQllY2hvICFhcnpbMV06ICR7IWFyelsxXX0KLWV4cGVjdGVkLXN0ZG91dDoKLQkhYXJ6OiAwCi0JIWFyelswXToKLQkhYXJ6WzFdOgotCSFhcno6IGFyegotCSFhcnpbMF06IDAKLQkhYXJ6WzFdOgotCSFhcno6IDAKLQkhYXJ6WzBdOgotCSFhcnpbMV06Ci0tLS0KLW5hbWU6IGFycmF5cy04Ci1kZXNjcmlwdGlvbjoKLQlDaGVjayBzb21lIGJlaGF2aW91cmFsIHJ1bGVzIGZvciBhcnJheXMuCi1zdGRpbjoKLQlmbmEoKSB7Ci0JCXNldCAtQSBhYSA5Ci0JfQotCWZuYigpIHsKLQkJdHlwZXNldCBhYgotCQlzZXQgLUEgYWIgOQotCX0KLQlmbmMoKSB7Ci0JCXR5cGVzZXQgYWMKLQkJc2V0IC1BIGFjIDkxCi0JCXVuc2V0IGFjCi0JCXNldCAtQSBhYyA5MgotCX0KLQlmbmQoKSB7Ci0JCXNldCArQSBhZCA5Ci0JfQotCWZuZSgpIHsKLQkJdW5zZXQgYWUKLQkJc2V0ICtBIGFlIDkKLQl9Ci0JZm5mKCkgewotCQl1bnNldCBhZlswXQotCQlzZXQgK0EgYWYgOQotCX0KLQlmbmcoKSB7Ci0JCXVuc2V0IGFnWypdCi0JCXNldCArQSBhZyA5Ci0JfQotCXNldCAtQSBhYSAxIDIKLQlzZXQgLUEgYWIgMSAyCi0Jc2V0IC1BIGFjIDEgMgotCXNldCAtQSBhZCAxIDIKLQlzZXQgLUEgYWUgMSAyCi0Jc2V0IC1BIGFmIDEgMgotCXNldCAtQSBhZyAxIDIKLQlzZXQgLUEgYWggMSAyCi0JdHlwZXNldCAtWjMgYWEgYWIgYWMgYWQgYWUgYWYgYWcKLQlwcmludCAxYSAke2FhWypdfSAuCi0JcHJpbnQgMWIgJHthYlsqXX0gLgotCXByaW50IDFjICR7YWNbKl19IC4KLQlwcmludCAxZCAke2FkWypdfSAuCi0JcHJpbnQgMWUgJHthZVsqXX0gLgotCXByaW50IDFmICR7YWZbKl19IC4KLQlwcmludCAxZyAke2FnWypdfSAuCi0JcHJpbnQgMWggJHthaFsqXX0gLgotCWZuYQotCWZuYgotCWZuYwotCWZuZAotCWZuZQotCWZuZgotCWZuZwotCXR5cGVzZXQgLVo1IGFoWypdCi0JcHJpbnQgMmEgJHthYVsqXX0gLgotCXByaW50IDJiICR7YWJbKl19IC4KLQlwcmludCAyYyAke2FjWypdfSAuCi0JcHJpbnQgMmQgJHthZFsqXX0gLgotCXByaW50IDJlICR7YWVbKl19IC4KLQlwcmludCAyZiAke2FmWypdfSAuCi0JcHJpbnQgMmcgJHthZ1sqXX0gLgotCXByaW50IDJoICR7YWhbKl19IC4KLWV4cGVjdGVkLXN0ZG91dDoKLQkxYSAwMDEgMDAyIC4KLQkxYiAwMDEgMDAyIC4KLQkxYyAwMDEgMDAyIC4KLQkxZCAwMDEgMDAyIC4KLQkxZSAwMDEgMDAyIC4KLQkxZiAwMDEgMDAyIC4KLQkxZyAwMDEgMDAyIC4KLQkxaCAxIDIgLgotCTJhIDkgLgotCTJiIDAwMSAwMDIgLgotCTJjIDkyIC4KLQkyZCAwMDkgMDAyIC4KLQkyZSA5IC4KLQkyZiA5IDAwMiAuCi0JMmcgMDA5IC4KLQkyaCAwMDAwMSAwMDAwMiAuCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYmFzaC1zdHlsZSBzdWJzdHJpbmcgZXhwYW5zaW9uIHdvcmtzCi0Jd2hlbiB1c2luZyBwb3NpdGl2ZSBudW1lcmljcwotc3RkaW46Ci0JeD1hYmNkZWZnaGkKLQl0eXBlc2V0IC1pIHk9MTIzNDU2Nzg5Ci0JdHlwZXNldCAtaSAxNiB6PTEyMzQ1Njc4OQkjIDE2Izc1YmNkMTUKLQllY2hvIGEgdCR7eDoyOjJ9ICR7eToyOjN9ICR7ejoyOjN9IGEKLQllY2hvIGIgJHt4OjozfSAke3k6OjN9ICR7ejo6M30gYgotCWVjaG8gYyAke3g6Mjp9ICR7eToyOn0gJHt6OjI6fSBjCi0JZWNobyBkICR7eDoyfSAke3k6Mn0gJHt6OjJ9IGQKLQllY2hvIGUgJHt4OjI6Nn0gJHt5OjI6Nn0gJHt6OjI6N30gZQotCWVjaG8gZiAke3g6Mjo3fSAke3k6Mjo3fSAke3o6Mjo4fSBmCi0JZWNobyBnICR7eDoyOjh9ICR7eToyOjh9ICR7ejoyOjl9IGcKLWV4cGVjdGVkLXN0ZG91dDoKLQlhIHRjZCAzNDUgIzc1IGEKLQliIGFiYyAxMjMgMTYjIGIKLQljIGMKLQlkIGNkZWZnaGkgMzQ1Njc4OSAjNzViY2QxNSBkCi0JZSBjZGVmZ2ggMzQ1Njc4ICM3NWJjZDEgZQotCWYgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGYKLQlnIGNkZWZnaGkgMzQ1Njc4OSAjNzViY2QxNSBnCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgYmFzaC1zdHlsZSBzdWJzdHJpbmcgZXhwYW5zaW9uIHdvcmtzCi0Jd2hlbiB1c2luZyBuZWdhdGl2ZSBudW1lcmljcyBvciBleHByZXNzaW9ucwotc3RkaW46Ci0JeD1hYmNkZWZnaGkKLQl0eXBlc2V0IC1pIHk9MTIzNDU2Nzg5Ci0JdHlwZXNldCAtaSAxNiB6PTEyMzQ1Njc4OQkjIDE2Izc1YmNkMTUKLQluPTIKLQllY2hvIGEgJHt4OiRuOjN9ICR7eTokbjozfSAke3o6JG46M30gYQotCWVjaG8gYiAke3g6KG4pOjN9ICR7eToobik6M30gJHt6OihuKTozfSBiCi0JZWNobyBjICR7eDooLTIpOjF9ICR7eTooLTIpOjF9ICR7ejooLTIpOjF9IGMKLQllY2hvIGQgdCR7eDogbjoyfSAke3k6IG46M30gJHt6OiBuOjN9IGQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhIGNkZSAzNDUgIzc1IGEKLQliIGNkZSAzNDUgIzc1IGIKLQljIGggOCAxIGMKLQlkIHRjZCAzNDUgIzc1IGQKLS0tLQotbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0zCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHNvbWUgdGhpbmdzIHRoYXQgd29yayBpbiBiYXNoIGZhaWwuCi0JVGhpcyBpcyBieSBkZXNpZ24uIEFuZCB0aGF0IHNvbWUgdGhpbmdzIGZhaWwgaW4gYm90aC4KLXN0ZGluOgotCWV4cG9ydCB4PWFiY2RlZmdoaSBuPTIKLQkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHYke3g6KG4pfXgnCi0JIiRfX3Byb2duYW1lIiAtYyAnZWNobyB3JHt4OiBufXgnCi0JIiRfX3Byb2duYW1lIiAtYyAnZWNobyB4JHt4Om59eCcKLQkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHkke3g6fXgnCi0JIiRfX3Byb2duYW1lIiAtYyAnZWNobyB6JHt4fXgnCi0JIiRfX3Byb2duYW1lIiAtYyAneD1hYmNkZWY7eT0xMjM7ZWNobyAke3g6JHt5OjI6MX06Mn0nID4vZGV2L251bGwgMj4mMTsgZWNobyAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCXZjZGVmZ2hpeAotCXdjZGVmZ2hpeAotCXphYmNkZWZnaGl4Ci0JMQotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JL3g6bi4qYmFkIHN1YnN0aXR1dGlvbi4qXG4uKmJhZCBzdWJzdGl0dXRpb24vCi0tLS0KLW5hbWU6IHZhcmV4cGFuZC1zdWJzdHItNAotZGVzY3JpcHRpb246Ci0JQ2hlY2sgY29ybmVyIGNhc2VzIGZvciBzdWJzdHJpbmcgZXhwYW5zaW9uCi1zdGRpbjoKLQl4PWFiY2RlZmdoaQotCWludGVnZXIgeT0yCi0JZWNobyBhICR7eDooeSA9PSAxID8gMiA6IDMpOjR9IGEKLWV4cGVjdGVkLXN0ZG91dDoKLQlhIGRlZmcgYQotLS0tCi1uYW1lOiB2YXJleHBhbmQtc3Vic3RyLTVBCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHN1YnN0cmluZyBleHBhbnNpb25zIHdvcmsgb24gY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0ICtVCi0JeD1tw6RoCi0JZWNobyBhICR7eDo6MX0gJHt4OiAtMX0gYQotCWVjaG8gYiAke3g6OjN9ICR7eDogLTN9IGIKLQllY2hvIGMgJHt4OjE6Mn0gJHt4OiAtMzoyfSBjCi0JZWNobyBkICR7I3h9IGQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhIG0gaCBhCi0JYiBtw6Qgw6RoIGIKLQljIMOkIMOkIGMKLQlkIDQgZAotLS0tCi1uYW1lOiB2YXJleHBhbmQtc3Vic3RyLTVXCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHN1YnN0cmluZyBleHBhbnNpb25zIHdvcmsgb24gY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0IC1VCi0JeD1tw6RoCi0JZWNobyBhICR7eDo6MX0gJHt4OiAtMX0gYQotCWVjaG8gYiAke3g6OjJ9ICR7eDogLTJ9IGIKLQllY2hvIGMgJHt4OjE6MX0gJHt4OiAtMjoxfSBjCi0JZWNobyBkICR7I3h9IGQKLWV4cGVjdGVkLXN0ZG91dDoKLQlhIG0gaCBhCi0JYiBtw6Qgw6RoIGIKLQljIMOkIMOkIGMKLQlkIDMgZAotLS0tCi1uYW1lOiB2YXJleHBhbmQtc3Vic3RyLTYKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHRoYXQgc3RyaW5nIHN1YnN0aXR1dGlvbiB3b3JrcyBjb3JyZWN0bHkKLXN0ZGluOgotCWZvbz0xCi0JYmFyPTIKLQliYXo9cXdlcnR5dWlvcAotCWVjaG8gYSAke2JhejogZm9vOiBiYXJ9Ci0JZWNobyBiICR7YmF6OiBmb286ICRiYXJ9Ci0JZWNobyBjICR7YmF6OiAkZm9vOiBiYXJ9Ci0JZWNobyBkICR7YmF6OiAkZm9vOiAkYmFyfQotZXhwZWN0ZWQtc3Rkb3V0OgotCWEgd2UKLQliIHdlCi0JYyB3ZQotCWQgd2UKLS0tLQotbmFtZTogdmFyZXhwYW5kLW51bGwtMQotZGVzY3JpcHRpb246Ci0JRW5zdXJlIGVtcHR5IHN0cmluZ3MgZXhwYW5kIGVtcHRpbHkKLXN0ZGluOgotCXByaW50IHggJHthfSAke2J9IHkKLQlwcmludCB6ICR7YSM/fSAke2IlP30gdwotCXByaW50IHYgJHthPX0gJHtiL2MvZH0gdQotZXhwZWN0ZWQtc3Rkb3V0OgotCXggeQotCXogdwotCXYgdQotLS0tCi1uYW1lOiB2YXJleHBhbmQtbnVsbC0yCi1kZXNjcmlwdGlvbjoKLQlFbnN1cmUgZW1wdHkgc3RyaW5ncywgd2hlbiBxdW90ZWQsIGFyZSBleHBhbmRlZCBhcyBlbXB0eSBzdHJpbmdzCi1zdGRpbjoKLQlwcmludGYgJzwlcz4gJyAxICIke2F9IiAyICIke2EjP30iICsgIiR7YiU/fSIgMyAiJHthPX0iICsgIiR7Yi9jL2R9IgotCWVjaG8gLgotZXhwZWN0ZWQtc3Rkb3V0OgotCTwxPiA8PiA8Mj4gPD4gPCs+IDw+IDwzPiA8PiA8Kz4gPD4gLgotLS0tCi1uYW1lOiBwcmludC1mdW5ueS1jaGFycwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcHJpbnQgYnVpbHRpbidzIGNhcGFiaWxpdHkgdG8gb3V0cHV0IGRlc2lnbmF0ZWQgY2hhcmFjdGVycwotc3RkaW46Ci0JcHJpbnQgJzxcMDE0NFwwMzQ0XHhEQlx1MDBEQlx1MjBBQ1x1REJceDQwPicKLWV4cGVjdGVkLXN0ZG91dDoKLQk8ZOTbw5vigqzDm0A+Ci0tLS0KLW5hbWU6IHByaW50LWJrc2wtYwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgcHJpbnQgYnVpbHRpbidzIFxjIGVzY2FwZQotc3RkaW46Ci0JcHJpbnQgJ1xjYSc7IHByaW50IGIKLWV4cGVjdGVkLXN0ZG91dDoKLQlhYgotLS0tCi1uYW1lOiBwcmludC1udWwtY2hhcnMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGhhbmRsaW5nIG9mIE5VTCBjaGFyYWN0ZXJzIGZvciBwcmludCBhbmQgcmVhZAotCW5vdGU6IHNlY29uZCBsaW5lIHNob3VsZCBvdXRwdXQg4oCcNCAz4oCdIGJ1dCB3ZSBjYW5ub3QKLQloYW5kbGUgTlVMIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyB5ZXQKLXN0ZGluOgotCXByaW50ICQoKCQocHJpbnQgJzxcMD4nIHwgd2MgLWMpKSkKLQl4PSQocHJpbnQgJzxcMD4nKQotCXByaW50ICQoKCQocHJpbnQgIiR4IiB8IHdjIC1jKSkpICR7I3h9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JNAotCTMgMgotLS0tCi1uYW1lOiBwcmludC1lc2NhcGVzCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBiYWNrc2xhc2ggZXhwYW5zaW9uIGJ5IHRoZSBwcmludCBidWlsdGluCi1zdGRpbjoKLQlwcmludCAnXCBcIVwiXCNcJFwlXCYnXFxcJydcKFwpXCpcK1wsXC1cLlwvXDBcMVwyXDNcNFw1XDZcN1w4JyBcCi0JICAgICdcOVw6XDtcPFw9XD5cP1xAXEFcQlxDXERcRVxGXEdcSFxJXEpcS1xMXE1cTlxPXFBcUVxSXFNcVCcgXAotCSAgICAnXFVcVlxXXFhcWVxaXFtcXFxdXF5cX1xgXGFcYiAgXGRcZVxmXGdcaFxpXGpca1xsXG1cblxvXHAnIFwKLQkgICAgJ1xxXHJcc1x0XHVcdlx3XHhceVx6XHtcfFx9XH4nICdcdTIwYWNkJyAnXFUyMGFjZCcgJ1x4MTIzJyBcCi0JICAgICdcMHgnICdcMDEyMycgJ1wwMTIzNCcgfCB7Ci0JCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKLQkJdHlwZXNldCAtVXVpMTYgLVo1IGh2Ci0JCXR5cGVzZXQgLWkxIHdjPTB4MEEKLQkJZGFzYz0KLQkJbmw9JHt3YyMxI30KLQkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCi0JCQlsaW5lPSRsaW5lJG5sCi0JCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KLQkJCQlodj0xIyR7bGluZTo6MX0KLQkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KLQkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCi0JCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCi0JCQkJCWRhc2M9JyB8JwotCQkJCWZpCi0JCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCi0JCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KLQkJCQkJZGFzYz0kZGFzYy4KLQkJCQllbHNlCi0JCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9Ci0JCQkJZmkKLQkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQkJbGluZT0ke2xpbmU6MX0KLQkJCWRvbmUKLQkJZG9uZQotCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KLQkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbwotCQkJCXByaW50IC1uICcgICAnCi0JCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJwotCQkJZG9uZQotCQkJcHJpbnQgIiRkYXNjfCIKLQkJZmkKLQl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMDAwMDAwMDAgIDVDIDIwIDVDIDIxIDVDIDIyIDVDIDIzIC0gNUMgMjQgNUMgMjUgNUMgMjYgNUMgMjcgIHxcIFwhXCJcI1wkXCVcJlwnfAotCTAwMDAwMDEwICA1QyAyOCA1QyAyOSA1QyAyQSA1QyAyQiAtIDVDIDJDIDVDIDJEIDVDIDJFIDVDIDJGICB8XChcKVwqXCtcLFwtXC5cL3wKLQkwMDAwMDAyMCAgNUMgMzEgNUMgMzIgNUMgMzMgNUMgMzQgLSA1QyAzNSA1QyAzNiA1QyAzNyA1QyAzOCAgfFwxXDJcM1w0XDVcNlw3XDh8Ci0JMDAwMDAwMzAgIDIwIDVDIDM5IDVDIDNBIDVDIDNCIDVDIC0gM0MgNUMgM0QgNUMgM0UgNUMgM0YgNUMgIHwgXDlcOlw7XDxcPVw+XD9cfAotCTAwMDAwMDQwICA0MCA1QyA0MSA1QyA0MiA1QyA0MyA1QyAtIDQ0IDFCIDVDIDQ2IDVDIDQ3IDVDIDQ4ICB8QFxBXEJcQ1xELlxGXEdcSHwKLQkwMDAwMDA1MCAgNUMgNDkgNUMgNEEgNUMgNEIgNUMgNEMgLSA1QyA0RCA1QyA0RSA1QyA0RiA1QyA1MCAgfFxJXEpcS1xMXE1cTlxPXFB8Ci0JMDAwMDAwNjAgIDVDIDUxIDVDIDUyIDVDIDUzIDVDIDU0IC0gMjAgNUMgNTYgNUMgNTcgNUMgNTggNUMgIHxcUVxSXFNcVCBcVlxXXFhcfAotCTAwMDAwMDcwICA1OSA1QyA1QSA1QyA1QiA1QyA1QyA1RCAtIDVDIDVFIDVDIDVGIDVDIDYwIDA3IDA4ICB8WVxaXFtcXVxeXF9cYC4ufAotCTAwMDAwMDgwICAyMCAyMCA1QyA2NCAxQiAwQyA1QyA2NyAtIDVDIDY4IDVDIDY5IDVDIDZBIDVDIDZCICB8ICBcZC4uXGdcaFxpXGpca3wKLQkwMDAwMDA5MCAgNUMgNkMgNUMgNkQgMEEgNUMgNkYgNUMgLSA3MCAyMCA1QyA3MSAwRCA1QyA3MyAwOSAgfFxsXG0uXG9ccCBccS5ccy58Ci0JMDAwMDAwQTAgIDBCIDVDIDc3IDVDIDc5IDVDIDdBIDVDIC0gN0IgNUMgN0MgNUMgN0QgNUMgN0UgMjAgIHwuXHdceVx6XHtcfFx9XH4gfAotCTAwMDAwMEIwICBFMiA4MiBBQyA2NCAyMCBFRiBCRiBCRCAtIDIwIDEyIDMzIDIwIDc4IDIwIDUzIDIwICB8Li4uZCAuLi4gLjMgeCBTIHwKLQkwMDAwMDBDMCAgNTMgMzQgMEEgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgfFM0LnwKLS0tLQotbmFtZTogZG9sbGFyLXF1b3RlZC1zdHJpbmdzCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBiYWNrc2xhc2ggZXhwYW5zaW9uIGJ5ICQn4oCmJyBzdHJpbmdzCi1zdGRpbjoKLQlwcmludGYgJyVzXG4nICQnXCBcIVwiXCNcJFwlXCZcJ1woXClcKlwrXCxcLVwuXC8gXDFcMlwzXDRcNVw2JyBcCi0JICAgICQnYVwwYicgJCdhXDAxYicgJCdcN1w4XDlcOlw7XDxcPVw+XD9cQFxBXEJcQ1xEXEVcRlxHXEhcSScgXAotCSAgICAkJ1xKXEtcTFxNXE5cT1xQXFFcUlxTXFRcVTFcVlxXXFhcWVxaXFtcXFxdXF5cX1xgXGFcYlxkXGUnIFwKLQkgICAgJCdcZlxnXGhcaVxqXGtcbFxtXG5cb1xwXHFcclxzXHRcdTFcdlx3XHgxXHlcelx7XHxcfVx+ICR4JyBcCi0JICAgICQnXHUyMGFjZCcgJCdcVTIwYWNkJyAkJ1x4MTIzJyAkJ2ZuXHgwcmQnICQnXDAyMzQnICQnXDIzNCcgXAotCSAgICAkJ1wyMzQ1JyAkJ1xjYScgJCdcYyEnICQnXGM/JyAkJ1xj4oKsJyAkJ2FcCi0JYicgfCB7Ci0JCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKLQkJdHlwZXNldCAtVXVpMTYgLVo1IGh2Ci0JCXR5cGVzZXQgLWkxIHdjPTB4MEEKLQkJZGFzYz0KLQkJbmw9JHt3YyMxI30KLQkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCi0JCQlsaW5lPSRsaW5lJG5sCi0JCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KLQkJCQlodj0xIyR7bGluZTo6MX0KLQkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KLQkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCi0JCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCi0JCQkJCWRhc2M9JyB8JwotCQkJCWZpCi0JCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCi0JCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KLQkJCQkJZGFzYz0kZGFzYy4KLQkJCQllbHNlCi0JCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9Ci0JCQkJZmkKLQkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCi0JCQkJbGluZT0ke2xpbmU6MX0KLQkJCWRvbmUKLQkJZG9uZQotCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KLQkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbwotCQkJCXByaW50IC1uICcgICAnCi0JCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJwotCQkJZG9uZQotCQkJcHJpbnQgIiRkYXNjfCIKLQkJZmkKLQl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMDAwMDAwMDAgIDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IC0gMjggMjkgMkEgMkIgMkMgMkQgMkUgMkYgIHwgISIjJCUmJygpKissLS4vfAotCTAwMDAwMDEwICAyMCAwMSAwMiAwMyAwNCAwNSAwNiAwQSAtIDYxIDBBIDYxIDAxIDYyIDBBIDA3IDM4ICB8IC4uLi4uLi5hLmEuYi4uOHwKLQkwMDAwMDAyMCAgMzkgM0EgM0IgM0MgM0QgM0UgM0YgNDAgLSA0MSA0MiA0MyA0NCAxQiA0NiA0NyA0OCAgfDk6Ozw9Pj9AQUJDRC5GR0h8Ci0JMDAwMDAwMzAgIDQ5IDBBIDRBIDRCIDRDIDREIDRFIDRGIC0gNTAgNTEgNTIgNTMgNTQgMDEgNTYgNTcgIHxJLkpLTE1OT1BRUlNULlZXfAotCTAwMDAwMDQwICA1OCA1OSA1QSA1QiA1QyA1RCA1RSA1RiAtIDYwIDA3IDA4IDY0IDFCIDBBIDBDIDY3ICB8WFlaW1xdXl9gLi5kLi4uZ3wKLQkwMDAwMDA1MCAgNjggNjkgNkEgNkIgNkMgNkQgMEEgNkYgLSA3MCA3MSAwRCA3MyAwOSAwMSAwQiA3NyAgfGhpamtsbS5vcHEucy4uLnd8Ci0JMDAwMDAwNjAgIDAxIDc5IDdBIDdCIDdDIDdEIDdFIDIwIC0gMjQgNzggMEEgRTIgODIgQUMgNjQgMEEgIHwueXp7fH1+ICR4Li4uLmQufAotCTAwMDAwMDcwICBFRiBCRiBCRCAwQSBDNCBBMyAwQSA2NiAtIDZFIDBBIDEzIDM0IDBBIDlDIDBBIDlDICB8Li4uLi4uLmZuLi40Li4uLnwKLQkwMDAwMDA4MCAgMzUgMEEgMDEgMEEgMDEgMEEgN0YgMEEgLSAwMiA4MiBBQyAwQSA2MSAwQSA2MiAwQSAgfDUuLi4uLi4uLi4uLmEuYi58Ci0tLS0KLW5hbWU6IGRvbGxhci1xdW90ZXMtaW4taGVyZWRvY3MKLWRlc2NyaXB0aW9uOgotCVRoZXkgYXJlLCBob3dldmVyLCBub3QgcGFyc2VkIGluIGhlcmUgZG9jdW1lbnRzCi1zdGRpbjoKLQljYXQgPDxFT0YKLQkJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KLQlFT0YKLQljYXQgPDwkJ2FcdGInCi0JYVx0YgotCWEJYgotZXhwZWN0ZWQtc3Rkb3V0OgotCQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLwotCWFcdGIKLS0tLQotbmFtZTogZG9sbGFyLXF1b3Rlcy1pbi1oZXJlc3RyaW5ncwotZGVzY3JpcHRpb246Ci0JVGhleSBhcmUsIG5vdCBwYXJzZWQgaW4gaGVyZSBzdHJpbmdzIGVpdGhlcgotc3RkaW46Ci0JY2F0IDw8PCJkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLyIKLQljYXQgPDw8J2RvbGxhciA9IHN0cmNocihzLCAnXCcnJCdcJycpOwkvKiAnXCcnICovJwotCXg9ImRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovIgotCWNhdCA8PDwiJHgiCi0JY2F0IDw8PCQnYVxFWzBtXHRiJwotZXhwZWN0ZWQtc3Rkb3V0OgotCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCi0JZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KLQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLwotCWEbWzBtCWIKLS0tLQotbmFtZTogZG90LW5lZWRzLWFyZ3VtZW50Ci1kZXNjcmlwdGlvbjoKLQljaGVjayBEZWJpYW4gIzQxNTE2NyBzb2x1dGlvbjogJy4nIHdpdGhvdXQgYXJndW1lbnRzIHNob3VsZCBmYWlsCi1zdGRpbjoKLQkiJF9fcHJvZ25hbWUiIC1jIC4KLQkiJF9fcHJvZ25hbWUiIC1jIHNvdXJjZQotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvXC46IG1pc3NpbmcgYXJndW1lbnQuKlxuLipcLjogbWlzc2luZyBhcmd1bWVudC8KLS0tLQotbmFtZTogYWxpYXMtZnVuY3Rpb24tbm8tY29uZmxpY3QKLWRlc2NyaXB0aW9uOgotCW1ha2UgYWxpYXNlcyBub3QgY29uZmxpY3Qgd2l0aCBmdW5jdGlvbnMKLQlub3RlOiBmb3Iga3NoLWxpa2UgZnVuY3Rpb25zLCB0aGUgb3JkZXIgb2YgcHJlZmVyZW5jZSBpcwotCWRpZmZlcmVudDsgYmFzaCBvdXRwdXRzIGJheiBpbnN0ZWFkIG9mIGJhciBpbiBsaW5lIDIgYmVsb3cKLXN0ZGluOgotCWFsaWFzIGZvbz0nZWNobyBiYXInCi0JZm9vKCkgewotCQllY2hvIGJhegotCX0KLQlhbGlhcyBrb3JuPSdlY2hvIGJhcicKLQlmdW5jdGlvbiBrb3JuIHsKLQkJZWNobyBiYXoKLQl9Ci0JZm9vCi0Ja29ybgotCXVuc2V0IC1mIGZvbwotCWZvbyAyPiYtIHx8IGVjaG8gcmFiCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYmF6Ci0JYmFyCi0JcmFiCi0tLS0KLW5hbWU6IGJhc2gtZnVuY3Rpb24tcGFyZW5zCi1kZXNjcmlwdGlvbjoKLQllbnN1cmUgdGhlIGtleXdvcmQgZnVuY3Rpb24gaXMgaWdub3JlZCB3aGVuIHByZWNlZGluZwotCVBPU0lYIHN0eWxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAoYmFzaGlzbSkKLXN0ZGluOgotCW1rKCkgewotCQllY2hvICcjISciJF9fcHJvZ25hbWUiCi0JCWVjaG8gIiQxIHsiCi0JCWVjaG8gJwllY2hvICJiYXI9J1wnJyQwJ1wnXCIKLQkJZWNobyAnfScKLQkJZWNobyAkezI6LWZvb30KLQl9Ci0JbWsgJ2Z1bmN0aW9uIGZvbycgPmYta29ybgotCW1rICdmb28gKCknID5mLWRhc2gKLQltayAnZnVuY3Rpb24gZm9vICgpJyA+Zi1iYXNoCi0JbWsgJ2Z1bmN0aW9uIHN0b3AgKCknIHN0b3AgPmYtc3RvcAotCWNobW9kICt4IGYtKgotCWVjaG8gImtvcm46ICQoLi9mLWtvcm4pIgotCWVjaG8gImRhc2g6ICQoLi9mLWRhc2gpIgotCWVjaG8gImJhc2g6ICQoLi9mLWJhc2gpIgotCWVjaG8gInN0b3A6ICQoLi9mLXN0b3ApIgotZXhwZWN0ZWQtc3Rkb3V0OgotCWtvcm46IGJhcj0nZm9vJwotCWRhc2g6IGJhcj0nLi9mLWRhc2gnCi0JYmFzaDogYmFyPScuL2YtYmFzaCcKLQlzdG9wOiBiYXI9Jy4vZi1zdG9wJwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTEKLWRlc2NyaXB0aW9uOgotCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSB3b3Jrcwotc3RkaW46Ci0Jc2V0IC1VCi0JdHlwZXNldCAtVXVpMTYgaTA9MSPvIGkxPTEj4oKsCi0JdHlwZXNldCAtaTEgbzBhPTY0Ci0JdHlwZXNldCAtaTEgbzFhPTB4MjYzQQotCXR5cGVzZXQgLVV1aTEgbzBiPTB4N0UKLQl0eXBlc2V0IC1VdWkxIG8xYj0weEZERDAKLQlpbnRlZ2VyIHB4PTB4Q0FGRSAncDA9MSMgJyBwMT0xI+KApiBwbD0xI2YKLQllY2hvICJpbiA8JGkwPiA8JGkxPiIKLQllY2hvICJvdXQgPCR7bzBhIzEjfXwke28wYiMxI30+IDwke28xYSMxI318JHtvMWIjMSN9PiIKLQl0eXBlc2V0IC1VdWkxIGkwIGkxCi0JZWNobyAicGFzcyA8JHB4PiA8JHAwPiA8JHAxPiA8JHBsPiA8JHtpMCMxI318JHtpMSMxI30+IgotCXR5cGVzZXQgLVV1aTE2IHR2MT0xI34gdHYyPTEjfyB0djM9MSOAIHR2ND0xI4EgdHY1PTEjwCB0djY9MSPBIHR2Nz0xI8KgIHR2OD0xI8KACi0JZWNobyAic3BlY1ggPCR7dHYxIzE2I30+IDwke3R2MiMxNiN9PiA8JHt0djMjMTYjfT4gPCR7dHY0IzE2I30+IDwke3R2NSMxNiN9PiA8JHt0djYjMTYjfT4gPCR7dHY3IzE2I30+IDwke3R2OCMxNiN9PiIKLQl0eXBlc2V0IC1pMSB0djEgdHYyIHR2MyB0djQgdHY1IHR2NiB0djcgdHY4Ci0JZWNobyAic3BlY1cgPCR7dHYxIzEjfT4gPCR7dHYyIzEjfT4gPCR7dHYzIzEjfT4gPCR7dHY0IzEjfT4gPCR7dHY1IzEjfT4gPCR7dHY2IzEjfT4gPCR7dHY3IzEjfT4gPCR7dHY4IzEjfT4iCi0JdHlwZXNldCAtaTEgeHMxPTB4RUY3RiB4czI9MHhFRjgwIHhzMz0weEZERDAKLQllY2hvICJzcGVjVSA8JHt4czEjMSN9PiA8JHt4czIjMSN9PiA8JHt4czMjMSN9PiIKLWV4cGVjdGVkLXN0ZG91dDoKLQlpbiA8MTYjRUZFRj4gPDE2IzIwQUM+Ci0Jb3V0IDxAfH4+IDzimLp877eQPgotCXBhc3MgPDE2I2NhZmU+IDwxIyA+IDwxI+KApj4gPDEjZj4gPO984oKsPgotCXNwZWNYIDw3RT4gPDdGPiA8RUY4MD4gPEVGODE+IDxFRkMwPiA8RUZDMT4gPEEwPiA8ODA+Ci0Jc3BlY1cgPH4+IDx/PiA8gD4gPIE+IDzAPiA8wT4gPMKgPiA8woA+Ci0Jc3BlY1UgPO69vz4gPIA+IDzvt5A+Ci0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmEKLWRlc2NyaXB0aW9uOgotCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBjb3JyZWN0IGNoYXJhY3RlcnMKLXN0ZGluOgotCXNldCAtVQotCWludGVnZXIgeD0xI2ZvbwotCWVjaG8gLyR4LwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLzEjZm9vOiB1bmV4cGVjdGVkICdvbycvCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYgotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0IC1VCi0JaW50ZWdlciB4PTEjwIAKLQllY2hvIC8keC8KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8xI8CAOiB1bmV4cGVjdGVkICeAJy8KLWV4cGVjdGVkLWV4aXQ6IGUgIT0gMAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJjMQotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0IC1VCi0JaW50ZWdlciB4PTEj4oCmCi0JZWNobyAvJHgvCi1leHBlY3RlZC1zdGRvdXQ6Ci0JLzEj4oCmLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJjMgotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycwotc3RkaW46Ci0Jc2V0ICtVCi0JaW50ZWdlciB4PTEj4oCmCi0JZWNobyAvJHgvCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvMSPigKY6IHVuZXhwZWN0ZWQgJ4AnLwotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmQxCi1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMgb2theQotc3RkaW46Ci0Jc2V0IC1VCi0JdHlwZXNldCAtaTE2IHg9MSP/Ci0JZWNobyAvJHgvCSMgaW52YWxpZCB1dGYtOAotZXhwZWN0ZWQtc3Rkb3V0OgotCS8xNiNlZmZmLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkMgotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIGhhbmRsZXMgb2N0ZXRzCi1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1pMTYgeD0xI8IKLQllY2hvIC8keC8JIyBpbnZhbGlkIDItYnl0ZQotZXhwZWN0ZWQtc3Rkb3V0OgotCS8xNiNlZmMyLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkMwotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIGhhbmRsZXMgb2N0ZXRzCi1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1pMTYgeD0xI+8KLQllY2hvIC8keC8JIyBpbnZhbGlkIDItYnl0ZQotZXhwZWN0ZWQtc3Rkb3V0OgotCS8xNiNlZmVmLwotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkNAotZGVzY3JpcHRpb246Ci0JY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGludmFsaWQgaW5wdXQKLXN0ZGluOgotCXNldCAtVQotCXR5cGVzZXQgLWkxNiB4PTEj77/ACi0JZWNobyAvJHgvCSMgaW52YWxpZCAzLWJ5dGUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8xI++/wDogdW5leHBlY3RlZCAnvycvCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLS0tLQotbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDUKLWRlc2NyaXB0aW9uOgotCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBpbnZhbGlkIGlucHV0Ci1zdGRpbjoKLQlzZXQgLVUKLQl0eXBlc2V0IC1pMTYgeD0xI8CACi0JZWNobyAvJHgvCSMgbm9uLW1pbmltYWxpc3RpYwotZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46Ci0JLzEjwIA6IHVuZXhwZWN0ZWQgJ4AnLwotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtMmQ2Ci1kZXNjcmlwdGlvbjoKLQljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgaW52YWxpZCBpbnB1dAotc3RkaW46Ci0Jc2V0IC1VCi0JdHlwZXNldCAtaTE2IHg9MSPggIAKLQllY2hvIC8keC8JIyBub24tbWluaW1hbGlzdGljCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvMSPggIA6IHVuZXhwZWN0ZWQgJ4AnLwotZXhwZWN0ZWQtZXhpdDogZSAhPSAwCi0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtM0EKLWRlc2NyaXB0aW9uOgotCXNvbWUgc2FtcGxlIGNvZGUgZm9yIGhleGR1bXBpbmcKLXN0ZGluOgotCXsKLQkJcHJpbnQgJ0hlbGxvLCBXb3JsZCFcXFxu44GT44KT44Gr44Gh44Gv77yBJwotCQl0eXBlc2V0IC1VdWkxNiBpPTB4MTAwCi0JCSMgY2hhbmdlIHRoYXQgdG8gMHhGRiBvbmNlIHdlIGNhbiBoYW5kbGUgZW1iZWRkZWQKLQkJIyBOVUwgY2hhcmFjdGVycyBpbiBzdHJpbmdzIC8gaGVyZSBkb2N1bWVudHMKLQkJd2hpbGUgKCggaSsrIDwgMHgxRkYgKSk7IGRvCi0JCQlwcmludCAtbiAiXHgke2kjMTYjMX0iCi0JCWRvbmUKLQkJcHJpbnQKLQl9IHwgewotCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCi0JCXR5cGVzZXQgLVV1aTE2IC1aNSBodgotCQl0eXBlc2V0IC1pMSB3Yz0weDBBCi0JCWRhc2M9Ci0JCW5sPSR7d2MjMSN9Ci0JCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbwotCQkJbGluZT0kbGluZSRubAotCQkJd2hpbGUgW1sgLW4gJGxpbmUgXV07IGRvCi0JCQkJaHY9MSMke2xpbmU6OjF9Ci0JCQkJaWYgKCggKHBvcyAmIDE1KSA9PSAwICkpOyB0aGVuCi0JCQkJCSgoIHBvcyApKSAmJiBwcmludCAiJGRhc2N8IgotCQkJCQlwcmludCAtbiAiJHtwb3MjMTYjfSAgIgotCQkJCQlkYXNjPScgfCcKLQkJCQlmaQotCQkJCXByaW50IC1uICIke2h2IzE2I30gIgotCQkJCWlmICgoIChodiA8IDMyKSB8fCAoaHYgPiAxMjYpICkpOyB0aGVuCi0JCQkJCWRhc2M9JGRhc2MuCi0JCQkJZWxzZQotCQkJCQlkYXNjPSRkYXNjJHtsaW5lOjoxfQotCQkJCWZpCi0JCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJwotCQkJCWxpbmU9JHtsaW5lOjF9Ci0JCQlkb25lCi0JCWRvbmUKLQkJaWYgKCggKHBvcyAmIDE1KSAhPSAxICkpOyB0aGVuCi0JCQl3aGlsZSAoKCBwb3MgJiAxNSApKTsgZG8KLQkJCQlwcmludCAtbiAnICAgJwotCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKLQkJCWRvbmUKLQkJCXByaW50ICIkZGFzY3wiCi0JCWZpCi0JfQotZXhwZWN0ZWQtc3Rkb3V0OgotCTAwMDAwMDAwICA0OCA2NSA2QyA2QyA2RiAyQyAyMCA1NyAtIDZGIDcyIDZDIDY0IDIxIDVDIDBBIEUzICB8SGVsbG8sIFdvcmxkIVwuLnwKLQkwMDAwMDAxMCAgODEgOTMgRTMgODIgOTMgRTMgODEgQUIgLSBFMyA4MSBBMSBFMyA4MSBBRiBFRiBCQyAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwMjAgIDgxIDBBIDAxIDAyIDAzIDA0IDA1IDA2IC0gMDcgMDggMDkgMEEgMEIgMEMgMEQgMEUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMDMwICAwRiAxMCAxMSAxMiAxMyAxNCAxNSAxNiAtIDE3IDE4IDE5IDFBIDFCIDFDIDFEIDFFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDA0MCAgMUYgMjAgMjEgMjIgMjMgMjQgMjUgMjYgLSAyNyAyOCAyOSAyQSAyQiAyQyAyRCAyRSAgfC4gISIjJCUmJygpKissLS58Ci0JMDAwMDAwNTAgIDJGIDMwIDMxIDMyIDMzIDM0IDM1IDM2IC0gMzcgMzggMzkgM0EgM0IgM0MgM0QgM0UgIHwvMDEyMzQ1Njc4OTo7PD0+fAotCTAwMDAwMDYwICAzRiA0MCA0MSA0MiA0MyA0NCA0NSA0NiAtIDQ3IDQ4IDQ5IDRBIDRCIDRDIDREIDRFICB8P0BBQkNERUZHSElKS0xNTnwKLQkwMDAwMDA3MCAgNEYgNTAgNTEgNTIgNTMgNTQgNTUgNTYgLSA1NyA1OCA1OSA1QSA1QiA1QyA1RCA1RSAgfE9QUVJTVFVWV1hZWltcXV58Ci0JMDAwMDAwODAgIDVGIDYwIDYxIDYyIDYzIDY0IDY1IDY2IC0gNjcgNjggNjkgNkEgNkIgNkMgNkQgNkUgIHxfYGFiY2RlZmdoaWprbG1ufAotCTAwMDAwMDkwICA2RiA3MCA3MSA3MiA3MyA3NCA3NSA3NiAtIDc3IDc4IDc5IDdBIDdCIDdDIDdEIDdFICB8b3BxcnN0dXZ3eHl6e3x9fnwKLQkwMDAwMDBBMCAgN0YgODAgODEgODIgODMgODQgODUgODYgLSA4NyA4OCA4OSA4QSA4QiA4QyA4RCA4RSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwQjAgIDhGIDkwIDkxIDkyIDkzIDk0IDk1IDk2IC0gOTcgOTggOTkgOUEgOUIgOUMgOUQgOUUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMEMwICA5RiBBMCBBMSBBMiBBMyBBNCBBNSBBNiAtIEE3IEE4IEE5IEFBIEFCIEFDIEFEIEFFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDBEMCAgQUYgQjAgQjEgQjIgQjMgQjQgQjUgQjYgLSBCNyBCOCBCOSBCQSBCQiBCQyBCRCBCRSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAwRTAgIEJGIEMwIEMxIEMyIEMzIEM0IEM1IEM2IC0gQzcgQzggQzkgQ0EgQ0IgQ0MgQ0QgQ0UgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMEYwICBDRiBEMCBEMSBEMiBEMyBENCBENSBENiAtIEQ3IEQ4IEQ5IERBIERCIERDIEREIERFICB8Li4uLi4uLi4uLi4uLi4uLnwKLQkwMDAwMDEwMCAgREYgRTAgRTEgRTIgRTMgRTQgRTUgRTYgLSBFNyBFOCBFOSBFQSBFQiBFQyBFRCBFRSAgfC4uLi4uLi4uLi4uLi4uLi58Ci0JMDAwMDAxMTAgIEVGIEYwIEYxIEYyIEYzIEY0IEY1IEY2IC0gRjcgRjggRjkgRkEgRkIgRkMgRkQgRkUgIHwuLi4uLi4uLi4uLi4uLi4ufAotCTAwMDAwMTIwICBGRiAwQSAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICB8Li58Ci0tLS0KLW5hbWU6IGludGVnZXItYmFzZS1vbmUtM1cKLWRlc2NyaXB0aW9uOgotCXNvbWUgc2FtcGxlIGNvZGUgZm9yIGhleGR1bXBpbmcgVW5pY29kZQotc3RkaW46Ci0Jc2V0IC1VCi0JewotCQlwcmludCAnSGVsbG8sIFdvcmxkIVxcXG7jgZPjgpPjgavjgaHjga/vvIEnCi0JCXR5cGVzZXQgLVV1aTE2IGk9MHgxMDAKLQkJIyBjaGFuZ2UgdGhhdCB0byAweEZGIG9uY2Ugd2UgY2FuIGhhbmRsZSBlbWJlZGRlZAotCQkjIE5VTCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgLyBoZXJlIGRvY3VtZW50cwotCQl3aGlsZSAoKCBpKysgPCAweDFGRiApKTsgZG8KLQkJCXByaW50IC1uICJcdSR7aSMxNiMxfSIKLQkJZG9uZQotCQlwcmludAotCQlwcmludCBcXHhmZgkJIyBpbnZhbGlkIHV0Zi04Ci0JCXByaW50IFxceGMyCQkjIGludmFsaWQgMi1ieXRlCi0JCXByaW50IFxceGVmXFx4YmZcXHhjMAkjIGludmFsaWQgMy1ieXRlCi0JCXByaW50IFxceGMwXFx4ODAJIyBub24tbWluaW1hbGlzdGljCi0JCXByaW50IFxceGUwXFx4ODBcXHg4MAkjIG5vbi1taW5pbWFsaXN0aWMKLQkJcHJpbnQgJ++/ve+/vu+/vycJIyBlbmQgb2YgcmFuZ2UKLQl9IHwgewotCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCi0JCXR5cGVzZXQgLVV1aTE2IC1aNyBodgotCQl0eXBlc2V0IC1pMSB3Yz0weDBBCi0JCXR5cGVzZXQgLWkgbHBvcwotCQlkYXNjPQotCQlubD0ke3djIzEjfQotCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KLQkJCWxpbmU9JGxpbmUkbmwKLQkJCWxwb3M9MAotCQkJd2hpbGUgKCggbHBvcyA8ICR7I2xpbmV9ICkpOyBkbwotCQkJCXdjPTEjJHtsaW5lOihscG9zKyspOjF9Ci0JCQkJaWYgKCggKHdjIDwgMzIpIHx8IFwKLQkJCQkgICAgKCh3YyA+IDEyNikgJiYgKHdjIDwgMTYwKSkgKSk7IHRoZW4KLQkJCQkJZGNoPS4KLQkJCQllbGlmICgoICh3YyAmIDB4RkY4MCkgPT0gMHhFRjgwICkpOyB0aGVuCi0JCQkJCWRjaD3vv70KLQkJCQllbHNlCi0JCQkJCWRjaD0ke3djIzEjfQotCQkJCWZpCi0JCQkJaWYgKCggKHBvcyAmIDcpID09IDcgKSk7IHRoZW4KLQkJCQkJZGFzYz0kZGFzYyRkY2gKLQkJCQkJZGNoPQotCQkJCWVsaWYgKCggKHBvcyAmIDcpID09IDAgKSk7IHRoZW4KLQkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCi0JCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCi0JCQkJCWRhc2M9JyB8JwotCQkJCWZpCi0JCQkJbGV0IGh2PXdjCi0JCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCi0JCQkJKCggKHBvcysrICYgNykgPT0gMyApKSAmJiBcCi0JCQkJICAgIHByaW50IC1uIC0tICctICcKLQkJCQlkYXNjPSRkYXNjJGRjaAotCQkJZG9uZQotCQlkb25lCi0JCWlmICgoIHBvcyAmIDcgKSk7IHRoZW4KLQkJCXdoaWxlICgoIHBvcyAmIDcgKSk7IGRvCi0JCQkJcHJpbnQgLW4gJyAgICAgJwotCQkJCSgoIChwb3MrKyAmIDcpID09IDMgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJwotCQkJZG9uZQotCQkJcHJpbnQgIiRkYXNjfCIKLQkJZmkKLQl9Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JMDAwMDAwMDAgIDAwNDggMDA2NSAwMDZDIDAwNkMgLSAwMDZGIDAwMkMgMDAyMCAwMDU3ICB8SGVsbG8sIFd8Ci0JMDAwMDAwMDggIDAwNkYgMDA3MiAwMDZDIDAwNjQgLSAwMDIxIDAwNUMgMDAwQSAzMDUzICB8b3JsZCFcLuOBk3wKLQkwMDAwMDAxMCAgMzA5MyAzMDZCIDMwNjEgMzA2RiAtIEZGMDEgMDAwQSAwMDAxIDAwMDIgIHzjgpPjgavjgaHjga/vvIEuLi58Ci0JMDAwMDAwMTggIDAwMDMgMDAwNCAwMDA1IDAwMDYgLSAwMDA3IDAwMDggMDAwOSAwMDBBICB8Li4uLi4uLi58Ci0JMDAwMDAwMjAgIDAwMEIgMDAwQyAwMDBEIDAwMEUgLSAwMDBGIDAwMTAgMDAxMSAwMDEyICB8Li4uLi4uLi58Ci0JMDAwMDAwMjggIDAwMTMgMDAxNCAwMDE1IDAwMTYgLSAwMDE3IDAwMTggMDAxOSAwMDFBICB8Li4uLi4uLi58Ci0JMDAwMDAwMzAgIDAwMUIgMDAxQyAwMDFEIDAwMUUgLSAwMDFGIDAwMjAgMDAyMSAwMDIyICB8Li4uLi4gISJ8Ci0JMDAwMDAwMzggIDAwMjMgMDAyNCAwMDI1IDAwMjYgLSAwMDI3IDAwMjggMDAyOSAwMDJBICB8IyQlJicoKSp8Ci0JMDAwMDAwNDAgIDAwMkIgMDAyQyAwMDJEIDAwMkUgLSAwMDJGIDAwMzAgMDAzMSAwMDMyICB8KywtLi8wMTJ8Ci0JMDAwMDAwNDggIDAwMzMgMDAzNCAwMDM1IDAwMzYgLSAwMDM3IDAwMzggMDAzOSAwMDNBICB8MzQ1Njc4OTp8Ci0JMDAwMDAwNTAgIDAwM0IgMDAzQyAwMDNEIDAwM0UgLSAwMDNGIDAwNDAgMDA0MSAwMDQyICB8Ozw9Pj9AQUJ8Ci0JMDAwMDAwNTggIDAwNDMgMDA0NCAwMDQ1IDAwNDYgLSAwMDQ3IDAwNDggMDA0OSAwMDRBICB8Q0RFRkdISUp8Ci0JMDAwMDAwNjAgIDAwNEIgMDA0QyAwMDREIDAwNEUgLSAwMDRGIDAwNTAgMDA1MSAwMDUyICB8S0xNTk9QUVJ8Ci0JMDAwMDAwNjggIDAwNTMgMDA1NCAwMDU1IDAwNTYgLSAwMDU3IDAwNTggMDA1OSAwMDVBICB8U1RVVldYWVp8Ci0JMDAwMDAwNzAgIDAwNUIgMDA1QyAwMDVEIDAwNUUgLSAwMDVGIDAwNjAgMDA2MSAwMDYyICB8W1xdXl9gYWJ8Ci0JMDAwMDAwNzggIDAwNjMgMDA2NCAwMDY1IDAwNjYgLSAwMDY3IDAwNjggMDA2OSAwMDZBICB8Y2RlZmdoaWp8Ci0JMDAwMDAwODAgIDAwNkIgMDA2QyAwMDZEIDAwNkUgLSAwMDZGIDAwNzAgMDA3MSAwMDcyICB8a2xtbm9wcXJ8Ci0JMDAwMDAwODggIDAwNzMgMDA3NCAwMDc1IDAwNzYgLSAwMDc3IDAwNzggMDA3OSAwMDdBICB8c3R1dnd4eXp8Ci0JMDAwMDAwOTAgIDAwN0IgMDA3QyAwMDdEIDAwN0UgLSAwMDdGIDAwODAgMDA4MSAwMDgyICB8e3x9fi4uLi58Ci0JMDAwMDAwOTggIDAwODMgMDA4NCAwMDg1IDAwODYgLSAwMDg3IDAwODggMDA4OSAwMDhBICB8Li4uLi4uLi58Ci0JMDAwMDAwQTAgIDAwOEIgMDA4QyAwMDhEIDAwOEUgLSAwMDhGIDAwOTAgMDA5MSAwMDkyICB8Li4uLi4uLi58Ci0JMDAwMDAwQTggIDAwOTMgMDA5NCAwMDk1IDAwOTYgLSAwMDk3IDAwOTggMDA5OSAwMDlBICB8Li4uLi4uLi58Ci0JMDAwMDAwQjAgIDAwOUIgMDA5QyAwMDlEIDAwOUUgLSAwMDlGIDAwQTAgMDBBMSAwMEEyICB8Li4uLi7CoMKhwqJ8Ci0JMDAwMDAwQjggIDAwQTMgMDBBNCAwMEE1IDAwQTYgLSAwMEE3IDAwQTggMDBBOSAwMEFBICB8wqPCpMKlwqbCp8KowqnCqnwKLQkwMDAwMDBDMCAgMDBBQiAwMEFDIDAwQUQgMDBBRSAtIDAwQUYgMDBCMCAwMEIxIDAwQjIgIHzCq8Kswq3CrsKvwrDCscKyfAotCTAwMDAwMEM4ICAwMEIzIDAwQjQgMDBCNSAwMEI2IC0gMDBCNyAwMEI4IDAwQjkgMDBCQSAgfMKzwrTCtcK2wrfCuMK5wrp8Ci0JMDAwMDAwRDAgIDAwQkIgMDBCQyAwMEJEIDAwQkUgLSAwMEJGIDAwQzAgMDBDMSAwMEMyICB8wrvCvMK9wr7Cv8OAw4HDgnwKLQkwMDAwMDBEOCAgMDBDMyAwMEM0IDAwQzUgMDBDNiAtIDAwQzcgMDBDOCAwMEM5IDAwQ0EgIHzDg8OEw4XDhsOHw4jDicOKfAotCTAwMDAwMEUwICAwMENCIDAwQ0MgMDBDRCAwMENFIC0gMDBDRiAwMEQwIDAwRDEgMDBEMiAgfMOLw4zDjcOOw4/DkMORw5J8Ci0JMDAwMDAwRTggIDAwRDMgMDBENCAwMEQ1IDAwRDYgLSAwMEQ3IDAwRDggMDBEOSAwMERBICB8w5PDlMOVw5bDl8OYw5nDmnwKLQkwMDAwMDBGMCAgMDBEQiAwMERDIDAwREQgMDBERSAtIDAwREYgMDBFMCAwMEUxIDAwRTIgIHzDm8Ocw53DnsOfw6DDocOifAotCTAwMDAwMEY4ICAwMEUzIDAwRTQgMDBFNSAwMEU2IC0gMDBFNyAwMEU4IDAwRTkgMDBFQSAgfMOjw6TDpcOmw6fDqMOpw6p8Ci0JMDAwMDAxMDAgIDAwRUIgMDBFQyAwMEVEIDAwRUUgLSAwMEVGIDAwRjAgMDBGMSAwMEYyICB8w6vDrMOtw67Dr8Oww7HDsnwKLQkwMDAwMDEwOCAgMDBGMyAwMEY0IDAwRjUgMDBGNiAtIDAwRjcgMDBGOCAwMEY5IDAwRkEgIHzDs8O0w7XDtsO3w7jDucO6fAotCTAwMDAwMTEwICAwMEZCIDAwRkMgMDBGRCAwMEZFIC0gMDBGRiAwMDBBIEVGRkYgMDAwQSAgfMO7w7zDvcO+w78u77+9LnwKLQkwMDAwMDExOCAgRUZDMiAwMDBBIEVGRUYgRUZCRiAtIEVGQzAgMDAwQSBFRkMwIEVGODAgIHzvv70u77+977+977+9Lu+/ve+/vXwKLQkwMDAwMDEyMCAgMDAwQSBFRkUwIEVGODAgRUY4MCAtIDAwMEEgRkZGRCBFRkVGIEVGQkYgIHwu77+977+977+9Lu+/ve+/ve+/vXwKLQkwMDAwMDEyOCAgRUZCRSBFRkVGIEVGQkYgRUZCRiAtIDAwMEEgICAgICAgICAgICAgICAgIHzvv73vv73vv73vv70ufAotLS0tCi1uYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIGtzaDkzLXN0eWxlIGJhc2Utb25lIGludGVnZXJzIHdvcmsKLWNhdGVnb3J5OiAhc21rc2gKLXN0ZGluOgotCXNldCAtVQotCWVjaG8gMSAkKCgnYScpKQotCShlY2hvIDJmICQoKCdhYScpKSkgMj4mMSB8IHNlZCAicy9eW14nXSonLzJwICcvIgotCWVjaG8gMyAkKCgn4oCmJykpCi0JeD0iJ2EnIgotCWVjaG8gIjQgPCR4PiIKLQllY2hvIDUgJCgoJHgpKQotCWVjaG8gNiAkKCh4KSkKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIDk3Ci0JMnAgJ2FhJzogbXVsdGktY2hhcmFjdGVyIGNoYXJhY3RlciBjb25zdGFudAotCTMgODIzMAotCTQgPCdhJz4KLQk1IDk3Ci0JNiA5NwotLS0tCi1uYW1lOiB1bGltaXQtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgd2UgY2FuIHVzZSBhIHNwZWNpZmljIHN5bnRheCBpZGlvbSBmb3IgdWxpbWl0Ci1zdGRpbjoKLQlpZiAhIHg9JCh1bGltaXQgLWQpIHx8IFtbICR4ID0gdW5rbm93biBdXTsgdGhlbgotCQkjZWNobyBleHBlY3RlZCB0byBmYWlsIG9uIHRoaXMgT1MKLQkJZWNobyBva2F5Ci0JZWxzZQotCQl1bGltaXQgLWRTICR4ICYmIGVjaG8gb2theQotCWZpCi1leHBlY3RlZC1zdGRvdXQ6Ci0Jb2theQotLS0tCi1uYW1lOiBiYXNoaW9wLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCi0JUGFydCAxOiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCi1zdGRpbjoKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgJj5mb28KLQllY2hvID09PQotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQl0cmkKLQk9PT0KLQlyYXMKLQlkd2EKLS0tLQotbmFtZTogYmFzaGlvcC0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKLQlQYXJ0IDI6IHRoaXMgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCi1zdGRpbjoKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgMyY+Zm9vCi0JZWNobyA9PT0KLQljYXQgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JcmFzCi0JPT09Ci0JZHdhCi0JdHJpCi0tLS0KLW5hbWU6IGJhc2hpb3AtMmIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCi0JUGFydCAyOiB0aGlzIGlzICpub3QqIHN1cHBvcnRlZCBieSBHTlUgYmFzaAotc3RkaW46Ci0JZXhlYyAzPiYxCi0JZnVuY3Rpb24gdGhyZWVvdXQgewotCQllY2hvIHJhcwotCQllY2hvIGR3YSA+JjIKLQkJZWNobyB0cmkgPiYzCi0JfQotCXRocmVlb3V0IDM+Zm9vICY+JjMKLQllY2hvID09PQotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQk9PT0KLQlyYXMKLQlkd2EKLQl0cmkKLS0tLQotbmFtZTogYmFzaGlvcC0yYwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKLQlQYXJ0IDI6IHRoaXMgaXMgc3VwcG9ydGVkIGJ5IEdOVSBiYXNoIDQgb25seQotc3RkaW46Ci0JZWNobyBtaXIgPmZvbwotCXNldCAtbyBub2Nsb2JiZXIKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgJj4+Zm9vCi0JZWNobyA9PT0KLQljYXQgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JdHJpCi0JPT09Ci0JbWlyCi0JcmFzCi0JZHdhCi0tLS0KLW5hbWU6IGJhc2hpb3AtM2EKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIGZhaWxzIGNvcnJlY3RseQotCVBhcnQgMTogdGhpcyBpcyBhbHNvIHN1cHBvcnRlZCBieSBHTlUgYmFzaAotc3RkaW46Ci0JZWNobyBtaXIgPmZvbwotCXNldCAtbyBub2Nsb2JiZXIKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JdGhyZWVvdXQgJj5mb28KLQllY2hvID09PQotCWNhdCBmb28KLWV4cGVjdGVkLXN0ZG91dDoKLQk9PT0KLQltaXIKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLio6IGNhbm5vdCAoY3JlYXRlfG92ZXJ3cml0ZSkgLiovCi0tLS0KLW5hbWU6IGJhc2hpb3AtM2IKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIGZhaWxzIGNvcnJlY3RseQotCVBhcnQgMjogdGhpcyBpcyAqbm90KiBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKLXN0ZGluOgotCWVjaG8gbWlyID5mb28KLQlzZXQgLW8gbm9jbG9iYmVyCi0JZXhlYyAzPiYxCi0JZnVuY3Rpb24gdGhyZWVvdXQgewotCQllY2hvIHJhcwotCQllY2hvIGR3YSA+JjIKLQkJZWNobyB0cmkgPiYzCi0JfQotCXRocmVlb3V0ICY+fGZvbwotCWVjaG8gPT09Ci0JY2F0IGZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCXRyaQotCT09PQotCXJhcwotCWR3YQotLS0tCi1uYW1lOiBiYXNoaW9wLTQKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCi0JUGFydCA0OiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoLAotCWJ1dCBmYWlsZWQgaW4gc29tZSBta3NoIHZlcnNpb25zCi1zdGRpbjoKLQlleGVjIDM+JjEKLQlmdW5jdGlvbiB0aHJlZW91dCB7Ci0JCWVjaG8gcmFzCi0JCWVjaG8gZHdhID4mMgotCQllY2hvIHRyaSA+JjMKLQl9Ci0JZnVuY3Rpb24gYmx1YmIgewotCQlbWyAtZSBiYXIgXV0gJiYgdGhyZWVvdXQgIiRiZiIgJj5mb28KLQl9Ci0JYmx1YmIKLQllY2hvIC1uID5iYXIKLQlibHViYgotCWVjaG8gPT09Ci0JY2F0IGZvbwotZXhwZWN0ZWQtc3Rkb3V0OgotCXRyaQotCT09PQotCXJhcwotCWR3YQotLS0tCi1uYW1lOiBta3NoaW9wLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGZvciBzdXBwb3J0IG9mIG1vcmUgdGhhbiA5IGZpbGUgZGVzY3JpcHRvcnMKLWNhdGVnb3J5OiAhY29udmZkcwotc3RkaW46Ci0JcmVhZCAtdTEwIGZvbyAxMDw8PCBiYXIKLQllY2hvIHgkZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JeGJhcgotLS0tCi1uYW1lOiBta3NoaW9wLTIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIGZvciBzdXBwb3J0IG9mIG1vcmUgdGhhbiA5IGZpbGUgZGVzY3JpcHRvcnMKLWNhdGVnb3J5OiAhY29udmZkcwotc3RkaW46Ci0JZXhlYyAxMj5mb28KLQlwcmludCAtdTEyIGJhcgotCWVjaG8gYmF6ID4mMTIKLQljYXQgZm9vCi1leHBlY3RlZC1zdGRvdXQ6Ci0JYmFyCi0JYmF6Ci0tLS0KLW5hbWU6IG9rc2gtc2hjcmFzaAotZGVzY3JpcHRpb246Ci0Jc3JjL3JlZ3Jlc3MvYmluL2tzaC9zaGNyYXNoLnNoLHYgMS4xCi1zdGRpbjoKLQlkZXBsaWJzPSItbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWx0aWZmIC1sanBlZyAtbHogLWxwbmcgLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfcGl4YnVmLmxhIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAtbG0gLWxtIC91c3IvbG9jYWwvbGliL2xpYmF1ZGlvZmlsZS5sYSAtbG0gLWxtIC1sYXVkaW9maWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZXNkLmxhIC1sbSAtbHogLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXN1cHBvcnQubGEgLWxtIC1seiAtbG0gLWxnbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWUubGEgLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWxJQ0UgLWxTTSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAtbHogL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvWDExUjYvbGliIC91c3IvbG9jYWwvbGliL2xpYmdka19pbWxpYi5sYSAtbG0gLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJhcnRfbGdwbC5sYSAtbG0gLWx6IC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxJQ0UgLWxTTSAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1ML3Vzci9YMTFSNi9saWIgLWxtIC1seiAtbHBuZyAtbHVuZ2lmIC1seiAtbGpwZWcgLWx0aWZmIC1sanBlZyAtbGdka19pbWxpYiAtbGdsaWIgLWxtIC1sYXVkaW9maWxlIC1sbSAtbGF1ZGlvZmlsZSAtbGVzZCAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21ldWkubGEgLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgLWx6IC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGlieG1sLmxhIC1sbSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtTC91c3IvWDExUjYvbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2xhZGUubGEgLWx6IC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGlieG1sLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgLWxtIC1sbSAvdXNyL2xvY2FsL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtIC1sbSAtbGF1ZGlvZmlsZSAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXN1cHBvcnQubGEgLWxtIC1seiAtbG0gLWxnbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lLmxhIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWxJQ0UgLWxTTSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sbSAtbHogLWx1bmdpZiAtbHogLWxqcGVnIC1sanBlZyAtbGdka19pbWxpYiAtbGdsaWIgLWxtIC1sYXVkaW9maWxlIC1sbSAtbGF1ZGlvZmlsZSAtbGVzZCAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXVpLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbGFkZS1nbm9tZS5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC1sbSAtbG0gL3Vzci9sb2NhbC9saWIvbGliYXVkaW9maWxlLmxhIC1sbSAtbG0gLWxhdWRpb2ZpbGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZS5sYSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC1seiAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9YMTFSNi9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC1sbSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbElDRSAtbFNNIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLUwvdXNyL1gxMVI2L2xpYiAtbG0gLWx6IC1scG5nIC1sdW5naWYgLWx6IC1sanBlZyAtbHRpZmYgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWV1aS5sYSAtTC91c3IvWDExUjYvbGliIC1ML3Vzci9sb2NhbC9saWIiCi0Jc3BlY2lhbGRlcGxpYnM9Ii1sZ25vbWV1aSAtbGFydF9sZ3BsIC1sZ2RrX2ltbGliIC1sdGlmZiAtbGpwZWcgLWx1bmdpZiAtbHBuZyAtbHogLWxTTSAtbElDRSAtbGd0ayAtbGdkayAtbGdtb2R1bGUgLWxpbnRsIC1sWGV4dCAtbFgxMSAtbGdub21lIC1sZ25vbWVzdXBwb3J0IC1sZXNkIC1sYXVkaW9maWxlIC1sbSAtbGdsaWIiCi0JZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkJY2FzZSAkZGVwbGliIGluCi0JCS1MKikKLQkJCW5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKLQkJCTs7Ci0JCSopCi0JCQljYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KLQkJCSoiICRkZXBsaWIgIiopCi0JCQkJbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIjs7Ci0JCQllc2FjCi0JCQk7OwotCQllc2FjCi0JZG9uZQotLS0tCi1uYW1lOiBva3NoLXZhcmZ1bmN0aW9uLW1vZDEKLWRlc2NyaXB0aW9uOgotCSRPcGVuQlNEOiB2YXJmdW5jdGlvbi5zaCx2IDEuMSAyMDAzLzEyLzE1IDA1OjI4OjQwIG90dG8gRXhwICQKLQlDYWxsaW5nCi0JCUZPTz1iYXIgZgotCXdoZXJlIGYgaXMgYSBrc2ggc3R5bGUgZnVuY3Rpb24sIHNob3VsZCBub3Qgc2V0IEZPTyBpbiB0aGUgY3VycmVudAotCWVudi4gSWYgZiBpcyBhIEJvdXJuZSBzdHlsZSBmdW5jdGlvbiwgRk9PIHNob3VsZCBiZSBzZXQuIEZ1cnRoZXJtb3JlLAotCXRoZSBmdW5jdGlvbiBzaG91bGQgcmVjZWl2ZSBhIGNvcnJlY3QgdmFsdWUgb2YgRk9PLiBIb3dldmVyLCBkaWZmZXJpbmcKLQlmcm9tIG9rc2gsIHNldHRpbmcgRk9PIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYgbXVzdCBjaGFuZ2UgdGhlIHZhbHVlIGluCi0Jc2V0dGluZyBGT08gaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBzaG91bGQgbm90IGNoYW5nZSB0aGUgdmFsdWUgaW4KLQlnbG9iYWwgZW52aXJvbm1lbnQuCi0JSW5zcGlyZWQgYnkgUFIgMjQ1MC4KLXN0ZGluOgotCWZ1bmN0aW9uIGsgewotCQlpZiBbIHgkRk9PICE9IHhiYXIgXTsgdGhlbgotCQkJZWNobyAxCi0JCQlyZXR1cm4gMQotCQlmaQotCQl4PSQoZW52IHwgZ3JlcCBGT08pCi0JCWlmIFsgIngkeCIgIT0gInhGT089YmFyIiBdOyB0aGVuCi0JCQllY2hvIDIKLQkJCXJldHVybiAxOwotCQlmaQotCQlGT089Zm9vCi0JCXJldHVybiAwCi0JfQotCWIgKCkgewotCQlpZiBbIHgkRk9PICE9IHhiYXIgXTsgdGhlbgotCQkJZWNobyAzCi0JCQlyZXR1cm4gMQotCQlmaQotCQl4PSQoZW52IHwgZ3JlcCBGT08pCi0JCWlmIFsgIngkeCIgIT0gInhGT089YmFyIiBdOyB0aGVuCi0JCQllY2hvIDQKLQkJCXJldHVybiAxOwotCQlmaQotCQlGT089Zm9vCi0JCXJldHVybiAwCi0JfQotCUZPTz1iYXIgawotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0JaWYgWyB4JEZPTyAhPSB4IF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLQlGT089YmFyIGIKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQlleGl0IDEKLQlmaQotCWlmIFsgeCRGT08gIT0geGZvbyBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0JRk9PPWJhcmJhcgotCUZPTz1iYXIgawotCWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0JaWYgWyB4JEZPTyAhPSB4YmFyYmFyIF07IHRoZW4KLQkJZXhpdCAxCi0JZmkKLQlGT089YmFyIGIKLQlpZiBbICQ/ICE9IDAgXTsgdGhlbgotCQlleGl0IDEKLQlmaQotCWlmIFsgeCRGT08gIT0geGZvbyBdOyB0aGVuCi0JCWV4aXQgMQotCWZpCi0tLS0KLW5hbWU6IGZkLWNsb2V4ZWMtMQotZGVzY3JpcHRpb246Ci0JVmVyaWZ5IHRoYXQgZmlsZSBkZXNjcmlwdG9ycyA+IDIgYXJlIHByaXZhdGUgZm9yIEtvcm4gc2hlbGxzCi1maWxlLXNldHVwOiBmaWxlIDY0NCAidGVzdC5zaCIKLQlwcmludCAtdTMgRm93bAotc3RkaW46Ci0JZXhlYyAzPiYxCi0JIiRfX3Byb2duYW1lIiB0ZXN0LnNoCi1leHBlY3RlZC1leGl0OiBlICE9IDAKLWV4cGVjdGVkLXN0ZGVycjoKLQl0ZXN0LnNoWzFdOiBwcmludDogLXU6IDM6IGJhZCBmaWxlIGRlc2NyaXB0b3IKLS0tLQotbmFtZTogZmQtY2xvZXhlYy0yCi1kZXNjcmlwdGlvbjoKLQlWZXJpZnkgdGhhdCBmaWxlIGRlc2NyaXB0b3JzID4gMiBhcmUgbm90IHByaXZhdGUgZm9yIFBPU0lYIHNoZWxscwotCVNlZSBEZWJpYW4gQnVnICMxNTQ1NDAsIENsb3NlczogIzQ5OTEzOQotZmlsZS1zZXR1cDogZmlsZSA2NDQgInRlc3Quc2giCi0JcHJpbnQgLXUzIEZvd2wKLXN0ZGluOgotCXRlc3QgLW4gIiRQT1NIX1ZFUlNJT04iIHx8IHNldCAtbyBzaAotCWV4ZWMgMz4mMQotCSIkX19wcm9nbmFtZSIgdGVzdC5zaAotZXhwZWN0ZWQtc3Rkb3V0OgotCUZvd2wKLS0tLQotbmFtZTogY29tc3ViLTEKLWRlc2NyaXB0aW9uOgotCUNPTVNVQiBhcmUgY3VycmVudGx5IHBhcnNlZCBieSBoYWNraW5nIGxleC5jIGluc3RlYWQgb2YKLQlyZWN1cnNpdmVseSAoc2VlIHJlZ3Jlc3Npb24tNik6IG1hdGNoaW5nIHBhcmVudGhlc8STcyBidWcKLQlGYWlscyBvbjogcGRrc2ggbWtzaCBiYXNoMiBiYXNoMyB6c2gKLQlQYXNzZXMgb246IGJhc2g0IGtzaDkzCi1leHBlY3RlZC1mYWlsOiB5ZXMKLXN0ZGluOgotCWVjaG8gJChjYXNlIDEgaW4gKDEpIGVjaG8geWVzOzsgKDIpIGVjaG8gbm87OyBlc2FjKQotCWVjaG8gJChjYXNlIDEgaW4gMSkgZWNobyB5ZXM7OyAyKSBlY2hvIG5vOzsgZXNhYykKLWV4cGVjdGVkLXN0ZG91dDoKLQl5ZXMKLQl5ZXMKLS0tLQotbmFtZTogY29tc3ViLTIKLWRlc2NyaXB0aW9uOgotCVJlZEhhdCBCWiM0OTY3OTEg4oCTIGFub3RoZXIgY2FzZSBvZiBtaXNzaW5nIHJlY3Vyc2lvbgotCWluIHBhcnNpbmcgQ09NU1VCIGV4cHJlc3Npb25zCi0JRmFpbHMgb246IHBka3NoIG1rc2ggYmFzaDIgYmFzaDPCuSBiYXNoNMK5IHpzaAotCVBhc3NlcyBvbjoga3NoOTMKLQnikaAgYmFzaFszNF0gc2VlbSB0byBjaG9rZSBvbiBjb21tZW50IGVuZGluZyB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lCi1leHBlY3RlZC1mYWlsOiB5ZXMKLXN0ZGluOgotCSMgYSBjb21tZW50IHdpdGggIiAnIFwKLQl4PSQoCi0JZWNobyB5ZXMKLQkjIGEgY29tbWVudCB3aXRoICIgJyBcCi0JKQotCWVjaG8gJHgKLWV4cGVjdGVkLXN0ZG91dDoKLQl5ZXMKLS0tLQotbmFtZTogdGVzdC1zdG56ZS0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBzaG9ydCBmb3JtIFsgJHggXSB3b3Jrcwotc3RkaW46Ci0JaT0wCi0JWyAtbiAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAkeCBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAtbiAiJHgiIF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbICIkeCIgXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCXg9MAotCVsgLW4gJHggXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVsgJHggXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVsgLW4gIiR4IiBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAiJHgiIF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQl4PScxIC1hIDEgPSAyJwotCVsgLW4gJHggXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVsgJHggXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVsgLW4gIiR4IiBdCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JWyAiJHgiIF0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLWV4cGVjdGVkLXN0ZG91dDoKLQkxIDAKLQkyIDEKLQkzIDEKLQk0IDEKLQk1IDAKLQk2IDAKLQk3IDAKLQk4IDAKLQk5IDEKLQkxMCAxCi0JMTEgMAotCTEyIDAKLS0tLQotbmFtZTogdGVzdC1zdG56ZS0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0IHRoZSBzaG9ydCBmb3JtIFtbICR4IF1dIHdvcmtzIChrc2g5MyBleHRlbnNpb24pCi1zdGRpbjoKLQlpPTAKLQlbWyAtbiAkeCBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVtbICR4IF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgLW4gIiR4IiBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVtbICIkeCIgXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQl4PTAKLQlbWyAtbiAkeCBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVtbICR4IF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgLW4gIiR4IiBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotCVtbICIkeCIgXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQl4PScxIC1hIDEgPSAyJwotCVtbIC1uICR4IF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgJHggXV0KLQlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKLQlbWyAtbiAiJHgiIF1dCi0JcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2Ci0JW1sgIiR4IiBdXQotCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgotZXhwZWN0ZWQtc3Rkb3V0OgotCTEgMQotCTIgMQotCTMgMQotCTQgMQotCTUgMAotCTYgMAotCTcgMAotCTggMAotCTkgMAotCTEwIDAKLQkxMSAwCi0JMTIgMAotLS0tCi1uYW1lOiBldmVudC1zdWJzdC0xYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgd29ya3MKLWNhdGVnb3J5OiAhc21rc2gKLWZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKLQkjISAvYmluL3NoCi0JZWNobyBtb2x0byBiZW5lCi0JZXhpdCA0MgotZmlsZS1zZXR1cDogZmlsZSA3NTUgIiFmYWxzZSIKLQkjISAvYmluL3NoCi0JZWNobyBzaQotYXJndW1lbnRzOiAhLWkhCi1zdGRpbjoKLQlleHBvcnQgUEFUSD0uOiRQQVRICi0JZmFsc2V0dG8KLQllY2hvIHllYXAKLQkhZmFsc2UKLWV4cGVjdGVkLWV4aXQ6IDQyCi1leHBlY3RlZC1zdGRvdXQ6Ci0JbW9sdG8gYmVuZQotCXllYXAKLQltb2x0byBiZW5lCi1leHBlY3RlZC1zdGRlcnItcGF0dGVybjoKLQkvLiovCi0tLS0KLW5hbWU6IGV2ZW50LXN1YnN0LTFiCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSB3b3JrcwotCWV2ZW4gd2hlbiBhIHNwYWNlIHNlcGFyYXRlcyBpdCBmcm9tIHRoZSBzZWFyY2ggY29tbWFuZCwKLQl3aGljaCBpcyBub3Qgd2hhdCBHTlUgYmFzaCBwcm92aWRlcyBidXQgcmVxdWlyZWQgZm9yIHRoZQotCW90aGVyIHJlZ3Jlc3Npb24gdGVzdHMgYmVsb3cgdG8gY2hlY2sKLWNhdGVnb3J5OiAhc21rc2gKLWZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKLQkjISAvYmluL3NoCi0JZWNobyBtb2x0byBiZW5lCi0JZXhpdCA0MgotZmlsZS1zZXR1cDogZmlsZSA3NTUgIiEiCi0JIyEgL2Jpbi9zaAotCWVjaG8gc2kKLWFyZ3VtZW50czogIS1pIQotc3RkaW46Ci0JZXhwb3J0IFBBVEg9LjokUEFUSAotCWZhbHNldHRvCi0JZWNobyB5ZWFwCi0JISBmYWxzZQotZXhwZWN0ZWQtZXhpdDogNDIKLWV4cGVjdGVkLXN0ZG91dDoKLQltb2x0byBiZW5lCi0JeWVhcAotCW1vbHRvIGJlbmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKi8KLS0tLQotbmFtZTogZXZlbnQtc3Vic3QtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIGludGVyYWN0aXZlIG1vZGUKLQlkb2VzIG5vdCBicmVhayB0aGluZ3MKLWNhdGVnb3J5OiAhc21rc2gKLWZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKLQkjISAvYmluL3NoCi0JZWNobyBtb2x0byBiZW5lCi0JZXhpdCA0MgotZmlsZS1zZXR1cDogZmlsZSA3NTUgIiEiCi0JIyEgL2Jpbi9zaAotCWVjaG8gc2kKLWFyZ3VtZW50czogIS1pIQotZW52LXNldHVwOiAhRU5WPS4vRW52IQotZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKLQlQUzE9WAotc3RkaW46Ci0JZXhwb3J0IFBBVEg9LjokUEFUSAotCWZhbHNldHRvCi0JZWNobyB5ZWFwCi0JIWZhbHNlCi0JZWNobyBtZW93Ci0JISBmYWxzZQotCWVjaG8gPSAkPwotCWlmCi0JISBmYWxzZTsgdGhlbiBlY2hvIGZvbzsgZWxzZSBlY2hvIGJhcjsgZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQltb2x0byBiZW5lCi0JeWVhcAotCW1vbHRvIGJlbmUKLQltZW93Ci0JbW9sdG8gYmVuZQotCT0gNDIKLQlmb28KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS8uKi8KLS0tLQotbmFtZTogZXZlbnQtc3Vic3QtMwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIG5vbmludGVyYWN0aXZlIG1vZGUgaXMgaWdub3JlZAotY2F0ZWdvcnk6ICFzbWtzaAotZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgotCSMhIC9iaW4vc2gKLQllY2hvIG1vbHRvIGJlbmUKLQlleGl0IDQyCi1maWxlLXNldHVwOiBmaWxlIDc1NSAiIWZhbHNlIgotCSMhIC9iaW4vc2gKLQllY2hvIHNpCi1zdGRpbjoKLQlleHBvcnQgUEFUSD0uOiRQQVRICi0JZmFsc2V0dG8KLQllY2hvIHllYXAKLQkhZmFsc2UKLQllY2hvIG1lb3cKLQkhIGZhbHNlCi0JZWNobyA9ICQ/Ci0JaWYKLQkhIGZhbHNlOyB0aGVuIGVjaG8gZm9vOyBlbHNlIGVjaG8gYmFyOyBmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCW1vbHRvIGJlbmUKLQl5ZWFwCi0Jc2kKLQltZW93Ci0JPSAwCi0JZm9vCi0tLS0KLW5hbWU6IG5vdW5zZXQtMQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgdGhhdCAic2V0IC11IiBtYXRjaGVzIChmdXR1cmUpIFNVU3Y0IHJlcXVpcmVtZW50Ci1zdGRpbjoKLQkoc2V0IC11Ci0JdHJ5KCkgewotCQlsb2NhbCB2Ci0JCWV2YWwgdj1cJCQxCi0JCWlmIFtbIC1uICR2IF1dOyB0aGVuCi0JCQllY2hvICQxPW56Ci0JCWVsc2UKLQkJCWVjaG8gJDE9emYKLQkJZmkKLQl9Ci0JeD15Ci0JKGVjaG8gJHgpCi0JZWNobyA9MQotCShlY2hvICR5KQotCWVjaG8gPTIKLQkodHJ5IHgpCi0JZWNobyA9MwotCSh0cnkgeSkKLQllY2hvID00Ci0JKHRyeSAwKQotCWVjaG8gPTUKLQkodHJ5IDIpCi0JZWNobyA9NgotCSh0cnkpCi0JZWNobyA9NwotCShlY2hvIGF0PSRAKQotCWVjaG8gPTgKLQkoZWNobyBhc3Rlcmlzaz0kKikKLQllY2hvID05Ci0JKGVjaG8gJD8pCi0JZWNobyA9MTAKLQkoZWNobyAkISkKLQllY2hvID0xMQotCShlY2hvICQtKQotCWVjaG8gPTEyCi0JIyhlY2hvICRfKQotCSNlY2hvID0xMwotCShlY2hvICQjKQotCWVjaG8gPTE0Ci0JKG15cGlkPSQkOyB0cnkgbXlwaWQpCi0JZWNobyA9MTUKLQkpIDI+JjEgfCBzZWQgLWUgJ3MvXlteXV0qXS8vJyAtZSAncy9eW146XSo6ICovLycKLWV4cGVjdGVkLXN0ZG91dDoKLQl5Ci0JPTEKLQl5OiBwYXJhbWV0ZXIgbm90IHNldAotCT0yCi0JeD1uegotCT0zCi0JeTogcGFyYW1ldGVyIG5vdCBzZXQKLQk9NAotCTA9bnoKLQk9NQotCTI6IHBhcmFtZXRlciBub3Qgc2V0Ci0JPTYKLQkxOiBwYXJhbWV0ZXIgbm90IHNldAotCT03Ci0JYXQ9Ci0JPTgKLQlhc3Rlcmlzaz0KLQk9OQotCTAKLQk9MTAKLQkhOiBwYXJhbWV0ZXIgbm90IHNldAotCT0xMQotCXVzaAotCT0xMgotCTAKLQk9MTQKLQlteXBpZD1uegotCT0xNQotLS0tCi1uYW1lOiBuYW1lcmVmLTEKLWRlc2NyaXB0aW9uOgotCVRlc3RzdWl0ZSBmb3IgbmFtZXJlZiAoYm91bmQgdmFyaWFibGVzKQotc3RkaW46Ci0JYmFyPWdsb2JhbAotCXR5cGVzZXQgLW4gaXIyPWJhcgotCXR5cGVzZXQgLW4gaW5kPWlyMgotCWVjaG8gIWluZDogJHshaW5kfQotCWVjaG8gaW5kOiAkaW5kCi0JZWNobyAhaXIyOiAkeyFpcjJ9Ci0JZWNobyBpcjI6ICRpcjIKLQl0eXBlc2V0ICtuIGluZAotCWVjaG8gIWluZDogJHshaW5kfQotCWVjaG8gaW5kOiAkaW5kCi0JdHlwZXNldCAtbiBpcjI9aW5kCi0JZWNobyAhaXIyOiAkeyFpcjJ9Ci0JZWNobyBpcjI6ICRpcjIKLQlzZXR8Z3JlcCBeaXIyfHNlZCAncy9eL3MxOiAvJwotCXR5cGVzZXR8Z3JlcCAnIGlyMid8c2VkIC1lICdzL14vczI6IC8nIC1lICdzL25hbWVyZWYvdHlwZXNldCAtbi8nCi0Jc2V0IC1BIGJsdWIgLS0gZTEgZTIgZTMKLQl0eXBlc2V0IC1uIGluZD1ibHViCi0JdHlwZXNldCAtbiBpcjI9Ymx1YlsyXQotCWVjaG8gIWluZFsxXTogJHshaW5kWzFdfQotCWVjaG8gIWlyMjogJCFpcjIKLQllY2hvIGluZFsxXTogJHtpbmRbMV19Ci0JZWNobyBpcjI6ICRpcjIKLWV4cGVjdGVkLXN0ZG91dDoKLQkhaW5kOiBiYXIKLQlpbmQ6IGdsb2JhbAotCSFpcjI6IGJhcgotCWlyMjogZ2xvYmFsCi0JIWluZDogaW5kCi0JaW5kOiBpcjIKLQkhaXIyOiBpbmQKLQlpcjI6IGlyMgotCXMxOiBpcjI9aW5kCi0JczI6IHR5cGVzZXQgLW4gaXIyCi0JIWluZFsxXTogMQotCSFpcjI6IGlyMgotCWluZFsxXTogZTIKLQlpcjI6IGUzCi0tLS0KLW5hbWU6IG5hbWVyZWYtMmRhCi1kZXNjcmlwdGlvbjoKLQlUZXN0c3VpdGUgZm9yIG5hbWVyZWYgKGJvdW5kIHZhcmlhYmxlcykKLQlGdW5jdGlvbnMsIGFyZ3VtZW50IGdpdmVuIGRpcmVjdGx5LCBhZnRlciBsb2NhbAotc3RkaW46Ci0JZnVuY3Rpb24gZm9vIHsKLQkJdHlwZXNldCBiYXI9bG9rYWwgYmF6PWF1Y2gKLQkJdHlwZXNldCAtbiB2PWJhcgotCQllY2hvIGVudGVyaW5nCi0JCWVjaG8gIXY6ICR7IXZ9Ci0JCWVjaG8gIWJhcjogJHshYmFyfQotCQllY2hvICFiYXo6ICR7IWJhen0KLQkJZWNobyBiYXI6ICRiYXIKLQkJZWNobyB2OiAkdgotCQl2PTEyMwotCQllY2hvIGJhcjogJGJhcgotCQllY2hvIHY6ICR2Ci0JCWVjaG8gZXhpdGluZwotCX0KLQliYXI9Z2xvYmFsCi0JZWNobyBiYXI6ICRiYXIKLQlmb28gYmFyCi0JZWNobyBiYXI6ICRiYXIKLWV4cGVjdGVkLXN0ZG91dDoKLQliYXI6IGdsb2JhbAotCWVudGVyaW5nCi0JIXY6IGJhcgotCSFiYXI6IGJhcgotCSFiYXo6IGJhegotCWJhcjogbG9rYWwKLQl2OiBsb2thbAotCWJhcjogMTIzCi0JdjogMTIzCi0JZXhpdGluZwotCWJhcjogZ2xvYmFsCi0tLS0KLW5hbWU6IG5hbWVyZWYtMwotZGVzY3JpcHRpb246Ci0JQWR2YW5jZWQgdGVzdHN1aXRlIGZvciBib3VuZCB2YXJpYWJsZXMgKGtzaDkzIGZhaWxzIHRoaXMpCi1zdGRpbjoKLQl0eXBlc2V0IC1uIGZvbz1iYXJbaV0KLQlzZXQgLUEgYmFyIC0tIGIgYyBhCi0JZm9yIGkgaW4gMCAxIDIgMzsgZG8KLQkJcHJpbnQgJGkgJGZvbyAuCi0JZG9uZQotZXhwZWN0ZWQtc3Rkb3V0OgotCTAgYiAuCi0JMSBjIC4KLQkyIGEgLgotCTMgLgotLS0tCi1uYW1lOiBiZXR0ZXItcGFyZW5zLTFhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCi1zdGRpbjoKLQlpZiAoIChlY2hvIGZ1YmFyKSB8IHRyIHUgeCk7IHRoZW4KLQkJZWNobyBqYQotCWVsc2UKLQkJZWNobyBuZWluCi0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhcgotCWphCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtMWIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWVjaG8gJCggKGVjaG8gZnViYXIpIHwgdHIgdSB4KSAkPwotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyIDAKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy0yYQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JaWYgKChlY2hvIGZ1YmFyKSB8IHRyIHUgeCk7IHRoZW4KLQkJZWNobyBqYQotCWVsc2UKLQkJZWNobyBuZWluCi0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhcgotCWphCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtMmIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWVjaG8gJCgoZWNobyBmdWJhcikgfCB0ciB1IHgpICQ/Ci1leHBlY3RlZC1zdGRvdXQ6Ci0JZnhiYXIgMAotLS0tCi1uYW1lOiBiZXR0ZXItcGFyZW5zLTNhCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCi1zdGRpbjoKLQlpZiAoIChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKTsgdGhlbgotCQllY2hvIGphCi0JZWxzZQotCQllY2hvIG5laW4KLQlmaQotZXhwZWN0ZWQtc3Rkb3V0OgotCWZ4YmFyCi0JamEKLS0tLQotbmFtZTogYmV0dGVyLXBhcmVucy0zYgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQotc3RkaW46Ci0JZWNobyAkKCAoZWNobyBmdWJhcikgfCAodHIgdSB4KSkgJD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhciAwCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtNGEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWlmICgoZWNobyBmdWJhcikgfCAodHIgdSB4KSk7IHRoZW4KLQkJZWNobyBqYQotCWVsc2UKLQkJZWNobyBuZWluCi0JZmkKLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhcgotCWphCi0tLS0KLW5hbWU6IGJldHRlci1wYXJlbnMtNGIKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKLXN0ZGluOgotCWVjaG8gJCgoZWNobyBmdWJhcikgfCAodHIgdSB4KSkgJD8KLWV4cGVjdGVkLXN0ZG91dDoKLQlmeGJhciAwCi0tLS0KLW5hbWU6IGVjaG8tdGVzdC0xCi1kZXNjcmlwdGlvbjoKLQlUZXN0IHdoYXQgdGhlIGVjaG8gYnVpbHRpbiBkb2VzIChta3NoKQotc3RkaW46Ci0JZWNobyAtbiAnZm9vXHg0MGJhcicKLQllY2hvIC1lICdcdGJheicKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29AYmFyCWJhegotLS0tCi1uYW1lOiBlY2hvLXRlc3QtMgotZGVzY3JpcHRpb246Ci0JVGVzdCB3aGF0IHRoZSBlY2hvIGJ1aWx0aW4gZG9lcyAoUE9TSVgpCi0JTm90ZTogdGhpcyBmb2xsb3dzIERlYmlhbiBQb2xpY3kgMTAuNCB3aGljaCBtYW5kYXRlcwotCXRoYXQgLW4gc2hhbGwgYmUgdHJlYXRlZCBhcyBhbiBvcHRpb24sIG5vdCBYU0kgd2hpY2gKLQltYW5kYXRlcyBpdCBzaGFsbCBiZSB0cmVhdGVkIGFzIHN0cmluZyBidXQgZXNjYXBlcwotCXNoYWxsIGJlIGV4cGFuZGVkLgotc3RkaW46Ci0JdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCi0JZWNobyAtbiAnZm9vXHg0MGJhcicKLQllY2hvIC1lICdcdGJheicKLWV4cGVjdGVkLXN0ZG91dDoKLQlmb29ceDQwYmFyLWUgXHRiYXoKLS0tLQotbmFtZTogdXRpbGl0aWVzLWdldG9wdHMtMQotZGVzY3JpcHRpb246Ci0JZ2V0b3B0cyBzZXRzIE9QVElORCBjb3JyZWN0bHkgZm9yIHVucGFyc2VkIG9wdGlvbgotc3RkaW46Ci0Jc2V0IC0tIC1hIC1hIC14Ci0Jd2hpbGUgZ2V0b3B0cyA6YSBvcHRjOyBkbwotCSAgICBlY2hvICJPUFRBUkc9JE9QVEFSRywgT1BUSU5EPSRPUFRJTkQsIG9wdGM9JG9wdGMuIgotCWRvbmUKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlPUFRBUkc9LCBPUFRJTkQ9Miwgb3B0Yz1hLgotCU9QVEFSRz0sIE9QVElORD0zLCBvcHRjPWEuCi0JT1BUQVJHPXgsIE9QVElORD00LCBvcHRjPT8uCi0JZG9uZQotLS0tCi1uYW1lOiB1dGlsaXRpZXMtZ2V0b3B0cy0yCi1kZXNjcmlwdGlvbjoKLQlDaGVjayBPUFRBUkcKLXN0ZGluOgotCXNldCAtLSAtYSBNYXJ5IC14Ci0Jd2hpbGUgZ2V0b3B0cyBhOiBvcHRjOyBkbwotCSAgICBlY2hvICJPUFRBUkc9JE9QVEFSRywgT1BUSU5EPSRPUFRJTkQsIG9wdGM9JG9wdGMuIgotCWRvbmUKLQllY2hvIGRvbmUKLWV4cGVjdGVkLXN0ZG91dDoKLQlPUFRBUkc9TWFyeSwgT1BUSU5EPTMsIG9wdGM9YS4KLQlPUFRBUkc9LCBPUFRJTkQ9NCwgb3B0Yz0/LgotCWRvbmUKLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLioteC4qb3B0aW9uLwotLS0tCi1uYW1lOiB3Y3N3aWR0aC0xCi1kZXNjcmlwdGlvbjoKLQlDaGVjayB0aGUgbmV3IHdjc3dpZHRoIGZlYXR1cmUKLXN0ZGluOgotCXM95L2VCi0Jc2V0ICtVCi0JcHJpbnQgb2N0ZXRzOiAkeyNzfSAuCi0JcHJpbnQgOC1iaXQgd2lkdGg6ICR7JXN9IC4KLQlzZXQgLVUKLQlwcmludCBjaGFyYWN0ZXJzOiAkeyNzfSAuCi0JcHJpbnQgY29sdW1uczogJHslc30gLgotCXM977+9Ci0Jc2V0ICtVCi0JcHJpbnQgb2N0ZXRzOiAkeyNzfSAuCi0JcHJpbnQgOC1iaXQgd2lkdGg6ICR7JXN9IC4KLQlzZXQgLVUKLQlwcmludCBjaGFyYWN0ZXJzOiAkeyNzfSAuCi0JcHJpbnQgY29sdW1uczogJHslc30gLgotZXhwZWN0ZWQtc3Rkb3V0OgotCW9jdGV0czogMyAuCi0JOC1iaXQgd2lkdGg6IC0xIC4KLQljaGFyYWN0ZXJzOiAxIC4KLQljb2x1bW5zOiAyIC4KLQlvY3RldHM6IDMgLgotCTgtYml0IHdpZHRoOiAzIC4KLQljaGFyYWN0ZXJzOiAxIC4KLQljb2x1bW5zOiAxIC4KLS0tLQotbmFtZTogd2Nzd2lkdGgtMgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCXByaW50ICUgJCUgLgotCXNldCAtVQotCXg9J2EJYicKLQlwcmludCBjICR7JXh9IC4KLQlzZXQgK1UKLQl4PSdhCWInCi0JcHJpbnQgZCAkeyV4fSAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JJSAkJSAuCi0JYyAtMSAuCi0JZCAtMSAuCi0tLS0KLW5hbWU6IHdjc3dpZHRoLTMKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCi1zdGRpbjoKLQlwcmludCAkeyV9IC4KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB3Y3N3aWR0aC00YQotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCXByaW50ICR7JSp9IC4KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB3Y3N3aWR0aC00YgotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCXByaW50ICR7JUB9IC4KLWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgotCS9iYWQgc3Vic3RpdHV0aW9uLwotZXhwZWN0ZWQtZXhpdDogMQotLS0tCi1uYW1lOiB3Y3N3aWR0aC00YwotZGVzY3JpcHRpb246Ci0JQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKLXN0ZGluOgotCToKLQlwcmludCAkeyU/fSAuCi1leHBlY3RlZC1zdGRvdXQ6Ci0JMSAuCi0tLS0KLW5hbWU6IHJlYWxwYXRoLTEKLWRlc2NyaXB0aW9uOgotCUNoZWNrIHByb3BlciByZXR1cm4gdmFsdWVzIGZvciByZWFscGF0aAotY2F0ZWdvcnk6IG9zOm1pcmJzZAotc3RkaW46Ci0Jd2Q9JChyZWFscGF0aCAuKQotCW1rZGlyIGRpcgotCTo+ZmlsZQotCTo+ZGlyL2ZpbGUKLQlsbiAtcyBkaXIgbG5kaXIKLQlsbiAtcyBmaWxlIGxuZmlsZQotCWxuIC1zIG5peCBsbm5peAotCWxuIC1zIC4gbG5zZWxmCi0JaT0wCi0JY2hrKCkgewotCQl0eXBlc2V0IHggeQotCQl4PSQocmVhbHBhdGggIiR3ZC8kMSIgMj4mMSk7IHk9JD8KLQkJcHJpbnQgJCgoKytpKSkgIj8kMSIgPSR7eCMjKiR3ZC99ICEkeQotCX0KLQljaGsgZGlyCi0JY2hrIGRpci8KLQljaGsgZGlyL2ZpbGUKLQljaGsgZGlyL25peAotCWNoayBmaWxlCi0JY2hrIGZpbGUvCi0JY2hrIGZpbGUvZmlsZQotCWNoayBmaWxlL25peAotCWNoayBuaXgKLQljaGsgbml4LwotCWNoayBuaXgvZmlsZQotCWNoayBuaXgvbml4Ci0JY2hrIGxuZGlyCi0JY2hrIGxuZGlyLwotCWNoayBsbmRpci9maWxlCi0JY2hrIGxuZGlyL25peAotCWNoayBsbmZpbGUKLQljaGsgbG5maWxlLwotCWNoayBsbmZpbGUvZmlsZQotCWNoayBsbmZpbGUvbml4Ci0JY2hrIGxubml4Ci0JY2hrIGxubml4LwotCWNoayBsbm5peC9maWxlCi0JY2hrIGxubml4L25peAotCWNoayBsbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYKLQlybSBsbnNlbGYKLWV4cGVjdGVkLXN0ZG91dDoKLQkxID9kaXIgPWRpciAhMAotCTIgP2Rpci8gPWRpciAhMAotCTMgP2Rpci9maWxlID1kaXIvZmlsZSAhMAotCTQgP2Rpci9uaXggPWRpci9uaXggITAKLQk1ID9maWxlID1maWxlICEwCi0JNiA/ZmlsZS8gPWZpbGUvOiBOb3QgYSBkaXJlY3RvcnkgITIwCi0JNyA/ZmlsZS9maWxlID1maWxlL2ZpbGU6IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQk4ID9maWxlL25peCA9ZmlsZS9uaXg6IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQk5ID9uaXggPW5peCAhMAotCTEwID9uaXgvID1uaXggITAKLQkxMSA/bml4L2ZpbGUgPW5peC9maWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCi0JMTIgP25peC9uaXggPW5peC9uaXg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKLQkxMyA/bG5kaXIgPWRpciAhMAotCTE0ID9sbmRpci8gPWRpciAhMAotCTE1ID9sbmRpci9maWxlID1kaXIvZmlsZSAhMAotCTE2ID9sbmRpci9uaXggPWRpci9uaXggITAKLQkxNyA/bG5maWxlID1maWxlICEwCi0JMTggP2xuZmlsZS8gPWxuZmlsZS86IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQkxOSA/bG5maWxlL2ZpbGUgPWxuZmlsZS9maWxlOiBOb3QgYSBkaXJlY3RvcnkgITIwCi0JMjAgP2xuZmlsZS9uaXggPWxuZmlsZS9uaXg6IE5vdCBhIGRpcmVjdG9yeSAhMjAKLQkyMSA/bG5uaXggPW5peCAhMAotCTIyID9sbm5peC8gPW5peCAhMAotCTIzID9sbm5peC9maWxlID1sbm5peC9maWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCi0JMjQgP2xubml4L25peCA9bG5uaXgvbml4OiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCi0JMjUgP2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZiA9bG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmOiBUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3MgITYyCi0tLS0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2VkaXQuYyBiL21rc2gvc3JjL2VkaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1ZGU3ZS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9lZGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQ5ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBlZGl0LmMsdiAxLjM0IDIwMTAvMDUvMjAgMDE6MTM6MDcgZmdzY2ggRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBlZGl0LmgsdiAxLjggMjAwNS8wMy8yOCAyMToyODoyMiBkZXJhYWR0IEV4cCAkCSovCi0vKgkkT3BlbkJTRDogZW1hY3MuYyx2IDEuNDIgMjAwOS8wNi8wMiAwNjo0Nzo0NyBoYWxleCBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHZpLmMsdiAxLjI2IDIwMDkvMDYvMjkgMjI6NTA6MTkgbWFydHluYXMgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9lZGl0LmMsdiAxLjE5NiAyMDEwLzA3LzI1IDExOjM1OjQwIHRnIEV4cCAkIik7Ci0KLS8qCi0gKiBpbiBsYXRlciB2ZXJzaW9ucyB3ZSBtaWdodCB1c2UgbGlidGVybWNhcCBmb3IgdGhpcywgYnV0IHNpbmNlIGV4dGVybmFsCi0gKiBkZXBlbmRlbmNpZXMgYXJlIHByb2JsZW1hdGljLCB0aGlzIGhhcyBub3QgeWV0IGJlZW4gZGVjaWRlZCBvbjsgYW5vdGhlcgotICogZ29vZCBzdHJpbmcgaXMgIlwwMzNjIiBleGNlcHQgb24gaGFyZHdhcmUgdGVybWluYWxzIGxpa2UgdGhlIERFQyBWVDQyMAotICogd2hpY2ggZG8gYSBmdWxsIHBvd2VyIGN5Y2xlIHRoZW4uLi4KLSAqLwotI2lmbmRlZiBNS1NIX0NMU19TVFJJTkcKLSNkZWZpbmUgTUtTSF9DTFNfU1RSSU5HCQkiXDAzM1s7SFwwMzNbSiIKLSNlbmRpZgotI2lmbmRlZiBNS1NIX0NMUlRPRU9MX1NUUklORwotI2RlZmluZSBNS1NIX0NMUlRPRU9MX1NUUklORwkiXDAzM1tLIgotI2VuZGlmCi0KLS8qIHR0eSBkcml2ZXIgY2hhcmFjdGVycyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBlcmFzZTsKLQlpbnQga2lsbDsKLQlpbnQgd2VyYXNlOwotCWludCBpbnRyOwotCWludCBxdWl0OwotCWludCBlb2Y7Ci19IFhfY2hhcnM7Ci0KLXN0YXRpYyBYX2NoYXJzIGVkY2hhcnM7Ci0KLS8qIHhfZmNfZ2xvYigpIGZsYWdzICovCi0jZGVmaW5lIFhDRl9DT01NQU5ECUJJVCgwKQkvKiBEbyBjb21tYW5kIGNvbXBsZXRpb24gKi8KLSNkZWZpbmUgWENGX0ZJTEUJQklUKDEpCS8qIERvIGZpbGUgY29tcGxldGlvbiAqLwotI2RlZmluZSBYQ0ZfRlVMTFBBVEgJQklUKDIpCS8qIGNvbW1hbmQgY29tcGxldGlvbjogc3RvcmUgZnVsbCBwYXRoICovCi0jZGVmaW5lIFhDRl9DT01NQU5EX0ZJTEUgKFhDRl9DT01NQU5EfFhDRl9GSUxFKQotCi1zdGF0aWMgY2hhciBlZGl0bW9kZTsKLXN0YXRpYyBpbnQgeHhfY29sczsJCQkvKiBmb3IgRW1hY3MgbW9kZSAqLwotc3RhdGljIGludCBtb2RpZmllZDsJCQkvKiBidWZmZXIgaGFzIGJlZW4gIm1vZGlmaWVkIiAqLwotc3RhdGljIGNoYXIgaG9sZGJ1ZltMSU5FXTsJCS8qIHBsYWNlIHRvIGhvbGQgbGFzdCBlZGl0IGJ1ZmZlciAqLwotCi1zdGF0aWMgaW50IHhfZ2V0Yyh2b2lkKTsKLXN0YXRpYyB2b2lkIHhfcHV0Y2YoaW50KTsKLXN0YXRpYyBib29sIHhfbW9kZShib29sKTsKLXN0YXRpYyBpbnQgeF9kb19jb21tZW50KGNoYXIgKiwgaW50LCBpbnQgKik7Ci1zdGF0aWMgdm9pZCB4X3ByaW50X2V4cGFuc2lvbnMoaW50LCBjaGFyICpjb25zdCAqLCBib29sKTsKLXN0YXRpYyBpbnQgeF9jZl9nbG9iKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICosIGludCAqLCBjaGFyICoqKiwKLSAgICBib29sICopOwotc3RhdGljIGludCB4X2xvbmdlc3RfcHJlZml4KGludCwgY2hhciAqY29uc3QgKik7Ci1zdGF0aWMgaW50IHhfYmFzZW5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgeF9mcmVlX3dvcmRzKGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IHhfZXNjYXBlKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQgKCopKGNvbnN0IGNoYXIgKiwgc2l6ZV90KSk7Ci1zdGF0aWMgaW50IHhfZW1hY3MoY2hhciAqLCBzaXplX3QpOwotc3RhdGljIHZvaWQgeF9pbml0X2VtYWNzKHZvaWQpOwotc3RhdGljIHZvaWQgeF9pbml0X3Byb21wdCh2b2lkKTsKLSNpZiAhTUtTSF9TX05PVkkKLXN0YXRpYyBpbnQgeF92aShjaGFyICosIHNpemVfdCk7Ci0jZW5kaWYKLQotI2RlZmluZSB4X2ZsdXNoKCkJc2hmX2ZsdXNoKHNobF9vdXQpCi0jaWZkZWYgTUtTSF9TTUFMTAotI2RlZmluZSB4X3B1dGMoYykJeF9wdXRjZihjKQotI2Vsc2UKLSNkZWZpbmUgeF9wdXRjKGMpCXNoZl9wdXRjKChjKSwgc2hsX291dCkKLSNlbmRpZgotCi1zdGF0aWMgaW50IHBhdGhfb3JkZXJfY21wKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYik7Ci1zdGF0aWMgY2hhciAqYWRkX2dsb2IoY29uc3QgY2hhciAqLCBpbnQpCi0gICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSkKLSAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDEsIDIpOwotc3RhdGljIHZvaWQgZ2xvYl90YWJsZShjb25zdCBjaGFyICosIFhQdHJWICosIHN0cnVjdCB0YWJsZSAqKTsKLXN0YXRpYyB2b2lkIGdsb2JfcGF0aChpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKiwgWFB0clYgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbnQgeF9maWxlX2dsb2IoaW50LCBjb25zdCBjaGFyICosIGludCwgY2hhciAqKiopCi0gICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDIpKSkKLSAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDIsIDMpOwotc3RhdGljIGludCB4X2NvbW1hbmRfZ2xvYihpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICoqKikKLSAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMikpKQotICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMiwgMyk7Ci1zdGF0aWMgaW50IHhfbG9jYXRlX3dvcmQoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICosIGJvb2wgKik7Ci0KLXN0YXRpYyBpbnQgeF9lX2dldG1iYyhjaGFyICopOwotc3RhdGljIGludCB4X2VfcmVidWlsZGxpbmUoY29uc3QgY2hhciAqKTsKLQotLyogKysrIGdlbmVyaWMgZWRpdGluZyBmdW5jdGlvbnMgKysrICovCi0KLS8qIENhbGxlZCBmcm9tIG1haW4gKi8KLXZvaWQKLXhfaW5pdCh2b2lkKQotewotCS8qIHNldCB0byAtMiB0byBmb3JjZSBpbml0aWFsIGJpbmRpbmcgKi8KLQllZGNoYXJzLmVyYXNlID0gZWRjaGFycy5raWxsID0gZWRjaGFycy5pbnRyID0gZWRjaGFycy5xdWl0ID0KLQkgICAgZWRjaGFycy5lb2YgPSAtMjsKLQkvKiBkZWZhdWx0IHZhbHVlIGZvciBkZWZpY2llbnQgc3lzdGVtcyAqLwotCWVkY2hhcnMud2VyYXNlID0gMDI3OwkvKiBeVyAqLwotCXhfaW5pdF9lbWFjcygpOwotfQotCi0vKgotICogcmVhZCBhbiBlZGl0ZWQgY29tbWFuZCBsaW5lCi0gKi8KLWludAoteF9yZWFkKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlpbnQgaTsKLQotCXhfbW9kZSh0cnVlKTsKLQltb2RpZmllZCA9IDE7Ci0JaWYgKEZsYWcoRkVNQUNTKSB8fCBGbGFnKEZHTUFDUykpCi0JCWkgPSB4X2VtYWNzKGJ1ZiwgbGVuKTsKLSNpZiAhTUtTSF9TX05PVkkKLQllbHNlIGlmIChGbGFnKEZWSSkpCi0JCWkgPSB4X3ZpKGJ1ZiwgbGVuKTsKLSNlbmRpZgotCWVsc2UKLQkJaSA9IC0xOwkJLyogaW50ZXJuYWwgZXJyb3IgKi8KLQllZGl0bW9kZSA9IDA7Ci0JeF9tb2RlKGZhbHNlKTsKLQlyZXR1cm4gKGkpOwotfQotCi0vKiB0dHkgSS9PICovCi0KLXN0YXRpYyBpbnQKLXhfZ2V0Yyh2b2lkKQotewotCWNoYXIgYzsKLQlpbnQgbjsKLQotCXdoaWxlICgobiA9IGJsb2NraW5nX3JlYWQoU1RESU5fRklMRU5PLCAmYywgMSkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLQkJaWYgKHRyYXApIHsKLQkJCXhfbW9kZShmYWxzZSk7Ci0JCQlydW50cmFwcygwKTsKLSNpZmRlZiBTSUdXSU5DSAotCQkJaWYgKGdvdF93aW5jaCkgewotCQkJCWNoYW5nZV93aW5zeigpOwotCQkJCWlmICh4X2NvbHMgIT0geHhfY29scyAmJiBlZGl0bW9kZSA9PSAxKSB7Ci0JCQkJCS8qIHJlZHJhdyBsaW5lIGluIEVtYWNzIG1vZGUgKi8KLQkJCQkJeHhfY29scyA9IHhfY29sczsKLQkJCQkJeF9lX3JlYnVpbGRsaW5lKE1LU0hfQ0xSVE9FT0xfU1RSSU5HKTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYKLQkJCXhfbW9kZSh0cnVlKTsKLQkJfQotCXJldHVybiAoKG4gPT0gMSkgPyAoaW50KSh1bnNpZ25lZCBjaGFyKWMgOiAtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X3B1dGNmKGludCBjKQotewotCXNoZl9wdXRjKGMsIHNobF9vdXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNaXNjIGNvbW1vbiBjb2RlIGZvciB2aS9lbWFjcyAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBIYW5kbGUgdGhlIGNvbW1lbnRpbmcvdW5jb21tZW50aW5nIG9mIGEgbGluZS4KLSAqIFJldHVybnM6Ci0gKgkxIGlmIGEgY2FycmlhZ2UgcmV0dXJuIGlzIGluZGljYXRlZCAoY29tbWVudCBhZGRlZCkKLSAqCTAgaWYgbm8gcmV0dXJuIChjb21tZW50IHJlbW92ZWQpCi0gKgktMSBpZiB0aGVyZSBpcyBhbiBlcnJvciAobm90IGVub3VnaCByb29tIGZvciBjb21tZW50IGNoYXJzKQotICogSWYgc3VjY2Vzc2Z1bCwgKmxlbnAgY29udGFpbnMgdGhlIG5ldyBsZW5ndGguIE5vdGU6IGN1cnNvciBzaG91bGQgYmUKLSAqIG1vdmVkIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSBhZnRlciAodW4pY29tbWVudGluZy4KLSAqLwotc3RhdGljIGludAoteF9kb19jb21tZW50KGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBpbnQgKmxlbnApCi17Ci0JaW50IGksIGosIGxlbiA9ICpsZW5wOwotCi0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gKDEpOyAvKiBzb21ld2hhdCBhcmJpdHJhcnkgLSBpdCdzIHdoYXQgQVQmVCBrc2ggZG9lcyAqLwotCi0JLyogQWxyZWFkeSBjb21tZW50ZWQ/ICovCi0JaWYgKGJ1ZlswXSA9PSAnIycpIHsKLQkJYm9vbCBzYXdfbmwgPSBmYWxzZTsKLQotCQlmb3IgKGogPSAwLCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoIXNhd19ubCB8fCBidWZbaV0gIT0gJyMnKQotCQkJCWJ1ZltqKytdID0gYnVmW2ldOwotCQkJc2F3X25sID0gYnVmW2ldID09ICdcbic7Ci0JCX0KLQkJKmxlbnAgPSBqOwotCQlyZXR1cm4gKDApOwotCX0gZWxzZSB7Ci0JCWludCBuID0gMTsKLQotCQkvKiBTZWUgaWYgdGhlcmUncyByb29tIGZvciB0aGUgI3MgLSAxIHBlciBcbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQlpZiAoYnVmW2ldID09ICdcbicpCi0JCQkJbisrOwotCQlpZiAobGVuICsgbiA+PSBic2l6ZSkKLQkJCXJldHVybiAoLTEpOwotCQkvKiBOb3cgYWRkIHRoZW0uLi4gKi8KLQkJZm9yIChpID0gbGVuLCBqID0gbGVuICsgbjsgLS1pID49IDA7ICkgewotCQkJaWYgKGJ1ZltpXSA9PSAnXG4nKQotCQkJCWJ1ZlstLWpdID0gJyMnOwotCQkJYnVmWy0tal0gPSBidWZbaV07Ci0JCX0KLQkJYnVmWzBdID0gJyMnOwotCQkqbGVucCArPSBuOwotCQlyZXR1cm4gKDEpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1vbiBmaWxlL2NvbW1hbmQgY29tcGxldGlvbiBjb2RlIGZvciB2aS9lbWFjcyAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXhfcHJpbnRfZXhwYW5zaW9ucyhpbnQgbndvcmRzLCBjaGFyICogY29uc3QgKndvcmRzLCBib29sIGlzX2NvbW1hbmQpCi17Ci0JYm9vbCB1c2VfY29weSA9IGZhbHNlOwotCWludCBwcmVmaXhfbGVuOwotCVhQdHJWIGwgPSB7IE5VTEwsIE5VTEwsIE5VTEwgfTsKLQotCS8qIENoZWNrIGlmIGFsbCBtYXRjaGVzIGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKGluIHRoaXMKLQkgKiBjYXNlLCB3ZSB3YW50IHRvIG9taXQgdGhlIGRpcmVjdG9yeSBuYW1lKQotCSAqLwotCWlmICghaXNfY29tbWFuZCAmJgotCSAgICAocHJlZml4X2xlbiA9IHhfbG9uZ2VzdF9wcmVmaXgobndvcmRzLCB3b3JkcykpID4gMCkgewotCQlpbnQgaTsKLQotCQkvKiBTcGVjaWFsIGNhc2UgZm9yIDEgbWF0Y2ggKHByZWZpeCBpcyB3aG9sZSB3b3JkKSAqLwotCQlpZiAobndvcmRzID09IDEpCi0JCQlwcmVmaXhfbGVuID0geF9iYXNlbmFtZSh3b3Jkc1swXSwgTlVMTCk7Ci0JCS8qIEFueSAobm9uLXRyYWlsaW5nKSBzbGFzaGVzIGluIG5vbi1jb21tb24gd29yZCBzdWZmaXhlcz8gKi8KLQkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQotCQkJaWYgKHhfYmFzZW5hbWUod29yZHNbaV0gKyBwcmVmaXhfbGVuLCBOVUxMKSA+Ci0JCQkgICAgcHJlZml4X2xlbikKLQkJCQlicmVhazsKLQkJLyogQWxsIGluIHNhbWUgZGlyZWN0b3J5PyAqLwotCQlpZiAoaSA9PSBud29yZHMpIHsKLQkJCXdoaWxlIChwcmVmaXhfbGVuID4gMCAmJiB3b3Jkc1swXVtwcmVmaXhfbGVuIC0gMV0gIT0gJy8nKQotCQkJCXByZWZpeF9sZW4tLTsKLQkJCXVzZV9jb3B5ID0gdHJ1ZTsKLQkJCVhQaW5pdChsLCBud29yZHMgKyAxKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKLQkJCQlYUHB1dChsLCB3b3Jkc1tpXSArIHByZWZpeF9sZW4pOwotCQkJWFBwdXQobCwgTlVMTCk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBFbnVtZXJhdGUgZXhwYW5zaW9ucwotCSAqLwotCXhfcHV0YygnXHInKTsKLQl4X3B1dGMoJ1xuJyk7Ci0JcHJfbGlzdCh1c2VfY29weSA/IChjaGFyICoqKVhQcHRydihsKSA6IHdvcmRzKTsKLQotCWlmICh1c2VfY29weSkKLQkJWFBmcmVlKGwpOyAvKiBub3QgeF9mcmVlX3dvcmRzKCkgKi8KLX0KLQotLyoqCi0gKiBEbyBmaWxlIGdsb2JiaW5nOgotICoJLSBhcHBlbmRzICogdG8gKGNvcHkgb2YpIHN0ciBpZiBubyBnbG9iYmluZyBjaGFycyBmb3VuZAotICoJLSBkb2VzIGV4cGFuc2lvbiwgY2hlY2tzIGZvciBubyBtYXRjaCwgZXRjLgotICoJLSBzZXRzICp3b3Jkc3AgdG8gYXJyYXkgb2YgbWF0Y2hpbmcgc3RyaW5ncwotICoJLSByZXR1cm5zIG51bWJlciBvZiBtYXRjaGluZyBzdHJpbmdzCi0gKi8KLXN0YXRpYyBpbnQKLXhfZmlsZV9nbG9iKGludCBmbGFncyBNS1NIX0FfVU5VU0VELCBjb25zdCBjaGFyICpzdHIsIGludCBzbGVuLCBjaGFyICoqKndvcmRzcCkKLXsKLQljaGFyICp0b2dsb2IsICoqd29yZHM7Ci0JaW50IG53b3JkcywgaSwgaWR4OwotCWJvb2wgZXNjYXBpbmc7Ci0JWFB0clYgdzsKLQlzdHJ1Y3Qgc291cmNlICpzLCAqc29sZDsKLQotCWlmIChzbGVuIDwgMCkKLQkJcmV0dXJuICgwKTsKLQotCXRvZ2xvYiA9IGFkZF9nbG9iKHN0ciwgc2xlbik7Ci0KLQkvKiByZW1vdmUgYWxsIGVzY2FwaW5nIGJhY2t3YXJkIHNsYXNoZXMgKi8KLQllc2NhcGluZyA9IGZhbHNlOwotCWZvciAoaSA9IDAsIGlkeCA9IDA7IHRvZ2xvYltpXTsgaSsrKSB7Ci0JCWlmICh0b2dsb2JbaV0gPT0gJ1xcJyAmJiAhZXNjYXBpbmcpIHsKLQkJCWVzY2FwaW5nID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIHNwZWNpYWxseSBlc2NhcGUgZXNjYXBlZCBbIG9yICQgb3IgYCBmb3IgZ2xvYmJpbmcgKi8KLQkJaWYgKGVzY2FwaW5nICYmICh0b2dsb2JbaV0gPT0gJ1snIHx8Ci0JCSAgICB0b2dsb2JbaV0gPT0gJyQnIHx8IHRvZ2xvYltpXSA9PSAnYCcpKQotCQkJdG9nbG9iW2lkeCsrXSA9IFFDSEFSOwotCi0JCXRvZ2xvYltpZHhdID0gdG9nbG9iW2ldOwotCQlpZHgrKzsKLQkJaWYgKGVzY2FwaW5nKQotCQkJZXNjYXBpbmcgPSBmYWxzZTsKLQl9Ci0JdG9nbG9iW2lkeF0gPSAnXDAnOwotCi0JLyoKLQkgKiBDb252ZXJ0ICJmb28qIiAodG9nbG9iKSB0byBhbiBhcnJheSBvZiBzdHJpbmdzICh3b3JkcykKLQkgKi8KLQlzb2xkID0gc291cmNlOwotCXMgPSBwdXNocyhTV1NUUiwgQVRFTVApOwotCXMtPnN0YXJ0ID0gcy0+c3RyID0gdG9nbG9iOwotCXNvdXJjZSA9IHM7Ci0JaWYgKHl5bGV4KE9ORVdPUkQgfCBMUUNIQVIpICE9IExXT1JEKSB7Ci0JCXNvdXJjZSA9IHNvbGQ7Ci0JCWludGVybmFsX3dhcm5pbmdmKCJmaWxlZ2xvYjogc3Vic3RpdHV0ZSBlcnJvciIpOwotCQlyZXR1cm4gKDApOwotCX0KLQlzb3VyY2UgPSBzb2xkOwotCVhQaW5pdCh3LCAzMik7Ci0JZXhwYW5kKHl5bHZhbC5jcCwgJncsIERPR0xPQiB8IERPVElMREUgfCBET01BUktESVJTKTsKLQlYUHB1dCh3LCBOVUxMKTsKLQl3b3JkcyA9IChjaGFyICoqKVhQY2xvc2Uodyk7Ci0KLQlmb3IgKG53b3JkcyA9IDA7IHdvcmRzW253b3Jkc107IG53b3JkcysrKQotCQk7Ci0JaWYgKG53b3JkcyA9PSAxKSB7Ci0JCXN0cnVjdCBzdGF0IHN0YXRiOwotCi0JCS8qIENoZWNrIGlmIGdsb2JiaW5nIGZhaWxlZCAocmV0dXJuZWQgZ2xvYiBwYXR0ZXJuKSwKLQkJICogYnV0IGJlIGNhcmVmdWwgKEUuZy4gdG9nbG9iID09ICJhYioiIHdoZW4gdGhlIGZpbGUKLQkJICogImFiKiIgZXhpc3RzIGlzIG5vdCBhbiBlcnJvcikuCi0JCSAqIEFsc28sIGNoZWNrIGZvciBlbXB0eSByZXN1bHQgLSBoYXBwZW5zIGlmIHdlIHRyaWVkCi0JCSAqIHRvIGdsb2Igc29tZXRoaW5nIHdoaWNoIGV2YWx1YXRlZCB0byBhbiBlbXB0eQotCQkgKiBzdHJpbmcgKGUuZy4sICIkRk9PIiB3aGVuIHRoZXJlIGlzIG5vIEZPTywgZXRjKS4KLQkJICovCi0JCWlmICgoc3RyY21wKHdvcmRzWzBdLCB0b2dsb2IpID09IDAgJiYKLQkJICAgIHN0YXQod29yZHNbMF0sICZzdGF0YikgPCAwKSB8fAotCQkgICAgd29yZHNbMF1bMF0gPT0gJ1wwJykgewotCQkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOwotCQkJd29yZHMgPSBOVUxMOwotCQkJbndvcmRzID0gMDsKLQkJfQotCX0KLQlhZnJlZSh0b2dsb2IsIEFURU1QKTsKLQotCWlmICgoKndvcmRzcCA9IG53b3JkcyA/IHdvcmRzIDogTlVMTCkgPT0gTlVMTCAmJiB3b3JkcyAhPSBOVUxMKQotCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7Ci0KLQlyZXR1cm4gKG53b3Jkcyk7Ci19Ci0KLS8qIERhdGEgc3RydWN0dXJlIHVzZWQgaW4geF9jb21tYW5kX2dsb2IoKSAqLwotc3RydWN0IHBhdGhfb3JkZXJfaW5mbyB7Ci0JY2hhciAqd29yZDsKLQlpbnQgYmFzZTsKLQlpbnQgcGF0aF9vcmRlcjsKLX07Ci0KLS8qIENvbXBhcmUgcm91dGluZSB1c2VkIGluIHhfY29tbWFuZF9nbG9iKCkgKi8KLXN0YXRpYyBpbnQKLXBhdGhfb3JkZXJfY21wKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKLXsKLQljb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICphID0gKGNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKilhYTsKLQljb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICpiID0gKGNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKiliYjsKLQlpbnQgdDsKLQotCXQgPSBzdHJjbXAoYS0+d29yZCArIGEtPmJhc2UsIGItPndvcmQgKyBiLT5iYXNlKTsKLQlyZXR1cm4gKHQgPyB0IDogYS0+cGF0aF9vcmRlciAtIGItPnBhdGhfb3JkZXIpOwotfQotCi1zdGF0aWMgaW50Ci14X2NvbW1hbmRfZ2xvYihpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4sIGNoYXIgKioqd29yZHNwKQotewotCWNoYXIgKnRvZ2xvYiwgKnBhdCwgKmZwYXRoOwotCWludCBud29yZHM7Ci0JWFB0clYgdzsKLQlzdHJ1Y3QgYmxvY2sgKmw7Ci0KLQlpZiAoc2xlbiA8IDApCi0JCXJldHVybiAoMCk7Ci0KLQl0b2dsb2IgPSBhZGRfZ2xvYihzdHIsIHNsZW4pOwotCi0JLyogQ29udmVydCAiZm9vKiIgKHRvZ2xvYikgdG8gYSBwYXR0ZXJuIGZvciBmdXR1cmUgdXNlICovCi0JcGF0ID0gZXZhbHN0cih0b2dsb2IsIERPUEFUIHwgRE9USUxERSk7Ci0JYWZyZWUodG9nbG9iLCBBVEVNUCk7Ci0KLQlYUGluaXQodywgMzIpOwotCi0JZ2xvYl90YWJsZShwYXQsICZ3LCAma2V5d29yZHMpOwotCWdsb2JfdGFibGUocGF0LCAmdywgJmFsaWFzZXMpOwotCWdsb2JfdGFibGUocGF0LCAmdywgJmJ1aWx0aW5zKTsKLQlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KQotCQlnbG9iX3RhYmxlKHBhdCwgJncsICZsLT5mdW5zKTsKLQotCWdsb2JfcGF0aChmbGFncywgcGF0LCAmdywgcGF0aCk7Ci0JaWYgKChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgIT0gbnVsbCkKLQkJZ2xvYl9wYXRoKGZsYWdzLCBwYXQsICZ3LCBmcGF0aCk7Ci0KLQlud29yZHMgPSBYUHNpemUodyk7Ci0KLQlpZiAoIW53b3JkcykgewotCQkqd29yZHNwID0gTlVMTDsKLQkJWFBmcmVlKHcpOwotCQlyZXR1cm4gKDApOwotCX0KLQkvKiBTb3J0IGVudHJpZXMgKi8KLQlpZiAoZmxhZ3MgJiBYQ0ZfRlVMTFBBVEgpIHsKLQkJLyogU29ydCBieSBiYXNlbmFtZSwgdGhlbiBwYXRoIG9yZGVyICovCi0JCXN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmluZm8sICpsYXN0X2luZm8gPSBOVUxMOwotCQljaGFyICoqd29yZHMgPSAoY2hhciAqKilYUHB0cnYodyk7Ci0JCWludCBpLCBwYXRoX29yZGVyID0gMDsKLQotCQlpbmZvID0gKHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKikKLQkJICAgIGFsbG9jKG53b3JkcyAqIHNpemVvZihzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvKSwgQVRFTVApOwotCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspIHsKLQkJCWluZm9baV0ud29yZCA9IHdvcmRzW2ldOwotCQkJaW5mb1tpXS5iYXNlID0geF9iYXNlbmFtZSh3b3Jkc1tpXSwgTlVMTCk7Ci0JCQlpZiAoIWxhc3RfaW5mbyB8fCBpbmZvW2ldLmJhc2UgIT0gbGFzdF9pbmZvLT5iYXNlIHx8Ci0JCQkgICAgc3RybmNtcCh3b3Jkc1tpXSwgbGFzdF9pbmZvLT53b3JkLCBpbmZvW2ldLmJhc2UpICE9IDApIHsKLQkJCQlsYXN0X2luZm8gPSAmaW5mb1tpXTsKLQkJCQlwYXRoX29yZGVyKys7Ci0JCQl9Ci0JCQlpbmZvW2ldLnBhdGhfb3JkZXIgPSBwYXRoX29yZGVyOwotCQl9Ci0JCXFzb3J0KGluZm8sIG53b3Jkcywgc2l6ZW9mKHN0cnVjdCBwYXRoX29yZGVyX2luZm8pLAotCQkgICAgcGF0aF9vcmRlcl9jbXApOwotCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCi0JCQl3b3Jkc1tpXSA9IGluZm9baV0ud29yZDsKLQkJYWZyZWUoaW5mbywgQVRFTVApOwotCX0gZWxzZSB7Ci0JCS8qIFNvcnQgYW5kIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcyAqLwotCQljaGFyICoqd29yZHMgPSAoY2hhciAqKilYUHB0cnYodyk7Ci0JCWludCBpLCBqOwotCi0JCXFzb3J0KHdvcmRzLCBud29yZHMsIHNpemVvZih2b2lkICopLCB4c3RyY21wKTsKLQkJZm9yIChpID0gaiA9IDA7IGkgPCBud29yZHMgLSAxOyBpKyspIHsKLQkJCWlmIChzdHJjbXAod29yZHNbaV0sIHdvcmRzW2kgKyAxXSkpCi0JCQkJd29yZHNbaisrXSA9IHdvcmRzW2ldOwotCQkJZWxzZQotCQkJCWFmcmVlKHdvcmRzW2ldLCBBVEVNUCk7Ci0JCX0KLQkJd29yZHNbaisrXSA9IHdvcmRzW2ldOwotCQlud29yZHMgPSBqOwotCQl3LmN1ciA9ICh2b2lkICoqKSZ3b3Jkc1tqXTsKLQl9Ci0KLQlYUHB1dCh3LCBOVUxMKTsKLQkqd29yZHNwID0gKGNoYXIgKiopWFBjbG9zZSh3KTsKLQotCXJldHVybiAobndvcmRzKTsKLX0KLQotI2RlZmluZSBJU19XT1JEQyhjKQkoIWN0eXBlKGMsIENfTEVYMSkgJiYgKGMpICE9ICdcJycgJiYgKGMpICE9ICciJyAmJiBcCi0JCQkgICAgKGMpICE9ICdgJyAmJiAoYykgIT0gJz0nICYmIChjKSAhPSAnOicpCi0KLXN0YXRpYyBpbnQKLXhfbG9jYXRlX3dvcmQoY29uc3QgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgcG9zLCBpbnQgKnN0YXJ0cCwKLSAgICBib29sICppc19jb21tYW5kcCkKLXsKLQlpbnQgc3RhcnQsIGVuZDsKLQotCS8qIEJhZCBjYWxsPyBQcm9iYWJseSBzaG91bGQgcmVwb3J0IGVycm9yICovCi0JaWYgKHBvcyA8IDAgfHwgcG9zID4gYnVmbGVuKSB7Ci0JCSpzdGFydHAgPSBwb3M7Ci0JCSppc19jb21tYW5kcCA9IGZhbHNlOwotCQlyZXR1cm4gKDApOwotCX0KLQkvKiBUaGUgY2FzZSB3aGVyZSBwb3MgPT0gYnVmbGVuIGhhcHBlbnMgdG8gdGFrZSBjYXJlIG9mIGl0c2VsZi4uLiAqLwotCi0Jc3RhcnQgPSBwb3M7Ci0JLyogS2VlcCBnb2luZyBiYWNrd2FyZHMgdG8gc3RhcnQgb2Ygd29yZCAoaGFzIGVmZmVjdCBvZiBhbGxvd2luZwotCSAqIG9uZSBibGFuayBhZnRlciB0aGUgZW5kIG9mIGEgd29yZCkKLQkgKi8KLQlmb3IgKDsgKHN0YXJ0ID4gMCAmJiBJU19XT1JEQyhidWZbc3RhcnQgLSAxXSkpIHx8Ci0JICAgIChzdGFydCA+IDEgJiYgYnVmW3N0YXJ0IC0gMl0gPT0gJ1xcJyk7IHN0YXJ0LS0pCi0JCTsKLQkvKiBHbyBmb3J3YXJkcyB0byBlbmQgb2Ygd29yZCAqLwotCWZvciAoZW5kID0gc3RhcnQ7IGVuZCA8IGJ1ZmxlbiAmJiBJU19XT1JEQyhidWZbZW5kXSk7IGVuZCsrKSB7Ci0JCWlmIChidWZbZW5kXSA9PSAnXFwnICYmIChlbmQgKyAxKSA8IGJ1ZmxlbikKLQkJCWVuZCsrOwotCX0KLQotCWlmIChpc19jb21tYW5kcCkgewotCQlib29sIGlzY21kOwotCQlpbnQgcCA9IHN0YXJ0IC0gMTsKLQotCQkvKiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBjb21tYW5kICovCi0JCXdoaWxlIChwID49IDAgJiYga3NoX2lzc3BhY2UoYnVmW3BdKSkKLQkJCXAtLTsKLQkJaXNjbWQgPSBwIDwgMCB8fCB2c3RyY2hyKCI7fCYoKWAiLCBidWZbcF0pOwotCQlpZiAoaXNjbWQpIHsKLQkJCS8qIElmIGNvbW1hbmQgaGFzIGEgLywgcGF0aCwgZXRjLiBpcyBub3Qgc2VhcmNoZWQ7Ci0JCQkgKiBvbmx5IGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkIHdoaWNoIGlzIGp1c3QKLQkJCSAqIGxpa2UgZmlsZSBnbG9iYmluZy4KLQkJCSAqLwotCQkJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKykKLQkJCQlpZiAoYnVmW3BdID09ICcvJykKLQkJCQkJYnJlYWs7Ci0JCQlpc2NtZCA9IHAgPT0gZW5kOwotCQl9Ci0JCSppc19jb21tYW5kcCA9IGlzY21kOwotCX0KLQkqc3RhcnRwID0gc3RhcnQ7Ci0KLQlyZXR1cm4gKGVuZCAtIHN0YXJ0KTsKLX0KLQotc3RhdGljIGludAoteF9jZl9nbG9iKGludCBmbGFncywgY29uc3QgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgcG9zLCBpbnQgKnN0YXJ0cCwKLSAgICBpbnQgKmVuZHAsIGNoYXIgKioqd29yZHNwLCBib29sICppc19jb21tYW5kcCkKLXsKLQlpbnQgbGVuLCBud29yZHM7Ci0JY2hhciAqKndvcmRzID0gTlVMTDsKLQlib29sIGlzX2NvbW1hbmQ7Ci0KLQlsZW4gPSB4X2xvY2F0ZV93b3JkKGJ1ZiwgYnVmbGVuLCBwb3MsIHN0YXJ0cCwgJmlzX2NvbW1hbmQpOwotCWlmICghKGZsYWdzICYgWENGX0NPTU1BTkQpKQotCQlpc19jb21tYW5kID0gZmFsc2U7Ci0JLyogRG9uJ3QgZG8gY29tbWFuZCBnbG9iaW5nIG9uIHplcm8gbGVuZ3RoIHN0cmluZ3MgLSBpdCB0YWtlcyB0b28KLQkgKiBsb25nIGFuZCBpc24ndCB2ZXJ5IHVzZWZ1bC4gRmlsZSBnbG9icyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUKLQkgKiB1c2VmdWwsIHNvIGFsbG93IHRoZXNlLgotCSAqLwotCWlmIChsZW4gPT0gMCAmJiBpc19jb21tYW5kKQotCQlyZXR1cm4gKDApOwotCi0JbndvcmRzID0gaXNfY29tbWFuZCA/Ci0JICAgIHhfY29tbWFuZF9nbG9iKGZsYWdzLCBidWYgKyAqc3RhcnRwLCBsZW4sICZ3b3JkcykgOgotCSAgICB4X2ZpbGVfZ2xvYihmbGFncywgYnVmICsgKnN0YXJ0cCwgbGVuLCAmd29yZHMpOwotCWlmIChud29yZHMgPT0gMCkgewotCQkqd29yZHNwID0gTlVMTDsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKGlzX2NvbW1hbmRwKQotCQkqaXNfY29tbWFuZHAgPSBpc19jb21tYW5kOwotCSp3b3Jkc3AgPSB3b3JkczsKLQkqZW5kcCA9ICpzdGFydHAgKyBsZW47Ci0KLQlyZXR1cm4gKG53b3Jkcyk7Ci19Ci0KLS8qIEdpdmVuIGEgc3RyaW5nLCBjb3B5IGl0IGFuZCBwb3NzaWJseSBhZGQgYSAnKicgdG8gdGhlIGVuZC4KLSAqIFRoZSBuZXcgc3RyaW5nIGlzIHJldHVybmVkLgotICovCi1zdGF0aWMgY2hhciAqCi1hZGRfZ2xvYihjb25zdCBjaGFyICpzdHIsIGludCBzbGVuKQotewotCWNoYXIgKnRvZ2xvYiwgKnM7Ci0JYm9vbCBzYXdfc2xhc2ggPSBmYWxzZTsKLQotCWlmIChzbGVuIDwgMCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCS8qIGZvciBjbGFuZydzIHN0YXRpYyBhbmFseXNlciwgdGhlIG5vbm51bGwgYXR0cmlidXRlIGlzbid0IGVub3VnaCAqLwotCW1rc3NlcnQoc3RyICE9IE5VTEwpOwotCi0Jc3RybmR1cHgodG9nbG9iLCBzdHIsIHNsZW4gKyAxLCBBVEVNUCk7IC8qICsgMSBmb3IgIioiICovCi0JdG9nbG9iW3NsZW5dID0gJ1wwJzsKLQotCS8qCi0JICogSWYgdGhlIHBhdGhuYW1lIGNvbnRhaW5zIGEgd2lsZGNhcmQgKGFuIHVucXVvdGVkICcqJywKLQkgKiAnPycsIG9yICdbJykgb3IgcGFyYW1ldGVyIGV4cGFuc2lvbiAoJyQnKSwgb3IgYSB+dXNlcm5hbWUKLQkgKiB3aXRoIG5vIHRyYWlsaW5nIHNsYXNoLCB0aGVuIGl0IGlzIGdsb2JiZWQgYmFzZWQgb24gdGhhdAotCSAqIHZhbHVlIChpLmUuLCB3aXRob3V0IHRoZSBhcHBlbmRlZCAnKicpLgotCSAqLwotCWZvciAocyA9IHRvZ2xvYjsgKnM7IHMrKykgewotCQlpZiAoKnMgPT0gJ1xcJyAmJiBzWzFdKQotCQkJcysrOwotCQllbHNlIGlmICgqcyA9PSAnKicgfHwgKnMgPT0gJ1snIHx8ICpzID09ICc/JyB8fCAqcyA9PSAnJCcgfHwKLQkJICAgIChzWzFdID09ICcoJyAvKikqLyAmJiAvKiAqcyBpbiAnKicsJz8nIGFscmVhZHkgY2hlY2tlZCAqLwotCQkgICAgKCpzID09ICcrJyB8fCAqcyA9PSAnQCcgfHwgKnMgPT0gJyEnKSkpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoKnMgPT0gJy8nKQotCQkJc2F3X3NsYXNoID0gdHJ1ZTsKLQl9Ci0JaWYgKCEqcyAmJiAoKnRvZ2xvYiAhPSAnficgfHwgc2F3X3NsYXNoKSkgewotCQl0b2dsb2Jbc2xlbl0gPSAnKic7Ci0JCXRvZ2xvYltzbGVuICsgMV0gPSAnXDAnOwotCX0KLQlyZXR1cm4gKHRvZ2xvYik7Ci19Ci0KLS8qCi0gKiBGaW5kIGxvbmdlc3QgY29tbW9uIHByZWZpeAotICovCi1zdGF0aWMgaW50Ci14X2xvbmdlc3RfcHJlZml4KGludCBud29yZHMsIGNoYXIgKiBjb25zdCAqIHdvcmRzKQotewotCWludCBpLCBqLCBwcmVmaXhfbGVuOwotCWNoYXIgKnA7Ci0KLQlpZiAobndvcmRzIDw9IDApCi0JCXJldHVybiAoMCk7Ci0KLQlwcmVmaXhfbGVuID0gc3RybGVuKHdvcmRzWzBdKTsKLQlmb3IgKGkgPSAxOyBpIDwgbndvcmRzOyBpKyspCi0JCWZvciAoaiA9IDAsIHAgPSB3b3Jkc1tpXTsgaiA8IHByZWZpeF9sZW47IGorKykKLQkJCWlmIChwW2pdICE9IHdvcmRzWzBdW2pdKSB7Ci0JCQkJcHJlZml4X2xlbiA9IGo7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JcmV0dXJuIChwcmVmaXhfbGVuKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfZnJlZV93b3JkcyhpbnQgbndvcmRzLCBjaGFyICoqd29yZHMpCi17Ci0Jd2hpbGUgKG53b3JkcykKLQkJYWZyZWUod29yZHNbLS1ud29yZHNdLCBBVEVNUCk7Ci0JYWZyZWUod29yZHMsIEFURU1QKTsKLX0KLQotLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGJhc2VuYW1lIG9mIHN0cmluZyBzICh3aGljaCBlbmRzIGF0IHNlIC0gbmVlZCBub3QKLSAqIGJlIG51bGwgdGVybWluYXRlZCkuIFRyYWlsaW5nIHNsYXNoZXMgYXJlIGlnbm9yZWQuIElmIHMgaXMganVzdCBhIHNsYXNoLAotICogdGhlbiB0aGUgb2Zmc2V0IGlzIDAgKGFjdHVhbGx5LCBsZW5ndGggLSAxKS4KLSAqCXMJCVJldHVybgotICoJL2V0YwkJMQotICoJL2V0Yy8JCTEKLSAqCS9ldGMvLwkJMQotICoJL2V0Yy9mbwkJNQotICoJZm9vCQkwCi0gKgkvLy8JCTIKLSAqCQkJMAotICovCi1zdGF0aWMgaW50Ci14X2Jhc2VuYW1lKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnNlKQotewotCWNvbnN0IGNoYXIgKnA7Ci0KLQlpZiAoc2UgPT0gTlVMTCkKLQkJc2UgPSBzICsgc3RybGVuKHMpOwotCWlmIChzID09IHNlKQotCQlyZXR1cm4gKDApOwotCi0JLyogU2tpcCB0cmFpbGluZyBzbGFzaGVzICovCi0JZm9yIChwID0gc2UgLSAxOyBwID4gcyAmJiAqcCA9PSAnLyc7IHAtLSkKLQkJOwotCWZvciAoOyBwID4gcyAmJiAqcCAhPSAnLyc7IHAtLSkKLQkJOwotCWlmICgqcCA9PSAnLycgJiYgcCArIDEgPCBzZSkKLQkJcCsrOwotCi0JcmV0dXJuIChwIC0gcyk7Ci19Ci0KLS8qCi0gKiBBcHBseSBwYXR0ZXJuIG1hdGNoaW5nIHRvIGEgdGFibGU6IGFsbCB0YWJsZSBlbnRyaWVzIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuCi0gKiBhcmUgYWRkZWQgdG8gd3AuCi0gKi8KLXN0YXRpYyB2b2lkCi1nbG9iX3RhYmxlKGNvbnN0IGNoYXIgKnBhdCwgWFB0clYgKndwLCBzdHJ1Y3QgdGFibGUgKnRwKQotewotCXN0cnVjdCB0c3RhdGUgdHM7Ci0Jc3RydWN0IHRibCAqdGU7Ci0KLQlrdHdhbGsoJnRzLCB0cCk7Ci0Jd2hpbGUgKCh0ZSA9IGt0bmV4dCgmdHMpKSkKLQkJaWYgKGdtYXRjaHgodGUtPm5hbWUsIHBhdCwgZmFsc2UpKSB7Ci0JCQljaGFyICpjcDsKLQotCQkJc3RyZHVweChjcCwgdGUtPm5hbWUsIEFURU1QKTsKLQkJCVhQcHV0KCp3cCwgY3ApOwotCQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbG9iX3BhdGgoaW50IGZsYWdzLCBjb25zdCBjaGFyICpwYXQsIFhQdHJWICp3cCwgY29uc3QgY2hhciAqbHBhdGgpCi17Ci0JY29uc3QgY2hhciAqc3AsICpwOwotCWNoYXIgKnhwLCAqKndvcmRzOwotCWludCBzdGF0ZXJyLCBwYXRobGVuLCBwYXRsZW4sIG9sZHNpemUsIG5ld3NpemUsIGksIGo7Ci0JWFN0cmluZyB4czsKLQotCXBhdGxlbiA9IHN0cmxlbihwYXQpICsgMTsKLQlzcCA9IGxwYXRoOwotCVhpbml0KHhzLCB4cCwgcGF0bGVuICsgMTI4LCBBVEVNUCk7Ci0Jd2hpbGUgKHNwKSB7Ci0JCXhwID0gWHN0cmluZyh4cywgeHApOwotCQlpZiAoIShwID0gY3N0cmNocihzcCwgJzonKSkpCi0JCQlwID0gc3AgKyBzdHJsZW4oc3ApOwotCQlwYXRobGVuID0gcCAtIHNwOwotCQlpZiAocGF0aGxlbikgewotCQkJLyogQ29weSBzcCBpbnRvIHhwLCBzdHVmZmluZyBhbnkgTUFHSUMgY2hhcmFjdGVycwotCQkJICogb24gdGhlIHdheQotCQkJICovCi0JCQljb25zdCBjaGFyICpzID0gc3A7Ci0KLQkJCVhjaGVja04oeHMsIHhwLCBwYXRobGVuICogMik7Ci0JCQl3aGlsZSAocyA8IHApIHsKLQkJCQlpZiAoSVNNQUdJQygqcykpCi0JCQkJCSp4cCsrID0gTUFHSUM7Ci0JCQkJKnhwKysgPSAqcysrOwotCQkJfQotCQkJKnhwKysgPSAnLyc7Ci0JCQlwYXRobGVuKys7Ci0JCX0KLQkJc3AgPSBwOwotCQlYY2hlY2tOKHhzLCB4cCwgcGF0bGVuKTsKLQkJbWVtY3B5KHhwLCBwYXQsIHBhdGxlbik7Ci0KLQkJb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOwotCQlnbG9iX3N0cihYc3RyaW5nKHhzLCB4cCksIHdwLCAxKTsgLyogbWFyayBkaXJzICovCi0JCW5ld3NpemUgPSBYUHNpemUoKndwKTsKLQotCQkvKiBDaGVjayB0aGF0IGVhY2ggbWF0Y2ggaXMgZXhlY3V0YWJsZS4uLiAqLwotCQl3b3JkcyA9IChjaGFyICoqKVhQcHRydigqd3ApOwotCQlmb3IgKGkgPSBqID0gb2xkc2l6ZTsgaSA8IG5ld3NpemU7IGkrKykgewotCQkJc3RhdGVyciA9IDA7Ci0JCQlpZiAoKHNlYXJjaF9hY2Nlc3Mod29yZHNbaV0sIFhfT0ssICZzdGF0ZXJyKSA+PSAwKSB8fAotCQkJICAgIChzdGF0ZXJyID09IEVJU0RJUikpIHsKLQkJCQl3b3Jkc1tqXSA9IHdvcmRzW2ldOwotCQkJCWlmICghKGZsYWdzICYgWENGX0ZVTExQQVRIKSkKLQkJCQkJbWVtbW92ZSh3b3Jkc1tqXSwgd29yZHNbal0gKyBwYXRobGVuLAotCQkJCQkgICAgc3RybGVuKHdvcmRzW2pdICsgcGF0aGxlbikgKyAxKTsKLQkJCQlqKys7Ci0JCQl9IGVsc2UKLQkJCQlhZnJlZSh3b3Jkc1tpXSwgQVRFTVApOwotCQl9Ci0JCXdwLT5jdXIgPSAodm9pZCAqKikmd29yZHNbal07Ci0KLQkJaWYgKCEqc3ArKykKLQkJCWJyZWFrOwotCX0KLQlYZnJlZSh4cywgeHApOwotfQotCi0vKgotICogaWYgYXJndW1lbnQgc3RyaW5nIGNvbnRhaW5zIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZXkgd2lsbAotICogYmUgZXNjYXBlZCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHB1dCBpbnRvIGVkaXQgYnVmZmVyIGJ5Ci0gKiBrZXliaW5kaW5nLXNwZWNpZmljIGZ1bmN0aW9uCi0gKi8KLXN0YXRpYyBpbnQKLXhfZXNjYXBlKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIGludCAoKnB1dGJ1Zl9mdW5jKShjb25zdCBjaGFyICosIHNpemVfdCkpCi17Ci0Jc2l6ZV90IGFkZCA9IDAsIHdsZW4gPSBsZW47Ci0JY29uc3QgY2hhciAqaWZzID0gc3RyX3ZhbChsb2NhbCgiSUZTIiwgMCkpOwotCWludCBydmFsID0gMDsKLQotCXdoaWxlICh3bGVuIC0gYWRkID4gMCkKLQkJaWYgKHZzdHJjaHIoIlwiIyQmJygpKjo7PD0+P1tcXGB7fH0iLCBzW2FkZF0pIHx8Ci0JCSAgICB2c3RyY2hyKGlmcywgc1thZGRdKSkgewotCQkJaWYgKHB1dGJ1Zl9mdW5jKHMsIGFkZCkgIT0gMCkgewotCQkJCXJ2YWwgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXB1dGJ1Zl9mdW5jKHNbYWRkXSA9PSAnXG4nID8gIiciIDogIlxcIiwgMSk7Ci0JCQlwdXRidWZfZnVuYygmc1thZGRdLCAxKTsKLQkJCWlmIChzW2FkZF0gPT0gJ1xuJykKLQkJCQlwdXRidWZfZnVuYygiJyIsIDEpOwotCi0JCQlhZGQrKzsKLQkJCXdsZW4gLT0gYWRkOwotCQkJcyArPSBhZGQ7Ci0JCQlhZGQgPSAwOwotCQl9IGVsc2UKLQkJCSsrYWRkOwotCWlmICh3bGVuID4gMCAmJiBydmFsID09IDApCi0JCXJ2YWwgPSBwdXRidWZfZnVuYyhzLCB3bGVuKTsKLQotCXJldHVybiAocnZhbCk7Ci19Ci0KLQotLyogKysrIGVtYWNzIGVkaXRpbmcgbW9kZSArKysgKi8KLQotc3RhdGljCUFyZWEJYWVkaXQ7Ci0jZGVmaW5lCUFFRElUCSZhZWRpdAkJLyogYXJlYSBmb3Iga2lsbCByaW5nIGFuZCBtYWNybyBkZWZucyAqLwotCi0vKiB2YWx1ZXMgcmV0dXJuZWQgYnkga2V5Ym9hcmQgZnVuY3Rpb25zICovCi0jZGVmaW5lCUtTVEQJMAotI2RlZmluZQlLRU9MCTEJCS8qIF5NLCBeSiAqLwotI2RlZmluZQlLSU5UUgkyCQkvKiBeRywgXkMgKi8KLQotc3RydWN0IHhfZnRhYiB7Ci0JaW50ICgqeGZfZnVuYykoaW50IGMpOwotCWNvbnN0IGNoYXIgKnhmX25hbWU7Ci0Jc2hvcnQgeGZfZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgeF9kZWZiaW5kaW5ncyB7Ci0JdW5zaWduZWQgY2hhciB4ZGJfZnVuYzsJLyogWEZVTkNfKiAqLwotCXVuc2lnbmVkIGNoYXIgeGRiX3RhYjsKLQl1bnNpZ25lZCBjaGFyIHhkYl9jaGFyOwotfTsKLQotI2RlZmluZSBYRl9BUkcJCTEJLyogY29tbWFuZCB0YWtlcyBudW1iZXIgcHJlZml4ICovCi0jZGVmaW5lCVhGX05PQklORAkyCS8qIG5vdCBhbGxvd2VkIHRvIGJpbmQgdG8gZnVuY3Rpb24gKi8KLSNkZWZpbmUJWEZfUFJFRklYCTQJLyogZnVuY3Rpb24gc2V0cyBwcmVmaXggKi8KLQotLyogU2VwYXJhdG9yIGZvciBjb21wbGV0aW9uICovCi0jZGVmaW5lCWlzX2NmcyhjKQkoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJyInIHx8IChjKSA9PSAnXCcnKQotLyogU2VwYXJhdG9yIGZvciBtb3Rpb24gKi8KLSNkZWZpbmUJaXNfbWZzKGMpCSghKGtzaF9pc2FsbnV4KGMpIHx8IChjKSA9PSAnJCcgfHwgKChjKSAmIDB4ODApKSkKLQotI2RlZmluZSBYX05UQUJTCQkzCQkJLyogbm9ybWFsLCBtZXRhMSwgbWV0YTIgKi8KLSNkZWZpbmUgWF9UQUJTWgkJMjU2CQkJLyogc2l6ZSBvZiBrZXlkZWYgdGFibGVzIGV0YyAqLwotCi0vKiBBcmd1bWVudHMgZm9yIGRvX2NvbXBsZXRlKCkKLSAqIDAgPSBlbnVtZXJhdGUJTS09CWNvbXBsZXRlIGFzIG11Y2ggYXMgcG9zc2libGUgYW5kIHRoZW4gbGlzdAotICogMSA9IGNvbXBsZXRlCQlNLUVzYwotICogMiA9IGxpc3QJCU0tPwotICovCi10eXBlZGVmIGVudW0gewotCUNUX0xJU1QsCS8qIGxpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zICovCi0JQ1RfQ09NUExFVEUsCS8qIGNvbXBsZXRlIHRvIGxvbmdlc3QgcHJlZml4ICovCi0JQ1RfQ09NUExJU1QJLyogY29tcGxldGUgYW5kIHRoZW4gbGlzdCAoaWYgbm9uLWV4YWN0KSAqLwotfSBDb21wX3R5cGU7Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciBteSBob3Jpem9udGFsIHNjcm9sbGluZyBzdHVmZgotICovCi1zdGF0aWMgY2hhciAqeGJ1ZjsJCS8qIGJlZyBpbnB1dCBidWZmZXIgKi8KLXN0YXRpYyBjaGFyICp4ZW5kOwkJLyogZW5kIGlucHV0IGJ1ZmZlciAqLwotc3RhdGljIGNoYXIgKnhjcDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gKi8KLXN0YXRpYyBjaGFyICp4ZXA7CQkvKiBjdXJyZW50IGVuZCAqLwotc3RhdGljIGNoYXIgKnhicDsJCS8qIHN0YXJ0IG9mIHZpc2libGUgcG9ydGlvbiBvZiBpbnB1dCBidWZmZXIgKi8KLXN0YXRpYyBjaGFyICp4bHA7CQkvKiBsYXN0IGNoYXIgdmlzaWJsZSBvbiBzY3JlZW4gKi8KLXN0YXRpYyBpbnQgeF9hZGpfb2s7Ci0vKgotICogd2UgdXNlIHhfYWRqX2RvbmUgc28gdGhhdCBmdW5jdGlvbnMgY2FuIHRlbGwKLSAqIHdoZXRoZXIgeF9hZGp1c3QoKSBoYXMgYmVlbiBjYWxsZWQgd2hpbGUgdGhleSBhcmUgYWN0aXZlLgotICovCi1zdGF0aWMgaW50IHhfYWRqX2RvbmU7Ci0KLXN0YXRpYyBpbnQgeF9jb2w7Ci1zdGF0aWMgaW50IHhfZGlzcGxlbjsKLXN0YXRpYyBpbnQgeF9hcmc7CQkvKiBnZW5lcmFsIHB1cnBvc2UgYXJnICovCi1zdGF0aWMgaW50IHhfYXJnX2RlZmF1bHRlZDsJLyogeF9hcmcgbm90IGV4cGxpY2l0bHkgc2V0OyBkZWZhdWx0ZWQgdG8gMSAqLwotCi1zdGF0aWMgaW50IHhscF92YWxpZDsKLQotc3RhdGljIGNoYXIgKip4X2hpc3RwOwkJLyogaGlzdG9yeSBwb3NpdGlvbiAqLwotc3RhdGljIGludCB4X25leHRjbWQ7CQkvKiBmb3IgbmV3bGluZS1hbmQtbmV4dCAqLwotc3RhdGljIGNoYXIgKnhtcDsJCS8qIG1hcmsgcG9pbnRlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgeF9sYXN0X2NvbW1hbmQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAoKnhfdGFiKVtYX1RBQlNaXTsJLyoga2V5IGRlZmluaXRpb24gKi8KLSNpZm5kZWYgTUtTSF9TTUFMTAotc3RhdGljIGNoYXIgKigqeF9hdGFiKVtYX1RBQlNaXTsJLyogbWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNlbmRpZgotc3RhdGljIHVuc2lnbmVkIGNoYXIgeF9ib3VuZFsoWF9UQUJTWiAqIFhfTlRBQlMgKyA3KSAvIDhdOwotI2RlZmluZSBLSUxMU0laRQkyMAotc3RhdGljIGNoYXIgKmtpbGxzdGFja1tLSUxMU0laRV07Ci1zdGF0aWMgaW50IGtpbGxzcCwga2lsbHRwOwotc3RhdGljIGludCB4X2N1cnByZWZpeDsKLSNpZm5kZWYgTUtTSF9TTUFMTAotc3RhdGljIGNoYXIgKm1hY3JvcHRyID0gTlVMTDsJLyogYmluZCBrZXkgbWFjcm8gYWN0aXZlPyAqLwotI2VuZGlmCi0jaWYgIU1LU0hfU19OT1ZJCi1zdGF0aWMgaW50IGN1cl9jb2w7CQkvKiBjdXJyZW50IGNvbHVtbiBvbiBsaW5lICovCi1zdGF0aWMgaW50IHB3aWR0aDsJCS8qIHdpZHRoIG9mIHByb21wdCAqLwotc3RhdGljIGludCBwcm9tcHRfdHJ1bmM7CS8qIGhvdyBtdWNoIG9mIHByb21wdCB0byB0cnVuY2F0ZSAqLwotc3RhdGljIGludCB3aW53aWR0aDsJCS8qIHdpZHRoIG9mIHdpbmRvdyAqLwotc3RhdGljIGNoYXIgKndidWZbMl07CQkvKiB3aW5kb3cgYnVmZmVycyAqLwotc3RhdGljIGludCB3YnVmX2xlbjsJCS8qIGxlbmd0aCBvZiB3aW5kb3cgYnVmZmVycyAoeF9jb2xzIC0gMykgKi8KLXN0YXRpYyBpbnQgd2luOwkJCS8qIHdpbmRvdyBidWZmZXIgaW4gdXNlICovCi1zdGF0aWMgY2hhciBtb3JlYzsJCS8qIG1vcmUgY2hhcmFjdGVyIGF0IHJpZ2h0IG9mIHdpbmRvdyAqLwotc3RhdGljIGludCBsYXN0cmVmOwkJLyogYXJndW1lbnQgdG8gbGFzdCByZWZyZXNoKCkgKi8KLXN0YXRpYyBpbnQgaG9sZGxlbjsJCS8qIGxlbmd0aCBvZiBob2xkYnVmICovCi0jZW5kaWYKLXN0YXRpYyBpbnQgcHJvbXB0X3JlZHJhdzsJLyogMCBpZiBuZXdsaW5lIGZvcmNlZCBhZnRlciBwcm9tcHQgKi8KLQotc3RhdGljIGludCB4X2lucyhjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgeF9kZWxldGUoaW50LCBpbnQpOwotc3RhdGljIGludCB4X2J3b3JkKHZvaWQpOwotc3RhdGljIGludCB4X2Z3b3JkKGludCk7Ci1zdGF0aWMgdm9pZCB4X2dvdG8oY2hhciAqKTsKLXN0YXRpYyB2b2lkIHhfYnMzKGNoYXIgKiopOwotc3RhdGljIGludCB4X3NpemVfc3RyKGNoYXIgKik7Ci1zdGF0aWMgaW50IHhfc2l6ZTIoY2hhciAqLCBjaGFyICoqKTsKLXN0YXRpYyB2b2lkIHhfem90cyhjaGFyICopOwotc3RhdGljIHZvaWQgeF96b3RjMihpbnQpOwotc3RhdGljIHZvaWQgeF96b3RjMyhjaGFyICoqKTsKLXN0YXRpYyB2b2lkIHhfbG9hZF9oaXN0KGNoYXIgKiopOwotc3RhdGljIGludCB4X3NlYXJjaChjaGFyICosIGludCwgaW50KTsKLSNpZm5kZWYgTUtTSF9TTUFMTAotc3RhdGljIGludCB4X3NlYXJjaF9kaXIoaW50KTsKLSNlbmRpZgotc3RhdGljIGludCB4X21hdGNoKGNoYXIgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHhfcmVkcmF3KGludCk7Ci1zdGF0aWMgdm9pZCB4X3B1c2goaW50KTsKLXN0YXRpYyBjaGFyICp4X21hcGluKGNvbnN0IGNoYXIgKiwgQXJlYSAqKQotICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgxKSkpOwotc3RhdGljIGNoYXIgKnhfbWFwb3V0KGludCk7Ci1zdGF0aWMgdm9pZCB4X21hcG91dDIoaW50LCBjaGFyICoqKTsKLXN0YXRpYyB2b2lkIHhfcHJpbnQoaW50LCBpbnQpOwotc3RhdGljIHZvaWQgeF9hZGp1c3Qodm9pZCk7Ci1zdGF0aWMgdm9pZCB4X2VfdW5nZXRjKGludCk7Ci1zdGF0aWMgaW50IHhfZV9nZXRjKHZvaWQpOwotc3RhdGljIHZvaWQgeF9lX3B1dGMyKGludCk7Ci1zdGF0aWMgdm9pZCB4X2VfcHV0YzMoY29uc3QgY2hhciAqKik7Ci1zdGF0aWMgdm9pZCB4X2VfcHV0cyhjb25zdCBjaGFyICopOwotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgaW50IHhfZm9sZF9jYXNlKGludCk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyICp4X2xhc3RjcCh2b2lkKTsKLXN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGludCwgQ29tcF90eXBlKTsKLQotc3RhdGljIGludCB1bmdldF9jaGFyID0gLTE7Ci0KLXN0YXRpYyBpbnQgeF9kb19pbnMoY29uc3QgY2hhciAqLCBzaXplX3QpOwotc3RhdGljIHZvaWQgYmluZF9pZl9ub3RfYm91bmQoaW50LCBpbnQsIGludCk7Ci0KLWVudW0gZW1hY3NfZnVuY3MgewotI2RlZmluZSBFTUFDU0ZOX0VOVU1TCi0jaW5jbHVkZSAiZW1hY3Nmbi5oIgotCVhGVU5DX01BWAotfTsKLQotI2RlZmluZSBFTUFDU0ZOX0RFRk5TCi0jaW5jbHVkZSAiZW1hY3Nmbi5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhfZnRhYiB4X2Z0YWJbXSA9IHsKLSNkZWZpbmUgRU1BQ1NGTl9JVEVNUwotI2luY2x1ZGUgImVtYWNzZm4uaCIKLQl7IDAsIE5VTEwsIDAgfQotfTsKLQotc3RhdGljIHN0cnVjdCB4X2RlZmJpbmRpbmdzIGNvbnN0IHhfZGVmYmluZGluZ3NbXSA9IHsKLQl7IFhGVU5DX2RlbF9iYWNrLAkJMCwgQ1RSTCgnPycpCX0sCi0JeyBYRlVOQ19kZWxfYndvcmQsCQkxLCBDVFJMKCc/JykJfSwKLQl7IFhGVU5DX2VvdF9kZWwsCQkwLCBDVFJMKCdEJykJfSwKLQl7IFhGVU5DX2RlbF9iYWNrLAkJMCwgQ1RSTCgnSCcpCX0sCi0JeyBYRlVOQ19kZWxfYndvcmQsCQkxLCBDVFJMKCdIJykJfSwKLQl7IFhGVU5DX2RlbF9id29yZCwJCTEsCSdoJwl9LAotCXsgWEZVTkNfbXZfYndvcmQsCQkxLAknYicJfSwKLQl7IFhGVU5DX212X2Z3b3JkLAkJMSwJJ2YnCX0sCi0JeyBYRlVOQ19kZWxfZndvcmQsCQkxLAknZCcJfSwKLQl7IFhGVU5DX212X2JhY2ssCQkwLCBDVFJMKCdCJykJfSwKLQl7IFhGVU5DX212X2ZvcncsCQkwLCBDVFJMKCdGJykJfSwKLQl7IFhGVU5DX3NlYXJjaF9jaGFyX2ZvcncsCTAsIENUUkwoJ10nKQl9LAotCXsgWEZVTkNfc2VhcmNoX2NoYXJfYmFjaywJMSwgQ1RSTCgnXScpCX0sCi0JeyBYRlVOQ19uZXdsaW5lLAkJMCwgQ1RSTCgnTScpCX0sCi0JeyBYRlVOQ19uZXdsaW5lLAkJMCwgQ1RSTCgnSicpCX0sCi0JeyBYRlVOQ19lbmRfb2ZfdGV4dCwJCTAsIENUUkwoJ18nKQl9LAotCXsgWEZVTkNfYWJvcnQsCQkJMCwgQ1RSTCgnRycpCX0sCi0JeyBYRlVOQ19wcmV2X2NvbSwJCTAsIENUUkwoJ1AnKQl9LAotCXsgWEZVTkNfbmV4dF9jb20sCQkwLCBDVFJMKCdOJykJfSwKLQl7IFhGVU5DX25sX25leHRfY29tLAkJMCwgQ1RSTCgnTycpCX0sCi0JeyBYRlVOQ19zZWFyY2hfaGlzdCwJCTAsIENUUkwoJ1InKQl9LAotCXsgWEZVTkNfYmVnX2hpc3QsCQkxLAknPCcJfSwKLQl7IFhGVU5DX2VuZF9oaXN0LAkJMSwJJz4nCX0sCi0JeyBYRlVOQ19nb3RvX2hpc3QsCQkxLAknZycJfSwKLQl7IFhGVU5DX212X2VuZCwJCQkwLCBDVFJMKCdFJykJfSwKLQl7IFhGVU5DX212X2JlZ2luLAkJMCwgQ1RSTCgnQScpCX0sCi0JeyBYRlVOQ19kcmF3X2xpbmUsCQkwLCBDVFJMKCdMJykJfSwKLQl7IFhGVU5DX2NscywJCQkxLCBDVFJMKCdMJykJfSwKLQl7IFhGVU5DX21ldGExLAkJCTAsIENUUkwoJ1snKQl9LAotCXsgWEZVTkNfbWV0YTIsCQkJMCwgQ1RSTCgnWCcpCX0sCi0JeyBYRlVOQ19raWxsLAkJCTAsIENUUkwoJ0snKQl9LAotCXsgWEZVTkNfeWFuaywJCQkwLCBDVFJMKCdZJykJfSwKLQl7IFhGVU5DX21ldGFfeWFuaywJCTEsCSd5Jwl9LAotCXsgWEZVTkNfbGl0ZXJhbCwJCTAsIENUUkwoJ14nKQl9LAotCXsgWEZVTkNfY29tbWVudCwJCTEsCScjJwl9LAotCXsgWEZVTkNfdHJhbnNwb3NlLAkJMCwgQ1RSTCgnVCcpCX0sCi0JeyBYRlVOQ19jb21wbGV0ZSwJCTEsIENUUkwoJ1snKQl9LAotCXsgWEZVTkNfY29tcF9saXN0LAkJMCwgQ1RSTCgnSScpCX0sCi0JeyBYRlVOQ19jb21wX2xpc3QsCQkxLAknPScJfSwKLQl7IFhGVU5DX2VudW1lcmF0ZSwJCTEsCSc/Jwl9LAotCXsgWEZVTkNfZXhwYW5kLAkJCTEsCScqJwl9LAotCXsgWEZVTkNfY29tcF9maWxlLAkJMSwgQ1RSTCgnWCcpCX0sCi0JeyBYRlVOQ19jb21wX2NvbW0sCQkyLCBDVFJMKCdbJykJfSwKLQl7IFhGVU5DX2xpc3RfY29tbSwJCTIsCSc/Jwl9LAotCXsgWEZVTkNfbGlzdF9maWxlLAkJMiwgQ1RSTCgnWScpCX0sCi0JeyBYRlVOQ19zZXRfbWFyaywJCTEsCScgJwl9LAotCXsgWEZVTkNfa2lsbF9yZWdpb24sCQkwLCBDVFJMKCdXJykJfSwKLQl7IFhGVU5DX3hjaGdfcG9pbnRfbWFyaywJMiwgQ1RSTCgnWCcpCX0sCi0JeyBYRlVOQ19saXRlcmFsLAkJMCwgQ1RSTCgnVicpCX0sCi0JeyBYRlVOQ192ZXJzaW9uLAkJMSwgQ1RSTCgnVicpCX0sCi0JeyBYRlVOQ19wcmV2X2hpc3R3b3JkLAkJMSwJJy4nCX0sCi0JeyBYRlVOQ19wcmV2X2hpc3R3b3JkLAkJMSwJJ18nCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzAnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzEnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzInCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzMnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzQnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzUnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzYnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzcnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzgnCX0sCi0JeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzknCX0sCi0jaWZuZGVmIE1LU0hfU01BTEwKLQl7IFhGVU5DX2ZvbGRfdXBwZXIsCQkxLAknVScJfSwKLQl7IFhGVU5DX2ZvbGRfdXBwZXIsCQkxLAkndScJfSwKLQl7IFhGVU5DX2ZvbGRfbG93ZXIsCQkxLAknTCcJfSwKLQl7IFhGVU5DX2ZvbGRfbG93ZXIsCQkxLAknbCcJfSwKLQl7IFhGVU5DX2ZvbGRfY2FwaXRhbGlzZSwJMSwJJ0MnCX0sCi0JeyBYRlVOQ19mb2xkX2NhcGl0YWxpc2UsCTEsCSdjJwl9LAotI2VuZGlmCi0JLyogVGhlc2UgZm9yIGFuc2kgYXJyb3cga2V5czogYXJndWFibGVseSBzaG91bGRuJ3QgYmUgaGVyZSBieQotCSAqIGRlZmF1bHQsIGJ1dCBpdHMgc2ltcGxlci9mYXN0ZXIvc21hbGxlciB0aGFuIHVzaW5nIHRlcm1jYXAKLQkgKiBlbnRyaWVzLgotCSAqLwotCXsgWEZVTkNfbWV0YTIsCQkJMSwJJ1snCX0sCi0JeyBYRlVOQ19tZXRhMiwJCQkxLAknTycJfSwKLQl7IFhGVU5DX3ByZXZfY29tLAkJMiwJJ0EnCX0sCi0JeyBYRlVOQ19uZXh0X2NvbSwJCTIsCSdCJwl9LAotCXsgWEZVTkNfbXZfZm9ydywJCTIsCSdDJwl9LAotCXsgWEZVTkNfbXZfYmFjaywJCTIsCSdEJwl9LAotI2lmbmRlZiBNS1NIX1NNQUxMCi0JeyBYRlVOQ192dF9oYWNrLAkJMiwJJzEnCX0sCi0JeyBYRlVOQ19tdl9iZWdpbiB8IDB4ODAsCTIsCSc3Jwl9LAotCXsgWEZVTkNfbXZfYmVnaW4sCQkyLAknSCcJfSwKLQl7IFhGVU5DX212X2VuZCB8IDB4ODAsCQkyLAknNCcJfSwKLQl7IFhGVU5DX212X2VuZCB8IDB4ODAsCQkyLAknOCcJfSwKLQl7IFhGVU5DX212X2VuZCwJCQkyLAknRicJfSwKLQl7IFhGVU5DX2RlbF9jaGFyIHwgMHg4MCwJMiwJJzMnCX0sCi0JeyBYRlVOQ19zZWFyY2hfaGlzdF91cCB8IDB4ODAsCTIsCSc1Jwl9LAotCXsgWEZVTkNfc2VhcmNoX2hpc3RfZG4gfCAweDgwLAkyLAknNicJfSwKLQkvKiBtb3JlIG5vbi1zdGFuZGFyZCBvbmVzICovCi0JeyBYRlVOQ19lZGl0X2xpbmUsCQkyLAknZScJfQotI2VuZGlmCi19OwotCi0jaWZkZWYgTUtTSF9TTUFMTAotc3RhdGljIHZvaWQgeF9tb2RpZmllZCh2b2lkKTsKLXN0YXRpYyB2b2lkCi14X21vZGlmaWVkKHZvaWQpCi17Ci0JaWYgKCFtb2RpZmllZCkgewotCQl4X2hpc3RwID0gaGlzdHB0ciArIDE7Ci0JCW1vZGlmaWVkID0gMTsKLQl9Ci19Ci0jZGVmaW5lIFhGVU5DX1ZBTFVFKGYpIChmKQotI2Vsc2UKLSNkZWZpbmUgeF9tb2RpZmllZCgpIGRvIHsJCQlcCi0JaWYgKCFtb2RpZmllZCkgewkJCVwKLQkJeF9oaXN0cCA9IGhpc3RwdHIgKyAxOwkJXAotCQltb2RpZmllZCA9IDE7CQkJXAotCX0JCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2RlZmluZSBYRlVOQ19WQUxVRShmKSAoZiAmIDB4N0YpCi0jZW5kaWYKLQotc3RhdGljIGludAoteF9lX2dldG1iYyhjaGFyICpzYnVmKQotewotCWludCBjLCBwb3MgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopc2J1ZjsKLQotCW1lbXNldChidWYsIDAsIDQpOwotCWJ1Zltwb3MrK10gPSBjID0geF9lX2dldGMoKTsKLQlpZiAoYyA9PSAtMSkKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKFVURk1PREUpIHsKLQkJaWYgKChidWZbMF0gPj0gMHhDMikgJiYgKGJ1ZlswXSA8IDB4RjApKSB7Ci0JCQljID0geF9lX2dldGMoKTsKLQkJCWlmIChjID09IC0xKQotCQkJCXJldHVybiAoLTEpOwotCQkJaWYgKChjICYgMHhDMCkgIT0gMHg4MCkgewotCQkJCXhfZV91bmdldGMoYyk7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCWJ1Zltwb3MrK10gPSBjOwotCQl9Ci0JCWlmICgoYnVmWzBdID49IDB4RTApICYmIChidWZbMF0gPCAweEYwKSkgewotCQkJLyogWFhYIHhfZV91bmdldGMgaXMgb25lLW9jdGV0IG9ubHkgKi8KLQkJCWJ1Zltwb3MrK10gPSBjID0geF9lX2dldGMoKTsKLQkJCWlmIChjID09IC0xKQotCQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfQotCXJldHVybiAocG9zKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfaW5pdF9wcm9tcHQodm9pZCkKLXsKLQl4X2NvbCA9IHByb21wdGxlbihwcm9tcHQpOwotCXhfYWRqX29rID0gMTsKLQlwcm9tcHRfcmVkcmF3ID0gMTsKLQlpZiAoeF9jb2wgPj0geHhfY29scykKLQkJeF9jb2wgJT0geHhfY29sczsKLQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMiAtIHhfY29sOwotCXhfYWRqX2RvbmUgPSAwOwotCi0JcHByb21wdChwcm9tcHQsIDApOwotCWlmICh4X2Rpc3BsZW4gPCAxKSB7Ci0JCXhfY29sID0gMDsKLQkJeF9kaXNwbGVuID0geHhfY29scyAtIDI7Ci0JCXhfZV9wdXRjMignXG4nKTsKLQkJcHJvbXB0X3JlZHJhdyA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci14X2VtYWNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlpbnQgYywgaTsKLQl1bnNpZ25lZCBjaGFyIGY7Ci0KLQl4YnAgPSB4YnVmID0gYnVmOyB4ZW5kID0gYnVmICsgbGVuOwotCXhscCA9IHhjcCA9IHhlcCA9IGJ1ZjsKLQkqeGNwID0gMDsKLQl4bHBfdmFsaWQgPSB0cnVlOwotCXhtcCA9IE5VTEw7Ci0JeF9jdXJwcmVmaXggPSAwOwotCXhfaGlzdHAgPSBoaXN0cHRyICsgMTsKLQl4X2xhc3RfY29tbWFuZCA9IFhGVU5DX2Vycm9yOwotCi0JeHhfY29scyA9IHhfY29sczsKLQl4X2luaXRfcHJvbXB0KCk7Ci0KLQlpZiAoeF9uZXh0Y21kID49IDApIHsKLQkJaW50IG9mZiA9IHNvdXJjZS0+bGluZSAtIHhfbmV4dGNtZDsKLQkJaWYgKGhpc3RwdHIgLSBoaXN0b3J5ID49IG9mZikKLQkJCXhfbG9hZF9oaXN0KGhpc3RwdHIgLSBvZmYpOwotCQl4X25leHRjbWQgPSAtMTsKLQl9Ci0JZWRpdG1vZGUgPSAxOwotCXdoaWxlICgxKSB7Ci0JCXhfZmx1c2goKTsKLQkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQotCQkJcmV0dXJuICgwKTsKLQotCQlmID0geF9jdXJwcmVmaXggPT0gLTEgPyBYRlVOQ19pbnNlcnQgOgotCQkgICAgeF90YWJbeF9jdXJwcmVmaXhdW2NdOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWlmIChmICYgMHg4MCkgewotCQkJZiAmPSAweDdGOwotCQkJaWYgKChpID0geF9lX2dldGMoKSkgIT0gJ34nKQotCQkJCXhfZV91bmdldGMoaSk7Ci0JCX0KLQotCQkvKiBhdm9pZCBiaW5kIGtleSBtYWNybyByZWN1cnNpb24gKi8KLQkJaWYgKG1hY3JvcHRyICYmIGYgPT0gWEZVTkNfaW5zX3N0cmluZykKLQkJCWYgPSBYRlVOQ19pbnNlcnQ7Ci0jZW5kaWYKLQotCQlpZiAoISh4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9QUkVGSVgpICYmCi0JCSAgICB4X2xhc3RfY29tbWFuZCAhPSBYRlVOQ19zZXRfYXJnKSB7Ci0JCQl4X2FyZyA9IDE7Ci0JCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOwotCQl9Ci0JCWkgPSBjIHwgKHhfY3VycHJlZml4IDw8IDgpOwotCQl4X2N1cnByZWZpeCA9IDA7Ci0JCXN3aXRjaCAoKCp4X2Z0YWJbZl0ueGZfZnVuYykoaSkpIHsKLQkJY2FzZSBLU1REOgotCQkJaWYgKCEoeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfUFJFRklYKSkKLQkJCQl4X2xhc3RfY29tbWFuZCA9IGY7Ci0JCQlicmVhazsKLQkJY2FzZSBLRU9MOgotCQkJaSA9IHhlcCAtIHhidWY7Ci0JCQlyZXR1cm4gKGkpOwotCQljYXNlIEtJTlRSOgkvKiBzcGVjaWFsIGNhc2UgZm9yIGludGVycnVwdCAqLwotCQkJdHJhcHNpZyhTSUdJTlQpOwotCQkJeF9tb2RlKGZhbHNlKTsKLQkJCXVud2luZChMU0hFTEwpOwotCQl9Ci0JCS8qIGFkLWhvYyBoYWNrIGZvciBmaXhpbmcgdGhlIGN1cnNvciBwb3NpdGlvbiAqLwotCQl4X2dvdG8oeGNwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXhfaW5zZXJ0KGludCBjKQotewotCXN0YXRpYyBpbnQgbGVmdCA9IDAsIHBvcywgc2F2ZV9hcmc7Ci0Jc3RhdGljIGNoYXIgc3RyWzRdOwotCi0JLyoKLQkgKiBTaG91bGQgYWxsb3cgdGFiIGFuZCBjb250cm9sIGNoYXJzLgotCSAqLwotCWlmIChjID09IDApIHsKLSBpbnZtYnM6Ci0JCWxlZnQgPSAwOwotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCWlmIChVVEZNT0RFKSB7Ci0JCWlmICgoKGMgJiAweEMwKSA9PSAweDgwKSAmJiBsZWZ0KSB7Ci0JCQlzdHJbcG9zKytdID0gYzsKLQkJCWlmICghLS1sZWZ0KSB7Ci0JCQkJc3RyW3Bvc10gPSAnXDAnOwotCQkJCXhfYXJnID0gc2F2ZV9hcmc7Ci0JCQkJd2hpbGUgKHhfYXJnLS0pCi0JCQkJCXhfaW5zKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCWlmIChsZWZ0KSB7Ci0JCQlpZiAoeF9jdXJwcmVmaXggPT0gLTEpIHsKLQkJCQkvKiBmbHVzaCBpbnZhbGlkIG11bHRpYnl0ZSAqLwotCQkJCXN0cltwb3NdID0gJ1wwJzsKLQkJCQl3aGlsZSAoc2F2ZV9hcmctLSkKLQkJCQkJeF9pbnMoc3RyKTsKLQkJCX0KLQkJfQotCQlpZiAoKGMgPj0gMHhDMikgJiYgKGMgPCAweEUwKSkKLQkJCWxlZnQgPSAxOwotCQllbHNlIGlmICgoYyA+PSAweEUwKSAmJiAoYyA8IDB4RjApKQotCQkJbGVmdCA9IDI7Ci0JCWVsc2UgaWYgKGMgPiAweDdGKQotCQkJZ290byBpbnZtYnM7Ci0JCWVsc2UKLQkJCWxlZnQgPSAwOwotCQlpZiAobGVmdCkgewotCQkJc2F2ZV9hcmcgPSB4X2FyZzsKLQkJCXBvcyA9IDE7Ci0JCQlzdHJbMF0gPSBjOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCX0KLQlsZWZ0ID0gMDsKLQlzdHJbMF0gPSBjOwotCXN0clsxXSA9ICdcMCc7Ci0Jd2hpbGUgKHhfYXJnLS0pCi0JCXhfaW5zKHN0cik7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotI2lmbmRlZiBNS1NIX1NNQUxMCi1zdGF0aWMgaW50Ci14X2luc19zdHJpbmcoaW50IGMpCi17Ci0JbWFjcm9wdHIgPSB4X2F0YWJbYyA+PiA4XVtjICYgMjU1XTsKLQkvKgotCSAqIHdlIG5vIGxvbmdlciBuZWVkIHRvIGJvdGhlciBjaGVja2luZyBpZiBtYWNyb3B0ciBpcwotCSAqIG5vdCBOVUxMIGJ1dCBmaXJzdCBjaGFyIGlzIE5VTDsgeF9lX2dldGMoKSBkb2VzIGl0Ci0JICovCi0JcmV0dXJuIChLU1REKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci14X2RvX2lucyhjb25zdCBjaGFyICpjcCwgc2l6ZV90IGxlbikKLXsKLQlpZiAoeGVwICsgbGVuID49IHhlbmQpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JbWVtbW92ZSh4Y3AgKyBsZW4sIHhjcCwgeGVwIC0geGNwICsgMSk7Ci0JbWVtbW92ZSh4Y3AsIGNwLCBsZW4pOwotCXhjcCArPSBsZW47Ci0JeGVwICs9IGxlbjsKLQl4X21vZGlmaWVkKCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAoteF9pbnMoY29uc3QgY2hhciAqcykKLXsKLQljaGFyICpjcCA9IHhjcDsKLQlpbnQgYWRqID0geF9hZGpfZG9uZTsKLQotCWlmICh4X2RvX2lucyhzLCBzdHJsZW4ocykpIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0JLyoKLQkgKiB4X3pvdHMoKSBtYXkgcmVzdWx0IGluIGEgY2FsbCB0byB4X2FkanVzdCgpCi0JICogd2Ugd2FudCB4Y3AgdG8gcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLgotCSAqLwotCXhscF92YWxpZCA9IGZhbHNlOwotCXhfbGFzdGNwKCk7Ci0JeF9hZGpfb2sgPSAoeGNwID49IHhscCk7Ci0JeF96b3RzKGNwKTsKLQlpZiAoYWRqID09IHhfYWRqX2RvbmUpIHsJLyogaGFzIHhfYWRqdXN0KCkgYmVlbiBjYWxsZWQ/ICovCi0JCS8qIG5vICovCi0JCWNwID0geGxwOwotCQl3aGlsZSAoY3AgPiB4Y3ApCi0JCQl4X2JzMygmY3ApOwotCX0KLQlpZiAoeGxwID09IHhlcCAtIDEpCi0JCXhfcmVkcmF3KHh4X2NvbHMpOwotCXhfYWRqX29rID0gMTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci14X2RlbF9iYWNrKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IGkgPSAwOwotCi0JaWYgKHhjcCA9PSB4YnVmKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JZG8gewotCQl4X2dvdG8oeGNwIC0gMSk7Ci0JfSB3aGlsZSAoKCsraSA8IHhfYXJnKSAmJiAoeGNwICE9IHhidWYpKTsKLQl4X2RlbGV0ZShpLCBmYWxzZSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9kZWxfY2hhcihpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKmNwLCAqY3AyOwotCWludCBpID0gMDsKLQotCWNwID0geGNwOwotCXdoaWxlIChpIDwgeF9hcmcpIHsKLQkJdXRmX3B0cmFkangoY3AsIGNwMik7Ci0JCWlmIChjcDIgPiB4ZXApCi0JCQlicmVhazsKLQkJY3AgPSBjcDI7Ci0JCWkrKzsKLQl9Ci0KLQlpZiAoIWkpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl4X2RlbGV0ZShpLCBmYWxzZSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotLyogRGVsZXRlIG5jIGNoYXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIChpbmNsdWRpbmcgY3Vyc29yIHBvc2l0aW9uKSAqLwotc3RhdGljIHZvaWQKLXhfZGVsZXRlKGludCBuYywgaW50IHB1c2gpCi17Ci0JaW50IGksIG5iLCBudzsKLQljaGFyICpjcDsKLQotCWlmIChuYyA9PSAwKQotCQlyZXR1cm47Ci0KLQludyA9IDA7Ci0JY3AgPSB4Y3A7Ci0JZm9yIChpID0gMDsgaSA8IG5jOyArK2kpIHsKLQkJY2hhciAqY3AyOwotCQlpbnQgajsKLQotCQlqID0geF9zaXplMihjcCwgJmNwMik7Ci0JCWlmIChjcDIgPiB4ZXApCi0JCQlicmVhazsKLQkJY3AgPSBjcDI7Ci0JCW53ICs9IGo7Ci0JfQotCW5iID0gY3AgLSB4Y3A7Ci0JLyogbmMgPSBpOyAqLwotCi0JaWYgKHhtcCAhPSBOVUxMICYmIHhtcCA+IHhjcCkgewotCQlpZiAoeGNwICsgbmIgPiB4bXApCi0JCQl4bXAgPSB4Y3A7Ci0JCWVsc2UKLQkJCXhtcCAtPSBuYjsKLQl9Ci0JLyoKLQkgKiBUaGlzIGxldHMgdXMgeWFuayBhIHdvcmQgd2UgaGF2ZSBkZWxldGVkLgotCSAqLwotCWlmIChwdXNoKQotCQl4X3B1c2gobmIpOwotCi0JeGVwIC09IG5iOwotCW1lbW1vdmUoeGNwLCB4Y3AgKyBuYiwgeGVwIC0geGNwICsgMSk7CS8qIENvcGllcyB0aGUgTlVMICovCi0JeF9hZGpfb2sgPSAwOwkJCS8qIGRvbid0IHJlZHJhdyAqLwotCXhscF92YWxpZCA9IGZhbHNlOwotCXhfem90cyh4Y3ApOwotCS8qCi0JICogaWYgd2UgYXJlIGFscmVhZHkgZmlsbGluZyB0aGUgbGluZSwKLQkgKiB0aGVyZSBpcyBubyBuZWVkIHRvICcgJywnXGInLgotCSAqIEJ1dCBpZiB3ZSBtdXN0LCBtYWtlIHN1cmUgd2UgZG8gdGhlIG1pbmltdW0uCi0JICovCi0JaWYgKChpID0geHhfY29scyAtIDIgLSB4X2NvbCkgPiAwIHx8IHhlcCAtIHhscCA9PSAwKSB7Ci0JCW53ID0gaSA9IChudyA8IGkpID8gbncgOiBpOwotCQl3aGlsZSAoaS0tKQotCQkJeF9lX3B1dGMyKCcgJyk7Ci0JCWlmICh4X2NvbCA9PSB4eF9jb2xzIC0gMikgewotCQkJeF9lX3B1dGMyKCh4ZXAgPiB4bHApID8gJz4nIDogKHhicCA+IHhidWYpID8gJzwnIDogJyAnKTsKLQkJCSsrbnc7Ci0JCX0KLQkJd2hpbGUgKG53LS0pCi0JCQl4X2VfcHV0YzIoJ1xiJyk7Ci0JfQotCS8qeF9nb3RvKHhjcCk7Ki8KLQl4X2Fkal9vayA9IDE7Ci0JeGxwX3ZhbGlkID0gZmFsc2U7Ci0JY3AgPSB4X2xhc3RjcCgpOwotCXdoaWxlIChjcCA+IHhjcCkKLQkJeF9iczMoJmNwKTsKLQotCXhfbW9kaWZpZWQoKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZGVsX2J3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9kZWxldGUoeF9id29yZCgpLCB0cnVlKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X212X2J3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9id29yZCgpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfZndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2Z3b3JkKDEpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZGVsX2Z3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9kZWxldGUoeF9md29yZCgwKSwgdHJ1ZSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9id29yZCh2b2lkKQotewotCWludCBuYyA9IDAsIG5iID0gMDsKLQljaGFyICpjcCA9IHhjcDsKLQotCWlmIChjcCA9PSB4YnVmKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0Jd2hpbGUgKHhfYXJnLS0pIHsKLQkJd2hpbGUgKGNwICE9IHhidWYgJiYgaXNfbWZzKGNwWy0xXSkpIHsKLQkJCWNwLS07Ci0JCQluYisrOwotCQl9Ci0JCXdoaWxlIChjcCAhPSB4YnVmICYmICFpc19tZnMoY3BbLTFdKSkgewotCQkJY3AtLTsKLQkJCW5iKys7Ci0JCX0KLQl9Ci0JeF9nb3RvKGNwKTsKLQlmb3IgKGNwID0geGNwOyBjcCA8ICh4Y3AgKyBuYik7ICsrbmMpCi0JCWNwICs9IHV0Zl9wdHJhZGooY3ApOwotCXJldHVybiAobmMpOwotfQotCi1zdGF0aWMgaW50Ci14X2Z3b3JkKGludCBtb3ZlKQotewotCWludCBuYyA9IDA7Ci0JY2hhciAqY3AgPSB4Y3AsICpjcDI7Ci0KLQlpZiAoY3AgPT0geGVwKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0Jd2hpbGUgKHhfYXJnLS0pIHsKLQkJd2hpbGUgKGNwICE9IHhlcCAmJiBpc19tZnMoKmNwKSkKLQkJCWNwKys7Ci0JCXdoaWxlIChjcCAhPSB4ZXAgJiYgIWlzX21mcygqY3ApKQotCQkJY3ArKzsKLQl9Ci0JZm9yIChjcDIgPSB4Y3A7IGNwMiA8IGNwOyArK25jKQotCQljcDIgKz0gdXRmX3B0cmFkaihjcDIpOwotCWlmIChtb3ZlKQotCQl4X2dvdG8oY3ApOwotCXJldHVybiAobmMpOwotfQotCi1zdGF0aWMgdm9pZAoteF9nb3RvKGNoYXIgKmNwKQotewotCWlmIChVVEZNT0RFKQotCQl3aGlsZSAoKGNwID4geGJ1ZikgJiYgKCgqY3AgJiAweEMwKSA9PSAweDgwKSkKLQkJCS0tY3A7Ci0JaWYgKGNwIDwgeGJwIHx8IGNwID49IHV0Zl9za2lwY29scyh4YnAsIHhfZGlzcGxlbikpIHsKLQkJLyogd2UgYXJlIGhlYWRpbmcgb2ZmIHNjcmVlbiAqLwotCQl4Y3AgPSBjcDsKLQkJeF9hZGp1c3QoKTsKLQl9IGVsc2UgaWYgKGNwIDwgeGNwKSB7CQkvKiBtb3ZlIGJhY2sgKi8KLQkJd2hpbGUgKGNwIDwgeGNwKQotCQkJeF9iczMoJnhjcCk7Ci0JfSBlbHNlIGlmIChjcCA+IHhjcCkgewkJLyogbW92ZSBmb3J3YXJkICovCi0JCXdoaWxlIChjcCA+IHhjcCkKLQkJCXhfem90YzMoJnhjcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAoteF9iczMoY2hhciAqKnApCi17Ci0JaW50IGk7Ci0KLQkoKnApLS07Ci0JaWYgKFVURk1PREUpCi0JCXdoaWxlICgoKHVuc2lnbmVkIGNoYXIpKipwICYgMHhDMCkgPT0gMHg4MCkKLQkJCSgqcCktLTsKLQotCWkgPSB4X3NpemUyKCpwLCBOVUxMKTsKLQl3aGlsZSAoaS0tKQotCQl4X2VfcHV0YzIoJ1xiJyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfc2l6ZV9zdHIoY2hhciAqY3ApCi17Ci0JaW50IHNpemUgPSAwOwotCXdoaWxlICgqY3ApCi0JCXNpemUgKz0geF9zaXplMihjcCwgJmNwKTsKLQlyZXR1cm4gKHNpemUpOwotfQotCi1zdGF0aWMgaW50Ci14X3NpemUyKGNoYXIgKmNwLCBjaGFyICoqZGNwKQotewotCWludCBjID0gKih1bnNpZ25lZCBjaGFyICopY3A7Ci0KLQlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKQotCQlyZXR1cm4gKHV0Zl93aWR0aGFkaihjcCwgKGNvbnN0IGNoYXIgKiopZGNwKSk7Ci0JaWYgKGRjcCkKLQkJKmRjcCA9IGNwICsgMTsKLQlpZiAoYyA9PSAnXHQnKQotCQlyZXR1cm4gKDQpOwkvKiBLbHVkZ2UsIHRhYnMgYXJlIGFsd2F5cyBmb3VyIHNwYWNlcy4gKi8KLQlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpCi0JCXJldHVybiAoMik7CS8qIGNvbnRyb2wgdW5zaWduZWQgY2hhciAqLwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X3pvdHMoY2hhciAqc3RyKQotewotCWludCBhZGogPSB4X2Fkal9kb25lOwotCi0JeF9sYXN0Y3AoKTsKLQl3aGlsZSAoKnN0ciAmJiBzdHIgPCB4bHAgJiYgYWRqID09IHhfYWRqX2RvbmUpCi0JCXhfem90YzMoJnN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X3pvdGMyKGludCBjKQotewotCWlmIChjID09ICdcdCcpIHsKLQkJLyogS2x1ZGdlLCB0YWJzIGFyZSBhbHdheXMgZm91ciBzcGFjZXMuICovCi0JCXhfZV9wdXRzKCIgICAgIik7Ci0JfSBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgewotCQl4X2VfcHV0YzIoJ14nKTsKLQkJeF9lX3B1dGMyKFVOQ1RSTChjKSk7Ci0JfSBlbHNlCi0JCXhfZV9wdXRjMihjKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfem90YzMoY2hhciAqKmNwKQotewotCXVuc2lnbmVkIGNoYXIgYyA9ICoqKHVuc2lnbmVkIGNoYXIgKiopY3A7Ci0KLQlpZiAoYyA9PSAnXHQnKSB7Ci0JCS8qIEtsdWRnZSwgdGFicyBhcmUgYWx3YXlzIGZvdXIgc3BhY2VzLiAqLwotCQl4X2VfcHV0cygiICAgICIpOwotCQkoKmNwKSsrOwotCX0gZWxzZSBpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKLQkJeF9lX3B1dGMyKCdeJyk7Ci0JCXhfZV9wdXRjMihVTkNUUkwoYykpOwotCQkoKmNwKSsrOwotCX0gZWxzZQotCQl4X2VfcHV0YzMoKGNvbnN0IGNoYXIgKiopY3ApOwotfQotCi1zdGF0aWMgaW50Ci14X212X2JhY2soaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpZiAoeGNwID09IHhidWYpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl3aGlsZSAoeF9hcmctLSkgewotCQl4X2dvdG8oeGNwIC0gMSk7Ci0JCWlmICh4Y3AgPT0geGJ1ZikKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X212X2ZvcncoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQljaGFyICpjcCA9IHhjcCwgKmNwMjsKLQotCWlmICh4Y3AgPT0geGVwKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0Jd2hpbGUgKHhfYXJnLS0pIHsKLQkJdXRmX3B0cmFkangoY3AsIGNwMik7Ci0JCWlmIChjcDIgPiB4ZXApCi0JCQlicmVhazsKLQkJY3AgPSBjcDI7Ci0JfQotCXhfZ290byhjcCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9zZWFyY2hfY2hhcl9mb3J3KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqY3AgPSB4Y3A7Ci0JY2hhciB0bXBbNF07Ci0KLQkqeGVwID0gJ1wwJzsKLQlpZiAoeF9lX2dldG1iYyh0bXApIDwgMCkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXdoaWxlICh4X2FyZy0tKSB7Ci0JCWlmICgoY3AgPSAoY3AgPT0geGVwKSA/IE5VTEwgOiBzdHJzdHIoY3AgKyAxLCB0bXApKSA9PSBOVUxMICYmCi0JCSAgICAoY3AgPSBzdHJzdHIoeGJ1ZiwgdG1wKSkgPT0gTlVMTCkgewotCQkJeF9lX3B1dGMyKDcpOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCX0KLQl4X2dvdG8oY3ApOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfc2VhcmNoX2NoYXJfYmFjayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKmNwID0geGNwLCAqcCwgdG1wWzRdOwotCWJvb2wgYjsKLQotCWlmICh4X2VfZ2V0bWJjKHRtcCkgPCAwKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JZm9yICg7IHhfYXJnLS07IGNwID0gcCkKLQkJZm9yIChwID0gY3A7IDsgKSB7Ci0JCQlpZiAocC0tID09IHhidWYpCi0JCQkJcCA9IHhlcDsKLQkJCWlmIChwID09IGNwKSB7Ci0JCQkJeF9lX3B1dGMyKDcpOwotCQkJCXJldHVybiAoS1NURCk7Ci0JCQl9Ci0JCQlpZiAoKHRtcFsxXSAmJiAoKHArMSkgPiB4ZXApKSB8fAotCQkJICAgICh0bXBbMl0gJiYgKChwKzIpID4geGVwKSkpCi0JCQkJY29udGludWU7Ci0JCQliID0gdHJ1ZTsKLQkJCWlmICgqcCAhPSB0bXBbMF0pCi0JCQkJYiA9IGZhbHNlOwotCQkJaWYgKGIgJiYgdG1wWzFdICYmIHBbMV0gIT0gdG1wWzFdKQotCQkJCWIgPSBmYWxzZTsKLQkJCWlmIChiICYmIHRtcFsyXSAmJiBwWzJdICE9IHRtcFsyXSkKLQkJCQliID0gZmFsc2U7Ci0JCQlpZiAoYikKLQkJCQlicmVhazsKLQkJfQotCXhfZ290byhjcCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9uZXdsaW5lKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9lX3B1dGMyKCdccicpOwotCXhfZV9wdXRjMignXG4nKTsKLQl4X2ZsdXNoKCk7Ci0JKnhlcCsrID0gJ1xuJzsKLQlyZXR1cm4gKEtFT0wpOwotfQotCi1zdGF0aWMgaW50Ci14X2VuZF9vZl90ZXh0KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF96b3RjMihlZGNoYXJzLmVvZik7Ci0JeF9wdXRjKCdccicpOwotCXhfcHV0YygnXG4nKTsKLQl4X2ZsdXNoKCk7Ci0JcmV0dXJuIChLRU9MKTsKLX0KLQotc3RhdGljIGludAoteF9iZWdfaGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfbG9hZF9oaXN0KGhpc3RvcnkpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZW5kX2hpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2xvYWRfaGlzdChoaXN0cHRyKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X3ByZXZfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9sb2FkX2hpc3QoeF9oaXN0cCAtIHhfYXJnKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X25leHRfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9sb2FkX2hpc3QoeF9oaXN0cCArIHhfYXJnKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi0vKiBHb3RvIGEgcGFydGljdWxhciBoaXN0b3J5IG51bWJlciBvYnRhaW5lZCBmcm9tIGFyZ3VtZW50LgotICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4gaGlzdG9yeSAxIGlzIHByb2JhYmx5IG5vdCB3aGF0IHlvdQotICogd2FudCBzbyB3ZSdsbCBzaW1wbHkgZ28gdG8gdGhlIG9sZGVzdCBvbmUuCi0gKi8KLXN0YXRpYyBpbnQKLXhfZ290b19oaXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaWYgKHhfYXJnX2RlZmF1bHRlZCkKLQkJeF9sb2FkX2hpc3QoaGlzdG9yeSk7Ci0JZWxzZQotCQl4X2xvYWRfaGlzdChoaXN0cHRyICsgeF9hcmcgLSBzb3VyY2UtPmxpbmUpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X2xvYWRfaGlzdChjaGFyICoqaHApCi17Ci0JaW50IG9sZHNpemU7Ci0JY2hhciAqc3AgPSBOVUxMOwotCi0JaWYgKGhwID09IGhpc3RwdHIgKyAxKSB7Ci0JCXNwID0gaG9sZGJ1ZjsKLQkJbW9kaWZpZWQgPSAwOwotCX0gZWxzZSBpZiAoaHAgPCBoaXN0b3J5IHx8IGhwID4gaGlzdHB0cikgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHNwID09IE5VTEwpCi0JCXNwID0gKmhwOwotCXhfaGlzdHAgPSBocDsKLQlvbGRzaXplID0geF9zaXplX3N0cih4YnVmKTsKLQlpZiAobW9kaWZpZWQpCi0JCXN0cmxjcHkoaG9sZGJ1ZiwgeGJ1Ziwgc2l6ZW9mKGhvbGRidWYpKTsKLQlzdHJsY3B5KHhidWYsIHNwLCB4ZW5kIC0geGJ1Zik7Ci0JeGJwID0geGJ1ZjsKLQl4ZXAgPSB4Y3AgPSB4YnVmICsgc3RybGVuKHhidWYpOwotCXhscF92YWxpZCA9IGZhbHNlOwotCWlmICh4ZXAgPD0geF9sYXN0Y3AoKSkgewotCQl4X3JlZHJhdyhvbGRzaXplKTsKLQl9Ci0JeF9nb3RvKHhlcCk7Ci0JbW9kaWZpZWQgPSAwOwotfQotCi1zdGF0aWMgaW50Ci14X25sX25leHRfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9uZXh0Y21kID0gc291cmNlLT5saW5lIC0gKGhpc3RwdHIgLSB4X2hpc3RwKSArIDE7Ci0JcmV0dXJuICh4X25ld2xpbmUoJ1xuJykpOwotfQotCi1zdGF0aWMgaW50Ci14X2VvdF9kZWwoaW50IGMpCi17Ci0JaWYgKHhlcCA9PSB4YnVmICYmIHhfYXJnX2RlZmF1bHRlZCkKLQkJcmV0dXJuICh4X2VuZF9vZl90ZXh0KGMpKTsKLQllbHNlCi0JCXJldHVybiAoeF9kZWxfY2hhcihjKSk7Ci19Ci0KLS8qIHJldmVyc2UgaW5jcmVtZW50YWwgaGlzdG9yeSBzZWFyY2ggKi8KLXN0YXRpYyBpbnQKLXhfc2VhcmNoX2hpc3QoaW50IGMpCi17Ci0JaW50IG9mZnNldCA9IC0xOwkvKiBvZmZzZXQgb2YgbWF0Y2ggaW4geGJ1ZiwgZWxzZSAtMSAqLwotCWNoYXIgcGF0WzI1NiArIDFdOwkvKiBwYXR0ZXJuIGJ1ZmZlciAqLwotCWNoYXIgKnAgPSBwYXQ7Ci0JdW5zaWduZWQgY2hhciBmOwotCi0JKnAgPSAnXDAnOwotCXdoaWxlICgxKSB7Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl4X2VfcHV0cygiXG5JLXNlYXJjaDogIik7Ci0JCQl4X2VfcHV0cyhwYXQpOwotCQl9Ci0JCXhfZmx1c2goKTsKLQkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQotCQkJcmV0dXJuIChLU1REKTsKLQkJZiA9IHhfdGFiWzBdW2NdOwotCQlpZiAoYyA9PSBDVFJMKCdbJykpIHsKLQkJCWlmICgoZiAmIDB4N0YpID09IFhGVU5DX21ldGExKSB7Ci0JCQkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQotCQkJCQlyZXR1cm4gKEtTVEQpOwotCQkJCWYgPSB4X3RhYlsxXVtjXSAmIDB4N0Y7Ci0JCQkJaWYgKGYgPT0gWEZVTkNfbWV0YTEgfHwgZiA9PSBYRlVOQ19tZXRhMikKLQkJCQkJeF9tZXRhMShDVFJMKCdbJykpOwotCQkJCXhfZV91bmdldGMoYyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWlmIChmICYgMHg4MCkgewotCQkJZiAmPSAweDdGOwotCQkJaWYgKChjID0geF9lX2dldGMoKSkgIT0gJ34nKQotCQkJCXhfZV91bmdldGMoYyk7Ci0JCX0KLSNlbmRpZgotCQlpZiAoZiA9PSBYRlVOQ19zZWFyY2hfaGlzdCkKLQkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMCwgb2Zmc2V0KTsKLQkJZWxzZSBpZiAoZiA9PSBYRlVOQ19kZWxfYmFjaykgewotCQkJaWYgKHAgPT0gcGF0KSB7Ci0JCQkJb2Zmc2V0ID0gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocCA+IHBhdCkKLQkJCQkqLS1wID0gJ1wwJzsKLQkJCWlmIChwID09IHBhdCkKLQkJCQlvZmZzZXQgPSAtMTsKLQkJCWVsc2UKLQkJCQlvZmZzZXQgPSB4X3NlYXJjaChwYXQsIDEsIG9mZnNldCk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChmID09IFhGVU5DX2luc2VydCkgewotCQkJLyogYWRkIGNoYXIgdG8gcGF0dGVybiAqLwotCQkJLyogb3ZlcmZsb3cgY2hlY2suLi4gKi8KLQkJCWlmIChwID49ICZwYXRbc2l6ZW9mKHBhdCkgLSAxXSkgewotCQkJCXhfZV9wdXRjMig3KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCSpwKysgPSBjLCAqcCA9ICdcMCc7Ci0JCQlpZiAob2Zmc2V0ID49IDApIHsKLQkJCQkvKiBhbHJlYWR5IGhhdmUgcGFydGlhbCBtYXRjaCAqLwotCQkJCW9mZnNldCA9IHhfbWF0Y2goeGJ1ZiwgcGF0KTsKLQkJCQlpZiAob2Zmc2V0ID49IDApIHsKLQkJCQkJeF9nb3RvKHhidWYgKyBvZmZzZXQgKyAocCAtIHBhdCkgLQotCQkJCQkgICAgKCpwYXQgPT0gJ14nKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMCwgb2Zmc2V0KTsKLQkJfSBlbHNlIGlmIChmID09IFhGVU5DX2Fib3J0KSB7Ci0JCQlpZiAob2Zmc2V0ID49IDApCi0JCQkJeF9sb2FkX2hpc3QoaGlzdHB0ciArIDEpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7IC8qIG90aGVyIGNvbW1hbmQgKi8KLQkJCXhfZV91bmdldGMoYyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAob2Zmc2V0IDwgMCkKLQkJeF9yZWRyYXcoLTEpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLS8qIHNlYXJjaCBiYWNrd2FyZCBmcm9tIGN1cnJlbnQgbGluZSAqLwotc3RhdGljIGludAoteF9zZWFyY2goY2hhciAqcGF0LCBpbnQgc2FtZWxpbmUsIGludCBvZmZzZXQpCi17Ci0JY2hhciAqKmhwOwotCWludCBpOwotCi0JZm9yIChocCA9IHhfaGlzdHAgLSAoc2FtZWxpbmUgPyAwIDogMSk7IGhwID49IGhpc3Rvcnk7IC0taHApIHsKLQkJaSA9IHhfbWF0Y2goKmhwLCBwYXQpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlpZiAob2Zmc2V0IDwgMCkKLQkJCQl4X2VfcHV0YzIoJ1xuJyk7Ci0JCQl4X2xvYWRfaGlzdChocCk7Ci0JCQl4X2dvdG8oeGJ1ZiArIGkgKyBzdHJsZW4ocGF0KSAtICgqcGF0ID09ICdeJykpOwotCQkJcmV0dXJuIChpKTsKLQkJfQotCX0KLQl4X2VfcHV0YzIoNyk7Ci0JeF9oaXN0cCA9IGhpc3RwdHI7Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotLyogYW5jaG9yZWQgc2VhcmNoIHVwIGZyb20gY3VycmVudCBsaW5lICovCi1zdGF0aWMgaW50Ci14X3NlYXJjaF9oaXN0X3VwKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuICh4X3NlYXJjaF9kaXIoLTEpKTsKLX0KLQotLyogYW5jaG9yZWQgc2VhcmNoIGRvd24gZnJvbSBjdXJyZW50IGxpbmUgKi8KLXN0YXRpYyBpbnQKLXhfc2VhcmNoX2hpc3RfZG4oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKHhfc2VhcmNoX2RpcigxKSk7Ci19Ci0KLS8qIGFuY2hvcmVkIHNlYXJjaCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbiAqLwotc3RhdGljIGludAoteF9zZWFyY2hfZGlyKGludCBzZWFyY2hfZGlyIC8qIHNob3VsZCd2ZSBiZWVuIGJvb2wgKi8pCi17Ci0JY2hhciAqKmhwID0geF9oaXN0cCArIHNlYXJjaF9kaXI7Ci0Jc2l6ZV90IGN1cnMgPSB4Y3AgLSB4YnVmOwotCi0Jd2hpbGUgKGhpc3RwdHIgPj0gaHAgJiYgaHAgPj0gaGlzdG9yeSkgewotCQlpZiAoc3RybmNtcCh4YnVmLCAqaHAsIGN1cnMpID09IDApIHsKLQkJCXhfbG9hZF9oaXN0KGhwKTsKLQkJCXhfZ290byh4YnVmICsgY3Vycyk7Ci0JCQlicmVhazsKLQkJfQotCQlocCArPSBzZWFyY2hfZGlyOwotCX0KLQlyZXR1cm4gKEtTVEQpOwotfQotI2VuZGlmCi0KLS8qIHJldHVybiBwb3NpdGlvbiBvZiBmaXJzdCBtYXRjaCBvZiBwYXR0ZXJuIGluIHN0cmluZywgZWxzZSAtMSAqLwotc3RhdGljIGludAoteF9tYXRjaChjaGFyICpzdHIsIGNoYXIgKnBhdCkKLXsKLQlpZiAoKnBhdCA9PSAnXicpIHsKLQkJcmV0dXJuICgoc3RybmNtcChzdHIsIHBhdCArIDEsIHN0cmxlbihwYXQgKyAxKSkgPT0gMCkgPyAwIDogLTEpOwotCX0gZWxzZSB7Ci0JCWNoYXIgKnEgPSBzdHJzdHIoc3RyLCBwYXQpOwotCQlyZXR1cm4gKChxID09IE5VTEwpID8gLTEgOiBxIC0gc3RyKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZGVsX2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgaSwgajsKLQotCSp4ZXAgPSAwOwotCWkgPSB4ZXAgLSB4YnVmOwotCWogPSB4X3NpemVfc3RyKHhidWYpOwotCXhjcCA9IHhidWY7Ci0JeF9wdXNoKGkpOwotCXhscCA9IHhicCA9IHhlcCA9IHhidWY7Ci0JeGxwX3ZhbGlkID0gdHJ1ZTsKLQkqeGNwID0gMDsKLQl4bXAgPSBOVUxMOwotCXhfcmVkcmF3KGopOwotCXhfbW9kaWZpZWQoKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X212X2VuZChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhfZ290byh4ZXApOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbXZfYmVnaW4oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2dvdG8oeGJ1Zik7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9kcmF3X2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X3JlZHJhdygtMSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9lX3JlYnVpbGRsaW5lKGNvbnN0IGNoYXIgKmNscnN0cikKLXsKLQlzaGZfcHV0cyhjbHJzdHIsIHNobF9vdXQpOwotCXhfYWRqdXN0KCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9jbHMoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKHhfZV9yZWJ1aWxkbGluZShNS1NIX0NMU19TVFJJTkcpKTsKLX0KLQotLyogUmVkcmF3IChwYXJ0IG9mKSB0aGUgbGluZS4gSWYgbGltaXQgaXMgPCAwLCB0aGUgZXZlcnl0aGluZyBpcyByZWRyYXduCi0gKiBvbiBhIE5FVyBsaW5lLCBvdGhlcndpc2UgbGltaXQgaXMgdGhlIHNjcmVlbiBjb2x1bW4gdXAgdG8gd2hpY2ggbmVlZHMKLSAqIHJlZHJhd2luZy4KLSAqLwotc3RhdGljIHZvaWQKLXhfcmVkcmF3KGludCBsaW1pdCkKLXsKLQlpbnQgaSwgaiwgeF90cnVuYyA9IDA7Ci0JY2hhciAqY3A7Ci0KLQl4X2Fkal9vayA9IDA7Ci0JaWYgKGxpbWl0ID09IC0xKQotCQl4X2VfcHV0YzIoJ1xuJyk7Ci0JZWxzZQotCQl4X2VfcHV0YzIoJ1xyJyk7Ci0JeF9mbHVzaCgpOwotCWlmICh4YnAgPT0geGJ1ZikgewotCQl4X2NvbCA9IHByb21wdGxlbihwcm9tcHQpOwotCQlpZiAoeF9jb2wgPj0geHhfY29scykKLQkJCXhfdHJ1bmMgPSAoeF9jb2wgLyB4eF9jb2xzKSAqIHh4X2NvbHM7Ci0JCWlmIChwcm9tcHRfcmVkcmF3KQotCQkJcHByb21wdChwcm9tcHQsIHhfdHJ1bmMpOwotCX0KLQlpZiAoeF9jb2wgPj0geHhfY29scykKLQkJeF9jb2wgJT0geHhfY29sczsKLQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMiAtIHhfY29sOwotCWlmICh4X2Rpc3BsZW4gPCAxKSB7Ci0JCXhfY29sID0gMDsKLQkJeF9kaXNwbGVuID0geHhfY29scyAtIDI7Ci0JfQotCXhscF92YWxpZCA9IGZhbHNlOwotCXhfbGFzdGNwKCk7Ci0JeF96b3RzKHhicCk7Ci0JaWYgKHhicCAhPSB4YnVmIHx8IHhlcCA+IHhscCkKLQkJbGltaXQgPSB4eF9jb2xzOwotCWlmIChsaW1pdCA+PSAwKSB7Ci0JCWlmICh4ZXAgPiB4bHApCi0JCQlpID0gMDsJCQkvKiB3ZSBmaWxsIHRoZSBsaW5lICovCi0JCWVsc2UgewotCQkJY2hhciAqY3BsID0geGJwOwotCi0JCQlpID0gbGltaXQ7Ci0JCQl3aGlsZSAoY3BsIDwgeGxwKQotCQkJCWkgLT0geF9zaXplMihjcGwsICZjcGwpOwotCQl9Ci0KLQkJaiA9IDA7Ci0JCXdoaWxlICgoaiA8IGkpIHx8ICh4X2NvbCA8ICh4eF9jb2xzIC0gMikpKSB7Ci0JCQlpZiAoISh4X2NvbCA8ICh4eF9jb2xzIC0gMikpKQotCQkJCWJyZWFrOwotCQkJeF9lX3B1dGMyKCcgJyk7Ci0JCQlqKys7Ci0JCX0KLQkJaSA9ICcgJzsKLQkJaWYgKHhlcCA+IHhscCkgewkJLyogbW9yZSBvZmYgc2NyZWVuICovCi0JCQlpZiAoeGJwID4geGJ1ZikKLQkJCQlpID0gJyonOwotCQkJZWxzZQotCQkJCWkgPSAnPic7Ci0JCX0gZWxzZSBpZiAoeGJwID4geGJ1ZikKLQkJCWkgPSAnPCc7Ci0JCXhfZV9wdXRjMihpKTsKLQkJaisrOwotCQl3aGlsZSAoai0tKQotCQkJeF9lX3B1dGMyKCdcYicpOwotCX0KLQljcCA9IHhscDsKLQl3aGlsZSAoY3AgPiB4Y3ApCi0JCXhfYnMzKCZjcCk7Ci0JeF9hZGpfb2sgPSAxOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludAoteF90cmFuc3Bvc2UoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl1bnNpZ25lZCBpbnQgdG1wYSwgdG1wYjsKLQotCS8qIFdoYXQgdHJhbnNwb3NlIGlzIG1lYW50IHRvIGRvIHNlZW1zIHRvIGJlIHVwIGZvciBkZWJhdGUuIFRoaXMKLQkgKiBpcyBhIGdlbmVyYWwgc3VtbWFyeSBvZiB0aGUgb3B0aW9uczsgdGhlIHRleHQgaXMgYWJjZCB3aXRoIHRoZQotCSAqIHVwcGVyIGNhc2UgY2hhcmFjdGVyIG9yIHVuZGVyc2NvcmUgaW5kaWNhdGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uOgotCSAqCVdobwkJCUJlZm9yZQlBZnRlcglCZWZvcmUJQWZ0ZXIKLQkgKglBVCZUIGtzaCBpbiBlbWFjcyBtb2RlOglhYkNkCWFiZEMJYWJjZF8JKGJlbGwpCi0JICoJQVQmVCBrc2ggaW4gZ21hY3MgbW9kZToJYWJDZAliYUNkCWFiY2RfCWFiZGNfCi0JICoJZ251IGVtYWNzOgkJYWJDZAlhY2JECWFiY2RfCWFiZGNfCi0JICogUGRrc2ggY3VycmVudGx5IGdvZXMgd2l0aCBHTlUgYmVoYXZpb3Igc2luY2UgSSBiZWxpZXZlIHRoaXMgaXMgdGhlCi0JICogbW9zdCBjb21tb24gdmVyc2lvbiBvZiBlbWFjcywgdW5sZXNzIGluIGdtYWNzIG1vZGUsIGluIHdoaWNoIGNhc2UKLQkgKiBpdCBkb2VzIHRoZSBBVCZUIGtzaCBnbWFjcyBtb2RlLgotCSAqIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBicm9rZW4gdXAgaW50byAzIGZ1bmN0aW9ucyBzbyB1c2VycyBjYW4gYmluZAotCSAqIHRvIHRoZSBvbmUgdGhleSB3YW50LgotCSAqLwotCWlmICh4Y3AgPT0geGJ1ZikgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfSBlbHNlIGlmICh4Y3AgPT0geGVwIHx8IEZsYWcoRkdNQUNTKSkgewotCQlpZiAoeGNwIC0geGJ1ZiA9PSAxKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCS8qIEdvc2xpbmcvVW5pcHJlc3MgZW1hY3Mgc3R5bGU6IFN3YXAgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHRoZQotCQkgKiBjdXJzb3IsIGRvIG5vdCBjaGFuZ2UgY3Vyc29yIHBvc2l0aW9uCi0JCSAqLwotCQl4X2JzMygmeGNwKTsKLQkJaWYgKHV0Zl9tYnRvd2MoJnRtcGEsIHhjcCkgPT0gKHNpemVfdCktMSkgewotCQkJeF9lX3B1dGMyKDcpOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCQl4X2JzMygmeGNwKTsKLQkJaWYgKHV0Zl9tYnRvd2MoJnRtcGIsIHhjcCkgPT0gKHNpemVfdCktMSkgewotCQkJeF9lX3B1dGMyKDcpOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCQl1dGZfd2N0b21iKHhjcCwgdG1wYSk7Ci0JCXhfem90YzMoJnhjcCk7Ci0JCXV0Zl93Y3RvbWIoeGNwLCB0bXBiKTsKLQkJeF96b3RjMygmeGNwKTsKLQl9IGVsc2UgewotCQkvKiBHTlUgZW1hY3Mgc3R5bGU6IFN3YXAgdGhlIGNoYXJhY3RlcnMgYmVmb3JlIGFuZCB1bmRlciB0aGUKLQkJICogY3Vyc29yLCBtb3ZlIGN1cnNvciBwb3NpdGlvbiBhbG9uZyBvbmUuCi0JCSAqLwotCQlpZiAodXRmX21idG93YygmdG1wYSwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCXhfYnMzKCZ4Y3ApOwotCQlpZiAodXRmX21idG93YygmdG1wYiwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7Ci0JCQl4X2VfcHV0YzIoNyk7Ci0JCQlyZXR1cm4gKEtTVEQpOwotCQl9Ci0JCXV0Zl93Y3RvbWIoeGNwLCB0bXBhKTsKLQkJeF96b3RjMygmeGNwKTsKLQkJdXRmX3djdG9tYih4Y3AsIHRtcGIpOwotCQl4X3pvdGMzKCZ4Y3ApOwotCX0KLQl4X21vZGlmaWVkKCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9saXRlcmFsKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9jdXJwcmVmaXggPSAtMTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X21ldGExKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9jdXJwcmVmaXggPSAxOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbWV0YTIoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQl4X2N1cnByZWZpeCA9IDI7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9raWxsKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IGNvbCA9IHhjcCAtIHhidWY7Ci0JaW50IGxhc3Rjb2wgPSB4ZXAgLSB4YnVmOwotCWludCBuZGVsOwotCi0JaWYgKHhfYXJnX2RlZmF1bHRlZCkKLQkJeF9hcmcgPSBsYXN0Y29sOwotCWVsc2UgaWYgKHhfYXJnID4gbGFzdGNvbCkKLQkJeF9hcmcgPSBsYXN0Y29sOwotCW5kZWwgPSB4X2FyZyAtIGNvbDsKLQlpZiAobmRlbCA8IDApIHsKLQkJeF9nb3RvKHhidWYgKyB4X2FyZyk7Ci0JCW5kZWwgPSAtbmRlbDsKLQl9Ci0JeF9kZWxldGUobmRlbCwgdHJ1ZSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfcHVzaChpbnQgbmNoYXJzKQotewotCWNoYXIgKmNwOwotCi0Jc3RybmR1cHgoY3AsIHhjcCwgbmNoYXJzLCBBRURJVCk7Ci0JaWYgKGtpbGxzdGFja1traWxsc3BdKQotCQlhZnJlZShraWxsc3RhY2tba2lsbHNwXSwgQUVESVQpOwotCWtpbGxzdGFja1traWxsc3BdID0gY3A7Ci0Ja2lsbHNwID0gKGtpbGxzcCArIDEpICUgS0lMTFNJWkU7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfeWFuayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWlmIChraWxsc3AgPT0gMCkKLQkJa2lsbHRwID0gS0lMTFNJWkU7Ci0JZWxzZQotCQlraWxsdHAgPSBraWxsc3A7Ci0Ja2lsbHRwLS07Ci0JaWYgKGtpbGxzdGFja1traWxsdHBdID09IDApIHsKLQkJeF9lX3B1dHMoIlxubm90aGluZyB0byB5YW5rIik7Ci0JCXhfcmVkcmF3KC0xKTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JeG1wID0geGNwOwotCXhfaW5zKGtpbGxzdGFja1traWxsdHBdKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X21ldGFfeWFuayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWludCBsZW47Ci0KLQlpZiAoKHhfbGFzdF9jb21tYW5kICE9IFhGVU5DX3lhbmsgJiYgeF9sYXN0X2NvbW1hbmQgIT0gWEZVTkNfbWV0YV95YW5rKSB8fAotCSAgICBraWxsc3RhY2tba2lsbHRwXSA9PSAwKSB7Ci0JCWtpbGx0cCA9IGtpbGxzcDsKLQkJeF9lX3B1dHMoIlxueWFuayBzb21ldGhpbmcgZmlyc3QiKTsKLQkJeF9yZWRyYXcoLTEpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQlsZW4gPSBzdHJsZW4oa2lsbHN0YWNrW2tpbGx0cF0pOwotCXhfZ290byh4Y3AgLSBsZW4pOwotCXhfZGVsZXRlKGxlbiwgZmFsc2UpOwotCWRvIHsKLQkJaWYgKGtpbGx0cCA9PSAwKQotCQkJa2lsbHRwID0gS0lMTFNJWkUgLSAxOwotCQllbHNlCi0JCQlraWxsdHAtLTsKLQl9IHdoaWxlIChraWxsc3RhY2tba2lsbHRwXSA9PSAwKTsKLQl4X2lucyhraWxsc3RhY2tba2lsbHRwXSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9hYm9ydChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCS8qIHhfem90YyhjKTsgKi8KLQl4bHAgPSB4ZXAgPSB4Y3AgPSB4YnAgPSB4YnVmOwotCXhscF92YWxpZCA9IHRydWU7Ci0JKnhjcCA9IDA7Ci0JeF9tb2RpZmllZCgpOwotCXJldHVybiAoS0lOVFIpOwotfQotCi1zdGF0aWMgaW50Ci14X2Vycm9yKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JeF9lX3B1dGMyKDcpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotLyogc3BlY2lhbCBWVDEwMCBzdHlsZSBrZXkgc2VxdWVuY2UgaGFjayAqLwotc3RhdGljIGludAoteF92dF9oYWNrKGludCBjKQotewotCS8qIHdlIG9ubHkgc3VwcG9ydCBQRjItJzEnIGZvciBub3cgKi8KLQlpZiAoYyAhPSAoMiA8PCA4IHwgJzEnKSkKLQkJcmV0dXJuICh4X2Vycm9yKGMpKTsKLQotCS8qIHdoYXQncyB0aGUgbmV4dCBjaGFyYWN0ZXI/ICovCi0Jc3dpdGNoICgoYyA9IHhfZV9nZXRjKCkpKSB7Ci0JY2FzZSAnfic6Ci0JCXhfYXJnID0gMTsKLQkJeF9hcmdfZGVmYXVsdGVkID0gMTsKLQkJcmV0dXJuICh4X212X2JlZ2luKDApKTsKLQljYXNlICc7JzoKLQkJLyogImludGVyZXN0aW5nIiBzZXF1ZW5jZSBkZXRlY3RlZCAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIHVud2luZF9lcnI7Ci0JfQotCi0JLyogWFhYIHhfZV91bmdldGMgaXMgb25lLW9jdGV0IG9ubHkgKi8KLQlpZiAoKGMgPSB4X2VfZ2V0YygpKSAhPSAnNScgJiYgYyAhPSAnMycpCi0JCWdvdG8gdW53aW5kX2VycjsKLQotCS8qLQotCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgcmVhZCB0aGUgZm9sbG93aW5nIG9jdGV0cyBzbyBmYXI6Ci0JICogLSBFU0MrWyBvciBFU0MrTyBvciBDdHJsLVggKFByw6ZmaXggMikKLQkgKiAtIDEgKHZ0X2hhY2spCi0JICogLSA7Ci0JICogLSA1IChDdHJsIGtleSBjb21iaW5lcikgb3IgMyAoQWx0IGtleSBjb21iaW5lcikKLQkgKiBXZSBjYW4gbm93IGFjY2VwdCBvbmUgbW9yZSBvY3RldCBkZXNpZ25hdGluZyB0aGUga2V5LgotCSAqLwotCi0Jc3dpdGNoICgoYyA9IHhfZV9nZXRjKCkpKSB7Ci0JY2FzZSAnQyc6Ci0JCXJldHVybiAoeF9tdl9md29yZChjKSk7Ci0JY2FzZSAnRCc6Ci0JCXJldHVybiAoeF9tdl9id29yZChjKSk7Ci0JfQotCi0gdW53aW5kX2VycjoKLQl4X2VfdW5nZXRjKGMpOwotCXJldHVybiAoeF9lcnJvcihjKSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgoteF9tYXBpbihjb25zdCBjaGFyICpjcCwgQXJlYSAqYXApCi17Ci0JY2hhciAqbmV3cywgKm9wOwotCi0JLyogZm9yIGNsYW5nJ3Mgc3RhdGljIGFuYWx5c2VyLCB0aGUgbm9ubnVsbCBhdHRyaWJ1dGUgaXNuJ3QgZW5vdWdoICovCi0JbWtzc2VydChjcCAhPSBOVUxMKTsKLQotCXN0cmR1cHgobmV3cywgY3AsIGFwKTsKLQlvcCA9IG5ld3M7Ci0Jd2hpbGUgKCpjcCkgewotCQkvKiBYWFggLS0gc2hvdWxkIGhhbmRsZSBcXiBlc2NhcGU/ICovCi0JCWlmICgqY3AgPT0gJ14nKSB7Ci0JCQljcCsrOwotCQkJaWYgKCpjcCA+PSAnPycpCS8qIGluY2x1ZGVzICc/JzsgQVNDSUkgKi8KLQkJCQkqb3ArKyA9IENUUkwoKmNwKTsKLQkJCWVsc2UgewotCQkJCSpvcCsrID0gJ14nOwotCQkJCWNwLS07Ci0JCQl9Ci0JCX0gZWxzZQotCQkJKm9wKysgPSAqY3A7Ci0JCWNwKys7Ci0JfQotCSpvcCA9ICdcMCc7Ci0KLQlyZXR1cm4gKG5ld3MpOwotfQotCi1zdGF0aWMgdm9pZAoteF9tYXBvdXQyKGludCBjLCBjaGFyICoqYnVmKQotewotCWNoYXIgKnAgPSAqYnVmOwotCi0JaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7Ci0JCSpwKysgPSAnXic7Ci0JCSpwKysgPSBVTkNUUkwoYyk7Ci0JfSBlbHNlCi0JCSpwKysgPSBjOwotCSpwID0gMDsKLQkqYnVmID0gcDsKLX0KLQotc3RhdGljIGNoYXIgKgoteF9tYXBvdXQoaW50IGMpCi17Ci0Jc3RhdGljIGNoYXIgYnVmWzhdOwotCWNoYXIgKmJwID0gYnVmOwotCi0JeF9tYXBvdXQyKGMsICZicCk7Ci0JcmV0dXJuIChidWYpOwotfQotCi1zdGF0aWMgdm9pZAoteF9wcmludChpbnQgcHJlZml4LCBpbnQga2V5KQotewotCWludCBmID0geF90YWJbcHJlZml4XVtrZXldOwotCi0JaWYgKHByZWZpeCkKLQkJLyogcHJlZml4ID09IDEgfHwgcHJlZml4ID09IDIgKi8KLQkJc2hmX3B1dHMoeF9tYXBvdXQocHJlZml4ID09IDEgPwotCQkgICAgQ1RSTCgnWycpIDogQ1RSTCgnWCcpKSwgc2hsX3N0ZG91dCk7Ci0jaWZkZWYgTUtTSF9TTUFMTAotCXNocHJpbnRmKCIlcyA9ICIsIHhfbWFwb3V0KGtleSkpOwotI2Vsc2UKLQlzaHByaW50ZigiJXMlcyA9ICIsIHhfbWFwb3V0KGtleSksIChmICYgMHg4MCkgPyAifiIgOiAiIik7Ci0JaWYgKFhGVU5DX1ZBTFVFKGYpICE9IFhGVU5DX2luc19zdHJpbmcpCi0jZW5kaWYKLQkJc2hwcmludGYoIiVzXG4iLCB4X2Z0YWJbWEZVTkNfVkFMVUUoZildLnhmX25hbWUpOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JZWxzZQotCQlzaHByaW50ZigiJyVzJ1xuIiwgeF9hdGFiW3ByZWZpeF1ba2V5XSk7Ci0jZW5kaWYKLX0KLQotaW50Ci14X2JpbmQoY29uc3QgY2hhciAqYTEsIGNvbnN0IGNoYXIgKmEyLAotI2lmbmRlZiBNS1NIX1NNQUxMCi0gICAgYm9vbCBtYWNybywJCQkvKiBiaW5kIC1tICovCi0jZW5kaWYKLSAgICBib29sIGxpc3QpCQkJLyogYmluZCAtbCAqLwotewotCXVuc2lnbmVkIGNoYXIgZjsKLQlpbnQgcHJlZml4LCBrZXk7Ci0JY2hhciAqbTEsICptMjsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCWNoYXIgKnNwID0gTlVMTDsKLQlib29sIGhhc3RpbGRlOwotI2VuZGlmCi0KLQlpZiAoeF90YWIgPT0gTlVMTCkgewotCQliaV9lcnJvcmYoImNhbm5vdCBiaW5kLCBub3QgYSB0dHkiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JLyogTGlzdCBmdW5jdGlvbiBuYW1lcyAqLwotCWlmIChsaXN0KSB7Ci0JCWZvciAoZiA9IDA7IGYgPCBORUxFTSh4X2Z0YWIpOyBmKyspCi0JCQlpZiAoeF9mdGFiW2ZdLnhmX25hbWUgJiYKLQkJCSAgICAhKHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX05PQklORCkpCi0JCQkJc2hwcmludGYoIiVzXG4iLCB4X2Z0YWJbZl0ueGZfbmFtZSk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChhMSA9PSBOVUxMKSB7Ci0JCWZvciAocHJlZml4ID0gMDsgcHJlZml4IDwgWF9OVEFCUzsgcHJlZml4KyspCi0JCQlmb3IgKGtleSA9IDA7IGtleSA8IFhfVEFCU1o7IGtleSsrKSB7Ci0JCQkJZiA9IFhGVU5DX1ZBTFVFKHhfdGFiW3ByZWZpeF1ba2V5XSk7Ci0JCQkJaWYgKGYgPT0gWEZVTkNfaW5zZXJ0IHx8IGYgPT0gWEZVTkNfZXJyb3IKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQkJCSAgICB8fCAobWFjcm8gJiYgZiAhPSBYRlVOQ19pbnNfc3RyaW5nKQotI2VuZGlmCi0JCQkJICAgICkKLQkJCQkJY29udGludWU7Ci0JCQkJeF9wcmludChwcmVmaXgsIGtleSk7Ci0JCQl9Ci0JCXJldHVybiAoMCk7Ci0JfQotCW0yID0gbTEgPSB4X21hcGluKGExLCBBVEVNUCk7Ci0JcHJlZml4ID0gMDsKLQlmb3IgKDs7IG0xKyspIHsKLQkJa2V5ID0gKHVuc2lnbmVkIGNoYXIpKm0xOwotCQlmID0gWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKTsKLQkJaWYgKGYgPT0gWEZVTkNfbWV0YTEpCi0JCQlwcmVmaXggPSAxOwotCQllbHNlIGlmIChmID09IFhGVU5DX21ldGEyKQotCQkJcHJlZml4ID0gMjsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCWlmICgqKyttMQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JICAgICYmICgoKm0xICE9ICd+JykgfHwgKihtMSArIDEpKQotI2VuZGlmCi0JICAgICkgewotCQljaGFyIG1zZ1syNTZdID0gImtleSBzZXF1ZW5jZSAnIjsKLQkJY29uc3QgY2hhciAqYyA9IGExOwotCQltMSA9IG1zZyArIHN0cmxlbihtc2cpOwotCQl3aGlsZSAoKmMgJiYgbTEgPCAobXNnICsgc2l6ZW9mKG1zZykgLSAzKSkKLQkJCXhfbWFwb3V0MigqYysrLCAmbTEpOwotCQliaV9lcnJvcmYoIiVzJyB0b28gbG9uZyIsIG1zZyk7Ci0JCXJldHVybiAoMSk7Ci0JfQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JaGFzdGlsZGUgPSAqbTE7Ci0jZW5kaWYKLQlhZnJlZShtMiwgQVRFTVApOwotCi0JaWYgKGEyID09IE5VTEwpIHsKLQkJeF9wcmludChwcmVmaXgsIGtleSk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmICgqYTIgPT0gMCkgewotCQlmID0gWEZVTkNfaW5zZXJ0OwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JfSBlbHNlIGlmIChtYWNybykgewotCQlmID0gWEZVTkNfaW5zX3N0cmluZzsKLQkJc3AgPSB4X21hcGluKGEyLCBBRURJVCk7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQlmb3IgKGYgPSAwOyBmIDwgTkVMRU0oeF9mdGFiKTsgZisrKQotCQkJaWYgKHhfZnRhYltmXS54Zl9uYW1lICYmCi0JCQkgICAgc3RyY21wKHhfZnRhYltmXS54Zl9uYW1lLCBhMikgPT0gMCkKLQkJCQlicmVhazsKLQkJaWYgKGYgPT0gTkVMRU0oeF9mdGFiKSB8fCB4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9OT0JJTkQpIHsKLQkJCWJpX2Vycm9yZigiJXM6IG5vIHN1Y2ggZnVuY3Rpb24iLCBhMik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfQotCi0jaWZuZGVmIE1LU0hfU01BTEwKLQlpZiAoWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKSA9PSBYRlVOQ19pbnNfc3RyaW5nICYmCi0JICAgIHhfYXRhYltwcmVmaXhdW2tleV0pCi0JCWFmcmVlKHhfYXRhYltwcmVmaXhdW2tleV0sIEFFRElUKTsKLSNlbmRpZgotCXhfdGFiW3ByZWZpeF1ba2V5XSA9IGYKLSNpZm5kZWYgTUtTSF9TTUFMTAotCSAgICB8IChoYXN0aWxkZSA/IDB4ODAgOiAwKQotI2VuZGlmCi0JICAgIDsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCXhfYXRhYltwcmVmaXhdW2tleV0gPSBzcDsKLSNlbmRpZgotCi0JLyogVHJhY2sgd2hhdCB0aGUgdXNlciBoYXMgYm91bmQgc28geF9tb2RlKHRydWUpIHdvbid0IHRvYXN0IHRoaW5ncyAqLwotCWlmIChmID09IFhGVU5DX2luc2VydCkKLQkJeF9ib3VuZFsocHJlZml4ICogWF9UQUJTWiArIGtleSkgLyA4XSAmPQotCQkgICAgfigxIDw8ICgocHJlZml4ICogWF9UQUJTWiArIGtleSkgJSA4KSk7Ci0JZWxzZQotCQl4X2JvdW5kWyhwcmVmaXggKiBYX1RBQlNaICsga2V5KSAvIDhdIHw9Ci0JCSAgICAoMSA8PCAoKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpICUgOCkpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfaW5pdF9lbWFjcyh2b2lkKQotewotCWludCBpLCBqOwotCi0JYWluaXQoQUVESVQpOwotCXhfbmV4dGNtZCA9IC0xOwotCi0JeF90YWIgPSBhbGxvYyhYX05UQUJTICogc2l6ZW9mKCp4X3RhYiksIEFFRElUKTsKLQlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQotCQl4X3RhYlswXVtqXSA9IFhGVU5DX2luc2VydDsKLQlmb3IgKGkgPSAxOyBpIDwgWF9OVEFCUzsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQotCQkJeF90YWJbaV1bal0gPSBYRlVOQ19lcnJvcjsKLQlmb3IgKGkgPSAwOyBpIDwgKGludClORUxFTSh4X2RlZmJpbmRpbmdzKTsgaSsrKQotCQl4X3RhYlt4X2RlZmJpbmRpbmdzW2ldLnhkYl90YWJdW3hfZGVmYmluZGluZ3NbaV0ueGRiX2NoYXJdCi0JCSAgICA9IHhfZGVmYmluZGluZ3NbaV0ueGRiX2Z1bmM7Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCXhfYXRhYiA9IGFsbG9jKFhfTlRBQlMgKiBzaXplb2YoKnhfYXRhYiksIEFFRElUKTsKLQlmb3IgKGkgPSAxOyBpIDwgWF9OVEFCUzsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQotCQkJeF9hdGFiW2ldW2pdID0gTlVMTDsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotYmluZF9pZl9ub3RfYm91bmQoaW50IHAsIGludCBrLCBpbnQgZnVuYykKLXsKLQkvKiBIYXMgdXNlciBhbHJlYWR5IGJvdW5kIHRoaXMga2V5PyBJZiBzbywgZG9uJ3Qgb3ZlcnJpZGUgaXQgKi8KLQlpZiAoeF9ib3VuZFsoKHApICogWF9UQUJTWiArIChrKSkgLyA4XSAmCi0JICAgICgxIDw8ICgoKHApICogWF9UQUJTWiArIChrKSkgJSA4KSkpCi0JCXJldHVybjsKLQotCXhfdGFiW3BdW2tdID0gZnVuYzsKLX0KLQotc3RhdGljIGludAoteF9zZXRfbWFyayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXhtcCA9IHhjcDsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2tpbGxfcmVnaW9uKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IHJzaXplOwotCWNoYXIgKnhyOwotCi0JaWYgKHhtcCA9PSBOVUxMKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuIChLU1REKTsKLQl9Ci0JaWYgKHhtcCA+IHhjcCkgewotCQlyc2l6ZSA9IHhtcCAtIHhjcDsKLQkJeHIgPSB4Y3A7Ci0JfSBlbHNlIHsKLQkJcnNpemUgPSB4Y3AgLSB4bXA7Ci0JCXhyID0geG1wOwotCX0KLQl4X2dvdG8oeHIpOwotCXhfZGVsZXRlKHJzaXplLCB0cnVlKTsKLQl4bXAgPSB4cjsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X3hjaGdfcG9pbnRfbWFyayhpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKnRtcDsKLQotCWlmICh4bXAgPT0gTlVMTCkgewotCQl4X2VfcHV0YzIoNyk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXRtcCA9IHhtcDsKLQl4bXAgPSB4Y3A7Ci0JeF9nb3RvKHRtcCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9ub29wKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotLyoKLSAqCUZpbGUvY29tbWFuZCBuYW1lIGNvbXBsZXRpb24gcm91dGluZXMKLSAqLwotc3RhdGljIGludAoteF9jb21wX2NvbW0oaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORCwgQ1RfQ09NUExFVEUpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfbGlzdF9jb21tKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JZG9fY29tcGxldGUoWENGX0NPTU1BTkQsIENUX0xJU1QpOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfY29tcGxldGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9DT01QTEVURSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9lbnVtZXJhdGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9MSVNUKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotCi1zdGF0aWMgaW50Ci14X2NvbXBfZmlsZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWRvX2NvbXBsZXRlKFhDRl9GSUxFLCBDVF9DT01QTEVURSk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9saXN0X2ZpbGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfRklMRSwgQ1RfTElTVCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9jb21wX2xpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9DT01QTElTVCk7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF9leHBhbmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQljaGFyICoqd29yZHM7Ci0JaW50IHN0YXJ0LCBlbmQsIG53b3JkcywgaTsKLQlib29sIGlzX2NvbW1hbmQ7Ci0KLQlud29yZHMgPSB4X2NmX2dsb2IoWENGX0ZJTEUsIHhidWYsIHhlcCAtIHhidWYsIHhjcCAtIHhidWYsCi0JICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7Ci0KLQlpZiAobndvcmRzID09IDApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl4X2dvdG8oeGJ1ZiArIHN0YXJ0KTsKLQl4X2RlbGV0ZShlbmQgLSBzdGFydCwgZmFsc2UpOwotCWZvciAoaSA9IDA7IGkgPCBud29yZHM7KSB7Ci0JCWlmICh4X2VzY2FwZSh3b3Jkc1tpXSwgc3RybGVuKHdvcmRzW2ldKSwgeF9kb19pbnMpIDwgMCB8fAotCQkgICAgKCsraSA8IG53b3JkcyAmJiB4X2lucygiICIpIDwgMCkpIHsKLQkJCXhfZV9wdXRjMig3KTsKLQkJCXJldHVybiAoS1NURCk7Ci0JCX0KLQl9Ci0JeF9hZGp1c3QoKTsKLQotCXJldHVybiAoS1NURCk7Ci19Ci0KLS8qIHR5cGUgPT0gMCBmb3IgbGlzdCwgMSBmb3IgY29tcGxldGUgYW5kIDIgZm9yIGNvbXBsZXRlLWxpc3QgKi8KLXN0YXRpYyB2b2lkCi1kb19jb21wbGV0ZShpbnQgZmxhZ3MsCS8qIFhDRl97Q09NTUFORCxGSUxFLENPTU1BTkRfRklMRX0gKi8KLSAgICBDb21wX3R5cGUgdHlwZSkKLXsKLQljaGFyICoqd29yZHM7Ci0JaW50IHN0YXJ0LCBlbmQsIG5sZW4sIG9sZW4sIG53b3JkczsKLQlib29sIGlzX2NvbW1hbmQsIGNvbXBsZXRlZCA9IGZhbHNlOwotCi0JbndvcmRzID0geF9jZl9nbG9iKGZsYWdzLCB4YnVmLCB4ZXAgLSB4YnVmLCB4Y3AgLSB4YnVmLAotCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOwotCS8qIG5vIG1hdGNoICovCi0JaWYgKG53b3JkcyA9PSAwKSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodHlwZSA9PSBDVF9MSVNUKSB7Ci0JCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKLQkJeF9yZWRyYXcoMCk7Ci0JCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKLQkJcmV0dXJuOwotCX0KLQlvbGVuID0gZW5kIC0gc3RhcnQ7Ci0JbmxlbiA9IHhfbG9uZ2VzdF9wcmVmaXgobndvcmRzLCB3b3Jkcyk7Ci0JLyogY29tcGxldGUgKi8KLQlpZiAobndvcmRzID09IDEgfHwgbmxlbiA+IG9sZW4pIHsKLQkJeF9nb3RvKHhidWYgKyBzdGFydCk7Ci0JCXhfZGVsZXRlKG9sZW4sIGZhbHNlKTsKLQkJeF9lc2NhcGUod29yZHNbMF0sIG5sZW4sIHhfZG9faW5zKTsKLQkJeF9hZGp1c3QoKTsKLQkJY29tcGxldGVkID0gdHJ1ZTsKLQl9Ci0JLyogYWRkIHNwYWNlIGlmIHNpbmdsZSBub24tZGlyIG1hdGNoICovCi0JaWYgKG53b3JkcyA9PSAxICYmIHdvcmRzWzBdW25sZW4gLSAxXSAhPSAnLycpIHsKLQkJeF9pbnMoIiAiKTsKLQkJY29tcGxldGVkID0gdHJ1ZTsKLQl9Ci0JaWYgKHR5cGUgPT0gQ1RfQ09NUExJU1QgJiYgIWNvbXBsZXRlZCkgewotCQl4X3ByaW50X2V4cGFuc2lvbnMobndvcmRzLCB3b3JkcywgaXNfY29tbWFuZCk7Ci0JCWNvbXBsZXRlZCA9IHRydWU7Ci0JfQotCWlmIChjb21wbGV0ZWQpCi0JCXhfcmVkcmF3KDApOwotCi0JeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOwotfQotCi0vKiBOQU1FOgotICoJeF9hZGp1c3QgLSByZWRyYXcgdGhlIGxpbmUgYWRqdXN0aW5nIHN0YXJ0aW5nIHBvaW50IGV0Yy4KLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBleGNlZWRlZCB0aGUgYm91bmRzCi0gKglvZiB0aGUgZWRpdCB3aW5kb3cuIEl0IGluY3JlbWVudHMgeF9hZGpfZG9uZSBzbyB0aGF0Ci0gKglmdW5jdGlvbnMgbGlrZSB4X2lucyBhbmQgeF9kZWxldGUga25vdyB0aGF0IHdlIGhhdmUgYmVlbgotICoJY2FsbGVkIGFuZCBjYW4gc2tpcCB0aGUgeF9icygpIHN0dWZmIHdoaWNoIGhhcyBhbHJlYWR5Ci0gKgliZWVuIGRvbmUgYnkgeF9yZWRyYXcuCi0gKgotICogUkVUVVJOIFZBTFVFOgotICoJTm9uZQotICovCi1zdGF0aWMgdm9pZAoteF9hZGp1c3Qodm9pZCkKLXsKLQl4X2Fkal9kb25lKys7CQkJLyogZmxhZyB0aGUgZmFjdCB0aGF0IHdlIHdlcmUgY2FsbGVkLiAqLwotCS8qCi0JICogd2UgaGFkIGEgcHJvYmxlbSBpZiB0aGUgcHJvbXB0IGxlbmd0aCA+IHh4X2NvbHMgLyAyCi0JICovCi0JaWYgKCh4YnAgPSB4Y3AgLSAoeF9kaXNwbGVuIC8gMikpIDwgeGJ1ZikKLQkJeGJwID0geGJ1ZjsKLQlpZiAoVVRGTU9ERSkKLQkJd2hpbGUgKCh4YnAgPiB4YnVmKSAmJiAoKCp4YnAgJiAweEMwKSA9PSAweDgwKSkKLQkJCS0teGJwOwotCXhscF92YWxpZCA9IGZhbHNlOwotCXhfcmVkcmF3KHh4X2NvbHMpOwotCXhfZmx1c2goKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfZV91bmdldGMoaW50IGMpCi17Ci0JdW5nZXRfY2hhciA9IGMgPCAwID8gLTEgOiAoYyAmIDI1NSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXhfZV9nZXRjKHZvaWQpCi17Ci0JaW50IGM7Ci0KLQlpZiAodW5nZXRfY2hhciA+PSAwKSB7Ci0JCWMgPSB1bmdldF9jaGFyOwotCQl1bmdldF9jaGFyID0gLTE7Ci0JCXJldHVybiAoYyk7Ci0JfQotCi0jaWZuZGVmIE1LU0hfU01BTEwKLQlpZiAobWFjcm9wdHIpIHsKLQkJaWYgKChjID0gKHVuc2lnbmVkIGNoYXIpKm1hY3JvcHRyKyspKQotCQkJcmV0dXJuIChjKTsKLQkJbWFjcm9wdHIgPSBOVUxMOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuICh4X2dldGMoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi14X2VfcHV0YzIoaW50IGMpCi17Ci0JaW50IHdpZHRoID0gMTsKLQotCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCQl4X2NvbCA9IDA7Ci0JaWYgKHhfY29sIDwgeHhfY29scykgewotCQlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKSB7Ci0JCQljaGFyIHV0Zl90bXBbM107Ci0JCQlzaXplX3QgeDsKLQotCQkJaWYgKGMgPCAweEEwKQotCQkJCWMgPSAweEZGRkQ7Ci0JCQl4ID0gdXRmX3djdG9tYih1dGZfdG1wLCBjKTsKLQkJCXhfcHV0Yyh1dGZfdG1wWzBdKTsKLQkJCWlmICh4ID4gMSkKLQkJCQl4X3B1dGModXRmX3RtcFsxXSk7Ci0JCQlpZiAoeCA+IDIpCi0JCQkJeF9wdXRjKHV0Zl90bXBbMl0pOwotCQkJd2lkdGggPSB1dGZfd2N3aWR0aChjKTsKLQkJfSBlbHNlCi0JCQl4X3B1dGMoYyk7Ci0JCXN3aXRjaCAoYykgewotCQljYXNlIDc6Ci0JCQlicmVhazsKLQkJY2FzZSAnXHInOgotCQljYXNlICdcbic6Ci0JCQlicmVhazsKLQkJY2FzZSAnXGInOgotCQkJeF9jb2wtLTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJeF9jb2wgKz0gd2lkdGg7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoeF9hZGpfb2sgJiYgKHhfY29sIDwgMCB8fCB4X2NvbCA+PSAoeHhfY29scyAtIDIpKSkKLQkJeF9hZGp1c3QoKTsKLX0KLQotc3RhdGljIHZvaWQKLXhfZV9wdXRjMyhjb25zdCBjaGFyICoqY3ApCi17Ci0JaW50IHdpZHRoID0gMSwgYyA9ICoqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopY3A7Ci0KLQlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQkJeF9jb2wgPSAwOwotCWlmICh4X2NvbCA8IHh4X2NvbHMpIHsKLQkJaWYgKFVURk1PREUgJiYgKGMgPiAweDdGKSkgewotCQkJY2hhciAqY3AyOwotCi0JCQl3aWR0aCA9IHV0Zl93aWR0aGFkaigqY3AsIChjb25zdCBjaGFyICoqKSZjcDIpOwotCQkJd2hpbGUgKCpjcCA8IGNwMikKLQkJCQl4X3B1dGNmKCooKmNwKSsrKTsKLQkJfSBlbHNlIHsKLQkJCSgqY3ApKys7Ci0JCQl4X3B1dGMoYyk7Ci0JCX0KLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgNzoKLQkJCWJyZWFrOwotCQljYXNlICdccic6Ci0JCWNhc2UgJ1xuJzoKLQkJCWJyZWFrOwotCQljYXNlICdcYic6Ci0JCQl4X2NvbC0tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl4X2NvbCArPSB3aWR0aDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICh4X2Fkal9vayAmJiAoeF9jb2wgPCAwIHx8IHhfY29sID49ICh4eF9jb2xzIC0gMikpKQotCQl4X2FkanVzdCgpOwotfQotCi1zdGF0aWMgdm9pZAoteF9lX3B1dHMoY29uc3QgY2hhciAqcykKLXsKLQlpbnQgYWRqID0geF9hZGpfZG9uZTsKLQotCXdoaWxlICgqcyAmJiBhZGogPT0geF9hZGpfZG9uZSkKLQkJeF9lX3B1dGMzKCZzKTsKLX0KLQotLyogTkFNRToKLSAqCXhfc2V0X2FyZyAtIHNldCBhbiBhcmcgdmFsdWUgZm9yIG5leHQgZnVuY3Rpb24KLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCVRoaXMgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgTS1bMC05XS4KLSAqCi0gKiBSRVRVUk4gVkFMVUU6Ci0gKglLU1RECi0gKi8KLXN0YXRpYyBpbnQKLXhfc2V0X2FyZyhpbnQgYykKLXsKLQlpbnQgbiA9IDAsIGZpcnN0ID0gMTsKLQotCWMgJj0gMjU1OwkvKiBzdHJpcCBjb21tYW5kIHByZWZpeCAqLwotCWZvciAoOyBjID49IDAgJiYga3NoX2lzZGlnaXQoYyk7IGMgPSB4X2VfZ2V0YygpLCBmaXJzdCA9IDApCi0JCW4gPSBuICogMTAgKyAoYyAtICcwJyk7Ci0JaWYgKGMgPCAwIHx8IGZpcnN0KSB7Ci0JCXhfZV9wdXRjMig3KTsKLQkJeF9hcmcgPSAxOwotCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOwotCX0gZWxzZSB7Ci0JCXhfZV91bmdldGMoYyk7Ci0JCXhfYXJnID0gbjsKLQkJeF9hcmdfZGVmYXVsdGVkID0gMDsKLQl9Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotLyogQ29tbWVudCBvciB1bmNvbW1lbnQgdGhlIGN1cnJlbnQgbGluZS4gKi8KLXN0YXRpYyBpbnQKLXhfY29tbWVudChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWludCBvbGRzaXplID0geF9zaXplX3N0cih4YnVmKTsKLQlpbnQgbGVuID0geGVwIC0geGJ1ZjsKLQlpbnQgcmV0ID0geF9kb19jb21tZW50KHhidWYsIHhlbmQgLSB4YnVmLCAmbGVuKTsKLQotCWlmIChyZXQgPCAwKQotCQl4X2VfcHV0YzIoNyk7Ci0JZWxzZSB7Ci0JCXhfbW9kaWZpZWQoKTsKLQkJeGVwID0geGJ1ZiArIGxlbjsKLQkJKnhlcCA9ICdcMCc7Ci0JCXhjcCA9IHhicCA9IHhidWY7Ci0JCXhfcmVkcmF3KG9sZHNpemUpOwotCQlpZiAocmV0ID4gMCkKLQkJCXJldHVybiAoeF9uZXdsaW5lKCdcbicpKTsKLQl9Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotc3RhdGljIGludAoteF92ZXJzaW9uKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JY2hhciAqb194YnVmID0geGJ1ZiwgKm9feGVuZCA9IHhlbmQ7Ci0JY2hhciAqb194YnAgPSB4YnAsICpvX3hlcCA9IHhlcCwgKm9feGNwID0geGNwOwotCWludCB2bGVuLCBsaW0gPSB4X2xhc3RjcCgpIC0geGJwOwotCWNoYXIgKnY7Ci0KLQlzdHJkdXB4KHYsIEtTSF9WRVJTSU9OLCBBVEVNUCk7Ci0KLQl4YnVmID0geGJwID0geGNwID0gdjsKLQl4ZW5kID0geGVwID0gdiArICh2bGVuID0gc3RybGVuKHYpKTsKLQl4X3JlZHJhdyhsaW0pOwotCXhfZmx1c2goKTsKLQotCWMgPSB4X2VfZ2V0YygpOwotCXhidWYgPSBvX3hidWY7Ci0JeGVuZCA9IG9feGVuZDsKLQl4YnAgPSBvX3hicDsKLQl4ZXAgPSBvX3hlcDsKLQl4Y3AgPSBvX3hjcDsKLQl4X3JlZHJhdyh2bGVuKTsKLQotCWlmIChjIDwgMCkKLQkJcmV0dXJuIChLU1REKTsKLQkvKiBUaGlzIGlzIHdoYXQgQVQmVCBrc2ggc2VlbXMgdG8gZG8uLi4gVmVyeSBiaXphcnJlICovCi0JaWYgKGMgIT0gJyAnKQotCQl4X2VfdW5nZXRjKGMpOwotCi0JYWZyZWUodiwgQVRFTVApOwotCXJldHVybiAoS1NURCk7Ci19Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotc3RhdGljIGludAoteF9lZGl0X2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKLXsKLQlpZiAoeF9hcmdfZGVmYXVsdGVkKSB7Ci0JCWlmICh4ZXAgPT0geGJ1ZikgewotCQkJeF9lX3B1dGMyKDcpOwotCQkJcmV0dXJuIChLU1REKTsKLQkJfQotCQlpZiAobW9kaWZpZWQpIHsKLQkJCSp4ZXAgPSAnXDAnOwotCQkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgeGJ1ZiwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl4X2FyZyA9IDA7Ci0JCX0gZWxzZQotCQkJeF9hcmcgPSBzb3VyY2UtPmxpbmUgLSAoaGlzdHB0ciAtIHhfaGlzdHApOwotCX0KLQlpZiAoeF9hcmcpCi0JCXNoZl9zbnByaW50Zih4YnVmLCB4ZW5kIC0geGJ1ZiwgIiVzICVkIiwKLQkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLCB4X2FyZyk7Ci0JZWxzZQotCQlzdHJsY3B5KHhidWYsICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLCB4ZW5kIC0geGJ1Zik7Ci0JeGVwID0geGJ1ZiArIHN0cmxlbih4YnVmKTsKLQlyZXR1cm4gKHhfbmV3bGluZSgnXG4nKSk7Ci19Ci0jZW5kaWYKLQotLyogTkFNRToKLSAqCXhfcHJldl9oaXN0d29yZCAtIHJlY292ZXIgd29yZCBmcm9tIHByZXYgY29tbWFuZAotICoKLSAqIERFU0NSSVBUSU9OOgotICoJVGhpcyBmdW5jdGlvbiByZWNvdmVycyB0aGUgbGFzdCB3b3JkIGZyb20gdGhlIHByZXZpb3VzCi0gKgljb21tYW5kIGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIGN1cnJlbnQgZWRpdCBsaW5lLiBJZiBhCi0gKgludW1lcmljIGFyZyBpcyBzdXBwbGllZCB0aGVuIHRoZSBuJ3RoIHdvcmQgZnJvbSB0aGUKLSAqCXN0YXJ0IG9mIHRoZSBwcmV2aW91cyBjb21tYW5kIGlzIHVzZWQuCi0gKglBcyBhIHNpZGUgZWZmZWN0LCB0cmFzaGVzIHRoZSBtYXJrIGluIG9yZGVyIHRvIGFjaGlldmUKLSAqCWJlaW5nIGNhbGxlZCBpbiBhIHJlcGVhdGFibGUgZmFzaGlvbi4KLSAqCi0gKglCb3VuZCB0byBNLS4KLSAqCi0gKiBSRVRVUk4gVkFMVUU6Ci0gKglLU1RECi0gKi8KLXN0YXRpYyBpbnQKLXhfcHJldl9oaXN0d29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCWNoYXIgKnJjcCwgKmNwOwotCWNoYXIgKip4aHA7Ci0JaW50IG07Ci0KLQlpZiAoeG1wICYmIG1vZGlmaWVkID4gMSkKLQkJeF9raWxsX3JlZ2lvbigwKTsKLQltID0gbW9kaWZpZWQgPyBtb2RpZmllZCA6IDE7Ci0JeGhwID0gaGlzdHB0ciAtIChtIC0gMSk7Ci0JaWYgKCh4aHAgPCBoaXN0b3J5KSB8fCAhKGNwID0gKnhocCkpIHsKLQkJeF9lX3B1dGMyKDcpOwotCQl4X21vZGlmaWVkKCk7Ci0JCXJldHVybiAoS1NURCk7Ci0JfQotCXhfc2V0X21hcmsoMCk7Ci0JaWYgKHhfYXJnX2RlZmF1bHRlZCkgewotCQlyY3AgPSAmY3Bbc3RybGVuKGNwKSAtIDFdOwotCQkvKgotCQkgKiBpZ25vcmUgd2hpdGUtc3BhY2UgYWZ0ZXIgdGhlIGxhc3Qgd29yZAotCQkgKi8KLQkJd2hpbGUgKHJjcCA+IGNwICYmIGlzX2NmcygqcmNwKSkKLQkJCXJjcC0tOwotCQl3aGlsZSAocmNwID4gY3AgJiYgIWlzX2NmcygqcmNwKSkKLQkJCXJjcC0tOwotCQlpZiAoaXNfY2ZzKCpyY3ApKQotCQkJcmNwKys7Ci0JCXhfaW5zKHJjcCk7Ci0JfSBlbHNlIHsKLQkJY2hhciBjaDsKLQotCQlyY3AgPSBjcDsKLQkJLyoKLQkJICogaWdub3JlIHdoaXRlLXNwYWNlIGF0IHN0YXJ0IG9mIGxpbmUKLQkJICovCi0JCXdoaWxlICgqcmNwICYmIGlzX2NmcygqcmNwKSkKLQkJCXJjcCsrOwotCQl3aGlsZSAoeF9hcmctLSA+IDEpIHsKLQkJCXdoaWxlICgqcmNwICYmICFpc19jZnMoKnJjcCkpCi0JCQkJcmNwKys7Ci0JCQl3aGlsZSAoKnJjcCAmJiBpc19jZnMoKnJjcCkpCi0JCQkJcmNwKys7Ci0JCX0KLQkJY3AgPSByY3A7Ci0JCXdoaWxlICgqcmNwICYmICFpc19jZnMoKnJjcCkpCi0JCQlyY3ArKzsKLQkJY2ggPSAqcmNwOwotCQkqcmNwID0gJ1wwJzsKLQkJeF9pbnMoY3ApOwotCQkqcmNwID0gY2g7Ci0JfQotCW1vZGlmaWVkID0gbSArIDE7Ci0JcmV0dXJuIChLU1REKTsKLX0KLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0vKiBVcHBlcmNhc2UgTigxKSB3b3JkcyAqLwotc3RhdGljIGludAoteF9mb2xkX3VwcGVyKGludCBjIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuICh4X2ZvbGRfY2FzZSgnVScpKTsKLX0KLQotLyogTG93ZXJjYXNlIE4oMSkgd29yZHMgKi8KLXN0YXRpYyBpbnQKLXhfZm9sZF9sb3dlcihpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXJldHVybiAoeF9mb2xkX2Nhc2UoJ0wnKSk7Ci19Ci0KLS8qIExvd2VyY2FzZSBOKDEpIHdvcmRzICovCi1zdGF0aWMgaW50Ci14X2ZvbGRfY2FwaXRhbGlzZShpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCXJldHVybiAoeF9mb2xkX2Nhc2UoJ0MnKSk7Ci19Ci0KLS8qIE5BTUU6Ci0gKgl4X2ZvbGRfY2FzZSAtIGNvbnZlcnQgd29yZCB0byBVUFBFUi9sb3dlci9DYXBpdGFsIGNhc2UKLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbXBsZW1lbnQgTS1VLE0tdSxNLUwsTS1sLE0tQyBhbmQgTS1jCi0gKgl0byBVUFBFUiBjYXNlLCBsb3dlciBjYXNlIG9yIENhcGl0YWxpc2Ugd29yZHMuCi0gKgotICogUkVUVVJOIFZBTFVFOgotICoJTm9uZQotICovCi1zdGF0aWMgaW50Ci14X2ZvbGRfY2FzZShpbnQgYykKLXsKLQljaGFyICpjcCA9IHhjcDsKLQotCWlmIChjcCA9PSB4ZXApIHsKLQkJeF9lX3B1dGMyKDcpOwotCQlyZXR1cm4gKEtTVEQpOwotCX0KLQl3aGlsZSAoeF9hcmctLSkgewotCQkvKgotCQkgKiBmaXJzdCBza2lwIG92ZXIgYW55IHdoaXRlLXNwYWNlCi0JCSAqLwotCQl3aGlsZSAoY3AgIT0geGVwICYmIGlzX21mcygqY3ApKQotCQkJY3ArKzsKLQkJLyoKLQkJICogZG8gdGhlIGZpcnN0IGNoYXIgb24gaXRzIG93biBzaW5jZSBpdCBtYXkgYmUKLQkJICogYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gZm9yIHRoZSByZXN0LgotCQkgKi8KLQkJaWYgKGNwICE9IHhlcCkgewotCQkJaWYgKGMgPT0gJ0wnKQkJLyogbG93ZXJjYXNlICovCi0JCQkJKmNwID0ga3NoX3RvbG93ZXIoKmNwKTsKLQkJCWVsc2UJCQkvKiB1cHBlcmNhc2UsIGNhcGl0YWxpc2UgKi8KLQkJCQkqY3AgPSBrc2hfdG91cHBlcigqY3ApOwotCQkJY3ArKzsKLQkJfQotCQkvKgotCQkgKiBub3cgZm9yIHRoZSByZXN0IG9mIHRoZSB3b3JkCi0JCSAqLwotCQl3aGlsZSAoY3AgIT0geGVwICYmICFpc19tZnMoKmNwKSkgewotCQkJaWYgKGMgPT0gJ1UnKQkJLyogdXBwZXJjYXNlICovCi0JCQkJKmNwID0ga3NoX3RvdXBwZXIoKmNwKTsKLQkJCWVsc2UJCQkvKiBsb3dlcmNhc2UsIGNhcGl0YWxpc2UgKi8KLQkJCQkqY3AgPSBrc2hfdG9sb3dlcigqY3ApOwotCQkJY3ArKzsKLQkJfQotCX0KLQl4X2dvdG8oY3ApOwotCXhfbW9kaWZpZWQoKTsKLQlyZXR1cm4gKEtTVEQpOwotfQotI2VuZGlmCi0KLS8qIE5BTUU6Ci0gKgl4X2xhc3RjcCAtIGxhc3QgdmlzaWJsZSBjaGFyCi0gKgotICogU1lOT1BTSVM6Ci0gKgl4X2xhc3RjcCgpCi0gKgotICogREVTQ1JJUFRJT046Ci0gKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoYXQgY2hhciBpbiB0aGUKLSAqCWVkaXQgYnVmZmVyIHRoYXQgd2lsbCBiZSB0aGUgbGFzdCBkaXNwbGF5ZWQgb24gdGhlCi0gKglzY3JlZW4uIFRoZSBzZXF1ZW5jZToKLSAqCi0gKgljcCA9IHhfbGFzdGNwKCk7Ci0gKgl3aGlsZSAoY3AgPiB4Y3ApCi0gKgkJeF9iczMoJmNwKTsKLSAqCi0gKglXaWxsIHBvc2l0aW9uIHRoZSBjdXJzb3IgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4uCi0gKgotICogUkVUVVJOIFZBTFVFOgotICoJY3Agb3IgTlVMTAotICovCi1zdGF0aWMgY2hhciAqCi14X2xhc3RjcCh2b2lkKQotewotCWlmICgheGxwX3ZhbGlkKSB7Ci0JCWludCBpID0gMCwgajsKLQkJY2hhciAqeGxwMjsKLQotCQl4bHAgPSB4YnA7Ci0JCXdoaWxlICh4bHAgPCB4ZXApIHsKLQkJCWogPSB4X3NpemUyKHhscCwgJnhscDIpOwotCQkJaWYgKChpICsgaikgPiB4X2Rpc3BsZW4pCi0JCQkJYnJlYWs7Ci0JCQlpICs9IGo7Ci0JCQl4bHAgPSB4bHAyOwotCQl9Ci0JfQotCXhscF92YWxpZCA9IHRydWU7Ci0JcmV0dXJuICh4bHApOwotfQotCi1zdGF0aWMgYm9vbAoteF9tb2RlKGJvb2wgb25vZmYpCi17Ci0Jc3RhdGljIGJvb2wgeF9jdXJfbW9kZTsKLQlib29sIHByZXY7Ci0KLQlpZiAoeF9jdXJfbW9kZSA9PSBvbm9mZikKLQkJcmV0dXJuICh4X2N1cl9tb2RlKTsKLQlwcmV2ID0geF9jdXJfbW9kZTsKLQl4X2N1cl9tb2RlID0gb25vZmY7Ci0KLQlpZiAob25vZmYpIHsKLQkJc3RydWN0IHRlcm1pb3MgY2I7Ci0KLQkJY2IgPSB0dHlfc3RhdGU7Ci0KLQkJZWRjaGFycy5lcmFzZSA9IGNiLmNfY2NbVkVSQVNFXTsKLQkJZWRjaGFycy5raWxsID0gY2IuY19jY1tWS0lMTF07Ci0JCWVkY2hhcnMuaW50ciA9IGNiLmNfY2NbVklOVFJdOwotCQllZGNoYXJzLnF1aXQgPSBjYi5jX2NjW1ZRVUlUXTsKLQkJZWRjaGFycy5lb2YgPSBjYi5jX2NjW1ZFT0ZdOwotI2lmZGVmIFZXRVJBU0UKLQkJZWRjaGFycy53ZXJhc2UgPSBjYi5jX2NjW1ZXRVJBU0VdOwotI2VuZGlmCi0JCWNiLmNfaWZsYWcgJj0gfihJTkxDUiB8IElDUk5MKTsKLQkJY2IuY19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04gfCBFQ0hPKTsKLSNpZiBkZWZpbmVkKFZMTkVYVCkgJiYgZGVmaW5lZChfUE9TSVhfVkRJU0FCTEUpCi0JCS8qIG9zZi8xIHByb2Nlc3NlcyBsbmV4dCB3aGVuIH5pY2Fub24gKi8KLQkJY2IuY19jY1tWTE5FWFRdID0gX1BPU0lYX1ZESVNBQkxFOwotI2VuZGlmCi0JCS8qIHN1bm9zIDQuMS54ICYgb3NmLzEgcHJvY2Vzc2VzIGRpc2NhcmQoZmx1c2gpIHdoZW4gfmljYW5vbiAqLwotI2lmIGRlZmluZWQoVkRJU0NBUkQpICYmIGRlZmluZWQoX1BPU0lYX1ZESVNBQkxFKQotCQljYi5jX2NjW1ZESVNDQVJEXSA9IF9QT1NJWF9WRElTQUJMRTsKLSNlbmRpZgotCQljYi5jX2NjW1ZUSU1FXSA9IDA7Ci0JCWNiLmNfY2NbVk1JTl0gPSAxOwotCi0JCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJmNiKTsKLQotI2lmZGVmIF9QT1NJWF9WRElTQUJMRQotCQkvKiBDb252ZXJ0IHVuc2V0IHZhbHVlcyB0byBpbnRlcm5hbCAndW5zZXQnIHZhbHVlICovCi0JCWlmIChlZGNoYXJzLmVyYXNlID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMuZXJhc2UgPSAtMTsKLQkJaWYgKGVkY2hhcnMua2lsbCA9PSBfUE9TSVhfVkRJU0FCTEUpCi0JCQllZGNoYXJzLmtpbGwgPSAtMTsKLQkJaWYgKGVkY2hhcnMuaW50ciA9PSBfUE9TSVhfVkRJU0FCTEUpCi0JCQllZGNoYXJzLmludHIgPSAtMTsKLQkJaWYgKGVkY2hhcnMucXVpdCA9PSBfUE9TSVhfVkRJU0FCTEUpCi0JCQllZGNoYXJzLnF1aXQgPSAtMTsKLQkJaWYgKGVkY2hhcnMuZW9mID09IF9QT1NJWF9WRElTQUJMRSkKLQkJCWVkY2hhcnMuZW9mID0gLTE7Ci0JCWlmIChlZGNoYXJzLndlcmFzZSA9PSBfUE9TSVhfVkRJU0FCTEUpCi0JCQllZGNoYXJzLndlcmFzZSA9IC0xOwotI2VuZGlmCi0KLQkJaWYgKGVkY2hhcnMuZXJhc2UgPj0gMCkgewotCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5lcmFzZSwgWEZVTkNfZGVsX2JhY2spOwotCQkJYmluZF9pZl9ub3RfYm91bmQoMSwgZWRjaGFycy5lcmFzZSwgWEZVTkNfZGVsX2J3b3JkKTsKLQkJfQotCQlpZiAoZWRjaGFycy5raWxsID49IDApCi0JCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmtpbGwsIFhGVU5DX2RlbF9saW5lKTsKLQkJaWYgKGVkY2hhcnMud2VyYXNlID49IDApCi0JCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLndlcmFzZSwgWEZVTkNfZGVsX2J3b3JkKTsKLQkJaWYgKGVkY2hhcnMuaW50ciA+PSAwKQotCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5pbnRyLCBYRlVOQ19hYm9ydCk7Ci0JCWlmIChlZGNoYXJzLnF1aXQgPj0gMCkKLQkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMucXVpdCwgWEZVTkNfbm9vcCk7Ci0JfSBlbHNlCi0JCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7Ci0KLQlyZXR1cm4gKHByZXYpOwotfQotCi0jaWYgIU1LU0hfU19OT1ZJCi0vKiArKysgdmkgZWRpdGluZyBtb2RlICsrKyAqLwotCi0jZGVmaW5lIEN0cmwoYykJCShjJjB4MWYpCi0KLXN0cnVjdCBlZHN0YXRlIHsKLQljaGFyICpjYnVmOwotCWludCB3aW5sZWZ0OwotCWludCBjYnVmc2l6ZTsKLQlpbnQgbGluZWxlbjsKLQlpbnQgY3Vyc29yOwotfTsKLQotc3RhdGljIGludCB2aV9ob29rKGludCk7Ci1zdGF0aWMgaW50IG5leHRzdGF0ZShpbnQpOwotc3RhdGljIGludCB2aV9pbnNlcnQoaW50KTsKLXN0YXRpYyBpbnQgdmlfY21kKGludCwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbnQgZG9tb3ZlKGludCwgY29uc3QgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCByZWRvX2luc2VydChpbnQpOwotc3RhdGljIHZvaWQgeWFua19yYW5nZShpbnQsIGludCk7Ci1zdGF0aWMgaW50IGJyYWNrdHlwZShpbnQpOwotc3RhdGljIHZvaWQgc2F2ZV9jYnVmKHZvaWQpOwotc3RhdGljIHZvaWQgcmVzdG9yZV9jYnVmKHZvaWQpOwotc3RhdGljIGludCBwdXRidWYoY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBkZWxfcmFuZ2UoaW50LCBpbnQpOwotc3RhdGljIGludCBmaW5kY2goaW50LCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBpbnQgZm9yd3dvcmQoaW50KTsKLXN0YXRpYyBpbnQgYmFja3dvcmQoaW50KTsKLXN0YXRpYyBpbnQgZW5kd29yZChpbnQpOwotc3RhdGljIGludCBGb3J3d29yZChpbnQpOwotc3RhdGljIGludCBCYWNrd29yZChpbnQpOwotc3RhdGljIGludCBFbmR3b3JkKGludCk7Ci1zdGF0aWMgaW50IGdyYWJoaXN0KGludCwgaW50KTsKLXN0YXRpYyBpbnQgZ3JhYnNlYXJjaChpbnQsIGludCwgaW50LCBjaGFyICopOwotc3RhdGljIHZvaWQgcmVkcmF3X2xpbmUoaW50KTsKLXN0YXRpYyB2b2lkIHJlZnJlc2goaW50KTsKLXN0YXRpYyBpbnQgb3V0b2Z3aW4odm9pZCk7Ci1zdGF0aWMgdm9pZCByZXdpbmRvdyh2b2lkKTsKLXN0YXRpYyBpbnQgbmV3Y29sKGludCwgaW50KTsKLXN0YXRpYyB2b2lkIGRpc3BsYXkoY2hhciAqLCBjaGFyICosIGludCk7Ci1zdGF0aWMgdm9pZCBlZF9tb3Zfb3B0KGludCwgY2hhciAqKTsKLXN0YXRpYyBpbnQgZXhwYW5kX3dvcmQoaW50KTsKLXN0YXRpYyBpbnQgY29tcGxldGVfd29yZChpbnQsIGludCk7Ci1zdGF0aWMgaW50IHByaW50X2V4cGFuc2lvbnMoc3RydWN0IGVkc3RhdGUgKiwgaW50KTsKLSNkZWZpbmUgY2hhcl9sZW4oYykJKChjKSA8ICcgJyB8fCAoYykgPT0gMHg3RiA/IDIgOiAxKQotc3RhdGljIHZvaWQgeF92aV96b3RjKGludCk7Ci1zdGF0aWMgdm9pZCB2aV9lcnJvcih2b2lkKTsKLXN0YXRpYyB2b2lkIHZpX21hY3JvX3Jlc2V0KHZvaWQpOwotc3RhdGljIGludCB4X3ZpX3B1dGJ1Zihjb25zdCBjaGFyICosIHNpemVfdCk7Ci0KLSNkZWZpbmUgQ18JMHgxCQkvKiBhIHZhbGlkIGNvbW1hbmQgdGhhdCBpc24ndCBhIE1fLCBFXywgVV8gKi8KLSNkZWZpbmUgTV8JMHgyCQkvKiBtb3ZlbWVudCBjb21tYW5kIChoLCBsLCBldGMuKSAqLwotI2RlZmluZSBFXwkweDQJCS8qIGV4dGVuZGVkIGNvbW1hbmQgKGMsIGQsIHkpICovCi0jZGVmaW5lIFhfCTB4OAkJLyogbG9uZyBjb21tYW5kIChALCBmLCBGLCB0LCBULCBldGMuKSAqLwotI2RlZmluZSBVXwkweDEwCQkvKiBhbiBVTi11bmRvYWJsZSBjb21tYW5kICh0aGF0IGlzbid0IGEgTV8pICovCi0jZGVmaW5lIEJfCTB4MjAJCS8qIGJhZCBjb21tYW5kICheQCkgKi8KLSNkZWZpbmUgWl8JMHg0MAkJLyogcmVwZWF0IGNvdW50IGRlZmF1bHRzIHRvIDAgKG5vdCAxKSAqLwotI2RlZmluZSBTXwkweDgwCQkvKiBzZWFyY2ggKC8sID8pICovCi0KLSNkZWZpbmUgaXNfYmFkKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mQl8pCi0jZGVmaW5lIGlzX2NtZChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJihNX3xFX3xDX3xVXykpCi0jZGVmaW5lIGlzX21vdmUoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZNXykKLSNkZWZpbmUgaXNfZXh0ZW5kKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mRV8pCi0jZGVmaW5lIGlzX2xvbmcoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZYXykKLSNkZWZpbmUgaXNfdW5kb2FibGUoYykJKCEoY2xhc3NpZnlbKGMpJjB4N2ZdJlVfKSkKLSNkZWZpbmUgaXNfc3JjaChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlNfKQotI2RlZmluZSBpc196ZXJvY291bnQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZaXykKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2xhc3NpZnlbMTI4XSA9IHsKLS8qCSAwCTEJMgkzCTQJNQk2CTcJKi8KLS8qIDAJXkAJXkEJXkIJXkMJXkQJXkUJXkYJXkcJKi8KLQlCXywJMCwJMCwJMCwJMCwJQ198VV8sCUNffFpfLAkwLAotLyogMQleSAleSQleSgleSwleTAleTQleTgleTwkqLwotCU1fLAlDX3xaXywJMCwJMCwJQ198VV8sCTAsCUNfLAkwLAotLyogMgleUAleUQleUgleUwleVAleVQleVgleVwkqLwotCUNfLAkwLAlDX3xVXywJMCwJMCwJMCwJQ18sCTAsCi0vKiAzCV5YCV5ZCV5aCV5bCV5cCV5dCV5eCV5fCSovCi0JQ18sCTAsCTAsCUNffFpfLAkwLAkwLAkwLAkwLAotLyogNAk8c3BhY2U+CSEJIgkjCSQJJQkmCScJKi8KLQlNXywJMCwJMCwJQ18sCU1fLAlNXywJMCwJMCwKLS8qIDUJKAkpCSoJKwksCS0JLgkvCSovCi0JMCwJMCwJQ18sCUNfLAlNXywJQ18sCTAsCUNffFNfLAotLyogNgkwCTEJMgkzCTQJNQk2CTcJKi8KLQlNXywJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLS8qIDcJOAk5CToJOwk8CT0JPgk/CSovCi0JMCwJMCwJMCwJTV8sCTAsCUNfLAkwLAlDX3xTXywKLS8qIDgJQAlBCUIJQwlECUUJRglHCSovCi0JQ198WF8sCUNfLAlNXywJQ18sCUNfLAlNXywJTV98WF8sCUNffFVffFpfLAotLyogOQlICUkJSglLCUwJTQlOCU8JKi8KLQkwLAlDXywJMCwJMCwJMCwJMCwJQ198VV8sCTAsCi0vKiBBCVAJUQlSCVMJVAlVCVYJVwkqLwotCUNfLAkwLAlDXywJQ18sCU1ffFhfLAlDXywJMCwJTV8sCi0vKiBCCVgJWQlaCVsJXAldCV4JXwkqLwotCUNfLAlDX3xVXywJMCwJMCwJQ198Wl8sCTAsCU1fLAlDX3xaXywKLS8qIEMJYAlhCWIJYwlkCWUJZglnCSovCi0JMCwJQ18sCU1fLAlFXywJRV8sCU1fLAlNX3xYXywJQ198Wl8sCi0vKiBECWgJaQlqCWsJbAltCW4JbwkqLwotCU1fLAlDXywJQ198VV8sCUNffFVfLAlNXywJMCwJQ198VV8sCTAsCi0vKiBFCXAJcQlyCXMJdAl1CXYJdwkqLwotCUNfLAkwLAlYXywJQ18sCU1ffFhfLAlDX3xVXywJQ198VV98Wl8sIE1fLAotLyogRgl4CXkJegl7CXwJfQl+CV4/CSovCi0JQ18sCUVffFVfLAkwLAkwLAlNX3xaXywJMCwJQ18sCTAKLX07Ci0KLSNkZWZpbmUgTUFYVklDTUQJMwotI2RlZmluZSBTUkNITEVOCQk0MAotCi0jZGVmaW5lIElOU0VSVAkJMQotI2RlZmluZSBSRVBMQUNFCQkyCi0KLSNkZWZpbmUgVk5PUk1BTAkJMAkJLyogY29tbWFuZCwgaW5zZXJ0IG9yIHJlcGxhY2UgbW9kZSAqLwotI2RlZmluZSBWQVJHMQkJMQkJLyogZGlnaXQgcHJlZml4IChmaXJzdCwgZWcsIDVsKSAqLwotI2RlZmluZSBWRVhUQ01ECQkyCQkvKiBjbWQgKyBtb3ZlbWVudCAoZWcsIGNsKSAqLwotI2RlZmluZSBWQVJHMgkJMwkJLyogZGlnaXQgcHJlZml4IChzZWNvbmQsIGVnLCAyYzNsKSAqLwotI2RlZmluZSBWWENICQk0CQkvKiBmLCBGLCB0LCBULCBAICovCi0jZGVmaW5lIFZGQUlMCQk1CQkvKiBiYWQgY29tbWFuZCAqLwotI2RlZmluZSBWQ01ECQk2CQkvKiBzaW5nbGUgY2hhciBjb21tYW5kIChlZywgWCkgKi8KLSNkZWZpbmUgVlJFRE8JCTcJCS8qIC4gKi8KLSNkZWZpbmUgVkxJVAkJOAkJLyogXlYgKi8KLSNkZWZpbmUgVlNFQVJDSAkJOQkJLyogLywgPyAqLwotI2RlZmluZSBWVkVSU0lPTgkxMAkJLyogPEVTQz4gXlYgKi8KLQotc3RhdGljIGNoYXIJCXVuZG9jYnVmW0xJTkVdOwotCi1zdGF0aWMgc3RydWN0IGVkc3RhdGUJKnNhdmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKTsKLXN0YXRpYyB2b2lkCQlyZXN0b3JlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCwgc3RydWN0IGVkc3RhdGUgKm5ld3MpOwotc3RhdGljIHZvaWQJCWZyZWVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKTsKLQotc3RhdGljIHN0cnVjdCBlZHN0YXRlCWVidWY7Ci1zdGF0aWMgc3RydWN0IGVkc3RhdGUJdW5kb2J1ZiA9IHsgdW5kb2NidWYsIDAsIExJTkUsIDAsIDAgfTsKLQotc3RhdGljIHN0cnVjdCBlZHN0YXRlCSplczsJCQkvKiBjdXJyZW50IGVkaXRvciBzdGF0ZSAqLwotc3RhdGljIHN0cnVjdCBlZHN0YXRlCSp1bmRvOwotCi1zdGF0aWMgY2hhciBpYnVmW0xJTkVdOwkJCS8qIGlucHV0IGJ1ZmZlciAqLwotc3RhdGljIGludCBmaXJzdF9pbnNlcnQ7CQkvKiBzZXQgd2hlbiBzdGFydGluZyBpbiBpbnNlcnQgbW9kZSAqLwotc3RhdGljIGludCBzYXZlZF9pbnNsZW47CQkvKiBzYXZlZCBpbnNsZW4gZm9yIGZpcnN0IGluc2VydCAqLwotc3RhdGljIGludCBpbnNsZW47CQkJLyogbGVuZ3RoIG9mIGlucHV0IGJ1ZmZlciAqLwotc3RhdGljIGludCBzcmNobGVuOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IHNlYXJjaCBwYXR0ZXJuICovCi1zdGF0aWMgY2hhciB5YnVmW0xJTkVdOwkJCS8qIHlhbmsgYnVmZmVyICovCi1zdGF0aWMgaW50IHlhbmtsZW47CQkJLyogbGVuZ3RoIG9mIHlhbmsgYnVmZmVyICovCi1zdGF0aWMgaW50IGZzYXZlY21kID0gJyAnOwkJLyogbGFzdCBmaW5kIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgZnNhdmVjaDsJCQkvKiBjaGFyYWN0ZXIgdG8gZmluZCAqLwotc3RhdGljIGNoYXIgbGFzdGNtZFtNQVhWSUNNRF07CQkvKiBsYXN0IG5vbi1tb3ZlIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgbGFzdGFjOwkJCS8qIGFyZ2NudCBmb3IgbGFzdGNtZCAqLwotc3RhdGljIGludCBsYXN0c2VhcmNoID0gJyAnOwkJLyogbGFzdCBzZWFyY2ggY29tbWFuZCAqLwotc3RhdGljIGNoYXIgc3JjaHBhdFtTUkNITEVOXTsJCS8qIGxhc3Qgc2VhcmNoIHBhdHRlcm4gKi8KLXN0YXRpYyBpbnQgaW5zZXJ0OwkJCS8qIG5vbi16ZXJvIGluIGluc2VydCBtb2RlICovCi1zdGF0aWMgaW50IGhudW07CQkJLyogcG9zaXRpb24gaW4gaGlzdG9yeSAqLwotc3RhdGljIGludCBvaG51bTsJCQkvKiBoaXN0b3J5IGxpbmUgY29waWVkIChhZnRlciBtb2QpICovCi1zdGF0aWMgaW50IGhsYXN0OwkJCS8qIDEgcGFzdCBsYXN0IHBvc2l0aW9uIGluIGhpc3RvcnkgKi8KLXN0YXRpYyBpbnQgc3RhdGU7Ci0KLS8qIEluZm9ybWF0aW9uIGZvciBrZWVwaW5nIHRyYWNrIG9mIG1hY3JvcyB0aGF0IGFyZSBiZWluZyBleHBhbmRlZC4KLSAqIFRoZSBmb3JtYXQgb2YgYnVmIGlzIHRoZSBhbGlhcyBjb250ZW50cyBmb2xsb3dlZCBieSBhIE5VTCBieXRlIGZvbGxvd2VkCi0gKiBieSB0aGUgbmFtZSAobGV0dGVyKSBvZiB0aGUgYWxpYXMuIFRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgYnkKLSAqIGEgZG91YmxlIE5VTC4gVGhlIG5hbWUgb2YgdGhlIGFsaWFzIGlzIHN0b3JlZCBzbyByZWN1cnNpdmUgbWFjcm9zIGNhbgotICogYmUgZGV0ZWN0ZWQuCi0gKi8KLXN0cnVjdCBtYWNyb19zdGF0ZSB7Ci0JdW5zaWduZWQgY2hhciAqcDsJLyogY3VycmVudCBwb3NpdGlvbiBpbiBidWYgKi8KLQl1bnNpZ25lZCBjaGFyICpidWY7CS8qIHBvaW50ZXIgdG8gbWFjcm8ocykgYmVpbmcgZXhwYW5kZWQgKi8KLQlpbnQgbGVuOwkJLyogaG93IG11Y2ggZGF0YSBpbiBidWZmZXIgKi8KLX07Ci1zdGF0aWMgc3RydWN0IG1hY3JvX3N0YXRlIG1hY3JvOwotCi1lbnVtIGV4cGFuZF9tb2RlIHsKLQlOT05FLCBFWFBBTkQsIENPTVBMRVRFLCBQUklOVAotfTsKLXN0YXRpYyBlbnVtIGV4cGFuZF9tb2RlIGV4cGFuZGVkID0gTk9ORTsJLyogbGFzdCBpbnB1dCB3YXMgZXhwYW5kZWQgKi8KLQotc3RhdGljIGludAoteF92aShjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0JaW50IGM7Ci0KLQlzdGF0ZSA9IFZOT1JNQUw7Ci0Jb2hudW0gPSBobnVtID0gaGxhc3QgPSBoaXN0bnVtKC0xKSArIDE7Ci0JaW5zZXJ0ID0gSU5TRVJUOwotCXNhdmVkX2luc2xlbiA9IGluc2xlbjsKLQlmaXJzdF9pbnNlcnQgPSAxOwotCWluc2xlbiA9IDA7Ci0JdmlfbWFjcm9fcmVzZXQoKTsKLQotCWVzID0gJmVidWY7Ci0JZXMtPmNidWYgPSBidWY7Ci0JdW5kbyA9ICZ1bmRvYnVmOwotCXVuZG8tPmNidWZzaXplID0gZXMtPmNidWZzaXplID0gbGVuID4gTElORSA/IExJTkUgOiBsZW47Ci0KLQllcy0+bGluZWxlbiA9IHVuZG8tPmxpbmVsZW4gPSAwOwotCWVzLT5jdXJzb3IgPSB1bmRvLT5jdXJzb3IgPSAwOwotCWVzLT53aW5sZWZ0ID0gdW5kby0+d2lubGVmdCA9IDA7Ci0KLQljdXJfY29sID0gcHJvbXB0bGVuKHByb21wdCk7Ci0JcHJvbXB0X3RydW5jID0gKGN1cl9jb2wgLyB4X2NvbHMpICogeF9jb2xzOwotCWN1cl9jb2wgLT0gcHJvbXB0X3RydW5jOwotCi0JcHByb21wdChwcm9tcHQsIDApOwotCWlmIChjdXJfY29sID4geF9jb2xzIC0gMyAtIE1JTl9FRElUX1NQQUNFKSB7Ci0JCXByb21wdF9yZWRyYXcgPSBjdXJfY29sID0gMDsKLQkJeF9wdXRjKCdcbicpOwotCX0gZWxzZQotCQlwcm9tcHRfcmVkcmF3ID0gMTsKLQlwd2lkdGggPSBjdXJfY29sOwotCi0JaWYgKCF3YnVmX2xlbiB8fCB3YnVmX2xlbiAhPSB4X2NvbHMgLSAzKSB7Ci0JCXdidWZfbGVuID0geF9jb2xzIC0gMzsKLQkJd2J1ZlswXSA9IGFyZXNpemUod2J1ZlswXSwgd2J1Zl9sZW4sIEFQRVJNKTsKLQkJd2J1ZlsxXSA9IGFyZXNpemUod2J1ZlsxXSwgd2J1Zl9sZW4sIEFQRVJNKTsKLQl9Ci0JKHZvaWQpbWVtc2V0KHdidWZbMF0sICcgJywgd2J1Zl9sZW4pOwotCSh2b2lkKW1lbXNldCh3YnVmWzFdLCAnICcsIHdidWZfbGVuKTsKLQl3aW53aWR0aCA9IHhfY29scyAtIHB3aWR0aCAtIDM7Ci0Jd2luID0gMDsKLQltb3JlYyA9ICcgJzsKLQlsYXN0cmVmID0gMTsKLQlob2xkbGVuID0gMDsKLQotCWVkaXRtb2RlID0gMjsKLQl4X2ZsdXNoKCk7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKG1hY3JvLnApIHsKLQkJCWMgPSAqbWFjcm8ucCsrOwotCQkJLyogZW5kIG9mIGN1cnJlbnQgbWFjcm8/ICovCi0JCQlpZiAoIWMpIHsKLQkJCQkvKiBtb3JlIG1hY3JvcyBsZWZ0IHRvIGZpbmlzaD8gKi8KLQkJCQlpZiAoKm1hY3JvLnArKykKLQkJCQkJY29udGludWU7Ci0JCQkJLyogbXVzdCBiZSB0aGUgZW5kIG9mIGFsbCB0aGUgbWFjcm9zICovCi0JCQkJdmlfbWFjcm9fcmVzZXQoKTsKLQkJCQljID0geF9nZXRjKCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYyA9IHhfZ2V0YygpOwotCi0JCWlmIChjID09IC0xKQotCQkJYnJlYWs7Ci0JCWlmIChzdGF0ZSAhPSBWTElUKSB7Ci0JCQlpZiAoYyA9PSBlZGNoYXJzLmludHIgfHwgYyA9PSBlZGNoYXJzLnF1aXQpIHsKLQkJCQkvKiBwcmV0ZW5kIHdlIGdvdCBhbiBpbnRlcnJ1cHQgKi8KLQkJCQl4X3ZpX3pvdGMoYyk7Ci0JCQkJeF9mbHVzaCgpOwotCQkJCXRyYXBzaWcoYyA9PSBlZGNoYXJzLmludHIgPyBTSUdJTlQgOiBTSUdRVUlUKTsKLQkJCQl4X21vZGUoZmFsc2UpOwotCQkJCXVud2luZChMU0hFTEwpOwotCQkJfSBlbHNlIGlmIChjID09IGVkY2hhcnMuZW9mICYmIHN0YXRlICE9IFZWRVJTSU9OKSB7Ci0JCQkJaWYgKGVzLT5saW5lbGVuID09IDApIHsKLQkJCQkJeF92aV96b3RjKGVkY2hhcnMuZW9mKTsKLQkJCQkJYyA9IC0xOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpX2hvb2soYykpCi0JCQlicmVhazsKLQkJeF9mbHVzaCgpOwotCX0KLQotCXhfcHV0YygnXHInKTsKLQl4X3B1dGMoJ1xuJyk7Ci0JeF9mbHVzaCgpOwotCi0JaWYgKGMgPT0gLTEgfHwgKHNzaXplX3QpbGVuIDw9IGVzLT5saW5lbGVuKQotCQlyZXR1cm4gKC0xKTsKLQotCWlmIChlcy0+Y2J1ZiAhPSBidWYpCi0JCW1lbW1vdmUoYnVmLCBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4pOwotCi0JYnVmW2VzLT5saW5lbGVuKytdID0gJ1xuJzsKLQotCXJldHVybiAoZXMtPmxpbmVsZW4pOwotfQotCi1zdGF0aWMgaW50Ci12aV9ob29rKGludCBjaCkKLXsKLQlzdGF0aWMgY2hhciBjdXJjbWRbTUFYVklDTURdLCBsb2NwYXRbU1JDSExFTl07Ci0Jc3RhdGljIGludCBjbWRsZW4sIGFyZ2MxLCBhcmdjMjsKLQotCXN3aXRjaCAoc3RhdGUpIHsKLQotCWNhc2UgVk5PUk1BTDoKLQkJaWYgKGluc2VydCAhPSAwKSB7Ci0JCQlpZiAoY2ggPT0gQ3RybCgndicpKSB7Ci0JCQkJc3RhdGUgPSBWTElUOwotCQkJCWNoID0gJ14nOwotCQkJfQotCQkJc3dpdGNoICh2aV9pbnNlcnQoY2gpKSB7Ci0JCQljYXNlIC0xOgotCQkJCXZpX2Vycm9yKCk7Ci0JCQkJc3RhdGUgPSBWTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCWlmIChzdGF0ZSA9PSBWTElUKSB7Ci0JCQkJCWVzLT5jdXJzb3ItLTsKLQkJCQkJcmVmcmVzaCgwKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmVmcmVzaChpbnNlcnQgIT0gMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCi0JCQkJcmV0dXJuICgxKTsKLQkJCWNtZGxlbiA9IDA7Ci0JCQlhcmdjMSA9IDA7Ci0JCQlpZiAoY2ggPj0gJzEnICYmIGNoIDw9ICc5JykgewotCQkJCWFyZ2MxID0gY2ggLSAnMCc7Ci0JCQkJc3RhdGUgPSBWQVJHMTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOwotCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKLQkJCQlpZiAoc3RhdGUgPT0gVlNFQVJDSCkgewotCQkJCQlzYXZlX2NidWYoKTsKLQkJCQkJZXMtPmN1cnNvciA9IDA7Ci0JCQkJCWVzLT5saW5lbGVuID0gMDsKLQkJCQkJaWYgKGNoID09ICcvJykgewotCQkJCQkJaWYgKHB1dGJ1ZigiLyIsIDEsIDApICE9IDApCi0JCQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJCX0gZWxzZSBpZiAocHV0YnVmKCI/IiwgMSwgMCkgIT0gMCkKLQkJCQkJCXJldHVybiAoLTEpOwotCQkJCQlyZWZyZXNoKDApOwotCQkJCX0KLQkJCQlpZiAoc3RhdGUgPT0gVlZFUlNJT04pIHsKLQkJCQkJc2F2ZV9jYnVmKCk7Ci0JCQkJCWVzLT5jdXJzb3IgPSAwOwotCQkJCQllcy0+bGluZWxlbiA9IDA7Ci0JCQkJCXB1dGJ1ZihLU0hfVkVSU0lPTiwKLQkJCQkJICAgIHN0cmxlbihLU0hfVkVSU0lPTiksIDApOwotCQkJCQlyZWZyZXNoKDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkxJVDoKLQkJaWYgKGlzX2JhZChjaCkpIHsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgMSk7Ci0JCQl2aV9lcnJvcigpOwotCQl9IGVsc2UKLQkJCWVzLT5jYnVmW2VzLT5jdXJzb3IrK10gPSBjaDsKLQkJcmVmcmVzaCgxKTsKLQkJc3RhdGUgPSBWTk9STUFMOwotCQlicmVhazsKLQotCWNhc2UgVlZFUlNJT046Ci0JCXJlc3RvcmVfY2J1ZigpOwotCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCXJlZnJlc2goMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWQVJHMToKLQkJaWYgKGtzaF9pc2RpZ2l0KGNoKSkKLQkJCWFyZ2MxID0gYXJnYzEgKiAxMCArIGNoIC0gJzAnOwotCQllbHNlIHsKLQkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKLQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkVYVENNRDoKLQkJYXJnYzIgPSAwOwotCQlpZiAoY2ggPj0gJzEnICYmIGNoIDw9ICc5JykgewotCQkJYXJnYzIgPSBjaCAtICcwJzsKLQkJCXN0YXRlID0gVkFSRzI7Ci0JCQlyZXR1cm4gKDApOwotCQl9IGVsc2UgewotCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOwotCQkJaWYgKGNoID09IGN1cmNtZFswXSkKLQkJCQlzdGF0ZSA9IFZDTUQ7Ci0JCQllbHNlIGlmIChpc19tb3ZlKGNoKSkKLQkJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBWRkFJTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkFSRzI6Ci0JCWlmIChrc2hfaXNkaWdpdChjaCkpCi0JCQlhcmdjMiA9IGFyZ2MyICogMTAgKyBjaCAtICcwJzsKLQkJZWxzZSB7Ci0JCQlpZiAoYXJnYzEgPT0gMCkKLQkJCQlhcmdjMSA9IGFyZ2MyOwotCQkJZWxzZQotCQkJCWFyZ2MxICo9IGFyZ2MyOwotCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOwotCQkJaWYgKGNoID09IGN1cmNtZFswXSkKLQkJCQlzdGF0ZSA9IFZDTUQ7Ci0JCQllbHNlIGlmIChpc19tb3ZlKGNoKSkKLQkJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBWRkFJTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVlhDSDoKLQkJaWYgKGNoID09IEN0cmwoJ1snKSkKLQkJCXN0YXRlID0gVk5PUk1BTDsKLQkJZWxzZSB7Ci0JCQljdXJjbWRbY21kbGVuKytdID0gY2g7Ci0JCQlzdGF0ZSA9IFZDTUQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZTRUFSQ0g6Ci0JCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicgLyp8fCBjaCA9PSBDdHJsKCdbJykqLyApIHsKLQkJCXJlc3RvcmVfY2J1ZigpOwotCQkJLyogUmVwZWF0IGxhc3Qgc2VhcmNoPyAqLwotCQkJaWYgKHNyY2hsZW4gPT0gMCkgewotCQkJCWlmICghc3JjaHBhdFswXSkgewotCQkJCQl2aV9lcnJvcigpOwotCQkJCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCQkJCXJlZnJlc2goMCk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb2NwYXRbc3JjaGxlbl0gPSAnXDAnOwotCQkJCW1lbWNweShzcmNocGF0LCBsb2NwYXQsIHNyY2hsZW4gKyAxKTsKLQkJCX0KLQkJCXN0YXRlID0gVkNNRDsKLQkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLmVyYXNlIHx8IGNoID09IEN0cmwoJ2gnKSkgewotCQkJaWYgKHNyY2hsZW4gIT0gMCkgewotCQkJCXNyY2hsZW4tLTsKLQkJCQllcy0+bGluZWxlbiAtPSBjaGFyX2xlbigodW5zaWduZWQgY2hhcilsb2NwYXRbc3JjaGxlbl0pOwotCQkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKLQkJCQlyZWZyZXNoKDApOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlyZXN0b3JlX2NidWYoKTsKLQkJCXN0YXRlID0gVk5PUk1BTDsKLQkJCXJlZnJlc2goMCk7Ci0JCX0gZWxzZSBpZiAoY2ggPT0gZWRjaGFycy5raWxsKSB7Ci0JCQlzcmNobGVuID0gMDsKLQkJCWVzLT5saW5lbGVuID0gMTsKLQkJCWVzLT5jdXJzb3IgPSAxOwotCQkJcmVmcmVzaCgwKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0gZWxzZSBpZiAoY2ggPT0gZWRjaGFycy53ZXJhc2UpIHsKLQkJCWludCBpLCBuID0gc3JjaGxlbjsKLQkJCXN0cnVjdCBlZHN0YXRlIG5ld19lcywgKnNhdmVfZXM7Ci0KLQkJCW5ld19lcy5jdXJzb3IgPSBuOwotCQkJbmV3X2VzLmNidWYgPSBsb2NwYXQ7Ci0KLQkJCXNhdmVfZXMgPSBlczsKLQkJCWVzID0gJm5ld19lczsKLQkJCW4gPSBiYWNrd29yZCgxKTsKLQkJCWVzID0gc2F2ZV9lczsKLQotCQkJZm9yIChpID0gc3JjaGxlbjsgLS1pID49IG47ICkKLQkJCQllcy0+bGluZWxlbiAtPSBjaGFyX2xlbigodW5zaWduZWQgY2hhcilsb2NwYXRbaV0pOwotCQkJc3JjaGxlbiA9IG47Ci0JCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47Ci0JCQlyZWZyZXNoKDApOwotCQkJcmV0dXJuICgwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzcmNobGVuID09IFNSQ0hMRU4gLSAxKQotCQkJCXZpX2Vycm9yKCk7Ci0JCQllbHNlIHsKLQkJCQlsb2NwYXRbc3JjaGxlbisrXSA9IGNoOwotCQkJCWlmIChjaCA8ICcgJyB8fCBjaCA9PSAweDdmKSB7Ci0JCQkJCWlmIChlcy0+bGluZWxlbiArIDIgPiBlcy0+Y2J1ZnNpemUpCi0JCQkJCQl2aV9lcnJvcigpOwotCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9ICdeJzsKLQkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW4rK10gPSBjaCBeICdAJzsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZXMtPmxpbmVsZW4gPj0gZXMtPmNidWZzaXplKQotCQkJCQkJdmlfZXJyb3IoKTsKLQkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW4rK10gPSBjaDsKLQkJCQl9Ci0JCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOwotCQkJCXJlZnJlc2goMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIFZDTUQ6Ci0JCXN0YXRlID0gVk5PUk1BTDsKLQkJc3dpdGNoICh2aV9jbWQoYXJnYzEsIGN1cmNtZCkpIHsKLQkJY2FzZSAtMToKLQkJCXZpX2Vycm9yKCk7Ci0JCQlyZWZyZXNoKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJCWlmIChpbnNlcnQgIT0gMCkKLQkJCQlpbnNsZW4gPSAwOwotCQkJcmVmcmVzaChpbnNlcnQgIT0gMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcmVmcmVzaCgwKTsKLQkJCXJldHVybiAoMSk7Ci0JCWNhc2UgMjoKLQkJCS8qIGJhY2sgZnJvbSBhICd2JyBjb21tYW5kIC0gZG9uJ3QgcmVkcmF3IHRoZSBzY3JlZW4gKi8KLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZSRURPOgotCQlzdGF0ZSA9IFZOT1JNQUw7Ci0JCWlmIChhcmdjMSAhPSAwKQotCQkJbGFzdGFjID0gYXJnYzE7Ci0JCXN3aXRjaCAodmlfY21kKGxhc3RhYywgbGFzdGNtZCkpIHsKLQkJY2FzZSAtMToKLQkJCXZpX2Vycm9yKCk7Ci0JCQlyZWZyZXNoKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJCWlmIChpbnNlcnQgIT0gMCkgewotCQkJCWlmIChsYXN0Y21kWzBdID09ICdzJyB8fCBsYXN0Y21kWzBdID09ICdjJyB8fAotCQkJCSAgICBsYXN0Y21kWzBdID09ICdDJykgewotCQkJCQlpZiAocmVkb19pbnNlcnQoMSkgIT0gMCkKLQkJCQkJCXZpX2Vycm9yKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJlZG9faW5zZXJ0KGxhc3RhYykgIT0gMCkKLQkJCQkJCXZpX2Vycm9yKCk7Ci0JCQkJfQotCQkJfQotCQkJcmVmcmVzaCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlyZWZyZXNoKDApOwotCQkJcmV0dXJuICgxKTsKLQkJY2FzZSAyOgotCQkJLyogYmFjayBmcm9tIGEgJ3YnIGNvbW1hbmQgLSBjYW4ndCBoYXBwZW4gKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkFJTDoKLQkJc3RhdGUgPSBWTk9STUFMOwotCQl2aV9lcnJvcigpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotbmV4dHN0YXRlKGludCBjaCkKLXsKLQlpZiAoaXNfZXh0ZW5kKGNoKSkKLQkJcmV0dXJuIChWRVhUQ01EKTsKLQllbHNlIGlmIChpc19zcmNoKGNoKSkKLQkJcmV0dXJuIChWU0VBUkNIKTsKLQllbHNlIGlmIChpc19sb25nKGNoKSkKLQkJcmV0dXJuIChWWENIKTsKLQllbHNlIGlmIChjaCA9PSAnLicpCi0JCXJldHVybiAoVlJFRE8pOwotCWVsc2UgaWYgKGNoID09IEN0cmwoJ3YnKSkKLQkJcmV0dXJuIChWVkVSU0lPTik7Ci0JZWxzZSBpZiAoaXNfY21kKGNoKSkKLQkJcmV0dXJuIChWQ01EKTsKLQllbHNlCi0JCXJldHVybiAoVkZBSUwpOwotfQotCi1zdGF0aWMgaW50Ci12aV9pbnNlcnQoaW50IGNoKQotewotCWludCB0Y3Vyc29yOwotCi0JaWYgKGNoID09IGVkY2hhcnMuZXJhc2UgfHwgY2ggPT0gQ3RybCgnaCcpKSB7Ci0JCWlmIChpbnNlcnQgPT0gUkVQTEFDRSkgewotCQkJaWYgKGVzLT5jdXJzb3IgPT0gdW5kby0+Y3Vyc29yKSB7Ci0JCQkJdmlfZXJyb3IoKTsKLQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJaWYgKGluc2xlbiA+IDApCi0JCQkJaW5zbGVuLS07Ci0JCQllcy0+Y3Vyc29yLS07Ci0JCQlpZiAoZXMtPmN1cnNvciA+PSB1bmRvLT5saW5lbGVuKQotCQkJCWVzLT5saW5lbGVuLS07Ci0JCQllbHNlCi0JCQkJZXMtPmNidWZbZXMtPmN1cnNvcl0gPSB1bmRvLT5jYnVmW2VzLT5jdXJzb3JdOwotCQl9IGVsc2UgewotCQkJaWYgKGVzLT5jdXJzb3IgPT0gMCkKLQkJCQlyZXR1cm4gKDApOwotCQkJaWYgKGluc2xlbiA+IDApCi0JCQkJaW5zbGVuLS07Ci0JCQllcy0+Y3Vyc29yLS07Ci0JCQllcy0+bGluZWxlbi0tOwotCQkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvcl0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yICsgMV0sCi0JCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yICsgMSk7Ci0JCX0KLQkJZXhwYW5kZWQgPSBOT05FOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoY2ggPT0gZWRjaGFycy5raWxsKSB7Ci0JCWlmIChlcy0+Y3Vyc29yICE9IDApIHsKLQkJCWluc2xlbiA9IDA7Ci0JCQltZW1tb3ZlKGVzLT5jYnVmLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCi0JCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKLQkJCWVzLT5saW5lbGVuIC09IGVzLT5jdXJzb3I7Ci0JCQllcy0+Y3Vyc29yID0gMDsKLQkJfQotCQlleHBhbmRlZCA9IE5PTkU7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChjaCA9PSBlZGNoYXJzLndlcmFzZSkgewotCQlpZiAoZXMtPmN1cnNvciAhPSAwKSB7Ci0JCQl0Y3Vyc29yID0gYmFja3dvcmQoMSk7Ci0JCQltZW1tb3ZlKCZlcy0+Y2J1Zlt0Y3Vyc29yXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAotCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7Ci0JCQllcy0+bGluZWxlbiAtPSBlcy0+Y3Vyc29yIC0gdGN1cnNvcjsKLQkJCWlmIChpbnNsZW4gPCBlcy0+Y3Vyc29yIC0gdGN1cnNvcikKLQkJCQlpbnNsZW4gPSAwOwotCQkJZWxzZQotCQkJCWluc2xlbiAtPSBlcy0+Y3Vyc29yIC0gdGN1cnNvcjsKLQkJCWVzLT5jdXJzb3IgPSB0Y3Vyc29yOwotCQl9Ci0JCWV4cGFuZGVkID0gTk9ORTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JLyogSWYgYW55IGNoYXJzIGFyZSBlbnRlcmVkIGJlZm9yZSBlc2NhcGUsIHRyYXNoIHRoZSBzYXZlZCBpbnNlcnQKLQkgKiBidWZmZXIgKGlmIHVzZXIgaW5zZXJ0cyAmIGRlbGV0ZXMgY2hhciwgaWJ1ZiBnZXRzIHRyYXNoZWQgYW5kCi0JICogd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQpCi0JICovCi0JaWYgKGZpcnN0X2luc2VydCAmJiBjaCAhPSBDdHJsKCdbJykpCi0JCXNhdmVkX2luc2xlbiA9IDA7Ci0Jc3dpdGNoIChjaCkgewotCWNhc2UgJ1wwJzoKLQkJcmV0dXJuICgtMSk7Ci0KLQljYXNlICdccic6Ci0JY2FzZSAnXG4nOgotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSBDdHJsKCdbJyk6Ci0JCWV4cGFuZGVkID0gTk9ORTsKLQkJaWYgKGZpcnN0X2luc2VydCkgewotCQkJZmlyc3RfaW5zZXJ0ID0gMDsKLQkJCWlmIChpbnNsZW4gPT0gMCkgewotCQkJCWluc2xlbiA9IHNhdmVkX2luc2xlbjsKLQkJCQlyZXR1cm4gKHJlZG9faW5zZXJ0KDApKTsKLQkJCX0KLQkJCWxhc3RjbWRbMF0gPSAnYSc7Ci0JCQlsYXN0YWMgPSAxOwotCQl9Ci0JCWlmIChsYXN0Y21kWzBdID09ICdzJyB8fCBsYXN0Y21kWzBdID09ICdjJyB8fAotCQkgICAgbGFzdGNtZFswXSA9PSAnQycpCi0JCQlyZXR1cm4gKHJlZG9faW5zZXJ0KDApKTsKLQkJZWxzZQotCQkJcmV0dXJuIChyZWRvX2luc2VydChsYXN0YWMgLSAxKSk7Ci0KLQkvKiB7IEJlZ2luIG5vbnN0YW5kYXJkIHZpIGNvbW1hbmRzICovCi0JY2FzZSBDdHJsKCd4Jyk6Ci0JCWV4cGFuZF93b3JkKDApOwotCQlicmVhazsKLQotCWNhc2UgQ3RybCgnZicpOgotCQljb21wbGV0ZV93b3JkKDAsIDApOwotCQlicmVhazsKLQotCWNhc2UgQ3RybCgnZScpOgotCQlwcmludF9leHBhbnNpb25zKGVzLCAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEN0cmwoJ2knKToKLQkJaWYgKEZsYWcoRlZJVEFCQ09NUExFVEUpKSB7Ci0JCQljb21wbGV0ZV93b3JkKDAsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRkFMTFRIUk9VR0ggKi8KLQkvKiBFbmQgbm9uc3RhbmRhcmQgdmkgY29tbWFuZHMgfSAqLwotCi0JZGVmYXVsdDoKLQkJaWYgKGVzLT5saW5lbGVuID49IGVzLT5jYnVmc2l6ZSAtIDEpCi0JCQlyZXR1cm4gKC0xKTsKLQkJaWJ1ZltpbnNsZW4rK10gPSBjaDsKLQkJaWYgKGluc2VydCA9PSBJTlNFUlQpIHsKLQkJCW1lbW1vdmUoJmVzLT5jYnVmW2VzLT5jdXJzb3IgKyAxXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAotCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7Ci0JCQllcy0+bGluZWxlbisrOwotCQl9Ci0JCWVzLT5jYnVmW2VzLT5jdXJzb3IrK10gPSBjaDsKLQkJaWYgKGluc2VydCA9PSBSRVBMQUNFICYmIGVzLT5jdXJzb3IgPiBlcy0+bGluZWxlbikKLQkJCWVzLT5saW5lbGVuKys7Ci0JCWV4cGFuZGVkID0gTk9ORTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotdmlfY21kKGludCBhcmdjbnQsIGNvbnN0IGNoYXIgKmNtZCkKLXsKLQlpbnQgbmN1cnNvcjsKLQlpbnQgY3VyLCBjMSwgYzIsIGMzID0gMDsKLQlpbnQgYW55OwotCXN0cnVjdCBlZHN0YXRlICp0OwotCi0JaWYgKGFyZ2NudCA9PSAwICYmICFpc196ZXJvY291bnQoKmNtZCkpCi0JCWFyZ2NudCA9IDE7Ci0KLQlpZiAoaXNfbW92ZSgqY21kKSkgewotCQlpZiAoKGN1ciA9IGRvbW92ZShhcmdjbnQsIGNtZCwgMCkpID49IDApIHsKLQkJCWlmIChjdXIgPT0gZXMtPmxpbmVsZW4gJiYgY3VyICE9IDApCi0JCQkJY3VyLS07Ci0JCQllcy0+Y3Vyc29yID0gY3VyOwotCQl9IGVsc2UKLQkJCXJldHVybiAoLTEpOwotCX0gZWxzZSB7Ci0JCS8qIERvbid0IHNhdmUgc3RhdGUgaW4gbWlkZGxlIG9mIG1hY3JvLi4gKi8KLQkJaWYgKGlzX3VuZG9hYmxlKCpjbWQpICYmICFtYWNyby5wKSB7Ci0JCQl1bmRvLT53aW5sZWZ0ID0gZXMtPndpbmxlZnQ7Ci0JCQltZW1tb3ZlKHVuZG8tPmNidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7Ci0JCQl1bmRvLT5saW5lbGVuID0gZXMtPmxpbmVsZW47Ci0JCQl1bmRvLT5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCQkJbGFzdGFjID0gYXJnY250OwotCQkJbWVtbW92ZShsYXN0Y21kLCBjbWQsIE1BWFZJQ01EKTsKLQkJfQotCQlzd2l0Y2ggKCpjbWQpIHsKLQotCQljYXNlIEN0cmwoJ2wnKToKLQkJY2FzZSBDdHJsKCdyJyk6Ci0JCQlyZWRyYXdfbGluZSgxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ0AnOgotCQkJewotCQkJCXN0YXRpYyBjaGFyIGFsaWFzW10gPSAiX1wwIjsKLQkJCQlzdHJ1Y3QgdGJsICphcDsKLQkJCQlpbnQgb2xlbiwgbmxlbjsKLQkJCQljaGFyICpwLCAqbmJ1ZjsKLQotCQkJCS8qIGxvb2t1cCBsZXR0ZXIgaW4gYWxpYXMgbGlzdC4uLiAqLwotCQkJCWFsaWFzWzFdID0gY21kWzFdOwotCQkJCWFwID0ga3RzZWFyY2goJmFsaWFzZXMsIGFsaWFzLCBoYXNoKGFsaWFzKSk7Ci0JCQkJaWYgKCFjbWRbMV0gfHwgIWFwIHx8ICEoYXAtPmZsYWcgJiBJU1NFVCkpCi0JCQkJCXJldHVybiAoLTEpOwotCQkJCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSByZWN1cnNpdmUgY2FsbC4uLiAqLwotCQkJCWlmICgocCA9IChjaGFyICopbWFjcm8ucCkpCi0JCQkJCXdoaWxlICgocCA9IHN0cm51bChwKSkgJiYgcFsxXSkKLQkJCQkJCWlmICgqKytwID09IGNtZFsxXSkKLQkJCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQkvKiBpbnNlcnQgYWxpYXMgaW50byBtYWNybyBidWZmZXIgKi8KLQkJCQlubGVuID0gc3RybGVuKGFwLT52YWwucykgKyAxOwotCQkJCW9sZW4gPSAhbWFjcm8ucCA/IDIgOgotCQkJCSAgICBtYWNyby5sZW4gLSAobWFjcm8ucCAtIG1hY3JvLmJ1Zik7Ci0JCQkJbmJ1ZiA9IGFsbG9jKG5sZW4gKyAxICsgb2xlbiwgQVBFUk0pOwotCQkJCW1lbWNweShuYnVmLCBhcC0+dmFsLnMsIG5sZW4pOwotCQkJCW5idWZbbmxlbisrXSA9IGNtZFsxXTsKLQkJCQlpZiAobWFjcm8ucCkgewotCQkJCQltZW1jcHkobmJ1ZiArIG5sZW4sIG1hY3JvLnAsIG9sZW4pOwotCQkJCQlhZnJlZShtYWNyby5idWYsIEFQRVJNKTsKLQkJCQkJbmxlbiArPSBvbGVuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5idWZbbmxlbisrXSA9ICdcMCc7Ci0JCQkJCW5idWZbbmxlbisrXSA9ICdcMCc7Ci0JCQkJfQotCQkJCW1hY3JvLnAgPSBtYWNyby5idWYgPSAodW5zaWduZWQgY2hhciAqKW5idWY7Ci0JCQkJbWFjcm8ubGVuID0gbmxlbjsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2EnOgotCQkJbW9kaWZpZWQgPSAxOwotCQkJaG51bSA9IGhsYXN0OwotCQkJaWYgKGVzLT5saW5lbGVuICE9IDApCi0JCQkJZXMtPmN1cnNvcisrOwotCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnQSc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlkZWxfcmFuZ2UoMCwgMCk7Ci0JCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47Ci0JCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdTJzoKLQkJCWVzLT5jdXJzb3IgPSBkb21vdmUoMSwgIl4iLCAxKTsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdZJzoKLQkJCWNtZCA9ICJ5JCI7Ci0JCQkvKiBhaGhoaGhoLi4uICovCi0JCWNhc2UgJ2MnOgotCQljYXNlICdkJzoKLQkJY2FzZSAneSc6Ci0JCQlpZiAoKmNtZCA9PSBjbWRbMV0pIHsKLQkJCQljMSA9ICpjbWQgPT0gJ2MnID8gZG9tb3ZlKDEsICJeIiwgMSkgOiAwOwotCQkJCWMyID0gZXMtPmxpbmVsZW47Ci0JCQl9IGVsc2UgaWYgKCFpc19tb3ZlKGNtZFsxXSkpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQllbHNlIHsKLQkJCQlpZiAoKG5jdXJzb3IgPSBkb21vdmUoYXJnY250LCAmY21kWzFdLCAxKSkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlpZiAoKmNtZCA9PSAnYycgJiYKLQkJCQkgICAgKGNtZFsxXSA9PSAndycgfHwgY21kWzFdID09ICdXJykgJiYKLQkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW2VzLT5jdXJzb3JdKSkgewotCQkJCQlkbyB7Ci0JCQkJCQktLW5jdXJzb3I7Ci0JCQkJCX0gd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSk7Ci0JCQkJCW5jdXJzb3IrKzsKLQkJCQl9Ci0JCQkJaWYgKG5jdXJzb3IgPiBlcy0+Y3Vyc29yKSB7Ci0JCQkJCWMxID0gZXMtPmN1cnNvcjsKLQkJCQkJYzIgPSBuY3Vyc29yOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWMxID0gbmN1cnNvcjsKLQkJCQkJYzIgPSBlcy0+Y3Vyc29yOwotCQkJCQlpZiAoY21kWzFdID09ICclJykKLQkJCQkJCWMyKys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCpjbWQgIT0gJ2MnICYmIGMxICE9IGMyKQotCQkJCXlhbmtfcmFuZ2UoYzEsIGMyKTsKLQkJCWlmICgqY21kICE9ICd5JykgewotCQkJCWRlbF9yYW5nZShjMSwgYzIpOwotCQkJCWVzLT5jdXJzb3IgPSBjMTsKLQkJCX0KLQkJCWlmICgqY21kID09ICdjJykgewotCQkJCW1vZGlmaWVkID0gMTsKLQkJCQlobnVtID0gaGxhc3Q7Ci0JCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkKLQkJCQllcy0+Y3Vyc29yKys7Ci0JCQl3aGlsZSAocHV0YnVmKHlidWYsIHlhbmtsZW4sIDApID09IDAgJiYgLS1hcmdjbnQgPiAwKQotCQkJCTsKLQkJCWlmIChlcy0+Y3Vyc29yICE9IDApCi0JCQkJZXMtPmN1cnNvci0tOwotCQkJaWYgKGFyZ2NudCAhPSAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnUCc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlhbnkgPSAwOwotCQkJd2hpbGUgKHB1dGJ1Zih5YnVmLCB5YW5rbGVuLCAwKSA9PSAwICYmIC0tYXJnY250ID4gMCkKLQkJCQlhbnkgPSAxOwotCQkJaWYgKGFueSAmJiBlcy0+Y3Vyc29yICE9IDApCi0JCQkJZXMtPmN1cnNvci0tOwotCQkJaWYgKGFyZ2NudCAhPSAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOwotCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnRCc6Ci0JCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7Ci0JCQlpZiAoZXMtPmN1cnNvciAhPSAwKQotCQkJCWVzLT5jdXJzb3ItLTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2cnOgotCQkJaWYgKCFhcmdjbnQpCi0JCQkJYXJnY250ID0gaGxhc3Q7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlICdHJzoKLQkJCWlmICghYXJnY250KQotCQkJCWFyZ2NudCA9IDE7Ci0JCQllbHNlCi0JCQkJYXJnY250ID0gaGxhc3QgLSAoc291cmNlLT5saW5lIC0gYXJnY250KTsKLQkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgYXJnY250IC0gMSkgPCAwKQotCQkJCXJldHVybiAoLTEpOwotCQkJZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSAwOwotCQkJCWhudW0gPSBhcmdjbnQgLSAxOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnaSc6Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpbnNlcnQgPSBJTlNFUlQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdJJzoKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWVzLT5jdXJzb3IgPSBkb21vdmUoMSwgIl4iLCAxKTsKLQkJCWluc2VydCA9IElOU0VSVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2onOgotCQljYXNlICcrJzoKLQkJY2FzZSBDdHJsKCduJyk6Ci0JCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIGhudW0gKyBhcmdjbnQpIDwgMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWVsc2UgewotCQkJCW1vZGlmaWVkID0gMDsKLQkJCQlobnVtICs9IGFyZ2NudDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2snOgotCQljYXNlICctJzoKLQkJY2FzZSBDdHJsKCdwJyk6Ci0JCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIGhudW0gLSBhcmdjbnQpIDwgMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWVsc2UgewotCQkJCW1vZGlmaWVkID0gMDsKLQkJCQlobnVtIC09IGFyZ2NudDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ3InOgotCQkJaWYgKGVzLT5saW5lbGVuID09IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpZiAoY21kWzFdID09IDApCi0JCQkJdmlfZXJyb3IoKTsKLQkJCWVsc2UgewotCQkJCWludCBuOwotCi0JCQkJaWYgKGVzLT5jdXJzb3IgKyBhcmdjbnQgPiBlcy0+bGluZWxlbikKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJZm9yIChuID0gMDsgbiA8IGFyZ2NudDsgKytuKQotCQkJCQllcy0+Y2J1Zltlcy0+Y3Vyc29yICsgbl0gPSBjbWRbMV07Ci0JCQkJZXMtPmN1cnNvciArPSBuIC0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1InOgotCQkJbW9kaWZpZWQgPSAxOwotCQkJaG51bSA9IGhsYXN0OwotCQkJaW5zZXJ0ID0gUkVQTEFDRTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkJaWYgKGVzLT5saW5lbGVuID09IDApCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQltb2RpZmllZCA9IDE7Ci0JCQlobnVtID0gaGxhc3Q7Ci0JCQlpZiAoZXMtPmN1cnNvciArIGFyZ2NudCA+IGVzLT5saW5lbGVuKQotCQkJCWFyZ2NudCA9IGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcjsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKLQkJCWluc2VydCA9IElOU0VSVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ3YnOgotCQkJaWYgKCFhcmdjbnQpIHsKLQkJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuXSA9ICdcMCc7Ci0JCQkJCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIGVzLT5jYnVmLCB0cnVlLAotCQkJCQkgICAgdHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWFyZ2NudCA9IHNvdXJjZS0+bGluZSArIDEgLQotCQkJCQkgICAgKGhsYXN0IC0gaG51bSk7Ci0JCQl9Ci0JCQlpZiAoYXJnY250KQotCQkJCXNoZl9zbnByaW50Zihlcy0+Y2J1ZiwgZXMtPmNidWZzaXplLCAiJXMgJWQiLAotCQkJCSAgICAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwKLQkJCQkgICAgYXJnY250KTsKLQkJCWVsc2UKLQkJCQlzdHJsY3B5KGVzLT5jYnVmLAotCQkJCSAgICAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwKLQkJCQkgICAgZXMtPmNidWZzaXplKTsKLQkJCWVzLT5saW5lbGVuID0gc3RybGVuKGVzLT5jYnVmKTsKLQkJCXJldHVybiAoMik7Ci0KLQkJY2FzZSAneCc6Ci0JCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCW1vZGlmaWVkID0gMTsKLQkJCWhudW0gPSBobGFzdDsKLQkJCWlmIChlcy0+Y3Vyc29yICsgYXJnY250ID4gZXMtPmxpbmVsZW4pCi0JCQkJYXJnY250ID0gZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yOwotCQkJeWFua19yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKLQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQkJaWYgKGVzLT5jdXJzb3IgPiAwKSB7Ci0JCQkJbW9kaWZpZWQgPSAxOwotCQkJCWhudW0gPSBobGFzdDsKLQkJCQlpZiAoZXMtPmN1cnNvciA8IGFyZ2NudCkKLQkJCQkJYXJnY250ID0gZXMtPmN1cnNvcjsKLQkJCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IgLSBhcmdjbnQsIGVzLT5jdXJzb3IpOwotCQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yIC0gYXJnY250LCBlcy0+Y3Vyc29yKTsKLQkJCQllcy0+Y3Vyc29yIC09IGFyZ2NudDsKLQkJCX0gZWxzZQotCQkJCXJldHVybiAoLTEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAndSc6Ci0JCQl0ID0gZXM7Ci0JCQllcyA9IHVuZG87Ci0JCQl1bmRvID0gdDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1UnOgotCQkJaWYgKCFtb2RpZmllZCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgb2hudW0pIDwgMCkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCW1vZGlmaWVkID0gMDsKLQkJCWhudW0gPSBvaG51bTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJz8nOgotCQkJaWYgKGhudW0gPT0gaGxhc3QpCi0JCQkJaG51bSA9IC0xOwotCQkJLyogYWhoaCAqLwotCQljYXNlICcvJzoKLQkJCWMzID0gMTsKLQkJCXNyY2hsZW4gPSAwOwotCQkJbGFzdHNlYXJjaCA9ICpjbWQ7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlICduJzoKLQkJY2FzZSAnTic6Ci0JCQlpZiAobGFzdHNlYXJjaCA9PSAnICcpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlpZiAobGFzdHNlYXJjaCA9PSAnPycpCi0JCQkJYzEgPSAxOwotCQkJZWxzZQotCQkJCWMxID0gMDsKLQkJCWlmICgqY21kID09ICdOJykKLQkJCQljMSA9ICFjMTsKLQkJCWlmICgoYzIgPSBncmFic2VhcmNoKG1vZGlmaWVkLCBobnVtLAotCQkJICAgIGMxLCBzcmNocGF0KSkgPCAwKSB7Ci0JCQkJaWYgKGMzKSB7Ci0JCQkJCXJlc3RvcmVfY2J1ZigpOwotCQkJCQlyZWZyZXNoKDApOwotCQkJCX0KLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSAwOwotCQkJCWhudW0gPSBjMjsKLQkJCQlvaG51bSA9IGhudW07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnXyc6Ci0JCQl7Ci0JCQkJaW50IGluc3BhY2U7Ci0JCQkJY2hhciAqcCwgKnNwOwotCi0JCQkJaWYgKGhpc3RudW0oLTEpIDwgMCkKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQkJcCA9ICpoaXN0cG9zKCk7Ci0jZGVmaW5lIGlzc3AoYykJCShrc2hfaXNzcGFjZShjKSB8fCAoYykgPT0gJ1xuJykKLQkJCQlpZiAoYXJnY250KSB7Ci0JCQkJCXdoaWxlICgqcCAmJiBpc3NwKCpwKSkKLQkJCQkJCXArKzsKLQkJCQkJd2hpbGUgKCpwICYmIC0tYXJnY250KSB7Ci0JCQkJCQl3aGlsZSAoKnAgJiYgIWlzc3AoKnApKQotCQkJCQkJCXArKzsKLQkJCQkJCXdoaWxlICgqcCAmJiBpc3NwKCpwKSkKLQkJCQkJCQlwKys7Ci0JCQkJCX0KLQkJCQkJaWYgKCEqcCkKLQkJCQkJCXJldHVybiAoLTEpOwotCQkJCQlzcCA9IHA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3AgPSBwOwotCQkJCQlpbnNwYWNlID0gMDsKLQkJCQkJd2hpbGUgKCpwKSB7Ci0JCQkJCQlpZiAoaXNzcCgqcCkpCi0JCQkJCQkJaW5zcGFjZSA9IDE7Ci0JCQkJCQllbHNlIGlmIChpbnNwYWNlKSB7Ci0JCQkJCQkJaW5zcGFjZSA9IDA7Ci0JCQkJCQkJc3AgPSBwOwotCQkJCQkJfQotCQkJCQkJcCsrOwotCQkJCQl9Ci0JCQkJCXAgPSBzcDsKLQkJCQl9Ci0JCQkJbW9kaWZpZWQgPSAxOwotCQkJCWhudW0gPSBobGFzdDsKLQkJCQlpZiAoZXMtPmN1cnNvciAhPSBlcy0+bGluZWxlbikKLQkJCQkJZXMtPmN1cnNvcisrOwotCQkJCXdoaWxlICgqcCAmJiAhaXNzcCgqcCkpIHsKLQkJCQkJYXJnY250Kys7Ci0JCQkJCXArKzsKLQkJCQl9Ci0JCQkJaWYgKHB1dGJ1ZigiICIsIDEsIDApICE9IDApCi0JCQkJCWFyZ2NudCA9IC0xOwotCQkJCWVsc2UgaWYgKHB1dGJ1ZihzcCwgYXJnY250LCAwKSAhPSAwKQotCQkJCQlhcmdjbnQgPSAtMTsKLQkJCQlpZiAoYXJnY250IDwgMCkgewotCQkJCQlpZiAoZXMtPmN1cnNvciAhPSAwKQotCQkJCQkJZXMtPmN1cnNvci0tOwotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQl9Ci0JCQkJaW5zZXJ0ID0gSU5TRVJUOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnfic6Ci0JCQl7Ci0JCQkJY2hhciAqcDsKLQkJCQlpbnQgaTsKLQotCQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYXJnY250OyBpKyspIHsKLQkJCQkJcCA9ICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXTsKLQkJCQkJaWYgKGtzaF9pc2xvd2VyKCpwKSkgewotCQkJCQkJbW9kaWZpZWQgPSAxOwotCQkJCQkJaG51bSA9IGhsYXN0OwotCQkJCQkJKnAgPSBrc2hfdG91cHBlcigqcCk7Ci0JCQkJCX0gZWxzZSBpZiAoa3NoX2lzdXBwZXIoKnApKSB7Ci0JCQkJCQltb2RpZmllZCA9IDE7Ci0JCQkJCQlobnVtID0gaGxhc3Q7Ci0JCQkJCQkqcCA9IGtzaF90b2xvd2VyKCpwKTsKLQkJCQkJfQotCQkJCQlpZiAoZXMtPmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkKLQkJCQkJCWVzLT5jdXJzb3IrKzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJY2FzZSAnIyc6Ci0JCQl7Ci0JCQkJaW50IHJldCA9IHhfZG9fY29tbWVudChlcy0+Y2J1ZiwgZXMtPmNidWZzaXplLAotCQkJCSAgICAmZXMtPmxpbmVsZW4pOwotCQkJCWlmIChyZXQgPj0gMCkKLQkJCQkJZXMtPmN1cnNvciA9IDA7Ci0JCQkJcmV0dXJuIChyZXQpOwotCQkJfQotCi0JCWNhc2UgJz0nOgkJCS8qIEFUJlQga3NoICovCi0JCWNhc2UgQ3RybCgnZScpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLwotCQkJcHJpbnRfZXhwYW5zaW9ucyhlcywgMSk7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQ3RybCgnaScpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLwotCQkJaWYgKCFGbGFnKEZWSVRBQkNPTVBMRVRFKSkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWNvbXBsZXRlX3dvcmQoMSwgYXJnY250KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ3RybCgnWycpOgkJCS8qIHNvbWUgYW5ub3lpbmcgQVQmVCBrc2hzICovCi0JCQlpZiAoIUZsYWcoRlZJRVNDQ09NUExFVEUpKQotCQkJCXJldHVybiAoLTEpOwotCQljYXNlICdcXCc6CQkJLyogQVQmVCBrc2ggKi8KLQkJY2FzZSBDdHJsKCdmJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCi0JCQljb21wbGV0ZV93b3JkKDEsIGFyZ2NudCk7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgJyonOgkJCS8qIEFUJlQga3NoICovCi0JCWNhc2UgQ3RybCgneCcpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLwotCQkJZXhwYW5kX3dvcmQoMSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaW5zZXJ0ID09IDAgJiYgZXMtPmN1cnNvciAhPSAwICYmIGVzLT5jdXJzb3IgPj0gZXMtPmxpbmVsZW4pCi0JCQllcy0+Y3Vyc29yLS07Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvbW92ZShpbnQgYXJnY250LCBjb25zdCBjaGFyICpjbWQsIGludCBzdWIpCi17Ci0JaW50IGJjb3VudCwgaSA9IDAsIHQ7Ci0JaW50IG5jdXJzb3IgPSAwOwotCi0Jc3dpdGNoICgqY21kKSB7Ci0JY2FzZSAnYic6Ci0JCWlmICghc3ViICYmIGVzLT5jdXJzb3IgPT0gMCkKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gYmFja3dvcmQoYXJnY250KTsKLQkJYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciA9PSAwKQotCQkJcmV0dXJuICgtMSk7Ci0JCW5jdXJzb3IgPSBCYWNrd29yZChhcmdjbnQpOwotCQlicmVhazsKLQotCWNhc2UgJ2UnOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gZW5kd29yZChhcmdjbnQpOwotCQlpZiAoc3ViICYmIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IrKzsKLQkJYnJlYWs7Ci0KLQljYXNlICdFJzoKLQkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCi0JCQlyZXR1cm4gKC0xKTsKLQkJbmN1cnNvciA9IEVuZHdvcmQoYXJnY250KTsKLQkJaWYgKHN1YiAmJiBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCi0JCQluY3Vyc29yKys7Ci0JCWJyZWFrOwotCi0JY2FzZSAnZic6Ci0JY2FzZSAnRic6Ci0JY2FzZSAndCc6Ci0JY2FzZSAnVCc6Ci0JCWZzYXZlY21kID0gKmNtZDsKLQkJZnNhdmVjaCA9IGNtZFsxXTsKLQkJLyogZHJvcCB0aHJvdWdoICovCi0KLQljYXNlICcsJzoKLQljYXNlICc7JzoKLQkJaWYgKGZzYXZlY21kID09ICcgJykKLQkJCXJldHVybiAoLTEpOwotCQlpID0gZnNhdmVjbWQgPT0gJ2YnIHx8IGZzYXZlY21kID09ICdGJzsKLQkJdCA9IGZzYXZlY21kID4gJ2EnOwotCQlpZiAoKmNtZCA9PSAnLCcpCi0JCQl0ID0gIXQ7Ci0JCWlmICgobmN1cnNvciA9IGZpbmRjaChmc2F2ZWNoLCBhcmdjbnQsIHQsIGkpKSA8IDApCi0JCQlyZXR1cm4gKC0xKTsKLQkJaWYgKHN1YiAmJiB0KQotCQkJbmN1cnNvcisrOwotCQlicmVhazsKLQotCWNhc2UgJ2gnOgotCWNhc2UgQ3RybCgnaCcpOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yID09IDApCi0JCQlyZXR1cm4gKC0xKTsKLQkJbmN1cnNvciA9IGVzLT5jdXJzb3IgLSBhcmdjbnQ7Ci0JCWlmIChuY3Vyc29yIDwgMCkKLQkJCW5jdXJzb3IgPSAwOwotCQlicmVhazsKLQotCWNhc2UgJyAnOgotCWNhc2UgJ2wnOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkgewotCQkJbmN1cnNvciA9IGVzLT5jdXJzb3IgKyBhcmdjbnQ7Ci0JCQlpZiAobmN1cnNvciA+IGVzLT5saW5lbGVuKQotCQkJCW5jdXJzb3IgPSBlcy0+bGluZWxlbjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgJ3cnOgotCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKLQkJCXJldHVybiAoLTEpOwotCQluY3Vyc29yID0gZm9yd3dvcmQoYXJnY250KTsKLQkJYnJlYWs7Ci0KLQljYXNlICdXJzoKLQkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCi0JCQlyZXR1cm4gKC0xKTsKLQkJbmN1cnNvciA9IEZvcnd3b3JkKGFyZ2NudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JCW5jdXJzb3IgPSAwOwotCQlicmVhazsKLQotCWNhc2UgJ14nOgotCQluY3Vyc29yID0gMDsKLQkJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYKLQkJICAgIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCW5jdXJzb3IrKzsKLQkJYnJlYWs7Ci0KLQljYXNlICd8JzoKLQkJbmN1cnNvciA9IGFyZ2NudDsKLQkJaWYgKG5jdXJzb3IgPiBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IgPSBlcy0+bGluZWxlbjsKLQkJaWYgKG5jdXJzb3IpCi0JCQluY3Vyc29yLS07Ci0JCWJyZWFrOwotCi0JY2FzZSAnJCc6Ci0JCWlmIChlcy0+bGluZWxlbiAhPSAwKQotCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOwotCQllbHNlCi0JCQluY3Vyc29yID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlICclJzoKLQkJbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0JCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKLQkJICAgIChpID0gYnJhY2t0eXBlKGVzLT5jYnVmW25jdXJzb3JdKSkgPT0gMCkKLQkJCW5jdXJzb3IrKzsKLQkJaWYgKG5jdXJzb3IgPT0gZXMtPmxpbmVsZW4pCi0JCQlyZXR1cm4gKC0xKTsKLQkJYmNvdW50ID0gMTsKLQkJZG8gewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJaWYgKCsrbmN1cnNvciA+PSBlcy0+bGluZWxlbikKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgtLW5jdXJzb3IgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJCXQgPSBicmFja3R5cGUoZXMtPmNidWZbbmN1cnNvcl0pOwotCQkJaWYgKHQgPT0gaSkKLQkJCQliY291bnQrKzsKLQkJCWVsc2UgaWYgKHQgPT0gLWkpCi0JCQkJYmNvdW50LS07Ci0JCX0gd2hpbGUgKGJjb3VudCAhPSAwKTsKLQkJaWYgKHN1YiAmJiBpID4gMCkKLQkJCW5jdXJzb3IrKzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotcmVkb19pbnNlcnQoaW50IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tID4gMCkKLQkJaWYgKHB1dGJ1ZihpYnVmLCBpbnNsZW4sIGluc2VydCA9PSBSRVBMQUNFKSAhPSAwKQotCQkJcmV0dXJuICgtMSk7Ci0JaWYgKGVzLT5jdXJzb3IgPiAwKQotCQllcy0+Y3Vyc29yLS07Ci0JaW5zZXJ0ID0gMDsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAoteWFua19yYW5nZShpbnQgYSwgaW50IGIpCi17Ci0JeWFua2xlbiA9IGIgLSBhOwotCWlmICh5YW5rbGVuICE9IDApCi0JCW1lbW1vdmUoeWJ1ZiwgJmVzLT5jYnVmW2FdLCB5YW5rbGVuKTsKLX0KLQotc3RhdGljIGludAotYnJhY2t0eXBlKGludCBjaCkKLXsKLQlzd2l0Y2ggKGNoKSB7Ci0KLQljYXNlICcoJzoKLQkJcmV0dXJuICgxKTsKLQotCWNhc2UgJ1snOgotCQlyZXR1cm4gKDIpOwotCi0JY2FzZSAneyc6Ci0JCXJldHVybiAoMyk7Ci0KLQljYXNlICcpJzoKLQkJcmV0dXJuICgtMSk7Ci0KLQljYXNlICddJzoKLQkJcmV0dXJuICgtMik7Ci0KLQljYXNlICd9JzoKLQkJcmV0dXJuICgtMyk7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKDApOwotCX0KLX0KLQotLyoKLSAqCU5vbiB1c2VyIGludGVyZmFjZSBlZGl0b3Igcm91dGluZXMgYmVsb3cgaGVyZQotICovCi0KLXN0YXRpYyB2b2lkCi1zYXZlX2NidWYodm9pZCkKLXsKLQltZW1tb3ZlKGhvbGRidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7Ci0JaG9sZGxlbiA9IGVzLT5saW5lbGVuOwotCWhvbGRidWZbaG9sZGxlbl0gPSAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotcmVzdG9yZV9jYnVmKHZvaWQpCi17Ci0JZXMtPmN1cnNvciA9IDA7Ci0JZXMtPmxpbmVsZW4gPSBob2xkbGVuOwotCW1lbW1vdmUoZXMtPmNidWYsIGhvbGRidWYsIGhvbGRsZW4pOwotfQotCi0vKiByZXR1cm4gYSBuZXcgZWRzdGF0ZSAqLwotc3RhdGljIHN0cnVjdCBlZHN0YXRlICoKLXNhdmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKQotewotCXN0cnVjdCBlZHN0YXRlICpuZXdzOwotCi0JbmV3cyA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgZWRzdGF0ZSksIEFQRVJNKTsKLQluZXdzLT5jYnVmID0gYWxsb2Mob2xkLT5jYnVmc2l6ZSwgQVBFUk0pOwotCW1lbWNweShuZXdzLT5jYnVmLCBvbGQtPmNidWYsIG9sZC0+bGluZWxlbik7Ci0JbmV3cy0+Y2J1ZnNpemUgPSBvbGQtPmNidWZzaXplOwotCW5ld3MtPmxpbmVsZW4gPSBvbGQtPmxpbmVsZW47Ci0JbmV3cy0+Y3Vyc29yID0gb2xkLT5jdXJzb3I7Ci0JbmV3cy0+d2lubGVmdCA9IG9sZC0+d2lubGVmdDsKLQlyZXR1cm4gKG5ld3MpOwotfQotCi1zdGF0aWMgdm9pZAotcmVzdG9yZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpuZXdzLCBzdHJ1Y3QgZWRzdGF0ZSAqb2xkKQotewotCW1lbWNweShuZXdzLT5jYnVmLCBvbGQtPmNidWYsIG9sZC0+bGluZWxlbik7Ci0JbmV3cy0+bGluZWxlbiA9IG9sZC0+bGluZWxlbjsKLQluZXdzLT5jdXJzb3IgPSBvbGQtPmN1cnNvcjsKLQluZXdzLT53aW5sZWZ0ID0gb2xkLT53aW5sZWZ0OwotCWZyZWVfZWRzdGF0ZShvbGQpOwotfQotCi1zdGF0aWMgdm9pZAotZnJlZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpCi17Ci0JYWZyZWUob2xkLT5jYnVmLCBBUEVSTSk7Ci0JYWZyZWUob2xkLCBBUEVSTSk7Ci19Ci0KLS8qCi0gKiB0aGlzIGlzIHVzZWQgZm9yIGNhbGxpbmcgeF9lc2NhcGUoKSBpbiBjb21wbGV0ZV93b3JkKCkKLSAqLwotc3RhdGljIGludAoteF92aV9wdXRidWYoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikKLXsKLQlyZXR1cm4gKHB1dGJ1ZihzLCBsZW4sIDApKTsKLX0KLQotc3RhdGljIGludAotcHV0YnVmKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHJlcGwpCi17Ci0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gKDApOwotCWlmIChyZXBsKSB7Ci0JCWlmIChlcy0+Y3Vyc29yICsgbGVuID49IGVzLT5jYnVmc2l6ZSkKLQkJCXJldHVybiAoLTEpOwotCQlpZiAoZXMtPmN1cnNvciArIGxlbiA+IGVzLT5saW5lbGVuKQotCQkJZXMtPmxpbmVsZW4gPSBlcy0+Y3Vyc29yICsgbGVuOwotCX0gZWxzZSB7Ci0JCWlmIChlcy0+bGluZWxlbiArIGxlbiA+PSBlcy0+Y2J1ZnNpemUpCi0JCQlyZXR1cm4gKC0xKTsKLQkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvciArIGxlbl0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKLQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7Ci0JCWVzLT5saW5lbGVuICs9IGxlbjsKLQl9Ci0JbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvcl0sIGJ1ZiwgbGVuKTsKLQllcy0+Y3Vyc29yICs9IGxlbjsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotZGVsX3JhbmdlKGludCBhLCBpbnQgYikKLXsKLQlpZiAoZXMtPmxpbmVsZW4gIT0gYikKLQkJbWVtbW92ZSgmZXMtPmNidWZbYV0sICZlcy0+Y2J1ZltiXSwgZXMtPmxpbmVsZW4gLSBiKTsKLQllcy0+bGluZWxlbiAtPSBiIC0gYTsKLX0KLQotc3RhdGljIGludAotZmluZGNoKGludCBjaCwgaW50IGNudCwgaW50IGZvcncsIGludCBpbmNsKQotewotCWludCBuY3Vyc29yOwotCi0JaWYgKGVzLT5saW5lbGVuID09IDApCi0JCXJldHVybiAoLTEpOwotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChjbnQtLSkgewotCQlkbyB7Ci0JCQlpZiAoZm9ydykgewotCQkJCWlmICgrK25jdXJzb3IgPT0gZXMtPmxpbmVsZW4pCi0JCQkJCXJldHVybiAoLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoLS1uY3Vyc29yIDwgMCkKLQkJCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCX0gd2hpbGUgKGVzLT5jYnVmW25jdXJzb3JdICE9IGNoKTsKLQl9Ci0JaWYgKCFpbmNsKSB7Ci0JCWlmIChmb3J3KQotCQkJbmN1cnNvci0tOwotCQllbHNlCi0JCQluY3Vyc29yKys7Ci0JfQotCXJldHVybiAobmN1cnNvcik7Ci19Ci0KLXN0YXRpYyBpbnQKLWZvcnd3b3JkKGludCBhcmdjbnQpCi17Ci0JaW50IG5jdXJzb3I7Ci0KLQluY3Vyc29yID0gZXMtPmN1cnNvcjsKLQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmIGFyZ2NudC0tKSB7Ci0JCWlmIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQl3aGlsZSAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCi0JCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQotCQkJCW5jdXJzb3IrKzsKLQkJZWxzZSBpZiAoIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCXdoaWxlICgha3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCi0JCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgotCQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCQluY3Vyc29yKys7Ci0JCXdoaWxlIChrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IrKzsKLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotYmFja3dvcmQoaW50IGFyZ2NudCkKLXsKLQlpbnQgbmN1cnNvcjsKLQotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChuY3Vyc29yID4gMCAmJiBhcmdjbnQtLSkgewotCQl3aGlsZSAoLS1uY3Vyc29yID4gMCAmJiBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQk7Ci0JCWlmIChuY3Vyc29yID4gMCkgewotCQkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYKLQkJCQkgICAga3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCQk7Ci0JCQllbHNlCi0JCQkJd2hpbGUgKC0tbmN1cnNvciA+PSAwICYmCi0JCQkJICAgICFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCQkJOwotCQkJbmN1cnNvcisrOwotCQl9Ci0JfQotCXJldHVybiAobmN1cnNvcik7Ci19Ci0KLXN0YXRpYyBpbnQKLWVuZHdvcmQoaW50IGFyZ2NudCkKLXsKLQlpbnQgbmN1cnNvcjsKLQotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKLQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgotCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJOwotCQlpZiAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkgewotCQkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKLQkJCQkgICAga3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJCQk7Ci0JCQllbHNlCi0JCQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuICYmCi0JCQkJICAgICFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCQkJOwotCQkJbmN1cnNvci0tOwotCQl9Ci0JfQotCXJldHVybiAobmN1cnNvcik7Ci19Ci0KLXN0YXRpYyBpbnQKLUZvcnd3b3JkKGludCBhcmdjbnQpCi17Ci0JaW50IG5jdXJzb3I7Ci0KLQluY3Vyc29yID0gZXMtPmN1cnNvcjsKLQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmIGFyZ2NudC0tKSB7Ci0JCXdoaWxlICgha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCi0JCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCi0JCQluY3Vyc29yKys7Ci0JCXdoaWxlIChrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKLQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKLQkJCW5jdXJzb3IrKzsKLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotQmFja3dvcmQoaW50IGFyZ2NudCkKLXsKLQlpbnQgbmN1cnNvcjsKLQotCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOwotCXdoaWxlIChuY3Vyc29yID4gMCAmJiBhcmdjbnQtLSkgewotCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJOwotCQl3aGlsZSAobmN1cnNvciA+PSAwICYmICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCi0JCQluY3Vyc29yLS07Ci0JCW5jdXJzb3IrKzsKLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotRW5kd29yZChpbnQgYXJnY250KQotewotCWludCBuY3Vyc29yOwotCi0JbmN1cnNvciA9IGVzLT5jdXJzb3I7Ci0Jd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYgYXJnY250LS0pIHsKLQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgotCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQotCQkJOwotCQlpZiAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkgewotCQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuICYmCi0JCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKLQkJCQk7Ci0JCQluY3Vyc29yLS07Ci0JCX0KLQl9Ci0JcmV0dXJuIChuY3Vyc29yKTsKLX0KLQotc3RhdGljIGludAotZ3JhYmhpc3QoaW50IHNhdmUsIGludCBuKQotewotCWNoYXIgKmhwdHI7Ci0KLQlpZiAobiA8IDAgfHwgbiA+IGhsYXN0KQotCQlyZXR1cm4gKC0xKTsKLQlpZiAobiA9PSBobGFzdCkgewotCQlyZXN0b3JlX2NidWYoKTsKLQkJb2hudW0gPSBuOwotCQlyZXR1cm4gKDApOwotCX0KLQkodm9pZCloaXN0bnVtKG4pOwotCWlmICgoaHB0ciA9ICpoaXN0cG9zKCkpID09IE5VTEwpIHsKLQkJaW50ZXJuYWxfd2FybmluZ2YoImdyYWJoaXN0OiBiYWQgaGlzdG9yeSBhcnJheSIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKHNhdmUpCi0JCXNhdmVfY2J1ZigpOwotCWlmICgoZXMtPmxpbmVsZW4gPSBzdHJsZW4oaHB0cikpID49IGVzLT5jYnVmc2l6ZSkKLQkJZXMtPmxpbmVsZW4gPSBlcy0+Y2J1ZnNpemUgLSAxOwotCW1lbW1vdmUoZXMtPmNidWYsIGhwdHIsIGVzLT5saW5lbGVuKTsKLQllcy0+Y3Vyc29yID0gMDsKLQlvaG51bSA9IG47Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotZ3JhYnNlYXJjaChpbnQgc2F2ZSwgaW50IHN0YXJ0LCBpbnQgZndkLCBjaGFyICpwYXQpCi17Ci0JY2hhciAqaHB0cjsKLQlpbnQgaGlzdDsKLQlpbnQgYW5jaG9yZWQ7Ci0KLQlpZiAoKHN0YXJ0ID09IDAgJiYgZndkID09IDApIHx8IChzdGFydCA+PSBobGFzdCAtIDEgJiYgZndkID09IDEpKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoZndkKQotCQlzdGFydCsrOwotCWVsc2UKLQkJc3RhcnQtLTsKLQlhbmNob3JlZCA9ICpwYXQgPT0gJ14nID8gKCsrcGF0LCAxKSA6IDA7Ci0JaWYgKChoaXN0ID0gZmluZGhpc3Qoc3RhcnQsIGZ3ZCwgcGF0LCBhbmNob3JlZCkpIDwgMCkgewotCQkvKiBpZiAoc3RhcnQgIT0gMCAmJiBmd2QgJiYgbWF0Y2goaG9sZGJ1ZiwgcGF0KSA+PSAwKSB7ICovCi0JCS8qIFhYWCBzaG91bGQgc3RyY21wIGJlIHN0cm5jbXA/ICovCi0JCWlmIChzdGFydCAhPSAwICYmIGZ3ZCAmJiBzdHJjbXAoaG9sZGJ1ZiwgcGF0KSA+PSAwKSB7Ci0JCQlyZXN0b3JlX2NidWYoKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChzYXZlKQotCQlzYXZlX2NidWYoKTsKLQloaXN0bnVtKGhpc3QpOwotCWhwdHIgPSAqaGlzdHBvcygpOwotCWlmICgoZXMtPmxpbmVsZW4gPSBzdHJsZW4oaHB0cikpID49IGVzLT5jYnVmc2l6ZSkKLQkJZXMtPmxpbmVsZW4gPSBlcy0+Y2J1ZnNpemUgLSAxOwotCW1lbW1vdmUoZXMtPmNidWYsIGhwdHIsIGVzLT5saW5lbGVuKTsKLQllcy0+Y3Vyc29yID0gMDsKLQlyZXR1cm4gKGhpc3QpOwotfQotCi1zdGF0aWMgdm9pZAotcmVkcmF3X2xpbmUoaW50IG5ld2wpCi17Ci0JKHZvaWQpbWVtc2V0KHdidWZbd2luXSwgJyAnLCB3YnVmX2xlbik7Ci0JaWYgKG5ld2wpIHsKLQkJeF9wdXRjKCdccicpOwotCQl4X3B1dGMoJ1xuJyk7Ci0JfQotCWlmIChwcm9tcHRfcmVkcmF3KQotCQlwcHJvbXB0KHByb21wdCwgcHJvbXB0X3RydW5jKTsKLQljdXJfY29sID0gcHdpZHRoOwotCW1vcmVjID0gJyAnOwotfQotCi1zdGF0aWMgdm9pZAotcmVmcmVzaChpbnQgbGVmdHNpZGUpCi17Ci0JaWYgKGxlZnRzaWRlIDwgMCkKLQkJbGVmdHNpZGUgPSBsYXN0cmVmOwotCWVsc2UKLQkJbGFzdHJlZiA9IGxlZnRzaWRlOwotCWlmIChvdXRvZndpbigpKQotCQlyZXdpbmRvdygpOwotCWRpc3BsYXkod2J1ZlsxIC0gd2luXSwgd2J1Zlt3aW5dLCBsZWZ0c2lkZSk7Ci0Jd2luID0gMSAtIHdpbjsKLX0KLQotc3RhdGljIGludAotb3V0b2Z3aW4odm9pZCkKLXsKLQlpbnQgY3VyLCBjb2w7Ci0KLQlpZiAoZXMtPmN1cnNvciA8IGVzLT53aW5sZWZ0KQotCQlyZXR1cm4gKDEpOwotCWNvbCA9IDA7Ci0JY3VyID0gZXMtPndpbmxlZnQ7Ci0Jd2hpbGUgKGN1ciA8IGVzLT5jdXJzb3IpCi0JCWNvbCA9IG5ld2NvbCgodW5zaWduZWQgY2hhcillcy0+Y2J1ZltjdXIrK10sIGNvbCk7Ci0JaWYgKGNvbCA+PSB3aW53aWR0aCkKLQkJcmV0dXJuICgxKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotcmV3aW5kb3codm9pZCkKLXsKLQlpbnQgdGN1ciwgdGNvbDsKLQlpbnQgaG9sZGN1cjEsIGhvbGRjb2wxOwotCWludCBob2xkY3VyMiwgaG9sZGNvbDI7Ci0KLQlob2xkY3VyMSA9IGhvbGRjdXIyID0gdGN1ciA9IDA7Ci0JaG9sZGNvbDEgPSBob2xkY29sMiA9IHRjb2wgPSAwOwotCXdoaWxlICh0Y3VyIDwgZXMtPmN1cnNvcikgewotCQlpZiAodGNvbCAtIGhvbGRjb2wyID4gd2lud2lkdGggLyAyKSB7Ci0JCQlob2xkY3VyMSA9IGhvbGRjdXIyOwotCQkJaG9sZGNvbDEgPSBob2xkY29sMjsKLQkJCWhvbGRjdXIyID0gdGN1cjsKLQkJCWhvbGRjb2wyID0gdGNvbDsKLQkJfQotCQl0Y29sID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW3RjdXIrK10sIHRjb2wpOwotCX0KLQl3aGlsZSAodGNvbCAtIGhvbGRjb2wxID4gd2lud2lkdGggLyAyKQotCQlob2xkY29sMSA9IG5ld2NvbCgodW5zaWduZWQgY2hhcillcy0+Y2J1Zltob2xkY3VyMSsrXSwKLQkJICAgIGhvbGRjb2wxKTsKLQllcy0+d2lubGVmdCA9IGhvbGRjdXIxOwotfQotCi1zdGF0aWMgaW50Ci1uZXdjb2woaW50IGNoLCBpbnQgY29sKQotewotCWlmIChjaCA9PSAnXHQnKQotCQlyZXR1cm4gKChjb2wgfCA3KSArIDEpOwotCXJldHVybiAoY29sICsgY2hhcl9sZW4oY2gpKTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXkoY2hhciAqd2IxLCBjaGFyICp3YjIsIGludCBsZWZ0c2lkZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCWNoYXIgKnR3YjEsICp0d2IyLCBtYzsKLQlpbnQgY3VyLCBjb2wsIGNudDsKLQlpbnQgbmNvbCA9IDA7Ci0JaW50IG1vcmVyaWdodDsKLQotCWNvbCA9IDA7Ci0JY3VyID0gZXMtPndpbmxlZnQ7Ci0JbW9yZXJpZ2h0ID0gMDsKLQl0d2IxID0gd2IxOwotCXdoaWxlIChjb2wgPCB3aW53aWR0aCAmJiBjdXIgPCBlcy0+bGluZWxlbikgewotCQlpZiAoY3VyID09IGVzLT5jdXJzb3IgJiYgbGVmdHNpZGUpCi0JCQluY29sID0gY29sICsgcHdpZHRoOwotCQlpZiAoKGNoID0gZXMtPmNidWZbY3VyXSkgPT0gJ1x0JykKLQkJCWRvIHsKLQkJCQkqdHdiMSsrID0gJyAnOwotCQkJfSB3aGlsZSAoKytjb2wgPCB3aW53aWR0aCAmJiAoY29sICYgNykgIT0gMCk7Ci0JCWVsc2UgaWYgKGNvbCA8IHdpbndpZHRoKSB7Ci0JCQlpZiAoY2ggPCAnICcgfHwgY2ggPT0gMHg3ZikgewotCQkJCSp0d2IxKysgPSAnXic7Ci0JCQkJaWYgKCsrY29sIDwgd2lud2lkdGgpIHsKLQkJCQkJKnR3YjErKyA9IGNoIF4gJ0AnOwotCQkJCQljb2wrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCSp0d2IxKysgPSBjaDsKLQkJCQljb2wrKzsKLQkJCX0KLQkJfQotCQlpZiAoY3VyID09IGVzLT5jdXJzb3IgJiYgIWxlZnRzaWRlKQotCQkJbmNvbCA9IGNvbCArIHB3aWR0aCAtIDE7Ci0JCWN1cisrOwotCX0KLQlpZiAoY3VyID09IGVzLT5jdXJzb3IpCi0JCW5jb2wgPSBjb2wgKyBwd2lkdGg7Ci0JaWYgKGNvbCA8IHdpbndpZHRoKSB7Ci0JCXdoaWxlIChjb2wgPCB3aW53aWR0aCkgewotCQkJKnR3YjErKyA9ICcgJzsKLQkJCWNvbCsrOwotCQl9Ci0JfSBlbHNlCi0JCW1vcmVyaWdodCsrOwotCSp0d2IxID0gJyAnOwotCi0JY29sID0gcHdpZHRoOwotCWNudCA9IHdpbndpZHRoOwotCXR3YjEgPSB3YjE7Ci0JdHdiMiA9IHdiMjsKLQl3aGlsZSAoY250LS0pIHsKLQkJaWYgKCp0d2IxICE9ICp0d2IyKSB7Ci0JCQlpZiAoY3VyX2NvbCAhPSBjb2wpCi0JCQkJZWRfbW92X29wdChjb2wsIHdiMSk7Ci0JCQl4X3B1dGMoKnR3YjEpOwotCQkJY3VyX2NvbCsrOwotCQl9Ci0JCXR3YjErKzsKLQkJdHdiMisrOwotCQljb2wrKzsKLQl9Ci0JaWYgKGVzLT53aW5sZWZ0ID4gMCAmJiBtb3JlcmlnaHQpCi0JCS8qIFBPU0lYIHNheXMgdG8gdXNlICogZm9yIHRoaXMgYnV0IHRoYXQgaXMgYSBnbG9iYmluZwotCQkgKiBjaGFyYWN0ZXIgYW5kIG1heSBjb25mdXNlIHBlb3BsZTsgKyBpcyBtb3JlIGlubm9jdW91cwotCQkgKi8KLQkJbWMgPSAnKyc7Ci0JZWxzZSBpZiAoZXMtPndpbmxlZnQgPiAwKQotCQltYyA9ICc8JzsKLQllbHNlIGlmIChtb3JlcmlnaHQpCi0JCW1jID0gJz4nOwotCWVsc2UKLQkJbWMgPSAnICc7Ci0JaWYgKG1jICE9IG1vcmVjKSB7Ci0JCWVkX21vdl9vcHQocHdpZHRoICsgd2lud2lkdGggKyAxLCB3YjEpOwotCQl4X3B1dGMobWMpOwotCQljdXJfY29sKys7Ci0JCW1vcmVjID0gbWM7Ci0JfQotCWlmIChjdXJfY29sICE9IG5jb2wpCi0JCWVkX21vdl9vcHQobmNvbCwgd2IxKTsKLX0KLQotc3RhdGljIHZvaWQKLWVkX21vdl9vcHQoaW50IGNvbCwgY2hhciAqd2IpCi17Ci0JaWYgKGNvbCA8IGN1cl9jb2wpIHsKLQkJaWYgKGNvbCArIDEgPCBjdXJfY29sIC0gY29sKSB7Ci0JCQl4X3B1dGMoJ1xyJyk7Ci0JCQlpZiAocHJvbXB0X3JlZHJhdykKLQkJCQlwcHJvbXB0KHByb21wdCwgcHJvbXB0X3RydW5jKTsKLQkJCWN1cl9jb2wgPSBwd2lkdGg7Ci0JCQl3aGlsZSAoY3VyX2NvbCsrIDwgY29sKQotCQkJCXhfcHV0Y2YoKndiKyspOwotCQl9IGVsc2UgewotCQkJd2hpbGUgKGN1cl9jb2wtLSA+IGNvbCkKLQkJCQl4X3B1dGMoJ1xiJyk7Ci0JCX0KLQl9IGVsc2UgewotCQl3YiA9ICZ3YltjdXJfY29sIC0gcHdpZHRoXTsKLQkJd2hpbGUgKGN1cl9jb2wrKyA8IGNvbCkKLQkJCXhfcHV0Y2YoKndiKyspOwotCX0KLQljdXJfY29sID0gY29sOwotfQotCi0KLS8qIHJlcGxhY2Ugd29yZCB3aXRoIGFsbCBleHBhbnNpb25zIChpZSwgZXhwYW5kIHdvcmQqKSAqLwotc3RhdGljIGludAotZXhwYW5kX3dvcmQoaW50IGNtZCkKLXsKLQlzdGF0aWMgc3RydWN0IGVkc3RhdGUgKmJ1ZjsKLQlpbnQgcnZhbCA9IDA7Ci0JaW50IG53b3JkczsKLQlpbnQgc3RhcnQsIGVuZDsKLQljaGFyICoqd29yZHM7Ci0JaW50IGk7Ci0KLQkvKiBVbmRvIHByZXZpb3VzIGV4cGFuc2lvbiAqLwotCWlmIChjbWQgPT0gMCAmJiBleHBhbmRlZCA9PSBFWFBBTkQgJiYgYnVmKSB7Ci0JCXJlc3RvcmVfZWRzdGF0ZShlcywgYnVmKTsKLQkJYnVmID0gMDsKLQkJZXhwYW5kZWQgPSBOT05FOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoYnVmKSB7Ci0JCWZyZWVfZWRzdGF0ZShidWYpOwotCQlidWYgPSAwOwotCX0KLQotCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfQ09NTUFORF9GSUxFfFhDRl9GVUxMUEFUSCwKLQkgICAgZXMtPmNidWYsIGVzLT5saW5lbGVuLCBlcy0+Y3Vyc29yLAotCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgTlVMTCk7Ci0JaWYgKG53b3JkcyA9PSAwKSB7Ci0JCXZpX2Vycm9yKCk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWJ1ZiA9IHNhdmVfZWRzdGF0ZShlcyk7Ci0JZXhwYW5kZWQgPSBFWFBBTkQ7Ci0JZGVsX3JhbmdlKHN0YXJ0LCBlbmQpOwotCWVzLT5jdXJzb3IgPSBzdGFydDsKLQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyApIHsKLQkJaWYgKHhfZXNjYXBlKHdvcmRzW2ldLCBzdHJsZW4od29yZHNbaV0pLCB4X3ZpX3B1dGJ1ZikgIT0gMCkgewotCQkJcnZhbCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCsraSA8IG53b3JkcyAmJiBwdXRidWYoIiAiLCAxLCAwKSAhPSAwKSB7Ci0JCQlydmFsID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpID0gYnVmLT5jdXJzb3IgLSBlbmQ7Ci0JaWYgKHJ2YWwgPT0gMCAmJiBpID4gMCkKLQkJZXMtPmN1cnNvciArPSBpOwotCW1vZGlmaWVkID0gMTsKLQlobnVtID0gaGxhc3Q7Ci0JaW5zZXJ0ID0gSU5TRVJUOwotCWxhc3RhYyA9IDA7Ci0JcmVmcmVzaCgwKTsKLQlyZXR1cm4gKHJ2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1jb21wbGV0ZV93b3JkKGludCBjbWQsIGludCBjb3VudCkKLXsKLQlzdGF0aWMgc3RydWN0IGVkc3RhdGUgKmJ1ZjsKLQlpbnQgcnZhbCwgbndvcmRzLCBzdGFydCwgZW5kLCBtYXRjaF9sZW47Ci0JY2hhciAqKndvcmRzOwotCWNoYXIgKm1hdGNoOwotCWJvb2wgaXNfY29tbWFuZCwgaXNfdW5pcXVlOwotCi0JLyogVW5kbyBwcmV2aW91cyBjb21wbGV0aW9uICovCi0JaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IENPTVBMRVRFICYmIGJ1ZikgewotCQlwcmludF9leHBhbnNpb25zKGJ1ZiwgMCk7Ci0JCWV4cGFuZGVkID0gUFJJTlQ7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChjbWQgPT0gMCAmJiBleHBhbmRlZCA9PSBQUklOVCAmJiBidWYpIHsKLQkJcmVzdG9yZV9lZHN0YXRlKGVzLCBidWYpOwotCQlidWYgPSAwOwotCQlleHBhbmRlZCA9IE5PTkU7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChidWYpIHsKLQkJZnJlZV9lZHN0YXRlKGJ1Zik7Ci0JCWJ1ZiA9IDA7Ci0JfQotCi0JLyogWENGX0ZVTExQQVRIIGZvciBjb3VudCAnY2F1c2UgdGhlIG1lbnUgcHJpbnRlZCBieSBwcmludF9leHBhbnNpb25zKCkKLQkgKiB3YXMgZG9uZSB0aGlzIHdheS4KLQkgKi8KLQlud29yZHMgPSB4X2NmX2dsb2IoWENGX0NPTU1BTkRfRklMRSB8IChjb3VudCA/IFhDRl9GVUxMUEFUSCA6IDApLAotCSAgICBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4sIGVzLT5jdXJzb3IsCi0JICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7Ci0JaWYgKG53b3JkcyA9PSAwKSB7Ci0JCXZpX2Vycm9yKCk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoY291bnQpIHsKLQkJaW50IGk7Ci0KLQkJY291bnQtLTsKLQkJaWYgKGNvdW50ID49IG53b3JkcykgewotCQkJdmlfZXJyb3IoKTsKLQkJCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKLQkJCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKLQkJCXJlZHJhd19saW5lKDApOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJLyoKLQkJICogRXhwYW5kIHRoZSBjb3VudCd0aCB3b3JkIHRvIGl0cyBiYXNlbmFtZQotCQkgKi8KLQkJaWYgKGlzX2NvbW1hbmQpIHsKLQkJCW1hdGNoID0gd29yZHNbY291bnRdICsKLQkJCSAgICB4X2Jhc2VuYW1lKHdvcmRzW2NvdW50XSwgTlVMTCk7Ci0JCQkvKiBJZiBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIG1hdGNoLCB1c2UgZnVsbCBwYXRoICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCi0JCQkJaWYgKGkgIT0gY291bnQgJiYKLQkJCQkgICAgc3RyY21wKHdvcmRzW2ldICsgeF9iYXNlbmFtZSh3b3Jkc1tpXSwKLQkJCQkgICAgTlVMTCksIG1hdGNoKSA9PSAwKSB7Ci0JCQkJCW1hdGNoID0gd29yZHNbY291bnRdOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0gZWxzZQotCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF07Ci0JCW1hdGNoX2xlbiA9IHN0cmxlbihtYXRjaCk7Ci0JCWlzX3VuaXF1ZSA9IHRydWU7Ci0JCS8qIGV4cGFuZGVkID0gUFJJTlQ7CW5leHQgY2FsbCB1bmRvICovCi0JfSBlbHNlIHsKLQkJbWF0Y2ggPSB3b3Jkc1swXTsKLQkJbWF0Y2hfbGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKTsKLQkJZXhwYW5kZWQgPSBDT01QTEVURTsJLyogbmV4dCBjYWxsIHdpbGwgbGlzdCBjb21wbGV0aW9ucyAqLwotCQlpc191bmlxdWUgPSBud29yZHMgPT0gMTsKLQl9Ci0KLQlidWYgPSBzYXZlX2Vkc3RhdGUoZXMpOwotCWRlbF9yYW5nZShzdGFydCwgZW5kKTsKLQllcy0+Y3Vyc29yID0gc3RhcnQ7Ci0KLQkvKiBlc2NhcGUgYWxsIHNoZWxsLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvCi0JICogY29tbWFuZCBidWZmZXIgKi8KLQlydmFsID0geF9lc2NhcGUobWF0Y2gsIG1hdGNoX2xlbiwgeF92aV9wdXRidWYpOwotCi0JaWYgKHJ2YWwgPT0gMCAmJiBpc191bmlxdWUpIHsKLQkJLyogSWYgZXhhY3QgbWF0Y2gsIGRvbid0IHVuZG8uIEFsbG93cyBkaXJlY3RvcnkgY29tcGxldGlvbnMKLQkJICogdG8gYmUgdXNlZCAoaWUsIGNvbXBsZXRlIHRoZSBuZXh0IHBvcnRpb24gb2YgdGhlIHBhdGgpLgotCQkgKi8KLQkJZXhwYW5kZWQgPSBOT05FOwotCi0JCS8qIElmIG5vdCBhIGRpcmVjdG9yeSwgYWRkIGEgc3BhY2UgdG8gdGhlIGVuZC4uLiAqLwotCQlpZiAobWF0Y2hfbGVuID4gMCAmJiBtYXRjaFttYXRjaF9sZW4gLSAxXSAhPSAnLycpCi0JCQlydmFsID0gcHV0YnVmKCIgIiwgMSwgMCk7Ci0JfQotCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKLQotCW1vZGlmaWVkID0gMTsKLQlobnVtID0gaGxhc3Q7Ci0JaW5zZXJ0ID0gSU5TRVJUOwotCWxhc3RhYyA9IDA7CSAvKiBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyByZWRvbmUuLi4gKi8KLQlyZWZyZXNoKDApOwotCi0JcmV0dXJuIChydmFsKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfZXhwYW5zaW9ucyhzdHJ1Y3QgZWRzdGF0ZSAqZXN0LCBpbnQgY21kIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IHN0YXJ0LCBlbmQsIG53b3JkczsKLQljaGFyICoqd29yZHM7Ci0JYm9vbCBpc19jb21tYW5kOwotCi0JbndvcmRzID0geF9jZl9nbG9iKFhDRl9DT01NQU5EX0ZJTEUgfCBYQ0ZfRlVMTFBBVEgsCi0JICAgIGVzdC0+Y2J1ZiwgZXN0LT5saW5lbGVuLCBlc3QtPmN1cnNvciwKLQkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKLQlpZiAobndvcmRzID09IDApIHsKLQkJdmlfZXJyb3IoKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKLQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7Ci0JcmVkcmF3X2xpbmUoMCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogU2ltaWxhciB0byB4X3pvdGMoZW1hY3MuYyksIGJ1dCBubyB0YWIgd2VpcmRuZXNzICovCi1zdGF0aWMgdm9pZAoteF92aV96b3RjKGludCBjKQotewotCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgewotCQl4X3B1dGMoJ14nKTsKLQkJYyBePSAnQCc7Ci0JfQotCXhfcHV0YyhjKTsKLX0KLQotc3RhdGljIHZvaWQKLXZpX2Vycm9yKHZvaWQpCi17Ci0JLyogQmVlbSBvdXQgb2YgYW55IG1hY3JvcyBhcyBzb29uIGFzIGFuIGVycm9yIG9jY3VycyAqLwotCXZpX21hY3JvX3Jlc2V0KCk7Ci0JeF9wdXRjKDcpOwotCXhfZmx1c2goKTsKLX0KLQotc3RhdGljIHZvaWQKLXZpX21hY3JvX3Jlc2V0KHZvaWQpCi17Ci0JaWYgKG1hY3JvLnApIHsKLQkJYWZyZWUobWFjcm8uYnVmLCBBUEVSTSk7Ci0JCW1lbXNldCgoY2hhciAqKSZtYWNybywgMCwgc2l6ZW9mKG1hY3JvKSk7Ci0JfQotfQotI2VuZGlmIC8qICFNS1NIX1NfTk9WSSAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZW1hY3Nmbi5oIGIvbWtzaC9zcmMvZW1hY3Nmbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzMzMzk5Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2VtYWNzZm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSNpZiBkZWZpbmVkKEVNQUNTRk5fREVGTlMpCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9lbWFjc2ZuLmgsdiAxLjUgMjAxMC8wNy8xNyAyMjowOTozMyB0ZyBFeHAgJCIpOwotI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJc3RhdGljIGludCB4XyMjY25hbWUoaW50KTsKLSNlbGlmIGRlZmluZWQoRU1BQ1NGTl9FTlVNUykKLSNkZWZpbmUgRk4oY25hbWUsc25hbWUsZmxhZ3MpCVhGVU5DXyMjY25hbWUsCi0jZGVmaW5lIEYwKGNuYW1lLHNuYW1lLGZsYWdzKQlYRlVOQ18jI2NuYW1lID0gMCwKLSNlbGlmIGRlZmluZWQoRU1BQ1NGTl9JVEVNUykKLSNkZWZpbmUgRk4oY25hbWUsc25hbWUsZmxhZ3MpCXsgeF8jI2NuYW1lLCBzbmFtZSwgZmxhZ3MgfSwKLSNlbmRpZgotCi0jaWZuZGVmIEYwCi0jZGVmaW5lIEYwIEZOCi0jZW5kaWYKLQotRjAoYWJvcnQsICJhYm9ydCIsIDApCi1GTihiZWdfaGlzdCwgImJlZ2lubmluZy1vZi1oaXN0b3J5IiwgMCkKLUZOKGNscywgImNsZWFyLXNjcmVlbiIsIDApCi1GTihjb21tZW50LCAiY29tbWVudCIsIDApCi1GTihjb21wX2NvbW0sICJjb21wbGV0ZS1jb21tYW5kIiwgMCkKLUZOKGNvbXBfZmlsZSwgImNvbXBsZXRlLWZpbGUiLCAwKQotRk4oY29tcF9saXN0LCAiY29tcGxldGUtbGlzdCIsIDApCi1GTihjb21wbGV0ZSwgImNvbXBsZXRlIiwgMCkKLUZOKGRlbF9iYWNrLCAiZGVsZXRlLWNoYXItYmFja3dhcmQiLCBYRl9BUkcpCi1GTihkZWxfYndvcmQsICJkZWxldGUtd29yZC1iYWNrd2FyZCIsIFhGX0FSRykKLUZOKGRlbF9jaGFyLCAiZGVsZXRlLWNoYXItZm9yd2FyZCIsIFhGX0FSRykKLUZOKGRlbF9md29yZCwgImRlbGV0ZS13b3JkLWZvcndhcmQiLCBYRl9BUkcpCi1GTihkZWxfbGluZSwgImtpbGwtbGluZSIsIDApCi1GTihkcmF3X2xpbmUsICJyZWRyYXciLCAwKQotI2lmbmRlZiBNS1NIX1NNQUxMCi1GTihlZGl0X2xpbmUsICJlZGl0LWxpbmUiLCBYRl9BUkcpCi0jZW5kaWYKLUZOKGVuZF9oaXN0LCAiZW5kLW9mLWhpc3RvcnkiLCAwKQotRk4oZW5kX29mX3RleHQsICJlb3QiLCAwKQotRk4oZW51bWVyYXRlLCAibGlzdCIsIDApCi1GTihlb3RfZGVsLCAiZW90LW9yLWRlbGV0ZSIsIFhGX0FSRykKLUZOKGVycm9yLCAiZXJyb3IiLCAwKQotRk4oZXhwYW5kLCAiZXhwYW5kLWZpbGUiLCAwKQotI2lmbmRlZiBNS1NIX1NNQUxMCi1GTihmb2xkX2NhcGl0YWxpc2UsICJjYXBpdGFsaXplLXdvcmQiLCBYRl9BUkcpCi1GTihmb2xkX2xvd2VyLCAiZG93bmNhc2Utd29yZCIsIFhGX0FSRykKLUZOKGZvbGRfdXBwZXIsICJ1cGNhc2Utd29yZCIsIFhGX0FSRykKLSNlbmRpZgotRk4oZ290b19oaXN0LCAiZ290by1oaXN0b3J5IiwgWEZfQVJHKQotI2lmbmRlZiBNS1NIX1NNQUxMCi1GTihpbnNfc3RyaW5nLCAibWFjcm8tc3RyaW5nIiwgWEZfTk9CSU5EKQotI2VuZGlmCi1GTihpbnNlcnQsICJhdXRvLWluc2VydCIsIFhGX0FSRykKLUZOKGtpbGwsICJraWxsLXRvLWVvbCIsIFhGX0FSRykKLUZOKGtpbGxfcmVnaW9uLCAia2lsbC1yZWdpb24iLCAwKQotRk4obGlzdF9jb21tLCAibGlzdC1jb21tYW5kIiwgMCkKLUZOKGxpc3RfZmlsZSwgImxpc3QtZmlsZSIsIDApCi1GTihsaXRlcmFsLCAicXVvdGUiLCAwKQotRk4obWV0YTEsICJwcmVmaXgtMSIsIFhGX1BSRUZJWCkKLUZOKG1ldGEyLCAicHJlZml4LTIiLCBYRl9QUkVGSVgpCi1GTihtZXRhX3lhbmssICJ5YW5rLXBvcCIsIDApCi1GTihtdl9iYWNrLCAiYmFja3dhcmQtY2hhciIsIFhGX0FSRykKLUZOKG12X2JlZ2luLCAiYmVnaW5uaW5nLW9mLWxpbmUiLCAwKQotRk4obXZfYndvcmQsICJiYWNrd2FyZC13b3JkIiwgWEZfQVJHKQotRk4obXZfZW5kLCAiZW5kLW9mLWxpbmUiLCAwKQotRk4obXZfZm9ydywgImZvcndhcmQtY2hhciIsIFhGX0FSRykKLUZOKG12X2Z3b3JkLCAiZm9yd2FyZC13b3JkIiwgWEZfQVJHKQotRk4obmV3bGluZSwgIm5ld2xpbmUiLCAwKQotRk4obmV4dF9jb20sICJkb3duLWhpc3RvcnkiLCBYRl9BUkcpCi1GTihubF9uZXh0X2NvbSwgIm5ld2xpbmUtYW5kLW5leHQiLCAwKQotRk4obm9vcCwgIm5vLW9wIiwgMCkKLUZOKHByZXZfY29tLCAidXAtaGlzdG9yeSIsIFhGX0FSRykKLUZOKHByZXZfaGlzdHdvcmQsICJwcmV2LWhpc3Qtd29yZCIsIFhGX0FSRykKLUZOKHNlYXJjaF9jaGFyX2JhY2ssICJzZWFyY2gtY2hhcmFjdGVyLWJhY2t3YXJkIiwgWEZfQVJHKQotRk4oc2VhcmNoX2NoYXJfZm9ydywgInNlYXJjaC1jaGFyYWN0ZXItZm9yd2FyZCIsIFhGX0FSRykKLUZOKHNlYXJjaF9oaXN0LCAic2VhcmNoLWhpc3RvcnkiLCAwKQotI2lmbmRlZiBNS1NIX1NNQUxMCi1GTihzZWFyY2hfaGlzdF9kbiwgInNlYXJjaC1oaXN0b3J5LWRvd24iLCAwKQotRk4oc2VhcmNoX2hpc3RfdXAsICJzZWFyY2gtaGlzdG9yeS11cCIsIDApCi0jZW5kaWYKLUZOKHNldF9hcmcsICJzZXQtYXJnIiwgWEZfTk9CSU5EKQotRk4oc2V0X21hcmssICJzZXQtbWFyay1jb21tYW5kIiwgMCkKLUZOKHRyYW5zcG9zZSwgInRyYW5zcG9zZS1jaGFycyIsIDApCi1GTih2ZXJzaW9uLCAidmVyc2lvbiIsIDApCi0jaWZuZGVmIE1LU0hfU01BTEwKLUZOKHZ0X2hhY2ssICJ2dDEwMC1oYWNrIiwgWEZfQVJHKQotI2VuZGlmCi1GTih4Y2hnX3BvaW50X21hcmssICJleGNoYW5nZS1wb2ludC1hbmQtbWFyayIsIDApCi1GTih5YW5rLCAieWFuayIsIDApCi0KLSN1bmRlZiBGTgotI3VuZGVmIEYwCi0jdW5kZWYgRU1BQ1NGTl9ERUZOUwotI3VuZGVmIEVNQUNTRk5fRU5VTVMKLSN1bmRlZiBFTUFDU0ZOX0lURU1TCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9ldmFsLmMgYi9ta3NoL3NyYy9ldmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmUzNDYuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvZXZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU4MCArMCwwIEBACi0vKgkkT3BlbkJTRDogZXZhbC5jLHYgMS4zNSAyMDEwLzAzLzI0IDA4OjI3OjI2IGZnc2NoIEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXZhbC5jLHYgMS45MCAyMDEwLzA3LzE3IDIyOjA5OjMzIHRnIEV4cCAkIik7Ci0KLS8qCi0gKiBzdHJpbmcgZXhwYW5zaW9uCi0gKgotICogZmlyc3QgcGFzczogcXVvdGluZywgSUZTIHNlcGFyYXRpb24sIH4sICR7fSwgJCgpIGFuZCAkKCgpKSBzdWJzdGl0dXRpb24uCi0gKiBzZWNvbmQgcGFzczogYWx0ZXJuYXRpb24gKHssfSksIGZpbGVuYW1lIGV4cGFuc2lvbiAoKj9bXSkuCi0gKi8KLQotLyogZXhwYW5zaW9uIGdlbmVyYXRvciBzdGF0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgRXhwYW5kIHsKLQkvKiBpbnQgdHlwZTsgKi8JCQkvKiBzZWUgZXhwYW5kKCkgKi8KLQljb25zdCBjaGFyICpzdHI7CQkvKiBzdHJpbmcgKi8KLQl1bmlvbiB7Ci0JCWNvbnN0IGNoYXIgKipzdHJ2OwkvKiBzdHJpbmdbXSAqLwotCQlzdHJ1Y3Qgc2hmICpzaGY7CS8qIGZpbGUgKi8KLQl9IHU7CQkJCS8qIHNvdXJjZSAqLwotCXN0cnVjdCB0YmwgKnZhcjsJCS8qIHZhcmlhYmxlIGluICR7dmFyLi59ICovCi0Jc2hvcnQgc3BsaXQ7CQkJLyogc3BsaXQgIiRAIiAvIGNhbGwgd2FpdGxhc3QgJCgpICovCi19IEV4cGFuZDsKLQotI2RlZmluZQlYQkFTRQkJMAkvKiBzY2FubmluZyBvcmlnaW5hbCAqLwotI2RlZmluZQlYU1VCCQkxCS8qIGV4cGFuZGluZyAke30gc3RyaW5nICovCi0jZGVmaW5lCVhBUkdTRVAJCTIJLyogaWZzMCBiZXR3ZWVuICIkKiIgKi8KLSNkZWZpbmUJWEFSRwkJMwkvKiBleHBhbmRpbmcgJCosICRAICovCi0jZGVmaW5lCVhDT00JCTQJLyogZXhwYW5kaW5nICQoKSAqLwotI2RlZmluZSBYTlVMTFNVQgk1CS8qICIkQCIgd2hlbiAkIyBpcyAwIChkb24ndCBnZW5lcmF0ZSB3b3JkKSAqLwotI2RlZmluZSBYU1VCTUlECQk2CS8qIG1pZGRsZSBvZiBleHBhbmRpbmcgJHt9ICovCi0KLS8qIFN0YXRlcyB1c2VkIGZvciBmaWVsZCBzcGxpdHRpbmcgKi8KLSNkZWZpbmUgSUZTX1dPUkQJMAkvKiB3b3JkIGhhcyBjaGFycyAob3IgcXVvdGVzKSAqLwotI2RlZmluZSBJRlNfV1MJCTEJLyogaGF2ZSBzZWVuIElGUyB3aGl0ZS1zcGFjZSAqLwotI2RlZmluZSBJRlNfTldTCQkyCS8qIGhhdmUgc2VlbiBJRlMgbm9uLXdoaXRlLXNwYWNlICovCi0KLXN0YXRpYyBpbnQgdmFyc3ViKEV4cGFuZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICosIGludCAqKTsKLXN0YXRpYyBpbnQgY29tc3ViKEV4cGFuZCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKnRyaW1zdWIoY2hhciAqLCBjaGFyICosIGludCk7Ci1zdGF0aWMgdm9pZCBnbG9iKGNoYXIgKiwgWFB0clYgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGdsb2JpdChYU3RyaW5nICosIGNoYXIgKiosIGNoYXIgKiwgWFB0clYgKiwgaW50KTsKLXN0YXRpYyBjb25zdCBjaGFyICptYXliZV9leHBhbmRfdGlsZGUoY29uc3QgY2hhciAqLCBYU3RyaW5nICosIGNoYXIgKiosIGludCk7Ci1zdGF0aWMgY2hhciAqdGlsZGUoY2hhciAqKTsKLSNpZm5kZWYgTUtTSF9OT1BXTkFNCi1zdGF0aWMgY2hhciAqaG9tZWRpcihjaGFyICopOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBhbHRfZXhwYW5kKFhQdHJWICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCk7Ci1zdGF0aWMgc2l6ZV90IHV0Zmxlbihjb25zdCBjaGFyICopOwotc3RhdGljIHZvaWQgdXRmaW5jcHRyKGNvbnN0IGNoYXIgKiwgbWtzaF9hcmlfdCAqKTsKLQotLyogVVRGTU9ERSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBzaXplX3QKLXV0Zmxlbihjb25zdCBjaGFyICpzKQotewotCXNpemVfdCBuOwotCi0JaWYgKFVURk1PREUpIHsKLQkJbiA9IDA7Ci0JCXdoaWxlICgqcykgewotCQkJcyArPSB1dGZfcHRyYWRqKHMpOwotCQkJKytuOwotCQl9Ci0JfSBlbHNlCi0JCW4gPSBzdHJsZW4ocyk7Ci0JcmV0dXJuIChuKTsKLX0KLQotc3RhdGljIHZvaWQKLXV0ZmluY3B0cihjb25zdCBjaGFyICpzLCBta3NoX2FyaV90ICpscCkKLXsKLQljb25zdCBjaGFyICpjcCA9IHM7Ci0KLQl3aGlsZSAoKCpscCktLSkKLQkJY3AgKz0gdXRmX3B0cmFkaihjcCk7Ci0JKmxwID0gY3AgLSBzOwotfQotCi0vKiBjb21waWxlIGFuZCBleHBhbmQgd29yZCAqLwotY2hhciAqCi1zdWJzdGl0dXRlKGNvbnN0IGNoYXIgKmNwLCBpbnQgZikKLXsKLQlzdHJ1Y3Qgc291cmNlICpzLCAqc29sZDsKLQotCXNvbGQgPSBzb3VyY2U7Ci0JcyA9IHB1c2hzKFNXU1RSLCBBVEVNUCk7Ci0Jcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKLQlzb3VyY2UgPSBzOwotCWlmICh5eWxleChPTkVXT1JEKSAhPSBMV09SRCkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzdWJzdGl0dXRlIik7Ci0Jc291cmNlID0gc29sZDsKLQlhZnJlZShzLCBBVEVNUCk7Ci0JcmV0dXJuIChldmFsc3RyKHl5bHZhbC5jcCwgZikpOwotfQotCi0vKgotICogZXhwYW5kIGFyZy1saXN0Ci0gKi8KLWNoYXIgKioKLWV2YWwoY29uc3QgY2hhciAqKmFwLCBpbnQgZikKLXsKLQlYUHRyViB3OwotCi0JaWYgKCphcCA9PSBOVUxMKSB7Ci0JCXVuaW9uIG1rc2hfY2NwaGFjayB2YXA7Ci0KLQkJdmFwLnJvID0gYXA7Ci0JCXJldHVybiAodmFwLnJ3KTsKLQl9Ci0JWFBpbml0KHcsIDMyKTsKLQlYUHB1dCh3LCBOVUxMKTsJCS8qIHNwYWNlIGZvciBzaGVsbCBuYW1lICovCi0Jd2hpbGUgKCphcCAhPSBOVUxMKQotCQlleHBhbmQoKmFwKyssICZ3LCBmKTsKLQlYUHB1dCh3LCBOVUxMKTsKLQlyZXR1cm4gKChjaGFyICoqKVhQY2xvc2UodykgKyAxKTsKLX0KLQotLyoKLSAqIGV4cGFuZCBzdHJpbmcKLSAqLwotY2hhciAqCi1ldmFsc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQgZikKLXsKLQlYUHRyViB3OwotCWNoYXIgKmRwID0gbnVsbDsKLQotCVhQaW5pdCh3LCAxKTsKLQlleHBhbmQoY3AsICZ3LCBmKTsKLQlpZiAoWFBzaXplKHcpKQotCQlkcCA9ICpYUHB0cnYodyk7Ci0JWFBmcmVlKHcpOwotCXJldHVybiAoZHApOwotfQotCi0vKgotICogZXhwYW5kIHN0cmluZyAtIHJldHVybiBvbmx5IG9uZSBjb21wb25lbnQKLSAqIHVzZWQgZnJvbSBpb3NldHVwIHRvIGV4cGFuZCByZWRpcmVjdGlvbiBmaWxlcwotICovCi1jaGFyICoKLWV2YWxvbmVzdHIoY29uc3QgY2hhciAqY3AsIGludCBmKQotewotCVhQdHJWIHc7Ci0JY2hhciAqcnY7Ci0KLQlYUGluaXQodywgMSk7Ci0JZXhwYW5kKGNwLCAmdywgZik7Ci0Jc3dpdGNoIChYUHNpemUodykpIHsKLQljYXNlIDA6Ci0JCXJ2ID0gbnVsbDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlydiA9IChjaGFyICopICpYUHB0cnYodyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJ2ID0gZXZhbHN0cihjcCwgZiZ+RE9HTE9CKTsKLQkJYnJlYWs7Ci0JfQotCVhQZnJlZSh3KTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyogZm9yIG5lc3RlZCBzdWJzdGl0dXRpb246ICR7dmFyOj0kdmFyMn0gKi8KLXR5cGVkZWYgc3RydWN0IFN1YlR5cGUgewotCXN0cnVjdCB0YmwgKnZhcjsJLyogdmFyaWFibGUgZm9yICR7dmFyLi59ICovCi0Jc3RydWN0IFN1YlR5cGUgKnByZXY7CS8qIG9sZCB0eXBlICovCi0Jc3RydWN0IFN1YlR5cGUgKm5leHQ7CS8qIHBvcGVkIHR5cGUgKHRvIGF2b2lkIHJlLWFsbG9jYXRpbmcpICovCi0Jc2hvcnQJc3R5cGU7CQkvKiBbPSstPyUjXSBhY3Rpb24gYWZ0ZXIgZXhwYW5kZWQgd29yZCAqLwotCXNob3J0CWJhc2U7CQkvKiBiZWdpbiBwb3NpdGlvbiBvZiBleHBhbmRlZCB3b3JkICovCi0Jc2hvcnQJZjsJCS8qIHNhdmVkIHZhbHVlIG9mIGYgKERPUEFULCBldGMpICovCi0JdWludDhfdAlxdW90ZXA7CQkvKiBzYXZlZCB2YWx1ZSBvZiBxdW90ZSAoZm9yICR7Li5bJSNdLi59KSAqLwotCXVpbnQ4X3QJcXVvdGV3OwkJLyogc2F2ZWQgdmFsdWUgb2YgcXVvdGUgKGZvciAkey4uWystPV0uLn0pICovCi19IFN1YlR5cGU7Ci0KLXZvaWQKLWV4cGFuZChjb25zdCBjaGFyICpjcCwJLyogaW5wdXQgd29yZCAqLwotICAgIFhQdHJWICp3cCwJCS8qIG91dHB1dCB3b3JkcyAqLwotICAgIGludCBmKQkJLyogRE8qIGZsYWdzICovCi17Ci0JaW50IGMgPSAwOwotCWludCB0eXBlOwkJLyogZXhwYW5zaW9uIHR5cGUgKi8KLQlpbnQgcXVvdGUgPSAwOwkJLyogcXVvdGVkICovCi0JWFN0cmluZyBkczsJCS8qIGRlc3RpbmF0aW9uIHN0cmluZyAqLwotCWNoYXIgKmRwOwkJLyogZGVzdGluYXRpb24gKi8KLQljb25zdCBjaGFyICpzcDsJCS8qIHNvdXJjZSAqLwotCWludCBmZG8sIHdvcmQ7CQkvKiBzZWNvbmQgcGFzcyBmbGFnczsgaGF2ZSB3b3JkICovCi0JaW50IGRvYmxhbms7CQkvKiBmaWVsZCBzcGxpdHRpbmcgb2YgcGFyYW1ldGVyL2NvbW1hbmQgc3Vic3QgKi8KLQlFeHBhbmQgeCA9IHsJCS8qIGV4cGFuc2lvbiB2YXJpYWJsZXMgKi8KLQkJTlVMTCwgeyBOVUxMIH0sIE5VTEwsIDAKLQl9OwotCVN1YlR5cGUgc3RfaGVhZCwgKnN0OwotCWludCBuZXdsaW5lcyA9IDA7IC8qIEZvciB0cmFpbGluZyBuZXdsaW5lcyBpbiBDT01TVUIgKi8KLQlpbnQgc2F3X2VxLCB0aWxkZV9vazsKLQlpbnQgbWFrZV9tYWdpYzsKLQlzaXplX3QgbGVuOwotCi0JaWYgKGNwID09IE5VTEwpCi0JCWludGVybmFsX2Vycm9yZigiZXhwYW5kKE5VTEwpIik7Ci0JLyogZm9yIGFsaWFzLCByZWFkb25seSwgc2V0LCB0eXBlc2V0IGNvbW1hbmRzICovCi0JaWYgKChmICYgRE9WQUNIRUNLKSAmJiBpc193ZHZhcmFzc2lnbihjcCkpIHsKLQkJZiAmPSB+KERPVkFDSEVDS3xET0JMQU5LfERPR0xPQnxET1RJTERFKTsKLQkJZiB8PSBET0FTTlRJTERFOwotCX0KLQlpZiAoRmxhZyhGTk9HTE9CKSkKLQkJZiAmPSB+RE9HTE9COwotCWlmIChGbGFnKEZNQVJLRElSUykpCi0JCWYgfD0gRE9NQVJLRElSUzsKLQlpZiAoRmxhZyhGQlJBQ0VFWFBBTkQpICYmIChmICYgRE9HTE9CKSkKLQkJZiB8PSBET0JSQUNFXzsKLQotCVhpbml0KGRzLCBkcCwgMTI4LCBBVEVNUCk7CS8qIGluaXQgZGVzdC4gc3RyaW5nICovCi0JdHlwZSA9IFhCQVNFOwotCXNwID0gY3A7Ci0JZmRvID0gMDsKLQlzYXdfZXEgPSAwOwotCXRpbGRlX29rID0gKGYgJiAoRE9USUxERXxET0FTTlRJTERFKSkgPyAxIDogMDsgLyogbXVzdCBiZSAxLzAgKi8KLQlkb2JsYW5rID0gMDsKLQltYWtlX21hZ2ljID0gMDsKLQl3b3JkID0gKGYmRE9CTEFOSykgPyBJRlNfV1MgOiBJRlNfV09SRDsKLQkvKiBjbGFuZyBkb2Vzbid0IGtub3cgT1NVQlNUIGNvbWVzIGJlZm9yZSBDU1VCU1QgKi8KLQltZW1zZXQoJnN0X2hlYWQsIDAsIHNpemVvZihzdF9oZWFkKSk7Ci0Jc3QgPSAmc3RfaGVhZDsKLQotCXdoaWxlICgxKSB7Ci0JCVhjaGVjayhkcywgZHApOwotCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFhCQVNFOgkvKiBvcmlnaW5hbCBwcmVmaXhlZCBzdHJpbmcgKi8KLQkJCWMgPSAqc3ArKzsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSBFT1M6Ci0JCQkJYyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENIQVI6Ci0JCQkJYyA9ICpzcCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSBRQ0hBUjoKLQkJCQlxdW90ZSB8PSAyOyAvKiB0ZW1wb3JhcnkgcXVvdGUgKi8KLQkJCQljID0gKnNwKys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9RVU9URToKLQkJCQl3b3JkID0gSUZTX1dPUkQ7Ci0JCQkJdGlsZGVfb2sgPSAwOwotCQkJCXF1b3RlID0gMTsKLQkJCQljb250aW51ZTsKLQkJCWNhc2UgQ1FVT1RFOgotCQkJCXF1b3RlID0gc3QtPnF1b3RldzsKLQkJCQljb250aW51ZTsKLQkJCWNhc2UgQ09NU1VCOgotCQkJCXRpbGRlX29rID0gMDsKLQkJCQlpZiAoZiAmIERPTlRSVU5DT01NQU5EKSB7Ci0JCQkJCXdvcmQgPSBJRlNfV09SRDsKLQkJCQkJKmRwKysgPSAnJCc7ICpkcCsrID0gJygnOwotCQkJCQl3aGlsZSAoKnNwICE9ICdcMCcpIHsKLQkJCQkJCVhjaGVjayhkcywgZHApOwotCQkJCQkJKmRwKysgPSAqc3ArKzsKLQkJCQkJfQotCQkJCQkqZHArKyA9ICcpJzsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlID0gY29tc3ViKCZ4LCBzcCk7Ci0JCQkJCWlmICh0eXBlID09IFhDT00gJiYgKGYmRE9CTEFOSykpCi0JCQkJCQlkb2JsYW5rKys7Ci0JCQkJCXNwID0gc3RybnVsKHNwKSArIDE7Ci0JCQkJCW5ld2xpbmVzID0gMDsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQljYXNlIEVYUFJTVUI6Ci0JCQkJd29yZCA9IElGU19XT1JEOwotCQkJCXRpbGRlX29rID0gMDsKLQkJCQlpZiAoZiAmIERPTlRSVU5DT01NQU5EKSB7Ci0JCQkJCSpkcCsrID0gJyQnOyAqZHArKyA9ICcoJzsgKmRwKysgPSAnKCc7Ci0JCQkJCXdoaWxlICgqc3AgIT0gJ1wwJykgewotCQkJCQkJWGNoZWNrKGRzLCBkcCk7Ci0JCQkJCQkqZHArKyA9ICpzcCsrOwotCQkJCQl9Ci0JCQkJCSpkcCsrID0gJyknOyAqZHArKyA9ICcpJzsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgdGJsIHY7Ci0JCQkJCWNoYXIgKnA7Ci0KLQkJCQkJdi5mbGFnID0gREVGSU5FRHxJU1NFVHxJTlRFR0VSOwotCQkJCQl2LnR5cGUgPSAxMDsgLyogbm90IGRlZmF1bHQgKi8KLQkJCQkJdi5uYW1lWzBdID0gJ1wwJzsKLQkJCQkJdl9ldmFsdWF0ZSgmdiwgc3Vic3RpdHV0ZShzcCwgMCksCi0JCQkJCSAgICBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKLQkJCQkJc3AgPSBzdHJudWwoc3ApICsgMTsKLQkJCQkJZm9yIChwID0gc3RyX3ZhbCgmdik7ICpwOyApIHsKLQkJCQkJCVhjaGVjayhkcywgZHApOwotCQkJCQkJKmRwKysgPSAqcCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSBPU1VCU1Q6IHsJLyogJHt7I312YXJ7On1bPSstPyMlXXdvcmR9ICovCi0JCQkvKiBmb3JtYXQgaXM6Ci0JCQkgKglPU1VCU1QgW3t4XSBwbGFpbi12YXJpYWJsZS1wYXJ0IFwwCi0JCQkgKgkgICAgY29tcGlsZWQtd29yZC1wYXJ0IENTVUJTVCBbfXhdCi0JCQkgKiBUaGlzIGlzIHdoZXJlIGFsbCBzeW50YXggY2hlY2tpbmcgZ2V0cyBkb25lLi4uCi0JCQkgKi8KLQkJCQljb25zdCBjaGFyICp2YXJuYW1lID0gKytzcDsgLyogc2tpcCB0aGUgeyBvciB4ICh9KSAqLwotCQkJCWludCBzdHlwZTsKLQkJCQlpbnQgc2xlbiA9IDA7Ci0KLQkJCQlzcCA9IGNzdHJjaHIoc3AsICdcMCcpICsgMTsgLyogc2tpcCB2YXJpYWJsZSAqLwotCQkJCXR5cGUgPSB2YXJzdWIoJngsIHZhcm5hbWUsIHNwLCAmc3R5cGUsICZzbGVuKTsKLQkJCQlpZiAodHlwZSA8IDApIHsKLQkJCQkJY2hhciAqYmVnLCAqZW5kLCAqc3RyOwotCi0gdW53aW5kX3N1YnN0c3luOgotCQkJCQlzcCA9IHZhcm5hbWUgLSAyOyAvKiByZXN0b3JlIHNwICovCi0JCQkJCWVuZCA9IChiZWcgPSB3ZGNvcHkoc3AsIEFURU1QKSkgKwotCQkJCQkgICAgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKLQkJCQkJLyogKHspIHRoZSB9IG9yIHggaXMgYWxyZWFkeSBza2lwcGVkICovCi0JCQkJCWlmIChlbmQgPCB3ZHNjYW4oYmVnLCBFT1MpKQotCQkJCQkJKmVuZCA9IEVPUzsKLQkJCQkJc3RyID0gc25wdHJlZWYoTlVMTCwgNjQsICIlUyIsIGJlZyk7Ci0JCQkJCWFmcmVlKGJlZywgQVRFTVApOwotCQkJCQllcnJvcmYoIiVzOiBiYWQgc3Vic3RpdHV0aW9uIiwgc3RyKTsKLQkJCQl9Ci0JCQkJaWYgKGYgJiBET0JMQU5LKQotCQkJCQlkb2JsYW5rKys7Ci0JCQkJdGlsZGVfb2sgPSAwOwotCQkJCWlmICh0eXBlID09IFhCQVNFKSB7CS8qIGV4cGFuZD8gKi8KLQkJCQkJaWYgKCFzdC0+bmV4dCkgewotCQkJCQkJU3ViVHlwZSAqbmV3c3Q7Ci0KLQkJCQkJCW5ld3N0ID0gYWxsb2Moc2l6ZW9mKFN1YlR5cGUpLCBBVEVNUCk7Ci0JCQkJCQluZXdzdC0+bmV4dCA9IE5VTEw7Ci0JCQkJCQluZXdzdC0+cHJldiA9IHN0OwotCQkJCQkJc3QtPm5leHQgPSBuZXdzdDsKLQkJCQkJfQotCQkJCQlzdCA9IHN0LT5uZXh0OwotCQkJCQlzdC0+c3R5cGUgPSBzdHlwZTsKLQkJCQkJc3QtPmJhc2UgPSBYc2F2ZXBvcyhkcywgZHApOwotCQkJCQlzdC0+ZiA9IGY7Ci0JCQkJCXN0LT52YXIgPSB4LnZhcjsKLQkJCQkJc3QtPnF1b3RldyA9IHN0LT5xdW90ZXAgPSBxdW90ZTsKLQkJCQkJLyogc2tpcCBxdWFsaWZpZXIocykgKi8KLQkJCQkJaWYgKHN0eXBlKQotCQkJCQkJc3AgKz0gc2xlbjsKLQkJCQkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKLQkJCQkJY2FzZSAnMCc6IHsKLQkJCQkJCWNoYXIgKmJlZywgKm1pZCwgKmVuZCwgKnN0ZzsKLQkJCQkJCW1rc2hfYXJpX3QgZnJvbSA9IDAsIG51bSA9IC0xLCBmbGVuLCBmaW5jID0gMDsKLQotCQkJCQkJYmVnID0gd2Rjb3B5KHNwLCBBVEVNUCk7Ci0JCQkJCQltaWQgPSBiZWcgKyAod2RzY2FuKHNwLCBBREVMSU0pIC0gc3ApOwotCQkJCQkJc3RnID0gYmVnICsgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKLQkJCQkJCWlmIChtaWQgPj0gc3RnKQotCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOwotCQkJCQkJbWlkWy0yXSA9IEVPUzsKLQkJCQkJCWlmIChtaWRbLTFdID09IC8qeyovJ30nKSB7Ci0JCQkJCQkJc3AgKz0gbWlkIC0gYmVnIC0gMTsKLQkJCQkJCQllbmQgPSBOVUxMOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllbmQgPSBtaWQgKwotCQkJCQkJCSAgICAod2RzY2FuKG1pZCwgQURFTElNKSAtIG1pZCk7Ci0JCQkJCQkJaWYgKGVuZCA+PSBzdGcpCi0JCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOwotCQkJCQkJCWVuZFstMl0gPSBFT1M7Ci0JCQkJCQkJc3AgKz0gZW5kIC0gYmVnIC0gMTsKLQkJCQkJCX0KLQkJCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoc3RnID0gd2RzdHJpcChiZWcsIGZhbHNlLCBmYWxzZSksIDApLAotCQkJCQkJICAgICZmcm9tLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKLQkJCQkJCWFmcmVlKHN0ZywgQVRFTVApOwotCQkJCQkJaWYgKGVuZCkgewotCQkJCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoc3RnID0gd2RzdHJpcChtaWQsIGZhbHNlLCBmYWxzZSksIDApLAotCQkJCQkJCSAgICAmbnVtLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKLQkJCQkJCQlhZnJlZShzdGcsIEFURU1QKTsKLQkJCQkJCX0KLQkJCQkJCWFmcmVlKGJlZywgQVRFTVApOwotCQkJCQkJYmVnID0gc3RyX3ZhbChzdC0+dmFyKTsKLQkJCQkJCWZsZW4gPSB1dGZsZW4oYmVnKTsKLQkJCQkJCWlmIChmcm9tIDwgMCkgewotCQkJCQkJCWlmICgtZnJvbSA8IGZsZW4pCi0JCQkJCQkJCWZpbmMgPSBmbGVuICsgZnJvbTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWZpbmMgPSBmcm9tIDwgZmxlbiA/IGZyb20gOiBmbGVuOwotCQkJCQkJaWYgKFVURk1PREUpCi0JCQkJCQkJdXRmaW5jcHRyKGJlZywgJmZpbmMpOwotCQkJCQkJYmVnICs9IGZpbmM7Ci0JCQkJCQlmbGVuID0gdXRmbGVuKGJlZyk7Ci0JCQkJCQlpZiAobnVtIDwgMCB8fCBudW0gPiBmbGVuKQotCQkJCQkJCW51bSA9IGZsZW47Ci0JCQkJCQlpZiAoVVRGTU9ERSkKLQkJCQkJCQl1dGZpbmNwdHIoYmVnLCAmbnVtKTsKLQkJCQkJCXN0cm5kdXB4KHguc3RyLCBiZWcsIG51bSwgQVRFTVApOwotCQkJCQkJZ290byBkb19DU1VCU1Q7Ci0JCQkJCX0KLQkJCQkJY2FzZSAnLyc6IHsKLQkJCQkJCWNoYXIgKnMsICpwLCAqZCwgKnNiZWcsICplbmQ7Ci0JCQkJCQljaGFyICpwYXQsICpycmVwOwotCQkJCQkJY2hhciAqdHBhdDAsICp0cGF0MSwgKnRwYXQyOwotCi0JCQkJCQlzID0gd2Rjb3B5KHNwLCBBVEVNUCk7Ci0JCQkJCQlwID0gcyArICh3ZHNjYW4oc3AsIEFERUxJTSkgLSBzcCk7Ci0JCQkJCQlkID0gcyArICh3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcCk7Ci0JCQkJCQlpZiAocCA+PSBkKQotCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOwotCQkJCQkJcFstMl0gPSBFT1M7Ci0JCQkJCQlpZiAocFstMV0gPT0gLyp7Ki8nfScpCi0JCQkJCQkJZCA9IE5VTEw7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZFstMl0gPSBFT1M7Ci0JCQkJCQlzcCArPSAoZCA/IGQgOiBwKSAtIHMgLSAxOwotCQkJCQkJdHBhdDAgPSB3ZHN0cmlwKHMsIHRydWUsIHRydWUpOwotCQkJCQkJcGF0ID0gc3Vic3RpdHV0ZSh0cGF0MCwgMCk7Ci0JCQkJCQlpZiAoZCkgewotCQkJCQkJCWQgPSB3ZHN0cmlwKHAsIHRydWUsIGZhbHNlKTsKLQkJCQkJCQlycmVwID0gc3Vic3RpdHV0ZShkLCAwKTsKLQkJCQkJCQlhZnJlZShkLCBBVEVNUCk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlycmVwID0gbnVsbDsKLQkJCQkJCWFmcmVlKHMsIEFURU1QKTsKLQkJCQkJCXMgPSBkID0gcGF0OwotCQkJCQkJd2hpbGUgKCpzKQotCQkJCQkJCWlmICgqcyAhPSAnXFwnIHx8Ci0JCQkJCQkJICAgIHNbMV0gPT0gJyUnIHx8Ci0JCQkJCQkJICAgIHNbMV0gPT0gJyMnIHx8Ci0JCQkJCQkJICAgIHNbMV0gPT0gJ1wwJyB8fAotCQkJCS8qIFhYWCByZWFsbHk/ICovCSAgICBzWzFdID09ICdcXCcgfHwKLQkJCQkJCQkgICAgc1sxXSA9PSAnLycpCi0JCQkJCQkJCSpkKysgPSAqcysrOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcysrOwotCQkJCQkJKmQgPSAnXDAnOwotCQkJCQkJYWZyZWUodHBhdDAsIEFURU1QKTsKLQotCQkJCQkJLyogcmVqZWN0IGVtcHR5IHBhdHRlcm4gKi8KLQkJCQkJCWlmICghKnBhdCB8fCBnbWF0Y2h4KCIiLCBwYXQsIGZhbHNlKSkKLQkJCQkJCQlnb3RvIG5vX3JlcGw7Ci0KLQkJCQkJCS8qIHByZXBhcmUgc3RyaW5nIG9uIHdoaWNoIHRvIHdvcmsgKi8KLQkJCQkJCXN0cmR1cHgocywgc3RyX3ZhbChzdC0+dmFyKSwgQVRFTVApOwotCQkJCQkJc2JlZyA9IHM7Ci0KLQkJCQkJCS8qIGZpcnN0IHNlZSBpZiB3ZSBoYXZlIGFueSBtYXRjaCBhdCBhbGwgKi8KLQkJCQkJCXRwYXQwID0gcGF0OwotCQkJCQkJaWYgKCpwYXQgPT0gJyMnKSB7Ci0JCQkJCQkJLyogYW5jaG9yIGF0IHRoZSBiZWdpbm5pbmcgKi8KLQkJCQkJCQl0cGF0MSA9IHNoZl9zbXByaW50ZigiJXMlYyoiLCArK3RwYXQwLCBNQUdJQyk7Ci0JCQkJCQkJdHBhdDIgPSB0cGF0MTsKLQkJCQkJCX0gZWxzZSBpZiAoKnBhdCA9PSAnJScpIHsKLQkJCQkJCQkvKiBhbmNob3IgYXQgdGhlIGVuZCAqLwotCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlYyolcyIsIE1BR0lDLCArK3RwYXQwKTsKLQkJCQkJCQl0cGF0MiA9IHRwYXQwOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvKiBmbG9hdCAqLwotCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlYyolcyVjKiIsIE1BR0lDLCBwYXQsIE1BR0lDKTsKLQkJCQkJCQl0cGF0MiA9IHRwYXQxICsgMjsKLQkJCQkJCX0KLSBhZ2Fpbl9yZXBsOgotCQkJCQkJLyogdGhpcyB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIGdtYXRjaHggd291bGQgcmV0dXJuCi0JCQkJCQkgKiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgb2YgYSBtYXRjaCBmb3VuZCwgbGlrZSByZSoKLQkJCQkJCSAqLwotCQkJCQkJaWYgKCFnbWF0Y2h4KHNiZWcsIHRwYXQxLCBmYWxzZSkpCi0JCQkJCQkJZ290byBlbmRfcmVwbDsKLQkJCQkJCWVuZCA9IHN0cm51bChzKTsKLQkJCQkJCS8qIG5vdyBhbmNob3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWF0Y2ggKi8KLQkJCQkJCWlmICgqcGF0ICE9ICcjJykKLQkJCQkJCQl3aGlsZSAoc2JlZyA8PSBlbmQpIHsKLQkJCQkJCQkJaWYgKGdtYXRjaHgoc2JlZywgdHBhdDIsIGZhbHNlKSkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlzYmVnKys7Ci0JCQkJCQkJfQotCQkJCQkJLyogbm93IGFuY2hvciB0aGUgZW5kIG9mIHRoZSBtYXRjaCAqLwotCQkJCQkJcCA9IGVuZDsKLQkJCQkJCWlmICgqcGF0ICE9ICclJykKLQkJCQkJCQl3aGlsZSAocCA+PSBzYmVnKSB7Ci0JCQkJCQkJCWJvb2wgZ290bWF0Y2g7Ci0KLQkJCQkJCQkJYyA9ICpwOyAqcCA9ICdcMCc7Ci0JCQkJCQkJCWdvdG1hdGNoID0gZ21hdGNoeChzYmVnLCB0cGF0MCwgZmFsc2UpOwotCQkJCQkJCQkqcCA9IGM7Ci0JCQkJCQkJCWlmIChnb3RtYXRjaCkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQlwLS07Ci0JCQkJCQkJfQotCQkJCQkJc3RybmR1cHgoZW5kLCBzLCBzYmVnIC0gcywgQVRFTVApOwotCQkJCQkJZCA9IHNoZl9zbXByaW50ZigiJXMlcyVzIiwgZW5kLCBycmVwLCBwKTsKLQkJCQkJCWFmcmVlKGVuZCwgQVRFTVApOwotCQkJCQkJc2JlZyA9IGQgKyAoc2JlZyAtIHMpICsgc3RybGVuKHJyZXApOwotCQkJCQkJYWZyZWUocywgQVRFTVApOwotCQkJCQkJcyA9IGQ7Ci0JCQkJCQlpZiAoc3R5cGUgJiAweDgwKQotCQkJCQkJCWdvdG8gYWdhaW5fcmVwbDsKLSBlbmRfcmVwbDoKLQkJCQkJCWFmcmVlKHRwYXQxLCBBVEVNUCk7Ci0JCQkJCQl4LnN0ciA9IHM7Ci0gbm9fcmVwbDoKLQkJCQkJCWFmcmVlKHBhdCwgQVRFTVApOwotCQkJCQkJaWYgKHJyZXAgIT0gbnVsbCkKLQkJCQkJCQlhZnJlZShycmVwLCBBVEVNUCk7Ci0JCQkJCQlnb3RvIGRvX0NTVUJTVDsKLQkJCQkJfQotCQkJCQljYXNlICcjJzoKLQkJCQkJY2FzZSAnJSc6Ci0JCQkJCQkvKiAhIERPQkxBTkssRE9CUkFDRV8sRE9USUxERSAqLwotCQkJCQkJZiA9IERPUEFUIHwgKGYmRE9OVFJVTkNPTU1BTkQpIHwKLQkJCQkJCSAgICBET1RFTVBfOwotCQkJCQkJc3QtPnF1b3RldyA9IHF1b3RlID0gMDsKLQkJCQkJCS8qIFByZXBlbmQgb3BlbiBwYXR0ZXJuIChzbyB8Ci0JCQkJCQkgKiBpbiBhIHRyaW0gd2lsbCB3b3JrIGFzCi0JCQkJCQkgKiBleHBlY3RlZCkKLQkJCQkJCSAqLwotCQkJCQkJKmRwKysgPSBNQUdJQzsKLQkJCQkJCSpkcCsrID0gKGNoYXIpKCdAJyB8IDB4ODApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJz0nOgotCQkJCQkJLyogRW5hYmxpbmcgdGlsZGUgZXhwYW5zaW9uCi0JCQkJCQkgKiBhZnRlciA6cyBoZXJlIGlzCi0JCQkJCQkgKiBub24tc3RhbmRhcmQga3NoLCBidXQgaXMKLQkJCQkJCSAqIGNvbnNpc3RlbnQgd2l0aCBydWxlcyBmb3IKLQkJCQkJCSAqIG90aGVyIGFzc2lnbm1lbnRzLiBOb3QKLQkJCQkJCSAqIHN1cmUgd2hhdCBQT1NJWCB0aGlua3Mgb2YKLQkJCQkJCSAqIHRoaXMuCi0JCQkJCQkgKiBOb3QgZG9pbmcgdGlsZGUgZXhwYW5zaW9uCi0JCQkJCQkgKiBmb3IgaW50ZWdlciB2YXJpYWJsZXMgaXMgYQotCQkJCQkJICogbm9uLVBPU0lYIHRoaW5nIC0gbWFrZXMKLQkJCQkJCSAqIHNlbnNlIHRob3VnaCwgc2luY2UgfiBpcwotCQkJCQkJICogYSBhcml0aG1ldGljIG9wZXJhdG9yLgotCQkJCQkJICovCi0JCQkJCQlpZiAoISh4LnZhci0+ZmxhZyAmIElOVEVHRVIpKQotCQkJCQkJCWYgfD0gRE9BU05USUxERXxET1RJTERFOwotCQkJCQkJZiB8PSBET1RFTVBfOwotCQkJCQkJLyogVGhlc2Ugd2lsbCBiZSBkb25lIGFmdGVyIHRoZQotCQkJCQkJICogdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQuCi0JCQkJCQkgKi8KLQkJCQkJCWYgJj0gfihET0JMQU5LfERPR0xPQnxET0JSQUNFXyk7Ci0JCQkJCQl0aWxkZV9vayA9IDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnPyc6Ci0JCQkJCQlmICY9IH5ET0JMQU5LOwotCQkJCQkJZiB8PSBET1RFTVBfOwotCQkJCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8qIEVuYWJsZSB0aWxkZSBleHBhbnNpb24gKi8KLQkJCQkJCXRpbGRlX29rID0gMTsKLQkJCQkJCWYgfD0gRE9USUxERTsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQkvKiBza2lwIHdvcmQgKi8KLQkJCQkJc3AgKz0gd2RzY2FuKHNwLCBDU1VCU1QpIC0gc3A7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljYXNlIENTVUJTVDogLyogb25seSBnZXQgaGVyZSBpZiBleHBhbmRpbmcgd29yZCAqLwotIGRvX0NTVUJTVDoKLQkJCQlzcCsrOyAvKiAoeykgc2tpcCB0aGUgfSBvciB4ICovCi0JCQkJdGlsZGVfb2sgPSAwOwkvKiBpbiBjYXNlIG9mICR7dW5zZXQ6LX0gKi8KLQkJCQkqZHAgPSAnXDAnOwotCQkJCXF1b3RlID0gc3QtPnF1b3RlcDsKLQkJCQlmID0gc3QtPmY7Ci0JCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJZG9ibGFuay0tOwotCQkJCXN3aXRjaCAoc3QtPnN0eXBlJjB4N2YpIHsKLQkJCQljYXNlICcjJzoKLQkJCQljYXNlICclJzoKLQkJCQkJLyogQXBwZW5kIGVuZC1wYXR0ZXJuICovCi0JCQkJCSpkcCsrID0gTUFHSUM7ICpkcCsrID0gJyknOyAqZHAgPSAnXDAnOwotCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOwotCQkJCQkvKiBNdXN0IHVzZSBzdC0+dmFyIHNpbmNlIGNhbGxpbmcKLQkJCQkJICogZ2xvYmFsIHdvdWxkIGJyZWFrIHRoaW5ncwotCQkJCQkgKiBsaWtlIHhbaSs9MV0uCi0JCQkJCSAqLwotCQkJCQl4LnN0ciA9IHRyaW1zdWIoc3RyX3ZhbChzdC0+dmFyKSwKLQkJCQkJCWRwLCBzdC0+c3R5cGUpOwotCQkJCQlpZiAoeC5zdHJbMF0gIT0gJ1wwJyB8fCBzdC0+cXVvdGVwKQotCQkJCQkJdHlwZSA9IFhTVUI7Ci0JCQkJCWVsc2UKLQkJCQkJCXR5cGUgPSBYTlVMTFNVQjsKLQkJCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJCWRvYmxhbmsrKzsKLQkJCQkJc3QgPSBzdC0+cHJldjsKLQkJCQkJY29udGludWU7Ci0JCQkJY2FzZSAnPSc6Ci0JCQkJCS8qIFJlc3RvcmUgb3VyIHBvc2l0aW9uIGFuZCBzdWJzdGl0dXRlCi0JCQkJCSAqIHRoZSB2YWx1ZSBvZiBzdC0+dmFyIChtYXkgbm90IGJlCi0JCQkJCSAqIHRoZSBhc3NpZ25lZCB2YWx1ZSBpbiB0aGUgcHJlc2VuY2UKLQkJCQkJICogb2YgaW50ZWdlci9yaWdodC1hZGovZXRjIGF0dHJpYnV0ZXMpLgotCQkJCQkgKi8KLQkJCQkJZHAgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKLQkJCQkJLyogTXVzdCB1c2Ugc3QtPnZhciBzaW5jZSBjYWxsaW5nCi0JCQkJCSAqIGdsb2JhbCB3b3VsZCBjYXVzZSB3aXRoIHRoaW5ncwotCQkJCQkgKiBsaWtlIHhbaSs9MV0gdG8gYmUgZXZhbHVhdGVkIHR3aWNlLgotCQkJCQkgKi8KLQkJCQkJLyogTm90ZTogbm90IGV4cG9ydGVkIGJ5IEZFWFBPUlQKLQkJCQkJICogaW4gQVQmVCBrc2guCi0JCQkJCSAqLwotCQkJCQkvKiBYWFggUE9TSVggc2F5cyByZWFkb25seSBpcyBvbmx5Ci0JCQkJCSAqIGZhdGFsIGZvciBzcGVjaWFsIGJ1aWx0aW5zIChzZXRzdHIKLQkJCQkJICogZG9lcyByZWFkb25seSBjaGVjaykuCi0JCQkJCSAqLwotCQkJCQlsZW4gPSBzdHJsZW4oZHApICsgMTsKLQkJCQkJc2V0c3RyKHN0LT52YXIsCi0JCQkJCSAgICBkZWJ1bmsoYWxsb2MobGVuLCBBVEVNUCksCi0JCQkJCSAgICBkcCwgbGVuKSwgS1NIX1VOV0lORF9FUlJPUik7Ci0JCQkJCXguc3RyID0gc3RyX3ZhbChzdC0+dmFyKTsKLQkJCQkJdHlwZSA9IFhTVUI7Ci0JCQkJCWlmIChmJkRPQkxBTkspCi0JCQkJCQlkb2JsYW5rKys7Ci0JCQkJCXN0ID0gc3QtPnByZXY7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCWNhc2UgJz8nOiB7Ci0JCQkJCWNoYXIgKnMgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKLQotCQkJCQllcnJvcmYoIiVzOiAlcyIsIHN0LT52YXItPm5hbWUsCi0JCQkJCSAgICBkcCA9PSBzID8KLQkJCQkJICAgICJwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0IiA6Ci0JCQkJCSAgICAoZGVidW5rKHMsIHMsIHN0cmxlbihzKSArIDEpLCBzKSk7Ci0JCQkJfQotCQkJCWNhc2UgJzAnOgotCQkJCWNhc2UgJy8nOgotCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOwotCQkJCQl0eXBlID0gWFNVQjsKLQkJCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJCWRvYmxhbmsrKzsKLQkJCQkJc3QgPSBzdC0+cHJldjsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXN0ID0gc3QtPnByZXY7Ci0JCQkJdHlwZSA9IFhCQVNFOwotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlIE9QQVQ6IC8qIG9wZW4gcGF0dGVybjogKihmb298YmFyKSAqLwotCQkJCS8qIE5leHQgY2hhciBpcyB0aGUgdHlwZSBvZiBwYXR0ZXJuICovCi0JCQkJbWFrZV9tYWdpYyA9IDE7Ci0JCQkJYyA9ICpzcCsrICsgMHg4MDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTUEFUOiAvKiBwYXR0ZXJuIHNlcGFyYXRvciAofCkgKi8KLQkJCQltYWtlX21hZ2ljID0gMTsKLQkJCQljID0gJ3wnOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIENQQVQ6IC8qIGNsb3NlIHBhdHRlcm4gKi8KLQkJCQltYWtlX21hZ2ljID0gMTsKLQkJCQljID0gLyooKi8gJyknOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBYTlVMTFNVQjoKLQkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgIiRAIiAoYW5kICIke2Zvb1tAXX0iKSAtIG5vCi0JCQkgKiB3b3JkIGlzIGdlbmVyYXRlZCBpZiAkIyBpcyAwICh1bmxlc3MgdGhlcmUgaXMKLQkJCSAqIG90aGVyIHN0dWZmIGluc2lkZSB0aGUgcXVvdGVzKS4KLQkJCSAqLwotCQkJdHlwZSA9IFhCQVNFOwotCQkJaWYgKGYmRE9CTEFOSykgewotCQkJCWRvYmxhbmstLTsKLQkJCQkvKiBub3QgcmVhbGx5IGNvcnJlY3Q6IHg9OyAiJHgkQCIgc2hvdWxkCi0JCQkJICogZ2VuZXJhdGUgYSBudWxsIGFyZ3VtZW50IGFuZAotCQkJCSAqIHNldCBBOyAiJHtAOit9IiBzaG91bGRuJ3QuCi0JCQkJICovCi0JCQkJaWYgKGRwID09IFhzdHJpbmcoZHMsIGRwKSkKLQkJCQkJd29yZCA9IElGU19XUzsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCi0JCWNhc2UgWFNVQjoKLQkJY2FzZSBYU1VCTUlEOgotCQkJaWYgKChjID0gKnguc3RyKyspID09IDApIHsKLQkJCQl0eXBlID0gWEJBU0U7Ci0JCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJZG9ibGFuay0tOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBYQVJHU0VQOgotCQkJdHlwZSA9IFhBUkc7Ci0JCQlxdW90ZSA9IDE7Ci0JCWNhc2UgWEFSRzoKLQkJCWlmICgoYyA9ICp4LnN0cisrKSA9PSAnXDAnKSB7Ci0JCQkJLyogZm9yY2UgbnVsbCB3b3JkcyB0byBiZSBjcmVhdGVkIHNvCi0JCQkJICogc2V0IC0tICcnIDIgJyc7IGZvbyAiJEAiIHdpbGwgZG8KLQkJCQkgKiB0aGUgcmlnaHQgdGhpbmcKLQkJCQkgKi8KLQkJCQlpZiAocXVvdGUgJiYgeC5zcGxpdCkKLQkJCQkJd29yZCA9IElGU19XT1JEOwotCQkJCWlmICgoeC5zdHIgPSAqeC51LnN0cnYrKykgPT0gTlVMTCkgewotCQkJCQl0eXBlID0gWEJBU0U7Ci0JCQkJCWlmIChmJkRPQkxBTkspCi0JCQkJCQlkb2JsYW5rLS07Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljID0gaWZzMDsKLQkJCQlpZiAoYyA9PSAwKSB7Ci0JCQkJCWlmIChxdW90ZSAmJiAheC5zcGxpdCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQljID0gJyAnOwotCQkJCX0KLQkJCQlpZiAocXVvdGUgJiYgeC5zcGxpdCkgewotCQkJCQkvKiB0ZXJtaW5hdGUgd29yZCBmb3IgIiRAIiAqLwotCQkJCQl0eXBlID0gWEFSR1NFUDsKLQkJCQkJcXVvdGUgPSAwOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgWENPTToKLQkJCWlmIChuZXdsaW5lcykgewkJLyogU3BpdCBvdXQgc2F2ZWQgTkxzICovCi0JCQkJYyA9ICdcbic7Ci0JCQkJLS1uZXdsaW5lczsKLQkJCX0gZWxzZSB7Ci0JCQkJd2hpbGUgKChjID0gc2hmX2dldGMoeC51LnNoZikpID09IDAgfHwgYyA9PSAnXG4nKQotCQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQkJLyogU2F2ZSBuZXdsaW5lcyAqLwotCQkJCQkJbmV3bGluZXMrKzsKLQkJCQlpZiAobmV3bGluZXMgJiYgYyAhPSBFT0YpIHsKLQkJCQkJc2hmX3VuZ2V0YyhjLCB4LnUuc2hmKTsKLQkJCQkJYyA9ICdcbic7Ci0JCQkJCS0tbmV3bGluZXM7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGMgPT0gRU9GKSB7Ci0JCQkJbmV3bGluZXMgPSAwOwotCQkJCXNoZl9jbG9zZSh4LnUuc2hmKTsKLQkJCQlpZiAoeC5zcGxpdCkKLQkJCQkJc3Vic3RfZXhzdGF0ID0gd2FpdGxhc3QoKTsKLQkJCQl0eXBlID0gWEJBU0U7Ci0JCQkJaWYgKGYmRE9CTEFOSykKLQkJCQkJZG9ibGFuay0tOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBjaGVjayBmb3IgZW5kIG9mIHdvcmQgb3IgSUZTIHNlcGFyYXRpb24gKi8KLQkJaWYgKGMgPT0gMCB8fCAoIXF1b3RlICYmIChmICYgRE9CTEFOSykgJiYgZG9ibGFuayAmJgotCQkgICAgIW1ha2VfbWFnaWMgJiYgY3R5cGUoYywgQ19JRlMpKSkgewotCQkJLyogSG93IHdvcmRzIGFyZSBicm9rZW4gdXA6Ci0JCQkgKgkJCXwJdmFsdWUgb2YgYwotCQkJICoJd29yZAkJfAl3cwlud3MJMAotCQkJICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCSAqCUlGU19XT1JECQl3L1dTCXcvTldTCXcKLQkJCSAqCUlGU19XUwkJCS0vV1MJdy9OV1MJLQotCQkJICoJSUZTX05XUwkJCS0vTldTCXcvTldTCXcKLQkJCSAqICh3IG1lYW5zIGdlbmVyYXRlIGEgd29yZCkKLQkJCSAqIE5vdGUgdGhhdCBJRlNfTldTLzAgZ2VuZXJhdGVzIGEgd29yZCAoQVQmVCBrc2gKLQkJCSAqIGRvZXNuJ3QgZG8gdGhpcywgYnV0IFBPU0lYIGRvZXMpLgotCQkJICovCi0JCQlpZiAod29yZCA9PSBJRlNfV09SRCB8fAotCQkJICAgICghY3R5cGUoYywgQ19JRlNXUykgJiYgYyAmJiB3b3JkID09IElGU19OV1MpKSB7Ci0JCQkJY2hhciAqcDsKLQotCQkJCSpkcCsrID0gJ1wwJzsKLQkJCQlwID0gWGNsb3NlKGRzLCBkcCk7Ci0JCQkJaWYgKGZkbyAmIERPQlJBQ0VfKQotCQkJCQkvKiBhbHNvIGRvZXMgZ2xvYmJpbmcgKi8KLQkJCQkJYWx0X2V4cGFuZCh3cCwgcCwgcCwKLQkJCQkJICAgIHAgKyBYbGVuZ3RoKGRzLCAoZHAgLSAxKSksCi0JCQkJCSAgICBmZG8gfCAoZiAmIERPTUFSS0RJUlMpKTsKLQkJCQllbHNlIGlmIChmZG8gJiBET0dMT0IpCi0JCQkJCWdsb2IocCwgd3AsIGYgJiBET01BUktESVJTKTsKLQkJCQllbHNlIGlmICgoZiAmIERPUEFUKSB8fCAhKGZkbyAmIERPTUFHSUNfKSkKLQkJCQkJWFBwdXQoKndwLCBwKTsKLQkJCQllbHNlCi0JCQkJCVhQcHV0KCp3cCwgZGVidW5rKHAsIHAsIHN0cmxlbihwKSArIDEpKTsKLQkJCQlmZG8gPSAwOwotCQkJCXNhd19lcSA9IDA7Ci0JCQkJdGlsZGVfb2sgPSAoZiAmIChET1RJTERFfERPQVNOVElMREUpKSA/IDEgOiAwOwotCQkJCWlmIChjICE9IDApCi0JCQkJCVhpbml0KGRzLCBkcCwgMTI4LCBBVEVNUCk7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAwKQotCQkJCXJldHVybjsKLQkJCWlmICh3b3JkICE9IElGU19OV1MpCi0JCQkJd29yZCA9IGN0eXBlKGMsIENfSUZTV1MpID8gSUZTX1dTIDogSUZTX05XUzsKLQkJfSBlbHNlIHsKLQkJCWlmICh0eXBlID09IFhTVUIpIHsKLQkJCQlpZiAod29yZCA9PSBJRlNfTldTICYmCi0JCQkJICAgIFhsZW5ndGgoZHMsIGRwKSA9PSAwKSB7Ci0JCQkJCWNoYXIgKnA7Ci0KLQkJCQkJKihwID0gYWxsb2MoMSwgQVRFTVApKSA9ICdcMCc7Ci0JCQkJCVhQcHV0KCp3cCwgcCk7Ci0JCQkJfQotCQkJCXR5cGUgPSBYU1VCTUlEOwotCQkJfQotCi0JCQkvKiBhZ2UgdGlsZGVfb2sgaW5mbyAtIH4gY29kZSB0ZXN0cyBzZWNvbmQgYml0ICovCi0JCQl0aWxkZV9vayA8PD0gMTsKLQkJCS8qIG1hcmsgYW55IHNwZWNpYWwgc2Vjb25kIHBhc3MgY2hhcnMgKi8KLQkJCWlmICghcXVvdGUpCi0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnWyc6Ci0JCQkJY2FzZSBOT1Q6Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJY2FzZSAnXSc6Ci0JCQkJCS8qIEZvciBjaGFyYWN0ZXIgY2xhc3NlcyAtIGRvZXNuJ3QgaHVydAotCQkJCQkgKiB0byBoYXZlIG1hZ2ljICEsLSxdcyBvdXRzaWRlIG9mCi0JCQkJCSAqIFsuLi5dIGV4cHJlc3Npb25zLgotCQkJCQkgKi8KLQkJCQkJaWYgKGYgJiAoRE9QQVQgfCBET0dMT0IpKSB7Ci0JCQkJCQlmZG8gfD0gRE9NQUdJQ187Ci0JCQkJCQlpZiAoYyA9PSAnWycpCi0JCQkJCQkJZmRvIHw9IGYgJiBET0dMT0I7Ci0JCQkJCQkqZHArKyA9IE1BR0lDOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyonOgotCQkJCWNhc2UgJz8nOgotCQkJCQlpZiAoZiAmIChET1BBVCB8IERPR0xPQikpIHsKLQkJCQkJCWZkbyB8PSBET01BR0lDXyB8IChmICYgRE9HTE9CKTsKLQkJCQkJCSpkcCsrID0gTUFHSUM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPQlJBQ0U6Ci0JCQkJY2FzZSAnLCc6Ci0JCQkJY2FzZSBDQlJBQ0U6Ci0JCQkJCWlmICgoZiAmIERPQlJBQ0VfKSAmJiAoYyA9PSBPQlJBQ0UgfHwKLQkJCQkJICAgIChmZG8gJiBET0JSQUNFXykpKSB7Ci0JCQkJCQlmZG8gfD0gRE9CUkFDRV98RE9NQUdJQ187Ci0JCQkJCQkqZHArKyA9IE1BR0lDOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz0nOgotCQkJCQkvKiBOb3RlIGZpcnN0IHVucXVvdGVkID0gZm9yIH4gKi8KLQkJCQkJaWYgKCEoZiAmIERPVEVNUF8pICYmICFzYXdfZXEgJiYKLQkJCQkJICAgIChGbGFnKEZCUkFDRUVYUEFORCkgfHwKLQkJCQkJICAgIChmICYgRE9BU05USUxERSkpKSB7Ci0JCQkJCQlzYXdfZXEgPSAxOwotCQkJCQkJdGlsZGVfb2sgPSAxOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJzonOiAvKiA6ICovCi0JCQkJCS8qIE5vdGUgdW5xdW90ZWQgOiBmb3IgfiAqLwotCQkJCQlpZiAoIShmICYgRE9URU1QXykgJiYgKGYgJiBET0FTTlRJTERFKSkKLQkJCQkJCXRpbGRlX29rID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnfic6Ci0JCQkJCS8qIHRpbGRlX29rIGlzIHJlc2V0IHdoZW5ldmVyCi0JCQkJCSAqIGFueSBvZiAnICIgJCggJCgoICR7IH0gYXJlIHNlZW4uCi0JCQkJCSAqIE5vdGUgdGhhdCB0aWxkZV9vayBtdXN0IGJlIHByZXNlcnZlZAotCQkJCQkgKiB0aHJvdWdoIHRoZSBzZXF1ZW5jZSAke0E9YT19fgotCQkJCQkgKi8KLQkJCQkJaWYgKHR5cGUgPT0gWEJBU0UgJiYKLQkJCQkJICAgIChmICYgKERPVElMREV8RE9BU05USUxERSkpICYmCi0JCQkJCSAgICAodGlsZGVfb2sgJiAyKSkgewotCQkJCQkJY29uc3QgY2hhciAqcDsKLQkJCQkJCWNoYXIgKmRwX3g7Ci0KLQkJCQkJCWRwX3ggPSBkcDsKLQkJCQkJCXAgPSBtYXliZV9leHBhbmRfdGlsZGUoc3AsCi0JCQkJCQkgICAgJmRzLCAmZHBfeCwKLQkJCQkJCSAgICBmICYgRE9BU05USUxERSk7Ci0JCQkJCQlpZiAocCkgewotCQkJCQkJCWlmIChkcCAhPSBkcF94KQotCQkJCQkJCQl3b3JkID0gSUZTX1dPUkQ7Ci0JCQkJCQkJZHAgPSBkcF94OwotCQkJCQkJCXNwID0gcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJcXVvdGUgJj0gfjI7IC8qIHVuZG8gdGVtcG9yYXJ5ICovCi0KLQkJCWlmIChtYWtlX21hZ2ljKSB7Ci0JCQkJbWFrZV9tYWdpYyA9IDA7Ci0JCQkJZmRvIHw9IERPTUFHSUNfIHwgKGYgJiBET0dMT0IpOwotCQkJCSpkcCsrID0gTUFHSUM7Ci0JCQl9IGVsc2UgaWYgKElTTUFHSUMoYykpIHsKLQkJCQlmZG8gfD0gRE9NQUdJQ187Ci0JCQkJKmRwKysgPSBNQUdJQzsKLQkJCX0KLQkJCSpkcCsrID0gYzsgLyogc2F2ZSBvdXRwdXQgY2hhciAqLwotCQkJd29yZCA9IElGU19XT1JEOwotCQl9Ci0JfQotfQotCi0vKgotICogUHJlcGFyZSB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nIHJldHVybmVkIGJ5ICR7fSBzdWJzdGl0dXRpb24uCi0gKi8KLXN0YXRpYyBpbnQKLXZhcnN1YihFeHBhbmQgKnhwLCBjb25zdCBjaGFyICpzcCwgY29uc3QgY2hhciAqd29yZCwKLSAgICBpbnQgKnN0eXBlcCwJLyogYmVjb21lcyBxdWFsaWZpZXIgdHlwZSAqLwotICAgIGludCAqc2xlbnApCQkvKiAiICIgbGVuICg9LCA6PSwgZXRjLikgdmFsaWQgaWZmICpzdHlwZXAgIT0gMCAqLwotewotCWludCBjOwotCWludCBzdGF0ZTsJLyogbmV4dCBzdGF0ZTogWEJBU0UsIFhBUkcsIFhTVUIsIFhOVUxMU1VCICovCi0JaW50IHN0eXBlOwkvKiBzdWJzdGl0dXRpb24gdHlwZSAqLwotCWludCBzbGVuOwotCWNvbnN0IGNoYXIgKnA7Ci0Jc3RydWN0IHRibCAqdnA7Ci0JYm9vbCB6ZXJvX29rID0gZmFsc2U7Ci0KLQlpZiAoKHN0eXBlID0gc3BbMF0pID09ICdcMCcpCS8qIEJhZCB2YXJpYWJsZSBuYW1lICovCi0JCXJldHVybiAoLTEpOwotCi0JeHAtPnZhciA9IE5VTEw7Ci0KLQkvKi0KLQkgKiAkeyN2YXJ9LCBzdHJpbmcgbGVuZ3RoICgtVTogY2hhcmFjdGVycywgK1U6IG9jdGV0cykgb3IgYXJyYXkgc2l6ZQotCSAqICR7JXZhcn0sIHN0cmluZyB3aWR0aCAoLVU6IHNjcmVlbiBjb2x1bW5zLCArVTogb2N0ZXRzKQotCSAqLwotCWMgPSBzcFsxXTsKLQlpZiAoc3R5cGUgPT0gJyUnICYmIGMgPT0gJ1wwJykKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKChzdHlwZSA9PSAnIycgfHwgc3R5cGUgPT0gJyUnKSAmJiBjICE9ICdcMCcpIHsKLQkJLyogQ2FuJ3QgaGF2ZSBhbnkgbW9kaWZpZXJzIGZvciAkeyMuLi59IG9yICR7JS4uLn0gKi8KLQkJaWYgKCp3b3JkICE9IENTVUJTVCkKLQkJCXJldHVybiAoLTEpOwotCQlzcCsrOwotCQkvKiBDaGVjayBmb3Igc2l6ZSBvZiBhcnJheSAqLwotCQlpZiAoKHAgPSBjc3RyY2hyKHNwLCAnWycpKSAmJiAocFsxXSA9PSAnKicgfHwgcFsxXSA9PSAnQCcpICYmCi0JCSAgICBwWzJdID09ICddJykgewotCQkJaW50IG4gPSAwOwotCi0JCQlpZiAoc3R5cGUgIT0gJyMnKQotCQkJCXJldHVybiAoLTEpOwotCQkJdnAgPSBnbG9iYWwoYXJyYXluYW1lKHNwKSk7Ci0JCQlpZiAodnAtPmZsYWcgJiAoSVNTRVR8QVJSQVkpKQotCQkJCXplcm9fb2sgPSB0cnVlOwotCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KQotCQkJCWlmICh2cC0+ZmxhZyAmIElTU0VUKQotCQkJCQluKys7Ci0JCQljID0gbjsKLQkJfSBlbHNlIGlmIChjID09ICcqJyB8fCBjID09ICdAJykgewotCQkJaWYgKHN0eXBlICE9ICcjJykKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWMgPSBlLT5sb2MtPmFyZ2M7Ci0JCX0gZWxzZSB7Ci0JCQlwID0gc3RyX3ZhbChnbG9iYWwoc3ApKTsKLQkJCXplcm9fb2sgPSBwICE9IG51bGw7Ci0JCQlpZiAoc3R5cGUgPT0gJyMnKQotCQkJCWMgPSB1dGZsZW4ocCk7Ci0JCQllbHNlIHsKLQkJCQkvKiBwYXJ0aWFsIHV0Zl9tYnN3aWR0aCByZWltcGxlbWVudGF0aW9uICovCi0JCQkJY29uc3QgY2hhciAqcyA9IHA7Ci0JCQkJdW5zaWduZWQgaW50IHdjOwotCQkJCXNpemVfdCBsZW47Ci0JCQkJaW50IGN3OwotCi0JCQkJYyA9IDA7Ci0JCQkJd2hpbGUgKCpzKSB7Ci0JCQkJCWlmICghVVRGTU9ERSB8fCAobGVuID0gdXRmX21idG93Yygmd2MsCi0JCQkJCSAgICBzKSkgPT0gKHNpemVfdCktMSkKLQkJCQkJCS8qIG5vdCBVVEZNT0RFIG9yIG5vdCBVVEYtOCAqLwotCQkJCQkJd2MgPSAodW5zaWduZWQgY2hhcikoKnMrKyk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8qIFVURk1PREUgYW5kIFVURi04ICovCi0JCQkJCQlzICs9IGxlbjsKLQkJCQkJLyogd2MgPT0gY2hhciBvciB3Y2hhciBhdCBzKysgKi8KLQkJCQkJaWYgKChjdyA9IHV0Zl93Y3dpZHRoKHdjKSkgPT0gLTEpIHsKLQkJCQkJCS8qIDY0NiwgODg1OS0xLCAxMDY0NiBDMC9DMSAqLwotCQkJCQkJYyA9IC0xOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYyArPSBjdzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKEZsYWcoRk5PVU5TRVQpICYmIGMgPT0gMCAmJiAhemVyb19vaykKLQkJCWVycm9yZigiJXM6IHBhcmFtZXRlciBub3Qgc2V0Iiwgc3ApOwotCQkqc3R5cGVwID0gMDsgLyogdW5xdWFsaWZpZWQgdmFyaWFibGUvc3RyaW5nIHN1YnN0aXR1dGlvbiAqLwotCQl4cC0+c3RyID0gc2hmX3NtcHJpbnRmKCIlZCIsIGMpOwotCQlyZXR1cm4gKFhTVUIpOwotCX0KLQotCS8qIENoZWNrIGZvciBxdWFsaWZpZXJzIGluIHdvcmQgcGFydCAqLwotCXN0eXBlID0gMDsKLQljID0gd29yZFtzbGVuID0gMF0gPT0gQ0hBUiA/IHdvcmRbMV0gOiAwOwotCWlmIChjID09ICc6JykgewotCQlzbGVuICs9IDI7Ci0JCXN0eXBlID0gMHg4MDsKLQkJYyA9IHdvcmRbc2xlbiArIDBdID09IENIQVIgPyB3b3JkW3NsZW4gKyAxXSA6IDA7Ci0JfQotCWlmICghc3R5cGUgJiYgYyA9PSAnLycpIHsKLQkJc2xlbiArPSAyOwotCQlzdHlwZSA9IGM7Ci0JCWlmICh3b3JkW3NsZW5dID09IEFERUxJTSkgewotCQkJc2xlbiArPSAyOwotCQkJc3R5cGUgfD0gMHg4MDsKLQkJfQotCX0gZWxzZSBpZiAoc3R5cGUgPT0gMHg4MCAmJiAoYyA9PSAnICcgfHwgYyA9PSAnMCcpKSB7Ci0JCXN0eXBlIHw9ICcwJzsKLQl9IGVsc2UgaWYgKGN0eXBlKGMsIENfU1VCT1AxKSkgewotCQlzbGVuICs9IDI7Ci0JCXN0eXBlIHw9IGM7Ci0JfSBlbHNlIGlmIChjdHlwZShjLCBDX1NVQk9QMikpIHsgLyogTm90ZToga3NoODggYWxsb3dzIDolLCA6JSUsIGV0YyAqLwotCQlzbGVuICs9IDI7Ci0JCXN0eXBlID0gYzsKLQkJaWYgKHdvcmRbc2xlbiArIDBdID09IENIQVIgJiYgYyA9PSB3b3JkW3NsZW4gKyAxXSkgewotCQkJc3R5cGUgfD0gMHg4MDsKLQkJCXNsZW4gKz0gMjsKLQkJfQotCX0gZWxzZSBpZiAoc3R5cGUpCS8qIDogaXMgbm90IG9rICovCi0JCXJldHVybiAoLTEpOwotCWlmICghc3R5cGUgJiYgKndvcmQgIT0gQ1NVQlNUKQotCQlyZXR1cm4gKC0xKTsKLQkqc3R5cGVwID0gc3R5cGU7Ci0JKnNsZW5wID0gc2xlbjsKLQotCWMgPSBzcFswXTsKLQlpZiAoYyA9PSAnKicgfHwgYyA9PSAnQCcpIHsKLQkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKLQkJY2FzZSAnPSc6CS8qIGNhbid0IGFzc2lnbiB0byBhIHZlY3RvciAqLwotCQljYXNlICclJzoJLyogY2FuJ3QgdHJpbSBhIHZlY3RvciAoeWV0KSAqLwotCQljYXNlICcjJzoKLQkJY2FzZSAnMCc6Ci0JCWNhc2UgJy8nOgotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkJaWYgKGUtPmxvYy0+YXJnYyA9PSAwKSB7Ci0JCQl4cC0+c3RyID0gbnVsbDsKLQkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOwotCQkJc3RhdGUgPSBjID09ICdAJyA/IFhOVUxMU1VCIDogWFNVQjsKLQkJfSBlbHNlIHsKLQkJCXhwLT51LnN0cnYgPSAoY29uc3QgY2hhciAqKillLT5sb2MtPmFyZ3YgKyAxOwotCQkJeHAtPnN0ciA9ICp4cC0+dS5zdHJ2Kys7Ci0JCQl4cC0+c3BsaXQgPSBjID09ICdAJzsgLyogJEAgKi8KLQkJCXN0YXRlID0gWEFSRzsKLQkJfQotCQl6ZXJvX29rID0gdHJ1ZTsJLyogUE9TSVggMjAwOT8gKi8KLQl9IGVsc2UgewotCQlpZiAoKHAgPSBjc3RyY2hyKHNwLCAnWycpKSAmJiAocFsxXSA9PSAnKicgfHwgcFsxXSA9PSAnQCcpICYmCi0JCSAgICBwWzJdID09ICddJykgewotCQkJWFB0clYgd3Y7Ci0KLQkJCXN3aXRjaCAoc3R5cGUgJiAweDdmKSB7Ci0JCQljYXNlICc9JzoJLyogY2FuJ3QgYXNzaWduIHRvIGEgdmVjdG9yICovCi0JCQljYXNlICclJzoJLyogY2FuJ3QgdHJpbSBhIHZlY3RvciAoeWV0KSAqLwotCQkJY2FzZSAnIyc6Ci0JCQljYXNlICc/JzoKLQkJCWNhc2UgJzAnOgotCQkJY2FzZSAnLyc6Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCQlYUGluaXQod3YsIDMyKTsKLQkJCWlmICgoYyA9IHNwWzBdKSA9PSAnIScpCi0JCQkJKytzcDsKLQkJCXZwID0gZ2xvYmFsKGFycmF5bmFtZShzcCkpOwotCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KSB7Ci0JCQkJaWYgKCEodnAtPmZsYWcmSVNTRVQpKQotCQkJCQljb250aW51ZTsKLQkJCQlYUHB1dCh3diwgYyA9PSAnIScgPyBzaGZfc21wcmludGYoIiVsdSIsCi0JCQkJICAgIGFycmF5aW5kZXgodnApKSA6Ci0JCQkJICAgIHN0cl92YWwodnApKTsKLQkJCX0KLQkJCWlmIChYUHNpemUod3YpID09IDApIHsKLQkJCQl4cC0+c3RyID0gbnVsbDsKLQkJCQlzdGF0ZSA9IHBbMV0gPT0gJ0AnID8gWE5VTExTVUIgOiBYU1VCOwotCQkJCVhQZnJlZSh3dik7Ci0JCQl9IGVsc2UgewotCQkJCVhQcHV0KHd2LCAwKTsKLQkJCQl4cC0+dS5zdHJ2ID0gKGNvbnN0IGNoYXIgKiopWFBwdHJ2KHd2KTsKLQkJCQl4cC0+c3RyID0gKnhwLT51LnN0cnYrKzsKLQkJCQl4cC0+c3BsaXQgPSBwWzFdID09ICdAJzsgLyogJHtmb29bQF19ICovCi0JCQkJc3RhdGUgPSBYQVJHOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogQ2FuJ3QgYXNzaWduIHRoaW5ncyBsaWtlICQhIG9yICQxICovCi0JCQlpZiAoKHN0eXBlICYgMHg3ZikgPT0gJz0nICYmCi0JCQkgICAgY3R5cGUoKnNwLCBDX1ZBUjEgfCBDX0RJR0lUKSkKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCWlmICgqc3AgPT0gJyEnICYmIHNwWzFdKSB7Ci0JCQkJKytzcDsKLQkJCQl4cC0+dmFyID0gZ2xvYmFsKHNwKTsKLQkJCQlpZiAoY3N0cmNocihzcCwgJ1snKSkgewotCQkJCQlpZiAoeHAtPnZhci0+ZmxhZyAmIElTU0VUKQotCQkJCQkJeHAtPnN0ciA9IHNoZl9zbXByaW50ZigiJWx1IiwKLQkJCQkJCSAgICBhcnJheWluZGV4KHhwLT52YXIpKTsKLQkJCQkJZWxzZQotCQkJCQkJeHAtPnN0ciA9IG51bGw7Ci0JCQkJfSBlbHNlIGlmICh4cC0+dmFyLT5mbGFnICYgSVNTRVQpCi0JCQkJCXhwLT5zdHIgPSB4cC0+dmFyLT5uYW1lOwotCQkJCWVsc2UKLQkJCQkJeHAtPnN0ciA9ICIwIjsJLyoga3NoOTMgY29tcGF0ICovCi0JCQl9IGVsc2UgewotCQkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOwotCQkJCXhwLT5zdHIgPSBzdHJfdmFsKHhwLT52YXIpOwotCQkJfQotCQkJc3RhdGUgPSBYU1VCOwotCQl9Ci0JfQotCi0JYyA9IHN0eXBlJjB4N2Y7Ci0JLyogdGVzdCB0aGUgY29tcGlsZXIncyBjb2RlIGdlbmVyYXRvciAqLwotCWlmIChjdHlwZShjLCBDX1NVQk9QMikgfHwgc3R5cGUgPT0gKDB4ODAgfCAnMCcpIHx8IGMgPT0gJy8nIHx8Ci0JICAgICgoKHN0eXBlJjB4ODApID8gKnhwLT5zdHI9PSdcMCcgOiB4cC0+c3RyPT1udWxsKSA/IC8qIHVuZGVmPyAqLwotCSAgICBjID09ICc9JyB8fCBjID09ICctJyB8fCBjID09ICc/JyA6IGMgPT0gJysnKSkKLQkJc3RhdGUgPSBYQkFTRTsJLyogZXhwYW5kIHdvcmQgaW5zdGVhZCBvZiB2YXJpYWJsZSB2YWx1ZSAqLwotCWlmIChGbGFnKEZOT1VOU0VUKSAmJiB4cC0+c3RyID09IG51bGwgJiYgIXplcm9fb2sgJiYKLQkgICAgKGN0eXBlKGMsIENfU1VCT1AyKSB8fCAoc3RhdGUgIT0gWEJBU0UgJiYgYyAhPSAnKycpKSkKLQkJZXJyb3JmKCIlczogcGFyYW1ldGVyIG5vdCBzZXQiLCBzcCk7Ci0JcmV0dXJuIChzdGF0ZSk7Ci19Ci0KLS8qCi0gKiBSdW4gdGhlIGNvbW1hbmQgaW4gJCguLi4pIGFuZCByZWFkIGl0cyBvdXRwdXQuCi0gKi8KLXN0YXRpYyBpbnQKLWNvbXN1YihFeHBhbmQgKnhwLCBjb25zdCBjaGFyICpjcCkKLXsKLQlTb3VyY2UgKnMsICpzb2xkOwotCXN0cnVjdCBvcCAqdDsKLQlzdHJ1Y3Qgc2hmICpzaGY7Ci0KLQlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOwotCXMtPnN0YXJ0ID0gcy0+c3RyID0gY3A7Ci0Jc29sZCA9IHNvdXJjZTsKLQl0ID0gY29tcGlsZShzKTsKLQlhZnJlZShzLCBBVEVNUCk7Ci0Jc291cmNlID0gc29sZDsKLQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAoWEJBU0UpOwotCi0JaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRDT00gJiYgLyogJCg8ZmlsZSkgKi8KLQkgICAgKnQtPmFyZ3MgPT0gTlVMTCAmJiAqdC0+dmFycyA9PSBOVUxMICYmIHQtPmlvYWN0ICE9IE5VTEwpIHsKLQkJc3RydWN0IGlvd29yZCAqaW8gPSAqdC0+aW9hY3Q7Ci0JCWNoYXIgKm5hbWU7Ci0KLQkJaWYgKChpby0+ZmxhZyZJT1RZUEUpICE9IElPUkVBRCkKLQkJCWVycm9yZigiZnVubnkgJCgpIGNvbW1hbmQ6ICVzIiwKLQkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgaW8pKTsKLQkJc2hmID0gc2hmX29wZW4obmFtZSA9IGV2YWxzdHIoaW8tPm5hbWUsIERPVElMREUpLCBPX1JET05MWSwgMCwKLQkJCVNIRl9NQVBISXxTSEZfQ0xFWEVDKTsKLQkJaWYgKHNoZiA9PSBOVUxMKQotCQkJZXJyb3JmKCIlczogY2Fubm90IG9wZW4gJCgpIGlucHV0IiwgbmFtZSk7Ci0JCXhwLT5zcGxpdCA9IDA7CS8qIG5vIHdhaXRsYXN0KCkgKi8KLQl9IGVsc2UgewotCQlpbnQgb2ZkMSwgcHZbMl07Ci0JCW9wZW5waXBlKHB2KTsKLQkJc2hmID0gc2hmX2Zkb3BlbihwdlswXSwgU0hGX1JELCBOVUxMKTsKLQkJb2ZkMSA9IHNhdmVmZCgxKTsKLQkJaWYgKHB2WzFdICE9IDEpIHsKLQkJCWtzaF9kdXAyKHB2WzFdLCAxLCBmYWxzZSk7Ci0JCQljbG9zZShwdlsxXSk7Ci0JCX0KLQkJZXhlY3V0ZSh0LCBYRk9SS3xYWENPTXxYUElQRU8sIE5VTEwpOwotCQlyZXN0ZmQoMSwgb2ZkMSk7Ci0JCXN0YXJ0bGFzdCgpOwotCQl4cC0+c3BsaXQgPSAxOwkvKiB3YWl0bGFzdCgpICovCi0JfQotCi0JeHAtPnUuc2hmID0gc2hmOwotCXJldHVybiAoWENPTSk7Ci19Ci0KLS8qCi0gKiBwZXJmb3JtICNwYXR0ZXJuIGFuZCAlcGF0dGVybiBzdWJzdGl0dXRpb24gaW4gJHt9Ci0gKi8KLQotc3RhdGljIGNoYXIgKgotdHJpbXN1YihjaGFyICpzdHIsIGNoYXIgKnBhdCwgaW50IGhvdykKLXsKLQljaGFyICplbmQgPSBzdHJudWwoc3RyKTsKLQljaGFyICpwLCBjOwotCi0Jc3dpdGNoIChob3cgJiAweEZGKSB7Ci0JY2FzZSAnIyc6CQkvKiBzaG9ydGVzdCBhdCBiZWdpbm5pbmcgKi8KLQkJZm9yIChwID0gc3RyOyBwIDw9IGVuZDsgcCArPSB1dGZfcHRyYWRqKHApKSB7Ci0JCQljID0gKnA7ICpwID0gJ1wwJzsKLQkJCWlmIChnbWF0Y2h4KHN0ciwgcGF0LCBmYWxzZSkpIHsKLQkJCQkqcCA9IGM7Ci0JCQkJcmV0dXJuIChwKTsKLQkJCX0KLQkJCSpwID0gYzsKLQkJfQotCQlicmVhazsKLQljYXNlICcjJ3wweDgwOgkJLyogbG9uZ2VzdCBtYXRjaCBhdCBiZWdpbm5pbmcgKi8KLQkJZm9yIChwID0gZW5kOyBwID49IHN0cjsgcC0tKSB7Ci0JCQljID0gKnA7ICpwID0gJ1wwJzsKLQkJCWlmIChnbWF0Y2h4KHN0ciwgcGF0LCBmYWxzZSkpIHsKLQkJCQkqcCA9IGM7Ci0JCQkJcmV0dXJuIChwKTsKLQkJCX0KLQkJCSpwID0gYzsKLQkJfQotCQlicmVhazsKLQljYXNlICclJzoJCS8qIHNob3J0ZXN0IG1hdGNoIGF0IGVuZCAqLwotCQlwID0gZW5kOwotCQl3aGlsZSAocCA+PSBzdHIpIHsKLQkJCWlmIChnbWF0Y2h4KHAsIHBhdCwgZmFsc2UpKQotCQkJCWdvdG8gdHJpbXN1Yl9tYXRjaDsKLQkJCWlmIChVVEZNT0RFKSB7Ci0JCQkJY2hhciAqb3AgPSBwOwotCQkJCXdoaWxlICgocC0tID4gc3RyKSAmJiAoKCpwICYgMHhDMCkgPT0gMHg4MCkpCi0JCQkJCTsKLQkJCQlpZiAoKHAgPCBzdHIpIHx8IChwICsgdXRmX3B0cmFkaihwKSAhPSBvcCkpCi0JCQkJCXAgPSBvcCAtIDE7Ci0JCQl9IGVsc2UKLQkJCQktLXA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnJSd8MHg4MDoJCS8qIGxvbmdlc3QgbWF0Y2ggYXQgZW5kICovCi0JCWZvciAocCA9IHN0cjsgcCA8PSBlbmQ7IHArKykKLQkJCWlmIChnbWF0Y2h4KHAsIHBhdCwgZmFsc2UpKSB7Ci0gdHJpbXN1Yl9tYXRjaDoKLQkJCQlzdHJuZHVweChlbmQsIHN0ciwgcCAtIHN0ciwgQVRFTVApOwotCQkJCXJldHVybiAoZW5kKTsKLQkJCX0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChzdHIpOwkJLyogbm8gbWF0Y2gsIHJldHVybiBzdHJpbmcgKi8KLX0KLQotLyoKLSAqIGdsb2IKLSAqIE5hbWUgZGVyaXZlZCBmcm9tIFY2J3MgL2V0Yy9nbG9iLCB0aGUgcHJvZ3JhbSB0aGF0IGV4cGFuZGVkIGZpbGVuYW1lcy4KLSAqLwotCi0vKiBYWFggY3Agbm90IGNvbnN0ICdjYXVzZSBzbGFzaGVzIGFyZSB0ZW1wb3JhcmlseSByZXBsYWNlZCB3aXRoIE5VTHMuLi4gKi8KLXN0YXRpYyB2b2lkCi1nbG9iKGNoYXIgKmNwLCBYUHRyViAqd3AsIGludCBtYXJrZGlycykKLXsKLQlpbnQgb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOwotCi0JaWYgKGdsb2Jfc3RyKGNwLCB3cCwgbWFya2RpcnMpID09IDApCi0JCVhQcHV0KCp3cCwgZGVidW5rKGNwLCBjcCwgc3RybGVuKGNwKSArIDEpKTsKLQllbHNlCi0JCXFzb3J0KFhQcHRydigqd3ApICsgb2xkc2l6ZSwgWFBzaXplKCp3cCkgLSBvbGRzaXplLAotCQkgICAgc2l6ZW9mKHZvaWQgKiksIHhzdHJjbXApOwotfQotCi0jZGVmaW5lIEdGX05PTkUJCTAKLSNkZWZpbmUgR0ZfRVhDSEVDSwlCSVQoMCkJCS8qIGRvIGV4aXN0ZW5jZSBjaGVjayBvbiBmaWxlICovCi0jZGVmaW5lIEdGX0dMT0JCRUQJQklUKDEpCQkvKiBzb21lIGdsb2JiaW5nIGhhcyBiZWVuIGRvbmUgKi8KLSNkZWZpbmUgR0ZfTUFSS0RJUglCSVQoMikJCS8qIGFkZCB0cmFpbGluZyAvIHRvIGRpcmVjdG9yaWVzICovCi0KLS8qIEFwcGx5IGZpbGUgZ2xvYmJpbmcgdG8gY3AgYW5kIHN0b3JlIHRoZSBtYXRjaGluZyBmaWxlcyBpbiB3cC4gUmV0dXJucwotICogdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgotICovCi1pbnQKLWdsb2Jfc3RyKGNoYXIgKmNwLCBYUHRyViAqd3AsIGludCBtYXJrZGlycykKLXsKLQlpbnQgb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOwotCVhTdHJpbmcgeHM7Ci0JY2hhciAqeHA7Ci0KLQlYaW5pdCh4cywgeHAsIDI1NiwgQVRFTVApOwotCWdsb2JpdCgmeHMsICZ4cCwgY3AsIHdwLCBtYXJrZGlycyA/IEdGX01BUktESVIgOiBHRl9OT05FKTsKLQlYZnJlZSh4cywgeHApOwotCi0JcmV0dXJuIChYUHNpemUoKndwKSAtIG9sZHNpemUpOwotfQotCi1zdGF0aWMgdm9pZAotZ2xvYml0KFhTdHJpbmcgKnhzLAkvKiBkZXN0IHN0cmluZyAqLwotICAgIGNoYXIgKip4cHAsCQkvKiBwdHIgdG8gZGVzdCBlbmQgKi8KLSAgICBjaGFyICpzcCwJCS8qIHNvdXJjZSBwYXRoICovCi0gICAgWFB0clYgKndwLAkJLyogb3V0cHV0IGxpc3QgKi8KLSAgICBpbnQgY2hlY2spCQkvKiBHRl8qIGZsYWdzICovCi17Ci0JY2hhciAqbnA7CQkvKiBuZXh0IHNvdXJjZSBjb21wb25lbnQgKi8KLQljaGFyICp4cCA9ICp4cHA7Ci0JY2hhciAqc2U7Ci0JY2hhciBvZGlyc2VwOwotCi0JLyogVGhpcyB0byBhbGxvdyBsb25nIGV4cGFuc2lvbnMgdG8gYmUgaW50ZXJydXB0ZWQgKi8KLQlpbnRyY2hlY2soKTsKLQotCWlmIChzcCA9PSBOVUxMKSB7CS8qIGVuZCBvZiBzb3VyY2UgcGF0aCAqLwotCQkvKiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIGlmIGEgcGF0dGVybgotCQkgKiBpcyBmb2xsb3dlZCBieSBhIG5vbi1wYXR0ZXJuIChlZywgZm9vKngvYmFyOyBubyBjaGVjawotCQkgKiBpcyBuZWVkZWQgZm9yIGZvbyogc2luY2UgdGhlIG1hdGNoIG11c3QgZXhpc3QpIG9yIGlmCi0JCSAqIGFueSBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIGFuZCB0aGUgbWFya2RpcnMgb3B0aW9uIGlzIHNldC4KLQkJICogU3ltbGlua3MgbWFrZSB0aGluZ3MgYSBiaXQgdHJpY2t5Li4uCi0JCSAqLwotCQlpZiAoKGNoZWNrICYgR0ZfRVhDSEVDSykgfHwKLQkJICAgICgoY2hlY2sgJiBHRl9NQVJLRElSKSAmJiAoY2hlY2sgJiBHRl9HTE9CQkVEKSkpIHsKLSNkZWZpbmUgc3RhdF9jaGVjaygpCShzdGF0X2RvbmUgPyBzdGF0X2RvbmUgOiBcCi0JCQkgICAgKHN0YXRfZG9uZSA9IHN0YXQoWHN0cmluZygqeHMsIHhwKSwgJnN0YXRiKSA8IDAgXAotCQkJCT8gLTEgOiAxKSkKLQkJCXN0cnVjdCBzdGF0IGxzdGF0Yiwgc3RhdGI7Ci0JCQlpbnQgc3RhdF9kb25lID0gMDsJIC8qIC0xOiBmYWlsZWQsIDEgb2sgKi8KLQotCQkJaWYgKGxzdGF0KFhzdHJpbmcoKnhzLCB4cCksICZsc3RhdGIpIDwgMCkKLQkJCQlyZXR1cm47Ci0JCQkvKiBzcGVjaWFsIGNhc2UgZm9yIHN5c3RlbXMgd2hpY2ggc3RyaXAgdHJhaWxpbmcKLQkJCSAqIHNsYXNoZXMgZnJvbSByZWd1bGFyIGZpbGVzIChlZywgL2V0Yy9wYXNzd2QvKS4KLQkJCSAqIFN1bk9TIDQuMS4zIGRvZXMgdGhpcy4uLgotCQkJICovCi0JCQlpZiAoKGNoZWNrICYgR0ZfRVhDSEVDSykgJiYgeHAgPiBYc3RyaW5nKCp4cywgeHApICYmCi0JCQkgICAgeHBbLTFdID09ICcvJyAmJiAhU19JU0RJUihsc3RhdGIuc3RfbW9kZSkgJiYKLQkJCSAgICAoIVNfSVNMTksobHN0YXRiLnN0X21vZGUpIHx8Ci0JCQkgICAgc3RhdF9jaGVjaygpIDwgMCB8fCAhU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkpCi0JCQkJcmV0dXJuOwotCQkJLyogUG9zc2libHkgdGFjayBvbiBhIHRyYWlsaW5nIC8gaWYgdGhlcmUgaXNuJ3QgYWxyZWFkeQotCQkJICogb25lIGFuZCBpZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYQotCQkJICogZGlyZWN0b3J5Ci0JCQkgKi8KLQkJCWlmICgoKGNoZWNrICYgR0ZfTUFSS0RJUikgJiYgKGNoZWNrICYgR0ZfR0xPQkJFRCkpICYmCi0JCQkgICAgeHAgPiBYc3RyaW5nKCp4cywgeHApICYmIHhwWy0xXSAhPSAnLycgJiYKLQkJCSAgICAoU19JU0RJUihsc3RhdGIuc3RfbW9kZSkgfHwKLQkJCSAgICAoU19JU0xOSyhsc3RhdGIuc3RfbW9kZSkgJiYgc3RhdF9jaGVjaygpID4gMCAmJgotCQkJICAgIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpKSkgewotCQkJCSp4cCsrID0gJy8nOwotCQkJCSp4cCA9ICdcMCc7Ci0JCQl9Ci0JCX0KLQkJc3RybmR1cHgobnAsIFhzdHJpbmcoKnhzLCB4cCksIFhsZW5ndGgoKnhzLCB4cCksIEFURU1QKTsKLQkJWFBwdXQoKndwLCBucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoeHAgPiBYc3RyaW5nKCp4cywgeHApKQotCQkqeHArKyA9ICcvJzsKLQl3aGlsZSAoKnNwID09ICcvJykgewotCQlYY2hlY2soKnhzLCB4cCk7Ci0JCSp4cCsrID0gKnNwKys7Ci0JfQotCW5wID0gc3RyY2hyKHNwLCAnLycpOwotCWlmIChucCAhPSBOVUxMKSB7Ci0JCXNlID0gbnA7Ci0JCW9kaXJzZXAgPSAqbnA7CS8qIGRvbid0IGFzc3VtZSAnLycsIGNhbiBiZSBtdWx0aXBsZSBraW5kcyAqLwotCQkqbnArKyA9ICdcMCc7Ci0JfSBlbHNlIHsKLQkJb2RpcnNlcCA9ICdcMCc7IC8qIGtlZXAgZ2NjIHF1aWV0ICovCi0JCXNlID0gc3AgKyBzdHJsZW4oc3ApOwotCX0KLQotCi0JLyogQ2hlY2sgaWYgc3AgbmVlZHMgZ2xvYmJpbmcgLSBkb25lIHRvIGF2b2lkIHBhdHRlcm4gY2hlY2tzIGZvciBzdHJpbmdzCi0JICogY29udGFpbmluZyBNQUdJQyBjaGFyYWN0ZXJzLCBvcGVuIFtzIHdpdGhvdXQgdGhlIG1hdGNoaW5nIGNsb3NlIF0sCi0JICogZXRjLiAob3RoZXJ3aXNlIG9wZW5kaXIoKSB3aWxsIGJlIGNhbGxlZCB3aGljaCBtYXkgZmFpbCBiZWNhdXNlIHRoZQotCSAqIGRpcmVjdG9yeSBpc24ndCByZWFkYWJsZSAtIGlmIG5vIGdsb2JiaW5nIGlzIG5lZWRlZCwgb25seSBleGVjdXRlCi0JICogcGVybWlzc2lvbiBzaG91bGQgYmUgcmVxdWlyZWQgKGFzIHBlciBQT1NJWCkpLgotCSAqLwotCWlmICghaGFzX2dsb2JiaW5nKHNwLCBzZSkpIHsKLQkJWGNoZWNrTigqeHMsIHhwLCBzZSAtIHNwICsgMSk7Ci0JCWRlYnVuayh4cCwgc3AsIFhubGVmdCgqeHMsIHhwKSk7Ci0JCXhwICs9IHN0cmxlbih4cCk7Ci0JCSp4cHAgPSB4cDsKLQkJZ2xvYml0KHhzLCB4cHAsIG5wLCB3cCwgY2hlY2spOwotCX0gZWxzZSB7Ci0JCURJUiAqZGlycDsKLQkJc3RydWN0IGRpcmVudCAqZDsKLQkJY2hhciAqbmFtZTsKLQkJaW50IGxlbjsKLQkJaW50IHByZWZpeF9sZW47Ci0KLQkJLyogeHAgPSAqeHBwOwljb3B5X25vbl9nbG9iKCkgbWF5IGhhdmUgcmUtYWxsb2MnZCB4cyAqLwotCQkqeHAgPSAnXDAnOwotCQlwcmVmaXhfbGVuID0gWGxlbmd0aCgqeHMsIHhwKTsKLQkJZGlycCA9IG9wZW5kaXIocHJlZml4X2xlbiA/IFhzdHJpbmcoKnhzLCB4cCkgOiAiLiIpOwotCQlpZiAoZGlycCA9PSBOVUxMKQotCQkJZ290byBOb2RpcjsKLQkJd2hpbGUgKChkID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgewotCQkJbmFtZSA9IGQtPmRfbmFtZTsKLQkJCWlmIChuYW1lWzBdID09ICcuJyAmJgotCQkJICAgIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKQotCQkJCWNvbnRpbnVlOyAvKiBhbHdheXMgaWdub3JlIC4gYW5kIC4uICovCi0JCQlpZiAoKCpuYW1lID09ICcuJyAmJiAqc3AgIT0gJy4nKSB8fAotCQkJICAgICFnbWF0Y2h4KG5hbWUsIHNwLCB0cnVlKSkKLQkJCQljb250aW51ZTsKLQotCQkJbGVuID0gc3RybGVuKGQtPmRfbmFtZSkgKyAxOwotCQkJWGNoZWNrTigqeHMsIHhwLCBsZW4pOwotCQkJbWVtY3B5KHhwLCBuYW1lLCBsZW4pOwotCQkJKnhwcCA9IHhwICsgbGVuIC0gMTsKLQkJCWdsb2JpdCh4cywgeHBwLCBucCwgd3AsCi0JCQkJKGNoZWNrICYgR0ZfTUFSS0RJUikgfCBHRl9HTE9CQkVECi0JCQkJfCAobnAgPyBHRl9FWENIRUNLIDogR0ZfTk9ORSkpOwotCQkJeHAgPSBYc3RyaW5nKCp4cywgeHApICsgcHJlZml4X2xlbjsKLQkJfQotCQljbG9zZWRpcihkaXJwKTsKLSBOb2RpcjoKLQkJOwotCX0KLQotCWlmIChucCAhPSBOVUxMKQotCQkqLS1ucCA9IG9kaXJzZXA7Ci19Ci0KLS8qIHJlbW92ZSBNQUdJQyBmcm9tIHN0cmluZyAqLwotY2hhciAqCi1kZWJ1bmsoY2hhciAqZHAsIGNvbnN0IGNoYXIgKnNwLCBzaXplX3QgZGxlbikKLXsKLQljaGFyICpkOwotCWNvbnN0IGNoYXIgKnM7Ci0KLQlpZiAoKHMgPSBjc3RyY2hyKHNwLCBNQUdJQykpKSB7Ci0JCWlmIChzIC0gc3AgPj0gKHNzaXplX3QpZGxlbikKLQkJCXJldHVybiAoZHApOwotCQltZW1tb3ZlKGRwLCBzcCwgcyAtIHNwKTsKLQkJZm9yIChkID0gZHAgKyAocyAtIHNwKTsgKnMgJiYgKGQgLSBkcCA8IChzc2l6ZV90KWRsZW4pOyBzKyspCi0JCQlpZiAoIUlTTUFHSUMoKnMpIHx8ICEoKisrcyAmIDB4ODApIHx8Ci0JCQkgICAgIXZzdHJjaHIoIiorP0AhICIsICpzICYgMHg3ZikpCi0JCQkJKmQrKyA9ICpzOwotCQkJZWxzZSB7Ci0JCQkJLyogZXh0ZW5kZWQgcGF0dGVybiBvcGVyYXRvcnM6ICorP0AhICovCi0JCQkJaWYgKCgqcyAmIDB4N2YpICE9ICcgJykKLQkJCQkJKmQrKyA9ICpzICYgMHg3ZjsKLQkJCQlpZiAoZCAtIGRwIDwgKHNzaXplX3QpZGxlbikKLQkJCQkJKmQrKyA9ICcoJzsKLQkJCX0KLQkJKmQgPSAnXDAnOwotCX0gZWxzZSBpZiAoZHAgIT0gc3ApCi0JCXN0cmxjcHkoZHAsIHNwLCBkbGVuKTsKLQlyZXR1cm4gKGRwKTsKLX0KLQotLyogQ2hlY2sgaWYgcCBpcyBhbiB1bnF1b3RlZCBuYW1lLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhIC8gb3IgOi4gSWYgc28KLSAqIHB1dHMgdGhlIGV4cGFuZGVkIHZlcnNpb24gaW4gKmRjcCxkcCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgaW4gcCBqdXN0Ci0gKiBwYXN0IHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyAwLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1tYXliZV9leHBhbmRfdGlsZGUoY29uc3QgY2hhciAqcCwgWFN0cmluZyAqZHNwLCBjaGFyICoqZHBwLCBpbnQgaXNhc3NpZ24pCi17Ci0JWFN0cmluZyB0czsKLQljaGFyICpkcCA9ICpkcHA7Ci0JY2hhciAqdHA7Ci0JY29uc3QgY2hhciAqcjsKLQotCVhpbml0KHRzLCB0cCwgMTYsIEFURU1QKTsKLQkvKiA6IG9ubHkgZm9yIERPQVNOVElMREUgZm9ybSAqLwotCXdoaWxlIChwWzBdID09IENIQVIgJiYgcFsxXSAhPSAnLycgJiYgKCFpc2Fzc2lnbiB8fCBwWzFdICE9ICc6JykpCi0JewotCQlYY2hlY2sodHMsIHRwKTsKLQkJKnRwKysgPSBwWzFdOwotCQlwICs9IDI7Ci0JfQotCSp0cCA9ICdcMCc7Ci0JciA9IChwWzBdID09IEVPUyB8fCBwWzBdID09IENIQVIgfHwgcFswXSA9PSBDU1VCU1QpID8KLQkgICAgdGlsZGUoWHN0cmluZyh0cywgdHApKSA6IE5VTEw7Ci0JWGZyZWUodHMsIHRwKTsKLQlpZiAocikgewotCQl3aGlsZSAoKnIpIHsKLQkJCVhjaGVjaygqZHNwLCBkcCk7Ci0JCQlpZiAoSVNNQUdJQygqcikpCi0JCQkJKmRwKysgPSBNQUdJQzsKLQkJCSpkcCsrID0gKnIrKzsKLQkJfQotCQkqZHBwID0gZHA7Ci0JCXIgPSBwOwotCX0KLQlyZXR1cm4gKHIpOwotfQotCi0vKgotICogdGlsZGUgZXhwYW5zaW9uCi0gKgotICogYmFzZWQgb24gYSB2ZXJzaW9uIGJ5IEFybm9sZCBSb2JiaW5zCi0gKi8KLQotc3RhdGljIGNoYXIgKgotdGlsZGUoY2hhciAqY3ApCi17Ci0JY2hhciAqZHAgPSBudWxsOwotCi0JaWYgKGNwWzBdID09ICdcMCcpCi0JCWRwID0gc3RyX3ZhbChnbG9iYWwoIkhPTUUiKSk7Ci0JZWxzZSBpZiAoY3BbMF0gPT0gJysnICYmIGNwWzFdID09ICdcMCcpCi0JCWRwID0gc3RyX3ZhbChnbG9iYWwoIlBXRCIpKTsKLQllbHNlIGlmIChjcFswXSA9PSAnLScgJiYgY3BbMV0gPT0gJ1wwJykKLQkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiT0xEUFdEIikpOwotI2lmbmRlZiBNS1NIX05PUFdOQU0KLQllbHNlCi0JCWRwID0gaG9tZWRpcihjcCk7Ci0jZW5kaWYKLQkvKiBJZiBIT01FLCBQV0Qgb3IgT0xEUFdEIGFyZSBub3Qgc2V0LCBkb24ndCBleHBhbmQgfiAqLwotCXJldHVybiAoZHAgPT0gbnVsbCA/IE5VTEwgOiBkcCk7Ci19Ci0KLSNpZm5kZWYgTUtTSF9OT1BXTkFNCi0vKgotICogbWFwIHVzZXJpZCB0byB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0gKiBub3RlIHRoYXQgNC4zJ3MgZ2V0cHcgYWRkcyBtb3JlIHRoYW4gNksgdG8gdGhlIHNoZWxsLAotICogYW5kIHRoZSBZUCB2ZXJzaW9uIHByb2JhYmx5IGFkZHMgbXVjaCBtb3JlLgotICogd2UgbWlnaHQgY29uc2lkZXIgb3VyIG93biB2ZXJzaW9uIG9mIGdldHB3bmFtKCkgdG8ga2VlcCB0aGUgc2l6ZSBkb3duLgotICovCi1zdGF0aWMgY2hhciAqCi1ob21lZGlyKGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRibCAqYXA7Ci0KLQlhcCA9IGt0ZW50ZXIoJmhvbWVkaXJzLCBuYW1lLCBoYXNoKG5hbWUpKTsKLQlpZiAoIShhcC0+ZmxhZyAmIElTU0VUKSkgewotCQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQotCQlwdyA9IGdldHB3bmFtKG5hbWUpOwotCQlpZiAocHcgPT0gTlVMTCkKLQkJCXJldHVybiAoTlVMTCk7Ci0JCXN0cmR1cHgoYXAtPnZhbC5zLCBwdy0+cHdfZGlyLCBBUEVSTSk7Ci0JCWFwLT5mbGFnIHw9IERFRklORUR8SVNTRVR8QUxMT0M7Ci0JfQotCXJldHVybiAoYXAtPnZhbC5zKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotYWx0X2V4cGFuZChYUHRyViAqd3AsIGNoYXIgKnN0YXJ0LCBjaGFyICpleHBfc3RhcnQsIGNoYXIgKmVuZCwgaW50IGZkbykKLXsKLQlpbnQgY291bnQgPSAwOwotCWNoYXIgKmJyYWNlX3N0YXJ0LCAqYnJhY2VfZW5kLCAqY29tbWEgPSBOVUxMOwotCWNoYXIgKmZpZWxkX3N0YXJ0OwotCWNoYXIgKnA7Ci0KLQkvKiBzZWFyY2ggZm9yIG9wZW4gYnJhY2UgKi8KLQlmb3IgKHAgPSBleHBfc3RhcnQ7IChwID0gc3RyY2hyKHAsIE1BR0lDKSkgJiYgcFsxXSAhPSBPQlJBQ0U7IHAgKz0gMikKLQkJOwotCWJyYWNlX3N0YXJ0ID0gcDsKLQotCS8qIGZpbmQgbWF0Y2hpbmcgY2xvc2UgYnJhY2UsIGlmIGFueSAqLwotCWlmIChwKSB7Ci0JCWNvbW1hID0gTlVMTDsKLQkJY291bnQgPSAxOwotCQlmb3IgKHAgKz0gMjsgKnAgJiYgY291bnQ7IHArKykgewotCQkJaWYgKElTTUFHSUMoKnApKSB7Ci0JCQkJaWYgKCorK3AgPT0gT0JSQUNFKQotCQkJCQljb3VudCsrOwotCQkJCWVsc2UgaWYgKCpwID09IENCUkFDRSkKLQkJCQkJLS1jb3VudDsKLQkJCQllbHNlIGlmICgqcCA9PSAnLCcgJiYgY291bnQgPT0gMSkKLQkJCQkJY29tbWEgPSBwOwotCQkJfQotCQl9Ci0JfQotCS8qIG5vIHZhbGlkIGV4cGFuc2lvbnMuLi4gKi8KLQlpZiAoIXAgfHwgY291bnQgIT0gMCkgewotCQkvKiBOb3RlIHRoYXQgZ2l2ZW4gYXt7YixjfSB3ZSBkbyBub3QgZXhwYW5kIGFueXRoaW5nICh0aGlzIGlzCi0JCSAqIHdoYXQgQVQmVCBrc2ggZG9lcy4gVGhpcyBtYXkgYmUgY2hhbmdlZCB0byBkbyB0aGUge2IsY30KLQkJICogZXhwYW5zaW9uLiB9Ci0JCSAqLwotCQlpZiAoZmRvICYgRE9HTE9CKQotCQkJZ2xvYihzdGFydCwgd3AsIGZkbyAmIERPTUFSS0RJUlMpOwotCQllbHNlCi0JCQlYUHB1dCgqd3AsIGRlYnVuayhzdGFydCwgc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0JCXJldHVybjsKLQl9Ci0JYnJhY2VfZW5kID0gcDsKLQlpZiAoIWNvbW1hKSB7Ci0JCWFsdF9leHBhbmQod3AsIHN0YXJ0LCBicmFjZV9lbmQsIGVuZCwgZmRvKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGV4cGFuZCBleHByZXNzaW9uICovCi0JZmllbGRfc3RhcnQgPSBicmFjZV9zdGFydCArIDI7Ci0JY291bnQgPSAxOwotCWZvciAocCA9IGJyYWNlX3N0YXJ0ICsgMjsgcCAhPSBicmFjZV9lbmQ7IHArKykgewotCQlpZiAoSVNNQUdJQygqcCkpIHsKLQkJCWlmICgqKytwID09IE9CUkFDRSkKLQkJCQljb3VudCsrOwotCQkJZWxzZSBpZiAoKCpwID09IENCUkFDRSAmJiAtLWNvdW50ID09IDApIHx8Ci0JCQkgICAgKCpwID09ICcsJyAmJiBjb3VudCA9PSAxKSkgewotCQkJCWNoYXIgKm5ld3M7Ci0JCQkJaW50IGwxLCBsMiwgbDM7Ci0KLQkJCQlsMSA9IGJyYWNlX3N0YXJ0IC0gc3RhcnQ7Ci0JCQkJbDIgPSAocCAtIDEpIC0gZmllbGRfc3RhcnQ7Ci0JCQkJbDMgPSBlbmQgLSBicmFjZV9lbmQ7Ci0JCQkJbmV3cyA9IGFsbG9jKGwxICsgbDIgKyBsMyArIDEsIEFURU1QKTsKLQkJCQltZW1jcHkobmV3cywgc3RhcnQsIGwxKTsKLQkJCQltZW1jcHkobmV3cyArIGwxLCBmaWVsZF9zdGFydCwgbDIpOwotCQkJCW1lbWNweShuZXdzICsgbDEgKyBsMiwgYnJhY2VfZW5kLCBsMyk7Ci0JCQkJbmV3c1tsMSArIGwyICsgbDNdID0gJ1wwJzsKLQkJCQlhbHRfZXhwYW5kKHdwLCBuZXdzLCBuZXdzICsgbDEsCi0JCQkJICAgIG5ld3MgKyBsMSArIGwyICsgbDMsIGZkbyk7Ci0JCQkJZmllbGRfc3RhcnQgPSBwICsgMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9leGVjLmMgYi9ta3NoL3NyYy9leGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTMyMWEuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvZXhlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxOCArMCwwIEBACi0vKgkkT3BlbkJTRDogZXhlYy5jLHYgMS40OSAyMDA5LzAxLzI5IDIzOjI3OjI2IGphcmVkeSBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2V4ZWMuYyx2IDEuNzUgMjAxMC8wNy8xNyAyMjowOTozNCB0ZyBFeHAgJCIpOwotCi0jaWZuZGVmIE1LU0hfREVGQVVMVF9FWEVDU0hFTEwKLSNkZWZpbmUgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTAkiL2Jpbi9zaCIKLSNlbmRpZgotCi1zdGF0aWMgaW50IGNvbWV4ZWMoc3RydWN0IG9wICosIHN0cnVjdCB0YmwgKnZvbGF0aWxlLCBjb25zdCBjaGFyICoqLAotICAgIGludCB2b2xhdGlsZSwgdm9sYXRpbGUgaW50ICopOwotc3RhdGljIHZvaWQgc2NyaXB0ZXhlYyhzdHJ1Y3Qgb3AgKiwgY29uc3QgY2hhciAqKikgTUtTSF9BX05PUkVUVVJOOwotc3RhdGljIGludCBjYWxsX2J1aWx0aW4oc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgaW9zZXR1cChzdHJ1Y3QgaW93b3JkICosIHN0cnVjdCB0YmwgKik7Ci1zdGF0aWMgaW50IGhlcmVpbihjb25zdCBjaGFyICosIGludCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZG9fc2VsZWN0YXJncyhjb25zdCBjaGFyICoqLCBib29sKTsKLXN0YXRpYyBUZXN0X29wIGRidGVzdGVfaXNhKFRlc3RfZW52ICosIFRlc3RfbWV0YSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGJ0ZXN0ZV9nZXRvcG5kKFRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOwotc3RhdGljIHZvaWQgZGJ0ZXN0ZV9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7Ci0KLS8qCi0gKiBleGVjdXRlIGNvbW1hbmQgdHJlZQotICovCi1pbnQKLWV4ZWN1dGUoc3RydWN0IG9wICp2b2xhdGlsZSB0LAotICAgIHZvbGF0aWxlIGludCBmbGFncywJCS8qIGlmIFhFWEVDIGRvbid0IGZvcmsgKi8KLSAgICB2b2xhdGlsZSBpbnQgKiB2b2xhdGlsZSB4ZXJyb2spCi17Ci0JaW50IGk7Ci0Jdm9sYXRpbGUgaW50IHJ2ID0gMCwgZHVtbXkgPSAwOwotCWludCBwdlsyXTsKLQljb25zdCBjaGFyICoqIHZvbGF0aWxlIGFwOwotCWNoYXIgKiogdm9sYXRpbGUgdXA7Ci0JY29uc3QgY2hhciAqcywgKmNwOwotCXN0cnVjdCBpb3dvcmQgKippb3dwOwotCXN0cnVjdCB0YmwgKnRwID0gTlVMTDsKLQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0KLQkvKiBDYWxsZXIgZG9lc24ndCBjYXJlIGlmIFhFUlJPSyBzaG91bGQgcHJvcGFnYXRlLiAqLwotCWlmICh4ZXJyb2sgPT0gTlVMTCkKLQkJeGVycm9rID0gJmR1bW15OwotCi0JaWYgKChmbGFncyZYRk9SSykgJiYgIShmbGFncyZYRVhFQykgJiYgdC0+dHlwZSAhPSBUUElQRSkKLQkJLyogcnVuIGluIHN1Yi1wcm9jZXNzICovCi0JCXJldHVybiAoZXhjaGlsZCh0LCBmbGFncyAmIH5YVElNRSwgeGVycm9rLCAtMSkpOwotCi0JbmV3ZW52KEVfRVhFQyk7Ci0JaWYgKHRyYXApCi0JCXJ1bnRyYXBzKDApOwotCi0JaWYgKHQtPnR5cGUgPT0gVENPTSkgewotCQkvKiBDbGVhciBzdWJzdF9leHN0YXQgYmVmb3JlIGFyZ3VtZW50IGV4cGFuc2lvbi4gVXNlZCBieQotCQkgKiBudWxsIGNvbW1hbmRzIChzZWUgY29tZXhlYygpIGFuZCBjX2V2YWwoKSkgYW5kIGJ5IGNfc2V0KCkuCi0JCSAqLwotCQlzdWJzdF9leHN0YXQgPSAwOwotCi0JCWN1cnJlbnRfbGluZW5vID0gdC0+bGluZW5vOwkvKiBmb3IgJExJTkVOTyAqLwotCi0JCS8qIFBPU0lYIHNheXMgZXhwYW5kIGNvbW1hbmQgd29yZHMgZmlyc3QsIHRoZW4gcmVkaXJlY3Rpb25zLAotCQkgKiBhbmQgYXNzaWdubWVudHMgbGFzdC4uCi0JCSAqLwotCQl1cCA9IGV2YWwodC0+YXJncywgdC0+dS5ldmFsZmxhZ3MgfCBET0JMQU5LIHwgRE9HTE9CIHwgRE9USUxERSk7Ci0JCWlmIChmbGFncyAmIFhUSU1FKQotCQkJLyogQWxsb3cgb3B0aW9uIHBhcnNpbmcgKGJpemFycmUsIGJ1dCBQT1NJWCkgKi8KLQkJCXRpbWV4X2hvb2sodCwgJnVwKTsKLQkJYXAgPSAoY29uc3QgY2hhciAqKil1cDsKLQkJaWYgKEZsYWcoRlhUUkFDRSkgJiYgYXBbMF0pIHsKLQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyIsCi0JCQkJc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSk7Ci0JCQlmb3IgKGkgPSAwOyBhcFtpXTsgaSsrKQotCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyVjIiwgYXBbaV0sCi0JCQkJICAgIGFwW2kgKyAxXSA/ICcgJyA6ICdcbicpOwotCQkJc2hmX2ZsdXNoKHNobF9vdXQpOwotCQl9Ci0JCWlmIChhcFswXSkKLQkJCXRwID0gZmluZGNvbShhcFswXSwgRkNfQkl8RkNfRlVOQyk7Ci0JfQotCWZsYWdzICY9IH5YVElNRTsKLQotCWlmICh0LT5pb2FjdCAhPSBOVUxMIHx8IHQtPnR5cGUgPT0gVFBJUEUgfHwgdC0+dHlwZSA9PSBUQ09QUk9DKSB7Ci0JCWUtPnNhdmVmZCA9IGFsbG9jKE5VRklMRSAqIHNpemVvZihzaG9ydCksIEFURU1QKTsKLQkJLyogaW5pdGlhbGlzZSB0byBub3QgcmVkaXJlY3RlZCAqLwotCQltZW1zZXQoZS0+c2F2ZWZkLCAwLCBOVUZJTEUgKiBzaXplb2Yoc2hvcnQpKTsKLQl9Ci0KLQkvKiBkbyByZWRpcmVjdGlvbiwgdG8gYmUgcmVzdG9yZWQgaW4gcXVpdGVudigpICovCi0JaWYgKHQtPmlvYWN0ICE9IE5VTEwpCi0JCWZvciAoaW93cCA9IHQtPmlvYWN0OyAqaW93cCAhPSBOVUxMOyBpb3dwKyspIHsKLQkJCWlmIChpb3NldHVwKCppb3dwLCB0cCkgPCAwKSB7Ci0JCQkJZXhzdGF0ID0gcnYgPSAxOwotCQkJCS8qIFJlZGlyZWN0aW9uIGZhaWx1cmVzIGZvciBzcGVjaWFsIGNvbW1hbmRzCi0JCQkJICogY2F1c2UgKG5vbi1pbnRlcmFjdGl2ZSkgc2hlbGwgdG8gZXhpdC4KLQkJCQkgKi8KLQkJCQlpZiAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMICYmCi0JCQkJICAgICh0cC0+ZmxhZyAmIFNQRUNfQkkpKQotCQkJCQllcnJvcmZ6KCk7Ci0JCQkJLyogRGVhbCB3aXRoIEZFUlJFWElULCBxdWl0ZW52KCksIGV0Yy4gKi8KLQkJCQlnb3RvIEJyZWFrOwotCQkJfQotCQl9Ci0KLQlzd2l0Y2ggKHQtPnR5cGUpIHsKLQljYXNlIFRDT006Ci0JCXJ2ID0gY29tZXhlYyh0LCB0cCwgKGNvbnN0IGNoYXIgKiopYXAsIGZsYWdzLCB4ZXJyb2spOwotCQlicmVhazsKLQotCWNhc2UgVFBBUkVOOgotCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgfCBYRk9SSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRQSVBFOgotCQlmbGFncyB8PSBYRk9SSzsKLQkJZmxhZ3MgJj0gflhFWEVDOwotCQllLT5zYXZlZmRbMF0gPSBzYXZlZmQoMCk7Ci0JCWUtPnNhdmVmZFsxXSA9IHNhdmVmZCgxKTsKLQkJd2hpbGUgKHQtPnR5cGUgPT0gVFBJUEUpIHsKLQkJCW9wZW5waXBlKHB2KTsKLQkJCWtzaF9kdXAyKHB2WzFdLCAxLCBmYWxzZSk7IC8qIHN0ZG91dCBvZiBjdXJyICovCi0JCQkvKioKLQkJCSAqIExldCBleGNoaWxkKCkgY2xvc2UgcHZbMF0gaW4gY2hpbGQKLQkJCSAqIChpZiB0aGlzIGlzbid0IGRvbmUsIGNvbW1hbmRzIGxpa2UKLQkJCSAqCSg6IDsgY2F0IC9ldGMvdGVybWNhcCkgfCBzbGVlcCAxCi0JCQkgKiB3aWxsIGhhbmcgZm9yZXZlcikuCi0JCQkgKi8KLQkJCWV4Y2hpbGQodC0+bGVmdCwgZmxhZ3MgfCBYUElQRU8gfCBYQ0NMT1NFLAotCQkJICAgIE5VTEwsIHB2WzBdKTsKLQkJCWtzaF9kdXAyKHB2WzBdLCAwLCBmYWxzZSk7IC8qIHN0ZGluIG9mIG5leHQgKi8KLQkJCWNsb3NlcGlwZShwdik7Ci0JCQlmbGFncyB8PSBYUElQRUk7Ci0JCQl0ID0gdC0+cmlnaHQ7Ci0JCX0KLQkJcmVzdGZkKDEsIGUtPnNhdmVmZFsxXSk7IC8qIHN0ZG91dCBvZiBsYXN0ICovCi0JCWUtPnNhdmVmZFsxXSA9IDA7IC8qIG5vIG5lZWQgdG8gcmUtcmVzdG9yZSB0aGlzICovCi0JCS8qIExldCBleGNoaWxkKCkgY2xvc2UgMCBpbiBwYXJlbnQsIGFmdGVyIGZvcmssIGJlZm9yZSB3YWl0ICovCi0JCWkgPSBleGNoaWxkKHQsIGZsYWdzIHwgWFBDTE9TRSwgeGVycm9rLCAwKTsKLQkJaWYgKCEoZmxhZ3MmWEJHTkQpICYmICEoZmxhZ3MmWFhDT00pKQotCQkJcnYgPSBpOwotCQlicmVhazsKLQotCWNhc2UgVExJU1Q6Ci0JCXdoaWxlICh0LT50eXBlID09IFRMSVNUKSB7Ci0JCQlleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCBOVUxMKTsKLQkJCXQgPSB0LT5yaWdodDsKLQkJfQotCQlydiA9IGV4ZWN1dGUodCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUQ09QUk9DOiB7Ci0JCXNpZ3NldF90IG9tYXNrOwotCi0JCS8qIEJsb2NrIHNpZ2NoaWxkIGFzIHdlIGFyZSB1c2luZyB0aGluZ3MgY2hhbmdlZCBpbiB0aGUKLQkJICogc2lnbmFsIGhhbmRsZXIKLQkJICovCi0JCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0JCWUtPnR5cGUgPSBFX0VSUkg7Ci0JCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JCWlmIChpKSB7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJCXF1aXRlbnYoTlVMTCk7Ci0JCQl1bndpbmQoaSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCX0KLQkJLyogQWxyZWFkeSBoYXZlIGEgKGxpdmUpIGNvLXByb2Nlc3M/ICovCi0JCWlmIChjb3Byb2Muam9iICYmIGNvcHJvYy53cml0ZSA+PSAwKQotCQkJZXJyb3JmKCJjb3Byb2Nlc3MgYWxyZWFkeSBleGlzdHMiKTsKLQotCQkvKiBDYW4gd2UgcmUtdXNlIHRoZSBleGlzdGluZyBjby1wcm9jZXNzIHBpcGU/ICovCi0JCWNvcHJvY19jbGVhbnVwKHRydWUpOwotCi0JCS8qIGRvIHRoaXMgYmVmb3JlIG9wZW5pbmcgcGlwZXMsIGluIGNhc2UgdGhlc2UgZmFpbCAqLwotCQllLT5zYXZlZmRbMF0gPSBzYXZlZmQoMCk7Ci0JCWUtPnNhdmVmZFsxXSA9IHNhdmVmZCgxKTsKLQotCQlvcGVucGlwZShwdik7Ci0JCWlmIChwdlswXSAhPSAwKSB7Ci0JCQlrc2hfZHVwMihwdlswXSwgMCwgZmFsc2UpOwotCQkJY2xvc2UocHZbMF0pOwotCQl9Ci0JCWNvcHJvYy53cml0ZSA9IHB2WzFdOwotCQljb3Byb2Muam9iID0gTlVMTDsKLQotCQlpZiAoY29wcm9jLnJlYWR3ID49IDApCi0JCQlrc2hfZHVwMihjb3Byb2MucmVhZHcsIDEsIGZhbHNlKTsKLQkJZWxzZSB7Ci0JCQlvcGVucGlwZShwdik7Ci0JCQljb3Byb2MucmVhZCA9IHB2WzBdOwotCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsKLQkJCWNvcHJvYy5yZWFkdyA9IHB2WzFdOwkgLyogY2xvc2VkIGJlZm9yZSBmaXJzdCByZWFkICovCi0JCQljb3Byb2MubmpvYnMgPSAwOwotCQkJLyogY3JlYXRlIG5ldyBjb3Byb2Nlc3MgaWQgKi8KLQkJCSsrY29wcm9jLmlkOwotCQl9Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQllLT50eXBlID0gRV9FWEVDOyAvKiBubyBtb3JlIG5lZWQgZm9yIGVycm9yIGhhbmRsZXIgKi8KLQotCQkvKiBleGNoaWxkKCkgY2xvc2VzIGNvcHJvYy4qIGluIGNoaWxkIGFmdGVyIGZvcmssCi0JCSAqIHdpbGwgYWxzbyBpbmNyZW1lbnQgY29wcm9jLm5qb2JzIHdoZW4gdGhlCi0JCSAqIGpvYiBpcyBhY3R1YWxseSBjcmVhdGVkLgotCQkgKi8KLQkJZmxhZ3MgJj0gflhFWEVDOwotCQlleGNoaWxkKHQtPmxlZnQsIGZsYWdzIHwgWEJHTkQgfCBYRk9SSyB8IFhDT1BST0MgfCBYQ0NMT1NFLAotCQkgICAgTlVMTCwgY29wcm9jLnJlYWR3KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBUQVNZTkM6Ci0JCS8qIFhYWCBub24tb3B0aW1hbCwgSSB0aGluayAtICIoZm9vICYpIiwgZm9ya3MgZm9yICgpLAotCQkgKiBmb3JrcyBhZ2FpbiBmb3IgYXN5bmMuLi4gcGFyZW50IHNob3VsZCBvcHRpbWlzZQotCQkgKiB0aGlzIHRvICJmb28gJiIuLi4KLQkJICovCi0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCAoZmxhZ3MmflhFWEVDKXxYQkdORHxYRk9SSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRPUjoKLQljYXNlIFRBTkQ6Ci0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBYRVJST0ssIHhlcnJvayk7Ci0JCWlmICgocnYgPT0gMCkgPT0gKHQtPnR5cGUgPT0gVEFORCkpCi0JCQlydiA9IGV4ZWN1dGUodC0+cmlnaHQsIFhFUlJPSywgeGVycm9rKTsKLQkJZmxhZ3MgfD0gWEVSUk9LOwotCQlpZiAoeGVycm9rKQotCQkJKnhlcnJvayA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBUQkFORzoKLQkJcnYgPSAhZXhlY3V0ZSh0LT5yaWdodCwgWEVSUk9LLCB4ZXJyb2spOwotCQlmbGFncyB8PSBYRVJST0s7Ci0JCWlmICh4ZXJyb2spCi0JCQkqeGVycm9rID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFREQlJBQ0tFVDogewotCQlUZXN0X2VudiB0ZTsKLQotCQl0ZS5mbGFncyA9IFRFRl9EQlJBQ0tFVDsKLQkJdGUucG9zLndwID0gdC0+YXJnczsKLQkJdGUuaXNhID0gZGJ0ZXN0ZV9pc2E7Ci0JCXRlLmdldG9wbmQgPSBkYnRlc3RlX2dldG9wbmQ7Ci0JCXRlLmV2YWwgPSB0ZXN0X2V2YWw7Ci0JCXRlLmVycm9yID0gZGJ0ZXN0ZV9lcnJvcjsKLQotCQlydiA9IHRlc3RfcGFyc2UoJnRlKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBURk9SOgotCWNhc2UgVFNFTEVDVDogewotCQl2b2xhdGlsZSBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLQkJYXAgPSAodC0+dmFycyA9PSBOVUxMKSA/IGUtPmxvYy0+YXJndiArIDEgOgotCQkgICAgKGNvbnN0IGNoYXIgKiopZXZhbCgoY29uc3QgY2hhciAqKil0LT52YXJzLAotCQkgICAgRE9CTEFOSyB8IERPR0xPQiB8IERPVElMREUpOwotCQllLT50eXBlID0gRV9MT09QOwotCQl3aGlsZSAoMSkgewotCQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQkJCWlmICghaSkKLQkJCQlicmVhazsKLQkJCWlmICgoZS0+ZmxhZ3MmRUZfQlJLQ09OVF9QQVNTKSB8fAotCQkJICAgIChpICE9IExCUkVBSyAmJiBpICE9IExDT05USU4pKSB7Ci0JCQkJcXVpdGVudihOVUxMKTsKLQkJCQl1bndpbmQoaSk7Ci0JCQl9IGVsc2UgaWYgKGkgPT0gTEJSRUFLKSB7Ci0JCQkJcnYgPSAwOwotCQkJCWdvdG8gQnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcnYgPSAwOyAvKiBpbiBjYXNlIG9mIGEgY29udGludWUgKi8KLQkJaWYgKHQtPnR5cGUgPT0gVEZPUikgewotCQkJd2hpbGUgKCphcCAhPSBOVUxMKSB7Ci0JCQkJc2V0c3RyKGdsb2JhbCh0LT5zdHIpLCAqYXArKywgS1NIX1VOV0lORF9FUlJPUik7Ci0JCQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOwotCQkJfQotCQl9IGVsc2UgeyAvKiBUU0VMRUNUICovCi0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKCEoY3AgPSBkb19zZWxlY3RhcmdzKGFwLCBpc19maXJzdCkpKSB7Ci0JCQkJCXJ2ID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlzX2ZpcnN0ID0gZmFsc2U7Ci0JCQkJc2V0c3RyKGdsb2JhbCh0LT5zdHIpLCBjcCwgS1NIX1VOV0lORF9FUlJPUik7Ci0JCQkJZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFRXSElMRToKLQljYXNlIFRVTlRJTDoKLQkJZS0+dHlwZSA9IEVfTE9PUDsKLQkJd2hpbGUgKDEpIHsKLQkJCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JCQlpZiAoIWkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoKGUtPmZsYWdzJkVGX0JSS0NPTlRfUEFTUykgfHwKLQkJCSAgICAoaSAhPSBMQlJFQUsgJiYgaSAhPSBMQ09OVElOKSkgewotCQkJCXF1aXRlbnYoTlVMTCk7Ci0JCQkJdW53aW5kKGkpOwotCQkJfSBlbHNlIGlmIChpID09IExCUkVBSykgewotCQkJCXJ2ID0gMDsKLQkJCQlnb3RvIEJyZWFrOwotCQkJfQotCQl9Ci0JCXJ2ID0gMDsgLyogaW4gY2FzZSBvZiBhIGNvbnRpbnVlICovCi0JCXdoaWxlICgoZXhlY3V0ZSh0LT5sZWZ0LCBYRVJST0ssIE5VTEwpID09IDApID09Ci0JCSAgICAodC0+dHlwZSA9PSBUV0hJTEUpKQotCQkJcnYgPSBleGVjdXRlKHQtPnJpZ2h0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRJRjoKLQljYXNlIFRFTElGOgotCQlpZiAodC0+cmlnaHQgPT0gTlVMTCkKLQkJCWJyZWFrOwkvKiBzaG91bGQgYmUgZXJyb3IgKi8KLQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgTlVMTCkgPT0gMCA/Ci0JCSAgICBleGVjdXRlKHQtPnJpZ2h0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKSA6Ci0JCSAgICBleGVjdXRlKHQtPnJpZ2h0LT5yaWdodCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUQ0FTRToKLQkJY3AgPSBldmFsc3RyKHQtPnN0ciwgRE9USUxERSk7Ci0JCWZvciAodCA9IHQtPmxlZnQ7IHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRQQVQ7IHQgPSB0LT5yaWdodCkKLQkJICAgIGZvciAoYXAgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqYXA7IGFwKyspCi0JCQlpZiAoKHMgPSBldmFsc3RyKCphcCwgRE9USUxERXxET1BBVCkpICYmCi0JCQkgICAgZ21hdGNoeChjcCwgcywgZmFsc2UpKQotCQkJCWdvdG8gRm91bmQ7Ci0JCWJyZWFrOwotIEZvdW5kOgotCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUQlJBQ0U6Ci0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRGVU5DVDoKLQkJcnYgPSBkZWZpbmUodC0+c3RyLCB0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRUSU1FOgotCQkvKiBDbGVhciBYRVhFQyBzbyBuZXN0ZWQgZXhlY3V0ZSgpIGNhbGwgZG9lc24ndCBleGl0Ci0JCSAqIChhbGxvd3MgImxzIC1sIHwgdGltZSBncmVwIGZvbyIpLgotCQkgKi8KLQkJcnYgPSB0aW1leCh0LCBmbGFncyAmIH5YRVhFQywgeGVycm9rKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRFWEVDOgkJLyogYW4gZXZhbCdkIFRDT00gKi8KLQkJcyA9IHQtPmFyZ3NbMF07Ci0JCXVwID0gbWFrZW52KCk7Ci0JCXJlc3RvcmVzaWdzKCk7Ci0JCWNsZWFudXBfcHJvY19lbnYoKTsKLQkJewotCQkJdW5pb24gbWtzaF9jY3BoYWNrIGNhcmdzOwotCi0JCQljYXJncy5ybyA9IHQtPmFyZ3M7Ci0JCQlleGVjdmUodC0+c3RyLCBjYXJncy5ydywgdXApOwotCQkJcnYgPSBlcnJubzsKLQkJfQotCQlpZiAocnYgPT0gRU5PRVhFQykKLQkJCXNjcmlwdGV4ZWModCwgKGNvbnN0IGNoYXIgKiopdXApOwotCQllbHNlCi0JCQllcnJvcmYoIiVzOiAlcyIsIHMsIHN0cmVycm9yKHJ2KSk7Ci0JfQotIEJyZWFrOgotCWV4c3RhdCA9IHJ2OwotCi0JcXVpdGVudihOVUxMKTsJCS8qIHJlc3RvcmVzIElPICovCi0JaWYgKChmbGFncyZYRVhFQykpCi0JCXVud2luZChMRVhJVCk7CS8qIGV4aXQgY2hpbGQgKi8KLQlpZiAocnYgIT0gMCAmJiAhKGZsYWdzICYgWEVSUk9LKSAmJgotCSAgICAoeGVycm9rID09IE5VTEwgfHwgISp4ZXJyb2spKSB7Ci0JCXRyYXBzaWcoU0lHRVJSXyk7Ci0JCWlmIChGbGFnKEZFUlJFWElUKSkKLQkJCXVud2luZChMRVJST1IpOwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyoKLSAqIGV4ZWN1dGUgc2ltcGxlIGNvbW1hbmQKLSAqLwotCi1zdGF0aWMgaW50Ci1jb21leGVjKHN0cnVjdCBvcCAqdCwgc3RydWN0IHRibCAqdm9sYXRpbGUgdHAsIGNvbnN0IGNoYXIgKiphcCwKLSAgICB2b2xhdGlsZSBpbnQgZmxhZ3MsIHZvbGF0aWxlIGludCAqeGVycm9rKQotewotCWludCBpOwotCXZvbGF0aWxlIGludCBydiA9IDA7Ci0JY29uc3QgY2hhciAqY3A7Ci0JY29uc3QgY2hhciAqKmxhc3RwOwotCXN0YXRpYyBzdHJ1Y3Qgb3AgdGV4ZWM7IC8qIE11c3QgYmUgc3RhdGljIChYWFggYnV0IHdoeT8pICovCi0JaW50IHR5cGVfZmxhZ3M7Ci0JaW50IGtlZXBhc25fb2s7Ci0JaW50IGZjZmxhZ3MgPSBGQ19CSXxGQ19GVU5DfEZDX1BBVEg7Ci0JYm9vbCBib3VybmVfZnVuY3Rpb25fY2FsbCA9IGZhbHNlOwotCXN0cnVjdCBibG9jayAqbF9leHBhbmQsICpsX2Fzc2lnbjsKLQotCS8qIHNuYWcgdGhlIGxhc3QgYXJndW1lbnQgZm9yICRfIFhYWCBub3QgdGhlIHNhbWUgYXMgQVQmVCBrc2gsCi0JICogd2hpY2ggb25seSBzZWVtcyB0byBzZXQgJF8gYWZ0ZXIgYSBuZXdsaW5lIChidXQgbm90IGluCi0JICogZnVuY3Rpb25zL2RvdCBzY3JpcHRzLCBidXQgaW4gaW50ZXJhY3RpdmUgYW5kIHNjcmlwdCkgLQotCSAqIHBlcmhhcHMgc2F2ZSBsYXN0IGFyZyBoZXJlIGFuZCBzZXQgaXQgaW4gc2hlbGwoKT8uCi0JICovCi0JaWYgKEZsYWcoRlRBTEtJTkcpICYmICoobGFzdHAgPSBhcCkpIHsKLQkJd2hpbGUgKCorK2xhc3RwKQotCQkJOwotCQkvKiBzZXRzdHIoKSBjYW4ndCBmYWlsIGhlcmUgKi8KLQkJc2V0c3RyKHR5cGVzZXQoIl8iLCBMT0NBTCwgMCwgSU5URUdFUiwgMCksICotLWxhc3RwLAotCQkgICAgS1NIX1JFVFVSTl9FUlJPUik7Ci0JfQotCi0JLyogRGVhbCB3aXRoIHRoZSBzaGVsbCBidWlsdGlucyBidWlsdGluLCBleGVjIGFuZCBjb21tYW5kIHNpbmNlCi0JICogdGhleSBjYW4gYmUgZm9sbG93ZWQgYnkgb3RoZXIgY29tbWFuZHMuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQotCSAqIHdlIGtub3cgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIGxvY2FsIGJsb2NrIHdoaWNoIG11c3QgYmUgZG9uZQotCSAqIGJlZm9yZSB3ZSBjYW4gZG8gYSBwYXRoIHNlYXJjaCAoaW4gY2FzZSB0aGUgYXNzaWdubWVudHMgY2hhbmdlCi0JICogUEFUSCkuCi0JICogT2RkIGNhc2VzOgotCSAqCUZPTz1iYXIgZXhlYyA+L2Rldi9udWxsCQlGT08gaXMga2VwdCBidXQgbm90IGV4cG9ydGVkCi0JICoJRk9PPWJhciBleGVjIGZvb2JhcgkJRk9PIGlzIGV4cG9ydGVkCi0JICoJRk9PPWJhciBjb21tYW5kIGV4ZWMgPi9kZXYvbnVsbAlGT08gaXMgbmVpdGhlciBrZXB0IG5vciBleHBvcnRlZAotCSAqCUZPTz1iYXIgY29tbWFuZAkJCUZPTyBpcyBuZWl0aGVyIGtlcHQgbm9yIGV4cG9ydGVkCi0JICoJUEFUSD0uLi4gZm9vYmFyCQkJdXNlIG5ldyBQQVRIIGluIGZvb2JhciBzZWFyY2gKLQkgKi8KLQlrZWVwYXNuX29rID0gMTsKLQl3aGlsZSAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMKSB7Ci0JCWZjZmxhZ3MgPSBGQ19CSXxGQ19GVU5DfEZDX1BBVEg7LyogdW5kbyBlZmZlY3RzIG9mIGNvbW1hbmQgKi8KLQkJaWYgKHRwLT52YWwuZiA9PSBjX2J1aWx0aW4pIHsKLQkJCWlmICgoY3AgPSAqKythcCkgPT0gTlVMTCkgewotCQkJCXRwID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRwID0gZmluZGNvbShjcCwgRkNfQkkpOwotCQkJaWYgKHRwID09IE5VTEwpCi0JCQkJZXJyb3JmKCJidWlsdGluOiAlczogbm90IGEgYnVpbHRpbiIsIGNwKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHRwLT52YWwuZiA9PSBjX2V4ZWMpIHsKLQkJCWlmIChhcFsxXSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJYXArKzsKLQkJCWZsYWdzIHw9IFhFWEVDOwotCQl9IGVsc2UgaWYgKHRwLT52YWwuZiA9PSBjX2NvbW1hbmQpIHsKLQkJCWludCBvcHRjLCBzYXdfcCA9IDA7Ci0KLQkJCS8qIFVnbHkgZGVhbGluZyB3aXRoIG9wdGlvbnMgaW4gdHdvIHBsYWNlcyAoaGVyZSBhbmQKLQkJCSAqIGluIGNfY29tbWFuZCgpLCBidXQgc3VjaCBpcyBsaWZlKQotCQkJICovCi0JCQlrc2hfZ2V0b3B0X3Jlc2V0KCZidWlsdGluX29wdCwgMCk7Ci0JCQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KGFwLCAmYnVpbHRpbl9vcHQsICI6cCIpKSA9PSAncCcpCi0JCQkJc2F3X3AgPSAxOwotCQkJaWYgKG9wdGMgIT0gRU9GKQotCQkJCWJyZWFrOwkvKiBjb21tYW5kIC12ViBvciBzb21ldGhpbmcgKi8KLQkJCS8qIGRvbid0IGxvb2sgZm9yIGZ1bmN0aW9ucyAqLwotCQkJZmNmbGFncyA9IEZDX0JJfEZDX1BBVEg7Ci0JCQlpZiAoc2F3X3ApIHsKLQkJCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkpIHsKLQkJCQkJd2FybmluZ2YodHJ1ZSwKLQkJCQkJICAgICJjb21tYW5kIC1wOiByZXN0cmljdGVkIik7Ci0JCQkJCXJ2ID0gMTsKLQkJCQkJZ290byBMZWF2ZTsKLQkJCQl9Ci0JCQkJZmNmbGFncyB8PSBGQ19ERUZQQVRIOwotCQkJfQotCQkJYXAgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCQkJLyogUE9TSVggc2F5cyBzcGVjaWFsIGJ1aWx0aW5zIGxvc2UgdGhlaXIgc3RhdHVzCi0JCQkgKiBpZiBhY2Nlc3NlZCB1c2luZyBjb21tYW5kLgotCQkJICovCi0JCQlrZWVwYXNuX29rID0gMDsKLQkJCWlmICghYXBbMF0pIHsKLQkJCQkvKiBlbnN1cmUgY29tbWFuZCB3aXRoIG5vIGFyZ3MgZXhpdHMgd2l0aCAwICovCi0JCQkJc3Vic3RfZXhzdGF0ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlCi0JCQlicmVhazsKLQkJdHAgPSBmaW5kY29tKGFwWzBdLCBmY2ZsYWdzICYgKEZDX0JJfEZDX0ZVTkMpKTsKLQl9Ci0JbF9leHBhbmQgPSBlLT5sb2M7Ci0JaWYgKGtlZXBhc25fb2sgJiYgKCFhcFswXSB8fCAodHAgJiYgKHRwLT5mbGFnICYgS0VFUEFTTikpKSkKLQkJdHlwZV9mbGFncyA9IDA7Ci0JZWxzZSB7Ci0JCS8qIGNyZWF0ZSBuZXcgdmFyaWFibGUvZnVuY3Rpb24gYmxvY2sgKi8KLQkJbmV3YmxvY2soKTsKLQkJLyoga3NoIGZ1bmN0aW9ucyBkb24ndCBrZWVwIGFzc2lnbm1lbnRzLCBQT1NJWCBmdW5jdGlvbnMgZG8uICovCi0JCWlmIChrZWVwYXNuX29rICYmIHRwICYmIHRwLT50eXBlID09IENGVU5DICYmCi0JCSAgICAhKHRwLT5mbGFnICYgRktTSCkpIHsKLQkJCWJvdXJuZV9mdW5jdGlvbl9jYWxsID0gdHJ1ZTsKLQkJCXR5cGVfZmxhZ3MgPSBFWFBPUlQ7Ci0JCX0gZWxzZQotCQkJdHlwZV9mbGFncyA9IExPQ0FMfExPQ0FMX0NPUFl8RVhQT1JUOwotCX0KLQlsX2Fzc2lnbiA9IGUtPmxvYzsKLQlpZiAoRmxhZyhGRVhQT1JUKSkKLQkJdHlwZV9mbGFncyB8PSBFWFBPUlQ7Ci0JZm9yIChpID0gMDsgdC0+dmFyc1tpXTsgaSsrKSB7Ci0JCS8qIGRvIE5PVCBsb29rdXAgaW4gdGhlIG5ldyB2YXIvZm4gYmxvY2sganVzdCBjcmVhdGVkICovCi0JCWUtPmxvYyA9IGxfZXhwYW5kOwotCQljcCA9IGV2YWxzdHIodC0+dmFyc1tpXSwgRE9BU05USUxERSk7Ci0JCWUtPmxvYyA9IGxfYXNzaWduOwotCQkvKiBidXQgYXNzaWduIGluIHRoZXJlIGFzIHVzdWFsICovCi0KLQkJaWYgKEZsYWcoRlhUUkFDRSkpIHsKLQkJCWlmIChpID09IDApCi0JCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzIiwKLQkJCQkJc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSk7Ci0JCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMlYyIsIGNwLAotCQkJICAgIHQtPnZhcnNbaSArIDFdID8gJyAnIDogJ1xuJyk7Ci0JCQlpZiAoIXQtPnZhcnNbaSArIDFdKQotCQkJCXNoZl9mbHVzaChzaGxfb3V0KTsKLQkJfQotCQl0eXBlc2V0KGNwLCB0eXBlX2ZsYWdzLCAwLCAwLCAwKTsKLQkJaWYgKGJvdXJuZV9mdW5jdGlvbl9jYWxsICYmICEodHlwZV9mbGFncyAmIEVYUE9SVCkpCi0JCQl0eXBlc2V0KGNwLCBMT0NBTHxMT0NBTF9DT1BZfEVYUE9SVCwgMCwgMCwgMCk7Ci0JfQotCi0JaWYgKChjcCA9ICphcCkgPT0gTlVMTCkgewotCQlydiA9IHN1YnN0X2V4c3RhdDsKLQkJZ290byBMZWF2ZTsKLQl9IGVsc2UgaWYgKCF0cCkgewotCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgdnN0cmNocihjcCwgJy8nKSkgewotCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiByZXN0cmljdGVkIiwgY3ApOwotCQkJcnYgPSAxOwotCQkJZ290byBMZWF2ZTsKLQkJfQotCQl0cCA9IGZpbmRjb20oY3AsIGZjZmxhZ3MpOwotCX0KLQotCXN3aXRjaCAodHAtPnR5cGUpIHsKLQljYXNlIENTSEVMTDoJCQkvKiBzaGVsbCBidWlsdC1pbiAqLwotCQlydiA9IGNhbGxfYnVpbHRpbih0cCwgKGNvbnN0IGNoYXIgKiopYXApOwotCQlicmVhazsKLQotCWNhc2UgQ0ZVTkM6IHsJCQkvKiBmdW5jdGlvbiBjYWxsICovCi0JCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgb2xkX3hmbGFnOwotCQl2b2xhdGlsZSBUZmxhZyBvbGRfaW51c2U7Ci0JCWNvbnN0IGNoYXIgKnZvbGF0aWxlIG9sZF9rc2huYW1lOwotCi0JCWlmICghKHRwLT5mbGFnICYgSVNTRVQpKSB7Ci0JCQlzdHJ1Y3QgdGJsICpmdHA7Ci0KLQkJCWlmICghdHAtPnUuZnBhdGgpIHsKLQkJCQlpZiAodHAtPnUyLmVycm5vXykgewotCQkJCQl3YXJuaW5nZih0cnVlLAotCQkJCQkgICAgIiVzOiBjYW4ndCBmaW5kIGZ1bmN0aW9uICIKLQkJCQkJICAgICJkZWZpbml0aW9uIGZpbGUgLSAlcyIsCi0JCQkJCSAgICBjcCwgc3RyZXJyb3IodHAtPnUyLmVycm5vXykpOwotCQkJCQlydiA9IDEyNjsKLQkJCQl9IGVsc2UgewotCQkJCQl3YXJuaW5nZih0cnVlLAotCQkJCQkgICAgIiVzOiBjYW4ndCBmaW5kIGZ1bmN0aW9uICIKLQkJCQkJICAgICJkZWZpbml0aW9uIGZpbGUiLCBjcCk7Ci0JCQkJCXJ2ID0gMTI3OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpbmNsdWRlKHRwLT51LmZwYXRoLCAwLCBOVUxMLCAwKSA8IDApIHsKLQkJCQlydiA9IGVycm5vOwotCQkJCXdhcm5pbmdmKHRydWUsCi0JCQkJICAgICIlczogY2FuJ3Qgb3BlbiBmdW5jdGlvbiBkZWZpbml0aW9uIGZpbGUgJXMgLSAlcyIsCi0JCQkJICAgIGNwLCB0cC0+dS5mcGF0aCwgc3RyZXJyb3IocnYpKTsKLQkJCQlydiA9IDEyNzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghKGZ0cCA9IGZpbmRmdW5jKGNwLCBoYXNoKGNwKSwgZmFsc2UpKSB8fAotCQkJICAgICEoZnRwLT5mbGFnICYgSVNTRVQpKSB7Ci0JCQkJd2FybmluZ2YodHJ1ZSwKLQkJCQkgICAgIiVzOiBmdW5jdGlvbiBub3QgZGVmaW5lZCBieSAlcyIsCi0JCQkJICAgIGNwLCB0cC0+dS5mcGF0aCk7Ci0JCQkJcnYgPSAxMjc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0cCA9IGZ0cDsKLQkJfQotCi0JCS8qIGtzaCBmdW5jdGlvbnMgc2V0ICQwIHRvIGZ1bmN0aW9uIG5hbWUsIFBPU0lYIGZ1bmN0aW9ucyBsZWF2ZQotCQkgKiAkMCB1bmNoYW5nZWQuCi0JCSAqLwotCQlvbGRfa3NobmFtZSA9IGtzaG5hbWU7Ci0JCWlmICh0cC0+ZmxhZyAmIEZLU0gpCi0JCQlrc2huYW1lID0gYXBbMF07Ci0JCWVsc2UKLQkJCWFwWzBdID0ga3NobmFtZTsKLQkJZS0+bG9jLT5hcmd2ID0gYXA7Ci0JCWZvciAoaSA9IDA7ICphcCsrICE9IE5VTEw7IGkrKykKLQkJCTsKLQkJZS0+bG9jLT5hcmdjID0gaSAtIDE7Ci0JCS8qIGtzaC1zdHlsZSBmdW5jdGlvbnMgaGFuZGxlIGdldG9wdHMgc2FuZWx5LAotCQkgKiBCb3VybmUvUE9TSVggZnVuY3Rpb25zIGFyZSBpbnNhbmUuLi4KLQkJICovCi0JCWlmICh0cC0+ZmxhZyAmIEZLU0gpIHsKLQkJCWUtPmxvYy0+ZmxhZ3MgfD0gQkZfRE9HRVRPUFRTOwotCQkJZS0+bG9jLT5nZXRvcHRzX3N0YXRlID0gdXNlcl9vcHQ7Ci0JCQlnZXRvcHRzX3Jlc2V0KDEpOwotCQl9Ci0KLQkJb2xkX3hmbGFnID0gRmxhZyhGWFRSQUNFKTsKLQkJRmxhZyhGWFRSQUNFKSA9IHRwLT5mbGFnICYgVFJBQ0UgPyAxIDogMDsKLQotCQlvbGRfaW51c2UgPSB0cC0+ZmxhZyAmIEZJTlVTRTsKLQkJdHAtPmZsYWcgfD0gRklOVVNFOwotCi0JCWUtPnR5cGUgPSBFX0ZVTkM7Ci0JCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JCWlmIChpID09IDApIHsKLQkJCS8qIHNlZW1zIG9kZCB0byBwYXNzIFhFUlJPSyBoZXJlLCBidXQgQVQmVCBrc2ggZG9lcyAqLwotCQkJZXhzdGF0ID0gZXhlY3V0ZSh0cC0+dmFsLnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOwotCQkJaSA9IExSRVRVUk47Ci0JCX0KLQkJa3NobmFtZSA9IG9sZF9rc2huYW1lOwotCQlGbGFnKEZYVFJBQ0UpID0gb2xkX3hmbGFnOwotCQl0cC0+ZmxhZyA9ICh0cC0+ZmxhZyAmIH5GSU5VU0UpIHwgb2xkX2ludXNlOwotCQkvKiBXZXJlIHdlIGRlbGV0ZWQgd2hpbGUgZXhlY3V0aW5nPyBJZiBzbywgZnJlZSB0aGUgZXhlY3V0aW9uCi0JCSAqIHRyZWUuIHRvZG86IFVuZm9ydHVuYXRlbHksIHRoZSB0YWJsZSBlbnRyeSBpcyBuZXZlciByZS11c2VkCi0JCSAqIHVudGlsIHRoZSBsb29rdXAgdGFibGUgaXMgZXhwYW5kZWQuCi0JCSAqLwotCQlpZiAoKHRwLT5mbGFnICYgKEZERUxFVEV8RklOVVNFKSkgPT0gRkRFTEVURSkgewotCQkJaWYgKHRwLT5mbGFnICYgQUxMT0MpIHsKLQkJCQl0cC0+ZmxhZyAmPSB+QUxMT0M7Ci0JCQkJdGZyZWUodHAtPnZhbC50LCB0cC0+YXJlYXApOwotCQkJfQotCQkJdHAtPmZsYWcgPSAwOwotCQl9Ci0JCXN3aXRjaCAoaSkgewotCQljYXNlIExSRVRVUk46Ci0JCWNhc2UgTEVSUk9SOgotCQkJcnYgPSBleHN0YXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBMSU5UUjoKLQkJY2FzZSBMRVhJVDoKLQkJY2FzZSBMTEVBVkU6Ci0JCWNhc2UgTFNIRUxMOgotCQkJcXVpdGVudihOVUxMKTsKLQkJCXVud2luZChpKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJZGVmYXVsdDoKLQkJCXF1aXRlbnYoTlVMTCk7Ci0JCQlpbnRlcm5hbF9lcnJvcmYoIkNGVU5DICVkIiwgaSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBDRVhFQzoJCS8qIGV4ZWN1dGFibGUgY29tbWFuZCAqLwotCWNhc2UgQ1RBTElBUzoJCS8qIHRyYWNrZWQgYWxpYXMgKi8KLQkJaWYgKCEodHAtPmZsYWcmSVNTRVQpKSB7Ci0JCQkvKiBlcnJub18gd2lsbCBiZSBzZXQgaWYgdGhlIG5hbWVkIGNvbW1hbmQgd2FzIGZvdW5kCi0JCQkgKiBidXQgY291bGQgbm90IGJlIGV4ZWN1dGVkIChwZXJtaXNzaW9ucywgbm8gZXhlY3V0ZQotCQkJICogYml0LCBkaXJlY3RvcnksIGV0YykuIFByaW50IG91dCBhIChob3BlZnVsbHkpCi0JCQkgKiB1c2VmdWwgZXJyb3IgbWVzc2FnZSBhbmQgc2V0IHRoZSBleGl0IHN0YXR1cyB0byAxMjYuCi0JCQkgKi8KLQkJCWlmICh0cC0+dTIuZXJybm9fKSB7Ci0JCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBjYW5ub3QgZXhlY3V0ZSAtICVzIiwgY3AsCi0JCQkJICAgIHN0cmVycm9yKHRwLT51Mi5lcnJub18pKTsKLQkJCQlydiA9IDEyNjsJLyogUE9TSVggKi8KLQkJCX0gZWxzZSB7Ci0JCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBub3QgZm91bmQiLCBjcCk7Ci0JCQkJcnYgPSAxMjc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHNldCAkXyB0byBwcm9ncmFtbWUncyBmdWxsIHBhdGggKi8KLQkJLyogc2V0c3RyKCkgY2FuJ3QgZmFpbCBoZXJlICovCi0JCXNldHN0cih0eXBlc2V0KCJfIiwgTE9DQUx8RVhQT1JULCAwLCBJTlRFR0VSLCAwKSwKLQkJICAgIHRwLT52YWwucywgS1NIX1JFVFVSTl9FUlJPUik7Ci0KLQkJaWYgKGZsYWdzJlhFWEVDKSB7Ci0JCQlqX2V4aXQoKTsKLQkJCWlmICghKGZsYWdzJlhCR05EKQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJCSAgICB8fCBGbGFnKEZNT05JVE9SKQotI2VuZGlmCi0JCQkgICAgKSB7Ci0JCQkJc2V0ZXhlY3NpZygmc2lndHJhcHNbU0lHSU5UXSwgU1NfUkVTVE9SRV9PUklHKTsKLQkJCQlzZXRleGVjc2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgU1NfUkVTVE9SRV9PUklHKTsKLQkJCX0KLQkJfQotCi0JCS8qIHRvIGZvcmsgd2Ugc2V0IHVwIGEgVEVYRUMgbm9kZSBhbmQgY2FsbCBleGVjdXRlICovCi0JCXRleGVjLnR5cGUgPSBURVhFQzsKLQkJdGV4ZWMubGVmdCA9IHQ7CS8qIGZvciB0cHJpbnQgKi8KLQkJdGV4ZWMuc3RyID0gdHAtPnZhbC5zOwotCQl0ZXhlYy5hcmdzID0gYXA7Ci0JCXJ2ID0gZXhjaGlsZCgmdGV4ZWMsIGZsYWdzLCB4ZXJyb2ssIC0xKTsKLQkJYnJlYWs7Ci0JfQotIExlYXZlOgotCWlmIChmbGFncyAmIFhFWEVDKSB7Ci0JCWV4c3RhdCA9IHJ2OwotCQl1bndpbmQoTExFQVZFKTsKLQl9Ci0JcmV0dXJuIChydik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zY3JpcHRleGVjKHN0cnVjdCBvcCAqdHAsIGNvbnN0IGNoYXIgKiphcCkKLXsKLQljb25zdCBjaGFyICpzaDsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCXVuc2lnbmVkIGNoYXIgKmNwOwotCWNoYXIgYnVmWzY0XTsJCS8qIDY0ID09IE1BWElOVEVSUCBpbiBNaXJCU0QgPHN5cy9wYXJhbS5oPiAqLwotCWludCBmZDsKLSNlbmRpZgotCXVuaW9uIG1rc2hfY2NwaGFjayBhcmdzLCBjYXA7Ci0KLQlzaCA9IHN0cl92YWwoZ2xvYmFsKCJFWEVDU0hFTEwiKSk7Ci0JaWYgKHNoICYmICpzaCkKLQkJc2ggPSBzZWFyY2goc2gsIHBhdGgsIFhfT0ssIE5VTEwpOwotCWlmICghc2ggfHwgISpzaCkKLQkJc2ggPSBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMOwotCi0JKnRwLT5hcmdzLS0gPSB0cC0+c3RyOwotCi0jaWZuZGVmIE1LU0hfU01BTEwKLQlpZiAoKGZkID0gb3Blbih0cC0+c3RyLCBPX1JET05MWSkpID49IDApIHsKLQkJLyogcmVhZCBmaXJzdCBNQVhJTlRFUlAgb2N0ZXRzIGZyb20gZmlsZSAqLwotCQlpZiAocmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkgPD0gMCkKLQkJCS8qIHJlYWQgZXJyb3IgLT4gbm8gZ29vZCAqLwotCQkJYnVmWzBdID0gJ1wwJzsKLQkJY2xvc2UoZmQpOwotCQkvKiBzY2FuIGZvciBuZXdsaW5lIChvciBDUikgb3IgTlVMIF9iZWZvcmVfIGVuZCBvZiBidWZmZXIgKi8KLQkJY3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKLQkJd2hpbGUgKChjaGFyICopY3AgPCAoYnVmICsgc2l6ZW9mKGJ1ZikpKQotCQkJaWYgKCpjcCA9PSAnXDAnIHx8ICpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSB7Ci0JCQkJKmNwID0gJ1wwJzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZQotCQkJCSsrY3A7Ci0JCS8qIGlmIHRoZSBzaGViYW5nIGxpbmUgaXMgbG9uZ2VyIHRoYW4gTUFYSU5URVJQLCBiYWlsIG91dCAqLwotCQlpZiAoKGNoYXIgKiljcCA+PSAoYnVmICsgc2l6ZW9mKGJ1ZikpKQotCQkJZ290byBub3NoZWJhbmc7Ci0JCS8qIHNraXAgVVRGLTggQnl0ZSBPcmRlciBNYXJrLCBpZiBwcmVzZW50ICovCi0JCWNwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7Ci0JCWlmICgoY3BbMF0gPT0gMHhFRikgJiYgKGNwWzFdID09IDB4QkIpICYmIChjcFsyXSA9PSAweEJGKSkKLQkJCWNwICs9IDM7Ci0JCS8qIGJhaWwgb3V0IGlmIHJlYWQgZXJyb3IgKGFib3ZlKSBvciBubyBzaGViYW5nICovCi0JCWlmICgoY3BbMF0gIT0gJyMnKSB8fCAoY3BbMV0gIT0gJyEnKSkKLQkJCWdvdG8gbm9zaGViYW5nOwotCQljcCArPSAyOwotCQkvKiBza2lwIHdoaXRlc3BhY2UgYmVmb3JlIHNoZWxsIG5hbWUgKi8KLQkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCi0JCQkrK2NwOwotCQkvKiBqdXN0IHdoaXRlc3BhY2Ugb24gdGhlIGxpbmU/ICovCi0JCWlmICgqY3AgPT0gJ1wwJykKLQkJCWdvdG8gbm9zaGViYW5nOwotCQkvKiBubywgd2UgYWN0dWFsbHkgZm91bmQgYW4gaW50ZXJwcmV0ZXIgbmFtZSAqLwotCQlzaCA9IChjaGFyICopY3A7Ci0JCS8qIGxvb2sgZm9yIGVuZCBvZiBzaGVsbC9pbnRlcnByZXRlciBuYW1lICovCi0JCXdoaWxlICgqY3AgIT0gJyAnICYmICpjcCAhPSAnXHQnICYmICpjcCAhPSAnXDAnKQotCQkJKytjcDsKLQkJLyogYW55IGFyZ3VtZW50cz8gKi8KLQkJaWYgKCpjcCkgewotCQkJKmNwKysgPSAnXDAnOwotCQkJLyogc2tpcCBzcGFjZXMgYmVmb3JlIGFyZ3VtZW50cyAqLwotCQkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCi0JCQkJKytjcDsKLQkJCS8qIHBhc3MgaXQgYWxsIGluIE9ORSBhcmd1bWVudCAoaGlzdG9yaWMgcmVhc29ucykgKi8KLQkJCWlmICgqY3ApCi0JCQkJKnRwLT5hcmdzLS0gPSAoY2hhciAqKWNwOwotCQl9Ci0gbm9zaGViYW5nOgotCQlmZCA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCQlpZiAoKGZkID09IC8qIE9NQUdJQyAqLyAwNDA3KSB8fAotCQkgICAgKGZkID09IC8qIE5NQUdJQyAqLyAwNDEwKSB8fAotCQkgICAgKGZkID09IC8qIFpNQUdJQyAqLyAwNDEzKSB8fAotCQkgICAgKGZkID09IC8qIFFNQUdJQyAqLyAwMzE0KSB8fAotCQkgICAgKGZkID09IC8qIEVDT0ZGX0kzODYgKi8gMHg0QzAxKSB8fAotCQkgICAgKGZkID09IC8qIEVDT0ZGX002OEsgKi8gMHgwMTUwIHx8IGZkID09IDB4NTAwMSkgfHwKLQkJICAgIChmZCA9PSAvKiBFQ09GRl9TSCAqLyAgIDB4MDUwMCB8fCBmZCA9PSAweDAwMDUpIHx8Ci0JCSAgICAoZmQgPT0gMHg3RjQ1ICYmIGJ1ZlsyXSA9PSAnTCcgJiYgYnVmWzNdID09ICdGJykgfHwKLQkJICAgIChmZCA9PSAvKiAiTVoiICovIDB4NEQ1QSkgfHwKLQkJICAgIChmZCA9PSAvKiBnemlwICovIDB4MUY4QikpCi0JCQllcnJvcmYoIiVzOiBub3QgZXhlY3V0YWJsZTogbWFnaWMgJTA0WCIsIHRwLT5zdHIsIGZkKTsKLQl9Ci0jZW5kaWYKLQlhcmdzLnJvID0gdHAtPmFyZ3M7Ci0JKmFyZ3Mucm8gPSBzaDsKLQotCWNhcC5ybyA9IGFwOwotCWV4ZWN2ZShhcmdzLnJ3WzBdLCBhcmdzLnJ3LCBjYXAucncpOwotCi0JLyogcmVwb3J0IGJvdGggdGhlIHByb2dyYW1tZSB0aGF0IHdhcyBydW4gYW5kIHRoZSBib2d1cyBpbnRlcnByZXRlciAqLwotCWVycm9yZigiJXM6ICVzOiAlcyIsIHRwLT5zdHIsIHNoLCBzdHJlcnJvcihlcnJubykpOwotfQotCi1pbnQKLXNoY29tZXhlYyhjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0KLQl0cCA9IGt0c2VhcmNoKCZidWlsdGlucywgKndwLCBoYXNoKCp3cCkpOwotCWlmICh0cCA9PSBOVUxMKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoY29tZXhlYzogJXMiLCAqd3ApOwotCXJldHVybiAoY2FsbF9idWlsdGluKHRwLCB3cCkpOwotfQotCi0vKgotICogU2VhcmNoIGZ1bmN0aW9uIHRhYmxlcyBmb3IgYSBmdW5jdGlvbi4gSWYgY3JlYXRlIHNldCwgYSB0YWJsZSBlbnRyeQotICogaXMgY3JlYXRlZCBpZiBub25lIGlzIGZvdW5kLgotICovCi1zdHJ1Y3QgdGJsICoKLWZpbmRmdW5jKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGgsIGJvb2wgY3JlYXRlKQotewotCXN0cnVjdCBibG9jayAqbDsKLQlzdHJ1Y3QgdGJsICp0cCA9IE5VTEw7Ci0KLQlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KSB7Ci0JCXRwID0ga3RzZWFyY2goJmwtPmZ1bnMsIG5hbWUsIGgpOwotCQlpZiAodHApCi0JCQlicmVhazsKLQkJaWYgKCFsLT5uZXh0ICYmIGNyZWF0ZSkgewotCQkJdHAgPSBrdGVudGVyKCZsLT5mdW5zLCBuYW1lLCBoKTsKLQkJCXRwLT5mbGFnID0gREVGSU5FRDsKLQkJCXRwLT50eXBlID0gQ0ZVTkM7Ci0JCQl0cC0+dmFsLnQgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuICh0cCk7Ci19Ci0KLS8qCi0gKiBkZWZpbmUgZnVuY3Rpb24uIFJldHVybnMgMSBpZiBmdW5jdGlvbiBpcyBiZWluZyB1bmRlZmluZWQgKHQgPT0gMCkgYW5kCi0gKiBmdW5jdGlvbiBkaWQgbm90IGV4aXN0LCByZXR1cm5zIDAgb3RoZXJ3aXNlLgotICovCi1pbnQKLWRlZmluZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb3AgKnQpCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0JYm9vbCB3YXNfc2V0ID0gZmFsc2U7Ci0KLQl3aGlsZSAoMSkgewotCQl0cCA9IGZpbmRmdW5jKG5hbWUsIGhhc2gobmFtZSksIHRydWUpOwotCi0JCWlmICh0cC0+ZmxhZyAmIElTU0VUKQotCQkJd2FzX3NldCA9IHRydWU7Ci0JCS8qIElmIHRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkLCB3ZSB6YXAgdGhpcwotCQkgKiB0YWJsZSBlbnRyeSBzbyBmaW5kZnVuYygpIHdvbid0IHNlZSBpdAotCQkgKi8KLQkJaWYgKHRwLT5mbGFnICYgRklOVVNFKSB7Ci0JCQl0cC0+bmFtZVswXSA9ICdcMCc7Ci0JCQl0cC0+ZmxhZyAmPSB+REVGSU5FRDsgLyogZW5zdXJlIGl0IHdvbid0IGJlIGZvdW5kICovCi0JCQl0cC0+ZmxhZyB8PSBGREVMRVRFOwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KLQotCWlmICh0cC0+ZmxhZyAmIEFMTE9DKSB7Ci0JCXRwLT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOwotCQl0ZnJlZSh0cC0+dmFsLnQsIHRwLT5hcmVhcCk7Ci0JfQotCi0JaWYgKHQgPT0gTlVMTCkgewkJLyogdW5kZWZpbmUgKi8KLQkJa3RkZWxldGUodHApOwotCQlyZXR1cm4gKHdhc19zZXQgPyAwIDogMSk7Ci0JfQotCi0JdHAtPnZhbC50ID0gdGNvcHkodC0+bGVmdCwgdHAtPmFyZWFwKTsKLQl0cC0+ZmxhZyB8PSAoSVNTRVR8QUxMT0MpOwotCWlmICh0LT51LmtzaF9mdW5jKQotCQl0cC0+ZmxhZyB8PSBGS1NIOwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIGFkZCBidWlsdGluCi0gKi8KLXZvaWQKLWJ1aWx0aW4oY29uc3QgY2hhciAqbmFtZSwgaW50ICgqZnVuYykgKGNvbnN0IGNoYXIgKiopKQotewotCXN0cnVjdCB0YmwgKnRwOwotCVRmbGFnIGZsYWc7Ci0KLQkvKiBzZWUgaWYgYW55IGZsYWdzIHNob3VsZCBiZSBzZXQgZm9yIHRoaXMgYnVpbHRpbiAqLwotCWZvciAoZmxhZyA9IDA7IDsgbmFtZSsrKSB7Ci0JCWlmICgqbmFtZSA9PSAnPScpCS8qIGNvbW1hbmQgZG9lcyB2YXJpYWJsZSBhc3NpZ25tZW50ICovCi0JCQlmbGFnIHw9IEtFRVBBU047Ci0JCWVsc2UgaWYgKCpuYW1lID09ICcqJykJLyogUE9TSVggc3BlY2lhbCBidWlsdGluICovCi0JCQlmbGFnIHw9IFNQRUNfQkk7Ci0JCWVsc2UgaWYgKCpuYW1lID09ICcrJykJLyogUE9TSVggcmVndWxhciBidWlsdGluICovCi0JCQlmbGFnIHw9IFJFR19CSTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JdHAgPSBrdGVudGVyKCZidWlsdGlucywgbmFtZSwgaGFzaChuYW1lKSk7Ci0JdHAtPmZsYWcgPSBERUZJTkVEIHwgZmxhZzsKLQl0cC0+dHlwZSA9IENTSEVMTDsKLQl0cC0+dmFsLmYgPSBmdW5jOwotfQotCi0vKgotICogZmluZCBjb21tYW5kCi0gKiBlaXRoZXIgZnVuY3Rpb24sIGhhc2hlZCBjb21tYW5kLCBvciBidWlsdC1pbiAoaW4gdGhhdCBvcmRlcikKLSAqLwotc3RydWN0IHRibCAqCi1maW5kY29tKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKLXsKLQlzdGF0aWMgc3RydWN0IHRibCB0ZW1wOwotCXVpbnQzMl90IGggPSBoYXNoKG5hbWUpOwotCXN0cnVjdCB0YmwgKnRwID0gTlVMTCwgKnRiaTsKLQl1bnNpZ25lZCBjaGFyIGluc2VydCA9IEZsYWcoRlRSQUNLQUxMKTsJLyogaW5zZXJ0IGlmIG5vdCBmb3VuZCAqLwotCWNoYXIgKmZwYXRoOwkJCS8qIGZvciBmdW5jdGlvbiBhdXRvbG9hZGluZyAqLwotCXVuaW9uIG1rc2hfY2NoYWNrIG5wYXRoOwotCi0JaWYgKHZzdHJjaHIobmFtZSwgJy8nKSkgewotCQlpbnNlcnQgPSAwOwotCQkvKiBwcmV2ZW50IEZQQVRIIHNlYXJjaCBiZWxvdyAqLwotCQlmbGFncyAmPSB+RkNfRlVOQzsKLQkJZ290byBTZWFyY2g7Ci0JfQotCXRiaSA9IChmbGFncyAmIEZDX0JJKSA/IGt0c2VhcmNoKCZidWlsdGlucywgbmFtZSwgaCkgOiBOVUxMOwotCS8qIFBPU0lYIHNheXMgc3BlY2lhbCBidWlsdGlucyBmaXJzdCwgdGhlbiBmdW5jdGlvbnMsIHRoZW4KLQkgKiBQT1NJWCByZWd1bGFyIGJ1aWx0aW5zLCB0aGVuIHNlYXJjaCBwYXRoLi4uCi0JICovCi0JaWYgKChmbGFncyAmIEZDX1NQRUNCSSkgJiYgdGJpICYmICh0YmktPmZsYWcgJiBTUEVDX0JJKSkKLQkJdHAgPSB0Ymk7Ci0JaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19GVU5DKSkgewotCQl0cCA9IGZpbmRmdW5jKG5hbWUsIGgsIGZhbHNlKTsKLQkJaWYgKHRwICYmICEodHAtPmZsYWcgJiBJU1NFVCkpIHsKLQkJCWlmICgoZnBhdGggPSBzdHJfdmFsKGdsb2JhbCgiRlBBVEgiKSkpID09IG51bGwpIHsKLQkJCQl0cC0+dS5mcGF0aCA9IE5VTEw7Ci0JCQkJdHAtPnUyLmVycm5vXyA9IDA7Ci0JCQl9IGVsc2UKLQkJCQl0cC0+dS5mcGF0aCA9IHNlYXJjaChuYW1lLCBmcGF0aCwgUl9PSywKLQkJCQkgICAgJnRwLT51Mi5lcnJub18pOwotCQl9Ci0JfQotCWlmICghdHAgJiYgKGZsYWdzICYgRkNfUkVHQkkpICYmIHRiaSAmJiAodGJpLT5mbGFnICYgUkVHX0JJKSkKLQkJdHAgPSB0Ymk7Ci0JaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19VTlJFR0JJKSAmJiB0YmkpCi0JCXRwID0gdGJpOwotCWlmICghdHAgJiYgKGZsYWdzICYgRkNfUEFUSCkgJiYgIShmbGFncyAmIEZDX0RFRlBBVEgpKSB7Ci0JCXRwID0ga3RzZWFyY2goJnRhbGlhc2VzLCBuYW1lLCBoKTsKLQkJaWYgKHRwICYmICh0cC0+ZmxhZyAmIElTU0VUKSAmJiBhY2Nlc3ModHAtPnZhbC5zLCBYX09LKSAhPSAwKSB7Ci0JCQlpZiAodHAtPmZsYWcgJiBBTExPQykgewotCQkJCXRwLT5mbGFnICY9IH5BTExPQzsKLQkJCQlhZnJlZSh0cC0+dmFsLnMsIEFQRVJNKTsKLQkJCX0KLQkJCXRwLT5mbGFnICY9IH5JU1NFVDsKLQkJfQotCX0KLQotIFNlYXJjaDoKLQlpZiAoKCF0cCB8fCAodHAtPnR5cGUgPT0gQ1RBTElBUyAmJiAhKHRwLT5mbGFnJklTU0VUKSkpICYmCi0JICAgIChmbGFncyAmIEZDX1BBVEgpKSB7Ci0JCWlmICghdHApIHsKLQkJCWlmIChpbnNlcnQgJiYgIShmbGFncyAmIEZDX0RFRlBBVEgpKSB7Ci0JCQkJdHAgPSBrdGVudGVyKCZ0YWxpYXNlcywgbmFtZSwgaCk7Ci0JCQkJdHAtPnR5cGUgPSBDVEFMSUFTOwotCQkJfSBlbHNlIHsKLQkJCQl0cCA9ICZ0ZW1wOwotCQkJCXRwLT50eXBlID0gQ0VYRUM7Ci0JCQl9Ci0JCQl0cC0+ZmxhZyA9IERFRklORUQ7CS8qIG1ha2UgfklTU0VUICovCi0JCX0KLQkJbnBhdGgucm8gPSBzZWFyY2gobmFtZSwgZmxhZ3MgJiBGQ19ERUZQQVRIID8gZGVmX3BhdGggOiBwYXRoLAotCQkgICAgWF9PSywgJnRwLT51Mi5lcnJub18pOwotCQlpZiAobnBhdGgucm8pIHsKLQkJCXN0cmR1cHgodHAtPnZhbC5zLCBucGF0aC5ybywgQVBFUk0pOwotCQkJaWYgKG5wYXRoLnJvICE9IG5hbWUpCi0JCQkJYWZyZWUobnBhdGgucncsIEFURU1QKTsKLQkJCXRwLT5mbGFnIHw9IElTU0VUfEFMTE9DOwotCQl9IGVsc2UgaWYgKChmbGFncyAmIEZDX0ZVTkMpICYmCi0JCSAgICAoZnBhdGggPSBzdHJfdmFsKGdsb2JhbCgiRlBBVEgiKSkpICE9IG51bGwgJiYKLQkJICAgIChucGF0aC5ybyA9IHNlYXJjaChuYW1lLCBmcGF0aCwgUl9PSywKLQkJICAgICZ0cC0+dTIuZXJybm9fKSkgIT0gTlVMTCkgewotCQkJLyogQW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgb2YgQVQmVCBrc2ggaXMgdGhhdCBpdAotCQkJICogc2VhcmNoZXMgRlBBVEggaWYgYSBjb21tYW5kIGlzIG5vdCBmb3VuZCwgZXZlbgotCQkJICogaWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gc2V0IHVwIGFzIGFuIGF1dG9sb2FkZWQKLQkJCSAqIGZ1bmN0aW9uIChpZSwgbm8gdHlwZXNldCAtdWYpLgotCQkJICovCi0JCQl0cCA9ICZ0ZW1wOwotCQkJdHAtPnR5cGUgPSBDRlVOQzsKLQkJCXRwLT5mbGFnID0gREVGSU5FRDsgLyogbWFrZSB+SVNTRVQgKi8KLQkJCXRwLT51LmZwYXRoID0gbnBhdGgucm87Ci0JCX0KLQl9Ci0JcmV0dXJuICh0cCk7Ci19Ci0KLS8qCi0gKiBmbHVzaCBleGVjdXRhYmxlIGNvbW1hbmRzIHdpdGggcmVsYXRpdmUgcGF0aHMKLSAqLwotdm9pZAotZmx1c2hjb20oaW50IGFsbCkJLyoganVzdCByZWxhdGl2ZSBvciBhbGwgKi8KLXsKLQlzdHJ1Y3QgdGJsICp0cDsKLQlzdHJ1Y3QgdHN0YXRlIHRzOwotCi0JZm9yIChrdHdhbGsoJnRzLCAmdGFsaWFzZXMpOyAodHAgPSBrdG5leHQoJnRzKSkgIT0gTlVMTDsgKQotCQlpZiAoKHRwLT5mbGFnJklTU0VUKSAmJiAoYWxsIHx8IHRwLT52YWwuc1swXSAhPSAnLycpKSB7Ci0JCQlpZiAodHAtPmZsYWcmQUxMT0MpIHsKLQkJCQl0cC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKLQkJCQlhZnJlZSh0cC0+dmFsLnMsIEFQRVJNKTsKLQkJCX0KLQkJCXRwLT5mbGFnICY9IH5JU1NFVDsKLQkJfQotfQotCi0vKiBDaGVjayBpZiBwYXRoIGlzIHNvbWV0aGluZyB3ZSB3YW50IHRvIGZpbmQuIFJldHVybnMgLTEgZm9yIGZhaWx1cmUuICovCi1pbnQKLXNlYXJjaF9hY2Nlc3MoY29uc3QgY2hhciAqbHBhdGgsIGludCBtb2RlLAotICAgIGludCAqZXJybm9wKQkvKiBzZXQgaWYgY2FuZGlkYXRlIGZvdW5kLCBidXQgbm90IHN1aXRhYmxlICovCi17Ci0JaW50IHJldCwgZXJyID0gMDsKLQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQotCWlmIChzdGF0KGxwYXRoLCAmc3RhdGIpIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0JcmV0ID0gYWNjZXNzKGxwYXRoLCBtb2RlKTsKLQlpZiAocmV0IDwgMCkKLQkJZXJyID0gZXJybm87IC8qIEZpbGUgZXhpc3RzLCBidXQgd2UgY2FuJ3QgYWNjZXNzIGl0ICovCi0JZWxzZSBpZiAobW9kZSA9PSBYX09LICYmICghU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSB8fAotCSAgICAhKHN0YXRiLnN0X21vZGUgJiAoU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpKSkpIHsKLQkJLyogVGhpcyAnY2F1c2UgYWNjZXNzKCkgc2F5cyByb290IGNhbiBleGVjdXRlIGV2ZXJ5dGhpbmcgKi8KLQkJcmV0ID0gLTE7Ci0JCWVyciA9IFNfSVNESVIoc3RhdGIuc3RfbW9kZSkgPyBFSVNESVIgOiBFQUNDRVM7Ci0JfQotCWlmIChlcnIgJiYgZXJybm9wICYmICEqZXJybm9wKQotCQkqZXJybm9wID0gZXJyOwotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIHNlYXJjaCBmb3IgY29tbWFuZCB3aXRoIFBBVEgKLSAqLwotY29uc3QgY2hhciAqCi1zZWFyY2goY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbHBhdGgsCi0gICAgaW50IG1vZGUsCQkvKiBSX09LIG9yIFhfT0sgKi8KLSAgICBpbnQgKmVycm5vcCkJLyogc2V0IGlmIGNhbmRpZGF0ZSBmb3VuZCwgYnV0IG5vdCBzdWl0YWJsZSAqLwotewotCWNvbnN0IGNoYXIgKnNwLCAqcDsKLQljaGFyICp4cDsKLQlYU3RyaW5nIHhzOwotCWludCBuYW1lbGVuOwotCi0JaWYgKGVycm5vcCkKLQkJKmVycm5vcCA9IDA7Ci0JaWYgKHZzdHJjaHIobmFtZSwgJy8nKSkgewotCQlpZiAoc2VhcmNoX2FjY2VzcyhuYW1lLCBtb2RlLCBlcnJub3ApID09IDApCi0JCQlyZXR1cm4gKG5hbWUpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCW5hbWVsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7Ci0KLQlzcCA9IGxwYXRoOwotCXdoaWxlIChzcCAhPSBOVUxMKSB7Ci0JCXhwID0gWHN0cmluZyh4cywgeHApOwotCQlpZiAoIShwID0gY3N0cmNocihzcCwgJzonKSkpCi0JCQlwID0gc3AgKyBzdHJsZW4oc3ApOwotCQlpZiAocCAhPSBzcCkgewotCQkJWGNoZWNrTih4cywgeHAsIHAgLSBzcCk7Ci0JCQltZW1jcHkoeHAsIHNwLCBwIC0gc3ApOwotCQkJeHAgKz0gcCAtIHNwOwotCQkJKnhwKysgPSAnLyc7Ci0JCX0KLQkJc3AgPSBwOwotCQlYY2hlY2tOKHhzLCB4cCwgbmFtZWxlbik7Ci0JCW1lbWNweSh4cCwgbmFtZSwgbmFtZWxlbik7Ci0JCWlmIChzZWFyY2hfYWNjZXNzKFhzdHJpbmcoeHMsIHhwKSwgbW9kZSwgZXJybm9wKSA9PSAwKQotCQkJcmV0dXJuIChYY2xvc2UoeHMsIHhwICsgbmFtZWxlbikpOwotCQlpZiAoKnNwKysgPT0gJ1wwJykKLQkJCXNwID0gTlVMTDsKLQl9Ci0JWGZyZWUoeHMsIHhwKTsKLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1jYWxsX2J1aWx0aW4oc3RydWN0IHRibCAqdHAsIGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgcnY7Ci0KLQlidWlsdGluX2FyZ3YwID0gd3BbMF07Ci0JYnVpbHRpbl9mbGFnID0gdHAtPmZsYWc7Ci0Jc2hmX3Jlb3BlbigxLCBTSEZfV1IsIHNobF9zdGRvdXQpOwotCXNobF9zdGRvdXRfb2sgPSAxOwotCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCBHRl9FUlJPUik7Ci0JcnYgPSAoKnRwLT52YWwuZikod3ApOwotCXNoZl9mbHVzaChzaGxfc3Rkb3V0KTsKLQlzaGxfc3Rkb3V0X29rID0gMDsKLQlidWlsdGluX2ZsYWcgPSAwOwotCWJ1aWx0aW5fYXJndjAgPSBOVUxMOwotCXJldHVybiAocnYpOwotfQotCi0vKgotICogc2V0IHVwIHJlZGlyZWN0aW9uLCBzYXZpbmcgb2xkIGZkcyBpbiBlLT5zYXZlZmQKLSAqLwotc3RhdGljIGludAotaW9zZXR1cChzdHJ1Y3QgaW93b3JkICppb3AsIHN0cnVjdCB0YmwgKnRwKQotewotCWludCB1ID0gLTE7Ci0JY2hhciAqY3AgPSBpb3AtPm5hbWU7Ci0JaW50IGlvdHlwZSA9IGlvcC0+ZmxhZyAmIElPVFlQRTsKLQlpbnQgZG9fb3BlbiA9IDEsIGRvX2Nsb3NlID0gMCwgZmxhZ3MgPSAwOwotCXN0cnVjdCBpb3dvcmQgaW90bXA7Ci0Jc3RydWN0IHN0YXQgc3RhdGI7Ci0KLQlpZiAoaW90eXBlICE9IElPSEVSRSkKLQkJY3AgPSBldmFsb25lc3RyKGNwLCBET1RJTERFfChGbGFnKEZUQUxLSU5HX0kpID8gRE9HTE9CIDogMCkpOwotCi0JLyogVXNlZCBmb3IgdHJhY2luZyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gcHJpbnQgZXhwYW5kZWQgY3AgKi8KLQlpb3RtcCA9ICppb3A7Ci0JaW90bXAubmFtZSA9IChpb3R5cGUgPT0gSU9IRVJFKSA/IE5VTEwgOiBjcDsKLQlpb3RtcC5mbGFnIHw9IElPTkFNRVhQOwotCi0JaWYgKEZsYWcoRlhUUkFDRSkpCi0JCXNoZWxsZigiJXMlc1xuIiwKLQkJICAgIHN1YnN0aXR1dGUoc3RyX3ZhbChnbG9iYWwoIlBTNCIpKSwgMCksCi0JCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSk7Ci0KLQlzd2l0Y2ggKGlvdHlwZSkgewotCWNhc2UgSU9SRUFEOgotCQlmbGFncyA9IE9fUkRPTkxZOwotCQlicmVhazsKLQotCWNhc2UgSU9DQVQ6Ci0JCWZsYWdzID0gT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1dSSVRFOgotCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7Ci0JCS8qIFRoZSBzdGF0KCkgaXMgaGVyZSB0byBhbGxvdyByZWRpcmVjdGlvbnMgdG8KLQkJICogdGhpbmdzIGxpa2UgL2Rldi9udWxsIHdpdGhvdXQgZXJyb3IuCi0JCSAqLwotCQlpZiAoRmxhZyhGTk9DTE9CQkVSKSAmJiAhKGlvcC0+ZmxhZyAmIElPQ0xPQikgJiYKLQkJICAgIChzdGF0KGNwLCAmc3RhdGIpIDwgMCB8fCBTX0lTUkVHKHN0YXRiLnN0X21vZGUpKSkKLQkJCWZsYWdzIHw9IE9fRVhDTDsKLQkJYnJlYWs7Ci0KLQljYXNlIElPUkRXUjoKLQkJZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUOwotCQlicmVhazsKLQotCWNhc2UgSU9IRVJFOgotCQlkb19vcGVuID0gMDsKLQkJLyogaGVyZWluKCkgcmV0dXJucyAtMiBpZiBlcnJvciBoYXMgYmVlbiBwcmludGVkICovCi0JCXUgPSBoZXJlaW4oaW9wLT5oZXJlZG9jLCBpb3AtPmZsYWcgJiBJT0VWQUwpOwotCQkvKiBjcCBtYXkgaGF2ZSB3cm9uZyBuYW1lICovCi0JCWJyZWFrOwotCi0JY2FzZSBJT0RVUDogewotCQljb25zdCBjaGFyICplbXNnOwotCi0JCWRvX29wZW4gPSAwOwotCQlpZiAoKmNwID09ICctJyAmJiAhY3BbMV0pIHsKLQkJCXUgPSAxMDA5OwkgLyogcHJldmVudCBlcnJvciByZXR1cm4gYmVsb3cgKi8KLQkJCWRvX2Nsb3NlID0gMTsKLQkJfSBlbHNlIGlmICgodSA9IGNoZWNrX2ZkKGNwLAotCQkgICAgWF9PSyB8ICgoaW9wLT5mbGFnICYgSU9SRFVQKSA/IFJfT0sgOiBXX09LKSwKLQkJICAgICZlbXNnKSkgPCAwKSB7Ci0JCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIiwKLQkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSwgZW1zZyk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlpZiAodSA9PSBpb3AtPnVuaXQpCi0JCQlyZXR1cm4gKDApOwkJLyogImR1cCBmcm9tIiA9PSAiZHVwIHRvIiAqLwotCQlicmVhazsKLQl9Ci0JfQotCi0JaWYgKGRvX29wZW4pIHsKLQkJaWYgKEZsYWcoRlJFU1RSSUNURUQpICYmIChmbGFncyAmIE9fQ1JFQVQpKSB7Ci0JCQl3YXJuaW5nZih0cnVlLCAiJXM6IHJlc3RyaWN0ZWQiLCBjcCk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQl1ID0gb3BlbihjcCwgZmxhZ3MsIDA2NjYpOwotCX0KLQlpZiAodSA8IDApIHsKLQkJLyogaGVyZWluKCkgbWF5IGFscmVhZHkgaGF2ZSBwcmludGVkIG1lc3NhZ2UgKi8KLQkJaWYgKHUgPT0gLTEpIHsKLQkJCXUgPSBlcnJubzsKLQkJCXdhcm5pbmdmKHRydWUsICJjYW5ub3QgJXMgJXM6ICVzIiwKLQkJCSAgICBpb3R5cGUgPT0gSU9EVVAgPyAiZHVwIiA6Ci0JCQkgICAgKGlvdHlwZSA9PSBJT1JFQUQgfHwgaW90eXBlID09IElPSEVSRSkgPwotCQkJICAgICJvcGVuIiA6ICJjcmVhdGUiLCBjcCwgc3RyZXJyb3IodSkpOwotCQl9Ci0JCXJldHVybiAoLTEpOwotCX0KLQkvKiBEbyBub3Qgc2F2ZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlZGlyZWN0ZWQgKGkuZS4gImNhdCA+eCA+eSIpLiAqLwotCWlmIChlLT5zYXZlZmRbaW9wLT51bml0XSA9PSAwKSB7Ci0JCS8qIElmIHRoZXNlIGFyZSB0aGUgc2FtZSwgaXQgbWVhbnMgdW5pdCB3YXMgcHJldmlvdXNseSBjbG9zZWQgKi8KLQkJaWYgKHUgPT0gaW9wLT51bml0KQotCQkJZS0+c2F2ZWZkW2lvcC0+dW5pdF0gPSAtMTsKLQkJZWxzZQotCQkJLyogY19leGVjKCkgYXNzdW1lcyBlLT5zYXZlZmRbZmRdIHNldCBmb3IgYW55Ci0JCQkgKiByZWRpcmVjdGlvbnMuIEFzayBzYXZlZmQoKSBub3QgdG8gY2xvc2UgaW9wLT51bml0OwotCQkJICogdGhpcyBhbGxvd3MgZXJyb3IgbWVzc2FnZXMgdG8gYmUgc2VlbiBpZiBpb3AtPnVuaXQKLQkJCSAqIGlzIDI7IGFsc28gbWVhbnMgd2UgY2FuJ3QgbG9zZSB0aGUgZmQgKGVnLCBib3RoCi0JCQkgKiBkdXAyIGJlbG93IGFuZCBkdXAyIGluIHJlc3RmZCgpIGZhaWxpbmcpLgotCQkJICovCi0JCQllLT5zYXZlZmRbaW9wLT51bml0XSA9IHNhdmVmZChpb3AtPnVuaXQpOwotCX0KLQotCWlmIChkb19jbG9zZSkKLQkJY2xvc2UoaW9wLT51bml0KTsKLQllbHNlIGlmICh1ICE9IGlvcC0+dW5pdCkgewotCQlpZiAoa3NoX2R1cDIodSwgaW9wLT51bml0LCB0cnVlKSA8IDApIHsKLQkJCWludCBldjsKLQotCQkJZXYgPSBlcnJubzsKLQkJCXdhcm5pbmdmKHRydWUsCi0JCQkgICAgImNvdWxkIG5vdCBmaW5pc2ggKGR1cCkgcmVkaXJlY3Rpb24gJXM6ICVzIiwKLQkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSwKLQkJCSAgICBzdHJlcnJvcihldikpOwotCQkJaWYgKGlvdHlwZSAhPSBJT0RVUCkKLQkJCQljbG9zZSh1KTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCWlmIChpb3R5cGUgIT0gSU9EVVApCi0JCQljbG9zZSh1KTsKLQkJLyogVG91Y2hpbmcgYW55IGNvLXByb2Nlc3MgZmQgaW4gYW4gZW1wdHkgZXhlYwotCQkgKiBjYXVzZXMgdGhlIHNoZWxsIHRvIGNsb3NlIGl0cyBjb3BpZXMKLQkJICovCi0JCWVsc2UgaWYgKHRwICYmIHRwLT50eXBlID09IENTSEVMTCAmJiB0cC0+dmFsLmYgPT0gY19leGVjKSB7Ci0JCQlpZiAoaW9wLT5mbGFnICYgSU9SRFVQKQkvKiBwb3NzaWJsZSBleGVjIDwmcCAqLwotCQkJCWNvcHJvY19yZWFkX2Nsb3NlKHUpOwotCQkJZWxzZQkJCS8qIHBvc3NpYmxlIGV4ZWMgPiZwICovCi0JCQkJY29wcm9jX3dyaXRlX2Nsb3NlKHUpOwotCQl9Ci0JfQotCWlmICh1ID09IDIpIC8qIENsZWFyIGFueSB3cml0ZSBlcnJvcnMgKi8KLQkJc2hmX3Jlb3BlbigyLCBTSEZfV1IsIHNobF9vdXQpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBvcGVuIGhlcmUgZG9jdW1lbnQgdGVtcCBmaWxlLgotICogaWYgdW5xdW90ZWQgaGVyZSwgZXhwYW5kIGhlcmUgdGVtcCBmaWxlIGludG8gc2Vjb25kIHRlbXAgZmlsZS4KLSAqLwotc3RhdGljIGludAotaGVyZWluKGNvbnN0IGNoYXIgKmNvbnRlbnQsIGludCBzdWIpCi17Ci0Jdm9sYXRpbGUgaW50IGZkID0gLTE7Ci0Jc3RydWN0IHNvdXJjZSAqcywgKnZvbGF0aWxlIG9zb3VyY2U7Ci0Jc3RydWN0IHNoZiAqdm9sYXRpbGUgc2hmOwotCXN0cnVjdCB0ZW1wICpoOwotCWludCBpOwotCi0JLyoga3NoIC1jICdjYXQgPDwgRU9GJyBjYW4gY2F1c2UgdGhpcy4uLiAqLwotCWlmIChjb250ZW50ID09IE5VTEwpIHsKLQkJd2FybmluZ2YodHJ1ZSwgImhlcmUgZG9jdW1lbnQgbWlzc2luZyIpOwotCQlyZXR1cm4gKC0yKTsgLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovCi0JfQotCi0JLyogQ3JlYXRlIHRlbXAgZmlsZSB0byBob2xkIGNvbnRlbnQgKGRvbmUgYmVmb3JlIG5ld2VudiBzbyB0ZW1wCi0JICogZG9lc24ndCBnZXQgcmVtb3ZlZCB0b28gc29vbikuCi0JICovCi0JaCA9IG1ha2V0ZW1wKEFURU1QLCBUVF9IRVJFRE9DX0VYUCwgJmUtPnRlbXBzKTsKLQlpZiAoIShzaGYgPSBoLT5zaGYpIHx8IChmZCA9IG9wZW4oaC0+bmFtZSwgT19SRE9OTFksIDApKSA8IDApIHsKLQkJZmQgPSBlcnJubzsKLQkJd2FybmluZ2YodHJ1ZSwgImNhbid0ICVzIHRlbXBvcmFyeSBmaWxlICVzOiAlcyIsCi0JCSAgICAhc2hmID8gImNyZWF0ZSIgOiAib3BlbiIsCi0JCSAgICBoLT5uYW1lLCBzdHJlcnJvcihmZCkpOwotCQlpZiAoc2hmKQotCQkJc2hmX2Nsb3NlKHNoZik7Ci0JCXJldHVybiAoLTIgLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovKTsKLQl9Ci0KLQlvc291cmNlID0gc291cmNlOwotCW5ld2VudihFX0VSUkgpOwotCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JaWYgKGkpIHsKLQkJc291cmNlID0gb3NvdXJjZTsKLQkJcXVpdGVudihzaGYpOwotCQljbG9zZShmZCk7Ci0JCXJldHVybiAoLTIpOyAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8KLQl9Ci0JaWYgKHN1YikgewotCQkvKiBEbyBzdWJzdGl0dXRpb25zIG9uIHRoZSBjb250ZW50IG9mIGhlcmVkb2MgKi8KLQkJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKLQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBjb250ZW50OwotCQlzb3VyY2UgPSBzOwotCQlpZiAoeXlsZXgoT05FV09SRHxIRVJFRE9DKSAhPSBMV09SRCkKLQkJCWludGVybmFsX2Vycm9yZigiaGVyZWluOiB5eWxleCIpOwotCQlzb3VyY2UgPSBvc291cmNlOwotCQlzaGZfcHV0cyhldmFsc3RyKHl5bHZhbC5jcCwgMCksIHNoZik7Ci0JfSBlbHNlCi0JCXNoZl9wdXRzKGNvbnRlbnQsIHNoZik7Ci0KLQlxdWl0ZW52KE5VTEwpOwotCi0JaWYgKHNoZl9jbG9zZShzaGYpID09IEVPRikgewotCQlpID0gZXJybm87Ci0JCWNsb3NlKGZkKTsKLQkJZmQgPSBlcnJubzsKLQkJd2FybmluZ2YodHJ1ZSwgImVycm9yIHdyaXRpbmcgJXM6ICVzLCAlcyIsIGgtPm5hbWUsCi0JCSAgICBzdHJlcnJvcihpKSwgc3RyZXJyb3IoZmQpKTsKLQkJcmV0dXJuICgtMik7CS8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLwotCX0KLQotCXJldHVybiAoZmQpOwotfQotCi0vKgotICoJa3NoIHNwZWNpYWwgLSB0aGUgc2VsZWN0IGNvbW1hbmQgcHJvY2Vzc2luZyBzZWN0aW9uCi0gKglwcmludCB0aGUgYXJncyBpbiBjb2x1bW4gZm9ybSAtIGFzc3VtaW5nIHRoYXQgd2UgY2FuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRvX3NlbGVjdGFyZ3MoY29uc3QgY2hhciAqKmFwLCBib29sIHByaW50X21lbnUpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnJlYWRfYXJnc1tdID0gewotCQkicmVhZCIsICItciIsICJSRVBMWSIsIE5VTEwKLQl9OwotCWNoYXIgKnM7Ci0JaW50IGksIGFyZ2N0OwotCi0JZm9yIChhcmdjdCA9IDA7IGFwW2FyZ2N0XTsgYXJnY3QrKykKLQkJOwotCXdoaWxlICgxKSB7Ci0JCS8qIE1lbnUgaXMgcHJpbnRlZCBpZgotCQkgKgktIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIHRoZSBzZWxlY3QgbG9vcAotCQkgKgktIHRoZSB1c2VyIGVudGVycyBhIGJsYW5rIGxpbmUKLQkJICoJLSB0aGUgUkVQTFkgcGFyYW1ldGVyIGlzIGVtcHR5Ci0JCSAqLwotCQlpZiAocHJpbnRfbWVudSB8fCAhKnN0cl92YWwoZ2xvYmFsKCJSRVBMWSIpKSkKLQkJCXByX21lbnUoYXApOwotCQlzaGVsbGYoIiVzIiwgc3RyX3ZhbChnbG9iYWwoIlBTMyIpKSk7Ci0JCWlmIChjYWxsX2J1aWx0aW4oZmluZGNvbSgicmVhZCIsIEZDX0JJKSwgcmVhZF9hcmdzKSkKLQkJCXJldHVybiAoTlVMTCk7Ci0JCXMgPSBzdHJfdmFsKGdsb2JhbCgiUkVQTFkiKSk7Ci0JCWlmICgqcykgewotCQkJZ2V0bihzLCAmaSk7Ci0JCQlyZXR1cm4gKChpID49IDEgJiYgaSA8PSBhcmdjdCkgPyBhcFtpIC0gMV0gOiBudWxsKTsKLQkJfQotCQlwcmludF9tZW51ID0gMTsKLQl9Ci19Ci0KLXN0cnVjdCBzZWxlY3RfbWVudV9pbmZvIHsKLQljb25zdCBjaGFyICogY29uc3QgKmFyZ3M7Ci0JaW50IG51bV93aWR0aDsKLX07Ci0KLXN0YXRpYyBjaGFyICpzZWxlY3RfZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7Ci0KLS8qIGZvcm1hdCBhIHNpbmdsZSBzZWxlY3QgbWVudSBpdGVtICovCi1zdGF0aWMgY2hhciAqCi1zZWxlY3RfZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKLXsKLQljb25zdCBzdHJ1Y3Qgc2VsZWN0X21lbnVfaW5mbyAqc21pID0KLQkgICAgKGNvbnN0IHN0cnVjdCBzZWxlY3RfbWVudV9pbmZvICopYXJnOwotCi0Jc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJSpkKSAlcyIsCi0JICAgIHNtaS0+bnVtX3dpZHRoLCBpICsgMSwgc21pLT5hcmdzW2ldKTsKLQlyZXR1cm4gKGJ1Zik7Ci19Ci0KLS8qCi0gKglwcmludCBhIHNlbGVjdCBzdHlsZSBtZW51Ci0gKi8KLWludAotcHJfbWVudShjb25zdCBjaGFyICogY29uc3QgKmFwKQotewotCXN0cnVjdCBzZWxlY3RfbWVudV9pbmZvIHNtaTsKLQljb25zdCBjaGFyICogY29uc3QgKnBwOwotCWludCBhY29scyA9IDAsIGFvY3RzID0gMCwgaSwgbjsKLQotCS8qCi0JICogd2lkdGgvY29sdW1uIGNhbGN1bGF0aW9ucyB3ZXJlIGRvbmUgb25jZSBhbmQgc2F2ZWQsIGJ1dCB0aGlzCi0JICogbWVhbnMgc2VsZWN0IGNhbid0IGJlIHVzZWQgcmVjdXJzaXZlbHkgc28gd2UgcmUtY2FsY3VsYXRlCi0JICogZWFjaCB0aW1lIChjb3VsZCBzYXZlIGluIGEgc3RydWN0dXJlIHRoYXQgaXMgcmV0dXJuZWQsIGJ1dAotCSAqIGl0J3MgcHJvYmFibHkgbm90IHdvcnRoIHRoZSBib3RoZXIpCi0JICovCi0KLQkvKgotCSAqIGdldCBkaW1lbnNpb25zIG9mIHRoZSBsaXN0Ci0JICovCi0JZm9yIChuID0gMCwgcHAgPSBhcDsgKnBwOyBuKyssIHBwKyspIHsKLQkJaSA9IHN0cmxlbigqcHApOwotCQlpZiAoaSA+IGFvY3RzKQotCQkJYW9jdHMgPSBpOwotCQlpID0gdXRmX21ic3dpZHRoKCpwcCk7Ci0JCWlmIChpID4gYWNvbHMpCi0JCQlhY29scyA9IGk7Ci0JfQotCi0JLyoKLQkgKiB3ZSB3aWxsIHByaW50IGFuIGluZGV4IG9mIHRoZSBmb3JtICIlZCkgIiBpbiBmcm9udCBvZgotCSAqIGVhY2ggZW50cnksIHNvIGdldCB0aGUgbWF4aW11bSB3aWR0aCBvZiB0aGlzCi0JICovCi0JZm9yIChpID0gbiwgc21pLm51bV93aWR0aCA9IDE7IGkgPj0gMTA7IGkgLz0gMTApCi0JCXNtaS5udW1fd2lkdGgrKzsKLQotCXNtaS5hcmdzID0gYXA7Ci0JcHJpbnRfY29sdW1ucyhzaGxfb3V0LCBuLCBzZWxlY3RfZm10X2VudHJ5LCAodm9pZCAqKSZzbWksCi0JICAgIHNtaS5udW1fd2lkdGggKyAyICsgYW9jdHMsIHNtaS5udW1fd2lkdGggKyAyICsgYWNvbHMsCi0JICAgIHRydWUpOwotCi0JcmV0dXJuIChuKTsKLX0KLQotLyogWFhYOiBob3JyaWJsZSBrbHVkZ2UgdG8gZml0IHdpdGhpbiB0aGUgZnJhbWV3b3JrICovCi1zdGF0aWMgY2hhciAqcGxhaW5fZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7Ci0KLXN0YXRpYyBjaGFyICoKLXBsYWluX2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCi17Ci0Jc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCAoKGNvbnN0IGNoYXIgKiBjb25zdCAqKWFyZylbaV0pOwotCXJldHVybiAoYnVmKTsKLX0KLQotaW50Ci1wcl9saXN0KGNoYXIgKiBjb25zdCAqYXApCi17Ci0JaW50IGFjb2xzID0gMCwgYW9jdHMgPSAwLCBpLCBuOwotCWNoYXIgKiBjb25zdCAqcHA7Ci0KLQlmb3IgKG4gPSAwLCBwcCA9IGFwOyAqcHA7IG4rKywgcHArKykgewotCQlpID0gc3RybGVuKCpwcCk7Ci0JCWlmIChpID4gYW9jdHMpCi0JCQlhb2N0cyA9IGk7Ci0JCWkgPSB1dGZfbWJzd2lkdGgoKnBwKTsKLQkJaWYgKGkgPiBhY29scykKLQkJCWFjb2xzID0gaTsKLQl9Ci0KLQlwcmludF9jb2x1bW5zKHNobF9vdXQsIG4sIHBsYWluX2ZtdF9lbnRyeSwgKGNvbnN0IHZvaWQgKilhcCwKLQkgICAgYW9jdHMsIGFjb2xzLCBmYWxzZSk7Ci0KLQlyZXR1cm4gKG4pOwotfQotCi0vKgotICoJW1sgLi4uIF1dIGV2YWx1YXRpb24gcm91dGluZXMKLSAqLwotCi0vKgotICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCi0gKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCi0gKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCi0gKi8KLXN0YXRpYyBUZXN0X29wCi1kYnRlc3RlX2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQotewotCVRlc3Rfb3AgcmV0ID0gVE9fTk9OT1A7Ci0JaW50IHVxd29yZDsKLQljb25zdCBjaGFyICpwOwotCi0JaWYgKCEqdGUtPnBvcy53cCkKLQkJcmV0dXJuIChtZXRhID09IFRNX0VORCA/IFRPX05PTk5VTEwgOiBUT19OT05PUCk7Ci0KLQkvKiB1bnF1b3RlZCB3b3JkPyAqLwotCWZvciAocCA9ICp0ZS0+cG9zLndwOyAqcCA9PSBDSEFSOyBwICs9IDIpCi0JCTsKLQl1cXdvcmQgPSAqcCA9PSBFT1M7Ci0KLQlpZiAobWV0YSA9PSBUTV9VTk9QIHx8IG1ldGEgPT0gVE1fQklOT1ApIHsKLQkJaWYgKHVxd29yZCkgewotCQkJY2hhciBidWZbOF07CS8qIGxvbmdlciB0aGFuIHRoZSBsb25nZXN0IG9wZXJhdG9yICovCi0JCQljaGFyICpxID0gYnVmOwotCQkJZm9yIChwID0gKnRlLT5wb3Mud3A7Ci0JCQkgICAgKnAgPT0gQ0hBUiAmJiBxIDwgJmJ1ZltzaXplb2YoYnVmKSAtIDFdOyBwICs9IDIpCi0JCQkJKnErKyA9IHBbMV07Ci0JCQkqcSA9ICdcMCc7Ci0JCQlyZXQgPSB0ZXN0X2lzb3AobWV0YSwgYnVmKTsKLQkJfQotCX0gZWxzZSBpZiAobWV0YSA9PSBUTV9FTkQpCi0JCXJldCA9IFRPX05PTk9QOwotCWVsc2UKLQkJcmV0ID0gKHVxd29yZCAmJiAhc3RyY21wKCp0ZS0+cG9zLndwLAotCQkgICAgZGJ0ZXN0X3Rva2Vuc1soaW50KW1ldGFdKSkgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0KLQkvKiBBY2NlcHQgdGhlIHRva2VuPyAqLwotCWlmIChyZXQgIT0gVE9fTk9OT1ApCi0JCXRlLT5wb3Mud3ArKzsKLQotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGJ0ZXN0ZV9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgYm9vbCBkb19ldmFsKQotewotCWNvbnN0IGNoYXIgKnMgPSAqdGUtPnBvcy53cDsKLQotCWlmICghcykKLQkJcmV0dXJuIChOVUxMKTsKLQotCXRlLT5wb3Mud3ArKzsKLQotCWlmICghZG9fZXZhbCkKLQkJcmV0dXJuIChudWxsKTsKLQotCWlmIChvcCA9PSBUT19TVEVRTCB8fCBvcCA9PSBUT19TVE5FUSkKLQkJcyA9IGV2YWxzdHIocywgRE9USUxERSB8IERPUEFUKTsKLQllbHNlCi0JCXMgPSBldmFsc3RyKHMsIERPVElMREUpOwotCi0JcmV0dXJuIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLWRidGVzdGVfZXJyb3IoVGVzdF9lbnYgKnRlLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICptc2cpCi17Ci0JdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKLQlpbnRlcm5hbF93YXJuaW5nZigiZGJ0ZXN0ZV9lcnJvcjogJXMgKG9mZnNldCAlZCkiLCBtc2csIG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9leHByLmMgYi9ta3NoL3NyYy9leHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTcxMGMuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvZXhwci5jCisrKyAvZGV2L251bGwKQEAgLTEsODk1ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBleHByLmMsdiAxLjIxIDIwMDkvMDYvMDEgMTk6MDA6NTcgZGVyYWFkdCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2V4cHIuYyx2IDEuNDQgMjAxMC8wOC8xNCAyMTozNToxMyB0ZyBFeHAgJCIpOwotCi0vKiBUaGUgb3JkZXIgb2YgdGhlc2UgZW51bXMgaXMgY29uc3RyYWluZWQgYnkgdGhlIG9yZGVyIG9mIG9waW5mb1tdICovCi1lbnVtIHRva2VuIHsKLQkvKiBzb21lIChsb25nKSB1bmFyeSBvcGVyYXRvcnMgKi8KLQlPX1BMVVNQTFVTID0gMCwgT19NSU5VU01JTlVTLAotCS8qIGJpbmFyeSBvcGVyYXRvcnMgKi8KLQlPX0VRLCBPX05FLAotCS8qIGFzc2lnbm1lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIGluIHJhbmdlIE9fQVNOIC4uIE9fQk9SQVNOICovCi0JT19BU04sIE9fVElNRVNBU04sIE9fRElWQVNOLCBPX01PREFTTiwgT19QTFVTQVNOLCBPX01JTlVTQVNOLAotCU9fTFNISUZUQVNOLCBPX1JTSElGVEFTTiwgT19CQU5EQVNOLCBPX0JYT1JBU04sIE9fQk9SQVNOLAotCU9fTFNISUZULCBPX1JTSElGVCwKLQlPX0xFLCBPX0dFLCBPX0xULCBPX0dULAotCU9fTEFORCwKLQlPX0xPUiwKLQlPX1RJTUVTLCBPX0RJViwgT19NT0QsCi0JT19QTFVTLCBPX01JTlVTLAotCU9fQkFORCwKLQlPX0JYT1IsCi0JT19CT1IsCi0JT19URVJOLAotCU9fQ09NTUEsCi0JLyogdGhpbmdzIGFmdGVyIHRoaXMgYXJlbid0IHVzZWQgYXMgYmluYXJ5IG9wZXJhdG9ycyAqLwotCS8qIHVuYXJ5IHRoYXQgYXJlIG5vdCBhbHNvIGJpbmFyaWVzICovCi0JT19CTk9ULCBPX0xOT1QsCi0JLyogbWlzYyAqLwotCU9QRU5fUEFSRU4sIENMT1NFX1BBUkVOLCBDVEVSTiwKLQkvKiB0aGluZ3MgdGhhdCBkb24ndCBhcHBlYXIgaW4gdGhlIG9waW5mb1tdIHRhYmxlICovCi0JVkFSLCBMSVQsIEVORCwgQkFECi19OwotI2RlZmluZSBJU19CSU5PUChvcCkgKCgoaW50KW9wKSA+PSAoaW50KU9fRVEgJiYgKChpbnQpb3ApIDw9IChpbnQpT19DT01NQSkKLSNkZWZpbmUgSVNfQVNTSUdOT1Aob3ApCSgoaW50KShvcCkgPj0gKGludClPX0FTTiAmJiAoaW50KShvcCkgPD0gKGludClPX0JPUkFTTikKLQotLyogcHJlY2lzaW9uczsgdXNlZCB0byBiZSBlbnVtIHByZWMgYnV0IHdlIGRvIGFyaXRobWV0aWNzIG9uIGl0ICovCi0jZGVmaW5lIFBfUFJJTUFSWQkwCS8qIFZBUiwgTElULCAoKSwgfiAhIC0gKyAqLwotI2RlZmluZSBQX01VTFQJCTEJLyogKiAvICUgKi8KLSNkZWZpbmUgUF9BREQJCTIJLyogKyAtICovCi0jZGVmaW5lIFBfU0hJRlQJCTMJLyogPDwgPj4gKi8KLSNkZWZpbmUgUF9SRUxBVElPTgk0CS8qIDwgPD0gPiA+PSAqLwotI2RlZmluZSBQX0VRVUFMSVRZCTUJLyogPT0gIT0gKi8KLSNkZWZpbmUgUF9CQU5ECQk2CS8qICYgKi8KLSNkZWZpbmUgUF9CWE9SCQk3CS8qIF4gKi8KLSNkZWZpbmUgUF9CT1IJCTgJLyogfCAqLwotI2RlZmluZSBQX0xBTkQJCTkJLyogJiYgKi8KLSNkZWZpbmUgUF9MT1IJCTEwCS8qIHx8ICovCi0jZGVmaW5lIFBfVEVSTgkJMTEJLyogPzogKi8KLSNkZWZpbmUgUF9BU1NJR04JMTIJLyogPSAqPSAvPSAlPSArPSAtPSA8PD0gPj49ICY9IF49IHw9ICovCi0jZGVmaW5lIFBfQ09NTUEJCTEzCS8qICwgKi8KLSNkZWZpbmUgTUFYX1BSRUMJUF9DT01NQQotCi1zdHJ1Y3Qgb3BpbmZvIHsKLQljaGFyCQluYW1lWzRdOwotCWludAkJbGVuOwkvKiBuYW1lIGxlbmd0aCAqLwotCWludAkJcHJlYzsJLyogcHJlY2VkZW5jZTogbG93ZXIgaXMgaGlnaGVyICovCi19OwotCi0vKiBUb2tlbnMgaW4gdGhpcyB0YWJsZSBtdXN0IGJlIG9yZGVyZWQgc28gdGhlIGxvbmdlc3QgYXJlIGZpcnN0Ci0gKiAoZWcsICs9IGJlZm9yZSArKS4gSWYgeW91IGNoYW5nZSBzb21ldGhpbmcsIGNoYW5nZSB0aGUgb3JkZXIKLSAqIG9mIGVudW0gdG9rZW4gdG9vLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9waW5mbyBvcGluZm9bXSA9IHsKLQl7ICIrKyIsCSAyLCBQX1BSSU1BUlkgfSwJLyogYmVmb3JlICsgKi8KLQl7ICItLSIsCSAyLCBQX1BSSU1BUlkgfSwJLyogYmVmb3JlIC0gKi8KLQl7ICI9PSIsCSAyLCBQX0VRVUFMSVRZIH0sCS8qIGJlZm9yZSA9ICovCi0JeyAiIT0iLAkgMiwgUF9FUVVBTElUWSB9LAkvKiBiZWZvcmUgISAqLwotCXsgIj0iLAkgMSwgUF9BU1NJR04gfSwJCS8qIGtlZXAgYXNzaWducyBpbiBhIGJsb2NrICovCi0JeyAiKj0iLAkgMiwgUF9BU1NJR04gfSwKLQl7ICIvPSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIiU9IiwJIDIsIFBfQVNTSUdOIH0sCi0JeyAiKz0iLAkgMiwgUF9BU1NJR04gfSwKLQl7ICItPSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIjw8PSIsIDMsIFBfQVNTSUdOIH0sCi0JeyAiPj49IiwgMywgUF9BU1NJR04gfSwKLQl7ICImPSIsCSAyLCBQX0FTU0lHTiB9LAotCXsgIl49IiwJIDIsIFBfQVNTSUdOIH0sCi0JeyAifD0iLAkgMiwgUF9BU1NJR04gfSwKLQl7ICI8PCIsCSAyLCBQX1NISUZUIH0sCi0JeyAiPj4iLAkgMiwgUF9TSElGVCB9LAotCXsgIjw9IiwJIDIsIFBfUkVMQVRJT04gfSwKLQl7ICI+PSIsCSAyLCBQX1JFTEFUSU9OIH0sCi0JeyAiPCIsCSAxLCBQX1JFTEFUSU9OIH0sCi0JeyAiPiIsCSAxLCBQX1JFTEFUSU9OIH0sCi0JeyAiJiYiLAkgMiwgUF9MQU5EIH0sCi0JeyAifHwiLAkgMiwgUF9MT1IgfSwKLQl7ICIqIiwJIDEsIFBfTVVMVCB9LAotCXsgIi8iLAkgMSwgUF9NVUxUIH0sCi0JeyAiJSIsCSAxLCBQX01VTFQgfSwKLQl7ICIrIiwJIDEsIFBfQUREIH0sCi0JeyAiLSIsCSAxLCBQX0FERCB9LAotCXsgIiYiLAkgMSwgUF9CQU5EIH0sCi0JeyAiXiIsCSAxLCBQX0JYT1IgfSwKLQl7ICJ8IiwJIDEsIFBfQk9SIH0sCi0JeyAiPyIsCSAxLCBQX1RFUk4gfSwKLQl7ICIsIiwJIDEsIFBfQ09NTUEgfSwKLQl7ICJ+IiwJIDEsIFBfUFJJTUFSWSB9LAotCXsgIiEiLAkgMSwgUF9QUklNQVJZIH0sCi0JeyAiKCIsCSAxLCBQX1BSSU1BUlkgfSwKLQl7ICIpIiwJIDEsIFBfUFJJTUFSWSB9LAotCXsgIjoiLAkgMSwgUF9QUklNQVJZIH0sCi0JeyAiIiwJIDAsIFBfUFJJTUFSWSB9Ci19OwotCi10eXBlZGVmIHN0cnVjdCBleHByX3N0YXRlIEV4cHJfc3RhdGU7Ci1zdHJ1Y3QgZXhwcl9zdGF0ZSB7Ci0JY29uc3QgY2hhciAqZXhwcmVzc2lvbjsJCS8qIGV4cHJlc3Npb24gYmVpbmcgZXZhbHVhdGVkICovCi0JY29uc3QgY2hhciAqdG9rcDsJCS8qIGxleGljYWwgcG9zaXRpb24gKi8KLQlzdHJ1Y3QgdGJsICp2YWw7CQkvKiB2YWx1ZSBmcm9tIHRva2VuKCkgKi8KLQlzdHJ1Y3QgdGJsICpldmFsaW5nOwkJLyogdmFyaWFibGUgdGhhdCBpcyBiZWluZyByZWN1cnNpdmVseQotCQkJCQkgKiBleHBhbmRlZCAoRVhQUklORVZBTCBmbGFnIHNldCkgKi8KLQlpbnQgbm9hc3NpZ247CQkJLyogZG9uJ3QgZG8gYXNzaWducyAoZm9yID86LCYmLHx8KSAqLwotCWVudW0gdG9rZW4gdG9rOwkJCS8qIHRva2VuIGZyb20gdG9rZW4oKSAqLwotCWJvb2wgYXJpdGg7CQkJLyogZXZhbHVhdGluZyBhbiAkKCgpKSBleHByZXNzaW9uPyAqLwotCWJvb2wgbmF0dXJhbDsJCQkvKiB1bnNpZ25lZCBhcml0aG1ldGljIGNhbGN1bGF0aW9uICovCi19OwotCi0jZGVmaW5lIGJpdnVpKHgsIG9wLCB5KQkoZXMtPm5hdHVyYWwgPwkJCVwKLQkobWtzaF9hcmlfdCkoKHgpLT52YWwudSBvcCAoeSktPnZhbC51KSA6CVwKLQkobWtzaF9hcmlfdCkoKHgpLT52YWwuaSBvcCAoeSktPnZhbC5pKQkJXAotKQotI2RlZmluZSBjaHZ1aSh4LCBvcCkJZG8gewkJCVwKLQlpZiAoZXMtPm5hdHVyYWwpCQkJXAotCQkoeCktPnZhbC51ID0gb3AgKHgpLT52YWwudTsJXAotCWVsc2UJCQkJCVwKLQkJKHgpLT52YWwuaSA9IG9wICh4KS0+dmFsLmk7CVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2RlZmluZSBzdHZ1aSh4LCBuKQlkbyB7CQkJXAotCWlmIChlcy0+bmF0dXJhbCkJCQlcCi0JCSh4KS0+dmFsLnUgPSAobik7CQlcCi0JZWxzZQkJCQkJXAotCQkoeCktPnZhbC5pID0gKG4pOwkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0KLWVudW0gZXJyb3JfdHlwZSB7Ci0JRVRfVU5FWFBFQ1RFRCwgRVRfQkFETElULCBFVF9SRUNVUlNJVkUsCi0JRVRfTFZBTFVFLCBFVF9SRE9OTFksIEVUX1NUUgotfTsKLQotc3RhdGljIHZvaWQgZXZhbGVycihFeHByX3N0YXRlICosIGVudW0gZXJyb3JfdHlwZSwgY29uc3QgY2hhciAqKQotICAgIE1LU0hfQV9OT1JFVFVSTjsKLXN0YXRpYyBzdHJ1Y3QgdGJsICpldmFsZXhwcihFeHByX3N0YXRlICosIGludCk7Ci1zdGF0aWMgdm9pZCBleHBydG9rZW4oRXhwcl9zdGF0ZSAqKTsKLXN0YXRpYyBzdHJ1Y3QgdGJsICpkb19wcG1tKEV4cHJfc3RhdGUgKiwgZW51bSB0b2tlbiwgc3RydWN0IHRibCAqLCBib29sKTsKLXN0YXRpYyB2b2lkIGFzc2lnbl9jaGVjayhFeHByX3N0YXRlICosIGVudW0gdG9rZW4sIHN0cnVjdCB0YmwgKik7Ci1zdGF0aWMgc3RydWN0IHRibCAqdGVtcHZhcih2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgdGJsICppbnR2YXIoRXhwcl9zdGF0ZSAqLCBzdHJ1Y3QgdGJsICopOwotCi0vKgotICogcGFyc2UgYW5kIGV2YWx1YXRlIGV4cHJlc3Npb24KLSAqLwotaW50Ci1ldmFsdWF0ZShjb25zdCBjaGFyICpleHByLCBta3NoX2FyaV90ICpydmFsLCBpbnQgZXJyb3Jfb2ssIGJvb2wgYXJpdGgpCi17Ci0Jc3RydWN0IHRibCB2OwotCWludCByZXQ7Ci0KLQl2LmZsYWcgPSBERUZJTkVEfElOVEVHRVI7Ci0Jdi50eXBlID0gMDsKLQlyZXQgPSB2X2V2YWx1YXRlKCZ2LCBleHByLCBlcnJvcl9vaywgYXJpdGgpOwotCSpydmFsID0gdi52YWwuaTsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qCi0gKiBwYXJzZSBhbmQgZXZhbHVhdGUgZXhwcmVzc2lvbiwgc3RvcmluZyByZXN1bHQgaW4gdnAuCi0gKi8KLWludAotdl9ldmFsdWF0ZShzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqZXhwciwgdm9sYXRpbGUgaW50IGVycm9yX29rLAotICAgIGJvb2wgYXJpdGgpCi17Ci0Jc3RydWN0IHRibCAqdjsKLQlFeHByX3N0YXRlIGN1cnN0YXRlOwotCUV4cHJfc3RhdGUgKiBjb25zdCBlcyA9ICZjdXJzdGF0ZTsKLQlpbnQgaTsKLQotCS8qIHNhdmUgc3RhdGUgdG8gYWxsb3cgcmVjdXJzaXZlIGNhbGxzICovCi0JY3Vyc3RhdGUuZXhwcmVzc2lvbiA9IGN1cnN0YXRlLnRva3AgPSBleHByOwotCWN1cnN0YXRlLm5vYXNzaWduID0gMDsKLQljdXJzdGF0ZS5hcml0aCA9IGFyaXRoOwotCWN1cnN0YXRlLmV2YWxpbmcgPSBOVUxMOwotCWN1cnN0YXRlLm5hdHVyYWwgPSBmYWxzZTsKLQotCW5ld2VudihFX0VSUkgpOwotCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JaWYgKGkpIHsKLQkJLyogQ2xlYXIgRVhQUklORVZBTCBpbiBvZiBhbnkgdmFyaWFibGVzIHdlIHdlcmUgcGxheWluZyB3aXRoICovCi0JCWlmIChjdXJzdGF0ZS5ldmFsaW5nKQotCQkJY3Vyc3RhdGUuZXZhbGluZy0+ZmxhZyAmPSB+RVhQUklORVZBTDsKLQkJcXVpdGVudihOVUxMKTsKLQkJaWYgKGkgPT0gTEFFWFBSKSB7Ci0JCQlpZiAoZXJyb3Jfb2sgPT0gS1NIX1JFVFVSTl9FUlJPUikKLQkJCQlyZXR1cm4gKDApOwotCQkJZXJyb3JmeigpOwotCQl9Ci0JCXVud2luZChpKTsKLQkJLyogTk9UUkVBQ0hFRCAqLwotCX0KLQotCWV4cHJ0b2tlbihlcyk7Ci0JaWYgKGVzLT50b2sgPT0gRU5EKSB7Ci0JCWVzLT50b2sgPSBMSVQ7Ci0JCWVzLT52YWwgPSB0ZW1wdmFyKCk7Ci0JfQotCXYgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBNQVhfUFJFQykpOwotCi0JaWYgKGVzLT50b2sgIT0gRU5EKQotCQlldmFsZXJyKGVzLCBFVF9VTkVYUEVDVEVELCBOVUxMKTsKLQotCWlmIChlcy0+YXJpdGggJiYgZXMtPm5hdHVyYWwpCi0JCXZwLT5mbGFnIHw9IElOVF9VOwotCWlmICh2cC0+ZmxhZyAmIElOVEVHRVIpCi0JCXNldGludF92KHZwLCB2LCBlcy0+YXJpdGgpOwotCWVsc2UKLQkJLyogY2FuIGZhaWwgaWYgcmVhZG9ubHkgKi8KLQkJc2V0c3RyKHZwLCBzdHJfdmFsKHYpLCBlcnJvcl9vayk7Ci0KLQlxdWl0ZW52KE5VTEwpOwotCi0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWV2YWxlcnIoRXhwcl9zdGF0ZSAqZXMsIGVudW0gZXJyb3JfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzdHIpCi17Ci0JY2hhciB0YnVmWzJdOwotCWNvbnN0IGNoYXIgKnM7Ci0KLQllcy0+YXJpdGggPSBmYWxzZTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEVUX1VORVhQRUNURUQ6Ci0JCXN3aXRjaCAoZXMtPnRvaykgewotCQljYXNlIFZBUjoKLQkJCXMgPSBlcy0+dmFsLT5uYW1lOwotCQkJYnJlYWs7Ci0JCWNhc2UgTElUOgotCQkJcyA9IHN0cl92YWwoZXMtPnZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkQ6Ci0JCQlzID0gImVuZCBvZiBleHByZXNzaW9uIjsKLQkJCWJyZWFrOwotCQljYXNlIEJBRDoKLQkJCXRidWZbMF0gPSAqZXMtPnRva3A7Ci0JCQl0YnVmWzFdID0gJ1wwJzsKLQkJCXMgPSB0YnVmOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzID0gb3BpbmZvWyhpbnQpZXMtPnRva10ubmFtZTsKLQkJfQotCQl3YXJuaW5nZih0cnVlLCAiJXM6IHVuZXhwZWN0ZWQgJyVzJyIsIGVzLT5leHByZXNzaW9uLCBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVUX0JBRExJVDoKLQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBiYWQgbnVtYmVyICclcyciLCBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVUX1JFQ1VSU0lWRToKLQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBleHByZXNzaW9uIHJlY3Vyc2VzIG9uIHBhcmFtZXRlciAnJXMnIiwKLQkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOwotCQlicmVhazsKLQotCWNhc2UgRVRfTFZBTFVFOgotCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIHJlcXVpcmVzIGx2YWx1ZSIsCi0JCSAgICBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVUX1JET05MWToKLQkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyBhcHBsaWVkIHRvIHJlYWQgb25seSB2YXJpYWJsZSIsCi0JCSAgICBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OiAvKiBrZWVwIGdjYyBoYXBweSAqLwotCWNhc2UgRVRfU1RSOgotCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIiwgZXMtPmV4cHJlc3Npb24sIHN0cik7Ci0JCWJyZWFrOwotCX0KLQl1bndpbmQoTEFFWFBSKTsKLX0KLQotc3RhdGljIHN0cnVjdCB0YmwgKgotZXZhbGV4cHIoRXhwcl9zdGF0ZSAqZXMsIGludCBwcmVjKQotewotCXN0cnVjdCB0YmwgKnZsLCAqdnIgPSBOVUxMLCAqdmFzbjsKLQllbnVtIHRva2VuIG9wOwotCW1rc2hfYXJpX3QgcmVzID0gMDsKLQotCWlmIChwcmVjID09IFBfUFJJTUFSWSkgewotCQlvcCA9IGVzLT50b2s7Ci0JCWlmIChvcCA9PSBPX0JOT1QgfHwgb3AgPT0gT19MTk9UIHx8IG9wID09IE9fTUlOVVMgfHwKLQkJICAgIG9wID09IE9fUExVUykgewotCQkJZXhwcnRva2VuKGVzKTsKLQkJCXZsID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgUF9QUklNQVJZKSk7Ci0JCQlpZiAob3AgPT0gT19CTk9UKQotCQkJCWNodnVpKHZsLCB+KTsKLQkJCWVsc2UgaWYgKG9wID09IE9fTE5PVCkKLQkJCQljaHZ1aSh2bCwgISk7Ci0JCQllbHNlIGlmIChvcCA9PSBPX01JTlVTKQotCQkJCWNodnVpKHZsLCAtKTsKLQkJCS8qIG9wID09IE9fUExVUyBpcyBhIG5vLW9wICovCi0JCX0gZWxzZSBpZiAob3AgPT0gT1BFTl9QQVJFTikgewotCQkJZXhwcnRva2VuKGVzKTsKLQkJCXZsID0gZXZhbGV4cHIoZXMsIE1BWF9QUkVDKTsKLQkJCWlmIChlcy0+dG9rICE9IENMT1NFX1BBUkVOKQotCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgIm1pc3NpbmcgKSIpOwotCQkJZXhwcnRva2VuKGVzKTsKLQkJfSBlbHNlIGlmIChvcCA9PSBPX1BMVVNQTFVTIHx8IG9wID09IE9fTUlOVVNNSU5VUykgewotCQkJZXhwcnRva2VuKGVzKTsKLQkJCXZsID0gZG9fcHBtbShlcywgb3AsIGVzLT52YWwsIHRydWUpOwotCQkJZXhwcnRva2VuKGVzKTsKLQkJfSBlbHNlIGlmIChvcCA9PSBWQVIgfHwgb3AgPT0gTElUKSB7Ci0JCQl2bCA9IGVzLT52YWw7Ci0JCQlleHBydG9rZW4oZXMpOwotCQl9IGVsc2UgewotCQkJZXZhbGVycihlcywgRVRfVU5FWFBFQ1RFRCwgTlVMTCk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCX0KLQkJaWYgKGVzLT50b2sgPT0gT19QTFVTUExVUyB8fCBlcy0+dG9rID09IE9fTUlOVVNNSU5VUykgewotCQkJdmwgPSBkb19wcG1tKGVzLCBlcy0+dG9rLCB2bCwgZmFsc2UpOwotCQkJZXhwcnRva2VuKGVzKTsKLQkJfQotCQlyZXR1cm4gKHZsKTsKLQl9Ci0JdmwgPSBldmFsZXhwcihlcywgcHJlYyAtIDEpOwotCWZvciAob3AgPSBlcy0+dG9rOyBJU19CSU5PUChvcCkgJiYgb3BpbmZvWyhpbnQpb3BdLnByZWMgPT0gcHJlYzsKLQkgICAgb3AgPSBlcy0+dG9rKSB7Ci0JCWV4cHJ0b2tlbihlcyk7Ci0JCXZhc24gPSB2bDsKLQkJaWYgKG9wICE9IE9fQVNOKSAvKiB2bCBtYXkgbm90IGhhdmUgYSB2YWx1ZSB5ZXQgKi8KLQkJCXZsID0gaW50dmFyKGVzLCB2bCk7Ci0JCWlmIChJU19BU1NJR05PUChvcCkpIHsKLQkJCWFzc2lnbl9jaGVjayhlcywgb3AsIHZhc24pOwotCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBQX0FTU0lHTikpOwotCQl9IGVsc2UgaWYgKG9wICE9IE9fVEVSTiAmJiBvcCAhPSBPX0xBTkQgJiYgb3AgIT0gT19MT1IpCi0JCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7Ci0JCWlmICgob3AgPT0gT19ESVYgfHwgb3AgPT0gT19NT0QgfHwgb3AgPT0gT19ESVZBU04gfHwKLQkJICAgIG9wID09IE9fTU9EQVNOKSAmJiB2ci0+dmFsLmkgPT0gMCkgewotCQkJaWYgKGVzLT5ub2Fzc2lnbikKLQkJCQl2ci0+dmFsLmkgPSAxOwotCQkJZWxzZQotCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgInplcm8gZGl2aXNvciIpOwotCQl9Ci0JCXN3aXRjaCAoKGludClvcCkgewotCQljYXNlIE9fVElNRVM6Ci0JCWNhc2UgT19USU1FU0FTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCAqLCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0RJVjoKLQkJY2FzZSBPX0RJVkFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCAvLCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX01PRDoKLQkJY2FzZSBPX01PREFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCAlLCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX1BMVVM6Ci0JCWNhc2UgT19QTFVTQVNOOgotCQkJcmVzID0gYml2dWkodmwsICssIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fTUlOVVM6Ci0JCWNhc2UgT19NSU5VU0FTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCAtLCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0xTSElGVDoKLQkJY2FzZSBPX0xTSElGVEFTTjoKLQkJCXJlcyA9IGJpdnVpKHZsLCA8PCwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19SU0hJRlQ6Ci0JCWNhc2UgT19SU0hJRlRBU046Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgPj4sIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fTFQ6Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgPCwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19MRToKLQkJCXJlcyA9IGJpdnVpKHZsLCA8PSwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19HVDoKLQkJCXJlcyA9IGJpdnVpKHZsLCA+LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0dFOgotCQkJcmVzID0gYml2dWkodmwsID49LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0VROgotCQkJcmVzID0gYml2dWkodmwsID09LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX05FOgotCQkJcmVzID0gYml2dWkodmwsICE9LCB2cik7Ci0JCQlicmVhazsKLQkJY2FzZSBPX0JBTkQ6Ci0JCWNhc2UgT19CQU5EQVNOOgotCQkJcmVzID0gYml2dWkodmwsICYsIHZyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9fQlhPUjoKLQkJY2FzZSBPX0JYT1JBU046Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgXiwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19CT1I6Ci0JCWNhc2UgT19CT1JBU046Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgfCwgdnIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19MQU5EOgotCQkJaWYgKCF2bC0+dmFsLmkpCi0JCQkJZXMtPm5vYXNzaWduKys7Ci0JCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7Ci0JCQlyZXMgPSBiaXZ1aSh2bCwgJiYsIHZyKTsKLQkJCWlmICghdmwtPnZhbC5pKQotCQkJCWVzLT5ub2Fzc2lnbi0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19MT1I6Ci0JCQlpZiAodmwtPnZhbC5pKQotCQkJCWVzLT5ub2Fzc2lnbisrOwotCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBwcmVjIC0gMSkpOwotCQkJcmVzID0gYml2dWkodmwsIHx8LCB2cik7Ci0JCQlpZiAodmwtPnZhbC5pKQotCQkJCWVzLT5ub2Fzc2lnbi0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19URVJOOgotCQkJewotCQkJCWJvb2wgZXYgPSB2bC0+dmFsLmkgIT0gMDsKLQotCQkJCWlmICghZXYpCi0JCQkJCWVzLT5ub2Fzc2lnbisrOwotCQkJCXZsID0gZXZhbGV4cHIoZXMsIE1BWF9QUkVDKTsKLQkJCQlpZiAoIWV2KQotCQkJCQllcy0+bm9hc3NpZ24tLTsKLQkJCQlpZiAoZXMtPnRvayAhPSBDVEVSTikKLQkJCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyA6Iik7Ci0JCQkJZXhwcnRva2VuKGVzKTsKLQkJCQlpZiAoZXYpCi0JCQkJCWVzLT5ub2Fzc2lnbisrOwotCQkJCXZyID0gZXZhbGV4cHIoZXMsIFBfVEVSTik7Ci0JCQkJaWYgKGV2KQotCQkJCQllcy0+bm9hc3NpZ24tLTsKLQkJCQl2bCA9IGV2ID8gdmwgOiB2cjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9fQVNOOgotCQkJcmVzID0gdnItPnZhbC5pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT19DT01NQToKLQkJCXJlcyA9IHZyLT52YWwuaTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChJU19BU1NJR05PUChvcCkpIHsKLQkJCXN0dnVpKHZyLCByZXMpOwotCQkJaWYgKCFlcy0+bm9hc3NpZ24pIHsKLQkJCQlpZiAodmFzbi0+ZmxhZyAmIElOVEVHRVIpCi0JCQkJCXNldGludF92KHZhc24sIHZyLCBlcy0+YXJpdGgpOwotCQkJCWVsc2UKLQkJCQkJc2V0aW50KHZhc24sIHJlcyk7Ci0JCQl9Ci0JCQl2bCA9IHZyOwotCQl9IGVsc2UgaWYgKG9wICE9IE9fVEVSTikKLQkJCXN0dnVpKHZsLCByZXMpOwotCX0KLQlyZXR1cm4gKHZsKTsKLX0KLQotc3RhdGljIHZvaWQKLWV4cHJ0b2tlbihFeHByX3N0YXRlICplcykKLXsKLQljb25zdCBjaGFyICpjcCA9IGVzLT50b2twOwotCWludCBjOwotCWNoYXIgKnR2YXI7Ci0KLQkvKiBza2lwIHdoaXRlIHNwYWNlICovCi0gc2tpcF9zcGFjZXM6Ci0Jd2hpbGUgKChjID0gKmNwKSwga3NoX2lzc3BhY2UoYykpCi0JCSsrY3A7Ci0JaWYgKGVzLT50b2twID09IGVzLT5leHByZXNzaW9uICYmIGMgPT0gJyMnKSB7Ci0JCS8qIGV4cHJlc3Npb24gYmVnaW5zIHdpdGggIyAqLwotCQllcy0+bmF0dXJhbCA9IHRydWU7CS8qIHN3aXRjaCB0byB1bnNpZ25lZCAqLwotCQkrK2NwOwotCQlnb3RvIHNraXBfc3BhY2VzOwotCX0KLQllcy0+dG9rcCA9IGNwOwotCi0JaWYgKGMgPT0gJ1wwJykKLQkJZXMtPnRvayA9IEVORDsKLQllbHNlIGlmIChrc2hfaXNhbHBoeChjKSkgewotCQlmb3IgKDsga3NoX2lzYWxudXgoYyk7IGMgPSAqY3ApCi0JCQljcCsrOwotCQlpZiAoYyA9PSAnWycpIHsKLQkJCWludCBsZW47Ci0KLQkJCWxlbiA9IGFycmF5X3JlZl9sZW4oY3ApOwotCQkJaWYgKGxlbiA9PSAwKQotCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgIm1pc3NpbmcgXSIpOwotCQkJY3AgKz0gbGVuOwotCQl9IGVsc2UgaWYgKGMgPT0gJygnIC8qKSovICkgewotCQkJLyogdG9kbzogYWRkIG1hdGggZnVuY3Rpb25zIChhbGwgdGFrZSBzaW5nbGUgYXJndW1lbnQpOgotCQkJICogYWJzIGFjb3MgYXNpbiBhdGFuIGNvcyBjb3NoIGV4cCBpbnQgbG9nIHNpbiBzaW5oIHNxcnQKLQkJCSAqIHRhbiB0YW5oCi0JCQkgKi8KLQkJCTsKLQkJfQotCQlpZiAoZXMtPm5vYXNzaWduKSB7Ci0JCQllcy0+dmFsID0gdGVtcHZhcigpOwotCQkJZXMtPnZhbC0+ZmxhZyB8PSBFWFBSTFZBTFVFOwotCQl9IGVsc2UgewotCQkJc3RybmR1cHgodHZhciwgZXMtPnRva3AsIGNwIC0gZXMtPnRva3AsIEFURU1QKTsKLQkJCWVzLT52YWwgPSBnbG9iYWwodHZhcik7Ci0JCQlhZnJlZSh0dmFyLCBBVEVNUCk7Ci0JCX0KLQkJZXMtPnRvayA9IFZBUjsKLQl9IGVsc2UgaWYgKGMgPT0gJzEnICYmIGNwWzFdID09ICcjJykgewotCQljcCArPSAyOwotCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKLQkJc3RybmR1cHgodHZhciwgZXMtPnRva3AsIGNwIC0gZXMtPnRva3AsIEFURU1QKTsKLQkJZ290byBwcm9jZXNzX3R2YXI7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgewotCQkrK2NwOwotCQljcCArPSB1dGZfcHRyYWRqKGNwKTsKLQkJaWYgKCpjcCsrICE9ICdcJycpCi0JCQlldmFsZXJyKGVzLCBFVF9TVFIsCi0JCQkgICAgIm11bHRpLWNoYXJhY3RlciBjaGFyYWN0ZXIgY29uc3RhbnQiKTsKLQkJLyogJ3gnIC0+IDEjeCAoeCA9IG9uZSBtdWx0aWJ5dGUgY2hhcmFjdGVyKSAqLwotCQljID0gY3AgLSBlcy0+dG9rcDsKLQkJdHZhciA9IGFsbG9jKGMgKyAvKiBOVUwgKi8gMSwgQVRFTVApOwotCQl0dmFyWzBdID0gJzEnOwotCQl0dmFyWzFdID0gJyMnOwotCQltZW1jcHkodHZhciArIDIsIGVzLT50b2twICsgMSwgYyAtIDIpOwotCQl0dmFyW2NdID0gJ1wwJzsKLQkJZ290byBwcm9jZXNzX3R2YXI7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpKSB7Ci0JCXdoaWxlIChjICE9ICdfJyAmJiAoa3NoX2lzYWxudXgoYykgfHwgYyA9PSAnIycpKQotCQkJYyA9ICpjcCsrOwotCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgLS1jcCAtIGVzLT50b2twLCBBVEVNUCk7Ci0gcHJvY2Vzc190dmFyOgotCQllcy0+dmFsID0gdGVtcHZhcigpOwotCQllcy0+dmFsLT5mbGFnICY9IH5JTlRFR0VSOwotCQllcy0+dmFsLT50eXBlID0gMDsKLQkJZXMtPnZhbC0+dmFsLnMgPSB0dmFyOwotCQlpZiAoc2V0aW50X3YoZXMtPnZhbCwgZXMtPnZhbCwgZXMtPmFyaXRoKSA9PSBOVUxMKQotCQkJZXZhbGVycihlcywgRVRfQkFETElULCB0dmFyKTsKLQkJYWZyZWUodHZhciwgQVRFTVApOwotCQllcy0+dG9rID0gTElUOwotCX0gZWxzZSB7Ci0JCWludCBpLCBuMDsKLQotCQlmb3IgKGkgPSAwOyAobjAgPSBvcGluZm9baV0ubmFtZVswXSk7IGkrKykKLQkJCWlmIChjID09IG4wICYmIHN0cm5jbXAoY3AsIG9waW5mb1tpXS5uYW1lLAotCQkJICAgIChzaXplX3Qpb3BpbmZvW2ldLmxlbikgPT0gMCkgewotCQkJCWVzLT50b2sgPSAoZW51bSB0b2tlbilpOwotCQkJCWNwICs9IG9waW5mb1tpXS5sZW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWlmICghbjApCi0JCQllcy0+dG9rID0gQkFEOwotCX0KLQllcy0+dG9rcCA9IGNwOwotfQotCi0vKiBEbyBhICsrIG9yIC0tIG9wZXJhdGlvbiAqLwotc3RhdGljIHN0cnVjdCB0YmwgKgotZG9fcHBtbShFeHByX3N0YXRlICplcywgZW51bSB0b2tlbiBvcCwgc3RydWN0IHRibCAqdmFzbiwgYm9vbCBpc19wcmVmaXgpCi17Ci0Jc3RydWN0IHRibCAqdmw7Ci0JbWtzaF9hcmlfdCBvdmFsOwotCi0JYXNzaWduX2NoZWNrKGVzLCBvcCwgdmFzbik7Ci0KLQl2bCA9IGludHZhcihlcywgdmFzbik7Ci0Jb3ZhbCA9IHZsLT52YWwuaTsKLQlpZiAob3AgPT0gT19QTFVTUExVUykgewotCQlpZiAoZXMtPm5hdHVyYWwpCi0JCQkrK3ZsLT52YWwudTsKLQkJZWxzZQotCQkJKyt2bC0+dmFsLmk7Ci0JfSBlbHNlIHsKLQkJaWYgKGVzLT5uYXR1cmFsKQotCQkJLS12bC0+dmFsLnU7Ci0JCWVsc2UKLQkJCS0tdmwtPnZhbC5pOwotCX0KLQlpZiAodmFzbi0+ZmxhZyAmIElOVEVHRVIpCi0JCXNldGludF92KHZhc24sIHZsLCBlcy0+YXJpdGgpOwotCWVsc2UKLQkJc2V0aW50KHZhc24sIHZsLT52YWwuaSk7Ci0JaWYgKCFpc19wcmVmaXgpCQkvKiB1bmRvIHRoZSBpbmMvZGVjICovCi0JCXZsLT52YWwuaSA9IG92YWw7Ci0KLQlyZXR1cm4gKHZsKTsKLX0KLQotc3RhdGljIHZvaWQKLWFzc2lnbl9jaGVjayhFeHByX3N0YXRlICplcywgZW51bSB0b2tlbiBvcCwgc3RydWN0IHRibCAqdmFzbikKLXsKLQlpZiAoZXMtPnRvayA9PSBFTkQgfHwKLQkgICAgKHZhc24tPm5hbWVbMF0gPT0gJ1wwJyAmJiAhKHZhc24tPmZsYWcgJiBFWFBSTFZBTFVFKSkpCi0JCWV2YWxlcnIoZXMsIEVUX0xWQUxVRSwgb3BpbmZvWyhpbnQpb3BdLm5hbWUpOwotCWVsc2UgaWYgKHZhc24tPmZsYWcgJiBSRE9OTFkpCi0JCWV2YWxlcnIoZXMsIEVUX1JET05MWSwgb3BpbmZvWyhpbnQpb3BdLm5hbWUpOwotfQotCi1zdGF0aWMgc3RydWN0IHRibCAqCi10ZW1wdmFyKHZvaWQpCi17Ci0Jc3RydWN0IHRibCAqdnA7Ci0KLQl2cCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgdGJsKSwgQVRFTVApOwotCXZwLT5mbGFnID0gSVNTRVR8SU5URUdFUjsKLQl2cC0+dHlwZSA9IDA7Ci0JdnAtPmFyZWFwID0gQVRFTVA7Ci0JdnAtPnVhLmh2YWwgPSAwOwotCXZwLT52YWwuaSA9IDA7Ci0JdnAtPm5hbWVbMF0gPSAnXDAnOwotCXJldHVybiAodnApOwotfQotCi0vKiBjYXN0IChzdHJpbmcpIHZhcmlhYmxlIHRvIHRlbXBvcmFyeSBpbnRlZ2VyIHZhcmlhYmxlICovCi1zdGF0aWMgc3RydWN0IHRibCAqCi1pbnR2YXIoRXhwcl9zdGF0ZSAqZXMsIHN0cnVjdCB0YmwgKnZwKQotewotCXN0cnVjdCB0YmwgKnZxOwotCi0JLyogdHJ5IHRvIGF2b2lkIHJlcGxhY2luZyBhIHRlbXAgdmFyIHdpdGggYW5vdGhlciB0ZW1wIHZhciAqLwotCWlmICh2cC0+bmFtZVswXSA9PSAnXDAnICYmCi0JICAgICh2cC0+ZmxhZyAmIChJU1NFVHxJTlRFR0VSfEVYUFJMVkFMVUUpKSA9PSAoSVNTRVR8SU5URUdFUikpCi0JCXJldHVybiAodnApOwotCi0JdnEgPSB0ZW1wdmFyKCk7Ci0JaWYgKHNldGludF92KHZxLCB2cCwgZXMtPmFyaXRoKSA9PSBOVUxMKSB7Ci0JCWlmICh2cC0+ZmxhZyAmIEVYUFJJTkVWQUwpCi0JCQlldmFsZXJyKGVzLCBFVF9SRUNVUlNJVkUsIHZwLT5uYW1lKTsKLQkJZXMtPmV2YWxpbmcgPSB2cDsKLQkJdnAtPmZsYWcgfD0gRVhQUklORVZBTDsKLQkJdl9ldmFsdWF0ZSh2cSwgc3RyX3ZhbCh2cCksIEtTSF9VTldJTkRfRVJST1IsIGVzLT5hcml0aCk7Ci0JCXZwLT5mbGFnICY9IH5FWFBSSU5FVkFMOwotCQllcy0+ZXZhbGluZyA9IE5VTEw7Ci0JfQotCXJldHVybiAodnEpOwotfQotCi0KLS8qCi0gKiBVVEYtOCBzdXBwb3J0IGNvZGU6IGhpZ2gtbGV2ZWwgZnVuY3Rpb25zCi0gKi8KLQotaW50Ci11dGZfd2lkdGhhZGooY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICoqZHN0KQotewotCXNpemVfdCBsZW47Ci0JdW5zaWduZWQgaW50IHdjOwotCWludCB3aWR0aDsKLQotCWlmICghVVRGTU9ERSB8fCAobGVuID0gdXRmX21idG93Yygmd2MsIHNyYykpID09IChzaXplX3QpLTEgfHwKLQkgICAgd2MgPT0gMCkKLQkJbGVuID0gd2lkdGggPSAxOwotCWVsc2UgaWYgKCh3aWR0aCA9IHV0Zl93Y3dpZHRoKHdjKSkgPCAwKQotCQkvKiBYWFggdXNlIDIgZm9yIHhfem90YzMgaGVyZT8gKi8KLQkJd2lkdGggPSAxOwotCi0JaWYgKGRzdCkKLQkJKmRzdCA9IHNyYyArIGxlbjsKLQlyZXR1cm4gKHdpZHRoKTsKLX0KLQotaW50Ci11dGZfbWJzd2lkdGgoY29uc3QgY2hhciAqcykKLXsKLQlzaXplX3QgbGVuOwotCXVuc2lnbmVkIGludCB3YzsKLQlpbnQgd2lkdGggPSAwLCBjdzsKLQotCWlmICghVVRGTU9ERSkKLQkJcmV0dXJuIChzdHJsZW4ocykpOwotCi0Jd2hpbGUgKCpzKQotCQlpZiAoKChsZW4gPSB1dGZfbWJ0b3djKCZ3YywgcykpID09IChzaXplX3QpLTEpIHx8Ci0JCSAgICAoKGN3ID0gdXRmX3djd2lkdGgod2MpKSA9PSAtMSkpIHsKLQkJCXMrKzsKLQkJCXdpZHRoICs9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlzICs9IGxlbjsKLQkJCXdpZHRoICs9IGN3OwotCQl9Ci0JcmV0dXJuICh3aWR0aCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotdXRmX3NraXBjb2xzKGNvbnN0IGNoYXIgKnAsIGludCBjb2xzKQotewotCWludCBjID0gMDsKLQotCXdoaWxlIChjIDwgY29scykgewotCQlpZiAoISpwKQotCQkJcmV0dXJuIChwICsgY29scyAtIGMpOwotCQljICs9IHV0Zl93aWR0aGFkaihwLCAmcCk7Ci0JfQotCXJldHVybiAocCk7Ci19Ci0KLXNpemVfdAotdXRmX3B0cmFkaihjb25zdCBjaGFyICpzcmMpCi17Ci0JcmVnaXN0ZXIgc2l6ZV90IG47Ci0KLQlpZiAoIVVURk1PREUgfHwKLQkgICAgKihjb25zdCB1bnNpZ25lZCBjaGFyICopKHNyYykgPCAweEMyIHx8Ci0JICAgIChuID0gdXRmX21idG93YyhOVUxMLCBzcmMpKSA9PSAoc2l6ZV90KS0xKQotCQluID0gMTsKLQlyZXR1cm4gKG4pOwotfQotCi0vKgotICogVVRGLTggc3VwcG9ydCBjb2RlOiBsb3ctbGV2ZWwgZnVuY3Rpb25zCi0gKi8KLQotLyogQ0VTVS04IG11bHRpYnl0ZSBhbmQgd2lkZSBjaGFyYWN0ZXIgY29udmVyc2lvbiBjcmFmdGVkIGZvciBta3NoICovCi0KLXNpemVfdAotdXRmX21idG93Yyh1bnNpZ25lZCBpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjKQotewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyYzsKLQl1bnNpZ25lZCBpbnQgYywgd2M7Ci0KLQlpZiAoKHdjID0gKnMrKykgPCAweDgwKSB7Ci0gb3V0OgotCQlpZiAoZHN0ICE9IE5VTEwpCi0JCQkqZHN0ID0gd2M7Ci0JCXJldHVybiAod2MgPyAoKGNvbnN0IGNoYXIgKilzIC0gc3JjKSA6IDApOwotCX0KLQlpZiAod2MgPCAweEMyIHx8IHdjID49IDB4RjApCi0JCS8qIDwgMHhDMDogc3B1cmlvdXMgc2Vjb25kIGJ5dGUgKi8KLQkJLyogPCAweEMyOiBub24tbWluaW1hbGlzdGljIG1hcHBpbmcgZXJyb3IgaW4gMi1ieXRlIHNlcXMgKi8KLQkJLyogPiAweEVGOiBiZXlvbmQgQk1QICovCi0JCWdvdG8gaWxzZXE7Ci0KLQlpZiAod2MgPCAweEUwKSB7Ci0JCXdjID0gKHdjICYgMHgxRikgPDwgNjsKLQkJaWYgKCgoYyA9ICpzKyspICYgMHhDMCkgIT0gMHg4MCkKLQkJCWdvdG8gaWxzZXE7Ci0JCXdjIHw9IGMgJiAweDNGOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3YyA9ICh3YyAmIDB4MEYpIDw8IDEyOwotCi0JaWYgKCgoYyA9ICpzKyspICYgMHhDMCkgIT0gMHg4MCkKLQkJZ290byBpbHNlcTsKLQl3YyB8PSAoYyAmIDB4M0YpIDw8IDY7Ci0KLQlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQotCQlnb3RvIGlsc2VxOwotCXdjIHw9IGMgJiAweDNGOwotCi0JLyogQ2hlY2sgZm9yIG5vbi1taW5pbWFsaXN0aWMgbWFwcGluZyBlcnJvciBpbiAzLWJ5dGUgc2VxcyAqLwotCWlmICh3YyA+PSAweDA4MDAgJiYgd2MgPD0gMHhGRkZEKQotCQlnb3RvIG91dDsKLSBpbHNlcToKLQlyZXR1cm4gKChzaXplX3QpKC0xKSk7Ci19Ci0KLXNpemVfdAotdXRmX3djdG9tYihjaGFyICpkc3QsIHVuc2lnbmVkIGludCB3YykKLXsKLQl1bnNpZ25lZCBjaGFyICpkOwotCi0JaWYgKHdjIDwgMHg4MCkgewotCQkqZHN0ID0gd2M7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JZCA9ICh1bnNpZ25lZCBjaGFyICopZHN0OwotCWlmICh3YyA8IDB4MDgwMCkKLQkJKmQrKyA9ICh3YyA+PiA2KSB8IDB4QzA7Ci0JZWxzZSB7Ci0JCSpkKysgPSAoKHdjID0gd2MgPiAweEZGRkQgPyAweEZGRkQgOiB3YykgPj4gMTIpIHwgMHhFMDsKLQkJKmQrKyA9ICgod2MgPj4gNikgJiAweDNGKSB8IDB4ODA7Ci0JfQotCSpkKysgPSAod2MgJiAweDNGKSB8IDB4ODA7Ci0JcmV0dXJuICgoY2hhciAqKWQgLSBkc3QpOwotfQotCi0KLSNpZm5kZWYgTUtTSF9taXJic2Rfd2N3aWR0aAotLyogLS0tIGJlZ2luIG9mIHdjd2lkdGguYyBleGNlcnB0IC0tLSAqLwotLyotCi0gKiBNYXJrdXMgS3VobiAtLSAyMDA3LTA1LTI2IChVbmljb2RlIDUuMCkKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0gKiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLiBUaGUgYXV0aG9yCi0gKiBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMgd2l0aCByZWdhcmQgdG8gdGhpcyBzb2Z0d2FyZS4KLSAqLwotCi1fX1JDU0lEKCIkbWlyb3M6IHNyYy9saWIvbGliYy9pMThuL3djd2lkdGguYyx2IDEuOCAyMDA4LzA5LzIwIDEyOjAxOjE4IHRnIEV4cCAkIik7Ci0KLWludAotdXRmX3djd2lkdGgodW5zaWduZWQgaW50IGMpCi17Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBjYnNldCB7Ci0JCXVuc2lnbmVkIHNob3J0IGZpcnN0OwotCQl1bnNpZ25lZCBzaG9ydCBsYXN0OwotCX0gY29tYltdID0gewotCQl7IDB4MDMwMCwgMHgwMzZGIH0sIHsgMHgwNDgzLCAweDA0ODYgfSwgeyAweDA0ODgsIDB4MDQ4OSB9LAotCQl7IDB4MDU5MSwgMHgwNUJEIH0sIHsgMHgwNUJGLCAweDA1QkYgfSwgeyAweDA1QzEsIDB4MDVDMiB9LAotCQl7IDB4MDVDNCwgMHgwNUM1IH0sIHsgMHgwNUM3LCAweDA1QzcgfSwgeyAweDA2MDAsIDB4MDYwMyB9LAotCQl7IDB4MDYxMCwgMHgwNjE1IH0sIHsgMHgwNjRCLCAweDA2NUUgfSwgeyAweDA2NzAsIDB4MDY3MCB9LAotCQl7IDB4MDZENiwgMHgwNkU0IH0sIHsgMHgwNkU3LCAweDA2RTggfSwgeyAweDA2RUEsIDB4MDZFRCB9LAotCQl7IDB4MDcwRiwgMHgwNzBGIH0sIHsgMHgwNzExLCAweDA3MTEgfSwgeyAweDA3MzAsIDB4MDc0QSB9LAotCQl7IDB4MDdBNiwgMHgwN0IwIH0sIHsgMHgwN0VCLCAweDA3RjMgfSwgeyAweDA5MDEsIDB4MDkwMiB9LAotCQl7IDB4MDkzQywgMHgwOTNDIH0sIHsgMHgwOTQxLCAweDA5NDggfSwgeyAweDA5NEQsIDB4MDk0RCB9LAotCQl7IDB4MDk1MSwgMHgwOTU0IH0sIHsgMHgwOTYyLCAweDA5NjMgfSwgeyAweDA5ODEsIDB4MDk4MSB9LAotCQl7IDB4MDlCQywgMHgwOUJDIH0sIHsgMHgwOUMxLCAweDA5QzQgfSwgeyAweDA5Q0QsIDB4MDlDRCB9LAotCQl7IDB4MDlFMiwgMHgwOUUzIH0sIHsgMHgwQTAxLCAweDBBMDIgfSwgeyAweDBBM0MsIDB4MEEzQyB9LAotCQl7IDB4MEE0MSwgMHgwQTQyIH0sIHsgMHgwQTQ3LCAweDBBNDggfSwgeyAweDBBNEIsIDB4MEE0RCB9LAotCQl7IDB4MEE3MCwgMHgwQTcxIH0sIHsgMHgwQTgxLCAweDBBODIgfSwgeyAweDBBQkMsIDB4MEFCQyB9LAotCQl7IDB4MEFDMSwgMHgwQUM1IH0sIHsgMHgwQUM3LCAweDBBQzggfSwgeyAweDBBQ0QsIDB4MEFDRCB9LAotCQl7IDB4MEFFMiwgMHgwQUUzIH0sIHsgMHgwQjAxLCAweDBCMDEgfSwgeyAweDBCM0MsIDB4MEIzQyB9LAotCQl7IDB4MEIzRiwgMHgwQjNGIH0sIHsgMHgwQjQxLCAweDBCNDMgfSwgeyAweDBCNEQsIDB4MEI0RCB9LAotCQl7IDB4MEI1NiwgMHgwQjU2IH0sIHsgMHgwQjgyLCAweDBCODIgfSwgeyAweDBCQzAsIDB4MEJDMCB9LAotCQl7IDB4MEJDRCwgMHgwQkNEIH0sIHsgMHgwQzNFLCAweDBDNDAgfSwgeyAweDBDNDYsIDB4MEM0OCB9LAotCQl7IDB4MEM0QSwgMHgwQzREIH0sIHsgMHgwQzU1LCAweDBDNTYgfSwgeyAweDBDQkMsIDB4MENCQyB9LAotCQl7IDB4MENCRiwgMHgwQ0JGIH0sIHsgMHgwQ0M2LCAweDBDQzYgfSwgeyAweDBDQ0MsIDB4MENDRCB9LAotCQl7IDB4MENFMiwgMHgwQ0UzIH0sIHsgMHgwRDQxLCAweDBENDMgfSwgeyAweDBENEQsIDB4MEQ0RCB9LAotCQl7IDB4MERDQSwgMHgwRENBIH0sIHsgMHgwREQyLCAweDBERDQgfSwgeyAweDBERDYsIDB4MERENiB9LAotCQl7IDB4MEUzMSwgMHgwRTMxIH0sIHsgMHgwRTM0LCAweDBFM0EgfSwgeyAweDBFNDcsIDB4MEU0RSB9LAotCQl7IDB4MEVCMSwgMHgwRUIxIH0sIHsgMHgwRUI0LCAweDBFQjkgfSwgeyAweDBFQkIsIDB4MEVCQyB9LAotCQl7IDB4MEVDOCwgMHgwRUNEIH0sIHsgMHgwRjE4LCAweDBGMTkgfSwgeyAweDBGMzUsIDB4MEYzNSB9LAotCQl7IDB4MEYzNywgMHgwRjM3IH0sIHsgMHgwRjM5LCAweDBGMzkgfSwgeyAweDBGNzEsIDB4MEY3RSB9LAotCQl7IDB4MEY4MCwgMHgwRjg0IH0sIHsgMHgwRjg2LCAweDBGODcgfSwgeyAweDBGOTAsIDB4MEY5NyB9LAotCQl7IDB4MEY5OSwgMHgwRkJDIH0sIHsgMHgwRkM2LCAweDBGQzYgfSwgeyAweDEwMkQsIDB4MTAzMCB9LAotCQl7IDB4MTAzMiwgMHgxMDMyIH0sIHsgMHgxMDM2LCAweDEwMzcgfSwgeyAweDEwMzksIDB4MTAzOSB9LAotCQl7IDB4MTA1OCwgMHgxMDU5IH0sIHsgMHgxMTYwLCAweDExRkYgfSwgeyAweDEzNUYsIDB4MTM1RiB9LAotCQl7IDB4MTcxMiwgMHgxNzE0IH0sIHsgMHgxNzMyLCAweDE3MzQgfSwgeyAweDE3NTIsIDB4MTc1MyB9LAotCQl7IDB4MTc3MiwgMHgxNzczIH0sIHsgMHgxN0I0LCAweDE3QjUgfSwgeyAweDE3QjcsIDB4MTdCRCB9LAotCQl7IDB4MTdDNiwgMHgxN0M2IH0sIHsgMHgxN0M5LCAweDE3RDMgfSwgeyAweDE3REQsIDB4MTdERCB9LAotCQl7IDB4MTgwQiwgMHgxODBEIH0sIHsgMHgxOEE5LCAweDE4QTkgfSwgeyAweDE5MjAsIDB4MTkyMiB9LAotCQl7IDB4MTkyNywgMHgxOTI4IH0sIHsgMHgxOTMyLCAweDE5MzIgfSwgeyAweDE5MzksIDB4MTkzQiB9LAotCQl7IDB4MUExNywgMHgxQTE4IH0sIHsgMHgxQjAwLCAweDFCMDMgfSwgeyAweDFCMzQsIDB4MUIzNCB9LAotCQl7IDB4MUIzNiwgMHgxQjNBIH0sIHsgMHgxQjNDLCAweDFCM0MgfSwgeyAweDFCNDIsIDB4MUI0MiB9LAotCQl7IDB4MUI2QiwgMHgxQjczIH0sIHsgMHgxREMwLCAweDFEQ0EgfSwgeyAweDFERkUsIDB4MURGRiB9LAotCQl7IDB4MjAwQiwgMHgyMDBGIH0sIHsgMHgyMDJBLCAweDIwMkUgfSwgeyAweDIwNjAsIDB4MjA2MyB9LAotCQl7IDB4MjA2QSwgMHgyMDZGIH0sIHsgMHgyMEQwLCAweDIwRUYgfSwgeyAweDMwMkEsIDB4MzAyRiB9LAotCQl7IDB4MzA5OSwgMHgzMDlBIH0sIHsgMHhBODA2LCAweEE4MDYgfSwgeyAweEE4MEIsIDB4QTgwQiB9LAotCQl7IDB4QTgyNSwgMHhBODI2IH0sIHsgMHhGQjFFLCAweEZCMUUgfSwgeyAweEZFMDAsIDB4RkUwRiB9LAotCQl7IDB4RkUyMCwgMHhGRTIzIH0sIHsgMHhGRUZGLCAweEZFRkYgfSwgeyAweEZGRjksIDB4RkZGQiB9Ci0JfTsKLQlzaXplX3QgbWluID0gMCwgbWlkLCBtYXggPSBORUxFTShjb21iKSAtIDE7Ci0KLQkvKiB0ZXN0IGZvciA4LWJpdCBjb250cm9sIGNoYXJhY3RlcnMgKi8KLQlpZiAoYyA8IDMyIHx8IChjID49IDB4N2YgJiYgYyA8IDB4YTApKQotCQlyZXR1cm4gKGMgPyAtMSA6IDApOwotCi0JLyogYmluYXJ5IHNlYXJjaCBpbiB0YWJsZSBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzICovCi0JaWYgKGMgPj0gY29tYlswXS5maXJzdCAmJiBjIDw9IGNvbWJbbWF4XS5sYXN0KQotCQl3aGlsZSAobWF4ID49IG1pbikgewotCQkJbWlkID0gKG1pbiArIG1heCkgLyAyOwotCQkJaWYgKGMgPiBjb21iW21pZF0ubGFzdCkKLQkJCQltaW4gPSBtaWQgKyAxOwotCQkJZWxzZSBpZiAoYyA8IGNvbWJbbWlkXS5maXJzdCkKLQkJCQltYXggPSBtaWQgLSAxOwotCQkJZWxzZQotCQkJCXJldHVybiAoMCk7Ci0JCX0KLQotCS8qIGlmIHdlIGFycml2ZSBoZXJlLCBjIGlzIG5vdCBhIGNvbWJpbmluZyBvciBDMC9DMSBjb250cm9sIGNoYXIgKi8KLQlyZXR1cm4gKChjID49IDB4MTEwMCAmJiAoCi0JICAgIGMgPD0gMHgxMTVmIHx8IC8qIEhhbmd1bCBKYW1vIGluaXQuIGNvbnNvbmFudHMgKi8KLQkgICAgYyA9PSAweDIzMjkgfHwgYyA9PSAweDIzMmEgfHwKLQkgICAgKGMgPj0gMHgyZTgwICYmIGMgPD0gMHhhNGNmICYmIGMgIT0gMHgzMDNmKSB8fCAvKiBDSksgLi4uIFlpICovCi0JICAgIChjID49IDB4YWMwMCAmJiBjIDw9IDB4ZDdhMykgfHwgLyogSGFuZ3VsIFN5bGxhYmxlcyAqLwotCSAgICAoYyA+PSAweGY5MDAgJiYgYyA8PSAweGZhZmYpIHx8IC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KLQkgICAgKGMgPj0gMHhmZTEwICYmIGMgPD0gMHhmZTE5KSB8fCAvKiBWZXJ0aWNhbCBmb3JtcyAqLwotCSAgICAoYyA+PSAweGZlMzAgJiYgYyA8PSAweGZlNmYpIHx8IC8qIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCi0JICAgIChjID49IDB4ZmYwMCAmJiBjIDw9IDB4ZmY2MCkgfHwgLyogRnVsbHdpZHRoIEZvcm1zICovCi0JICAgIChjID49IDB4ZmZlMCAmJiBjIDw9IDB4ZmZlNikpKSA/IDIgOiAxKTsKLX0KLS8qIC0tLSBlbmQgb2Ygd2N3aWR0aC5jIGV4Y2VycHQgLS0tICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2Z1bmNzLmMgYi9ta3NoL3NyYy9mdW5jcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDljMDNhLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL2Z1bmNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDI5ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBjX2tzaC5jLHYgMS4zMyAyMDA5LzAyLzA3IDE0OjAzOjI0IGtpbGkgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBjX3NoLmMsdiAxLjQxIDIwMTAvMDMvMjcgMDk6MTA6MDEgam1jIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogY190ZXN0LmMsdiAxLjE4IDIwMDkvMDMvMDEgMjA6MTE6MDYgb3R0byBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IGNfdWxpbWl0LmMsdiAxLjE3IDIwMDgvMDMvMjEgMTI6NTE6MTkgbWlsbGVydCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2Z1bmNzLmMsdiAxLjE1NyAyMDEwLzA4LzI0IDE0OjQyOjAxIHRnIEV4cCAkIik7Ci0KLSNpZiBIQVZFX0tJTExQRwotLyoKLSAqIHVzZSBraWxscGcgaWYgPCAtMSBzaW5jZSAtMSBkb2VzIHNwZWNpYWwgdGhpbmdzCi0gKiBmb3Igc29tZSBub24ta2lsbHBnLWVuZG93ZWQga2lsbHMKLSAqLwotI2RlZmluZSBta3NoX2tpbGwocCxzKQkoKHApIDwgLTEgPyBraWxscGcoLShwKSwgKHMpKSA6IGtpbGwoKHApLCAocykpKQotI2Vsc2UKLS8qIGNyb3NzIGZpbmdlcnMgYW5kIGhvcGUga2lsbCBpcyBraWxscGctZW5kb3dlZCAqLwotI2RlZmluZSBta3NoX2tpbGwJa2lsbAotI2VuZGlmCi0KLS8qIFhYWCBjb25kaXRpb25zIGNvcnJlY3Q/ICovCi0jaWYgIWRlZmluZWQoUkxJTV9JTkZJTklUWSkgJiYgIWRlZmluZWQoTUtTSF9OT19MSU1JVFMpCi0jZGVmaW5lIE1LU0hfTk9fTElNSVRTCi0jZW5kaWYKLQotI2lmZGVmIE1LU0hfTk9fTElNSVRTCi0jZGVmaW5lIGNfdWxpbWl0IGNfbGFiZWwKLSNlbmRpZgotCi1leHRlcm4gdWludDhfdCBzZXRfcmVmZmxhZzsKLQotLyogQSBsZWFkaW5nID0gbWVhbnMgYXNzaWdubWVudHMgYmVmb3JlIGNvbW1hbmQgYXJlIGtlcHQ7Ci0gKiBhIGxlYWRpbmcgKiBtZWFucyBhIFBPU0lYIHNwZWNpYWwgYnVpbHRpbjsKLSAqIGEgbGVhZGluZyArIG1lYW5zIGEgUE9TSVggcmVndWxhciBidWlsdGluCi0gKiAoKiBhbmQgKyBzaG91bGQgbm90IGJlIGNvbWJpbmVkKS4KLSAqLwotY29uc3Qgc3RydWN0IGJ1aWx0aW4gbWtzaGJ1aWx0aW5zW10gPSB7Ci0JeyIqPS4iLCBjX2RvdH0sCi0JeyIqPToiLCBjX2xhYmVsfSwKLQl7IlsiLCBjX3Rlc3R9LAotCXsiKj1icmVhayIsIGNfYnJrY29udH0sCi0JeyI9YnVpbHRpbiIsIGNfYnVpbHRpbn0sCi0JeyIqPWNvbnRpbnVlIiwgY19icmtjb250fSwKLQl7Iio9ZXZhbCIsIGNfZXZhbH0sCi0JeyIqPWV4ZWMiLCBjX2V4ZWN9LAotCXsiKj1leGl0IiwgY19leGl0cmV0dXJufSwKLQl7IitmYWxzZSIsIGNfbGFiZWx9LAotCXsiKj1yZXR1cm4iLCBjX2V4aXRyZXR1cm59LAotCXsiKj1zZXQiLCBjX3NldH0sCi0JeyIqPXNoaWZ0IiwgY19zaGlmdH0sCi0JeyI9dGltZXMiLCBjX3RpbWVzfSwKLQl7Iio9dHJhcCIsIGNfdHJhcH0sCi0JeyIrPXdhaXQiLCBjX3dhaXR9LAotCXsiK3JlYWQiLCBjX3JlYWR9LAotCXsidGVzdCIsIGNfdGVzdH0sCi0JeyIrdHJ1ZSIsIGNfbGFiZWx9LAotCXsidWxpbWl0IiwgY191bGltaXR9LAotCXsiK3VtYXNrIiwgY191bWFza30sCi0JeyIqPXVuc2V0IiwgY191bnNldH0sCi0JeyIrYWxpYXMiLCBjX2FsaWFzfSwJLyogbm8gPTogQVQmVCBtYW51YWwgd3JvbmcgKi8KLQl7IitjZCIsIGNfY2R9LAotCXsiY2hkaXIiLCBjX2NkfSwJLyogZGFzaCBjb21wYXRpYmlsaXR5IGhhY2sgKi8KLQl7Iitjb21tYW5kIiwgY19jb21tYW5kfSwKLQl7ImVjaG8iLCBjX3ByaW50fSwKLQl7Iio9ZXhwb3J0IiwgY190eXBlc2V0fSwKLQl7IitmYyIsIGNfZmN9LAotCXsiK2dldG9wdHMiLCBjX2dldG9wdHN9LAotCXsiK2pvYnMiLCBjX2pvYnN9LAotCXsiK2tpbGwiLCBjX2tpbGx9LAotCXsibGV0IiwgY19sZXR9LAotCXsicHJpbnQiLCBjX3ByaW50fSwKLSNpZmRlZiBNS1NIX1BSSU5URl9CVUlMVElOCi0JeyJwcmludGYiLCBjX3ByaW50Zn0sCi0jZW5kaWYKLQl7InB3ZCIsIGNfcHdkfSwKLQl7Iio9cmVhZG9ubHkiLCBjX3R5cGVzZXR9LAotCXtUX190eXBlc2V0LCBjX3R5cGVzZXR9LAotCXsiK3VuYWxpYXMiLCBjX3VuYWxpYXN9LAotCXsid2hlbmNlIiwgY193aGVuY2V9LAotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQl7IitiZyIsIGNfZmdiZ30sCi0JeyIrZmciLCBjX2ZnYmd9LAotI2VuZGlmCi0JeyJiaW5kIiwgY19iaW5kfSwKLSNpZiBIQVZFX01LTk9ECi0JeyJta25vZCIsIGNfbWtub2R9LAotI2VuZGlmCi0JeyJyZWFscGF0aCIsIGNfcmVhbHBhdGh9LAotCXsicmVuYW1lIiwgY19yZW5hbWV9LAotCXtOVUxMLCAoaW50ICgqKShjb25zdCBjaGFyICoqKSlOVUxMfQotfTsKLQotc3RydWN0IGtpbGxfaW5mbyB7Ci0JaW50IG51bV93aWR0aDsKLQlpbnQgbmFtZV93aWR0aDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdF9vcCB7Ci0JY2hhciBvcF90ZXh0WzRdOwotCVRlc3Rfb3Agb3BfbnVtOwotfSB1X29wc1tdID0gewotCXsiLWEiLAlUT19GSUxBWFNUIH0sCi0JeyItYiIsCVRPX0ZJTEJERVYgfSwKLQl7Ii1jIiwJVE9fRklMQ0RFViB9LAotCXsiLWQiLAlUT19GSUxJRCB9LAotCXsiLWUiLAlUT19GSUxFWFNUIH0sCi0JeyItZiIsCVRPX0ZJTFJFRyB9LAotCXsiLUciLAlUT19GSUxHSUQgfSwKLQl7Ii1nIiwJVE9fRklMU0VURyB9LAotCXsiLWgiLAlUT19GSUxTWU0gfSwKLQl7Ii1IIiwJVE9fRklMQ0RGIH0sCi0JeyItayIsCVRPX0ZJTFNUQ0sgfSwKLQl7Ii1MIiwJVE9fRklMU1lNIH0sCi0JeyItbiIsCVRPX1NUTlpFIH0sCi0JeyItTyIsCVRPX0ZJTFVJRCB9LAotCXsiLW8iLAlUT19PUFRJT04gfSwKLQl7Ii1wIiwJVE9fRklMRklGTyB9LAotCXsiLXIiLAlUT19GSUxSRCB9LAotCXsiLXMiLAlUT19GSUxHWiB9LAotCXsiLVMiLAlUT19GSUxTT0NLIH0sCi0JeyItdCIsCVRPX0ZJTFRUIH0sCi0JeyItdSIsCVRPX0ZJTFNFVFUgfSwKLQl7Ii13IiwJVE9fRklMV1IgfSwKLQl7Ii14IiwJVE9fRklMRVggfSwKLQl7Ii16IiwJVE9fU1RaRVIgfSwKLQl7IiIsCVRPX05PTk9QIH0KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHRfb3AgYl9vcHNbXSA9IHsKLQl7Ij0iLAlUT19TVEVRTCB9LAotCXsiPT0iLAlUT19TVEVRTCB9LAotCXsiIT0iLAlUT19TVE5FUSB9LAotCXsiPCIsCVRPX1NUTFQgfSwKLQl7Ij4iLAlUT19TVEdUIH0sCi0JeyItZXEiLAlUT19JTlRFUSB9LAotCXsiLW5lIiwJVE9fSU5UTkUgfSwKLQl7Ii1ndCIsCVRPX0lOVEdUIH0sCi0JeyItZ2UiLAlUT19JTlRHRSB9LAotCXsiLWx0IiwJVE9fSU5UTFQgfSwKLQl7Ii1sZSIsCVRPX0lOVExFIH0sCi0JeyItZWYiLAlUT19GSUxFUSB9LAotCXsiLW50IiwJVE9fRklMTlQgfSwKLQl7Ii1vdCIsCVRPX0ZJTE9UIH0sCi0JeyIiLAlUT19OT05PUCB9Ci19OwotCi1zdGF0aWMgaW50IHRlc3RfZWFjY2Vzcyhjb25zdCBjaGFyICosIGludCk7Ci1zdGF0aWMgaW50IHRlc3Rfb2V4cHIoVGVzdF9lbnYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IHRlc3RfYWV4cHIoVGVzdF9lbnYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IHRlc3RfbmV4cHIoVGVzdF9lbnYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IHRlc3RfcHJpbWFyeShUZXN0X2VudiAqLCBib29sKTsKLXN0YXRpYyBUZXN0X29wIHB0ZXN0X2lzYShUZXN0X2VudiAqLCBUZXN0X21ldGEpOwotc3RhdGljIGNvbnN0IGNoYXIgKnB0ZXN0X2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7Ci1zdGF0aWMgdm9pZCBwdGVzdF9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgY2hhciAqa2lsbF9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKLXN0YXRpYyB2b2lkIHBfdGltZShzdHJ1Y3Qgc2hmICosIGJvb2wsIGxvbmcsIGludCwgaW50LAotICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKQotICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICg2LCA3KSkpOwotc3RhdGljIGNoYXIgKmRvX3JlYWxwYXRoKGNvbnN0IGNoYXIgKik7Ci0KLXN0YXRpYyBjaGFyICoKLWRvX3JlYWxwYXRoKGNvbnN0IGNoYXIgKnVwYXRoKQotewotCWNoYXIgKnhwLCAqaXAsICp0cCwgKmlwYXRoLCAqbGRlc3QgPSBOVUxMOwotCVhTdHJpbmcgeHM7Ci0JcHRyZGlmZl90IHBvczsKLQlzaXplX3QgbGVuOwotCWludCBzeW1saW5rcyA9IDMyOwkvKiBtYXguIHJlY3Vyc2lvbiBkZXB0aCAqLwotCWludCBsbGVuOwotCXN0cnVjdCBzdGF0IHNiOwotI2lmZGVmIE5PX1BBVEhfTUFYCi0Jc2l6ZV90IGxkZXN0bGVuID0gMDsKLSNkZWZpbmUgcGF0aGxlbiBzYi5zdF9zaXplCi0jZGVmaW5lIHBhdGhjbmQgKGxkZXN0bGVuIDwgKHBhdGhsZW4gKyAxKSkKLSNlbHNlCi0jZGVmaW5lIHBhdGhsZW4gUEFUSF9NQVgKLSNkZWZpbmUgcGF0aGNuZCAoIWxkZXN0KQotI2VuZGlmCi0KLQlpZiAodXBhdGhbMF0gPT0gJy8nKSB7Ci0JCS8qIHVwYXRoIGlzIGFuIGFic29sdXRlIHBhdGhuYW1lICovCi0JCXN0cmR1cHgoaXBhdGgsIHVwYXRoLCBBVEVNUCk7Ci0JfSBlbHNlIHsKLQkJLyogdXBhdGggaXMgYSByZWxhdGl2ZSBwYXRobmFtZSwgcHJlcGVuZCBjd2QgKi8KLQkJaWYgKCh0cCA9IGtzaF9nZXRfd2QoTlVMTCkpID09IE5VTEwgfHwgdHBbMF0gIT0gJy8nKQotCQkJcmV0dXJuIChOVUxMKTsKLQkJaXBhdGggPSBzaGZfc21wcmludGYoIiVzLyVzIiwgdHAsIHVwYXRoKTsKLQkJYWZyZWUodHAsIEFURU1QKTsKLQl9Ci0KLQlYaW5pdCh4cywgeHAsIHN0cmxlbihpcCA9IGlwYXRoKSArIDEsIEFURU1QKTsKLQotCXdoaWxlICgqaXApIHsKLQkJLyogc2tpcCBzbGFzaGVzIGluIGlucHV0ICovCi0JCXdoaWxlICgqaXAgPT0gJy8nKQotCQkJKytpcDsKLQkJaWYgKCEqaXApCi0JCQlicmVhazsKLQotCQkvKiBnZXQgbmV4dCBwYXRobmFtZSBjb21wb25lbnQgZnJvbSBpbnB1dCAqLwotCQl0cCA9IGlwOwotCQl3aGlsZSAoKmlwICYmICppcCAhPSAnLycpCi0JCQkrK2lwOwotCQlsZW4gPSBpcCAtIHRwOwotCi0JCS8qIGNoZWNrIGlucHV0IGZvciAiLiIgYW5kICIuLiIgKi8KLQkJaWYgKHRwWzBdID09ICcuJykgewotCQkJaWYgKGxlbiA9PSAxKQotCQkJCS8qIGp1c3QgY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUgKi8KLQkJCQljb250aW51ZTsKLQkJCWVsc2UgaWYgKGxlbiA9PSAyICYmIHRwWzFdID09ICcuJykgewotCQkJCS8qIHN0cmlwIG9mZiBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCAqLwotCQkJCXdoaWxlICh4cCA+IFhzdHJpbmcoeHMsIHhwKSkKLQkJCQkJaWYgKCotLXhwID09ICcvJykKLQkJCQkJCWJyZWFrOwotCQkJCS8qIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUgKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCS8qIHN0b3JlIG91dHB1dCBwb3NpdGlvbiBhd2F5LCB0aGVuIGFwcGVuZCBzbGFzaCB0byBvdXRwdXQgKi8KLQkJcG9zID0gWHNhdmVwb3MoeHMsIHhwKTsKLQkJLyogMSBmb3IgdGhlICcvJyBhbmQgbGVuICsgMSBmb3IgdHAgYW5kIHRoZSBOVUwgZnJvbSBiZWxvdyAqLwotCQlYY2hlY2tOKHhzLCB4cCwgMSArIGxlbiArIDEpOwotCQlYcHV0KHhzLCB4cCwgJy8nKTsKLQotCQkvKiBhcHBlbmQgbmV4dCBwYXRobmFtZSBjb21wb25lbnQgdG8gb3V0cHV0ICovCi0JCW1lbWNweSh4cCwgdHAsIGxlbik7Ci0JCXhwICs9IGxlbjsKLQkJKnhwID0gJ1wwJzsKLQotCQkvKiBsc3RhdCB0aGUgY3VycmVudCBvdXRwdXQsIHNlZSBpZiBpdCdzIGEgc3ltbGluayAqLwotCQlpZiAobHN0YXQoWHN0cmluZyh4cywgeHApLCAmc2IpKSB7Ci0JCQkvKiBsc3RhdCBmYWlsZWQgKi8KLQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKLQkJCQkvKiBiZWNhdXNlIHRoZSBwYXRobmFtZSBkb2VzIG5vdCBleGlzdCAqLwotCQkJCXdoaWxlICgqaXAgPT0gJy8nKQotCQkJCQkvKiBza2lwIGFueSB0cmFpbGluZyBzbGFzaGVzICovCi0JCQkJCSsraXA7Ci0JCQkJLyogbm8gbW9yZSBjb21wb25lbnRzIGxlZnQ/ICovCi0JCQkJaWYgKCEqaXApCi0JCQkJCS8qIHdlIGNhbiBzdGlsbCByZXR1cm4gc3VjY2Vzc2Z1bGx5ICovCi0JCQkJCWJyZWFrOwotCQkJCS8qIG1vcmUgY29tcG9uZW50cyBsZWZ0PyBmYWxsIHRocm91Z2ggKi8KLQkJCX0KLQkJCS8qIG5vdCBFTk9FTlQgb3Igbm90IGF0IHRoZSBlbmQgb2YgaXBhdGggKi8KLQkJCWdvdG8gbm90Zm91bmQ7Ci0JCX0KLQotCQkvKiBjaGVjayBpZiB3ZSBlbmNvdW50ZXJlZCBhIHN5bWxpbms/ICovCi0JCWlmIChTX0lTTE5LKHNiLnN0X21vZGUpKSB7Ci0JCQkvKiByZWFjaGVkIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoPyAqLwotCQkJaWYgKCFzeW1saW5rcy0tKSB7Ci0JCQkJLyogeWVwLCBwcmV2ZW50IGluZmluaXRlIGxvb3BzICovCi0JCQkJZXJybm8gPSBFTE9PUDsKLQkJCQlnb3RvIG5vdGZvdW5kOwotCQkJfQotCi0JCQkvKiBnZXQgc3ltbGluayg3KSB0YXJnZXQgKi8KLQkJCWlmIChwYXRoY25kKQotCQkJCWxkZXN0ID0gYXJlc2l6ZShsZGVzdCwgcGF0aGxlbiArIDEsIEFURU1QKTsKLQkJCWxsZW4gPSByZWFkbGluayhYc3RyaW5nKHhzLCB4cCksIGxkZXN0LCBwYXRobGVuKTsKLQkJCWlmIChsbGVuIDwgMCkKLQkJCQkvKiBvb3BzLi4uICovCi0JCQkJZ290byBub3Rmb3VuZDsKLQkJCWxkZXN0W2xsZW5dID0gJ1wwJzsKLQotCQkJLyoKLQkJCSAqIHJlc3RhcnQgaWYgc3ltbGluayB0YXJnZXQgaXMgYW4gYWJzb2x1dGUgcGF0aCwKLQkJCSAqIG90aGVyd2lzZSBjb250aW51ZSB3aXRoIGN1cnJlbnRseSByZXNvbHZlZCBwcmVmaXgKLQkJCSAqLwotCQkJeHAgPSAobGRlc3RbMF0gPT0gJy8nKSA/IFhzdHJpbmcoeHMsIHhwKSA6Ci0JCQkgICAgWHJlc3Rwb3MoeHMsIHhwLCBwb3MpOwotCQkJdHAgPSBzaGZfc21wcmludGYoIiVzJXMlcyIsIGxkZXN0LCAqaXAgPyAiLyIgOiAiIiwgaXApOwotCQkJYWZyZWUoaXBhdGgsIEFURU1QKTsKLQkJCWlwID0gaXBhdGggPSB0cDsKLQkJfQotCQkvKiBvdGhlcndpc2UgKG5vIHN5bWxpbmspIG1lcmVseSBnbyBvbiAqLwotCX0KLQotCS8qCi0JICogZWl0aGVyIGZvdW5kIHRoZSB0YXJnZXQgYW5kIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpdCwKLQkgKiBvciBmb3VuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBhbmQgbWF5IGNyZWF0ZSBpdAotCSAqLwotCWlmIChYbGVuZ3RoKHhzLCB4cCkgPT0gMCkKLQkJLyoKLQkJICogaWYgdGhlIHJlc29sdmVkIHBhdGhuYW1lIGlzICIiLCBtYWtlIGl0ICIvIiwKLQkJICogb3RoZXJ3aXNlIGRvIG5vdCBhZGQgYSB0cmFpbGluZyBzbGFzaAotCQkgKi8KLQkJWHB1dCh4cywgeHAsICcvJyk7Ci0JWHB1dCh4cywgeHAsICdcMCcpOwotCi0JLyoKLQkgKiBpZiBzb3VyY2UgcGF0aCBoYWQgYSB0cmFpbGluZyBzbGFzaCwgY2hlY2sgaWYgdGFyZ2V0IHBhdGgKLQkgKiBpcyBub3QgYSBub24tZGlyZWN0b3J5IGV4aXN0aW5nIGZpbGUKLQkgKi8KLQlpZiAoaXAgPiBpcGF0aCAmJiBpcFstMV0gPT0gJy8nKSB7Ci0JCWlmIChzdGF0KFhzdHJpbmcoeHMsIHhwKSwgJnNiKSkgewotCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKLQkJCQlnb3RvIG5vdGZvdW5kOwotCQl9IGVsc2UgaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0JCQllcnJubyA9IEVOT1RESVI7Ci0JCQlnb3RvIG5vdGZvdW5kOwotCQl9Ci0JCS8qIHRhcmdldCBub3cgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIGEgZGlyZWN0b3J5ICovCi0JfQotCi0JLyogcmV0dXJuIHRhcmdldCBwYXRoICovCi0JaWYgKGxkZXN0ICE9IE5VTEwpCi0JCWFmcmVlKGxkZXN0LCBBVEVNUCk7Ci0JYWZyZWUoaXBhdGgsIEFURU1QKTsKLQlyZXR1cm4gKFhjbG9zZSh4cywgeHApKTsKLQotIG5vdGZvdW5kOgotCWxsZW4gPSBlcnJubzsJLyogc2F2ZTsgZnJlZSgzKSBtaWdodCB0cmFzaCBpdCAqLwotCWlmIChsZGVzdCAhPSBOVUxMKQotCQlhZnJlZShsZGVzdCwgQVRFTVApOwotCWFmcmVlKGlwYXRoLCBBVEVNUCk7Ci0JWGZyZWUoeHMsIHhwKTsKLQllcnJubyA9IGxsZW47Ci0JcmV0dXJuIChOVUxMKTsKLQotI3VuZGVmIHBhdGhsZW4KLSN1bmRlZiBwYXRoY25kCi19Ci0KLWludAotY19jZChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IG9wdGMsIHJ2LCBwaHlzX3BhdGg7Ci0JYm9vbCBwaHlzaWNhbCA9IEZsYWcoRlBIWVNJQ0FMKSA/IHRydWUgOiBmYWxzZTsKLQlpbnQgY2Rub2RlOwkJCS8qIHdhcyBhIG5vZGUgZnJvbSBjZHBhdGggYWRkZWQgaW4/ICovCi0JYm9vbCBwcmludHBhdGggPSBmYWxzZTsJCS8qIHByaW50IHdoZXJlIHdlIGNkJ2Q/ICovCi0Jc3RydWN0IHRibCAqcHdkX3MsICpvbGRwd2RfczsKLQlYU3RyaW5nIHhzOwotCWNoYXIgKmRpciwgKmFsbG9jZCA9IE5VTEwsICp0cnlwLCAqcHdkLCAqY2RwYXRoOwotCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiTFAiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdMJzoKLQkJCXBoeXNpY2FsID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSAnUCc6Ci0JCQlwaHlzaWNhbCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JaWYgKEZsYWcoRlJFU1RSSUNURUQpKSB7Ci0JCWJpX2Vycm9yZigicmVzdHJpY3RlZCBzaGVsbCAtIGNhbid0IGNkIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JcHdkX3MgPSBnbG9iYWwoIlBXRCIpOwotCW9sZHB3ZF9zID0gZ2xvYmFsKCJPTERQV0QiKTsKLQotCWlmICghd3BbMF0pIHsKLQkJLyogTm8gYXJndW1lbnRzIC0gZ28gaG9tZSAqLwotCQlpZiAoKGRpciA9IHN0cl92YWwoZ2xvYmFsKCJIT01FIikpKSA9PSBudWxsKSB7Ci0JCQliaV9lcnJvcmYoIm5vIGhvbWUgZGlyZWN0b3J5IChIT01FIG5vdCBzZXQpIik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfSBlbHNlIGlmICghd3BbMV0pIHsKLQkJLyogT25lIGFyZ3VtZW50OiAtIG9yIGRpciAqLwotCQlzdHJkdXB4KGFsbG9jZCwgd3BbMF0sIEFURU1QKTsKLQkJaWYgKGtzaF9pc2Rhc2goKGRpciA9IGFsbG9jZCkpKSB7Ci0JCQlhZnJlZShhbGxvY2QsIEFURU1QKTsKLQkJCWFsbG9jZCA9IE5VTEw7Ci0JCQlkaXIgPSBzdHJfdmFsKG9sZHB3ZF9zKTsKLQkJCWlmIChkaXIgPT0gbnVsbCkgewotCQkJCWJpX2Vycm9yZigibm8gT0xEUFdEIik7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCXByaW50cGF0aCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgaWYgKCF3cFsyXSkgewotCQkvKiBUd28gYXJndW1lbnRzIC0gc3Vic3RpdHV0ZSBhcmcxIGluIFBXRCBmb3IgYXJnMiAqLwotCQlpbnQgaWxlbiwgb2xlbiwgbmxlbiwgZWxlbjsKLQkJY2hhciAqY3A7Ci0KLQkJaWYgKCFjdXJyZW50X3dkWzBdKSB7Ci0JCQliaV9lcnJvcmYoImRvbid0IGtub3cgY3VycmVudCBkaXJlY3RvcnkiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJLyogc3Vic3RpdHV0ZSBhcmcxIGZvciBhcmcyIGluIGN1cnJlbnQgcGF0aC4KLQkJICogaWYgdGhlIGZpcnN0IHN1YnN0aXR1dGlvbiBmYWlscyBiZWNhdXNlIHRoZSBjZCBmYWlscwotCQkgKiB3ZSBjb3VsZCB0cnkgdG8gZmluZCBhbm90aGVyIHN1YnN0aXR1dGlvbi4gRm9yIG5vdwotCQkgKiB3ZSBkb24ndAotCQkgKi8KLQkJaWYgKChjcCA9IHN0cnN0cihjdXJyZW50X3dkLCB3cFswXSkpID09IE5VTEwpIHsKLQkJCWJpX2Vycm9yZigiYmFkIHN1YnN0aXR1dGlvbiIpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlpbGVuID0gY3AgLSBjdXJyZW50X3dkOwotCQlvbGVuID0gc3RybGVuKHdwWzBdKTsKLQkJbmxlbiA9IHN0cmxlbih3cFsxXSk7Ci0JCWVsZW4gPSBzdHJsZW4oY3VycmVudF93ZCArIGlsZW4gKyBvbGVuKSArIDE7Ci0JCWRpciA9IGFsbG9jZCA9IGFsbG9jKGlsZW4gKyBubGVuICsgZWxlbiwgQVRFTVApOwotCQltZW1jcHkoZGlyLCBjdXJyZW50X3dkLCBpbGVuKTsKLQkJbWVtY3B5KGRpciArIGlsZW4sIHdwWzFdLCBubGVuKTsKLQkJbWVtY3B5KGRpciArIGlsZW4gKyBubGVuLCBjdXJyZW50X3dkICsgaWxlbiArIG9sZW4sIGVsZW4pOwotCQlwcmludHBhdGggPSB0cnVlOwotCX0gZWxzZSB7Ci0JCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0jaWZkZWYgTk9fUEFUSF9NQVgKLQkvKiBvbmx5IGEgZmlyc3QgZ3Vlc3M7IG1ha2VfcGF0aCB3aWxsIGVubGFyZ2UgeHMgaWYgbmVjZXNzYXJ5ICovCi0JWGluaXROKHhzLCAxMDI0LCBBVEVNUCk7Ci0jZWxzZQotCVhpbml0Tih4cywgUEFUSF9NQVgsIEFURU1QKTsKLSNlbmRpZgotCi0JY2RwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkNEUEFUSCIpKTsKLQlkbyB7Ci0JCWNkbm9kZSA9IG1ha2VfcGF0aChjdXJyZW50X3dkLCBkaXIsICZjZHBhdGgsICZ4cywgJnBoeXNfcGF0aCk7Ci0JCWlmIChwaHlzaWNhbCkKLQkJCXJ2ID0gY2hkaXIodHJ5cCA9IFhzdHJpbmcoeHMsIHhwKSArIHBoeXNfcGF0aCk7Ci0JCWVsc2UgewotCQkJc2ltcGxpZnlfcGF0aChYc3RyaW5nKHhzLCB4cCkpOwotCQkJcnYgPSBjaGRpcih0cnlwID0gWHN0cmluZyh4cywgeHApKTsKLQkJfQotCX0gd2hpbGUgKHJ2IDwgMCAmJiBjZHBhdGggIT0gTlVMTCk7Ci0KLQlpZiAocnYgPCAwKSB7Ci0JCWlmIChjZG5vZGUpCi0JCQliaV9lcnJvcmYoIiVzOiBiYWQgZGlyZWN0b3J5IiwgZGlyKTsKLQkJZWxzZQotCQkJYmlfZXJyb3JmKCIlcyAtICVzIiwgdHJ5cCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJYWZyZWUoYWxsb2NkLCBBVEVNUCk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JLyogYWxsb2NkIChhYm92ZSkgPT4gZGlyLCB3aGljaCBpcyBubyBsb25nZXIgdXNlZCAqLwotCWFmcmVlKGFsbG9jZCwgQVRFTVApOwotCWFsbG9jZCA9IE5VTEw7Ci0KLQkvKiBDbGVhciBvdXQgdHJhY2tlZCBhbGlhc2VzIHdpdGggcmVsYXRpdmUgcGF0aHMgKi8KLQlmbHVzaGNvbSgwKTsKLQotCS8qIFNldCBPTERQV0QgKG5vdGU6IHVuc2V0dGluZyBPTERQV0QgZG9lcyBub3QgZGlzYWJsZSB0aGlzCi0JICogc2V0dGluZyBpbiBBVCZUIGtzaCkKLQkgKi8KLQlpZiAoY3VycmVudF93ZFswXSkKLQkJLyogSWdub3JlIGZhaWx1cmUgKGhhcHBlbnMgaWYgcmVhZG9ubHkgb3IgaW50ZWdlcikgKi8KLQkJc2V0c3RyKG9sZHB3ZF9zLCBjdXJyZW50X3dkLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQotCWlmIChYc3RyaW5nKHhzLCB4cClbMF0gIT0gJy8nKSB7Ci0JCXB3ZCA9IE5VTEw7Ci0JfSBlbHNlIGlmICghcGh5c2ljYWwgfHwgIShwd2QgPSBhbGxvY2QgPSBkb19yZWFscGF0aChYc3RyaW5nKHhzLCB4cCkpKSkKLQkJcHdkID0gWHN0cmluZyh4cywgeHApOwotCi0JLyogU2V0IFBXRCAqLwotCWlmIChwd2QpIHsKLQkJY2hhciAqcHRtcCA9IHB3ZDsKLQotCQlzZXRfY3VycmVudF93ZChwdG1wKTsKLQkJLyogSWdub3JlIGZhaWx1cmUgKGhhcHBlbnMgaWYgcmVhZG9ubHkgb3IgaW50ZWdlcikgKi8KLQkJc2V0c3RyKHB3ZF9zLCBwdG1wLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQl9IGVsc2UgewotCQlzZXRfY3VycmVudF93ZChudWxsKTsKLQkJcHdkID0gWHN0cmluZyh4cywgeHApOwotCQkvKiBYWFggdW5zZXQgJFBXRD8gKi8KLQl9Ci0JaWYgKHByaW50cGF0aCB8fCBjZG5vZGUpCi0JCXNocHJpbnRmKCIlc1xuIiwgcHdkKTsKLQotCWFmcmVlKGFsbG9jZCwgQVRFTVApOwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotY19wd2QoY29uc3QgY2hhciAqKndwKQotewotCWludCBvcHRjOwotCWJvb2wgcGh5c2ljYWwgPSBGbGFnKEZQSFlTSUNBTCkgPyB0cnVlIDogZmFsc2U7Ci0JY2hhciAqcCwgKmFsbG9jZCA9IE5VTEw7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJMUCIpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ0wnOgotCQkJcGh5c2ljYWwgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlICdQJzoKLQkJCXBoeXNpY2FsID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlpZiAod3BbMF0pIHsKLQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JcCA9IGN1cnJlbnRfd2RbMF0gPyAocGh5c2ljYWwgPyBhbGxvY2QgPSBkb19yZWFscGF0aChjdXJyZW50X3dkKSA6Ci0JICAgIGN1cnJlbnRfd2QpIDogTlVMTDsKLQlpZiAocCAmJiBhY2Nlc3MocCwgUl9PSykgPCAwKQotCQlwID0gTlVMTDsKLQlpZiAoIXAgJiYgIShwID0gYWxsb2NkID0ga3NoX2dldF93ZChOVUxMKSkpIHsKLQkJYmlfZXJyb3JmKCJjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCXNocHJpbnRmKCIlc1xuIiwgcCk7Ci0JYWZyZWUoYWxsb2NkLCBBVEVNUCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNfcHRyOwotc3RhdGljIGludCBzX2dldCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNfcHV0KGludCk7Ci0KLWludAotY19wcmludChjb25zdCBjaGFyICoqd3ApCi17Ci0jZGVmaW5lIFBPX05MCQlCSVQoMCkJLyogcHJpbnQgbmV3bGluZSAqLwotI2RlZmluZSBQT19FWFBBTkQJQklUKDEpCS8qIGV4cGFuZCBiYWNrc2xhc2ggc2VxdWVuY2VzICovCi0jZGVmaW5lIFBPX1BNSU5VU01JTlVTCUJJVCgyKQkvKiBwcmludCBhIC0tIGFyZ3VtZW50ICovCi0jZGVmaW5lIFBPX0hJU1QJCUJJVCgzKQkvKiBwcmludCB0byBoaXN0b3J5IGluc3RlYWQgb2Ygc3Rkb3V0ICovCi0jZGVmaW5lIFBPX0NPUFJPQwlCSVQoNCkJLyogcHJpbnRpbmcgdG8gY29wcm9jZXNzOiBibG9jayBTSUdQSVBFICovCi0JaW50IGZkID0gMSwgYzsKLQlpbnQgZmxhZ3MgPSBQT19FWFBBTkR8UE9fTkw7Ci0JY29uc3QgY2hhciAqcywgKmVtc2c7Ci0JWFN0cmluZyB4czsKLQljaGFyICp4cDsKLQotCWlmICh3cFswXVswXSA9PSAnZScpIHsKLQkJLyogZWNobyBidWlsdGluICovCi0JCXdwKys7Ci0JCWlmIChGbGFnKEZQT1NJWCkgfHwgRmxhZyhGU0gpKSB7Ci0JCQkvKiBEZWJpYW4gUG9saWN5IDEwLjQgY29tcGxpYW50ICJlY2hvIiBidWlsdGluICovCi0JCQlpZiAoKndwICYmICFzdHJjbXAoKndwLCAiLW4iKSkgewotCQkJCS8qIHdlIHJlY29nbmlzZSAiLW4iIG9ubHkgYXMgdGhlIGZpcnN0IGFyZyAqLwotCQkJCWZsYWdzID0gMDsKLQkJCQl3cCsrOwotCQkJfSBlbHNlCi0JCQkJLyogb3RoZXJ3aXNlLCB3ZSBwcmludCBldmVyeXRoaW5nIGFzLWlzICovCi0JCQkJZmxhZ3MgPSBQT19OTDsKLQkJfSBlbHNlIHsKLQkJCWludCBuZmxhZ3MgPSBmbGFnczsKLQotCQkJLyoqCi0JCQkgKiBhIGNvbXByb21pc2UgYmV0d2VlbiBzeXNWIGFuZCBCU0QgZWNobyBjb21tYW5kczoKLQkJCSAqIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kIC1uLAotCQkJICogLWUgYW5kIC1FIGFyZSByZWNvZ25pc2VkIGlmIHRoZXkgYXBwZWFyIGluIGFyZ3UtCi0JCQkgKiBtZW50cyB3aXRoIG5vIGlsbGVnYWwgb3B0aW9ucyAoaWUsIGVjaG8gLW5xIHdpbGwKLQkJCSAqIHByaW50IC1ucSkuCi0JCQkgKiBEaWZmZXJlbnQgZnJvbSBzeXNWIGVjaG8gc2luY2Ugb3B0aW9ucyBhcmUgcmVjby0KLQkJCSAqIGduaXNlZCwgZGlmZmVyZW50IGZyb20gQlNEIGVjaG8gc2luY2UgZXNjYXBlIHNlLQotCQkJICogcXVlbmNlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotCQkJICovCi0KLQkJCXdoaWxlICgocyA9ICp3cCkgJiYgKnMgPT0gJy0nICYmIHNbMV0pIHsKLQkJCQl3aGlsZSAoKisrcykKLQkJCQkJaWYgKCpzID09ICduJykKLQkJCQkJCW5mbGFncyAmPSB+UE9fTkw7Ci0JCQkJCWVsc2UgaWYgKCpzID09ICdlJykKLQkJCQkJCW5mbGFncyB8PSBQT19FWFBBTkQ7Ci0JCQkJCWVsc2UgaWYgKCpzID09ICdFJykKLQkJCQkJCW5mbGFncyAmPSB+UE9fRVhQQU5EOwotCQkJCQllbHNlCi0JCQkJCQkvKgotCQkJCQkJICogYmFkIG9wdGlvbjogZG9uJ3QgdXNlCi0JCQkJCQkgKiBuZmxhZ3MsIHByaW50IGFyZ3VtZW50Ci0JCQkJCQkgKi8KLQkJCQkJCWJyZWFrOwotCi0JCQkJaWYgKCpzKQotCQkJCQlicmVhazsKLQkJCQl3cCsrOwotCQkJCWZsYWdzID0gbmZsYWdzOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IG9wdGM7Ci0JCWNvbnN0IGNoYXIgKm9wdHMgPSAiUm5wcnN1LCI7Ci0KLQkJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpCi0JCQlzd2l0Y2ggKG9wdGMpIHsKLQkJCWNhc2UgJ1InOiAvKiBmYWtlIEJTRCBlY2hvIGNvbW1hbmQgKi8KLQkJCQlmbGFncyB8PSBQT19QTUlOVVNNSU5VUzsKLQkJCQlmbGFncyAmPSB+UE9fRVhQQU5EOwotCQkJCW9wdHMgPSAibmUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZSc6Ci0JCQkJZmxhZ3MgfD0gUE9fRVhQQU5EOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnbic6Ci0JCQkJZmxhZ3MgJj0gflBPX05MOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncCc6Ci0JCQkJaWYgKChmZCA9IGNvcHJvY19nZXRmZChXX09LLCAmZW1zZykpIDwgMCkgewotCQkJCQliaV9lcnJvcmYoIi1wOiAlcyIsIGVtc2cpOwotCQkJCQlyZXR1cm4gKDEpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJ3InOgotCQkJCWZsYWdzICY9IH5QT19FWFBBTkQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlmbGFncyB8PSBQT19ISVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndSc6Ci0JCQkJaWYgKCEqKHMgPSBidWlsdGluX29wdC5vcHRhcmcpKQotCQkJCQlmZCA9IDA7Ci0JCQkJZWxzZSBpZiAoKGZkID0gY2hlY2tfZmQocywgV19PSywgJmVtc2cpKSA8IDApIHsKLQkJCQkJYmlfZXJyb3JmKCItdTogJXM6ICVzIiwgcywgZW1zZyk7Ci0JCQkJCXJldHVybiAoMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQotCQlpZiAoIShidWlsdGluX29wdC5pbmZvICYgR0lfTUlOVVNNSU5VUykpIHsKLQkJCS8qIHRyZWF0IGEgbG9uZSAtIGxpa2UgLS0gKi8KLQkJCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdICYmCi0JCQkgICAga3NoX2lzZGFzaCh3cFtidWlsdGluX29wdC5vcHRpbmRdKSkKLQkJCQlidWlsdGluX29wdC5vcHRpbmQrKzsKLQkJfSBlbHNlIGlmIChmbGFncyAmIFBPX1BNSU5VU01JTlVTKQotCQkJYnVpbHRpbl9vcHQub3B0aW5kLS07Ci0JCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQl9Ci0KLQlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOwotCi0Jd2hpbGUgKCp3cCAhPSBOVUxMKSB7Ci0JCXMgPSAqd3A7Ci0JCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKLQkJCVhjaGVjayh4cywgeHApOwotCQkJaWYgKChmbGFncyAmIFBPX0VYUEFORCkgJiYgYyA9PSAnXFwnKSB7Ci0JCQkJc19wdHIgPSBzOwotCQkJCWMgPSB1bmJrc2woZmFsc2UsIHNfZ2V0LCBzX3B1dCk7Ci0JCQkJcyA9IHNfcHRyOwotCQkJCWlmIChjID09IC0xKSB7Ci0JCQkJCS8qIHJlamVjdGVkIGJ5IGdlbmVyaWMgZnVuY3Rpb24gKi8KLQkJCQkJc3dpdGNoICgoYyA9ICpzKyspKSB7Ci0JCQkJCWNhc2UgJ2MnOgotCQkJCQkJZmxhZ3MgJj0gflBPX05MOwotCQkJCQkJLyogQVQmVCBicmFpbiBkYW1hZ2UgKi8KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQljYXNlICdcMCc6Ci0JCQkJCQlzLS07Ci0JCQkJCQljID0gJ1xcJzsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJWHB1dCh4cywgeHAsICdcXCcpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgodW5zaWduZWQgaW50KWMgPiAweEZGKSB7Ci0JCQkJCS8qIGdlbmVyaWMgZnVuY3Rpb24gcmV0dXJuZWQgVW5pY29kZSAqLwotCQkJCQljaGFyIHRzWzRdOwotCi0JCQkJCWMgPSB1dGZfd2N0b21iKHRzLCBjIC0gMHgxMDApOwotCQkJCQl0c1tjXSA9IDA7Ci0JCQkJCWZvciAoYyA9IDA7IHRzW2NdOyArK2MpCi0JCQkJCQlYcHV0KHhzLCB4cCwgdHNbY10pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlYcHV0KHhzLCB4cCwgYyk7Ci0JCX0KLQkJaWYgKCorK3dwICE9IE5VTEwpCi0JCQlYcHV0KHhzLCB4cCwgJyAnKTsKLQl9Ci0JaWYgKGZsYWdzICYgUE9fTkwpCi0JCVhwdXQoeHMsIHhwLCAnXG4nKTsKLQotCWlmIChmbGFncyAmIFBPX0hJU1QpIHsKLQkJWHB1dCh4cywgeHAsICdcMCcpOwotCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCBYc3RyaW5nKHhzLCB4cCksIHRydWUsIGZhbHNlKTsKLQkJWGZyZWUoeHMsIHhwKTsKLQl9IGVsc2UgewotCQlpbnQgbGVuID0gWGxlbmd0aCh4cywgeHApOwotCQlpbnQgb3BpcGUgPSAwOwotCi0JCS8qIEVuc3VyZSB3ZSBhcmVuJ3Qga2lsbGVkIGJ5IGEgU0lHUElQRSB3aGlsZSB3cml0aW5nIHRvCi0JCSAqIGEgY29wcm9jZXNzLiBBVCZUIGtzaCBkb2Vzbid0IHNlZW0gdG8gZG8gdGhpcyAoc2VlbXMKLQkJICogdG8ganVzdCBjaGVjayB0aGF0IHRoZSBjby1wcm9jZXNzIGlzIGFsaXZlIHdoaWNoIGlzCi0JCSAqIG5vdCBlbm91Z2gpLgotCQkgKi8KLQkJaWYgKGNvcHJvYy53cml0ZSA+PSAwICYmIGNvcHJvYy53cml0ZSA9PSBmZCkgewotCQkJZmxhZ3MgfD0gUE9fQ09QUk9DOwotCQkJb3BpcGUgPSBibG9ja19waXBlKCk7Ci0JCX0KLQkJZm9yIChzID0gWHN0cmluZyh4cywgeHApOyBsZW4gPiAwOyApIHsKLQkJCWlmICgoYyA9IHdyaXRlKGZkLCBzLCBsZW4pKSA8IDApIHsKLQkJCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCi0JCQkJCXJlc3RvcmVfcGlwZShvcGlwZSk7Ci0JCQkJaWYgKGVycm5vID09IEVJTlRSKSB7Ci0JCQkJCS8qIGFsbG93IHVzZXIgdG8gXkMgb3V0ICovCi0JCQkJCWludHJjaGVjaygpOwotCQkJCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCi0JCQkJCQlvcGlwZSA9IGJsb2NrX3BpcGUoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCQlzICs9IGM7Ci0JCQlsZW4gLT0gYzsKLQkJfQotCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCi0JCQlyZXN0b3JlX3BpcGUob3BpcGUpOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNfZ2V0KHZvaWQpCi17Ci0JcmV0dXJuICgqc19wdHIrKyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3B1dChpbnQgYyBNS1NIX0FfVU5VU0VEKQotewotCS0tc19wdHI7Ci19Ci0KLWludAotY193aGVuY2UoY29uc3QgY2hhciAqKndwKQotewotCXN0cnVjdCB0YmwgKnRwOwotCWNvbnN0IGNoYXIgKmlkOwotCWJvb2wgcGZsYWcgPSBmYWxzZSwgdmZsYWcgPSBmYWxzZSwgVmZsYWcgPSBmYWxzZTsKLQlpbnQgcnYgPSAwLCBvcHRjLCBmY2ZsYWdzOwotCWJvb2wgaWFtX3doZW5jZSA9IHdwWzBdWzBdID09ICd3JzsKLQljb25zdCBjaGFyICpvcHRzID0gaWFtX3doZW5jZSA/ICJwdiIgOiAicHZWIjsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAncCc6Ci0JCQlwZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAndic6Ci0JCQl2ZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnVic6Ci0JCQlWZmxhZyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JZmNmbGFncyA9IEZDX0JJIHwgRkNfUEFUSCB8IEZDX0ZVTkM7Ci0JaWYgKCFpYW1fd2hlbmNlKSB7Ci0JCS8qIE5vdGUgdGhhdCAtcCBvbiBpdHMgb3duIGlzIGRlYWwgd2l0aCBpbiBjb21leGVjKCkgKi8KLQkJaWYgKHBmbGFnKQotCQkJZmNmbGFncyB8PSBGQ19ERUZQQVRIOwotCQkvKiBDb252ZXJ0IGNvbW1hbmQgb3B0aW9ucyB0byB3aGVuY2Ugb3B0aW9ucyAtIG5vdGUgdGhhdAotCQkgKiBjb21tYW5kIC1wViB1c2VzIGEgZGlmZmVyZW50IHBhdGggc2VhcmNoIHRoYW4gd2hlbmNlIC12Ci0JCSAqIG9yIHdoZW5jZSAtcHYuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBmZWF0dXJlLgotCQkgKi8KLQkJdmZsYWcgPSBWZmxhZzsKLQl9Ci0JaWYgKHBmbGFnKQotCQlmY2ZsYWdzICY9IH4oRkNfQkkgfCBGQ19GVU5DKTsKLQotCXdoaWxlICgodmZsYWcgfHwgcnYgPT0gMCkgJiYgKGlkID0gKndwKyspICE9IE5VTEwpIHsKLQkJdWludDMyX3QgaCA9IDA7Ci0KLQkJdHAgPSBOVUxMOwotCQlpZiAoKGlhbV93aGVuY2UgfHwgdmZsYWcpICYmICFwZmxhZykKLQkJCXRwID0ga3RzZWFyY2goJmtleXdvcmRzLCBpZCwgaCA9IGhhc2goaWQpKTsKLQkJaWYgKCF0cCAmJiAhcGZsYWcpIHsKLQkJCXRwID0ga3RzZWFyY2goJmFsaWFzZXMsIGlkLCBoID8gaCA6IGhhc2goaWQpKTsKLQkJCWlmICh0cCAmJiAhKHRwLT5mbGFnICYgSVNTRVQpKQotCQkJCXRwID0gTlVMTDsKLQkJfQotCQlpZiAoIXRwKQotCQkJdHAgPSBmaW5kY29tKGlkLCBmY2ZsYWdzKTsKLQkJaWYgKHZmbGFnIHx8ICh0cC0+dHlwZSAhPSBDQUxJQVMgJiYgdHAtPnR5cGUgIT0gQ0VYRUMgJiYKLQkJICAgIHRwLT50eXBlICE9IENUQUxJQVMpKQotCQkJc2hmX3B1dHMoaWQsIHNobF9zdGRvdXQpOwotCQlzd2l0Y2ggKHRwLT50eXBlKSB7Ci0JCWNhc2UgQ0tFWVdEOgotCQkJaWYgKHZmbGFnKQotCQkJCXNoZl9wdXRzKCIgaXMgYSByZXNlcnZlZCB3b3JkIiwgc2hsX3N0ZG91dCk7Ci0JCQlicmVhazsKLQkJY2FzZSBDQUxJQVM6Ci0JCQlpZiAodmZsYWcpCi0JCQkJc2hwcmludGYoIiBpcyBhbiAlc2FsaWFzIGZvciAiLAotCQkJCSAgICAodHAtPmZsYWcgJiBFWFBPUlQpID8gImV4cG9ydGVkICIgOiBudWxsKTsKLQkJCWlmICghaWFtX3doZW5jZSAmJiAhdmZsYWcpCi0JCQkJc2hwcmludGYoImFsaWFzICVzPSIsIGlkKTsKLQkJCXByaW50X3ZhbHVlX3F1b3RlZCh0cC0+dmFsLnMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0ZVTkM6Ci0JCQlpZiAodmZsYWcpIHsKLQkJCQlzaGZfcHV0cygiIGlzIGEiLCBzaGxfc3Rkb3V0KTsKLQkJCQlpZiAodHAtPmZsYWcgJiBFWFBPUlQpCi0JCQkJCXNoZl9wdXRzKCJuIGV4cG9ydGVkIiwgc2hsX3N0ZG91dCk7Ci0JCQkJaWYgKHRwLT5mbGFnICYgVFJBQ0UpCi0JCQkJCXNoZl9wdXRzKCIgdHJhY2VkIiwgc2hsX3N0ZG91dCk7Ci0JCQkJaWYgKCEodHAtPmZsYWcgJiBJU1NFVCkpIHsKLQkJCQkJc2hmX3B1dHMoIiB1bmRlZmluZWQiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJaWYgKHRwLT51LmZwYXRoKQotCQkJCQkJc2hwcmludGYoIiAoYXV0b2xvYWQgZnJvbSAlcykiLAotCQkJCQkJICAgIHRwLT51LmZwYXRoKTsKLQkJCQl9Ci0JCQkJc2hmX3B1dHMoIiBmdW5jdGlvbiIsIHNobF9zdGRvdXQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ1NIRUxMOgotCQkJaWYgKHZmbGFnKQotCQkJCXNocHJpbnRmKCIgaXMgYSVzIHNoZWxsIGJ1aWx0aW4iLAotCQkJCSAgICAodHAtPmZsYWcgJiBTUEVDX0JJKSA/ICIgc3BlY2lhbCIgOiBudWxsKTsKLQkJCWJyZWFrOwotCQljYXNlIENUQUxJQVM6Ci0JCWNhc2UgQ0VYRUM6Ci0JCQlpZiAodHAtPmZsYWcgJiBJU1NFVCkgewotCQkJCWlmICh2ZmxhZykgewotCQkJCQlzaGZfcHV0cygiIGlzICIsIHNobF9zdGRvdXQpOwotCQkJCQlpZiAodHAtPnR5cGUgPT0gQ1RBTElBUykKLQkJCQkJCXNocHJpbnRmKCJhIHRyYWNrZWQgJXNhbGlhcyBmb3IgIiwKLQkJCQkJCSAgICAodHAtPmZsYWcgJiBFWFBPUlQpID8KLQkJCQkJCSAgICAiZXhwb3J0ZWQgIiA6IG51bGwpOwotCQkJCX0KLQkJCQlzaGZfcHV0cyh0cC0+dmFsLnMsIHNobF9zdGRvdXQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodmZsYWcpCi0JCQkJCXNoZl9wdXRzKCIgbm90IGZvdW5kIiwgc2hsX3N0ZG91dCk7Ci0JCQkJcnYgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzaHByaW50ZigiJXMgaXMgKkdPSyoiLCBpZCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAodmZsYWcgfHwgIXJ2KQotCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7Ci0JfQotCXJldHVybiAocnYpOwotfQotCi0vKiBEZWFsIHdpdGggY29tbWFuZCAtdlYgLSBjb21tYW5kIC1wIGRlYWx0IHdpdGggaW4gY29tZXhlYygpICovCi1pbnQKLWNfY29tbWFuZChjb25zdCBjaGFyICoqd3ApCi17Ci0JLyogTGV0IGNfd2hlbmNlIGRvIHRoZSB3b3JrLiBOb3RlIHRoYXQgY19jb21tYW5kKCkgbXVzdCBiZQotCSAqIGEgZGlzdGluY3QgZnVuY3Rpb24gZnJvbSBjX3doZW5jZSgpICh0ZXN0ZWQgaW4gY29tZXhlYygpKS4KLQkgKi8KLQlyZXR1cm4gKGNfd2hlbmNlKHdwKSk7Ci19Ci0KLS8qIHR5cGVzZXQsIGV4cG9ydCwgYW5kIHJlYWRvbmx5ICovCi1pbnQKLWNfdHlwZXNldChjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IGJsb2NrICpsOwotCXN0cnVjdCB0YmwgKnZwLCAqKnA7Ci0JVGZsYWcgZnNldCA9IDAsIGZjbHIgPSAwLCBmbGFnOwotCWludCB0aGluZyA9IDAsIGZpZWxkLCBiYXNlLCBvcHRjOwotCWNvbnN0IGNoYXIgKm9wdHM7Ci0JY29uc3QgY2hhciAqZmllbGRzdHIsICpiYXNlc3RyOwotCWJvb2wgbG9jYWx2ID0gZmFsc2UsIGZ1bmMgPSBmYWxzZSwgcGZsYWcgPSBmYWxzZSwgaXN0c2V0ID0gdHJ1ZTsKLQotCXN3aXRjaCAoKip3cCkgewotCWNhc2UgJ2UnOgkJLyogZXhwb3J0ICovCi0JCWZzZXQgfD0gRVhQT1JUOwotCQlpc3RzZXQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSAncic6CQkvKiByZWFkb25seSAqLwotCQlmc2V0IHw9IFJET05MWTsKLQkJaXN0c2V0ID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgJ3MnOgkJLyogc2V0ICovCi0JCS8qIGNhbGxlZCB3aXRoICd0eXBlc2V0IC0nICovCi0JCWJyZWFrOwotCWNhc2UgJ3QnOgkJLyogdHlwZXNldCAqLwotCQlsb2NhbHYgPSB0cnVlOwotCQlicmVhazsKLQl9Ci0KLQkvKiBzZWUgY29tbWVudCBiZWxvdyByZWdhcmRpbmcgcG9zc2libGUgb3Bpb25zICovCi0Jb3B0cyA9IGlzdHNldCA/ICJMI1IjVVojYWZpI2xucHJ0dXgiIDogInAiOwotCi0JZmllbGRzdHIgPSBiYXNlc3RyID0gTlVMTDsKLQlidWlsdGluX29wdC5mbGFncyB8PSBHRl9QTFVTT1BUOwotCS8qIEFUJlQga3NoIHNlZW1zIHRvIGhhdmUgMC05IGFzIG9wdGlvbnMgd2hpY2ggYXJlIG11bHRpcGxpZWQKLQkgKiB0byBnZXQgYSBudW1iZXIgdGhhdCBpcyB1c2VkIHdpdGggLUwsIC1SLCAtWiBvciAtaSAoZWcsIC0xUjIKLQkgKiBzZXRzIHJpZ2h0IGp1c3RpZnkgaW4gYSBmaWVsZCBvZiAxMikuIFRoaXMgYWxsb3dzIG9wdGlvbnMKLQkgKiB0byBiZSBncm91cGVkIGluIGFuIG9yZGVyIChlZywgLUx1MTIpLCBidXQgZGlzYWxsb3dzIC1pOCAtTDMgYW5kCi0JICogZG9lcyBub3QgYWxsb3cgdGhlIG51bWJlciB0byBiZSBzcGVjaWZpZWQgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudAotCSAqIEhlcmUsIHRoZSBudW1iZXIgbXVzdCBmb2xsb3cgdGhlIFJMWmkgb3B0aW9uLCBidXQgaXMgb3B0aW9uYWwKLQkgKiAoc2VlIHRoZSAjIGtsdWRnZSBpbiBrc2hfZ2V0b3B0KCkpLgotCSAqLwotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKSB7Ci0JCWZsYWcgPSAwOwotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnTCc6Ci0JCQlmbGFnID0gTEpVU1Q7Ci0JCQlmaWVsZHN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdSJzoKLQkJCWZsYWcgPSBSSlVTVDsKLQkJCWZpZWxkc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1UnOgotCQkJLyogQVQmVCBrc2ggdXNlcyB1LCBidXQgdGhpcyBjb25mbGljdHMgd2l0aAotCQkJICogdXBwZXIvbG93ZXIgY2FzZS4gSWYgdGhpcyBvcHRpb24gaXMgY2hhbmdlZCwKLQkJCSAqIG5lZWQgdG8gY2hhbmdlIHRoZSAtVSBiZWxvdyBhcyB3ZWxsCi0JCQkgKi8KLQkJCWZsYWcgPSBJTlRfVTsKLQkJCWJyZWFrOwotCQljYXNlICdaJzoKLQkJCWZsYWcgPSBaRVJPRklMOwotCQkJZmllbGRzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnYSc6Ci0JCQkvKgotCQkJICogdGhpcyBpcyBzdXBwb3NlZCB0byBzZXQgKC1hKSBvciB1bnNldCAoK2EpIHRoZQotCQkJICogaW5kZXhlZCBhcnJheSBhdHRyaWJ1dGU7IGl0IGRvZXMgbm90aGluZyBvbiBhbgotCQkJICogZXhpc3RpbmcgcmVndWxhciBzdHJpbmcgb3IgaW5kZXhlZCBhcnJheSB0aG91Z2gKLQkJCSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2YnOgotCQkJZnVuYyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCQlmbGFnID0gSU5URUdFUjsKLQkJCWJhc2VzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAnbCc6Ci0JCQlmbGFnID0gTENBU0VWOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJc2V0X3JlZmZsYWcgPSAoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMpID8gMiA6IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAncCc6Ci0JCQkvKiBleHBvcnQsIHJlYWRvbmx5OiBQT1NJWCAtcCBmbGFnICovCi0JCQkvKiB0eXBlc2V0OiBzaG93IHZhbHVlcyBhcyB3ZWxsICovCi0JCQlwZmxhZyA9IHRydWU7Ci0JCQlpZiAoaXN0c2V0KQotCQkJCWNvbnRpbnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJZmxhZyA9IFJET05MWTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCWZsYWcgPSBUUkFDRTsKLQkJCWJyZWFrOwotCQljYXNlICd1JzoKLQkJCWZsYWcgPSBVQ0FTRVZfQUw7CS8qIHVwcGVyIGNhc2UgLyBhdXRvbG9hZCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkJZmxhZyA9IEVYUE9SVDsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJaWYgKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9QTFVTKSB7Ci0JCQlmY2xyIHw9IGZsYWc7Ci0JCQlmc2V0ICY9IH5mbGFnOwotCQkJdGhpbmcgPSAnKyc7Ci0JCX0gZWxzZSB7Ci0JCQlmc2V0IHw9IGZsYWc7Ci0JCQlmY2xyICY9IH5mbGFnOwotCQkJdGhpbmcgPSAnLSc7Ci0JCX0KLQl9Ci0KLQlmaWVsZCA9IDA7Ci0JaWYgKGZpZWxkc3RyICYmICFiaV9nZXRuKGZpZWxkc3RyLCAmZmllbGQpKQotCQlyZXR1cm4gKDEpOwotCWJhc2UgPSAwOwotCWlmIChiYXNlc3RyICYmICFiaV9nZXRuKGJhc2VzdHIsICZiYXNlKSkKLQkJcmV0dXJuICgxKTsKLQotCWlmICghKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9NSU5VU01JTlVTKSAmJiB3cFtidWlsdGluX29wdC5vcHRpbmRdICYmCi0JICAgICh3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdID09ICctJyB8fAotCSAgICB3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdID09ICcrJykgJiYKLQkgICAgd3BbYnVpbHRpbl9vcHQub3B0aW5kXVsxXSA9PSAnXDAnKSB7Ci0JCXRoaW5nID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXVswXTsKLQkJYnVpbHRpbl9vcHQub3B0aW5kKys7Ci0JfQotCi0JaWYgKGZ1bmMgJiYgKCgoZnNldHxmY2xyKSAmIH4oVFJBQ0V8VUNBU0VWX0FMfEVYUE9SVCkpIHx8IHNldF9yZWZmbGFnKSkgewotCQliaV9lcnJvcmYoIm9ubHkgLXQsIC11IGFuZCAteCBvcHRpb25zIG1heSBiZSB1c2VkIHdpdGggLWYiKTsKLQkJc2V0X3JlZmZsYWcgPSAwOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kXSkgewotCQkvKiBUYWtlIGNhcmUgb2YgZXhjbHVzaW9ucy4KLQkJICogQXQgdGhpcyBwb2ludCwgZmxhZ3MgaW4gZnNldCBhcmUgY2xlYXJlZCBpbiBmY2xyIGFuZCB2aWNlCi0JCSAqIHZlcnNhLiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBwcmVzZXJ2ZWQuCi0JCSAqLwotCQlpZiAoZnNldCAmIExDQVNFVikJLyogTENBU0VWIGhhcyBwcmlvcml0eSBvdmVyIFVDQVNFVl9BTCAqLwotCQkJZnNldCAmPSB+VUNBU0VWX0FMOwotCQlpZiAoZnNldCAmIExKVVNUKQkvKiBMSlVTVCBoYXMgcHJpb3JpdHkgb3ZlciBSSlVTVCAqLwotCQkJZnNldCAmPSB+UkpVU1Q7Ci0JCWlmICgoZnNldCAmIChaRVJPRklMfExKVVNUKSkgPT0gWkVST0ZJTCkgeyAvKiAtWiBpbXBsaWVzIC1aUiAqLwotCQkJZnNldCB8PSBSSlVTVDsKLQkJCWZjbHIgJj0gflJKVVNUOwotCQl9Ci0JCS8qIFNldHRpbmcgdGhlc2UgYXR0cmlidXRlcyBjbGVhcnMgdGhlIG90aGVycywgdW5sZXNzIHRoZXkKLQkJICogYXJlIGFsc28gc2V0IGluIHRoaXMgY29tbWFuZAotCQkgKi8KLQkJaWYgKChmc2V0ICYgKExKVVNUIHwgUkpVU1QgfCBaRVJPRklMIHwgVUNBU0VWX0FMIHwgTENBU0VWIHwKLQkJICAgIElOVEVHRVIgfCBJTlRfVSB8IElOVF9MKSkgfHwgc2V0X3JlZmZsYWcpCi0JCQlmY2xyIHw9IH5mc2V0ICYgKExKVVNUIHwgUkpVU1QgfCBaRVJPRklMIHwgVUNBU0VWX0FMIHwKLQkJCSAgICBMQ0FTRVYgfCBJTlRFR0VSIHwgSU5UX1UgfCBJTlRfTCk7Ci0JfQotCi0JLyogc2V0IHZhcmlhYmxlcyBhbmQgYXR0cmlidXRlcyAqLwotCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7Ci0JCWludCBpLCBydiA9IDA7Ci0JCXN0cnVjdCB0YmwgKmY7Ci0KLQkJaWYgKGxvY2FsdiAmJiAhZnVuYykKLQkJCWZzZXQgfD0gTE9DQUw7Ci0JCWZvciAoaSA9IGJ1aWx0aW5fb3B0Lm9wdGluZDsgd3BbaV07IGkrKykgewotCQkJaWYgKGZ1bmMpIHsKLQkJCQlmID0gZmluZGZ1bmMod3BbaV0sIGhhc2god3BbaV0pLAotCQkJCSAgICAoZnNldCZVQ0FTRVZfQUwpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQlpZiAoIWYpIHsKLQkJCQkJLyogQVQmVCBrc2ggZG9lcyArK3J2OiBib2d1cyAqLwotCQkJCQlydiA9IDE7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoZnNldCB8IGZjbHIpIHsKLQkJCQkJZi0+ZmxhZyB8PSBmc2V0OwotCQkJCQlmLT5mbGFnICY9IH5mY2xyOwotCQkJCX0gZWxzZQotCQkJCQlmcHRyZWVmKHNobF9zdGRvdXQsIDAsCi0JCQkJCSAgICBmLT5mbGFnICYgRktTSCA/Ci0JCQkJCSAgICAiZnVuY3Rpb24gJXMgJVRcbiIgOgotCQkJCQkgICAgIiVzKCkgJVRcbiIsIHdwW2ldLCBmLT52YWwudCk7Ci0JCQl9IGVsc2UgaWYgKCF0eXBlc2V0KHdwW2ldLCBmc2V0LCBmY2xyLCBmaWVsZCwgYmFzZSkpIHsKLQkJCQliaV9lcnJvcmYoIiVzOiBub3QgaWRlbnRpZmllciIsIHdwW2ldKTsKLQkJCQlzZXRfcmVmZmxhZyA9IDA7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJfQotCQlzZXRfcmVmZmxhZyA9IDA7Ci0JCXJldHVybiAocnYpOwotCX0KLQotCS8qIGxpc3QgdmFyaWFibGVzIGFuZCBhdHRyaWJ1dGVzICovCi0JZmxhZyA9IGZzZXQgfCBmY2xyOyAvKiBubyBkaWZmZXJlbmNlIGF0IHRoaXMgcG9pbnQuLiAqLwotCWlmIChmdW5jKSB7Ci0JCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKLQkJCWZvciAocCA9IGt0c29ydCgmbC0+ZnVucyk7ICh2cCA9ICpwKyspOyApIHsKLQkJCQlpZiAoZmxhZyAmJiAodnAtPmZsYWcgJiBmbGFnKSA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAodGhpbmcgPT0gJy0nKQotCQkJCQlmcHRyZWVmKHNobF9zdGRvdXQsIDAsIHZwLT5mbGFnICYgRktTSCA/Ci0JCQkJCSAgICAiZnVuY3Rpb24gJXMgJVRcbiIgOiAiJXMoKSAlVFxuIiwKLQkJCQkJICAgIHZwLT5uYW1lLCB2cC0+dmFsLnQpOwotCQkJCWVsc2UKLQkJCQkJc2hwcmludGYoIiVzXG4iLCB2cC0+bmFtZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KSB7Ci0JCQlmb3IgKHAgPSBrdHNvcnQoJmwtPnZhcnMpOyAodnAgPSAqcCsrKTsgKSB7Ci0JCQkJc3RydWN0IHRibCAqdHZwOwotCQkJCWJvb2wgYW55X3NldCA9IGZhbHNlOwotCQkJCS8qCi0JCQkJICogU2VlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgc2V0IChmb3IgYXJyYXlzLCBpZiBhbnkKLQkJCQkgKiBlbGVtZW50IGlzIHNldCkuCi0JCQkJICovCi0JCQkJZm9yICh0dnAgPSB2cDsgdHZwOyB0dnAgPSB0dnAtPnUuYXJyYXkpCi0JCQkJCWlmICh0dnAtPmZsYWcgJiBJU1NFVCkgewotCQkJCQkJYW55X3NldCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBDaGVjayBhdHRyaWJ1dGVzIC0gbm90ZSB0aGF0IGFsbCBhcnJheSBlbGVtZW50cwotCQkJCSAqIGhhdmUgKHNob3VsZCBoYXZlPykgdGhlIHNhbWUgYXR0cmlidXRlcywgc28gY2hlY2tpbmcKLQkJCQkgKiB0aGUgZmlyc3QgaXMgc3VmZmljaWVudC4KLQkJCQkgKgotCQkJCSAqIFJlcG9ydCBhbiB1bnNldCBwYXJhbSBvbmx5IGlmIHRoZSB1c2VyIGhhcwotCQkJCSAqIGV4cGxpY2l0bHkgZ2l2ZW4gaXQgc29tZSBhdHRyaWJ1dGUgKGxpa2UgZXhwb3J0KTsKLQkJCQkgKiBvdGhlcndpc2UsIGFmdGVyICJlY2hvICRGT08iLCB3ZSB3b3VsZCByZXBvcnQgRk9PLi4uCi0JCQkJICovCi0JCQkJaWYgKCFhbnlfc2V0ICYmICEodnAtPmZsYWcgJiBVU0VSQVRUUklCKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGZsYWcgJiYgKHZwLT5mbGFnICYgZmxhZykgPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KSB7Ci0JCQkJCS8qIElnbm9yZSBhcnJheSBlbGVtZW50cyB0aGF0IGFyZW4ndAotCQkJCQkgKiBzZXQgdW5sZXNzIHRoZXJlIGFyZSBubyBzZXQgZWxlbWVudHMsCi0JCQkJCSAqIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGlzIHJlcG9ydGVkIG9uICovCi0JCQkJCWlmICgodnAtPmZsYWcmQVJSQVkpICYmIGFueV9zZXQgJiYKLQkJCQkJICAgICEodnAtPmZsYWcgJiBJU1NFVCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLyogbm8gYXJndW1lbnRzICovCi0JCQkJCWlmICh0aGluZyA9PSAwICYmIGZsYWcgPT0gMCkgewotCQkJCQkJLyogQVQmVCBrc2ggcHJpbnRzIHRoaW5ncwotCQkJCQkJICogbGlrZSBleHBvcnQsIGludGVnZXIsCi0JCQkJCQkgKiBsZWZ0YWRqLCB6ZXJvZmlsbCwgZXRjLiwKLQkJCQkJCSAqIGJ1dCBQT1NJWCBzYXlzIG11c3QKLQkJCQkJCSAqIGJlIHN1aXRhYmxlIGZvciByZS1lbnRyeS4uLgotCQkJCQkJICovCi0JCQkJCQlzaGZfcHV0cygidHlwZXNldCAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgoKHZwLT5mbGFnJihBUlJBWXxBU1NPQykpPT1BU1NPQykpCi0JCQkJCQkJc2hmX3B1dHMoIi1uICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZJTlRFR0VSKSkKLQkJCQkJCQlzaGZfcHV0cygiLWkgIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJkVYUE9SVCkpCi0JCQkJCQkJc2hmX3B1dHMoIi14ICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKQotCQkJCQkJCXNoZl9wdXRzKCItciAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmVFJBQ0UpKQotCQkJCQkJCXNoZl9wdXRzKCItdCAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmTEpVU1QpKQotCQkJCQkJCXNocHJpbnRmKCItTCVkICIsIHZwLT51Mi5maWVsZCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJlJKVVNUKSkKLQkJCQkJCQlzaHByaW50ZigiLVIlZCAiLCB2cC0+dTIuZmllbGQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZaRVJPRklMKSkKLQkJCQkJCQlzaGZfcHV0cygiLVogIiwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJkxDQVNFVikpCi0JCQkJCQkJc2hmX3B1dHMoIi1sICIsIHNobF9zdGRvdXQpOwotCQkJCQkJaWYgKCh2cC0+ZmxhZyZVQ0FTRVZfQUwpKQotCQkJCQkJCXNoZl9wdXRzKCItdSAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICgodnAtPmZsYWcmSU5UX1UpKQotCQkJCQkJCXNoZl9wdXRzKCItVSAiLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCXNoZl9wdXRzKHZwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmIChwZmxhZykgewotCQkJCQkJCWNoYXIgKnMgPSBzdHJfdmFsKHZwKTsKLQotCQkJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7Ci0JCQkJCQkJLyogQVQmVCBrc2ggY2FuJ3QgaGF2ZQotCQkJCQkJCSAqIGp1c3RpZmllZCBpbnRlZ2Vycy4uICovCi0JCQkJCQkJaWYgKCh2cC0+ZmxhZyAmCi0JCQkJCQkJICAgIChJTlRFR0VSfExKVVNUfFJKVVNUKSkgPT0KLQkJCQkJCQkgICAgSU5URUdFUikKLQkJCQkJCQkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwcmludF92YWx1ZV9xdW90ZWQocyk7Ci0JCQkJCQl9Ci0JCQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQkJCQkJCWlmICh2cC0+ZmxhZyAmIEFSUkFZKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHBmbGFnKQotCQkJCQkJCXNoZl9wdXRzKGlzdHNldCA/Ci0JCQkJCQkJICAgICJ0eXBlc2V0ICIgOgotCQkJCQkJCSAgICAoZmxhZyAmIEVYUE9SVCkgPwotCQkJCQkJCSAgICAiZXhwb3J0ICIgOgotCQkJCQkJCSAgICAicmVhZG9ubHkgIiwKLQkJCQkJCQkgICAgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAoKHZwLT5mbGFnJkFSUkFZKSAmJiBhbnlfc2V0KQotCQkJCQkJCXNocHJpbnRmKCIlc1slbHVdIiwKLQkJCQkJCQkgICAgdnAtPm5hbWUsCi0JCQkJCQkJICAgIGFycmF5aW5kZXgodnApKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzaGZfcHV0cyh2cC0+bmFtZSwgc2hsX3N0ZG91dCk7Ci0JCQkJCQlpZiAodGhpbmcgPT0gJy0nICYmICh2cC0+ZmxhZyZJU1NFVCkpIHsKLQkJCQkJCQljaGFyICpzID0gc3RyX3ZhbCh2cCk7Ci0KLQkJCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOwotCQkJCQkJCS8qIEFUJlQga3NoIGNhbid0IGhhdmUKLQkJCQkJCQkgKiBqdXN0aWZpZWQgaW50ZWdlcnMuLiAqLwotCQkJCQkJCWlmICgodnAtPmZsYWcgJgotCQkJCQkJCSAgICAoSU5URUdFUnxMSlVTVHxSSlVTVCkpID09Ci0JCQkJCQkJICAgIElOVEVHRVIpCi0JCQkJCQkJCXNoZl9wdXRzKHMsIHNobF9zdGRvdXQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHMpOwotCQkJCQkJfQotCQkJCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7Ci0JCQkJCX0KLQkJCQkJLyogT25seSByZXBvcnQgZmlyc3QgJ2VsZW1lbnQnIG9mIGFuIGFycmF5IHdpdGgKLQkJCQkJICogbm8gc2V0IGVsZW1lbnRzLgotCQkJCQkgKi8KLQkJCQkJaWYgKCFhbnlfc2V0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotY19hbGlhcyhjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IHRhYmxlICp0ID0gJmFsaWFzZXM7Ci0JaW50IHJ2ID0gMCwgcHJlZml4ID0gMDsKLQlib29sIHJmbGFnID0gZmFsc2UsIHRmbGFnLCBVZmxhZyA9IGZhbHNlLCBwZmxhZyA9IGZhbHNlOwotCVRmbGFnIHhmbGFnID0gMDsKLQlpbnQgb3B0YzsKLQotCWJ1aWx0aW5fb3B0LmZsYWdzIHw9IEdGX1BMVVNPUFQ7Ci0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiZHBydFV4IikpICE9IC0xKSB7Ci0JCXByZWZpeCA9IGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9QTFVTID8gJysnIDogJy0nOwotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnZCc6Ci0jaWZkZWYgTUtTSF9OT1BXTkFNCi0JCQl0ID0gTlVMTDsJLyogZml4ICJhbGlhcyAtZHQiICovCi0jZWxzZQotCQkJdCA9ICZob21lZGlyczsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkJcGZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJcmZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3QnOgotCQkJdCA9ICZ0YWxpYXNlczsKLQkJCWJyZWFrOwotCQljYXNlICdVJzoKLQkJCS8qCi0JCQkgKiBrbHVkZ2UgZm9yIHRyYWNrZWQgYWxpYXMgaW5pdGlhbGl6YXRpb24KLQkJCSAqIChkb24ndCBkbyBhIHBhdGggc2VhcmNoLCBqdXN0IG1ha2UgYW4gZW50cnkpCi0JCQkgKi8KLQkJCVVmbGFnID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQljYXNlICd4JzoKLQkJCXhmbGFnID0gRVhQT1JUOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCX0KLSNpZmRlZiBNS1NIX05PUFdOQU0KLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwotI2VuZGlmCi0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0JaWYgKCEoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmICp3cCAmJgotCSAgICAod3BbMF1bMF0gPT0gJy0nIHx8IHdwWzBdWzBdID09ICcrJykgJiYgd3BbMF1bMV0gPT0gJ1wwJykgewotCQlwcmVmaXggPSB3cFswXVswXTsKLQkJd3ArKzsKLQl9Ci0KLQl0ZmxhZyA9IHQgPT0gJnRhbGlhc2VzOwotCi0JLyogImhhc2ggLXIiIG1lYW5zIHJlc2V0IGFsbCB0aGUgdHJhY2tlZCBhbGlhc2VzLi4gKi8KLQlpZiAocmZsYWcpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsKLQkJCSJ1bmFsaWFzIiwgIi10YSIsIE5VTEwKLQkJfTsKLQotCQlpZiAoIXRmbGFnIHx8ICp3cCkgewotCQkJc2hmX3B1dHMoImFsaWFzOiAtciBmbGFnIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtdCIKLQkJCSAgICAiIGFuZCB3aXRob3V0IGFyZ3VtZW50c1xuIiwgc2hsX3N0ZG91dCk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCBHRl9FUlJPUik7Ci0JCXJldHVybiAoY191bmFsaWFzKGFyZ3MpKTsKLQl9Ci0KLQlpZiAoKndwID09IE5VTEwpIHsKLQkJc3RydWN0IHRibCAqYXAsICoqcDsKLQotCQlmb3IgKHAgPSBrdHNvcnQodCk7IChhcCA9ICpwKyspICE9IE5VTEw7ICkKLQkJCWlmICgoYXAtPmZsYWcgJiAoSVNTRVR8eGZsYWcpKSA9PSAoSVNTRVR8eGZsYWcpKSB7Ci0JCQkJaWYgKHBmbGFnKQotCQkJCQlzaGZfcHV0cygiYWxpYXMgIiwgc2hsX3N0ZG91dCk7Ci0JCQkJc2hmX3B1dHMoYXAtPm5hbWUsIHNobF9zdGRvdXQpOwotCQkJCWlmIChwcmVmaXggIT0gJysnKSB7Ci0JCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7Ci0JCQkJCXByaW50X3ZhbHVlX3F1b3RlZChhcC0+dmFsLnMpOwotCQkJCX0KLQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQkJCX0KLQl9Ci0KLQlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKLQkJY29uc3QgY2hhciAqYWxpYXMgPSAqd3AsICp2YWwsICpuZXd2YWw7Ci0JCWNoYXIgKnhhbGlhcyA9IE5VTEw7Ci0JCXN0cnVjdCB0YmwgKmFwOwotCQl1aW50MzJfdCBoOwotCi0JCWlmICgodmFsID0gY3N0cmNocihhbGlhcywgJz0nKSkpIHsKLQkJCXN0cm5kdXB4KHhhbGlhcywgYWxpYXMsIHZhbCsrIC0gYWxpYXMsIEFURU1QKTsKLQkJCWFsaWFzID0geGFsaWFzOwotCQl9Ci0JCWggPSBoYXNoKGFsaWFzKTsKLQkJaWYgKHZhbCA9PSBOVUxMICYmICF0ZmxhZyAmJiAheGZsYWcpIHsKLQkJCWFwID0ga3RzZWFyY2godCwgYWxpYXMsIGgpOwotCQkJaWYgKGFwICE9IE5VTEwgJiYgKGFwLT5mbGFnJklTU0VUKSkgewotCQkJCWlmIChwZmxhZykKLQkJCQkJc2hmX3B1dHMoImFsaWFzICIsIHNobF9zdGRvdXQpOwotCQkJCXNoZl9wdXRzKGFwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKLQkJCQlpZiAocHJlZml4ICE9ICcrJykgewotCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOwotCQkJCQlwcmludF92YWx1ZV9xdW90ZWQoYXAtPnZhbC5zKTsKLQkJCQl9Ci0JCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7Ci0JCQl9IGVsc2UgewotCQkJCXNocHJpbnRmKCIlcyBhbGlhcyBub3QgZm91bmRcbiIsIGFsaWFzKTsKLQkJCQlydiA9IDE7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlhcCA9IGt0ZW50ZXIodCwgYWxpYXMsIGgpOwotCQlhcC0+dHlwZSA9IHRmbGFnID8gQ1RBTElBUyA6IENBTElBUzsKLQkJLyogQXJlIHdlIHNldHRpbmcgdGhlIHZhbHVlIG9yIGp1c3Qgc29tZSBmbGFncz8gKi8KLQkJaWYgKCh2YWwgJiYgIXRmbGFnKSB8fCAoIXZhbCAmJiB0ZmxhZyAmJiAhVWZsYWcpKSB7Ci0JCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKLQkJCQlhcC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKLQkJCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKLQkJCX0KLQkJCS8qIGlnbm9yZSB2YWx1ZXMgZm9yIC10IChBVCZUIGtzaCBkb2VzIHRoaXMpICovCi0JCQluZXd2YWwgPSB0ZmxhZyA/IHNlYXJjaChhbGlhcywgcGF0aCwgWF9PSywgTlVMTCkgOiB2YWw7Ci0JCQlpZiAobmV3dmFsKSB7Ci0JCQkJc3RyZHVweChhcC0+dmFsLnMsIG5ld3ZhbCwgQVBFUk0pOwotCQkJCWFwLT5mbGFnIHw9IEFMTE9DfElTU0VUOwotCQkJfSBlbHNlCi0JCQkJYXAtPmZsYWcgJj0gfklTU0VUOwotCQl9Ci0JCWFwLT5mbGFnIHw9IERFRklORUQ7Ci0JCWlmIChwcmVmaXggPT0gJysnKQotCQkJYXAtPmZsYWcgJj0gfnhmbGFnOwotCQllbHNlCi0JCQlhcC0+ZmxhZyB8PSB4ZmxhZzsKLQkJYWZyZWUoeGFsaWFzLCBBVEVNUCk7Ci0JfQotCi0JcmV0dXJuIChydik7Ci19Ci0KLWludAotY191bmFsaWFzKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlzdHJ1Y3QgdGFibGUgKnQgPSAmYWxpYXNlczsKLQlzdHJ1Y3QgdGJsICphcDsKLQlpbnQgb3B0YywgcnYgPSAwOwotCWJvb2wgYWxsID0gZmFsc2U7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJhZHQiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdhJzoKLQkJCWFsbCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnZCc6Ci0jaWZkZWYgTUtTSF9OT1BXTkFNCi0JCQl0ID0gTlVMTDsJLyogZml4ICJ1bmFsaWFzIC1kdCIgKi8KLSNlbHNlCi0JCQl0ID0gJmhvbWVkaXJzOwotI2VuZGlmCi0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQl0ID0gJnRhbGlhc2VzOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotI2lmZGVmIE1LU0hfTk9QV05BTQotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0jZW5kaWYKLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKLQkJYXAgPSBrdHNlYXJjaCh0LCAqd3AsIGhhc2goKndwKSk7Ci0JCWlmIChhcCA9PSBOVUxMKSB7Ci0JCQlydiA9IDE7CS8qIFBPU0lYICovCi0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKLQkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOwotCQkJYWZyZWUoYXAtPnZhbC5zLCBBUEVSTSk7Ci0JCX0KLQkJYXAtPmZsYWcgJj0gfihERUZJTkVEfElTU0VUfEVYUE9SVCk7Ci0JfQotCi0JaWYgKGFsbCkgewotCQlzdHJ1Y3QgdHN0YXRlIHRzOwotCi0JCWZvciAoa3R3YWxrKCZ0cywgdCk7IChhcCA9IGt0bmV4dCgmdHMpKTsgKSB7Ci0JCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKLQkJCQlhcC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKLQkJCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKLQkJCX0KLQkJCWFwLT5mbGFnICY9IH4oREVGSU5FRHxJU1NFVHxFWFBPUlQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIChydik7Ci19Ci0KLWludAotY19sZXQoY29uc3QgY2hhciAqKndwKQotewotCWludCBydiA9IDE7Ci0JbWtzaF9hcmlfdCB2YWw7Ci0KLQlpZiAod3BbMV0gPT0gTlVMTCkgLyogQVQmVCBrc2ggZG9lcyB0aGlzICovCi0JCWJpX2Vycm9yZigibm8gYXJndW1lbnRzIik7Ci0JZWxzZQotCQlmb3IgKHdwKys7ICp3cDsgd3ArKykKLQkJCWlmICghZXZhbHVhdGUoKndwLCAmdmFsLCBLU0hfUkVUVVJOX0VSUk9SLCB0cnVlKSkgewotCQkJCXJ2ID0gMjsJLyogZGlzdGluZ3Vpc2ggZXJyb3IgZnJvbSB6ZXJvIHJlc3VsdCAqLwotCQkJCWJyZWFrOwotCQkJfSBlbHNlCi0JCQkJcnYgPSB2YWwgPT0gMDsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotaW50Ci1jX2pvYnMoY29uc3QgY2hhciAqKndwKQotewotCWludCBvcHRjLCBmbGFnID0gMCwgbmZsYWcgPSAwLCBydiA9IDA7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJscG56IikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnbCc6Ci0JCQlmbGFnID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCWZsYWcgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJbmZsYWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3onOgkvKiBkZWJ1Z2dpbmc6IHByaW50IHpvbWJpZXMgKi8KLQkJCW5mbGFnID0gLTE7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCWlmICghKndwKSB7Ci0JCWlmIChqX2pvYnMoTlVMTCwgZmxhZywgbmZsYWcpKQotCQkJcnYgPSAxOwotCX0gZWxzZSB7Ci0JCWZvciAoOyAqd3A7IHdwKyspCi0JCQlpZiAoal9qb2JzKCp3cCwgZmxhZywgbmZsYWcpKQotCQkJCXJ2ID0gMTsKLQl9Ci0JcmV0dXJuIChydik7Ci19Ci0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi1pbnQKLWNfZmdiZyhjb25zdCBjaGFyICoqd3ApCi17Ci0JYm9vbCBiZyA9IHN0cmNtcCgqd3AsICJiZyIpID09IDA7Ci0JaW50IHJ2ID0gMDsKLQotCWlmICghRmxhZyhGTU9OSVRPUikpIHsKLQkJYmlfZXJyb3JmKCJqb2IgY29udHJvbCBub3QgZW5hYmxlZCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCWlmICgqd3ApCi0JCWZvciAoOyAqd3A7IHdwKyspCi0JCQlydiA9IGpfcmVzdW1lKCp3cCwgYmcpOwotCWVsc2UKLQkJcnYgPSBqX3Jlc3VtZSgiJSUiLCBiZyk7Ci0JcmV0dXJuIChiZyA/IDAgOiBydik7Ci19Ci0jZW5kaWYKLQotLyogZm9ybWF0IGEgc2luZ2xlIGtpbGwgaXRlbSAqLwotc3RhdGljIGNoYXIgKgota2lsbF9mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQotewotCWNvbnN0IHN0cnVjdCBraWxsX2luZm8gKmtpID0gKGNvbnN0IHN0cnVjdCBraWxsX2luZm8gKilhcmc7Ci0KLQlpKys7Ci0Jc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJSpkICUqcyAlcyIsCi0JICAgIGtpLT5udW1fd2lkdGgsIGksCi0JICAgIGtpLT5uYW1lX3dpZHRoLCBzaWd0cmFwc1tpXS5uYW1lLAotCSAgICBzaWd0cmFwc1tpXS5tZXNzKTsKLQlyZXR1cm4gKGJ1Zik7Ci19Ci0KLWludAotY19raWxsKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlUcmFwICp0ID0gTlVMTDsKLQljb25zdCBjaGFyICpwOwotCWJvb2wgbGZsYWcgPSBmYWxzZTsKLQlpbnQgaSwgbiwgcnYsIHNpZzsKLQotCS8qIGFzc3VtZSBvbGQgc3R5bGUgb3B0aW9ucyBpZiAtZGlnaXRzIG9yIC1VUFBFUkNBU0UgKi8KLQlpZiAoKHAgPSB3cFsxXSkgJiYgKnAgPT0gJy0nICYmIChrc2hfaXNkaWdpdChwWzFdKSB8fAotCSAgICBrc2hfaXN1cHBlcihwWzFdKSkpIHsKLQkJaWYgKCEodCA9IGdldHRyYXAocCArIDEsIHRydWUpKSkgewotCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICclcyciLCBwICsgMSk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCWkgPSAod3BbMl0gJiYgc3RyY21wKHdwWzJdLCAiLS0iKSA9PSAwKSA/IDMgOiAyOwotCX0gZWxzZSB7Ci0JCWludCBvcHRjOwotCi0JCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImxzOiIpKSAhPSAtMSkKLQkJCXN3aXRjaCAob3B0YykgewotCQkJY2FzZSAnbCc6Ci0JCQkJbGZsYWcgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncyc6Ci0JCQkJaWYgKCEodCA9IGdldHRyYXAoYnVpbHRpbl9vcHQub3B0YXJnLCB0cnVlKSkpIHsKLQkJCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICclcyciLAotCQkJCQkgICAgYnVpbHRpbl9vcHQub3B0YXJnKTsKLQkJCQkJcmV0dXJuICgxKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQlpID0gYnVpbHRpbl9vcHQub3B0aW5kOwotCX0KLQlpZiAoKGxmbGFnICYmIHQpIHx8ICghd3BbaV0gJiYgIWxmbGFnKSkgewotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCXNoZl9wdXRzKCJ1c2FnZTpcdGtpbGwgWy1zIHNpZ25hbWUgfCAtc2lnbnVtIHwgLXNpZ25hbWVdIgotCQkgICAgIiB7IGpvYiB8IHBpZCB8IHBncnAgfSAuLi5cbiIKLQkJICAgICJcdGtpbGwgLWwgW2V4aXRfc3RhdHVzIC4uLl1cbiIsIHNobF9vdXQpOwotI2VuZGlmCi0JCWJpX2Vycm9yZnooKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlpZiAobGZsYWcpIHsKLQkJaWYgKHdwW2ldKSB7Ci0JCQlmb3IgKDsgd3BbaV07IGkrKykgewotCQkJCWlmICghYmlfZ2V0bih3cFtpXSwgJm4pKQotCQkJCQlyZXR1cm4gKDEpOwotCQkJCWlmIChuID4gMTI4ICYmIG4gPCAxMjggKyBOU0lHKQotCQkJCQluIC09IDEyODsKLQkJCQlpZiAobiA+IDAgJiYgbiA8IE5TSUcpCi0JCQkJCXNocHJpbnRmKCIlc1xuIiwgc2lndHJhcHNbbl0ubmFtZSk7Ci0JCQkJZWxzZQotCQkJCQlzaHByaW50ZigiJWRcbiIsIG4pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IHcsIGosIG1lc3NfY29scywgbWVzc19vY3RzOwotCQkJc3RydWN0IGtpbGxfaW5mbyBraTsKLQotCQkJZm9yIChqID0gTlNJRywga2kubnVtX3dpZHRoID0gMTsgaiA+PSAxMDsgaiAvPSAxMCkKLQkJCQlraS5udW1fd2lkdGgrKzsKLQkJCWtpLm5hbWVfd2lkdGggPSBtZXNzX2NvbHMgPSBtZXNzX29jdHMgPSAwOwotCQkJZm9yIChqID0gMDsgaiA8IE5TSUc7IGorKykgewotCQkJCXcgPSBzdHJsZW4oc2lndHJhcHNbal0ubmFtZSk7Ci0JCQkJaWYgKHcgPiBraS5uYW1lX3dpZHRoKQotCQkJCQlraS5uYW1lX3dpZHRoID0gdzsKLQkJCQl3ID0gc3RybGVuKHNpZ3RyYXBzW2pdLm1lc3MpOwotCQkJCWlmICh3ID4gbWVzc19vY3RzKQotCQkJCQltZXNzX29jdHMgPSB3OwotCQkJCXcgPSB1dGZfbWJzd2lkdGgoc2lndHJhcHNbal0ubWVzcyk7Ci0JCQkJaWYgKHcgPiBtZXNzX2NvbHMpCi0JCQkJCW1lc3NfY29scyA9IHc7Ci0JCQl9Ci0KLQkJCXByaW50X2NvbHVtbnMoc2hsX3N0ZG91dCwgTlNJRyAtIDEsCi0JCQkgICAga2lsbF9mbXRfZW50cnksICh2b2lkICopJmtpLAotCQkJICAgIGtpLm51bV93aWR0aCArIDEgKyBraS5uYW1lX3dpZHRoICsgMSArIG1lc3Nfb2N0cywKLQkJCSAgICBraS5udW1fd2lkdGggKyAxICsga2kubmFtZV93aWR0aCArIDEgKyBtZXNzX2NvbHMsCi0JCQkgICAgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuICgwKTsKLQl9Ci0JcnYgPSAwOwotCXNpZyA9IHQgPyB0LT5zaWduYWwgOiBTSUdURVJNOwotCWZvciAoOyAocCA9IHdwW2ldKTsgaSsrKSB7Ci0JCWlmICgqcCA9PSAnJScpIHsKLQkJCWlmIChqX2tpbGwocCwgc2lnKSkKLQkJCQlydiA9IDE7Ci0JCX0gZWxzZSBpZiAoIWdldG4ocCwgJm4pKSB7Ci0JCQliaV9lcnJvcmYoIiVzOiBhcmd1bWVudHMgbXVzdCBiZSBqb2JzIG9yIHByb2Nlc3MgSURzIiwKLQkJCSAgICBwKTsKLQkJCXJ2ID0gMTsKLQkJfSBlbHNlIHsKLQkJCWlmIChta3NoX2tpbGwobiwgc2lnKSA8IDApIHsKLQkJCQliaV9lcnJvcmYoIiVzOiAlcyIsIHAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJcnYgPSAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAocnYpOwotfQotCi12b2lkCi1nZXRvcHRzX3Jlc2V0KGludCB2YWwpCi17Ci0JaWYgKHZhbCA+PSAxKSB7Ci0JCWtzaF9nZXRvcHRfcmVzZXQoJnVzZXJfb3B0LCBHRl9OT05BTUUgfCBHRl9QTFVTT1BUKTsKLQkJdXNlcl9vcHQub3B0aW5kID0gdXNlcl9vcHQudW9wdGluZCA9IHZhbDsKLQl9Ci19Ci0KLWludAotY19nZXRvcHRzKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgYXJnYywgb3B0YywgcnY7Ci0JY29uc3QgY2hhciAqb3B0cywgKnZhcjsKLQljaGFyIGJ1ZlszXTsKLQlzdHJ1Y3QgdGJsICp2cSwgKnZvcHRhcmc7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCi0Jb3B0cyA9ICp3cCsrOwotCWlmICghb3B0cykgewotCQliaV9lcnJvcmYoIm1pc3Npbmcgb3B0aW9ucyBhcmd1bWVudCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCXZhciA9ICp3cCsrOwotCWlmICghdmFyKSB7Ci0JCWJpX2Vycm9yZigibWlzc2luZyBuYW1lIGFyZ3VtZW50Iik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCWlmICghKnZhciB8fCAqc2tpcF92YXJuYW1lKHZhciwgdHJ1ZSkpIHsKLQkJYmlfZXJyb3JmKCIlczogaXMgbm90IGFuIGlkZW50aWZpZXIiLCB2YXIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChlLT5sb2MtPm5leHQgPT0gTlVMTCkgewotCQlpbnRlcm5hbF93YXJuaW5nZigiY19nZXRvcHRzOiBubyBhcmd2Iik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCS8qIFdoaWNoIGFyZ3VtZW50cyBhcmUgd2UgcGFyc2luZy4uLiAqLwotCWlmICgqd3AgPT0gTlVMTCkKLQkJd3AgPSBlLT5sb2MtPm5leHQtPmFyZ3Y7Ci0JZWxzZQotCQkqLS13cCA9IGUtPmxvYy0+bmV4dC0+YXJndlswXTsKLQotCS8qIENoZWNrIHRoYXQgb3VyIHNhdmVkIHN0YXRlIHdvbid0IGNhdXNlIGEgY29yZSBkdW1wLi4uICovCi0JZm9yIChhcmdjID0gMDsgd3BbYXJnY107IGFyZ2MrKykKLQkJOwotCWlmICh1c2VyX29wdC5vcHRpbmQgPiBhcmdjIHx8Ci0JICAgICh1c2VyX29wdC5wICE9IDAgJiYKLQkgICAgdXNlcl9vcHQucCA+IHN0cmxlbih3cFt1c2VyX29wdC5vcHRpbmQgLSAxXSkpKSB7Ci0JCWJpX2Vycm9yZigiYXJndW1lbnRzIGNoYW5nZWQgc2luY2UgbGFzdCBjYWxsIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JdXNlcl9vcHQub3B0YXJnID0gTlVMTDsKLQlvcHRjID0ga3NoX2dldG9wdCh3cCwgJnVzZXJfb3B0LCBvcHRzKTsKLQotCWlmIChvcHRjID49IDAgJiYgb3B0YyAhPSAnPycgJiYgKHVzZXJfb3B0LmluZm8gJiBHSV9QTFVTKSkgewotCQlidWZbMF0gPSAnKyc7Ci0JCWJ1ZlsxXSA9IG9wdGM7Ci0JCWJ1ZlsyXSA9ICdcMCc7Ci0JfSBlbHNlIHsKLQkJLyogUE9TSVggc2F5cyB2YXIgaXMgc2V0IHRvID8gYXQgZW5kLW9mLW9wdGlvbnMsIEFUJlQga3NoCi0JCSAqIHNldHMgaXQgdG8gbnVsbCAtIHdlIGdvIHdpdGggUE9TSVguLi4KLQkJICovCi0JCWJ1ZlswXSA9IG9wdGMgPCAwID8gJz8nIDogb3B0YzsKLQkJYnVmWzFdID0gJ1wwJzsKLQl9Ci0KLQkvKiBBVCZUIGtzaDkzIGluIGZhY3QgZG9lcyBjaGFuZ2UgT1BUSU5EIGZvciB1bmtub3duIG9wdGlvbnMgdG9vICovCi0JdXNlcl9vcHQudW9wdGluZCA9IHVzZXJfb3B0Lm9wdGluZDsKLQotCXZvcHRhcmcgPSBnbG9iYWwoIk9QVEFSRyIpOwotCXZvcHRhcmctPmZsYWcgJj0gflJET05MWTsJLyogQVQmVCBrc2ggY2xlYXJzIHJvIGFuZCBpbnQgKi8KLQkvKiBQYXJhbm9pYTogZW5zdXJlIG5vIGJpemFycmUgcmVzdWx0cy4gKi8KLQlpZiAodm9wdGFyZy0+ZmxhZyAmIElOVEVHRVIpCi0JICAgIHR5cGVzZXQoIk9QVEFSRyIsIDAsIElOVEVHRVIsIDAsIDApOwotCWlmICh1c2VyX29wdC5vcHRhcmcgPT0gTlVMTCkKLQkJdW5zZXQodm9wdGFyZywgMSk7Ci0JZWxzZQotCQkvKiBUaGlzIGNhbid0IGZhaWwgKGhhdmUgY2xlYXJlZCByZWFkb25seS9pbnRlZ2VyKSAqLwotCQlzZXRzdHIodm9wdGFyZywgdXNlcl9vcHQub3B0YXJnLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQotCXJ2ID0gMDsKLQotCXZxID0gZ2xvYmFsKHZhcik7Ci0JLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IHByaW50ZWQgKGludGVnZXIsIHJlYWRvbmx5KSAqLwotCWlmICghc2V0c3RyKHZxLCBidWYsIEtTSF9SRVRVUk5fRVJST1IpKQotCQlydiA9IDE7Ci0JaWYgKEZsYWcoRkVYUE9SVCkpCi0JCXR5cGVzZXQodmFyLCBFWFBPUlQsIDAsIDAsIDApOwotCi0JcmV0dXJuIChvcHRjIDwgMCA/IDEgOiBydik7Ci19Ci0KLWludAotY19iaW5kKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgb3B0YywgcnYgPSAwOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JYm9vbCBtYWNybyA9IGZhbHNlOwotI2VuZGlmCi0JYm9vbCBsaXN0ID0gZmFsc2U7Ci0JY29uc3QgY2hhciAqY3A7Ci0JY2hhciAqdXA7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsCi0jaWZuZGVmIE1LU0hfU01BTEwKLQkgICAgImxtIgotI2Vsc2UKLQkgICAgImwiCi0jZW5kaWYKLQkgICAgKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdsJzoKLQkJCWxpc3QgPSB0cnVlOwotCQkJYnJlYWs7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJY2FzZSAnbSc6Ci0JCQltYWNybyA9IHRydWU7Ci0JCQlicmVhazsKLSNlbmRpZgotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQlpZiAoKndwID09IE5VTEwpCS8qIGxpc3QgYWxsICovCi0JCXJ2ID0geF9iaW5kKE5VTEwsIE5VTEwsCi0jaWZuZGVmIE1LU0hfU01BTEwKLQkJICAgIGZhbHNlLAotI2VuZGlmCi0JCSAgICBsaXN0KTsKLQotCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgewotCQlpZiAoKGNwID0gY3N0cmNocigqd3AsICc9JykpID09IE5VTEwpCi0JCQl1cCA9IE5VTEw7Ci0JCWVsc2UgewotCQkJc3RyZHVweCh1cCwgKndwLCBBVEVNUCk7Ci0JCQl1cFtjcCsrIC0gKndwXSA9ICdcMCc7Ci0JCX0KLQkJaWYgKHhfYmluZCh1cCA/IHVwIDogKndwLCBjcCwKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQkgICAgbWFjcm8sCi0jZW5kaWYKLQkJICAgIGZhbHNlKSkKLQkJCXJ2ID0gMTsKLQkJYWZyZWUodXAsIEFURU1QKTsKLQl9Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyogOiwgZmFsc2UgYW5kIHRydWUgKGFuZCB1bGltaXQgaWYgTUtTSF9OT19MSU1JVFMpICovCi1pbnQKLWNfbGFiZWwoY29uc3QgY2hhciAqKndwKQotewotCXJldHVybiAod3BbMF1bMF0gPT0gJ2YnID8gMSA6IDApOwotfQotCi1pbnQKLWNfc2hpZnQoY29uc3QgY2hhciAqKndwKQotewotCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKLQlpbnQgbjsKLQlta3NoX2FyaV90IHZhbDsKLQljb25zdCBjaGFyICphcmc7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0JYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKLQotCWlmIChhcmcpIHsKLQkJZXZhbHVhdGUoYXJnLCAmdmFsLCBLU0hfVU5XSU5EX0VSUk9SLCBmYWxzZSk7Ci0JCW4gPSB2YWw7Ci0JfSBlbHNlCi0JCW4gPSAxOwotCWlmIChuIDwgMCkgewotCQliaV9lcnJvcmYoIiVzOiBiYWQgbnVtYmVyIiwgYXJnKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JaWYgKGwtPmFyZ2MgPCBuKSB7Ci0JCWJpX2Vycm9yZigibm90aGluZyB0byBzaGlmdCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlsLT5hcmd2W25dID0gbC0+YXJndlswXTsKLQlsLT5hcmd2ICs9IG47Ci0JbC0+YXJnYyAtPSBuOwotCXJldHVybiAoMCk7Ci19Ci0KLWludAotY191bWFzayhjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IGksIG9wdGM7Ci0JY29uc3QgY2hhciAqY3A7Ci0JYm9vbCBzeW1ib2xpYyA9IGZhbHNlOwotCW1vZGVfdCBvbGRfdW1hc2s7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJTIikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnUyc6Ci0JCQlzeW1ib2xpYyA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JY3AgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOwotCWlmIChjcCA9PSBOVUxMKSB7Ci0JCW9sZF91bWFzayA9IHVtYXNrKChtb2RlX3QpMCk7Ci0JCXVtYXNrKG9sZF91bWFzayk7Ci0JCWlmIChzeW1ib2xpYykgewotCQkJY2hhciBidWZbMThdLCAqcDsKLQkJCWludCBqOwotCi0JCQlvbGRfdW1hc2sgPSB+b2xkX3VtYXNrOwotCQkJcCA9IGJ1ZjsKLQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQkqcCsrID0gInVnbyJbaV07Ci0JCQkJKnArKyA9ICc9JzsKLQkJCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotCQkJCQlpZiAob2xkX3VtYXNrICYgKDEgPDwgKDggLSAoMyppICsgaikpKSkKLQkJCQkJCSpwKysgPSAicnd4IltqXTsKLQkJCQkqcCsrID0gJywnOwotCQkJfQotCQkJcFstMV0gPSAnXDAnOwotCQkJc2hwcmludGYoIiVzXG4iLCBidWYpOwotCQl9IGVsc2UKLQkJCXNocHJpbnRmKCIlIzMuM29cbiIsICh1bnNpZ25lZCBpbnQpb2xkX3VtYXNrKTsKLQl9IGVsc2UgewotCQltb2RlX3QgbmV3X3VtYXNrOwotCi0JCWlmIChrc2hfaXNkaWdpdCgqY3ApKSB7Ci0JCQlmb3IgKG5ld191bWFzayA9IDA7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc3JzsgY3ArKykKLQkJCQluZXdfdW1hc2sgPSBuZXdfdW1hc2sgKiA4ICsgKCpjcCAtICcwJyk7Ci0JCQlpZiAoKmNwKSB7Ci0JCQkJYmlfZXJyb3JmKCJiYWQgbnVtYmVyIik7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHN5bWJvbGljIGZvcm1hdCAqLwotCQkJaW50IHBvc2l0aW9ucywgbmV3X3ZhbDsKLQkJCWNoYXIgb3A7Ci0KLQkJCW9sZF91bWFzayA9IHVtYXNrKChtb2RlX3QpMCk7Ci0JCQl1bWFzayhvbGRfdW1hc2spOyAvKiBpbiBjYXNlIG9mIGVycm9yICovCi0JCQlvbGRfdW1hc2sgPSB+b2xkX3VtYXNrOwotCQkJbmV3X3VtYXNrID0gb2xkX3VtYXNrOwotCQkJcG9zaXRpb25zID0gMDsKLQkJCXdoaWxlICgqY3ApIHsKLQkJCQl3aGlsZSAoKmNwICYmIHZzdHJjaHIoImF1Z28iLCAqY3ApKQotCQkJCQlzd2l0Y2ggKCpjcCsrKSB7Ci0JCQkJCWNhc2UgJ2EnOgotCQkJCQkJcG9zaXRpb25zIHw9IDAxMTE7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAndSc6Ci0JCQkJCQlwb3NpdGlvbnMgfD0gMDEwMDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdnJzoKLQkJCQkJCXBvc2l0aW9ucyB8PSAwMDEwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ28nOgotCQkJCQkJcG9zaXRpb25zIHw9IDAwMDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWlmICghcG9zaXRpb25zKQotCQkJCQlwb3NpdGlvbnMgPSAwMTExOyAvKiBkZWZhdWx0IGlzIGEgKi8KLQkJCQlpZiAoIXZzdHJjaHIoIj0rLSIsIG9wID0gKmNwKSkKLQkJCQkJYnJlYWs7Ci0JCQkJY3ArKzsKLQkJCQluZXdfdmFsID0gMDsKLQkJCQl3aGlsZSAoKmNwICYmIHZzdHJjaHIoInJ3eHVnb1hzIiwgKmNwKSkKLQkJCQkJc3dpdGNoICgqY3ArKykgewotCQkJCQljYXNlICdyJzogbmV3X3ZhbCB8PSAwNDsgYnJlYWs7Ci0JCQkJCWNhc2UgJ3cnOiBuZXdfdmFsIHw9IDAyOyBicmVhazsKLQkJCQkJY2FzZSAneCc6IG5ld192YWwgfD0gMDE7IGJyZWFrOwotCQkJCQljYXNlICd1JzoKLQkJCQkJCW5ld192YWwgfD0gb2xkX3VtYXNrID4+IDY7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnZyc6Ci0JCQkJCQluZXdfdmFsIHw9IG9sZF91bWFzayA+PiAzOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ28nOgotCQkJCQkJbmV3X3ZhbCB8PSBvbGRfdW1hc2sgPj4gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdYJzoKLQkJCQkJCWlmIChvbGRfdW1hc2sgJiAwMTExKQotCQkJCQkJCW5ld192YWwgfD0gMDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAncyc6Ci0JCQkJCQkvKiBpZ25vcmVkICovCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCW5ld192YWwgPSAobmV3X3ZhbCAmIDA3KSAqIHBvc2l0aW9uczsKLQkJCQlzd2l0Y2ggKG9wKSB7Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJCW5ld191bWFzayAmPSB+bmV3X3ZhbDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPSc6Ci0JCQkJCW5ld191bWFzayA9IG5ld192YWwgfAotCQkJCQkgICAgKG5ld191bWFzayAmIH4ocG9zaXRpb25zICogMDcpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKyc6Ci0JCQkJCW5ld191bWFzayB8PSBuZXdfdmFsOwotCQkJCX0KLQkJCQlpZiAoKmNwID09ICcsJykgewotCQkJCQlwb3NpdGlvbnMgPSAwOwotCQkJCQljcCsrOwotCQkJCX0gZWxzZSBpZiAoIXZzdHJjaHIoIj0rLSIsICpjcCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCpjcCkgewotCQkJCWJpX2Vycm9yZigiYmFkIG1hc2siKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJbmV3X3VtYXNrID0gfm5ld191bWFzazsKLQkJfQotCQl1bWFzayhuZXdfdW1hc2spOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi1pbnQKLWNfZG90KGNvbnN0IGNoYXIgKip3cCkKLXsKLQljb25zdCBjaGFyICpmaWxlLCAqY3AsICoqYXJndjsKLQlpbnQgYXJnYywgaSwgZXJyY29kZTsKLQotCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKLQkJcmV0dXJuICgxKTsKLQotCWlmICgoY3AgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdKSA9PSBOVUxMKSB7Ci0JCWJpX2Vycm9yZigibWlzc2luZyBhcmd1bWVudCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAoKGZpbGUgPSBzZWFyY2goY3AsIHBhdGgsIFJfT0ssICZlcnJjb2RlKSkgPT0gTlVMTCkgewotCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLAotCQkgICAgZXJyY29kZSA/IHN0cmVycm9yKGVycmNvZGUpIDogIm5vdCBmb3VuZCIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCS8qIFNldCBwb3NpdGlvbmFsIHBhcmFtZXRlcnM/ICovCi0JaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZCArIDFdKSB7Ci0JCWFyZ3YgPSB3cCArIGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQkJYXJndlswXSA9IGUtPmxvYy0+YXJndlswXTsgLyogcHJlc2VydmUgJDAgKi8KLQkJZm9yIChhcmdjID0gMDsgYXJndlthcmdjICsgMV07IGFyZ2MrKykKLQkJCTsKLQl9IGVsc2UgewotCQlhcmdjID0gMDsKLQkJYXJndiA9IE5VTEw7Ci0JfQotCWlmICgoaSA9IGluY2x1ZGUoZmlsZSwgYXJnYywgYXJndiwgMCkpIDwgMCkgewotCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLwotCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlyZXR1cm4gKGkpOwotfQotCi1pbnQKLWNfd2FpdChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IHJ2ID0gMCwgc2lnOwotCi0JaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQotCQlyZXR1cm4gKDEpOwotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQlpZiAoKndwID09IE5VTEwpIHsKLQkJd2hpbGUgKHdhaXRmb3IoTlVMTCwgJnNpZykgPj0gMCkKLQkJCTsKLQkJcnYgPSBzaWc7Ci0JfSBlbHNlIHsKLQkJZm9yICg7ICp3cDsgd3ArKykKLQkJCXJ2ID0gd2FpdGZvcigqd3AsICZzaWcpOwotCQlpZiAocnYgPCAwKQotCQkJcnYgPSBzaWcgPyBzaWcgOiAxMjc7IC8qIG1hZ2ljIGV4aXQgY29kZTogYmFkIGpvYi1pZCAqLwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotaW50Ci1jX3JlYWQoY29uc3QgY2hhciAqKndwKQotewotCWludCBjID0gMCwgZWNvZGUgPSAwLCBmZCA9IDAsIG9wdGM7Ci0JYm9vbCBleHBhbmRlID0gdHJ1ZSwgaGlzdG9yeXIgPSBmYWxzZSwgZXhwYW5kaW5nOwotCWNvbnN0IGNoYXIgKmNwLCAqZW1zZzsKLQlzdHJ1Y3Qgc2hmICpzaGY7Ci0JWFN0cmluZyBjcywgeHMgPSB7IE5VTEwsIE5VTEwsIDAsIE5VTEx9OwotCXN0cnVjdCB0YmwgKnZwOwotCWNoYXIgKmNjcCwgKnhwID0gTlVMTCwgKndwYWxsb2MgPSBOVUxMOwotCXN0YXRpYyBjaGFyIFJFUExZW10gPSAiUkVQTFkiOwotCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAicHJzdSwiKSkgIT0gLTEpCi0JCXN3aXRjaCAob3B0YykgewotCQljYXNlICdwJzoKLQkJCWlmICgoZmQgPSBjb3Byb2NfZ2V0ZmQoUl9PSywgJmVtc2cpKSA8IDApIHsKLQkJCQliaV9lcnJvcmYoIi1wOiAlcyIsIGVtc2cpOwotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCQlleHBhbmRlID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSAncyc6Ci0JCQloaXN0b3J5ciA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAndSc6Ci0JCQlpZiAoISooY3AgPSBidWlsdGluX29wdC5vcHRhcmcpKQotCQkJCWZkID0gMDsKLQkJCWVsc2UgaWYgKChmZCA9IGNoZWNrX2ZkKGNwLCBSX09LLCAmZW1zZykpIDwgMCkgewotCQkJCWJpX2Vycm9yZigiLXU6ICVzOiAlcyIsIGNwLCBlbXNnKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJcmV0dXJuICgxKTsKLQkJfQotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCWlmICgqd3AgPT0gTlVMTCkKLQkJKi0td3AgPSBSRVBMWTsKLQotCS8qIFNpbmNlIHdlIGNhbid0IG5lY2Vzc2FyaWx5IHNlZWsgYmFja3dhcmRzIG9uIG5vbi1yZWd1bGFyIGZpbGVzLAotCSAqIGRvbid0IGJ1ZmZlciB0aGVtIHNvIHdlIGNhbid0IHJlYWQgdG9vIG11Y2guCi0JICovCi0Jc2hmID0gc2hmX3Jlb3BlbihmZCwgU0hGX1JEIHwgU0hGX0lOVEVSUlVQVCB8IGNhbl9zZWVrKGZkKSwgc2hsX3NwYXJlKTsKLQotCWlmICgoY3AgPSBjc3RyY2hyKCp3cCwgJz8nKSkgIT0gTlVMTCkgewotCQlzdHJkdXB4KHdwYWxsb2MsICp3cCwgQVRFTVApOwotCQl3cGFsbG9jW2NwIC0gKndwXSA9ICdcMCc7Ci0JCSp3cCA9IHdwYWxsb2M7Ci0JCWlmIChpc2F0dHkoZmQpKSB7Ci0JCQkvKiBBVCZUIGtzaCBzYXlzIGl0IHByaW50cyBwcm9tcHQgb24gZmQgaWYgaXQncyBvcGVuCi0JCQkgKiBmb3Igd3JpdGluZyBhbmQgaXMgYSB0dHksIGJ1dCBpdCBkb2Vzbid0IGRvIGl0Ci0JCQkgKiAoaXQgYWxzbyBkb2Vzbid0IGNoZWNrIHRoZSBpbnRlcmFjdGl2ZSBmbGFnLAotCQkJICogYXMgaXMgaW5kaWNhdGVkIGluIHRoZSBLb3Juc2hlbGwgYm9vaykuCi0JCQkgKi8KLQkJCXNoZWxsZigiJXMiLCBjcCsxKTsKLQkJfQotCX0KLQotCS8qIElmIHdlIGFyZSByZWFkaW5nIGZyb20gdGhlIGNvLXByb2Nlc3MgZm9yIHRoZSBmaXJzdCB0aW1lLAotCSAqIG1ha2Ugc3VyZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcGlwZSBpcyBjbG9zZWQgZmlyc3QuIFRoaXMgYWxsb3dzCi0JICogdGhlIGRldGVjdGlvbiBvZiBlb2YuCi0JICoKLQkgKiBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQVQmVCBrc2guLi4gdGhlIGZkIGlzIGtlcHQgc28gYW5vdGhlcgotCSAqIGNvcHJvYyBjYW4gYmUgc3RhcnRlZCB3aXRoIHNhbWUgb3V0cHV0LCBob3dldmVyLCB0aGlzIG1lYW5zIGVvZgotCSAqIGNhbid0IGJlIGRldGVjdGVkLi4uIFRoaXMgaXMgd2h5IGl0IGlzIGNsb3NlZCBoZXJlLgotCSAqIElmIHRoaXMgY2FsbCBpcyByZW1vdmVkLCByZW1vdmUgdGhlIGVvZiBjaGVjayBiZWxvdywgdG9vLgotCSAqIGNvcHJvY19yZWFkd19jbG9zZShmZCk7Ci0JICovCi0KLQlpZiAoaGlzdG9yeXIpCi0JCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7Ci0JZXhwYW5kaW5nID0gZmFsc2U7Ci0JWGluaXQoY3MsIGNjcCwgMTI4LCBBVEVNUCk7Ci0JZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7Ci0JCWZvciAoY2NwID0gWHN0cmluZyhjcywgY2NwKTsgOyApIHsKLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSBFT0YpCi0JCQkJYnJlYWs7Ci0JCQl3aGlsZSAoMSkgewotCQkJCWMgPSBzaGZfZ2V0YyhzaGYpOwotCQkJCWlmIChjID09ICdcMCcpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjID09IEVPRiAmJiBzaGZfZXJyb3Ioc2hmKSAmJgotCQkJCSAgICBzaGZfZXJybm8oc2hmKSA9PSBFSU5UUikgewotCQkJCQkvKiBXYXMgdGhlIG9mZmVuZGluZyBzaWduYWwgb25lIHRoYXQKLQkJCQkJICogd291bGQgbm9ybWFsbHkga2lsbCBhIHByb2Nlc3M/Ci0JCQkJCSAqIElmIHNvLCBwcmV0ZW5kIHRoZSByZWFkIHdhcyBraWxsZWQuCi0JCQkJCSAqLwotCQkJCQllY29kZSA9IGZhdGFsX3RyYXBfY2hlY2soKTsKLQotCQkJCQkvKiBub24gZmF0YWwgKGVnLCBDSExEKSwgY2Fycnkgb24gKi8KLQkJCQkJaWYgKCFlY29kZSkgewotCQkJCQkJc2hmX2NsZWFyZXJyKHNoZik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChoaXN0b3J5cikgewotCQkJCVhjaGVjayh4cywgeHApOwotCQkJCVhwdXQoeHMsIHhwLCBjKTsKLQkJCX0KLQkJCVhjaGVjayhjcywgY2NwKTsKLQkJCWlmIChleHBhbmRpbmcpIHsKLQkJCQlleHBhbmRpbmcgPSBmYWxzZTsKLQkJCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJCWMgPSAwOwotCQkJCQlpZiAoRmxhZyhGVEFMS0lOR19JKSAmJiBpc2F0dHkoZmQpKSB7Ci0JCQkJCQkvKiBzZXQgcHJvbXB0IGluIGNhc2UgdGhpcyBpcwotCQkJCQkJICogY2FsbGVkIGZyb20gLnByb2ZpbGUgb3IgJEVOVgotCQkJCQkJICovCi0JCQkJCQlzZXRfcHJvbXB0KFBTMiwgTlVMTCk7Ci0JCQkJCQlwcHJvbXB0KHByb21wdCwgMCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGMgIT0gRU9GKQotCQkJCQlYcHV0KGNzLCBjY3AsIGMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGV4cGFuZGUgJiYgYyA9PSAnXFwnKSB7Ci0JCQkJZXhwYW5kaW5nID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSBFT0YpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoY3R5cGUoYywgQ19JRlMpKSB7Ci0JCQkJaWYgKFhsZW5ndGgoY3MsIGNjcCkgPT0gMCAmJiBjdHlwZShjLCBDX0lGU1dTKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHdwWzFdKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCVhwdXQoY3MsIGNjcCwgYyk7Ci0JCX0KLQkJLyogc3RyaXAgdHJhaWxpbmcgSUZTIHdoaXRlIHNwYWNlIGZyb20gbGFzdCB2YXJpYWJsZSAqLwotCQlpZiAoIXdwWzFdKQotCQkJd2hpbGUgKFhsZW5ndGgoY3MsIGNjcCkgJiYgY3R5cGUoY2NwWy0xXSwgQ19JRlMpICYmCi0JCQkgICAgY3R5cGUoY2NwWy0xXSwgQ19JRlNXUykpCi0JCQkJY2NwLS07Ci0JCVhwdXQoY3MsIGNjcCwgJ1wwJyk7Ci0JCXZwID0gZ2xvYmFsKCp3cCk7Ci0JCS8qIE11c3QgYmUgZG9uZSBiZWZvcmUgc2V0dGluZyBleHBvcnQuICovCi0JCWlmICh2cC0+ZmxhZyAmIFJET05MWSkgewotCQkJc2hmX2ZsdXNoKHNoZik7Ci0JCQliaV9lcnJvcmYoIiVzIGlzIHJlYWQgb25seSIsICp3cCk7Ci0JCQlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCWlmIChGbGFnKEZFWFBPUlQpKQotCQkJdHlwZXNldCgqd3AsIEVYUE9SVCwgMCwgMCwgMCk7Ci0JCWlmICghc2V0c3RyKHZwLCBYc3RyaW5nKGNzLCBjY3ApLCBLU0hfUkVUVVJOX0VSUk9SKSkgewotCQkJc2hmX2ZsdXNoKHNoZik7Ci0JCQlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfQotCi0Jc2hmX2ZsdXNoKHNoZik7Ci0JaWYgKGhpc3RvcnlyKSB7Ci0JCVhwdXQoeHMsIHhwLCAnXDAnKTsKLQkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgWHN0cmluZyh4cywgeHApLCB0cnVlLCBmYWxzZSk7Ci0JCVhmcmVlKHhzLCB4cCk7Ci0JfQotCS8qIGlmIHRoaXMgaXMgdGhlIGNvLXByb2Nlc3MgZmQsIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IKLQkgKiAoY2FuIGdldCBlb2YgaWYgYW5kIG9ubHkgaWYgYWxsIHByb2Nlc3NlcyBhcmUgaGF2ZSBkaWVkLCBpZSwKLQkgKiBjb3Byb2MubmpvYnMgaXMgMCBhbmQgdGhlIHBpcGUgaXMgY2xvc2VkKS4KLQkgKi8KLQlpZiAoYyA9PSBFT0YgJiYgIWVjb2RlKQotCQljb3Byb2NfcmVhZF9jbG9zZShmZCk7Ci0KLQlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7Ci0JcmV0dXJuIChlY29kZSA/IGVjb2RlIDogYyA9PSBFT0YpOwotfQotCi1pbnQKLWNfZXZhbChjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IHNvdXJjZSAqcywgKnNhdmVzID0gc291cmNlOwotCXVuc2lnbmVkIGNoYXIgc2F2ZWY7Ci0JaW50IHJ2OwotCi0JaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQotCQlyZXR1cm4gKDEpOwotCXMgPSBwdXNocyhTV09SRFMsIEFURU1QKTsKLQlzLT51LnN0cnYgPSB3cCArIGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCS8qLQotCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21tYW5kIGlzCi0JICogZW1wdHkgZHVlIHRvIGZhaWxlZCBjb21tYW5kIHN1YnN0aXR1dGlvbiwgZm9yIGV4YW1wbGUgYnkKLQkgKglldmFsICIkKGZhbHNlKSIKLQkgKiBUaGlzIGhhcyBoaXN0b3JpY2FsbHkgcmV0dXJuZWQgMSBieSBBVCZUIGtzaDg4LiBJbiB0aGlzCi0JICogY2FzZSwgc2hlbGwoKSB3aWxsIG5vdCBzZXQgb3IgY2hhbmdlIGV4c3RhdCBiZWNhdXNlIHRoZQotCSAqIGNvbXBpbGVkIHRyZWUgaXMgZW1wdHksIHNvIGl0IHdpbGwgdXNlIHRoZSB2YWx1ZSB3ZSBwYXNzCi0JICogZnJvbSBzdWJzdF9leHN0YXQsIHdoaWNoIGlzIGNsZWFyZWQgaW4gZXhlY3V0ZSgpLCBzbyBpdAotCSAqIHNob3VsZCBoYXZlIGJlZW4gMCBpZiB0aGVyZSB3ZXJlIG5vIHN1YnN0aXR1dGlvbnMuCi0JICoKLQkgKiBQT1NJWCBob3dldmVyIHNheXMgd2UgZG9uJ3QgZG8gdGhpcywgZXZlbiB0aG91Z2ggaXQgaXMKLQkgKiB0cmFkaXRpb25hbGx5IGRvbmUuIEFUJlQga3NoOTMgYWdyZWVzIHdpdGggUE9TSVgsIHNvIHdlCi0JICogZG8uIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhjZXJwdCBmcm9tIFNVU3Y0IFsxMDAzLjItMjAwOF06Ci0JICoKLQkgKiAyLjkuMTogU2ltcGxlIENvbW1hbmRzCi0JICoJLi4uIElmIHRoZXJlIGlzIGEgY29tbWFuZCBuYW1lLCBleGVjdXRpb24gc2hhbGwKLQkgKgljb250aW51ZSBhcyBkZXNjcmliZWQgaW4gMi45LjEuMSBbQ29tbWFuZCBTZWFyY2gKLQkgKglhbmQgRXhlY3V0aW9uXS4gSWYgdGhlcmUgaXMgbm8gY29tbWFuZCBuYW1lLCBidXQKLQkgKgl0aGUgY29tbWFuZCBjb250YWluZWQgYSBjb21tYW5kIHN1YnN0aXR1dGlvbiwgdGhlCi0JICoJY29tbWFuZCBzaGFsbCBjb21wbGV0ZSB3aXRoIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUKLQkgKglsYXN0IGNvbW1hbmQgc3Vic3RpdHV0aW9uIHBlcmZvcm1lZC4KLQkgKiAyLjkuMS4xOiBDb21tYW5kIFNlYXJjaCBhbmQgRXhlY3V0aW9uCi0JICoJKDEpIGEuIElmIHRoZSBjb21tYW5kIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiBhCi0JICoJc3BlY2lhbCBidWlsdC1pbiB1dGlsaXR5LCB0aGF0IHNwZWNpYWwgYnVpbHQtaW4KLQkgKgl1dGlsaXR5IHNoYWxsIGJlIGludm9rZWQuCi0JICogMi4xNC41OiBldmFsCi0JICoJSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgb3Igb25seSBudWxsIGFyZ3VtZW50cywKLQkgKglldmFsIHNoYWxsIHJldHVybiBhIHplcm8gZXhpdCBzdGF0dXM7IC4uLgotCSAqLwotCS8qIGV4c3RhdCA9IHN1YnN0X2V4c3RhdDsgKi8JLyogQVQmVCBrc2g4OCAqLwotCWV4c3RhdCA9IDA7CQkJLyogU1VTdjQgKi8KLQotCXNhdmVmID0gRmxhZyhGRVJSRVhJVCk7Ci0JRmxhZyhGRVJSRVhJVCkgPSAwOwotCXJ2ID0gc2hlbGwocywgZmFsc2UpOwotCUZsYWcoRkVSUkVYSVQpID0gc2F2ZWY7Ci0Jc291cmNlID0gc2F2ZXM7Ci0JYWZyZWUocywgQVRFTVApOwotCXJldHVybiAocnYpOwotfQotCi1pbnQKLWNfdHJhcChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqczsKLQlUcmFwICpwOwotCi0JaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQotCQlyZXR1cm4gKDEpOwotCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKLQotCWlmICgqd3AgPT0gTlVMTCkgewotCQlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKLQkJCWlmIChwLT50cmFwICE9IE5VTEwpIHsKLQkJCQlzaGZfcHV0cygidHJhcCAtLSAiLCBzaGxfc3Rkb3V0KTsKLQkJCQlwcmludF92YWx1ZV9xdW90ZWQocC0+dHJhcCk7Ci0JCQkJc2hwcmludGYoIiAlc1xuIiwgcC0+bmFtZSk7Ci0JCQl9Ci0JCXJldHVybiAoMCk7Ci0JfQotCi0JLyoKLQkgKiBVc2UgY2FzZSBzZW5zaXRpdmUgbG9va3VwIGZvciBmaXJzdCBhcmcgc28gdGhlCi0JICogY29tbWFuZCAnZXhpdCcgaXNuJ3QgY29uZnVzZWQgd2l0aCB0aGUgcHNldWRvLXNpZ25hbAotCSAqICdFWElUJy4KLQkgKi8KLQlzID0gKGdldHRyYXAoKndwLCBmYWxzZSkgPT0gTlVMTCkgPyAqd3ArKyA6IE5VTEw7IC8qIGdldCBjb21tYW5kICovCi0JaWYgKHMgIT0gTlVMTCAmJiBzWzBdID09ICctJyAmJiBzWzFdID09ICdcMCcpCi0JCXMgPSBOVUxMOwotCi0JLyogc2V0L2NsZWFyIHRyYXBzICovCi0Jd2hpbGUgKCp3cCAhPSBOVUxMKSB7Ci0JCXAgPSBnZXR0cmFwKCp3cCsrLCB0cnVlKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICVzIiwgd3BbLTFdKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJc2V0dHJhcChwLCBzKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1jX2V4aXRyZXR1cm4oY29uc3QgY2hhciAqKndwKQotewotCWludCBuLCBob3cgPSBMRVhJVDsKLQljb25zdCBjaGFyICphcmc7Ci0KLQlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCi0JCXJldHVybiAoMSk7Ci0JYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKLQotCWlmIChhcmcpIHsKLQkJaWYgKCFnZXRuKGFyZywgJm4pKSB7Ci0JCQlleHN0YXQgPSAxOwotCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBiYWQgbnVtYmVyIiwgYXJnKTsKLQkJfSBlbHNlCi0JCQlleHN0YXQgPSBuOwotCX0KLQlpZiAod3BbMF1bMF0gPT0gJ3InKSB7IC8qIHJldHVybiAqLwotCQlzdHJ1Y3QgZW52ICplcDsKLQotCQkvKiBuZWVkIHRvIHRlbGwgaWYgdGhpcyBpcyBleGl0IG9yIHJldHVybiBzbyB0cmFwIGV4aXQgd2lsbAotCQkgKiB3b3JrIHJpZ2h0IChQT1NJWCkKLQkJICovCi0JCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikKLQkJCWlmIChTVE9QX1JFVFVSTihlcC0+dHlwZSkpIHsKLQkJCQlob3cgPSBMUkVUVVJOOwotCQkJCWJyZWFrOwotCQkJfQotCX0KLQotCWlmIChob3cgPT0gTEVYSVQgJiYgIXJlYWxseV9leGl0ICYmIGpfc3RvcHBlZF9ydW5uaW5nKCkpIHsKLQkJcmVhbGx5X2V4aXQgPSAxOwotCQlob3cgPSBMU0hFTEw7Ci0JfQotCi0JcXVpdGVudihOVUxMKTsJLyogZ2V0IHJpZCBvZiBhbnkgaS9vIHJlZGlyZWN0aW9ucyAqLwotCXVud2luZChob3cpOwotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotaW50Ci1jX2Jya2NvbnQoY29uc3QgY2hhciAqKndwKQotewotCWludCBuLCBxdWl0OwotCXN0cnVjdCBlbnYgKmVwLCAqbGFzdF9lcCA9IE5VTEw7Ci0JY29uc3QgY2hhciAqYXJnOwotCi0JaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQotCQlyZXR1cm4gKDEpOwotCWFyZyA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07Ci0KLQlpZiAoIWFyZykKLQkJbiA9IDE7Ci0JZWxzZSBpZiAoIWJpX2dldG4oYXJnLCAmbikpCi0JCXJldHVybiAoMSk7Ci0JcXVpdCA9IG47Ci0JaWYgKHF1aXQgPD0gMCkgewotCQkvKiBBVCZUIGtzaCBkb2VzIHRoaXMgZm9yIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMgb25seSAtIHdlaXJkICovCi0JCWJpX2Vycm9yZigiJXM6IGJhZCB2YWx1ZSIsIGFyZyk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JLyogU3RvcCBhdCBFX05PTkUsIEVfUEFSU0UsIEVfRlVOQywgb3IgRV9JTkNMICovCi0JZm9yIChlcCA9IGU7IGVwICYmICFTVE9QX0JSS0NPTlQoZXAtPnR5cGUpOyBlcCA9IGVwLT5vZW52KQotCQlpZiAoZXAtPnR5cGUgPT0gRV9MT09QKSB7Ci0JCQlpZiAoLS1xdWl0ID09IDApCi0JCQkJYnJlYWs7Ci0JCQllcC0+ZmxhZ3MgfD0gRUZfQlJLQ09OVF9QQVNTOwotCQkJbGFzdF9lcCA9IGVwOwotCQl9Ci0KLQlpZiAocXVpdCkgewotCQkvKiBBVCZUIGtzaCBkb2Vzbid0IHByaW50IGEgbWVzc2FnZSAtIGp1c3QgZG9lcyB3aGF0IGl0Ci0JCSAqIGNhbi4gV2UgcHJpbnQgYSBtZXNzYWdlICdjYXVzZSBpdCBoZWxwcyBpbiBkZWJ1Z2dpbmcKLQkJICogc2NyaXB0cywgYnV0IGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIChpZSwga2VlcCBnb2luZykuCi0JCSAqLwotCQlpZiAobiA9PSBxdWl0KSB7Ci0JCQl3YXJuaW5nZih0cnVlLCAiJXM6IGNhbm5vdCAlcyIsIHdwWzBdLCB3cFswXSk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCS8qIFBPU0lYIHNheXMgaWYgbiBpcyB0b28gYmlnLCB0aGUgbGFzdCBlbmNsb3NpbmcgbG9vcAotCQkgKiBzaGFsbCBiZSB1c2VkLiBEb2Vzbid0IHNheSB0byBwcmludCBhbiBlcnJvciBidXQgd2UKLQkJICogZG8gYW55d2F5ICdjYXVzZSB0aGUgdXNlciBtZXNzZWQgdXAuCi0JCSAqLwotCQlpZiAobGFzdF9lcCkKLQkJCWxhc3RfZXAtPmZsYWdzICY9IH5FRl9CUktDT05UX1BBU1M7Ci0JCXdhcm5pbmdmKHRydWUsICIlczogY2FuIG9ubHkgJXMgJWQgbGV2ZWwocykiLAotCQkgICAgd3BbMF0sIHdwWzBdLCBuIC0gcXVpdCk7Ci0JfQotCi0JdW53aW5kKCp3cFswXSA9PSAnYicgPyBMQlJFQUsgOiBMQ09OVElOKTsKLQkvKiBOT1RSRUFDSEVEICovCi19Ci0KLWludAotY19zZXQoY29uc3QgY2hhciAqKndwKQotewotCWludCBhcmdpOwotCWJvb2wgc2V0YXJnczsKLQlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7Ci0JY29uc3QgY2hhciAqKm93cDsKLQotCWlmICh3cFsxXSA9PSBOVUxMKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICphcmdzW10gPSB7ICJzZXQiLCAiLSIsIE5VTEwgfTsKLQkJcmV0dXJuIChjX3R5cGVzZXQoYXJncykpOwotCX0KLQotCWFyZ2kgPSBwYXJzZV9hcmdzKHdwLCBPRl9TRVQsICZzZXRhcmdzKTsKLQlpZiAoYXJnaSA8IDApCi0JCXJldHVybiAoMSk7Ci0JLyogc2V0ICQjIGFuZCAkKiAqLwotCWlmIChzZXRhcmdzKSB7Ci0JCXdwICs9IGFyZ2kgLSAxOwotCQlvd3AgPSB3cDsKLQkJd3BbMF0gPSBsLT5hcmd2WzBdOyAvKiBzYXZlICQwICovCi0JCXdoaWxlICgqKyt3cCAhPSBOVUxMKQotCQkJc3RyZHVweCgqd3AsICp3cCwgJmwtPmFyZWEpOwotCQlsLT5hcmdjID0gd3AgLSBvd3AgLSAxOwotCQlsLT5hcmd2ID0gYWxsb2MoKGwtPmFyZ2MgKyAyKSAqIHNpemVvZihjaGFyICopLCAmbC0+YXJlYSk7Ci0JCWZvciAod3AgPSBsLT5hcmd2OyAoKndwKysgPSAqb3dwKyspICE9IE5VTEw7ICkKLQkJCTsKLQl9Ci0JLyotCi0JICogUE9TSVggc2F5cyBzZXQgZXhpdCBzdGF0dXMgaXMgMCwgYnV0IG9sZCBzY3JpcHRzIHRoYXQgdXNlCi0JICogZ2V0b3B0KDEpIHVzZSB0aGUgY29uc3RydWN0Ci0JICoJc2V0IC0tICQoZ2V0b3B0IGFiOmMgIiRAIikKLQkgKiB3aGljaCBhc3N1bWVzIHRoZSBleGl0IHZhbHVlIHNldCB3aWxsIGJlIHRoYXQgb2YgdGhlICQoKQotCSAqIChzdWJzdF9leHN0YXQgaXMgY2xlYXJlZCBpbiBleGVjdXRlKCkgc28gdGhhdCBpdCB3aWxsIGJlIDAKLQkgKiBpZiB0aGVyZSBhcmUgbm8gY29tbWFuZCBzdWJzdGl0dXRpb25zKS4KLQkgKiBTd2l0Y2hlZCBrc2ggKCFwb3NpeCAhc2gpIHRvIFBPU0lYIGluIG1rc2ggUjM5Yi4KLQkgKi8KLQlyZXR1cm4gKEZsYWcoRlNIKSA/IHN1YnN0X2V4c3RhdCA6IDApOwotfQotCi1pbnQKLWNfdW5zZXQoY29uc3QgY2hhciAqKndwKQotewotCWNvbnN0IGNoYXIgKmlkOwotCWludCBvcHRjOwotCWJvb2wgdW5zZXRfdmFyID0gdHJ1ZTsKLQotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImZ2IikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnZic6Ci0JCQl1bnNldF92YXIgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlICd2JzoKLQkJCXVuc2V0X3ZhciA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0Jd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOwotCWZvciAoOyAoaWQgPSAqd3ApICE9IE5VTEw7IHdwKyspCi0JCWlmICh1bnNldF92YXIpIHsJLyogdW5zZXQgdmFyaWFibGUgKi8KLQkJCXN0cnVjdCB0YmwgKnZwOwotCQkJY2hhciAqY3AgPSBOVUxMOwotCQkJc2l6ZV90IG47Ci0KLQkJCW4gPSBzdHJsZW4oaWQpOwotCQkJaWYgKG4gPiAzICYmIGlkW24tM10gPT0gJ1snICYmIGlkW24tMl0gPT0gJyonICYmCi0JCQkgICAgaWRbbi0xXSA9PSAnXScpIHsKLQkJCQlzdHJuZHVweChjcCwgaWQsIG4gLSAzLCBBVEVNUCk7Ci0JCQkJaWQgPSBjcDsKLQkJCQlvcHRjID0gMzsKLQkJCX0gZWxzZQotCQkJCW9wdGMgPSB2c3RyY2hyKGlkLCAnWycpID8gMCA6IDE7Ci0KLQkJCXZwID0gZ2xvYmFsKGlkKTsKLQkJCWFmcmVlKGNwLCBBVEVNUCk7Ci0KLQkJCWlmICgodnAtPmZsYWcmUkRPTkxZKSkgewotCQkJCWJpX2Vycm9yZigiJXMgaXMgcmVhZCBvbmx5IiwgdnAtPm5hbWUpOwotCQkJCXJldHVybiAoMSk7Ci0JCQl9Ci0JCQl1bnNldCh2cCwgb3B0Yyk7Ci0JCX0gZWxzZQkJCS8qIHVuc2V0IGZ1bmN0aW9uICovCi0JCQlkZWZpbmUoaWQsIE5VTEwpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wX3RpbWUoc3RydWN0IHNoZiAqc2hmLCBib29sIHBvc2l4LCBsb25nIHR2X3NlYywgaW50IHR2X3VzZWMsIGludCB3aWR0aCwKLSAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKLXsKLQl0dl91c2VjIC89IDEwMDAwOwotCWlmIChwb3NpeCkKLQkJc2hmX2ZwcmludGYoc2hmLCAiJXMlKmxkLiUwMmQlcyIsIHByZWZpeCwgd2lkdGgsCi0JCSAgICB0dl9zZWMsIHR2X3VzZWMsIHN1ZmZpeCk7Ci0JZWxzZQotCQlzaGZfZnByaW50ZihzaGYsICIlcyUqbGRtJWQuJTAyZHMlcyIsIHByZWZpeCwgd2lkdGgsCi0JCSAgICB0dl9zZWMgLyA2MCwgKGludCkodHZfc2VjICUgNjApLCB0dl91c2VjLCBzdWZmaXgpOwotfQotCi1pbnQKLWNfdGltZXMoY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCi17Ci0Jc3RydWN0IHJ1c2FnZSB1c2FnZTsKLQotCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnVzYWdlKTsKLQlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3V0aW1lLnR2X3NlYywKLQkgICAgdXNhZ2UucnVfdXRpbWUudHZfdXNlYywgMCwgbnVsbCwgIiAiKTsKLQlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3N0aW1lLnR2X3NlYywKLQkgICAgdXNhZ2UucnVfc3RpbWUudHZfdXNlYywgMCwgbnVsbCwgIlxuIik7Ci0KLQlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmdXNhZ2UpOwotCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfdXRpbWUudHZfc2VjLAotCSAgICB1c2FnZS5ydV91dGltZS50dl91c2VjLCAwLCBudWxsLCAiICIpOwotCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfc3RpbWUudHZfc2VjLAotCSAgICB1c2FnZS5ydV9zdGltZS50dl91c2VjLCAwLCBudWxsLCAiXG4iKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiB0aW1lIHBpcGVsaW5lIChyZWFsbHkgYSBzdGF0ZW1lbnQsIG5vdCBhIGJ1aWx0LWluIGNvbW1hbmQpCi0gKi8KLWludAotdGltZXgoc3RydWN0IG9wICp0LCBpbnQgZiwgdm9sYXRpbGUgaW50ICp4ZXJyb2spCi17Ci0jZGVmaW5lIFRGX05PQVJHUwlCSVQoMCkKLSNkZWZpbmUgVEZfTk9SRUFMCUJJVCgxKQkJLyogZG9uJ3QgcmVwb3J0IHJlYWwgdGltZSAqLwotI2RlZmluZSBURl9QT1NJWAlCSVQoMikJCS8qIHJlcG9ydCBpbiBQT1NJWCBmb3JtYXQgKi8KLQlpbnQgcnYgPSAwLCB0ZiA9IDA7Ci0Jc3RydWN0IHJ1c2FnZSBydTAsIHJ1MSwgY3J1MCwgY3J1MTsKLQlzdHJ1Y3QgdGltZXZhbCB1c3J0aW1lLCBzeXN0aW1lLCB0djAsIHR2MTsKLQotCWdldHRpbWVvZmRheSgmdHYwLCBOVUxMKTsKLQlnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydTApOwotCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZjcnUwKTsKLQlpZiAodC0+bGVmdCkgewotCQkvKgotCQkgKiBUd28gd2F5cyBvZiBnZXR0aW5nIGNwdSB1c2FnZSBvZiBhIGNvbW1hbmQ6IGp1c3QgdXNlIHQwCi0JCSAqIGFuZCB0MSAod2hpY2ggd2lsbCBnZXQgY3B1IHVzYWdlIGZyb20gb3RoZXIgam9icyB0aGF0Ci0JCSAqIGZpbmlzaCB3aGlsZSB3ZSBhcmUgZXhlY3V0aW5nIHQtPmxlZnQpLCBvciBnZXQgdGhlCi0JCSAqIGNwdSB1c2FnZSBvZiB0LT5sZWZ0LiBBVCZUIGtzaCBkb2VzIHRoZSBmb3JtZXIsIHdoaWxlCi0JCSAqIHBka3NoIHRyaWVzIHRvIGRvIHRoZSBsYXRlciAodGhlIGpfdXNydGltZSBoYWNrIGRvZXNuJ3QKLQkJICogcmVhbGx5IHdvcmsgYXMgaXQgb25seSBjb3VudHMgdGhlIGxhc3Qgam9iKS4KLQkJICovCi0JCXRpbWVyY2xlYXIoJmpfdXNydGltZSk7Ci0JCXRpbWVyY2xlYXIoJmpfc3lzdGltZSk7Ci0JCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmIHwgWFRJTUUsIHhlcnJvayk7Ci0JCWlmICh0LT5sZWZ0LT50eXBlID09IFRDT00pCi0JCQl0ZiB8PSB0LT5sZWZ0LT5zdHJbMF07Ci0JCWdldHRpbWVvZmRheSgmdHYxLCBOVUxMKTsKLQkJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUxKTsKLQkJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmNydTEpOwotCX0gZWxzZQotCQl0ZiA9IFRGX05PQVJHUzsKLQotCWlmICh0ZiAmIFRGX05PQVJHUykgeyAvKiBrc2g5MyAtIHJlcG9ydCBzaGVsbCB0aW1lcyAoc2hlbGwra2lkcykgKi8KLQkJdGYgfD0gVEZfTk9SRUFMOwotCQl0aW1lcmFkZCgmcnUwLnJ1X3V0aW1lLCAmY3J1MC5ydV91dGltZSwgJnVzcnRpbWUpOwotCQl0aW1lcmFkZCgmcnUwLnJ1X3N0aW1lLCAmY3J1MC5ydV9zdGltZSwgJnN5c3RpbWUpOwotCX0gZWxzZSB7Ci0JCXRpbWVyc3ViKCZydTEucnVfdXRpbWUsICZydTAucnVfdXRpbWUsICZ1c3J0aW1lKTsKLQkJdGltZXJhZGQoJnVzcnRpbWUsICZqX3VzcnRpbWUsICZ1c3J0aW1lKTsKLQkJdGltZXJzdWIoJnJ1MS5ydV9zdGltZSwgJnJ1MC5ydV9zdGltZSwgJnN5c3RpbWUpOwotCQl0aW1lcmFkZCgmc3lzdGltZSwgJmpfc3lzdGltZSwgJnN5c3RpbWUpOwotCX0KLQotCWlmICghKHRmICYgVEZfTk9SRUFMKSkgewotCQl0aW1lcnN1YigmdHYxLCAmdHYwLCAmdHYxKTsKLQkJaWYgKHRmICYgVEZfUE9TSVgpCi0JCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgdHYxLnR2X3NlYywgdHYxLnR2X3VzZWMsCi0JCQkgICAgNSwgInJlYWwgIiwgIlxuIik7Ci0JCWVsc2UKLQkJCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgdHYxLnR2X3NlYywgdHYxLnR2X3VzZWMsCi0JCQkgICAgNSwgbnVsbCwgIiByZWFsICIpOwotCX0KLQlpZiAodGYgJiBURl9QT1NJWCkKLQkJcF90aW1lKHNobF9vdXQsIHRydWUsIHVzcnRpbWUudHZfc2VjLCB1c3J0aW1lLnR2X3VzZWMsCi0JCSAgICA1LCAidXNlciAiLCAiXG4iKTsKLQllbHNlCi0JCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgdXNydGltZS50dl9zZWMsIHVzcnRpbWUudHZfdXNlYywKLQkJICAgIDUsIG51bGwsICIgdXNlciAiKTsKLQlpZiAodGYgJiBURl9QT1NJWCkKLQkJcF90aW1lKHNobF9vdXQsIHRydWUsIHN5c3RpbWUudHZfc2VjLCBzeXN0aW1lLnR2X3VzZWMsCi0JCSAgICA1LCAic3lzICAiLCAiXG4iKTsKLQllbHNlCi0JCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgc3lzdGltZS50dl9zZWMsIHN5c3RpbWUudHZfdXNlYywKLQkJICAgIDUsIG51bGwsICIgc3lzdGVtXG4iKTsKLQlzaGZfZmx1c2goc2hsX291dCk7Ci0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotdm9pZAotdGltZXhfaG9vayhzdHJ1Y3Qgb3AgKnQsIGNoYXIgKip2b2xhdGlsZSAqYXBwKQotewotCWNoYXIgKip3cCA9ICphcHA7Ci0JaW50IG9wdGMsIGksIGo7Ci0JR2V0b3B0IG9wdDsKLQotCWtzaF9nZXRvcHRfcmVzZXQoJm9wdCwgMCk7Ci0Jb3B0Lm9wdGluZCA9IDA7CS8qIHN0YXJ0IGF0IHRoZSBzdGFydCAqLwotCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoKGNvbnN0IGNoYXIgKiopd3AsICZvcHQsICI6cCIpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ3AnOgotCQkJdC0+c3RyWzBdIHw9IFRGX1BPU0lYOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJZXJyb3JmKCJ0aW1lOiAtJXMgdW5rbm93biBvcHRpb24iLCBvcHQub3B0YXJnKTsKLQkJY2FzZSAnOic6Ci0JCQllcnJvcmYoInRpbWU6IC0lcyByZXF1aXJlcyBhbiBhcmd1bWVudCIsCi0JCQkgICAgb3B0Lm9wdGFyZyk7Ci0JCX0KLQkvKiBDb3B5IGNvbW1hbmQgd29yZHMgZG93biBvdmVyIG9wdGlvbnMuICovCi0JaWYgKG9wdC5vcHRpbmQgIT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgb3B0Lm9wdGluZDsgaSsrKQotCQkJYWZyZWUod3BbaV0sIEFURU1QKTsKLQkJZm9yIChpID0gMCwgaiA9IG9wdC5vcHRpbmQ7ICh3cFtpXSA9IHdwW2pdKTsgaSsrLCBqKyspCi0JCQk7Ci0JfQotCWlmICghd3BbMF0pCi0JCXQtPnN0clswXSB8PSBURl9OT0FSR1M7Ci0JKmFwcCA9IHdwOwotfQotCi0vKiBleGVjIHdpdGggbm8gYXJncyAtIGFyZ3MgY2FzZSBpcyB0YWtlbiBjYXJlIG9mIGluIGNvbWV4ZWMoKSAqLwotaW50Ci1jX2V4ZWMoY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCi17Ci0JaW50IGk7Ci0KLQkvKiBtYWtlIHN1cmUgcmVkaXJlY3RzIHN0YXkgaW4gcGxhY2UgKi8KLQlpZiAoZS0+c2F2ZWZkICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IE5VRklMRTsgaSsrKSB7Ci0JCQlpZiAoZS0+c2F2ZWZkW2ldID4gMCkKLQkJCQljbG9zZShlLT5zYXZlZmRbaV0pOwotCQkJLyoKLQkJCSAqIGtlZXAgYWxsIGZpbGUgZGVzY3JpcHRvcnMgPiAyIHByaXZhdGUgZm9yIGtzaCwKLQkJCSAqIGJ1dCBub3QgZm9yIFBPU0lYIG9yIGxlZ2FjeS9rbHVkZ2Ugc2gKLQkJCSAqLwotCQkJaWYgKCFGbGFnKEZQT1NJWCkgJiYgIUZsYWcoRlNIKSAmJiBpID4gMiAmJgotCQkJICAgIGUtPnNhdmVmZFtpXSkKLQkJCQlmY250bChpLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQkJfQotCQllLT5zYXZlZmQgPSBOVUxMOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi0jaWYgSEFWRV9NS05PRAotaW50Ci1jX21rbm9kKGNvbnN0IGNoYXIgKip3cCkKLXsKLQlpbnQgYXJnYywgb3B0YywgcnYgPSAwOwotCWJvb2wgaXNta2ZpZm8gPSBmYWxzZTsKLQljb25zdCBjaGFyICoqYXJndjsKLQl2b2lkICpzZXQgPSBOVUxMOwotCW1vZGVfdCBtb2RlID0gMCwgb2xkbW9kZSA9IDA7Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJtOiIpKSAhPSAtMSkgewotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnbSc6Ci0JCQlzZXQgPSBzZXRtb2RlKGJ1aWx0aW5fb3B0Lm9wdGFyZyk7Ci0JCQlpZiAoc2V0ID09IE5VTEwpIHsKLQkJCQliaV9lcnJvcmYoImludmFsaWQgZmlsZSBtb2RlIik7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCW1vZGUgPSBnZXRtb2RlKHNldCwgKG1vZGVfdCkoREVGRklMRU1PREUpKTsKLQkJCWZyZWUoc2V0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZ290byBjX21rbm9kX3VzYWdlOwotCQl9Ci0JfQotCWFyZ3YgPSAmd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKLQlpZiAoYXJndlswXSA9PSBOVUxMKQotCQlnb3RvIGNfbWtub2RfdXNhZ2U7Ci0JZm9yIChhcmdjID0gMDsgYXJndlthcmdjXTsgYXJnYysrKQotCQk7Ci0JaWYgKGFyZ2MgPT0gMiAmJiBhcmd2WzFdWzBdID09ICdwJykKLQkJaXNta2ZpZm8gPSB0cnVlOwotCWVsc2UgaWYgKGFyZ2MgIT0gNCB8fCAoYXJndlsxXVswXSAhPSAnYicgJiYgYXJndlsxXVswXSAhPSAnYycpKQotCQlnb3RvIGNfbWtub2RfdXNhZ2U7Ci0KLQlpZiAoc2V0ICE9IE5VTEwpCi0JCW9sZG1vZGUgPSB1bWFzaygobW9kZV90KTApOwotCWVsc2UKLQkJbW9kZSA9IERFRkZJTEVNT0RFOwotCi0JbW9kZSB8PSAoYXJndlsxXVswXSA9PSAnYicpID8gU19JRkJMSyA6Ci0JICAgIChhcmd2WzFdWzBdID09ICdjJykgPyBTX0lGQ0hSIDogMDsKLQotCWlmICghaXNta2ZpZm8pIHsKLQkJdW5zaWduZWQgbG9uZyBtYWpudW0sIG1pbm51bTsKLQkJZGV2X3QgZHY7Ci0JCWNoYXIgKmM7Ci0KLQkJbWFqbnVtID0gc3RydG91bChhcmd2WzJdLCAmYywgMCk7Ci0JCWlmICgoYyA9PSBhcmd2WzJdKSB8fCAoKmMgIT0gJ1wwJykpIHsKLQkJCWJpX2Vycm9yZigibm9uLW51bWVyaWMgZGV2aWNlIG1ham9yICclcyciLCBhcmd2WzJdKTsKLQkJCWdvdG8gY19ta25vZF9lcnI7Ci0JCX0KLQkJbWlubnVtID0gc3RydG91bChhcmd2WzNdLCAmYywgMCk7Ci0JCWlmICgoYyA9PSBhcmd2WzNdKSB8fCAoKmMgIT0gJ1wwJykpIHsKLQkJCWJpX2Vycm9yZigibm9uLW51bWVyaWMgZGV2aWNlIG1pbm9yICclcyciLCBhcmd2WzNdKTsKLQkJCWdvdG8gY19ta25vZF9lcnI7Ci0JCX0KLQkJZHYgPSBtYWtlZGV2KG1ham51bSwgbWlubnVtKTsKLQkJaWYgKCh1bnNpZ25lZCBsb25nKShtYWpvcihkdikpICE9IG1ham51bSkgewotCQkJYmlfZXJyb3JmKCJkZXZpY2UgbWFqb3IgdG9vIGxhcmdlOiAlbHUiLCBtYWpudW0pOwotCQkJZ290byBjX21rbm9kX2VycjsKLQkJfQotCQlpZiAoKHVuc2lnbmVkIGxvbmcpKG1pbm9yKGR2KSkgIT0gbWlubnVtKSB7Ci0JCQliaV9lcnJvcmYoImRldmljZSBtaW5vciB0b28gbGFyZ2U6ICVsdSIsIG1pbm51bSk7Ci0JCQlnb3RvIGNfbWtub2RfZXJyOwotCQl9Ci0JCWlmIChta25vZChhcmd2WzBdLCBtb2RlLCBkdikpCi0JCQlnb3RvIGNfbWtub2RfZmFpbGVkOwotCX0gZWxzZSBpZiAobWtmaWZvKGFyZ3ZbMF0sIG1vZGUpKSB7Ci0gY19ta25vZF9mYWlsZWQ6Ci0JCWJpX2Vycm9yZigiJXM6ICVzIiwgKndwLCBzdHJlcnJvcihlcnJubykpOwotIGNfbWtub2RfZXJyOgotCQlydiA9IDE7Ci0JfQotCi0JaWYgKHNldCkKLQkJdW1hc2sob2xkbW9kZSk7Ci0JcmV0dXJuIChydik7Ci0gY19ta25vZF91c2FnZToKLQliaV9lcnJvcmYoInVzYWdlOiBta25vZCBbLW0gbW9kZV0gbmFtZSBifGMgbWFqb3IgbWlub3IiKTsKLQliaV9lcnJvcmYoInVzYWdlOiBta25vZCBbLW0gbW9kZV0gbmFtZSBwIik7Ci0JcmV0dXJuICgxKTsKLX0KLSNlbmRpZgotCi0vKiBkdW1teSBmdW5jdGlvbiwgc3BlY2lhbCBjYXNlIGluIGNvbWV4ZWMoKSAqLwotaW50Ci1jX2J1aWx0aW4oY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCi17Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogdGVzdCgxKSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKLQlvZXhwcgk6Oj0gYWV4cHIgfCBhZXhwciAiLW8iIG9leHByIDsKLQlhZXhwcgk6Oj0gbmV4cHIgfCBuZXhwciAiLWEiIGFleHByIDsKLQluZXhwcgk6Oj0gcHJpbWFyeSB8ICIhIiBuZXhwciA7Ci0JcHJpbWFyeQk6Oj0gdW5hcnktb3BlcmF0b3Igb3BlcmFuZAotCQl8IG9wZXJhbmQgYmluYXJ5LW9wZXJhdG9yIG9wZXJhbmQKLQkJfCBvcGVyYW5kCi0JCXwgIigiIG9leHByICIpIgotCQk7Ci0KLQl1bmFyeS1vcGVyYXRvciA6Oj0gIi1hInwiLXIifCItdyJ8Ii14InwiLWUifCItZiJ8Ii1kInwiLWMifCItYiJ8Ii1wInwKLQkJCSAgICItdSJ8Ii1nInwiLWsifCItcyJ8Ii10InwiLXoifCItbiJ8Ii1vInwiLU8ifCItRyJ8Ci0JCQkgICAiLUwifCItaCJ8Ii1TInwiLUgiOwotCi0JYmluYXJ5LW9wZXJhdG9yIDo6PSAiPSJ8Ij09InwiIT0ifCItZXEifCItbmUifCItZ2UifCItZ3QifCItbGUifCItbHQifAotCQkJICAgICItbnQifCItb3QifCItZWYifAotCQkJICAgICI8InwiPiIJIyBydWxlcyB1c2VkIGZvciBbWyAuLiBdXSBleHByZXNzaW9ucwotCQkJICAgIDsKLQlvcGVyYW5kIDo6PSA8YW55IHRoaW5nPgotKi8KLQotI2RlZmluZSBUX0VSUl9FWElUCTIJLyogUE9TSVggc2F5cyA+IDEgZm9yIGVycm9ycyAqLwotCi1pbnQKLWNfdGVzdChjb25zdCBjaGFyICoqd3ApCi17Ci0JaW50IGFyZ2MsIHJlczsKLQlUZXN0X2VudiB0ZTsKLQotCXRlLmZsYWdzID0gMDsKLQl0ZS5pc2EgPSBwdGVzdF9pc2E7Ci0JdGUuZ2V0b3BuZCA9IHB0ZXN0X2dldG9wbmQ7Ci0JdGUuZXZhbCA9IHRlc3RfZXZhbDsKLQl0ZS5lcnJvciA9IHB0ZXN0X2Vycm9yOwotCi0JZm9yIChhcmdjID0gMDsgd3BbYXJnY107IGFyZ2MrKykKLQkJOwotCi0JaWYgKHN0cmNtcCh3cFswXSwgIlsiKSA9PSAwKSB7Ci0JCWlmIChzdHJjbXAod3BbLS1hcmdjXSwgIl0iKSAhPSAwKSB7Ci0JCQliaV9lcnJvcmYoIm1pc3NpbmcgXSIpOwotCQkJcmV0dXJuIChUX0VSUl9FWElUKTsKLQkJfQotCX0KLQotCXRlLnBvcy53cCA9IHdwICsgMTsKLQl0ZS53cF9lbmQgPSB3cCArIGFyZ2M7Ci0KLQkvKgotCSAqIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlcyBmcm9tIFBPU0lYLjIsIHNlY3Rpb24gNC42Mi40LgotCSAqIEltcGxlbWVudGF0aW9uIG9mIGFsbCB0aGUgcnVsZXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlCi0JICogb3VyIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIG9taXR0ZWQgc3RlcHMuCi0JICovCi0JaWYgKGFyZ2MgPD0gNSkgewotCQljb25zdCBjaGFyICoqb3dwID0gd3A7Ci0JCWludCBpbnZlcnQgPSAwOwotCQlUZXN0X29wIG9wOwotCQljb25zdCBjaGFyICpvcG5kMSwgKm9wbmQyOwotCi0JCXdoaWxlICgtLWFyZ2MgPj0gMCkgewotCQkJaWYgKCgqdGUuaXNhKSgmdGUsIFRNX0VORCkpCi0JCQkJcmV0dXJuICghMCk7Ci0JCQlpZiAoYXJnYyA9PSAzKSB7Ci0JCQkJb3BuZDEgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgVE9fTk9OT1AsIDEpOwotCQkJCWlmICgob3AgPSAoKnRlLmlzYSkoJnRlLCBUTV9CSU5PUCkpKSB7Ci0JCQkJCW9wbmQyID0gKCp0ZS5nZXRvcG5kKSgmdGUsIG9wLCAxKTsKLQkJCQkJcmVzID0gKCp0ZS5ldmFsKSgmdGUsIG9wLCBvcG5kMSwKLQkJCQkJICAgIG9wbmQyLCAxKTsKLQkJCQkJaWYgKHRlLmZsYWdzICYgVEVGX0VSUk9SKQotCQkJCQkJcmV0dXJuIChUX0VSUl9FWElUKTsKLQkJCQkJaWYgKGludmVydCAmIDEpCi0JCQkJCQlyZXMgPSAhcmVzOwotCQkJCQlyZXR1cm4gKCFyZXMpOwotCQkJCX0KLQkJCQkvKiBiYWNrIHVwIHRvIG9wbmQxICovCi0JCQkJdGUucG9zLndwLS07Ci0JCQl9Ci0JCQlpZiAoYXJnYyA9PSAxKSB7Ci0JCQkJb3BuZDEgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgVE9fTk9OT1AsIDEpOwotCQkJCWlmIChzdHJjbXAob3BuZDEsICItdCIpID09IDApCi0JCQkJICAgIGJyZWFrOwotCQkJCXJlcyA9ICgqdGUuZXZhbCkoJnRlLCBUT19TVE5aRSwgb3BuZDEsCi0JCQkJICAgIE5VTEwsIDEpOwotCQkJCWlmIChpbnZlcnQgJiAxKQotCQkJCQlyZXMgPSAhcmVzOwotCQkJCXJldHVybiAoIXJlcyk7Ci0JCQl9Ci0JCQlpZiAoKCp0ZS5pc2EpKCZ0ZSwgVE1fTk9UKSkgewotCQkJCWludmVydCsrOwotCQkJfSBlbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdGUucG9zLndwID0gb3dwICsgMTsKLQl9Ci0KLQlyZXR1cm4gKHRlc3RfcGFyc2UoJnRlKSk7Ci19Ci0KLS8qCi0gKiBHZW5lcmljIHRlc3Qgcm91dGluZXMuCi0gKi8KLQotVGVzdF9vcAotdGVzdF9pc29wKFRlc3RfbWV0YSBtZXRhLCBjb25zdCBjaGFyICpzKQotewotCWNoYXIgc2MxOwotCWNvbnN0IHN0cnVjdCB0X29wICp0Ymw7Ci0KLQl0YmwgPSBtZXRhID09IFRNX1VOT1AgPyB1X29wcyA6IGJfb3BzOwotCWlmICgqcykgewotCQlzYzEgPSBzWzFdOwotCQlmb3IgKDsgdGJsLT5vcF90ZXh0WzBdOyB0YmwrKykKLQkJCWlmIChzYzEgPT0gdGJsLT5vcF90ZXh0WzFdICYmICFzdHJjbXAocywgdGJsLT5vcF90ZXh0KSkKLQkJCQlyZXR1cm4gKHRibC0+b3BfbnVtKTsKLQl9Ci0JcmV0dXJuIChUT19OT05PUCk7Ci19Ci0KLWludAotdGVzdF9ldmFsKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgY29uc3QgY2hhciAqb3BuZDEsIGNvbnN0IGNoYXIgKm9wbmQyLAotICAgIGJvb2wgZG9fZXZhbCkKLXsKLQlpbnQgaSwgczsKLQlzaXplX3QgazsKLQlzdHJ1Y3Qgc3RhdCBiMSwgYjI7Ci0JbWtzaF9hcmlfdCB2MSwgdjI7Ci0KLQlpZiAoIWRvX2V2YWwpCi0JCXJldHVybiAoMCk7Ci0KLQlzd2l0Y2ggKChpbnQpb3ApIHsKLQkvKgotCSAqIFVuYXJ5IE9wZXJhdG9ycwotCSAqLwotCWNhc2UgVE9fU1ROWkU6IC8qIC1uICovCi0JCXJldHVybiAoKm9wbmQxICE9ICdcMCcpOwotCWNhc2UgVE9fU1RaRVI6IC8qIC16ICovCi0JCXJldHVybiAoKm9wbmQxID09ICdcMCcpOwotCWNhc2UgVE9fT1BUSU9OOiAvKiAtbyAqLwotCQlpZiAoKGkgPSAqb3BuZDEpID09ICchJyB8fCBpID09ICc/JykKLQkJCW9wbmQxKys7Ci0JCWlmICgoayA9IG9wdGlvbihvcG5kMSkpID09IChzaXplX3QpLTEpCi0JCQlyZXR1cm4gKDApOwotCQlyZXR1cm4gKGkgPT0gJz8nID8gMSA6IGkgPT0gJyEnID8gIUZsYWcoaykgOiBGbGFnKGspKTsKLQljYXNlIFRPX0ZJTFJEOiAvKiAtciAqLwotCQlyZXR1cm4gKHRlc3RfZWFjY2VzcyhvcG5kMSwgUl9PSykgPT0gMCk7Ci0JY2FzZSBUT19GSUxXUjogLyogLXcgKi8KLQkJcmV0dXJuICh0ZXN0X2VhY2Nlc3Mob3BuZDEsIFdfT0spID09IDApOwotCWNhc2UgVE9fRklMRVg6IC8qIC14ICovCi0JCXJldHVybiAodGVzdF9lYWNjZXNzKG9wbmQxLCBYX09LKSA9PSAwKTsKLQljYXNlIFRPX0ZJTEFYU1Q6IC8qIC1hICovCi0JY2FzZSBUT19GSUxFWFNUOiAvKiAtZSAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCk7Ci0JY2FzZSBUT19GSUxSRUc6IC8qIC1yICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNSRUcoYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMSUQ6IC8qIC1kICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNESVIoYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMQ0RFVjogLyogLWMgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0NIUihiMS5zdF9tb2RlKSk7Ci0JY2FzZSBUT19GSUxCREVWOiAvKiAtYiAqLwotCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTQkxLKGIxLnN0X21vZGUpKTsKLQljYXNlIFRPX0ZJTEZJRk86IC8qIC1wICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNGSUZPKGIxLnN0X21vZGUpKTsKLQljYXNlIFRPX0ZJTFNZTTogLyogLWggLUwgKi8KLQkJcmV0dXJuIChsc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNMTksoYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMU09DSzogLyogLVMgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU1NPQ0soYjEuc3RfbW9kZSkpOwotCWNhc2UgVE9fRklMQ0RGOi8qIC1IIEhQIGNvbnRleHQgZGVwZW5kZW50IGZpbGVzIChkaXJlY3RvcmllcykgKi8KLQkJcmV0dXJuICgwKTsKLQljYXNlIFRPX0ZJTFNFVFU6IC8qIC11ICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmCi0JCSAgICAoYjEuc3RfbW9kZSAmIFNfSVNVSUQpID09IFNfSVNVSUQpOwotCWNhc2UgVE9fRklMU0VURzogLyogLWcgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKLQkJICAgIChiMS5zdF9tb2RlICYgU19JU0dJRCkgPT0gU19JU0dJRCk7Ci0JY2FzZSBUT19GSUxTVENLOiAvKiAtayAqLwotI2lmZGVmIFNfSVNWVFgKLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKLQkJICAgIChiMS5zdF9tb2RlICYgU19JU1ZUWCkgPT0gU19JU1ZUWCk7Ci0jZWxzZQotCQlyZXR1cm4gKDApOwotI2VuZGlmCi0JY2FzZSBUT19GSUxHWjogLyogLXMgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3Rfc2l6ZSA+IDBMKTsKLQljYXNlIFRPX0ZJTFRUOiAvKiAtdCAqLwotCQlpZiAob3BuZDEgJiYgIWJpX2dldG4ob3BuZDEsICZpKSkgewotCQkJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKLQkJCWkgPSAwOwotCQl9IGVsc2UKLQkJCWkgPSBpc2F0dHkob3BuZDEgPyBpIDogMCk7Ci0JCXJldHVybiAoaSk7Ci0JY2FzZSBUT19GSUxVSUQ6IC8qIC1PICovCi0JCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIGIxLnN0X3VpZCA9PSBrc2hldWlkKTsKLQljYXNlIFRPX0ZJTEdJRDogLyogLUcgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3RfZ2lkID09IGdldGVnaWQoKSk7Ci0JLyoKLQkgKiBCaW5hcnkgT3BlcmF0b3JzCi0JICovCi0JY2FzZSBUT19TVEVRTDogLyogPSAqLwotCQlpZiAodGUtPmZsYWdzICYgVEVGX0RCUkFDS0VUKQotCQkJcmV0dXJuIChnbWF0Y2h4KG9wbmQxLCBvcG5kMiwgZmFsc2UpKTsKLQkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA9PSAwKTsKLQljYXNlIFRPX1NUTkVROiAvKiAhPSAqLwotCQlpZiAodGUtPmZsYWdzICYgVEVGX0RCUkFDS0VUKQotCQkJcmV0dXJuICghZ21hdGNoeChvcG5kMSwgb3BuZDIsIGZhbHNlKSk7Ci0JCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgIT0gMCk7Ci0JY2FzZSBUT19TVExUOiAvKiA8ICovCi0JCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgPCAwKTsKLQljYXNlIFRPX1NUR1Q6IC8qID4gKi8KLQkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA+IDApOwotCWNhc2UgVE9fSU5URVE6IC8qIC1lcSAqLwotCWNhc2UgVE9fSU5UTkU6IC8qIC1uZSAqLwotCWNhc2UgVE9fSU5UR0U6IC8qIC1nZSAqLwotCWNhc2UgVE9fSU5UR1Q6IC8qIC1ndCAqLwotCWNhc2UgVE9fSU5UTEU6IC8qIC1sZSAqLwotCWNhc2UgVE9fSU5UTFQ6IC8qIC1sdCAqLwotCQlpZiAoIWV2YWx1YXRlKG9wbmQxLCAmdjEsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSB8fAotCQkgICAgIWV2YWx1YXRlKG9wbmQyLCAmdjIsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSkgewotCQkJLyogZXJyb3IgYWxyZWFkeSBwcmludGVkLi4gKi8KLQkJCXRlLT5mbGFncyB8PSBURUZfRVJST1I7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCXN3aXRjaCAoKGludClvcCkgewotCQljYXNlIFRPX0lOVEVROgotCQkJcmV0dXJuICh2MSA9PSB2Mik7Ci0JCWNhc2UgVE9fSU5UTkU6Ci0JCQlyZXR1cm4gKHYxICE9IHYyKTsKLQkJY2FzZSBUT19JTlRHRToKLQkJCXJldHVybiAodjEgPj0gdjIpOwotCQljYXNlIFRPX0lOVEdUOgotCQkJcmV0dXJuICh2MSA+IHYyKTsKLQkJY2FzZSBUT19JTlRMRToKLQkJCXJldHVybiAodjEgPD0gdjIpOwotCQljYXNlIFRPX0lOVExUOgotCQkJcmV0dXJuICh2MSA8IHYyKTsKLQkJfQotCWNhc2UgVE9fRklMTlQ6IC8qIC1udCAqLwotCQkvKiBrc2g4OC9rc2g5MyBzdWNjZWVkIGlmIGZpbGUyIGNhbid0IGJlIHN0YXRlZAotCQkgKiAoc3VidGx5IGRpZmZlcmVudCBmcm9tICdkb2VzIG5vdCBleGlzdCcpLgotCQkgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKLQkJICAgICgoKHMgPSBzdGF0KG9wbmQyLCAmYjIpKSA9PSAwICYmCi0JCSAgICBiMS5zdF9tdGltZSA+IGIyLnN0X210aW1lKSB8fCBzIDwgMCkpOwotCWNhc2UgVE9fRklMT1Q6IC8qIC1vdCAqLwotCQkvKiBrc2g4OC9rc2g5MyBzdWNjZWVkIGlmIGZpbGUxIGNhbid0IGJlIHN0YXRlZAotCQkgKiAoc3VidGx5IGRpZmZlcmVudCBmcm9tICdkb2VzIG5vdCBleGlzdCcpLgotCQkgKi8KLQkJcmV0dXJuIChzdGF0KG9wbmQyLCAmYjIpID09IDAgJiYKLQkJICAgICgoKHMgPSBzdGF0KG9wbmQxLCAmYjEpKSA9PSAwICYmCi0JCSAgICBiMS5zdF9tdGltZSA8IGIyLnN0X210aW1lKSB8fCBzIDwgMCkpOwotCWNhc2UgVE9fRklMRVE6IC8qIC1lZiAqLwotCQlyZXR1cm4gKHN0YXQgKG9wbmQxLCAmYjEpID09IDAgJiYgc3RhdCAob3BuZDIsICZiMikgPT0gMCAmJgotCQkgICAgYjEuc3RfZGV2ID09IGIyLnN0X2RldiAmJiBiMS5zdF9pbm8gPT0gYjIuc3RfaW5vKTsKLQl9Ci0JKCp0ZS0+ZXJyb3IpKHRlLCAwLCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gb3AiKTsKLQlyZXR1cm4gKDEpOwotfQotCi0vKiBPbiBtb3N0L2FsbCB1bml4ZW4sIGFjY2VzcygpIHNheXMgZXZlcnl0aGluZyBpcyBleGVjdXRhYmxlIGZvciByb290Li4uICovCi1zdGF0aWMgaW50Ci10ZXN0X2VhY2Nlc3MoY29uc3QgY2hhciAqcGF0aGwsIGludCBtb2RlKQotewotCWludCBydjsKLQotCWlmICgocnYgPSBhY2Nlc3MocGF0aGwsIG1vZGUpKSA9PSAwICYmIGtzaGV1aWQgPT0gMCAmJiAobW9kZSAmIFhfT0spKSB7Ci0JCXN0cnVjdCBzdGF0IHN0YXRiOwotCi0JCWlmIChzdGF0KHBhdGhsLCAmc3RhdGIpIDwgMCkKLQkJCXJ2ID0gLTE7Ci0JCWVsc2UgaWYgKFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpCi0JCQlydiA9IDA7Ci0JCWVsc2UKLQkJCXJ2ID0gKHN0YXRiLnN0X21vZGUgJiAoU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpKSA/Ci0JCQkgICAgMCA6IC0xOwotCX0KLQlyZXR1cm4gKHJ2KTsKLX0KLQotaW50Ci10ZXN0X3BhcnNlKFRlc3RfZW52ICp0ZSkKLXsKLQlpbnQgcnY7Ci0KLQlydiA9IHRlc3Rfb2V4cHIodGUsIDEpOwotCi0JaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAhKCp0ZS0+aXNhKSh0ZSwgVE1fRU5EKSkKLQkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAidW5leHBlY3RlZCBvcGVyYXRvci9vcGVyYW5kIik7Ci0KLQlyZXR1cm4gKCh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpID8gVF9FUlJfRVhJVCA6ICFydik7Ci19Ci0KLXN0YXRpYyBpbnQKLXRlc3Rfb2V4cHIoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCi17Ci0JaW50IHJ2OwotCi0JaWYgKChydiA9IHRlc3RfYWV4cHIodGUsIGRvX2V2YWwpKSkKLQkJZG9fZXZhbCA9IGZhbHNlOwotCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgKCp0ZS0+aXNhKSh0ZSwgVE1fT1IpKQotCQlyZXR1cm4gKHRlc3Rfb2V4cHIodGUsIGRvX2V2YWwpIHx8IHJ2KTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotc3RhdGljIGludAotdGVzdF9hZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKLXsKLQlpbnQgcnY7Ci0KLQlpZiAoIShydiA9IHRlc3RfbmV4cHIodGUsIGRvX2V2YWwpKSkKLQkJZG9fZXZhbCA9IGZhbHNlOwotCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgKCp0ZS0+aXNhKSh0ZSwgVE1fQU5EKSkKLQkJcmV0dXJuICh0ZXN0X2FleHByKHRlLCBkb19ldmFsKSAmJiBydik7Ci0JcmV0dXJuIChydik7Ci19Ci0KLXN0YXRpYyBpbnQKLXRlc3RfbmV4cHIoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCi17Ci0JaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9OT1QpKQotCQlyZXR1cm4gKCF0ZXN0X25leHByKHRlLCBkb19ldmFsKSk7Ci0JcmV0dXJuICh0ZXN0X3ByaW1hcnkodGUsIGRvX2V2YWwpKTsKLX0KLQotc3RhdGljIGludAotdGVzdF9wcmltYXJ5KFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQotewotCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7Ci0JaW50IHJ2OwotCVRlc3Rfb3Agb3A7Ci0KLQlpZiAodGUtPmZsYWdzICYgVEVGX0VSUk9SKQotCQlyZXR1cm4gKDApOwotCWlmICgoKnRlLT5pc2EpKHRlLCBUTV9PUEFSRU4pKSB7Ci0JCXJ2ID0gdGVzdF9vZXhwcih0ZSwgZG9fZXZhbCk7Ci0JCWlmICh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpCi0JCQlyZXR1cm4gKDApOwotCQlpZiAoISgqdGUtPmlzYSkodGUsIFRNX0NQQVJFTikpIHsKLQkJCSgqdGUtPmVycm9yKSh0ZSwgMCwgIm1pc3NpbmcgY2xvc2luZyBwYXJlbiIpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCQlyZXR1cm4gKHJ2KTsKLQl9Ci0JLyoKLQkgKiBCaW5hcnkgc2hvdWxkIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHVuYXJ5IGluIHRoaXMgY2FzZQotCSAqIHNvIHRoYXQgc29tZXRoaW5nIGxpa2UgdGVzdCBcKCAtZiA9IC1mIFwpIGlzIGFjY2VwdGVkCi0JICovCi0JaWYgKCh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpIHx8ICgmdGUtPnBvcy53cFsxXSA8IHRlLT53cF9lbmQgJiYKLQkgICAgIXRlc3RfaXNvcChUTV9CSU5PUCwgdGUtPnBvcy53cFsxXSkpKSB7Ci0JCWlmICgob3AgPSAoKnRlLT5pc2EpKHRlLCBUTV9VTk9QKSkpIHsKLQkJCS8qIHVuYXJ5IGV4cHJlc3Npb24gKi8KLQkJCW9wbmQxID0gKCp0ZS0+Z2V0b3BuZCkodGUsIG9wLCBkb19ldmFsKTsKLQkJCWlmICghb3BuZDEpIHsKLQkJCQkoKnRlLT5lcnJvcikodGUsIC0xLCAibWlzc2luZyBhcmd1bWVudCIpOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0KLQkJCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIG9wLCBvcG5kMSwgTlVMTCwgZG9fZXZhbCkpOwotCQl9Ci0JfQotCW9wbmQxID0gKCp0ZS0+Z2V0b3BuZCkodGUsIFRPX05PTk9QLCBkb19ldmFsKTsKLQlpZiAoIW9wbmQxKSB7Ci0JCSgqdGUtPmVycm9yKSh0ZSwgMCwgImV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKChvcCA9ICgqdGUtPmlzYSkodGUsIFRNX0JJTk9QKSkpIHsKLQkJLyogYmluYXJ5IGV4cHJlc3Npb24gKi8KLQkJb3BuZDIgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgb3AsIGRvX2V2YWwpOwotCQlpZiAoIW9wbmQyKSB7Ci0JCQkoKnRlLT5lcnJvcikodGUsIC0xLCAibWlzc2luZyBzZWNvbmQgYXJndW1lbnQiKTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQotCQlyZXR1cm4gKCgqdGUtPmV2YWwpKHRlLCBvcCwgb3BuZDEsIG9wbmQyLCBkb19ldmFsKSk7Ci0JfQotCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIFRPX1NUTlpFLCBvcG5kMSwgTlVMTCwgZG9fZXZhbCkpOwotfQotCi0vKgotICogUGxhaW4gdGVzdCAodGVzdCBhbmQgWyAuLiBdKSBzcGVjaWZpYyByb3V0aW5lcy4KLSAqLwotCi0vKgotICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCi0gKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCi0gKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCi0gKi8KLXN0YXRpYyBUZXN0X29wCi1wdGVzdF9pc2EoVGVzdF9lbnYgKnRlLCBUZXN0X21ldGEgbWV0YSkKLXsKLQkvKiBPcmRlciBpbXBvcnRhbnQgLSBpbmRleGVkIGJ5IFRlc3RfbWV0YSB2YWx1ZXMgKi8KLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdG9rZW5zW10gPSB7Ci0JCSItbyIsICItYSIsICIhIiwgIigiLCAiKSIKLQl9OwotCVRlc3Rfb3AgcnY7Ci0KLQlpZiAodGUtPnBvcy53cCA+PSB0ZS0+d3BfZW5kKQotCQlyZXR1cm4gKG1ldGEgPT0gVE1fRU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QKTsKLQotCWlmIChtZXRhID09IFRNX1VOT1AgfHwgbWV0YSA9PSBUTV9CSU5PUCkKLQkJcnYgPSB0ZXN0X2lzb3AobWV0YSwgKnRlLT5wb3Mud3ApOwotCWVsc2UgaWYgKG1ldGEgPT0gVE1fRU5EKQotCQlydiA9IFRPX05PTk9QOwotCWVsc2UKLQkJcnYgPSAhc3RyY21wKCp0ZS0+cG9zLndwLCB0b2tlbnNbKGludCltZXRhXSkgPwotCQkgICAgVE9fTk9OTlVMTCA6IFRPX05PTk9QOwotCi0JLyogQWNjZXB0IHRoZSB0b2tlbj8gKi8KLQlpZiAocnYgIT0gVE9fTk9OT1ApCi0JCXRlLT5wb3Mud3ArKzsKLQotCXJldHVybiAocnYpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wdGVzdF9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgYm9vbCBkb19ldmFsIE1LU0hfQV9VTlVTRUQpCi17Ci0JaWYgKHRlLT5wb3Mud3AgPj0gdGUtPndwX2VuZCkKLQkJcmV0dXJuIChvcCA9PSBUT19GSUxUVCA/ICIxIiA6IE5VTEwpOwotCXJldHVybiAoKnRlLT5wb3Mud3ArKyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdGVzdF9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZnMsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQljb25zdCBjaGFyICpvcDsKLQotCXRlLT5mbGFncyB8PSBURUZfRVJST1I7Ci0JaWYgKChvcCA9IHRlLT5wb3Mud3AgKyBvZnMgPj0gdGUtPndwX2VuZCA/IE5VTEwgOiB0ZS0+cG9zLndwW29mc10pKQotCQliaV9lcnJvcmYoIiVzOiAlcyIsIG9wLCBtc2cpOwotCWVsc2UKLQkJYmlfZXJyb3JmKCIlcyIsIG1zZyk7Ci19Ci0KLSNpZm5kZWYgTUtTSF9OT19MSU1JVFMKLSNkZWZpbmUgU09GVAkweDEKLSNkZWZpbmUgSEFSRAkweDIKLQotc3RydWN0IGxpbWl0cyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgcmVzb3VyY2U7CQkvKiByZXNvdXJjZSB0byBnZXQvc2V0ICovCi0JaW50IGZhY3RvcjsJCS8qIG11bHRpcGx5IGJ5IHRvIGdldCBybGltX3tjdXIsbWF4fSB2YWx1ZXMgKi8KLQljaGFyIG9wdGlvbjsKLX07Ci0KLXN0YXRpYyB2b2lkIHByaW50X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICosIGludCk7Ci1zdGF0aWMgaW50IHNldF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqLCBjb25zdCBjaGFyICosIGludCk7Ci0KLS8qIE1hZ2ljIHRvIGRpdmluZSB0aGUgJ20nIGFuZCAndicgbGltaXRzICovCi0KLSNpZmRlZiBSTElNSVRfQVMKLSNpZiAhZGVmaW5lZChSTElNSVRfVk1FTSkgfHwgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9BUykgfHwgXAotICAgICFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChSTElNSVRfVk1FTSA9PSBSTElNSVRfUlNTKQotI2RlZmluZSBVTElNSVRfVl9JU19BUwotI2VsaWYgZGVmaW5lZChSTElNSVRfVk1FTSkKLSNpZiAhZGVmaW5lZChSTElNSVRfUlNTKSB8fCAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpCi0jZGVmaW5lIFVMSU1JVF9WX0lTX0FTCi0jZWxzZQotI2RlZmluZSBVTElNSVRfVl9JU19WTUVNCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBSTElNSVRfUlNTCi0jaWZkZWYgVUxJTUlUX1ZfSVNfVk1FTQotI2RlZmluZSBVTElNSVRfTV9JU19SU1MKLSNlbGlmIGRlZmluZWQoUkxJTUlUX1ZNRU0pICYmIChSTElNSVRfVk1FTSA9PSBSTElNSVRfUlNTKQotI2RlZmluZSBVTElNSVRfTV9JU19WTUVNCi0jZWxzZQotI2RlZmluZSBVTElNSVRfTV9JU19SU1MKLSNlbmRpZgotI2lmIGRlZmluZWQoVUxJTUlUX01fSVNfUlNTKSAmJiBkZWZpbmVkKFJMSU1JVF9BUykgJiYgKFJMSU1JVF9SU1MgPT0gUkxJTUlUX0FTKQotI3VuZGVmIFVMSU1JVF9NX0lTX1JTUwotI2VuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFJMSU1JVF9BUykgJiYgIWRlZmluZWQoVUxJTUlUX01fSVNfVk1FTSkgJiYgZGVmaW5lZChSTElNSVRfVk1FTSkKLSNkZWZpbmUgVUxJTUlUX1ZfSVNfVk1FTQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChVTElNSVRfVl9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9WTUVNKSAmJiBcCi0gICAgKCFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChkZWZpbmVkKFJMSU1JVF9BUykgJiYgKFJMSU1JVF9SU1MgPT0gUkxJTUlUX0FTKSkpCi0jZGVmaW5lIFVMSU1JVF9NX0lTX1ZNRU0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVTElNSVRfTV9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9BUykgJiYgXAotICAgIChSTElNSVRfVk1FTSA9PSBSTElNSVRfQVMpCi0jdW5kZWYgVUxJTUlUX01fSVNfVk1FTQotI2VuZGlmCi0KLQotaW50Ci1jX3VsaW1pdChjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBsaW1pdHMgbGltaXRzW10gPSB7Ci0JCS8qIGRvIG5vdCB1c2Ugb3B0aW9ucyAtSCwgLVMgb3IgLWEgb3IgY2hhbmdlIHRoZSBvcmRlciAqLwotI2lmZGVmIFJMSU1JVF9DUFUKLQkJeyAidGltZShjcHUtc2Vjb25kcykiLCBSTElNSVRfQ1BVLCAxLCAndCcgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9GU0laRQotCQl7ICJmaWxlKGJsb2NrcykiLCBSTElNSVRfRlNJWkUsIDUxMiwgJ2YnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfQ09SRQotCQl7ICJjb3JlZHVtcChibG9ja3MpIiwgUkxJTUlUX0NPUkUsIDUxMiwgJ2MnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfREFUQQotCQl7ICJkYXRhKEtpQikiLCBSTElNSVRfREFUQSwgMTAyNCwgJ2QnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfU1RBQ0sKLQkJeyAic3RhY2soS2lCKSIsIFJMSU1JVF9TVEFDSywgMTAyNCwgJ3MnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTUVNTE9DSwotCQl7ICJsb2NrZWRtZW0oS2lCKSIsIFJMSU1JVF9NRU1MT0NLLCAxMDI0LCAnbCcgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OT0ZJTEUKLQkJeyAibm9maWxlcyhkZXNjcmlwdG9ycykiLCBSTElNSVRfTk9GSUxFLCAxLCAnbicgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OUFJPQwotCQl7ICJwcm9jZXNzZXMiLCBSTElNSVRfTlBST0MsIDEsICdwJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX1NXQVAKLQkJeyAic3dhcChLaUIpIiwgUkxJTUlUX1NXQVAsIDEwMjQsICd3JyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX0xPQ0tTCi0JCXsgImZsb2NrcyIsIFJMSU1JVF9MT0NLUywgLTEsICdMJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX1RJTUUKLQkJeyAiaHVtYW50aW1lKHNlY29uZHMpIiwgUkxJTUlUX1RJTUUsIDEsICdUJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05PVk1PTgotCQl7ICJ2bm9kZW1vbml0b3JzIiwgUkxJTUlUX05PVk1PTiwgMSwgJ1YnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfU0lHUEVORElORwotCQl7ICJzaWdwZW5kaW5nIiwgUkxJTUlUX1NJR1BFTkRJTkcsIDEsICdpJyB9LAotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX01TR1FVRVVFCi0JCXsgIm1zZ3F1ZXVlKGJ5dGVzKSIsIFJMSU1JVF9NU0dRVUVVRSwgMSwgJ3EnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfQUlPX01FTQotCQl7ICJBSU9sb2NrZWRtZW0oS2lCKSIsIFJMSU1JVF9BSU9fTUVNLCAxMDI0LCAnTScgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9BSU9fT1BTCi0JCXsgIkFJT29wZXJhdGlvbnMiLCBSTElNSVRfQUlPX09QUywgMSwgJ08nIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfVENBQ0hFCi0JCXsgImNhY2hlZHRocmVhZHMiLCBSTElNSVRfVENBQ0hFLCAxLCAnQycgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9TQlNJWkUKLQkJeyAic29ja2J1ZnNpeihLaUIpIiwgUkxJTUlUX1NCU0laRSwgMTAyNCwgJ0InIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfUFRIUkVBRAotCQl7ICJ0aHJlYWRzcGVycHJvY2VzcyIsIFJMSU1JVF9QVEhSRUFELCAxLCAnUCcgfSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OSUNFCi0JCXsgIm1heG5pY2UiLCBSTElNSVRfTklDRSwgMSwgJ2UnIH0sCi0jZW5kaWYKLSNpZmRlZiBSTElNSVRfUlRQUklPCi0JCXsgIm1heHJ0cHJpbyIsIFJMSU1JVF9SVFBSSU8sIDEsICdyJyB9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChVTElNSVRfTV9JU19SU1MpCi0JCXsgInJlc2lkZW50LXNldChLaUIpIiwgUkxJTUlUX1JTUywgMTAyNCwgJ20nIH0sCi0jZWxpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1ZNRU0pCi0JCXsgIm1lbW9yeShLaUIpIiwgUkxJTUlUX1ZNRU0sIDEwMjQsICdtJyB9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChVTElNSVRfVl9JU19WTUVNKQotCQl7ICJ2aXJ0dWFsLW1lbW9yeShLaUIpIiwgUkxJTUlUX1ZNRU0sIDEwMjQsICd2JyB9LAotI2VsaWYgZGVmaW5lZChVTElNSVRfVl9JU19BUykKLQkJeyAiYWRkcmVzcy1zcGFjZShLaUIpIiwgUkxJTUlUX0FTLCAxMDI0LCAndicgfSwKLSNlbmRpZgotCQl7IE5VTEwsIDAsIDAsIDAgfQotCX07Ci0Jc3RhdGljIGNoYXIgb3B0c1szICsgTkVMRU0obGltaXRzKV07Ci0JaW50IGhvdyA9IFNPRlQgfCBIQVJELCBvcHRjLCB3aGF0ID0gJ2YnOwotCWJvb2wgYWxsID0gZmFsc2U7Ci0JY29uc3Qgc3RydWN0IGxpbWl0cyAqbDsKLQotCWlmICghb3B0c1swXSkgewotCQkvKiBidWlsZCBvcHRpb25zIHN0cmluZyBvbiBmaXJzdCBjYWxsIC0geXVjayAqLwotCQljaGFyICpwID0gb3B0czsKLQotCQkqcCsrID0gJ0gnOyAqcCsrID0gJ1MnOyAqcCsrID0gJ2EnOwotCQlmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWU7IGwrKykKLQkJCSpwKysgPSBsLT5vcHRpb247Ci0JCSpwID0gJ1wwJzsKLQl9Ci0KLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ0gnOgotCQkJaG93ID0gSEFSRDsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCWhvdyA9IFNPRlQ7Ci0JCQlicmVhazsKLQkJY2FzZSAnYSc6Ci0JCQlhbGwgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJz8nOgotCQkJYmlfZXJyb3JmKCJ1c2FnZTogdWxpbWl0IFstYWNkZkhMbG1ucFNzVHR2d10gW3ZhbHVlXSIpOwotCQkJcmV0dXJuICgxKTsKLQkJZGVmYXVsdDoKLQkJCXdoYXQgPSBvcHRjOwotCQl9Ci0KLQlmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWUgJiYgbC0+b3B0aW9uICE9IHdoYXQ7IGwrKykKLQkJOwotCWlmICghbC0+bmFtZSkgewotCQlpbnRlcm5hbF93YXJuaW5nZigidWxpbWl0OiAlYyIsIHdoYXQpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7Ci0JCWlmIChhbGwgfHwgd3BbYnVpbHRpbl9vcHQub3B0aW5kICsgMV0pIHsKLQkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCXJldHVybiAoc2V0X3VsaW1pdChsLCB3cFtidWlsdGluX29wdC5vcHRpbmRdLCBob3cpKTsKLQl9Ci0JaWYgKCFhbGwpCi0JCXByaW50X3VsaW1pdChsLCBob3cpOwotCWVsc2UgZm9yIChsID0gbGltaXRzOyBsLT5uYW1lOyBsKyspIHsKLQkJc2hwcmludGYoIiUtMjBzICIsIGwtPm5hbWUpOwotCQlwcmludF91bGltaXQobCwgaG93KTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotc2V0X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICpsLCBjb25zdCBjaGFyICp2LCBpbnQgaG93KQotewotCXJsaW1fdCB2YWwgPSAocmxpbV90KTA7Ci0Jc3RydWN0IHJsaW1pdCBsaW1pdDsKLQotCWlmIChzdHJjbXAodiwgInVubGltaXRlZCIpID09IDApCi0JCXZhbCA9IChybGltX3QpUkxJTV9JTkZJTklUWTsKLQllbHNlIHsKLQkJbWtzaF9hcmlfdCBydmFsOwotCi0JCWlmICghZXZhbHVhdGUodiwgJnJ2YWwsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSkKLQkJCXJldHVybiAoMSk7Ci0JCS8qCi0JCSAqIEF2b2lkIHByb2JsZW1zIGNhdXNlZCBieSB0eXBvcyB0aGF0IGV2YWx1YXRlIG1pc3NlcyBkdWUKLQkJICogdG8gZXZhbHVhdGluZyB1bnNldCBwYXJhbWV0ZXJzIHRvIDAuLi4KLQkJICogSWYgdGhpcyBjYXVzZXMgcHJvYmxlbXMsIHdpbGwgaGF2ZSB0byBhZGQgcGFyYW1ldGVyIHRvCi0JCSAqIGV2YWx1YXRlKCkgdG8gY29udHJvbCBpZiB1bnNldCBwYXJhbXMgYXJlIDAgb3IgYW4gZXJyb3IuCi0JCSAqLwotCQlpZiAoIXJ2YWwgJiYgIWtzaF9pc2RpZ2l0KHZbMF0pKSB7Ci0JCQliaV9lcnJvcmYoImludmFsaWQgJXMgbGltaXQ6ICVzIiwgbC0+bmFtZSwgdik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCXZhbCA9IChybGltX3QpKChybGltX3QpcnZhbCAqIGwtPmZhY3Rvcik7Ci0JfQotCi0JaWYgKGdldHJsaW1pdChsLT5yZXNvdXJjZSwgJmxpbWl0KSA8IDApIHsKLQkJLyogc29tZSBjYW5ub3QgYmUgcmVhZCwgZS5nLiBMaW51eCBSTElNSVRfTE9DS1MgKi8KLQkJbGltaXQucmxpbV9jdXIgPSBSTElNX0lORklOSVRZOwotCQlsaW1pdC5ybGltX21heCA9IFJMSU1fSU5GSU5JVFk7Ci0JfQotCWlmIChob3cgJiBTT0ZUKQotCQlsaW1pdC5ybGltX2N1ciA9IHZhbDsKLQlpZiAoaG93ICYgSEFSRCkKLQkJbGltaXQucmxpbV9tYXggPSB2YWw7Ci0JaWYgKCFzZXRybGltaXQobC0+cmVzb3VyY2UsICZsaW1pdCkpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGVycm5vID09IEVQRVJNKQotCQliaV9lcnJvcmYoIiVzIGV4Y2VlZHMgYWxsb3dhYmxlICVzIGxpbWl0IiwgdiwgbC0+bmFtZSk7Ci0JZWxzZQotCQliaV9lcnJvcmYoImJhZCAlcyBsaW1pdDogJXMiLCBsLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqbCwgaW50IGhvdykKLXsKLQlybGltX3QgdmFsID0gKHJsaW1fdCkwOwotCXN0cnVjdCBybGltaXQgbGltaXQ7Ci0KLQlpZiAoZ2V0cmxpbWl0KGwtPnJlc291cmNlLCAmbGltaXQpKSB7Ci0JCXNoZl9wdXRzKCJ1bmtub3duXG4iLCBzaGxfc3Rkb3V0KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoaG93ICYgU09GVCkKLQkJdmFsID0gbGltaXQucmxpbV9jdXI7Ci0JZWxzZSBpZiAoaG93ICYgSEFSRCkKLQkJdmFsID0gbGltaXQucmxpbV9tYXg7Ci0JaWYgKHZhbCA9PSAocmxpbV90KVJMSU1fSU5GSU5JVFkpCi0JCXNoZl9wdXRzKCJ1bmxpbWl0ZWRcbiIsIHNobF9zdGRvdXQpOwotCWVsc2UKLQkJc2hwcmludGYoIiVsZFxuIiwgKGxvbmcpKHZhbCAvIGwtPmZhY3RvcikpOwotfQotI2VuZGlmCi0KLWludAotY19yZW5hbWUoY29uc3QgY2hhciAqKndwKQotewotCWludCBydiA9IDE7Ci0KLQlpZiAod3AgPT0gTlVMTAkJLyogYXJndiAqLyB8fAotCSAgICB3cFswXSA9PSBOVUxMCS8qIG5hbWUgb2YgYnVpbHRpbiAqLyB8fAotCSAgICB3cFsxXSA9PSBOVUxMCS8qIGZpcnN0IGFyZ3VtZW50ICovIHx8Ci0JICAgIHdwWzJdID09IE5VTEwJLyogc2Vjb25kIGFyZ3VtZW50ICovIHx8Ci0JICAgIHdwWzNdICE9IE5VTEwJLyogbm8gZnVydGhlciBhcmdzIHBsZWFzZSAqLykKLQkJYmlfZXJyb3JmKFRfc3luZXJyKTsKLQllbHNlIGlmICgocnYgPSByZW5hbWUod3BbMV0sIHdwWzJdKSkgIT0gMCkgewotCQlydiA9IGVycm5vOwotCQliaV9lcnJvcmYoImZhaWxlZDogJXMiLCBzdHJlcnJvcihydikpOwotCX0KLQotCXJldHVybiAocnYpOwotfQotCi1pbnQKLWNfcmVhbHBhdGgoY29uc3QgY2hhciAqKndwKQotewotCWludCBydiA9IDE7Ci0JY2hhciAqYnVmOwotCi0JaWYgKHdwICE9IE5VTEwgJiYgd3BbMF0gIT0gTlVMTCAmJiB3cFsxXSAhPSBOVUxMKSB7Ci0JCWlmIChzdHJjbXAod3BbMV0sICItLSIpKSB7Ci0JCQlpZiAod3BbMl0gPT0gTlVMTCkgewotCQkJCXdwICs9IDE7Ci0JCQkJcnYgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHdwWzJdICE9IE5VTEwgJiYgd3BbM10gPT0gTlVMTCkgewotCQkJCXdwICs9IDI7Ci0JCQkJcnYgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHJ2KQotCQliaV9lcnJvcmYoVF9zeW5lcnIpOwotCWVsc2UgaWYgKChidWYgPSBkb19yZWFscGF0aCgqd3ApKSA9PSBOVUxMKSB7Ci0JCXJ2ID0gZXJybm87Ci0JCWJpX2Vycm9yZigiJXM6ICVzIiwgKndwLCBzdHJlcnJvcihydikpOwotCQlpZiAoKHVuc2lnbmVkIGludClydiA+IDI1NSkKLQkJCXJ2ID0gMjU1OwotCX0gZWxzZSB7Ci0JCXNocHJpbnRmKCIlc1xuIiwgYnVmKTsKLQkJYWZyZWUoYnVmLCBBVEVNUCk7Ci0JfQotCi0JcmV0dXJuIChydik7Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9oaXN0cmFwLmMgYi9ta3NoL3NyYy9oaXN0cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzRjMzguLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvaGlzdHJhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MyArMCwwIEBACi0vKgkkT3BlbkJTRDogaGlzdG9yeS5jLHYgMS4zOSAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHRyYXAuYyx2IDEuMjMgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9oaXN0cmFwLmMsdiAxLjk4IDIwMTAvMDcvMjQgMTc6MDg6MjkgdGcgRXhwICQiKTsKLQotLyotCi0gKiBNaXJPUzogVGhpcyBpcyB0aGUgZGVmYXVsdCBtYXBwaW5nIHR5cGUsIGFuZCBuZWVkIG5vdCBiZSBzcGVjaWZpZWQuCi0gKiBJUklYIGRvZXNuJ3QgaGF2ZSB0aGlzIGNvbnN0YW50LgotICovCi0jaWZuZGVmIE1BUF9GSUxFCi0jZGVmaW5lIE1BUF9GSUxFCTAKLSNlbmRpZgotCi1UcmFwIHNpZ3RyYXBzW05TSUcgKyAxXTsKLXN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIFNpZ2FjdF9pZ247Ci0KLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotc3RhdGljIGludCBoaXN0X2NvdW50X2xpbmVzKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLXN0YXRpYyBpbnQgaGlzdF9zaHJpbmsodW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmhpc3Rfc2tpcF9iYWNrKHVuc2lnbmVkIGNoYXIgKixpbnQgKixpbnQpOwotc3RhdGljIHZvaWQgaGlzdGxvYWQoU291cmNlICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGhpc3RpbnNlcnQoU291cmNlICosIGludCwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHdyaXRlaGlzdGZpbGUoaW50LCBjaGFyICopOwotc3RhdGljIGludCBzcHJpbmtsZShpbnQpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaGlzdF9leGVjdXRlKGNoYXIgKik7Ci1zdGF0aWMgaW50IGhpc3RfcmVwbGFjZShjaGFyICoqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci1zdGF0aWMgY2hhciAqKmhpc3RfZ2V0KGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7Ci1zdGF0aWMgY2hhciAqKmhpc3RfZ2V0X29sZGVzdCh2b2lkKTsKLXN0YXRpYyB2b2lkIGhpc3RiYWNrdXAodm9pZCk7Ci0KLXN0YXRpYyBjaGFyICoqY3VycmVudDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaGlzdG9yeVtdICovCi1zdGF0aWMgaW50IGhzdGFydGVkOwkJLyogc2V0IGFmdGVyIGhpc3RfaW5pdCgpIGNhbGxlZCAqLwotc3RhdGljIFNvdXJjZSAqaGlzdF9zb3VyY2U7Ci0KLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotc3RhdGljIGNoYXIgKmhuYW1lOwkJLyogY3VycmVudCBuYW1lIG9mIGhpc3RvcnkgZmlsZSAqLwotc3RhdGljIGludCBoaXN0ZmQ7Ci1zdGF0aWMgaW50IGhzaXplOwotI2VuZGlmCi0KLWludAotY19mYyhjb25zdCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IHNoZiAqc2hmOwotCXN0cnVjdCB0ZW1wICp0ZjsKLQljb25zdCBjaGFyICpwOwotCWNoYXIgKmVkaXRvciA9IE5VTEw7Ci0JYm9vbCBnZmxhZyA9IGZhbHNlLCBsZmxhZyA9IGZhbHNlLCBuZmxhZyA9IGZhbHNlLCByZmxhZyA9IGZhbHNlLAotCSAgICBzZmxhZyA9IGZhbHNlOwotCWludCBvcHRjOwotCWNvbnN0IGNoYXIgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMOwotCWNoYXIgKipoZmlyc3QsICoqaGxhc3QsICoqaHA7Ci0KLQlpZiAoIUZsYWcoRlRBTEtJTkdfSSkpIHsKLQkJYmlfZXJyb3JmKCJoaXN0b3J5IGZ1bmN0aW9ucyBub3QgYXZhaWxhYmxlIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0Jd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LAotCSAgICAiZTpnbG5yczAsMSwyLDMsNCw1LDYsNyw4LDksIikpICE9IC0xKQotCQlzd2l0Y2ggKG9wdGMpIHsKLQkJY2FzZSAnZSc6Ci0JCQlwID0gYnVpbHRpbl9vcHQub3B0YXJnOwotCQkJaWYgKGtzaF9pc2Rhc2gocCkpCi0JCQkJc2ZsYWcgPSB0cnVlOwotCQkJZWxzZSB7Ci0JCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihwKTsKLQkJCQllZGl0b3IgPSBhbGxvYyhsZW4gKyA0LCBBVEVNUCk7Ci0JCQkJbWVtY3B5KGVkaXRvciwgcCwgbGVuKTsKLQkJCQltZW1jcHkoZWRpdG9yICsgbGVuLCAiICRfIiwgNCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnZyc6IC8qIG5vbi1BVCZUIGtzaCAqLwotCQkJZ2ZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJbGZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJbmZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkJcmZsYWcgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgkvKiBQT1NJWCB2ZXJzaW9uIG9mIC1lIC0gKi8KLQkJCXNmbGFnID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQkvKiBrbHVkZ2UgY2l0eSAtIGFjY2VwdCAtbnVtIGFzIC0tIC1udW0gKGtpbmQgb2YpICovCi0JCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQkJY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkJcCA9IHNoZl9zbXByaW50ZigiLSVjJXMiLAotCQkJCQlvcHRjLCBidWlsdGluX29wdC5vcHRhcmcpOwotCQkJaWYgKCFmaXJzdCkKLQkJCQlmaXJzdCA9IHA7Ci0JCQllbHNlIGlmICghbGFzdCkKLQkJCQlsYXN0ID0gcDsKLQkJCWVsc2UgewotCQkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7Ci0KLQkvKiBTdWJzdGl0dXRlIGFuZCBleGVjdXRlIGNvbW1hbmQgKi8KLQlpZiAoc2ZsYWcpIHsKLQkJY2hhciAqcGF0ID0gTlVMTCwgKnJlcCA9IE5VTEw7Ci0KLQkJaWYgKGVkaXRvciB8fCBsZmxhZyB8fCBuZmxhZyB8fCByZmxhZykgewotCQkJYmlfZXJyb3JmKCJjYW4ndCB1c2UgLWUsIC1sLCAtbiwgLXIgd2l0aCAtcyAoLWUgLSkiKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgcGF0dGVybiByZXBsYWNlbWVudCBhcmd1bWVudCAqLwotCQlpZiAoKndwICYmICoqd3AgJiYgKHAgPSBjc3RyY2hyKCp3cCArIDEsICc9JykpKSB7Ci0JCQlzdHJkdXB4KHBhdCwgKndwLCBBVEVNUCk7Ci0JCQlyZXAgPSBwYXQgKyAocCAtICp3cCk7Ci0JCQkqcmVwKysgPSAnXDAnOwotCQkJd3ArKzsKLQkJfQotCQkvKiBDaGVjayBmb3Igc2VhcmNoIHByZWZpeCAqLwotCQlpZiAoIWZpcnN0ICYmIChmaXJzdCA9ICp3cCkpCi0JCQl3cCsrOwotCQlpZiAobGFzdCB8fCAqd3ApIHsKLQkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0KLQkJaHAgPSBmaXJzdCA/IGhpc3RfZ2V0KGZpcnN0LCBmYWxzZSwgZmFsc2UpIDoKLQkJICAgIGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7Ci0JCWlmICghaHApCi0JCQlyZXR1cm4gKDEpOwotCQlyZXR1cm4gKGhpc3RfcmVwbGFjZShocCwgcGF0LCByZXAsIGdmbGFnKSk7Ci0JfQotCi0JaWYgKGVkaXRvciAmJiAobGZsYWcgfHwgbmZsYWcpKSB7Ci0JCWJpX2Vycm9yZigiY2FuJ3QgdXNlIC1sLCAtbiB3aXRoIC1lIik7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JaWYgKCFmaXJzdCAmJiAoZmlyc3QgPSAqd3ApKQotCQl3cCsrOwotCWlmICghbGFzdCAmJiAobGFzdCA9ICp3cCkpCi0JCXdwKys7Ci0JaWYgKCp3cCkgewotCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAoIWZpcnN0KSB7Ci0JCWhmaXJzdCA9IGxmbGFnID8gaGlzdF9nZXQoIi0xNiIsIHRydWUsIHRydWUpIDoKLQkJICAgIGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7Ci0JCWlmICghaGZpcnN0KQotCQkJcmV0dXJuICgxKTsKLQkJLyogY2FuJ3QgZmFpbCBpZiBoZmlyc3QgZGlkbid0IGZhaWwgKi8KLQkJaGxhc3QgPSBoaXN0X2dldF9uZXdlc3QoZmFsc2UpOwotCX0gZWxzZSB7Ci0JCS8qIFBPU0lYIHNheXMgbm90IGFuIGVycm9yIGlmIGZpcnN0L2xhc3Qgb3V0IG9mIGJvdW5kcwotCQkgKiB3aGVuIHJhbmdlIGlzIHNwZWNpZmllZDsgQVQmVCBrc2ggYW5kIHBka3NoIGFsbG93IG91dCBvZgotCQkgKiBib3VuZHMgZm9yIC1sIGFzIHdlbGwuCi0JCSAqLwotCQloZmlyc3QgPSBoaXN0X2dldChmaXJzdCwgKGxmbGFnIHx8IGxhc3QpID8gdHJ1ZSA6IGZhbHNlLCBsZmxhZyk7Ci0JCWlmICghaGZpcnN0KQotCQkJcmV0dXJuICgxKTsKLQkJaGxhc3QgPSBsYXN0ID8gaGlzdF9nZXQobGFzdCwgdHJ1ZSwgbGZsYWcpIDoKLQkJICAgIChsZmxhZyA/IGhpc3RfZ2V0X25ld2VzdChmYWxzZSkgOiBoZmlyc3QpOwotCQlpZiAoIWhsYXN0KQotCQkJcmV0dXJuICgxKTsKLQl9Ci0JaWYgKGhmaXJzdCA+IGhsYXN0KSB7Ci0JCWNoYXIgKip0ZW1wOwotCi0JCXRlbXAgPSBoZmlyc3Q7IGhmaXJzdCA9IGhsYXN0OyBobGFzdCA9IHRlbXA7Ci0JCXJmbGFnID0gIXJmbGFnOyAvKiBQT1NJWCAqLwotCX0KLQotCS8qIExpc3QgaGlzdG9yeSAqLwotCWlmIChsZmxhZykgewotCQljaGFyICpzLCAqdDsKLQotCQlmb3IgKGhwID0gcmZsYWcgPyBobGFzdCA6IGhmaXJzdDsKLQkJICAgIGhwID49IGhmaXJzdCAmJiBocCA8PSBobGFzdDsgaHAgKz0gcmZsYWcgPyAtMSA6IDEpIHsKLQkJCWlmICghbmZsYWcpCi0JCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVkIiwKLQkJCQkgICAgaGlzdF9zb3VyY2UtPmxpbmUgLSAoaW50KShoaXN0cHRyIC0gaHApKTsKLQkJCXNoZl9wdXRjKCdcdCcsIHNobF9zdGRvdXQpOwotCQkJLyogcHJpbnQgbXVsdGktbGluZSBjb21tYW5kcyBjb3JyZWN0bHkgKi8KLQkJCXMgPSAqaHA7Ci0JCQl3aGlsZSAoKHQgPSBzdHJjaHIocywgJ1xuJykpKSB7Ci0JCQkJKnQgPSAnXDAnOwotCQkJCXNoZl9mcHJpbnRmKHNobF9zdGRvdXQsICIlc1xuXHQiLCBzKTsKLQkJCQkqdCsrID0gJ1xuJzsKLQkJCQlzID0gdDsKLQkJCX0KLQkJCXNoZl9mcHJpbnRmKHNobF9zdGRvdXQsICIlc1xuIiwgcyk7Ci0JCX0KLQkJc2hmX2ZsdXNoKHNobF9zdGRvdXQpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIFJ1biBlZGl0b3Igb24gc2VsZWN0ZWQgbGluZXMsIHRoZW4gcnVuIHJlc3VsdGluZyBjb21tYW5kcyAqLwotCi0JdGYgPSBtYWtldGVtcChBVEVNUCwgVFRfSElTVF9FRElULCAmZS0+dGVtcHMpOwotCWlmICghKHNoZiA9IHRmLT5zaGYpKSB7Ci0JCWJpX2Vycm9yZigiY2Fubm90IGNyZWF0ZSB0ZW1wIGZpbGUgJXMgLSAlcyIsCi0JCSAgICB0Zi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JZm9yIChocCA9IHJmbGFnID8gaGxhc3QgOiBoZmlyc3Q7Ci0JICAgIGhwID49IGhmaXJzdCAmJiBocCA8PSBobGFzdDsgaHAgKz0gcmZsYWcgPyAtMSA6IDEpCi0JCXNoZl9mcHJpbnRmKHNoZiwgIiVzXG4iLCAqaHApOwotCWlmIChzaGZfY2xvc2Uoc2hmKSA9PSBFT0YpIHsKLQkJYmlfZXJyb3JmKCJlcnJvciB3cml0aW5nIHRlbXBvcmFyeSBmaWxlIC0gJXMiLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCS8qIElnbm9yZSBzZXRzdHIgZXJyb3JzIGhlcmUgKGFyYml0cmFyeSkgKi8KLQlzZXRzdHIobG9jYWwoIl8iLCBmYWxzZSksIHRmLT5uYW1lLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQotCS8qIFhYWDogc291cmNlIHNob3VsZCBub3QgZ2V0IHRyYXNoZWQgYnkgdGhpcy4uICovCi0JewotCQlTb3VyY2UgKnNvbGQgPSBzb3VyY2U7Ci0JCWludCByZXQ7Ci0KLQkJcmV0ID0gY29tbWFuZChlZGl0b3IgPyBlZGl0b3IgOiAiJHtGQ0VESVQ6LS9iaW4vZWR9ICRfIiwgMCk7Ci0JCXNvdXJjZSA9IHNvbGQ7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gKHJldCk7Ci0JfQotCi0JewotCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQkJWFN0cmluZyB4czsKLQkJY2hhciAqeHA7Ci0JCWludCBuOwotCi0JCWlmICghKHNoZiA9IHNoZl9vcGVuKHRmLT5uYW1lLCBPX1JET05MWSwgMCwgMCkpKSB7Ci0JCQliaV9lcnJvcmYoImNhbm5vdCBvcGVuIHRlbXAgZmlsZSAlcyIsIHRmLT5uYW1lKTsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQotCQluID0gc3RhdCh0Zi0+bmFtZSwgJnN0YXRiKSA8IDAgPyAxMjggOiBzdGF0Yi5zdF9zaXplICsgMTsKLQkJWGluaXQoeHMsIHhwLCBuLCBoaXN0X3NvdXJjZS0+YXJlYXApOwotCQl3aGlsZSAoKG4gPSBzaGZfcmVhZCh4cCwgWG5sZWZ0KHhzLCB4cCksIHNoZikpID4gMCkgewotCQkJeHAgKz0gbjsKLQkJCWlmIChYbmxlZnQoeHMsIHhwKSA8PSAwKQotCQkJCVhjaGVja04oeHMsIHhwLCBYbGVuZ3RoKHhzLCB4cCkpOwotCQl9Ci0JCWlmIChuIDwgMCkgewotCQkJYmlfZXJyb3JmKCJlcnJvciByZWFkaW5nIHRlbXAgZmlsZSAlcyAtICVzIiwKLQkJCSAgICB0Zi0+bmFtZSwgc3RyZXJyb3Ioc2hmX2Vycm5vKHNoZikpKTsKLQkJCXNoZl9jbG9zZShzaGYpOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlzaGZfY2xvc2Uoc2hmKTsKLQkJKnhwID0gJ1wwJzsKLQkJc3RyaXBfbnVscyhYc3RyaW5nKHhzLCB4cCksIFhsZW5ndGgoeHMsIHhwKSk7Ci0JCXJldHVybiAoaGlzdF9leGVjdXRlKFhzdHJpbmcoeHMsIHhwKSkpOwotCX0KLX0KLQotLyogU2F2ZSBjbWQgaW4gaGlzdG9yeSwgZXhlY3V0ZSBjbWQgKGNtZCBnZXRzIHRyYXNoZWQpICovCi1zdGF0aWMgaW50Ci1oaXN0X2V4ZWN1dGUoY2hhciAqY21kKQotewotCVNvdXJjZSAqc29sZDsKLQlpbnQgcmV0OwotCWNoYXIgKnAsICpxOwotCi0JaGlzdGJhY2t1cCgpOwotCi0JZm9yIChwID0gY21kOyBwOyBwID0gcSkgewotCQlpZiAoKHEgPSBzdHJjaHIocCwgJ1xuJykpKSB7Ci0JCQkqcSsrID0gJ1wwJzsgLyoga2lsbCB0aGUgbmV3bGluZSAqLwotCQkJaWYgKCEqcSkgLyogaWdub3JlIHRyYWlsaW5nIG5ld2xpbmUgKi8KLQkJCQlxID0gTlVMTDsKLQkJfQotCQloaXN0c2F2ZSgmaGlzdF9zb3VyY2UtPmxpbmUsIHAsIHRydWUsIHRydWUpOwotCi0JCXNoZWxsZigiJXNcbiIsIHApOyAvKiBQT1NJWCBkb2Vzbid0IHNheSB0aGlzIGlzIGRvbmUuLi4gKi8KLQkJaWYgKHEpCQkvKiByZXN0b3JlIFxuICh0cmFpbGluZyBcbiBub3QgcmVzdG9yZWQpICovCi0JCQlxWy0xXSA9ICdcbic7Ci0JfQotCi0JLyoKLQkgKiBDb21tYW5kcyBhcmUgZXhlY3V0ZWQgaGVyZSBpbnN0ZWFkIG9mIHB1c2hpbmcgdGhlbSBvbnRvIHRoZQotCSAqIGlucHV0ICdjYXVzZSBQT1NJWCBzYXlzIHRoZSByZWRpcmVjdGlvbiBhbmQgdmFyaWFibGUgYXNzaWdubWVudHMKLQkgKiBpbgotCSAqCVg9eSBmYyAtZSAtIDQyIDI+IC9kZXYvbnVsbAotCSAqIGFyZSB0byBlZmZlY3QgdGhlIHJlcGVhdGVkIGNvbW1hbmRzIGVudmlyb25tZW50LgotCSAqLwotCS8qIFhYWDogc291cmNlIHNob3VsZCBub3QgZ2V0IHRyYXNoZWQgYnkgdGhpcy4uICovCi0Jc29sZCA9IHNvdXJjZTsKLQlyZXQgPSBjb21tYW5kKGNtZCwgMCk7Ci0Jc291cmNlID0gc29sZDsKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWhpc3RfcmVwbGFjZShjaGFyICoqaHAsIGNvbnN0IGNoYXIgKnBhdCwgY29uc3QgY2hhciAqcmVwLCBib29sIGdsb2JyKQotewotCWNoYXIgKmxpbmU7Ci0KLQlpZiAoIXBhdCkKLQkJc3RyZHVweChsaW5lLCAqaHAsIEFURU1QKTsKLQllbHNlIHsKLQkJY2hhciAqcywgKnMxOwotCQlpbnQgcGF0X2xlbiA9IHN0cmxlbihwYXQpOwotCQlpbnQgcmVwX2xlbiA9IHN0cmxlbihyZXApOwotCQlpbnQgbGVuOwotCQlYU3RyaW5nIHhzOwotCQljaGFyICp4cDsKLQkJYm9vbCBhbnlfc3Vic3QgPSBmYWxzZTsKLQotCQlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOwotCQlmb3IgKHMgPSAqaHA7IChzMSA9IHN0cnN0cihzLCBwYXQpKSAmJiAoIWFueV9zdWJzdCB8fCBnbG9icik7Ci0JCSAgICBzID0gczEgKyBwYXRfbGVuKSB7Ci0JCQlhbnlfc3Vic3QgPSB0cnVlOwotCQkJbGVuID0gczEgLSBzOwotCQkJWGNoZWNrTih4cywgeHAsIGxlbiArIHJlcF9sZW4pOwotCQkJbWVtY3B5KHhwLCBzLCBsZW4pOwkJLyogZmlyc3QgcGFydCAqLwotCQkJeHAgKz0gbGVuOwotCQkJbWVtY3B5KHhwLCByZXAsIHJlcF9sZW4pOwkvKiByZXBsYWNlbWVudCAqLwotCQkJeHAgKz0gcmVwX2xlbjsKLQkJfQotCQlpZiAoIWFueV9zdWJzdCkgewotCQkJYmlfZXJyb3JmKCJzdWJzdGl0dXRpb24gZmFpbGVkIik7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCWxlbiA9IHN0cmxlbihzKSArIDE7Ci0JCVhjaGVja04oeHMsIHhwLCBsZW4pOwotCQltZW1jcHkoeHAsIHMsIGxlbik7Ci0JCXhwICs9IGxlbjsKLQkJbGluZSA9IFhjbG9zZSh4cywgeHApOwotCX0KLQlyZXR1cm4gKGhpc3RfZXhlY3V0ZShsaW5lKSk7Ci19Ci0KLS8qCi0gKiBnZXQgcG9pbnRlciB0byBoaXN0b3J5IGdpdmVuIHBhdHRlcm4KLSAqIHBhdHRlcm4gaXMgYSBudW1iZXIgb3Igc3RyaW5nCi0gKi8KLXN0YXRpYyBjaGFyICoqCi1oaXN0X2dldChjb25zdCBjaGFyICpzdHIsIGJvb2wgYXBwcm94LCBib29sIGFsbG93X2N1cikKLXsKLQljaGFyICoqaHAgPSBOVUxMOwotCWludCBuOwotCi0JaWYgKGdldG4oc3RyLCAmbikpIHsKLQkJaHAgPSBoaXN0cHRyICsgKG4gPCAwID8gbiA6IChuIC0gaGlzdF9zb3VyY2UtPmxpbmUpKTsKLQkJaWYgKChwdHJkaWZmX3QpaHAgPCAocHRyZGlmZl90KWhpc3RvcnkpIHsKLQkJCWlmIChhcHByb3gpCi0JCQkJaHAgPSBoaXN0X2dldF9vbGRlc3QoKTsKLQkJCWVsc2UgewotCQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpbiBoaXN0b3J5Iiwgc3RyKTsKLQkJCQlocCA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHB0cmRpZmZfdClocCA+IChwdHJkaWZmX3QpaGlzdHB0cikgewotCQkJaWYgKGFwcHJveCkKLQkJCQlocCA9IGhpc3RfZ2V0X25ld2VzdChhbGxvd19jdXIpOwotCQkJZWxzZSB7Ci0JCQkJYmlfZXJyb3JmKCIlczogbm90IGluIGhpc3RvcnkiLCBzdHIpOwotCQkJCWhwID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIGlmICghYWxsb3dfY3VyICYmIGhwID09IGhpc3RwdHIpIHsKLQkJCWJpX2Vycm9yZigiJXM6IGludmFsaWQgcmFuZ2UiLCBzdHIpOwotCQkJaHAgPSBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGFuY2hvcmVkID0gKnN0ciA9PSAnPycgPyAoKytzdHIsIDApIDogMTsKLQotCQkvKiB0aGUgLTEgaXMgdG8gYXZvaWQgdGhlIGN1cnJlbnQgZmMgY29tbWFuZCAqLwotCQlpZiAoKG4gPSBmaW5kaGlzdChoaXN0cHRyIC0gaGlzdG9yeSAtIDEsIDAsIHN0ciwgYW5jaG9yZWQpKSA8IDApCi0JCQliaV9lcnJvcmYoIiVzOiBub3QgaW4gaGlzdG9yeSIsIHN0cik7Ci0JCWVsc2UKLQkJCWhwID0gJmhpc3Rvcnlbbl07Ci0JfQotCXJldHVybiAoaHApOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXdlc3QgY29tbWFuZCBpbiB0aGUgaGlzdG9yeSAqLwotY2hhciAqKgotaGlzdF9nZXRfbmV3ZXN0KGJvb2wgYWxsb3dfY3VyKQotewotCWlmIChoaXN0cHRyIDwgaGlzdG9yeSB8fCAoIWFsbG93X2N1ciAmJiBoaXN0cHRyID09IGhpc3RvcnkpKSB7Ci0JCWJpX2Vycm9yZigibm8gaGlzdG9yeSAoeWV0KSIpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlyZXR1cm4gKGFsbG93X2N1ciA/IGhpc3RwdHIgOiBoaXN0cHRyIC0gMSk7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9sZGVzdCBjb21tYW5kIGluIHRoZSBoaXN0b3J5ICovCi1zdGF0aWMgY2hhciAqKgotaGlzdF9nZXRfb2xkZXN0KHZvaWQpCi17Ci0JaWYgKGhpc3RwdHIgPD0gaGlzdG9yeSkgewotCQliaV9lcnJvcmYoIm5vIGhpc3RvcnkgKHlldCkiKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JcmV0dXJuIChoaXN0b3J5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEJhY2sgdXAgb3ZlciBsYXN0IGhpc3RzYXZlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWhpc3RiYWNrdXAodm9pZCkKLXsKLQlzdGF0aWMgaW50IGxhc3RfbGluZSA9IC0xOwotCi0JaWYgKGhpc3RwdHIgPj0gaGlzdG9yeSAmJiBsYXN0X2xpbmUgIT0gaGlzdF9zb3VyY2UtPmxpbmUpIHsKLQkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKLQkJYWZyZWUoKmhpc3RwdHIsIEFQRVJNKTsKLQkJaGlzdHB0ci0tOwotCQlsYXN0X2xpbmUgPSBoaXN0X3NvdXJjZS0+bGluZTsKLQl9Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKi8KLWNoYXIgKioKLWhpc3Rwb3Modm9pZCkKLXsKLQlyZXR1cm4gKGN1cnJlbnQpOwotfQotCi1pbnQKLWhpc3RudW0oaW50IG4pCi17Ci0JaW50IGxhc3QgPSBoaXN0cHRyIC0gaGlzdG9yeTsKLQotCWlmIChuIDwgMCB8fCBuID49IGxhc3QpIHsKLQkJY3VycmVudCA9IGhpc3RwdHI7Ci0JCXJldHVybiAobGFzdCk7Ci0JfSBlbHNlIHsKLQkJY3VycmVudCA9ICZoaXN0b3J5W25dOwotCQlyZXR1cm4gKG4pOwotCX0KLX0KLQotLyoKLSAqIFRoaXMgd2lsbCBiZWNvbWUgdW5uZWNlc3NhcnkgaWYgaGlzdF9nZXQgaXMgbW9kaWZpZWQgdG8gYWxsb3cKLSAqIHNlYXJjaGluZyBmcm9tIHBvc2l0aW9ucyBvdGhlciB0aGFuIHRoZSBlbmQsIGFuZCBpbiBlaXRoZXIKLSAqIGRpcmVjdGlvbi4KLSAqLwotaW50Ci1maW5kaGlzdChpbnQgc3RhcnQsIGludCBmd2QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGFuY2hvcmVkKQotewotCWNoYXIJKipocDsKLQlpbnQJbWF4aGlzdCA9IGhpc3RwdHIgLSBoaXN0b3J5OwotCWludAlpbmNyID0gZndkID8gMSA6IC0xOwotCWludAlsZW4gPSBzdHJsZW4oc3RyKTsKLQotCWlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gbWF4aGlzdCkKLQkJc3RhcnQgPSBtYXhoaXN0OwotCi0JaHAgPSAmaGlzdG9yeVtzdGFydF07Ci0JZm9yICg7IGhwID49IGhpc3RvcnkgJiYgaHAgPD0gaGlzdHB0cjsgaHAgKz0gaW5jcikKLQkJaWYgKChhbmNob3JlZCAmJiBzdHJuY21wKCpocCwgc3RyLCBsZW4pID09IDApIHx8Ci0JCSAgICAoIWFuY2hvcmVkICYmIHN0cnN0cigqaHAsIHN0cikpKQotCQkJcmV0dXJuIChocCAtIGhpc3RvcnkpOwotCi0JcmV0dXJuICgtMSk7Ci19Ci0KLWludAotZmluZGhpc3RyZWwoY29uc3QgY2hhciAqc3RyKQotewotCWludAltYXhoaXN0ID0gaGlzdHB0ciAtIGhpc3Rvcnk7Ci0JaW50CXN0YXJ0ID0gbWF4aGlzdCAtIDE7Ci0JaW50CXJlYzsKLQotCWdldG4oc3RyLCAmcmVjKTsKLQlpZiAocmVjID09IDApCi0JCXJldHVybiAoLTEpOwotCWlmIChyZWMgPiAwKSB7Ci0JCWlmIChyZWMgPiBtYXhoaXN0KQotCQkJcmV0dXJuICgtMSk7Ci0JCXJldHVybiAocmVjIC0gMSk7Ci0JfQotCWlmIChyZWMgPiBtYXhoaXN0KQotCQlyZXR1cm4gKC0xKTsKLQlyZXR1cm4gKHN0YXJ0ICsgcmVjICsgMSk7Ci19Ci0KLS8qCi0gKglzZXQgaGlzdG9yeQotICoJdGhpcyBtZWFucyByZWFsbG9jYXRpbmcgdGhlIGRhdGFzcGFjZQotICovCi12b2lkCi1zZXRoaXN0c2l6ZShpbnQgbikKLXsKLQlpZiAobiA+IDAgJiYgbiAhPSBoaXN0c2l6ZSkgewotCQlpbnQgY3Vyc2l6ZSA9IGhpc3RwdHIgLSBoaXN0b3J5OwotCi0JCS8qIHNhdmUgbW9zdCByZWNlbnQgaGlzdG9yeSAqLwotCQlpZiAobiA8IGN1cnNpemUpIHsKLQkJCW1lbW1vdmUoaGlzdG9yeSwgaGlzdHB0ciAtIG4sIG4gKiBzaXplb2YoY2hhciAqKSk7Ci0JCQljdXJzaXplID0gbjsKLQkJfQotCi0JCWhpc3RvcnkgPSBhcmVzaXplKGhpc3RvcnksIG4gKiBzaXplb2YoY2hhciAqKSwgQVBFUk0pOwotCi0JCWhpc3RzaXplID0gbjsKLQkJaGlzdHB0ciA9IGhpc3RvcnkgKyBjdXJzaXplOwotCX0KLX0KLQotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi0vKgotICoJc2V0IGhpc3RvcnkgZmlsZQotICoJVGhpcyBjYW4gbWVhbiByZWxvYWRpbmcvcmVzZXR0aW5nL3N0YXJ0aW5nIGhpc3RvcnkgZmlsZQotICoJbWFpbnRlbmFuY2UKLSAqLwotdm9pZAotc2V0aGlzdGZpbGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQkvKiBpZiBub3Qgc3RhcnRlZCB0aGVuIG5vdGhpbmcgdG8gZG8gKi8KLQlpZiAoaHN0YXJ0ZWQgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyogaWYgdGhlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgd2UgaGF2ZSAqLwotCWlmIChobmFtZSAmJiBzdHJjbXAoaG5hbWUsIG5hbWUpID09IDApCi0JCXJldHVybjsKLQotCS8qCi0JICogaXRzIGEgbmV3IG5hbWUgLSBwb3NzaWJseQotCSAqLwotCWlmIChoaXN0ZmQpIHsKLQkJLyogeWVzIHRoZSBmaWxlIGlzIG9wZW4gKi8KLQkJKHZvaWQpY2xvc2UoaGlzdGZkKTsKLQkJaGlzdGZkID0gMDsKLQkJaHNpemUgPSAwOwotCQlhZnJlZShobmFtZSwgQVBFUk0pOwotCQlobmFtZSA9IE5VTEw7Ci0JCS8qIGxldCdzIHJlc2V0IHRoZSBoaXN0b3J5ICovCi0JCWhpc3RwdHIgPSBoaXN0b3J5IC0gMTsKLQkJaGlzdF9zb3VyY2UtPmxpbmUgPSAwOwotCX0KLQotCWhpc3RfaW5pdChoaXN0X3NvdXJjZSk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqCWluaXRpYWxpc2UgdGhlIGhpc3RvcnkgdmVjdG9yCi0gKi8KLXZvaWQKLWluaXRfaGlzdHZlYyh2b2lkKQotewotCWlmIChoaXN0b3J5ID09IChjaGFyICoqKU5VTEwpIHsKLQkJaGlzdHNpemUgPSBISVNUT1JZU0laRTsKLQkJaGlzdG9yeSA9IGFsbG9jKGhpc3RzaXplICogc2l6ZW9mKGNoYXIgKiksIEFQRVJNKTsKLQkJaGlzdHB0ciA9IGhpc3RvcnkgLSAxOwotCX0KLX0KLQotCi0vKgotICoJUm91dGluZXMgYWRkZWQgYnkgUGV0ZXIgQ29sbGluc29uIEJTREkoRXVyb3BlKS9IaWxsc2lkZSBTeXN0ZW1zIHRvCi0gKglhKSBwZXJtaXQgSElTVFNJWkUgdG8gY29udHJvbCBudW1iZXIgb2YgbGluZXMgb2YgaGlzdG9yeSBzdG9yZWQKLSAqCWIpIG1haW50YWluIGEgcGh5c2ljYWwgaGlzdG9yeSBmaWxlCi0gKgotICoJSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgZ2hhc3RseSBoYWNrZXJ5IGhlcmUKLSAqLwotCi0jaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLS8qIGRvIG5vdCBzYXZlIGNvbW1hbmQgaW4gaGlzdG9yeSBidXQgcG9zc2libHkgc3luYyAqLwotYm9vbAotaGlzdHN5bmModm9pZCkKLXsKLQlib29sIGNoYW5nZWQgPSBmYWxzZTsKLQotCWlmIChoaXN0ZmQpIHsKLQkJaW50IGxubyA9IGhpc3Rfc291cmNlLT5saW5lOwotCi0JCWhpc3Rfc291cmNlLT5saW5lKys7Ci0JCXdyaXRlaGlzdGZpbGUoMCwgTlVMTCk7Ci0JCWhpc3Rfc291cmNlLT5saW5lLS07Ci0KLQkJaWYgKGxubyAhPSBoaXN0X3NvdXJjZS0+bGluZSkKLQkJCWNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXJldHVybiAoY2hhbmdlZCk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIHNhdmUgY29tbWFuZCBpbiBoaXN0b3J5Ci0gKi8KLXZvaWQKLWhpc3RzYXZlKGludCAqbG5wLCBjb25zdCBjaGFyICpjbWQsIGJvb2wgZG93cml0ZSBNS1NIX0FfVU5VU0VELCBib29sIGlnbm9yZWR1cHMpCi17Ci0JY2hhciAqKmhwOwotCWNoYXIgKmMsICpjcDsKLQotCXN0cmR1cHgoYywgY21kLCBBUEVSTSk7Ci0JaWYgKChjcCA9IHN0cmNocihjLCAnXG4nKSkgIT0gTlVMTCkKLQkJKmNwID0gJ1wwJzsKLQotCWlmIChpZ25vcmVkdXBzICYmICFzdHJjbXAoYywgKmhpc3RwdHIpCi0jaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQkgICAgJiYgIWhpc3RzeW5jKCkKLSNlbmRpZgotCSAgICApIHsKLQkJYWZyZWUoYywgQVBFUk0pOwotCQlyZXR1cm47Ci0JfQotCSsrKmxucDsKLQotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi0JaWYgKGhpc3RmZCAmJiBkb3dyaXRlKQotCQl3cml0ZWhpc3RmaWxlKCpsbnAsIGMpOwotI2VuZGlmCi0KLQlocCA9IGhpc3RwdHI7Ci0KLQlpZiAoKytocCA+PSBoaXN0b3J5ICsgaGlzdHNpemUpIHsgLyogcmVtb3ZlIG9sZGVzdCBjb21tYW5kICovCi0JCWFmcmVlKCpoaXN0b3J5LCBBUEVSTSk7Ci0JCWZvciAoaHAgPSBoaXN0b3J5OyBocCA8IGhpc3RvcnkgKyBoaXN0c2l6ZSAtIDE7IGhwKyspCi0JCQlocFswXSA9IGhwWzFdOwotCX0KLQkqaHAgPSBjOwotCWhpc3RwdHIgPSBocDsKLX0KLQotLyoKLSAqCVdyaXRlIGhpc3RvcnkgZGF0YSB0byBhIGZpbGUgbm9taW5hdGVkIGJ5IEhJU1RGSUxFCi0gKglpZiBISVNURklMRSBpcyB1bnNldCB0aGVuIGhpc3Rvcnkgc3RpbGwgaGFwcGVucywgYnV0Ci0gKgl0aGUgZGF0YSBpcyBub3Qgd3JpdHRlbiB0byBhIGZpbGUKLSAqCUFsbCBjb3BpZXMgb2Yga3NoIGxvb2tpbmcgYXQgdGhlIGZpbGUgd2lsbCBtYWludGFpbiB0aGUKLSAqCXNhbWUgaGlzdG9yeS4gVGhpcyBpcyBrc2ggYmVoYXZpb3VyLgotICoKLSAqCVRoaXMgc3R1ZmYgdXNlcyBtbWFwKCkKLSAqCWlmIHlvdXIgc3lzdGVtIGFpbid0IGdvdCBpdCAtIHRoZW4geW91J2xsIGhhdmUgdG8gdW5kZWYgSElTVE9SWUZJTEUKLSAqLwotCi0vKgotICoJT3BlbiBhIGhpc3RvcnkgZmlsZQotICoJRm9ybWF0IGlzOgotICoJQnl0ZXMgMSwgMjoKLSAqCQlITUFHSUMgLSBqdXN0IHRvIGNoZWNrIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aAotICoJCXRoZSBjb3JyZWN0IG9iamVjdAotICoJVGhlbiBmb2xsb3dzIGEgbnVtYmVyIG9mIHN0b3JlZCBjb21tYW5kcwotICoJRWFjaCBjb21tYW5kIGlzCi0gKgk8Y29tbWFuZCBieXRlPjxjb21tYW5kIG51bWJlcig0IGJ5dGVzKT48Ynl0ZXM+PG51bGw+Ci0gKi8KLSNkZWZpbmUgSE1BR0lDMQkJMHhhYgotI2RlZmluZSBITUFHSUMyCQkweGNkCi0jZGVmaW5lIENPTU1BTkQJCTB4ZmYKLQotdm9pZAotaGlzdF9pbml0KFNvdXJjZSAqcykKLXsKLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCXVuc2lnbmVkIGNoYXIgKmJhc2U7Ci0JaW50IGxpbmVzLCBmZCwgcnYgPSAwOwotI2VuZGlmCi0KLQlpZiAoRmxhZyhGVEFMS0lORykgPT0gMCkKLQkJcmV0dXJuOwotCi0JaHN0YXJ0ZWQgPSAxOwotCi0JaGlzdF9zb3VyY2UgPSBzOwotCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQlpZiAoKGhuYW1lID0gc3RyX3ZhbChnbG9iYWwoIkhJU1RGSUxFIikpKSA9PSBOVUxMKQotCQlyZXR1cm47Ci0Jc3RyZHVweChobmFtZSwgaG5hbWUsIEFQRVJNKTsKLQotIHJldHJ5OgotCS8qIHdlIGhhdmUgYSBmaWxlIGFuZCBhcmUgaW50ZXJhY3RpdmUgKi8KLQlpZiAoKGZkID0gb3BlbihobmFtZSwgT19SRFdSfE9fQ1JFQVR8T19BUFBFTkQsIDA2MDApKSA8IDApCi0JCXJldHVybjsKLQotCWhpc3RmZCA9IHNhdmVmZChmZCk7Ci0JaWYgKGhpc3RmZCAhPSBmZCkKLQkJY2xvc2UoZmQpOwotCi0JKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX0VYKTsKLQotCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOwotCi0JaWYgKGhzaXplID09IDApIHsKLQkJLyogYWRkIG1hZ2ljICovCi0JCWlmIChzcHJpbmtsZShoaXN0ZmQpKSB7Ci0JCQloaXN0X2ZpbmlzaCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIGlmIChoc2l6ZSA+IDApIHsKLQkJLyoKLQkJICogd2UgaGF2ZSBzb21lIGRhdGEKLQkJICovCi0JCWJhc2UgPSAodm9pZCAqKW1tYXAoTlVMTCwgaHNpemUsIFBST1RfUkVBRCwKLQkJICAgIE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUsIGhpc3RmZCwgKG9mZl90KTApOwotCQkvKgotCQkgKiBjaGVjayBvbiBpdHMgdmFsaWRpdHkKLQkJICovCi0JCWlmIChiYXNlID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCB8fAotCQkgICAgKmJhc2UgIT0gSE1BR0lDMSB8fCBiYXNlWzFdICE9IEhNQUdJQzIpIHsKLQkJCWlmIChiYXNlICE9ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkKLQkJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOwotCQkJaGlzdF9maW5pc2goKTsKLQkJCWlmICh1bmxpbmsoaG5hbWUpIC8qIGZhaWxzICovKQotCQkJCWdvdG8gaGluaXRlcnI7Ci0JCQlnb3RvIHJldHJ5OwotCQl9Ci0JCWlmIChoc2l6ZSA+IDIpIHsKLQkJCWxpbmVzID0gaGlzdF9jb3VudF9saW5lcyhiYXNlKzIsIGhzaXplLTIpOwotCQkJaWYgKGxpbmVzID4gaGlzdHNpemUpIHsKLQkJCQkvKiB3ZSBuZWVkIHRvIG1ha2UgdGhlIGZpbGUgc21hbGxlciAqLwotCQkJCWlmIChoaXN0X3NocmluayhiYXNlLCBoc2l6ZSkpCi0JCQkJCXJ2ID0gdW5saW5rKGhuYW1lKTsKLQkJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOwotCQkJCWhpc3RfZmluaXNoKCk7Ci0JCQkJaWYgKHJ2KSB7Ci0gaGluaXRlcnI6Ci0JCQkJCWJpX2Vycm9yZigiY2Fubm90IHVubGluayBISVNURklMRSAlcyIKLQkJCQkJICAgICIgLSAlcyIsIGhuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQkJCQloc2l6ZSA9IDA7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZ290byByZXRyeTsKLQkJCX0KLQkJfQotCQloaXN0bG9hZChoaXN0X3NvdXJjZSwgYmFzZSsyLCBoc2l6ZS0yKTsKLQkJbXVubWFwKChjYWRkcl90KWJhc2UsIGhzaXplKTsKLQl9Ci0JKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKLQloc2l6ZSA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKLSNlbmRpZgotfQotCi0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLXR5cGVkZWYgZW51bSBzdGF0ZSB7Ci0Jc2hkciwJCS8qIGV4cGVjdGluZyBhIGhlYWRlciAqLwotCXNsaW5lLAkJLyogbG9va2luZyBmb3IgYSBudWxsIGJ5dGUgdG8gZW5kIHRoZSBsaW5lICovCi0Jc24xLAkJLyogYnl0ZXMgMSB0byA0IG9mIGEgbGluZSBubyAqLwotCXNuMiwgc24zLCBzbjQKLX0gU3RhdGU7Ci0KLXN0YXRpYyBpbnQKLWhpc3RfY291bnRfbGluZXModW5zaWduZWQgY2hhciAqYmFzZSwgaW50IGJ5dGVzKQotewotCVN0YXRlIHN0YXRlID0gc2hkcjsKLQlpbnQgbGluZXMgPSAwOwotCi0Jd2hpbGUgKGJ5dGVzLS0pIHsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIHNoZHI6Ci0JCQlpZiAoKmJhc2UgPT0gQ09NTUFORCkKLQkJCQlzdGF0ZSA9IHNuMTsKLQkJCWJyZWFrOwotCQljYXNlIHNuMToKLQkJCXN0YXRlID0gc24yOyBicmVhazsKLQkJY2FzZSBzbjI6Ci0JCQlzdGF0ZSA9IHNuMzsgYnJlYWs7Ci0JCWNhc2Ugc24zOgotCQkJc3RhdGUgPSBzbjQ7IGJyZWFrOwotCQljYXNlIHNuNDoKLQkJCXN0YXRlID0gc2xpbmU7IGJyZWFrOwotCQljYXNlIHNsaW5lOgotCQkJaWYgKCpiYXNlID09ICdcMCcpIHsKLQkJCQlsaW5lcysrOwotCQkJCXN0YXRlID0gc2hkcjsKLQkJCX0KLQkJfQotCQliYXNlKys7Ci0JfQotCXJldHVybiAobGluZXMpOwotfQotCi0vKgotICoJU2hyaW5rIHRoZSBoaXN0b3J5IGZpbGUgdG8gaGlzdHNpemUgbGluZXMKLSAqLwotc3RhdGljIGludAotaGlzdF9zaHJpbmsodW5zaWduZWQgY2hhciAqb2xkYmFzZSwgaW50IG9sZGJ5dGVzKQotewotCWludCBmZCwgcnYgPSAwOwotCWNoYXIgKm5maWxlID0gTlVMTDsKLQlzdHJ1Y3QJc3RhdCBzdGF0YjsKLQl1bnNpZ25lZCBjaGFyICpuYmFzZSA9IG9sZGJhc2U7Ci0JaW50IG5ieXRlcyA9IG9sZGJ5dGVzOwotCi0JbmJhc2UgPSBoaXN0X3NraXBfYmFjayhuYmFzZSwgJm5ieXRlcywgaGlzdHNpemUpOwotCWlmIChuYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gKDEpOwotCWlmIChuYmFzZSA9PSBvbGRiYXNlKQotCQlyZXR1cm4gKDApOwotCi0JLyoKLQkgKgljcmVhdGUgdGVtcCBmaWxlCi0JICovCi0JbmZpbGUgPSBzaGZfc21wcmludGYoIiVzLiVkIiwgaG5hbWUsIChpbnQpcHJvY3BpZCk7Ci0JaWYgKChmZCA9IG9wZW4obmZpbGUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIDA2MDApKSA8IDApCi0JCWdvdG8gZXJyb3V0OwotCWlmIChmc3RhdChoaXN0ZmQsICZzdGF0YikgPj0gMCAmJgotCSAgICBjaG93bihuZmlsZSwgc3RhdGIuc3RfdWlkLCBzdGF0Yi5zdF9naWQpKQotCQlnb3RvIGVycm91dDsKLQotCWlmIChzcHJpbmtsZShmZCkgfHwgd3JpdGUoZmQsIG5iYXNlLCBuYnl0ZXMpICE9IG5ieXRlcykKLQkJZ290byBlcnJvdXQ7Ci0JY2xvc2UoZmQpOwotCWZkID0gLTE7Ci0KLQkvKgotCSAqCXJlbmFtZQotCSAqLwotCWlmIChyZW5hbWUobmZpbGUsIGhuYW1lKSA8IDApIHsKLSBlcnJvdXQ6Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQljbG9zZShmZCk7Ci0JCQlpZiAobmZpbGUpCi0JCQkJdW5saW5rKG5maWxlKTsKLQkJfQotCQlydiA9IDE7Ci0JfQotCWFmcmVlKG5maWxlLCBBVEVNUCk7Ci0JcmV0dXJuIChydik7Ci19Ci0KLS8qCi0gKglmaW5kIGEgcG9pbnRlciB0byB0aGUgZGF0YSAnbm8nIGJhY2sgZnJvbSB0aGUgZW5kIG9mIHRoZSBmaWxlCi0gKglyZXR1cm4gdGhlIHBvaW50ZXIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdAotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1oaXN0X3NraXBfYmFjayh1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgKmJ5dGVzLCBpbnQgbm8pCi17Ci0JaW50IGxpbmVzID0gMDsKLQl1bnNpZ25lZCBjaGFyICplcDsKLQotCWZvciAoZXAgPSBiYXNlICsgKmJ5dGVzOyAtLWVwID4gYmFzZTsgKSB7Ci0JCS8qCi0JCSAqIHRoaXMgZG9lc24ndCByZWFsbHkgd29yazogdGhlIDQgYnl0ZSBsaW5lIG51bWJlciB0aGF0Ci0JCSAqIGlzIGVuY29kZWQgYWZ0ZXIgdGhlIENPTU1BTkQgYnl0ZSBjYW4gaXRzZWxmIGNvbnRhaW4KLQkJICogdGhlIENPTU1BTkQgYnl0ZS4uLi4KLQkJICovCi0JCWZvciAoOyBlcCA+IGJhc2UgJiYgKmVwICE9IENPTU1BTkQ7IGVwLS0pCi0JCQk7Ci0JCWlmIChlcCA9PSBiYXNlKQotCQkJYnJlYWs7Ci0JCWlmICgrK2xpbmVzID09IG5vKSB7Ci0JCQkqYnl0ZXMgPSAqYnl0ZXMgLSAoKGNoYXIgKillcCAtIChjaGFyICopYmFzZSk7Ci0JCQlyZXR1cm4gKGVwKTsKLQkJfQotCX0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi0vKgotICoJbG9hZCB0aGUgaGlzdG9yeSBzdHJ1Y3R1cmUgZnJvbSB0aGUgc3RvcmVkIGRhdGEKLSAqLwotc3RhdGljIHZvaWQKLWhpc3Rsb2FkKFNvdXJjZSAqcywgdW5zaWduZWQgY2hhciAqYmFzZSwgaW50IGJ5dGVzKQotewotCVN0YXRlIHN0YXRlOwotCWludCBsbm8gPSAwOwotCXVuc2lnbmVkIGNoYXIgKmxpbmUgPSBOVUxMOwotCi0JZm9yIChzdGF0ZSA9IHNoZHI7IGJ5dGVzLS0gPiAwOyBiYXNlKyspIHsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIHNoZHI6Ci0JCQlpZiAoKmJhc2UgPT0gQ09NTUFORCkKLQkJCQlzdGF0ZSA9IHNuMTsKLQkJCWJyZWFrOwotCQljYXNlIHNuMToKLQkJCWxubyA9ICgoKCpiYXNlKSYweGZmKTw8MjQpOwotCQkJc3RhdGUgPSBzbjI7Ci0JCQlicmVhazsKLQkJY2FzZSBzbjI6Ci0JCQlsbm8gfD0gKCgoKmJhc2UpJjB4ZmYpPDwxNik7Ci0JCQlzdGF0ZSA9IHNuMzsKLQkJCWJyZWFrOwotCQljYXNlIHNuMzoKLQkJCWxubyB8PSAoKCgqYmFzZSkmMHhmZik8PDgpOwotCQkJc3RhdGUgPSBzbjQ7Ci0JCQlicmVhazsKLQkJY2FzZSBzbjQ6Ci0JCQlsbm8gfD0gKCpiYXNlKSYweGZmOwotCQkJbGluZSA9IGJhc2UrMTsKLQkJCXN0YXRlID0gc2xpbmU7Ci0JCQlicmVhazsKLQkJY2FzZSBzbGluZToKLQkJCWlmICgqYmFzZSA9PSAnXDAnKSB7Ci0JCQkJLyogd29ycnkgYWJvdXQgbGluZSBudW1iZXJzICovCi0JCQkJaWYgKGhpc3RwdHIgPj0gaGlzdG9yeSAmJiBsbm8tMSAhPSBzLT5saW5lKSB7Ci0JCQkJCS8qIGEgcmVwbGFjZW1lbnQgPyAqLwotCQkJCQloaXN0aW5zZXJ0KHMsIGxubywgKGNoYXIgKilsaW5lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzLT5saW5lID0gbG5vLS07Ci0JCQkJCWhpc3RzYXZlKCZsbm8sIChjaGFyICopbGluZSwgZmFsc2UsCi0JCQkJCSAgICBmYWxzZSk7Ci0JCQkJfQotCQkJCXN0YXRlID0gc2hkcjsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAqCUluc2VydCBhIGxpbmUgaW50byB0aGUgaGlzdG9yeSBhdCBhIHNwZWNpZmllZCBudW1iZXIKLSAqLwotc3RhdGljIHZvaWQKLWhpc3RpbnNlcnQoU291cmNlICpzLCBpbnQgbG5vLCBjb25zdCBjaGFyICpsaW5lKQotewotCWNoYXIgKipocDsKLQotCWlmIChsbm8gPj0gcy0+bGluZSAtIChoaXN0cHRyIC0gaGlzdG9yeSkgJiYgbG5vIDw9IHMtPmxpbmUpIHsKLQkJaHAgPSAmaGlzdHB0cltsbm8gLSBzLT5saW5lXTsKLQkJaWYgKCpocCkKLQkJCWFmcmVlKCpocCwgQVBFUk0pOwotCQlzdHJkdXB4KCpocCwgbGluZSwgQVBFUk0pOwotCX0KLX0KLQotLyoKLSAqCXdyaXRlIGEgY29tbWFuZCB0byB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5IGZpbGUKLSAqCVRoaXMgKk1BWSogc2VlbSBlYXN5IGJ1dCBpdCdzIGFsc28gbmVjZXNzYXJ5IHRvIGNoZWNrCi0gKgl0aGF0IHRoZSBoaXN0b3J5IGZpbGUgaGFzIG5vdCBjaGFuZ2VkIGluIHNpemUuCi0gKglJZiBpdCBoYXMgLSB0aGVuIHNvbWUgb3RoZXIgc2hlbGwgaGFzIHdyaXR0ZW4gdG8gaXQKLSAqCWFuZCB3ZSBzaG91bGQgcmVhZCB0aG9zZSBjb21tYW5kcyB0byB1cGRhdGUgb3VyIGhpc3RvcnkKLSAqLwotc3RhdGljIHZvaWQKLXdyaXRlaGlzdGZpbGUoaW50IGxubywgY2hhciAqY21kKQotewotCWludAlzaXplbm93OwotCXVuc2lnbmVkIGNoYXIJKmJhc2U7Ci0JdW5zaWduZWQgY2hhcgkqbmV3czsKLQlpbnQJYnl0ZXM7Ci0JdW5zaWduZWQgY2hhcgloZHJbNV07Ci0KLQkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfRVgpOwotCXNpemVub3cgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7Ci0JaWYgKHNpemVub3cgIT0gaHNpemUpIHsKLQkJLyoKLQkJICoJVGhpbmdzIGhhdmUgY2hhbmdlZAotCQkgKi8KLQkJaWYgKHNpemVub3cgPiBoc2l6ZSkgewotCQkJLyogc29tZW9uZSBoYXMgYWRkZWQgc29tZSBsaW5lcyAqLwotCQkJYnl0ZXMgPSBzaXplbm93IC0gaHNpemU7Ci0JCQliYXNlID0gKHZvaWQgKiltbWFwKE5VTEwsIHNpemVub3csIFBST1RfUkVBRCwKLQkJCSAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLCBoaXN0ZmQsIChvZmZfdCkwKTsKLQkJCWlmIChiYXNlID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkKLQkJCQlnb3RvIGJhZDsKLQkJCW5ld3MgPSBiYXNlICsgaHNpemU7Ci0JCQlpZiAoKm5ld3MgIT0gQ09NTUFORCkgewotCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBzaXplbm93KTsKLQkJCQlnb3RvIGJhZDsKLQkJCX0KLQkJCWhpc3Rfc291cmNlLT5saW5lLS07Ci0JCQloaXN0bG9hZChoaXN0X3NvdXJjZSwgbmV3cywgYnl0ZXMpOwotCQkJaGlzdF9zb3VyY2UtPmxpbmUrKzsKLQkJCWxubyA9IGhpc3Rfc291cmNlLT5saW5lOwotCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIHNpemVub3cpOwotCQkJaHNpemUgPSBzaXplbm93OwotCQl9IGVsc2UgewotCQkJLyogaXQgaGFzIHNocnVuayAqLwotCQkJLyogYnV0IHRvIHdoYXQ/ICovCi0JCQkvKiB3ZSdsbCBnaXZlIHVwIGZvciBub3cgKi8KLQkJCWdvdG8gYmFkOwotCQl9Ci0JfQotCWlmIChjbWQpIHsKLQkJLyoKLQkJICoJd2UgY2FuIHdyaXRlIG91ciBiaXQgbm93Ci0JCSAqLwotCQloZHJbMF0gPSBDT01NQU5EOwotCQloZHJbMV0gPSAobG5vPj4yNCkmMHhmZjsKLQkJaGRyWzJdID0gKGxubz4+MTYpJjB4ZmY7Ci0JCWhkclszXSA9IChsbm8+PjgpJjB4ZmY7Ci0JCWhkcls0XSA9IGxubyYweGZmOwotCQlieXRlcyA9IHN0cmxlbihjbWQpICsgMTsKLQkJaWYgKCh3cml0ZShoaXN0ZmQsIGhkciwgNSkgIT0gNSkgfHwKLQkJICAgICh3cml0ZShoaXN0ZmQsIGNtZCwgYnl0ZXMpICE9IGJ5dGVzKSkKLQkJCWdvdG8gYmFkOwotCQloc2l6ZSA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKLQl9Ci0JKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKLQlyZXR1cm47Ci0gYmFkOgotCWhpc3RfZmluaXNoKCk7Ci19Ci0KLXZvaWQKLWhpc3RfZmluaXNoKHZvaWQpCi17Ci0JKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKLQkodm9pZCljbG9zZShoaXN0ZmQpOwotCWhpc3RmZCA9IDA7Ci19Ci0KLS8qCi0gKglhZGQgbWFnaWMgdG8gdGhlIGhpc3RvcnkgZmlsZQotICovCi1zdGF0aWMgaW50Ci1zcHJpbmtsZShpbnQgZmQpCi17Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFnW10gPSB7IEhNQUdJQzEsIEhNQUdJQzIgfTsKLQotCXJldHVybiAod3JpdGUoZmQsIG1hZywgMikgIT0gMik7Ci19Ci0jZW5kaWYKLQotI2lmICFIQVZFX1NZU19TSUdOQU1FCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1rc2hfc2lncGFpciB7Ci0JY29uc3QgY2hhciAqY29uc3QgbmFtZTsKLQlpbnQgbnI7Ci19IG1rc2hfc2lncGFpcnNbXSA9IHsKLSNpbmNsdWRlICJzaWduYW1lcy5pbmMiCi0JeyBOVUxMLCAwIH0KLX07Ci0jZW5kaWYKLQotdm9pZAotaW5pdHRyYXBzKHZvaWQpCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqY3M7Ci0KLQkvKiBQb3B1bGF0ZSBzaWd0cmFwcyBiYXNlZCBvbiBzeXNfc2lnbmFtZSBhbmQgc3lzX3NpZ2xpc3QuICovCi0JZm9yIChpID0gMDsgaSA8PSBOU0lHOyBpKyspIHsKLQkJc2lndHJhcHNbaV0uc2lnbmFsID0gaTsKLQkJaWYgKGkgPT0gU0lHRVJSXykgewotCQkJc2lndHJhcHNbaV0ubmFtZSA9ICJFUlIiOwotCQkJc2lndHJhcHNbaV0ubWVzcyA9ICJFcnJvciBoYW5kbGVyIjsKLQkJfSBlbHNlIHsKLSNpZiBIQVZFX1NZU19TSUdOQU1FCi0JCQljcyA9IHN5c19zaWduYW1lW2ldOwotI2Vsc2UKLQkJCWNvbnN0IHN0cnVjdCBta3NoX3NpZ3BhaXIgKnBhaXIgPSBta3NoX3NpZ3BhaXJzOwotCQkJd2hpbGUgKChwYWlyLT5uciAhPSBpKSAmJiAocGFpci0+bmFtZSAhPSBOVUxMKSkKLQkJCQkrK3BhaXI7Ci0JCQljcyA9IHBhaXItPm5hbWU7Ci0jZW5kaWYKLQkJCWlmICgoY3MgPT0gTlVMTCkgfHwKLQkJCSAgICAoY3NbMF0gPT0gJ1wwJykpCi0JCQkJc2lndHJhcHNbaV0ubmFtZSA9IHNoZl9zbXByaW50ZigiJWQiLCBpKTsKLQkJCWVsc2UgewotCQkJCWNoYXIgKnM7Ci0KLQkJCQlpZiAoIXN0cm5jYXNlY21wKGNzLCAiU0lHIiwgMykpCi0JCQkJCWNzICs9IDM7Ci0JCQkJc3RyZHVweChzLCBjcywgQVBFUk0pOwotCQkJCXNpZ3RyYXBzW2ldLm5hbWUgPSBzOwotCQkJCXdoaWxlICgoKnMgPSBrc2hfdG91cHBlcigqcykpKQotCQkJCQkrK3M7Ci0JCQl9Ci0jaWYgSEFWRV9TWVNfU0lHTElTVAotCQkJc2lndHJhcHNbaV0ubWVzcyA9IHN5c19zaWdsaXN0W2ldOwotI2VsaWYgSEFWRV9TVFJTSUdOQUwKLQkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBzdHJzaWduYWwoaSk7Ci0jZWxzZQotCQkJc2lndHJhcHNbaV0ubWVzcyA9IE5VTEw7Ci0jZW5kaWYKLQkJCWlmICgoc2lndHJhcHNbaV0ubWVzcyA9PSBOVUxMKSB8fAotCQkJICAgIChzaWd0cmFwc1tpXS5tZXNzWzBdID09ICdcMCcpKQotCQkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBzaGZfc21wcmludGYoIlNpZ25hbCAlZCIsIGkpOwotCQl9Ci0JfQotCXNpZ3RyYXBzW1NJR0VYSVRfXS5uYW1lID0gIkVYSVQiOwkvKiBvdXIgbmFtZSBmb3Igc2lnbmFsIDAgKi8KLQotCSh2b2lkKXNpZ2VtcHR5c2V0KCZTaWdhY3RfaWduLnNhX21hc2spOwotCVNpZ2FjdF9pZ24uc2FfZmxhZ3MgPSAwOyAvKiBpbnRlcnJ1cHRpYmxlICovCi0JU2lnYWN0X2lnbi5zYV9oYW5kbGVyID0gU0lHX0lHTjsKLQotCXNpZ3RyYXBzW1NJR0lOVF0uZmxhZ3MgfD0gVEZfREZMX0lOVFIgfCBURl9UVFlfSU5UUjsKLQlzaWd0cmFwc1tTSUdRVUlUXS5mbGFncyB8PSBURl9ERkxfSU5UUiB8IFRGX1RUWV9JTlRSOwotCXNpZ3RyYXBzW1NJR1RFUk1dLmZsYWdzIHw9IFRGX0RGTF9JTlRSOy8qIG5vdCBmYXRhbCBmb3IgaW50ZXJhY3RpdmUgKi8KLQlzaWd0cmFwc1tTSUdIVVBdLmZsYWdzIHw9IFRGX0ZBVEFMOwotCXNpZ3RyYXBzW1NJR0NITERdLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7Ci0KLQkvKiB0aGVzZSBhcmUgYWx3YXlzIGNhdWdodCBzbyB3ZSBjYW4gY2xlYW4gdXAgYW55IHRlbXBvcmFyeSBmaWxlcy4gKi8KLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR0lOVF0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7Ci0Jc2V0c2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1RFUk1dLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOwotCXNldHNpZygmc2lndHJhcHNbU0lHSFVQXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKLX0KLQotc3RhdGljIHZvaWQgYWxhcm1fY2F0Y2hlcihpbnQgc2lnKTsKLQotdm9pZAotYWxhcm1faW5pdCh2b2lkKQotewotCXNpZ3RyYXBzW1NJR0FMUk1dLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7Ci0Jc2V0c2lnKCZzaWd0cmFwc1tTSUdBTFJNXSwgYWxhcm1fY2F0Y2hlciwKLQkJU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotYWxhcm1fY2F0Y2hlcihpbnQgc2lnIE1LU0hfQV9VTlVTRUQpCi17Ci0JLyogdGhpcyBydW5zIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCwgd2l0aCBlcnJubyBzYXZlZCAqLwotCi0JaWYgKGtzaF90bW91dF9zdGF0ZSA9PSBUTU9VVF9SRUFESU5HKSB7Ci0JCWludCBsZWZ0ID0gYWxhcm0oMCk7Ci0KLQkJaWYgKGxlZnQgPT0gMCkgewotCQkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfTEVBVklORzsKLQkJCWludHJzaWcgPSAxOwotCQl9IGVsc2UKLQkJCWFsYXJtKGxlZnQpOwotCX0KLX0KLQotVHJhcCAqCi1nZXR0cmFwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZ25jYXNlKQotewotCWludCBuID0gTlNJRyArIDE7Ci0JVHJhcCAqcDsKLQljb25zdCBjaGFyICpuMjsKLQlpbnQgKCpjbXBmdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgPSBzdHJjbXA7Ci0KLQlpZiAoa3NoX2lzZGlnaXQoKm5hbWUpKSB7Ci0JCWlmIChnZXRuKG5hbWUsICZuKSAmJiAwIDw9IG4gJiYgbiA8IE5TSUcpCi0JCQlyZXR1cm4gKCZzaWd0cmFwc1tuXSk7Ci0JCWVsc2UKLQkJCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JbjIgPSBzdHJuY2FzZWNtcChuYW1lLCAiU0lHIiwgMykgPyBOVUxMIDogbmFtZSArIDM7Ci0JaWYgKGlnbmNhc2UpCi0JCWNtcGZ1bmMgPSBzdHJjYXNlY21wOwotCWZvciAocCA9IHNpZ3RyYXBzOyAtLW4gPj0gMDsgcCsrKQotCQlpZiAoIWNtcGZ1bmMocC0+bmFtZSwgbmFtZSkgfHwgKG4yICYmICFjbXBmdW5jKHAtPm5hbWUsIG4yKSkpCi0JCQlyZXR1cm4gKHApOwotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qCi0gKiB0cmFwIHNpZ25hbCBoYW5kbGVyCi0gKi8KLXZvaWQKLXRyYXBzaWcoaW50IGkpCi17Ci0JVHJhcCAqcCA9ICZzaWd0cmFwc1tpXTsKLQlpbnQgZXJybm9fID0gZXJybm87Ci0KLQl0cmFwID0gcC0+c2V0ID0gMTsKLQlpZiAocC0+ZmxhZ3MgJiBURl9ERkxfSU5UUikKLQkJaW50cnNpZyA9IDE7Ci0JaWYgKChwLT5mbGFncyAmIFRGX0ZBVEFMKSAmJiAhcC0+dHJhcCkgewotCQlmYXRhbF90cmFwID0gMTsKLQkJaW50cnNpZyA9IDE7Ci0JfQotCWlmIChwLT5zaHRyYXApCi0JCSgqcC0+c2h0cmFwKShpKTsKLQllcnJubyA9IGVycm5vXzsKLX0KLQotLyoKLSAqIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gXkMgb3V0IG9mIHNvbWV0aGluZyAtIHdvbid0Ci0gKiB3b3JrIGlmIHVzZXIgaGFzIHRyYXBwZWQgU0lHSU5ULgotICovCi12b2lkCi1pbnRyY2hlY2sodm9pZCkKLXsKLQlpZiAoaW50cnNpZykKLQkJcnVudHJhcHMoVEZfREZMX0lOVFJ8VEZfRkFUQUwpOwotfQotCi0vKgotICogY2FsbGVkIGFmdGVyIEVJTlRSIHRvIGNoZWNrIGlmIGEgc2lnbmFsIHdpdGggbm9ybWFsbHkgY2F1c2VzIHByb2Nlc3MKLSAqIHRlcm1pbmF0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgotICovCi1pbnQKLWZhdGFsX3RyYXBfY2hlY2sodm9pZCkKLXsKLQlpbnQgaTsKLQlUcmFwICpwOwotCi0JLyogdG9kbzogc2hvdWxkIGNoZWNrIGlmIHNpZ25hbCBpcyBmYXRhbCwgbm90IHRoZSBURl9ERkxfSU5UUiBmbGFnICovCi0JZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCi0JCWlmIChwLT5zZXQgJiYgKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkpCi0JCQkvKiByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyBhbiBleGl0IGNvZGUgKi8KLQkJCXJldHVybiAoMTI4ICsgcC0+c2lnbmFsKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciBvZiBhbnkgcGVuZGluZyB0cmFwczogaWUsIGEgc2lnbmFsIHdoaWNoIGhhcwotICogb2NjdXJyZWQgZm9yIHdoaWNoIGEgdHJhcCBoYXMgYmVlbiBzZXQgb3IgZm9yIHdoaWNoIHRoZSBURl9ERkxfSU5UUiBmbGFnCi0gKiBpcyBzZXQuCi0gKi8KLWludAotdHJhcF9wZW5kaW5nKHZvaWQpCi17Ci0JaW50IGk7Ci0JVHJhcCAqcDsKLQotCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQotCQlpZiAocC0+c2V0ICYmICgocC0+dHJhcCAmJiBwLT50cmFwWzBdKSB8fAotCQkgICAgKChwLT5mbGFncyAmIChURl9ERkxfSU5UUnxURl9GQVRBTCkpICYmICFwLT50cmFwKSkpCi0JCQlyZXR1cm4gKHAtPnNpZ25hbCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIHJ1biBhbnkgcGVuZGluZyB0cmFwcy4gSWYgaW50ciBpcyBzZXQsIG9ubHkgcnVuIHRyYXBzIHRoYXQKLSAqIGNhbiBpbnRlcnJ1cHQgY29tbWFuZHMuCi0gKi8KLXZvaWQKLXJ1bnRyYXBzKGludCBmbGFnKQotewotCWludCBpOwotCVRyYXAgKnA7Ci0KLQlpZiAoa3NoX3Rtb3V0X3N0YXRlID09IFRNT1VUX0xFQVZJTkcpIHsKLQkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOwotCQl3YXJuaW5nZihmYWxzZSwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBpbnB1dCIpOwotCQl1bndpbmQoTEVYSVQpOwotCX0gZWxzZQotCQkvKgotCQkgKiBYWFg6IHRoaXMgbWVhbnMgdGhlIGFsYXJtIHdpbGwgaGF2ZSBubyBlZmZlY3QgaWYgYSB0cmFwCi0JCSAqIGlzIGNhdWdodCBhZnRlciB0aGUgYWxhcm0oKSB3YXMgc3RhcnRlZC4uLm5vdCBnb29kLgotCQkgKi8KLQkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOwotCWlmICghZmxhZykKLQkJdHJhcCA9IDA7Ci0JaWYgKGZsYWcgJiBURl9ERkxfSU5UUikKLQkJaW50cnNpZyA9IDA7Ci0JaWYgKGZsYWcgJiBURl9GQVRBTCkKLQkJZmF0YWxfdHJhcCA9IDA7Ci0JZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCi0JCWlmIChwLT5zZXQgJiYgKCFmbGFnIHx8Ci0JCSAgICAoKHAtPmZsYWdzICYgZmxhZykgJiYgcC0+dHJhcCA9PSBOVUxMKSkpCi0JCQlydW50cmFwKHApOwotfQotCi12b2lkCi1ydW50cmFwKFRyYXAgKnApCi17Ci0JaW50CWkgPSBwLT5zaWduYWw7Ci0JY2hhcgkqdHJhcHN0ciA9IHAtPnRyYXA7Ci0JaW50CW9leHN0YXQ7Ci0JaW50CW9sZF9jaGFuZ2VkID0gMDsKLQotCXAtPnNldCA9IDA7Ci0JaWYgKHRyYXBzdHIgPT0gTlVMTCkgeyAvKiBTSUdfREZMICovCi0JCWlmIChwLT5mbGFncyAmIFRGX0ZBVEFMKSB7Ci0JCQkvKiBlZywgU0lHSFVQICovCi0JCQlleHN0YXQgPSAxMjggKyBpOwotCQkJdW53aW5kKExMRUFWRSk7Ci0JCX0KLQkJaWYgKHAtPmZsYWdzICYgVEZfREZMX0lOVFIpIHsKLQkJCS8qIGVnLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1RFUk0sIGV0Yy4gKi8KLQkJCWV4c3RhdCA9IDEyOCArIGk7Ci0JCQl1bndpbmQoTElOVFIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHRyYXBzdHJbMF0gPT0gJ1wwJykgLyogU0lHX0lHTiAqLwotCQlyZXR1cm47Ci0JaWYgKGkgPT0gU0lHRVhJVF8gfHwgaSA9PSBTSUdFUlJfKSB7CS8qIGF2b2lkIHJlY3Vyc2lvbiBvbiB0aGVzZSAqLwotCQlvbGRfY2hhbmdlZCA9IHAtPmZsYWdzICYgVEZfQ0hBTkdFRDsKLQkJcC0+ZmxhZ3MgJj0gflRGX0NIQU5HRUQ7Ci0JCXAtPnRyYXAgPSBOVUxMOwotCX0KLQlvZXhzdGF0ID0gZXhzdGF0OwotCS8qCi0JICogTm90ZTogdHJhcHN0ciBpcyBmdWxseSBwYXJzZWQgYmVmb3JlIGFueXRoaW5nIGlzIGV4ZWN1dGVkLCB0aHVzCi0JICogbm8gcHJvYmxlbSB3aXRoIGFmcmVlKHAtPnRyYXApIGluIHNldHRyYXAoKSB3aGlsZSBzdGlsbCBpbiB1c2UuCi0JICovCi0JY29tbWFuZCh0cmFwc3RyLCBjdXJyZW50X2xpbmVubyk7Ci0JZXhzdGF0ID0gb2V4c3RhdDsKLQlpZiAoaSA9PSBTSUdFWElUXyB8fCBpID09IFNJR0VSUl8pIHsKLQkJaWYgKHAtPmZsYWdzICYgVEZfQ0hBTkdFRCkKLQkJCS8qIGRvbid0IGNsZWFyIFRGX0NIQU5HRUQgKi8KLQkJCWFmcmVlKHRyYXBzdHIsIEFQRVJNKTsKLQkJZWxzZQotCQkJcC0+dHJhcCA9IHRyYXBzdHI7Ci0JCXAtPmZsYWdzIHw9IG9sZF9jaGFuZ2VkOwotCX0KLX0KLQotLyogY2xlYXIgcGVuZGluZyB0cmFwcyBhbmQgcmVzZXQgdXNlcidzIHRyYXAgaGFuZGxlcnM7IHVzZWQgYWZ0ZXIgZm9yaygyKSAqLwotdm9pZAotY2xlYXJ0cmFwcyh2b2lkKQotewotCWludCBpOwotCVRyYXAgKnA7Ci0KLQl0cmFwID0gMDsKLQlpbnRyc2lnID0gMDsKLQlmYXRhbF90cmFwID0gMDsKLQlmb3IgKGkgPSBOU0lHKzEsIHAgPSBzaWd0cmFwczsgLS1pID49IDA7IHArKykgewotCQlwLT5zZXQgPSAwOwotCQlpZiAoKHAtPmZsYWdzICYgVEZfVVNFUl9TRVQpICYmIChwLT50cmFwICYmIHAtPnRyYXBbMF0pKQotCQkJc2V0dHJhcChwLCBOVUxMKTsKLQl9Ci19Ci0KLS8qIHJlc3RvcmUgc2lnbmFscyBqdXN0IGJlZm9yZSBhbiBleGVjKDIpICovCi12b2lkCi1yZXN0b3Jlc2lncyh2b2lkKQotewotCWludCBpOwotCVRyYXAgKnA7Ci0KLQlmb3IgKGkgPSBOU0lHKzEsIHAgPSBzaWd0cmFwczsgLS1pID49IDA7IHArKykKLQkJaWYgKHAtPmZsYWdzICYgKFRGX0VYRUNfSUdOfFRGX0VYRUNfREZMKSkKLQkJCXNldHNpZyhwLCAocC0+ZmxhZ3MgJiBURl9FWEVDX0lHTikgPyBTSUdfSUdOIDogU0lHX0RGTCwKLQkJCSAgICBTU19SRVNUT1JFX0NVUlJ8U1NfRk9SQ0UpOwotfQotCi12b2lkCi1zZXR0cmFwKFRyYXAgKnAsIGNvbnN0IGNoYXIgKnMpCi17Ci0Jc2lnX3QgZjsKLQotCWlmIChwLT50cmFwKQotCQlhZnJlZShwLT50cmFwLCBBUEVSTSk7Ci0Jc3RyZHVweChwLT50cmFwLCBzLCBBUEVSTSk7IC8qIGhhbmRsZXMgcyA9PSAwICovCi0JcC0+ZmxhZ3MgfD0gVEZfQ0hBTkdFRDsKLQlmID0gIXMgPyBTSUdfREZMIDogc1swXSA/IHRyYXBzaWcgOiBTSUdfSUdOOwotCi0JcC0+ZmxhZ3MgfD0gVEZfVVNFUl9TRVQ7Ci0JaWYgKChwLT5mbGFncyAmIChURl9ERkxfSU5UUnxURl9GQVRBTCkpICYmIGYgPT0gU0lHX0RGTCkKLQkJZiA9IHRyYXBzaWc7Ci0JZWxzZSBpZiAocC0+ZmxhZ3MgJiBURl9TSEVMTF9VU0VTKSB7Ci0JCWlmICghKHAtPmZsYWdzICYgVEZfT1JJR19JR04pIHx8IEZsYWcoRlRBTEtJTkcpKSB7Ci0JCQkvKiBkbyB3aGF0IHVzZXIgd2FudHMgYXQgZXhlYyB0aW1lICovCi0JCQlwLT5mbGFncyAmPSB+KFRGX0VYRUNfSUdOfFRGX0VYRUNfREZMKTsKLQkJCWlmIChmID09IFNJR19JR04pCi0JCQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19JR047Ci0JCQllbHNlCi0JCQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19ERkw7Ci0JCX0KLQotCQkvKgotCQkgKiBhc3N1bWVzIGhhbmRsZXIgYWxyZWFkeSBzZXQgdG8gd2hhdCBzaGVsbCB3YW50cyBpdAotCQkgKiAobm9ybWFsbHkgdHJhcHNpZywgYnV0IGNvdWxkIGJlIGpfc2lnY2hsZCgpIG9yIFNJR19JR04pCi0JCSAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogdG9kbzogc2hvdWxkIHdlIGxldCB1c2VyIGtub3cgc2lnbmFsIGlzIGlnbm9yZWQ/IGhvdz8gKi8KLQlzZXRzaWcocCwgZiwgU1NfUkVTVE9SRV9DVVJSfFNTX1VTRVIpOwotfQotCi0vKgotICogQ2FsbGVkIGJ5IGNfcHJpbnQoKSB3aGVuIHdyaXRpbmcgdG8gYSBjby1wcm9jZXNzIHRvIGVuc3VyZSBTSUdQSVBFIHdvbid0Ci0gKiBraWxsIHNoZWxsICh1bmxlc3MgdXNlciBjYXRjaGVzIGl0IGFuZCBleGl0cykKLSAqLwotaW50Ci1ibG9ja19waXBlKHZvaWQpCi17Ci0JaW50IHJlc3RvcmVfZGZsID0gMDsKLQlUcmFwICpwID0gJnNpZ3RyYXBzW1NJR1BJUEVdOwotCi0JaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkgewotCQlzZXRzaWcocCwgU0lHX0lHTiwgU1NfUkVTVE9SRV9DVVJSKTsKLQkJaWYgKHAtPmZsYWdzICYgVEZfT1JJR19ERkwpCi0JCQlyZXN0b3JlX2RmbCA9IDE7Ci0JfSBlbHNlIGlmIChwLT5jdXJzaWcgPT0gU0lHX0RGTCkgewotCQlzZXRzaWcocCwgU0lHX0lHTiwgU1NfUkVTVE9SRV9DVVJSKTsKLQkJcmVzdG9yZV9kZmwgPSAxOyAvKiByZXN0b3JlIHRvIFNJR19ERkwgKi8KLQl9Ci0JcmV0dXJuIChyZXN0b3JlX2RmbCk7Ci19Ci0KLS8qIENhbGxlZCBieSBjX3ByaW50KCkgdG8gdW5kbyB3aGF0ZXZlciBibG9ja19waXBlKCkgZGlkICovCi12b2lkCi1yZXN0b3JlX3BpcGUoaW50IHJlc3RvcmVfZGZsKQotewotCWlmIChyZXN0b3JlX2RmbCkKLQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdQSVBFXSwgU0lHX0RGTCwgU1NfUkVTVE9SRV9DVVJSKTsKLX0KLQotLyoKLSAqIFNldCBhY3Rpb24gZm9yIGEgc2lnbmFsLiBBY3Rpb24gbWF5IG5vdCBiZSBzZXQgaWYgb3JpZ2luYWwKLSAqIGFjdGlvbiB3YXMgU0lHX0lHTiwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBmbGFncyBhbmQgRlRBTEtJTkcuCi0gKi8KLWludAotc2V0c2lnKFRyYXAgKnAsIHNpZ190IGYsIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2FjdDsKLQotCWlmIChwLT5zaWduYWwgPT0gU0lHRVhJVF8gfHwgcC0+c2lnbmFsID09IFNJR0VSUl8pCi0JCXJldHVybiAoMSk7Ci0KLQkvKgotCSAqIEZpcnN0IHRpbWUgc2V0dGluZyB0aGlzIHNpZ25hbD8gSWYgc28sIGdldCBhbmQgbm90ZSB0aGUgY3VycmVudAotCSAqIHNldHRpbmcuCi0JICovCi0JaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkgewotCQlzaWdhY3Rpb24ocC0+c2lnbmFsLCAmU2lnYWN0X2lnbiwgJnNpZ2FjdCk7Ci0JCXAtPmZsYWdzIHw9IHNpZ2FjdC5zYV9oYW5kbGVyID09IFNJR19JR04gPwotCQkgICAgVEZfT1JJR19JR04gOiBURl9PUklHX0RGTDsKLQkJcC0+Y3Vyc2lnID0gU0lHX0lHTjsKLQl9Ci0KLQkvKi0KLQkgKiBHZW5lcmFsbHksIGFuIGlnbm9yZWQgc2lnbmFsIHN0YXlzIGlnbm9yZWQsIGV4Y2VwdCBpZgotCSAqCS0gdGhlIHVzZXIgb2YgYW4gaW50ZXJhY3RpdmUgc2hlbGwgd2FudHMgdG8gY2hhbmdlIGl0Ci0JICoJLSB0aGUgc2hlbGwgd2FudHMgZm9yIGZvcmNlIGEgY2hhbmdlCi0JICovCi0JaWYgKChwLT5mbGFncyAmIFRGX09SSUdfSUdOKSAmJiAhKGZsYWdzICYgU1NfRk9SQ0UpICYmCi0JICAgICghKGZsYWdzICYgU1NfVVNFUikgfHwgIUZsYWcoRlRBTEtJTkcpKSkKLQkJcmV0dXJuICgwKTsKLQotCXNldGV4ZWNzaWcocCwgZmxhZ3MgJiBTU19SRVNUT1JFX01BU0spOwotCi0JLyoKLQkgKiBUaGlzIGlzIGhlcmUgJ2NhdXNlIHRoZXJlIHNob3VsZCBiZSBhIHdheSBvZiBjbGVhcmluZwotCSAqIHNodHJhcHMsIGJ1dCBkb24ndCBrbm93IGlmIHRoaXMgaXMgYSBzYW5lIHdheSBvZiBkb2luZwotCSAqIGl0LiBBdCB0aGUgbW9tZW50LCBhbGwgdXNlcnMgb2Ygc2h0cmFwIGFyZSBsaWZldGltZQotCSAqIHVzZXJzIChTSUdBTFJNLCBTSUdDSExELCBTSUdXSU5DSCkuCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBTU19VU0VSKSkKLQkJcC0+c2h0cmFwID0gKHNpZ190KU5VTEw7Ci0JaWYgKGZsYWdzICYgU1NfU0hUUkFQKSB7Ci0JCXAtPnNodHJhcCA9IGY7Ci0JCWYgPSB0cmFwc2lnOwotCX0KLQotCWlmIChwLT5jdXJzaWcgIT0gZikgewotCQlwLT5jdXJzaWcgPSBmOwotCQkodm9pZClzaWdlbXB0eXNldCgmc2lnYWN0LnNhX21hc2spOwotCQlzaWdhY3Quc2FfZmxhZ3MgPSAwIC8qIGludGVycnVwdGlibGUgKi87Ci0JCXNpZ2FjdC5zYV9oYW5kbGVyID0gZjsKLQkJc2lnYWN0aW9uKHAtPnNpZ25hbCwgJnNpZ2FjdCwgTlVMTCk7Ci0JfQotCi0JcmV0dXJuICgxKTsKLX0KLQotLyogY29udHJvbCB3aGF0IHNpZ25hbCBpcyBzZXQgdG8gYmVmb3JlIGFuIGV4ZWMoKSAqLwotdm9pZAotc2V0ZXhlY3NpZyhUcmFwICpwLCBpbnQgcmVzdG9yZSkKLXsKLQkvKiBYWFggZGVidWdnaW5nICovCi0JaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzZXRleGVjc2lnOiB1bnNldCBzaWduYWwgJWQoJXMpIiwKLQkJICAgIHAtPnNpZ25hbCwgcC0+bmFtZSk7Ci0KLQkvKiByZXN0b3JlIG9yaWdpbmFsIHZhbHVlIGZvciBleGVjJ2Qga2lkcyAqLwotCXAtPmZsYWdzICY9IH4oVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpOwotCXN3aXRjaCAocmVzdG9yZSAmIFNTX1JFU1RPUkVfTUFTSykgewotCWNhc2UgU1NfUkVTVE9SRV9DVVJSOiAvKiBsZWF2ZSB0aGluZ3MgYXMgdGhleSBjdXJyZW50bHkgYXJlICovCi0JCWJyZWFrOwotCWNhc2UgU1NfUkVTVE9SRV9PUklHOgotCQlwLT5mbGFncyB8PSBwLT5mbGFncyAmIFRGX09SSUdfSUdOID8gVEZfRVhFQ19JR04gOiBURl9FWEVDX0RGTDsKLQkJYnJlYWs7Ci0JY2FzZSBTU19SRVNUT1JFX0RGTDoKLQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19ERkw7Ci0JCWJyZWFrOwotCWNhc2UgU1NfUkVTVE9SRV9JR046Ci0JCXAtPmZsYWdzIHw9IFRGX0VYRUNfSUdOOwotCQlicmVhazsKLQl9Ci19CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9qb2JzLmMgYi9ta3NoL3NyYy9qb2JzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzI2YTEuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvam9icy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0OCArMCwwIEBACi0vKgkkT3BlbkJTRDogam9icy5jLHYgMS4zOCAyMDA5LzEyLzEyIDA0OjI4OjQ0IGRlcmFhZHQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9qb2JzLmMsdiAxLjY5IDIwMTAvMDcvMDQgMTc6MzM6NTQgdGcgRXhwICQiKTsKLQotI2lmIEhBVkVfS0lMTFBHCi0jZGVmaW5lIG1rc2hfa2lsbHBnCQlraWxscGcKLSNlbHNlCi0vKiBjcm9zcyBmaW5nZXJzIGFuZCBob3BlIGtpbGwgaXMga2lsbHBnLWVuZG93ZWQgKi8KLSNkZWZpbmUgbWtzaF9raWxscGcocCxzKQlraWxsKC0ocCksIChzKSkKLSNlbmRpZgotCi0vKiBPcmRlciBpbXBvcnRhbnQhICovCi0jZGVmaW5lIFBSVU5OSU5HCTAKLSNkZWZpbmUgUEVYSVRFRAkJMQotI2RlZmluZSBQU0lHTkFMTEVECTIKLSNkZWZpbmUgUFNUT1BQRUQJMwotCi10eXBlZGVmIHN0cnVjdCBwcm9jCVByb2M7Ci1zdHJ1Y3QgcHJvYyB7Ci0JUHJvYyAqbmV4dDsJCS8qIG5leHQgcHJvY2VzcyBpbiBwaXBlbGluZSAoaWYgYW55KSAqLwotCXBpZF90IHBpZDsJCS8qIHByb2Nlc3MgaWQgKi8KLQlpbnQgc3RhdGU7Ci0JaW50IHN0YXR1czsJCS8qIHdhaXQgc3RhdHVzICovCi0JY2hhciBjb21tYW5kWzQ4XTsJLyogcHJvY2VzcyBjb21tYW5kIHN0cmluZyAqLwotfTsKLQotLyogTm90aWZ5L3ByaW50IGZsYWcgLSBqX3ByaW50KCkgYXJndW1lbnQgKi8KLSNkZWZpbmUgSlBfTk9ORQkJMAkvKiBkb24ndCBwcmludCBhbnl0aGluZyAqLwotI2RlZmluZSBKUF9TSE9SVAkxCS8qIHByaW50IHNpZ25hbHMgcHJvY2Vzc2VzIHdlcmUga2lsbGVkIGJ5ICovCi0jZGVmaW5lIEpQX01FRElVTQkyCS8qIHByaW50IFtqb2ItbnVtXSAtLysgY29tbWFuZCAqLwotI2RlZmluZSBKUF9MT05HCQkzCS8qIHByaW50IFtqb2ItbnVtXSAtLysgcGlkIGNvbW1hbmQgKi8KLSNkZWZpbmUgSlBfUEdSUAkJNAkvKiBwcmludCBwZ3JwICovCi0KLS8qIHB1dF9qb2IoKSBmbGFncyAqLwotI2RlZmluZSBQSl9PTl9GUk9OVAkwCS8qIGF0IHZlcnkgZnJvbnQgKi8KLSNkZWZpbmUgUEpfUEFTVF9TVE9QUEVECTEJLyoganVzdCBwYXN0IGFueSBzdG9wcGVkIGpvYnMgKi8KLQotLyogSm9iLmZsYWdzIHZhbHVlcyAqLwotI2RlZmluZSBKRl9TVEFSVEVECTB4MDAxCS8qIHNldCB3aGVuIGFsbCBwcm9jZXNzZXMgaW4gam9iIGFyZSBzdGFydGVkICovCi0jZGVmaW5lIEpGX1dBSVRJTkcJMHgwMDIJLyogc2V0IGlmIGpfd2FpdGooKSBpcyB3YWl0aW5nIG9uIGpvYiAqLwotI2RlZmluZSBKRl9XX0FTWU5DTk9USUZZIDB4MDA0CS8qIHNldCBpZiB3YWl0aW5nIGFuZCBhc3luYyBub3RpZmljYXRpb24gb2sgKi8KLSNkZWZpbmUgSkZfWFhDT00JMHgwMDgJLyogc2V0IGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KLSNkZWZpbmUgSkZfRkcJCTB4MDEwCS8qIHJ1bm5pbmcgaW4gZm9yZWdyb3VuZCAoYWxzbyBoYXMgdHR5IHBncnApICovCi0jZGVmaW5lIEpGX1NBVkVEVFRZCTB4MDIwCS8qIGotPnR0eXN0YXRlIGlzIHZhbGlkICovCi0jZGVmaW5lIEpGX0NIQU5HRUQJMHgwNDAJLyogcHJvY2VzcyBoYXMgY2hhbmdlZCBzdGF0ZSAqLwotI2RlZmluZSBKRl9LTk9XTgkweDA4MAkvKiAkISByZWZlcmVuY2VkICovCi0jZGVmaW5lIEpGX1pPTUJJRQkweDEwMAkvKiBrbm93biwgdW53YWl0ZWQgcHJvY2VzcyAqLwotI2RlZmluZSBKRl9SRU1PVkUJMHgyMDAJLyogZmxhZ2dlZCBmb3IgcmVtb3ZhbCAoal9qb2JzKCkval9ub2l0eWYoKSkgKi8KLSNkZWZpbmUgSkZfVVNFVFRZTU9ERQkweDQwMAkvKiB0dHkgbW9kZSBzYXZlZCBpZiBwcm9jZXNzIGV4aXRzIG5vcm1hbGx5ICovCi0jZGVmaW5lIEpGX1NBVkVEVFRZUEdSUAkweDgwMAkvKiBqLT5zYXZlZF90dHlwZ3JwIGlzIHZhbGlkICovCi0KLXR5cGVkZWYgc3RydWN0IGpvYiBKb2I7Ci1zdHJ1Y3Qgam9iIHsKLQlKb2IgKm5leHQ7CQkvKiBuZXh0IGpvYiBpbiBsaXN0ICovCi0JUHJvYyAqcHJvY19saXN0OwkvKiBwcm9jZXNzIGxpc3QgKi8KLQlQcm9jICpsYXN0X3Byb2M7CS8qIGxhc3QgcHJvY2VzcyBpbiBsaXN0ICovCi0Jc3RydWN0IHRpbWV2YWwgc3lzdGltZTsJLyogc3lzdGVtIHRpbWUgdXNlZCBieSBqb2IgKi8KLQlzdHJ1Y3QgdGltZXZhbCB1c3J0aW1lOwkvKiB1c2VyIHRpbWUgdXNlZCBieSBqb2IgKi8KLQlwaWRfdCBwZ3JwOwkJLyogcHJvY2VzcyBncm91cCBvZiBqb2IgKi8KLQlwaWRfdCBwcGlkOwkJLyogcGlkIG9mIHByb2Nlc3MgdGhhdCBmb3JrZWQgam9iICovCi0JaW50IGpvYjsJCS8qIGpvYiBudW1iZXI6ICVuICovCi0JaW50IGZsYWdzOwkJLyogc2VlIEpGXyogKi8KLQl2b2xhdGlsZSBpbnQgc3RhdGU7CS8qIGpvYiBzdGF0ZSAqLwotCWludCBzdGF0dXM7CQkvKiBleGl0IHN0YXR1cyBvZiBsYXN0IHByb2Nlc3MgKi8KLQlpbnQzMl90CWFnZTsJCS8qIG51bWJlciBvZiBqb2JzIHN0YXJ0ZWQgKi8KLQlDb3Byb2NfaWQgY29wcm9jX2lkOwkvKiAwIG9yIGlkIG9mIGNvcHJvY2VzcyBvdXRwdXQgcGlwZSAqLwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQlzdHJ1Y3QgdGVybWlvcyB0dHlzdGF0ZTsvKiBzYXZlZCB0dHkgc3RhdGUgZm9yIHN0b3BwZWQgam9icyAqLwotCXBpZF90IHNhdmVkX3R0eXBncnA7CS8qIHNhdmVkIHR0eSBwcm9jZXNzIGdyb3VwIGZvciBzdG9wcGVkIGpvYnMgKi8KLSNlbmRpZgotfTsKLQotLyogRmxhZ3MgZm9yIGpfd2FpdGooKSAqLwotI2RlZmluZSBKV19OT05FCQkweDAwCi0jZGVmaW5lIEpXX0lOVEVSUlVQVAkweDAxCS8qIF5DIHdpbGwgc3RvcCB0aGUgd2FpdCAqLwotI2RlZmluZSBKV19BU1lOQ05PVElGWQkweDAyCS8qIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gZHVyaW5nIHdhaXQgb2sgKi8KLSNkZWZpbmUgSldfU1RPUFBFRFdBSVQJMHgwNAkvKiB3YWl0IGV2ZW4gaWYgam9iIHN0b3BwZWQgKi8KLQotLyogRXJyb3IgY29kZXMgZm9yIGpfbG9va3VwKCkgKi8KLSNkZWZpbmUgSkxfT0sJCTAKLSNkZWZpbmUgSkxfTk9TVUNICTEJLyogbm8gc3VjaCBqb2IgKi8KLSNkZWZpbmUgSkxfQU1CSUcJMgkvKiAlZm9vIG9yICU/Zm9vIGlzIGFtYmlndW91cyAqLwotI2RlZmluZSBKTF9JTlZBTElECTMJLyogbm9uLXBpZCwgbm9uLSUgam9iIGlkICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb29rdXBfbXNnc1tdID0gewotCW51bGwsCi0JIm5vIHN1Y2ggam9iIiwKLQkiYW1iaWd1b3VzIiwKLQkiYXJndW1lbnQgbXVzdCBiZSAlam9iIG9yIHByb2Nlc3MgaWQiLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBKb2IgKmpvYl9saXN0OwkJLyogam9iIGxpc3QgKi8KLXN0YXRpYyBKb2IgKmxhc3Rfam9iOwotc3RhdGljIEpvYiAqYXN5bmNfam9iOwotc3RhdGljIHBpZF90IGFzeW5jX3BpZDsKLQotc3RhdGljIGludCBuem9tYmllOwkJLyogIyBvZiB6b21iaWVzIG93bmVkIGJ5IHRoaXMgcHJvY2VzcyAqLwotc3RhdGljIGludDMyX3QgbmpvYnM7CQkvKiAjIG9mIGpvYnMgc3RhcnRlZCAqLwotCi0jaWZuZGVmIENISUxEX01BWAotI2RlZmluZSBDSElMRF9NQVgJMjUKLSNlbmRpZgotCi0vKiBoZWxkX3NpZ2NobGQgaXMgc2V0IGlmIHNpZ2NobGQgb2NjdXJzIGJlZm9yZSBhIGpvYiBpcyBjb21wbGV0ZWx5IHN0YXJ0ZWQgKi8KLXN0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaGVsZF9zaWdjaGxkOwotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotc3RhdGljIHN0cnVjdCBzaGYJKnNobF9qOwotc3RhdGljIGJvb2wJCXR0eXBncnBfb2s7CS8qIHNldCBpZiBjYW4gdXNlIHR0eSBwZ3JwcyAqLwotc3RhdGljIHBpZF90CQlyZXN0b3JlX3R0eXBncnAgPSAtMTsKLXN0YXRpYyBpbnQgY29uc3QJdHRfc2lnc1tdID0geyBTSUdUU1RQLCBTSUdUVElOLCBTSUdUVE9VIH07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQJCWpfc2V0X2FzeW5jKEpvYiAqKTsKLXN0YXRpYyB2b2lkCQlqX3N0YXJ0am9iKEpvYiAqKTsKLXN0YXRpYyBpbnQJCWpfd2FpdGooSm9iICosIGludCwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyB2b2lkCQlqX3NpZ2NobGQoaW50KTsKLXN0YXRpYyB2b2lkCQlqX3ByaW50KEpvYiAqLCBpbnQsIHN0cnVjdCBzaGYgKik7Ci1zdGF0aWMgSm9iCQkqal9sb29rdXAoY29uc3QgY2hhciAqLCBpbnQgKik7Ci1zdGF0aWMgSm9iCQkqbmV3X2pvYih2b2lkKTsKLXN0YXRpYyBQcm9jCQkqbmV3X3Byb2Modm9pZCk7Ci1zdGF0aWMgdm9pZAkJY2hlY2tfam9iKEpvYiAqKTsKLXN0YXRpYyB2b2lkCQlwdXRfam9iKEpvYiAqLCBpbnQpOwotc3RhdGljIHZvaWQJCXJlbW92ZV9qb2IoSm9iICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgaW50CQlraWxsX2pvYihKb2IgKiwgaW50KTsKLQotLyogaW5pdGlhbGlzZSBqb2IgY29udHJvbCAqLwotdm9pZAotal9pbml0KHZvaWQpCi17Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCWJvb2wgbWZsYWdzZXQgPSBGbGFnKEZNT05JVE9SKSAhPSAxMjc7Ci0KLQlGbGFnKEZNT05JVE9SKSA9IDA7Ci0jZW5kaWYKLQotCSh2b2lkKXNpZ2VtcHR5c2V0KCZzbV9kZWZhdWx0KTsKLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNtX2RlZmF1bHQsIE5VTEwpOwotCi0JKHZvaWQpc2lnZW1wdHlzZXQoJnNtX3NpZ2NobGQpOwotCSh2b2lkKXNpZ2FkZHNldCgmc21fc2lnY2hsZCwgU0lHQ0hMRCk7Ci0KLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR0NITERdLCBqX3NpZ2NobGQsCi0JICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRXxTU19TSFRSQVApOwotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCWlmICghbWZsYWdzZXQgJiYgRmxhZyhGVEFMS0lORykpCi0JCUZsYWcoRk1PTklUT1IpID0gMTsKLQotCS8qCi0JICogc2hsX2ogaXMgdXNlZCB0byBkbyBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uICh1c2VkIGluCi0JICogYW4gaW50ZXJydXB0IGhhbmRsZXIsIHNvIG5lZWQgYSBkaXN0aW5jdCBzaGYpCi0JICovCi0Jc2hsX2ogPSBzaGZfZmRvcGVuKDIsIFNIRl9XUiwgTlVMTCk7Ci0KLQlpZiAoRmxhZyhGTU9OSVRPUikgfHwgRmxhZyhGVEFMS0lORykpIHsKLQkJaW50IGk7Ci0KLQkJLyoKLQkJICogdGhlIFRGX1NIRUxMX1VTRVMgdGVzdCBpcyBhIGtsdWRnZSB0aGF0IGxldHMgdXMga25vdyBpZgotCQkgKiBpZiB0aGUgc2lnbmFscyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGUgc2hlbGwuCi0JCSAqLwotCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkgewotCQkJc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKLQkJCS8qIGpfY2hhbmdlKCkgc2V0cyB0aGlzIHRvIFNTX1JFU1RPUkVfREZMIGlmIEZNT05JVE9SICovCi0JCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLCBTSUdfSUdOLAotCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKLQkJfQotCX0KLQotCS8qIGpfY2hhbmdlKCkgY2FsbHMgdHR5X2luaXQoKSAqLwotCWlmIChGbGFnKEZNT05JVE9SKSkKLQkJal9jaGFuZ2UoKTsKLQllbHNlCi0jZW5kaWYKLQkgIGlmIChGbGFnKEZUQUxLSU5HKSkKLQkJdHR5X2luaXQodHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qIGpvYiBjbGVhbnVwIGJlZm9yZSBzaGVsbCBleGl0ICovCi12b2lkCi1qX2V4aXQodm9pZCkKLXsKLQkvKiBraWxsIHN0b3BwZWQsIGFuZCBwb3NzaWJseSBydW5uaW5nLCBqb2JzICovCi0JSm9iCSpqOwotCWludAlraWxsZWQgPSAwOwotCi0JZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpIHsKLQkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJgotCQkgICAgKGotPnN0YXRlID09IFBTVE9QUEVEIHx8Ci0JCSAgICAoai0+c3RhdGUgPT0gUFJVTk5JTkcgJiYKLQkJICAgICgoai0+ZmxhZ3MgJiBKRl9GRykgfHwKLQkJICAgIChGbGFnKEZMT0dJTikgJiYgIUZsYWcoRk5PSFVQKSAmJiBwcm9jcGlkID09IGtzaHBpZCkpKSkpIHsKLQkJCWtpbGxlZCA9IDE7Ci0JCQlpZiAoai0+cGdycCA9PSAwKQotCQkJCWtpbGxfam9iKGosIFNJR0hVUCk7Ci0JCQllbHNlCi0JCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHSFVQKTsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpIHsKLQkJCQlpZiAoai0+cGdycCA9PSAwKQotCQkJCQlraWxsX2pvYihqLCBTSUdDT05UKTsKLQkJCQllbHNlCi0JCQkJCW1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpOwotCQkJfQotI2VuZGlmCi0JCX0KLQl9Ci0JaWYgKGtpbGxlZCkKLQkJc2xlZXAoMSk7Ci0Jal9ub3RpZnkoKTsKLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQlpZiAoa3NocGlkID09IHByb2NwaWQgJiYgcmVzdG9yZV90dHlwZ3JwID49IDApIHsKLQkJLyoKLQkJICogTmVlZCB0byByZXN0b3JlIHRoZSB0dHkgcGdycCB0byB3aGF0IGl0IHdhcyB3aGVuIHRoZQotCQkgKiBzaGVsbCBzdGFydGVkIHVwLCBzbyB0aGF0IHRoZSBwcm9jZXNzIHRoYXQgc3RhcnRlZCB1cwotCQkgKiB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSB0dHkgd2hlbiB3ZSBhcmUgZG9uZS4KLQkJICogQWxzbyBuZWVkIHRvIHJlc3RvcmUgb3VyIHByb2Nlc3MgZ3JvdXAgaW4gY2FzZSB3ZSBhcmUKLQkJICogYWJvdXQgdG8gZG8gYW4gZXhlYyBzbyB0aGF0IGJvdGggb3VyIHBhcmVudCBhbmQgdGhlCi0JCSAqIHByb2Nlc3Mgd2UgYXJlIHRvIGJlY29tZSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSB0dHkuCi0JCSAqLwotCQl0Y3NldHBncnAodHR5X2ZkLCByZXN0b3JlX3R0eXBncnApOwotCQlzZXRwZ2lkKDAsIHJlc3RvcmVfdHR5cGdycCk7Ci0JfQotCWlmIChGbGFnKEZNT05JVE9SKSkgewotCQlGbGFnKEZNT05JVE9SKSA9IDA7Ci0JCWpfY2hhbmdlKCk7Ci0JfQotI2VuZGlmCi19Ci0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0vKiB0dXJuIGpvYiBjb250cm9sIG9uIG9yIG9mZiBhY2NvcmRpbmcgdG8gRmxhZyhGTU9OSVRPUikgKi8KLXZvaWQKLWpfY2hhbmdlKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoRmxhZyhGTU9OSVRPUikpIHsKLQkJYm9vbCB1c2VfdHR5ID0gRmxhZyhGVEFMS0lORyk7Ci0KLQkJLyogRG9uJ3QgY2FsbCB0Y2dldGF0dHIoKSAndGlsIHdlIG93biB0aGUgdHR5IHByb2Nlc3MgZ3JvdXAgKi8KLQkJaWYgKHVzZV90dHkpCi0JCQl0dHlfaW5pdChmYWxzZSwgdHJ1ZSk7Ci0KLQkJLyogbm8gY29udHJvbGxpbmcgdHR5LCBubyBTSUdUKiAqLwotCQlpZiAoKHR0eXBncnBfb2sgPSB1c2VfdHR5ICYmIHR0eV9mZCA+PSAwICYmIHR0eV9kZXZ0dHkpKSB7Ci0JCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1RUSU5dLCBTSUdfREZMLAotCQkJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRSk7Ci0JCQkvKiB3YWl0IHRvIGJlIGdpdmVuIHR0eSAoUE9TSVguMSwgQi4yLCBqb2IgY29udHJvbCkgKi8KLQkJCXdoaWxlICgxKSB7Ci0JCQkJcGlkX3QgdHR5cGdycDsKLQotCQkJCWlmICgodHR5cGdycCA9IHRjZ2V0cGdycCh0dHlfZmQpKSA8IDApIHsKLQkJCQkJd2FybmluZ2YoZmFsc2UsCi0JCQkJCSAgICAial9pbml0OiB0Y2dldHBncnAoKSBmYWlsZWQ6ICVzIiwKLQkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJCXR0eXBncnBfb2sgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0dHlwZ3JwID09IGtzaHBncnApCi0JCQkJCWJyZWFrOwotCQkJCWtpbGwoMCwgU0lHVFRJTik7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApCi0JCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLCBTSUdfSUdOLAotCQkJICAgIFNTX1JFU1RPUkVfREZMfFNTX0ZPUkNFKTsKLQkJaWYgKHR0eXBncnBfb2sgJiYga3NocGdycCAhPSBrc2hwaWQpIHsKLQkJCWlmIChzZXRwZ2lkKDAsIGtzaHBpZCkgPCAwKSB7Ci0JCQkJd2FybmluZ2YoZmFsc2UsCi0JCQkJICAgICJqX2luaXQ6IHNldHBnaWQoKSBmYWlsZWQ6ICVzIiwKLQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQl0dHlwZ3JwX29rID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0Y3NldHBncnAodHR5X2ZkLCBrc2hwaWQpIDwgMCkgewotCQkJCQl3YXJuaW5nZihmYWxzZSwKLQkJCQkJICAgICJqX2luaXQ6IHRjc2V0cGdycCgpIGZhaWxlZDogJXMiLAotCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQkJdHR5cGdycF9vayA9IGZhbHNlOwotCQkJCX0gZWxzZQotCQkJCQlyZXN0b3JlX3R0eXBncnAgPSBrc2hwZ3JwOwotCQkJCWtzaHBncnAgPSBrc2hwaWQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZV90dHkgJiYgIXR0eXBncnBfb2spCi0JCQl3YXJuaW5nZihmYWxzZSwgIndhcm5pbmc6IHdvbid0IGhhdmUgZnVsbCBqb2IgY29udHJvbCIpOwotCQlpZiAodHR5X2ZkID49IDApCi0JCQl0Y2dldGF0dHIodHR5X2ZkLCAmdHR5X3N0YXRlKTsKLQl9IGVsc2UgewotCQl0dHlwZ3JwX29rID0gZmFsc2U7Ci0JCWlmIChGbGFnKEZUQUxLSU5HKSkKLQkJCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKQotCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCi0JCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKLQkJZWxzZQotCQkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApIHsKLQkJCQlpZiAoc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgJgotCQkJCSAgICAoVEZfT1JJR19JR04gfCBURl9PUklHX0RGTCkpCi0JCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sCi0JCQkJCSAgICAoc2lndHJhcHNbdHRfc2lnc1tpXV0uZmxhZ3MgJiBURl9PUklHX0lHTikgPwotCQkJCQkgICAgU0lHX0lHTiA6IFNJR19ERkwsCi0JCQkJCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0UpOwotCQkJfQotCQlpZiAoIUZsYWcoRlRBTEtJTkcpKQotCQkJdHR5X2Nsb3NlKCk7Ci0JfQotfQotI2VuZGlmCi0KLS8qIGV4ZWN1dGUgdHJlZSBpbiBjaGlsZCBzdWJwcm9jZXNzICovCi1pbnQKLWV4Y2hpbGQoc3RydWN0IG9wICp0LCBpbnQgZmxhZ3MsCi0gICAgdm9sYXRpbGUgaW50ICp4ZXJyb2ssCi0gICAgLyogdXNlZCBpZiBYUENMT1NFIG9yIFhDQ0xPU0UgKi8gaW50IGNsb3NlX2ZkKQotewotCXN0YXRpYyBQcm9jICpsYXN0X3Byb2M7CQkvKiBmb3IgcGlwZWxpbmVzICovCi0KLQlpbnQgcnYgPSAwLCBmb3Jrc2xlZXA7Ci0Jc2lnc2V0X3Qgb21hc2s7Ci0Jc3RydWN0IHsKLQkJUHJvYyAqcDsKLQkJSm9iICpqOwotCQlwaWRfdCBjbGRwaWQ7Ci0JfSBwaTsKLQotCWlmIChmbGFncyAmIFhFWEVDKQotCQkvKgotCQkgKiBDbGVhciBYRk9SS3xYUENMT1NFfFhDQ0xPU0V8WENPUFJPQ3xYUElQRU98WFBJUEVJfFhYQ09NfFhCR05ECi0JCSAqIChhbHNvIGRvbmUgaW4gYW5vdGhlciBleGVjdXRlKCkgYmVsb3cpCi0JCSAqLwotCQlyZXR1cm4gKGV4ZWN1dGUodCwgZmxhZ3MgJiAoWEVYRUMgfCBYRVJST0spLCB4ZXJyb2spKTsKLQotCS8qIG5vIFNJR0NITERzIHdoaWxlIG1lc3Npbmcgd2l0aCBqb2IgYW5kIHByb2Nlc3MgbGlzdHMgKi8KLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOwotCi0JcGkucCA9IG5ld19wcm9jKCk7Ci0JcGkucC0+bmV4dCA9IE5VTEw7Ci0JcGkucC0+c3RhdGUgPSBQUlVOTklORzsKLQlwaS5wLT5zdGF0dXMgPSAwOwotCXBpLnAtPnBpZCA9IDA7Ci0KLQkvKiBsaW5rIHByb2Nlc3MgaW50byBqb2JzIGxpc3QgKi8KLQlpZiAoZmxhZ3MgJiBYUElQRUkpIHsKLQkJLyogY29udGludWluZyB3aXRoIGEgcGlwZSAqLwotCQlpZiAoIWxhc3Rfam9iKQotCQkJaW50ZXJuYWxfZXJyb3JmKAotCQkJICAgICJleGNoaWxkOiBYUElQRUkgYW5kIG5vIGxhc3Rfam9iIC0gcGlkICVkIiwKLQkJCSAgICAoaW50KXByb2NwaWQpOwotCQlwaS5qID0gbGFzdF9qb2I7Ci0JCWlmIChsYXN0X3Byb2MpCi0JCQlsYXN0X3Byb2MtPm5leHQgPSBwaS5wOwotCQlsYXN0X3Byb2MgPSBwaS5wOwotCX0gZWxzZSB7Ci0JCXBpLmogPSBuZXdfam9iKCk7IC8qIGZpbGxzIGluIHBpLmotPmpvYiAqLwotCQkvKgotCQkgKiB3ZSBkb24ndCBjb25zaWRlciBYWENPTXMgZm9yZWdyb3VuZCBzaW5jZSB0aGV5IGRvbid0IGdldAotCQkgKiB0dHkgcHJvY2VzcyBncm91cCBhbmQgd2UgZG9uJ3Qgc2F2ZSBvciByZXN0b3JlIHR0eSBtb2Rlcy4KLQkJICovCi0JCXBpLmotPmZsYWdzID0gKGZsYWdzICYgWFhDT00pID8gSkZfWFhDT00gOgotCQkgICAgKChmbGFncyAmIFhCR05EKSA/IDAgOiAoSkZfRkd8SkZfVVNFVFRZTU9ERSkpOwotCQl0aW1lcmNsZWFyKCZwaS5qLT51c3J0aW1lKTsKLQkJdGltZXJjbGVhcigmcGkuai0+c3lzdGltZSk7Ci0JCXBpLmotPnN0YXRlID0gUFJVTk5JTkc7Ci0JCXBpLmotPnBncnAgPSAwOwotCQlwaS5qLT5wcGlkID0gcHJvY3BpZDsKLQkJcGkuai0+YWdlID0gKytuam9iczsKLQkJcGkuai0+cHJvY19saXN0ID0gcGkucDsKLQkJcGkuai0+Y29wcm9jX2lkID0gMDsKLQkJbGFzdF9qb2IgPSBwaS5qOwotCQlsYXN0X3Byb2MgPSBwaS5wOwotCQlwdXRfam9iKHBpLmosIFBKX1BBU1RfU1RPUFBFRCk7Ci0JfQotCi0Jc25wdHJlZWYocGkucC0+Y29tbWFuZCwgc2l6ZW9mKHBpLnAtPmNvbW1hbmQpLCAiJVQiLCB0KTsKLQotCS8qIGNyZWF0ZSBjaGlsZCBwcm9jZXNzICovCi0JZm9ya3NsZWVwID0gMTsKLQl3aGlsZSAoKHBpLmNsZHBpZCA9IGZvcmsoKSkgPCAwICYmIGVycm5vID09IEVBR0FJTiAmJiBmb3Jrc2xlZXAgPCAzMikgewotCQlpZiAoaW50cnNpZykJIC8qIGFsbG93IHVzZXIgdG8gXkMgb3V0Li4uICovCi0JCQlicmVhazsKLQkJc2xlZXAoZm9ya3NsZWVwKTsKLQkJZm9ya3NsZWVwIDw8PSAxOwotCX0KLQlpZiAocGkuY2xkcGlkIDwgMCkgewotCQlraWxsX2pvYihwaS5qLCBTSUdLSUxMKTsKLQkJcmVtb3ZlX2pvYihwaS5qLCAiZm9yayBmYWlsZWQiKTsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWVycm9yZigiY2Fubm90IGZvcmsgLSB0cnkgYWdhaW4iKTsKLQl9Ci0JcGkucC0+cGlkID0gcGkuY2xkcGlkID8gcGkuY2xkcGlkIDogKHByb2NwaWQgPSBnZXRwaWQoKSk7Ci0KLQkvKgotCSAqIGVuc3VyZSBuZXh0IGNoaWxkIGdldHMgYSAoc2xpZ2h0bHkpIGRpZmZlcmVudCAkUkFORE9NIHNlcXVlbmNlCi0JICogZnJvbSBpdHMgcGFyZW50IHByb2Nlc3MgYW5kIG90aGVyIGNoaWxkIHByb2Nlc3NlcwotCSAqLwotCWNoYW5nZV9yYW5kb20oJnBpLCBzaXplb2YocGkpKTsKLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkvKiBqb2IgY29udHJvbCBzZXQgdXAgKi8KLQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgIShmbGFncyZYWENPTSkpIHsKLQkJaW50CWRvdHR5ID0gMDsKLQkJaWYgKHBpLmotPnBncnAgPT0gMCkgewkvKiBGaXJzdCBwcm9jZXNzICovCi0JCQlwaS5qLT5wZ3JwID0gcGkucC0+cGlkOwotCQkJZG90dHkgPSAxOwotCQl9Ci0KLQkJLyogc2V0IHBncnAgaW4gYm90aCBwYXJlbnQgYW5kIGNoaWxkIHRvIGRlYWwgd2l0aCByYWNlCi0JCSAqIGNvbmRpdGlvbgotCQkgKi8KLQkJc2V0cGdpZChwaS5wLT5waWQsIHBpLmotPnBncnApOwotCQlpZiAodHR5cGdycF9vayAmJiBkb3R0eSAmJiAhKGZsYWdzICYgWEJHTkQpKQotCQkJdGNzZXRwZ3JwKHR0eV9mZCwgcGkuai0+cGdycCk7Ci0JfQotI2VuZGlmCi0KLQkvKiB1c2VkIHRvIGNsb3NlIHBpcGUgaW5wdXQgZmQgKi8KLQlpZiAoY2xvc2VfZmQgPj0gMCAmJiAoKChmbGFncyAmIFhQQ0xPU0UpICYmIHBpLmNsZHBpZCkgfHwKLQkgICAgKChmbGFncyAmIFhDQ0xPU0UpICYmICFwaS5jbGRwaWQpKSkKLQkJY2xvc2UoY2xvc2VfZmQpOwotCWlmICghcGkuY2xkcGlkKSB7Ci0JCS8qIGNoaWxkICovCi0KLQkJLyogRG8gdGhpcyBiZWZvcmUgcmVzdG9yaW5nIHNpZ25hbCAqLwotCQlpZiAoZmxhZ3MgJiBYQ09QUk9DKQotCQkJY29wcm9jX2NsZWFudXAoZmFsc2UpOwotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJY2xlYW51cF9wYXJlbnRzX2VudigpOwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJLyogSWYgRk1PTklUT1Igb3IgRlRBTEtJTkcgaXMgc2V0LCB0aGVzZSBzaWduYWxzIGFyZSBpZ25vcmVkLAotCQkgKiBpZiBuZWl0aGVyIEZNT05JVE9SIG5vciBGVEFMS0lORyBhcmUgc2V0LCB0aGUgc2lnbmFscyBoYXZlCi0JCSAqIHRoZWlyIGluaGVyaXRlZCB2YWx1ZXMuCi0JCSAqLwotCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgIShmbGFncyAmIFhYQ09NKSkgewotCQkJZm9yIChmb3Jrc2xlZXAgPSBORUxFTSh0dF9zaWdzKTsgLS1mb3Jrc2xlZXAgPj0gMDsgKQotCQkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tmb3Jrc2xlZXBdXSwgU0lHX0RGTCwKLQkJCQkgICAgU1NfUkVTVE9SRV9ERkx8U1NfRk9SQ0UpOwotCQl9Ci0jZW5kaWYKLSNpZiBIQVZFX05JQ0UKLQkJaWYgKEZsYWcoRkJHTklDRSkgJiYgKGZsYWdzICYgWEJHTkQpKQotCQkJKHZvaWQpbmljZSg0KTsKLSNlbmRpZgotCQlpZiAoKGZsYWdzICYgWEJHTkQpCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQkgICAgJiYgIUZsYWcoRk1PTklUT1IpCi0jZW5kaWYKLQkJICAgICkgewotCQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdJTlRdLCBTSUdfSUdOLAotCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKLQkJCXNldHNpZygmc2lndHJhcHNbU0lHUVVJVF0sIFNJR19JR04sCi0JCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOwotCQkJaWYgKCghKGZsYWdzICYgKFhQSVBFSSB8IFhDT1BST0MpKSkgJiYKLQkJCSAgICAoKGZvcmtzbGVlcCA9IG9wZW4oIi9kZXYvbnVsbCIsIDApKSA+IDApKSB7Ci0JCQkJKHZvaWQpa3NoX2R1cDIoZm9ya3NsZWVwLCAwLCB0cnVlKTsKLQkJCQljbG9zZShmb3Jrc2xlZXApOwotCQkJfQotCQl9Ci0JCXJlbW92ZV9qb2IocGkuaiwgImNoaWxkIik7CS8qIGluIGNhc2Ugb2YgJChqb2JzKSBjb21tYW5kICovCi0JCW56b21iaWUgPSAwOwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJdHR5cGdycF9vayA9IGZhbHNlOwotCQlGbGFnKEZNT05JVE9SKSA9IDA7Ci0jZW5kaWYKLQkJRmxhZyhGVEFMS0lORykgPSAwOwotCQl0dHlfY2xvc2UoKTsKLQkJY2xlYXJ0cmFwcygpOwotCQkvKiBubyByZXR1cm4gKi8KLQkJZXhlY3V0ZSh0LCAoZmxhZ3MgJiBYRVJST0spIHwgWEVYRUMsIE5VTEwpOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWlmICh0LT50eXBlID09IFRQSVBFKQotCQkJdW53aW5kKExMRUFWRSk7Ci0JCWludGVybmFsX3dhcm5pbmdmKCJleGNoaWxkOiBleGVjdXRlKCkgcmV0dXJuZWQiKTsKLQkJZnB0cmVlZihzaGxfb3V0LCAyLCAiZXhjaGlsZDogdHJpZWQgdG8gZXhlY3V0ZSB7XG4lVFxufVxuIiwgdCk7Ci0JCXNoZl9mbHVzaChzaGxfb3V0KTsKLSNlbmRpZgotCQl1bndpbmQoTExFQVZFKTsKLQkJLyogTk9UUkVBQ0hFRCAqLwotCX0KLQotCS8qIHNoZWxsIChwYXJlbnQpIHN0dWZmICovCi0JaWYgKCEoZmxhZ3MgJiBYUElQRU8pKSB7CS8qIGxhc3QgcHJvY2VzcyBpbiBhIGpvYiAqLwotCQlqX3N0YXJ0am9iKHBpLmopOwotCQlpZiAoZmxhZ3MgJiBYQ09QUk9DKSB7Ci0JCQlwaS5qLT5jb3Byb2NfaWQgPSBjb3Byb2MuaWQ7Ci0JCQkvKiBuIGpvYnMgdXNpbmcgY28tcHJvY2VzcyBvdXRwdXQgKi8KLQkJCWNvcHJvYy5uam9icysrOwotCQkJLyogaiB1c2luZyBjby1wcm9jZXNzIGlucHV0ICovCi0JCQljb3Byb2Muam9iID0gKHZvaWQgKilwaS5qOwotCQl9Ci0JCWlmIChmbGFncyAmIFhCR05EKSB7Ci0JCQlqX3NldF9hc3luYyhwaS5qKTsKLQkJCWlmIChGbGFnKEZUQUxLSU5HKSkgewotCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICJbJWRdIiwgcGkuai0+am9iKTsKLQkJCQlmb3IgKHBpLnAgPSBwaS5qLT5wcm9jX2xpc3Q7IHBpLnA7Ci0JCQkJICAgIHBpLnAgPSBwaS5wLT5uZXh0KQotCQkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiICVkIiwKLQkJCQkJICAgIChpbnQpcGkucC0+cGlkKTsKLQkJCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKLQkJCQlzaGZfZmx1c2goc2hsX291dCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcnYgPSBqX3dhaXRqKHBpLmosIEpXX05PTkUsICJqdzpsYXN0IHByb2MiKTsKLQl9Ci0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQotCXJldHVybiAocnYpOwotfQotCi0vKiBzdGFydCB0aGUgbGFzdCBqb2I6IG9ubHkgdXNlZCBmb3IgJChjb21tYW5kKSBqb2JzICovCi12b2lkCi1zdGFydGxhc3Qodm9pZCkKLXsKLQlzaWdzZXRfdCBvbWFzazsKLQotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQlpZiAobGFzdF9qb2IpIHsgLyogbm8gbmVlZCB0byByZXBvcnQgZXJyb3IgLSB3YWl0bGFzdCgpIHdpbGwgZG8gaXQgKi8KLQkJLyogZW5zdXJlIGl0IGlzbid0IHJlbW92ZWQgYnkgY2hlY2tfam9iKCkgKi8KLQkJbGFzdF9qb2ItPmZsYWdzIHw9IEpGX1dBSVRJTkc7Ci0JCWpfc3RhcnRqb2IobGFzdF9qb2IpOwotCX0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLX0KLQotLyogd2FpdCBmb3IgbGFzdCBqb2I6IG9ubHkgdXNlZCBmb3IgJChjb21tYW5kKSBqb2JzICovCi1pbnQKLXdhaXRsYXN0KHZvaWQpCi17Ci0JaW50CXJ2OwotCUpvYgkqajsKLQlzaWdzZXRfdCBvbWFzazsKLQotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQlqID0gbGFzdF9qb2I7Ci0JaWYgKCFqIHx8ICEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgewotCQlpZiAoIWopCi0JCQl3YXJuaW5nZih0cnVlLCAid2FpdGxhc3Q6IG5vIGxhc3Qgam9iIik7Ci0JCWVsc2UKLQkJCWludGVybmFsX3dhcm5pbmdmKCJ3YWl0bGFzdDogbm90IHN0YXJ0ZWQiKTsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCXJldHVybiAoMTI1KTsgLyogbm90IHNvIGFyYml0cmFyeSwgbm9uLXplcm8gdmFsdWUgKi8KLQl9Ci0KLQlydiA9IGpfd2FpdGooaiwgSldfTk9ORSwgImp3OndhaXRsYXN0Iik7Ci0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQotCXJldHVybiAocnYpOwotfQotCi0vKiB3YWl0IGZvciBjaGlsZCwgaW50ZXJydXB0YWJsZS4gKi8KLWludAotd2FpdGZvcihjb25zdCBjaGFyICpjcCwgaW50ICpzaWdwKQotewotCWludAlydjsKLQlKb2IJKmo7Ci0JaW50CWVjb2RlOwotCWludAlmbGFncyA9IEpXX0lOVEVSUlVQVHxKV19BU1lOQ05PVElGWTsKLQlzaWdzZXRfdCBvbWFzazsKLQotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQkqc2lncCA9IDA7Ci0KLQlpZiAoY3AgPT0gTlVMTCkgewotCQkvKgotCQkgKiB3YWl0IGZvciBhbiB1bnNwZWNpZmllZCBqb2IgLSBhbHdheXMgcmV0dXJucyAwLCBzbwotCQkgKiBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGV4aXRlZC9zaWduYWxlZCBqb2JzCi0JCSAqLwotCQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpCi0JCQkvKiBBVCZUIGtzaCB3aWxsIHdhaXQgZm9yIHN0b3BwZWQgam9icyAtIHdlIGRvbid0ICovCi0JCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBSVU5OSU5HKQotCQkJCWJyZWFrOwotCQlpZiAoIWopIHsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpKSB7Ci0JCS8qIGRvbid0IHJlcG9ydCBub3JtYWwgam9iIGNvbXBsZXRpb24gKi8KLQkJZmxhZ3MgJj0gfkpXX0FTWU5DTk9USUZZOwotCQlpZiAoai0+cHBpZCAhPSBwcm9jcGlkKSB7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWlmIChlY29kZSAhPSBKTF9OT1NVQ0gpCi0JCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBBVCZUIGtzaCB3aWxsIHdhaXQgZm9yIHN0b3BwZWQgam9icyAtIHdlIGRvbid0ICovCi0JcnYgPSBqX3dhaXRqKGosIGZsYWdzLCAianc6d2FpdGZvciIpOwotCi0Jc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0KLQlpZiAocnYgPCAwKSAvKiB3ZSB3ZXJlIGludGVycnVwdGVkICovCi0JCSpzaWdwID0gMTI4ICsgLXJ2OwotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qIGtpbGwgKGJ1aWx0LWluKSBhIGpvYiAqLwotaW50Ci1qX2tpbGwoY29uc3QgY2hhciAqY3AsIGludCBzaWcpCi17Ci0JSm9iCSpqOwotCWludAlydiA9IDA7Ci0JaW50CWVjb2RlOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChqLT5wZ3JwID09IDApIHsJLyogc3RhcnRlZCB3aGVuICFGbGFnKEZNT05JVE9SKSAqLwotCQlpZiAoa2lsbF9qb2Ioaiwgc2lnKSA8IDApIHsKLQkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlydiA9IDE7Ci0JCX0KLQl9IGVsc2UgewotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEICYmIChzaWcgPT0gU0lHVEVSTSB8fCBzaWcgPT0gU0lHSFVQKSkKLQkJCW1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpOwotI2VuZGlmCi0JCWlmIChta3NoX2tpbGxwZyhqLT5wZ3JwLCBzaWcpIDwgMCkgewotCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXJ2ID0gMTsKLQkJfQotCX0KLQotCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0vKiBmZyBhbmQgYmcgYnVpbHQtaW5zOiBjYWxsZWQgb25seSBpZiBGbGFnKEZNT05JVE9SKSBzZXQgKi8KLWludAotal9yZXN1bWUoY29uc3QgY2hhciAqY3AsIGludCBiZykKLXsKLQlKb2IJKmo7Ci0JUHJvYwkqcDsKLQlpbnQJZWNvZGU7Ci0JaW50CXJ1bm5pbmc7Ci0JaW50CXJ2ID0gMDsKLQlzaWdzZXRfdCBvbWFzazsKLQotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQlpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkgPT0gTlVMTCkgewotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgbG9va3VwX21zZ3NbZWNvZGVdKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlpZiAoai0+cGdycCA9PSAwKSB7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOwotCQliaV9lcnJvcmYoImpvYiBub3Qgam9iLWNvbnRyb2xsZWQiKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0KLQlpZiAoYmcpCi0JCXNocHJpbnRmKCJbJWRdICIsIGotPmpvYik7Ci0KLQlydW5uaW5nID0gMDsKLQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKLQkJaWYgKHAtPnN0YXRlID09IFBTVE9QUEVEKSB7Ci0JCQlwLT5zdGF0ZSA9IFBSVU5OSU5HOwotCQkJcC0+c3RhdHVzID0gMDsKLQkJCXJ1bm5pbmcgPSAxOwotCQl9Ci0JCXNoZl9wdXRzKHAtPmNvbW1hbmQsIHNobF9zdGRvdXQpOwotCQlpZiAocC0+bmV4dCkKLQkJCXNoZl9wdXRzKCJ8ICIsIHNobF9zdGRvdXQpOwotCX0KLQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKLQlzaGZfZmx1c2goc2hsX3N0ZG91dCk7Ci0JaWYgKHJ1bm5pbmcpCi0JCWotPnN0YXRlID0gUFJVTk5JTkc7Ci0KLQlwdXRfam9iKGosIFBKX1BBU1RfU1RPUFBFRCk7Ci0JaWYgKGJnKQotCQlqX3NldF9hc3luYyhqKTsKLQllbHNlIHsKLQkJLyogYXR0YWNoIHR0eSB0byBqb2IgKi8KLQkJaWYgKGotPnN0YXRlID09IFBSVU5OSU5HKSB7Ci0JCQlpZiAodHR5cGdycF9vayAmJiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkpCi0JCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmai0+dHR5c3RhdGUpOwotCQkJLyogU2VlIGNvbW1lbnQgaW4gal93YWl0aiByZWdhcmRpbmcgc2F2ZWRfdHR5cGdycC4gKi8KLQkJCWlmICh0dHlwZ3JwX29rICYmCi0JCQkgICAgdGNzZXRwZ3JwKHR0eV9mZCwgKGotPmZsYWdzICYgSkZfU0FWRURUVFlQR1JQKSA/Ci0JCQkgICAgai0+c2F2ZWRfdHR5cGdycCA6IGotPnBncnApIDwgMCkgewotCQkJCXJ2ID0gZXJybm87Ci0JCQkJaWYgKGotPmZsYWdzICYgSkZfU0FWRURUVFkpCi0JCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7Ci0JCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywKLQkJCQkgICAgTlVMTCk7Ci0JCQkJYmlfZXJyb3JmKCIxc3QgdGNzZXRwZ3JwKCVkLCAlZCkgZmFpbGVkOiAlcyIsCi0JCQkJICAgIHR0eV9mZCwKLQkJCQkgICAgKGludCkoKGotPmZsYWdzICYgSkZfU0FWRURUVFlQR1JQKSA/Ci0JCQkJICAgIGotPnNhdmVkX3R0eXBncnAgOiBqLT5wZ3JwKSwKLQkJCQkgICAgc3RyZXJyb3IocnYpKTsKLQkJCQlyZXR1cm4gKDEpOwotCQkJfQotCQl9Ci0JCWotPmZsYWdzIHw9IEpGX0ZHOwotCQlqLT5mbGFncyAmPSB+SkZfS05PV047Ci0JCWlmIChqID09IGFzeW5jX2pvYikKLQkJCWFzeW5jX2pvYiA9IE5VTEw7Ci0JfQotCi0JaWYgKGotPnN0YXRlID09IFBSVU5OSU5HICYmIG1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0NPTlQpIDwgMCkgewotCQlpbnQgZXJyID0gZXJybm87Ci0KLQkJaWYgKCFiZykgewotCQkJai0+ZmxhZ3MgJj0gfkpGX0ZHOwotCQkJaWYgKHR0eXBncnBfb2sgJiYgKGotPmZsYWdzICYgSkZfU0FWRURUVFkpKQotCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7Ci0JCQlpZiAodHR5cGdycF9vayAmJiB0Y3NldHBncnAodHR5X2ZkLCBrc2hwZ3JwKSA8IDApCi0JCQkJd2FybmluZ2YodHJ1ZSwKLQkJCQkgICAgImZnOiAybmQgdGNzZXRwZ3JwKCVkLCAlbGQpIGZhaWxlZDogJXMiLAotCQkJCSAgICB0dHlfZmQsIChsb25nKWtzaHBncnAsIHN0cmVycm9yKGVycm5vKSk7Ci0JCX0KLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCWJpX2Vycm9yZigiY2Fubm90IGNvbnRpbnVlIGpvYiAlczogJXMiLAotCQkgICAgY3AsIHN0cmVycm9yKGVycikpOwotCQlyZXR1cm4gKDEpOwotCX0KLQlpZiAoIWJnKSB7Ci0JCWlmICh0dHlwZ3JwX29rKSB7Ci0JCQlqLT5mbGFncyAmPSB+KEpGX1NBVkVEVFRZIHwgSkZfU0FWRURUVFlQR1JQKTsKLQkJfQotCQlydiA9IGpfd2FpdGooaiwgSldfTk9ORSwgImp3OnJlc3VtZSIpOwotCX0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQlyZXR1cm4gKHJ2KTsKLX0KLSNlbmRpZgotCi0vKiBhcmUgdGhlcmUgYW55IHJ1bm5pbmcgb3Igc3RvcHBlZCBqb2JzID8gKi8KLWludAotal9zdG9wcGVkX3J1bm5pbmcodm9pZCkKLXsKLQlKb2IJKmo7Ci0JaW50CXdoaWNoID0gMDsKLQotCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KSB7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBTVE9QUEVEKQotCQkJd2hpY2ggfD0gMTsKLSNlbmRpZgotCQlpZiAoRmxhZyhGTE9HSU4pICYmICFGbGFnKEZOT0hVUCkgJiYgcHJvY3BpZCA9PSBrc2hwaWQgJiYKLQkJICAgIGotPnBwaWQgPT0gcHJvY3BpZCAmJiBqLT5zdGF0ZSA9PSBQUlVOTklORykKLQkJCXdoaWNoIHw9IDI7Ci0JfQotCWlmICh3aGljaCkgewotCQlzaGVsbGYoIllvdSBoYXZlICVzJXMlcyBqb2JzXG4iLAotCQkgICAgd2hpY2ggJiAxID8gInN0b3BwZWQiIDogIiIsCi0JCSAgICB3aGljaCA9PSAzID8gIiBhbmQgIiA6ICIiLAotCQkgICAgd2hpY2ggJiAyID8gInJ1bm5pbmciIDogIiIpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLWludAotal9uam9icyh2b2lkKQotewotCUpvYiAqajsKLQlpbnQgbmogPSAwOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpCi0JCW5qKys7Ci0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQlyZXR1cm4gKG5qKTsKLX0KLQotCi0vKiBsaXN0IGpvYnMgZm9yIGpvYnMgYnVpbHQtaW4gKi8KLWludAotal9qb2JzKGNvbnN0IGNoYXIgKmNwLCBpbnQgc2xwLAotICAgIGludCBuZmxhZykJCS8qIDA6IHNob3J0LCAxOiBsb25nLCAyOiBwZ3JwICovCi17Ci0JSm9iCSpqLCAqdG1wOwotCWludAlob3c7Ci0JaW50CXpmbGFnID0gMDsKLQlzaWdzZXRfdCBvbWFzazsKLQotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7Ci0KLQlpZiAobmZsYWcgPCAwKSB7IC8qIGtsdWRnZTogcHJpbnQgem9tYmllcyAqLwotCQluZmxhZyA9IDA7Ci0JCXpmbGFnID0gMTsKLQl9Ci0JaWYgKGNwKSB7Ci0JCWludAllY29kZTsKLQotCQlpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkgPT0gTlVMTCkgewotCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Ci0JCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCX0gZWxzZQotCQlqID0gam9iX2xpc3Q7Ci0JaG93ID0gc2xwID09IDAgPyBKUF9NRURJVU0gOiAoc2xwID09IDEgPyBKUF9MT05HIDogSlBfUEdSUCk7Ci0JZm9yICg7IGo7IGogPSBqLT5uZXh0KSB7Ci0JCWlmICgoIShqLT5mbGFncyAmIEpGX1pPTUJJRSkgfHwgemZsYWcpICYmCi0JCSAgICAoIW5mbGFnIHx8IChqLT5mbGFncyAmIEpGX0NIQU5HRUQpKSkgewotCQkJal9wcmludChqLCBob3csIHNobF9zdGRvdXQpOwotCQkJaWYgKGotPnN0YXRlID09IFBFWElURUQgfHwgai0+c3RhdGUgPT0gUFNJR05BTExFRCkKLQkJCQlqLT5mbGFncyB8PSBKRl9SRU1PVkU7Ci0JCX0KLQkJaWYgKGNwKQotCQkJYnJlYWs7Ci0JfQotCS8qIFJlbW92ZSBqb2JzIGFmdGVyIHByaW50aW5nIHNvIHRoZXJlIHdvbid0IGJlIG11bHRpcGxlICsgb3IgLSBqb2JzICovCi0JZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSB0bXApIHsKLQkJdG1wID0gai0+bmV4dDsKLQkJaWYgKGotPmZsYWdzICYgSkZfUkVNT1ZFKQotCQkJcmVtb3ZlX2pvYihqLCAiam9icyIpOwotCX0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKiBsaXN0IGpvYnMgZm9yIHRvcC1sZXZlbCBub3RpZmljYXRpb24gKi8KLXZvaWQKLWpfbm90aWZ5KHZvaWQpCi17Ci0JSm9iCSpqLCAqdG1wOwotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpIHsKLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCWlmIChGbGFnKEZNT05JVE9SKSAmJiAoai0+ZmxhZ3MgJiBKRl9DSEFOR0VEKSkKLQkJCWpfcHJpbnQoaiwgSlBfTUVESVVNLCBzaGxfb3V0KTsKLSNlbmRpZgotCQkvKiBSZW1vdmUgam9iIGFmdGVyIGRvaW5nIHJlcG9ydHMgc28gdGhlcmUgYXJlbid0Ci0JCSAqIG11bHRpcGxlICsvLSBqb2JzLgotCQkgKi8KLQkJaWYgKGotPnN0YXRlID09IFBFWElURUQgfHwgai0+c3RhdGUgPT0gUFNJR05BTExFRCkKLQkJCWotPmZsYWdzIHw9IEpGX1JFTU9WRTsKLQl9Ci0JZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSB0bXApIHsKLQkJdG1wID0gai0+bmV4dDsKLQkJaWYgKGotPmZsYWdzICYgSkZfUkVNT1ZFKQotCQkJcmVtb3ZlX2pvYihqLCAibm90aWZ5Iik7Ci0JfQotCXNoZl9mbHVzaChzaGxfb3V0KTsKLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLX0KLQotLyogUmV0dXJuIHBpZCBvZiBsYXN0IHByb2Nlc3MgaW4gbGFzdCBhc3luY2hyb25vdXMgam9iICovCi1waWRfdAotal9hc3luYyh2b2lkKQotewotCXNpZ3NldF90IG9tYXNrOwotCi0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKLQotCWlmIChhc3luY19qb2IpCi0JCWFzeW5jX2pvYi0+ZmxhZ3MgfD0gSkZfS05PV047Ci0KLQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKLQotCXJldHVybiAoYXN5bmNfcGlkKTsKLX0KLQotLyoKLSAqIE1ha2UgaiB0aGUgbGFzdCBhc3luYyBwcm9jZXNzCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1qX3NldF9hc3luYyhKb2IgKmopCi17Ci0JSm9iCSpqbCwgKm9sZGVzdDsKLQotCWlmIChhc3luY19qb2IgJiYgKGFzeW5jX2pvYi0+ZmxhZ3MgJiAoSkZfS05PV058SkZfWk9NQklFKSkgPT0gSkZfWk9NQklFKQotCQlyZW1vdmVfam9iKGFzeW5jX2pvYiwgImFzeW5jIik7Ci0JaWYgKCEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgewotCQlpbnRlcm5hbF93YXJuaW5nZigial9hc3luYzogam9iIG5vdCBzdGFydGVkIik7Ci0JCXJldHVybjsKLQl9Ci0JYXN5bmNfam9iID0gajsKLQlhc3luY19waWQgPSBqLT5sYXN0X3Byb2MtPnBpZDsKLQl3aGlsZSAobnpvbWJpZSA+IENISUxEX01BWCkgewotCQlvbGRlc3QgPSBOVUxMOwotCQlmb3IgKGpsID0gam9iX2xpc3Q7IGpsOyBqbCA9IGpsLT5uZXh0KQotCQkJaWYgKGpsICE9IGFzeW5jX2pvYiAmJiAoamwtPmZsYWdzICYgSkZfWk9NQklFKSAmJgotCQkJICAgICghb2xkZXN0IHx8IGpsLT5hZ2UgPCBvbGRlc3QtPmFnZSkpCi0JCQkJb2xkZXN0ID0gamw7Ci0JCWlmICghb2xkZXN0KSB7Ci0JCQkvKiBYWFggZGVidWdnaW5nICovCi0JCQlpZiAoIShhc3luY19qb2ItPmZsYWdzICYgSkZfWk9NQklFKSB8fCBuem9tYmllICE9IDEpIHsKLQkJCQlpbnRlcm5hbF93YXJuaW5nZigial9hc3luYzogYmFkIG56b21iaWUgKCVkKSIsCi0JCQkJICAgIG56b21iaWUpOwotCQkJCW56b21iaWUgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmVtb3ZlX2pvYihvbGRlc3QsICJ6b21iaWUiKTsKLQl9Ci19Ci0KLS8qCi0gKiBTdGFydCBhIGpvYjogc2V0IFNUQVJURUQsIGNoZWNrIGZvciBoZWxkIHNpZ25hbHMgYW5kIHNldCBqLT5sYXN0X3Byb2MKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLWpfc3RhcnRqb2IoSm9iICpqKQotewotCVByb2MJKnA7Ci0KLQlqLT5mbGFncyB8PSBKRl9TVEFSVEVEOwotCWZvciAocCA9IGotPnByb2NfbGlzdDsgcC0+bmV4dDsgcCA9IHAtPm5leHQpCi0JCTsKLQlqLT5sYXN0X3Byb2MgPSBwOwotCi0JaWYgKGhlbGRfc2lnY2hsZCkgewotCQloZWxkX3NpZ2NobGQgPSAwOwotCQkvKiBEb24ndCBjYWxsIGpfc2lnY2hsZCgpIGFzIGl0IG1heSByZW1vdmUgam9iLi4uICovCi0JCWtpbGwocHJvY3BpZCwgU0lHQ0hMRCk7Ci0JfQotfQotCi0vKgotICogd2FpdCBmb3Igam9iIHRvIGNvbXBsZXRlIG9yIGNoYW5nZSBzdGF0ZQotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgaW50Ci1qX3dhaXRqKEpvYiAqaiwKLSAgICBpbnQgZmxhZ3MsCQkJLyogc2VlIEpXXyogKi8KLSAgICBjb25zdCBjaGFyICp3aGVyZSkKLXsKLQlpbnQJcnY7Ci0KLQkvKgotCSAqIE5vIGF1dG8tbm90aWZ5IG9uIHRoZSBqb2Igd2UgYXJlIHdhaXRpbmcgb24uCi0JICovCi0Jai0+ZmxhZ3MgfD0gSkZfV0FJVElORzsKLQlpZiAoZmxhZ3MgJiBKV19BU1lOQ05PVElGWSkKLQkJai0+ZmxhZ3MgfD0gSkZfV19BU1lOQ05PVElGWTsKLQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQlpZiAoIUZsYWcoRk1PTklUT1IpKQotI2VuZGlmCi0JCWZsYWdzIHw9IEpXX1NUT1BQRURXQUlUOwotCi0Jd2hpbGUgKGotPnN0YXRlID09IFBSVU5OSU5HIHx8Ci0JICAgICgoZmxhZ3MgJiBKV19TVE9QUEVEV0FJVCkgJiYgai0+c3RhdGUgPT0gUFNUT1BQRUQpKSB7Ci0JCXNpZ3N1c3BlbmQoJnNtX2RlZmF1bHQpOwotCQlpZiAoZmF0YWxfdHJhcCkgewotCQkJaW50IG9sZGYgPSBqLT5mbGFncyAmIChKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOwotCQkJai0+ZmxhZ3MgJj0gfihKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOwotCQkJcnVudHJhcHMoVEZfRkFUQUwpOwotCQkJai0+ZmxhZ3MgfD0gb2xkZjsgLyogbm90IHJlYWNoZWQuLi4gKi8KLQkJfQotCQlpZiAoKGZsYWdzICYgSldfSU5URVJSVVBUKSAmJiAocnYgPSB0cmFwX3BlbmRpbmcoKSkpIHsKLQkJCWotPmZsYWdzICY9IH4oSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKLQkJCXJldHVybiAoLXJ2KTsKLQkJfQotCX0KLQlqLT5mbGFncyAmPSB+KEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7Ci0KLQlpZiAoai0+ZmxhZ3MgJiBKRl9GRykgewotCQlqLT5mbGFncyAmPSB+SkZfRkc7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgdHR5cGdycF9vayAmJiBqLT5wZ3JwKSB7Ci0JCQkvKgotCQkJICogU2F2ZSB0aGUgdHR5J3MgY3VycmVudCBwZ3JwIHNvIGl0IGNhbiBiZSByZXN0b3JlZAotCQkJICogd2hlbiB0aGUgam9iIGlzIGZvcmVncm91bmRlZC4gVGhpcyBpcyB0bwotCQkJICogZGVhbCB3aXRoIHRoaW5ncyBsaWtlIHRoZSBHTlUgc3Ugd2hpY2ggZG9lcwotCQkJICogYSBmb3JrL2V4ZWMgaW5zdGVhZCBvZiBhbiBleGVjICh0aGUgZm9yayBtZWFucwotCQkJICogdGhlIGV4ZWNlZCBzaGVsbCBnZXRzIGEgZGlmZmVyZW50IHBpZCBmcm9tIGl0cwotCQkJICogcGdycCwgc28gbmF0dXJhbGx5IGl0IHNldHMgaXRzIHBncnAgYW5kIGdldHMgaG9zZWQKLQkJCSAqIHdoZW4gaXQgZ2V0cyBmb3JlZ3JvdW5kZWQgYnkgdGhlIHBhcmVudCBzaGVsbCB3aGljaAotCQkJICogaGFzIHJlc3RvcmVkIHRoZSB0dHkncyBwZ3JwIHRvIHRoYXQgb2YgdGhlIHN1Ci0JCQkgKiBwcm9jZXNzKS4KLQkJCSAqLwotCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEICYmCi0JCQkgICAgKGotPnNhdmVkX3R0eXBncnAgPSB0Y2dldHBncnAodHR5X2ZkKSkgPj0gMCkKLQkJCQlqLT5mbGFncyB8PSBKRl9TQVZFRFRUWVBHUlA7Ci0JCQlpZiAodGNzZXRwZ3JwKHR0eV9mZCwga3NocGdycCkgPCAwKQotCQkJCXdhcm5pbmdmKHRydWUsCi0JCQkJICAgICJqX3dhaXRqOiB0Y3NldHBncnAoJWQsICVsZCkgZmFpbGVkOiAlcyIsCi0JCQkJICAgIHR0eV9mZCwgKGxvbmcpa3NocGdycCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkgewotCQkJCWotPmZsYWdzIHw9IEpGX1NBVkVEVFRZOwotCQkJCXRjZ2V0YXR0cih0dHlfZmQsICZqLT50dHlzdGF0ZSk7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlpZiAodHR5X2ZkID49IDApIHsKLQkJCS8qCi0JCQkgKiBPbmx5IHJlc3RvcmUgdHR5IHNldHRpbmdzIGlmIGpvYiB3YXMgb3JpZ2luYWxseQotCQkJICogc3RhcnRlZCBpbiB0aGUgZm9yZWdyb3VuZC4gUHJvYmxlbXMgY2FuIGJlCi0JCQkgKiBjYXVzZWQgYnkgdGhpbmdzIGxpa2UgJ21vcmUgZm9vYmFyICYnIHdoaWNoIHdpbGwKLQkJCSAqIHR5cGljYWxseSBnZXQgYW5kIHNhdmUgdGhlIHNoZWxsJ3MgdmkvZW1hY3MgdHR5Ci0JCQkgKiBzZXR0aW5ncyBiZWZvcmUgc2V0dGluZyB1cCB0aGUgdHR5IGZvciBpdHNlbGY7Ci0JCQkgKiB3aGVuIG1vcmUgZXhpdHMsIGl0IHJlc3RvcmVzIHRoZSAnb3JpZ2luYWwnCi0JCQkgKiBzZXR0aW5ncywgYW5kIHRoaW5ncyBnbyBkb3duIGhpbGwgZnJvbSB0aGVyZS4uLgotCQkJICovCi0JCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCAmJiBqLT5zdGF0dXMgPT0gMCAmJgotCQkJICAgIChqLT5mbGFncyAmIEpGX1VTRVRUWU1PREUpKSB7Ci0JCQkJdGNnZXRhdHRyKHR0eV9mZCwgJnR0eV9zdGF0ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7Ci0JCQkJLyotCi0JCQkJICogRG9uJ3QgdXNlIHR0eSBtb2RlIGlmIGpvYiBpcyBzdG9wcGVkIGFuZAotCQkJCSAqIGxhdGVyIHJlc3RhcnRlZCBhbmQgZXhpdHMuIENvbnNpZGVyCi0JCQkJICogdGhlIHNlcXVlbmNlOgotCQkJCSAqCXZpIGZvbyAoc3RvcHBlZCkKLQkJCQkgKgkuLi4KLQkJCQkgKglzdHR5IHNvbWV0aGluZwotCQkJCSAqCS4uLgotCQkJCSAqCWZnICh2aTsgWlopCi0JCQkJICogbW9kZSBzaG91bGQgYmUgdGhhdCBvZiB0aGUgc3R0eSwgbm90IHdoYXQKLQkJCQkgKiB3YXMgYmVmb3JlIHRoZSB2aSBzdGFydGVkLgotCQkJCSAqLwotCQkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkKLQkJCQkJai0+ZmxhZ3MgJj0gfkpGX1VTRVRUWU1PREU7Ci0JCQl9Ci0JCX0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JCS8qCi0JCSAqIElmIGl0IGxvb2tzIGxpa2UgdXNlciBoaXQgXkMgdG8ga2lsbCBhIGpvYiwgcHJldGVuZCB3ZSBnb3QKLQkJICogb25lIHRvbyB0byBicmVhayBvdXQgb2YgZm9yIGxvb3BzLCBldGMuIChBVCZUIGtzaCBkb2VzIHRoaXMKLQkJICogZXZlbiB3aGVuIG5vdCBtb25pdG9yaW5nLCBidXQgdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UKLQkJICogYSB0dHkgZ2VuZXJhdGVkIF5DIGdvZXMgdG8gdGhlIHdob2xlIHByb2Nlc3MgZ3JvdXApCi0JCSAqLwotCQl7Ci0JCQlpbnQgc3RhdHVzOwotCi0JCQlzdGF0dXMgPSBqLT5sYXN0X3Byb2MtPnN0YXR1czsKLQkJCWlmIChGbGFnKEZNT05JVE9SKSAmJiBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEICYmCi0JCQkgICAgV0lGU0lHTkFMRUQoc3RhdHVzKSAmJgotCQkJICAgIChzaWd0cmFwc1tXVEVSTVNJRyhzdGF0dXMpXS5mbGFncyAmIFRGX1RUWV9JTlRSKSkKLQkJCQl0cmFwc2lnKFdURVJNU0lHKHN0YXR1cykpOwotCQl9Ci0jZW5kaWYKLQl9Ci0KLQlqX3VzcnRpbWUgPSBqLT51c3J0aW1lOwotCWpfc3lzdGltZSA9IGotPnN5c3RpbWU7Ci0JcnYgPSBqLT5zdGF0dXM7Ci0KLQlpZiAoIShmbGFncyAmIEpXX0FTWU5DTk9USUZZKQotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkgICAgJiYgKCFGbGFnKEZNT05JVE9SKSB8fCBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkKLSNlbmRpZgotCSAgICApIHsKLQkJal9wcmludChqLCBKUF9TSE9SVCwgc2hsX291dCk7Ci0JCXNoZl9mbHVzaChzaGxfb3V0KTsKLQl9Ci0JaWYgKGotPnN0YXRlICE9IFBTVE9QUEVECi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCSAgICAmJiAoIUZsYWcoRk1PTklUT1IpIHx8ICEoZmxhZ3MgJiBKV19BU1lOQ05PVElGWSkpCi0jZW5kaWYKLQkgICAgKQotCQlyZW1vdmVfam9iKGosIHdoZXJlKTsKLQotCXJldHVybiAocnYpOwotfQotCi0vKgotICogU0lHQ0hMRCBoYW5kbGVyIHRvIHJlYXAgY2hpbGRyZW4gYW5kIHVwZGF0ZSBqb2Igc3RhdGVzCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotal9zaWdjaGxkKGludCBzaWcgTUtTSF9BX1VOVVNFRCkKLXsKLQkvKiB0aGlzIHJ1bnMgaW5zaWRlIGludGVycnVwdCBjb250ZXh0LCB3aXRoIGVycm5vIHNhdmVkICovCi0KLQlKb2IgKmo7Ci0JUHJvYyAqcCA9IE5VTEw7Ci0JcGlkX3QgcGlkOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IHJ1c2FnZSBydTAsIHJ1MTsKLQotCS8qCi0JICogRG9uJ3Qgd2FpdCBmb3IgYW55IHByb2Nlc3NlcyBpZiBhIGpvYiBpcyBwYXJ0aWFsbHkgc3RhcnRlZC4KLQkgKiBUaGlzIGlzIHNvIHdlIGRvbid0IGRvIGF3YXkgd2l0aCB0aGUgcHJvY2VzcyBncm91cCBsZWFkZXIKLQkgKiBiZWZvcmUgYWxsIHRoZSBwcm9jZXNzZXMgaW4gYSBwaXBlIGxpbmUgYXJlIHN0YXJ0ZWQgKHNvIHRoZQotCSAqIHNldHBnaWQoKSB3b24ndCBmYWlsKQotCSAqLwotCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKLQkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJiAhKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKLQkJCWhlbGRfc2lnY2hsZCA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydTApOwotCWRvIHsKLQkJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgKFdOT0hBTkd8V1VOVFJBQ0VEKSk7Ci0KLQkJLyoKLQkJICogcmV0dXJuIGlmIHRoaXMgd291bGQgYmxvY2sgKDApIG9yIG5vIGNoaWxkcmVuCi0JCSAqIG9yIGludGVycnVwdGVkICgtMSkKLQkJICovCi0JCWlmIChwaWQgPD0gMCkKLQkJCXJldHVybjsKLQotCQlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmcnUxKTsKLQotCQkvKiBmaW5kIGpvYiBhbmQgcHJvY2VzcyBzdHJ1Y3R1cmVzIGZvciB0aGlzIHBpZCAqLwotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKLQkJCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJCQlpZiAocC0+cGlkID09IHBpZCkKLQkJCQkJZ290byBmb3VuZDsKLSBmb3VuZDoKLQkJaWYgKGogPT0gTlVMTCkgewotCQkJLyogQ2FuIG9jY3VyIGlmIHByb2Nlc3MgaGFzIGtpZHMsIHRoZW4gZXhlY3Mgc2hlbGwKLQkJCXdhcm5pbmdmKHRydWUsICJiYWQgcHJvY2VzcyB3YWl0ZWQgZm9yIChwaWQgPSAlZCkiLAotCQkJCXBpZCk7Ci0JCQkgKi8KLQkJCXJ1MCA9IHJ1MTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJdGltZXJhZGQoJmotPnVzcnRpbWUsICZydTEucnVfdXRpbWUsICZqLT51c3J0aW1lKTsKLQkJdGltZXJzdWIoJmotPnVzcnRpbWUsICZydTAucnVfdXRpbWUsICZqLT51c3J0aW1lKTsKLQkJdGltZXJhZGQoJmotPnN5c3RpbWUsICZydTEucnVfc3RpbWUsICZqLT5zeXN0aW1lKTsKLQkJdGltZXJzdWIoJmotPnN5c3RpbWUsICZydTAucnVfc3RpbWUsICZqLT5zeXN0aW1lKTsKLQkJcnUwID0gcnUxOwotCQlwLT5zdGF0dXMgPSBzdGF0dXM7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQotCQkJcC0+c3RhdGUgPSBQU1RPUFBFRDsKLQkJZWxzZQotI2VuZGlmCi0JCSAgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCi0JCQlwLT5zdGF0ZSA9IFBTSUdOQUxMRUQ7Ci0JCWVsc2UKLQkJCXAtPnN0YXRlID0gUEVYSVRFRDsKLQotCQljaGVja19qb2Ioaik7CS8qIGNoZWNrIHRvIHNlZSBpZiBlbnRpcmUgam9iIGlzIGRvbmUgKi8KLQl9IHdoaWxlICgxKTsKLX0KLQotLyoKLSAqIENhbGxlZCBvbmx5IHdoZW4gYSBwcm9jZXNzIGluIGogaGFzIGV4aXRlZC9zdG9wcGVkIChpZSwgY2FsbGVkIG9ubHkKLSAqIGZyb20gal9zaWdjaGxkKCkpLiBJZiBubyBwcm9jZXNzZXMgYXJlIHJ1bm5pbmcsIHRoZSBqb2Igc3RhdHVzCi0gKiBhbmQgc3RhdGUgYXJlIHVwZGF0ZWQsIGFzeW5jaHJvbm91cyBqb2Igbm90aWZpY2F0aW9uIGlzIGRvbmUgYW5kLAotICogaWYgdW5uZWVkZWQsIHRoZSBqb2IgaXMgcmVtb3ZlZC4KLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLWNoZWNrX2pvYihKb2IgKmopCi17Ci0JaW50CWpzdGF0ZTsKLQlQcm9jCSpwOwotCi0JLyogWFhYIGRlYnVnZ2luZyAobmFzdHkgLSBpbnRlcnJ1cHQgcm91dGluZSB1c2luZyBzaGxfb3V0KSAqLwotCWlmICghKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKLQkJaW50ZXJuYWxfd2FybmluZ2YoImNoZWNrX2pvYjogam9iIHN0YXJ0ZWQgKGZsYWdzIDB4JXgpIiwKLQkJICAgIGotPmZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWpzdGF0ZSA9IFBSVU5OSU5HOwotCWZvciAocD1qLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKLQkJaWYgKHAtPnN0YXRlID09IFBSVU5OSU5HKQotCQkJcmV0dXJuOwkvKiBzb21lIHByb2Nlc3NlcyBzdGlsbCBydW5uaW5nICovCi0JCWlmIChwLT5zdGF0ZSA+IGpzdGF0ZSkKLQkJCWpzdGF0ZSA9IHAtPnN0YXRlOwotCX0KLQlqLT5zdGF0ZSA9IGpzdGF0ZTsKLQotCXN3aXRjaCAoai0+bGFzdF9wcm9jLT5zdGF0ZSkgewotCWNhc2UgUEVYSVRFRDoKLQkJai0+c3RhdHVzID0gV0VYSVRTVEFUVVMoai0+bGFzdF9wcm9jLT5zdGF0dXMpOwotCQlicmVhazsKLQljYXNlIFBTSUdOQUxMRUQ6Ci0JCWotPnN0YXR1cyA9IDEyOCArIFdURVJNU0lHKGotPmxhc3RfcHJvYy0+c3RhdHVzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJai0+c3RhdHVzID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBOb3RlIHdoZW4gY28tcHJvY2VzcyBkaWVzOiBjYW4ndCBiZSBkb25lIGluIGpfd2FpdCgpIG5vcgotCSAqIHJlbW92ZV9qb2IoKSBzaW5jZSBuZWl0aGVyIG1heSBiZSBjYWxsZWQgZm9yIG5vbi1pbnRlcmFjdGl2ZQotCSAqIHNoZWxscy4KLQkgKi8KLQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKSB7Ci0JCS8qCi0JCSAqIE5vIG5lZWQgdG8ga2VlcCBjby1wcm9jZXNzIGlucHV0IGFueSBtb3JlCi0JCSAqIChhdCBsZWFzdCwgdGhpcyBpcyB3aGF0IGtzaDkzZCB0aGlua3MpCi0JCSAqLwotCQlpZiAoY29wcm9jLmpvYiA9PSBqKSB7Ci0JCQljb3Byb2Muam9iID0gTlVMTDsKLQkJCS8qCi0JCQkgKiBYWFggd291bGQgYmUgbmljZSB0byBnZXQgdGhlIGNsb3NlcyBvdXQgb2YgaGVyZQotCQkJICogc28gdGhleSBhcmVuJ3QgZG9uZSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIuCi0JCQkgKiBXb3VsZCBtZWFuIGEgY2hlY2sgaW4gY29wcm9jX2dldGZkKCkgdG8KLQkJCSAqIGRvICJpZiBqb2IgPT0gMCAmJiB3cml0ZSA+PSAwLCBjbG9zZSB3cml0ZSIuCi0JCQkgKi8KLQkJCWNvcHJvY193cml0ZV9jbG9zZShjb3Byb2Mud3JpdGUpOwotCQl9Ci0JCS8qIERvIHdlIG5lZWQgdG8ga2VlcCB0aGUgb3V0cHV0PyAqLwotCQlpZiAoai0+Y29wcm9jX2lkICYmIGotPmNvcHJvY19pZCA9PSBjb3Byb2MuaWQgJiYKLQkJICAgIC0tY29wcm9jLm5qb2JzID09IDApCi0JCQljb3Byb2NfcmVhZHdfY2xvc2UoY29wcm9jLnJlYWQpOwotCX0KLQotCWotPmZsYWdzIHw9IEpGX0NIQU5HRUQ7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGotPmZsYWdzICYgSkZfWFhDT00pKSB7Ci0JCS8qCi0JCSAqIE9ubHkgcHV0IHN0b3BwZWQgam9icyBhdCB0aGUgZnJvbnQgdG8gYXZvaWQgY29uZnVzaW5nCi0JCSAqIHRoZSB1c2VyIChkb24ndCB3YW50IGZpbmlzaGVkIGpvYnMgZWZmZWN0aW5nICUrIG9yICUtKQotCQkgKi8KLQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKQotCQkJcHV0X2pvYihqLCBQSl9PTl9GUk9OVCk7Ci0JCWlmIChGbGFnKEZOT1RJRlkpICYmCi0JCSAgICAoai0+ZmxhZ3MgJiAoSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKSkgIT0gSkZfV0FJVElORykgewotCQkJLyogTG9vayBmb3IgdGhlIHJlYWwgZmlsZSBkZXNjcmlwdG9yIDIgKi8KLQkJCXsKLQkJCQlzdHJ1Y3QgZW52ICplcDsKLQkJCQlpbnQgZmQgPSAyOwotCi0JCQkJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQotCQkJCQlpZiAoZXAtPnNhdmVmZCAmJiBlcC0+c2F2ZWZkWzJdKQotCQkJCQkJZmQgPSBlcC0+c2F2ZWZkWzJdOwotCQkJCXNoZl9yZW9wZW4oZmQsIFNIRl9XUiwgc2hsX2opOwotCQkJfQotCQkJLyoKLQkJCSAqIENhbid0IGNhbGwgal9ub3RpZnkoKSBhcyBpdCByZW1vdmVzIGpvYnMuIFRoZSBqb2IKLQkJCSAqIG11c3Qgc3RheSBpbiB0aGUgam9iIGxpc3QgYXMgal93YWl0aigpIG1heSBiZQotCQkJICogcnVubmluZyB3aXRoIHRoaXMgam9iLgotCQkJICovCi0JCQlqX3ByaW50KGosIEpQX01FRElVTSwgc2hsX2opOwotCQkJc2hmX2ZsdXNoKHNobF9qKTsKLQkJCWlmICghKGotPmZsYWdzICYgSkZfV0FJVElORykgJiYgai0+c3RhdGUgIT0gUFNUT1BQRUQpCi0JCQkJcmVtb3ZlX2pvYihqLCAibm90aWZ5Iik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlpZiAoCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotCSAgICAhRmxhZyhGTU9OSVRPUikgJiYKLSNlbmRpZgotCSAgICAhKGotPmZsYWdzICYgKEpGX1dBSVRJTkd8SkZfRkcpKSAmJgotCSAgICBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkgewotCQlpZiAoaiA9PSBhc3luY19qb2IgfHwgKGotPmZsYWdzICYgSkZfS05PV04pKSB7Ci0JCQlqLT5mbGFncyB8PSBKRl9aT01CSUU7Ci0JCQlqLT5qb2IgPSAtMTsKLQkJCW56b21iaWUrKzsKLQkJfSBlbHNlCi0JCQlyZW1vdmVfam9iKGosICJjaGVja2pvYiIpOwotCX0KLX0KLQotLyoKLSAqIFByaW50IGpvYiBzdGF0dXMgaW4gZWl0aGVyIHNob3J0LCBtZWRpdW0gb3IgbG9uZyBmb3JtYXQuCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1qX3ByaW50KEpvYiAqaiwgaW50IGhvdywgc3RydWN0IHNoZiAqc2hmKQotewotCVByb2MJKnA7Ci0JaW50CXN0YXRlOwotCWludAlzdGF0dXM7Ci0JaW50CWNvcmVkdW1wZWQ7Ci0JY2hhcglqb2JjaGFyID0gJyAnOwotCWNoYXIJYnVmWzY0XTsKLQljb25zdCBjaGFyICpmaWxsZXI7Ci0JaW50CW91dHB1dCA9IDA7Ci0KLQlpZiAoaG93ID09IEpQX1BHUlApIHsKLQkJLyoKLQkJICogUE9TSVggZG9lc24ndCBzYXkgd2hhdCB0byBkbyBpdCB0aGVyZSBpcyBubyBwcm9jZXNzCi0JCSAqIGdyb3VwIGxlYWRlciAoaWUsICFGTU9OSVRPUikuIFdlIGFyYml0cmFyaWx5IHJldHVybgotCQkgKiBsYXN0IHBpZCAod2hpY2ggaXMgd2hhdCAkISByZXR1cm5zKS4KLQkJICovCi0JCXNoZl9mcHJpbnRmKHNoZiwgIiVkXG4iLCAoaW50KShqLT5wZ3JwID8gai0+cGdycCA6Ci0JCSAgICAoai0+bGFzdF9wcm9jID8gai0+bGFzdF9wcm9jLT5waWQgOiAwKSkpOwotCQlyZXR1cm47Ci0JfQotCWotPmZsYWdzICY9IH5KRl9DSEFOR0VEOwotCWZpbGxlciA9IGotPmpvYiA+IDEwID8gIlxuICAgICAgICIgOiAiXG4gICAgICAiOwotCWlmIChqID09IGpvYl9saXN0KQotCQlqb2JjaGFyID0gJysnOwotCWVsc2UgaWYgKGogPT0gam9iX2xpc3QtPm5leHQpCi0JCWpvYmNoYXIgPSAnLSc7Ci0KLQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDspIHsKLQkJY29yZWR1bXBlZCA9IDA7Ci0JCXN3aXRjaCAocC0+c3RhdGUpIHsKLQkJY2FzZSBQUlVOTklORzoKLQkJCW1lbWNweShidWYsICJSdW5uaW5nIiwgOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQU1RPUFBFRDoKLQkJCXN0cmxjcHkoYnVmLCBzaWd0cmFwc1tXU1RPUFNJRyhwLT5zdGF0dXMpXS5tZXNzLAotCQkJICAgIHNpemVvZihidWYpKTsKLQkJCWJyZWFrOwotCQljYXNlIFBFWElURUQ6Ci0JCQlpZiAoaG93ID09IEpQX1NIT1JUKQotCQkJCWJ1ZlswXSA9ICdcMCc7Ci0JCQllbHNlIGlmIChXRVhJVFNUQVRVUyhwLT5zdGF0dXMpID09IDApCi0JCQkJbWVtY3B5KGJ1ZiwgIkRvbmUiLCA1KTsKLQkJCWVsc2UKLQkJCQlzaGZfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkRvbmUgKCVkKSIsCi0JCQkJICAgIFdFWElUU1RBVFVTKHAtPnN0YXR1cykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFNJR05BTExFRDoKLSNpZmRlZiBXQ09SRURVTVAKLQkJCWlmIChXQ09SRURVTVAocC0+c3RhdHVzKSkKLQkJCQljb3JlZHVtcGVkID0gMTsKLSNlbmRpZgotCQkJLyoKLQkJCSAqIGtsdWRnZSBmb3Igbm90IHJlcG9ydGluZyAnbm9ybWFsIHRlcm1pbmF0aW9uCi0JCQkgKiBzaWduYWxzJyAoaS5lLiBTSUdJTlQsIFNJR1BJUEUpCi0JCQkgKi8KLQkJCWlmIChob3cgPT0gSlBfU0hPUlQgJiYgIWNvcmVkdW1wZWQgJiYKLQkJCSAgICAoV1RFUk1TSUcocC0+c3RhdHVzKSA9PSBTSUdJTlQgfHwKLQkJCSAgICBXVEVSTVNJRyhwLT5zdGF0dXMpID09IFNJR1BJUEUpKSB7Ci0JCQkJYnVmWzBdID0gJ1wwJzsKLQkJCX0gZWxzZQotCQkJCXN0cmxjcHkoYnVmLCBzaWd0cmFwc1tXVEVSTVNJRyhwLT5zdGF0dXMpXS5tZXNzLAotCQkJCSAgICBzaXplb2YoYnVmKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChob3cgIT0gSlBfU0hPUlQpIHsKLQkJCWlmIChwID09IGotPnByb2NfbGlzdCkKLQkJCQlzaGZfZnByaW50ZihzaGYsICJbJWRdICVjICIsIGotPmpvYiwgam9iY2hhcik7Ci0JCQllbHNlCi0JCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMiLCBmaWxsZXIpOwotCQl9Ci0KLQkJaWYgKGhvdyA9PSBKUF9MT05HKQotCQkJc2hmX2ZwcmludGYoc2hmLCAiJTVkICIsIChpbnQpcC0+cGlkKTsKLQotCQlpZiAoaG93ID09IEpQX1NIT1JUKSB7Ci0JCQlpZiAoYnVmWzBdKSB7Ci0JCQkJb3V0cHV0ID0gMTsKLQkJCQlzaGZfZnByaW50ZihzaGYsICIlcyVzICIsCi0JCQkJICAgIGJ1ZiwgY29yZWR1bXBlZCA/ICIgKGNvcmUgZHVtcGVkKSIgOiBudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW91dHB1dCA9IDE7Ci0JCQlzaGZfZnByaW50ZihzaGYsICIlLTIwcyAlcyVzJXMiLCBidWYsIHAtPmNvbW1hbmQsCi0JCQkgICAgcC0+bmV4dCA/ICJ8IiA6IG51bGwsCi0JCQkgICAgY29yZWR1bXBlZCA/ICIgKGNvcmUgZHVtcGVkKSIgOiBudWxsKTsKLQkJfQotCi0JCXN0YXRlID0gcC0+c3RhdGU7Ci0JCXN0YXR1cyA9IHAtPnN0YXR1czsKLQkJcCA9IHAtPm5leHQ7Ci0JCXdoaWxlIChwICYmIHAtPnN0YXRlID09IHN0YXRlICYmIHAtPnN0YXR1cyA9PSBzdGF0dXMpIHsKLQkJCWlmIChob3cgPT0gSlBfTE9ORykKLQkJCQlzaGZfZnByaW50ZihzaGYsICIlcyU1ZCAlLTIwcyAlcyVzIiwgZmlsbGVyLAotCQkJCSAgICAoaW50KXAtPnBpZCwgIiAiLCBwLT5jb21tYW5kLAotCQkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCk7Ci0JCQllbHNlIGlmIChob3cgPT0gSlBfTUVESVVNKQotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiAlcyVzIiwgcC0+Y29tbWFuZCwKLQkJCQkgICAgcC0+bmV4dCA/ICJ8IiA6IG51bGwpOwotCQkJcCA9IHAtPm5leHQ7Ci0JCX0KLQl9Ci0JaWYgKG91dHB1dCkKLQkJc2hmX3B1dGMoJ1xuJywgc2hmKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgJSBzZXF1ZW5jZSB0byBqb2IKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIEpvYiAqCi1qX2xvb2t1cChjb25zdCBjaGFyICpjcCwgaW50ICplY29kZXApCi17Ci0JSm9iCQkqaiwgKmxhc3RfbWF0Y2g7Ci0JUHJvYwkJKnA7Ci0JaW50CQlsZW4sIGpvYiA9IDA7Ci0KLQlpZiAoa3NoX2lzZGlnaXQoKmNwKSkgewotCQlnZXRuKGNwLCAmam9iKTsKLQkJLyogTG9vayBmb3IgbGFzdF9wcm9jLT5waWQgKHdoYXQgJCEgcmV0dXJucykgZmlyc3QuLi4gKi8KLQkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCi0JCQlpZiAoai0+bGFzdF9wcm9jICYmIGotPmxhc3RfcHJvYy0+cGlkID09IGpvYikKLQkJCQlyZXR1cm4gKGopOwotCQkvKgotCQkgKiAuLi50aGVuIGxvb2sgZm9yIHByb2Nlc3MgZ3JvdXAgKHRoaXMgaXMgbm9uLVBPU0lYLAotCQkgKiBidXQgc2hvdWxkIG5vdCBicmVhayBhbnl0aGluZwotCQkgKi8KLQkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCi0JCQlpZiAoai0+cGdycCAmJiBqLT5wZ3JwID09IGpvYikKLQkJCQlyZXR1cm4gKGopOwotCQlpZiAoZWNvZGVwKQotCQkJKmVjb2RlcCA9IEpMX05PU1VDSDsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JaWYgKCpjcCAhPSAnJScpIHsKLQkJaWYgKGVjb2RlcCkKLQkJCSplY29kZXAgPSBKTF9JTlZBTElEOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlzd2l0Y2ggKCorK2NwKSB7Ci0JY2FzZSAnXDAnOiAvKiBub24tc3RhbmRhcmQgKi8KLQljYXNlICcrJzoKLQljYXNlICclJzoKLQkJaWYgKGpvYl9saXN0ICE9IE5VTEwpCi0JCQlyZXR1cm4gKGpvYl9saXN0KTsKLQkJYnJlYWs7Ci0KLQljYXNlICctJzoKLQkJaWYgKGpvYl9saXN0ICE9IE5VTEwgJiYgam9iX2xpc3QtPm5leHQpCi0JCQlyZXR1cm4gKGpvYl9saXN0LT5uZXh0KTsKLQkJYnJlYWs7Ci0KLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQlnZXRuKGNwLCAmam9iKTsKLQkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCi0JCQlpZiAoai0+am9iID09IGpvYikKLQkJCQlyZXR1cm4gKGopOwotCQlicmVhazsKLQotCWNhc2UgJz8nOgkJLyogJT9zdHJpbmcgKi8KLQkJbGFzdF9tYXRjaCA9IE5VTEw7Ci0JCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQotCQkJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkJCWlmIChzdHJzdHIocC0+Y29tbWFuZCwgY3ArMSkgIT0gTlVMTCkgewotCQkJCQlpZiAobGFzdF9tYXRjaCkgewotCQkJCQkJaWYgKGVjb2RlcCkKLQkJCQkJCQkqZWNvZGVwID0gSkxfQU1CSUc7Ci0JCQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJCQl9Ci0JCQkJCWxhc3RfbWF0Y2ggPSBqOwotCQkJCX0KLQkJaWYgKGxhc3RfbWF0Y2gpCi0JCQlyZXR1cm4gKGxhc3RfbWF0Y2gpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6CQkvKiAlc3RyaW5nICovCi0JCWxlbiA9IHN0cmxlbihjcCk7Ci0JCWxhc3RfbWF0Y2ggPSBOVUxMOwotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKLQkJCWlmIChzdHJuY21wKGNwLCBqLT5wcm9jX2xpc3QtPmNvbW1hbmQsIGxlbikgPT0gMCkgewotCQkJCWlmIChsYXN0X21hdGNoKSB7Ci0JCQkJCWlmIChlY29kZXApCi0JCQkJCQkqZWNvZGVwID0gSkxfQU1CSUc7Ci0JCQkJCXJldHVybiAoTlVMTCk7Ci0JCQkJfQotCQkJCWxhc3RfbWF0Y2ggPSBqOwotCQkJfQotCQlpZiAobGFzdF9tYXRjaCkKLQkJCXJldHVybiAobGFzdF9tYXRjaCk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoZWNvZGVwKQotCQkqZWNvZGVwID0gSkxfTk9TVUNIOwotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXN0YXRpYyBKb2IJKmZyZWVfam9iczsKLXN0YXRpYyBQcm9jCSpmcmVlX3Byb2NzOwotCi0vKgotICogYWxsb2NhdGUgYSBuZXcgam9iIGFuZCBmaWxsIGluIHRoZSBqb2IgbnVtYmVyLgotICoKLSAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgotICovCi1zdGF0aWMgSm9iICoKLW5ld19qb2Iodm9pZCkKLXsKLQlpbnQJaTsKLQlKb2IJKm5ld2osICpqOwotCi0JaWYgKGZyZWVfam9icyAhPSBOVUxMKSB7Ci0JCW5ld2ogPSBmcmVlX2pvYnM7Ci0JCWZyZWVfam9icyA9IGZyZWVfam9icy0+bmV4dDsKLQl9IGVsc2UKLQkJbmV3aiA9IGFsbG9jKHNpemVvZihKb2IpLCBBUEVSTSk7Ci0KLQkvKiBicnV0ZSBmb3JjZSBtZXRob2QgKi8KLQlmb3IgKGkgPSAxOyA7IGkrKykgewotCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAmJiBqLT5qb2IgIT0gaTsgaiA9IGotPm5leHQpCi0JCQk7Ci0JCWlmIChqID09IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0JbmV3ai0+am9iID0gaTsKLQotCXJldHVybiAobmV3aik7Ci19Ci0KLS8qCi0gKiBBbGxvY2F0ZSBuZXcgcHJvY2VzcyBzdHJ1Y3QKLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIFByb2MgKgotbmV3X3Byb2Modm9pZCkKLXsKLQlQcm9jCSpwOwotCi0JaWYgKGZyZWVfcHJvY3MgIT0gTlVMTCkgewotCQlwID0gZnJlZV9wcm9jczsKLQkJZnJlZV9wcm9jcyA9IGZyZWVfcHJvY3MtPm5leHQ7Ci0JfSBlbHNlCi0JCXAgPSBhbGxvYyhzaXplb2YoUHJvYyksIEFQRVJNKTsKLQotCXJldHVybiAocCk7Ci19Ci0KLS8qCi0gKiBUYWtlIGpvYiBvdXQgb2Ygam9iX2xpc3QgYW5kIHB1dCBvbGQgc3RydWN0dXJlcyBpbnRvIGZyZWUgbGlzdC4KLSAqIEtlZXBzIG56b21iaWVzLCBsYXN0X2pvYiBhbmQgYXN5bmNfam9iIHVwIHRvIGRhdGUuCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1yZW1vdmVfam9iKEpvYiAqaiwgY29uc3QgY2hhciAqd2hlcmUpCi17Ci0JUHJvYwkqcCwgKnRtcDsKLQlKb2IJKipwcmV2LCAqY3VycjsKLQotCXByZXYgPSAmam9iX2xpc3Q7Ci0JY3VyciA9ICpwcmV2OwotCWZvciAoOyBjdXJyICE9IE5VTEwgJiYgY3VyciAhPSBqOyBwcmV2ID0gJmN1cnItPm5leHQsIGN1cnIgPSAqcHJldikKLQkJOwotCWlmIChjdXJyICE9IGopIHsKLQkJaW50ZXJuYWxfd2FybmluZ2YoInJlbW92ZV9qb2I6IGpvYiBub3QgZm91bmQgKCVzKSIsIHdoZXJlKTsKLQkJcmV0dXJuOwotCX0KLQkqcHJldiA9IGN1cnItPm5leHQ7Ci0KLQkvKiBmcmVlIHVwIHByb2Mgc3RydWN0dXJlcyAqLwotCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyApIHsKLQkJdG1wID0gcDsKLQkJcCA9IHAtPm5leHQ7Ci0JCXRtcC0+bmV4dCA9IGZyZWVfcHJvY3M7Ci0JCWZyZWVfcHJvY3MgPSB0bXA7Ci0JfQotCi0JaWYgKChqLT5mbGFncyAmIEpGX1pPTUJJRSkgJiYgai0+cHBpZCA9PSBwcm9jcGlkKQotCQktLW56b21iaWU7Ci0Jai0+bmV4dCA9IGZyZWVfam9iczsKLQlmcmVlX2pvYnMgPSBqOwotCi0JaWYgKGogPT0gbGFzdF9qb2IpCi0JCWxhc3Rfam9iID0gTlVMTDsKLQlpZiAoaiA9PSBhc3luY19qb2IpCi0JCWFzeW5jX2pvYiA9IE5VTEw7Ci19Ci0KLS8qCi0gKiBwdXQgaiBpbiBhIHBhcnRpY3VsYXIgbG9jYXRpb24gKHRha2luZyBpdCBvdXQgam9iX2xpc3QgaWYgaXQgaXMgdGhlcmUKLSAqIGFscmVhZHkpCi0gKgotICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1wdXRfam9iKEpvYiAqaiwgaW50IHdoZXJlKQotewotCUpvYgkqKnByZXYsICpjdXJyOwotCi0JLyogUmVtb3ZlIGpvYiBmcm9tIGxpc3QgKGlmIHRoZXJlKSAqLwotCXByZXYgPSAmam9iX2xpc3Q7Ci0JY3VyciA9IGpvYl9saXN0OwotCWZvciAoOyBjdXJyICYmIGN1cnIgIT0gajsgcHJldiA9ICZjdXJyLT5uZXh0LCBjdXJyID0gKnByZXYpCi0JCTsKLQlpZiAoY3VyciA9PSBqKQotCQkqcHJldiA9IGN1cnItPm5leHQ7Ci0KLQlzd2l0Y2ggKHdoZXJlKSB7Ci0JY2FzZSBQSl9PTl9GUk9OVDoKLQkJai0+bmV4dCA9IGpvYl9saXN0OwotCQlqb2JfbGlzdCA9IGo7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSl9QQVNUX1NUT1BQRUQ6Ci0JCXByZXYgPSAmam9iX2xpc3Q7Ci0JCWN1cnIgPSBqb2JfbGlzdDsKLQkJZm9yICg7IGN1cnIgJiYgY3Vyci0+c3RhdGUgPT0gUFNUT1BQRUQ7IHByZXYgPSAmY3Vyci0+bmV4dCwKLQkJICAgIGN1cnIgPSAqcHJldikKLQkJCTsKLQkJai0+bmV4dCA9IGN1cnI7Ci0JCSpwcmV2ID0gajsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogbnVrZSBhIGpvYiAoY2FsbGVkIHdoZW4gdW5hYmxlIHRvIHN0YXJ0IGZ1bGwgam9iKS4KLSAqCi0gKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KLSAqLwotc3RhdGljIGludAota2lsbF9qb2IoSm9iICpqLCBpbnQgc2lnKQotewotCVByb2MJKnA7Ci0JaW50CXJ2YWwgPSAwOwotCi0JZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQlpZiAocC0+cGlkICE9IDApCi0JCQlpZiAoa2lsbChwLT5waWQsIHNpZykgPCAwKQotCQkJCXJ2YWwgPSAtMTsKLQlyZXR1cm4gKHJ2YWwpOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbGFsbG9jLmMgYi9ta3NoL3NyYy9sYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MjdkMS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9sYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCDCqSAyMDA5Ci0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVu4oCQCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkIOKAnEFTIElT4oCdIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb27igJlzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9sYWxsb2MuYyx2IDEuMTEgMjAwOS8wOC8wOCAxMzowODo1MSB0ZyBFeHAgJCIpOwotCi0vKiBidWlsZCB3aXRoIENQUEZMQUdTKz0gLURVU0VfUkVBTExPQ19NQUxMT0M9MCBvbiBhbmNpZW50IHN5c3RlbXMgKi8KLSNpZiBkZWZpbmVkKFVTRV9SRUFMTE9DX01BTExPQykgJiYgKFVTRV9SRUFMTE9DX01BTExPQyA9PSAwKQotI2RlZmluZSByZW1hbGxvYyhwLG4pCSgocCkgPT0gTlVMTCA/IG1hbGxvYyhuKSA6IHJlYWxsb2MoKHApLCAobikpKQotI2Vsc2UKLSNkZWZpbmUgcmVtYWxsb2MocCxuKQlyZWFsbG9jKChwKSwgKG4pKQotI2VuZGlmCi0KLSNkZWZpbmUgQUxMT0NfSVNVTkFMSUdORUQocCkgKCgocHRyZGlmZl90KShwKSkgJSBBTExPQ19TSVpFKQotCi1zdGF0aWMgQUxMT0NfSVRFTSAqZmluZHB0cihBTExPQ19JVEVNICoqLCBjaGFyICosIEFyZWEgKik7Ci0KLXZvaWQKLWFpbml0KEFyZWEgKmFwKQotewotCS8qIGFyZWEgcG9pbnRlciBpcyBhbiBBTExPQ19JVEVNLCBqdXN0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCi0JYXAtPm5leHQgPSBOVUxMOwotfQotCi1zdGF0aWMgQUxMT0NfSVRFTSAqCi1maW5kcHRyKEFMTE9DX0lURU0gKipscHAsIGNoYXIgKnB0ciwgQXJlYSAqYXApCi17Ci0Jdm9pZCAqbHA7Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCWlmIChBTExPQ19JU1VOQUxJR05FRChwdHIpKQotCQlnb3RvIGZhaWw7Ci0jZW5kaWYKLQkvKiBnZXQgYWRkcmVzcyBvZiBBTExPQ19JVEVNIGZyb20gdXNlciBpdGVtICovCi0JLyoKLQkgKiBub3RlOiB0aGUgYWxpZ25tZW50IG9mICJwdHIiIHRvIEFMTE9DX1NJWkUgaXMgY2hlY2tlZAotCSAqIGFib3ZlOyB0aGUgInZvaWQgKiIgZ2V0cyB1cyByaWQgb2YgYSBnY2MgMi45NSB3YXJuaW5nCi0JICovCi0JKmxwcCA9IChscCA9IHB0ciAtIEFMTE9DX1NJWkUpOwotCS8qIHNlYXJjaCBmb3IgYWxsb2NhdGlvbiBpdGVtIGluIGdyb3VwIGxpc3QgKi8KLQl3aGlsZSAoYXAtPm5leHQgIT0gbHApCi0JCWlmICgoYXAgPSBhcC0+bmV4dCkgPT0gTlVMTCkgewotI2lmbmRlZiBNS1NIX1NNQUxMCi0gZmFpbDoKLSNlbmRpZgotCQkJaW50ZXJuYWxfZXJyb3JmKCJyb2d1ZSBwb2ludGVyICVwIiwgcHRyKTsKLQkJfQotCXJldHVybiAoYXApOwotfQotCi12b2lkICoKLWFyZXNpemUodm9pZCAqcHRyLCBzaXplX3QgbnVtYiwgQXJlYSAqYXApCi17Ci0JQUxMT0NfSVRFTSAqbHAgPSBOVUxMOwotCi0JLyogcmVzaXppbmcgKHRydWUpIG9yIG5ld2x5IGFsbG9jYXRpbmc/ICovCi0JaWYgKHB0ciAhPSBOVUxMKSB7Ci0JCUFMTE9DX0lURU0gKnBwOwotCi0JCXBwID0gZmluZHB0cigmbHAsIHB0ciwgYXApOwotCQlwcC0+bmV4dCA9IGxwLT5uZXh0OwotCX0KLQotCWlmICgobnVtYiA+PSBTSVpFX01BWCAtIEFMTE9DX1NJWkUpIHx8Ci0JICAgIChscCA9IHJlbWFsbG9jKGxwLCBudW1iICsgQUxMT0NfU0laRSkpID09IE5VTEwKLSNpZm5kZWYgTUtTSF9TTUFMTAotCSAgICB8fCBBTExPQ19JU1VOQUxJR05FRChscCkKLSNlbmRpZgotCSAgICApCi0JCWludGVybmFsX2Vycm9yZigiY2Fubm90IGFsbG9jYXRlICVsdSBkYXRhIGJ5dGVzIiwKLQkJICAgICh1bnNpZ25lZCBsb25nKW51bWIpOwotCS8qIHRoaXMgb25seSB3b3JrcyBiZWNhdXNlIEFyZWEgaXMgYW4gQUxMT0NfSVRFTSAqLwotCWxwLT5uZXh0ID0gYXAtPm5leHQ7Ci0JYXAtPm5leHQgPSBscDsKLQkvKiByZXR1cm4gdXNlciBpdGVtIGFkZHJlc3MgKi8KLQlyZXR1cm4gKChjaGFyICopbHAgKyBBTExPQ19TSVpFKTsKLX0KLQotdm9pZAotYWZyZWUodm9pZCAqcHRyLCBBcmVhICphcCkKLXsKLQlpZiAocHRyICE9IE5VTEwpIHsKLQkJQUxMT0NfSVRFTSAqbHAsICpwcDsKLQotCQlwcCA9IGZpbmRwdHIoJmxwLCBwdHIsIGFwKTsKLQkJLyogdW5ob29rICovCi0JCXBwLT5uZXh0ID0gbHAtPm5leHQ7Ci0JCS8qIG5vdyBmcmVlIEFMTE9DX0lURU0gKi8KLQkJZnJlZShscCk7Ci0JfQotfQotCi12b2lkCi1hZnJlZWFsbChBcmVhICphcCkKLXsKLQlBTExPQ19JVEVNICpscDsKLQotCS8qIHRyYXZlcnNlIGdyb3VwIChsaW5rZWQgbGlzdCkgKi8KLQl3aGlsZSAoKGxwID0gYXAtPm5leHQpICE9IE5VTEwpIHsKLQkJLyogbWFrZSBuZXh0IEFMTE9DX0lURU0gaGVhZCBvZiBsaXN0ICovCi0JCWFwLT5uZXh0ID0gbHAtPm5leHQ7Ci0JCS8qIGZyZWUgb2xkIGhlYWQgKi8KLQkJZnJlZShscCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbGV4LmMgYi9ta3NoL3NyYy9sZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMTllNy4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9sZXguYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODIgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IGxleC5jLHYgMS40NCAyMDA4LzA3LzAzIDE3OjUyOjA4IG90dG8gRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9sZXguYyx2IDEuMTE4IDIwMTAvMDcvMjUgMTE6MzU6NDEgdGcgRXhwICQiKTsKLQotLyoKLSAqIHN0YXRlcyB3aGlsZSBsZXhpbmcgd29yZAotICovCi0jZGVmaW5lIFNCQVNFCQkwCS8qIG91dHNpZGUgYW55IGxleGljYWwgY29uc3RydWN0cyAqLwotI2RlZmluZSBTV09SRAkJMQkvKiBpbXBsaWNpdCBxdW90aW5nIGZvciBzdWJzdGl0dXRlKCkgKi8KLSNkZWZpbmUgU0xFVFBBUkVOCTIJLyogaW5zaWRlICgoICkpLCBpbXBsaWNpdCBxdW90aW5nICovCi0jZGVmaW5lIFNTUVVPVEUJCTMJLyogaW5zaWRlICcnICovCi0jZGVmaW5lIFNEUVVPVEUJCTQJLyogaW5zaWRlICIiICovCi0jZGVmaW5lIFNFUVVPVEUJCTUJLyogaW5zaWRlICQnJyAqLwotI2RlZmluZSBTQlJBQ0UJCTYJLyogaW5zaWRlICR7fSAqLwotI2RlZmluZSBTUUJSQUNFCQk3CS8qIGluc2lkZSAiJHt9IiAqLwotI2RlZmluZSBTQ1NQQVJFTgk4CS8qIGluc2lkZSAkKCkgKi8KLSNkZWZpbmUgU0JRVU9URQkJOQkvKiBpbnNpZGUgYGAgKi8KLSNkZWZpbmUgU0FTUEFSRU4JMTAJLyogaW5zaWRlICQoKCApKSAqLwotI2RlZmluZSBTSEVSRURFTElNCTExCS8qIHBhcnNpbmcgPDwsPDwtIGRlbGltaXRlciAqLwotI2RlZmluZSBTSEVSRURRVU9URQkxMgkvKiBwYXJzaW5nICIgaW4gPDwsPDwtIGRlbGltaXRlciAqLwotI2RlZmluZSBTUEFUVEVSTgkxMwkvKiBwYXJzaW5nICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCi0jZGVmaW5lIFNUQlJBQ0UJCTE0CS8qIHBhcnNpbmcgJHsuLi5bIyVdLi4ufSAqLwotI2RlZmluZSBTTEVUQVJSQVkJMTUJLyogaW5zaWRlID0oICksIGp1c3QgY29weSAqLwotI2RlZmluZSBTQURFTElNCQkxNgkvKiBsaWtlIFNCQVNFLCBsb29raW5nIGZvciBkZWxpbWl0ZXIgKi8KLSNkZWZpbmUgU0hFUkVTVFJJTkcJMTcJLyogcGFyc2luZyA8PDwgc3RyaW5nICovCi0KLS8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsZXhpbmcgc3RhdGUgYW5kIHRoZSB2YXJpb3VzIHBpZWNlcyBvZiBpbmZvCi0gKiBuZWVkZWQgZm9yIGVhY2ggcGFydGljdWxhciBzdGF0ZS4gKi8KLXR5cGVkZWYgc3RydWN0IGxleF9zdGF0ZSBMZXhfc3RhdGU7Ci1zdHJ1Y3QgbGV4X3N0YXRlIHsKLQlpbnQgbHNfc3RhdGU7Ci0JdW5pb24gewotCQkvKiAkKC4uLikgKi8KLQkJc3RydWN0IHNjc3BhcmVuX2luZm8gewotCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNpcyAqLwotCQkJaW50IGNzc3RhdGU7CS8qIFhYWCByZW1vdmUgKi8KLSNkZWZpbmUgbHNfc2NzcGFyZW4gbHNfaW5mby51X3Njc3BhcmVuCi0JCX0gdV9zY3NwYXJlbjsKLQotCQkvKiAkKCguLi4pKSAqLwotCQlzdHJ1Y3Qgc2FzcGFyZW5faW5mbyB7Ci0JCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCi0JCQlpbnQgc3RhcnQ7CS8qIG1hcmtzIHN0YXJ0IG9mICQoKCBpbiBvdXRwdXQgc3RyICovCi0jZGVmaW5lIGxzX3Nhc3BhcmVuIGxzX2luZm8udV9zYXNwYXJlbgotCQl9IHVfc2FzcGFyZW47Ci0KLQkJLyogKCguLi4pKSAqLwotCQlzdHJ1Y3Qgc2xldHBhcmVuX2luZm8gewotCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNpcyAqLwotI2RlZmluZSBsc19zbGV0cGFyZW4gbHNfaW5mby51X3NsZXRwYXJlbgotCQl9IHVfc2xldHBhcmVuOwotCi0JCS8qIGAuLi5gICovCi0JCXN0cnVjdCBzYnF1b3RlX2luZm8gewotCQkJaW50IGluZHF1b3RlczsJLyogdHJ1ZSBpZiBpbiBkb3VibGUgcXVvdGVzOiAiYC4uLmAiICovCi0jZGVmaW5lIGxzX3NicXVvdGUgbHNfaW5mby51X3NicXVvdGUKLQkJfSB1X3NicXVvdGU7Ci0KLSNpZm5kZWYgTUtTSF9TTUFMTAotCQkvKiA9KC4uLikgKi8KLQkJc3RydWN0IHNsZXRhcnJheV9pbmZvIHsKLQkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzZXMgKi8KLSNkZWZpbmUgbHNfc2xldGFycmF5IGxzX2luZm8udV9zbGV0YXJyYXkKLQkJfSB1X3NsZXRhcnJheTsKLSNlbmRpZgotCi0JCS8qIEFERUxJTSAqLwotCQlzdHJ1Y3Qgc2FkZWxpbV9pbmZvIHsKLQkJCXVuc2lnbmVkIGNoYXIgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIFNBREVMSU1fQkFTSAkwCi0jZGVmaW5lIFNBREVMSU1fTUFLRQkxCi0JCQl1bnNpZ25lZCBjaGFyIHN0eWxlOwotCQkJdW5zaWduZWQgY2hhciBkZWxpbWl0ZXI7Ci0JCQl1bnNpZ25lZCBjaGFyIG51bTsKLQkJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIG9mcy4gaW50byBzYWRlbGltX2ZsYWdzW10gKi8KLSNkZWZpbmUgbHNfc2FkZWxpbSBsc19pbmZvLnVfc2FkZWxpbQotCQl9IHVfc2FkZWxpbTsKLQotCQkvKiAkJy4uLicgKi8KLQkJc3RydWN0IHNlcXVvdGVfaW5mbyB7Ci0JCQlib29sIGdvdF9OVUw7CS8qIGlnbm9yZSByZXN0IG9mIHN0cmluZyAqLwotI2RlZmluZSBsc19zZXF1b3RlIGxzX2luZm8udV9zZXF1b3RlCi0JCX0gdV9zZXF1b3RlOwotCi0JCUxleF9zdGF0ZSAqYmFzZTsJLyogdXNlZCB0byBwb2ludCB0byBuZXh0IHN0YXRlIGJsb2NrICovCi0JfSBsc19pbmZvOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCUxleF9zdGF0ZSAqYmFzZTsKLQlMZXhfc3RhdGUgKmVuZDsKLX0gU3RhdGVfaW5mbzsKLQotc3RhdGljIHZvaWQgcmVhZGhlcmUoc3RydWN0IGlvd29yZCAqKTsKLXN0YXRpYyBpbnQgZ2V0c2NfXyh2b2lkKTsKLXN0YXRpYyB2b2lkIGdldHNjX2xpbmUoU291cmNlICopOwotc3RhdGljIGludCBnZXRzY19ibih2b2lkKTsKLXN0YXRpYyBpbnQgc19nZXQodm9pZCk7Ci1zdGF0aWMgdm9pZCBzX3B1dChpbnQpOwotc3RhdGljIGNoYXIgKmdldF9icmFjZV92YXIoWFN0cmluZyAqLCBjaGFyICopOwotc3RhdGljIGludCBhcnJheXN1YihjaGFyICoqKTsKLXN0YXRpYyBjb25zdCBjaGFyICp1bmdldHNjKGludCk7Ci1zdGF0aWMgdm9pZCBnZXRoZXJlKGJvb2wpOwotc3RhdGljIExleF9zdGF0ZSAqcHVzaF9zdGF0ZV8oU3RhdGVfaW5mbyAqLCBMZXhfc3RhdGUgKik7Ci1zdGF0aWMgTGV4X3N0YXRlICpwb3Bfc3RhdGVfKFN0YXRlX2luZm8gKiwgTGV4X3N0YXRlICopOwotCi1zdGF0aWMgaW50IGRvcHByb21wdChjb25zdCBjaGFyICosIGludCwgYm9vbCk7Ci0KLXN0YXRpYyBpbnQgYmFja3NsYXNoX3NraXA7Ci1zdGF0aWMgaW50IGlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZTsKLQotLyogb3B0aW1pc2VkIGdldHNjX2JuKCkgKi8KLSNkZWZpbmUgX2dldHNjKCkJKCpzb3VyY2UtPnN0ciAhPSAnXDAnICYmICpzb3VyY2UtPnN0ciAhPSAnXFwnIFwKLQkJCSAmJiAhYmFja3NsYXNoX3NraXAgJiYgIShzb3VyY2UtPmZsYWdzICYgU0ZfRklSU1QpIFwKLQkJCSA/ICpzb3VyY2UtPnN0cisrIDogZ2V0c2NfYm4oKSkKLS8qIG9wdGltaXNlZCBnZXRzY19fKCkgKi8KLSNkZWZpbmUJX2dldHNjXygpCSgoKnNvdXJjZS0+c3RyICE9ICdcMCcpICYmICEoc291cmNlLT5mbGFncyAmIFNGX0ZJUlNUKSBcCi0JCQkgPyAqc291cmNlLT5zdHIrKyA6IGdldHNjX18oKSkKLQotI2lmZGVmIE1LU0hfU01BTEwKLXN0YXRpYyBpbnQgZ2V0c2Modm9pZCk7Ci1zdGF0aWMgaW50IGdldHNjXyh2b2lkKTsKLQotc3RhdGljIGludAotZ2V0c2Modm9pZCkKLXsKLQlyZXR1cm4gKF9nZXRzYygpKTsKLX0KLQotc3RhdGljIGludAotZ2V0c2NfKHZvaWQpCi17Ci0JcmV0dXJuIChfZ2V0c2NfKCkpOwotfQotI2Vsc2UKLS8qICFNS1NIX1NNQUxMOiB1c2UgdGhlbSBpbmxpbmUgKi8KLSNkZWZpbmUgZ2V0c2MoKQkJX2dldHNjKCkKLSNkZWZpbmUgZ2V0c2NfKCkJX2dldHNjXygpCi0jZW5kaWYKLQotI2RlZmluZSBTVEFURV9CU0laRQkzMgotCi0jZGVmaW5lIFBVU0hfU1RBVEUocykJZG8gewkJCQkJXAotCWlmICgrK3N0YXRlcCA9PSBzdGF0ZV9pbmZvLmVuZCkJCQkJXAotCQlzdGF0ZXAgPSBwdXNoX3N0YXRlXygmc3RhdGVfaW5mbywgc3RhdGVwKTsJXAotCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9IChzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQT1BfU1RBVEUoKQlkbyB7CQkJCQlcCi0JaWYgKC0tc3RhdGVwID09IHN0YXRlX2luZm8uYmFzZSkJCQlcCi0JCXN0YXRlcCA9IHBvcF9zdGF0ZV8oJnN0YXRlX2luZm8sIHN0YXRlcCk7CVwKLQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGU7CQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qKgotICogTGV4aWNhbCBhbmFseXNlcgotICoKLSAqIHRva2VucyBhcmUgbm90IHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHRoZXkgYXJlIExMKDEpLgotICogZm9yIGV4YW1wbGUsICIke3ZhcjotJHtQV0R9fSIsIGFuZCAiJChzaXplICQod2hlbmNlIGtzaCkpIi4KLSAqIGhlbmNlIHRoZSBzdGF0ZSBzdGFjay4KLSAqLwotCi1pbnQKLXl5bGV4KGludCBjZikKLXsKLQlMZXhfc3RhdGUgc3RhdGVzW1NUQVRFX0JTSVpFXSwgKnN0YXRlcCwgKnMyLCAqYmFzZTsKLQlTdGF0ZV9pbmZvIHN0YXRlX2luZm87Ci0JaW50IGMsIGMyLCBzdGF0ZTsKLQlYU3RyaW5nIHdzOwkJLyogZXhwYW5kYWJsZSBvdXRwdXQgd29yZCAqLwotCWNoYXIgKndwOwkJLyogb3V0cHV0IHdvcmQgcG9pbnRlciAqLwotCWNoYXIgKnNwLCAqZHA7Ci0KLSBBZ2FpbjoKLQlzdGF0ZXNbMF0ubHNfc3RhdGUgPSAtMTsKLQlzdGF0ZXNbMF0ubHNfaW5mby5iYXNlID0gTlVMTDsKLQlzdGF0ZXAgPSAmc3RhdGVzWzFdOwotCXN0YXRlX2luZm8uYmFzZSA9IHN0YXRlczsKLQlzdGF0ZV9pbmZvLmVuZCA9ICZzdGF0ZV9pbmZvLmJhc2VbU1RBVEVfQlNJWkVdOwotCi0JWGluaXQod3MsIHdwLCA2NCwgQVRFTVApOwotCi0JYmFja3NsYXNoX3NraXAgPSAwOwotCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSA9IDA7Ci0KLQlpZiAoY2YmT05FV09SRCkKLQkJc3RhdGUgPSBTV09SRDsKLQllbHNlIGlmIChjZiZMRVRFWFBSKSB7Ci0JCS8qIGVuY2xvc2UgYXJndW1lbnRzIGluIChkb3VibGUpIHF1b3RlcyAqLwotCQkqd3ArKyA9IE9RVU9URTsKLQkJc3RhdGUgPSBTTEVUUEFSRU47Ci0JCXN0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbiA9IDA7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQl9IGVsc2UgaWYgKGNmJkxFVEFSUkFZKSB7Ci0JCXN0YXRlID0gU0xFVEFSUkFZOwotCQlzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW4gPSAwOwotI2VuZGlmCi0JfSBlbHNlIHsJCS8qIG5vcm1hbCBsZXhpbmcgKi8KLQkJc3RhdGUgPSAoY2YgJiBIRVJFREVMSU0pID8gU0hFUkVERUxJTSA6IFNCQVNFOwotCQl3aGlsZSAoKGMgPSBnZXRzYygpKSA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJOwotCQlpZiAoYyA9PSAnIycpIHsKLQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOwotCQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gJ1wwJyAmJiBjICE9ICdcbicpCi0JCQkJOwotCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07Ci0JCX0KLQkJdW5nZXRzYyhjKTsKLQl9Ci0JaWYgKHNvdXJjZS0+ZmxhZ3MgJiBTRl9BTElBUykgewkvKiB0cmFpbGluZyAnICcgaW4gYWxpYXMgZGVmaW5pdGlvbiAqLwotCQlzb3VyY2UtPmZsYWdzICY9IH5TRl9BTElBUzsKLQkJY2YgfD0gQUxJQVM7Ci0JfQotCi0JLyogSW5pdGlhbCBzdGF0ZTogb25lIG9mIFNCQVNFIFNIRVJFREVMSU0gU1dPUkQgU0FTUEFSRU4gKi8KLQlzdGF0ZXAtPmxzX3N0YXRlID0gc3RhdGU7Ci0KLQkvKiBjaGVjayBmb3IgaGVyZSBzdHJpbmcgKi8KLQlpZiAoc3RhdGUgPT0gU0hFUkVERUxJTSkgewotCQljID0gZ2V0c2MoKTsKLQkJaWYgKGMgPT0gJzwnKSB7Ci0JCQlzdGF0ZSA9IFNIRVJFU1RSSU5HOwotCQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkJCQk7Ci0JCQl1bmdldHNjKGMpOwotCQkJYyA9ICc8JzsKLQkJCWdvdG8gYWNjZXB0X25vbndvcmQ7Ci0JCX0KLQkJdW5nZXRzYyhjKTsKLQl9Ci0KLQkvKiBjb2xsZWN0IG5vbi1zcGVjaWFsIG9yIHF1b3RlZCBjaGFyYWN0ZXJzIHRvIGZvcm0gd29yZCAqLwotCXdoaWxlICghKChjID0gZ2V0c2MoKSkgPT0gMCB8fAotCSAgICAoKHN0YXRlID09IFNCQVNFIHx8IHN0YXRlID09IFNIRVJFREVMSU0gfHwgc3RhdGUgPT0gU0hFUkVTVFJJTkcpICYmCi0JICAgIGN0eXBlKGMsIENfTEVYMSkpKSkgewotIGFjY2VwdF9ub253b3JkOgotCQlYY2hlY2sod3MsIHdwKTsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIFNBREVMSU06Ci0JCQlpZiAoYyA9PSAnKCcpCi0JCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbisrOwotCQkJZWxzZSBpZiAoYyA9PSAnKScpCi0JCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbi0tOwotCQkJZWxzZSBpZiAoc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9PSAwICYmCi0JCQkgICAgKGMgPT0gLyp7Ki8gJ30nIHx8IGMgPT0gc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlcikpIHsKLQkJCQkqd3ArKyA9IEFERUxJTTsKLQkJCQkqd3ArKyA9IGM7Ci0JCQkJaWYgKGMgPT0gLyp7Ki8gJ30nIHx8IC0tc3RhdGVwLT5sc19zYWRlbGltLm51bSA9PSAwKQotCQkJCQlQT1BfU1RBVEUoKTsKLQkJCQlpZiAoYyA9PSAvKnsqLyAnfScpCi0JCQkJCVBPUF9TVEFURSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBTQkFTRToKLQkJCWlmIChjID09ICdbJyAmJiAoY2YgJiAoVkFSQVNOfEFSUkFZVkFSKSkpIHsKLQkJCQkqd3AgPSBFT1M7CS8qIHRlbXBvcmFyeSAqLwotCQkJCWlmIChpc193ZHZhcm5hbWUoWHN0cmluZyh3cywgd3ApLCBmYWxzZSkpIHsKLQkJCQkJY2hhciAqcCwgKnRtcDsKLQotCQkJCQlpZiAoYXJyYXlzdWIoJnRtcCkpIHsKLQkJCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkJCSp3cCsrID0gYzsKLQkJCQkJCWZvciAocCA9IHRtcDsgKnA7ICkgewotCQkJCQkJCVhjaGVjayh3cywgd3ApOwotCQkJCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkJCQkqd3ArKyA9ICpwKys7Ci0JCQkJCQl9Ci0JCQkJCQlhZnJlZSh0bXAsIEFURU1QKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU291cmNlICpzOwotCi0JCQkJCQlzID0gcHVzaHMoU1JFUkVBRCwKLQkJCQkJCSAgICBzb3VyY2UtPmFyZWFwKTsKLQkJCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0KLQkJCQkJCSAgICBzLT51LmZyZWVtZSA9IHRtcDsKLQkJCQkJCXMtPm5leHQgPSBzb3VyY2U7Ci0JCQkJCQlzb3VyY2UgPSBzOwotCQkJCQl9Ci0JCQkJfQotCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkqd3ArKyA9IGM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotIFNiYXNlMToJCS8qIGluY2x1ZGVzICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCi0JCQlpZiAoYyA9PSAnKicgfHwgYyA9PSAnQCcgfHwgYyA9PSAnKycgfHwgYyA9PSAnPycgfHwKLQkJCSAgICBjID09ICchJykgewotCQkJCWMyID0gZ2V0c2MoKTsKLQkJCQlpZiAoYzIgPT0gJygnIC8qKSovICkgewotCQkJCQkqd3ArKyA9IE9QQVQ7Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQkJUFVTSF9TVEFURShTUEFUVEVSTik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl1bmdldHNjKGMyKTsKLQkJCX0KLQkJCS8qIEZBTExUSFJPVUdIICovCi0gU2Jhc2UyOgkJLyogZG9lc24ndCBpbmNsdWRlICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCi0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJ1xcJzoKLSBnZXRzY19xY2hhcjoKLQkJCQlpZiAoKGMgPSBnZXRzYygpKSkgewotCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KLQkJCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkJKndwKysgPSBjOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLSBvcGVuX3NzcXVvdGU6Ci0JCQkJKndwKysgPSBPUVVPVEU7Ci0JCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0JCQkJUFVTSF9TVEFURShTU1FVT1RFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotIG9wZW5fc2RxdW90ZToKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQlQVVNIX1NUQVRFKFNEUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIFN1YnN0OwotCQkJfQotCQkJYnJlYWs7Ci0KLSBTdWJzdDoKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXFwnOgotCQkJCWMgPSBnZXRzYygpOwotCQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJyInOgotCQkJCQlpZiAoKGNmICYgSEVSRURPQykpCi0JCQkJCQlnb3RvIGhlcmVkb2NxdW90ZTsKLQkJCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCQljYXNlICdcXCc6Ci0JCQkJY2FzZSAnJCc6IGNhc2UgJ2AnOgotIHN0b3JlX3FjaGFyOgotCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0gaGVyZWRvY3F1b3RlOgotCQkJCQlYY2hlY2sod3MsIHdwKTsKLQkJCQkJaWYgKGMpIHsKLQkJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLwotCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJKndwKysgPSAnXFwnOwotCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgJyQnOgotIHN1YnN0X2RvbGxhcjoKLQkJCQljID0gZ2V0c2MoKTsKLQkJCQlpZiAoYyA9PSAnKCcpIC8qKSovIHsKLQkJCQkJYyA9IGdldHNjKCk7Ci0JCQkJCWlmIChjID09ICcoJykgLyopKi8gewotCQkJCQkJUFVTSF9TVEFURShTQVNQQVJFTik7Ci0JCQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbiA9IDI7Ci0JCQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLnN0YXJ0ID0KLQkJCQkJCSAgICBYc2F2ZXBvcyh3cywgd3ApOwotCQkJCQkJKndwKysgPSBFWFBSU1VCOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5nZXRzYyhjKTsKLQkJCQkJCVBVU0hfU1RBVEUoU0NTUEFSRU4pOwotCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPSAxOwotCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKLQkJCQkJCSp3cCsrID0gQ09NU1VCOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChjID09ICd7JykgLyp9Ki8gewotCQkJCQkqd3ArKyA9IE9TVUJTVDsKLQkJCQkJKndwKysgPSAneyc7IC8qfSovCi0JCQkJCXdwID0gZ2V0X2JyYWNlX3Zhcigmd3MsIHdwKTsKLQkJCQkJYyA9IGdldHNjKCk7Ci0JCQkJCS8qIGFsbG93IDojIGFuZCA6JSAoa3NoODggY29tcGF0KSAqLwotCQkJCQlpZiAoYyA9PSAnOicpIHsKLQkJCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkJCSp3cCsrID0gYzsKLQkJCQkJCWMgPSBnZXRzYygpOwotCQkJCQkJaWYgKGMgPT0gJzonKSB7Ci0JCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJCSp3cCsrID0gJzAnOwotCQkJCQkJCSp3cCsrID0gQURFTElNOwotCQkJCQkJCSp3cCsrID0gJzonOwotCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKLQkJCQkJCQlQVVNIX1NUQVRFKFNBREVMSU0pOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJzonOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPSAxOwotCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSBlbHNlIGlmIChrc2hfaXNkaWdpdChjKSB8fAotCQkJCQkJICAgIGMgPT0gJygnLyopKi8gfHwgYyA9PSAnICcgfHwKLQkJCQkJCSAgICBjID09ICckJyAvKiBYWFggd2hhdCBlbHNlPyAqLykgewotCQkJCQkJCS8qIHN1YnN0cmluZyBzdWJzdC4gKi8KLQkJCQkJCQlpZiAoYyAhPSAnICcpIHsKLQkJCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJCQkqd3ArKyA9ICcgJzsKLQkJCQkJCQl9Ci0JCQkJCQkJdW5nZXRzYyhjKTsKLQkJCQkJCQlQVVNIX1NUQVRFKFNCUkFDRSk7Ci0JCQkJCQkJUFVTSF9TVEFURShTQURFTElNKTsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uc3R5bGUgPSBTQURFTElNX0JBU0g7Ci0JCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlciA9ICc6JzsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID0gMjsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChjID09ICcvJykgewotCQkJCQkJKndwKysgPSBDSEFSOwotCQkJCQkJKndwKysgPSBjOwotCQkJCQkJaWYgKChjID0gZ2V0c2MoKSkgPT0gJy8nKSB7Ci0JCQkJCQkJKndwKysgPSBBREVMSU07Ci0JCQkJCQkJKndwKysgPSBjOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJdW5nZXRzYyhjKTsKLQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKLQkJCQkJCVBVU0hfU1RBVEUoU0FERUxJTSk7Ci0JCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uc3R5bGUgPSBTQURFTElNX0JBU0g7Ci0JCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJy8nOwotCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm51bSA9IDE7Ci0JCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qIElmIHRoaXMgaXMgYSB0cmltIG9wZXJhdGlvbiwKLQkJCQkJICogdHJlYXQgKCx8LCkgc3BlY2lhbGx5IGluIFNUQlJBQ0UuCi0JCQkJCSAqLwotCQkJCQlpZiAoY3R5cGUoYywgQ19TVUJPUDIpKSB7Ci0JCQkJCQl1bmdldHNjKGMpOwotCQkJCQkJUFVTSF9TVEFURShTVEJSQUNFKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVuZ2V0c2MoYyk7Ci0JCQkJCQlpZiAoc3RhdGUgPT0gU0RRVU9URSkKLQkJCQkJCQlQVVNIX1NUQVRFKFNRQlJBQ0UpOwotCQkJCQkJZWxzZQotCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoa3NoX2lzYWxwaHgoYykpIHsKLQkJCQkJKndwKysgPSBPU1VCU1Q7Ci0JCQkJCSp3cCsrID0gJ1gnOwotCQkJCQlkbyB7Ci0JCQkJCQlYY2hlY2sod3MsIHdwKTsKLQkJCQkJCSp3cCsrID0gYzsKLQkJCQkJCWMgPSBnZXRzYygpOwotCQkJCQl9IHdoaWxlIChrc2hfaXNhbG51eChjKSk7Ci0JCQkJCSp3cCsrID0gJ1wwJzsKLQkJCQkJKndwKysgPSBDU1VCU1Q7Ci0JCQkJCSp3cCsrID0gJ1gnOwotCQkJCQl1bmdldHNjKGMpOwotCQkJCX0gZWxzZSBpZiAoY3R5cGUoYywgQ19WQVIxIHwgQ19ESUdJVCkpIHsKLQkJCQkJWGNoZWNrKHdzLCB3cCk7Ci0JCQkJCSp3cCsrID0gT1NVQlNUOwotCQkJCQkqd3ArKyA9ICdYJzsKLQkJCQkJKndwKysgPSBjOwotCQkJCQkqd3ArKyA9ICdcMCc7Ci0JCQkJCSp3cCsrID0gQ1NVQlNUOwotCQkJCQkqd3ArKyA9ICdYJzsKLQkJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJyAmJiAoc3RhdGUgPT0gU0JBU0UpKSB7Ci0JCQkJCS8qIFhYWCB3aGljaCBvdGhlciBzdGF0ZXMgYXJlIHZhbGlkPyAqLwotCQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0JCQkJCVBVU0hfU1RBVEUoU0VRVU9URSk7Ci0JCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkJKndwKysgPSAnJCc7Ci0JCQkJCXVuZ2V0c2MoYyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnYCc6Ci0gc3Vic3RfZ3JhdmlzOgotCQkJCVBVU0hfU1RBVEUoU0JRVU9URSk7Ci0JCQkJKndwKysgPSBDT01TVUI7Ci0JCQkJLyogTmVlZCB0byBrbm93IGlmIHdlIGFyZSBpbnNpZGUgZG91YmxlIHF1b3RlcwotCQkJCSAqIHNpbmNlIHNoL0FUJlQta3NoIHRyYW5zbGF0ZSB0aGUgXCIgdG8gIiBpbgotCQkJCSAqICJgLi4uXCIuLi5gIi4KLQkJCQkgKiBUaGlzIGlzIG5vdCBkb25lIGluIFBPU0lYIG1vZGUgKHNlY3Rpb24KLQkJCQkgKiAzLjIuMywgRG91YmxlIFF1b3RlczogIlRoZSBiYWNrcXVvdGUgc2hhbGwKLQkJCQkgKiByZXRhaW4gaXRzIHNwZWNpYWwgbWVhbmluZyBpbnRyb2R1Y2luZyB0aGUKLQkJCQkgKiBvdGhlciBmb3JtIG9mIGNvbW1hbmQgc3Vic3RpdHV0aW9uIChzZWUKLQkJCQkgKiAzLjYuMykuIFRoZSBwb3J0aW9uIG9mIHRoZSBxdW90ZWQgc3RyaW5nCi0JCQkJICogZnJvbSB0aGUgaW5pdGlhbCBiYWNrcXVvdGUgYW5kIHRoZQotCQkJCSAqIGNoYXJhY3RlcnMgdXAgdG8gdGhlIG5leHQgYmFja3F1b3RlIHRoYXQKLQkJCQkgKiBpcyBub3QgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2ggKGhhdmluZwotCQkJCSAqIGVzY2FwZSBjaGFyYWN0ZXJzIHJlbW92ZWQpIGRlZmluZXMgdGhhdAotCQkJCSAqIGNvbW1hbmQgd2hvc2Ugb3V0cHV0IHJlcGxhY2VzIGAuLi5gIHdoZW4KLQkJCQkgKiB0aGUgd29yZCBpcyBleHBhbmRlZC4iCi0JCQkJICogU2VjdGlvbiAzLjYuMywgQ29tbWFuZCBTdWJzdGl0dXRpb246Ci0JCQkJICogIldpdGhpbiB0aGUgYmFja3F1b3RlZCBzdHlsZSBvZiBjb21tYW5kCi0JCQkJICogc3Vic3RpdHV0aW9uLCBiYWNrc2xhc2ggc2hhbGwgcmV0YWluIGl0cwotCQkJCSAqIGxpdGVyYWwgbWVhbmluZywgZXhjZXB0IHdoZW4gZm9sbG93ZWQgYnkKLQkJCQkgKiAkIGAgXC4iKS4KLQkJCQkgKi8KLQkJCQlzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzID0gMDsKLQkJCQlzMiA9IHN0YXRlcDsKLQkJCQliYXNlID0gc3RhdGVfaW5mby5iYXNlOwotCQkJCXdoaWxlICgxKSB7Ci0JCQkJCWZvciAoOyBzMiAhPSBiYXNlOyBzMi0tKSB7Ci0JCQkJCQlpZiAoczItPmxzX3N0YXRlID09IFNEUVVPVEUpIHsKLQkJCQkJCQlzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzID0gMTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoczIgIT0gYmFzZSkKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoIShzMiA9IHMyLT5sc19pbmZvLmJhc2UpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWJhc2UgPSBzMi0tIC0gU1RBVEVfQlNJWkU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBRQ0hBUjoKLQkJCQlpZiAoY2YgJiBMUUNIQVIpIHsKLQkJCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkJKndwKysgPSBnZXRzYygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWRlZmF1bHQ6Ci0gc3RvcmVfY2hhcjoKLQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJKndwKysgPSBjOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTRVFVT1RFOgotCQkJaWYgKGMgPT0gJ1wnJykgewotCQkJCVBPUF9TVEFURSgpOwotCQkJCSp3cCsrID0gQ1FVT1RFOwotCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOwotCQkJfSBlbHNlIGlmIChjID09ICdcXCcpIHsKLQkJCQlpZiAoKGMyID0gdW5ia3NsKHRydWUsIHNfZ2V0LCBzX3B1dCkpID09IC0xKQotCQkJCQljMiA9IHNfZ2V0KCk7Ci0JCQkJaWYgKGMyID09IDApCi0JCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gdHJ1ZTsKLQkJCQlpZiAoIXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMKSB7Ci0JCQkJCWNoYXIgdHNbNF07Ci0KLQkJCQkJaWYgKCh1bnNpZ25lZCBpbnQpYzIgPCAweDEwMCkgewotCQkJCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkJCSp3cCsrID0gYzI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljID0gdXRmX3djdG9tYih0cywgYzIgLSAweDEwMCk7Ci0JCQkJCQl0c1tjXSA9IDA7Ci0JCQkJCQlmb3IgKGMgPSAwOyB0c1tjXTsgKytjKSB7Ci0JCQkJCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkJCQkqd3ArKyA9IHRzW2NdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwpIHsKLQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCSp3cCsrID0gYzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NRVU9URToKLQkJCWlmIChjID09ICdcJycpIHsKLQkJCQlQT1BfU1RBVEUoKTsKLQkJCQkqd3ArKyA9IENRVU9URTsKLQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJKndwKysgPSBRQ0hBUjsKLQkJCQkqd3ArKyA9IGM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNEUVVPVEU6Ci0JCQlpZiAoYyA9PSAnIicpIHsKLQkJCQlQT1BfU1RBVEUoKTsKLQkJCQkqd3ArKyA9IENRVU9URTsKLQkJCX0gZWxzZQotCQkJCWdvdG8gU3Vic3Q7Ci0JCQlicmVhazsKLQotCQljYXNlIFNDU1BBUkVOOgkvKiAkKCAuLi4gKSAqLwotCQkJLyogdG9kbzogZGVhbCB3aXRoICQoLi4uKSBxdW90aW5nIHByb3Blcmx5Ci0JCQkgKiBrbHVkZ2UgdG8gcGFydGx5IGZha2UgcXVvdGluZyBpbnNpZGUgJCguLi4pOiBkb2Vzbid0Ci0JCQkgKiByZWFsbHkgd29yayBiZWNhdXNlIG5lc3RlZCAkKC4uLikgb3IgJHsuLi59IGluc2lkZQotCQkJICogZG91YmxlIHF1b3RlcyBhcmVuJ3QgZGVhbHQgd2l0aC4KLQkJCSAqLwotCQkJc3dpdGNoIChzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUpIHsKLQkJCWNhc2UgMDoJLyogbm9ybWFsICovCi0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnKCc6Ci0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyknOgotCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbi0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6Ci0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOgotCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAyOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcJyc6Ci0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDQ7Ci0JCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMToJLyogYmFja3NsYXNoIGluIG5vcm1hbCBtb2RlICovCi0JCQljYXNlIDM6CS8qIGJhY2tzbGFzaCBpbiBkb3VibGUgcXVvdGVzICovCi0JCQkJLS1zdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjoJLyogZG91YmxlIHF1b3RlcyAqLwotCQkJCWlmIChjID09ICciJykKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKLQkJCQllbHNlIGlmIChjID09ICdcXCcpCi0JCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDM7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgNDoJLyogc2luZ2xlIHF1b3RlcyAqLwotCQkJCWlmIChjID09ICdcJycpIHsKLQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKLQkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuID09IDApIHsKLQkJCQlQT1BfU1RBVEUoKTsKLQkJCQkqd3ArKyA9IDA7CS8qIGVuZCBvZiBDT01TVUIgKi8KLQkJCX0gZWxzZQotCQkJCSp3cCsrID0gYzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0FTUEFSRU46CS8qICQoKCAuLi4gKSkgKi8KLQkJCS8qIFhYWCBzaG91bGQgbmVzdCB1c2luZyBleGlzdGluZyBzdGF0ZSBtYWNoaW5lCi0JCQkgKiAoZW1iZWQgIi4uLiIsICQoLi4uKSwgZXRjLikgKi8KLQkJCWlmIChjID09ICcoJykKLQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbisrOwotCQkJZWxzZSBpZiAoYyA9PSAnKScpIHsKLQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbi0tOwotCQkJCWlmIChzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbiA9PSAxKSB7Ci0JCQkJCS8qKCovCi0JCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnKScpIHsKLQkJCQkJCVBPUF9TVEFURSgpOwotCQkJCQkJLyogZW5kIG9mIEVYUFJTVUIgKi8KLQkJCQkJCSp3cCsrID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hhciAqczsKLQotCQkJCQkJdW5nZXRzYyhjMik7Ci0JCQkJCQkvKiBtaXNtYXRjaGVkIHBhcmVudGhlc2lzIC0KLQkJCQkJCSAqIGFzc3VtZSB3ZSB3ZXJlIHJlYWxseQotCQkJCQkJICogcGFyc2luZyBhICQoLi4uKSBleHByZXNzaW9uCi0JCQkJCQkgKi8KLQkJCQkJCXMgPSBYcmVzdHBvcyh3cywgd3AsCi0JCQkJCQkgICAgc3RhdGVwLT5sc19zYXNwYXJlbi5zdGFydCk7Ci0JCQkJCQltZW1tb3ZlKHMgKyAxLCBzLCB3cCAtIHMpOwotCQkJCQkJKnMrKyA9IENPTVNVQjsKLQkJCQkJCSpzID0gJygnOyAvKikqLwotCQkJCQkJd3ArKzsKLQkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuID0gMTsKLQkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDA7Ci0JCQkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPQotCQkJCQkJICAgIFNDU1BBUkVOOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJKndwKysgPSBjOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUUJSQUNFOgotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCS8qCi0JCQkJICogcGVyZm9ybSBQT1NJWCAicXVvdGUgcmVtb3ZhbCIgaWYgdGhlIGJhY2stCi0JCQkJICogc2xhc2ggaXMgInNwZWNpYWwiLCBpLmUuIHNhbWUgY2FzZXMgYXMgdGhlCi0JCQkJICoge2Nhc2UgJ1xcJzp9IGluIFN1YnN0OiBwbHVzIGNsb3NpbmcgYnJhY2U7Ci0JCQkJICogaW4gbWtzaCBjb2RlICJxdW90ZSByZW1vdmFsIiBvbiAnXGMnIG1lYW5zCi0JCQkJICogd3JpdGUgUUNIQVIrYywgb3RoZXJ3aXNlIENIQVIrXCtDSEFSK2MgYXJlCi0JCQkJICogZW1pdHRlZCAoaW4gaGVyZWRvY3F1b3RlOikKLQkJCQkgKi8KLQkJCQlpZiAoKGMgPSBnZXRzYygpKSA9PSAnIicgfHwgYyA9PSAnXFwnIHx8Ci0JCQkJICAgIGMgPT0gJyQnIHx8IGMgPT0gJ2AnIHx8IGMgPT0gLyp7Ki8nfScpCi0JCQkJCWdvdG8gc3RvcmVfcWNoYXI7Ci0JCQkJZ290byBoZXJlZG9jcXVvdGU7Ci0JCQl9Ci0JCQlnb3RvIGNvbW1vbl9TUUJSQUNFOwotCi0JCWNhc2UgU0JSQUNFOgotCQkJaWYgKGMgPT0gJ1wnJykKLQkJCQlnb3RvIG9wZW5fc3NxdW90ZTsKLQkJCWVsc2UgaWYgKGMgPT0gJ1xcJykKLQkJCQlnb3RvIGdldHNjX3FjaGFyOwotIGNvbW1vbl9TUUJSQUNFOgotCQkJaWYgKGMgPT0gJyInKQotCQkJCWdvdG8gb3Blbl9zZHF1b3RlOwotCQkJZWxzZSBpZiAoYyA9PSAnJCcpCi0JCQkJZ290byBzdWJzdF9kb2xsYXI7Ci0JCQllbHNlIGlmIChjID09ICdgJykKLQkJCQlnb3RvIHN1YnN0X2dyYXZpczsKLQkJCWVsc2UgaWYgKGMgIT0gLyp7Ki8gJ30nKQotCQkJCWdvdG8gc3RvcmVfY2hhcjsKLQkJCVBPUF9TVEFURSgpOwotCQkJKndwKysgPSBDU1VCU1Q7Ci0JCQkqd3ArKyA9IC8qeyovICd9JzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RCUkFDRToKLQkJCS8qIFNhbWUgYXMgU0JBU0UsIGV4Y2VwdCAoLHwsKSB0cmVhdGVkIHNwZWNpYWxseSAqLwotCQkJaWYgKGMgPT0gLyp7Ki8gJ30nKSB7Ci0JCQkJUE9QX1NUQVRFKCk7Ci0JCQkJKndwKysgPSBDU1VCU1Q7Ci0JCQkJKndwKysgPSAvKnsqLyAnfSc7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7Ci0JCQkJKndwKysgPSBTUEFUOwotCQkJfSBlbHNlIGlmIChjID09ICcoJykgewotCQkJCSp3cCsrID0gT1BBVDsKLQkJCQkqd3ArKyA9ICcgJzsJLyogc2ltaWxlIGZvciBAICovCi0JCQkJUFVTSF9TVEFURShTUEFUVEVSTik7Ci0JCQl9IGVsc2UKLQkJCQlnb3RvIFNiYXNlMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0JRVU9URToKLQkJCWlmIChjID09ICdgJykgewotCQkJCSp3cCsrID0gMDsKLQkJCQlQT1BfU1RBVEUoKTsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJc3dpdGNoIChjID0gZ2V0c2MoKSkgewotCQkJCWNhc2UgJ1xcJzoKLQkJCQljYXNlICckJzogY2FzZSAnYCc6Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCWlmIChzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzKSB7Ci0JCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvKiBGQUxMVEhST1VHSCAqLwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmIChjKSB7Ci0JCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KLQkJCQkJCSp3cCsrID0gJ1xcJzsKLQkJCQkJCSp3cCsrID0gYzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQkqd3ArKyA9IGM7Ci0JCQlicmVhazsKLQotCQljYXNlIFNXT1JEOgkvKiBPTkVXT1JEICovCi0JCQlnb3RvIFN1YnN0OwotCi0JCWNhc2UgU0xFVFBBUkVOOgkvKiBMRVRFWFBSOiAoKCAuLi4gKSkgKi8KLQkJCS8qKCovCi0JCQlpZiAoYyA9PSAnKScpIHsKLQkJCQlpZiAoc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuID4gMCkKLQkJCQkJLS1zdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW47Ci0JCQkJZWxzZSBpZiAoKGMyID0gZ2V0c2MoKSkgPT0gLyooKi8gJyknKSB7Ci0JCQkJCWMgPSAwOwotCQkJCQkqd3ArKyA9IENRVU9URTsKLQkJCQkJZ290byBEb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVNvdXJjZSAqczsKLQotCQkJCQl1bmdldHNjKGMyKTsKLQkJCQkJLyogbWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyAtCi0JCQkJCSAqIGFzc3VtZSB3ZSB3ZXJlIHJlYWxseQotCQkJCQkgKiBwYXJzaW5nIGEgJCguLi4pIGV4cHJlc3Npb24KLQkJCQkJICovCi0JCQkJCSp3cCA9IEVPUzsKLQkJCQkJc3AgPSBYc3RyaW5nKHdzLCB3cCk7Ci0JCQkJCWRwID0gd2RzdHJpcChzcCwgdHJ1ZSwgZmFsc2UpOwotCQkJCQlzID0gcHVzaHMoU1JFUkVBRCwgc291cmNlLT5hcmVhcCk7Ci0JCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcy0+dS5mcmVlbWUgPSBkcDsKLQkJCQkJcy0+bmV4dCA9IHNvdXJjZTsKLQkJCQkJc291cmNlID0gczsKLQkJCQkJcmV0dXJuICgnKCcvKikqLyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjID09ICcoJykKLQkJCQkvKiBwYXJlbnRoZXNpcyBpbnNpZGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcwotCQkJCSAqIGFyZSBsb3N0LCBidXQgQVQmVCBrc2ggZG9lc24ndCBjb3VudCB0aGVtCi0JCQkJICogZWl0aGVyCi0JCQkJICovCi0JCQkJKytzdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW47Ci0JCQlnb3RvIFNiYXNlMjsKLQotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWNhc2UgU0xFVEFSUkFZOgkvKiBMRVRBUlJBWTogPSggLi4uICkgKi8KLQkJCWlmIChjID09ICcoJy8qKSovKQotCQkJCSsrc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuOwotCQkJZWxzZSBpZiAoYyA9PSAvKigqLycpJykKLQkJCQlpZiAoc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuLS0gPT0gMCkgewotCQkJCQljID0gMDsKLQkJCQkJZ290byBEb25lOwotCQkJCX0KLQkJCSp3cCsrID0gQ0hBUjsKLQkJCSp3cCsrID0gYzsKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSBTSEVSRVNUUklORzoJLyogPDw8IGRlbGltaXRlciAqLwotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCWMgPSBnZXRzYygpOwotCQkJCWlmIChjKSB7Ci0JCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLwotCQkJCQkqd3ArKyA9IFFDSEFSOwotCQkJCQkqd3ArKyA9IGM7Ci0JCQkJfQotCQkJCS8qIGludm9rZSBxdW90aW5nIG1vZGUgKi8KLQkJCQlYc3RyaW5nKHdzLCB3cClbMF0gPSBRQ0hBUjsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnJCcpIHsKLQkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJ1wnJykgewotCQkJCQlQVVNIX1NUQVRFKFNFUVVPVEUpOwotCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IGZhbHNlOwotCQkJCQlnb3RvIHNoZXJlc3RyaW5nX3F1b3RlZDsKLQkJCQl9Ci0JCQkJdW5nZXRzYyhjMik7Ci0JCQkJZ290byBzaGVyZXN0cmluZ19yZWd1bGFyOwotCQkJfSBlbHNlIGlmIChjID09ICdcJycpIHsKLQkJCQlQVVNIX1NUQVRFKFNTUVVPVEUpOwotIHNoZXJlc3RyaW5nX3F1b3RlZDoKLQkJCQkqd3ArKyA9IE9RVU9URTsKLQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKLQkJCQkvKiBpbnZva2UgcXVvdGluZyBtb2RlICovCi0JCQkJWHN0cmluZyh3cywgd3ApWzBdID0gUUNIQVI7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJyInKSB7Ci0JCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gU0hFUkVEUVVPVEU7Ci0JCQkJKndwKysgPSBPUVVPVEU7Ci0JCQkJLyoganVzdCBkb24ndCBJRlMgc3BsaXQ7IG5vIHF1b3RpbmcgbW9kZSAqLwotCQkJfSBlbHNlIHsKLSBzaGVyZXN0cmluZ19yZWd1bGFyOgotCQkJCSp3cCsrID0gQ0hBUjsKLQkJCQkqd3ArKyA9IGM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNIRVJFREVMSU06CS8qIDw8LDw8LSBkZWxpbWl0ZXIgKi8KLQkJCS8qIFhYWCBjaHVjayB0aGlzIHN0YXRlIChhbmQgdGhlIG5leHQpIC0gdXNlCi0JCQkgKiB0aGUgZXhpc3Rpbmcgc3RhdGVzICgkIGFuZCBcYC4uLmAgc2hvdWxkIGJlCi0JCQkgKiBzdHJpcHBlZCBvZiB0aGVpciBzcGVjaWFsbmVzcyBhZnRlciB0aGUKLQkJCSAqIGZhY3QpLgotCQkJICovCi0JCQkvKiBoZXJlIGRlbGltaXRlcnMgbmVlZCBhIHNwZWNpYWwgY2FzZSBzaW5jZQotCQkJICogJCBhbmQgYC4uLmAgYXJlIG5vdCB0byBiZSB0cmVhdGVkIHNwZWNpYWxseQotCQkJICovCi0JCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJYyA9IGdldHNjKCk7Ci0JCQkJaWYgKGMpIHsKLQkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCi0JCQkJCSp3cCsrID0gUUNIQVI7Ci0JCQkJCSp3cCsrID0gYzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJyQnKSB7Ci0JCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICdcJycpIHsKLQkJCQkJUFVTSF9TVEFURShTRVFVT1RFKTsKLQkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSBmYWxzZTsKLQkJCQkJZ290byBzaGVyZWRlbGltX3F1b3RlZDsKLQkJCQl9Ci0JCQkJdW5nZXRzYyhjMik7Ci0JCQkJZ290byBzaGVyZWRlbGltX3JlZ3VsYXI7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgewotCQkJCVBVU0hfU1RBVEUoU1NRVU9URSk7Ci0gc2hlcmVkZWxpbV9xdW90ZWQ6Ci0JCQkJKndwKysgPSBPUVVPVEU7Ci0JCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJyInKSB7Ci0JCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gU0hFUkVEUVVPVEU7Ci0JCQkJKndwKysgPSBPUVVPVEU7Ci0JCQl9IGVsc2UgewotIHNoZXJlZGVsaW1fcmVndWxhcjoKLQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJKndwKysgPSBjOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTSEVSRURRVU9URToJLyogIiBpbiA8PCw8PC0gZGVsaW1pdGVyICovCi0JCQlpZiAoYyA9PSAnIicpIHsKLQkJCQkqd3ArKyA9IENRVU9URTsKLQkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPQotCQkJCSAgICAvKiBkcFsxXSA9PSAnPCcgbWVhbnMgaGVyZSBzdHJpbmcgKi8KLQkJCQkgICAgWHN0cmluZyh3cywgd3ApWzFdID09ICc8JyA/Ci0JCQkJICAgIFNIRVJFU1RSSU5HIDogU0hFUkVERUxJTTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCQlzd2l0Y2ggKGMgPSBnZXRzYygpKSB7Ci0JCQkJCWNhc2UgJ1xcJzogY2FzZSAnIic6Ci0JCQkJCWNhc2UgJyQnOiBjYXNlICdgJzoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJaWYgKGMpIHsKLQkJCQkJCQkvKiB0cmFpbGluZyBcIGxvc3QgKi8KLQkJCQkJCQkqd3ArKyA9IENIQVI7Ci0JCQkJCQkJKndwKysgPSAnXFwnOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJKndwKysgPSBDSEFSOwotCQkJCSp3cCsrID0gYzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BBVFRFUk46CS8qIGluICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCi0JCQlpZiAoIC8qKCovIGMgPT0gJyknKSB7Ci0JCQkJKndwKysgPSBDUEFUOwotCQkJCVBPUF9TVEFURSgpOwotCQkJfSBlbHNlIGlmIChjID09ICd8JykgewotCQkJCSp3cCsrID0gU1BBVDsKLQkJCX0gZWxzZSBpZiAoYyA9PSAnKCcpIHsKLQkJCQkqd3ArKyA9IE9QQVQ7Ci0JCQkJKndwKysgPSAnICc7CS8qIHNpbWlsZSBmb3IgQCAqLwotCQkJCVBVU0hfU1RBVEUoU1BBVFRFUk4pOwotCQkJfSBlbHNlCi0JCQkJZ290byBTYmFzZTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLSBEb25lOgotCVhjaGVjayh3cywgd3ApOwotCWlmIChzdGF0ZXAgIT0gJnN0YXRlc1sxXSkKLQkJLyogWFhYIGZpZ3VyZSBvdXQgd2hhdCBpcyBtaXNzaW5nICovCi0JCXl5ZXJyb3IoIm5vIGNsb3NpbmcgcXVvdGVcbiIpOwotCi0jaWZuZGVmIE1LU0hfU01BTEwKLQlpZiAoc3RhdGUgPT0gU0xFVEFSUkFZICYmIHN0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbiAhPSAtMSkKLQkJeXllcnJvcigiJXM6ICcpJyBtaXNzaW5nXG4iLCBUX3N5bmVycik7Ci0jZW5kaWYKLQotCS8qIFRoaXMgZG9uZSB0byBhdm9pZCB0ZXN0cyBmb3IgU0hFUkVERUxJTSB3aGVyZXZlciBTQkFTRSB0ZXN0ZWQgKi8KLQlpZiAoc3RhdGUgPT0gU0hFUkVERUxJTSB8fCBzdGF0ZSA9PSBTSEVSRVNUUklORykKLQkJc3RhdGUgPSBTQkFTRTsKLQotCWRwID0gWHN0cmluZyh3cywgd3ApOwotCWlmICgoYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwgYyA9PSAnJicpICYmIHN0YXRlID09IFNCQVNFKSB7Ci0JCXN0cnVjdCBpb3dvcmQgKmlvcCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgaW93b3JkKSwgQVRFTVApOwotCi0JCWlmIChYbGVuZ3RoKHdzLCB3cCkgPT0gMCkKLQkJCWlvcC0+dW5pdCA9IGMgPT0gJzwnID8gMCA6IDE7Ci0JCWVsc2UgZm9yIChpb3AtPnVuaXQgPSAwLCBjMiA9IDA7IGMyIDwgWGxlbmd0aCh3cywgd3ApOyBjMiArPSAyKSB7Ci0JCQlpZiAoZHBbYzJdICE9IENIQVIpCi0JCQkJZ290byBub19pb3A7Ci0JCQlpZiAoIWtzaF9pc2RpZ2l0KGRwW2MyICsgMV0pKQotCQkJCWdvdG8gbm9faW9wOwotCQkJaW9wLT51bml0ID0gKGlvcC0+dW5pdCAqIDEwKSArIGRwW2MyICsgMV0gLSAnMCc7Ci0JCX0KLQotCQlpZiAoaW9wLT51bml0ID49IEZEQkFTRSkKLQkJCWdvdG8gbm9faW9wOwotCi0JCWlmIChjID09ICcmJykgewotCQkJaWYgKChjMiA9IGdldHNjKCkpICE9ICc+JykgewotCQkJCXVuZ2V0c2MoYzIpOwotCQkJCWdvdG8gbm9faW9wOwotCQkJfQotCQkJYyA9IGMyOwotCQkJaW9wLT5mbGFnID0gSU9CQVNIOwotCQl9IGVsc2UKLQkJCWlvcC0+ZmxhZyA9IDA7Ci0KLQkJYzIgPSBnZXRzYygpOwotCQkvKiA8PCwgPj4sIDw+IGFyZSBvaywgPjwgaXMgbm90ICovCi0JCWlmIChjID09IGMyIHx8IChjID09ICc8JyAmJiBjMiA9PSAnPicpKSB7Ci0JCQlpb3AtPmZsYWcgfD0gYyA9PSBjMiA/Ci0JCQkgICAgKGMgPT0gJz4nID8gSU9DQVQgOiBJT0hFUkUpIDogSU9SRFdSOwotCQkJaWYgKGlvcC0+ZmxhZyA9PSBJT0hFUkUpIHsKLQkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJy0nKQotCQkJCQlpb3AtPmZsYWcgfD0gSU9TS0lQOwotCQkJCWVsc2UKLQkJCQkJdW5nZXRzYyhjMik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYzIgPT0gJyYnKQotCQkJaW9wLT5mbGFnIHw9IElPRFVQIHwgKGMgPT0gJzwnID8gSU9SRFVQIDogMCk7Ci0JCWVsc2UgewotCQkJaW9wLT5mbGFnIHw9IGMgPT0gJz4nID8gSU9XUklURSA6IElPUkVBRDsKLQkJCWlmIChjID09ICc+JyAmJiBjMiA9PSAnfCcpCi0JCQkJaW9wLT5mbGFnIHw9IElPQ0xPQjsKLQkJCWVsc2UKLQkJCQl1bmdldHNjKGMyKTsKLQkJfQotCi0JCWlvcC0+bmFtZSA9IE5VTEw7Ci0JCWlvcC0+ZGVsaW0gPSBOVUxMOwotCQlpb3AtPmhlcmVkb2MgPSBOVUxMOwotCQlYZnJlZSh3cywgd3ApOwkvKiBmcmVlIHdvcmQgKi8KLQkJeXlsdmFsLmlvcCA9IGlvcDsKLQkJcmV0dXJuIChSRURJUik7Ci0gbm9faW9wOgotCQk7Ci0JfQotCi0JaWYgKHdwID09IGRwICYmIHN0YXRlID09IFNCQVNFKSB7Ci0JCVhmcmVlKHdzLCB3cCk7CS8qIGZyZWUgd29yZCAqLwotCQkvKiBubyB3b3JkLCBwcm9jZXNzIExFWDEgY2hhcmFjdGVyICovCi0JCWlmICgoYyA9PSAnfCcpIHx8IChjID09ICcmJykgfHwgKGMgPT0gJzsnKSB8fCAoYyA9PSAnKCcvKikqLykpIHsKLQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSBjKQotCQkJCWMgPSAoYyA9PSAnOycpID8gQlJFQUsgOgotCQkJCSAgICAoYyA9PSAnfCcpID8gTE9HT1IgOgotCQkJCSAgICAoYyA9PSAnJicpID8gTE9HQU5EIDoKLQkJCQkgICAgLyogYyA9PSAnKCcgKSAqLyBNRFBBUkVOOwotCQkJZWxzZSBpZiAoYyA9PSAnfCcgJiYgYzIgPT0gJyYnKQotCQkJCWMgPSBDT1BST0M7Ci0JCQllbHNlCi0JCQkJdW5nZXRzYyhjMik7Ci0JCX0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0JCQlnZXRoZXJlKGZhbHNlKTsKLQkJCWlmIChjZiAmIENPTlRJTikKLQkJCQlnb3RvIEFnYWluOwotCQl9IGVsc2UgaWYgKGMgPT0gJ1wwJykKLQkJCS8qIG5lZWQgaGVyZSBzdHJpbmdzIGF0IEVPRiAqLwotCQkJZ2V0aGVyZSh0cnVlKTsKLQkJcmV0dXJuIChjKTsKLQl9Ci0KLQkqd3ArKyA9IEVPUzsJCS8qIHRlcm1pbmF0ZSB3b3JkICovCi0JeXlsdmFsLmNwID0gWGNsb3NlKHdzLCB3cCk7Ci0JaWYgKHN0YXRlID09IFNXT1JEIHx8IHN0YXRlID09IFNMRVRQQVJFTgotCSAgICAvKiBYWFggT05FV09SRD8gKi8KLSNpZm5kZWYgTUtTSF9TTUFMTAotCSAgICB8fCBzdGF0ZSA9PSBTTEVUQVJSQVkKLSNlbmRpZgotCSAgICApCi0JCXJldHVybiAoTFdPUkQpOwotCi0JLyogdW5nZXQgdGVybWluYXRvciAqLwotCXVuZ2V0c2MoYyk7Ci0KLQkvKgotCSAqIG5vdGU6IHRoZSBhbGlhcy12cy1mdW5jdGlvbiBjb2RlIGJlbG93IGRlcGVuZHMgb24gc2V2ZXJhbAotCSAqIGludGVybmE6IHN0YXJ0aW5nIGZyb20gaGVyZSwgc291cmNlLT5zdHIgaXMgbm90IG1vZGlmaWVkOwotCSAqIHRoZSB3YXkgZ2V0c2MoKSBhbmQgdW5nZXRzYygpIG9wZXJhdGU7IGV0Yy4KLQkgKi8KLQotCS8qIGNvcHkgd29yZCB0byB1bnByZWZpeGVkIHN0cmluZyBpZGVudCAqLwotCXNwID0geXlsdmFsLmNwOwotCWRwID0gaWRlbnQ7Ci0JaWYgKChjZiAmIEhFUkVERUxJTSkgJiYgKHNwWzFdID09ICc8JykpCi0JCXdoaWxlIChkcCA8IGlkZW50K0lERU5UKSB7Ci0JCQlpZiAoKGMgPSAqc3ArKykgPT0gQ0hBUikKLQkJCQkqZHArKyA9ICpzcCsrOwotCQkJZWxzZSBpZiAoKGMgIT0gT1FVT1RFKSAmJiAoYyAhPSBDUVVPVEUpKQotCQkJCWJyZWFrOwotCQl9Ci0JZWxzZQotCQl3aGlsZSAoZHAgPCBpZGVudCtJREVOVCAmJiAoYyA9ICpzcCsrKSA9PSBDSEFSKQotCQkJKmRwKysgPSAqc3ArKzsKLQkvKiBNYWtlIHN1cmUgdGhlIGlkZW50IGFycmF5IHN0YXlzICdcMCcgcGFkZGVkICovCi0JbWVtc2V0KGRwLCAwLCAoaWRlbnQrSURFTlQpIC0gZHAgKyAxKTsKLQlpZiAoYyAhPSBFT1MpCi0JCSppZGVudCA9ICdcMCc7CS8qIHdvcmQgaXMgbm90IHVucXVvdGVkICovCi0KLQlpZiAoKmlkZW50ICE9ICdcMCcgJiYgKGNmJihLRVlXT1JEfEFMSUFTKSkpIHsKLQkJc3RydWN0IHRibCAqcDsKLQkJdWludDMyX3QgaCA9IGhhc2goaWRlbnQpOwotCi0JCS8qIHsgKi8KLQkJaWYgKChjZiAmIEtFWVdPUkQpICYmIChwID0ga3RzZWFyY2goJmtleXdvcmRzLCBpZGVudCwgaCkpICYmCi0JCSAgICAoIShjZiAmIEVTQUNPTkxZKSB8fCBwLT52YWwuaSA9PSBFU0FDIHx8IHAtPnZhbC5pID09ICd9JykpIHsKLQkJCWFmcmVlKHl5bHZhbC5jcCwgQVRFTVApOwotCQkJcmV0dXJuIChwLT52YWwuaSk7Ci0JCX0KLQkJaWYgKChjZiAmIEFMSUFTKSAmJiAocCA9IGt0c2VhcmNoKCZhbGlhc2VzLCBpZGVudCwgaCkpICYmCi0JCSAgICAocC0+ZmxhZyAmIElTU0VUKSkgewotCQkJLyoKLQkJCSAqIHRoaXMgc3RpbGwgcG9pbnRzIHRvIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUKLQkJCSAqIHVuZ2V0c2MnZCB0ZXJtaW5hdG9yIGZyb20gYWJvdmUKLQkJCSAqLwotCQkJY29uc3QgY2hhciAqY3AgPSBzb3VyY2UtPnN0cjsKLQotCQkJLyogcHJlZmVyIFBPU0lYIGJ1dCBub3QgS29ybiBmdW5jdGlvbnMgb3ZlciBhbGlhc2VzICovCi0JCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKLQkJCQkvKgotCQkJCSAqIHRoaXMgaXMgbGlrZSBnZXRzYygpIHdpdGhvdXQgc2tpcHBpbmcKLQkJCQkgKiBvdmVyIFNvdXJjZSBib3VuZGFyaWVzIChpbmNsdWRpbmcgbm90Ci0JCQkJICogcGFyc2luZyB1bmdldHNjJ2QgY2hhcmFjdGVycyB0aGF0IGdvdAotCQkJCSAqIHB1c2hlZCBpbnRvIGFuIFNSRVJFQUQpIHdoaWNoIGlzIHdoYXQKLQkJCQkgKiB3ZSB3YW50IGhlcmUgYW55d2F5OiBmaW5kIG91dCB3aGV0aGVyCi0JCQkJICogdGhlIGFsaWFzIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBQT1NJWAotCQkJCSAqIGZ1bmN0aW9uIGRlZmluaXRpb24gKG9ubHkgdGhlIG9wZW5pbmcKLQkJCQkgKiBwYXJlbnRoZXNpcyBpcyBjaGVja2VkIHRob3VnaCkKLQkJCQkgKi8KLQkJCQkrK2NwOwotCQkJLyogcHJlZmVyIGZ1bmN0aW9ucyBvdmVyIGFsaWFzZXMgKi8KLQkJCWlmICgqY3AgPT0gJygnIC8qKSovKQotCQkJCS8qCi0JCQkJICogZGVsZXRlIGFsaWFzIHVwb24gZW5jb3VudGVyaW5nIGZ1bmN0aW9uCi0JCQkJICogZGVmaW5pdGlvbgotCQkJCSAqLwotCQkJCWt0ZGVsZXRlKHApOwotCQkJZWxzZSB7Ci0JCQkJU291cmNlICpzID0gc291cmNlOwotCi0JCQkJd2hpbGUgKHMgJiYgKHMtPmZsYWdzICYgU0ZfSEFTQUxJQVMpKQotCQkJCQlpZiAocy0+dS50YmxwID09IHApCi0JCQkJCQlyZXR1cm4gKExXT1JEKTsKLQkJCQkJZWxzZQotCQkJCQkJcyA9IHMtPm5leHQ7Ci0JCQkJLyogcHVzaCBhbGlhcyBleHBhbnNpb24gKi8KLQkJCQlzID0gcHVzaHMoU0FMSUFTLCBzb3VyY2UtPmFyZWFwKTsKLQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IHAtPnZhbC5zOwotCQkJCXMtPnUudGJscCA9IHA7Ci0JCQkJcy0+ZmxhZ3MgfD0gU0ZfSEFTQUxJQVM7Ci0JCQkJcy0+bmV4dCA9IHNvdXJjZTsKLQkJCQlpZiAoc291cmNlLT50eXBlID09IFNFT0YpIHsKLQkJCQkJLyogcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gYXQgRU9TICovCi0JCQkJCXNvdXJjZS0+dS50YmxwID0gcDsKLQkJCQkJc291cmNlLT5mbGFncyB8PSBTRl9IQVNBTElBUzsKLQkJCQl9Ci0JCQkJc291cmNlID0gczsKLQkJCQlhZnJlZSh5eWx2YWwuY3AsIEFURU1QKTsKLQkJCQlnb3RvIEFnYWluOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIChMV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRoZXJlKGJvb2wgaXNlb2YpCi17Ci0Jc3RydWN0IGlvd29yZCAqKnA7Ci0KLQlmb3IgKHAgPSBoZXJlczsgcCA8IGhlcmVwOyBwKyspCi0JCWlmIChpc2VvZiAmJiAoKnApLT5kZWxpbVsxXSAhPSAnPCcpCi0JCQkvKiBvbmx5IGhlcmUgc3RyaW5ncyBhdCBFT0YgKi8KLQkJCXJldHVybjsKLQkJZWxzZQotCQkJcmVhZGhlcmUoKnApOwotCWhlcmVwID0gaGVyZXM7Ci19Ci0KLS8qCi0gKiByZWFkICI8PHdvcmQiIHRleHQgaW50byB0ZW1wIGZpbGUKLSAqLwotCi1zdGF0aWMgdm9pZAotcmVhZGhlcmUoc3RydWN0IGlvd29yZCAqaW9wKQotewotCWludCBjOwotCWNoYXIgKnZvbGF0aWxlIGVvZjsKLQljaGFyICplb2ZwOwotCWludCBza2lwdGFiczsKLQlYU3RyaW5nIHhzOwotCWNoYXIgKnhwOwotCWludCB4cG9zOwotCi0JaWYgKGlvcC0+ZGVsaW1bMV0gPT0gJzwnKSB7Ci0JCS8qIHByb2Nlc3MgdGhlIGhlcmUgc3RyaW5nICovCi0JCXhwID0gaW9wLT5oZXJlZG9jID0gZXZhbHN0cihpb3AtPmRlbGltLCBET0JMQU5LKTsKLQkJYyA9IHN0cmxlbih4cCkgLSAxOwotCQltZW1tb3ZlKHhwLCB4cCArIDEsIGMpOwotCQl4cFtjXSA9ICdcbic7Ci0JCXJldHVybjsKLQl9Ci0KLQllb2YgPSBldmFsc3RyKGlvcC0+ZGVsaW0sIDApOwotCi0JaWYgKCEoaW9wLT5mbGFnICYgSU9FVkFMKSkKLQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7Ci0KLQlYaW5pdCh4cywgeHAsIDI1NiwgQVRFTVApOwotCi0JZm9yICg7OykgewotCQllb2ZwID0gZW9mOwotCQlza2lwdGFicyA9IGlvcC0+ZmxhZyAmIElPU0tJUDsKLQkJeHBvcyA9IFhzYXZlcG9zKHhzLCB4cCk7Ci0JCXdoaWxlICgoYyA9IGdldHNjKCkpICE9IDApIHsKLQkJCWlmIChza2lwdGFicykgewotCQkJCWlmIChjID09ICdcdCcpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXNraXB0YWJzID0gMDsKLQkJCX0KLQkJCWlmIChjICE9ICplb2ZwKQotCQkJCWJyZWFrOwotCQkJWGNoZWNrKHhzLCB4cCk7Ci0JCQlYcHV0KHhzLCB4cCwgYyk7Ci0JCQllb2ZwKys7Ci0JCX0KLQkJLyogQWxsb3cgRU9GIGhlcmUgc28gY29tbWFuZHMgd2l0aCBvdXQgdHJhaWxpbmcgbmV3bGluZXMKLQkJICogd2lsbCB3b3JrIChlZywga3NoIC1jICcuLi4nLCAkKC4uLiksIGV0YykuCi0JCSAqLwotCQlpZiAoKmVvZnAgPT0gJ1wwJyAmJiAoYyA9PSAwIHx8IGMgPT0gJ1xuJykpIHsKLQkJCXhwID0gWHJlc3Rwb3MoeHMsIHhwLCB4cG9zKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXVuZ2V0c2MoYyk7Ci0JCXdoaWxlICgoYyA9IGdldHNjKCkpICE9ICdcbicpIHsKLQkJCWlmIChjID09IDApCi0JCQkJeXllcnJvcigiaGVyZSBkb2N1bWVudCAnJXMnIHVuY2xvc2VkXG4iLCBlb2YpOwotCQkJWGNoZWNrKHhzLCB4cCk7Ci0JCQlYcHV0KHhzLCB4cCwgYyk7Ci0JCX0KLQkJWGNoZWNrKHhzLCB4cCk7Ci0JCVhwdXQoeHMsIHhwLCBjKTsKLQl9Ci0JWHB1dCh4cywgeHAsICdcMCcpOwotCWlvcC0+aGVyZWRvYyA9IFhjbG9zZSh4cywgeHApOwotCi0JaWYgKCEoaW9wLT5mbGFnICYgSU9FVkFMKSkKLQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07Ci19Ci0KLXZvaWQKLXl5ZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCS8qIHBvcCBhbGlhc2VzIGFuZCByZS1yZWFkcyAqLwotCXdoaWxlIChzb3VyY2UtPnR5cGUgPT0gU0FMSUFTIHx8IHNvdXJjZS0+dHlwZSA9PSBTUkVSRUFEKQotCQlzb3VyY2UgPSBzb3VyY2UtPm5leHQ7Ci0Jc291cmNlLT5zdHIgPSBudWxsOwkvKiB6YXAgcGVuZGluZyBpbnB1dCAqLwotCi0JZXJyb3JfcHJlZml4KHRydWUpOwotCXZhX3N0YXJ0KHZhLCBmbXQpOwotCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCWVycm9yZnooKTsKLX0KLQotLyoKLSAqIGlucHV0IGZvciB5eWxleCB3aXRoIGFsaWFzIGV4cGFuc2lvbgotICovCi0KLVNvdXJjZSAqCi1wdXNocyhpbnQgdHlwZSwgQXJlYSAqYXJlYXApCi17Ci0JU291cmNlICpzOwotCi0JcyA9IGFsbG9jKHNpemVvZihTb3VyY2UpLCBhcmVhcCk7Ci0JbWVtc2V0KHMsIDAsIHNpemVvZihTb3VyY2UpKTsKLQlzLT50eXBlID0gdHlwZTsKLQlzLT5zdHIgPSBudWxsOwotCXMtPmFyZWFwID0gYXJlYXA7Ci0JaWYgKHR5cGUgPT0gU0ZJTEUgfHwgdHlwZSA9PSBTU1RESU4pCi0JCVhpbml0TihzLT54cywgMjU2LCBzLT5hcmVhcCk7Ci0JcmV0dXJuIChzKTsKLX0KLQotc3RhdGljIGludAotZ2V0c2NfXyh2b2lkKQotewotCVNvdXJjZSAqcyA9IHNvdXJjZTsKLQlpbnQgYzsKLQotIGdldHNjX2FnYWluOgotCXdoaWxlICgoYyA9ICpzLT5zdHIrKykgPT0gMCkgewotCQlzLT5zdHIgPSBOVUxMOwkJLyogcmV0dXJuIDAgZm9yIEVPRiBieSBkZWZhdWx0ICovCi0JCXN3aXRjaCAocy0+dHlwZSkgewotCQljYXNlIFNFT0Y6Ci0JCQlzLT5zdHIgPSBudWxsOwotCQkJcmV0dXJuICgwKTsKLQotCQljYXNlIFNTVERJTjoKLQkJY2FzZSBTRklMRToKLQkJCWdldHNjX2xpbmUocyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNXU1RSOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU1RSSU5HOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTV09SRFM6Ci0JCQlzLT5zdGFydCA9IHMtPnN0ciA9ICpzLT51LnN0cnYrKzsKLQkJCXMtPnR5cGUgPSBTV09SRFNFUDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1dPUkRTRVA6Ci0JCQlpZiAoKnMtPnUuc3RydiA9PSBOVUxMKSB7Ci0JCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSAiXG4iOwotCQkJCXMtPnR5cGUgPSBTRU9GOwotCQkJfSBlbHNlIHsKLQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9ICIgIjsKLQkJCQlzLT50eXBlID0gU1dPUkRTOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTQUxJQVM6Ci0JCQlpZiAocy0+ZmxhZ3MgJiBTRl9BTElBU0VORCkgewotCQkJCS8qIHBhc3Mgb24gYW4gdW51c2VkIFNGX0FMSUFTIGZsYWcgKi8KLQkJCQlzb3VyY2UgPSBzLT5uZXh0OwotCQkJCXNvdXJjZS0+ZmxhZ3MgfD0gcy0+ZmxhZ3MgJiBTRl9BTElBUzsKLQkJCQlzID0gc291cmNlOwotCQkJfSBlbHNlIGlmICgqcy0+dS50YmxwLT52YWwucyAmJgotCQkJICAgIChjID0gc3RybnVsKHMtPnUudGJscC0+dmFsLnMpWy0xXSwga3NoX2lzc3BhY2UoYykpKSB7Ci0JCQkJc291cmNlID0gcyA9IHMtPm5leHQ7CS8qIHBvcCBzb3VyY2Ugc3RhY2sgKi8KLQkJCQkvKiBOb3RlIHRoYXQgdGhpcyBhbGlhcyBlbmRlZCB3aXRoIGEgc3BhY2UsCi0JCQkJICogZW5hYmxpbmcgYWxpYXMgZXhwYW5zaW9uIG9uIHRoZSBmb2xsb3dpbmcKLQkJCQkgKiB3b3JkLgotCQkJCSAqLwotCQkJCXMtPmZsYWdzIHw9IFNGX0FMSUFTOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGN1cnJlbnQKLQkJCQkgKiBhbGlhcyBpbiB0aGUgc291cmNlIGxpc3Qgc28gcmVjdXJzaXZlCi0JCQkJICogYWxpYXNlcyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIHdlIGFsc28gbmVlZAotCQkJCSAqIHRvIHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIuIERvIHRoaXMKLQkJCQkgKiBieSB0ZW1wb3JhcmlseSBwb3BwaW5nIHRoZSBhbGlhcyB0byBnZXQKLQkJCQkgKiB0aGUgbmV4dCBjaGFyYWN0ZXIgYW5kIHRoZW4gcHV0IGl0IGJhY2sKLQkJCQkgKiBpbiB0aGUgc291cmNlIGxpc3Qgd2l0aCB0aGUgU0ZfQUxJQVNFTkQKLQkJCQkgKiBmbGFnIHNldC4KLQkJCQkgKi8KLQkJCQlzb3VyY2UgPSBzLT5uZXh0OwkvKiBwb3Agc291cmNlIHN0YWNrICovCi0JCQkJc291cmNlLT5mbGFncyB8PSBzLT5mbGFncyAmIFNGX0FMSUFTOwotCQkJCWMgPSBnZXRzY19fKCk7Ci0JCQkJaWYgKGMpIHsKLQkJCQkJcy0+ZmxhZ3MgfD0gU0ZfQUxJQVNFTkQ7Ci0JCQkJCXMtPnVnYnVmWzBdID0gYzsgcy0+dWdidWZbMV0gPSAnXDAnOwotCQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IHMtPnVnYnVmOwotCQkJCQlzLT5uZXh0ID0gc291cmNlOwotCQkJCQlzb3VyY2UgPSBzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXMgPSBzb3VyY2U7Ci0JCQkJCS8qIGF2b2lkIHJlYWRpbmcgZW9mIHR3aWNlICovCi0JCQkJCXMtPnN0ciA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCi0JCWNhc2UgU1JFUkVBRDoKLQkJCWlmIChzLT5zdGFydCAhPSBzLT51Z2J1ZikJLyogeXVjayAqLwotCQkJCWFmcmVlKHMtPnUuZnJlZW1lLCBBVEVNUCk7Ci0JCQlzb3VyY2UgPSBzID0gcy0+bmV4dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzLT5zdHIgPT0gTlVMTCkgewotCQkJcy0+dHlwZSA9IFNFT0Y7Ci0JCQlzLT5zdGFydCA9IHMtPnN0ciA9IG51bGw7Ci0JCQlyZXR1cm4gKCdcMCcpOwotCQl9Ci0JCWlmIChzLT5mbGFncyAmIFNGX0VDSE8pIHsKLQkJCXNoZl9wdXRzKHMtPnN0ciwgc2hsX291dCk7Ci0JCQlzaGZfZmx1c2goc2hsX291dCk7Ci0JCX0KLQl9Ci0JLyogY2hlY2sgZm9yIFVURi04IGJ5dGUgb3JkZXIgbWFyayAqLwotCWlmIChzLT5mbGFncyAmIFNGX0ZJUlNUKSB7Ci0JCXMtPmZsYWdzICY9IH5TRl9GSVJTVDsKLQkJaWYgKCgodW5zaWduZWQgY2hhciljID09IDB4RUYpICYmCi0JCSAgICAoKChjb25zdCB1bnNpZ25lZCBjaGFyICopKHMtPnN0cikpWzBdID09IDB4QkIpICYmCi0JCSAgICAoKChjb25zdCB1bnNpZ25lZCBjaGFyICopKHMtPnN0cikpWzFdID09IDB4QkYpKSB7Ci0JCQlzLT5zdHIgKz0gMjsKLQkJCVVURk1PREUgPSAxOwotCQkJZ290byBnZXRzY19hZ2FpbjsKLQkJfQotCX0KLQlyZXR1cm4gKGMpOwotfQotCi1zdGF0aWMgdm9pZAotZ2V0c2NfbGluZShTb3VyY2UgKnMpCi17Ci0JY2hhciAqeHAgPSBYc3RyaW5nKHMtPnhzLCB4cCksICpjcDsKLQlib29sIGludGVyYWN0aXZlID0gRmxhZyhGVEFMS0lORykgJiYgcy0+dHlwZSA9PSBTU1RESU47Ci0JaW50IGhhdmVfdHR5ID0gaW50ZXJhY3RpdmUgJiYgKHMtPmZsYWdzICYgU0ZfVFRZKTsKLQotCS8qIERvbmUgaGVyZSB0byBlbnN1cmUgbm90aGluZyBvZGQgaGFwcGVucyB3aGVuIGEgdGltZW91dCBvY2N1cnMgKi8KLQlYY2hlY2tOKHMtPnhzLCB4cCwgTElORSk7Ci0JKnhwID0gJ1wwJzsKLQlzLT5zdGFydCA9IHMtPnN0ciA9IHhwOwotCi0JaWYgKGhhdmVfdHR5ICYmIGtzaF90bW91dCkgewotCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9SRUFESU5HOwotCQlhbGFybShrc2hfdG1vdXQpOwotCX0KLQlpZiAoaW50ZXJhY3RpdmUpCi0JCWNoYW5nZV93aW5zeigpOwotCWlmIChoYXZlX3R0eSAmJiAoCi0jaWYgIU1LU0hfU19OT1ZJCi0JICAgIEZsYWcoRlZJKSB8fAotI2VuZGlmCi0JICAgIEZsYWcoRkVNQUNTKSB8fCBGbGFnKEZHTUFDUykpKSB7Ci0JCWludCBucmVhZDsKLQotCQlucmVhZCA9IHhfcmVhZCh4cCwgTElORSk7Ci0JCWlmIChucmVhZCA8IDApCS8qIHJlYWQgZXJyb3IgKi8KLQkJCW5yZWFkID0gMDsKLQkJeHBbbnJlYWRdID0gJ1wwJzsKLQkJeHAgKz0gbnJlYWQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGludGVyYWN0aXZlKQotCQkJcHByb21wdChwcm9tcHQsIDApOwotCQllbHNlCi0JCQlzLT5saW5lKys7Ci0KLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKnAgPSBzaGZfZ2V0c2UoeHAsIFhubGVmdChzLT54cywgeHApLCBzLT51LnNoZik7Ci0KLQkJCWlmICghcCAmJiBzaGZfZXJyb3Iocy0+dS5zaGYpICYmCi0JCQkgICAgc2hmX2Vycm5vKHMtPnUuc2hmKSA9PSBFSU5UUikgewotCQkJCXNoZl9jbGVhcmVycihzLT51LnNoZik7Ci0JCQkJaWYgKHRyYXApCi0JCQkJCXJ1bnRyYXBzKDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFwIHx8ICh4cCA9IHAsIHhwWy0xXSA9PSAnXG4nKSkKLQkJCQlicmVhazsKLQkJCS8qIGRvdWJsZSBidWZmZXIgc2l6ZSAqLwotCQkJeHArKzsJLyogbW92ZSBwYXN0IE5VTCBzbyBkb3VibGluZyB3b3Jrcy4uLiAqLwotCQkJWGNoZWNrTihzLT54cywgeHAsIFhsZW5ndGgocy0+eHMsIHhwKSk7Ci0JCQl4cC0tOwkvKiAuLi5hbmQgbW92ZSBiYWNrIGFnYWluICovCi0JCX0KLQkJLyogZmx1c2ggYW55IHVud2FudGVkIGlucHV0IHNvIG90aGVyIHByb2dyYW1zL2J1aWx0aW5zCi0JCSAqIGNhbiByZWFkIGl0LiBOb3QgdmVyeSBvcHRpbWFsLCBidXQgbGVzcyBlcnJvciBwcm9uZQotCQkgKiB0aGFuIGZsdXNoaW5nIGVsc2Ugd2hlcmUsIGRlYWxpbmcgd2l0aCByZWRpcmVjdGlvbnMsCi0JCSAqIGV0Yy4KLQkJICogdG9kbzogcmVkdWNlIHNpemUgb2Ygc2hmIGJ1ZmZlciAofjEyOD8pIGlmIFNTVERJTgotCQkgKi8KLQkJaWYgKHMtPnR5cGUgPT0gU1NURElOKQotCQkJc2hmX2ZsdXNoKHMtPnUuc2hmKTsKLQl9Ci0JLyogWFhYOiB0ZW1wb3Jhcnkga2x1ZGdlIHRvIHJlc3RvcmUgc291cmNlIGFmdGVyIGEKLQkgKiB0cmFwIG1heSBoYXZlIGJlZW4gZXhlY3V0ZWQuCi0JICovCi0Jc291cmNlID0gczsKLQlpZiAoaGF2ZV90dHkgJiYga3NoX3Rtb3V0KSB7Ci0JCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX0VYRUNVVElORzsKLQkJYWxhcm0oMCk7Ci0JfQotCWNwID0gWHN0cmluZyhzLT54cywgeHApOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JaWYgKGludGVyYWN0aXZlICYmICpjcCA9PSAnIScgJiYgY3VyX3Byb21wdCA9PSBQUzEpIHsKLQkJaW50IGxpbmVsZW47Ci0KLQkJbGluZWxlbiA9IFhsZW5ndGgocy0+eHMsIHhwKTsKLQkJWGNoZWNrTihzLT54cywgeHAsIGZjX2VfbiArIC8qIE5VTCAqLyAxKTsKLQkJLyogcmVsb2FkIGFmdGVyIHBvdGVudGlhbCByZWFsbG9jICovCi0JCWNwID0gWHN0cmluZyhzLT54cywgeHApOwotCQkvKiBjaGFuZ2UgaW5pdGlhbCAnIScgaW50byBzcGFjZSAqLwotCQkqY3AgPSAnICc7Ci0JCS8qIE5VTCB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgc3RyaW5nICovCi0JCSp4cCA9ICdcMCc7Ci0JCS8qIG1vdmUgdGhlIGFjdHVhbCBzdHJpbmcgZm9yd2FyZCAqLwotCQltZW1tb3ZlKGNwICsgZmNfZV9uLCBjcCwgbGluZWxlbiArIC8qIE5VTCAqLyAxKTsKLQkJeHAgKz0gZmNfZV9uOwotCQkvKiBwcmVwZW5kIGl0IHdpdGggImZjIC1lIC0iICovCi0JCW1lbWNweShjcCwgZmNfZV8sIGZjX2Vfbik7Ci0JfQotI2VuZGlmCi0Jcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKLQlzdHJpcF9udWxzKFhzdHJpbmcocy0+eHMsIHhwKSwgWGxlbmd0aChzLT54cywgeHApKTsKLQkvKiBOb3RlOiBpZiBpbnB1dCBpcyBhbGwgbnVsbHMsIHRoaXMgaXMgbm90IGVvZiAqLwotCWlmIChYbGVuZ3RoKHMtPnhzLCB4cCkgPT0gMCkgewotCQkvKiBFT0YgKi8KLQkJaWYgKHMtPnR5cGUgPT0gU0ZJTEUpCi0JCQlzaGZfZmRjbG9zZShzLT51LnNoZik7Ci0JCXMtPnN0ciA9IE5VTEw7Ci0JfSBlbHNlIGlmIChpbnRlcmFjdGl2ZSAmJiAqcy0+c3RyICYmCi0JICAgIChjdXJfcHJvbXB0ICE9IFBTMSB8fCAhY3R5cGUoKnMtPnN0ciwgQ19JRlMgfCBDX0lGU1dTKSkpIHsKLQkJaGlzdHNhdmUoJnMtPmxpbmUsIHMtPnN0ciwgdHJ1ZSwgdHJ1ZSk7Ci0jaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQl9IGVsc2UgaWYgKGludGVyYWN0aXZlICYmIGN1cl9wcm9tcHQgPT0gUFMxKSB7Ci0JCWNwID0gWHN0cmluZyhzLT54cywgeHApOwotCQl3aGlsZSAoKmNwICYmIGN0eXBlKCpjcCwgQ19JRlNXUykpCi0JCQkrK2NwOwotCQlpZiAoISpjcCkKLQkJCWhpc3RzeW5jKCk7Ci0jZW5kaWYKLQl9Ci0JaWYgKGludGVyYWN0aXZlKQotCQlzZXRfcHJvbXB0KFBTMiwgTlVMTCk7Ci19Ci0KLXZvaWQKLXNldF9wcm9tcHQoaW50IHRvLCBTb3VyY2UgKnMpCi17Ci0JY3VyX3Byb21wdCA9IHRvOwotCi0Jc3dpdGNoICh0bykgewotCWNhc2UgUFMxOgkvKiBjb21tYW5kICovCi0JCS8qIFN1YnN0aXR1dGUgISBhbmQgISEgaGVyZSwgYmVmb3JlIHN1YnN0aXR1dGlvbnMgYXJlIGRvbmUKLQkJICogc28gISBpbiBleHBhbmRlZCB2YXJpYWJsZXMgYXJlIG5vdCBleHBhbmRlZC4KLQkJICogTk9URTogdGhpcyBpcyBub3Qgd2hhdCBBVCZUIGtzaCBkb2VzIChpdCBkb2VzIGl0IGFmdGVyCi0JCSAqIHN1YnN0aXR1dGlvbnMsIFBPU0lYIGRvZXNuJ3Qgc2F5IHdoaWNoIGlzIHRvIGJlIGRvbmUuCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc2hmICpzaGY7Ci0JCQljaGFyICogdm9sYXRpbGUgcHMxOwotCQkJQXJlYSAqc2F2ZWRfYXRlbXA7Ci0KLQkJCXBzMSA9IHN0cl92YWwoZ2xvYmFsKCJQUzEiKSk7Ci0JCQlzaGYgPSBzaGZfc29wZW4oTlVMTCwgc3RybGVuKHBzMSkgKiAyLAotCQkJICAgIFNIRl9XUiB8IFNIRl9EWU5BTUlDLCBOVUxMKTsKLQkJCXdoaWxlICgqcHMxKQotCQkJCWlmICgqcHMxICE9ICchJyB8fCAqKytwczEgPT0gJyEnKQotCQkJCQlzaGZfcHV0Y2hhcigqcHMxKyssIHNoZik7Ci0JCQkJZWxzZQotCQkJCQlzaGZfZnByaW50ZihzaGYsICIlZCIsCi0JCQkJCQlzID8gcy0+bGluZSArIDEgOiAwKTsKLQkJCXBzMSA9IHNoZl9zY2xvc2Uoc2hmKTsKLQkJCXNhdmVkX2F0ZW1wID0gQVRFTVA7Ci0JCQluZXdlbnYoRV9FUlJIKTsKLQkJCWlmIChzaWdzZXRqbXAoZS0+amJ1ZiwgMCkpIHsKLQkJCQlwcm9tcHQgPSBzYWZlX3Byb21wdDsKLQkJCQkvKiBEb24ndCBwcmludCBhbiBlcnJvciAtIGFzc3VtZSBpdCBoYXMgYWxyZWFkeQotCQkJCSAqIGJlZW4gcHJpbnRlZC4gUmVhc29uIGlzIHdlIG1heSBoYXZlIGZvcmtlZAotCQkJCSAqIHRvIHJ1biBhIGNvbW1hbmQgYW5kIHRoZSBjaGlsZCBtYXkgYmUKLQkJCQkgKiB1bndpbmRpbmcgaXRzIHN0YWNrIHRocm91Z2ggdGhpcyBjb2RlIGFzIGl0Ci0JCQkJICogZXhpdHMuCi0JCQkJICovCi0JCQl9IGVsc2UgewotCQkJCWNoYXIgKmNwID0gc3Vic3RpdHV0ZShwczEsIDApOwotCQkJCXN0cmR1cHgocHJvbXB0LCBjcCwgc2F2ZWRfYXRlbXApOwotCQkJfQotCQkJcXVpdGVudihOVUxMKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFBTMjoJLyogY29tbWFuZCBjb250aW51YXRpb24gKi8KLQkJcHJvbXB0ID0gc3RyX3ZhbChnbG9iYWwoIlBTMiIpKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1kb3Bwcm9tcHQoY29uc3QgY2hhciAqY3AsIGludCBudHJ1bmNhdGUsIGJvb2wgZG9wcmludCkKLXsKLQlpbnQgY29sdW1ucyA9IDAsIGxpbmVzID0gMCwgaW5kZWxpbWl0ID0gMDsKLQljaGFyIGRlbGltaXRlciA9IDA7Ci0KLQkvKiBVbmRvY3VtZW50ZWQgQVQmVCBrc2ggZmVhdHVyZToKLQkgKiBJZiB0aGUgc2Vjb25kIGNoYXIgaW4gdGhlIHByb21wdCBzdHJpbmcgaXMgXHIgdGhlbiB0aGUgZmlyc3QgY2hhcgotCSAqIGlzIHRha2VuIHRvIGJlIGEgbm9uLXByaW50aW5nIGRlbGltaXRlciBhbmQgYW55IGNoYXJzIGJldHdlZW4gdHdvCi0JICogaW5zdGFuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHBhcnQgb2YgdGhlCi0JICogcHJvbXB0IGxlbmd0aAotCSAqLwotCWlmICgqY3AgJiYgY3BbMV0gPT0gJ1xyJykgewotCQlkZWxpbWl0ZXIgPSAqY3A7Ci0JCWNwICs9IDI7Ci0JfQotCWZvciAoOyAqY3A7IGNwKyspIHsKLQkJaWYgKGluZGVsaW1pdCAmJiAqY3AgIT0gZGVsaW1pdGVyKQotCQkJOwotCQllbHNlIGlmICgqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgewotCQkJbGluZXMgKz0gY29sdW1ucyAvIHhfY29scyArICgoKmNwID09ICdcbicpID8gMSA6IDApOwotCQkJY29sdW1ucyA9IDA7Ci0JCX0gZWxzZSBpZiAoKmNwID09ICdcdCcpIHsKLQkJCWNvbHVtbnMgPSAoY29sdW1ucyB8IDcpICsgMTsKLQkJfSBlbHNlIGlmICgqY3AgPT0gJ1xiJykgewotCQkJaWYgKGNvbHVtbnMgPiAwKQotCQkJCWNvbHVtbnMtLTsKLQkJfSBlbHNlIGlmICgqY3AgPT0gZGVsaW1pdGVyKQotCQkJaW5kZWxpbWl0ID0gIWluZGVsaW1pdDsKLQkJZWxzZSBpZiAoVVRGTU9ERSAmJiAoKHVuc2lnbmVkIGNoYXIpKmNwID4gMHg3RikpIHsKLQkJCWNvbnN0IGNoYXIgKmNwMjsKLQkJCWNvbHVtbnMgKz0gdXRmX3dpZHRoYWRqKGNwLCAmY3AyKTsKLQkJCWlmIChkb3ByaW50ICYmIChpbmRlbGltaXQgfHwKLQkJCSAgICAobnRydW5jYXRlIDwgKHhfY29scyAqIGxpbmVzICsgY29sdW1ucykpKSkKLQkJCQlzaGZfd3JpdGUoY3AsIGNwMiAtIGNwLCBzaGxfb3V0KTsKLQkJCWNwID0gY3AyIC0gLyogbG9vcCBpbmNyZW1lbnQgKi8gMTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UKLQkJCWNvbHVtbnMrKzsKLQkJaWYgKGRvcHJpbnQgJiYgKCpjcCAhPSBkZWxpbWl0ZXIpICYmCi0JCSAgICAoaW5kZWxpbWl0IHx8IChudHJ1bmNhdGUgPCAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKSkpKQotCQkJc2hmX3B1dGMoKmNwLCBzaGxfb3V0KTsKLQl9Ci0JaWYgKGRvcHJpbnQpCi0JCXNoZl9mbHVzaChzaGxfb3V0KTsKLQlyZXR1cm4gKHhfY29scyAqIGxpbmVzICsgY29sdW1ucyk7Ci19Ci0KLQotdm9pZAotcHByb21wdChjb25zdCBjaGFyICpjcCwgaW50IG50cnVuY2F0ZSkKLXsKLQlkb3Bwcm9tcHQoY3AsIG50cnVuY2F0ZSwgdHJ1ZSk7Ci19Ci0KLWludAotcHJvbXB0bGVuKGNvbnN0IGNoYXIgKmNwKQotewotCXJldHVybiAoZG9wcHJvbXB0KGNwLCAwLCBmYWxzZSkpOwotfQotCi0vKiBSZWFkIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgJHsuLi59IGV4cHJlc3Npb24gKGllLCB1cCB0byBidXQgbm90IGluY2x1ZGluZwotICogdGhlIDpbLSs/PSMlXSBvciBjbG9zZS1icmFjZS4KLSAqLwotc3RhdGljIGNoYXIgKgotZ2V0X2JyYWNlX3ZhcihYU3RyaW5nICp3c3AsIGNoYXIgKndwKQotewotCWVudW0gcGFyc2Vfc3RhdGUgewotCQlQU19JTklUSUFMLCBQU19TQVdfSEFTSCwgUFNfSURFTlQsCi0JCVBTX05VTUJFUiwgUFNfVkFSMQotCX0gc3RhdGU7Ci0JY2hhciBjOwotCi0Jc3RhdGUgPSBQU19JTklUSUFMOwotCXdoaWxlICgxKSB7Ci0JCWMgPSBnZXRzYygpOwotCQkvKiBTdGF0ZSBtYWNoaW5lIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIHZhcmlhYmxlIHBhcnQgZW5kcy4gKi8KLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIFBTX0lOSVRJQUw6Ci0JCQlpZiAoYyA9PSAnIycgfHwgYyA9PSAnIScgfHwgYyA9PSAnJScpIHsKLQkJCQlzdGF0ZSA9IFBTX1NBV19IQVNIOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBQU19TQVdfSEFTSDoKLQkJCWlmIChrc2hfaXNhbHBoeChjKSkKLQkJCQlzdGF0ZSA9IFBTX0lERU5UOwotCQkJZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpCi0JCQkJc3RhdGUgPSBQU19OVU1CRVI7Ci0JCQllbHNlIGlmIChjdHlwZShjLCBDX1ZBUjEpKQotCQkJCXN0YXRlID0gUFNfVkFSMTsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dDsKLQkJCWJyZWFrOwotCQljYXNlIFBTX0lERU5UOgotCQkJaWYgKCFrc2hfaXNhbG51eChjKSkgewotCQkJCWlmIChjID09ICdbJykgewotCQkJCQljaGFyICp0bXAsICpwOwotCi0JCQkJCWlmICghYXJyYXlzdWIoJnRtcCkpCi0JCQkJCQl5eWVycm9yKCJtaXNzaW5nIF1cbiIpOwotCQkJCQkqd3ArKyA9IGM7Ci0JCQkJCWZvciAocCA9IHRtcDsgKnA7ICkgewotCQkJCQkJWGNoZWNrKCp3c3AsIHdwKTsKLQkJCQkJCSp3cCsrID0gKnArKzsKLQkJCQkJfQotCQkJCQlhZnJlZSh0bXAsIEFURU1QKTsKLQkJCQkJYyA9IGdldHNjKCk7CS8qIHRoZSBdICovCi0JCQkJfQotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUFNfTlVNQkVSOgotCQkJaWYgKCFrc2hfaXNkaWdpdChjKSkKLQkJCQlnb3RvIG91dDsKLQkJCWJyZWFrOwotCQljYXNlIFBTX1ZBUjE6Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlYY2hlY2soKndzcCwgd3ApOwotCQkqd3ArKyA9IGM7Ci0JfQotIG91dDoKLQkqd3ArKyA9ICdcMCc7CS8qIGVuZCBvZiB2YXJpYWJsZSBwYXJ0ICovCi0JdW5nZXRzYyhjKTsKLQlyZXR1cm4gKHdwKTsKLX0KLQotLyoKLSAqIFNhdmUgYW4gYXJyYXkgc3Vic2NyaXB0IC0gcmV0dXJucyB0cnVlIGlmIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQsIGZhbHNlCi0gKiBpZiBlb2Ygb3IgbmV3bGluZSB3YXMgZm91bmQuCi0gKiAoUmV0dXJuZWQgc3RyaW5nIGRvdWJsZSBudWxsIHRlcm1pbmF0ZWQpCi0gKi8KLXN0YXRpYyBpbnQKLWFycmF5c3ViKGNoYXIgKipzdHJwKQotewotCVhTdHJpbmcgd3M7Ci0JY2hhcgkqd3A7Ci0JY2hhcgljOwotCWludAlkZXB0aCA9IDE7CS8qIHdlIGFyZSBqdXN0IHBhc3QgdGhlIGluaXRpYWwgWyAqLwotCi0JWGluaXQod3MsIHdwLCAzMiwgQVRFTVApOwotCi0JZG8gewotCQljID0gZ2V0c2MoKTsKLQkJWGNoZWNrKHdzLCB3cCk7Ci0JCSp3cCsrID0gYzsKLQkJaWYgKGMgPT0gJ1snKQotCQkJZGVwdGgrKzsKLQkJZWxzZSBpZiAoYyA9PSAnXScpCi0JCQlkZXB0aC0tOwotCX0gd2hpbGUgKGRlcHRoID4gMCAmJiBjICYmIGMgIT0gJ1xuJyk7Ci0KLQkqd3ArKyA9ICdcMCc7Ci0JKnN0cnAgPSBYY2xvc2Uod3MsIHdwKTsKLQotCXJldHVybiAoZGVwdGggPT0gMCA/IDEgOiAwKTsKLX0KLQotLyogVW5nZXQgYSBjaGFyOiBoYW5kbGVzIGNhc2Ugd2hlbiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotdW5nZXRzYyhpbnQgYykKLXsKLQlpZiAoYmFja3NsYXNoX3NraXApCi0JCWJhY2tzbGFzaF9za2lwLS07Ci0JLyogRG9uJ3QgdW5nZXQgZW9mLi4uICovCi0JaWYgKHNvdXJjZS0+c3RyID09IG51bGwgJiYgYyA9PSAnXDAnKQotCQlyZXR1cm4gKHNvdXJjZS0+c3RyKTsKLQlpZiAoc291cmNlLT5zdHIgPiBzb3VyY2UtPnN0YXJ0KQotCQlzb3VyY2UtPnN0ci0tOwotCWVsc2UgewotCQlTb3VyY2UgKnM7Ci0KLQkJcyA9IHB1c2hzKFNSRVJFQUQsIHNvdXJjZS0+YXJlYXApOwotCQlzLT51Z2J1ZlswXSA9IGM7IHMtPnVnYnVmWzFdID0gJ1wwJzsKLQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBzLT51Z2J1ZjsKLQkJcy0+bmV4dCA9IHNvdXJjZTsKLQkJc291cmNlID0gczsKLQl9Ci0JcmV0dXJuIChzb3VyY2UtPnN0cik7Ci19Ci0KLQotLyogQ2FsbGVkIHRvIGdldCBhIGNoYXIgdGhhdCBpc24ndCBhIFxuZXdsaW5lIHNlcXVlbmNlLiAqLwotc3RhdGljIGludAotZ2V0c2NfYm4odm9pZCkKLXsKLQlpbnQgYywgYzI7Ci0KLQlpZiAoaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKQotCQlyZXR1cm4gKGdldHNjXygpKTsKLQotCWlmIChiYWNrc2xhc2hfc2tpcCA9PSAxKSB7Ci0JCWJhY2tzbGFzaF9za2lwID0gMjsKLQkJcmV0dXJuIChnZXRzY18oKSk7Ci0JfQotCi0JYmFja3NsYXNoX3NraXAgPSAwOwotCi0Jd2hpbGUgKDEpIHsKLQkJYyA9IGdldHNjXygpOwotCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQlpZiAoKGMyID0gZ2V0c2NfKCkpID09ICdcbicpCi0JCQkJLyogaWdub3JlIHRoZSBcbmV3bGluZTsgZ2V0IHRoZSBuZXh0IGNoYXIuLi4gKi8KLQkJCQljb250aW51ZTsKLQkJCXVuZ2V0c2MoYzIpOwotCQkJYmFja3NsYXNoX3NraXAgPSAxOwotCQl9Ci0JCXJldHVybiAoYyk7Ci0JfQotfQotCi1zdGF0aWMgTGV4X3N0YXRlICoKLXB1c2hfc3RhdGVfKFN0YXRlX2luZm8gKnNpLCBMZXhfc3RhdGUgKm9sZF9lbmQpCi17Ci0JTGV4X3N0YXRlICpuZXdzID0gYWxsb2MoU1RBVEVfQlNJWkUgKiBzaXplb2YoTGV4X3N0YXRlKSwgQVRFTVApOwotCi0JbmV3c1swXS5sc19pbmZvLmJhc2UgPSBvbGRfZW5kOwotCXNpLT5iYXNlID0gJm5ld3NbMF07Ci0Jc2ktPmVuZCA9ICZuZXdzW1NUQVRFX0JTSVpFXTsKLQlyZXR1cm4gKCZuZXdzWzFdKTsKLX0KLQotc3RhdGljIExleF9zdGF0ZSAqCi1wb3Bfc3RhdGVfKFN0YXRlX2luZm8gKnNpLCBMZXhfc3RhdGUgKm9sZF9lbmQpCi17Ci0JTGV4X3N0YXRlICpvbGRfYmFzZSA9IHNpLT5iYXNlOwotCi0Jc2ktPmJhc2UgPSBvbGRfZW5kLT5sc19pbmZvLmJhc2UgLSBTVEFURV9CU0laRTsKLQlzaS0+ZW5kID0gb2xkX2VuZC0+bHNfaW5mby5iYXNlOwotCi0JYWZyZWUob2xkX2Jhc2UsIEFURU1QKTsKLQotCXJldHVybiAoc2ktPmJhc2UgKyBTVEFURV9CU0laRSAtIDEpOwotfQotCi1zdGF0aWMgaW50Ci1zX2dldCh2b2lkKQotewotCXJldHVybiAoZ2V0c2MoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3B1dChpbnQgYykKLXsKLQl1bmdldHNjKGMpOwotfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbWFpbi5jIGIvbWtzaC9zcmMvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYyZGQ0Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzkgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IG1haW4uYyx2IDEuNDYgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiB0dHkuYyx2IDEuOSAyMDA2LzAzLzE0IDIyOjA4OjAxIGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBpby5jLHYgMS4yMiAyMDA2LzAzLzE3IDE2OjMwOjEzIG1pbGxlcnQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiB0YWJsZS5jLHYgMS4xMyAyMDA5LzAxLzE3IDIyOjA2OjQ0IG1pbGxlcnQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNkZWZpbmUJRVhURVJOCi0jaW5jbHVkZSAic2guaCIKLQotI2lmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAotI2luY2x1ZGUgPGxhbmdpbmZvLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1NFVExPQ0FMRV9DVFlQRQotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL21haW4uYyx2IDEuMTY3IDIwMTAvMDcvMDQgMTc6NDU6MTUgdGcgRXhwICQiKTsKLQotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCi0jaWYgIUhBVkVfU0VUUkVTVUdJRAotZXh0ZXJuIHVpZF90IGtzaHVpZDsKLWV4dGVybiBnaWRfdCBrc2hnaWQsIGtzaGVnaWQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBNS1NIUkNfUEFUSAotI2RlZmluZSBNS1NIUkNfUEFUSAkifi8ubWtzaHJjIgotI2VuZGlmCi0KLSNpZm5kZWYgTUtTSF9ERUZBVUxUX1RNUERJUgotI2RlZmluZSBNS1NIX0RFRkFVTFRfVE1QRElSCSIvdG1wIgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJlY2xhaW0odm9pZCk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfdGVtcHMoc3RydWN0IHRlbXAgKik7Ci12b2lkIGNodnRfcmVpbml0KHZvaWQpOwotU291cmNlICpta3NoX2luaXQoaW50LCBjb25zdCBjaGFyICpbXSk7Ci0jaWZkZWYgU0lHV0lOQ0gKLXN0YXRpYyB2b2lkIHhfc2lnd2luY2goaW50KTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciBpbml0aWZzW10gPSAiSUZTPSBcdFxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgaW5pdHN1YnNbXSA9Ci0gICAgIiR7UFMyPT4gfSAke1BTMz0jPyB9ICR7UFM0PSsgfSAke1NFQ09ORFM9MH0gJHtUTU9VVD0wfSI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppbml0Y29tc1tdID0gewotCVRfdHlwZXNldCwgIi1yIiwgaW5pdHZzbiwgTlVMTCwKLQlUX3R5cGVzZXQsICIteCIsICJIT01FIiwgIlBBVEgiLCAiUkFORE9NIiwgIlNIRUxMIiwgTlVMTCwKLQlUX3R5cGVzZXQsICItaTEwIiwgIkNPTFVNTlMiLCAiTElORVMiLCAiT1BUSU5EIiwgIlBHUlAiLCAiUFBJRCIsCi0JICAgICJSQU5ET00iLCAiU0VDT05EUyIsICJUTU9VVCIsICJVU0VSX0lEIiwgTlVMTCwKLQkiYWxpYXMiLAotCSJpbnRlZ2VyPXR5cGVzZXQgLWkiLAotCVRfbG9jYWxfdHlwZXNldCwKLQkiaGFzaD1hbGlhcyAtdCIsCS8qIG5vdCAiYWxpYXMgLXQgLS0iOiBoYXNoIC1yIG5lZWRzIHRvIHdvcmsgKi8KLQkidHlwZT13aGVuY2UgLXYiLAotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLQkic3VzcGVuZD1raWxsIC1TVE9QICQkIiwKLSNlbmRpZgotCSJhdXRvbG9hZD10eXBlc2V0IC1mdSIsCi0JImZ1bmN0aW9ucz10eXBlc2V0IC1mIiwKLQkiaGlzdG9yeT1mYyAtbCIsCi0JIm5hbWVyZWY9dHlwZXNldCAtbiIsCi0JIm5vaHVwPW5vaHVwICIsCi0Jcl9mY19lXywKLQkic291cmNlPVBBVEg9JFBBVEg6LiBjb21tYW5kIC4iLAotCSJsb2dpbj1leGVjIGxvZ2luIiwKLQlOVUxMLAotCSAvKiB0aGlzIGlzIHdoYXQgQVQmVCBrc2ggc2VlbXMgdG8gdHJhY2ssIHdpdGggdGhlIGFkZGl0aW9uIG9mIGVtYWNzICovCi0JImFsaWFzIiwgIi10VSIsCi0JImNhdCIsICJjYyIsICJjaG1vZCIsICJjcCIsICJkYXRlIiwgImVkIiwgImVtYWNzIiwgImdyZXAiLCAibHMiLAotCSJtYWtlIiwgIm12IiwgInByIiwgInJtIiwgInNlZCIsICJzaCIsICJ2aSIsICJ3aG8iLCBOVUxMLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBpbnQgaW5pdGlvX2RvbmU7Ci0KLXN0cnVjdCBlbnYgKmUgPSAma3Noc3RhdGVfdi5lbnZfOwotCi12b2lkCi1jaHZ0X3JlaW5pdCh2b2lkKQotewotCWtzaHBpZCA9IHByb2NwaWQgPSBnZXRwaWQoKTsKLQlrc2hldWlkID0gZ2V0ZXVpZCgpOwotCWtzaHBncnAgPSBnZXRwZ3JwKCk7Ci0Ja3NocHBpZCA9IGdldHBwaWQoKTsKLX0KLQotU291cmNlICoKLW1rc2hfaW5pdChpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQotewotCWludCBhcmdpLCBpOwotCVNvdXJjZSAqczsKLQlzdHJ1Y3QgYmxvY2sgKmw7Ci0JdW5zaWduZWQgY2hhciByZXN0cmljdGVkLCBlcnJleGl0LCB1dGZfZmxhZzsKLQljb25zdCBjaGFyICoqd3A7Ci0Jc3RydWN0IHRibCAqdnA7Ci0Jc3RydWN0IHN0YXQgc19zdGRpbjsKLSNpZiAhZGVmaW5lZChfUEFUSF9ERUZQQVRIKSAmJiBkZWZpbmVkKF9DU19QQVRIKQotCXNpemVfdCBrOwotCWNoYXIgKmNwOwotI2VuZGlmCi0KLQkvKiBkbyB0aGluZ3MgbGlrZSBnZXRwZ3JwKCkgZXQgYWwuICovCi0JY2h2dF9yZWluaXQoKTsKLQotCS8qIG1ha2Ugc3VyZSBhcmd2W10gaXMgc2FuZSAqLwotCWlmICghKmFyZ3YpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKmVtcHR5X2FyZ3ZbXSA9IHsKLQkJCSJta3NoIiwgTlVMTAotCQl9OwotCi0JCWFyZ3YgPSBlbXB0eV9hcmd2OwotCQlhcmdjID0gMTsKLQl9Ci0Ja3NobmFtZSA9ICphcmd2OwotCi0JYWluaXQoJmFwZXJtKTsJCS8qIGluaXRpYWxpc2UgcGVybWFuZW50IEFyZWEgKi8KLQotCS8qIHNldCB1cCBiYXNlIGVudmlyb25tZW50ICovCi0Ja3Noc3RhdGVfdi5lbnZfLnR5cGUgPSBFX05PTkU7Ci0JYWluaXQoJmtzaHN0YXRlX3YuZW52Xy5hcmVhKTsKLQluZXdibG9jaygpOwkJLyogc2V0IHVwIGdsb2JhbCBsLT52YXJzIGFuZCBsLT5mdW5zICovCi0KLQkvKiBEbyB0aGlzIGZpcnN0IHNvIG91dHB1dCByb3V0aW5lcyAoZWcsIGVycm9yZiwgc2hlbGxmKSBjYW4gd29yayAqLwotCWluaXRpbygpOwotCi0JYXJnaSA9IHBhcnNlX2FyZ3MoYXJndiwgT0ZfRklSU1RUSU1FLCBOVUxMKTsKLQlpZiAoYXJnaSA8IDApCi0JCXJldHVybiAoTlVMTCk7Ci0KLQlpbml0dmFyKCk7Ci0KLQlpbml0Y3R5cGVzKCk7Ci0KLQlpbml0dHJhcHMoKTsKLQotCWNvcHJvY19pbml0KCk7Ci0KLQkvKiBzZXQgdXAgdmFyaWFibGUgYW5kIGNvbW1hbmQgZGljdGlvbmFyaWVzICovCi0Ja3Rpbml0KCZ0YWxpYXNlcywgQVBFUk0sIDApOwotCWt0aW5pdCgmYWxpYXNlcywgQVBFUk0sIDApOwotI2lmbmRlZiBNS1NIX05PUFdOQU0KLQlrdGluaXQoJmhvbWVkaXJzLCBBUEVSTSwgMCk7Ci0jZW5kaWYKLQotCS8qIGRlZmluZSBzaGVsbCBrZXl3b3JkcyAqLwotCWluaXRrZXl3b3JkcygpOwotCi0JLyogZGVmaW5lIGJ1aWx0LWluIGNvbW1hbmRzICovCi0Ja3Rpbml0KCZidWlsdGlucywgQVBFUk0sCi0JICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDQ0IGJ1aWx0aW5zKSAqLyA2NCk7Ci0JZm9yIChpID0gMDsgbWtzaGJ1aWx0aW5zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlidWlsdGluKG1rc2hidWlsdGluc1tpXS5uYW1lLCBta3NoYnVpbHRpbnNbaV0uZnVuYyk7Ci0KLQlpbml0X2hpc3R2ZWMoKTsKLQotI2lmZGVmIF9QQVRIX0RFRlBBVEgKLQlkZWZfcGF0aCA9IF9QQVRIX0RFRlBBVEg7Ci0jZWxzZQotI2lmZGVmIF9DU19QQVRICi0JaWYgKChrID0gY29uZnN0cihfQ1NfUEFUSCwgTlVMTCwgMCkpICE9IChzaXplX3QpLTEgJiYgayA+IDAgJiYKLQkgICAgY29uZnN0cihfQ1NfUEFUSCwgY3AgPSBhbGxvYyhrICsgMSwgQVBFUk0pLCBrICsgMSkgPT0gayArIDEpCi0JCWRlZl9wYXRoID0gY3A7Ci0JZWxzZQotI2VuZGlmCi0JCS8qCi0JCSAqIHRoaXMgaXMgdW5pZm9ybSBhY3Jvc3MgYWxsIE9TZXMgdW5sZXNzIGl0Ci0JCSAqIGJyZWFrcyBzb21ld2hlcmU7IGRvbid0IHRyeSB0byBvcHRpbWlzZSwKLQkJICogZS5nLiBhZGQgc3R1ZmYgZm9yIEludGVyaXggb3IgcmVtb3ZlIC91c3IKLQkJICogZm9yIEhVUkQsIGJlY2F1c2UgZS5nLiBEZWJpYW4gR05VL0hVUkQgaXMKLQkJICogImtlZXBpbmcgYSByZWd1bGFyIC91c3IiOyB0aGlzIGlzIHN1cHBvc2VkCi0JCSAqIHRvIGJlIGEgc2FuZSAnYmFzaWMnIGRlZmF1bHQgUEFUSAotCQkgKi8KLQkJZGVmX3BhdGggPSAiL2JpbjovdXNyL2Jpbjovc2JpbjovdXNyL3NiaW4iOwotI2VuZGlmCi0KLQkvKiBTZXQgUEFUSCB0byBkZWZfcGF0aCAod2lsbCBzZXQgdGhlIHBhdGggZ2xvYmFsIHZhcmlhYmxlKS4KLQkgKiAoaW1wb3J0IG9mIGVudmlyb25tZW50IGJlbG93IHdpbGwgcHJvYmFibHkgY2hhbmdlIHRoaXMgc2V0dGluZykuCi0JICovCi0JdnAgPSBnbG9iYWwoIlBBVEgiKTsKLQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCi0Jc2V0c3RyKHZwLCBkZWZfcGF0aCwgS1NIX1JFVFVSTl9FUlJPUik7Ci0KLQkvKiBUdXJuIG9uIG5vaHVwIGJ5IGRlZmF1bHQgZm9yIG5vdyAtIHdpbGwgY2hhbmdlIHRvIG9mZgotCSAqIGJ5IGRlZmF1bHQgb25jZSBwZW9wbGUgYXJlIGF3YXJlIG9mIGl0cyBleGlzdGVuY2UKLQkgKiAoQVQmVCBrc2ggZG9lcyBub3QgaGF2ZSBhIG5vaHVwIG9wdGlvbiAtIGl0IGFsd2F5cyBzZW5kcwotCSAqIHRoZSBodXApLgotCSAqLwotCUZsYWcoRk5PSFVQKSA9IDE7Ci0KLQkvKiBUdXJuIG9uIGJyYWNlIGV4cGFuc2lvbiBieSBkZWZhdWx0LiBBVCZUIGtzaHMgdGhhdCBoYXZlCi0JICogYWx0ZXJuYXRpb24gYWx3YXlzIGhhdmUgaXQgb24uCi0JICovCi0JRmxhZyhGQlJBQ0VFWFBBTkQpID0gMTsKLQotCS8qIFNldCBlZGl0IG1vZGUgdG8gZW1hY3MgYnkgZGVmYXVsdCwgbWF5IGJlIG92ZXJyaWRkZW4KLQkgKiBieSB0aGUgZW52aXJvbm1lbnQgb3IgdGhlIHVzZXIuIEFsc28sIHdlIHdhbnQgdGFiIGNvbXBsZXRpb24KLQkgKiBvbiBpbiB2aSBieSBkZWZhdWx0LiAqLwotCWNoYW5nZV9mbGFnKEZFTUFDUywgT0ZfU1BFQ0lBTCwgMSk7Ci0jaWYgIU1LU0hfU19OT1ZJCi0JRmxhZyhGVklUQUJDT01QTEVURSkgPSAxOwotI2VuZGlmCi0KLSNpZmRlZiBNS1NIX0JJTlNIUkVEVUNFRAotCS8qIHNldCBGU0ggaWYgd2UncmUgY2FsbGVkIGFzIC1zaCBvciAvYmluL3NoIG9yIHNvICovCi0JewotCQljb25zdCBjaGFyICpjYzsKLQotCQljYyA9IGtzaG5hbWU7Ci0JCWkgPSAwOyBhcmdpID0gMDsKLQkJd2hpbGUgKGNjW2ldICE9ICdcMCcpCi0JCQkvKiB0aGUgZm9sbG93aW5nIGxpbmUgbWF0Y2hlcyAnLScgYW5kICcvJyA7LSkgKi8KLQkJCWlmICgoY2NbaSsrXSB8IDIpID09ICcvJykKLQkJCQlhcmdpID0gaTsKLQkJaWYgKCgoY2NbYXJnaV0gfCAweDIwKSA9PSAncycpICYmICgoY2NbYXJnaSArIDFdIHwgMHgyMCkgPT0gJ2gnKSkKLQkJCWNoYW5nZV9mbGFnKEZTSCwgT0ZfRklSU1RUSU1FLCAxKTsKLQl9Ci0jZW5kaWYKLQotCS8qIGltcG9ydCBlbnZpcm9ubWVudCAqLwotCWlmIChlbnZpcm9uICE9IE5VTEwpCi0JCWZvciAod3AgPSAoY29uc3QgY2hhciAqKillbnZpcm9uOyAqd3AgIT0gTlVMTDsgd3ArKykKLQkJCXR5cGVzZXQoKndwLCBJTVBPUlQgfCBFWFBPUlQsIDAsIDAsIDApOwotCi0JdHlwZXNldChpbml0aWZzLCAwLCAwLCAwLCAwKTsJLyogZm9yIHNlY3VyaXR5ICovCi0KLQkvKiBhc3NpZ24gZGVmYXVsdCBzaGVsbCB2YXJpYWJsZSB2YWx1ZXMgKi8KLQlzdWJzdGl0dXRlKGluaXRzdWJzLCAwKTsKLQotCS8qIEZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYW5kIHNldCAkUFdEICovCi0JewotCQlzdHJ1Y3Qgc3RhdCBzX3B3ZCwgc19kb3Q7Ci0JCXN0cnVjdCB0YmwgKnB3ZF92ID0gZ2xvYmFsKCJQV0QiKTsKLQkJY2hhciAqcHdkID0gc3RyX3ZhbChwd2Rfdik7Ci0JCWNoYXIgKnB3ZHggPSBwd2Q7Ci0KLQkJLyogVHJ5IHRvIHVzZSBleGlzdGluZyAkUFdEIGlmIGl0IGlzIHZhbGlkICovCi0JCWlmIChwd2RbMF0gIT0gJy8nIHx8Ci0JCSAgICBzdGF0KHB3ZCwgJnNfcHdkKSA8IDAgfHwgc3RhdCgiLiIsICZzX2RvdCkgPCAwIHx8Ci0JCSAgICBzX3B3ZC5zdF9kZXYgIT0gc19kb3Quc3RfZGV2IHx8Ci0JCSAgICBzX3B3ZC5zdF9pbm8gIT0gc19kb3Quc3RfaW5vKQotCQkJcHdkeCA9IE5VTEw7Ci0JCXNldF9jdXJyZW50X3dkKHB3ZHgpOwotCQlpZiAoY3VycmVudF93ZFswXSkKLQkJCXNpbXBsaWZ5X3BhdGgoY3VycmVudF93ZCk7Ci0JCS8qIE9ubHkgc2V0IHB3ZCBpZiB3ZSBrbm93IHdoZXJlIHdlIGFyZSBvciBpZiBpdCBoYWQgYQotCQkgKiBib2d1cyB2YWx1ZQotCQkgKi8KLQkJaWYgKGN1cnJlbnRfd2RbMF0gfHwgcHdkICE9IG51bGwpCi0JCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCi0JCQlzZXRzdHIocHdkX3YsIGN1cnJlbnRfd2QsIEtTSF9SRVRVUk5fRVJST1IpOwotCX0KLQotCWZvciAod3AgPSBpbml0Y29tczsgKndwICE9IE5VTEw7IHdwKyspIHsKLQkJc2hjb21leGVjKHdwKTsKLQkJd2hpbGUgKCp3cCAhPSBOVUxMKQotCQkJd3ArKzsKLQl9Ci0Jc2V0aW50KGdsb2JhbCgiQ09MVU1OUyIpLCAwKTsKLQlzZXRpbnQoZ2xvYmFsKCJMSU5FUyIpLCAwKTsKLQlzZXRpbnQoZ2xvYmFsKCJPUFRJTkQiKSwgMSk7Ci0KLQlzYWZlX3Byb21wdCA9IGtzaGV1aWQgPyAiJCAiIDogIiMgIjsKLQl2cCA9IGdsb2JhbCgiUFMxIik7Ci0JLyogU2V0IFBTMSBpZiB1bnNldCBvciB3ZSBhcmUgcm9vdCBhbmQgcHJvbXB0IGRvZXNuJ3QgY29udGFpbiBhICMgKi8KLQlpZiAoISh2cC0+ZmxhZyAmIElTU0VUKSB8fAotCSAgICAoIWtzaGV1aWQgJiYgIXN0cmNocihzdHJfdmFsKHZwKSwgJyMnKSkpCi0JCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KLQkJc2V0c3RyKHZwLCBzYWZlX3Byb21wdCwgS1NIX1JFVFVSTl9FUlJPUik7Ci0Jc2V0aW50KCh2cCA9IGdsb2JhbCgiUEdSUCIpKSwgKG1rc2hfdWFyaV90KWtzaHBncnApOwotCXZwLT5mbGFnIHw9IElOVF9VOwotCXNldGludCgodnAgPSBnbG9iYWwoIlBQSUQiKSksIChta3NoX3VhcmlfdClrc2hwcGlkKTsKLQl2cC0+ZmxhZyB8PSBJTlRfVTsKLQlzZXRpbnQoKHZwID0gZ2xvYmFsKCJSQU5ET00iKSksIChta3NoX3VhcmlfdClldmlsaGFzaChrc2huYW1lKSk7Ci0JdnAtPmZsYWcgfD0gSU5UX1U7Ci0Jc2V0aW50KCh2cCA9IGdsb2JhbCgiVVNFUl9JRCIpKSwgKG1rc2hfdWFyaV90KWtzaGV1aWQpOwotCXZwLT5mbGFnIHw9IElOVF9VOwotCi0JLyogU2V0IHRoaXMgYmVmb3JlIHBhcnNpbmcgYXJndW1lbnRzICovCi0jaWYgSEFWRV9TRVRSRVNVR0lECi0JRmxhZyhGUFJJVklMRUdFRCkgPSBnZXR1aWQoKSAhPSBrc2hldWlkIHx8IGdldGdpZCgpICE9IGdldGVnaWQoKTsKLSNlbHNlCi0JRmxhZyhGUFJJVklMRUdFRCkgPSAoa3NodWlkID0gZ2V0dWlkKCkpICE9IGtzaGV1aWQgfHwKLQkgICAgKGtzaGdpZCA9IGdldGdpZCgpKSAhPSAoa3NoZWdpZCA9IGdldGVnaWQoKSk7Ci0jZW5kaWYKLQotCS8qIHRoaXMgdG8gbm90ZSBpZiBtb25pdG9yIGlzIHNldCBvbiBjb21tYW5kIGxpbmUgKHNlZSBiZWxvdykgKi8KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JRmxhZyhGTU9OSVRPUikgPSAxMjc7Ci0jZW5kaWYKLQkvKiB0aGlzIHRvIG5vdGUgaWYgdXRmLTggbW9kZSBpcyBzZXQgb24gY29tbWFuZCBsaW5lIChzZWUgYmVsb3cpICovCi0JVVRGTU9ERSA9IDI7Ci0KLQlhcmdpID0gcGFyc2VfYXJncyhhcmd2LCBPRl9DTURMSU5FLCBOVUxMKTsKLQlpZiAoYXJnaSA8IDApCi0JCXJldHVybiAoTlVMTCk7Ci0KLQkvKiBwcm9jZXNzIHRoaXMgbGF0ZXIgb25seSwgZGVmYXVsdCB0byBvZmYgKGh5c3RlcmljYWwgcmFpc2lucykgKi8KLQl1dGZfZmxhZyA9IFVURk1PREU7Ci0JVVRGTU9ERSA9IDA7Ci0KLQlpZiAoRmxhZyhGQ09NTUFORCkpIHsKLQkJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKLQkJaWYgKCEocy0+c3RhcnQgPSBzLT5zdHIgPSBhcmd2W2FyZ2krK10pKQotCQkJZXJyb3JmKCItYyByZXF1aXJlcyBhbiBhcmd1bWVudCIpOwotI2lmZGVmIE1LU0hfTUlETklHSFRCU0QwMUFTSF9DT01QQVQKLQkJLyogY29tcGF0aWJpbGl0eSB0byBNaWRuaWdodEJTRCAwLjEgL2Jpbi9zaCAoa2x1ZGdlKSAqLwotCQlpZiAoRmxhZyhGU0gpICYmIGFyZ3ZbYXJnaV0gJiYgIXN0cmNtcChhcmd2W2FyZ2ldLCAiLS0iKSkKLQkJCSsrYXJnaTsKLSNlbmRpZgotCQlpZiAoYXJndlthcmdpXSkKLQkJCWtzaG5hbWUgPSBhcmd2W2FyZ2krK107Ci0JfSBlbHNlIGlmIChhcmdpIDwgYXJnYyAmJiAhRmxhZyhGU1RESU4pKSB7Ci0JCXMgPSBwdXNocyhTRklMRSwgQVRFTVApOwotCQlzLT5maWxlID0gYXJndlthcmdpKytdOwotCQlzLT51LnNoZiA9IHNoZl9vcGVuKHMtPmZpbGUsIE9fUkRPTkxZLCAwLAotCQkgICAgU0hGX01BUEhJIHwgU0hGX0NMRVhFQyk7Ci0JCWlmIChzLT51LnNoZiA9PSBOVUxMKSB7Ci0JCQlzaGxfc3Rkb3V0X29rID0gMDsKLQkJCXdhcm5pbmdmKHRydWUsICIlczogJXMiLCBzLT5maWxlLCBzdHJlcnJvcihlcnJubykpOwotCQkJLyogbWFuZGF0ZWQgYnkgU1VTdjQgKi8KLQkJCWV4c3RhdCA9IDEyNzsKLQkJCXVud2luZChMRVJST1IpOwotCQl9Ci0JCWtzaG5hbWUgPSBzLT5maWxlOwotCX0gZWxzZSB7Ci0JCUZsYWcoRlNURElOKSA9IDE7Ci0JCXMgPSBwdXNocyhTU1RESU4sIEFURU1QKTsKLQkJcy0+ZmlsZSA9ICI8c3RkaW4+IjsKLQkJcy0+dS5zaGYgPSBzaGZfZmRvcGVuKDAsIFNIRl9SRCB8IGNhbl9zZWVrKDApLAotCQkgICAgTlVMTCk7Ci0JCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDIpKSB7Ci0JCQlGbGFnKEZUQUxLSU5HKSA9IEZsYWcoRlRBTEtJTkdfSSkgPSAxOwotCQkJLyogVGhlIGZvbGxvd2luZyBvbmx5IGlmIGlzYXR0eSgwKSAqLwotCQkJcy0+ZmxhZ3MgfD0gU0ZfVFRZOwotCQkJcy0+dS5zaGYtPmZsYWdzIHw9IFNIRl9JTlRFUlJVUFQ7Ci0JCQlzLT5maWxlID0gTlVMTDsKLQkJfQotCX0KLQotCS8qIHRoaXMgYml6YXJyZW5lc3MgaXMgbWFuZGF0ZWQgYnkgUE9TSVggKi8KLQlpZiAoZnN0YXQoMCwgJnNfc3RkaW4pID49IDAgJiYgU19JU0NIUihzX3N0ZGluLnN0X21vZGUpICYmCi0JICAgIEZsYWcoRlRBTEtJTkcpKQotCQlyZXNldF9ub25ibG9jaygwKTsKLQotCS8qIGluaXRpYWxpc2Ugam9iIGNvbnRyb2wgKi8KLQlqX2luaXQoKTsKLQkvKiBzZXQ6IDAvMTsgdW5zZXQ6IDItPjAgKi8KLQlVVEZNT0RFID0gdXRmX2ZsYWcgJiAxOwotCS8qIERvIHRoaXMgYWZ0ZXIgal9pbml0KCksIGFzIHR0eV9mZCBpcyBub3QgaW5pdGlhbGlzZWQgdW50aWwgdGhlbiAqLwotCWlmIChGbGFnKEZUQUxLSU5HKSkgewotCQlpZiAodXRmX2ZsYWcgPT0gMikgewotI2lmbmRlZiBNS1NIX0FTU1VNRV9VVEY4Ci0jZGVmaW5lIGlzdWMoeCkJKCgoeCkgIT0gTlVMTCkgJiYgXAotCQkgICAgKHN0cmlzdHIoKHgpLCAiVVRGLTgiKSB8fCBzdHJpc3RyKCh4KSwgInV0ZjgiKSkpCi0JCS8qIENoZWNrIGlmIHdlJ3JlIGluIGEgVVRGLTggbG9jYWxlICovCi0JCQljb25zdCBjaGFyICpjY3A7Ci0KLSNpZiBIQVZFX1NFVExPQ0FMRV9DVFlQRQotCQkJY2NwID0gc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7Ci0jaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCi0JCQlpZiAoIWlzdWMoY2NwKSkKLQkJCQljY3AgPSBubF9sYW5naW5mbyhDT0RFU0VUKTsKLSNlbmRpZgotI2Vsc2UKLQkJCS8qIHRoZXNlIHdlcmUgaW1wb3J0ZWQgZnJvbSBlbnZpcm9uIGVhcmxpZXIgKi8KLQkJCWNjcCA9IHN0cl92YWwoZ2xvYmFsKCJMQ19BTEwiKSk7Ci0JCQlpZiAoY2NwID09IG51bGwpCi0JCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxDX0NUWVBFIikpOwotCQkJaWYgKGNjcCA9PSBudWxsKQotCQkJCWNjcCA9IHN0cl92YWwoZ2xvYmFsKCJMQU5HIikpOwotI2VuZGlmCi0JCQlVVEZNT0RFID0gaXN1YyhjY3ApOwotI3VuZGVmIGlzdWMKLSNlbGlmIE1LU0hfQVNTVU1FX1VURjgKLQkJCVVURk1PREUgPSAxOwotI2Vsc2UKLQkJCVVURk1PREUgPSAwOwotI2VuZGlmCi0JCX0KLQkJeF9pbml0KCk7Ci0JfQotCi0jaWZkZWYgU0lHV0lOQ0gKLQlzaWd0cmFwc1tTSUdXSU5DSF0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKLQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1dJTkNIXSwgeF9zaWd3aW5jaCwKLQkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7Ci0jZW5kaWYKLQotCWwgPSBlLT5sb2M7Ci0JbC0+YXJndiA9ICZhcmd2W2FyZ2kgLSAxXTsKLQlsLT5hcmdjID0gYXJnYyAtIGFyZ2k7Ci0JbC0+YXJndlswXSA9IGtzaG5hbWU7Ci0JZ2V0b3B0c19yZXNldCgxKTsKLQotCS8qIERpc2FibGUgZHVyaW5nIC5wcm9maWxlL0VOViByZWFkaW5nICovCi0JcmVzdHJpY3RlZCA9IEZsYWcoRlJFU1RSSUNURUQpOwotCUZsYWcoRlJFU1RSSUNURUQpID0gMDsKLQllcnJleGl0ID0gRmxhZyhGRVJSRVhJVCk7Ci0JRmxhZyhGRVJSRVhJVCkgPSAwOwotCi0JLyogRG8gdGhpcyBiZWZvcmUgcHJvZmlsZS8kRU5WIHNvIHRoYXQgaWYgaXQgY2F1c2VzIHByb2JsZW1zIGluIHRoZW0sCi0JICogdXNlciB3aWxsIGtub3cgd2h5IHRoaW5ncyBicm9rZS4KLQkgKi8KLQlpZiAoIWN1cnJlbnRfd2RbMF0gJiYgRmxhZyhGVEFMS0lORykpCi0JCXdhcm5pbmdmKGZhbHNlLCAiQ2Fubm90IGRldGVybWluZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7Ci0KLQlpZiAoRmxhZyhGTE9HSU4pKSB7Ci0JCWluY2x1ZGUoS1NIX1NZU1RFTV9QUk9GSUxFLCAwLCBOVUxMLCAxKTsKLQkJaWYgKCFGbGFnKEZQUklWSUxFR0VEKSkKLQkJCWluY2x1ZGUoc3Vic3RpdHV0ZSgiJEhPTUUvLnByb2ZpbGUiLCAwKSwgMCwKLQkJCSAgICBOVUxMLCAxKTsKLQl9Ci0JaWYgKEZsYWcoRlBSSVZJTEVHRUQpKQotCQlpbmNsdWRlKCIvZXRjL3N1aWRfcHJvZmlsZSIsIDAsIE5VTEwsIDEpOwotCWVsc2UgaWYgKEZsYWcoRlRBTEtJTkcpKSB7Ci0JCWNoYXIgKmVudl9maWxlOwotCi0JCS8qIGluY2x1ZGUgJEVOViAqLwotCQllbnZfZmlsZSA9IHN1YnN0aXR1dGUoc3Vic3RpdHV0ZSgiJHtFTlY6LSIgTUtTSFJDX1BBVEggIn0iLCAwKSwKLQkJICAgIERPVElMREUpOwotCQlpZiAoKmVudl9maWxlICE9ICdcMCcpCi0JCQlpbmNsdWRlKGVudl9maWxlLCAwLCBOVUxMLCAxKTsKLQl9Ci0KLQlpZiAocmVzdHJpY3RlZCkgewotCQlzdGF0aWMgY29uc3QgY2hhciAqcmVzdHJfY29tW10gPSB7Ci0JCQlUX3R5cGVzZXQsICItciIsICJQQVRIIiwKLQkJCSJFTlYiLCAiU0hFTEwiLAotCQkJTlVMTAotCQl9OwotCQlzaGNvbWV4ZWMocmVzdHJfY29tKTsKLQkJLyogQWZ0ZXIgdHlwZXNldCBjb21tYW5kLi4uICovCi0JCUZsYWcoRlJFU1RSSUNURUQpID0gMTsKLQl9Ci0JRmxhZyhGRVJSRVhJVCkgPSBlcnJleGl0OwotCi0JaWYgKEZsYWcoRlRBTEtJTkcpKSB7Ci0JCWhpc3RfaW5pdChzKTsKLQkJYWxhcm1faW5pdCgpOwotCX0gZWxzZQotCQlGbGFnKEZUUkFDS0FMTCkgPSAxOwkvKiBzZXQgYWZ0ZXIgRU5WICovCi0KLQlyZXR1cm4gKHMpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKLXsKLQlTb3VyY2UgKnM7Ci0KLQlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSA1MzgxOwotCi0JaWYgKChzID0gbWtzaF9pbml0KGFyZ2MsIGFyZ3YpKSkgewotCQkvKiBwdXQgbW9yZSBlbnRyb3B5IGludG8gdGhlIExDRyAqLwotCQljaGFuZ2VfcmFuZG9tKHMsIHNpemVvZigqcykpOwotCQkvKiBkb2VzbuKAmXQgcmV0dXJuICovCi0JCXNoZWxsKHMsIHRydWUpOwotCX0KLQlyZXR1cm4gKDEpOwotfQotCi1pbnQKLWluY2x1ZGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgaW50cl9vaykKLXsKLQlTb3VyY2UgKnZvbGF0aWxlIHMgPSBOVUxMOwotCXN0cnVjdCBzaGYgKnNoZjsKLQljb25zdCBjaGFyICoqdm9sYXRpbGUgb2xkX2FyZ3Y7Ci0Jdm9sYXRpbGUgaW50IG9sZF9hcmdjOwotCWludCBpOwotCi0Jc2hmID0gc2hmX29wZW4obmFtZSwgT19SRE9OTFksIDAsIFNIRl9NQVBISSB8IFNIRl9DTEVYRUMpOwotCWlmIChzaGYgPT0gTlVMTCkKLQkJcmV0dXJuICgtMSk7Ci0KLQlpZiAoYXJndikgewotCQlvbGRfYXJndiA9IGUtPmxvYy0+YXJndjsKLQkJb2xkX2FyZ2MgPSBlLT5sb2MtPmFyZ2M7Ci0JfSBlbHNlIHsKLQkJb2xkX2FyZ3YgPSBOVUxMOwotCQlvbGRfYXJnYyA9IDA7Ci0JfQotCW5ld2VudihFX0lOQ0wpOwotCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7Ci0JaWYgKGkpIHsKLQkJcXVpdGVudihzID8gcy0+dS5zaGYgOiBOVUxMKTsKLQkJaWYgKG9sZF9hcmd2KSB7Ci0JCQllLT5sb2MtPmFyZ3YgPSBvbGRfYXJndjsKLQkJCWUtPmxvYy0+YXJnYyA9IG9sZF9hcmdjOwotCQl9Ci0JCXN3aXRjaCAoaSkgewotCQljYXNlIExSRVRVUk46Ci0JCWNhc2UgTEVSUk9SOgotCQkJcmV0dXJuIChleHN0YXQgJiAweGZmKTsgLyogc2VlIGJlbG93ICovCi0JCWNhc2UgTElOVFI6Ci0JCQkvKiBpbnRyX29rIGlzIHNldCBpZiB3ZSBhcmUgaW5jbHVkaW5nIC5wcm9maWxlIG9yICRFTlYuCi0JCQkgKiBJZiB1c2VyIF5DcyBvdXQsIHdlIGRvbid0IHdhbnQgdG8ga2lsbCB0aGUgc2hlbGwuLi4KLQkJCSAqLwotCQkJaWYgKGludHJfb2sgJiYgKGV4c3RhdCAtIDEyOCkgIT0gU0lHVEVSTSkKLQkJCQlyZXR1cm4gKDEpOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBMRVhJVDoKLQkJY2FzZSBMTEVBVkU6Ci0JCWNhc2UgTFNIRUxMOgotCQkJdW53aW5kKGkpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQlkZWZhdWx0OgotCQkJaW50ZXJuYWxfZXJyb3JmKCJpbmNsdWRlOiAlZCIsIGkpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCQl9Ci0JfQotCWlmIChhcmd2KSB7Ci0JCWUtPmxvYy0+YXJndiA9IGFyZ3Y7Ci0JCWUtPmxvYy0+YXJnYyA9IGFyZ2M7Ci0JfQotCXMgPSBwdXNocyhTRklMRSwgQVRFTVApOwotCXMtPnUuc2hmID0gc2hmOwotCXN0cmR1cHgocy0+ZmlsZSwgbmFtZSwgQVRFTVApOwotCWkgPSBzaGVsbChzLCBmYWxzZSk7Ci0JcXVpdGVudihzLT51LnNoZik7Ci0JaWYgKG9sZF9hcmd2KSB7Ci0JCWUtPmxvYy0+YXJndiA9IG9sZF9hcmd2OwotCQllLT5sb2MtPmFyZ2MgPSBvbGRfYXJnYzsKLQl9Ci0JcmV0dXJuIChpICYgMHhmZik7CS8qICYgMHhmZiB0byBlbnN1cmUgdmFsdWUgbm90IC0xICovCi19Ci0KLS8qIHNwYXduIGEgY29tbWFuZCBpbnRvIGEgc2hlbGwgb3B0aW9uYWxseSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBsaW5lIG51bWJlciAqLwotaW50Ci1jb21tYW5kKGNvbnN0IGNoYXIgKmNvbW0sIGludCBsaW5lKQotewotCVNvdXJjZSAqczsKLQotCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7Ci0Jcy0+c3RhcnQgPSBzLT5zdHIgPSBjb21tOwotCXMtPmxpbmUgPSBsaW5lOwotCXJldHVybiAoc2hlbGwocywgZmFsc2UpKTsKLX0KLQotLyoKLSAqIHJ1biB0aGUgY29tbWFuZHMgZnJvbSB0aGUgaW5wdXQgc291cmNlLCByZXR1cm5pbmcgc3RhdHVzLgotICovCi1pbnQKLXNoZWxsKFNvdXJjZSAqIHZvbGF0aWxlIHMsIHZvbGF0aWxlIGludCB0b3BsZXZlbCkKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0Jdm9sYXRpbGUgaW50IHdhc3R0eSA9IHMtPmZsYWdzICYgU0ZfVFRZOwotCXZvbGF0aWxlIGludCBhdHRlbXB0cyA9IDEzOwotCXZvbGF0aWxlIGludCBpbnRlcmFjdGl2ZSA9IEZsYWcoRlRBTEtJTkcpICYmIHRvcGxldmVsOwotCVNvdXJjZSAqdm9sYXRpbGUgb2xkX3NvdXJjZSA9IHNvdXJjZTsKLQlpbnQgaTsKLQotCXMtPmZsYWdzIHw9IFNGX0ZJUlNUOwkvKiBlbmFibGUgVVRGLTggQk9NIGNoZWNrICovCi0KLQluZXdlbnYoRV9QQVJTRSk7Ci0JaWYgKGludGVyYWN0aXZlKQotCQlyZWFsbHlfZXhpdCA9IDA7Ci0JaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKLQlpZiAoaSkgewotCQlzd2l0Y2ggKGkpIHsKLQkJY2FzZSBMSU5UUjogLyogd2UgZ2V0IGhlcmUgaWYgU0lHSU5UIG5vdCBjYXVnaHQgb3IgaWdub3JlZCAqLwotCQljYXNlIExFUlJPUjoKLQkJY2FzZSBMU0hFTEw6Ci0JCQlpZiAoaW50ZXJhY3RpdmUpIHsKLQkJCQlpZiAoaSA9PSBMSU5UUikKLQkJCQkJc2hlbGxmKCJcbiIpOwotCQkJCS8qIFJlc2V0IGFueSBlb2YgdGhhdCB3YXMgcmVhZCBhcyBwYXJ0IG9mIGEKLQkJCQkgKiBtdWx0aWxpbmUgY29tbWFuZC4KLQkJCQkgKi8KLQkJCQlpZiAoRmxhZyhGSUdOT1JFRU9GKSAmJiBzLT50eXBlID09IFNFT0YgJiYKLQkJCQkgICAgd2FzdHR5KQotCQkJCQlzLT50eXBlID0gU1NURElOOwotCQkJCS8qIFVzZWQgYnkgZXhpdCBjb21tYW5kIHRvIGdldCBiYWNrIHRvCi0JCQkJICogdG9wIGxldmVsIHNoZWxsLiBLaW5kIG9mIHN0cmFuZ2Ugc2luY2UKLQkJCQkgKiBpbnRlcmFjdGl2ZSBpcyBzZXQgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbQotCQkJCSAqIGEgdHR5LCBidXQgdG8gaGF2ZSBzdG9wcGVkIGpvYnMsIG9uZSBvbmx5Ci0JCQkJICogbmVlZHMgRk1PTklUT1Igc2V0IChub3QgRlRBTEtJTkcvU0ZfVFRZKS4uLgotCQkJCSAqLwotCQkJCS8qIHRvc3MgYW55IGlucHV0IHdlIGhhdmUgc28gZmFyICovCi0JCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBMRVhJVDoKLQkJY2FzZSBMTEVBVkU6Ci0JCWNhc2UgTFJFVFVSTjoKLQkJCXNvdXJjZSA9IG9sZF9zb3VyY2U7Ci0JCQlxdWl0ZW52KE5VTEwpOwotCQkJdW53aW5kKGkpOwkvKiBrZWVwIG9uIGdvaW5nICovCi0JCQkvKiBOT1RSRUFDSEVEICovCi0JCWRlZmF1bHQ6Ci0JCQlzb3VyY2UgPSBvbGRfc291cmNlOwotCQkJcXVpdGVudihOVUxMKTsKLQkJCWludGVybmFsX2Vycm9yZigic2hlbGw6ICVkIiwgaSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCX0KLQl9Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKHRyYXApCi0JCQlydW50cmFwcygwKTsKLQotCQlpZiAocy0+bmV4dCA9PSBOVUxMKSB7Ci0JCQlpZiAoRmxhZyhGVkVSQk9TRSkpCi0JCQkJcy0+ZmxhZ3MgfD0gU0ZfRUNITzsKLQkJCWVsc2UKLQkJCQlzLT5mbGFncyAmPSB+U0ZfRUNITzsKLQkJfQotCQlpZiAoaW50ZXJhY3RpdmUpIHsKLQkJCWpfbm90aWZ5KCk7Ci0JCQlzZXRfcHJvbXB0KFBTMSwgcyk7Ci0JCX0KLQkJdCA9IGNvbXBpbGUocyk7Ci0JCWlmICh0ICE9IE5VTEwgJiYgdC0+dHlwZSA9PSBURU9GKSB7Ci0JCQlpZiAod2FzdHR5ICYmIEZsYWcoRklHTk9SRUVPRikgJiYgLS1hdHRlbXB0cyA+IDApIHsKLQkJCQlzaGVsbGYoIlVzZSAnZXhpdCcgdG8gbGVhdmUga3NoXG4iKTsKLQkJCQlzLT50eXBlID0gU1NURElOOwotCQkJfSBlbHNlIGlmICh3YXN0dHkgJiYgIXJlYWxseV9leGl0ICYmCi0JCQkgICAgal9zdG9wcGVkX3J1bm5pbmcoKSkgewotCQkJCXJlYWxseV9leGl0ID0gMTsKLQkJCQlzLT50eXBlID0gU1NURElOOwotCQkJfSBlbHNlIHsKLQkJCQkvKiB0aGlzIGZvciBQT1NJWCB3aGljaCBzYXlzIEVYSVQgdHJhcHMKLQkJCQkgKiBzaGFsbCBiZSB0YWtlbiBpbiB0aGUgZW52aXJvbm1lbnQKLQkJCQkgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBjb21tYW5kCi0JCQkJICogZXhlY3V0ZWQuCi0JCQkJICovCi0JCQkJaWYgKHRvcGxldmVsKQotCQkJCQl1bndpbmQoTEVYSVQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICh0ICYmICghRmxhZyhGTk9FWEVDKSB8fCAocy0+ZmxhZ3MgJiBTRl9UVFkpKSkKLQkJCWV4c3RhdCA9IGV4ZWN1dGUodCwgMCwgTlVMTCk7Ci0KLQkJaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlICE9IFRFT0YgJiYgaW50ZXJhY3RpdmUgJiYgcmVhbGx5X2V4aXQpCi0JCQlyZWFsbHlfZXhpdCA9IDA7Ci0KLQkJcmVjbGFpbSgpOwotCX0KLQlxdWl0ZW52KE5VTEwpOwotCXNvdXJjZSA9IG9sZF9zb3VyY2U7Ci0JcmV0dXJuIChleHN0YXQpOwotfQotCi0vKiByZXR1cm4gdG8gY2xvc2VzdCBlcnJvciBoYW5kbGVyIG9yIHNoZWxsKCksIGV4aXQgaWYgbm9uZSBmb3VuZCAqLwotdm9pZAotdW53aW5kKGludCBpKQotewotCS8qIG9yZGVyaW5nIGZvciBFWElUIHZzIEVSUiBpcyBhIGJpdCBvZGQgKHRoaXMgaXMgd2hhdCBBVCZUIGtzaCBkb2VzKSAqLwotCWlmIChpID09IExFWElUIHx8IChGbGFnKEZFUlJFWElUKSAmJiAoaSA9PSBMRVJST1IgfHwgaSA9PSBMSU5UUikgJiYKLQkgICAgc2lndHJhcHNbU0lHRVhJVF9dLnRyYXApKSB7Ci0JCXJ1bnRyYXAoJnNpZ3RyYXBzW1NJR0VYSVRfXSk7Ci0JCWkgPSBMTEVBVkU7Ci0JfSBlbHNlIGlmIChGbGFnKEZFUlJFWElUKSAmJiAoaSA9PSBMRVJST1IgfHwgaSA9PSBMSU5UUikpIHsKLQkJcnVudHJhcCgmc2lndHJhcHNbU0lHRVJSX10pOwotCQlpID0gTExFQVZFOwotCX0KLQl3aGlsZSAoMSkgewotCQlzd2l0Y2ggKGUtPnR5cGUpIHsKLQkJY2FzZSBFX1BBUlNFOgotCQljYXNlIEVfRlVOQzoKLQkJY2FzZSBFX0lOQ0w6Ci0JCWNhc2UgRV9MT09QOgotCQljYXNlIEVfRVJSSDoKLQkJCXNpZ2xvbmdqbXAoZS0+amJ1ZiwgaSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCi0JCWNhc2UgRV9OT05FOgotCQkJaWYgKGkgPT0gTElOVFIpCi0JCQkJZS0+ZmxhZ3MgfD0gRUZfRkFLRV9TSUdESUU7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQlkZWZhdWx0OgotCQkJcXVpdGVudihOVUxMKTsKLQkJfQotCX0KLX0KLQotdm9pZAotbmV3ZW52KGludCB0eXBlKQotewotCXN0cnVjdCBlbnYgKmVwOwotCWNoYXIgKmNwOwotCi0JLyoKLQkgKiBzdHJ1Y3QgZW52IGluY2x1ZGVzIEFMTE9DX0lURU0gZm9yIGFsaWdubWVudCBjb25zdHJhaW50cwotCSAqIHNvIGZpcnN0IGdldCB0aGUgYWN0dWFsbHkgdXNlZCBtZW1vcnksIHRoZW4gYXNzaWduIGl0Ci0JICovCi0JY3AgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGVudikgLSBBTExPQ19TSVpFLCBBVEVNUCk7Ci0JZXAgPSAodm9pZCAqKShjcCAtIEFMTE9DX1NJWkUpOwkvKiB1bmRvIHdoYXQgYWxsb2MoKSBkaWQgKi8KLQkvKiBpbml0aWFsaXNlIHB1YmxpYyBtZW1iZXJzIG9mIHN0cnVjdCBlbnYgKG5vdCB0aGUgQUxMT0NfSVRFTSkgKi8KLQlhaW5pdCgmZXAtPmFyZWEpOwotCWVwLT5vZW52ID0gZTsKLQllcC0+bG9jID0gZS0+bG9jOwotCWVwLT5zYXZlZmQgPSBOVUxMOwotCWVwLT50ZW1wcyA9IE5VTEw7Ci0JZXAtPnR5cGUgPSB0eXBlOwotCWVwLT5mbGFncyA9IDA7Ci0JLyoganVtcCBidWZmZXIgaXMgaW52YWxpZCBiZWNhdXNlIGZsYWdzID09IDAgKi8KLQllID0gZXA7Ci19Ci0KLXZvaWQKLXF1aXRlbnYoc3RydWN0IHNoZiAqc2hmKQotewotCXN0cnVjdCBlbnYgKmVwID0gZTsKLQljaGFyICpjcDsKLQlpbnQgZmQ7Ci0KLQlpZiAoZXAtPm9lbnYgJiYgZXAtPm9lbnYtPmxvYyAhPSBlcC0+bG9jKQotCQlwb3BibG9jaygpOwotCWlmIChlcC0+c2F2ZWZkICE9IE5VTEwpIHsKLQkJZm9yIChmZCA9IDA7IGZkIDwgTlVGSUxFOyBmZCsrKQotCQkJLyogaWYgZXAtPnNhdmVmZFtmZF0gPCAwLCBtZWFucyBmZCB3YXMgY2xvc2VkICovCi0JCQlpZiAoZXAtPnNhdmVmZFtmZF0pCi0JCQkJcmVzdGZkKGZkLCBlcC0+c2F2ZWZkW2ZkXSk7Ci0JCWlmIChlcC0+c2F2ZWZkWzJdKQkvKiBDbGVhciBhbnkgd3JpdGUgZXJyb3JzICovCi0JCQlzaGZfcmVvcGVuKDIsIFNIRl9XUiwgc2hsX291dCk7Ci0JfQotCS8qIEJvdHRvbSBvZiB0aGUgc3RhY2suCi0JICogRWl0aGVyIG1haW4gc2hlbGwgaXMgZXhpdGluZyBvciBjbGVhbnVwX3BhcmVudHNfZW52KCkgd2FzIGNhbGxlZC4KLQkgKi8KLQlpZiAoZXAtPm9lbnYgPT0gTlVMTCkgewotCQlpZiAoZXAtPnR5cGUgPT0gRV9OT05FKSB7CS8qIE1haW4gc2hlbGwgZXhpdGluZz8gKi8KLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotCQkJaWYgKEZsYWcoRlRBTEtJTkcpKQotCQkJCWhpc3RfZmluaXNoKCk7Ci0jZW5kaWYKLQkJCWpfZXhpdCgpOwotCQkJaWYgKGVwLT5mbGFncyAmIEVGX0ZBS0VfU0lHRElFKSB7Ci0JCQkJaW50IHNpZyA9IGV4c3RhdCAtIDEyODsKLQotCQkJCS8qIGhhbSB1cCBvdXIgZGVhdGggYSBiaXQgKEFUJlQga3NoCi0JCQkJICogb25seSBzZWVtcyB0byBkbyB0aGlzIGZvciBTSUdURVJNKQotCQkJCSAqIERvbid0IGRvIGl0IGZvciBTSUdRVUlULCBzaW5jZSB3ZSdkCi0JCQkJICogZHVtcCBhIGNvcmUuLgotCQkJCSAqLwotCQkJCWlmICgoc2lnID09IFNJR0lOVCB8fCBzaWcgPT0gU0lHVEVSTSkgJiYKLQkJCQkgICAgKGtzaHBncnAgPT0ga3NocGlkKSkgewotCQkJCQlzZXRzaWcoJnNpZ3RyYXBzW3NpZ10sIFNJR19ERkwsCi0JCQkJCSAgICBTU19SRVNUT1JFX0NVUlIgfCBTU19GT1JDRSk7Ci0JCQkJCWtpbGwoMCwgc2lnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNoZikKLQkJCXNoZl9jbG9zZShzaGYpOwotCQlyZWNsYWltKCk7Ci0JCWV4aXQoZXhzdGF0KTsKLQl9Ci0JaWYgKHNoZikKLQkJc2hmX2Nsb3NlKHNoZik7Ci0JcmVjbGFpbSgpOwotCi0JZSA9IGUtPm9lbnY7Ci0KLQkvKiBmcmVlIHRoZSBzdHJ1Y3QgZW52IC0gdHJpY2t5IGR1ZSB0byB0aGUgQUxMT0NfSVRFTSBpbnNpZGUgKi8KLQljcCA9ICh2b2lkICopZXA7Ci0JYWZyZWUoY3AgKyBBTExPQ19TSVpFLCBBVEVNUCk7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciBhIGZvcmsgdG8gY2xlYW51cCBzdHVmZiBsZWZ0IG92ZXIgZnJvbSBwYXJlbnRzIGVudmlyb25tZW50ICovCi12b2lkCi1jbGVhbnVwX3BhcmVudHNfZW52KHZvaWQpCi17Ci0Jc3RydWN0IGVudiAqZXA7Ci0JaW50IGZkOwotCi0JbWtzc2VydChlICE9IE5VTEwpOwotCi0JLyoKLQkgKiBEb24ndCBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMgLSBwYXJlbnQgd2lsbCBwcm9iYWJseSBuZWVkIHRoZW0uCi0JICogQWxzbywgY2FuJ3QgZWFzaWx5IHJlY2xhaW0gbWVtb3J5IHNpbmNlIHZhcmlhYmxlcywgZXRjLiBjb3VsZCBiZQotCSAqIGFueXdoZXJlLgotCSAqLwotCi0JLyogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaGlkaW5nIGluIHNhdmVmZCAqLwotCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikgewotCQlpZiAoZXAtPnNhdmVmZCkgewotCQkJZm9yIChmZCA9IDA7IGZkIDwgTlVGSUxFOyBmZCsrKQotCQkJCWlmIChlcC0+c2F2ZWZkW2ZkXSA+IDApCi0JCQkJCWNsb3NlKGVwLT5zYXZlZmRbZmRdKTsKLQkJCWFmcmVlKGVwLT5zYXZlZmQsICZlcC0+YXJlYSk7Ci0JCQllcC0+c2F2ZWZkID0gTlVMTDsKLQkJfQotCX0KLQllLT5vZW52ID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFuIGV4ZWN2ZSBjbGVhbnVwIHN0dWZmIHRlbXBvcmFyeSBmaWxlcyAqLwotdm9pZAotY2xlYW51cF9wcm9jX2Vudih2b2lkKQotewotCXN0cnVjdCBlbnYgKmVwOwotCi0JZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KQotCQlyZW1vdmVfdGVtcHMoZXAtPnRlbXBzKTsKLX0KLQotLyogcmVtb3ZlIHRlbXAgZmlsZXMgYW5kIGZyZWUgQVRFTVAgQXJlYSAqLwotc3RhdGljIHZvaWQKLXJlY2xhaW0odm9pZCkKLXsKLQlyZW1vdmVfdGVtcHMoZS0+dGVtcHMpOwotCWUtPnRlbXBzID0gTlVMTDsKLQlhZnJlZWFsbCgmZS0+YXJlYSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfdGVtcHMoc3RydWN0IHRlbXAgKnRwKQotewotCWZvciAoOyB0cCAhPSBOVUxMOyB0cCA9IHRwLT5uZXh0KQotCQlpZiAodHAtPnBpZCA9PSBwcm9jcGlkKQotCQkJdW5saW5rKHRwLT5uYW1lKTsKLX0KLQotLyogSW5pdGlhbGlzZSB0dHlfZmQuIFVzZWQgZm9yIHNhdmluZy9yZXNldGluZyB0dHkgbW9kZXMgdXBvbgotICogZm9yZWdyb3VuZCBqb2IgY29tcGxldGlvbiBhbmQgZm9yIHNldHRpbmcgdXAgdHR5IHByb2Nlc3MgZ3JvdXAuCi0gKi8KLXZvaWQKLXR0eV9pbml0KGJvb2wgaW5pdF90dHlzdGF0ZSwgYm9vbCBuZWVkX3R0eSkKLXsKLQlib29sIGRvX2Nsb3NlID0gdHJ1ZTsKLQlpbnQgdGZkOwotCi0JaWYgKHR0eV9mZCA+PSAwKSB7Ci0JCWNsb3NlKHR0eV9mZCk7Ci0JCXR0eV9mZCA9IC0xOwotCX0KLQl0dHlfZGV2dHR5ID0gMTsKLQotI2lmZGVmIF9VV0lOCi0JLyogWFhYIGltYWtlIHN0eWxlICovCi0JaWYgKGlzYXR0eSgzKSkKLQkJdGZkID0gMzsKLQllbHNlCi0jZW5kaWYKLQlpZiAoKHRmZCA9IG9wZW4oIi9kZXYvdHR5IiwgT19SRFdSLCAwKSkgPCAwKSB7Ci0JCXR0eV9kZXZ0dHkgPSAwOwotCQlpZiAobmVlZF90dHkpCi0JCQl3YXJuaW5nZihmYWxzZSwKLQkJCSAgICAiTm8gY29udHJvbGxpbmcgdHR5IChvcGVuIC9kZXYvdHR5OiAlcykiLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JfQotCWlmICh0ZmQgPCAwKSB7Ci0JCWRvX2Nsb3NlID0gZmFsc2U7Ci0JCWlmIChpc2F0dHkoMCkpCi0JCQl0ZmQgPSAwOwotCQllbHNlIGlmIChpc2F0dHkoMikpCi0JCQl0ZmQgPSAyOwotCQllbHNlIHsKLQkJCWlmIChuZWVkX3R0eSkKLQkJCQl3YXJuaW5nZihmYWxzZSwKLQkJCQkgICAgIkNhbid0IGZpbmQgdHR5IGZpbGUgZGVzY3JpcHRvciIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWlmICgodHR5X2ZkID0gZmNudGwodGZkLCBGX0RVUEZELCBGREJBU0UpKSA8IDApIHsKLQkJaWYgKG5lZWRfdHR5KQotCQkJd2FybmluZ2YoZmFsc2UsICJqX3R0eWluaXQ6IGR1cCBvZiB0dHkgZmQgZmFpbGVkOiAlcyIsCi0JCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQl9IGVsc2UgaWYgKGZjbnRsKHR0eV9mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPCAwKSB7Ci0JCWlmIChuZWVkX3R0eSkKLQkJCXdhcm5pbmdmKGZhbHNlLAotCQkJICAgICJqX3R0eWluaXQ6IGNhbid0IHNldCBjbG9zZS1vbi1leGVjIGZsYWc6ICVzIiwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQljbG9zZSh0dHlfZmQpOwotCQl0dHlfZmQgPSAtMTsKLQl9IGVsc2UgaWYgKGluaXRfdHR5c3RhdGUpCi0JCXRjZ2V0YXR0cih0dHlfZmQsICZ0dHlfc3RhdGUpOwotCWlmIChkb19jbG9zZSkKLQkJY2xvc2UodGZkKTsKLX0KLQotdm9pZAotdHR5X2Nsb3NlKHZvaWQpCi17Ci0JaWYgKHR0eV9mZCA+PSAwKSB7Ci0JCWNsb3NlKHR0eV9mZCk7Ci0JCXR0eV9mZCA9IC0xOwotCX0KLX0KLQotLyogQSBzaGVsbCBlcnJvciBvY2N1cnJlZCAoZWcsIHN5bnRheCBlcnJvciwgZXRjLikgKi8KLXZvaWQKLWVycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0Jc2hsX3N0ZG91dF9vayA9IDA7CS8qIGRlYnVnZ2luZzogbm90ZSB0aGF0IHN0ZG91dCBub3QgdmFsaWQgKi8KLQlleHN0YXQgPSAxOwotCWlmICgqZm10ICE9IDEpIHsKLQkJZXJyb3JfcHJlZml4KHRydWUpOwotCQl2YV9zdGFydCh2YSwgZm10KTsKLQkJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOwotCQl2YV9lbmQodmEpOwotCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKLQl9Ci0Jc2hmX2ZsdXNoKHNobF9vdXQpOwotCXVud2luZChMRVJST1IpOwotfQotCi0vKiBsaWtlIGVycm9yZigpLCBidXQgbm8gdW53aW5kIGlzIGRvbmUgKi8KLXZvaWQKLXdhcm5pbmdmKGJvb2wgZmlsZWxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQllcnJvcl9wcmVmaXgoZmlsZWxpbmUpOwotCXZhX3N0YXJ0KHZhLCBmbXQpOwotCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOwotCXNoZl9mbHVzaChzaGxfb3V0KTsKLX0KLQotLyogVXNlZCBieSBidWlsdC1pbiB1dGlsaXRpZXMgdG8gcHJlZml4IHNoZWxsIGFuZCB1dGlsaXR5IG5hbWUgdG8gbWVzc2FnZQotICogKGFsc28gdW53aW5kcyBlbnZpcm9ubWVudHMgZm9yIHNwZWNpYWwgYnVpbHRpbnMpLgotICovCi12b2lkCi1iaV9lcnJvcmYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCXNobF9zdGRvdXRfb2sgPSAwOwkvKiBkZWJ1Z2dpbmc6IG5vdGUgdGhhdCBzdGRvdXQgbm90IHZhbGlkICovCi0JZXhzdGF0ID0gMTsKLQlpZiAoKmZtdCAhPSAxKSB7Ci0JCWVycm9yX3ByZWZpeCh0cnVlKTsKLQkJLyogbm90IHNldCB3aGVuIG1haW4oKSBjYWxscyBwYXJzZV9hcmdzKCkgKi8KLQkJaWYgKGJ1aWx0aW5fYXJndjApCi0JCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXM6ICIsIGJ1aWx0aW5fYXJndjApOwotCQl2YV9zdGFydCh2YSwgZm10KTsKLQkJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOwotCQl2YV9lbmQodmEpOwotCQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKLQl9Ci0Jc2hmX2ZsdXNoKHNobF9vdXQpOwotCS8qIFBPU0lYIHNwZWNpYWwgYnVpbHRpbnMgYW5kIGtzaCBzcGVjaWFsIGJ1aWx0aW5zIGNhdXNlCi0JICogbm9uLWludGVyYWN0aXZlIHNoZWxscyB0byBleGl0LgotCSAqIFhYWCBvZGQgdXNlIG9mIEtFRVBBU047IGFsc28gbWF5IG5vdCB3YW50IExFUlJPUiBoZXJlCi0JICovCi0JaWYgKGJ1aWx0aW5fZmxhZyAmIFNQRUNfQkkpIHsKLQkJYnVpbHRpbl9hcmd2MCA9IE5VTEw7Ci0JCXVud2luZChMRVJST1IpOwotCX0KLX0KLQotLyogQ2FsbGVkIHdoZW4gc29tZXRoaW5nIHRoYXQgc2hvdWxkbid0IGhhcHBlbiBkb2VzICovCi12b2lkCi1pbnRlcm5hbF92ZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLQlzaGZfZnByaW50ZihzaGxfb3V0LCAiaW50ZXJuYWwgZXJyb3I6ICIpOwotCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIGFwKTsKLQlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKLQlzaGZfZmx1c2goc2hsX291dCk7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Vycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0JdmFfc3RhcnQodmEsIGZtdCk7Ci0JaW50ZXJuYWxfdmVycm9yZihmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCXVud2luZChMRVJST1IpOwotfQotCi12b2lkCi1pbnRlcm5hbF93YXJuaW5nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IHZhOwotCi0JdmFfc3RhcnQodmEsIGZtdCk7Ci0JaW50ZXJuYWxfdmVycm9yZihmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotfQotCi0vKiB1c2VkIGJ5IGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMgdG8gcHJpbnQgImtzaDogLmtzaHJjWzI1XTogIiAqLwotdm9pZAotZXJyb3JfcHJlZml4KGJvb2wgZmlsZWxpbmUpCi17Ci0JLyogQXZvaWQgZm9vOiBmb29bMl06IC4uLiAqLwotCWlmICghZmlsZWxpbmUgfHwgIXNvdXJjZSB8fCAhc291cmNlLT5maWxlIHx8Ci0JICAgIHN0cmNtcChzb3VyY2UtPmZpbGUsIGtzaG5hbWUpICE9IDApCi0JCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlczogIiwga3NobmFtZSArICgqa3NobmFtZSA9PSAnLScpKTsKLQlpZiAoZmlsZWxpbmUgJiYgc291cmNlICYmIHNvdXJjZS0+ZmlsZSAhPSBOVUxMKSB7Ci0JCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlc1slZF06ICIsIHNvdXJjZS0+ZmlsZSwKLQkJICAgIHNvdXJjZS0+ZXJybGluZSA+IDAgPyBzb3VyY2UtPmVycmxpbmUgOiBzb3VyY2UtPmxpbmUpOwotCQlzb3VyY2UtPmVycmxpbmUgPSAwOwotCX0KLX0KLQotLyogcHJpbnRmIHRvIHNobF9vdXQgKHN0ZGVycikgd2l0aCBmbHVzaCAqLwotdm9pZAotc2hlbGxmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQlpZiAoIWluaXRpb19kb25lKSAvKiBzaGxfb3V0IG1heSBub3QgYmUgc2V0IHVwIHlldC4uLiAqLwotCQlyZXR1cm47Ci0JdmFfc3RhcnQodmEsIGZtdCk7Ci0Jc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0Jc2hmX2ZsdXNoKHNobF9vdXQpOwotfQotCi0vKiBwcmludGYgdG8gc2hsX3N0ZG91dCAoc3Rkb3V0KSAqLwotdm9pZAotc2hwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCWlmICghc2hsX3N0ZG91dF9vaykKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGxfc3Rkb3V0IG5vdCB2YWxpZCIpOwotCXZhX3N0YXJ0KHZhLCBmbXQpOwotCXNoZl92ZnByaW50ZihzaGxfc3Rkb3V0LCBmbXQsIHZhKTsKLQl2YV9lbmQodmEpOwotfQotCi0vKiB0ZXN0IGlmIHdlIGNhbiBzZWVrIGJhY2t3YXJkcyBmZCAocmV0dXJucyAwIG9yIFNIRl9VTkJVRikgKi8KLWludAotY2FuX3NlZWsoaW50IGZkKQotewotCXN0cnVjdCBzdGF0IHN0YXRiOwotCi0JcmV0dXJuIChmc3RhdChmZCwgJnN0YXRiKSA9PSAwICYmICFTX0lTUkVHKHN0YXRiLnN0X21vZGUpID8KLQkgICAgU0hGX1VOQlVGIDogMCk7Ci19Ci0KLXN0cnVjdCBzaGYgc2hmX2lvYlszXTsKLQotdm9pZAotaW5pdGlvKHZvaWQpCi17Ci0Jc2hmX2Zkb3BlbigxLCBTSEZfV1IsIHNobF9zdGRvdXQpOwkvKiBmb3JjZSBidWZmZXIgYWxsb2NhdGlvbiAqLwotCXNoZl9mZG9wZW4oMiwgU0hGX1dSLCBzaGxfb3V0KTsKLQlzaGZfZmRvcGVuKDIsIFNIRl9XUiwgc2hsX3NwYXJlKTsJLyogZm9yY2UgYnVmZmVyIGFsbG9jYXRpb24gKi8KLQlpbml0aW9fZG9uZSA9IDE7Ci19Ci0KLS8qIEEgZHVwMigpIHdpdGggZXJyb3IgY2hlY2tpbmcgKi8KLWludAota3NoX2R1cDIoaW50IG9mZCwgaW50IG5mZCwgYm9vbCBlcnJvaykKLXsKLQlpbnQgcnY7Ci0KLQlpZiAoKChydiA9IGR1cDIob2ZkLCBuZmQpKSA8IDApICYmICFlcnJvayAmJiAoZXJybm8gIT0gRUJBREYpKQotCQllcnJvcmYoInRvbyBtYW55IGZpbGVzIG9wZW4gaW4gc2hlbGwiKTsKLQotI2lmZGVmIF9fdWx0cml4Ci0JLyogWFhYIGltYWtlIHN0eWxlICovCi0JaWYgKHJ2ID49IDApCi0JCWZjbnRsKG5mZCwgRl9TRVRGRCwgMCk7Ci0jZW5kaWYKLQotCXJldHVybiAocnYpOwotfQotCi0vKgotICogbW92ZSBmZCBmcm9tIHVzZXIgc3BhY2UgKDA8PWZkPDEwKSB0byBzaGVsbCBzcGFjZSAoZmQ+PTEwKSwKLSAqIHNldCBjbG9zZS1vbi1leGVjIGZsYWcuCi0gKi8KLXNob3J0Ci1zYXZlZmQoaW50IGZkKQotewotCWludCBuZmQgPSBmZDsKLQotCWlmIChmZCA8IEZEQkFTRSAmJiAobmZkID0gZmNudGwoZmQsIEZfRFVQRkQsIEZEQkFTRSkpIDwgMCAmJgotCSAgICBlcnJubyA9PSBFQkFERikKLQkJcmV0dXJuICgtMSk7Ci0JaWYgKG5mZCA8IDAgfHwgbmZkID4gU0hSVF9NQVgpCi0JCWVycm9yZigidG9vIG1hbnkgZmlsZXMgb3BlbiBpbiBzaGVsbCIpOwotCWZjbnRsKG5mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0JcmV0dXJuICgoc2hvcnQpbmZkKTsKLX0KLQotdm9pZAotcmVzdGZkKGludCBmZCwgaW50IG9mZCkKLXsKLQlpZiAoZmQgPT0gMikKLQkJc2hmX2ZsdXNoKCZzaGZfaW9iW2ZkXSk7Ci0JaWYgKG9mZCA8IDApCQkvKiBvcmlnaW5hbCBmZCBjbG9zZWQgKi8KLQkJY2xvc2UoZmQpOwotCWVsc2UgaWYgKGZkICE9IG9mZCkgewotCQlrc2hfZHVwMihvZmQsIGZkLCB0cnVlKTsgLyogWFhYOiB3aGF0IHRvIGRvIGlmIHRoaXMgZmFpbHM/ICovCi0JCWNsb3NlKG9mZCk7Ci0JfQotfQotCi12b2lkCi1vcGVucGlwZShpbnQgKnB2KQotewotCWludCBscHZbMl07Ci0KLQlpZiAocGlwZShscHYpIDwgMCkKLQkJZXJyb3JmKCJjYW4ndCBjcmVhdGUgcGlwZSAtIHRyeSBhZ2FpbiIpOwotCXB2WzBdID0gc2F2ZWZkKGxwdlswXSk7Ci0JaWYgKHB2WzBdICE9IGxwdlswXSkKLQkJY2xvc2UobHB2WzBdKTsKLQlwdlsxXSA9IHNhdmVmZChscHZbMV0pOwotCWlmIChwdlsxXSAhPSBscHZbMV0pCi0JCWNsb3NlKGxwdlsxXSk7Ci19Ci0KLXZvaWQKLWNsb3NlcGlwZShpbnQgKnB2KQotewotCWNsb3NlKHB2WzBdKTsKLQljbG9zZShwdlsxXSk7Ci19Ci0KLS8qIENhbGxlZCBieSBpb3NldHVwKCkgKGRlYWxzIHdpdGggMj4mNCwgZXRjLiksIGNfcmVhZCwgY19wcmludCB0byB0dXJuCi0gKiBhIHN0cmluZyAodGhlIFggaW4gMj4mWCwgcmVhZCAtdVgsIHByaW50IC11WCkgaW50byBhIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotaW50Ci1jaGVja19mZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgY29uc3QgY2hhciAqKmVtc2dwKQotewotCWludCBmZCwgZmw7Ci0KLQlpZiAobmFtZVswXSA9PSAncCcgJiYgIW5hbWVbMV0pCi0JCXJldHVybiAoY29wcm9jX2dldGZkKG1vZGUsIGVtc2dwKSk7Ci0JZm9yIChmZCA9IDA7IGtzaF9pc2RpZ2l0KCpuYW1lKTsgKytuYW1lKQotCQlmZCA9IChmZCAqIDEwKSArICpuYW1lIC0gJzAnOwotCWlmICgqbmFtZSB8fCBmZCA+PSBGREJBU0UpIHsKLQkJaWYgKGVtc2dwKQotCQkJKmVtc2dwID0gImlsbGVnYWwgZmlsZSBkZXNjcmlwdG9yIG5hbWUiOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JaWYgKChmbCA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKSkgPCAwKSB7Ci0JCWlmIChlbXNncCkKLQkJCSplbXNncCA9ICJiYWQgZmlsZSBkZXNjcmlwdG9yIjsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWZsICY9IE9fQUNDTU9ERTsKLQkvKiBYX09LIGlzIGEga2x1ZGdlIHRvIGRpc2FibGUgdGhpcyBjaGVjayBmb3IgZHVwcyAoeDwmMSk6Ci0JICogaGlzdG9yaWNhbCBzaGVsbHMgbmV2ZXIgZGlkIHRoaXMgY2hlY2sgKFhYWCBkb24ndCBrbm93IHdoYXQKLQkgKiBQT1NJWCBoYXMgdG8gc2F5KS4KLQkgKi8KLQlpZiAoIShtb2RlICYgWF9PSykgJiYgZmwgIT0gT19SRFdSICYmICgKLQkgICAgKChtb2RlICYgUl9PSykgJiYgZmwgIT0gT19SRE9OTFkpIHx8Ci0JICAgICgobW9kZSAmIFdfT0spICYmIGZsICE9IE9fV1JPTkxZKSkpIHsKLQkJaWYgKGVtc2dwKQotCQkJKmVtc2dwID0gKGZsID09IE9fV1JPTkxZKSA/Ci0JCQkgICAgImZkIG5vdCBvcGVuIGZvciByZWFkaW5nIiA6Ci0JCQkgICAgImZkIG5vdCBvcGVuIGZvciB3cml0aW5nIjsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCXJldHVybiAoZmQpOwotfQotCi0vKiBDYWxsZWQgb25jZSBmcm9tIG1haW4gKi8KLXZvaWQKLWNvcHJvY19pbml0KHZvaWQpCi17Ci0JY29wcm9jLnJlYWQgPSBjb3Byb2MucmVhZHcgPSBjb3Byb2Mud3JpdGUgPSAtMTsKLQljb3Byb2MubmpvYnMgPSAwOwotCWNvcHJvYy5pZCA9IDA7Ci19Ci0KLS8qIENhbGxlZCBieSBjX3JlYWQoKSB3aGVuIGVvZiBpcyByZWFkIC0gY2xvc2UgZmQgaWYgaXQgaXMgdGhlIGNvLXByb2Nlc3MgZmQgKi8KLXZvaWQKLWNvcHJvY19yZWFkX2Nsb3NlKGludCBmZCkKLXsKLQlpZiAoY29wcm9jLnJlYWQgPj0gMCAmJiBmZCA9PSBjb3Byb2MucmVhZCkgewotCQljb3Byb2NfcmVhZHdfY2xvc2UoZmQpOwotCQljbG9zZShjb3Byb2MucmVhZCk7Ci0JCWNvcHJvYy5yZWFkID0gLTE7Ci0JfQotfQotCi0vKiBDYWxsZWQgYnkgY19yZWFkKCkgYW5kIGJ5IGlvc2V0dXAoKSB0byBjbG9zZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLSAqIHJlYWQgcGlwZSwgc28gcmVhZHMgd2lsbCBhY3R1YWxseSB0ZXJtaW5hdGUuCi0gKi8KLXZvaWQKLWNvcHJvY19yZWFkd19jbG9zZShpbnQgZmQpCi17Ci0JaWYgKGNvcHJvYy5yZWFkdyA+PSAwICYmIGNvcHJvYy5yZWFkID49IDAgJiYgZmQgPT0gY29wcm9jLnJlYWQpIHsKLQkJY2xvc2UoY29wcm9jLnJlYWR3KTsKLQkJY29wcm9jLnJlYWR3ID0gLTE7Ci0JfQotfQotCi0vKiBDYWxsZWQgYnkgY19wcmludCB3aGVuIGEgd3JpdGUgdG8gYSBmZCBmYWlscyB3aXRoIEVQSVBFIGFuZCBieSBpb3NldHVwCi0gKiB3aGVuIGNvLXByb2Nlc3MgaW5wdXQgaXMgZHVwJ2QKLSAqLwotdm9pZAotY29wcm9jX3dyaXRlX2Nsb3NlKGludCBmZCkKLXsKLQlpZiAoY29wcm9jLndyaXRlID49IDAgJiYgZmQgPT0gY29wcm9jLndyaXRlKSB7Ci0JCWNsb3NlKGNvcHJvYy53cml0ZSk7Ci0JCWNvcHJvYy53cml0ZSA9IC0xOwotCX0KLX0KLQotLyogQ2FsbGVkIHRvIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YvdmFsdWUgb2YgdGhlIGNvLXByb2Nlc3MgZmlsZSBkZXNjcmlwdG9yLgotICogKFVzZWQgYnkgY2hlY2tfZmQoKSBhbmQgYnkgY19yZWFkL2NfcHJpbnQgdG8gZGVhbCB3aXRoIC1wIG9wdGlvbikuCi0gKi8KLWludAotY29wcm9jX2dldGZkKGludCBtb2RlLCBjb25zdCBjaGFyICoqZW1zZ3ApCi17Ci0JaW50IGZkID0gKG1vZGUgJiBSX09LKSA/IGNvcHJvYy5yZWFkIDogY29wcm9jLndyaXRlOwotCi0JaWYgKGZkID49IDApCi0JCXJldHVybiAoZmQpOwotCWlmIChlbXNncCkKLQkJKmVtc2dwID0gIm5vIGNvcHJvY2VzcyI7Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qIGNhbGxlZCB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIHJlbGF0ZWQgdG8gdGhlIGNvcHJvY2VzcyAoaWYgYW55KQotICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIFNJR0NITEQgYmxvY2tlZC4KLSAqLwotdm9pZAotY29wcm9jX2NsZWFudXAoaW50IHJldXNlKQotewotCS8qIFRoaXMgdG8gYWxsb3cgY28tcHJvY2Vzc2VzIHRvIHNoYXJlIG91dHB1dCBwaXBlICovCi0JaWYgKCFyZXVzZSB8fCBjb3Byb2MucmVhZHcgPCAwIHx8IGNvcHJvYy5yZWFkIDwgMCkgewotCQlpZiAoY29wcm9jLnJlYWQgPj0gMCkgewotCQkJY2xvc2UoY29wcm9jLnJlYWQpOwotCQkJY29wcm9jLnJlYWQgPSAtMTsKLQkJfQotCQlpZiAoY29wcm9jLnJlYWR3ID49IDApIHsKLQkJCWNsb3NlKGNvcHJvYy5yZWFkdyk7Ci0JCQljb3Byb2MucmVhZHcgPSAtMTsKLQkJfQotCX0KLQlpZiAoY29wcm9jLndyaXRlID49IDApIHsKLQkJY2xvc2UoY29wcm9jLndyaXRlKTsKLQkJY29wcm9jLndyaXRlID0gLTE7Ci0JfQotfQotCi1zdHJ1Y3QgdGVtcCAqCi1tYWtldGVtcChBcmVhICphcCwgVGVtcF90eXBlIHR5cGUsIHN0cnVjdCB0ZW1wICoqdGxpc3QpCi17Ci0Jc3RydWN0IHRlbXAgKnRwOwotCWludCBsZW47Ci0JaW50IGZkOwotCWNoYXIgKnBhdGhuYW1lOwotCWNvbnN0IGNoYXIgKmRpcjsKLQotCWRpciA9IHRtcGRpciA/IHRtcGRpciA6IE1LU0hfREVGQVVMVF9UTVBESVI7Ci0jaWYgSEFWRV9NS1NURU1QCi0JbGVuID0gc3RybGVuKGRpcikgKyA2ICsgMTAgKyAxOwotI2Vsc2UKLQlwYXRobmFtZSA9IHRlbXBuYW0oZGlyLCAibWtzaC4iKTsKLQlsZW4gPSAoKHBhdGhuYW1lID09IE5VTEwpID8gMCA6IHN0cmxlbihwYXRobmFtZSkpICsgMTsKLSNlbmRpZgotCXRwID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZW1wKSArIGxlbiwgYXApOwotCXRwLT5uYW1lID0gKGNoYXIgKikmdHBbMV07Ci0jaWYgIUhBVkVfTUtTVEVNUAotCWlmIChwYXRobmFtZSA9PSBOVUxMKQotCQl0cC0+bmFtZVswXSA9ICdcMCc7Ci0JZWxzZSB7Ci0JCW1lbWNweSh0cC0+bmFtZSwgcGF0aG5hbWUsIGxlbik7Ci0JCWZyZWUocGF0aG5hbWUpOwotCX0KLSNlbmRpZgotCXBhdGhuYW1lID0gdHAtPm5hbWU7Ci0JdHAtPnNoZiA9IE5VTEw7Ci0JdHAtPnR5cGUgPSB0eXBlOwotI2lmIEhBVkVfTUtTVEVNUAotCXNoZl9zbnByaW50ZihwYXRobmFtZSwgbGVuLCAiJXMvbWtzaC5YWFhYWFhYWFhYIiwgZGlyKTsKLQlpZiAoKGZkID0gbWtzdGVtcChwYXRobmFtZSkpID49IDApCi0jZWxzZQotCWlmICh0cC0+bmFtZVswXSAmJiAoZmQgPSBvcGVuKHRwLT5uYW1lLCBPX0NSRUFUIHwgT19SRFdSLCAwNjAwKSkgPj0gMCkKLSNlbmRpZgotCQl0cC0+c2hmID0gc2hmX2Zkb3BlbihmZCwgU0hGX1dSLCBOVUxMKTsKLQl0cC0+cGlkID0gcHJvY3BpZDsKLQotCXRwLT5uZXh0ID0gKnRsaXN0OwotCSp0bGlzdCA9IHRwOwotCXJldHVybiAodHApOwotfQotCi0vKgotICogV2UgdXNlIGEgc2ltaWxhciBjb2xsaXNpb24gcmVzb2x1dGlvbiBhbGdvcml0aG0gYXMgUHl0aG9uIDIuNS40Ci0gKiBidXQgd2l0aCBhIHNsaWdodGx5IHR3ZWFrZWQgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmcm9tIHNjcmF0Y2guCi0gKi8KLQotI2RlZmluZQlJTklUX1RCTFMJOAkvKiBpbml0aWFsIHRhYmxlIHNpemUgKHBvd2VyIG9mIDIpICovCi0jZGVmaW5lIFBFUlRVUkJfU0hJRlQJNQkvKiBzZWUgUHl0aG9uIDIuNS40IE9iamVjdHMvZGljdG9iamVjdC5jICovCi0KLXN0YXRpYyB2b2lkIHRleHBhbmQoc3RydWN0IHRhYmxlICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IHRuYW1lY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKLXN0YXRpYyBzdHJ1Y3QgdGJsICprdHNjYW4oc3RydWN0IHRhYmxlICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QsCi0gICAgc3RydWN0IHRibCAqKiopOwotCi1zdGF0aWMgdm9pZAotdGV4cGFuZChzdHJ1Y3QgdGFibGUgKnRwLCBzaXplX3QgbnNpemUpCi17Ci0Jc2l6ZV90IGksIGosIG9zaXplID0gdHAtPnNpemUsIHBlcnR1cmI7Ci0Jc3RydWN0IHRibCAqdGJscCwgKipwcDsKLQlzdHJ1Y3QgdGJsICoqbnRibHAsICoqb3RibHAgPSB0cC0+dGJsczsKLQotCW50YmxwID0gYWxsb2MobnNpemUgKiBzaXplb2Yoc3RydWN0IHRibCAqKSwgdHAtPmFyZWFwKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnNpemU7IGkrKykKLQkJbnRibHBbaV0gPSBOVUxMOwotCXRwLT5zaXplID0gbnNpemU7Ci0JdHAtPm5mcmVlID0gKG5zaXplICogNCkgLyA1OwkvKiB0YWJsZSBjYW4gZ2V0IDgwJSBmdWxsICovCi0JdHAtPnRibHMgPSBudGJscDsKLQlpZiAob3RibHAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW5zaXplLS07CQkJLyogZnJvbSBoZXJlIG9uIG5zaXplIDo9IG1hc2sgKi8KLQlmb3IgKGkgPSAwOyBpIDwgb3NpemU7IGkrKykKLQkJaWYgKCh0YmxwID0gb3RibHBbaV0pICE9IE5VTEwpIHsKLQkJCWlmICgodGJscC0+ZmxhZyAmIERFRklORUQpKSB7Ci0JCQkJLyogc2VhcmNoIGZvciBmcmVlIGhhc2ggdGFibGUgc2xvdCAqLwotCQkJCWogPSAocGVydHVyYiA9IHRibHAtPnVhLmh2YWwpICYgbnNpemU7Ci0JCQkJZ290byBmaW5kX2ZpcnN0X2VtcHR5X3Nsb3Q7Ci0gZmluZF9uZXh0X2VtcHR5X3Nsb3Q6Ci0JCQkJaiA9IChqIDw8IDIpICsgaiArIHBlcnR1cmIgKyAxOwotCQkJCXBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQ7Ci0gZmluZF9maXJzdF9lbXB0eV9zbG90OgotCQkJCXBwID0gJm50YmxwW2ogJiBuc2l6ZV07Ci0JCQkJaWYgKCpwcCAhPSBOVUxMKQotCQkJCQlnb3RvIGZpbmRfbmV4dF9lbXB0eV9zbG90OwotCQkJCS8qIGZvdW5kIGFuIGVtcHR5IGhhc2ggdGFibGUgc2xvdCAqLwotCQkJCSpwcCA9IHRibHA7Ci0JCQkJdHAtPm5mcmVlLS07Ci0JCQl9IGVsc2UgaWYgKCEodGJscC0+ZmxhZyAmIEZJTlVTRSkpIHsKLQkJCQlhZnJlZSh0YmxwLCB0cC0+YXJlYXApOwotCQkJfQotCQl9Ci0JYWZyZWUob3RibHAsIHRwLT5hcmVhcCk7Ci19Ci0KLXZvaWQKLWt0aW5pdChzdHJ1Y3QgdGFibGUgKnRwLCBBcmVhICphcCwgc2l6ZV90IHRzaXplKQotewotCXRwLT5hcmVhcCA9IGFwOwotCXRwLT50YmxzID0gTlVMTDsKLQl0cC0+c2l6ZSA9IHRwLT5uZnJlZSA9IDA7Ci0JaWYgKHRzaXplKQotCQl0ZXhwYW5kKHRwLCB0c2l6ZSk7Ci19Ci0KLS8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIHNlYXJjaCBmb3IsIGhhc2gobmFtZSksIHJ2IHBvaW50ZXIgdG8gdGJsIHB0ciAqLwotc3RhdGljIHN0cnVjdCB0YmwgKgota3RzY2FuKHN0cnVjdCB0YWJsZSAqdHAsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGgsIHN0cnVjdCB0YmwgKioqcHBwKQotewotCXNpemVfdCBqLCBwZXJ0dXJiLCBtYXNrOwotCXN0cnVjdCB0YmwgKipwcCwgKnA7Ci0KLQltYXNrID0gdHAtPnNpemUgLSAxOwotCS8qIHNlYXJjaCBmb3IgaGFzaCB0YWJsZSBzbG90IG1hdGNoaW5nIG5hbWUgKi8KLQlqID0gKHBlcnR1cmIgPSBoKSAmIG1hc2s7Ci0JZ290byBmaW5kX2ZpcnN0X3Nsb3Q7Ci0gZmluZF9uZXh0X3Nsb3Q6Ci0JaiA9IChqIDw8IDIpICsgaiArIHBlcnR1cmIgKyAxOwotCXBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQ7Ci0gZmluZF9maXJzdF9zbG90OgotCXBwID0gJnRwLT50YmxzW2ogJiBtYXNrXTsKLQlpZiAoKHAgPSAqcHApICE9IE5VTEwgJiYgKHAtPnVhLmh2YWwgIT0gaCB8fCAhKHAtPmZsYWcgJiBERUZJTkVEKSB8fAotCSAgICBzdHJjbXAocC0+bmFtZSwgbmFtZSkpKQotCQlnb3RvIGZpbmRfbmV4dF9zbG90OwotCS8qIHAgPT0gTlVMTCBpZiBub3QgZm91bmQsIGNvcnJlY3QgZm91bmQgZW50cnkgb3RoZXJ3aXNlICovCi0JaWYgKHBwcCkKLQkJKnBwcCA9IHBwOwotCXJldHVybiAocCk7Ci19Ci0KLS8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIHNlYXJjaCBmb3IsIGhhc2gobikgKi8KLXN0cnVjdCB0YmwgKgota3RzZWFyY2goc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbiwgdWludDMyX3QgaCkKLXsKLQlyZXR1cm4gKHRwLT5zaXplID8ga3RzY2FuKHRwLCBuLCBoLCBOVUxMKSA6IE5VTEwpOwotfQotCi0vKiB0YWJsZSwgbmFtZSAoa2V5KSB0byBlbnRlciwgaGFzaChuKSAqLwotc3RydWN0IHRibCAqCi1rdGVudGVyKHN0cnVjdCB0YWJsZSAqdHAsIGNvbnN0IGNoYXIgKm4sIHVpbnQzMl90IGgpCi17Ci0Jc3RydWN0IHRibCAqKnBwLCAqcDsKLQlpbnQgbGVuOwotCi0JaWYgKHRwLT5zaXplID09IDApCi0JCXRleHBhbmQodHAsIElOSVRfVEJMUyk7Ci0gU2VhcmNoOgotCWlmICgocCA9IGt0c2Nhbih0cCwgbiwgaCwgJnBwKSkpCi0JCXJldHVybiAocCk7Ci0KLQlpZiAodHAtPm5mcmVlIDw9IDApIHsKLQkJLyogdG9vIGZ1bGwgKi8KLQkJdGV4cGFuZCh0cCwgMiAqIHRwLT5zaXplKTsKLQkJZ290byBTZWFyY2g7Ci0JfQotCi0JLyogY3JlYXRlIG5ldyB0YmwgZW50cnkgKi8KLQlsZW4gPSBzdHJsZW4obikgKyAxOwotCXAgPSBhbGxvYyhvZmZzZXRvZihzdHJ1Y3QgdGJsLCBuYW1lWzBdKSArIGxlbiwgdHAtPmFyZWFwKTsKLQlwLT5mbGFnID0gMDsKLQlwLT50eXBlID0gMDsKLQlwLT5hcmVhcCA9IHRwLT5hcmVhcDsKLQlwLT51YS5odmFsID0gaDsKLQlwLT51Mi5maWVsZCA9IDA7Ci0JcC0+dS5hcnJheSA9IE5VTEw7Ci0JbWVtY3B5KHAtPm5hbWUsIG4sIGxlbik7Ci0KLQkvKiBlbnRlciBpbiB0cC0+dGJscyAqLwotCXRwLT5uZnJlZS0tOwotCSpwcCA9IHA7Ci0JcmV0dXJuIChwKTsKLX0KLQotdm9pZAota3R3YWxrKHN0cnVjdCB0c3RhdGUgKnRzLCBzdHJ1Y3QgdGFibGUgKnRwKQotewotCXRzLT5sZWZ0ID0gdHAtPnNpemU7Ci0JdHMtPm5leHQgPSB0cC0+dGJsczsKLX0KLQotc3RydWN0IHRibCAqCi1rdG5leHQoc3RydWN0IHRzdGF0ZSAqdHMpCi17Ci0Jd2hpbGUgKC0tdHMtPmxlZnQgPj0gMCkgewotCQlzdHJ1Y3QgdGJsICpwID0gKnRzLT5uZXh0Kys7Ci0JCWlmIChwICE9IE5VTEwgJiYgKHAtPmZsYWcgJiBERUZJTkVEKSkKLQkJCXJldHVybiAocCk7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXRuYW1lY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLQljb25zdCBzdHJ1Y3QgdGJsICphID0gKigoY29uc3Qgc3RydWN0IHRibCAqIGNvbnN0ICopcDEpOwotCWNvbnN0IHN0cnVjdCB0YmwgKmIgPSAqKChjb25zdCBzdHJ1Y3QgdGJsICogY29uc3QgKilwMik7Ci0KLQlyZXR1cm4gKHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKSk7Ci19Ci0KLXN0cnVjdCB0YmwgKioKLWt0c29ydChzdHJ1Y3QgdGFibGUgKnRwKQotewotCXNpemVfdCBpOwotCXN0cnVjdCB0YmwgKipwLCAqKnNwLCAqKmRwOwotCi0JcCA9IGFsbG9jKCh0cC0+c2l6ZSArIDEpICogc2l6ZW9mKHN0cnVjdCB0YmwgKiksIEFURU1QKTsKLQlzcCA9IHRwLT50YmxzOwkJLyogc291cmNlICovCi0JZHAgPSBwOwkJCS8qIGRlc3QgKi8KLQlpID0gKHNpemVfdCl0cC0+c2l6ZTsKLQl3aGlsZSAoaS0tKQotCQlpZiAoKCpkcCA9ICpzcCsrKSAhPSBOVUxMICYmICgoKCpkcCktPmZsYWcgJiBERUZJTkVEKSB8fAotCQkgICAgKCgqZHApLT5mbGFnICYgQVJSQVkpKSkKLQkJCWRwKys7Ci0JcXNvcnQocCwgKGkgPSBkcCAtIHApLCBzaXplb2Yodm9pZCAqKSwgdG5hbWVjbXApOwotCXBbaV0gPSBOVUxMOwotCXJldHVybiAocCk7Ci19Ci0KLSNpZmRlZiBTSUdXSU5DSAotc3RhdGljIHZvaWQKLXhfc2lnd2luY2goaW50IHNpZyBNS1NIX0FfVU5VU0VEKQotewotCS8qIHRoaXMgcnVucyBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQsIHdpdGggZXJybm8gc2F2ZWQgKi8KLQotCWdvdF93aW5jaCA9IDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21rc2gvc3JjL21pc2MuYyBiL21rc2gvc3JjL21pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNGRlMS4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy9taXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc5ICswLDAgQEAKLS8qCSRPcGVuQlNEOiBtaXNjLmMsdiAxLjM3IDIwMDkvMDQvMTkgMjA6MzQ6MDUgc3RoZW4gRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBwYXRoLmMsdiAxLjEyIDIwMDUvMDMvMzAgMTc6MTY6MzcgZGVyYWFkdCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAotICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgotICoKLSAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcwotICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCi0gKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KLSAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAotICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KLSAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgotICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50Ci0gKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKLSAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAotICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCi0gKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKLSAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCi0gKi8KLQotI2luY2x1ZGUgInNoLmgiCi0jaWYgIUhBVkVfR0VUUlVTQUdFCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX0dSUF9ICi0jaW5jbHVkZSA8Z3JwLmg+Ci0jZW5kaWYKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbWlzYy5jLHYgMS4xNDEgMjAxMC8wNy8xNyAyMjowOTozNiB0ZyBFeHAgJCIpOwotCi11bnNpZ25lZCBjaGFyIGNodHlwZXNbVUNIQVJfTUFYICsgMV07CS8qIHR5cGUgYml0cyBmb3IgdW5zaWduZWQgY2hhciAqLwotCi0jaWYgIUhBVkVfU0VUUkVTVUdJRAotdWlkX3Qga3NodWlkOwotZ2lkX3Qga3NoZ2lkLCBrc2hlZ2lkOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZG9fZ21hdGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpjY2xhc3MoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotI2lmZGVmIFRJT0NTQ1RUWQotc3RhdGljIHZvaWQgY2h2dChjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLS8qCi0gKiBGYXN0IGNoYXJhY3RlciBjbGFzc2VzCi0gKi8KLXZvaWQKLXNldGN0eXBlcyhjb25zdCBjaGFyICpzLCBpbnQgdCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICh0ICYgQ19JRlMpIHsKLQkJZm9yIChpID0gMDsgaSA8IFVDSEFSX01BWCArIDE7IGkrKykKLQkJCWNodHlwZXNbaV0gJj0gfkNfSUZTOwotCQljaHR5cGVzWzBdIHw9IENfSUZTOyAvKiBpbmNsdWRlIFwwIGluIENfSUZTICovCi0JfQotCXdoaWxlICgqcyAhPSAwKQotCQljaHR5cGVzWyh1bnNpZ25lZCBjaGFyKSpzKytdIHw9IHQ7Ci19Ci0KLXZvaWQKLWluaXRjdHlwZXModm9pZCkKLXsKLQlpbnQgYzsKLQotCWZvciAoYyA9ICdhJzsgYyA8PSAneic7IGMrKykKLQkJY2h0eXBlc1tjXSB8PSBDX0FMUEhBOwotCWZvciAoYyA9ICdBJzsgYyA8PSAnWic7IGMrKykKLQkJY2h0eXBlc1tjXSB8PSBDX0FMUEhBOwotCWNodHlwZXNbJ18nXSB8PSBDX0FMUEhBOwotCXNldGN0eXBlcygiMDEyMzQ1Njc4OSIsIENfRElHSVQpOwotCXNldGN0eXBlcygiIFx0XG58Jjs8PigpIiwgQ19MRVgxKTsgLyogXDAgYWRkZWQgYXV0b21hdGljYWxseSAqLwotCXNldGN0eXBlcygiKkAjISQtPyIsIENfVkFSMSk7Ci0Jc2V0Y3R5cGVzKCIgXHRcbiIsIENfSUZTV1MpOwotCXNldGN0eXBlcygiPS0rPyIsIENfU1VCT1AxKTsKLQlzZXRjdHlwZXMoIlx0XG4gXCIjJCYnKCkqOzw9Pj9bXFxdYHwiLCBDX1FVT1RFKTsKLX0KLQotLyogY2FsbGVkIGZyb20gWGNoZWNrTigpIHRvIGdyb3cgYnVmZmVyICovCi1jaGFyICoKLVhjaGVja19ncm93XyhYU3RyaW5nICp4c3AsIGNvbnN0IGNoYXIgKnhwLCB1bnNpZ25lZCBpbnQgbW9yZSkKLXsKLQljb25zdCBjaGFyICpvbGRfYmVnID0geHNwLT5iZWc7Ci0KLQl4c3AtPmxlbiArPSBtb3JlID4geHNwLT5sZW4gPyBtb3JlIDogeHNwLT5sZW47Ci0JeHNwLT5iZWcgPSBhcmVzaXplKHhzcC0+YmVnLCB4c3AtPmxlbiArIDgsIHhzcC0+YXJlYXApOwotCXhzcC0+ZW5kID0geHNwLT5iZWcgKyB4c3AtPmxlbjsKLQlyZXR1cm4gKHhzcC0+YmVnICsgKHhwIC0gb2xkX2JlZykpOwotfQotCi0jZGVmaW5lIFNIRkxBR1NfREVGTlMKLSNpbmNsdWRlICJzaF9mbGFncy5oIgotCi1jb25zdCBzdHJ1Y3Qgc2hvcHRpb24gb3B0aW9uc1tdID0gewotI2RlZmluZSBTSEZMQUdTX0lURU1TCi0jaW5jbHVkZSAic2hfZmxhZ3MuaCIKLX07Ci0KLS8qCi0gKiB0cmFuc2xhdGUgLW8gb3B0aW9uIGludG8gRiogY29uc3RhbnQgKGFsc28gdXNlZCBmb3IgdGVzdCAtbyBvcHRpb24pCi0gKi8KLXNpemVfdAotb3B0aW9uKGNvbnN0IGNoYXIgKm4pCi17Ci0Jc2l6ZV90IGk7Ci0KLQlpZiAoKG5bMF0gPT0gJy0nIHx8IG5bMF0gPT0gJysnKSAmJiBuWzFdICYmICFuWzJdKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQotCQkJaWYgKG9wdGlvbnNbaV0uYyA9PSBuWzFdKQotCQkJCXJldHVybiAoaSk7Ci0JfSBlbHNlIGZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQotCQlpZiAob3B0aW9uc1tpXS5uYW1lICYmIHN0cmNtcChvcHRpb25zW2ldLm5hbWUsIG4pID09IDApCi0JCQlyZXR1cm4gKGkpOwotCi0JcmV0dXJuICgoc2l6ZV90KS0xKTsKLX0KLQotc3RydWN0IG9wdGlvbnNfaW5mbyB7Ci0JaW50IG9wdF93aWR0aDsKLQlpbnQgb3B0c1tORUxFTShvcHRpb25zKV07Ci19OwotCi1zdGF0aWMgY2hhciAqb3B0aW9uc19mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKLXN0YXRpYyB2b2lkIHByaW50b3B0aW9ucyhib29sKTsKLQotLyogZm9ybWF0IGEgc2luZ2xlIHNlbGVjdCBtZW51IGl0ZW0gKi8KLXN0YXRpYyBjaGFyICoKLW9wdGlvbnNfZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKLXsKLQljb25zdCBzdHJ1Y3Qgb3B0aW9uc19pbmZvICpvaSA9IChjb25zdCBzdHJ1Y3Qgb3B0aW9uc19pbmZvICopYXJnOwotCi0Jc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJS0qcyAlcyIsCi0JICAgIG9pLT5vcHRfd2lkdGgsIG9wdGlvbnNbb2ktPm9wdHNbaV1dLm5hbWUsCi0JICAgIEZsYWcob2ktPm9wdHNbaV0pID8gIm9uIiA6ICJvZmYiKTsKLQlyZXR1cm4gKGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludG9wdGlvbnMoYm9vbCB2ZXJib3NlKQotewotCWludCBpID0gMDsKLQotCWlmICh2ZXJib3NlKSB7Ci0JCWludCBuID0gMCwgbGVuLCBvY3RzID0gMDsKLQkJc3RydWN0IG9wdGlvbnNfaW5mbyBvaTsKLQotCQkvKiB2ZXJib3NlIHZlcnNpb24gKi8KLQkJc2hmX3B1dHMoIkN1cnJlbnQgb3B0aW9uIHNldHRpbmdzXG4iLCBzaGxfc3Rkb3V0KTsKLQotCQlvaS5vcHRfd2lkdGggPSAwOwotCQl3aGlsZSAoaSA8IChpbnQpTkVMRU0ob3B0aW9ucykpIHsKLQkJCWlmIChvcHRpb25zW2ldLm5hbWUpIHsKLQkJCQlvaS5vcHRzW24rK10gPSBpOwotCQkJCWxlbiA9IHN0cmxlbihvcHRpb25zW2ldLm5hbWUpOwotCQkJCWlmIChsZW4gPiBvY3RzKQotCQkJCQlvY3RzID0gbGVuOwotCQkJCWxlbiA9IHV0Zl9tYnN3aWR0aChvcHRpb25zW2ldLm5hbWUpOwotCQkJCWlmIChsZW4gPiBvaS5vcHRfd2lkdGgpCi0JCQkJCW9pLm9wdF93aWR0aCA9IGxlbjsKLQkJCX0KLQkJCSsraTsKLQkJfQotCQlwcmludF9jb2x1bW5zKHNobF9zdGRvdXQsIG4sIG9wdGlvbnNfZm10X2VudHJ5LCAmb2ksCi0JCSAgICBvY3RzICsgNCwgb2kub3B0X3dpZHRoICsgNCwgdHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJLyogc2hvcnQgdmVyc2lvbiDDoSBsYSBBVCZUIGtzaDkzICovCi0JCXNoZl9wdXRzKCJzZXQiLCBzaGxfc3Rkb3V0KTsKLQkJd2hpbGUgKGkgPCAoaW50KU5FTEVNKG9wdGlvbnMpKSB7Ci0JCQlpZiAoRmxhZyhpKSAmJiBvcHRpb25zW2ldLm5hbWUpCi0JCQkJc2hwcmludGYoIiAtbyAlcyIsIG9wdGlvbnNbaV0ubmFtZSk7Ci0JCQkrK2k7Ci0JCX0KLQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7Ci0JfQotfQotCi1jaGFyICoKLWdldG9wdGlvbnModm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQljaGFyIG1bKGludCkgRk5GTEFHUyArIDFdOwotCWNoYXIgKmNwID0gbTsKLQotCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQotCQlpZiAob3B0aW9uc1tpXS5jICYmIEZsYWcoaSkpCi0JCQkqY3ArKyA9IG9wdGlvbnNbaV0uYzsKLQlzdHJuZHVweChjcCwgbSwgY3AgLSBtLCBBVEVNUCk7Ci0JcmV0dXJuIChjcCk7Ci19Ci0KLS8qIGNoYW5nZSBhIEZsYWcoKikgdmFsdWU7IHRha2VzIGNhcmUgb2Ygc3BlY2lhbCBhY3Rpb25zICovCi12b2lkCi1jaGFuZ2VfZmxhZyhlbnVtIHNoX2ZsYWcgZiwgaW50IHdoYXQsIHVuc2lnbmVkIGludCBuZXd2YWwpCi17Ci0JdW5zaWduZWQgY2hhciBvbGR2YWw7Ci0KLQlvbGR2YWwgPSBGbGFnKGYpOwotCUZsYWcoZikgPSBuZXd2YWwgPyAxIDogMDsJLyogbmVlZGVkIGZvciB0cmlzdGF0ZXMgKi8KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0JaWYgKGYgPT0gRk1PTklUT1IpIHsKLQkJaWYgKHdoYXQgIT0gT0ZfQ01ETElORSAmJiBuZXd2YWwgIT0gb2xkdmFsKQotCQkJal9jaGFuZ2UoKTsKLQl9IGVsc2UKLSNlbmRpZgotCSAgaWYgKCgKLSNpZiAhTUtTSF9TX05PVkkKLQkgICAgZiA9PSBGVkkgfHwKLSNlbmRpZgotCSAgICBmID09IEZFTUFDUyB8fCBmID09IEZHTUFDUykgJiYgbmV3dmFsKSB7Ci0jaWYgIU1LU0hfU19OT1ZJCi0JCUZsYWcoRlZJKSA9Ci0jZW5kaWYKLQkJICAgIEZsYWcoRkVNQUNTKSA9IEZsYWcoRkdNQUNTKSA9IDA7Ci0JCUZsYWcoZikgPSAodW5zaWduZWQgY2hhciluZXd2YWw7Ci0JfSBlbHNlIGlmIChmID09IEZQUklWSUxFR0VEICYmIG9sZHZhbCAmJiAhbmV3dmFsKSB7Ci0JCS8qIFR1cm5pbmcgb2ZmIC1wPyAqLwotI2lmIEhBVkVfU0VUUkVTVUdJRAotCQlnaWRfdCBrc2hlZ2lkID0gZ2V0Z2lkKCk7Ci0KLQkJc2V0cmVzZ2lkKGtzaGVnaWQsIGtzaGVnaWQsIGtzaGVnaWQpOwotI2lmIEhBVkVfU0VUR1JPVVBTCi0JCXNldGdyb3VwcygxLCAma3NoZWdpZCk7Ci0jZW5kaWYKLQkJc2V0cmVzdWlkKGtzaGV1aWQsIGtzaGV1aWQsIGtzaGV1aWQpOwotI2Vsc2UKLQkJc2V0ZXVpZChrc2hldWlkID0ga3NodWlkID0gZ2V0dWlkKCkpOwotCQlzZXR1aWQoa3NoZXVpZCk7Ci0JCXNldGVnaWQoa3NoZWdpZCA9IGtzaGdpZCA9IGdldGdpZCgpKTsKLQkJc2V0Z2lkKGtzaGVnaWQpOwotI2VuZGlmCi0JfSBlbHNlIGlmICgoZiA9PSBGUE9TSVggfHwgZiA9PSBGU0gpICYmIG5ld3ZhbCkgewotCQlGbGFnKEZQT1NJWCkgPSBGbGFnKEZTSCkgPSBGbGFnKEZCUkFDRUVYUEFORCkgPSAwOwotCQlGbGFnKGYpID0gKHVuc2lnbmVkIGNoYXIpbmV3dmFsOwotCX0KLQkvKiBDaGFuZ2luZyBpbnRlcmFjdGl2ZSBmbGFnPyAqLwotCWlmIChmID09IEZUQUxLSU5HKSB7Ci0JCWlmICgod2hhdCA9PSBPRl9DTURMSU5FIHx8IHdoYXQgPT0gT0ZfU0VUKSAmJiBwcm9jcGlkID09IGtzaHBpZCkKLQkJCUZsYWcoRlRBTEtJTkdfSSkgPSAodW5zaWduZWQgY2hhciluZXd2YWw7Ci0JfQotfQotCi0vKiBQYXJzZSBjb21tYW5kIGxpbmUgJiBzZXQgY29tbWFuZCBhcmd1bWVudHMuIFJldHVybnMgdGhlIGluZGV4IG9mCi0gKiBub24tb3B0aW9uIGFyZ3VtZW50cywgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gKi8KLWludAotcGFyc2VfYXJncyhjb25zdCBjaGFyICoqYXJndiwKLSAgICBpbnQgd2hhdCwJCQkvKiBPRl9DTURMSU5FIG9yIE9GX1NFVCAqLwotICAgIGJvb2wgKnNldGFyZ3NwKQotewotCXN0YXRpYyBjaGFyIGNtZF9vcHRzW05FTEVNKG9wdGlvbnMpICsgNV07IC8qIG86VDpcMCAqLwotCXN0YXRpYyBjaGFyIHNldF9vcHRzW05FTEVNKG9wdGlvbnMpICsgNl07IC8qIEE6bztzXDAgKi8KLQljaGFyIHNldCwgKm9wdHM7Ci0JY29uc3QgY2hhciAqYXJyYXkgPSBOVUxMOwotCUdldG9wdCBnbzsKLQlzaXplX3QgaTsKLQlpbnQgb3B0Yywgc29ydGFyZ3MgPSAwLCBhcnJheXNldCA9IDA7Ci0KLQkvKiBGaXJzdCBjYWxsPyBCdWlsZCBvcHRpb24gc3RyaW5ncy4uLiAqLwotCWlmIChjbWRfb3B0c1swXSA9PSAnXDAnKSB7Ci0JCWNoYXIgKnAgPSBjbWRfb3B0cywgKnEgPSBzZXRfb3B0czsKLQotCQkvKiBzZWUgY21kX29wdHNbXSBkZWNsYXJhdGlvbiAqLwotCQkqcCsrID0gJ28nOwotCQkqcCsrID0gJzonOwotI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpIHx8IGRlZmluZWQoVElPQ1NDVFRZKQotCQkqcCsrID0gJ1QnOwotCQkqcCsrID0gJzonOwotI2VuZGlmCi0JCS8qIHNlZSBzZXRfb3B0c1tdIGRlY2xhcmF0aW9uICovCi0JCSpxKysgPSAnQSc7Ci0JCSpxKysgPSAnOic7Ci0JCSpxKysgPSAnbyc7Ci0JCSpxKysgPSAnOyc7Ci0JCSpxKysgPSAncyc7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspIHsKLQkJCWlmIChvcHRpb25zW2ldLmMpIHsKLQkJCQlpZiAob3B0aW9uc1tpXS5mbGFncyAmIE9GX0NNRExJTkUpCi0JCQkJCSpwKysgPSBvcHRpb25zW2ldLmM7Ci0JCQkJaWYgKG9wdGlvbnNbaV0uZmxhZ3MgJiBPRl9TRVQpCi0JCQkJCSpxKysgPSBvcHRpb25zW2ldLmM7Ci0JCQl9Ci0JCX0KLQkJKnAgPSAnXDAnOwotCQkqcSA9ICdcMCc7Ci0JfQotCi0JaWYgKHdoYXQgPT0gT0ZfQ01ETElORSkgewotCQljb25zdCBjaGFyICpwID0gYXJndlswXSwgKnE7Ci0JCS8qIFNldCBGTE9HSU4gYmVmb3JlIHBhcnNpbmcgb3B0aW9ucyBzbyB1c2VyIGNhbiBjbGVhcgotCQkgKiBmbGFnIHVzaW5nICtsLgotCQkgKi8KLQkJaWYgKCpwICE9ICctJykKLQkJCWZvciAocSA9IHA7ICpxOyApCi0JCQkJaWYgKCpxKysgPT0gJy8nKQotCQkJCQlwID0gcTsKLQkJRmxhZyhGTE9HSU4pID0gKCpwID09ICctJyk7Ci0JCW9wdHMgPSBjbWRfb3B0czsKLQl9IGVsc2UgaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKSB7Ci0JCW9wdHMgPSBjbWRfb3B0czsKLQl9IGVsc2UKLQkJb3B0cyA9IHNldF9vcHRzOwotCWtzaF9nZXRvcHRfcmVzZXQoJmdvLCBHRl9FUlJPUnxHRl9QTFVTT1BUKTsKLQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KGFyZ3YsICZnbywgb3B0cykpICE9IC0xKSB7Ci0JCXNldCA9IChnby5pbmZvICYgR0lfUExVUykgPyAwIDogMTsKLQkJc3dpdGNoIChvcHRjKSB7Ci0JCWNhc2UgJ0EnOgotCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQotCQkJCWJyZWFrOwotCQkJYXJyYXlzZXQgPSBzZXQgPyAxIDogLTE7Ci0JCQlhcnJheSA9IGdvLm9wdGFyZzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ28nOgotCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQotCQkJCWJyZWFrOwotCQkJaWYgKGdvLm9wdGFyZyA9PSBOVUxMKSB7Ci0JCQkJLyogbG9uZSAtbzogcHJpbnQgb3B0aW9ucwotCQkJCSAqCi0JCQkJICogTm90ZSB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUsIC1vIHJlcXVpcmVzCi0JCQkJICogYW4gb3B0aW9uIChpZSwgY2FuJ3QgZ2V0IGhlcmUgaWYgd2hhdCBpcwotCQkJCSAqIE9GX0NNRExJTkUpLgotCQkJCSAqLwotCQkJCXByaW50b3B0aW9ucyhzZXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSA9IG9wdGlvbihnby5vcHRhcmcpOwotCQkJaWYgKChlbnVtIHNoX2ZsYWcpaSA9PSBGQVJDNFJBTkRPTSkgewotCQkJCXdhcm5pbmdmKHRydWUsICJEbyBub3QgdXNlIHNldCDCsW8gYXJjNHJhbmRvbSwiCi0JCQkJICAgICIgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24iCi0JCQkJICAgICIgb2YgbWtzaCEiKTsKLQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJaWYgKChpICE9IChzaXplX3QpLTEpICYmIHNldCA9PSBGbGFnKGkpKQotCQkJCS8qIERvbid0IGNoZWNrIHRoZSBjb250ZXh0IGlmIHRoZSBmbGFnCi0JCQkJICogaXNuJ3QgY2hhbmdpbmcgLSBtYWtlcyAic2V0IC1vIGludGVyYWN0aXZlIgotCQkJCSAqIHdvcmsgaWYgeW91J3JlIGFscmVhZHkgaW50ZXJhY3RpdmUuIE5lZWRlZAotCQkJCSAqIGlmIHRoZSBvdXRwdXQgb2YgInNldCArbyIgaXMgdG8gYmUgdXNlZC4KLQkJCQkgKi8KLQkJCQk7Ci0JCQllbHNlIGlmICgoaSAhPSAoc2l6ZV90KS0xKSAmJiAob3B0aW9uc1tpXS5mbGFncyAmIHdoYXQpKQotCQkJCWNoYW5nZV9mbGFnKChlbnVtIHNoX2ZsYWcpaSwgd2hhdCwgc2V0KTsKLQkJCWVsc2UgewotCQkJCWJpX2Vycm9yZigiJXM6IGJhZCBvcHRpb24iLCBnby5vcHRhcmcpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQkJYnJlYWs7Ci0KLSNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSB8fCBkZWZpbmVkKFRJT0NTQ1RUWSkKLQkJY2FzZSAnVCc6Ci0JCQlpZiAod2hhdCAhPSBPRl9GSVJTVFRJTUUpCi0JCQkJYnJlYWs7Ci0jaWZuZGVmIFRJT0NTQ1RUWQotCQkJZXJyb3JmKCJubyBUSU9DU0NUVFkgaW9jdGwiKTsKLSNlbHNlCi0JCQljaGFuZ2VfZmxhZyhGVEFMS0lORywgT0ZfQ01ETElORSwgMSk7Ci0JCQljaHZ0KGdvLm9wdGFyZyk7Ci0JCQlicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLQkJY2FzZSAnPyc6Ci0JCQlyZXR1cm4gKC0xKTsKLQotCQlkZWZhdWx0OgotCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQotCQkJCWJyZWFrOwotCQkJLyogLXM6IHNvcnQgcG9zaXRpb25hbCBwYXJhbXMgKEFUJlQga3NoIHN0dXBpZGl0eSkgKi8KLQkJCWlmICh3aGF0ID09IE9GX1NFVCAmJiBvcHRjID09ICdzJykgewotCQkJCXNvcnRhcmdzID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQotCQkJCWlmIChvcHRjID09IG9wdGlvbnNbaV0uYyAmJgotCQkJCSAgICAod2hhdCAmIG9wdGlvbnNbaV0uZmxhZ3MpKSB7Ci0JCQkJCWNoYW5nZV9mbGFnKChlbnVtIHNoX2ZsYWcpaSwgd2hhdCwgc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJaWYgKGkgPT0gTkVMRU0ob3B0aW9ucykpCi0JCQkJaW50ZXJuYWxfZXJyb3JmKCJwYXJzZV9hcmdzOiAnJWMnIiwgb3B0Yyk7Ci0JCX0KLQl9Ci0JaWYgKCEoZ28uaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmIGFyZ3ZbZ28ub3B0aW5kXSAmJgotCSAgICAoYXJndltnby5vcHRpbmRdWzBdID09ICctJyB8fCBhcmd2W2dvLm9wdGluZF1bMF0gPT0gJysnKSAmJgotCSAgICBhcmd2W2dvLm9wdGluZF1bMV0gPT0gJ1wwJykgewotCQkvKiBsb25lIC0gY2xlYXJzIC12IGFuZCAteCBmbGFncyAqLwotCQlpZiAoYXJndltnby5vcHRpbmRdWzBdID09ICctJykKLQkJCUZsYWcoRlZFUkJPU0UpID0gRmxhZyhGWFRSQUNFKSA9IDA7Ci0JCS8qIHNldCBza2lwcyBsb25lIC0gb3IgKyBvcHRpb24gKi8KLQkJZ28ub3B0aW5kKys7Ci0JfQotCWlmIChzZXRhcmdzcCkKLQkJLyogLS0gbWVhbnMgc2V0ICQjLyQqIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cyAqLwotCQkqc2V0YXJnc3AgPSAhYXJyYXlzZXQgJiYgKChnby5pbmZvICYgR0lfTUlOVVNNSU5VUykgfHwKLQkJICAgIGFyZ3ZbZ28ub3B0aW5kXSk7Ci0KLQlpZiAoYXJyYXlzZXQgJiYgKCEqYXJyYXkgfHwgKnNraXBfdmFybmFtZShhcnJheSwgZmFsc2UpKSkgewotCQliaV9lcnJvcmYoIiVzOiBpcyBub3QgYW4gaWRlbnRpZmllciIsIGFycmF5KTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChzb3J0YXJncykgewotCQlmb3IgKGkgPSBnby5vcHRpbmQ7IGFyZ3ZbaV07IGkrKykKLQkJCTsKLQkJcXNvcnQoJmFyZ3ZbZ28ub3B0aW5kXSwgaSAtIGdvLm9wdGluZCwgc2l6ZW9mKHZvaWQgKiksCi0JCSAgICB4c3RyY21wKTsKLQl9Ci0JaWYgKGFycmF5c2V0KQotCQlnby5vcHRpbmQgKz0gc2V0X2FycmF5KGFycmF5LCBhcnJheXNldCA+IDAgPyB0cnVlIDogZmFsc2UsCi0JCSAgICBhcmd2ICsgZ28ub3B0aW5kKTsKLQotCXJldHVybiAoZ28ub3B0aW5kKTsKLX0KLQotLyogcGFyc2UgYSBkZWNpbWFsIG51bWJlcjogcmV0dXJucyAwIGlmIHN0cmluZyBpc24ndCBhIG51bWJlciwgMSBvdGhlcndpc2UgKi8KLWludAotZ2V0bihjb25zdCBjaGFyICpzLCBpbnQgKmFpKQotewotCWludCBpLCBjLCBydiA9IDA7Ci0JYm9vbCBuZWcgPSBmYWxzZTsKLQotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoa3NoX2lzc3BhY2UoYykpOwotCWlmIChjID09ICctJykgewotCQluZWcgPSB0cnVlOwotCQljID0gKnMrKzsKLQl9IGVsc2UgaWYgKGMgPT0gJysnKQotCQljID0gKnMrKzsKLQkqYWkgPSBpID0gMDsKLQlkbyB7Ci0JCWlmICgha3NoX2lzZGlnaXQoYykpCi0JCQlnb3RvIGdldG5fb3V0OwotCQlpICo9IDEwOwotCQlpZiAoaSA8ICphaSkKLQkJCS8qIG92ZXJmbG93ICovCi0JCQlnb3RvIGdldG5fb3V0OwotCQlpICs9IGMgLSAnMCc7Ci0JCSphaSA9IGk7Ci0JfSB3aGlsZSAoKGMgPSAqcysrKSk7Ci0JcnYgPSAxOwotCi0gZ2V0bl9vdXQ6Ci0JaWYgKG5lZykKLQkJKmFpID0gLSphaTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotLyogZ2V0bigpIHRoYXQgcHJpbnRzIGVycm9yICovCi1pbnQKLWJpX2dldG4oY29uc3QgY2hhciAqYXMsIGludCAqYWkpCi17Ci0JaW50IHJ2OwotCi0JaWYgKCEocnYgPSBnZXRuKGFzLCBhaSkpKQotCQliaV9lcnJvcmYoIiVzOiBiYWQgbnVtYmVyIiwgYXMpOwotCXJldHVybiAocnYpOwotfQotCi0vKiAtLS0tLS0tLSBnbWF0Y2guYyAtLS0tLS0tLSAqLwotCi0vKgotICogaW50IGdtYXRjaChzdHJpbmcsIHBhdHRlcm4pCi0gKiBjaGFyICpzdHJpbmcsICpwYXR0ZXJuOwotICoKLSAqIE1hdGNoIGEgcGF0dGVybiBhcyBpbiBzaCgxKS4KLSAqIHBhdHRlcm4gY2hhcmFjdGVyIGFyZSBwcmVmaXhlZCB3aXRoIE1BR0lDIGJ5IGV4cGFuZC4KLSAqLwotCi1pbnQKLWdtYXRjaHgoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCwgYm9vbCBpc2ZpbGUpCi17Ci0JY29uc3QgY2hhciAqc2UsICpwZTsKLQotCWlmIChzID09IE5VTEwgfHwgcCA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwotCi0Jc2UgPSBzICsgc3RybGVuKHMpOwotCXBlID0gcCArIHN0cmxlbihwKTsKLQkvKiBpc2ZpbGUgaXMgZmFsc2UgaWZmIG5vIHN5bnRheCBjaGVjayBoYXMgYmVlbiBkb25lIG9uCi0JICogdGhlIHBhdHRlcm4uIElmIGNoZWNrIGZhaWxzLCBqdXN0IHRvIGEgc3RyY21wKCkuCi0JICovCi0JaWYgKCFpc2ZpbGUgJiYgIWhhc19nbG9iYmluZyhwLCBwZSkpIHsKLQkJc2l6ZV90IGxlbiA9IHBlIC0gcCArIDE7Ci0JCWNoYXIgdGJ1Zls2NF07Ci0JCWNoYXIgKnQgPSBsZW4gPD0gc2l6ZW9mKHRidWYpID8gdGJ1ZiA6IGFsbG9jKGxlbiwgQVRFTVApOwotCQlkZWJ1bmsodCwgcCwgbGVuKTsKLQkJcmV0dXJuICghc3RyY21wKHQsIHMpKTsKLQl9Ci0JcmV0dXJuIChkb19nbWF0Y2goKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc2UsCi0JICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHAsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBlKSk7Ci19Ci0KLS8qIFJldHVybnMgaWYgcCBpcyBhIHN5bnRhY3RpY2x5IGNvcnJlY3QgZ2xvYmJpbmcgcGF0dGVybiwgZmFsc2UKLSAqIGlmIGl0IGNvbnRhaW5zIG5vIHBhdHRlcm4gY2hhcmFjdGVycyBvciBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvci4KLSAqIFN5bnRheCBlcnJvcnMgYXJlOgotICoJLSBbIHdpdGggbm8gY2xvc2luZyBdCi0gKgktIGltYmFsYW5jZWQgJCguLi4pIGV4cHJlc3Npb24KLSAqCS0gWy4uLl0gYW5kICooLi4uKSBub3QgbmVzdGVkIChlZywgW2EkKGJ8XWMpLCAqKGFbYnxjXWQpKQotICovCi0vKlhYWAotLSBpZiBubyBtYWdpYywKLQlpZiBkZXN0IGdpdmVuLCBjb3B5IHRvIGRzdAotCXJldHVybiA/Ci0tIGlmIG1hZ2ljICYmIChubyBnbG9iYmluZyB8fCBzeW50YXggZXJyb3IpCi0JZGVidW5rIHRvIGRzdAotCXJldHVybiA/Ci0tIHJldHVybiA/Ci0qLwotaW50Ci1oYXNfZ2xvYmJpbmcoY29uc3QgY2hhciAqeHAsIGNvbnN0IGNoYXIgKnhwZSkKLXsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgeHA7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcGUgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB4cGU7Ci0JaW50IGM7Ci0JaW50IG5lc3QgPSAwLCBibmVzdCA9IDA7Ci0JaW50IHNhd19nbG9iID0gMDsKLQlpbnQgaW5fYnJhY2tldCA9IDA7IC8qIGluc2lkZSBbLi4uXSAqLwotCi0JZm9yICg7IHAgPCBwZTsgcCsrKSB7Ci0JCWlmICghSVNNQUdJQygqcCkpCi0JCQljb250aW51ZTsKLQkJaWYgKChjID0gKisrcCkgPT0gJyonIHx8IGMgPT0gJz8nKQotCQkJc2F3X2dsb2IgPSAxOwotCQllbHNlIGlmIChjID09ICdbJykgewotCQkJaWYgKCFpbl9icmFja2V0KSB7Ci0JCQkJc2F3X2dsb2IgPSAxOwotCQkJCWluX2JyYWNrZXQgPSAxOwotCQkJCWlmIChJU01BR0lDKHBbMV0pICYmIHBbMl0gPT0gTk9UKQotCQkJCQlwICs9IDI7Ci0JCQkJaWYgKElTTUFHSUMocFsxXSkgJiYgcFsyXSA9PSAnXScpCi0JCQkJCXAgKz0gMjsKLQkJCX0KLQkJCS8qIFhYWCBEbyB3ZSBuZWVkIHRvIGNoZWNrIHJhbmdlcyBoZXJlPyBQT1NJWCBRICovCi0JCX0gZWxzZSBpZiAoYyA9PSAnXScpIHsKLQkJCWlmIChpbl9icmFja2V0KSB7Ci0JCQkJaWYgKGJuZXN0KQkJLyogW2EqKGJdKSAqLwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWluX2JyYWNrZXQgPSAwOwotCQkJfQotCQl9IGVsc2UgaWYgKChjICYgMHg4MCkgJiYgdnN0cmNocigiKis/QCEgIiwgYyAmIDB4N2YpKSB7Ci0JCQlzYXdfZ2xvYiA9IDE7Ci0JCQlpZiAoaW5fYnJhY2tldCkKLQkJCQlibmVzdCsrOwotCQkJZWxzZQotCQkJCW5lc3QrKzsKLQkJfSBlbHNlIGlmIChjID09ICd8JykgewotCQkJaWYgKGluX2JyYWNrZXQgJiYgIWJuZXN0KQkvKiAqKGFbZm9vfGJhcl0pICovCi0JCQkJcmV0dXJuICgwKTsKLQkJfSBlbHNlIGlmIChjID09IC8qKCovICcpJykgewotCQkJaWYgKGluX2JyYWNrZXQpIHsKLQkJCQlpZiAoIWJuZXN0LS0pCQkvKiAqKGFbYiljXSAqLwotCQkJCQlyZXR1cm4gKDApOwotCQkJfSBlbHNlIGlmIChuZXN0KQotCQkJCW5lc3QtLTsKLQkJfQotCQkvKgotCQkgKiBlbHNlIG11c3QgYmUgYSBNQUdJQy1NQUdJQywgb3IgTUFHSUMtISwKLQkJICogTUFHSUMtLSwgTUFHSUMtXSwgTUFHSUMteywgTUFHSUMtLCBNQUdJQy19Ci0JCSAqLwotCX0KLQlyZXR1cm4gKHNhd19nbG9iICYmICFpbl9icmFja2V0ICYmICFuZXN0KTsKLX0KLQotLyogRnVuY3Rpb24gbXVzdCByZXR1cm4gZWl0aGVyIDAgb3IgMSAoYXNzdW1lZCBieSBjb2RlIGZvciAweDgwfCchJykgKi8KLXN0YXRpYyBpbnQKLWRvX2dtYXRjaChjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZSkKLXsKLQlpbnQgc2MsIHBjOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZXN0LCAqcHN1YiwgKnBuZXh0OwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyZXN0OwotCi0JaWYgKHMgPT0gTlVMTCB8fCBwID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0Jd2hpbGUgKHAgPCBwZSkgewotCQlwYyA9ICpwKys7Ci0JCXNjID0gcyA8IHNlID8gKnMgOiAnXDAnOwotCQlzKys7Ci0JCWlmICghSVNNQUdJQyhwYykpIHsKLQkJCWlmIChzYyAhPSBwYykKLQkJCQlyZXR1cm4gKDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJc3dpdGNoICgqcCsrKSB7Ci0JCWNhc2UgJ1snOgotCQkJaWYgKHNjID09IDAgfHwgKHAgPSBjY2xhc3MocCwgc2MpKSA9PSBOVUxMKQotCQkJCXJldHVybiAoMCk7Ci0JCQlicmVhazsKLQotCQljYXNlICc/JzoKLQkJCWlmIChzYyA9PSAwKQotCQkJCXJldHVybiAoMCk7Ci0JCQlpZiAoVVRGTU9ERSkgewotCQkJCS0tczsKLQkJCQlzICs9IHV0Zl9wdHJhZGooKGNvbnN0IHZvaWQgKilzKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJyonOgotCQkJaWYgKHAgPT0gcGUpCi0JCQkJcmV0dXJuICgxKTsKLQkJCXMtLTsKLQkJCWRvIHsKLQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNlLCBwLCBwZSkpCi0JCQkJCXJldHVybiAoMSk7Ci0JCQl9IHdoaWxlIChzKysgPCBzZSk7Ci0JCQlyZXR1cm4gKDApOwotCi0JCS8qKgotCQkgKiBbKis/QCFdKHBhdHRlcm58cGF0dGVybnwuLikKLQkJICogVGhpcyBpcyBhbHNvIG5lZWRlZCBmb3IgJHsuLiUuLn0sIGV0Yy4KLQkJICovCi0JCWNhc2UgMHg4MHwnKyc6IC8qIG1hdGNoZXMgb25lIG9yIG1vcmUgdGltZXMgKi8KLQkJY2FzZSAweDgwfCcqJzogLyogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgdGltZXMgKi8KLQkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKLQkJCQlyZXR1cm4gKDApOwotCQkJcy0tOwotCQkJLyogdGFrZSBjYXJlIG9mIHplcm8gbWF0Y2hlcyAqLwotCQkJaWYgKHBbLTFdID09ICgweDgwIHwgJyonKSAmJgotCQkJICAgIGRvX2dtYXRjaChzLCBzZSwgcHJlc3QsIHBlKSkKLQkJCQlyZXR1cm4gKDEpOwotCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKLQkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKLQkJCQlmb3IgKHNyZXN0ID0gczsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKLQkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwgcG5leHQgLSAyKSAmJgotCQkJCQkgICAgKGRvX2dtYXRjaChzcmVzdCwgc2UsIHByZXN0LCBwZSkgfHwKLQkJCQkJICAgIChzICE9IHNyZXN0ICYmIGRvX2dtYXRjaChzcmVzdCwKLQkJCQkJICAgIHNlLCBwIC0gMiwgcGUpKSkpCi0JCQkJCQlyZXR1cm4gKDEpOwotCQkJCX0KLQkJCQlpZiAocG5leHQgPT0gcHJlc3QpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuICgwKTsKLQotCQljYXNlIDB4ODB8Jz8nOiAvKiBtYXRjaGVzIHplcm8gb3Igb25jZSAqLwotCQljYXNlIDB4ODB8J0AnOiAvKiBtYXRjaGVzIG9uZSBvZiB0aGUgcGF0dGVybnMgKi8KLQkJY2FzZSAweDgwfCcgJzogLyogc2ltaWxlIGZvciBAICovCi0JCQlpZiAoIShwcmVzdCA9IHBhdF9zY2FuKHAsIHBlLCAwKSkpCi0JCQkJcmV0dXJuICgwKTsKLQkJCXMtLTsKLQkJCS8qIFRha2UgY2FyZSBvZiB6ZXJvIG1hdGNoZXMgKi8KLQkJCWlmIChwWy0xXSA9PSAoMHg4MCB8ICc/JykgJiYKLQkJCSAgICBkb19nbWF0Y2gocywgc2UsIHByZXN0LCBwZSkpCi0JCQkJcmV0dXJuICgxKTsKLQkJCWZvciAocHN1YiA9IHA7IDsgcHN1YiA9IHBuZXh0KSB7Ci0JCQkJcG5leHQgPSBwYXRfc2Nhbihwc3ViLCBwZSwgMSk7Ci0JCQkJc3Jlc3QgPSBwcmVzdCA9PSBwZSA/IHNlIDogczsKLQkJCQlmb3IgKDsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKLQkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwgcG5leHQgLSAyKSAmJgotCQkJCQkgICAgZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSkKLQkJCQkJCXJldHVybiAoMSk7Ci0JCQkJfQotCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gKDApOwotCi0JCWNhc2UgMHg4MHwnISc6IC8qIG1hdGNoZXMgbm9uZSBvZiB0aGUgcGF0dGVybnMgKi8KLQkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKLQkJCQlyZXR1cm4gKDApOwotCQkJcy0tOwotCQkJZm9yIChzcmVzdCA9IHM7IHNyZXN0IDw9IHNlOyBzcmVzdCsrKSB7Ci0JCQkJaW50IG1hdGNoZWQgPSAwOwotCi0JCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKLQkJCQkJcG5leHQgPSBwYXRfc2Nhbihwc3ViLCBwZSwgMSk7Ci0JCQkJCWlmIChkb19nbWF0Y2gocywgc3Jlc3QsIHBzdWIsCi0JCQkJCSAgICBwbmV4dCAtIDIpKSB7Ci0JCQkJCQltYXRjaGVkID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoIW1hdGNoZWQgJiYKLQkJCQkgICAgZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSkKLQkJCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCXJldHVybiAoMCk7Ci0KLQkJZGVmYXVsdDoKLQkJCWlmIChzYyAhPSBwWy0xXSkKLQkJCQlyZXR1cm4gKDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIChzID09IHNlKTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKgotY2NsYXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBzdWIpCi17Ci0JaW50IGMsIGQsIG5vdHAsIGZvdW5kID0gMDsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpvcmlnX3AgPSBwOwotCi0JaWYgKChub3RwID0gKElTTUFHSUMoKnApICYmICorK3AgPT0gTk9UKSkpCi0JCXArKzsKLQlkbyB7Ci0JCWMgPSAqcCsrOwotCQlpZiAoSVNNQUdJQyhjKSkgewotCQkJYyA9ICpwKys7Ci0JCQlpZiAoKGMgJiAweDgwKSAmJiAhSVNNQUdJQyhjKSkgewotCQkJCWMgJj0gMHg3ZjsvKiBleHRlbmRlZCBwYXR0ZXJuIG1hdGNoaW5nOiAqKz9AISAqLwotCQkJCS8qIFhYWCB0aGUgKCBjaGFyIGlzbid0IGhhbmRsZWQgYXMgcGFydCBvZiBbXSAqLwotCQkJCWlmIChjID09ICcgJykgLyogc2ltaWxlIGZvciBAOiBwbGFpbiAoLi4pICovCi0JCQkJCWMgPSAnKCcgLyopKi87Ci0JCQl9Ci0JCX0KLQkJaWYgKGMgPT0gJ1wwJykKLQkJCS8qIE5vIGNsb3NpbmcgXSAtIGFjdCBhcyBpZiB0aGUgb3BlbmluZyBbIHdhcyBxdW90ZWQgKi8KLQkJCXJldHVybiAoc3ViID09ICdbJyA/IG9yaWdfcCA6IE5VTEwpOwotCQlpZiAoSVNNQUdJQyhwWzBdKSAmJiBwWzFdID09ICctJyAmJgotCQkgICAgKCFJU01BR0lDKHBbMl0pIHx8IHBbM10gIT0gJ10nKSkgewotCQkJcCArPSAyOyAvKiBNQUdJQy0gKi8KLQkJCWQgPSAqcCsrOwotCQkJaWYgKElTTUFHSUMoZCkpIHsKLQkJCQlkID0gKnArKzsKLQkJCQlpZiAoKGQgJiAweDgwKSAmJiAhSVNNQUdJQyhkKSkKLQkJCQkJZCAmPSAweDdmOwotCQkJfQotCQkJLyogUE9TSVggc2F5cyB0aGlzIGlzIGFuIGludmFsaWQgZXhwcmVzc2lvbiAqLwotCQkJaWYgKGMgPiBkKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCX0gZWxzZQotCQkJZCA9IGM7Ci0JCWlmIChjID09IHN1YiB8fCAoYyA8PSBzdWIgJiYgc3ViIDw9IGQpKQotCQkJZm91bmQgPSAxOwotCX0gd2hpbGUgKCEoSVNNQUdJQyhwWzBdKSAmJiBwWzFdID09ICddJykpOwotCi0JcmV0dXJuICgoZm91bmQgIT0gbm90cCkgPyBwKzIgOiBOVUxMKTsKLX0KLQotLyogTG9vayBmb3IgbmV4dCApIG9yIHwgKGlmIG1hdGNoX3NlcCkgaW4gKihmb298YmFyKSBwYXR0ZXJuICovCi1jb25zdCB1bnNpZ25lZCBjaGFyICoKLXBhdF9zY2FuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlLCBpbnQgbWF0Y2hfc2VwKQotewotCWludCBuZXN0ID0gMDsKLQotCWZvciAoOyBwIDwgcGU7IHArKykgewotCQlpZiAoIUlTTUFHSUMoKnApKQotCQkJY29udGludWU7Ci0JCWlmICgoKisrcCA9PSAvKigqLyAnKScgJiYgbmVzdC0tID09IDApIHx8Ci0JCSAgICAoKnAgPT0gJ3wnICYmIG1hdGNoX3NlcCAmJiBuZXN0ID09IDApKQotCQkJcmV0dXJuIChwICsgMSk7Ci0JCWlmICgoKnAgJiAweDgwKSAmJiB2c3RyY2hyKCIqKz9AISAiLCAqcCAmIDB4N2YpKQotCQkJbmVzdCsrOwotCX0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi1pbnQKLXhzdHJjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotCXJldHVybiAoc3RyY21wKCooY29uc3QgY2hhciAqIGNvbnN0ICopcDEsICooY29uc3QgY2hhciAqIGNvbnN0ICopcDIpKTsKLX0KLQotLyogSW5pdGlhbGlzZSBhIEdldG9wdCBzdHJ1Y3R1cmUgKi8KLXZvaWQKLWtzaF9nZXRvcHRfcmVzZXQoR2V0b3B0ICpnbywgaW50IGZsYWdzKQotewotCWdvLT5vcHRpbmQgPSAxOwotCWdvLT5vcHRhcmcgPSBOVUxMOwotCWdvLT5wID0gMDsKLQlnby0+ZmxhZ3MgPSBmbGFnczsKLQlnby0+aW5mbyA9IDA7Ci0JZ28tPmJ1ZlsxXSA9ICdcMCc7Ci19Ci0KLQotLyogZ2V0b3B0KCkgdXNlZCBmb3Igc2hlbGwgYnVpbHQtaW4gY29tbWFuZHMsIHRoZSBnZXRvcHRzIGNvbW1hbmQsIGFuZAotICogY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gKiBBIGxlYWRpbmcgJzonIGluIG9wdGlvbnMgbWVhbnMgZG9uJ3QgcHJpbnQgZXJyb3JzLCBpbnN0ZWFkIHJldHVybiAnPycKLSAqIG9yICc6JyBhbmQgc2V0IGdvLT5vcHRhcmcgdG8gdGhlIG9mZmVuZGluZyBvcHRpb24gY2hhcmFjdGVyLgotICogSWYgR0ZfRVJST1IgaXMgc2V0IChhbmQgb3B0aW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCA6KSwgZXJyb3JzIHJlc3VsdCBpbgotICogYSBjYWxsIHRvIGJpX2Vycm9yZigpLgotICoKLSAqIE5vbi1zdGFuZGFyZCBmZWF0dXJlczoKLSAqCS0gJzsnIGlzIGxpa2UgJzonIGluIG9wdGlvbnMsIGV4Y2VwdCB0aGUgYXJndW1lbnQgaXMgb3B0aW9uYWwKLSAqCSAgKGlmIGl0IGlzbid0IHByZXNlbnQsIG9wdGFyZyBpcyBzZXQgdG8gMCkuCi0gKgkgIFVzZWQgZm9yICdzZXQgLW8nLgotICoJLSAnLCcgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhjZXB0IHRoZSBhcmd1bWVudCBhbHdheXMgaW1tZWRpYXRlbHkKLSAqCSAgZm9sbG93cyB0aGUgb3B0aW9uIGNoYXJhY3RlciAob3B0YXJnIGlzIHNldCB0byB0aGUgbnVsbCBzdHJpbmcgaWYKLSAqCSAgdGhlIG9wdGlvbiBpcyBtaXNzaW5nKS4KLSAqCSAgVXNlZCBmb3IgJ3JlYWQgLXUyJywgJ3ByaW50IC11MicgYW5kIGZjIC00MC4KLSAqCS0gJyMnIGlzIGxpa2UgJzonIGluIG9wdGlvbnMsIGV4cGVjdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBvcHRpb25hbAotICoJICBhbmQgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQuIElmIHRoZSBhcmd1bWVudCBkb2Vzbid0IHN0YXJ0IHdpdGggYQotICoJICBkaWdpdCwgaXQgaXMgYXNzdW1lZCB0byBiZSBtaXNzaW5nIGFuZCBub3JtYWwgb3B0aW9uIHByb2Nlc3NpbmcKLSAqCSAgY29udGludWVzIChvcHRhcmcgaXMgc2V0IHRvIDAgaWYgdGhlIG9wdGlvbiBpcyBtaXNzaW5nKS4KLSAqCSAgVXNlZCBmb3IgJ3R5cGVzZXQgLUxaNCcuCi0gKgktIGFjY2VwdHMgK2MgYXMgd2VsbCBhcyAtYyBJRiB0aGUgR0ZfUExVU09QVCBmbGFnIGlzIHByZXNlbnQuIElmIGFuCi0gKgkgIG9wdGlvbiBzdGFydGluZyB3aXRoICsgaXMgYWNjZXB0ZWQsIHRoZSBHSV9QTFVTIGZsYWcgd2lsbCBiZSBzZXQKLSAqCSAgaW4gZ28tPmluZm8uCi0gKi8KLWludAota3NoX2dldG9wdChjb25zdCBjaGFyICoqYXJndiwgR2V0b3B0ICpnbywgY29uc3QgY2hhciAqb3B0aW9uc3ApCi17Ci0JY2hhciBjOwotCWNvbnN0IGNoYXIgKm87Ci0KLQlpZiAoZ28tPnAgPT0gMCB8fCAoYyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkgPT0gJ1wwJykgewotCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2dvLT5vcHRpbmRdLCBmbGFnID0gYXJnID8gKmFyZyA6ICdcMCc7Ci0KLQkJZ28tPnAgPSAxOwotCQlpZiAoZmxhZyA9PSAnLScgJiYgYXJnWzFdID09ICctJyAmJiBhcmdbMl0gPT0gJ1wwJykgewotCQkJZ28tPm9wdGluZCsrOwotCQkJZ28tPnAgPSAwOwotCQkJZ28tPmluZm8gfD0gR0lfTUlOVVNNSU5VUzsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCWlmIChhcmcgPT0gTlVMTCB8fAotCQkgICAgKChmbGFnICE9ICctJyApICYmIC8qIG5laXRoZXIgYSAtIG5vciBhICsgKGlmICsgYWxsb3dlZCkgKi8KLQkJICAgICghKGdvLT5mbGFncyAmIEdGX1BMVVNPUFQpIHx8IGZsYWcgIT0gJysnKSkgfHwKLQkJICAgIChjID0gYXJnWzFdKSA9PSAnXDAnKSB7Ci0JCQlnby0+cCA9IDA7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlnby0+b3B0aW5kKys7Ci0JCWdvLT5pbmZvICY9IH4oR0lfTUlOVVN8R0lfUExVUyk7Ci0JCWdvLT5pbmZvIHw9IGZsYWcgPT0gJy0nID8gR0lfTUlOVVMgOiBHSV9QTFVTOwotCX0KLQlnby0+cCsrOwotCWlmIChjID09ICc/JyB8fCBjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICcsJyB8fCBjID09ICcjJyB8fAotCSAgICAhKG8gPSBjc3RyY2hyKG9wdGlvbnNwLCBjKSkpIHsKLQkJaWYgKG9wdGlvbnNwWzBdID09ICc6JykgewotCQkJZ28tPmJ1ZlswXSA9IGM7Ci0JCQlnby0+b3B0YXJnID0gZ28tPmJ1ZjsKLQkJfSBlbHNlIHsKLQkJCXdhcm5pbmdmKHRydWUsICIlcyVzLSVjOiB1bmtub3duIG9wdGlvbiIsCi0JCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6IGFyZ3ZbMF0sCi0JCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6ICI6ICIsIGMpOwotCQkJaWYgKGdvLT5mbGFncyAmIEdGX0VSUk9SKQotCQkJCWJpX2Vycm9yZnooKTsKLQkJfQotCQlyZXR1cm4gKCc/Jyk7Ci0JfQotCS8qIDogbWVhbnMgYXJndW1lbnQgbXVzdCBiZSBwcmVzZW50LCBtYXkgYmUgcGFydCBvZiBvcHRpb24gYXJndW1lbnQKLQkgKiAgIG9yIHRoZSBuZXh0IGFyZ3VtZW50Ci0JICogOyBzYW1lIGFzIDogYnV0IGFyZ3VtZW50IG1heSBiZSBtaXNzaW5nCi0JICogLCBtZWFucyBhcmd1bWVudCBpcyBwYXJ0IG9mIG9wdGlvbiBhcmd1bWVudCwgYW5kIG1heSBiZSBudWxsLgotCSAqLwotCWlmICgqKytvID09ICc6JyB8fCAqbyA9PSAnOycpIHsKLQkJaWYgKGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkKLQkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXSArIGdvLT5wOwotCQllbHNlIGlmIChhcmd2W2dvLT5vcHRpbmRdKQotCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCsrXTsKLQkJZWxzZSBpZiAoKm8gPT0gJzsnKQotCQkJZ28tPm9wdGFyZyA9IE5VTEw7Ci0JCWVsc2UgewotCQkJaWYgKG9wdGlvbnNwWzBdID09ICc6JykgewotCQkJCWdvLT5idWZbMF0gPSBjOwotCQkJCWdvLT5vcHRhcmcgPSBnby0+YnVmOwotCQkJCXJldHVybiAoJzonKTsKLQkJCX0KLQkJCXdhcm5pbmdmKHRydWUsICIlcyVzLSclYycgcmVxdWlyZXMgYXJndW1lbnQiLAotCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiBhcmd2WzBdLAotCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiAiOiAiLCBjKTsKLQkJCWlmIChnby0+ZmxhZ3MgJiBHRl9FUlJPUikKLQkJCQliaV9lcnJvcmZ6KCk7Ci0JCQlyZXR1cm4gKCc/Jyk7Ci0JCX0KLQkJZ28tPnAgPSAwOwotCX0gZWxzZSBpZiAoKm8gPT0gJywnKSB7Ci0JCS8qIGFyZ3VtZW50IGlzIGF0dGFjaGVkIHRvIG9wdGlvbiBjaGFyYWN0ZXIsIGV2ZW4gaWYgbnVsbCAqLwotCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kIC0gMV0gKyBnby0+cDsKLQkJZ28tPnAgPSAwOwotCX0gZWxzZSBpZiAoKm8gPT0gJyMnKSB7Ci0JCS8qIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBtYXkgYmUgYXR0YWNoZWQgb3IgdW5hdHRhY2hlZAotCQkgKiBidXQgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQuIG9wdGFyZyBpcyBzZXQgdG8gMCBpZiB0aGUKLQkJICogYXJndW1lbnQgaXMgbWlzc2luZy4KLQkJICovCi0JCWlmIChhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pIHsKLQkJCWlmIChrc2hfaXNkaWdpdChhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pKSB7Ci0JCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdICsgZ28tPnA7Ci0JCQkJZ28tPnAgPSAwOwotCQkJfSBlbHNlCi0JCQkJZ28tPm9wdGFyZyA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYXJndltnby0+b3B0aW5kXSAmJiBrc2hfaXNkaWdpdChhcmd2W2dvLT5vcHRpbmRdWzBdKSkgewotCQkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQrK107Ci0JCQkJZ28tPnAgPSAwOwotCQkJfSBlbHNlCi0JCQkJZ28tPm9wdGFyZyA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIChjKTsKLX0KLQotLyogcHJpbnQgdmFyaWFibGUvYWxpYXMgdmFsdWUgdXNpbmcgbmVjZXNzYXJ5IHF1b3RlcwotICogKFBPU0lYIHNheXMgdGhleSBzaG91bGQgYmUgc3VpdGFibGUgZm9yIHJlLWVudHJ5Li4uKQotICogTm8gdHJhaWxpbmcgbmV3bGluZSBpcyBwcmludGVkLgotICovCi12b2lkCi1wcmludF92YWx1ZV9xdW90ZWQoY29uc3QgY2hhciAqcykKLXsKLQljb25zdCBjaGFyICpwOwotCWludCBpbnF1b3RlID0gMDsKLQotCS8qIFRlc3QgaWYgYW55IHF1b3RlcyBhcmUgbmVlZGVkICovCi0JZm9yIChwID0gczsgKnA7IHArKykKLQkJaWYgKGN0eXBlKCpwLCBDX1FVT1RFKSkKLQkJCWJyZWFrOwotCWlmICghKnApIHsKLQkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChwID0gczsgKnA7IHArKykgewotCQlpZiAoKnAgPT0gJ1wnJykgewotCQkJaWYgKGlucXVvdGUpCi0JCQkJc2hmX3B1dGMoJ1wnJywgc2hsX3N0ZG91dCk7Ci0JCQlzaGZfcHV0YygnXFwnLCBzaGxfc3Rkb3V0KTsKLQkJCWlucXVvdGUgPSAwOwotCQl9IGVsc2UgaWYgKCFpbnF1b3RlKSB7Ci0JCQlzaGZfcHV0YygnXCcnLCBzaGxfc3Rkb3V0KTsKLQkJCWlucXVvdGUgPSAxOwotCQl9Ci0JCXNoZl9wdXRjKCpwLCBzaGxfc3Rkb3V0KTsKLQl9Ci0JaWYgKGlucXVvdGUpCi0JCXNoZl9wdXRjKCdcJycsIHNobF9zdGRvdXQpOwotfQotCi0vKgotICogUHJpbnQgdGhpbmdzIGluIGNvbHVtbnMgYW5kIHJvd3MgLSBmdW5jKCkgaXMgY2FsbGVkIHRvIGZvcm1hdAotICogdGhlIGktdGggZWxlbWVudAotICovCi12b2lkCi1wcmludF9jb2x1bW5zKHN0cnVjdCBzaGYgKnNoZiwgaW50IG4sCi0gICAgY2hhciAqKCpmdW5jKShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopLAotICAgIGNvbnN0IHZvaWQgKmFyZywgaW50IG1heF9vY3QsIGludCBtYXhfY29sLCBib29sIHByZWZjb2wpCi17Ci0JaW50IGksIHIsIGMsIHJvd3MsIGNvbHMsIG5zcGFjZTsKLQljaGFyICpzdHI7Ci0KLQlpZiAobiA8PSAwKSB7Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJaW50ZXJuYWxfd2FybmluZ2YoInByaW50X2NvbHVtbnMgY2FsbGVkIHdpdGggbj0lZCA8PSAwIiwgbik7Ci0jZW5kaWYKLQkJcmV0dXJuOwotCX0KLQotCSsrbWF4X29jdDsKLQlzdHIgPSBhbGxvYyhtYXhfb2N0LCBBVEVNUCk7Ci0KLQkvKiBlbnN1cmUgeF9jb2xzIGlzIHZhbGlkIGZpcnN0ICovCi0JaWYgKHhfY29scyA8IE1JTl9DT0xTKQotCQljaGFuZ2Vfd2luc3ooKTsKLQotCS8qCi0JICogV2UgdXNlIChtYXhfY29sICsgMSkgdG8gY29uc2lkZXIgdGhlIHNwYWNlIHNlcGFyYXRvci4KLQkgKiBOb3RlIHRoYXQgbm8gc3BhY2UgaXMgcHJpbnRlZCBhZnRlciB0aGUgbGFzdCBjb2x1bW4KLQkgKiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHRlcm1pbmFscyB0aGF0IGhhdmUgYXV0by13cmFwLgotCSAqLwotCWNvbHMgPSB4X2NvbHMgLyAobWF4X2NvbCArIDEpOwotCi0JLyogaWYgd2UgY2FuIG9ubHkgcHJpbnQgb25lIGNvbHVtbiBhbnl3YXksIHNraXAgdGhlIGdvbyAqLwotCWlmIChjb2xzIDwgMikgewotCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMgXG4iLAotCQkJICAgICgqZnVuYykoc3RyLCBtYXhfb2N0LCBpLCBhcmcpKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jcm93cyA9IChuICsgY29scyAtIDEpIC8gY29sczsKLQlpZiAocHJlZmNvbCAmJiBjb2xzID4gcm93cykgewotCQlpID0gcm93czsKLQkJcm93cyA9IGNvbHMgPiBuID8gbiA6IGNvbHM7Ci0JCWNvbHMgPSBpOwotCX0KLQotCW1heF9jb2wgPSAtbWF4X2NvbDsKLQluc3BhY2UgPSAoeF9jb2xzICsgbWF4X2NvbCAqIGNvbHMpIC8gY29sczsKLQlpZiAobnNwYWNlIDw9IDApCi0JCW5zcGFjZSA9IDE7Ci0JZm9yIChyID0gMDsgciA8IHJvd3M7IHIrKykgewotCQlmb3IgKGMgPSAwOyBjIDwgY29sczsgYysrKSB7Ci0JCQlpID0gYyAqIHJvd3MgKyByOwotCQkJaWYgKGkgPCBuKSB7Ci0JCQkJc2hmX2ZwcmludGYoc2hmLCAiJSpzIiwgbWF4X2NvbCwKLQkJCQkgICAgKCpmdW5jKShzdHIsIG1heF9vY3QsIGksIGFyZykpOwotCQkJCWlmIChjICsgMSA8IGNvbHMpCi0JCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiUqcyIsIG5zcGFjZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc2hmX3B1dGNoYXIoJ1xuJywgc2hmKTsKLQl9Ci0gb3V0OgotCWFmcmVlKHN0ciwgQVRFTVApOwotfQotCi0vKiBTdHJpcCBhbnkgbnVsIGJ5dGVzIGZyb20gYnVmIC0gcmV0dXJucyBuZXcgbGVuZ3RoIChuYnl0ZXMgLSAjIG9mIG51bHMpICovCi12b2lkCi1zdHJpcF9udWxzKGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKLXsKLQljaGFyICpkc3Q7Ci0KLQkvKiBuYnl0ZXMgY2hlY2sgYmVjYXVzZSBzb21lIHN5c3RlbXMgKG9sZGVyIEZyZWVCU0RzKSBoYXZlIGEgYnVnZ3kKLQkgKiBtZW1jaHIoKQotCSAqLwotCWlmIChuYnl0ZXMgJiYgKGRzdCA9IG1lbWNocihidWYsICdcMCcsIG5ieXRlcykpKSB7Ci0JCWNoYXIgKmVuZCA9IGJ1ZiArIG5ieXRlczsKLQkJY2hhciAqcCwgKnE7Ci0KLQkJZm9yIChwID0gZHN0OyBwIDwgZW5kOyBwID0gcSkgewotCQkJLyogc2tpcCBhIGJsb2NrIG9mIG51bGxzICovCi0JCQl3aGlsZSAoKytwIDwgZW5kICYmICpwID09ICdcMCcpCi0JCQkJOwotCQkJLyogZmluZCBlbmQgb2Ygbm9uLW51bGwgYmxvY2sgKi8KLQkJCWlmICghKHEgPSBtZW1jaHIocCwgJ1wwJywgZW5kIC0gcCkpKQotCQkJCXEgPSBlbmQ7Ci0JCQltZW1tb3ZlKGRzdCwgcCwgcSAtIHApOwotCQkJZHN0ICs9IHEgLSBwOwotCQl9Ci0JCSpkc3QgPSAnXDAnOwotCX0KLX0KLQotLyogTGlrZSByZWFkKDIpLCBidXQgaWYgcmVhZCBmYWlscyBkdWUgdG8gbm9uLWJsb2NraW5nIGZsYWcsIHJlc2V0cyBmbGFnCi0gKiBhbmQgcmVzdGFydHMgcmVhZC4KLSAqLwotaW50Ci1ibG9ja2luZ19yZWFkKGludCBmZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotCWludCByZXQ7Ci0JaW50IHRyaWVkX3Jlc2V0ID0gMDsKLQotCXdoaWxlICgocmV0ID0gcmVhZChmZCwgYnVmLCBuYnl0ZXMpKSA8IDApIHsKLQkJaWYgKCF0cmllZF9yZXNldCAmJiBlcnJubyA9PSBFQUdBSU4pIHsKLQkJCWlmIChyZXNldF9ub25ibG9jayhmZCkgPiAwKSB7Ci0JCQkJdHJpZWRfcmVzZXQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZXJybm8gPSBFQUdBSU47Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybiAocmV0KTsKLX0KLQotLyogUmVzZXQgdGhlIG5vbi1ibG9ja2luZyBmbGFnIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgotICogUmV0dXJucyAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIDAgaWYgbm9uLWJsb2NraW5nIHdhc24ndCBzZXQsCi0gKiAxIGlmIGl0IHdhcy4KLSAqLwotaW50Ci1yZXNldF9ub25ibG9jayhpbnQgZmQpCi17Ci0JaW50IGZsYWdzOwotCi0JaWYgKChmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKSkgPCAwKQotCQlyZXR1cm4gKC0xKTsKLQlpZiAoIShmbGFncyAmIE9fTk9OQkxPQ0spKQotCQlyZXR1cm4gKDApOwotCWZsYWdzICY9IH5PX05PTkJMT0NLOwotCWlmIChmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MpIDwgMCkKLQkJcmV0dXJuICgtMSk7Ci0JcmV0dXJuICgxKTsKLX0KLQotCi0vKiBMaWtlIGdldGN3ZCgpLCBleGNlcHQgYnNpemUgaXMgaWdub3JlZCBpZiBidWYgaXMgMCAoUEFUSF9NQVggaXMgdXNlZCkgKi8KLWNoYXIgKgota3NoX2dldF93ZChzaXplX3QgKmRsZW4pCi17Ci0JY2hhciAqcmV0LCAqYjsKLQlzaXplX3QgbGVuID0gMTsKLQotI2lmZGVmIE5PX1BBVEhfTUFYCi0JaWYgKChiID0gZ2V0X2N1cnJlbnRfZGlyX25hbWUoKSkpIHsKLQkJbGVuID0gc3RybGVuKGIpICsgMTsKLQkJc3RybmR1cHgocmV0LCBiLCBsZW4gLSAxLCBBVEVNUCk7Ci0JCWZyZWUoYik7Ci0JfSBlbHNlCi0JCXJldCA9IE5VTEw7Ci0jZWxzZQotCWlmICgocmV0ID0gZ2V0Y3dkKChiID0gYWxsb2MoUEFUSF9NQVggKyAxLCBBVEVNUCkpLCBQQVRIX01BWCkpKQotCQlyZXQgPSBhcmVzaXplKGIsIGxlbiA9IChzdHJsZW4oYikgKyAxKSwgQVRFTVApOwotCWVsc2UKLQkJYWZyZWUoYiwgQVRFTVApOwotI2VuZGlmCi0KLQlpZiAoZGxlbikKLQkJKmRsZW4gPSBsZW47Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKgotICoJTWFrZXMgYSBmaWxlbmFtZSBpbnRvIHJlc3VsdCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobS4KLSAqCS0gbWFrZSByZXN1bHQgTlVMTAotICoJLSBpZiBmaWxlIHN0YXJ0cyB3aXRoICcvJywgYXBwZW5kIGZpbGUgdG8gcmVzdWx0ICYgc2V0IGNkcGF0aHAgdG8gTlVMTAotICoJLSBpZiBmaWxlIHN0YXJ0cyB3aXRoIC4vIG9yIC4uLyBhcHBlbmQgY3dkIGFuZCBmaWxlIHRvIHJlc3VsdAotICoJICBhbmQgc2V0IGNkcGF0aHAgdG8gTlVMTAotICoJLSBpZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBjZHBhdGhwIGRvZXNudCBzdGFydCB3aXRoIGEgJy8nIHh4IG9yICcuJyB4eAotICoJICB0aGVuIGN3ZCBpcyBhcHBlbmRlZCB0byByZXN1bHQuCi0gKgktIHRoZSBmaXJzdCBlbGVtZW50IG9mIGNkcGF0aHAgaXMgYXBwZW5kZWQgdG8gcmVzdWx0Ci0gKgktIGZpbGUgaXMgYXBwZW5kZWQgdG8gcmVzdWx0Ci0gKgktIGNkcGF0aHAgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVtZW50IGluIGNkcGF0aHAgKG9yIE5VTEwKLSAqCSAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMuCi0gKglUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbm9uLW51bGwgZWxlbWVudCBmcm9tIGNkcGF0aHAKLSAqCXdhcyBhcHBlbmRlZCB0byByZXN1bHQuCi0gKi8KLWludAotbWFrZV9wYXRoKGNvbnN0IGNoYXIgKmN3ZCwgY29uc3QgY2hhciAqZmlsZSwKLSAgICBjaGFyICoqY2RwYXRocCwJCS8qICYgb2YgOiBzZXBhcmF0ZWQgbGlzdCAqLwotICAgIFhTdHJpbmcgKnhzcCwKLSAgICBpbnQgKnBoeXNfcGF0aHApCi17Ci0JaW50IHJ2YWwgPSAwOwotCWJvb2wgdXNlX2NkcGF0aCA9IHRydWU7Ci0JY2hhciAqcGxpc3Q7Ci0JaW50IGxlbiwgcGxlbiA9IDA7Ci0JY2hhciAqeHAgPSBYc3RyaW5nKCp4c3AsIHhwKTsKLQotCWlmICghZmlsZSkKLQkJZmlsZSA9IG51bGw7Ci0KLQlpZiAoZmlsZVswXSA9PSAnLycpIHsKLQkJKnBoeXNfcGF0aHAgPSAwOwotCQl1c2VfY2RwYXRoID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJaWYgKGZpbGVbMF0gPT0gJy4nKSB7Ci0JCQljaGFyIGMgPSBmaWxlWzFdOwotCi0JCQlpZiAoYyA9PSAnLicpCi0JCQkJYyA9IGZpbGVbMl07Ci0JCQlpZiAoYyA9PSAnLycgfHwgYyA9PSAnXDAnKQotCQkJCXVzZV9jZHBhdGggPSBmYWxzZTsKLQkJfQotCi0JCXBsaXN0ID0gKmNkcGF0aHA7Ci0JCWlmICghcGxpc3QpCi0JCQl1c2VfY2RwYXRoID0gZmFsc2U7Ci0JCWVsc2UgaWYgKHVzZV9jZHBhdGgpIHsKLQkJCWNoYXIgKnBlbmQ7Ci0KLQkJCWZvciAocGVuZCA9IHBsaXN0OyAqcGVuZCAmJiAqcGVuZCAhPSAnOic7IHBlbmQrKykKLQkJCQk7Ci0JCQlwbGVuID0gcGVuZCAtIHBsaXN0OwotCQkJKmNkcGF0aHAgPSAqcGVuZCA/IHBlbmQgKyAxIDogTlVMTDsKLQkJfQotCi0JCWlmICgoIXVzZV9jZHBhdGggfHwgIXBsZW4gfHwgcGxpc3RbMF0gIT0gJy8nKSAmJgotCQkgICAgKGN3ZCAmJiAqY3dkKSkgewotCQkJbGVuID0gc3RybGVuKGN3ZCk7Ci0JCQlYY2hlY2tOKCp4c3AsIHhwLCBsZW4pOwotCQkJbWVtY3B5KHhwLCBjd2QsIGxlbik7Ci0JCQl4cCArPSBsZW47Ci0JCQlpZiAoY3dkW2xlbiAtIDFdICE9ICcvJykKLQkJCQlYcHV0KCp4c3AsIHhwLCAnLycpOwotCQl9Ci0JCSpwaHlzX3BhdGhwID0gWGxlbmd0aCgqeHNwLCB4cCk7Ci0JCWlmICh1c2VfY2RwYXRoICYmIHBsZW4pIHsKLQkJCVhjaGVja04oKnhzcCwgeHAsIHBsZW4pOwotCQkJbWVtY3B5KHhwLCBwbGlzdCwgcGxlbik7Ci0JCQl4cCArPSBwbGVuOwotCQkJaWYgKHBsaXN0W3BsZW4gLSAxXSAhPSAnLycpCi0JCQkJWHB1dCgqeHNwLCB4cCwgJy8nKTsKLQkJCXJ2YWwgPSAxOwotCQl9Ci0JfQotCi0JbGVuID0gc3RybGVuKGZpbGUpICsgMTsKLQlYY2hlY2tOKCp4c3AsIHhwLCBsZW4pOwotCW1lbWNweSh4cCwgZmlsZSwgbGVuKTsKLQotCWlmICghdXNlX2NkcGF0aCkKLQkJKmNkcGF0aHAgPSBOVUxMOwotCi0JcmV0dXJuIChydmFsKTsKLX0KLQotLyoKLSAqIFNpbXBsaWZ5IHBhdGhuYW1lcyBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzLgotICogaWUsIHNpbXBsaWZ5X3BhdGgoIi9hL2IvYy8uLy4uL2QvLi4iKSByZXR1cm5zICIvYS9iIgotICovCi12b2lkCi1zaW1wbGlmeV9wYXRoKGNoYXIgKnBhdGhsKQotewotCWNoYXIgKmN1ciwgKnQ7Ci0JYm9vbCBpc3Jvb3RlZDsKLQljaGFyICp2ZXJ5X3N0YXJ0ID0gcGF0aGwsICpzdGFydDsKLQotCWlmICghKnBhdGhsKQotCQlyZXR1cm47Ci0KLQlpZiAoKGlzcm9vdGVkID0gcGF0aGxbMF0gPT0gJy8nKSkKLQkJdmVyeV9zdGFydCsrOwotCi0JLyogQmVmb3JlCQkJQWZ0ZXIKLQkgKiAvZm9vLwkJCS9mb28KLQkgKiAvZm9vLy4uLy4uL2JhcgkJL2JhcgotCSAqIC9mb28vLi9ibGFoLy4uCQkvZm9vCi0JICogLgkJCQkuCi0JICogLi4JCQkJLi4KLQkgKiAuL2ZvbwkJCWZvbwotCSAqIGZvby8uLi8uLi8uLi9iYXIJCS4uLy4uL2JhcgotCSAqLwotCi0JZm9yIChjdXIgPSB0ID0gc3RhcnQgPSB2ZXJ5X3N0YXJ0OyA7ICkgewotCQkvKiB0cmVhdCBtdWx0aXBsZSAnLydzIGFzIG9uZSAnLycgKi8KLQkJd2hpbGUgKCp0ID09ICcvJykKLQkJCXQrKzsKLQotCQlpZiAoKnQgPT0gJ1wwJykgewotCQkJaWYgKGN1ciA9PSBwYXRobCkKLQkJCQkvKiBjb252ZXJ0IGVtcHR5IHBhdGggdG8gZG90ICovCi0JCQkJKmN1cisrID0gJy4nOwotCQkJKmN1ciA9ICdcMCc7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh0WzBdID09ICcuJykgewotCQkJaWYgKCF0WzFdIHx8IHRbMV0gPT0gJy8nKSB7Ci0JCQkJdCArPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh0WzFdID09ICcuJyAmJiAoIXRbMl0gfHwgdFsyXSA9PSAnLycpKSB7Ci0JCQkJaWYgKCFpc3Jvb3RlZCAmJiBjdXIgPT0gc3RhcnQpIHsKLQkJCQkJaWYgKGN1ciAhPSB2ZXJ5X3N0YXJ0KQotCQkJCQkJKmN1cisrID0gJy8nOwotCQkJCQkqY3VyKysgPSAnLic7Ci0JCQkJCSpjdXIrKyA9ICcuJzsKLQkJCQkJc3RhcnQgPSBjdXI7Ci0JCQkJfSBlbHNlIGlmIChjdXIgIT0gc3RhcnQpCi0JCQkJCXdoaWxlICgtLWN1ciA+IHN0YXJ0ICYmICpjdXIgIT0gJy8nKQotCQkJCQkJOwotCQkJCXQgKz0gMjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjdXIgIT0gdmVyeV9zdGFydCkKLQkJCSpjdXIrKyA9ICcvJzsKLQotCQkvKiBmaW5kL2NvcHkgbmV4dCBjb21wb25lbnQgb2YgcGF0aG5hbWUgKi8KLQkJd2hpbGUgKCp0ICYmICp0ICE9ICcvJykKLQkJCSpjdXIrKyA9ICp0Kys7Ci0JfQotfQotCi0KLXZvaWQKLXNldF9jdXJyZW50X3dkKGNoYXIgKnBhdGhsKQotewotCXNpemVfdCBsZW4gPSAxOwotCWNoYXIgKnAgPSBwYXRobDsKLQotCWlmIChwID09IE5VTEwpIHsKLQkJaWYgKChwID0ga3NoX2dldF93ZCgmbGVuKSkgPT0gTlVMTCkKLQkJCXAgPSBudWxsOwotCX0gZWxzZQotCQlsZW4gPSBzdHJsZW4ocCkgKyAxOwotCi0JaWYgKGxlbiA+IGN1cnJlbnRfd2Rfc2l6ZSkgewotCQlhZnJlZShjdXJyZW50X3dkLCBBUEVSTSk7Ci0JCWN1cnJlbnRfd2QgPSBhbGxvYyhjdXJyZW50X3dkX3NpemUgPSBsZW4sIEFQRVJNKTsKLQl9Ci0JbWVtY3B5KGN1cnJlbnRfd2QsIHAsIGxlbik7Ci0JaWYgKHAgIT0gcGF0aGwgJiYgcCAhPSBudWxsKQotCQlhZnJlZShwLCBBVEVNUCk7Ci19Ci0KLSNpZmRlZiBUSU9DU0NUVFkKLWV4dGVybiB2b2lkIGNodnRfcmVpbml0KHZvaWQpOwotCi1zdGF0aWMgdm9pZAotY2h2dChjb25zdCBjaGFyICpmbikKLXsKLQljaGFyIGR2WzIwXTsKLQlzdHJ1Y3Qgc3RhdCBzYjsKLQlpbnQgZmQ7Ci0KLQkvKiBmb3IgZW50cm9weSAqLwotCWtzaHN0YXRlX2YuaCA9IGV2aWxoYXNoKGZuKTsKLQotCWlmICgqZm4gPT0gJy0nKSB7Ci0JCW1lbWNweShkdiwgIi0vZGV2L251bGwiLCBzaXplb2YoIi0vZGV2L251bGwiKSk7Ci0JCWZuID0gZHYgKyAxOwotCX0gZWxzZSB7Ci0JCWlmIChzdGF0KGZuLCAmc2IpKSB7Ci0JCQltZW1jcHkoZHYsICIvZGV2L3R0eUMiLCA5KTsKLQkJCXN0cmxjcHkoZHYgKyA5LCBmbiwgc2l6ZW9mKGR2KSAtIDkpOwotCQkJaWYgKHN0YXQoZHYsICZzYikpIHsKLQkJCQlzdHJsY3B5KGR2ICsgOCwgZm4sIHNpemVvZihkdikgLSA4KTsKLQkJCQlpZiAoc3RhdChkdiwgJnNiKSkKLQkJCQkJZXJyb3JmKCJjaHZ0OiBjYW4ndCBmaW5kIHR0eSAlcyIsIGZuKTsKLQkJCX0KLQkJCWZuID0gZHY7Ci0JCX0KLQkJaWYgKCEoc2Iuc3RfbW9kZSAmIFNfSUZDSFIpKQotCQkJZXJyb3JmKCJjaHZ0OiBub3QgYSBjaGFyIGRldmljZTogJXMiLCBmbik7Ci0JCWlmICgoc2Iuc3RfdWlkICE9IDApICYmIGNob3duKGZuLCAwLCAwKSkKLQkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IGNob3duIHJvb3QgJXMiLCBmbik7Ci0JCWlmICgoKHNiLnN0X21vZGUgJiAwNzc3NykgIT0gMDYwMCkgJiYgY2htb2QoZm4sIChtb2RlX3QpMDYwMCkpCi0JCQl3YXJuaW5nZihmYWxzZSwgImNodnQ6IGNhbm5vdCBjaG1vZCAwNjAwICVzIiwgZm4pOwotI2lmIEhBVkVfUkVWT0tFCi0JCWlmIChyZXZva2UoZm4pKQotI2VuZGlmCi0JCQl3YXJuaW5nZihmYWxzZSwgImNodnQ6IGNhbm5vdCByZXZva2UgJXMsIG5ldyBzaGVsbCBpcyIKLQkJCSAgICAiIHBvdGVudGlhbGx5IGluc2VjdXJlIiwgZm4pOwotCX0KLQlpZiAoKGZkID0gb3BlbihmbiwgT19SRFdSKSkgPT0gLTEpIHsKLQkJc2xlZXAoMSk7Ci0JCWlmICgoZmQgPSBvcGVuKGZuLCBPX1JEV1IpKSA9PSAtMSkKLQkJCWVycm9yZigiY2h2dDogY2Fubm90IG9wZW4gJXMiLCBmbik7Ci0JfQotCXN3aXRjaCAoZm9yaygpKSB7Ci0JY2FzZSAtMToKLQkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiZm9yayIpOwotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXhpdCgwKTsKLQl9Ci0JaWYgKHNldHNpZCgpID09IC0xKQotCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJzZXRzaWQiKTsKLQlpZiAoZm4gIT0gZHYgKyAxKSB7Ci0JCWlmIChpb2N0bChmZCwgVElPQ1NDVFRZLCBOVUxMKSA9PSAtMSkKLQkJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgIlRJT0NTQ1RUWSIpOwotCQlpZiAodGNmbHVzaChmZCwgVENJT0ZMVVNIKSkKLQkJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgIlRDSU9GTFVTSCIpOwotCX0KLQlrc2hfZHVwMihmZCwgMCwgZmFsc2UpOwotCWtzaF9kdXAyKGZkLCAxLCBmYWxzZSk7Ci0Ja3NoX2R1cDIoZmQsIDIsIGZhbHNlKTsKLQlpZiAoZmQgPiAyKQotCQljbG9zZShmZCk7Ci0JY2h2dF9yZWluaXQoKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLWNoYXIgbG9uZ3NpemVzX2FyZV9va2F5W3NpemVvZihsb25nKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykgPyAxIDogLTFdOwotY2hhciBhcmlzaXplX2lzX29rYXlbc2l6ZW9mKG1rc2hfYXJpX3QpID09IDQgPyAxIDogLTFdOwotY2hhciB1YXJpc2l6ZV9pc19va2F5W3NpemVvZihta3NoX3VhcmlfdCkgPT0gNCA/IDEgOiAtMV07Ci0KLWNoYXIgKgotc3RyY2hyKGNoYXIgKnAsIGludCBjaCkKLXsKLQlmb3IgKDs7ICsrcCkgewotCQlpZiAoKnAgPT0gY2gpCi0JCQlyZXR1cm4gKHApOwotCQlpZiAoISpwKQotCQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi1jaGFyICoKLXN0cnN0cihjaGFyICpiLCBjb25zdCBjaGFyICpsKQotewotCWNoYXIgZmlyc3QsIGM7Ci0Jc2l6ZV90IG47Ci0KLQlpZiAoKGZpcnN0ID0gKmwrKykgPT0gJ1wwJykKLQkJcmV0dXJuIChiKTsKLQluID0gc3RybGVuKGwpOwotIHN0cnN0cl9sb29rOgotCXdoaWxlICgoYyA9ICpiKyspICE9IGZpcnN0KQotCQlpZiAoYyA9PSAnXDAnKQotCQkJcmV0dXJuIChOVUxMKTsKLQlpZiAoc3RybmNtcChiLCBsLCBuKSkKLQkJZ290byBzdHJzdHJfbG9vazsKLQlyZXR1cm4gKGIgLSAxKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE1LU0hfQVNTVU1FX1VURjgKLSNpZiAhSEFWRV9TVFJDQVNFU1RSCi1jb25zdCBjaGFyICoKLXN0cmlzdHIoY29uc3QgY2hhciAqYiwgY29uc3QgY2hhciAqbCkKLXsKLQljaGFyIGZpcnN0LCBjOwotCXNpemVfdCBuOwotCi0JaWYgKChmaXJzdCA9ICpsKyspLCAoKGZpcnN0ID0ga3NoX3RvbG93ZXIoZmlyc3QpKSA9PSAnXDAnKSkKLQkJcmV0dXJuIChiKTsKLQluID0gc3RybGVuKGwpOwotIHN0cmlzdHJfbG9vazoKLQl3aGlsZSAoKGMgPSAqYisrKSwgKChjID0ga3NoX3RvbG93ZXIoYykpICE9IGZpcnN0KSkKLQkJaWYgKGMgPT0gJ1wwJykKLQkJCXJldHVybiAoTlVMTCk7Ci0JaWYgKHN0cm5jYXNlY21wKGIsIGwsIG4pKQotCQlnb3RvIHN0cmlzdHJfbG9vazsKLQlyZXR1cm4gKGIgLSAxKTsKLX0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBNS1NIX1NNQUxMCi1jaGFyICoKLXN0cm5kdXBfKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbiwgQXJlYSAqYXApCi17Ci0JY2hhciAqZHN0ID0gTlVMTDsKLQotCWlmIChzcmMgIT0gTlVMTCkgewotCQlkc3QgPSBhbGxvYyhsZW4gKyAxLCBhcCk7Ci0JCW1lbWNweShkc3QsIHNyYywgbGVuKTsKLQkJZHN0W2xlbl0gPSAnXDAnOwotCX0KLQlyZXR1cm4gKGRzdCk7Ci19Ci0KLWNoYXIgKgotc3RyZHVwXyhjb25zdCBjaGFyICpzcmMsIEFyZWEgKmFwKQotewotCXJldHVybiAoc3JjID09IE5VTEwgPyBOVUxMIDogc3RybmR1cF8oc3JjLCBzdHJsZW4oc3JjKSwgYXApKTsKLX0KLSNlbmRpZgotCi0jaWYgIUhBVkVfR0VUUlVTQUdFCi0jZGVmaW5lIElOVlRDSyhyLHQpCWRvIHsJCQkJCQlcCi0Jci50dl91c2VjID0gKCh0KSAlICgxMDAwMDAwIC8gQ0xLX1RDSykpICogKDEwMDAwMDAgLyBDTEtfVENLKTsJXAotCXIudHZfc2VjID0gKHQpIC8gQ0xLX1RDSzsJCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotCi1pbnQKLWdldHJ1c2FnZShpbnQgd2hhdCwgc3RydWN0IHJ1c2FnZSAqcnUpCi17Ci0Jc3RydWN0IHRtcyB0bXM7Ci0JY2xvY2tfdCB1LCBzOwotCi0JaWYgKC8qIHJ1ID09IE5VTEwgfHwgKi8gdGltZXMoJnRtcykgPT0gKGNsb2NrX3QpLTEpCi0JCXJldHVybiAoLTEpOwotCi0Jc3dpdGNoICh3aGF0KSB7Ci0JY2FzZSBSVVNBR0VfU0VMRjoKLQkJdSA9IHRtcy50bXNfdXRpbWU7Ci0JCXMgPSB0bXMudG1zX3N0aW1lOwotCQlicmVhazsKLQljYXNlIFJVU0FHRV9DSElMRFJFTjoKLQkJdSA9IHRtcy50bXNfY3V0aW1lOwotCQlzID0gdG1zLnRtc19jc3RpbWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JSU5WVENLKHJ1LT5ydV91dGltZSwgdSk7Ci0JSU5WVENLKHJ1LT5ydV9zdGltZSwgcyk7Ci0JcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi0vKgotICogcHJvY2VzcyB0aGUgc3RyaW5nIGF2YWlsYWJsZSB2aWEgZmcgKGdldCBhIGNoYXIpCi0gKiBhbmQgZnAgKHB1dCBiYWNrIGEgY2hhcikgZm9yIGJhY2tzbGFzaCBlc2NhcGVzLAotICogYXNzdW1pbmcgdGhlIGZpcnN0IGNhbGwgdG8gKmZnIGdldHMgdGhlIGNoYXIgZGktCi0gKiByZWN0bHkgYWZ0ZXIgdGhlIGJhY2tzbGFzaDsgcmV0dXJuIHRoZSBjaGFyYWN0ZXIKLSAqICgwLi4weEZGKSwgVW5pY29kZSAod2MgKyAweDEwMCksIG9yIC0xIGlmIG5vIGtub3duCi0gKiBlc2NhcGUgc2VxdWVuY2Ugd2FzIGZvdW5kCi0gKi8KLWludAotdW5ia3NsKGJvb2wgY3N0eWxlLCBpbnQgKCpmZykodm9pZCksIHZvaWQgKCpmcCkoaW50KSkKLXsKLQlpbnQgd2MsIGksIGMsIGZjOwotCi0JZmMgPSAoKmZnKSgpOwotCXN3aXRjaCAoZmMpIHsKLQljYXNlICdhJzoKLQkJLyoKLQkJICogYWNjb3JkaW5nIHRvIHRoZSBjb21tZW50cyBpbiBwZGtzaCwgXDAwNyBzZWVtcwotCQkgKiB0byBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gXGEgKGR1ZSB0byBIUC1VWCBjYywKLQkJICogVWx0cml4IGNjLCBvbGQgcGNjLCBldGMuKSBzbyB3ZSBhdm9pZCB0aGUgZXNjYXBlCi0JCSAqIHNlcXVlbmNlIGFsdG9nZXRoZXIgaW4gbWtzaCBhbmQgYXNzdW1lIEFTQ0lJCi0JCSAqLwotCQl3YyA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgJ2InOgotCQl3YyA9ICdcYic7Ci0JCWJyZWFrOwotCWNhc2UgJ2MnOgotCQlpZiAoIWNzdHlsZSkKLQkJCWdvdG8gdW5rbm93bl9lc2NhcGU7Ci0JCWMgPSAoKmZnKSgpOwotCQl3YyA9IENUUkwoYyk7Ci0JCWJyZWFrOwotCWNhc2UgJ0UnOgotCWNhc2UgJ2UnOgotCQl3YyA9IDAzMzsKLQkJYnJlYWs7Ci0JY2FzZSAnZic6Ci0JCXdjID0gJ1xmJzsKLQkJYnJlYWs7Ci0JY2FzZSAnbic6Ci0JCXdjID0gJ1xuJzsKLQkJYnJlYWs7Ci0JY2FzZSAncic6Ci0JCXdjID0gJ1xyJzsKLQkJYnJlYWs7Ci0JY2FzZSAndCc6Ci0JCXdjID0gJ1x0JzsKLQkJYnJlYWs7Ci0JY2FzZSAndic6Ci0JCS8qIGFzc3VtZSBBU0NJSSBoZXJlIGFzIHdlbGwgKi8KLQkJd2MgPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JCWlmICghY3N0eWxlKQotCQkJZ290byB1bmtub3duX2VzY2FwZTsKLQkJLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlICcwJzoKLQkJaWYgKGNzdHlsZSkKLQkJCSgqZnApKGZjKTsKLQkJLyoKLQkJICogbG9vayBmb3IgYW4gb2N0YWwgbnVtYmVyIHdpdGggdXAgdG8gdGhyZWUKLQkJICogZGlnaXRzLCBub3QgY291bnRpbmcgdGhlIGxlYWRpbmcgemVybzsKLQkJICogY29udmVydCBpdCB0byBhIHJhdyBvY3RldAotCQkgKi8KLQkJd2MgPSAwOwotCQlpID0gMzsKLQkJd2hpbGUgKGktLSkKLQkJCWlmICgoYyA9ICgqZmcpKCkpID49ICcwJyAmJiBjIDw9ICc3JykKLQkJCQl3YyA9ICh3YyA8PCAzKSArIChjIC0gJzAnKTsKLQkJCWVsc2UgewotCQkJCSgqZnApKGMpOwotCQkJCWJyZWFrOwotCQkJfQotCQlicmVhazsKLQljYXNlICdVJzoKLQkJaSA9IDg7Ci0JCWlmICgwKQotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgJ3UnOgotCQlpID0gNDsKLQkJaWYgKDApCi0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSAneCc6Ci0JCWkgPSBjc3R5bGUgPyAtMSA6IDI7Ci0JCS8qCi0JCSAqIHg6CWxvb2sgZm9yIGEgaGV4YWRlY2ltYWwgbnVtYmVyIHdpdGggdXAgdG8KLQkJICoJdHdvIChDIHN0eWxlOiBhcmJpdHJhcnkpIGRpZ2l0czsgY29udmVydAotCQkgKgl0byByYXcgb2N0ZXQgKEMgc3R5bGU6IFVuaWNvZGUgaWYgPjB4RkYpCi0JCSAqIHUvVToJbG9vayBmb3IgYSBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCB1cCB0bwotCQkgKglmb3VyIChVOiBlaWdodCkgZGlnaXRzOyBjb252ZXJ0IHRvIFVuaWNvZGUKLQkJICovCi0JCXdjID0gMDsKLQkJd2hpbGUgKGktLSkgewotCQkJd2MgPDw9IDQ7Ci0JCQlpZiAoKGMgPSAoKmZnKSgpKSA+PSAnMCcgJiYgYyA8PSAnOScpCi0JCQkJd2MgKz0gYyAtICcwJzsKLQkJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQotCQkJCXdjICs9IGMgLSAnQScgKyAxMDsKLQkJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCQkJCXdjICs9IGMgLSAnYScgKyAxMDsKLQkJCWVsc2UgewotCQkJCXdjID4+PSA0OwotCQkJCSgqZnApKGMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICgoY3N0eWxlICYmIHdjID4gMHhGRikgfHwgZmMgIT0gJ3gnKQotCQkJLyogVW5pY29kZSBtYXJrZXIgKi8KLQkJCXdjICs9IDB4MTAwOwotCQlicmVhazsKLQljYXNlICdcJyc6Ci0JCWlmICghY3N0eWxlKQotCQkJZ290byB1bmtub3duX2VzY2FwZTsKLQkJd2MgPSAnXCcnOwotCQlicmVhazsKLQljYXNlICdcXCc6Ci0JCXdjID0gJ1xcJzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLSB1bmtub3duX2VzY2FwZToKLQkJKCpmcCkoZmMpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlyZXR1cm4gKHdjKTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoLmggYi9ta3NoL3NyYy9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU4OGM5Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUyICswLDAgQEAKLS8qCSRPcGVuQlNEOiBzaC5oLHYgMS4zMCAyMDEwLzAxLzA0IDE4OjA3OjExIGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiBzaGYuaCx2IDEuNiAyMDA1LzEyLzExIDE4OjUzOjUxIGRlcmFhZHQgRXhwICQJKi8KLS8qCSRPcGVuQlNEOiB0YWJsZS5oLHYgMS43IDIwMDUvMTIvMTEgMjA6MzE6MjEgb3R0byBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHRyZWUuaCx2IDEuMTAgMjAwNS8wMy8yOCAyMToyODoyMiBkZXJhYWR0IEV4cCAkCSovCi0vKgkkT3BlbkJTRDogZXhwYW5kLmgsdiAxLjYgMjAwNS8wMy8zMCAxNzoxNjozNyBkZXJhYWR0IEV4cCAkCSovCi0vKgkkT3BlbkJTRDogbGV4LmgsdiAxLjExIDIwMDYvMDUvMjkgMTg6MjI6MjQgb3R0byBFeHAgJAkqLwotLyoJJE9wZW5CU0Q6IHByb3RvLmgsdiAxLjMzIDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogY190ZXN0LmgsdiAxLjQgMjAwNC8xMi8yMCAxMTozNDoyNiBvdHRvIEV4cCAkCSovCi0vKgkkT3BlbkJTRDogdHR5LmgsdiAxLjUgMjAwNC8xMi8yMCAxMTozNDoyNiBvdHRvIEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaWZkZWYgX19kaWV0bGliY19fCi0vKiBYWFggaW1ha2Ugc3R5bGUgKi8KLSNkZWZpbmUgX0JTRF9TT1VSQ0UJLyogbGl2ZSwgQlNELCBsaXZlISAqLwotI2VuZGlmCi0KLSNpZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmIEhBVkVfU1lTX1NZU01BQ1JPU19ICi0jaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2VuZGlmCi0jaWYgSEFWRV9TWVNfTUtERVZfSAotI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgotI2VuZGlmCi0jaWYgSEFWRV9TWVNfTU1BTl9ICi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWYgSEFWRV9MSUJHRU5fSAotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2VuZGlmCi0jaWYgSEFWRV9MSUJVVElMX0gKLSNpbmNsdWRlIDxsaWJ1dGlsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpZiBIQVZFX1BBVEhTX0gKLSNpbmNsdWRlIDxwYXRocy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaWYgSEFWRV9TVERCT09MX0gKLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpZiBIQVZFX1NURElOVF9ICi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpZiBIQVZFX1VMSU1JVF9ICi0jaW5jbHVkZSA8dWxpbWl0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZiBIQVZFX1ZBTFVFU19ICi0jaW5jbHVkZSA8dmFsdWVzLmg+Ci0jZW5kaWYKLQotI3VuZGVmIF9fYXR0cmlidXRlX18KLSNpZiBIQVZFX0FUVFJJQlVURV9CT1VOREVECi0jZGVmaW5lIE1LU0hfQV9CT1VOREVEKHgseSx6KQlfX2F0dHJpYnV0ZV9fKChib3VuZGVkICh4LCB5LCB6KSkpCi0jZWxzZQotI2RlZmluZSBNS1NIX0FfQk9VTkRFRCh4LHkseikJLyogbm90aGluZyAqLwotI2VuZGlmCi0jaWYgSEFWRV9BVFRSSUJVVEVfRk9STUFUCi0jZGVmaW5lIE1LU0hfQV9GT1JNQVQoeCx5LHopCV9fYXR0cmlidXRlX18oKGZvcm1hdCAoeCwgeSwgeikpKQotI2Vsc2UKLSNkZWZpbmUgTUtTSF9BX0ZPUk1BVCh4LHkseikJLyogbm90aGluZyAqLwotI2VuZGlmCi0jaWYgSEFWRV9BVFRSSUJVVEVfTk9OTlVMTAotI2RlZmluZSBNS1NIX0FfTk9OTlVMTChhKQlfX2F0dHJpYnV0ZV9fKGEpCi0jZWxzZQotI2RlZmluZSBNS1NIX0FfTk9OTlVMTChhKQkvKiBub3RoaW5nICovCi0jZW5kaWYKLSNpZiBIQVZFX0FUVFJJQlVURV9OT1JFVFVSTgotI2RlZmluZSBNS1NIX0FfTk9SRVRVUk4JCV9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKLSNlbHNlCi0jZGVmaW5lIE1LU0hfQV9OT1JFVFVSTgkJLyogbm90aGluZyAqLwotI2VuZGlmCi0jaWYgSEFWRV9BVFRSSUJVVEVfVU5VU0VECi0jZGVmaW5lIE1LU0hfQV9VTlVTRUQJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpCi0jZWxzZQotI2RlZmluZSBNS1NIX0FfVU5VU0VECQkvKiBub3RoaW5nICovCi0jZW5kaWYKLSNpZiBIQVZFX0FUVFJJQlVURV9VU0VECi0jZGVmaW5lIE1LU0hfQV9VU0VECQlfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKLSNlbHNlCi0jZGVmaW5lIE1LU0hfQV9VU0VECQkvKiBub3RoaW5nICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTWlyQlNEKSAmJiAoTWlyQlNEID49IDB4MDlBMSkgJiYgXAotICAgIGRlZmluZWQoX19FTEZfXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAotICAgICFkZWZpbmVkKF9fbGx2bV9fKSAmJiAhZGVmaW5lZChfX05XQ0NfXykKLS8qCi0gKiBXZSBnb3QgdXNhYmxlIF9fSURTVFJJTkcgX19DT1BZUklHSFQgX19SQ1NJRCBfX1NDQ1NJRCBtYWNyb3MKLSAqIHdoaWNoIHdvcmsgZm9yIGFsbCBjYXNlczsgbm8gbmVlZCB0byByZWRlZmluZSB0aGVtIHVzaW5nIHRoZQotICogInBvcnRhYmxlIiBtYWNyb3MgZnJvbSBiZWxvdyB3aGVuIHdlIG1pZ2h0IGhhdmUgdGhlICJiZXR0ZXIiCi0gKiBnY2MrRUxGIHNwZWNpZmljIG1hY3JvcyBvciBvdGhlciBzeXN0ZW0gZGVwZW5kZW50IG9uZXMuCi0gKi8KLSNlbHNlCi0jdW5kZWYgX19JRFNUUklORwotI3VuZGVmIF9fSURTVFJJTkdfQ09OQ0FUCi0jdW5kZWYgX19JRFNUUklOR19FWFBBTkQKLSN1bmRlZiBfX0NPUFlSSUdIVAotI3VuZGVmIF9fUkNTSUQKLSN1bmRlZiBfX1NDQ1NJRAotI2RlZmluZSBfX0lEU1RSSU5HX0NPTkNBVChsLHApCQlfX0xJTlRFRF9fICMjIGwgIyMgXyAjIyBwCi0jZGVmaW5lIF9fSURTVFJJTkdfRVhQQU5EKGwscCkJCV9fSURTVFJJTkdfQ09OQ0FUKGwscCkKLSNkZWZpbmUgX19JRFNUUklORyhwcmVmaXgsIHN0cmluZykJCQkJXAotCXN0YXRpYyBjb25zdCBjaGFyIF9fSURTVFJJTkdfRVhQQU5EKF9fTElORV9fLHByZWZpeCkgW10JXAotCSAgICBNS1NIX0FfVVNFRCA9ICJAKCIiIykiICNwcmVmaXggIjogIiBzdHJpbmcKLSNkZWZpbmUgX19DT1BZUklHSFQoeCkJCV9fSURTVFJJTkcoY29weXJpZ2h0LHgpCi0jZGVmaW5lIF9fUkNTSUQoeCkJCV9fSURTVFJJTkcocmNzaWQseCkKLSNkZWZpbmUgX19TQ0NTSUQoeCkJCV9fSURTVFJJTkcoc2Njc2lkLHgpCi0jZW5kaWYKLQotI2lmZGVmIEVYVEVSTgotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2guaCx2IDEuNDA1IDIwMTAvMDgvMjQgMTU6MTk6NTQgdGcgRXhwICQiKTsKLSNlbmRpZgotI2RlZmluZSBNS1NIX1ZFUlNJT04gIlIzOSAyMDEwLzA4LzI0IgotCi0jaWZuZGVmIE1LU0hfSU5DTFVERVNfT05MWQotCi0vKiBleHRyYSB0eXBlcyAqLwotCi0jaWYgIUhBVkVfR0VUUlVTQUdFCi0jdW5kZWYgcnVzYWdlCi0jdW5kZWYgUlVTQUdFX1NFTEYKLSN1bmRlZiBSVVNBR0VfQ0hJTERSRU4KLSNkZWZpbmUgcnVzYWdlIG1rc2hfcnVzYWdlCi0jZGVmaW5lIFJVU0FHRV9TRUxGCTAKLSNkZWZpbmUgUlVTQUdFX0NISUxEUkVOCS0xCi0KLXN0cnVjdCBydXNhZ2UgewotCXN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOwotCXN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOwotfTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfUkxJTV9UCi10eXBlZGVmIGxvbmcgcmxpbV90OwotI2VuZGlmCi0KLSNpZiAhSEFWRV9TSUdfVAotI3VuZGVmIHNpZ190Ci10eXBlZGVmIHZvaWQgKCpzaWdfdCkoaW50KTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfU1REQk9PTF9ICi0vKiBrbHVkZ2UsIGJ1dCBlbm91Z2ggZm9yIG1rc2ggKi8KLXR5cGVkZWYgaW50IGJvb2w7Ci0jZGVmaW5lIGZhbHNlIDAKLSNkZWZpbmUgdHJ1ZSAxCi0jZW5kaWYKLQotI2lmICFIQVZFX0NBTl9JTlRUWVBFUwotI2lmICFIQVZFX0NBTl9VQ0JJTlRTCi10eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotI2Vsc2UKLXR5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OwotI2VuZGlmCi0jZW5kaWYKLQotI2lmICFIQVZFX0NBTl9JTlQ4VFlQRQotI2lmICFIQVZFX0NBTl9VQ0JJTlQ4Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKLSNlbHNlCi10eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBleHRyYSBtYWNyb3MgKi8KLQotI2lmbmRlZiB0aW1lcmNsZWFyCi0jZGVmaW5lIHRpbWVyY2xlYXIodHZwKQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQkodHZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3VzZWMgPSAwOwkJCVwKLQl9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLSNlbmRpZgotI2lmbmRlZiB0aW1lcmFkZAotI2RlZmluZSB0aW1lcmFkZCh0dnAsIHV2cCwgdnZwKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCSh2dnApLT50dl9zZWMgPSAodHZwKS0+dHZfc2VjICsgKHV2cCktPnR2X3NlYzsJCVwKLQkJKHZ2cCktPnR2X3VzZWMgPSAodHZwKS0+dHZfdXNlYyArICh1dnApLT50dl91c2VjOwlcCi0JCWlmICgodnZwKS0+dHZfdXNlYyA+PSAxMDAwMDAwKSB7CQkJXAotCQkJKHZ2cCktPnR2X3NlYysrOwkJCQlcCi0JCQkodnZwKS0+dHZfdXNlYyAtPSAxMDAwMDAwOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0jZW5kaWYKLSNpZm5kZWYgdGltZXJzdWIKLSNkZWZpbmUgdGltZXJzdWIodHZwLCB1dnAsIHZ2cCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQkodnZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3NlYyAtICh1dnApLT50dl9zZWM7CQlcCi0JCSh2dnApLT50dl91c2VjID0gKHR2cCktPnR2X3VzZWMgLSAodXZwKS0+dHZfdXNlYzsJXAotCQlpZiAoKHZ2cCktPnR2X3VzZWMgPCAwKSB7CQkJCVwKLQkJCSh2dnApLT50dl9zZWMtLTsJCQkJXAotCQkJKHZ2cCktPnR2X3VzZWMgKz0gMTAwMDAwMDsJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2VuZGlmCi0KLSNkZWZpbmUga3NoX2lzZGlnaXQoYykJKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc5JykpCi0jZGVmaW5lIGtzaF9pc2xvd2VyKGMpCSgoKGMpID49ICdhJykgJiYgKChjKSA8PSAneicpKQotI2RlZmluZSBrc2hfaXN1cHBlcihjKQkoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSkKLSNkZWZpbmUga3NoX3RvbG93ZXIoYykJKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykgPyAoYykgLSAnQScgKyAnYScgOiAoYykpCi0jZGVmaW5lIGtzaF90b3VwcGVyKGMpCSgoKGMpID49ICdhJykgJiYgKChjKSA8PSAneicpID8gKGMpIC0gJ2EnICsgJ0EnIDogKGMpKQotI2RlZmluZSBrc2hfaXNkYXNoKHMpCSgoKHMpICE9IE5VTEwpICYmICgocylbMF0gPT0gJy0nKSAmJiAoKHMpWzFdID09ICdcMCcpKQotI2RlZmluZSBrc2hfaXNzcGFjZShjKQkoKCgoYykgPj0gMHgwOSkgJiYgKChjKSA8PSAweDBEKSkgfHwgKChjKSA9PSAweDIwKSkKLQotI2lmZGVmIE5PX1BBVEhfTUFYCi0jdW5kZWYgUEFUSF9NQVgKLSNlbHNlCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYCTEwMjQKLSNlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFNJWkVfTUFYCi0jaWZkZWYgU0laRV9UX01BWAotI2RlZmluZSBTSVpFX01BWAlTSVpFX1RfTUFYCi0jZWxzZQotI2RlZmluZSBTSVpFX01BWAkoKHNpemVfdCktMSkKLSNlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFNfSVNMTksKLSNkZWZpbmUgU19JU0xOSyhtKQkoKG0gJiAwMTcwMDAwKSA9PSAwMTIwMDAwKQotI2VuZGlmCi0jaWZuZGVmIFNfSVNTT0NLCi0jZGVmaW5lIFNfSVNTT0NLKG0pCSgobSAmIDAxNzAwMDApID09IDAxNDAwMDApCi0jZW5kaWYKLSNpZm5kZWYgREVGRklMRU1PREUKLSNkZWZpbmUgREVGRklMRU1PREUJKFNfSVJVU1J8U19JV1VTUnxTX0lSR1JQfFNfSVdHUlB8U19JUk9USHxTX0lXT1RIKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChNQVBfRkFJTEVEKQotLyogWFhYIGltYWtlIHN0eWxlICovCi0jICBpZiBkZWZpbmVkKF9fbGludXgpCi0jZGVmaW5lIE1BUF9GQUlMRUQJKCh2b2lkICopLTEpCi0jICBlbGlmIGRlZmluZWQoX19ic2RpX18pIHx8IGRlZmluZWQoX19vc2ZfXykgfHwgZGVmaW5lZChfX3VsdHJpeCkKLSNkZWZpbmUgTUFQX0ZBSUxFRAkoKGNhZGRyX3QpLTEpCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTlNJRwotI2lmIGRlZmluZWQoX05TSUcpCi0jZGVmaW5lIE5TSUcJCV9OU0lHCi0jZWxpZiBkZWZpbmVkKFNJR01BWCkKLSNkZWZpbmUgTlNJRwkJKFNJR01BWCsxKQotI2VuZGlmCi0jZW5kaWYKLQotI3VuZGVmIEJBRAkJLyogQUlYIGRlZmluZXMgdGhhdCBzb21ld2hlcmUgKi8KLQotLyogT1MtZGVwZW5kZW50IGFkZGl0aW9ucyAoZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGJ5IE9TKSAqLwotCi0jaWYgIUhBVkVfRkxPQ0tfREVDTAotZXh0ZXJuIGludCBmbG9jayhpbnQsIGludCk7Ci0jZW5kaWYKLQotI2lmICFIQVZFX0dFVFJVU0FHRQotZXh0ZXJuIGludCBnZXRydXNhZ2UoaW50LCBzdHJ1Y3QgcnVzYWdlICopOwotI2VuZGlmCi0KLSNpZiAhSEFWRV9SRVZPS0VfREVDTAotZXh0ZXJuIGludCByZXZva2UoY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfU0VUTU9ERQotbW9kZV90IGdldG1vZGUoY29uc3Qgdm9pZCAqLCBtb2RlX3QpOwotdm9pZCAqc2V0bW9kZShjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSNpZmRlZiBfX3VsdHJpeAotLyogWFhYIGltYWtlIHN0eWxlICovCi1pbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmICFIQVZFX1NUUkNBU0VTVFIKLWNvbnN0IGNoYXIgKnN0cmlzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSNpZiAhSEFWRV9TVFJMQ1BZCi1zaXplX3Qgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLSNlbmRpZgotCi0jaWYgIUhBVkVfU1lTX1NJR0xJU1RfREVDTAotZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWdsaXN0W107Ci0jZW5kaWYKLQotI2lmZGVmIF9fSU5URVJJWAotLyogWFhYIGltYWtlIHN0eWxlICovCi0jZGVmaW5lIG1ha2VkZXYgbWtkZXYKLWV4dGVybiBpbnQgX19jZGVjbCBzZXRldWlkKHVpZF90KTsKLWV4dGVybiBpbnQgX19jZGVjbCBzZXRlZ2lkKGdpZF90KTsKLSNlbmRpZgotCi0vKiByZW1vdmUgcmVkdW5kYW5jZXMgKi8KLQotI2lmIGRlZmluZWQoTWlyQlNEKSAmJiAoTWlyQlNEID49IDB4MDhBOCkKLSNkZWZpbmUgTUtTSF9taXJic2Rfd2N3aWR0aAotI2RlZmluZSB1dGZfd2N3aWR0aChpKSB3Y3dpZHRoKChfX1dDSEFSX1RZUEVfXylpKQotZXh0ZXJuIGludCB3Y3dpZHRoKF9fV0NIQVJfVFlQRV9fKTsKLSNlbmRpZgotCi0KLS8qIHNvbWUgdXNlZnVsICNkZWZpbmVzICovCi0jaWZkZWYgRVhURVJOCi0jIGRlZmluZSBJX18oaSkgPSBpCi0jZWxzZQotIyBkZWZpbmUgSV9fKGkpCi0jIGRlZmluZSBFWFRFUk4gZXh0ZXJuCi0jIGRlZmluZSBFWFRFUk5fREVGSU5FRAotI2VuZGlmCi0KLSNkZWZpbmUgTkVMRU0oYSkJKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQotI2RlZmluZSBCSVQoaSkJCSgxIDw8IChpKSkJLyogZGVmaW5lIGJpdCBpbiBmbGFnICovCi0KLS8qIFRhYmxlIGZsYWcgdHlwZSAtIG5lZWRzID4gMTYgYW5kIDwgMzIgYml0cyAqLwotdHlwZWRlZiBpbnQzMl90IFRmbGFnOwotCi0vKiBhcml0aG1ldGljcyB0eXBlcyAqLwotdHlwZWRlZiBpbnQzMl90IG1rc2hfYXJpX3Q7Ci10eXBlZGVmIHVpbnQzMl90IG1rc2hfdWFyaV90OwotCi0vKiB0aGVzZSBzaGFsbCBiZSBzbWFsbGVyIHRoYW4gMTAwICovCi0jaWZkZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTCi0jZGVmaW5lIE5VRklMRQkJMzIJLyogTnVtYmVyIG9mIHVzZXItYWNjZXNzaWJsZSBmaWxlcyAqLwotI2RlZmluZSBGREJBU0UJCTEwCS8qIEZpcnN0IGZpbGUgdXNhYmxlIGJ5IFNoZWxsICovCi0jZWxzZQotI2RlZmluZSBOVUZJTEUJCTU2CS8qIE51bWJlciBvZiB1c2VyLWFjY2Vzc2libGUgZmlsZXMgKi8KLSNkZWZpbmUgRkRCQVNFCQkyNAkvKiBGaXJzdCBmaWxlIHVzYWJsZSBieSBTaGVsbCAqLwotI2VuZGlmCi0KLS8qIE1ha2UgTUFHSUMgYSBjaGFyIHRoYXQgbWlnaHQgYmUgcHJpbnRlZCB0byBtYWtlIGJ1Z3MgbW9yZSBvYnZpb3VzLCBidXQKLSAqIG5vdCBhIGNoYXIgdGhhdCBpcyB1c2VkIG9mdGVuLiBBbHNvLCBjYW4ndCB1c2UgdGhlIGhpZ2ggYml0IGFzIGl0IGNhdXNlcwotICogcG9ydGFiaWxpdHkgcHJvYmxlbXMgKGNhbGxpbmcgc3RyY2hyKHgsIDB4ODB8J3gnKSBpcyBlcnJvciBwcm9uZSkuCi0gKi8KLSNkZWZpbmUgTUFHSUMJCSg3KQkvKiBwcmVmaXggZm9yICo/WyF7LH0gZHVyaW5nIGV4cGFuZCAqLwotI2RlZmluZSBJU01BR0lDKGMpCSgodW5zaWduZWQgY2hhcikoYykgPT0gTUFHSUMpCi0jZGVmaW5lIE5PVAkJJyEnCS8qIG1pZ2h0IHVzZSBeIChpZSwgWyEuLi5dIHZzIFteLi5dKSAqLwotCi0jZGVmaW5lIExJTkUJCTQwOTYJLyogaW5wdXQgbGluZSBzaXplICovCi0KLUVYVEVSTiBjb25zdCBjaGFyICpzYWZlX3Byb21wdDsgLyogc2FmZSBwcm9tcHQgaWYgUFMxIHN1YnN0aXR1dGlvbiBmYWlscyAqLwotRVhURVJOIGNvbnN0IGNoYXIgaW5pdHZzbltdIElfXygiS1NIX1ZFUlNJT049QCgjKU1JUkJTRCBLU0ggIiBNS1NIX1ZFUlNJT04pOwotI2RlZmluZSBLU0hfVkVSU0lPTgkoaW5pdHZzbiArIC8qICJLU0hfVkVSU0lPTj1AKCMpIiAqLyAxNikKLQotRVhURVJOIGNvbnN0IGNoYXIgZGlnaXRzX3VjW10gSV9fKCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKTsKLUVYVEVSTiBjb25zdCBjaGFyIGRpZ2l0c19sY1tdIElfXygiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iik7Ci0KLS8qCi0gKiBFdmlsIGhhY2sgZm9yIGNvbnN0IGNvcnJlY3RuZXNzIGR1ZSB0byBBUEkgYnJva2VubmVzcwotICovCi11bmlvbiBta3NoX2NjaGFjayB7Ci0JY2hhciAqcnc7Ci0JY29uc3QgY2hhciAqcm87Ci19OwotdW5pb24gbWtzaF9jY3BoYWNrIHsKLQljaGFyICoqcnc7Ci0JY29uc3QgY2hhciAqKnJvOwotfTsKLQotLyogZm9yIGNvbnN0IGRlYnVnZ2luZyAqLwotI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSUNDKSAmJiBcCi0gICAgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19TVU5QUk9fQykKLWNoYXIgKnVjc3RyY2hyKGNoYXIgKiwgaW50KTsKLWNoYXIgKnVjc3Ryc3RyKGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSN1bmRlZiBzdHJjaHIKLSNkZWZpbmUgc3RyY2hyIHVjc3RyY2hyCi0jZGVmaW5lIHN0cnN0ciB1Y3N0cnN0cgotI2RlZmluZSBjc3RyY2hyKHMsYykgKHsJCQlcCi0JdW5pb24gbWtzaF9jY2hhY2sgaW4sIG91dDsJXAotCQkJCQlcCi0JaW4ucm8gPSAocyk7CQkJXAotCW91dC5ydyA9IHVjc3RyY2hyKGluLnJ3LCAoYykpOwlcCi0JKG91dC5ybyk7CQkJXAotfSkKLSNkZWZpbmUgY3N0cnN0cihiLGwpICh7CQkJXAotCXVuaW9uIG1rc2hfY2NoYWNrIGluLCBvdXQ7CVwKLQkJCQkJXAotCWluLnJvID0gKGIpOwkJCVwKLQlvdXQucncgPSB1Y3N0cnN0cihpbi5ydywgKGwpKTsJXAotCShvdXQucm8pOwkJCVwKLX0pCi0jZGVmaW5lIHZzdHJjaHIocyxjKQkoY3N0cmNocigocyksIChjKSkgIT0gTlVMTCkKLSNkZWZpbmUgdnN0cnN0cihiLGwpCShjc3Ryc3RyKChiKSwgKGwpKSAhPSBOVUxMKQotI2RlZmluZSBta3NzZXJ0KGUpCSgoZSkgPyAodm9pZCkwIDogZXhpdCgyNTUpKQotI2Vsc2UgLyogIURFQlVHLCAhZ2NjICovCi0jZGVmaW5lIGNzdHJjaHIocyxjKQkoKGNvbnN0IGNoYXIgKilzdHJjaHIoKHMpLCAoYykpKQotI2RlZmluZSBjc3Ryc3RyKHMsYykJKChjb25zdCBjaGFyICopc3Ryc3RyKChzKSwgKGMpKSkKLSNkZWZpbmUgdnN0cmNocihzLGMpCShzdHJjaHIoKHMpLCAoYykpICE9IE5VTEwpCi0jZGVmaW5lIHZzdHJzdHIoYixsKQkoc3Ryc3RyKChiKSwgKGwpKSAhPSBOVUxMKQotI2RlZmluZSBta3NzZXJ0KGUpCSgodm9pZCkwKQotI2VuZGlmCi0KLS8qIHVzZSB0aGlzIGlwdiBzdHJjaHIocywgMCkgYnV0IG5vIHNpZGUgZWZmZWN0cyBpbiBzISAqLwotI2RlZmluZSBzdHJudWwocykJKChzKSArIHN0cmxlbihzKSkKLQotI2RlZmluZSB1dGZfcHRyYWRqeChzcmMsIGRzdCkgZG8gewkJCQkJXAotCShkc3QpID0gKHNyYykgKyB1dGZfcHRyYWRqKHNyYyk7CQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotCi0jaWZkZWYgTUtTSF9TTUFMTAotI2RlZmluZSBzdHJkdXB4KGQsIHMsIGFwKSBkbyB7IFwKLQkoZCkgPSBzdHJkdXBfKChzKSwgKGFwKSk7IFwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2RlZmluZSBzdHJuZHVweChkLCBzLCBuLCBhcCkgZG8geyBcCi0JKGQpID0gc3RybmR1cF8oKHMpLCAobiksIChhcCkpOyBcCi19IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLSNlbHNlCi0vKiBiZSBjYXJlZnVsIHRvIGV2YWx1YXRlIGFyZ3VtZW50cyBvbmx5IG9uY2UhICovCi0jZGVmaW5lIHN0cmR1cHgoZCwgcywgYXApIGRvIHsJCQkJCQlcCi0JY29uc3QgY2hhciAqc3RyZHVwX3NyYyA9IChzKTsJCQkJCVwKLQljaGFyICpzdHJkdXBfZHN0ID0gTlVMTDsJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoc3RyZHVwX3NyYyAhPSBOVUxMKSB7CQkJCQlcCi0JCXNpemVfdCBzdHJkdXBfbGVuID0gc3RybGVuKHN0cmR1cF9zcmMpICsgMTsJCVwKLQkJc3RyZHVwX2RzdCA9IGFsbG9jKHN0cmR1cF9sZW4sIChhcCkpOwkJCVwKLQkJbWVtY3B5KHN0cmR1cF9kc3QsIHN0cmR1cF9zcmMsIHN0cmR1cF9sZW4pOwkJXAotCX0JCQkJCQkJCVwKLQkoZCkgPSBzdHJkdXBfZHN0OwkJCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2RlZmluZSBzdHJuZHVweChkLCBzLCBuLCBhcCkgZG8gewkJCQkJXAotCWNvbnN0IGNoYXIgKnN0cmR1cF9zcmMgPSAocyk7CQkJCQlcCi0JY2hhciAqc3RyZHVwX2RzdCA9IE5VTEw7CQkJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKHN0cmR1cF9zcmMgIT0gTlVMTCkgewkJCQkJXAotCQlzaXplX3Qgc3RybmR1cF9sZW4gPSAobik7CQkJCVwKLQkJc3RyZHVwX2RzdCA9IGFsbG9jKHN0cm5kdXBfbGVuICsgMSwgKGFwKSk7CQlcCi0JCW1lbWNweShzdHJkdXBfZHN0LCBzdHJkdXBfc3JjLCBzdHJuZHVwX2xlbik7CQlcCi0JCXN0cmR1cF9kc3Rbc3RybmR1cF9sZW5dID0gJ1wwJzsJCQkJXAotCX0JCQkJCQkJCVwKLQkoZCkgPSBzdHJkdXBfZHN0OwkJCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2VuZGlmCi0KLSNpZiBIQVZFX1NUUkNBU0VTVFIKLSNkZWZpbmUgc3RyaXN0cihiLGwpCSgoY29uc3QgY2hhciAqKXN0cmNhc2VzdHIoKGIpLCAobCkpKQotI2VuZGlmCi0KLSNpZmRlZiBNS1NIX1NNQUxMCi0jaWZuZGVmIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUwotI2RlZmluZSBNS1NIX0NPTlNFUlZBVElWRV9GRFMJLyogZGVmaW5lZCAqLwotI2VuZGlmCi0jaWZuZGVmIE1LU0hfTk9QV05BTQotI2RlZmluZSBNS1NIX05PUFdOQU0JCS8qIGRlZmluZWQgKi8KLSNlbmRpZgotI2lmbmRlZiBNS1NIX1NfTk9WSQotI2RlZmluZSBNS1NIX1NfTk9WSQkJMQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBNS1NIX1NfTk9WSQotI2RlZmluZSBNS1NIX1NfTk9WSQkJMAotI2VuZGlmCi0KLS8qCi0gKiBzaW1wbGUgZ3JvdXBpbmcgYWxsb2NhdG9yCi0gKi8KLQotLyogMS4gaW50ZXJuYWwgc3RydWN0dXJlICovCi1zdHJ1Y3QgbGFsbG9jIHsKLQlzdHJ1Y3QgbGFsbG9jICpuZXh0OwotfTsKLQotLyogMi4gc2l6ZXMgKi8KLSNkZWZpbmUgQUxMT0NfSVRFTQlzdHJ1Y3QgbGFsbG9jCi0jZGVmaW5lIEFMTE9DX1NJWkUJKHNpemVvZihBTExPQ19JVEVNKSkKLQotLyogMy4gZ3JvdXAgc3RydWN0dXJlIChvbmx5IHRoZSBzYW1lIGZvciBsYWxsb2MuYykgKi8KLXR5cGVkZWYgc3RydWN0IGxhbGxvYyBBcmVhOwotCi0KLUVYVEVSTiBBcmVhIGFwZXJtOwkJLyogcGVybWFuZW50IG9iamVjdCBzcGFjZSAqLwotI2RlZmluZSBBUEVSTQkmYXBlcm0KLSNkZWZpbmUgQVRFTVAJJmUtPmFyZWEKLQotLyoKLSAqIGZsYWdzICh0aGUgb3JkZXIgb2YgdGhlc2UgZW51bXMgTVVTVCBtYXRjaCB0aGUgb3JkZXIgaW4gbWlzYy5jKG9wdGlvbnNbXSkpCi0gKi8KLWVudW0gc2hfZmxhZyB7Ci0jZGVmaW5lIFNIRkxBR1NfRU5VTVMKLSNpbmNsdWRlICJzaF9mbGFncy5oIgotCUZORkxBR1MJCS8qIChwbGFjZSBob2xkZXI6IGhvdyBtYW55IGZsYWdzIGFyZSB0aGVyZSkgKi8KLX07Ci0KLSNkZWZpbmUgRmxhZyhmKQkoa3Noc3RhdGVfdi5zaGVsbF9mbGFnc19bKGludCkoZildKQotI2RlZmluZSBVVEZNT0RFCUZsYWcoRlVOSUNPREUpCi0KLS8qCi0gKiBwYXJzaW5nICYgZXhlY3V0aW9uIGVudmlyb25tZW50Ci0gKi8KLWV4dGVybiBzdHJ1Y3QgZW52IHsKLQlBTExPQ19JVEVNIF9fYWxsb2NfaTsJLyogaW50ZXJuYWwsIGRvIG5vdCB0b3VjaCAqLwotCUFyZWEgYXJlYTsJCS8qIHRlbXBvcmFyeSBhbGxvY2F0aW9uIGFyZWEgKi8KLQlzdHJ1Y3QgZW52ICpvZW52OwkvKiBsaW5rIHRvIHByZXZpb3VzIGVudmlyb25tZW50ICovCi0Jc3RydWN0IGJsb2NrICpsb2M7CS8qIGxvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zICovCi0Jc2hvcnQgKnNhdmVmZDsJCS8qIG9yaWdpbmFsIHJlZGlyZWN0ZWQgZmRzICovCi0Jc3RydWN0IHRlbXAgKnRlbXBzOwkvKiB0ZW1wIGZpbGVzICovCi0Jc2lnam1wX2J1ZiBqYnVmOwkvKiBsb25nIGp1bXAgYmFjayB0byBlbnYgY3JlYXRvciAqLwotCXNob3J0IHR5cGU7CQkvKiBlbnZpcm9ubWVudCB0eXBlIC0gc2VlIGJlbG93ICovCi0Jc2hvcnQgZmxhZ3M7CQkvKiBFRl8qICovCi19ICplOwotCi0vKiBzdHJ1Y3QgZW52LnR5cGUgdmFsdWVzICovCi0jZGVmaW5lIEVfTk9ORQkwCS8qIGR1bW15IGVudmlyb25tZW50ICovCi0jZGVmaW5lIEVfUEFSU0UJMQkvKiBwYXJzaW5nIGNvbW1hbmQgIyAqLwotI2RlZmluZSBFX0ZVTkMJMgkvKiBleGVjdXRpbmcgZnVuY3Rpb24gIyAqLwotI2RlZmluZSBFX0lOQ0wJMwkvKiBpbmNsdWRpbmcgYSBmaWxlIHZpYSAuICMgKi8KLSNkZWZpbmUgRV9FWEVDCTQJLyogZXhlY3V0aW5nIGNvbW1hbmQgdHJlZSAqLwotI2RlZmluZSBFX0xPT1AJNQkvKiBleGVjdXRpbmcgZm9yL3doaWxlICMgKi8KLSNkZWZpbmUgRV9FUlJICTYJLyogZ2VuZXJhbCBlcnJvciBoYW5kbGVyICMgKi8KLS8qICMgaW5kaWNhdGVzIGVudiBoYXMgdmFsaWQgamJ1ZiAoc2VlIHVud2luZCgpKSAqLwotCi0vKiBzdHJ1Y3QgZW52LmZsYWcgdmFsdWVzICovCi0jZGVmaW5lIEVGX0ZVTkNfUEFSU0UJQklUKDApCS8qIGZ1bmN0aW9uIGJlaW5nIHBhcnNlZCAqLwotI2RlZmluZSBFRl9CUktDT05UX1BBU1MJQklUKDEpCS8qIHNldCBpZiBFX0xPT1AgbXVzdCBwYXNzIGJyZWFrL2NvbnRpbnVlIG9uICovCi0jZGVmaW5lIEVGX0ZBS0VfU0lHRElFCUJJVCgyKQkvKiBoYWNrIHRvIGdldCBpbmZvIGZyb20gdW53aW5kIHRvIHF1aXRlbnYgKi8KLQotLyogRG8gYnJlYWtzL2NvbnRpbnVlcyBzdG9wIGF0IGVudiB0eXBlIGU/ICovCi0jZGVmaW5lIFNUT1BfQlJLQ09OVCh0KQkoKHQpID09IEVfTk9ORSB8fCAodCkgPT0gRV9QQVJTRSBcCi0JCQkgfHwgKHQpID09IEVfRlVOQyB8fCAodCkgPT0gRV9JTkNMKQotLyogRG8gcmV0dXJucyBzdG9wIGF0IGVudiB0eXBlIGU/ICovCi0jZGVmaW5lIFNUT1BfUkVUVVJOKHQpCSgodCkgPT0gRV9GVU5DIHx8ICh0KSA9PSBFX0lOQ0wpCi0KLS8qIHZhbHVlcyBmb3Igc2lnbG9uZ2ptcChlLT5qYnVmLCAwKSAqLwotI2RlZmluZSBMUkVUVVJOCTEJLyogcmV0dXJuIHN0YXRlbWVudCAqLwotI2RlZmluZSBMRVhJVAkyCS8qIGV4aXQgc3RhdGVtZW50ICovCi0jZGVmaW5lIExFUlJPUgkzCS8qIGVycm9yZigpIGNhbGxlZCAqLwotI2RlZmluZSBMTEVBVkUJNAkvKiB1bnRyYXBwYWJsZSBleGl0L2Vycm9yICovCi0jZGVmaW5lIExJTlRSCTUJLyogXkMgbm90aWNlZCAqLwotI2RlZmluZSBMQlJFQUsJNgkvKiBicmVhayBzdGF0ZW1lbnQgKi8KLSNkZWZpbmUgTENPTlRJTgk3CS8qIGNvbnRpbnVlIHN0YXRlbWVudCAqLwotI2RlZmluZSBMU0hFTEwJOAkvKiByZXR1cm4gdG8gaW50ZXJhY3RpdmUgc2hlbGwoKSAqLwotI2RlZmluZSBMQUVYUFIJOQkvKiBlcnJvciBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24gKi8KLQotLyoKLSAqIHNvbWUga2luZCBvZiBnbG9iYWwgc2hlbGwgc3RhdGUsIGZvciBjaGFuZ2VfcmFuZG9tKCkgbW9zdGx5Ci0gKi8KLQotRVhURVJOIHN0cnVjdCBta3NoX2tzaHN0YXRlX3YgewotCS8qIGZvciBjaGFuZ2VfcmFuZG9tICovCi0Jc3RydWN0IHRpbWV2YWwgY3JfdHY7CS8qIHRpbWVzdGFtcCAqLwotCWNvbnN0IHZvaWQgKmNyX2RwOwkvKiBhcmd1bWVudCBhZGRyZXNzICovCi0Jc2l6ZV90IGNyX2RzejsJCS8qIGFyZ3VtZW50IGxlbmd0aCAqLwotCXVpbnQzMl90IGxjZ19zdGF0ZV87CS8qIHByZXZpb3VzIExDRyBzdGF0ZSAqLwotCS8qIGdsb2JhbCBzdGF0ZSAqLwotCXBpZF90IHByb2NwaWRfOwkJLyogUElEIG9mIGV4ZWN1dGluZyBwcm9jZXNzICovCi0JaW50IGV4c3RhdF87CQkvKiBleGl0IHN0YXR1cyAqLwotCWludCBzdWJzdF9leHN0YXRfOwkvKiBleGl0IHN0YXR1cyBvZiBsYXN0ICQoLi4pL2AuLmAgKi8KLQlzdHJ1Y3QgZW52IGVudl87CS8qIHRvcC1sZXZlbCBwYXJzaW5nICYgZXhlY3V0aW9uIGVudi4gKi8KLQl1aW50OF90IHNoZWxsX2ZsYWdzX1tGTkZMQUdTXTsKLX0ga3Noc3RhdGVfdjsKLUVYVEVSTiBzdHJ1Y3QgbWtzaF9rc2hzdGF0ZV9mIHsKLQljb25zdCBjaGFyICprc2huYW1lXzsJLyogJDAgKi8KLQlwaWRfdCBrc2hwaWRfOwkJLyogJCQsIHNoZWxsIFBJRCAqLwotCXBpZF90IGtzaHBncnBfOwkJLyogcHJvY2VzcyBncm91cCBvZiBzaGVsbCAqLwotCXVpZF90IGtzaGV1aWRfOwkJLyogZWZmZWN0aXZlIFVJRCBvZiBzaGVsbCAqLwotCXBpZF90IGtzaHBwaWRfOwkJLyogUElEIG9mIHBhcmVudCBvZiBzaGVsbCAqLwotCXVpbnQzMl90IGg7CQkvKiBzb21lIGtpbmQgb2YgaGFzaCAqLwotfSBrc2hzdGF0ZV9mOwotI2RlZmluZSBrc2huYW1lCQlrc2hzdGF0ZV9mLmtzaG5hbWVfCi0jZGVmaW5lIGtzaHBpZAkJa3Noc3RhdGVfZi5rc2hwaWRfCi0jZGVmaW5lIHByb2NwaWQJCWtzaHN0YXRlX3YucHJvY3BpZF8KLSNkZWZpbmUga3NocGdycAkJa3Noc3RhdGVfZi5rc2hwZ3JwXwotI2RlZmluZSBrc2hldWlkCQlrc2hzdGF0ZV9mLmtzaGV1aWRfCi0jZGVmaW5lIGtzaHBwaWQJCWtzaHN0YXRlX2Yua3NocHBpZF8KLSNkZWZpbmUgZXhzdGF0CQlrc2hzdGF0ZV92LmV4c3RhdF8KLSNkZWZpbmUgc3Vic3RfZXhzdGF0CWtzaHN0YXRlX3Yuc3Vic3RfZXhzdGF0XwotCi0vKiBldmlsIGhhY2s6IHJldHVybiBoYXNoKGtzaHN0YXRlX2YgY29uY2F0IChrc2hzdGF0ZV9mJy5oOj1oYXNoKGFyZykpKSAqLwotdWludDMyX3QgZXZpbGhhc2goY29uc3QgY2hhciAqKTsKLQotCi0vKiBvcHRpb24gcHJvY2Vzc2luZyAqLwotI2RlZmluZSBPRl9DTURMSU5FCTB4MDEJLyogY29tbWFuZCBsaW5lICovCi0jZGVmaW5lIE9GX1NFVAkJMHgwMgkvKiBzZXQgYnVpbHRpbiAqLwotI2RlZmluZSBPRl9TUEVDSUFMCTB4MDQJLyogYSBzcGVjaWFsIHZhcmlhYmxlIGNoYW5naW5nICovCi0jZGVmaW5lIE9GX0lOVEVSTkFMCTB4MDgJLyogc2V0IGludGVybmFsbHkgYnkgc2hlbGwgKi8KLSNkZWZpbmUgT0ZfRklSU1RUSU1FCTB4MTAJLyogYXMgZWFybHkgYXMgcG9zc2libGUsIG9uY2UgKi8KLSNkZWZpbmUgT0ZfQU5ZCQkoT0ZfQ01ETElORSB8IE9GX1NFVCB8IE9GX1NQRUNJQUwgfCBPRl9JTlRFUk5BTCkKLQotc3RydWN0IHNob3B0aW9uIHsKLQljb25zdCBjaGFyICpuYW1lOwkvKiBsb25nIG5hbWUgb2Ygb3B0aW9uICovCi0JY2hhciBjOwkJCS8qIGNoYXJhY3RlciBmbGFnIChpZiBhbnkpICovCi0JdW5zaWduZWQgY2hhciBmbGFnczsJLyogT0ZfKiAqLwotfTsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hvcHRpb24gb3B0aW9uc1tdOwotCi0vKiBudWxsIHZhbHVlIGZvciB2YXJpYWJsZTsgY29tcGFyaXNpb24gcG9pbnRlciBmb3IgdW5zZXQgKi8KLUVYVEVSTiBjaGFyIG51bGxbXSBJX18oIiIpOwotLyogaGVscGVycyBmb3Igc3RyaW5nIHBvb2xpbmcgKi8KLSNkZWZpbmUgVF9zeW5lcnIgInN5bnRheCBlcnJvciIKLUVYVEVSTiBjb25zdCBjaGFyIHJfZmNfZV9bXSBJX18oInI9ZmMgLWUgLSIpOwotI2RlZmluZSBmY19lXwkJKHJfZmNfZV8gKyAyKQkJLyogImZjIC1lIC0iICovCi0jZGVmaW5lIGZjX2VfbgkJNwkJCS8qIHN0cmxlbihmY19lXykgKi8KLUVYVEVSTiBjb25zdCBjaGFyIFRfbG9jYWxfdHlwZXNldFtdIElfXygibG9jYWw9dHlwZXNldCIpOwotI2RlZmluZSBUX190eXBlc2V0CShUX2xvY2FsX3R5cGVzZXQgKyA1KQkvKiAiPXR5cGVzZXQiICovCi0jZGVmaW5lIFRfdHlwZXNldAkoVF9sb2NhbF90eXBlc2V0ICsgNikJLyogInR5cGVzZXQiICovCi0KLWVudW0gdGVtcF90eXBlIHsKLQlUVF9IRVJFRE9DX0VYUCwJLyogZXhwYW5kZWQgaGVyZWRvYyAqLwotCVRUX0hJU1RfRURJVAkvKiB0ZW1wIGZpbGUgdXNlZCBmb3IgaGlzdG9yeSBlZGl0aW5nIChmYyAtZSkgKi8KLX07Ci10eXBlZGVmIGVudW0gdGVtcF90eXBlIFRlbXBfdHlwZTsKLS8qIHRlbXAvaGVyZWRvYyBmaWxlcy4gVGhlIGZpbGUgaXMgcmVtb3ZlZCB3aGVuIHRoZSBzdHJ1Y3QgaXMgZnJlZWQuICovCi1zdHJ1Y3QgdGVtcCB7Ci0Jc3RydWN0IHRlbXAgKm5leHQ7Ci0Jc3RydWN0IHNoZiAqc2hmOwotCWNoYXIgKm5hbWU7Ci0JaW50IHBpZDsJLyogcGlkIG9mIHByb2Nlc3MgcGFyc2VkIGhlcmUtZG9jICovCi0JVGVtcF90eXBlIHR5cGU7Ci19OwotCi0vKgotICogc3RkaW8gYW5kIG91ciBJTyByb3V0aW5lcwotICovCi0KLSNkZWZpbmUgc2hsX3NwYXJlCSgmc2hmX2lvYlswXSkJLyogZm9yIGNfcmVhZCgpL2NfcHJpbnQoKSAqLwotI2RlZmluZSBzaGxfc3Rkb3V0CSgmc2hmX2lvYlsxXSkKLSNkZWZpbmUgc2hsX291dAkJKCZzaGZfaW9iWzJdKQotRVhURVJOIGludCBzaGxfc3Rkb3V0X29rOwotCi0vKgotICogdHJhcCBoYW5kbGVycwotICovCi10eXBlZGVmIHN0cnVjdCB0cmFwIHsKLQljb25zdCBjaGFyICpuYW1lOwkvKiBzaG9ydCBuYW1lICovCi0JY29uc3QgY2hhciAqbWVzczsJLyogZGVzY3JpcHRpdmUgbmFtZSAqLwotCWNoYXIgKnRyYXA7CQkvKiB0cmFwIGNvbW1hbmQgKi8KLQlzaWdfdCBjdXJzaWc7CQkvKiBjdXJyZW50IGhhbmRsZXIgKHZhbGlkIGlmIFRGX09SSUdfKiBzZXQpICovCi0Jc2lnX3Qgc2h0cmFwOwkJLyogc2hlbGwgc2lnbmFsIGhhbmRsZXIgKi8KLQlpbnQgc2lnbmFsOwkJLyogc2lnbmFsIG51bWJlciAqLwotCWludCBmbGFnczsJCS8qIFRGXyogKi8KLQl2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc2V0OyAvKiB0cmFwIHBlbmRpbmcgKi8KLX0gVHJhcDsKLQotLyogdmFsdWVzIGZvciBUcmFwLmZsYWdzICovCi0jZGVmaW5lIFRGX1NIRUxMX1VTRVMJQklUKDApCS8qIHNoZWxsIHVzZXMgc2lnbmFsLCB1c2VyIGNhbid0IGNoYW5nZSAqLwotI2RlZmluZSBURl9VU0VSX1NFVAlCSVQoMSkJLyogdXNlciBoYXMgKHRyaWVkIHRvKSBzZXQgdHJhcCAqLwotI2RlZmluZSBURl9PUklHX0lHTglCSVQoMikJLyogb3JpZ2luYWwgYWN0aW9uIHdhcyBTSUdfSUdOICovCi0jZGVmaW5lIFRGX09SSUdfREZMCUJJVCgzKQkvKiBvcmlnaW5hbCBhY3Rpb24gd2FzIFNJR19ERkwgKi8KLSNkZWZpbmUgVEZfRVhFQ19JR04JQklUKDQpCS8qIHJlc3RvcmUgU0lHX0lHTiBqdXN0IGJlZm9yZSBleGVjICovCi0jZGVmaW5lIFRGX0VYRUNfREZMCUJJVCg1KQkvKiByZXN0b3JlIFNJR19ERkwganVzdCBiZWZvcmUgZXhlYyAqLwotI2RlZmluZSBURl9ERkxfSU5UUglCSVQoNikJLyogd2hlbiByZWNlaXZlZCwgZGVmYXVsdCBhY3Rpb24gaXMgTElOVFIgKi8KLSNkZWZpbmUgVEZfVFRZX0lOVFIJQklUKDcpCS8qIHR0eSBnZW5lcmF0ZWQgc2lnbmFsIChzZWUgal93YWl0aikgKi8KLSNkZWZpbmUgVEZfQ0hBTkdFRAlCSVQoOCkJLyogdXNlZCBieSBydW50cmFwKCkgdG8gZGV0ZWN0IHRyYXAgY2hhbmdlcyAqLwotI2RlZmluZSBURl9GQVRBTAlCSVQoOSkJLyogY2F1c2VzIHRlcm1pbmF0aW9uIGlmIG5vdCB0cmFwcGVkICovCi0KLS8qIHZhbHVlcyBmb3Igc2V0c2lnKCkvc2V0ZXhlY3NpZygpIGZsYWdzIGFyZ3VtZW50ICovCi0jZGVmaW5lIFNTX1JFU1RPUkVfTUFTSwkweDMJLyogaG93IHRvIHJlc3RvcmUgYSBzaWduYWwgYmVmb3JlIGFuIGV4ZWMoKSAqLwotI2RlZmluZSBTU19SRVNUT1JFX0NVUlIJMAkvKiBsZWF2ZSBjdXJyZW50IGhhbmRsZXIgaW4gcGxhY2UgKi8KLSNkZWZpbmUgU1NfUkVTVE9SRV9PUklHCTEJLyogcmVzdG9yZSBvcmlnaW5hbCBoYW5kbGVyICovCi0jZGVmaW5lIFNTX1JFU1RPUkVfREZMCTIJLyogcmVzdG9yZSB0byBTSUdfREZMICovCi0jZGVmaW5lIFNTX1JFU1RPUkVfSUdOCTMJLyogcmVzdG9yZSB0byBTSUdfSUdOICovCi0jZGVmaW5lIFNTX0ZPUkNFCUJJVCgzKQkvKiBzZXQgc2lnbmFsIGV2ZW4gaWYgb3JpZ2luYWwgc2lnbmFsIGlnbm9yZWQgKi8KLSNkZWZpbmUgU1NfVVNFUgkJQklUKDQpCS8qIHVzZXIgaXMgZG9pbmcgdGhlIHNldCAoaWUsIHRyYXAgY29tbWFuZCkgKi8KLSNkZWZpbmUgU1NfU0hUUkFQCUJJVCg1KQkvKiB0cmFwIGZvciBpbnRlcm5hbCB1c2UgKEFMUk0sIENITEQsIFdJTkNIKSAqLwotCi0jZGVmaW5lIFNJR0VYSVRfCTAJLyogZm9yIHRyYXAgRVhJVCAqLwotI2RlZmluZSBTSUdFUlJfCQlOU0lHCS8qIGZvciB0cmFwIEVSUiAqLwotCi1FWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IHRyYXA7CS8qIHRyYXBzIHBlbmRpbmc/ICovCi1FWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IGludHJzaWc7CS8qIHBlbmRpbmcgdHJhcCBpbnRlcnJ1cHRzIGNvbW1hbmQgKi8KLUVYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZmF0YWxfdHJhcDsvKiByZWNlaXZlZCBhIGZhdGFsIHNpZ25hbCAqLwotZXh0ZXJuCVRyYXAJc2lndHJhcHNbTlNJRysxXTsKLQotLyogZ290X3dpbmNoID0gMSB3aGVuIHdlIG5lZWQgdG8gcmUtYWRqdXN0IHRoZSB3aW5kb3cgc2l6ZSAqLwotI2lmZGVmIFNJR1dJTkNICi1FWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IGdvdF93aW5jaCBJX18oMSk7Ci0jZWxzZQotI2RlZmluZSBnb3Rfd2luY2gJdHJ1ZQotI2VuZGlmCi0KLS8qCi0gKiBUTU9VVCBzdXBwb3J0Ci0gKi8KLS8qIHZhbHVlcyBmb3Iga3NoX3Rtb3V0X3N0YXRlICovCi1lbnVtIHRtb3V0X2VudW0gewotCVRNT1VUX0VYRUNVVElORyA9IDAsCS8qIGV4ZWN1dGluZyBjb21tYW5kcyAqLwotCVRNT1VUX1JFQURJTkcsCQkvKiB3YWl0aW5nIGZvciBpbnB1dCAqLwotCVRNT1VUX0xFQVZJTkcJCS8qIGhhdmUgdGltZWQgb3V0ICovCi19OwotRVhURVJOIHVuc2lnbmVkIGludCBrc2hfdG1vdXQ7Ci1FWFRFUk4gZW51bSB0bW91dF9lbnVtIGtzaF90bW91dF9zdGF0ZSBJX18oVE1PVVRfRVhFQ1VUSU5HKTsKLQotLyogRm9yICJZb3UgaGF2ZSBzdG9wcGVkIGpvYnMiIG1lc3NhZ2UgKi8KLUVYVEVSTiBpbnQgcmVhbGx5X2V4aXQ7Ci0KLS8qCi0gKiBmYXN0IGNoYXJhY3RlciBjbGFzc2VzCi0gKi8KLSNkZWZpbmUgQ19BTFBIQQkgQklUKDApCQkvKiBhLXpfQS1aICovCi0jZGVmaW5lIENfRElHSVQJIEJJVCgxKQkJLyogMC05ICovCi0jZGVmaW5lIENfTEVYMQkgQklUKDIpCQkvKiBcdCBcblwwfCY7PD4oKSAqLwotI2RlZmluZSBDX1ZBUjEJIEJJVCgzKQkJLyogKkAjISQtPyAqLwotI2RlZmluZSBDX0lGU1dTCSBCSVQoNCkJCS8qIFx0IFxuIChJRlMgd2hpdGUgc3BhY2UpICovCi0jZGVmaW5lIENfU1VCT1AxIEJJVCg1KQkJLyogIj0tKz8iICovCi0jZGVmaW5lIENfUVVPVEUJIEJJVCg2KQkJLyogXHRcbiAiIyQmJygpKjs8PT4/W1xdYHwgKG5lZWRpbmcgcXVvdGluZykgKi8KLSNkZWZpbmUgQ19JRlMJIEJJVCg3KQkJLyogJElGUyAqLwotI2RlZmluZSBDX1NVQk9QMiBCSVQoOCkJCS8qICIjJSIgKG1hZ2ljLCBzZWUgYmVsb3cpICovCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGNodHlwZXNbXTsKLQotI2RlZmluZSBjdHlwZShjLCB0KQkhISggKCh0KSA9PSBDX1NVQk9QMikgPwkJCQlcCi0JCQkgICAgKCgoYykgPT0gJyMnIHx8IChjKSA9PSAnJScpID8gMSA6IDApIDoJXAotCQkJICAgIChjaHR5cGVzWyh1bnNpZ25lZCBjaGFyKShjKV0mKHQpKSApCi0jZGVmaW5lIGtzaF9pc2FscGh4KGMpCWN0eXBlKChjKSwgQ19BTFBIQSkKLSNkZWZpbmUga3NoX2lzYWxudXgoYykJY3R5cGUoKGMpLCBDX0FMUEhBIHwgQ19ESUdJVCkKLQotRVhURVJOIGludCBpZnMwIElfXygnICcpOwkvKiBmb3IgIiQqIiAqLwotCi0vKiBBcmd1bWVudCBwYXJzaW5nIGZvciBidWlsdC1pbiBjb21tYW5kcyBhbmQgZ2V0b3B0cyBjb21tYW5kICovCi0KLS8qIFZhbHVlcyBmb3IgR2V0b3B0LmZsYWdzICovCi0jZGVmaW5lIEdGX0VSUk9SCUJJVCgwKQkvKiBjYWxsIGVycm9yZigpIGlmIHRoZXJlIGlzIGFuIGVycm9yICovCi0jZGVmaW5lIEdGX1BMVVNPUFQJQklUKDEpCS8qIGFsbG93ICtjIGFzIGFuIG9wdGlvbiAqLwotI2RlZmluZSBHRl9OT05BTUUJQklUKDIpCS8qIGRvbid0IHByaW50IGFyZ3ZbMF0gaW4gZXJyb3JzICovCi0KLS8qIFZhbHVlcyBmb3IgR2V0b3B0LmluZm8gKi8KLSNkZWZpbmUgR0lfTUlOVVMJQklUKDApCS8qIGFuIG9wdGlvbiBzdGFydGVkIHdpdGggLS4uLiAqLwotI2RlZmluZSBHSV9QTFVTCQlCSVQoMSkJLyogYW4gb3B0aW9uIHN0YXJ0ZWQgd2l0aCArLi4uICovCi0jZGVmaW5lIEdJX01JTlVTTUlOVVMJQklUKDIpCS8qIGFyZ3VtZW50cyB3ZXJlIGVuZGVkIHdpdGggLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNvbnN0IGNoYXIJKm9wdGFyZzsKLQlpbnQJCW9wdGluZDsKLQlpbnQJCXVvcHRpbmQ7Lyogd2hhdCB1c2VyIHNlZXMgaW4gJE9QVElORCAqLwotCWludAkJZmxhZ3M7CS8qIHNlZSBHRl8qICovCi0JaW50CQlpbmZvOwkvKiBzZWUgR0lfKiAqLwotCXVuc2lnbmVkIGludAlwOwkvKiAwIG9yIGluZGV4IGludG8gYXJndltvcHRpbmQgLSAxXSAqLwotCWNoYXIJCWJ1ZlsyXTsJLyogZm9yIGJhZCBvcHRpb24gT1BUQVJHIHZhbHVlICovCi19IEdldG9wdDsKLQotRVhURVJOIEdldG9wdCBidWlsdGluX29wdDsJLyogZm9yIHNoZWxsIGJ1aWx0aW4gY29tbWFuZHMgKi8KLUVYVEVSTiBHZXRvcHQgdXNlcl9vcHQ7CQkvKiBwYXJzaW5nIHN0YXRlIGZvciBnZXRvcHRzIGJ1aWx0aW4gY29tbWFuZCAqLwotCi0vKiBUaGlzIGZvciBjby1wcm9jZXNzZXMgKi8KLQotdHlwZWRlZiBpbnQzMl90IENvcHJvY19pZDsgLyogc29tZXRoaW5nIHRoYXQgd29uJ3QgKHJlYWxpc3RpY2x5KSB3cmFwICovCi1zdHJ1Y3QgY29wcm9jIHsKLQl2b2lkICpqb2I7CS8qIDAgb3Igam9iIG9mIGNvLXByb2Nlc3MgdXNpbmcgaW5wdXQgcGlwZSAqLwotCWludCByZWFkOwkvKiBwaXBlIGZyb20gY28tcHJvY2VzcydzIHN0ZG91dCAqLwotCWludCByZWFkdzsJLyogb3RoZXIgc2lkZSBvZiByZWFkIChzYXZlZCB0ZW1wb3JhcmlseSkgKi8KLQlpbnQgd3JpdGU7CS8qIHBpcGUgdG8gY28tcHJvY2VzcydzIHN0ZGluICovCi0JaW50IG5qb2JzOwkvKiBudW1iZXIgb2YgbGl2ZSBqb2JzIHVzaW5nIG91dHB1dCBwaXBlICovCi0JQ29wcm9jX2lkIGlkOwkvKiBpZCBvZiBjdXJyZW50IG91dHB1dCBwaXBlICovCi19OwotRVhURVJOIHN0cnVjdCBjb3Byb2MgY29wcm9jOwotCi0vKiBVc2VkIGluIGpvYnMuYyBhbmQgYnkgY29wcm9jZXNzIHN0dWZmIGluIGV4ZWMuYyAqLwotRVhURVJOIHNpZ3NldF90CQlzbV9kZWZhdWx0LCBzbV9zaWdjaGxkOwotCi0vKiBuYW1lIG9mIGNhbGxlZCBidWlsdGluIGZ1bmN0aW9uICh1c2VkIGJ5IGVycm9yIGZ1bmN0aW9ucykgKi8KLUVYVEVSTiBjb25zdCBjaGFyICpidWlsdGluX2FyZ3YwOwotRVhURVJOIFRmbGFnIGJ1aWx0aW5fZmxhZzsJLyogZmxhZ3Mgb2YgY2FsbGVkIGJ1aWx0aW4gKFNQRUNfQkksIGV0Yy4pICovCi0KLS8qIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhbWUgKi8KLUVYVEVSTiBjaGFyCSpjdXJyZW50X3dkOwotRVhURVJOIHNpemVfdAljdXJyZW50X3dkX3NpemU7Ci0KLS8qIE1pbmltdW0gcmVxdWlyZWQgc3BhY2UgdG8gd29yayB3aXRoIG9uIGEgbGluZSAtIGlmIHRoZSBwcm9tcHQgbGVhdmVzIGxlc3MKLSAqIHNwYWNlIHRoYW4gdGhpcyBvbiBhIGxpbmUsIHRoZSBwcm9tcHQgaXMgdHJ1bmNhdGVkLgotICovCi0jZGVmaW5lIE1JTl9FRElUX1NQQUNFCTcKLS8qIE1pbmltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgeF9jb2xzOiAyIGZvciBwcm9tcHQsIDMgZm9yICIgPCAiIGF0IGVuZCBvZiBsaW5lCi0gKi8KLSNkZWZpbmUgTUlOX0NPTFMJKDIgKyBNSU5fRURJVF9TUEFDRSArIDMpCi0jZGVmaW5lIE1JTl9MSU5TCTMKLUVYVEVSTiBta3NoX2FyaV90IHhfY29scyBJX18oODApOwkvKiB0dHkgY29sdW1ucyAqLwotRVhURVJOIG1rc2hfYXJpX3QgeF9saW5zIElfXygtMSk7CS8qIHR0eSBsaW5lcyAqLwotCi0vKiBUaGVzZSB0byBhdm9pZCBicmFja2V0IG1hdGNoaW5nIHByb2JsZW1zICovCi0jZGVmaW5lIE9QQVJFTgknKCcKLSNkZWZpbmUgQ1BBUkVOCScpJwotI2RlZmluZSBPQlJBQ0sJJ1snCi0jZGVmaW5lIENCUkFDSwknXScKLSNkZWZpbmUgT0JSQUNFCSd7JwotI2RlZmluZSBDQlJBQ0UJJ30nCi0KLS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbSAoY29tbW9uKSBwcm9maWxlICovCi0jZGVmaW5lIEtTSF9TWVNURU1fUFJPRklMRSAiL2V0Yy9wcm9maWxlIgotCi0vKiBVc2VkIGJ5IHZfZXZhbHVhdGUoKSBhbmQgc2V0c3RyKCkgdG8gY29udHJvbCBhY3Rpb24gd2hlbiBlcnJvciBvY2N1cnMgKi8KLSNkZWZpbmUgS1NIX1VOV0lORF9FUlJPUgkwCS8qIHVud2luZCB0aGUgc3RhY2sgKGxvbmdqbXApICovCi0jZGVmaW5lIEtTSF9SRVRVUk5fRVJST1IJMQkvKiByZXR1cm4gMS8wIGZvciBzdWNjZXNzL2ZhaWx1cmUgKi8KLQotLyoKLSAqIFNoZWxsIGZpbGUgSS9PIHJvdXRpbmVzCi0gKi8KLQotI2RlZmluZSBTSEZfQlNJWkUJNTEyCi0KLSNkZWZpbmUgc2hmX2ZpbGVubyhzaGYpCSgoc2hmKS0+ZmQpCi0jZGVmaW5lIHNoZl9zZXRmaWxlbm8oc2hmLG5mZCkJKChzaGYpLT5mZCA9IChuZmQpKQotI2lmZGVmIE1LU0hfU01BTEwKLWludCBzaGZfZ2V0YyhzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl9wdXRjKGludCwgc3RydWN0IHNoZiAqKTsKLSNlbHNlCi0jZGVmaW5lIHNoZl9nZXRjKHNoZikJCSgoc2hmKS0+cm5sZWZ0ID4gMCA/IFwKLQkJCQkgICAgKHNoZiktPnJubGVmdC0tLCAqKHNoZiktPnJwKysgOiBcCi0JCQkJICAgIHNoZl9nZXRjaGFyKHNoZikpCi0jZGVmaW5lIHNoZl9wdXRjKGMsIHNoZikJKChzaGYpLT53bmxlZnQgPT0gMCA/IFwKLQkJCQkgICAgc2hmX3B1dGNoYXIoKGMpLCAoc2hmKSkgOiBcCi0JCQkJICAgICgoc2hmKS0+d25sZWZ0LS0sICooc2hmKS0+d3ArKyA9IChjKSkpCi0jZW5kaWYKLSNkZWZpbmUgc2hmX2VvZihzaGYpCQkoKHNoZiktPmZsYWdzICYgU0hGX0VPRikKLSNkZWZpbmUgc2hmX2Vycm9yKHNoZikJCSgoc2hmKS0+ZmxhZ3MgJiBTSEZfRVJST1IpCi0jZGVmaW5lIHNoZl9lcnJubyhzaGYpCQkoKHNoZiktPmVycm5vXykKLSNkZWZpbmUgc2hmX2NsZWFyZXJyKHNoZikJKChzaGYpLT5mbGFncyAmPSB+KFNIRl9FT0YgfCBTSEZfRVJST1IpKQotCi0vKiBGbGFncyBwYXNzZWQgdG8gc2hmXypvcGVuKCkgKi8KLSNkZWZpbmUgU0hGX1JECQkweDAwMDEKLSNkZWZpbmUgU0hGX1dSCQkweDAwMDIKLSNkZWZpbmUgU0hGX1JEV1IJKFNIRl9SRHxTSEZfV1IpCi0jZGVmaW5lIFNIRl9BQ0NNT0RFCTB4MDAwMwkJLyogbWFzayAqLwotI2RlZmluZSBTSEZfR0VURkwJMHgwMDA0CQkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgUkQvV1IgZmxhZ3MgKi8KLSNkZWZpbmUgU0hGX1VOQlVGCTB4MDAwOAkJLyogdW5idWZmZXJlZCBJL08gKi8KLSNkZWZpbmUgU0hGX0NMRVhFQwkweDAwMTAJCS8qIHNldCBjbG9zZSBvbiBleGVjIGZsYWcgKi8KLSNkZWZpbmUgU0hGX01BUEhJCTB4MDAyMAkJLyogbWFrZSBmZCA+IEZEQkFTRSAoYW5kIGNsb3NlIG9yaWcpCi0JCQkJCSAqIChzaGZfb3BlbigpIG9ubHkpICovCi0jZGVmaW5lIFNIRl9EWU5BTUlDCTB4MDA0MAkJLyogc3RyaW5nOiBpbmNyZWFzZSBidWZmZXIgYXMgbmVlZGVkICovCi0jZGVmaW5lIFNIRl9JTlRFUlJVUFQJMHgwMDgwCQkvKiBFSU5UUiBpbiByZWFkL3dyaXRlIGNhdXNlcyBlcnJvciAqLwotLyogRmxhZ3MgdXNlZCBpbnRlcm5hbGx5ICovCi0jZGVmaW5lIFNIRl9TVFJJTkcJMHgwMTAwCQkvKiBhIHN0cmluZywgbm90IGEgZmlsZSAqLwotI2RlZmluZSBTSEZfQUxMT0NTCTB4MDIwMAkJLyogc2hmIGFuZCBzaGYtPmJ1ZiB3ZXJlIGFsbG9jKCllZCAqLwotI2RlZmluZSBTSEZfQUxMT0NCCTB4MDQwMAkJLyogc2hmLT5idWYgd2FzIGFsbG9jKCllZCAqLwotI2RlZmluZSBTSEZfRVJST1IJMHgwODAwCQkvKiByZWFkKCkvd3JpdGUoKSBlcnJvciAqLwotI2RlZmluZSBTSEZfRU9GCQkweDEwMDAJCS8qIHJlYWQgZW9mIChzdGlja3kpICovCi0jZGVmaW5lIFNIRl9SRUFESU5HCTB4MjAwMAkJLyogY3VycmVudGx5IHJlYWRpbmc6IHJubGVmdCxycCB2YWxpZCAqLwotI2RlZmluZSBTSEZfV1JJVElORwkweDQwMDAJCS8qIGN1cnJlbnRseSB3cml0aW5nOiB3bmxlZnQsd3AgdmFsaWQgKi8KLQotCi1zdHJ1Y3Qgc2hmIHsKLQlBcmVhICphcmVhcDsJCS8qIGFyZWEgc2hmL2J1ZiB3ZXJlIGFsbG9jYXRlZCBpbiAqLwotCXVuc2lnbmVkIGNoYXIgKnJwOwkvKiByZWFkOiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGNoYXIgKndwOwkvKiB3cml0ZTogY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KLQl1bnNpZ25lZCBjaGFyICpidWY7CS8qIGJ1ZmZlciAqLwotCWludCBmbGFnczsJCS8qIHNlZSBTSEZfKiAqLwotCWludCByYnNpemU7CQkvKiBzaXplIG9mIGJ1ZmZlciAoMSBpZiBTSEZfVU5CVUYpICovCi0JaW50IHJubGVmdDsJCS8qIHJlYWQ6IGhvdyBtdWNoIGRhdGEgbGVmdCBpbiBidWZmZXIgKi8KLQlpbnQgd2JzaXplOwkJLyogc2l6ZSBvZiBidWZmZXIgKDAgaWYgU0hGX1VOQlVGKSAqLwotCWludCB3bmxlZnQ7CQkvKiB3cml0ZTogaG93IG11Y2ggc3BhY2UgbGVmdCBpbiBidWZmZXIgKi8KLQlpbnQgZmQ7CQkJLyogZmlsZSBkZXNjcmlwdG9yICovCi0JaW50IGVycm5vXzsJCS8qIHNhdmVkIHZhbHVlIG9mIGVycm5vIGFmdGVyIGVycm9yICovCi0JaW50IGJzaXplOwkJLyogYWN0dWFsIHNpemUgb2YgYnVmICovCi19OwotCi1leHRlcm4gc3RydWN0IHNoZiBzaGZfaW9iW107Ci0KLXN0cnVjdCB0YWJsZSB7Ci0JQXJlYSAqYXJlYXA7CQkvKiBhcmVhIHRvIGFsbG9jYXRlIGVudHJpZXMgKi8KLQlzdHJ1Y3QgdGJsICoqdGJsczsJLyogaGFzaGVkIHRhYmxlIGl0ZW1zICovCi0Jc2hvcnQgc2l6ZSwgbmZyZWU7CS8qIGhhc2ggc2l6ZSAoYWx3YXlzIDJeXm4pLCBmcmVlIGVudHJpZXMgKi8KLX07Ci0KLXN0cnVjdCB0YmwgewkJCS8qIHRhYmxlIGl0ZW0gKi8KLQlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgZnJvbSAqLwotCXVuaW9uIHsKLQkJY2hhciAqczsJCS8qIHN0cmluZyAqLwotCQlta3NoX2FyaV90IGk7CQkvKiBpbnRlZ2VyICovCi0JCW1rc2hfdWFyaV90IHU7CQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi0JCWludCAoKmYpKGNvbnN0IGNoYXIgKiopOy8qIGludCBmdW5jdGlvbiAqLwotCQlzdHJ1Y3Qgb3AgKnQ7CQkvKiAiZnVuY3Rpb24iIHRyZWUgKi8KLQl9IHZhbDsJCQkvKiB2YWx1ZSAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHRibCAqYXJyYXk7CS8qIGFycmF5IHZhbHVlcyAqLwotCQljb25zdCBjaGFyICpmcGF0aDsJLyogdGVtcG9yYXJ5IHBhdGggdG8gdW5kZWYgZnVuY3Rpb24gKi8KLQl9IHU7Ci0JdW5pb24gewotCQlpbnQgZmllbGQ7CS8qIGZpZWxkIHdpdGggZm9yIC1MLy1SLy1aICovCi0JCWludCBlcnJub187CS8qIENFWEVDL0NUQUxJQVMgKi8KLQl9IHUyOwotCWludCB0eXBlOwkJLyogY29tbWFuZCB0eXBlIChzZWUgYmVsb3cpLCBiYXNlIChpZiBJTlRFR0VSKSwKLQkJCQkgKiBvciBvZmZzZXQgZnJvbSB2YWwucyBvZiB2YWx1ZSAoaWYgRVhQT1JUKSAqLwotCVRmbGFnIGZsYWc7CQkvKiBmbGFncyAqLwotCXVuaW9uIHsKLQkJdWludDMyX3QgaHZhbDsJCS8qIGhhc2gobmFtZSkgKi8KLQkJdWludDMyX3QgaW5kZXg7CQkvKiBpbmRleCBmb3IgYW4gYXJyYXkgKi8KLQl9IHVhOwotCWNoYXIgbmFtZVs0XTsJCS8qIG5hbWUgLS0gdmFyaWFibGUgbGVuZ3RoICovCi19OwotCi0vKiBjb21tb24gZmxhZyBiaXRzICovCi0jZGVmaW5lIEFMTE9DCQlCSVQoMCkJLyogdmFsLnMgaGFzIGJlZW4gYWxsb2NhdGVkICovCi0jZGVmaW5lIERFRklORUQJCUJJVCgxKQkvKiBpcyBkZWZpbmVkIGluIGJsb2NrICovCi0jZGVmaW5lIElTU0VUCQlCSVQoMikJLyogaGFzIHZhbHVlLCB2cC0+dmFsLltzaV0gKi8KLSNkZWZpbmUgRVhQT1JUCQlCSVQoMykJLyogZXhwb3J0ZWQgdmFyaWFibGUvZnVuY3Rpb24gKi8KLSNkZWZpbmUgVFJBQ0UJCUJJVCg0KQkvKiB2YXI6IHVzZXIgZmxhZ2dlZCwgZnVuYzogZXhlY3V0aW9uIHRyYWNpbmcgKi8KLS8qIChzdGFydCBub24tY29tbW9uIGZsYWdzIGF0IDgpICovCi0vKiBmbGFnIGJpdHMgdXNlZCBmb3IgdmFyaWFibGVzICovCi0jZGVmaW5lIFNQRUNJQUwJCUJJVCg4KQkvKiBQQVRILCBJRlMsIFNFQ09ORFMsIGV0YyAqLwotI2RlZmluZSBJTlRFR0VSCQlCSVQoOSkJLyogdmFsLmkgY29udGFpbnMgaW50ZWdlciB2YWx1ZSAqLwotI2RlZmluZSBSRE9OTFkJCUJJVCgxMCkJLyogcmVhZC1vbmx5IHZhcmlhYmxlICovCi0jZGVmaW5lIExPQ0FMCQlCSVQoMTEpCS8qIGZvciBsb2NhbCB0eXBlc2V0KCkgKi8KLSNkZWZpbmUgQVJSQVkJCUJJVCgxMykJLyogYXJyYXkgKi8KLSNkZWZpbmUgTEpVU1QJCUJJVCgxNCkJLyogbGVmdCBqdXN0aWZ5ICovCi0jZGVmaW5lIFJKVVNUCQlCSVQoMTUpCS8qIHJpZ2h0IGp1c3RpZnkgKi8KLSNkZWZpbmUgWkVST0ZJTAkJQklUKDE2KQkvKiAwIGZpbGxlZCBpZiBSSlVTVElGWSwgc3RyaXAgMHMgaWYgTEpVU1RJRlkgKi8KLSNkZWZpbmUgTENBU0VWCQlCSVQoMTcpCS8qIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSAqLwotI2RlZmluZSBVQ0FTRVZfQUwJQklUKDE4KSAvKiBjb252ZXJ0IHRvIHVwcGVyIGNhc2UgLyBhdXRvbG9hZCBmdW5jdGlvbiAqLwotI2RlZmluZSBJTlRfVQkJQklUKDE5KQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi0jZGVmaW5lIElOVF9MCQlCSVQoMjApCS8qIGxvbmcgaW50ZWdlciAobm8tb3ApICovCi0jZGVmaW5lIElNUE9SVAkJQklUKDIxKQkvKiBmbGFnIHRvIHR5cGVzZXQoKTogbm8gYXJyYXlzLCBtdXN0IGhhdmUgPSAqLwotI2RlZmluZSBMT0NBTF9DT1BZCUJJVCgyMikJLyogd2l0aCBMT0NBTCAtIGNvcHkgYXR0cnMgZnJvbSBleGlzdGluZyB2YXIgKi8KLSNkZWZpbmUgRVhQUklORVZBTAlCSVQoMjMpCS8qIGNvbnRlbnRzIGN1cnJlbnRseSBiZWluZyBldmFsdWF0ZWQgKi8KLSNkZWZpbmUgRVhQUkxWQUxVRQlCSVQoMjQpCS8qIHVzZWFibGUgYXMgbHZhbHVlICh0ZW1wIGZsYWcpICovCi0jZGVmaW5lIEFJTkRFWAkJQklUKDI1KSAvKiBhcnJheSBpbmRleCA+MCA9IHVhLmluZGV4IGZpbGxlZCBpbiAqLwotI2RlZmluZSBBU1NPQwkJQklUKDI2KSAvKiBBUlJBWSA/IGFzc29jaWF0aXZlIDogcmVmZXJlbmNlICovCi0vKiBmbGFnIGJpdHMgdXNlZCBmb3IgdGFsaWFzZXMvYnVpbHRpbnMvYWxpYXNlcy9rZXl3b3Jkcy9mdW5jdGlvbnMgKi8KLSNkZWZpbmUgS0VFUEFTTgkJQklUKDgpCS8qIGtlZXAgY29tbWFuZCBhc3NpZ25tZW50cyAoZWcsIHZhcj14IGNtZCkgKi8KLSNkZWZpbmUgRklOVVNFCQlCSVQoOSkJLyogZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgKi8KLSNkZWZpbmUgRkRFTEVURQkJQklUKDEwKQkvKiBmdW5jdGlvbiBkZWxldGVkIHdoaWxlIGl0IHdhcyBleGVjdXRpbmcgKi8KLSNkZWZpbmUgRktTSAkJQklUKDExKQkvKiBmdW5jdGlvbiBkZWZpbmVkIHdpdGggZnVuY3Rpb24geCAodnMgeCgpKSAqLwotI2RlZmluZSBTUEVDX0JJCQlCSVQoMTIpCS8qIGEgUE9TSVggc3BlY2lhbCBidWlsdGluICovCi0jZGVmaW5lIFJFR19CSQkJQklUKDEzKQkvKiBhIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbiAqLwotLyogQXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdGhlIHVzZXIgKHVzZWQgdG8gZGVjaWRlIGlmIGFuIHVuc2V0IHBhcmFtCi0gKiBzaG91bGQgYmUgcmVwb3RlZCBieSBzZXQvdHlwZXNldCkuIERvZXMgbm90IGluY2x1ZGUgQVJSQVkgb3IgTE9DQUwuCi0gKi8KLSNkZWZpbmUgVVNFUkFUVFJJQgkoRVhQT1JUfElOVEVHRVJ8UkRPTkxZfExKVVNUfFJKVVNUfFpFUk9GSUx8XAotCQkJICAgIExDQVNFVnxVQ0FTRVZfQUx8SU5UX1V8SU5UX0wpCi0KLSNkZWZpbmUgYXJyYXlpbmRleCh2cCkJKCh1bnNpZ25lZCBsb25nKSgodnApLT5mbGFnICYgQUlOREVYID8gXAotCQkJICAgICh2cCktPnVhLmluZGV4IDogMCkpCi0KLS8qIGNvbW1hbmQgdHlwZXMgKi8KLSNkZWZpbmUgQ05PTkUJCTAJLyogdW5kZWZpbmVkICovCi0jZGVmaW5lIENTSEVMTAkJMQkvKiBidWlsdC1pbiAqLwotI2RlZmluZSBDRlVOQwkJMgkvKiBmdW5jdGlvbiAqLwotI2RlZmluZSBDRVhFQwkJNAkvKiBleGVjdXRhYmxlIGNvbW1hbmQgKi8KLSNkZWZpbmUgQ0FMSUFTCQk1CS8qIGFsaWFzICovCi0jZGVmaW5lIENLRVlXRAkJNgkvKiBrZXl3b3JkICovCi0jZGVmaW5lIENUQUxJQVMJCTcJLyogdHJhY2tlZCBhbGlhcyAqLwotCi0vKiBGbGFncyBmb3IgZmluZGNvbSgpL2NvbWV4ZWMoKSAqLwotI2RlZmluZSBGQ19TUEVDQkkJQklUKDApCS8qIHNwZWNpYWwgYnVpbHRpbiAqLwotI2RlZmluZSBGQ19GVU5DCQlCSVQoMSkJLyogZnVuY3Rpb24gYnVpbHRpbiAqLwotI2RlZmluZSBGQ19SRUdCSQlCSVQoMikJLyogcmVndWxhciBidWlsdGluICovCi0jZGVmaW5lIEZDX1VOUkVHQkkJQklUKDMpCS8qIHVuLXJlZ3VsYXIgYnVpbHRpbiAoIXNwZWNpYWwsIXJlZ3VsYXIpICovCi0jZGVmaW5lIEZDX0JJCQkoRkNfU1BFQ0JJfEZDX1JFR0JJfEZDX1VOUkVHQkkpCi0jZGVmaW5lIEZDX1BBVEgJCUJJVCg0KQkvKiBkbyBwYXRoIHNlYXJjaCAqLwotI2RlZmluZSBGQ19ERUZQQVRICUJJVCg1KQkvKiB1c2UgZGVmYXVsdCBwYXRoIGluIHBhdGggc2VhcmNoICovCi0KLQotI2RlZmluZSBBRl9BUkdWX0FMTE9DCTB4MQkvKiBhcmd2W10gYXJyYXkgYWxsb2NhdGVkICovCi0jZGVmaW5lIEFGX0FSR1NfQUxMT0NFRAkweDIJLyogYXJndW1lbnQgc3RyaW5ncyBhbGxvY2F0ZWQgKi8KLSNkZWZpbmUgQUlfQVJHVihhLCBpKQkoKGkpID09IDAgPyAoYSkuYXJndlswXSA6IChhKS5hcmd2WyhpKSAtIChhKS5za2lwXSkKLSNkZWZpbmUgQUlfQVJHQyhhKQkoKGEpLmFyZ2NfIC0gKGEpLnNraXApCi0KLS8qIEFyZ3VtZW50IGluZm8uIFVzZWQgZm9yICQjLCAkKiBmb3Igc2hlbGwsIGZ1bmN0aW9ucywgaW5jbHVkZXMsIGV0Yy4gKi8KLXN0cnVjdCBhcmdfaW5mbyB7Ci0JY29uc3QgY2hhciAqKmFyZ3Y7Ci0JaW50IGZsYWdzOwkvKiBBRl8qICovCi0JaW50IGFyZ2NfOwotCWludCBza2lwOwkvKiBmaXJzdCBhcmcgaXMgYXJndlswXSwgc2Vjb25kIGlzIGFyZ3ZbMSArIHNraXBdICovCi19OwotCi0vKgotICogYWN0aXZhdGlvbiByZWNvcmQgZm9yIGZ1bmN0aW9uIGJsb2NrcwotICovCi1zdHJ1Y3QgYmxvY2sgewotCUFyZWEgYXJlYTsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgdGhpbmdzICovCi0JY29uc3QgY2hhciAqKmFyZ3Y7Ci0JY2hhciAqZXJyb3I7CQkvKiBlcnJvciBoYW5kbGVyICovCi0JY2hhciAqZXhpdDsJCS8qIGV4aXQgaGFuZGxlciAqLwotCXN0cnVjdCBibG9jayAqbmV4dDsJLyogZW5jbG9zaW5nIGJsb2NrICovCi0Jc3RydWN0IHRhYmxlIHZhcnM7CS8qIGxvY2FsIHZhcmlhYmxlcyAqLwotCXN0cnVjdCB0YWJsZSBmdW5zOwkvKiBsb2NhbCBmdW5jdGlvbnMgKi8KLQlHZXRvcHQgZ2V0b3B0c19zdGF0ZTsKLQlpbnQgYXJnYzsKLQlpbnQgZmxhZ3M7CQkvKiBzZWUgQkZfKiAqLwotfTsKLQotLyogVmFsdWVzIGZvciBzdHJ1Y3QgYmxvY2suZmxhZ3MgKi8KLSNkZWZpbmUgQkZfRE9HRVRPUFRTCUJJVCgwKQkvKiBzYXZlL3Jlc3RvcmUgZ2V0b3B0cyBzdGF0ZSAqLwotCi0vKgotICogVXNlZCBieSBrdHdhbGsoKSBhbmQga3RuZXh0KCkgcm91dGluZXMuCi0gKi8KLXN0cnVjdCB0c3RhdGUgewotCXN0cnVjdCB0YmwgKipuZXh0OwotCXNzaXplX3QgbGVmdDsKLX07Ci0KLUVYVEVSTiBzdHJ1Y3QgdGFibGUgdGFsaWFzZXM7CS8qIHRyYWNrZWQgYWxpYXNlcyAqLwotRVhURVJOIHN0cnVjdCB0YWJsZSBidWlsdGluczsJLyogYnVpbHQtaW4gY29tbWFuZHMgKi8KLUVYVEVSTiBzdHJ1Y3QgdGFibGUgYWxpYXNlczsJLyogYWxpYXNlcyAqLwotRVhURVJOIHN0cnVjdCB0YWJsZSBrZXl3b3JkczsJLyoga2V5d29yZHMgKi8KLSNpZm5kZWYgTUtTSF9OT1BXTkFNCi1FWFRFUk4gc3RydWN0IHRhYmxlIGhvbWVkaXJzOwkvKiBob21lZGlyKCkgY2FjaGUgKi8KLSNlbmRpZgotCi1zdHJ1Y3QgYnVpbHRpbiB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgKCpmdW5jKShjb25zdCBjaGFyICoqKTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnVpbHRpbiBta3NoYnVpbHRpbnNbXTsKLQotLyogdmFsdWVzIGZvciBzZXRfcHJvbXB0KCkgKi8KLSNkZWZpbmUgUFMxCTAJLyogY29tbWFuZCAqLwotI2RlZmluZSBQUzIJMQkvKiBjb21tYW5kIGNvbnRpbnVhdGlvbiAqLwotCi1FWFRFUk4gY2hhciAqcGF0aDsJCS8qIGNvcHkgb2YgZWl0aGVyIFBBVEggb3IgZGVmX3BhdGggKi8KLUVYVEVSTiBjb25zdCBjaGFyICpkZWZfcGF0aDsJLyogcGF0aCB0byB1c2UgaWYgUEFUSCBub3Qgc2V0ICovCi1FWFRFUk4gY2hhciAqdG1wZGlyOwkJLyogVE1QRElSIHZhbHVlICovCi1FWFRFUk4gY29uc3QgY2hhciAqcHJvbXB0OwotRVhURVJOIGludCBjdXJfcHJvbXB0OwkJLyogUFMxIG9yIFBTMiAqLwotRVhURVJOIGludCBjdXJyZW50X2xpbmVubzsJLyogTElORU5PIHZhbHVlICovCi0KLSNkZWZpbmUgTk9CTE9DSwkoKHN0cnVjdCBvcCAqKU5VTEwpCi0jZGVmaW5lIE5PV09SRAkoKGNoYXIgKilOVUxMKQotI2RlZmluZSBOT1dPUkRTCSgoY2hhciAqKilOVUxMKQotCi0vKgotICogRGVzY3JpcHRpb24gb2YgYSBjb21tYW5kIG9yIGFuIG9wZXJhdGlvbiBvbiBjb21tYW5kcy4KLSAqLwotc3RydWN0IG9wIHsKLQljb25zdCBjaGFyICoqYXJnczsJCS8qIGFyZ3VtZW50cyB0byBhIGNvbW1hbmQgKi8KLQljaGFyICoqdmFyczsJCQkvKiB2YXJpYWJsZSBhc3NpZ25tZW50cyAqLwotCXN0cnVjdCBpb3dvcmQgKippb2FjdDsJCS8qIElPIGFjdGlvbnMgKGVnLCA8ID4gPj4pICovCi0Jc3RydWN0IG9wICpsZWZ0LCAqcmlnaHQ7CS8qIGRlc2NlbmRlbnRzICovCi0JY2hhciAqc3RyOwkJCS8qIHdvcmQgZm9yIGNhc2U7IGlkZW50aWZpZXIgZm9yIGZvciwKLQkJCQkJICogc2VsZWN0LCBhbmQgZnVuY3Rpb25zOwotCQkJCQkgKiBwYXRoIHRvIGV4ZWN1dGUgZm9yIFRFWEVDOwotCQkJCQkgKiB0aW1lIGhvb2sgZm9yIFRDT00uCi0JCQkJCSAqLwotCWludCBsaW5lbm87CQkJLyogVENPTS9URlVOQzogTElORU5PIGZvciB0aGlzICovCi0Jc2hvcnQgdHlwZTsJCQkvKiBvcGVyYXRpb24gdHlwZSwgc2VlIGJlbG93ICovCi0JdW5pb24geyAvKiBXQVJOSU5HOiBuZXd0cCgpLCB0Y29weSgpIHVzZSBldmFsZmxhZ3MgPSAwIHRvIGNsZWFyIHVuaW9uICovCi0JCXNob3J0IGV2YWxmbGFnczsJLyogVENPTTogYXJnIGV4cGFuc2lvbiBldmFsKCkgZmxhZ3MgKi8KLQkJc2hvcnQga3NoX2Z1bmM7CQkvKiBURlVOQzogZnVuY3Rpb24geCAodnMgeCgpKSAqLwotCX0gdTsKLX07Ci0KLS8qIFRyZWUudHlwZSB2YWx1ZXMgKi8KLSNkZWZpbmUgVEVPRgkJMAotI2RlZmluZSBUQ09NCQkxCS8qIGNvbW1hbmQgKi8KLSNkZWZpbmUgVFBBUkVOCQkyCS8qIChjLWxpc3QpICovCi0jZGVmaW5lIFRQSVBFCQkzCS8qIGEgfCBiICovCi0jZGVmaW5lIFRMSVNUCQk0CS8qIGEgOyBiICovCi0jZGVmaW5lIFRPUgkJNQkvKiB8fCAqLwotI2RlZmluZSBUQU5ECQk2CS8qICYmICovCi0jZGVmaW5lIFRCQU5HCQk3CS8qICEgKi8KLSNkZWZpbmUgVERCUkFDS0VUCTgJLyogW1sgLi4gXV0gKi8KLSNkZWZpbmUgVEZPUgkJOQotI2RlZmluZSBUU0VMRUNUCQkxMAotI2RlZmluZSBUQ0FTRQkJMTEKLSNkZWZpbmUgVElGCQkxMgotI2RlZmluZSBUV0hJTEUJCTEzCi0jZGVmaW5lIFRVTlRJTAkJMTQKLSNkZWZpbmUgVEVMSUYJCTE1Ci0jZGVmaW5lIFRQQVQJCTE2CS8qIHBhdHRlcm4gaW4gY2FzZSAqLwotI2RlZmluZSBUQlJBQ0UJCTE3CS8qIHtjLWxpc3R9ICovCi0jZGVmaW5lIFRBU1lOQwkJMTgJLyogYyAmICovCi0jZGVmaW5lIFRGVU5DVAkJMTkJLyogZnVuY3Rpb24gbmFtZSB7IGNvbW1hbmQ7IH0gKi8KLSNkZWZpbmUgVFRJTUUJCTIwCS8qIHRpbWUgcGlwZWxpbmUgKi8KLSNkZWZpbmUgVEVYRUMJCTIxCS8qIGZvcmsvZXhlYyBldmFsJ2QgVENPTSAqLwotI2RlZmluZSBUQ09QUk9DCQkyMgkvKiBjb3Byb2Nlc3MgfCYgKi8KLQotLyoKLSAqIHByZWZpeCBjb2RlcyBmb3Igd29yZHMgaW4gY29tbWFuZCB0cmVlCi0gKi8KLSNkZWZpbmUgRU9TCTAJLyogZW5kIG9mIHN0cmluZyAqLwotI2RlZmluZSBDSEFSCTEJLyogdW5xdW90ZWQgY2hhcmFjdGVyICovCi0jZGVmaW5lIFFDSEFSCTIJLyogcXVvdGVkIGNoYXJhY3RlciAqLwotI2RlZmluZSBDT01TVUIJMwkvKiAkKCkgc3Vic3RpdHV0aW9uICgwIHRlcm1pbmF0ZWQpICovCi0jZGVmaW5lIEVYUFJTVUIJNAkvKiAkKCgpKSBzdWJzdGl0dXRpb24gKDAgdGVybWluYXRlZCkgKi8KLSNkZWZpbmUgT1FVT1RFCTUJLyogb3BlbmluZyAiIG9yICcgKi8KLSNkZWZpbmUgQ1FVT1RFCTYJLyogY2xvc2luZyAiIG9yICcgKi8KLSNkZWZpbmUgT1NVQlNUCTcJLyogb3BlbmluZyAkeyBzdWJzdCAoZm9sbG93ZWQgYnkgeyBvciBYKSAqLwotI2RlZmluZSBDU1VCU1QJOAkvKiBjbG9zaW5nIH0gb2YgYWJvdmUgKGZvbGxvd2VkIGJ5IH0gb3IgWCkgKi8KLSNkZWZpbmUgT1BBVAk5CS8qIG9wZW4gcGF0dGVybjogKigsIEAoLCBldGMuICovCi0jZGVmaW5lIFNQQVQJMTAJLyogc2VwYXJhdGUgcGF0dGVybjogfCAqLwotI2RlZmluZSBDUEFUCTExCS8qIGNsb3NlIHBhdHRlcm46ICkgKi8KLSNkZWZpbmUgQURFTElNCTEyCS8qIGFyYml0cmFyeSBkZWxpbWl0ZXI6ICR7Zm9vOjI6M30gJHtmb28vYmFyL2Jhen0gKi8KLQotLyoKLSAqIElPIHJlZGlyZWN0aW9uCi0gKi8KLXN0cnVjdCBpb3dvcmQgewotCWludAl1bml0OwkvKiB1bml0IGFmZmVjdGVkICovCi0JaW50CWZsYWc7CS8qIGFjdGlvbiAoYmVsb3cpICovCi0JY2hhcgkqbmFtZTsJLyogZmlsZSBuYW1lICh1bnVzZWQgaWYgaGVyZWRvYykgKi8KLQljaGFyCSpkZWxpbTsJLyogZGVsaW1pdGVyIGZvciA8PCw8PC0gKi8KLQljaGFyCSpoZXJlZG9jOy8qIGNvbnRlbnQgb2YgaGVyZWRvYyAqLwotfTsKLQotLyogaW93b3JkLmZsYWcgLSB0eXBlIG9mIHJlZGlyZWN0aW9uICovCi0jZGVmaW5lIElPVFlQRQkweEYJLyogdHlwZTogYml0cyAwOjMgKi8KLSNkZWZpbmUgSU9SRUFECTB4MQkvKiA8ICovCi0jZGVmaW5lIElPV1JJVEUJMHgyCS8qID4gKi8KLSNkZWZpbmUgSU9SRFdSCTB4MwkvKiA8PjogdG9kbyAqLwotI2RlZmluZSBJT0hFUkUJMHg0CS8qIDw8IChoZXJlIGZpbGUpICovCi0jZGVmaW5lIElPQ0FUCTB4NQkvKiA+PiAqLwotI2RlZmluZSBJT0RVUAkweDYJLyogPCYvPiYgKi8KLSNkZWZpbmUgSU9FVkFMCUJJVCg0KQkvKiBleHBhbmQgaW4gPDwgKi8KLSNkZWZpbmUgSU9TS0lQCUJJVCg1KQkvKiA8PC0sIHNraXAgXlx0KiAqLwotI2RlZmluZSBJT0NMT0IJQklUKDYpCS8qID58LCBvdmVycmlkZSAtbyBub2Nsb2JiZXIgKi8KLSNkZWZpbmUgSU9SRFVQCUJJVCg3KQkvKiB4PCZ5IChhcyBvcHBvc2VkIHRvIHg+JnkpICovCi0jZGVmaW5lIElPTkFNRVhQIEJJVCg4KQkvKiBuYW1lIGhhcyBiZWVuIGV4cGFuZGVkICovCi0jZGVmaW5lIElPQkFTSAlCSVQoOSkJLyogJj4gZXRjLiAqLwotCi0vKiBleGVjdXRlL2V4Y2hpbGQgZmxhZ3MgKi8KLSNkZWZpbmUgWEVYRUMJQklUKDApCQkvKiBleGVjdXRlIHdpdGhvdXQgZm9ya2luZyAqLwotI2RlZmluZSBYRk9SSwlCSVQoMSkJCS8qIGZvcmsgYmVmb3JlIGV4ZWN1dGluZyAqLwotI2RlZmluZSBYQkdORAlCSVQoMikJCS8qIGNvbW1hbmQgJiAqLwotI2RlZmluZSBYUElQRUkJQklUKDMpCQkvKiBpbnB1dCBpcyBwaXBlICovCi0jZGVmaW5lIFhQSVBFTwlCSVQoNCkJCS8qIG91dHB1dCBpcyBwaXBlICovCi0jZGVmaW5lIFhQSVBFCShYUElQRUl8WFBJUEVPKQkvKiBtZW1iZXIgb2YgcGlwZSAqLwotI2RlZmluZSBYWENPTQlCSVQoNSkJCS8qIGAuLi5gIGNvbW1hbmQgKi8KLSNkZWZpbmUgWFBDTE9TRQlCSVQoNikJCS8qIGV4Y2hpbGQ6IGNsb3NlIGNsb3NlX2ZkIGluIHBhcmVudCAqLwotI2RlZmluZSBYQ0NMT1NFCUJJVCg3KQkJLyogZXhjaGlsZDogY2xvc2UgY2xvc2VfZmQgaW4gY2hpbGQgKi8KLSNkZWZpbmUgWEVSUk9LCUJJVCg4KQkJLyogbm9uLXplcm8gZXhpdCBvayAoZm9yIHNldCAtZSkgKi8KLSNkZWZpbmUgWENPUFJPQyBCSVQoOSkJCS8qIHN0YXJ0aW5nIGEgY28tcHJvY2VzcyAqLwotI2RlZmluZSBYVElNRQlCSVQoMTApCQkvKiB0aW1pbmcgVENPTSBjb21tYW5kICovCi0KLS8qCi0gKiBmbGFncyB0byBjb250cm9sIGV4cGFuc2lvbiBvZiB3b3JkcyAoYXNzdW1lZCBieSB0LT5ldmFsZmxhZ3MgdG8gZml0Ci0gKiBpbiBhIHNob3J0KQotICovCi0jZGVmaW5lIERPQkxBTksJQklUKDApCQkvKiBwZXJmb3JtIGJsYW5rIGludGVycHJldGF0aW9uICovCi0jZGVmaW5lIERPR0xPQglCSVQoMSkJCS8qIGV4cGFuZCBbPyogKi8KLSNkZWZpbmUgRE9QQVQJQklUKDIpCQkvKiBxdW90ZSAqP1sgKi8KLSNkZWZpbmUgRE9USUxERQlCSVQoMykJCS8qIG5vcm1hbCB+IGV4cGFuc2lvbiAoZmlyc3QgY2hhcikgKi8KLSNkZWZpbmUgRE9OVFJVTkNPTU1BTkQgQklUKDQpCS8qIGRvIG5vdCBydW4gJChjb21tYW5kKSB0aGluZ3MgKi8KLSNkZWZpbmUgRE9BU05USUxERSBCSVQoNSkJLyogYXNzaWdubWVudCB+IGV4cGFuc2lvbiAoYWZ0ZXIgPSwgOikgKi8KLSNkZWZpbmUgRE9CUkFDRV8gQklUKDYpCQkvKiB1c2VkIGJ5IGV4cGFuZCgpOiBkbyBicmFjZSBleHBhbnNpb24gKi8KLSNkZWZpbmUgRE9NQUdJQ18gQklUKDcpCQkvKiB1c2VkIGJ5IGV4cGFuZCgpOiBzdHJpbmcgY29udGFpbnMgTUFHSUMgKi8KLSNkZWZpbmUgRE9URU1QXwlCSVQoOCkJCS8qIGRpdHRvIDogaW4gd29yZCBwYXJ0IG9mICR7Li5bJSM9P10uLn0gKi8KLSNkZWZpbmUgRE9WQUNIRUNLIEJJVCg5KQkvKiB2YXIgYXNzaWduIGNoZWNrIChmb3IgdHlwZXNldCwgc2V0LCBldGMpICovCi0jZGVmaW5lIERPTUFSS0RJUlMgQklUKDEwKQkvKiBmb3JjZSBtYXJrZGlycyBiZWhhdmlvdXIgKi8KLQotLyoKLSAqIFRoZSBhcmd1bWVudHMgb2YgW1sgLi4gXV0gZXhwcmVzc2lvbnMgYXJlIGtlcHQgaW4gdC0+YXJnc1tdIGFuZCBmbGFncwotICogaW5kaWNhdGluZyBob3cgdGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gbXVuZ2VkIGFyZSBrZXB0IGluIHQtPnZhcnNbXS4KLSAqIFRoZSBjb250ZW50cyBvZiB0LT52YXJzW10gYXJlIHN0dWZmZWQgc3RyaW5ncyAoc28gdGhleSBjYW4gYmUgdHJlYXRlZAotICogbGlrZSBhbGwgb3RoZXIgdC0+dmFyc1tdKSBpbiB3aGljaCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyB0aGUgb25lIHRoYXQKLSAqIGlzIGV4YW1pbmVkLiBUaGUgREJfKiBkZWZpbmVzIGFyZSB0aGUgdmFsdWVzIGZvciB0aGVzZSBzZWNvbmQgY2hhcmFjdGVycy4KLSAqLwotI2RlZmluZSBEQl9OT1JNCTEJLyogbm9ybWFsIGFyZ3VtZW50ICovCi0jZGVmaW5lIERCX09SCTIJLyogfHwgLT4gLW8gY29udmVyc2lvbiAqLwotI2RlZmluZSBEQl9BTkQJMwkvKiAmJiAtPiAtYSBjb252ZXJzaW9uICovCi0jZGVmaW5lIERCX0JFCTQJLyogYW4gaW5zZXJ0ZWQgLUJFICovCi0jZGVmaW5lIERCX1BBVAk1CS8qIGEgcGF0dGVybiBhcmd1bWVudCAqLwotCi0jZGVmaW5lIFhfRVhUUkEJOAkvKiB0aGlzIG1hbnkgZXh0cmEgYnl0ZXMgaW4gWCBzdHJpbmcgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgWFN0cmluZyB7Ci0JY2hhciAqZW5kLCAqYmVnOwkvKiBlbmQsIGJlZ2luIG9mIHN0cmluZyAqLwotCXNpemVfdCBsZW47CQkvKiBsZW5ndGggKi8KLQlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUvZnJlZSBmcm9tICovCi19IFhTdHJpbmc7Ci0KLXR5cGVkZWYgY2hhciAqWFN0cmluZ1A7Ci0KLS8qIGluaXRpYWxpc2UgZXhwYW5kYWJsZSBzdHJpbmcgKi8KLSNkZWZpbmUgWGluaXROKHhzLCBsZW5ndGgsIGFyZWEpIGRvIHsJCQkJXAotCSh4cykubGVuID0gKGxlbmd0aCk7CQkJCQlcCi0JKHhzKS5hcmVhcCA9IChhcmVhKTsJCQkJCVwKLQkoeHMpLmJlZyA9IGFsbG9jKCh4cykubGVuICsgWF9FWFRSQSwgKHhzKS5hcmVhcCk7CVwKLQkoeHMpLmVuZCA9ICh4cykuYmVnICsgKHhzKS5sZW47CQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotI2RlZmluZSBYaW5pdCh4cywgeHAsIGxlbmd0aCwgYXJlYSkgZG8gewkJCVwKLQlYaW5pdE4oKHhzKSwgKGxlbmd0aCksIChhcmVhKSk7CQkJCVwKLQkoeHApID0gKHhzKS5iZWc7CQkJCQlcCi19IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLQotLyogc3R1ZmYgY2hhciBpbnRvIHN0cmluZyAqLwotI2RlZmluZSBYcHV0KHhzLCB4cCwgYykJKCp4cCsrID0gKGMpKQotCi0vKiBjaGVjayBpZiB0aGVyZSBhcmUgYXQgbGVhc3QgbiBieXRlcyBsZWZ0ICovCi0jZGVmaW5lIFhjaGVja04oeHMsIHhwLCBuKSBkbyB7CQkJCQlcCi0JaW50IG1vcmUgPSAoKHhwKSArIChuKSkgLSAoeHMpLmVuZDsJCQlcCi0JaWYgKG1vcmUgPiAwKQkJCQkJCVwKLQkJKHhwKSA9IFhjaGVja19ncm93XygmKHhzKSwgKHhwKSwgbW9yZSk7CQlcCi19IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLQotLyogY2hlY2sgZm9yIG92ZXJmbG93LCBleHBhbmQgc3RyaW5nICovCi0jZGVmaW5lIFhjaGVjayh4cywgeHApCVhjaGVja04oKHhzKSwgKHhwKSwgMSkKLQotLyogZnJlZSBzdHJpbmcgKi8KLSNkZWZpbmUgWGZyZWUoeHMsIHhwKQlhZnJlZSgoeHMpLmJlZywgKHhzKS5hcmVhcCkKLQotLyogY2xvc2UsIHJldHVybiBzdHJpbmcgKi8KLSNkZWZpbmUgWGNsb3NlKHhzLCB4cCkJYXJlc2l6ZSgoeHMpLmJlZywgKHhwKSAtICh4cykuYmVnLCAoeHMpLmFyZWFwKQotCi0vKiBiZWdpbiBvZiBzdHJpbmcgKi8KLSNkZWZpbmUgWHN0cmluZyh4cywgeHApCSgoeHMpLmJlZykKLQotI2RlZmluZSBYbmxlZnQoeHMsIHhwKQkoKHhzKS5lbmQgLSAoeHApKQkvKiBtYXkgYmUgbGVzcyB0aGFuIDAgKi8KLSNkZWZpbmUgWGxlbmd0aCh4cywgeHApCSgoeHApIC0gKHhzKS5iZWcpCi0jZGVmaW5lIFhzaXplKHhzLCB4cCkJKCh4cykuZW5kIC0gKHhzKS5iZWcpCi0jZGVmaW5lIFhzYXZlcG9zKHhzLCB4cCkJKCh4cCkgLSAoeHMpLmJlZykKLSNkZWZpbmUgWHJlc3Rwb3MoeHMsIHhwLCBuKQkoKHhzKS5iZWcgKyAobikpCi0KLWNoYXIgKlhjaGVja19ncm93XyhYU3RyaW5nICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLQotLyoKLSAqIGV4cGFuZGFibGUgdmVjdG9yIG9mIGdlbmVyaWMgcG9pbnRlcnMKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBYUHRyViB7Ci0Jdm9pZCAqKmN1cjsJCS8qIG5leHQgYXZhaWwgcG9pbnRlciAqLwotCXZvaWQgKipiZWcsICoqZW5kOwkvKiBiZWdpbiwgZW5kIG9mIHZlY3RvciAqLwotfSBYUHRyVjsKLQotI2RlZmluZSBYUGluaXQoeCwgbikgZG8gewkJCQkJXAotCXZvaWQgKip2cF9fOwkJCQkJCVwKLQl2cF9fID0gYWxsb2MoKG4pICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKTsJCVwKLQkoeCkuY3VyID0gKHgpLmJlZyA9IHZwX187CQkJCVwKLQkoeCkuZW5kID0gdnBfXyArIChuKTsJCQkJCVwKLX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotCi0jZGVmaW5lIFhQcHV0KHgsIHApIGRvIHsJCQkJCVwKLQlpZiAoKHgpLmN1ciA+PSAoeCkuZW5kKSB7CQkJCVwKLQkJc2l6ZV90IG4gPSBYUHNpemUoeCk7CQkJCVwKLQkJKHgpLmJlZyA9IGFyZXNpemUoKHgpLmJlZywJCQlcCi0JCSAgICBuICogMiAqIHNpemVvZih2b2lkICopLCBBVEVNUCk7CQlcCi0JCSh4KS5jdXIgPSAoeCkuYmVnICsgbjsJCQkJXAotCQkoeCkuZW5kID0gKHgpLmN1ciArIG47CQkJCVwKLQl9CQkJCQkJCVwKLQkqKHgpLmN1cisrID0gKHApOwkJCQkJXAotfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCi0KLSNkZWZpbmUgWFBwdHJ2KHgpCSgoeCkuYmVnKQotI2RlZmluZSBYUHNpemUoeCkJKCh4KS5jdXIgLSAoeCkuYmVnKQotI2RlZmluZSBYUGNsb3NlKHgpCWFyZXNpemUoKHgpLmJlZywgWFBzaXplKHgpICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKQotI2RlZmluZSBYUGZyZWUoeCkJYWZyZWUoKHgpLmJlZywgQVRFTVApCi0KLSNkZWZpbmUgSURFTlQJNjQKLQotdHlwZWRlZiBzdHJ1Y3Qgc291cmNlIFNvdXJjZTsKLXN0cnVjdCBzb3VyY2UgewotCWNvbnN0IGNoYXIgKnN0cjsJLyogaW5wdXQgcG9pbnRlciAqLwotCWNvbnN0IGNoYXIgKnN0YXJ0OwkvKiBzdGFydCBvZiBjdXJyZW50IGJ1ZmZlciAqLwotCXVuaW9uIHsKLQkJY29uc3QgY2hhciAqKnN0cnY7CS8qIHN0cmluZyBbXSAqLwotCQlzdHJ1Y3Qgc2hmICpzaGY7CS8qIHNoZWxsIGZpbGUgKi8KLQkJc3RydWN0IHRibCAqdGJscDsJLyogYWxpYXMgKFNGX0hBU0FMSUFTKSAqLwotCQljaGFyICpmcmVlbWU7CQkvKiBhbHNvIGZvciBTUkVSRUFEICovCi0JfSB1OwotCWNvbnN0IGNoYXIgKmZpbGU7CS8qIGlucHV0IGZpbGUgbmFtZSAqLwotCWludAl0eXBlOwkJLyogaW5wdXQgdHlwZSAqLwotCWludAlsaW5lOwkJLyogbGluZSBudW1iZXIgKi8KLQlpbnQJZXJybGluZTsJLyogbGluZSB0aGUgZXJyb3Igb2NjdXJyZWQgb24gKDAgaWYgbm90IHNldCkgKi8KLQlpbnQJZmxhZ3M7CQkvKiBTRl8qICovCi0JQXJlYQkqYXJlYXA7Ci0JU291cmNlICpuZXh0OwkJLyogc3RhY2tlZCBzb3VyY2UgKi8KLQlYU3RyaW5nCXhzOwkJLyogaW5wdXQgYnVmZmVyICovCi0JY2hhcgl1Z2J1ZlsyXTsJLyogYnVmZmVyIGZvciB1bmdldHNjKCkgKFNSRVJFQUQpIGFuZAotCQkJCSAqIGFsaWFzIChTQUxJQVMpICovCi19OwotCi0vKiBTb3VyY2UudHlwZSB2YWx1ZXMgKi8KLSNkZWZpbmUgU0VPRgkJMAkvKiBpbnB1dCBFT0YgKi8KLSNkZWZpbmUgU0ZJTEUJCTEJLyogZmlsZSBpbnB1dCAqLwotI2RlZmluZSBTU1RESU4JCTIJLyogcmVhZCBzdGRpbiAqLwotI2RlZmluZSBTU1RSSU5HCQkzCS8qIHN0cmluZyAqLwotI2RlZmluZSBTV1NUUgkJNAkvKiBzdHJpbmcgd2l0aG91dCBcbiAqLwotI2RlZmluZSBTV09SRFMJCTUJLyogc3RyaW5nW10gKi8KLSNkZWZpbmUgU1dPUkRTRVAJNgkvKiBzdHJpbmdbXSBzZXBhcmF0b3IgKi8KLSNkZWZpbmUgU0FMSUFTCQk3CS8qIGFsaWFzIGV4cGFuc2lvbiAqLwotI2RlZmluZSBTUkVSRUFECQk4CS8qIHJlYWQgYWhlYWQgdG8gYmUgcmUtc2Nhbm5lZCAqLwotCi0vKiBTb3VyY2UuZmxhZ3MgdmFsdWVzICovCi0jZGVmaW5lIFNGX0VDSE8JCUJJVCgwKQkvKiBlY2hvIGlucHV0IHRvIHNobG91dCAqLwotI2RlZmluZSBTRl9BTElBUwlCSVQoMSkJLyogZmFraW5nIHNwYWNlIGF0IGVuZCBvZiBhbGlhcyAqLwotI2RlZmluZSBTRl9BTElBU0VORAlCSVQoMikJLyogZmFraW5nIHNwYWNlIGF0IGVuZCBvZiBhbGlhcyAqLwotI2RlZmluZSBTRl9UVFkJCUJJVCgzKQkvKiB0eXBlID09IFNTVERJTiAmIGl0IGlzIGEgdHR5ICovCi0jZGVmaW5lIFNGX0ZJUlNUCUJJVCg0KQkvKiBpbml0aWFsIHN0YXRlICh0byBpZ25vcmUgVVRGLTggQk9NKSAqLwotI2RlZmluZSBTRl9IQVNBTElBUwlCSVQoNSkJLyogdS50YmxwIHZhbGlkIChTQUxJQVMsIFNFT0YpICovCi0KLXR5cGVkZWYgdW5pb24gewotCWludCBpOwotCWNoYXIgKmNwOwotCWNoYXIgKip3cDsKLQlzdHJ1Y3Qgb3AgKm87Ci0Jc3RydWN0IGlvd29yZCAqaW9wOwotfSBZWVNUWVBFOwotCi0vKiBJZiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZSwgYWRkIGl0IHRvIHRva2VudGFiW10gaW4gc3luLmMgYXMgd2VsbCAqLwotI2RlZmluZSBMV09SRAkJMjU2Ci0jZGVmaW5lIExPR0FORAkJMjU3CS8qICYmICovCi0jZGVmaW5lIExPR09SCQkyNTgJLyogfHwgKi8KLSNkZWZpbmUgQlJFQUsJCTI1OQkvKiA7OyAqLwotI2RlZmluZSBJRgkJMjYwCi0jZGVmaW5lIFRIRU4JCTI2MQotI2RlZmluZSBFTFNFCQkyNjIKLSNkZWZpbmUgRUxJRgkJMjYzCi0jZGVmaW5lIEZJCQkyNjQKLSNkZWZpbmUgQ0FTRQkJMjY1Ci0jZGVmaW5lIEVTQUMJCTI2NgotI2RlZmluZSBGT1IJCTI2NwotI2RlZmluZSBTRUxFQ1QJCTI2OAotI2RlZmluZSBXSElMRQkJMjY5Ci0jZGVmaW5lIFVOVElMCQkyNzAKLSNkZWZpbmUgRE8JCTI3MQotI2RlZmluZSBET05FCQkyNzIKLSNkZWZpbmUgSU4JCTI3MwotI2RlZmluZSBGVU5DVElPTgkyNzQKLSNkZWZpbmUgVElNRQkJMjc1Ci0jZGVmaW5lIFJFRElSCQkyNzYKLSNkZWZpbmUgTURQQVJFTgkJMjc3CS8qICgoICkpICovCi0jZGVmaW5lIEJBTkcJCTI3OAkvKiAhICovCi0jZGVmaW5lIERCUkFDS0VUCTI3OQkvKiBbWyAuLiBdXSAqLwotI2RlZmluZSBDT1BST0MJCTI4MAkvKiB8JiAqLwotI2RlZmluZSBZWUVSUkNPREUJMzAwCi0KLS8qIGZsYWdzIHRvIHl5bGV4ICovCi0jZGVmaW5lIENPTlRJTgkJQklUKDApCS8qIHNraXAgbmV3IGxpbmVzIHRvIGNvbXBsZXRlIGNvbW1hbmQgKi8KLSNkZWZpbmUgT05FV09SRAkJQklUKDEpCS8qIHNpbmdsZSB3b3JkIGZvciBzdWJzdGl0dXRlKCkgKi8KLSNkZWZpbmUgQUxJQVMJCUJJVCgyKQkvKiByZWNvZ25pc2UgYWxpYXMgKi8KLSNkZWZpbmUgS0VZV09SRAkJQklUKDMpCS8qIHJlY29nbmlzZSBrZXl3b3JkcyAqLwotI2RlZmluZSBMRVRFWFBSCQlCSVQoNCkJLyogZ2V0IGV4cHJlc3Npb24gaW5zaWRlICgoICkpICovCi0jZGVmaW5lIFZBUkFTTgkJQklUKDUpCS8qIGNoZWNrIGZvciB2YXI9d29yZCAqLwotI2RlZmluZSBBUlJBWVZBUglCSVQoNikJLyogcGFyc2UgeFsxICYgMl0gYXMgb25lIHdvcmQgKi8KLSNkZWZpbmUgRVNBQ09OTFkJQklUKDcpCS8qIG9ubHkgYWNjZXB0IGVzYWMga2V5d29yZCAqLwotI2RlZmluZSBDTURXT1JECQlCSVQoOCkJLyogcGFyc2luZyBzaW1wbGUgY29tbWFuZCAoYWxpYXMgcmVsYXRlZCkgKi8KLSNkZWZpbmUgSEVSRURFTElNCUJJVCg5KQkvKiBwYXJzaW5nIDw8LDw8LSBkZWxpbWl0ZXIgKi8KLSNkZWZpbmUgTFFDSEFSCQlCSVQoMTApCS8qIHNvdXJjZSBzdHJpbmcgY29udGFpbnMgUUNIQVIgKi8KLSNkZWZpbmUgSEVSRURPQwkJQklUKDExKQkvKiBwYXJzaW5nIGEgaGVyZSBkb2N1bWVudCAqLwotI2RlZmluZSBMRVRBUlJBWQlCSVQoMTIpCS8qIGNvcHkgZXhwcmVzc2lvbiBpbnNpZGUgPSggKSAqLwotCi0jZGVmaW5lIEhFUkVTCTEwCQkvKiBtYXggPDwgaW4gbGluZSAqLwotCi0jdW5kZWYgQ1RSTAotI2RlZmluZQlDVFJMKHgpCQkoKHgpID09ICc/JyA/IDB4N0YgOiAoeCkgJiAweDFGKQkvKiBBU0NJSSAqLwotI2RlZmluZQlVTkNUUkwoeCkJKCh4KSBeIDB4NDApCQkJCS8qIEFTQ0lJICovCi0KLUVYVEVSTiBTb3VyY2UgKnNvdXJjZTsJCS8qIHl5cGFyc2UveXlsZXggc291cmNlICovCi1FWFRFUk4gWVlTVFlQRQl5eWx2YWw7CQkvKiByZXN1bHQgZnJvbSB5eWxleCAqLwotRVhURVJOIHN0cnVjdCBpb3dvcmQgKmhlcmVzIFtIRVJFU10sICoqaGVyZXA7Ci1FWFRFUk4gY2hhcglpZGVudCBbSURFTlQrMV07Ci0KLSNkZWZpbmUgSElTVE9SWVNJWkUJNTAwCS8qIHNpemUgb2Ygc2F2ZWQgaGlzdG9yeSAqLwotCi1FWFRFUk4gY2hhciAqKmhpc3Rvcnk7CS8qIHNhdmVkIGNvbW1hbmRzICovCi1FWFRFUk4gY2hhciAqKmhpc3RwdHI7CS8qIGxhc3QgaGlzdG9yeSBpdGVtICovCi1FWFRFUk4gaW50IGhpc3RzaXplOwkvKiBoaXN0b3J5IHNpemUgKi8KLQotLyogdXNlciBhbmQgc3lzdGVtIHRpbWUgb2YgbGFzdCBqX3dhaXRqZWQgam9iICovCi1FWFRFUk4gc3RydWN0IHRpbWV2YWwgal91c3J0aW1lLCBqX3N5c3RpbWU7Ci0KLS8qIGxhbGxvYy5jICovCi12b2lkIGFpbml0KEFyZWEgKik7Ci12b2lkIGFmcmVlYWxsKEFyZWEgKik7Ci0vKiB0aGVzZSBjYW5ub3QgZmFpbCBhbmQgY2FuIHRha2UgTlVMTCAobm90IGZvciBhcCkgKi8KLSNkZWZpbmUgYWxsb2MobiwgYXApCWFyZXNpemUoTlVMTCwgKG4pLCAoYXApKQotdm9pZCAqYXJlc2l6ZSh2b2lkICosIHNpemVfdCwgQXJlYSAqKTsKLXZvaWQgYWZyZWUodm9pZCAqLCBBcmVhICopOwkvKiBjYW4gdGFrZSBOVUxMICovCi0vKiBlZGl0LmMgKi8KLSNpZm5kZWYgTUtTSF9TTUFMTAotaW50IHhfYmluZChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7Ci0jZWxzZQotaW50IHhfYmluZChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci0jZW5kaWYKLXZvaWQgeF9pbml0KHZvaWQpOwotaW50IHhfcmVhZChjaGFyICosIHNpemVfdCk7Ci0vKiBldmFsLmMgKi8KLWNoYXIgKnN1YnN0aXR1dGUoY29uc3QgY2hhciAqLCBpbnQpOwotY2hhciAqKmV2YWwoY29uc3QgY2hhciAqKiwgaW50KTsKLWNoYXIgKmV2YWxzdHIoY29uc3QgY2hhciAqY3AsIGludCk7Ci1jaGFyICpldmFsb25lc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQpOwotY2hhciAqZGVidW5rKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotdm9pZCBleHBhbmQoY29uc3QgY2hhciAqLCBYUHRyViAqLCBpbnQpOwotaW50IGdsb2Jfc3RyKGNoYXIgKiwgWFB0clYgKiwgaW50KTsKLS8qIGV4ZWMuYyAqLwotaW50IGV4ZWN1dGUoc3RydWN0IG9wICogdm9sYXRpbGUsIHZvbGF0aWxlIGludCwgdm9sYXRpbGUgaW50ICogdm9sYXRpbGUpOwotaW50IHNoY29tZXhlYyhjb25zdCBjaGFyICoqKTsKLXN0cnVjdCB0YmwgKmZpbmRmdW5jKGNvbnN0IGNoYXIgKiwgdWludDMyX3QsIGJvb2wpOwotaW50IGRlZmluZShjb25zdCBjaGFyICosIHN0cnVjdCBvcCAqKTsKLXZvaWQgYnVpbHRpbihjb25zdCBjaGFyICosIGludCAoKikoY29uc3QgY2hhciAqKikpOwotc3RydWN0IHRibCAqZmluZGNvbShjb25zdCBjaGFyICosIGludCk7Ci12b2lkIGZsdXNoY29tKGludCk7Ci1jb25zdCBjaGFyICpzZWFyY2goY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50ICopOwotaW50IHNlYXJjaF9hY2Nlc3MoY29uc3QgY2hhciAqLCBpbnQsIGludCAqKTsKLWludCBwcl9tZW51KGNvbnN0IGNoYXIgKiBjb25zdCAqKTsKLWludCBwcl9saXN0KGNoYXIgKiBjb25zdCAqKTsKLS8qIGV4cHIuYyAqLwotaW50IGV2YWx1YXRlKGNvbnN0IGNoYXIgKiwgbWtzaF9hcmlfdCAqLCBpbnQsIGJvb2wpOwotaW50IHZfZXZhbHVhdGUoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICosIHZvbGF0aWxlIGludCwgYm9vbCk7Ci0vKiBVVEYtOCBzdHVmZiAqLwotc2l6ZV90IHV0Zl9tYnRvd2ModW5zaWduZWQgaW50ICosIGNvbnN0IGNoYXIgKik7Ci1zaXplX3QgdXRmX3djdG9tYihjaGFyICosIHVuc2lnbmVkIGludCk7Ci1pbnQgdXRmX3dpZHRoYWRqKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKik7Ci1pbnQgdXRmX21ic3dpZHRoKGNvbnN0IGNoYXIgKik7Ci1jb25zdCBjaGFyICp1dGZfc2tpcGNvbHMoY29uc3QgY2hhciAqLCBpbnQpOwotc2l6ZV90IHV0Zl9wdHJhZGooY29uc3QgY2hhciAqKTsKLSNpZm5kZWYgTUtTSF9taXJic2Rfd2N3aWR0aAotaW50IHV0Zl93Y3dpZHRoKHVuc2lnbmVkIGludCk7Ci0jZW5kaWYKLS8qIGZ1bmNzLmMgKi8KLWludCBjX2hhc2goY29uc3QgY2hhciAqKik7Ci1pbnQgY19jZChjb25zdCBjaGFyICoqKTsKLWludCBjX3B3ZChjb25zdCBjaGFyICoqKTsKLWludCBjX3ByaW50KGNvbnN0IGNoYXIgKiopOwotI2lmZGVmIE1LU0hfUFJJTlRGX0JVSUxUSU4KLWludCBjX3ByaW50Zihjb25zdCBjaGFyICoqKTsKLSNlbmRpZgotaW50IGNfd2hlbmNlKGNvbnN0IGNoYXIgKiopOwotaW50IGNfY29tbWFuZChjb25zdCBjaGFyICoqKTsKLWludCBjX3R5cGVzZXQoY29uc3QgY2hhciAqKik7Ci1pbnQgY19hbGlhcyhjb25zdCBjaGFyICoqKTsKLWludCBjX3VuYWxpYXMoY29uc3QgY2hhciAqKik7Ci1pbnQgY19sZXQoY29uc3QgY2hhciAqKik7Ci1pbnQgY19qb2JzKGNvbnN0IGNoYXIgKiopOwotI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKLWludCBjX2ZnYmcoY29uc3QgY2hhciAqKik7Ci0jZW5kaWYKLWludCBjX2tpbGwoY29uc3QgY2hhciAqKik7Ci12b2lkIGdldG9wdHNfcmVzZXQoaW50KTsKLWludCBjX2dldG9wdHMoY29uc3QgY2hhciAqKik7Ci1pbnQgY19iaW5kKGNvbnN0IGNoYXIgKiopOwotaW50IGNfbGFiZWwoY29uc3QgY2hhciAqKik7Ci1pbnQgY19zaGlmdChjb25zdCBjaGFyICoqKTsKLWludCBjX3VtYXNrKGNvbnN0IGNoYXIgKiopOwotaW50IGNfZG90KGNvbnN0IGNoYXIgKiopOwotaW50IGNfd2FpdChjb25zdCBjaGFyICoqKTsKLWludCBjX3JlYWQoY29uc3QgY2hhciAqKik7Ci1pbnQgY19ldmFsKGNvbnN0IGNoYXIgKiopOwotaW50IGNfdHJhcChjb25zdCBjaGFyICoqKTsKLWludCBjX2Jya2NvbnQoY29uc3QgY2hhciAqKik7Ci1pbnQgY19leGl0cmV0dXJuKGNvbnN0IGNoYXIgKiopOwotaW50IGNfc2V0KGNvbnN0IGNoYXIgKiopOwotaW50IGNfdW5zZXQoY29uc3QgY2hhciAqKik7Ci1pbnQgY191bGltaXQoY29uc3QgY2hhciAqKik7Ci1pbnQgY190aW1lcyhjb25zdCBjaGFyICoqKTsKLWludCB0aW1leChzdHJ1Y3Qgb3AgKiwgaW50LCB2b2xhdGlsZSBpbnQgKik7Ci12b2lkIHRpbWV4X2hvb2soc3RydWN0IG9wICosIGNoYXIgKiogdm9sYXRpbGUgKik7Ci1pbnQgY19leGVjKGNvbnN0IGNoYXIgKiopOwotaW50IGNfYnVpbHRpbihjb25zdCBjaGFyICoqKTsKLWludCBjX3Rlc3QoY29uc3QgY2hhciAqKik7Ci0jaWYgSEFWRV9NS05PRAotaW50IGNfbWtub2QoY29uc3QgY2hhciAqKik7Ci0jZW5kaWYKLWludCBjX3JlYWxwYXRoKGNvbnN0IGNoYXIgKiopOwotaW50IGNfcmVuYW1lKGNvbnN0IGNoYXIgKiopOwotLyogaGlzdHJhcC5jICovCi12b2lkIGluaXRfaGlzdHZlYyh2b2lkKTsKLXZvaWQgaGlzdF9pbml0KFNvdXJjZSAqKTsKLSNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotdm9pZCBoaXN0X2ZpbmlzaCh2b2lkKTsKLSNlbmRpZgotdm9pZCBoaXN0c2F2ZShpbnQgKiwgY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKLSNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQotYm9vbCBoaXN0c3luYyh2b2lkKTsKLSNlbmRpZgotaW50IGNfZmMoY29uc3QgY2hhciAqKik7Ci12b2lkIHNldGhpc3RzaXplKGludCk7Ci0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLXZvaWQgc2V0aGlzdGZpbGUoY29uc3QgY2hhciAqKTsKLSNlbmRpZgotY2hhciAqKmhpc3Rwb3Modm9pZCk7Ci1pbnQgaGlzdG51bShpbnQpOwotaW50IGZpbmRoaXN0KGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7Ci1pbnQgZmluZGhpc3RyZWwoY29uc3QgY2hhciAqKTsKLWNoYXIgKipoaXN0X2dldF9uZXdlc3QoYm9vbCk7Ci12b2lkIGluaXR0cmFwcyh2b2lkKTsKLXZvaWQgYWxhcm1faW5pdCh2b2lkKTsKLVRyYXAgKmdldHRyYXAoY29uc3QgY2hhciAqLCBpbnQpOwotdm9pZCB0cmFwc2lnKGludCk7Ci12b2lkIGludHJjaGVjayh2b2lkKTsKLWludCBmYXRhbF90cmFwX2NoZWNrKHZvaWQpOwotaW50IHRyYXBfcGVuZGluZyh2b2lkKTsKLXZvaWQgcnVudHJhcHMoaW50IGludHIpOwotdm9pZCBydW50cmFwKFRyYXAgKik7Ci12b2lkIGNsZWFydHJhcHModm9pZCk7Ci12b2lkIHJlc3RvcmVzaWdzKHZvaWQpOwotdm9pZCBzZXR0cmFwKFRyYXAgKiwgY29uc3QgY2hhciAqKTsKLWludCBibG9ja19waXBlKHZvaWQpOwotdm9pZCByZXN0b3JlX3BpcGUoaW50KTsKLWludCBzZXRzaWcoVHJhcCAqLCBzaWdfdCwgaW50KTsKLXZvaWQgc2V0ZXhlY3NpZyhUcmFwICosIGludCk7Ci0vKiBqb2JzLmMgKi8KLXZvaWQgal9pbml0KHZvaWQpOwotdm9pZCBqX2V4aXQodm9pZCk7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotdm9pZCBqX2NoYW5nZSh2b2lkKTsKLSNlbmRpZgotaW50IGV4Y2hpbGQoc3RydWN0IG9wICosIGludCwgdm9sYXRpbGUgaW50ICosIGludCk7Ci12b2lkIHN0YXJ0bGFzdCh2b2lkKTsKLWludCB3YWl0bGFzdCh2b2lkKTsKLWludCB3YWl0Zm9yKGNvbnN0IGNoYXIgKiwgaW50ICopOwotaW50IGpfa2lsbChjb25zdCBjaGFyICosIGludCk7Ci0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotaW50IGpfcmVzdW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKLSNlbmRpZgotaW50IGpfam9icyhjb25zdCBjaGFyICosIGludCwgaW50KTsKLWludCBqX25qb2JzKHZvaWQpOwotdm9pZCBqX25vdGlmeSh2b2lkKTsKLXBpZF90IGpfYXN5bmModm9pZCk7Ci1pbnQgal9zdG9wcGVkX3J1bm5pbmcodm9pZCk7Ci0vKiBsZXguYyAqLwotaW50IHl5bGV4KGludCk7Ci12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX05PUkVUVVJOCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotU291cmNlICpwdXNocyhpbnQsIEFyZWEgKik7Ci12b2lkIHNldF9wcm9tcHQoaW50LCBTb3VyY2UgKik7Ci12b2lkIHBwcm9tcHQoY29uc3QgY2hhciAqLCBpbnQpOwotaW50IHByb21wdGxlbihjb25zdCBjaGFyICopOwotLyogbWFpbi5jICovCi1pbnQgaW5jbHVkZShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwgaW50KTsKLWludCBjb21tYW5kKGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBzaGVsbChTb3VyY2UgKnZvbGF0aWxlLCBpbnQgdm9sYXRpbGUpOwotdm9pZCB1bndpbmQoaW50KSBNS1NIX0FfTk9SRVRVUk47Ci12b2lkIG5ld2VudihpbnQpOwotdm9pZCBxdWl0ZW52KHN0cnVjdCBzaGYgKik7Ci12b2lkIGNsZWFudXBfcGFyZW50c19lbnYodm9pZCk7Ci12b2lkIGNsZWFudXBfcHJvY19lbnYodm9pZCk7Ci12b2lkIGVycm9yZihjb25zdCBjaGFyICosIC4uLikKLSAgICBNS1NIX0FfTk9SRVRVUk4KLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Ci12b2lkIHdhcm5pbmdmKGJvb2wsIGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAzKTsKLXZvaWQgYmlfZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKLSNkZWZpbmUgZXJyb3JmeigpCWVycm9yZigiXDEiKQotI2RlZmluZSBiaV9lcnJvcmZ6KCkJYmlfZXJyb3JmKCJcMSIpCi12b2lkIGludGVybmFsX3ZlcnJvcmYoY29uc3QgY2hhciAqLCB2YV9saXN0KQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAwKTsKLXZvaWQgaW50ZXJuYWxfZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9OT1JFVFVSTgotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKLXZvaWQgaW50ZXJuYWxfd2FybmluZ2YoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotdm9pZCBlcnJvcl9wcmVmaXgoYm9vbCk7Ci12b2lkIHNoZWxsZihjb25zdCBjaGFyICosIC4uLikKLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Ci12b2lkIHNocHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKLWludCBjYW5fc2VlayhpbnQpOwotdm9pZCBpbml0aW8odm9pZCk7Ci1pbnQga3NoX2R1cDIoaW50LCBpbnQsIGJvb2wpOwotc2hvcnQgc2F2ZWZkKGludCk7Ci12b2lkIHJlc3RmZChpbnQsIGludCk7Ci12b2lkIG9wZW5waXBlKGludCAqKTsKLXZvaWQgY2xvc2VwaXBlKGludCAqKTsKLWludCBjaGVja19mZChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKik7Ci12b2lkIGNvcHJvY19pbml0KHZvaWQpOwotdm9pZCBjb3Byb2NfcmVhZF9jbG9zZShpbnQpOwotdm9pZCBjb3Byb2NfcmVhZHdfY2xvc2UoaW50KTsKLXZvaWQgY29wcm9jX3dyaXRlX2Nsb3NlKGludCk7Ci1pbnQgY29wcm9jX2dldGZkKGludCwgY29uc3QgY2hhciAqKik7Ci12b2lkIGNvcHJvY19jbGVhbnVwKGludCk7Ci1zdHJ1Y3QgdGVtcCAqbWFrZXRlbXAoQXJlYSAqLCBUZW1wX3R5cGUsIHN0cnVjdCB0ZW1wICoqKTsKLSNkZWZpbmUgaGFzaChzKSBvYWF0aGFzaF9mdWxsKChjb25zdCB1aW50OF90ICopKHMpKQotdWludDMyX3Qgb2FhdGhhc2hfZnVsbChyZWdpc3RlciBjb25zdCB1aW50OF90ICopOwotdWludDMyX3QgaGFzaG1lbShjb25zdCB2b2lkICosIHNpemVfdCk7Ci12b2lkIGt0aW5pdChzdHJ1Y3QgdGFibGUgKiwgQXJlYSAqLCBzaXplX3QpOwotc3RydWN0IHRibCAqa3RzZWFyY2goc3RydWN0IHRhYmxlICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QpOwotc3RydWN0IHRibCAqa3RlbnRlcihzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCk7Ci0jZGVmaW5lIGt0ZGVsZXRlKHApCWRvIHsgcC0+ZmxhZyA9IDA7IH0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQotdm9pZCBrdHdhbGsoc3RydWN0IHRzdGF0ZSAqLCBzdHJ1Y3QgdGFibGUgKik7Ci1zdHJ1Y3QgdGJsICprdG5leHQoc3RydWN0IHRzdGF0ZSAqKTsKLXN0cnVjdCB0YmwgKiprdHNvcnQoc3RydWN0IHRhYmxlICopOwotLyogbWlzYy5jICovCi12b2lkIHNldGN0eXBlcyhjb25zdCBjaGFyICosIGludCk7Ci12b2lkIGluaXRjdHlwZXModm9pZCk7Ci1zaXplX3Qgb3B0aW9uKGNvbnN0IGNoYXIgKik7Ci1jaGFyICpnZXRvcHRpb25zKHZvaWQpOwotdm9pZCBjaGFuZ2VfZmxhZyhlbnVtIHNoX2ZsYWcsIGludCwgdW5zaWduZWQgaW50KTsKLWludCBwYXJzZV9hcmdzKGNvbnN0IGNoYXIgKiosIGludCwgYm9vbCAqKTsKLWludCBnZXRuKGNvbnN0IGNoYXIgKiwgaW50ICopOwotaW50IGJpX2dldG4oY29uc3QgY2hhciAqLCBpbnQgKik7Ci1pbnQgZ21hdGNoeChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci1pbnQgaGFzX2dsb2JiaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdF9zY2FuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotaW50IHhzdHJjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwotdm9pZCBrc2hfZ2V0b3B0X3Jlc2V0KEdldG9wdCAqLCBpbnQpOwotaW50IGtzaF9nZXRvcHQoY29uc3QgY2hhciAqKiwgR2V0b3B0ICosIGNvbnN0IGNoYXIgKik7Ci12b2lkIHByaW50X3ZhbHVlX3F1b3RlZChjb25zdCBjaGFyICopOwotdm9pZCBwcmludF9jb2x1bW5zKHN0cnVjdCBzaGYgKiwgaW50LAotICAgIGNoYXIgKigqKShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopLAotICAgIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQsIGJvb2wpOwotdm9pZCBzdHJpcF9udWxzKGNoYXIgKiwgaW50KTsKLWludCBibG9ja2luZ19yZWFkKGludCwgY2hhciAqLCBpbnQpCi0gICAgTUtTSF9BX0JPVU5ERUQoYnVmZmVyLCAyLCAzKTsKLWludCByZXNldF9ub25ibG9jayhpbnQpOwotY2hhciAqa3NoX2dldF93ZChzaXplX3QgKik7Ci1pbnQgbWFrZV9wYXRoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqLCBYU3RyaW5nICosIGludCAqKTsKLXZvaWQgc2ltcGxpZnlfcGF0aChjaGFyICopOwotdm9pZCBzZXRfY3VycmVudF93ZChjaGFyICopOwotI2lmZGVmIE1LU0hfU01BTEwKLWNoYXIgKnN0cmR1cF8oY29uc3QgY2hhciAqLCBBcmVhICopOwotY2hhciAqc3RybmR1cF8oY29uc3QgY2hhciAqLCBzaXplX3QsIEFyZWEgKik7Ci0jZW5kaWYKLWludCB1bmJrc2woYm9vbCwgaW50ICgqKSh2b2lkKSwgdm9pZCAoKikoaW50KSk7Ci0vKiBzaGYuYyAqLwotc3RydWN0IHNoZiAqc2hmX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KTsKLXN0cnVjdCBzaGYgKnNoZl9mZG9wZW4oaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7Ci1zdHJ1Y3Qgc2hmICpzaGZfcmVvcGVuKGludCwgaW50LCBzdHJ1Y3Qgc2hmICopOwotc3RydWN0IHNoZiAqc2hmX3NvcGVuKGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7Ci1pbnQgc2hmX2Nsb3NlKHN0cnVjdCBzaGYgKik7Ci1pbnQgc2hmX2ZkY2xvc2Uoc3RydWN0IHNoZiAqKTsKLWNoYXIgKnNoZl9zY2xvc2Uoc3RydWN0IHNoZiAqKTsKLWludCBzaGZfZmx1c2goc3RydWN0IHNoZiAqKTsKLWludCBzaGZfcmVhZChjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKLWNoYXIgKnNoZl9nZXRzZShjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKLWludCBzaGZfZ2V0Y2hhcihzdHJ1Y3Qgc2hmICpzKTsKLWludCBzaGZfdW5nZXRjKGludCwgc3RydWN0IHNoZiAqKTsKLWludCBzaGZfcHV0Y2hhcihpbnQsIHN0cnVjdCBzaGYgKik7Ci1pbnQgc2hmX3B1dHMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2hmICopOwotaW50IHNoZl93cml0ZShjb25zdCBjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKLWludCBzaGZfZnByaW50ZihzdHJ1Y3Qgc2hmICosIGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAzKTsKLWludCBzaGZfc25wcmludGYoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAzLCA0KQotICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMSwgMik7Ci1jaGFyICpzaGZfc21wcmludGYoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwotaW50IHNoZl92ZnByaW50ZihzdHJ1Y3Qgc2hmICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkKLSAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMiwgMCk7Ci0vKiBzeW4uYyAqLwotdm9pZCBpbml0a2V5d29yZHModm9pZCk7Ci1zdHJ1Y3Qgb3AgKmNvbXBpbGUoU291cmNlICopOwotLyogdHJlZS5jICovCi1pbnQgZnB0cmVlZihzdHJ1Y3Qgc2hmICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOwotY2hhciAqc25wdHJlZWYoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLXN0cnVjdCBvcCAqdGNvcHkoc3RydWN0IG9wICosIEFyZWEgKik7Ci1jaGFyICp3ZGNvcHkoY29uc3QgY2hhciAqLCBBcmVhICopOwotY29uc3QgY2hhciAqd2RzY2FuKGNvbnN0IGNoYXIgKiwgaW50KTsKLWNoYXIgKndkc3RyaXAoY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKLXZvaWQgdGZyZWUoc3RydWN0IG9wICosIEFyZWEgKik7Ci0vKiB2YXIuYyAqLwotdm9pZCBuZXdibG9jayh2b2lkKTsKLXZvaWQgcG9wYmxvY2sodm9pZCk7Ci12b2lkIGluaXR2YXIodm9pZCk7Ci1zdHJ1Y3QgdGJsICpnbG9iYWwoY29uc3QgY2hhciAqKTsKLXN0cnVjdCB0YmwgKmxvY2FsKGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci1jaGFyICpzdHJfdmFsKHN0cnVjdCB0YmwgKik7Ci1pbnQgc2V0c3RyKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotc3RydWN0IHRibCAqc2V0aW50X3Yoc3RydWN0IHRibCAqLCBzdHJ1Y3QgdGJsICosIGJvb2wpOwotdm9pZCBzZXRpbnQoc3RydWN0IHRibCAqLCBta3NoX2FyaV90KTsKLXN0cnVjdCB0YmwgKnR5cGVzZXQoY29uc3QgY2hhciAqLCBUZmxhZywgVGZsYWcsIGludCwgaW50KQotICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgxKSkpOwotdm9pZCB1bnNldChzdHJ1Y3QgdGJsICosIGludCk7Ci1jb25zdCBjaGFyICpza2lwX3Zhcm5hbWUoY29uc3QgY2hhciAqLCBpbnQpOwotY29uc3QgY2hhciAqc2tpcF93ZHZhcm5hbWUoY29uc3QgY2hhciAqLCBpbnQpOwotaW50IGlzX3dkdmFybmFtZShjb25zdCBjaGFyICosIGludCk7Ci1pbnQgaXNfd2R2YXJhc3NpZ24oY29uc3QgY2hhciAqKTsKLWNoYXIgKiptYWtlbnYodm9pZCk7Ci12b2lkIGNoYW5nZV9yYW5kb20oY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotdm9pZCBjaGFuZ2Vfd2luc3oodm9pZCk7Ci1pbnQgYXJyYXlfcmVmX2xlbihjb25zdCBjaGFyICopOwotY2hhciAqYXJyYXluYW1lKGNvbnN0IGNoYXIgKik7Ci1ta3NoX3VhcmlfdCBzZXRfYXJyYXkoY29uc3QgY2hhciAqLCBib29sLCBjb25zdCBjaGFyICoqKTsKLQotZW51bSBUZXN0X29wIHsKLQlUT19OT05PUCA9IDAsCS8qIG5vbi1vcGVyYXRvciAqLwotCS8qIHVuYXJ5IG9wZXJhdG9ycyAqLwotCVRPX1NUTlpFLCBUT19TVFpFUiwgVE9fT1BUSU9OLAotCVRPX0ZJTEFYU1QsCi0JVE9fRklMRVhTVCwKLQlUT19GSUxSRUcsIFRPX0ZJTEJERVYsIFRPX0ZJTENERVYsIFRPX0ZJTFNZTSwgVE9fRklMRklGTywgVE9fRklMU09DSywKLQlUT19GSUxDREYsIFRPX0ZJTElELCBUT19GSUxHSUQsIFRPX0ZJTFNFVEcsIFRPX0ZJTFNUQ0ssIFRPX0ZJTFVJRCwKLQlUT19GSUxSRCwgVE9fRklMR1osIFRPX0ZJTFRULCBUT19GSUxTRVRVLCBUT19GSUxXUiwgVE9fRklMRVgsCi0JLyogYmluYXJ5IG9wZXJhdG9ycyAqLwotCVRPX1NURVFMLCBUT19TVE5FUSwgVE9fU1RMVCwgVE9fU1RHVCwgVE9fSU5URVEsIFRPX0lOVE5FLCBUT19JTlRHVCwKLQlUT19JTlRHRSwgVE9fSU5UTFQsIFRPX0lOVExFLCBUT19GSUxFUSwgVE9fRklMTlQsIFRPX0ZJTE9ULAotCS8qIG5vdCBhbiBvcGVyYXRvciAqLwotCVRPX05PTk5VTEwJLyogIVRPX05PTk9QICovCi19OwotdHlwZWRlZiBlbnVtIFRlc3Rfb3AgVGVzdF9vcDsKLQotLyogVXNlZCBieSBUZXN0X2Vudi5pc2EoKSAob3JkZXIgaW1wb3J0YW50IC0gdXNlZCB0byBpbmRleCAqX3Rva2Vuc1tdIGFycmF5cykgKi8KLWVudW0gVGVzdF9tZXRhIHsKLQlUTV9PUiwJCS8qIC1vIG9yIHx8ICovCi0JVE1fQU5ELAkJLyogLWEgb3IgJiYgKi8KLQlUTV9OT1QsCQkvKiAhICovCi0JVE1fT1BBUkVOLAkvKiAoICovCi0JVE1fQ1BBUkVOLAkvKiApICovCi0JVE1fVU5PUCwJLyogdW5hcnkgb3BlcmF0b3IgKi8KLQlUTV9CSU5PUCwJLyogYmluYXJ5IG9wZXJhdG9yICovCi0JVE1fRU5ECQkvKiBlbmQgb2YgaW5wdXQgKi8KLX07Ci10eXBlZGVmIGVudW0gVGVzdF9tZXRhIFRlc3RfbWV0YTsKLQotI2RlZmluZSBURUZfRVJST1IJQklUKDApCQkvKiBzZXQgaWYgd2UndmUgaGl0IGFuIGVycm9yICovCi0jZGVmaW5lIFRFRl9EQlJBQ0tFVAlCSVQoMSkJCS8qIHNldCBpZiBbWyAuLiBdXSB0ZXN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHRlc3RfZW52IHsKLQl1bmlvbiB7Ci0JCWNvbnN0IGNoYXIgKip3cDsvKiB1c2VkIGJ5IHB0ZXN0XyogKi8KLQkJWFB0clYgKmF2OwkvKiB1c2VkIGJ5IGRidGVzdHBfKiAqLwotCX0gcG9zOwotCWNvbnN0IGNoYXIgKip3cF9lbmQ7CS8qIHVzZWQgYnkgcHRlc3RfKiAqLwotCVRlc3Rfb3AgKCppc2EpKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X21ldGEpOwotCWNvbnN0IGNoYXIgKigqZ2V0b3BuZCkgKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKLQlpbnQgKCpldmFsKShzdHJ1Y3QgdGVzdF9lbnYgKiwgVGVzdF9vcCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOwotCXZvaWQgKCplcnJvcikoc3RydWN0IHRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKLQlpbnQgZmxhZ3M7CQkvKiBURUZfKiAqLwotfSBUZXN0X2VudjsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGRidGVzdF90b2tlbnNbXTsKLQotVGVzdF9vcAl0ZXN0X2lzb3AoVGVzdF9tZXRhLCBjb25zdCBjaGFyICopOwotaW50IHRlc3RfZXZhbChUZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7Ci1pbnQgdGVzdF9wYXJzZShUZXN0X2VudiAqKTsKLQotRVhURVJOIGludCB0dHlfZmQgSV9fKC0xKTsJLyogZHVwJ2QgdHR5IGZpbGUgZGVzY3JpcHRvciAqLwotRVhURVJOIGludCB0dHlfZGV2dHR5OwkJLyogdHJ1ZSBpZiB0dHlfZmQgaXMgZnJvbSAvZGV2L3R0eSAqLwotRVhURVJOIHN0cnVjdCB0ZXJtaW9zIHR0eV9zdGF0ZTsJLyogc2F2ZWQgdHR5IHN0YXRlICovCi0KLWV4dGVybiB2b2lkIHR0eV9pbml0KGJvb2wsIGJvb2wpOwotZXh0ZXJuIHZvaWQgdHR5X2Nsb3NlKHZvaWQpOwotCi0vKiBiZSBzdXJlIG5vdCB0byBpbnRlcmZlcmUgd2l0aCBhbnlvbmUgZWxzZSdzIGlkZWEgYWJvdXQgRVhURVJOICovCi0jaWZkZWYgRVhURVJOX0RFRklORUQKLSMgdW5kZWYgRVhURVJOX0RFRklORUQKLSMgdW5kZWYgRVhURVJOCi0jZW5kaWYKLSN1bmRlZiBJX18KLQotI2VuZGlmIC8qICFNS1NIX0lOQ0xVREVTX09OTFkgKi8KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoX2ZsYWdzLmggYi9ta3NoL3NyYy9zaF9mbGFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTU0ODFlLi4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL3NoX2ZsYWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotI2lmIGRlZmluZWQoU0hGTEFHU19ERUZOUykKLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3NoX2ZsYWdzLmgsdiAxLjcgMjAxMC8wNy8xMyAxMzowNzo1OCB0ZyBFeHAgJCIpOwotI2RlZmluZSBGTihzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJLyogbm90aGluZyAqLwotI2VsaWYgZGVmaW5lZChTSEZMQUdTX0VOVU1TKQotI2RlZmluZSBGTihzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJY25hbWUsCi0jZGVmaW5lIEYwKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQljbmFtZSA9IDAsCi0jZWxpZiBkZWZpbmVkKFNIRkxBR1NfSVRFTVMpCi0jZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQl7IHNuYW1lLCBvY2hhciwgZmxhZ3MgfSwKLSNlbmRpZgotCi0jaWZuZGVmIEYwCi0jZGVmaW5lIEYwIEZOCi0jZW5kaWYKLQotLyoKLSAqIHNwZWNpYWwgY2FzZXMgKHNlZSBwYXJzZV9hcmdzKCkpOiAtQSwgLW8sIC1zCi0gKgotICogb3B0aW9ucyBhcmUgc29ydGVkIGJ5IHRoZWlyIGxvbmduYW1lcwotICovCi0KLS8qIC1hCWFsbCBuZXcgcGFyYW1ldGVycyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBleHBvcnQgYXR0cmlidXRlICovCi1GMCgiYWxsZXhwb3J0IiwgRkVYUE9SVCwgJ2EnLCBPRl9BTlkpCi0KLS8qIC4vLgliYWNrd2FyZHMgY29tcGF0OiBkdW1teSwgZW1pdHMgYSB3YXJuaW5nICovCi1GTigiYXJjNHJhbmRvbSIsIEZBUkM0UkFORE9NLCAwLCBPRl9BTlkpCi0KLSNpZiBIQVZFX05JQ0UKLS8qIC4vLgliZ25pY2UgKi8KLUZOKCJiZ25pY2UiLCBGQkdOSUNFLCAwLCBPRl9BTlkpCi0jZW5kaWYKLQotLyogLi8uCWVuYWJsZSB7fSBnbG9iYmluZyAobm9uLXN0YW5kYXJkKSAqLwotRk4oImJyYWNlZXhwYW5kIiwgRkJSQUNFRVhQQU5ELCAwLCBPRl9BTlkpCi0KLS8qIC4vLglFbWFjcyBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlICovCi1GTigiZW1hY3MiLCBGRU1BQ1MsIDAsIE9GX0FOWSkKLQotLyogLWUJcXVpdCBvbiBlcnJvciAqLwotRk4oImVycmV4aXQiLCBGRVJSRVhJVCwgJ2UnLCBPRl9BTlkpCi0KLS8qIC4vLglFbWFjcyBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlLCBnbWFjcyB2YXJpYW50ICovCi1GTigiZ21hY3MiLCBGR01BQ1MsIDAsIE9GX0FOWSkKLQotLyogLi8uCXJlYWRpbmcgRU9GIGRvZXMgbm90IGV4aXQgKi8KLUZOKCJpZ25vcmVlb2YiLCBGSUdOT1JFRU9GLCAwLCBPRl9BTlkpCi0KLS8qIC1pCWludGVyYWN0aXZlIHNoZWxsICovCi1GTigiaW50ZXJhY3RpdmUiLCBGVEFMS0lORywgJ2knLCBPRl9DTURMSU5FKQotCi0vKiAtawluYW1lPXZhbHVlIGFyZSByZWNvZ25pc2VkIGFueXdoZXJlICovCi1GTigia2V5d29yZCIsIEZLRVlXT1JELCAnaycsIE9GX0FOWSkKLQotLyogLWwJbG9naW4gc2hlbGwgKi8KLUZOKCJsb2dpbiIsIEZMT0dJTiwgJ2wnLCBPRl9DTURMSU5FKQotCi0vKiAtWAltYXJrIGRpcnMgd2l0aCAvIGluIGZpbGUgbmFtZSBjb21wbGV0aW9uICovCi1GTigibWFya2RpcnMiLCBGTUFSS0RJUlMsICdYJywgT0ZfQU5ZKQotCi0jaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAotLyogLW0Jam9iIGNvbnRyb2wgbW9uaXRvcmluZyAqLwotRk4oIm1vbml0b3IiLCBGTU9OSVRPUiwgJ20nLCBPRl9BTlkpCi0jZW5kaWYKLQotLyogLUMJZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovCi1GTigibm9jbG9iYmVyIiwgRk5PQ0xPQkJFUiwgJ0MnLCBPRl9BTlkpCi0KLS8qIC1uCWRvbid0IGV4ZWN1dGUgYW55IGNvbW1hbmRzICovCi1GTigibm9leGVjIiwgRk5PRVhFQywgJ24nLCBPRl9BTlkpCi0KLS8qIC1mCWRvbid0IGRvIGZpbGUgZ2xvYmJpbmcgKi8KLUZOKCJub2dsb2IiLCBGTk9HTE9CLCAnZicsIE9GX0FOWSkKLQotLyogLi8uCWRvbid0IGtpbGwgcnVubmluZyBqb2JzIHdoZW4gbG9naW4gc2hlbGwgZXhpdHMgKi8KLUZOKCJub2h1cCIsIEZOT0hVUCwgMCwgT0ZfQU5ZKQotCi0vKiAuLy4JZG9uJ3Qgc2F2ZSBmdW5jdGlvbnMgaW4gaGlzdG9yeSAobm8gZWZmZWN0KSAqLwotRk4oIm5vbG9nIiwgRk5PTE9HLCAwLCBPRl9BTlkpCi0KLSNpZm5kZWYgTUtTSF9VTkVNUExPWUVECi0vKiAtYglhc3luY2hyb25vdXMgam9iIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uICovCi1GTigibm90aWZ5IiwgRk5PVElGWSwgJ2InLCBPRl9BTlkpCi0jZW5kaWYKLQotLyogLXUJdXNpbmcgYW4gdW5zZXQgdmFyaWFibGUgaXMgYW4gZXJyb3IgKi8KLUZOKCJub3Vuc2V0IiwgRk5PVU5TRVQsICd1JywgT0ZfQU5ZKQotCi0vKiAuLy4JZG9uJ3QgZG8gbG9naWNhbCBjZHMvcHdkcyAobm9uLXN0YW5kYXJkKSAqLwotRk4oInBoeXNpY2FsIiwgRlBIWVNJQ0FMLCAwLCBPRl9BTlkpCi0KLS8qIC4vLglwZGtzaCBjb21wYXQ6IHNvbWV3aGF0IG1vcmUgUE9TSVhpc2ggbW9kZSAobm9uLXN0YW5kYXJkKSAqLwotRk4oInBvc2l4IiwgRlBPU0lYLCAwLCBPRl9BTlkpCi0KLS8qIC1wCXVzZSBzdWlkX3Byb2ZpbGU7IHByaXZpbGVnZWQgc2hlbGwgKi8KLUZOKCJwcml2aWxlZ2VkIiwgRlBSSVZJTEVHRUQsICdwJywgT0ZfQU5ZKQotCi0vKiAtcglyZXN0cmljdGVkIHNoZWxsICovCi1GTigicmVzdHJpY3RlZCIsIEZSRVNUUklDVEVELCAncicsIE9GX0NNRExJTkUpCi0KLS8qIC4vLglwZGtzaCBjb21wYXQ6IGNhbGxlZCBhcyBzaCBub3QgbWtzaDsga2x1ZGdlIG1vZGUgKG5vbi1zdGFuZGFyZCkgKi8KLUZOKCJzaCIsIEZTSCwgMCwgT0ZfQU5ZKQotCi0vKiAtcwkoaW52b2NhdGlvbikgcGFyc2Ugc3RkaW4gKHBzZXVkbyBub24tc3RhbmRhcmQpICovCi1GTigic3RkaW4iLCBGU1RESU4sICdzJywgT0ZfQ01ETElORSkKLQotLyogLWgJY3JlYXRlIHRyYWNrZWQgYWxpYXNlcyBmb3IgYWxsIGNvbW1hbmRzICovCi1GTigidHJhY2thbGwiLCBGVFJBQ0tBTEwsICdoJywgT0ZfQU5ZKQotCi0vKiAtVQllbmFibGUgVVRGLTggcHJvY2Vzc2luZyAobm9uLXN0YW5kYXJkKSAqLwotRk4oInV0ZjgtbW9kZSIsIEZVTklDT0RFLCAnVScsIE9GX0FOWSkKLQotLyogLXYJZWNobyBpbnB1dCAqLwotRk4oInZlcmJvc2UiLCBGVkVSQk9TRSwgJ3YnLCBPRl9BTlkpCi0KLSNpZiAhTUtTSF9TX05PVkkKLS8qIC4vLglWaSBjb21tYW5kIGxpbmUgZWRpdGluZyBtb2RlICovCi1GTigidmkiLCBGVkksIDAsIE9GX0FOWSkKLQotLyogLi8uCWVuYWJsZSBFU0MgYXMgZmlsZSBuYW1lIGNvbXBsZXRpb24gY2hhcmFjdGVyIChub24tc3RhbmRhcmQpICovCi1GTigidmktZXNjY29tcGxldGUiLCBGVklFU0NDT01QTEVURSwgMCwgT0ZfQU5ZKQotCi0vKiAuLy4JZW5hYmxlIFRhYiBhcyBmaWxlIG5hbWUgY29tcGxldGlvbiBjaGFyYWN0ZXIgKG5vbi1zdGFuZGFyZCkgKi8KLUZOKCJ2aS10YWJjb21wbGV0ZSIsIEZWSVRBQkNPTVBMRVRFLCAwLCBPRl9BTlkpCi0KLS8qIC4vLglhbHdheXMgcmVhZCBpbiByYXcgbW9kZSAobm8gZWZmZWN0KSAqLwotRk4oInZpcmF3IiwgRlZJUkFXLCAwLCBPRl9BTlkpCi0jZW5kaWYKLQotLyogLXgJZXhlY3V0aW9uIHRyYWNlIChkaXNwbGF5IGNvbW1hbmRzIGFzIHRoZXkgYXJlIHJ1bikgKi8KLUZOKCJ4dHJhY2UiLCBGWFRSQUNFLCAneCcsIE9GX0FOWSkKLQotLyogLWMJKGludm9jYXRpb24pIGV4ZWN1dGUgc3BlY2lmaWVkIGNvbW1hbmQgKi8KLUZOKE5VTEwsIEZDT01NQU5ELCAnYycsIE9GX0NNRExJTkUpCi0KLS8qCi0gKiBhbm9ueW1vdXMgZmxhZ3M6IHVzZWQgaW50ZXJuYWxseSBieSBzaGVsbCBvbmx5IChub3QgdmlzaWJsZSB0byB1c2VyKQotICovCi0KLS8qIC4vLgkoaW50ZXJuYWwpIGluaXRpYWwgc2hlbGwgd2FzIGludGVyYWN0aXZlICovCi1GTihOVUxMLCBGVEFMS0lOR19JLCAwLCBPRl9JTlRFUk5BTCkKLQotI3VuZGVmIEZOCi0jdW5kZWYgRjAKLSN1bmRlZiBTSEZMQUdTX0RFRk5TCi0jdW5kZWYgU0hGTEFHU19FTlVNUwotI3VuZGVmIFNIRkxBR1NfSVRFTVMKZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoZi5jIGIvbWtzaC9zcmMvc2hmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjI3NTIuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvc2hmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQyICswLDAgQEAKLS8qCSRPcGVuQlNEOiBzaGYuYyx2IDEuMTUgMjAwNi8wNC8wMiAwMDo0ODozMyBkZXJhYWR0IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5Ci0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2hmLmMsdiAxLjM2IDIwMTAvMDcvMTkgMjI6NDE6MDQgdGcgRXhwICQiKTsKLQotLyogZmxhZ3MgdG8gc2hmX2VtcHR5YnVmKCkgKi8KLSNkZWZpbmUgRUJfUkVBRFNXCTB4MDEJLyogYWJvdXQgdG8gc3dpdGNoIHRvIHJlYWRpbmcgKi8KLSNkZWZpbmUgRUJfR1JPVwkJMHgwMgkvKiBncm93IGJ1ZmZlciBpZiBuZWNlc3NhcnkgKFNUUklORytEWU5BTUlDKSAqLwotCi0vKgotICogUmVwbGFjZW1lbnQgc3RkaW8gcm91dGluZXMuIFN0ZGlvIGlzIHRvbyBmbGFrZXkgb24gdG9vIG1hbnkgbWFjaGluZXMKLSAqIHRvIGJlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIG11bHRpcGxlIHByb2Nlc3NlcyB1c2luZyB0aGUgc2FtZSB1bmRlcmx5aW5nCi0gKiBmaWxlIGRlc2NyaXB0b3JzLgotICovCi0KLXN0YXRpYyBpbnQgc2hmX2ZpbGxidWYoc3RydWN0IHNoZiAqKTsKLXN0YXRpYyBpbnQgc2hmX2VtcHR5YnVmKHN0cnVjdCBzaGYgKiwgaW50KTsKLQotLyogT3BlbiBhIGZpbGUuIEZpcnN0IHRocmVlIGFyZ3MgYXJlIGZvciBvcGVuKCksIGxhc3QgYXJnIGlzIGZsYWdzIGZvcgotICogdGhpcyBwYWNrYWdlLiBSZXR1cm5zIE5VTEwgaWYgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBvciBpZiBhIGR1cAotICogZmFpbHMuCi0gKi8KLXN0cnVjdCBzaGYgKgotc2hmX29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG9mbGFncywgaW50IG1vZGUsIGludCBzZmxhZ3MpCi17Ci0Jc3RydWN0IHNoZiAqc2hmOwotCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7Ci0JaW50IGZkOwotCi0JLyogRG9uZSBiZWZvcmUgb3BlbiBzbyBpZiBhbGxvY2EgZmFpbHMsIGZkIHdvbid0IGJlIGxvc3QuICovCi0Jc2hmID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGYpICsgYnNpemUsIEFURU1QKTsKLQlzaGYtPmFyZWFwID0gQVRFTVA7Ci0Jc2hmLT5idWYgPSAodW5zaWduZWQgY2hhciAqKSZzaGZbMV07Ci0Jc2hmLT5ic2l6ZSA9IGJzaXplOwotCXNoZi0+ZmxhZ3MgPSBTSEZfQUxMT0NTOwotCS8qIFJlc3QgZmlsbGVkIGluIGJ5IHJlb3Blbi4gKi8KLQotCWZkID0gb3BlbihuYW1lLCBvZmxhZ3MsIG1vZGUpOwotCWlmIChmZCA8IDApIHsKLQkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JaWYgKChzZmxhZ3MgJiBTSEZfTUFQSEkpICYmIGZkIDwgRkRCQVNFKSB7Ci0JCWludCBuZmQ7Ci0KLQkJbmZkID0gZmNudGwoZmQsIEZfRFVQRkQsIEZEQkFTRSk7Ci0JCWNsb3NlKGZkKTsKLQkJaWYgKG5mZCA8IDApIHsKLQkJCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0JCWZkID0gbmZkOwotCX0KLQlzZmxhZ3MgJj0gflNIRl9BQ0NNT0RFOwotCXNmbGFncyB8PSAob2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSA/IFNIRl9SRCA6Ci0JICAgICgob2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSA/IFNIRl9XUiA6IFNIRl9SRFdSKTsKLQotCXJldHVybiAoc2hmX3Jlb3BlbihmZCwgc2ZsYWdzLCBzaGYpKTsKLX0KLQotLyogU2V0IHVwIHRoZSBzaGYgc3RydWN0dXJlIGZvciBhIGZpbGUgZGVzY3JpcHRvci4gRG9lc24ndCBmYWlsLiAqLwotc3RydWN0IHNoZiAqCi1zaGZfZmRvcGVuKGludCBmZCwgaW50IHNmbGFncywgc3RydWN0IHNoZiAqc2hmKQotewotCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7Ci0KLQkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgb3V0IGNvcnJlY3QgcmVhZC93cml0ZSBmbGFncyAqLwotCWlmIChzZmxhZ3MgJiBTSEZfR0VURkwpIHsKLQkJaW50IGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOwotCi0JCWlmIChmbGFncyA8IDApCi0JCQkvKiB3aWxsIGdldCBhbiBlcnJvciBvbiBmaXJzdCByZWFkL3dyaXRlICovCi0JCQlzZmxhZ3MgfD0gU0hGX1JEV1I7Ci0JCWVsc2UgewotCQkJc3dpdGNoIChmbGFncyAmIE9fQUNDTU9ERSkgewotCQkJY2FzZSBPX1JET05MWToKLQkJCQlzZmxhZ3MgfD0gU0hGX1JEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPX1dST05MWToKLQkJCQlzZmxhZ3MgfD0gU0hGX1dSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPX1JEV1I6Ci0JCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCEoc2ZsYWdzICYgKFNIRl9SRCB8IFNIRl9XUikpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9mZG9wZW46IG1pc3NpbmcgcmVhZC93cml0ZSIpOwotCi0JaWYgKHNoZikgewotCQlpZiAoYnNpemUpIHsKLQkJCXNoZi0+YnVmID0gYWxsb2MoYnNpemUsIEFURU1QKTsKLQkJCXNmbGFncyB8PSBTSEZfQUxMT0NCOwotCQl9IGVsc2UKLQkJCXNoZi0+YnVmID0gTlVMTDsKLQl9IGVsc2UgewotCQlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZikgKyBic2l6ZSwgQVRFTVApOwotCQlzaGYtPmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopJnNoZlsxXTsKLQkJc2ZsYWdzIHw9IFNIRl9BTExPQ1M7Ci0JfQotCXNoZi0+YXJlYXAgPSBBVEVNUDsKLQlzaGYtPmZkID0gZmQ7Ci0Jc2hmLT5ycCA9IHNoZi0+d3AgPSBzaGYtPmJ1ZjsKLQlzaGYtPnJubGVmdCA9IDA7Ci0Jc2hmLT5yYnNpemUgPSBic2l6ZTsKLQlzaGYtPndubGVmdCA9IDA7IC8qIGZvcmNlIGNhbGwgdG8gc2hmX2VtcHR5YnVmKCkgKi8KLQlzaGYtPndic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IDAgOiBic2l6ZTsKLQlzaGYtPmZsYWdzID0gc2ZsYWdzOwotCXNoZi0+ZXJybm9fID0gMDsKLQlzaGYtPmJzaXplID0gYnNpemU7Ci0JaWYgKHNmbGFncyAmIFNIRl9DTEVYRUMpCi0JCWZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQlyZXR1cm4gKHNoZik7Ci19Ci0KLS8qIFNldCB1cCBhbiBleGlzdGluZyBzaGYgKGFuZCBidWZmZXIpIHRvIHVzZSB0aGUgZ2l2ZW4gZmQgKi8KLXN0cnVjdCBzaGYgKgotc2hmX3Jlb3BlbihpbnQgZmQsIGludCBzZmxhZ3MsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgYnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAoc2ZsYWdzICYgU0hGX1JEID8gMSA6IDApIDogU0hGX0JTSVpFOwotCi0JLyogdXNlIGZjbnRsKCkgdG8gZmlndXJlIG91dCBjb3JyZWN0IHJlYWQvd3JpdGUgZmxhZ3MgKi8KLQlpZiAoc2ZsYWdzICYgU0hGX0dFVEZMKSB7Ci0JCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKLQotCQlpZiAoZmxhZ3MgPCAwKQotCQkJLyogd2lsbCBnZXQgYW4gZXJyb3Igb24gZmlyc3QgcmVhZC93cml0ZSAqLwotCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOwotCQllbHNlIHsKLQkJCXN3aXRjaCAoZmxhZ3MgJiBPX0FDQ01PREUpIHsKLQkJCWNhc2UgT19SRE9OTFk6Ci0JCQkJc2ZsYWdzIHw9IFNIRl9SRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT19XUk9OTFk6Ci0JCQkJc2ZsYWdzIHw9IFNIRl9XUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT19SRFdSOgotCQkJCXNmbGFncyB8PSBTSEZfUkRXUjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghKHNmbGFncyAmIChTSEZfUkQgfCBTSEZfV1IpKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVvcGVuOiBtaXNzaW5nIHJlYWQvd3JpdGUiKTsKLQlpZiAoIXNoZiB8fCAhc2hmLT5idWYgfHwgc2hmLT5ic2l6ZSA8IGJzaXplKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZW9wZW46IGJhZCBzaGYvYnVmL2JzaXplIik7Ci0KLQkvKiBhc3N1bWVzIHNoZi0+YnVmIGFuZCBzaGYtPmJzaXplIGFscmVhZHkgc2V0IHVwICovCi0Jc2hmLT5mZCA9IGZkOwotCXNoZi0+cnAgPSBzaGYtPndwID0gc2hmLT5idWY7Ci0Jc2hmLT5ybmxlZnQgPSAwOwotCXNoZi0+cmJzaXplID0gYnNpemU7Ci0Jc2hmLT53bmxlZnQgPSAwOyAvKiBmb3JjZSBjYWxsIHRvIHNoZl9lbXB0eWJ1ZigpICovCi0Jc2hmLT53YnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAwIDogYnNpemU7Ci0Jc2hmLT5mbGFncyA9IChzaGYtPmZsYWdzICYgKFNIRl9BTExPQ1MgfCBTSEZfQUxMT0NCKSkgfCBzZmxhZ3M7Ci0Jc2hmLT5lcnJub18gPSAwOwotCWlmIChzZmxhZ3MgJiBTSEZfQ0xFWEVDKQotCQlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0JcmV0dXJuIChzaGYpOwotfQotCi0vKiBPcGVuIGEgc3RyaW5nIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIElmIHJlYWRpbmcsIGJzaXplIGlzIHRoZSBudW1iZXIKLSAqIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQuIElmIHdyaXRpbmcsIGJzaXplIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotICogYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbi4gSWYgc2hmIGlzIG5vdCBudWxsLCBpdCBpcyBmaWxsZWQgaW4gYW5kCi0gKiByZXR1cm5lZCwgaWYgaXQgaXMgbnVsbCwgc2hmIGlzIGFsbG9jYXRlZC4gSWYgd3JpdGluZyBhbmQgYnVmIGlzIG51bGwKLSAqIGFuZCBTSEZfRFlOQU1JQyBpcyBzZXQsIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIChpZiBic2l6ZSA+IDAsIGl0IGlzCi0gKiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzaXplKS4gRG9lc24ndCBmYWlsLgotICogV2hlbiB3cml0aW5nLCBhIGJ5dGUgaXMgcmVzZXJ2ZWQgZm9yIGEgdHJhaWxpbmcgbnVsbCAtIHNlZSBzaGZfc2Nsb3NlKCkuCi0gKi8KLXN0cnVjdCBzaGYgKgotc2hmX3NvcGVuKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBpbnQgc2ZsYWdzLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JLyogY2FuJ3QgaGF2ZSBhIHJlYWQrd3JpdGUgc3RyaW5nICovCi0JaWYgKCEoIShzZmxhZ3MgJiBTSEZfUkQpIF4gIShzZmxhZ3MgJiBTSEZfV1IpKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfc29wZW46IGZsYWdzIDB4JXgiLCBzZmxhZ3MpOwotCi0JaWYgKCFzaGYpIHsKLQkJc2hmID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGYpLCBBVEVNUCk7Ci0JCXNmbGFncyB8PSBTSEZfQUxMT0NTOwotCX0KLQlzaGYtPmFyZWFwID0gQVRFTVA7Ci0JaWYgKCFidWYgJiYgKHNmbGFncyAmIFNIRl9XUikgJiYgKHNmbGFncyAmIFNIRl9EWU5BTUlDKSkgewotCQlpZiAoYnNpemUgPD0gMCkKLQkJCWJzaXplID0gNjQ7Ci0JCXNmbGFncyB8PSBTSEZfQUxMT0NCOwotCQlidWYgPSBhbGxvYyhic2l6ZSwgc2hmLT5hcmVhcCk7Ci0JfQotCXNoZi0+ZmQgPSAtMTsKLQlzaGYtPmJ1ZiA9IHNoZi0+cnAgPSBzaGYtPndwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7Ci0Jc2hmLT5ybmxlZnQgPSBic2l6ZTsKLQlzaGYtPnJic2l6ZSA9IGJzaXplOwotCXNoZi0+d25sZWZ0ID0gYnNpemUgLSAxOwkvKiBzcGFjZSBmb3IgYSAnXDAnICovCi0Jc2hmLT53YnNpemUgPSBic2l6ZTsKLQlzaGYtPmZsYWdzID0gc2ZsYWdzIHwgU0hGX1NUUklORzsKLQlzaGYtPmVycm5vXyA9IDA7Ci0Jc2hmLT5ic2l6ZSA9IGJzaXplOwotCi0JcmV0dXJuIChzaGYpOwotfQotCi0vKiBGbHVzaCBhbmQgY2xvc2UgZmlsZSBkZXNjcmlwdG9yLCBmcmVlIHRoZSBzaGYgc3RydWN0dXJlICovCi1pbnQKLXNoZl9jbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc2hmLT5mZCA+PSAwKSB7Ci0JCXJldCA9IHNoZl9mbHVzaChzaGYpOwotCQlpZiAoY2xvc2Uoc2hmLT5mZCkgPCAwKQotCQkJcmV0ID0gRU9GOwotCX0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ1MpCi0JCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7Ci0JZWxzZSBpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ0IpCi0JCWFmcmVlKHNoZi0+YnVmLCBzaGYtPmFyZWFwKTsKLQotCXJldHVybiAocmV0KTsKLX0KLQotLyogRmx1c2ggYW5kIGNsb3NlIGZpbGUgZGVzY3JpcHRvciwgZG9uJ3QgZnJlZSBmaWxlIHN0cnVjdHVyZSAqLwotaW50Ci1zaGZfZmRjbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc2hmLT5mZCA+PSAwKSB7Ci0JCXJldCA9IHNoZl9mbHVzaChzaGYpOwotCQlpZiAoY2xvc2Uoc2hmLT5mZCkgPCAwKQotCQkJcmV0ID0gRU9GOwotCQlzaGYtPnJubGVmdCA9IDA7Ci0JCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKLQkJc2hmLT53bmxlZnQgPSAwOwotCQlzaGYtPmZkID0gLTE7Ci0JfQotCi0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBDbG9zZSBhIHN0cmluZyAtIGlmIGl0IHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcsIGl0IGlzIG51bGwgdGVybWluYXRlZDsKLSAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYW5kIGZyZWVzIHNoZiBpZiBpdCB3YXMgYWxsb2NhdGVkCi0gKiAoZG9lcyBub3QgZnJlZSBzdHJpbmcgaWYgaXQgd2FzIGFsbG9jYXRlZCkuCi0gKi8KLWNoYXIgKgotc2hmX3NjbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JdW5zaWduZWQgY2hhciAqcyA9IHNoZi0+YnVmOwotCi0JLyogbnVsbCB0ZXJtaW5hdGUgKi8KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9XUikgewotCQlzaGYtPndubGVmdCsrOwotCQlzaGZfcHV0YygnXDAnLCBzaGYpOwotCX0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ1MpCi0JCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7Ci0JcmV0dXJuICgoY2hhciAqKXMpOwotfQotCi0vKiBVbi1yZWFkIHdoYXQgaGFzIGJlZW4gcmVhZCBidXQgbm90IGV4YW1pbmVkLCBvciB3cml0ZSB3aGF0IGhhcyBiZWVuCi0gKiBidWZmZXJlZC4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCBFT0YgZm9yICh3cml0ZSkgZXJyb3IuCi0gKi8KLWludAotc2hmX2ZsdXNoKHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpCi0JCXJldHVybiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpID8gRU9GIDogMCk7Ci0KLQlpZiAoc2hmLT5mZCA8IDApCi0JCWludGVybmFsX2Vycm9yZigic2hmX2ZsdXNoOiBubyBmZCIpOwotCi0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHsKLQkJZXJybm8gPSBzaGYtPmVycm5vXzsKLQkJcmV0dXJuIChFT0YpOwotCX0KLQotCWlmIChzaGYtPmZsYWdzICYgU0hGX1JFQURJTkcpIHsKLQkJc2hmLT5mbGFncyAmPSB+KFNIRl9FT0YgfCBTSEZfUkVBRElORyk7Ci0JCWlmIChzaGYtPnJubGVmdCA+IDApIHsKLQkJCWxzZWVrKHNoZi0+ZmQsIChvZmZfdCktc2hmLT5ybmxlZnQsIFNFRUtfQ1VSKTsKLQkJCXNoZi0+cm5sZWZ0ID0gMDsKLQkJCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKLQkJfQotCQlyZXR1cm4gKDApOwotCX0gZWxzZSBpZiAoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKQotCQlyZXR1cm4gKHNoZl9lbXB0eWJ1ZihzaGYsIDApKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbnkgYnVmZmVyZWQgZGF0YS4gSWYgY3VycmVudGx5IHJlYWRpbmcsIGZsdXNoZXMgdGhlIHJlYWQKLSAqIGJ1ZmZlci4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCBFT0YgZm9yICh3cml0ZSkgZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQKLXNoZl9lbXB0eWJ1ZihzdHJ1Y3Qgc2hmICpzaGYsIGludCBmbGFncykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSAmJiBzaGYtPmZkIDwgMCkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZW1wdHlidWY6IG5vIGZkIik7Ci0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgewotCQllcnJubyA9IHNoZi0+ZXJybm9fOwotCQlyZXR1cm4gKEVPRik7Ci0JfQotCi0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfUkVBRElORykgewotCQlpZiAoZmxhZ3MgJiBFQl9SRUFEU1cpIC8qIGRvZXNuJ3QgaGFwcGVuICovCi0JCQlyZXR1cm4gKDApOwotCQlyZXQgPSBzaGZfZmx1c2goc2hmKTsKLQkJc2hmLT5mbGFncyAmPSB+U0hGX1JFQURJTkc7Ci0JfQotCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgewotCQl1bnNpZ25lZCBjaGFyICpuYnVmOwotCi0JCS8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgU0hGX0FMTE9DUyBpcyBub3Qgc2V0IGlmIFNIRl9BTExPQ0IKLQkJICogaXMgc2V0Li4uIChjaGFuZ2luZyB0aGUgc2hmIHBvaW50ZXIgY291bGQgY2F1c2UgcHJvYmxlbXMpCi0JCSAqLwotCQlpZiAoIShmbGFncyAmIEVCX0dST1cpIHx8ICEoc2hmLT5mbGFncyAmIFNIRl9EWU5BTUlDKSB8fAotCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0FMTE9DQikpCi0JCQlyZXR1cm4gKEVPRik7Ci0JCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIGJ1ZmZlciAqLwotCQluYnVmID0gYXJlc2l6ZShzaGYtPmJ1ZiwgMiAqIHNoZi0+d2JzaXplLCBzaGYtPmFyZWFwKTsKLQkJc2hmLT5ycCA9IG5idWYgKyAoc2hmLT5ycCAtIHNoZi0+YnVmKTsKLQkJc2hmLT53cCA9IG5idWYgKyAoc2hmLT53cCAtIHNoZi0+YnVmKTsKLQkJc2hmLT5yYnNpemUgKz0gc2hmLT53YnNpemU7Ci0JCXNoZi0+d25sZWZ0ICs9IHNoZi0+d2JzaXplOwotCQlzaGYtPndic2l6ZSAqPSAyOwotCQlzaGYtPmJ1ZiA9IG5idWY7Ci0JfSBlbHNlIHsKLQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgewotCQkJaW50IG50b3dyaXRlID0gc2hmLT53cCAtIHNoZi0+YnVmOwotCQkJdW5zaWduZWQgY2hhciAqYnVmID0gc2hmLT5idWY7Ci0JCQlpbnQgbjsKLQotCQkJd2hpbGUgKG50b3dyaXRlID4gMCkgewotCQkJCW4gPSB3cml0ZShzaGYtPmZkLCBidWYsIG50b3dyaXRlKTsKLQkJCQlpZiAobiA8IDApIHsKLQkJCQkJaWYgKGVycm5vID09IEVJTlRSICYmCi0JCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKLQkJCQkJc2hmLT5lcnJub18gPSBlcnJubzsKLQkJCQkJc2hmLT53bmxlZnQgPSAwOwotCQkJCQlpZiAoYnVmICE9IHNoZi0+YnVmKSB7Ci0JCQkJCQkvKiBhbGxvdyBhIHNlY29uZCBmbHVzaAotCQkJCQkJICogdG8gd29yayAqLwotCQkJCQkJbWVtbW92ZShzaGYtPmJ1ZiwgYnVmLAotCQkJCQkJICAgIG50b3dyaXRlKTsKLQkJCQkJCXNoZi0+d3AgPSBzaGYtPmJ1ZiArIG50b3dyaXRlOwotCQkJCQl9Ci0JCQkJCXJldHVybiAoRU9GKTsKLQkJCQl9Ci0JCQkJYnVmICs9IG47Ci0JCQkJbnRvd3JpdGUgLT0gbjsKLQkJCX0KLQkJCWlmIChmbGFncyAmIEVCX1JFQURTVykgewotCQkJCXNoZi0+d3AgPSBzaGYtPmJ1ZjsKLQkJCQlzaGYtPndubGVmdCA9IDA7Ci0JCQkJc2hmLT5mbGFncyAmPSB+U0hGX1dSSVRJTkc7Ci0JCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJfQotCQlzaGYtPndwID0gc2hmLT5idWY7Ci0JCXNoZi0+d25sZWZ0ID0gc2hmLT53YnNpemU7Ci0JfQotCXNoZi0+ZmxhZ3MgfD0gU0hGX1dSSVRJTkc7Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIEZpbGwgdXAgYSByZWFkIGJ1ZmZlci4gUmV0dXJucyBFT0YgZm9yIGEgcmVhZCBlcnJvciwgMCBvdGhlcndpc2UuICovCi1zdGF0aWMgaW50Ci1zaGZfZmlsbGJ1ZihzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKQotCQlyZXR1cm4gKDApOwotCi0JaWYgKHNoZi0+ZmQgPCAwKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9maWxsYnVmOiBubyBmZCIpOwotCi0JaWYgKHNoZi0+ZmxhZ3MgJiAoU0hGX0VPRiB8IFNIRl9FUlJPUikpIHsKLQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpCi0JCQllcnJubyA9IHNoZi0+ZXJybm9fOwotCQlyZXR1cm4gKEVPRik7Ci0JfQotCi0JaWYgKChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX1JFQURTVykgPT0gRU9GKQotCQlyZXR1cm4gKEVPRik7Ci0KLQlzaGYtPmZsYWdzIHw9IFNIRl9SRUFESU5HOwotCi0Jc2hmLT5ycCA9IHNoZi0+YnVmOwotCXdoaWxlICgxKSB7Ci0JCXNoZi0+cm5sZWZ0ID0gYmxvY2tpbmdfcmVhZChzaGYtPmZkLCAoY2hhciAqKSBzaGYtPmJ1ZiwKLQkJICAgIHNoZi0+cmJzaXplKTsKLQkJaWYgKHNoZi0+cm5sZWZ0IDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJgotCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0lOVEVSUlVQVCkpCi0JCQljb250aW51ZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChzaGYtPnJubGVmdCA8PSAwKSB7Ci0JCWlmIChzaGYtPnJubGVmdCA8IDApIHsKLQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOwotCQkJc2hmLT5lcnJub18gPSBlcnJubzsKLQkJCXNoZi0+cm5sZWZ0ID0gMDsKLQkJCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKLQkJCXJldHVybiAoRU9GKTsKLQkJfQotCQlzaGYtPmZsYWdzIHw9IFNIRl9FT0Y7Ci0JfQotCXJldHVybiAoMCk7Ci19Ci0KLS8qIFJlYWQgYSBidWZmZXIgZnJvbSBzaGYuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gYnVmLAotICogaWYgbm8gYnl0ZXMgd2VyZSByZWFkLCByZXR1cm5zIDAgaWYgZW5kIG9mIGZpbGUgd2FzIHNlZW4sIEVPRiBpZgotICogYSByZWFkIGVycm9yIG9jY3VycmVkLgotICovCi1pbnQKLXNoZl9yZWFkKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaW50IG9yaWdfYnNpemUgPSBic2l6ZTsKLQlpbnQgbmNvcHk7Ci0KLQlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVhZDogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKLQotCWlmIChic2l6ZSA8PSAwKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZWFkOiBic2l6ZSAlZCIsIGJzaXplKTsKLQotCXdoaWxlIChic2l6ZSA+IDApIHsKLQkJaWYgKHNoZi0+cm5sZWZ0ID09IDAgJiYKLQkJICAgIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRiB8fCBzaGYtPnJubGVmdCA9PSAwKSkKLQkJCWJyZWFrOwotCQluY29weSA9IHNoZi0+cm5sZWZ0OwotCQlpZiAobmNvcHkgPiBic2l6ZSkKLQkJCW5jb3B5ID0gYnNpemU7Ci0JCW1lbWNweShidWYsIHNoZi0+cnAsIG5jb3B5KTsKLQkJYnVmICs9IG5jb3B5OwotCQlic2l6ZSAtPSBuY29weTsKLQkJc2hmLT5ycCArPSBuY29weTsKLQkJc2hmLT5ybmxlZnQgLT0gbmNvcHk7Ci0JfQotCS8qIE5vdGU6IGZyZWFkKDNTKSByZXR1cm5zIDAgZm9yIGVycm9ycyAtIHRoaXMgZG9lc24ndCAqLwotCXJldHVybiAob3JpZ19ic2l6ZSA9PSBic2l6ZSA/IChzaGZfZXJyb3Ioc2hmKSA/IEVPRiA6IDApIDoKLQkgICAgb3JpZ19ic2l6ZSAtIGJzaXplKTsKLX0KLQotLyogUmVhZCB1cCB0byBhIG5ld2xpbmUgb3IgRU9GLiBUaGUgbmV3bGluZSBpcyBwdXQgaW4gYnVmOyBidWYgaXMgYWx3YXlzCi0gKiBudWxsIHRlcm1pbmF0ZWQuIFJldHVybnMgTlVMTCBvbiByZWFkIGVycm9yIG9yIGlmIG5vdGhpbmcgd2FzIHJlYWQgYmVmb3JlCi0gKiBlbmQgb2YgZmlsZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG51bGwgYnl0ZSBpbiBidWYgb3RoZXJ3aXNlLgotICovCi1jaGFyICoKLXNoZl9nZXRzZShjaGFyICpidWYsIGludCBic2l6ZSwgc3RydWN0IHNoZiAqc2hmKQotewotCXVuc2lnbmVkIGNoYXIgKmVuZDsKLQlpbnQgbmNvcHk7Ci0JY2hhciAqb3JpZ19idWYgPSBidWY7Ci0KLQlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKLQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZ2V0c2U6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7Ci0KLQlpZiAoYnNpemUgPD0gMCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCS0tYnNpemU7CS8qIHNhdmUgcm9vbSBmb3IgbnVsbCAqLwotCWRvIHsKLQkJaWYgKHNoZi0+cm5sZWZ0ID09IDApIHsKLQkJCWlmIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRikKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQkJaWYgKHNoZi0+cm5sZWZ0ID09IDApIHsKLQkJCQkqYnVmID0gJ1wwJzsKLQkJCQlyZXR1cm4gKGJ1ZiA9PSBvcmlnX2J1ZiA/IE5VTEwgOiBidWYpOwotCQkJfQotCQl9Ci0JCWVuZCA9ICh1bnNpZ25lZCBjaGFyICopbWVtY2hyKChjaGFyICopIHNoZi0+cnAsICdcbicsCi0JCSAgICBzaGYtPnJubGVmdCk7Ci0JCW5jb3B5ID0gZW5kID8gZW5kIC0gc2hmLT5ycCArIDEgOiBzaGYtPnJubGVmdDsKLQkJaWYgKG5jb3B5ID4gYnNpemUpCi0JCQluY29weSA9IGJzaXplOwotCQltZW1jcHkoYnVmLCAoY2hhciAqKSBzaGYtPnJwLCBuY29weSk7Ci0JCXNoZi0+cnAgKz0gbmNvcHk7Ci0JCXNoZi0+cm5sZWZ0IC09IG5jb3B5OwotCQlidWYgKz0gbmNvcHk7Ci0JCWJzaXplIC09IG5jb3B5OwotCX0gd2hpbGUgKCFlbmQgJiYgYnNpemUpOwotCSpidWYgPSAnXDAnOwotCXJldHVybiAoYnVmKTsKLX0KLQotLyogUmV0dXJucyB0aGUgY2hhciByZWFkLiBSZXR1cm5zIEVPRiBmb3IgZXJyb3IgYW5kIGVuZCBvZiBmaWxlLiAqLwotaW50Ci1zaGZfZ2V0Y2hhcihzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCi0JCWludGVybmFsX2Vycm9yZigic2hmX2dldGNoYXI6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7Ci0KLQlpZiAoc2hmLT5ybmxlZnQgPT0gMCAmJiAoc2hmX2ZpbGxidWYoc2hmKSA9PSBFT0YgfHwgc2hmLT5ybmxlZnQgPT0gMCkpCi0JCXJldHVybiAoRU9GKTsKLQktLXNoZi0+cm5sZWZ0OwotCXJldHVybiAoKnNoZi0+cnArKyk7Ci19Ci0KLS8qIFB1dCBhIGNoYXJhY3RlciBiYWNrIGluIHRoZSBpbnB1dCBzdHJlYW0uIFJldHVybnMgdGhlIGNoYXJhY3RlciBpZgotICogc3VjY2Vzc2Z1bCwgRU9GIGlmIHRoZXJlIGlzIG5vIHJvb20uCi0gKi8KLWludAotc2hmX3VuZ2V0YyhpbnQgYywgc3RydWN0IHNoZiAqc2hmKQotewotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl91bmdldGM6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7Ci0KLQlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHx8IGMgPT0gRU9GIHx8Ci0JICAgIChzaGYtPnJwID09IHNoZi0+YnVmICYmIHNoZi0+cm5sZWZ0KSkKLQkJcmV0dXJuIChFT0YpOwotCi0JaWYgKChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX1JFQURTVykgPT0gRU9GKQotCQlyZXR1cm4gKEVPRik7Ci0KLQlpZiAoc2hmLT5ycCA9PSBzaGYtPmJ1ZikKLQkJc2hmLT5ycCA9IHNoZi0+YnVmICsgc2hmLT5yYnNpemU7Ci0JaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7Ci0JCS8qIENhbiB1bmdldCB3aGF0IHdhcyByZWFkLCBidXQgbm90IHNvbWV0aGluZyBkaWZmZXJlbnQgLSB3ZQotCQkgKiBkb24ndCB3YW50IHRvIG1vZGlmeSBhIHN0cmluZy4KLQkJICovCi0JCWlmIChzaGYtPnJwWy0xXSAhPSBjKQotCQkJcmV0dXJuIChFT0YpOwotCQlzaGYtPmZsYWdzICY9IH5TSEZfRU9GOwotCQlzaGYtPnJwLS07Ci0JCXNoZi0+cm5sZWZ0Kys7Ci0JCXJldHVybiAoYyk7Ci0JfQotCXNoZi0+ZmxhZ3MgJj0gflNIRl9FT0Y7Ci0JKi0tKHNoZi0+cnApID0gYzsKLQlzaGYtPnJubGVmdCsrOwotCXJldHVybiAoYyk7Ci19Ci0KLS8qIFdyaXRlIGEgY2hhcmFjdGVyLiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmCi0gKiB0aGUgY2hhciBjb3VsZCBub3QgYmUgd3JpdHRlbi4KLSAqLwotaW50Ci1zaGZfcHV0Y2hhcihpbnQgYywgc3RydWN0IHNoZiAqc2hmKQotewotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9wdXRjaGFyOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOwotCi0JaWYgKGMgPT0gRU9GKQotCQlyZXR1cm4gKEVPRik7Ci0KLQlpZiAoc2hmLT5mbGFncyAmIFNIRl9VTkJVRikgewotCQl1bnNpZ25lZCBjaGFyIGNjID0gKHVuc2lnbmVkIGNoYXIpYzsKLQkJaW50IG47Ci0KLQkJaWYgKHNoZi0+ZmQgPCAwKQotCQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcHV0Y2hhcjogbm8gZmQiKTsKLQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHsKLQkJCWVycm5vID0gc2hmLT5lcnJub187Ci0JCQlyZXR1cm4gKEVPRik7Ci0JCX0KLQkJd2hpbGUgKChuID0gd3JpdGUoc2hmLT5mZCwgJmNjLCAxKSkgIT0gMSkKLQkJCWlmIChuIDwgMCkgewotCQkJCWlmIChlcnJubyA9PSBFSU5UUiAmJgotCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKLQkJCQkJY29udGludWU7Ci0JCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7Ci0JCQkJc2hmLT5lcnJub18gPSBlcnJubzsKLQkJCQlyZXR1cm4gKEVPRik7Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJLyogRmx1c2ggZGVhbHMgd2l0aCBzdHJpbmdzIGFuZCBzdGlja3kgZXJyb3JzICovCi0JCWlmIChzaGYtPndubGVmdCA9PSAwICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX0dST1cpID09IEVPRikKLQkJCXJldHVybiAoRU9GKTsKLQkJc2hmLT53bmxlZnQtLTsKLQkJKnNoZi0+d3ArKyA9IGM7Ci0JfQotCi0JcmV0dXJuIChjKTsKLX0KLQotLyogV3JpdGUgYSBzdHJpbmcuIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHN1Y2Nlc3NmdWwsIEVPRiBpZgotICogdGhlIHN0cmluZyBjb3VsZCBub3QgYmUgd3JpdHRlbi4KLSAqLwotaW50Ci1zaGZfcHV0cyhjb25zdCBjaGFyICpzLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKCFzKQotCQlyZXR1cm4gKEVPRik7Ci0KLQlyZXR1cm4gKHNoZl93cml0ZShzLCBzdHJsZW4ocyksIHNoZikpOwotfQotCi0vKiBXcml0ZSBhIGJ1ZmZlci4gUmV0dXJucyBuYnl0ZXMgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmIHRoZXJlIGlzIGFuIGVycm9yLiAqLwotaW50Ci1zaGZfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaW50IG4sIG5jb3B5LCBvcmlnX25ieXRlcyA9IG5ieXRlczsKLQotCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl93cml0ZTogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKLQotCWlmIChuYnl0ZXMgPCAwKQotCQlpbnRlcm5hbF9lcnJvcmYoInNoZl93cml0ZTogbmJ5dGVzICVkIiwgbmJ5dGVzKTsKLQotCS8qIERvbid0IGJ1ZmZlciBpZiBidWZmZXIgaXMgZW1wdHkgYW5kIHdlJ3JlIHdyaXR0aW5nIGEgbGFyZ2UgYW1vdW50LiAqLwotCWlmICgobmNvcHkgPSBzaGYtPndubGVmdCkgJiYKLQkgICAgKHNoZi0+d3AgIT0gc2hmLT5idWYgfHwgbmJ5dGVzIDwgc2hmLT53bmxlZnQpKSB7Ci0JCWlmIChuY29weSA+IG5ieXRlcykKLQkJCW5jb3B5ID0gbmJ5dGVzOwotCQltZW1jcHkoc2hmLT53cCwgYnVmLCBuY29weSk7Ci0JCW5ieXRlcyAtPSBuY29weTsKLQkJYnVmICs9IG5jb3B5OwotCQlzaGYtPndwICs9IG5jb3B5OwotCQlzaGYtPndubGVmdCAtPSBuY29weTsKLQl9Ci0JaWYgKG5ieXRlcyA+IDApIHsKLQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7Ci0JCQkvKiByZXNpemUgYnVmZmVyIHVudGlsIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGxlZnQgKi8KLQkJCXdoaWxlIChuYnl0ZXMgPiBzaGYtPndubGVmdCkKLQkJCQlpZiAoc2hmX2VtcHR5YnVmKHNoZiwgRUJfR1JPVykgPT0gRU9GKQotCQkJCQlyZXR1cm4gKEVPRik7Ci0JCQkvKiB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgaW50byB0aGUgYnVmZmVyICovCi0JCX0gZWxzZSB7Ci0JCQkvKiBmbHVzaCBkZWFscyB3aXRoIHN0aWNreSBlcnJvcnMgKi8KLQkJCWlmIChzaGZfZW1wdHlidWYoc2hmLCBFQl9HUk9XKSA9PSBFT0YpCi0JCQkJcmV0dXJuIChFT0YpOwotCQkJLyogd3JpdGUgY2h1bmtzIGxhcmdlciB0aGFuIHdpbmRvdyBzaXplIGRpcmVjdGx5ICovCi0JCQlpZiAobmJ5dGVzID4gc2hmLT53YnNpemUpIHsKLQkJCQluY29weSA9IG5ieXRlczsKLQkJCQlpZiAoc2hmLT53YnNpemUpCi0JCQkJCW5jb3B5IC09IG5ieXRlcyAlIHNoZi0+d2JzaXplOwotCQkJCW5ieXRlcyAtPSBuY29weTsKLQkJCQl3aGlsZSAobmNvcHkgPiAwKSB7Ci0JCQkJCW4gPSB3cml0ZShzaGYtPmZkLCBidWYsIG5jb3B5KTsKLQkJCQkJaWYgKG4gPCAwKSB7Ci0JCQkJCQlpZiAoZXJybm8gPT0gRUlOVFIgJiYKLQkJCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOwotCQkJCQkJc2hmLT5lcnJub18gPSBlcnJubzsKLQkJCQkJCXNoZi0+d25sZWZ0ID0gMDsKLQkJCQkJCS8qCi0JCQkJCQkgKiBOb3RlOiBmd3JpdGUoMykgcmV0dXJucyAwCi0JCQkJCQkgKiBmb3IgZXJyb3JzIC0gdGhpcyBkb2Vzbid0Ci0JCQkJCQkgKi8KLQkJCQkJCXJldHVybiAoRU9GKTsKLQkJCQkJfQotCQkJCQlidWYgKz0gbjsKLQkJCQkJbmNvcHkgLT0gbjsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiAuLi4gYW5kIGJ1ZmZlciB0aGUgcmVzdCAqLwotCQl9Ci0JCWlmIChuYnl0ZXMgPiAwKSB7Ci0JCQkvKiB3cml0ZSByZW1haW5pbmcgYnl0ZXMgdG8gYnVmZmVyICovCi0JCQltZW1jcHkoc2hmLT53cCwgYnVmLCBuYnl0ZXMpOwotCQkJc2hmLT53cCArPSBuYnl0ZXM7Ci0JCQlzaGYtPndubGVmdCAtPSBuYnl0ZXM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKG9yaWdfbmJ5dGVzKTsKLX0KLQotaW50Ci1zaGZfZnByaW50ZihzdHJ1Y3Qgc2hmICpzaGYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgbjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbiA9IHNoZl92ZnByaW50ZihzaGYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuIChuKTsKLX0KLQotaW50Ci1zaGZfc25wcmludGYoY2hhciAqYnVmLCBpbnQgYnNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXN0cnVjdCBzaGYgc2hmOwotCXZhX2xpc3QgYXJnczsKLQlpbnQgbjsKLQotCWlmICghYnVmIHx8IGJzaXplIDw9IDApCi0JCWludGVybmFsX2Vycm9yZigic2hmX3NucHJpbnRmOiBidWYgJXAsIGJzaXplICVkIiwgYnVmLCBic2l6ZSk7Ci0KLQlzaGZfc29wZW4oYnVmLCBic2l6ZSwgU0hGX1dSLCAmc2hmKTsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCW4gPSBzaGZfdmZwcmludGYoJnNoZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0Jc2hmX3NjbG9zZSgmc2hmKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCi0JcmV0dXJuIChuKTsKLX0KLQotY2hhciAqCi1zaGZfc21wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0Jc3RydWN0IHNoZiBzaGY7Ci0JdmFfbGlzdCBhcmdzOwotCi0Jc2hmX3NvcGVuKE5VTEwsIDAsIFNIRl9XUnxTSEZfRFlOQU1JQywgJnNoZik7Ci0JdmFfc3RhcnQoYXJncywgZm10KTsKLQlzaGZfdmZwcmludGYoJnNoZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCi19Ci0KLSN1bmRlZiBGUAkJCS8qIGlmIHlvdSB3YW50IGZsb2F0aW5nIHBvaW50IHN0dWZmICovCi0KLSNpZm5kZWYgRE1BWEVYUAotIyBkZWZpbmUgRE1BWEVYUAkxMjgJLyogc2hvdWxkIGJlIGJpZyBlbm91Z2ggKi8KLSNlbmRpZgotCi0jZGVmaW5lIEJVRl9TSVpFCTEyOAotLyogbXVzdCBiZSA+IE1BWChETUFYRVhQLCBsb2cxMChwb3coMiwgRFNJR05JRikpKSArIGNlaWwobG9nMTAoRE1BWEVYUCkpICsgOAotICogKEkgdGhpbmspOyBzaW5jZSBpdCdzIGhhcmQgdG8gZXhwcmVzcyBhcyBhIGNvbnN0YW50LCBqdXN0IHVzZSBhIGxhcmdlIGJ1ZmZlcgotICovCi0jZGVmaW5lIEZQQlVGX1NJWkUJKERNQVhFWFArMTYpCi0KLSNkZWZpbmUJRkxfSEFTSAkJMHgwMDEJLyogJyMnIHNlZW4gKi8KLSNkZWZpbmUgRkxfUExVUwkJMHgwMDIJLyogJysnIHNlZW4gKi8KLSNkZWZpbmUgRkxfUklHSFQJMHgwMDQJLyogJy0nIHNlZW4gKi8KLSNkZWZpbmUgRkxfQkxBTksJMHgwMDgJLyogJyAnIHNlZW4gKi8KLSNkZWZpbmUgRkxfU0hPUlQJMHgwMTAJLyogJ2gnIHNlZW4gKi8KLSNkZWZpbmUgRkxfTE9ORwkJMHgwMjAJLyogJ2wnIHNlZW4gKi8KLSNkZWZpbmUgRkxfWkVSTwkJMHgwNDAJLyogJzAnIHNlZW4gKi8KLSNkZWZpbmUgRkxfRE9UCQkweDA4MAkvKiAnLicgc2VlbiAqLwotI2RlZmluZSBGTF9VUFBFUgkweDEwMAkvKiBmb3JtYXQgY2hhcmFjdGVyIHdhcyB1cHBlcmNhc2UgKi8KLSNkZWZpbmUgRkxfTlVNQkVSCTB4MjAwCS8qIGEgbnVtYmVyIHdhcyBmb3JtYXRlZCAlW2RvdXhlZmddICovCi0KLQotaW50Ci1zaGZfdmZwcmludGYoc3RydWN0IHNoZiAqc2hmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKLXsKLQljb25zdCBjaGFyICpzOwotCWNoYXIgYywgKmNwOwotCWludCB0bXAgPSAwLCBmaWVsZCwgcHJlY2lzaW9uLCBsZW4sIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbG51bTsKLQkvKiAlI28gcHJvZHVjZXMgdGhlIGxvbmdlc3Qgb3V0cHV0ICovCi0JY2hhciBudW1idWZbKDggKiBzaXplb2YobG9uZykgKyAyKSAvIDMgKyAxXTsKLQkvKiB0aGlzIHN0dWZmIGZvciBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciAqLwotCWludCBud3JpdHRlbiA9IDA7Ci0KLQlpZiAoIWZtdCkKLQkJcmV0dXJuICgwKTsKLQotCXdoaWxlICgoYyA9ICpmbXQrKykpIHsKLQkJaWYgKGMgIT0gJyUnKSB7Ci0JCQlzaGZfcHV0YyhjLCBzaGYpOwotCQkJbndyaXR0ZW4rKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qCi0JCSAqIFRoaXMgd2lsbCBhY2NlcHQgZmxhZ3MvZmllbGRzIGluIGFueSBvcmRlciAtIG5vdAotCQkgKiBqdXN0IHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gcHJpbnRmKDMpLCBidXQgdGhpcyBpcwotCQkgKiB0aGUgd2F5IF9kb3BybnQoKSBzZWVtcyB0byB3b3JrIChvbiBic2QgYW5kIHN5c1YpLgotCQkgKiBUaGUgb25seSByZXN0cmljdGlvbiBpcyB0aGF0IHRoZSBmb3JtYXQgY2hhcmFjdGVyIG11c3QKLQkJICogY29tZSBsYXN0IDotKS4KLQkJICovCi0JCWZsYWdzID0gZmllbGQgPSBwcmVjaXNpb24gPSAwOwotCQlmb3IgKCA7IChjID0gKmZtdCsrKSA7ICkgewotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICcjJzoKLQkJCQlmbGFncyB8PSBGTF9IQVNIOwotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICcrJzoKLQkJCQlmbGFncyB8PSBGTF9QTFVTOwotCQkJCWNvbnRpbnVlOwotCi0JCQljYXNlICctJzoKLQkJCQlmbGFncyB8PSBGTF9SSUdIVDsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnICc6Ci0JCQkJZmxhZ3MgfD0gRkxfQkxBTks7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJzAnOgotCQkJCWlmICghKGZsYWdzICYgRkxfRE9UKSkKLQkJCQkJZmxhZ3MgfD0gRkxfWkVSTzsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSAnLic6Ci0JCQkJZmxhZ3MgfD0gRkxfRE9UOwotCQkJCXByZWNpc2lvbiA9IDA7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJyonOgotCQkJCXRtcCA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJCWlmIChmbGFncyAmIEZMX0RPVCkKLQkJCQkJcHJlY2lzaW9uID0gdG1wOwotCQkJCWVsc2UgaWYgKChmaWVsZCA9IHRtcCkgPCAwKSB7Ci0JCQkJCWZpZWxkID0gLWZpZWxkOwotCQkJCQlmbGFncyB8PSBGTF9SSUdIVDsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJ2wnOgotCQkJCWZsYWdzIHw9IEZMX0xPTkc7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgJ2gnOgotCQkJCWZsYWdzIHw9IEZMX1NIT1JUOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGtzaF9pc2RpZ2l0KGMpKSB7Ci0JCQkJdG1wID0gYyAtICcwJzsKLQkJCQl3aGlsZSAoYyA9ICpmbXQrKywga3NoX2lzZGlnaXQoYykpCi0JCQkJCXRtcCA9IHRtcCAqIDEwICsgYyAtICcwJzsKLQkJCQktLWZtdDsKLQkJCQlpZiAodG1wIDwgMCkJCS8qIG92ZXJmbG93PyAqLwotCQkJCQl0bXAgPSAwOwotCQkJCWlmIChmbGFncyAmIEZMX0RPVCkKLQkJCQkJcHJlY2lzaW9uID0gdG1wOwotCQkJCWVsc2UKLQkJCQkJZmllbGQgPSB0bXA7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwcmVjaXNpb24gPCAwKQotCQkJcHJlY2lzaW9uID0gMDsKLQotCQlpZiAoIWMpCQkvKiBuYXN0eSBmb3JtYXQgKi8KLQkJCWJyZWFrOwotCi0JCWlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewotCQkJZmxhZ3MgfD0gRkxfVVBQRVI7Ci0JCQljID0ga3NoX3RvbG93ZXIoYyk7Ci0JCX0KLQotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAncCc6IC8qIHBvaW50ZXIgKi8KLQkJCWZsYWdzICY9IH4oRkxfTE9ORyB8IEZMX1NIT1JUKTsKLQkJCWZsYWdzIHw9IChzaXplb2YoY2hhciAqKSA+IHNpemVvZihpbnQpKSA/Ci0JCQkgICAgLyogaG9wZSBpdCBmaXRzLi4gKi8gRkxfTE9ORyA6IDA7Ci0JCQkvKiBhYWFoaGguLi4gKi8KLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ2knOgotCQljYXNlICdvJzoKLQkJY2FzZSAndSc6Ci0JCWNhc2UgJ3gnOgotCQkJZmxhZ3MgfD0gRkxfTlVNQkVSOwotCQkJY3AgPSBudW1idWYgKyBzaXplb2YobnVtYnVmKTsKLQkJCS8qLQotCQkJICogWFhYIGFueSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/Ci0JCQkgKiBYWFggaG9wZWZ1bGx5IHRoZSBjb21waWxlciBvcHRpbWlzZXMgdGhpcyBvdXQKLQkJCSAqCi0JCQkgKiBGb3Igc2hvcnRzLCB3ZSB3YW50IHNpZ24gZXh0ZW5kIGZvciAlZCBidXQgbm90Ci0JCQkgKiBmb3IgJVtveHVdIC0gb24gMTYgYml0IG1hY2hpbmVzIGl0IGRvZXNuJ3QgbWF0dGVyLgotCQkJICogQXNzdW1lcyBDIGNvbXBpbGVyIGhhcyBjb252ZXJ0ZWQgc2hvcnRzIHRvIGludHMKLQkJCSAqIGJlZm9yZSBwdXNoaW5nIHRoZW0uIFhYWCBvcHRpbWlzZSB0aGlzIC10ZwotCQkJICovCi0JCQlpZiAoZmxhZ3MgJiBGTF9MT05HKQotCQkJCWxudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7Ci0JCQllbHNlIGlmICgoc2l6ZW9mKGludCkgPCBzaXplb2YobG9uZykpICYmIChjID09ICdkJykpCi0JCQkJbG51bSA9IChsb25nKXZhX2FyZyhhcmdzLCBpbnQpOwotCQkJZWxzZQotCQkJCWxudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnZCc6Ci0JCQljYXNlICdpJzoKLQkJCQlpZiAoMCA+IChsb25nKWxudW0pIHsKLQkJCQkJbG51bSA9IC0obG9uZylsbnVtOwotCQkJCQl0bXAgPSAxOwotCQkJCX0gZWxzZQotCQkJCQl0bXAgPSAwOwotCQkJCS8qIEZBTExUSFJPVUdIICovCi0JCQljYXNlICd1JzoKLQkJCQlkbyB7Ci0JCQkJCSotLWNwID0gbG51bSAlIDEwICsgJzAnOwotCQkJCQlsbnVtIC89IDEwOwotCQkJCX0gd2hpbGUgKGxudW0pOwotCi0JCQkJaWYgKGMgIT0gJ3UnKSB7Ci0JCQkJCWlmICh0bXApCi0JCQkJCQkqLS1jcCA9ICctJzsKLQkJCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTF9QTFVTKQotCQkJCQkJKi0tY3AgPSAnKyc7Ci0JCQkJCWVsc2UgaWYgKGZsYWdzICYgRkxfQkxBTkspCi0JCQkJCQkqLS1jcCA9ICcgJzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgJ28nOgotCQkJCWRvIHsKLQkJCQkJKi0tY3AgPSAobG51bSAmIDB4NykgKyAnMCc7Ci0JCQkJCWxudW0gPj49IDM7Ci0JCQkJfSB3aGlsZSAobG51bSk7Ci0KLQkJCQlpZiAoKGZsYWdzICYgRkxfSEFTSCkgJiYgKmNwICE9ICcwJykKLQkJCQkJKi0tY3AgPSAnMCc7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgJ3AnOgotCQkJY2FzZSAneCc6IHsKLQkJCQljb25zdCBjaGFyICpkaWdpdHMgPSAoZmxhZ3MgJiBGTF9VUFBFUikgPwotCQkJCSAgICBkaWdpdHNfdWMgOiBkaWdpdHNfbGM7Ci0JCQkJZG8gewotCQkJCQkqLS1jcCA9IGRpZ2l0c1tsbnVtICYgMHhmXTsKLQkJCQkJbG51bSA+Pj0gNDsKLQkJCQl9IHdoaWxlIChsbnVtKTsKLQotCQkJCWlmIChmbGFncyAmIEZMX0hBU0gpIHsKLQkJCQkJKi0tY3AgPSAoZmxhZ3MgJiBGTF9VUFBFUikgPyAnWCcgOiAneCc7Ci0JCQkJCSotLWNwID0gJzAnOwotCQkJCX0KLQkJCX0KLQkJCX0KLQkJCWxlbiA9IG51bWJ1ZiArIHNpemVvZihudW1idWYpIC0gKHMgPSBjcCk7Ci0JCQlpZiAoZmxhZ3MgJiBGTF9ET1QpIHsKLQkJCQlpZiAocHJlY2lzaW9uID4gbGVuKSB7Ci0JCQkJCWZpZWxkID0gcHJlY2lzaW9uOwotCQkJCQlmbGFncyB8PSBGTF9aRVJPOwotCQkJCX0gZWxzZQotCQkJCQlwcmVjaXNpb24gPSBsZW47IC8qIG5vIGxvc3MgKi8KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkJaWYgKCEocyA9IHZhX2FyZyhhcmdzLCBjb25zdCBjaGFyICopKSkKLQkJCQlzID0gIihudWxsKSI7Ci0JCQlsZW4gPSB1dGZfbWJzd2lkdGgocyk7Ci0JCQlicmVhazsKLQotCQljYXNlICdjJzoKLQkJCWZsYWdzICY9IH5GTF9ET1Q7Ci0JCQludW1idWZbMF0gPSAoY2hhcikodmFfYXJnKGFyZ3MsIGludCkpOwotCQkJcyA9IG51bWJ1ZjsKLQkJCWxlbiA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlICclJzoKLQkJZGVmYXVsdDoKLQkJCW51bWJ1ZlswXSA9IGM7Ci0JCQlzID0gbnVtYnVmOwotCQkJbGVuID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogQXQgdGhpcyBwb2ludCBzIHNob3VsZCBwb2ludCB0byBhIHN0cmluZyB0aGF0IGlzIHRvIGJlCi0JCSAqIGZvcm1hdHRlZCwgYW5kIGxlbiBzaG91bGQgYmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgotCQkgKi8KLQkJaWYgKCEoZmxhZ3MgJiBGTF9ET1QpIHx8IGxlbiA8IHByZWNpc2lvbikKLQkJCXByZWNpc2lvbiA9IGxlbjsKLQkJaWYgKGZpZWxkID4gcHJlY2lzaW9uKSB7Ci0JCQlmaWVsZCAtPSBwcmVjaXNpb247Ci0JCQlpZiAoIShmbGFncyAmIEZMX1JJR0hUKSkgewotCQkJCWZpZWxkID0gLWZpZWxkOwotCQkJCS8qIHNraXAgcGFzdCBzaWduIG9yIDB4IHdoZW4gcGFkZGluZyB3aXRoIDAgKi8KLQkJCQlpZiAoKGZsYWdzICYgRkxfWkVSTykgJiYgKGZsYWdzICYgRkxfTlVNQkVSKSkgewotCQkJCQlpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJyB8fAotCQkJCQkgICAgKnMgPT0gJyAnKSB7Ci0JCQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKLQkJCQkJCXMrKzsKLQkJCQkJCXByZWNpc2lvbi0tOwotCQkJCQkJbndyaXR0ZW4rKzsKLQkJCQkJfSBlbHNlIGlmICgqcyA9PSAnMCcpIHsKLQkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOwotCQkJCQkJcysrOwotCQkJCQkJbndyaXR0ZW4rKzsKLQkJCQkJCWlmICgtLXByZWNpc2lvbiA+IDAgJiYKLQkJCQkJCSAgICAoKnMgfCAweDIwKSA9PSAneCcpIHsKLQkJCQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKLQkJCQkJCQlzKys7Ci0JCQkJCQkJcHJlY2lzaW9uLS07Ci0JCQkJCQkJbndyaXR0ZW4rKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljID0gJzAnOwotCQkJCX0gZWxzZQotCQkJCQljID0gZmxhZ3MgJiBGTF9aRVJPID8gJzAnIDogJyAnOwotCQkJCWlmIChmaWVsZCA8IDApIHsKLQkJCQkJbndyaXR0ZW4gKz0gLWZpZWxkOwotCQkJCQlmb3IgKCA7IGZpZWxkIDwgMCA7IGZpZWxkKyspCi0JCQkJCQlzaGZfcHV0YyhjLCBzaGYpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWMgPSAnICc7Ci0JCX0gZWxzZQotCQkJZmllbGQgPSAwOwotCi0JCWlmIChwcmVjaXNpb24gPiAwKSB7Ci0JCQljb25zdCBjaGFyICpxOwotCi0JCQlud3JpdHRlbiArPSBwcmVjaXNpb247Ci0JCQlxID0gdXRmX3NraXBjb2xzKHMsIHByZWNpc2lvbik7Ci0JCQlkbyB7Ci0JCQkJc2hmX3B1dGMoKnMsIHNoZik7Ci0JCQl9IHdoaWxlICgrK3MgPCBxKTsKLQkJfQotCQlpZiAoZmllbGQgPiAwKSB7Ci0JCQlud3JpdHRlbiArPSBmaWVsZDsKLQkJCWZvciAoIDsgZmllbGQgPiAwIDsgLS1maWVsZCkKLQkJCQlzaGZfcHV0YyhjLCBzaGYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIChzaGZfZXJyb3Ioc2hmKSA/IEVPRiA6IG53cml0dGVuKTsKLX0KLQotI2lmZGVmIE1LU0hfU01BTEwKLWludAotc2hmX2dldGMoc3RydWN0IHNoZiAqc2hmKQotewotCXJldHVybiAoKHNoZiktPnJubGVmdCA+IDAgPyAoc2hmKS0+cm5sZWZ0LS0sICooc2hmKS0+cnArKyA6Ci0JICAgIHNoZl9nZXRjaGFyKHNoZikpOwotfQotCi1pbnQKLXNoZl9wdXRjKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JcmV0dXJuICgoc2hmKS0+d25sZWZ0ID09IDAgPyBzaGZfcHV0Y2hhcigoYyksIChzaGYpKSA6Ci0JICAgICgoc2hmKS0+d25sZWZ0LS0sICooc2hmKS0+d3ArKyA9IChjKSkpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9zeW4uYyBiL21rc2gvc3JjL3N5bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIyODY3Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL3N5bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNCArMCwwIEBACi0vKgkkT3BlbkJTRDogc3luLmMsdiAxLjI4IDIwMDgvMDcvMjMgMTY6MzQ6MzggamFyZWR5IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5Ci0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc3luLmMsdiAxLjQ5IDIwMTAvMDcvMTcgMjI6MDk6MzkgdGcgRXhwICQiKTsKLQotc3RydWN0IG5lc3Rpbmdfc3RhdGUgewotCWludCBzdGFydF90b2tlbjsJLyogdG9rZW4gdGhhbiBiZWdhbiBuZXN0aW5nIChlZywgRk9SKSAqLwotCWludCBzdGFydF9saW5lOwkJLyogbGluZSBuZXN0aW5nIGJlZ2FuIG9uICovCi19OwotCi1zdGF0aWMgdm9pZCB5eXBhcnNlKHZvaWQpOwotc3RhdGljIHN0cnVjdCBvcCAqcGlwZWxpbmUoaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmFuZG9yKHZvaWQpOwotc3RhdGljIHN0cnVjdCBvcCAqY19saXN0KGludCk7Ci1zdGF0aWMgc3RydWN0IGlvd29yZCAqc3luaW8oaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKm5lc3RlZChpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmdldF9jb21tYW5kKGludCk7Ci1zdGF0aWMgc3RydWN0IG9wICpkb2dyb3VwKHZvaWQpOwotc3RhdGljIHN0cnVjdCBvcCAqdGhlbnBhcnQodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICplbHNlcGFydCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmNhc2VsaXN0KHZvaWQpOwotc3RhdGljIHN0cnVjdCBvcCAqY2FzZXBhcnQoaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgb3AgKmZ1bmN0aW9uX2JvZHkoY2hhciAqLCBib29sKTsKLXN0YXRpYyBjaGFyICoqd29yZGxpc3Qodm9pZCk7Ci1zdGF0aWMgc3RydWN0IG9wICpibG9jayhpbnQsIHN0cnVjdCBvcCAqLCBzdHJ1Y3Qgb3AgKiwgY2hhciAqKik7Ci1zdGF0aWMgc3RydWN0IG9wICpuZXd0cChpbnQpOwotc3RhdGljIHZvaWQgc3ludGF4ZXJyKGNvbnN0IGNoYXIgKikgTUtTSF9BX05PUkVUVVJOOwotc3RhdGljIHZvaWQgbmVzdGluZ19wdXNoKHN0cnVjdCBuZXN0aW5nX3N0YXRlICosIGludCk7Ci1zdGF0aWMgdm9pZCBuZXN0aW5nX3BvcChzdHJ1Y3QgbmVzdGluZ19zdGF0ZSAqKTsKLXN0YXRpYyBpbnQgYXNzaWduX2NvbW1hbmQoY2hhciAqKTsKLXN0YXRpYyBpbnQgaW5hbGlhcyhzdHJ1Y3Qgc291cmNlICopOwotc3RhdGljIFRlc3Rfb3AgZGJ0ZXN0cF9pc2EoVGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkYnRlc3RwX2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7Ci1zdGF0aWMgaW50IGRidGVzdHBfZXZhbChUZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosCi0gICAgY29uc3QgY2hhciAqLCBib29sKTsKLXN0YXRpYyB2b2lkIGRidGVzdHBfZXJyb3IoVGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopIE1LU0hfQV9OT1JFVFVSTjsKLQotc3RhdGljIHN0cnVjdCBvcCAqb3V0dHJlZTsJCS8qIHl5cGFyc2Ugb3V0cHV0ICovCi1zdGF0aWMgc3RydWN0IG5lc3Rpbmdfc3RhdGUgbmVzdGluZzsJLyogXG4gY2hhbmdlZCB0byA7ICovCi0KLXN0YXRpYyBpbnQgcmVqZWN0OwkJLyogdG9rZW4oY2YpIGdldHMgc3ltYm9sIGFnYWluICovCi1zdGF0aWMgaW50IHN5bWJvbDsJCS8qIHl5bGV4IHZhbHVlICovCi0KLSNkZWZpbmUgUkVKRUNUCQkocmVqZWN0ID0gMSkKLSNkZWZpbmUgQUNDRVBUCQkocmVqZWN0ID0gMCkKLSNkZWZpbmUgdG9rZW4oY2YpCSgocmVqZWN0KSA/IChBQ0NFUFQsIHN5bWJvbCkgOiAoc3ltYm9sID0geXlsZXgoY2YpKSkKLSNkZWZpbmUgdHBlZWsoY2YpCSgocmVqZWN0KSA/IChzeW1ib2wpIDogKFJFSkVDVCwgc3ltYm9sID0geXlsZXgoY2YpKSkKLSNkZWZpbmUgbXVzdGhhdmUoYyxjZikJZG8geyBpZiAodG9rZW4oY2YpICE9IChjKSkgc3ludGF4ZXJyKE5VTEwpOyB9IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZAoteXlwYXJzZSh2b2lkKQotewotCWludCBjOwotCi0JQUNDRVBUOwotCi0Jb3V0dHJlZSA9IGNfbGlzdChzb3VyY2UtPnR5cGUgPT0gU1NUUklORyk7Ci0JYyA9IHRwZWVrKDApOwotCWlmIChjID09IDAgJiYgIW91dHRyZWUpCi0JCW91dHRyZWUgPSBuZXd0cChURU9GKTsKLQllbHNlIGlmIChjICE9ICdcbicgJiYgYyAhPSAwKQotCQlzeW50YXhlcnIoTlVMTCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotcGlwZWxpbmUoaW50IGNmKQotewotCXN0cnVjdCBvcCAqdCwgKnAsICp0bCA9IE5VTEw7Ci0KLQl0ID0gZ2V0X2NvbW1hbmQoY2YpOwotCWlmICh0ICE9IE5VTEwpIHsKLQkJd2hpbGUgKHRva2VuKDApID09ICd8JykgewotCQkJaWYgKChwID0gZ2V0X2NvbW1hbmQoQ09OVElOKSkgPT0gTlVMTCkKLQkJCQlzeW50YXhlcnIoTlVMTCk7Ci0JCQlpZiAodGwgPT0gTlVMTCkKLQkJCQl0ID0gdGwgPSBibG9jayhUUElQRSwgdCwgcCwgTk9XT1JEUyk7Ci0JCQllbHNlCi0JCQkJdGwgPSB0bC0+cmlnaHQgPSBibG9jayhUUElQRSwgdGwtPnJpZ2h0LCBwLCBOT1dPUkRTKTsKLQkJfQotCQlSRUpFQ1Q7Ci0JfQotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotYW5kb3Iodm9pZCkKLXsKLQlzdHJ1Y3Qgb3AgKnQsICpwOwotCWludCBjOwotCi0JdCA9IHBpcGVsaW5lKDApOwotCWlmICh0ICE9IE5VTEwpIHsKLQkJd2hpbGUgKChjID0gdG9rZW4oMCkpID09IExPR0FORCB8fCBjID09IExPR09SKSB7Ci0JCQlpZiAoKHAgPSBwaXBlbGluZShDT05USU4pKSA9PSBOVUxMKQotCQkJCXN5bnRheGVycihOVUxMKTsKLQkJCXQgPSBibG9jayhjID09IExPR0FORD8gVEFORDogVE9SLCB0LCBwLCBOT1dPUkRTKTsKLQkJfQotCQlSRUpFQ1Q7Ci0JfQotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotY19saXN0KGludCBtdWx0aSkKLXsKLQlzdHJ1Y3Qgb3AgKnQgPSBOVUxMLCAqcCwgKnRsID0gTlVMTDsKLQlpbnQgYywgaGF2ZV9zZXA7Ci0KLQl3aGlsZSAoMSkgewotCQlwID0gYW5kb3IoKTsKLQkJLyogVG9rZW4gaGFzIGFsd2F5cyBiZWVuIHJlYWQvcmVqZWN0ZWQgYXQgdGhpcyBwb2ludCwgc28KLQkJICogd2UgZG9uJ3Qgd29ycnkgYWJvdXQgd2hhdCBmbGFncyB0byBwYXNzIHRva2VuKCkKLQkJICovCi0JCWMgPSB0b2tlbigwKTsKLQkJaGF2ZV9zZXAgPSAxOwotCQlpZiAoYyA9PSAnXG4nICYmIChtdWx0aSB8fCBpbmFsaWFzKHNvdXJjZSkpKSB7Ci0JCQlpZiAoIXApIC8qIGlnbm9yZSBibGFuayBsaW5lcyAqLwotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKCFwKQotCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKGMgPT0gJyYnIHx8IGMgPT0gQ09QUk9DKQotCQkJcCA9IGJsb2NrKGMgPT0gJyYnID8gVEFTWU5DIDogVENPUFJPQywKLQkJCSAgICBwLCBOT0JMT0NLLCBOT1dPUkRTKTsKLQkJZWxzZSBpZiAoYyAhPSAnOycpCi0JCQloYXZlX3NlcCA9IDA7Ci0JCWlmICghdCkKLQkJCXQgPSBwOwotCQllbHNlIGlmICghdGwpCi0JCQl0ID0gdGwgPSBibG9jayhUTElTVCwgdCwgcCwgTk9XT1JEUyk7Ci0JCWVsc2UKLQkJCXRsID0gdGwtPnJpZ2h0ID0gYmxvY2soVExJU1QsIHRsLT5yaWdodCwgcCwgTk9XT1JEUyk7Ci0JCWlmICghaGF2ZV9zZXApCi0JCQlicmVhazsKLQl9Ci0JUkVKRUNUOwotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW93b3JkICoKLXN5bmlvKGludCBjZikKLXsKLQlzdHJ1Y3QgaW93b3JkICppb3A7Ci0Jc3RhdGljIHN0cnVjdCBpb3dvcmQgKm5leHRpb3AgPSBOVUxMOwotCWJvb2wgaXNoZXJlOwotCi0JaWYgKG5leHRpb3AgIT0gTlVMTCkgewotCQlpb3AgPSBuZXh0aW9wOwotCQluZXh0aW9wID0gTlVMTDsKLQkJcmV0dXJuIChpb3ApOwotCX0KLQotCWlmICh0cGVlayhjZikgIT0gUkVESVIpCi0JCXJldHVybiAoTlVMTCk7Ci0JQUNDRVBUOwotCWlvcCA9IHl5bHZhbC5pb3A7Ci0JaXNoZXJlID0gKGlvcC0+ZmxhZyZJT1RZUEUpID09IElPSEVSRTsKLQltdXN0aGF2ZShMV09SRCwgaXNoZXJlID8gSEVSRURFTElNIDogMCk7Ci0JaWYgKGlzaGVyZSkgewotCQlpb3AtPmRlbGltID0geXlsdmFsLmNwOwotCQlpZiAoKmlkZW50ICE9IDApIC8qIHVucXVvdGVkICovCi0JCQlpb3AtPmZsYWcgfD0gSU9FVkFMOwotCQlpZiAoaGVyZXAgPiAmaGVyZXNbSEVSRVMgLSAxXSkKLQkJCXl5ZXJyb3IoInRvbyBtYW55IDw8c1xuIik7Ci0JCSpoZXJlcCsrID0gaW9wOwotCX0gZWxzZQotCQlpb3AtPm5hbWUgPSB5eWx2YWwuY3A7Ci0KLQlpZiAoaW9wLT5mbGFnICYgSU9CQVNIKSB7Ci0JCWNoYXIgKmNwOwotCi0JCW5leHRpb3AgPSBhbGxvYyhzaXplb2YoKmlvcCksIEFURU1QKTsKLQkJbmV4dGlvcC0+bmFtZSA9IGNwID0gYWxsb2MoNSwgQVRFTVApOwotCi0JCWlmIChpb3AtPnVuaXQgPiA5KSB7Ci0JCQkqY3ArKyA9IENIQVI7Ci0JCQkqY3ArKyA9ICcwJyArIChpb3AtPnVuaXQgLyAxMCk7Ci0JCX0KLQkJKmNwKysgPSBDSEFSOwotCQkqY3ArKyA9ICcwJyArIChpb3AtPnVuaXQgJSAxMCk7Ci0JCSpjcCA9IEVPUzsKLQotCQlpb3AtPmZsYWcgJj0gfklPQkFTSDsKLQkJbmV4dGlvcC0+dW5pdCA9IDI7Ci0JCW5leHRpb3AtPmZsYWcgPSBJT0RVUDsKLQkJbmV4dGlvcC0+ZGVsaW0gPSBOVUxMOwotCQluZXh0aW9wLT5oZXJlZG9jID0gTlVMTDsKLQl9Ci0JcmV0dXJuIChpb3ApOwotfQotCi1zdGF0aWMgc3RydWN0IG9wICoKLW5lc3RlZChpbnQgdHlwZSwgaW50IHNtYXJrLCBpbnQgZW1hcmspCi17Ci0Jc3RydWN0IG9wICp0OwotCXN0cnVjdCBuZXN0aW5nX3N0YXRlIG9sZF9uZXN0aW5nOwotCi0JbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgc21hcmspOwotCXQgPSBjX2xpc3QodHJ1ZSk7Ci0JbXVzdGhhdmUoZW1hcmssIEtFWVdPUkR8QUxJQVMpOwotCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7Ci0JcmV0dXJuIChibG9jayh0eXBlLCB0LCBOT0JMT0NLLCBOT1dPUkRTKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotZ2V0X2NvbW1hbmQoaW50IGNmKQotewotCXN0cnVjdCBvcCAqdDsKLQlpbnQgYywgaW9wbiA9IDAsIHN5bmlvY2Y7Ci0Jc3RydWN0IGlvd29yZCAqaW9wLCAqKmlvcHM7Ci0JWFB0clYgYXJncywgdmFyczsKLQlzdHJ1Y3QgbmVzdGluZ19zdGF0ZSBvbGRfbmVzdGluZzsKLQotCWlvcHMgPSBhbGxvYygoTlVGSUxFICsgMSkgKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgQVRFTVApOwotCVhQaW5pdChhcmdzLCAxNik7Ci0JWFBpbml0KHZhcnMsIDE2KTsKLQotCXN5bmlvY2YgPSBLRVlXT1JEfEFMSUFTOwotCXN3aXRjaCAoYyA9IHRva2VuKGNmfEtFWVdPUkR8QUxJQVN8VkFSQVNOKSkgewotCWRlZmF1bHQ6Ci0JCVJFSkVDVDsKLQkJYWZyZWUoaW9wcywgQVRFTVApOwotCQlYUGZyZWUoYXJncyk7Ci0JCVhQZnJlZSh2YXJzKTsKLQkJcmV0dXJuIChOVUxMKTsgLyogZW1wdHkgbGluZSAqLwotCi0JY2FzZSBMV09SRDoKLQljYXNlIFJFRElSOgotCQlSRUpFQ1Q7Ci0JCXN5bmlvY2YgJj0gfihLRVlXT1JEfEFMSUFTKTsKLQkJdCA9IG5ld3RwKFRDT00pOwotCQl0LT5saW5lbm8gPSBzb3VyY2UtPmxpbmU7Ci0JCXdoaWxlICgxKSB7Ci0JCQljZiA9ICh0LT51LmV2YWxmbGFncyA/IEFSUkFZVkFSIDogMCkgfAotCQkJICAgIChYUHNpemUoYXJncykgPT0gMCA/IEFMSUFTfFZBUkFTTiA6IENNRFdPUkQpOwotCQkJc3dpdGNoICh0cGVlayhjZikpIHsKLQkJCWNhc2UgUkVESVI6Ci0JCQkJd2hpbGUgKChpb3AgPSBzeW5pbyhjZikpICE9IE5VTEwpIHsKLQkJCQkJaWYgKGlvcG4gPj0gTlVGSUxFKQotCQkJCQkJeXllcnJvcigidG9vIG1hbnkgcmVkaXJlY3Rpb25zXG4iKTsKLQkJCQkJaW9wc1tpb3BuKytdID0gaW9wOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBMV09SRDoKLQkJCQlBQ0NFUFQ7Ci0JCQkJLyogdGhlIGlvcG4gPT0gMCBhbmQgWFBzaXplKHZhcnMpID09IDAgYXJlCi0JCQkJICogZHViaW91cyBidXQgQVQmVCBrc2ggYWN0cyB0aGlzIHdheQotCQkJCSAqLwotCQkJCWlmIChpb3BuID09IDAgJiYgWFBzaXplKHZhcnMpID09IDAgJiYKLQkJCQkgICAgWFBzaXplKGFyZ3MpID09IDAgJiYKLQkJCQkgICAgYXNzaWduX2NvbW1hbmQoaWRlbnQpKQotCQkJCQl0LT51LmV2YWxmbGFncyA9IERPVkFDSEVDSzsKLQkJCQlpZiAoKFhQc2l6ZShhcmdzKSA9PSAwIHx8IEZsYWcoRktFWVdPUkQpKSAmJgotCQkJCSAgICBpc193ZHZhcmFzc2lnbih5eWx2YWwuY3ApKQotCQkJCQlYUHB1dCh2YXJzLCB5eWx2YWwuY3ApOwotCQkJCWVsc2UKLQkJCQkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAnKCc6Ci0JCQkJLyogQ2hlY2sgZm9yICI+IGZvbyAoZWNobyBoaSkiIHdoaWNoIEFUJlQga3NoCi0JCQkJICogYWxsb3dzIChub3QgUE9TSVgsIGJ1dCBub3QgZGlzYWxsb3dlZCkKLQkJCQkgKi8KLQkJCQlhZnJlZSh0LCBBVEVNUCk7Ci0JCQkJaWYgKFhQc2l6ZShhcmdzKSA9PSAwICYmIFhQc2l6ZSh2YXJzKSA9PSAwKSB7Ci0JCQkJCUFDQ0VQVDsKLQkJCQkJZ290byBTdWJzaGVsbDsKLQkJCQl9Ci0jaWZuZGVmIE1LU0hfU01BTEwKLQkJCQlpZiAoKFhQc2l6ZShhcmdzKSA9PSAwIHx8IEZsYWcoRktFWVdPUkQpKSAmJgotCQkJCSAgICBYUHNpemUodmFycykgPT0gMSAmJiBpc193ZHZhcmFzc2lnbih5eWx2YWwuY3ApKQotCQkJCQlnb3RvIGlzX3dkYXJyYXNzaWduOwotI2VuZGlmCi0JCQkJLyogTXVzdCBiZSBhIGZ1bmN0aW9uICovCi0JCQkJaWYgKGlvcG4gIT0gMCB8fCBYUHNpemUoYXJncykgIT0gMSB8fAotCQkJCSAgICBYUHNpemUodmFycykgIT0gMCkKLQkJCQkJc3ludGF4ZXJyKE5VTEwpOwotCQkJCUFDQ0VQVDsKLQkJCQkvKigqLwotCQkJCW11c3RoYXZlKCcpJywgMCk7Ci0JCQkJdCA9IGZ1bmN0aW9uX2JvZHkoWFBwdHJ2KGFyZ3MpWzBdLCBmYWxzZSk7Ci0JCQkJZ290byBMZWF2ZTsKLSNpZm5kZWYgTUtTSF9TTUFMTAotIGlzX3dkYXJyYXNzaWduOgotCQkJewotCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQwW10gPSB7Ci0JCQkJCUNIQVIsICdlJywgQ0hBUiwgJ3YnLAotCQkJCQlDSEFSLCAnYScsIENIQVIsICdsJywgRU9TCi0JCQkJfTsKLQkJCQlzdGF0aWMgY29uc3QgY2hhciBzZXRfY21kMVtdID0gewotCQkJCQlDSEFSLCAncycsIENIQVIsICdlJywKLQkJCQkJQ0hBUiwgJ3QnLCBDSEFSLCAnICcsCi0JCQkJCUNIQVIsICctJywgQ0hBUiwgJ0EnLCBFT1MKLQkJCQl9OwotCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQyW10gPSB7Ci0JCQkJCUNIQVIsICctJywgQ0hBUiwgJy0nLCBFT1MKLQkJCQl9OwotCQkJCWNoYXIgKnRjcDsKLQkJCQlYUGZyZWUodmFycyk7Ci0JCQkJWFBpbml0KHZhcnMsIDE2KTsKLQkJCQkvKgotCQkJCSAqIHdlIGtub3cgKG9yIHJhdGhlciBob3BlKSB0aGF0IHl5bHZhbC5jcAotCQkJCSAqIGNvbnRhaW5zIGEgc3RyaW5nICJ2YXJuYW1lPSIKLQkJCQkgKi8KLQkJCQl0Y3AgPSB3ZGNvcHkoeXlsdmFsLmNwLCBBVEVNUCk7Ci0JCQkJdGNwW3dkc2Nhbih0Y3AsIEVPUykgLSB0Y3AgLSAzXSA9IEVPUzsKLQkJCQkvKiBub3cgbWFrZSBhbiBhcnJheSBhc3NpZ25tZW50IGNvbW1hbmQgKi8KLQkJCQl0ID0gbmV3dHAoVENPTSk7Ci0JCQkJdC0+bGluZW5vID0gc291cmNlLT5saW5lOwotCQkJCUFDQ0VQVDsKLQkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDAsIEFURU1QKSk7Ci0JCQkJWFBwdXQoYXJncywgd2Rjb3B5KHNldF9jbWQxLCBBVEVNUCkpOwotCQkJCVhQcHV0KGFyZ3MsIHRjcCk7Ci0JCQkJWFBwdXQoYXJncywgd2Rjb3B5KHNldF9jbWQyLCBBVEVNUCkpOwotCQkJCW11c3RoYXZlKExXT1JELExFVEFSUkFZKTsKLQkJCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOwotCQkJCWJyZWFrOwotCQkJfQotI2VuZGlmCi0KLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byBMZWF2ZTsKLQkJCX0KLQkJfQotIExlYXZlOgotCQlicmVhazsKLQotCWNhc2UgJygnOgotIFN1YnNoZWxsOgotCQl0ID0gbmVzdGVkKFRQQVJFTiwgJygnLCAnKScpOwotCQlicmVhazsKLQotCWNhc2UgJ3snOiAvKn0qLwotCQl0ID0gbmVzdGVkKFRCUkFDRSwgJ3snLCAnfScpOwotCQlicmVhazsKLQotCWNhc2UgTURQQVJFTjogewotCQlpbnQgbG5vOwotCQlzdGF0aWMgY29uc3QgY2hhciBsZXRfY21kW10gPSB7Ci0JCQlDSEFSLCAnbCcsIENIQVIsICdlJywKLQkJCUNIQVIsICd0JywgRU9TCi0JCX07Ci0KLQkJLyogTGVhdmUgS0VZV09SRCBpbiBzeW5pb2NmIChhbGxvdyBpZiAoKCAxICkpIHRoZW4gLi4uKSAqLwotCQlsbm8gPSBzb3VyY2UtPmxpbmU7Ci0JCUFDQ0VQVDsKLQkJc3dpdGNoICh0b2tlbihMRVRFWFBSKSkgewotCQljYXNlIExXT1JEOgotCQkJYnJlYWs7Ci0JCWNhc2UgJygnOgkvKiApICovCi0JCQlnb3RvIFN1YnNoZWxsOwotCQlkZWZhdWx0OgotCQkJc3ludGF4ZXJyKE5VTEwpOwotCQl9Ci0JCXQgPSBuZXd0cChUQ09NKTsKLQkJdC0+bGluZW5vID0gbG5vOwotCQlYUHB1dChhcmdzLCB3ZGNvcHkobGV0X2NtZCwgQVRFTVApKTsKLQkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBEQlJBQ0tFVDogLyogW1sgLi4gXV0gKi8KLQkJLyogTGVhdmUgS0VZV09SRCBpbiBzeW5pb2NmIChhbGxvdyBpZiBbWyAtbiAxIF1dIHRoZW4gLi4uKSAqLwotCQl0ID0gbmV3dHAoVERCUkFDS0VUKTsKLQkJQUNDRVBUOwotCQl7Ci0JCQlUZXN0X2VudiB0ZTsKLQotCQkJdGUuZmxhZ3MgPSBURUZfREJSQUNLRVQ7Ci0JCQl0ZS5wb3MuYXYgPSAmYXJnczsKLQkJCXRlLmlzYSA9IGRidGVzdHBfaXNhOwotCQkJdGUuZ2V0b3BuZCA9IGRidGVzdHBfZ2V0b3BuZDsKLQkJCXRlLmV2YWwgPSBkYnRlc3RwX2V2YWw7Ci0JCQl0ZS5lcnJvciA9IGRidGVzdHBfZXJyb3I7Ci0KLQkJCXRlc3RfcGFyc2UoJnRlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgRk9SOgotCWNhc2UgU0VMRUNUOgotCQl0ID0gbmV3dHAoKGMgPT0gRk9SKSA/IFRGT1IgOiBUU0VMRUNUKTsKLQkJbXVzdGhhdmUoTFdPUkQsIEFSUkFZVkFSKTsKLQkJaWYgKCFpc193ZHZhcm5hbWUoeXlsdmFsLmNwLCB0cnVlKSkKLQkJCXl5ZXJyb3IoIiVzOiBiYWQgaWRlbnRpZmllclxuIiwKLQkJCSAgICBjID09IEZPUiA/ICJmb3IiIDogInNlbGVjdCIpOwotCQlzdHJkdXB4KHQtPnN0ciwgaWRlbnQsIEFURU1QKTsKLQkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7Ci0JCXQtPnZhcnMgPSB3b3JkbGlzdCgpOwotCQl0LT5sZWZ0ID0gZG9ncm91cCgpOwotCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOwotCQlicmVhazsKLQotCWNhc2UgV0hJTEU6Ci0JY2FzZSBVTlRJTDoKLQkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7Ci0JCXQgPSBuZXd0cCgoYyA9PSBXSElMRSkgPyBUV0hJTEUgOiBUVU5USUwpOwotCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOwotCQl0LT5yaWdodCA9IGRvZ3JvdXAoKTsKLQkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBU0U6Ci0JCXQgPSBuZXd0cChUQ0FTRSk7Ci0JCW11c3RoYXZlKExXT1JELCAwKTsKLQkJdC0+c3RyID0geXlsdmFsLmNwOwotCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKLQkJdC0+bGVmdCA9IGNhc2VsaXN0KCk7Ci0JCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRjoKLQkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7Ci0JCXQgPSBuZXd0cChUSUYpOwotCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOwotCQl0LT5yaWdodCA9IHRoZW5wYXJ0KCk7Ci0JCW11c3RoYXZlKEZJLCBLRVlXT1JEfEFMSUFTKTsKLQkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJBTkc6Ci0JCXN5bmlvY2YgJj0gfihLRVlXT1JEfEFMSUFTKTsKLQkJdCA9IHBpcGVsaW5lKDApOwotCQlpZiAodCA9PSBOVUxMKQotCQkJc3ludGF4ZXJyKE5VTEwpOwotCQl0ID0gYmxvY2soVEJBTkcsIE5PQkxPQ0ssIHQsIE5PV09SRFMpOwotCQlicmVhazsKLQotCWNhc2UgVElNRToKLQkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOwotCQl0ID0gcGlwZWxpbmUoMCk7Ci0JCWlmICh0KSB7Ci0JCQl0LT5zdHIgPSBhbGxvYygyLCBBVEVNUCk7Ci0JCQl0LT5zdHJbMF0gPSAnXDAnOwkvKiBURl8qIGZsYWdzICovCi0JCQl0LT5zdHJbMV0gPSAnXDAnOwotCQl9Ci0JCXQgPSBibG9jayhUVElNRSwgdCwgTk9CTE9DSywgTk9XT1JEUyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBGVU5DVElPTjoKLQkJbXVzdGhhdmUoTFdPUkQsIDApOwotCQl0ID0gZnVuY3Rpb25fYm9keSh5eWx2YWwuY3AsIHRydWUpOwotCQlicmVhazsKLQl9Ci0KLQl3aGlsZSAoKGlvcCA9IHN5bmlvKHN5bmlvY2YpKSAhPSBOVUxMKSB7Ci0JCWlmIChpb3BuID49IE5VRklMRSkKLQkJCXl5ZXJyb3IoInRvbyBtYW55IHJlZGlyZWN0aW9uc1xuIik7Ci0JCWlvcHNbaW9wbisrXSA9IGlvcDsKLQl9Ci0KLQlpZiAoaW9wbiA9PSAwKSB7Ci0JCWFmcmVlKGlvcHMsIEFURU1QKTsKLQkJdC0+aW9hY3QgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWlvcHNbaW9wbisrXSA9IE5VTEw7Ci0JCWlvcHMgPSBhcmVzaXplKGlvcHMsIGlvcG4gKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgQVRFTVApOwotCQl0LT5pb2FjdCA9IGlvcHM7Ci0JfQotCi0JaWYgKHQtPnR5cGUgPT0gVENPTSB8fCB0LT50eXBlID09IFREQlJBQ0tFVCkgewotCQlYUHB1dChhcmdzLCBOVUxMKTsKLQkJdC0+YXJncyA9IChjb25zdCBjaGFyICoqKVhQY2xvc2UoYXJncyk7Ci0JCVhQcHV0KHZhcnMsIE5VTEwpOwotCQl0LT52YXJzID0gKGNoYXIgKiopIFhQY2xvc2UodmFycyk7Ci0JfSBlbHNlIHsKLQkJWFBmcmVlKGFyZ3MpOwotCQlYUGZyZWUodmFycyk7Ci0JfQotCi0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBvcCAqCi1kb2dyb3VwKHZvaWQpCi17Ci0JaW50IGM7Ci0Jc3RydWN0IG9wICpsaXN0OwotCi0JYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKTsKLQkvKiBBIHsuLi59IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgZG8uLi5kb25lIGZvciBmb3Ivc2VsZWN0IGxvb3BzCi0JICogYnV0IG5vdCBmb3Igd2hpbGUvdW50aWwgbG9vcHMgLSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIGl0Ci0JICogaXMgYSB3aGlsZSBsb29wIGJlY2F1c2UgaXQgd291bGQgaGF2ZSBiZWVuIHBhcnNlZCBhcyBwYXJ0IG9mCi0JICogdGhlIGNvbmRpdGlvbmFsIGNvbW1hbmQgbGlzdC4uLgotCSAqLwotCWlmIChjID09IERPKQotCQljID0gRE9ORTsKLQllbHNlIGlmIChjID09ICd7JykKLQkJYyA9ICd9JzsKLQllbHNlCi0JCXN5bnRheGVycihOVUxMKTsKLQlsaXN0ID0gY19saXN0KHRydWUpOwotCW11c3RoYXZlKGMsIEtFWVdPUkR8QUxJQVMpOwotCXJldHVybiAobGlzdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotdGhlbnBhcnQodm9pZCkKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0KLQltdXN0aGF2ZShUSEVOLCBLRVlXT1JEfEFMSUFTKTsKLQl0ID0gbmV3dHAoMCk7Ci0JdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKLQlpZiAodC0+bGVmdCA9PSBOVUxMKQotCQlzeW50YXhlcnIoTlVMTCk7Ci0JdC0+cmlnaHQgPSBlbHNlcGFydCgpOwotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotZWxzZXBhcnQodm9pZCkKLXsKLQlzdHJ1Y3Qgb3AgKnQ7Ci0KLQlzd2l0Y2ggKHRva2VuKEtFWVdPUkR8QUxJQVN8VkFSQVNOKSkgewotCWNhc2UgRUxTRToKLQkJaWYgKCh0ID0gY19saXN0KHRydWUpKSA9PSBOVUxMKQotCQkJc3ludGF4ZXJyKE5VTEwpOwotCQlyZXR1cm4gKHQpOwotCi0JY2FzZSBFTElGOgotCQl0ID0gbmV3dHAoVEVMSUYpOwotCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOwotCQl0LT5yaWdodCA9IHRoZW5wYXJ0KCk7Ci0JCXJldHVybiAodCk7Ci0KLQlkZWZhdWx0OgotCQlSRUpFQ1Q7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotY2FzZWxpc3Qodm9pZCkKLXsKLQlzdHJ1Y3Qgb3AgKnQsICp0bDsKLQlpbnQgYzsKLQotCWMgPSB0b2tlbihDT05USU58S0VZV09SRHxBTElBUyk7Ci0JLyogQSB7Li4ufSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGluLi4uZXNhYyBmb3IgY2FzZSBzdGF0ZW1lbnRzICovCi0JaWYgKGMgPT0gSU4pCi0JCWMgPSBFU0FDOwotCWVsc2UgaWYgKGMgPT0gJ3snKQotCQljID0gJ30nOwotCWVsc2UKLQkJc3ludGF4ZXJyKE5VTEwpOwotCXQgPSB0bCA9IE5VTEw7Ci0Jd2hpbGUgKCh0cGVlayhDT05USU58S0VZV09SRHxFU0FDT05MWSkpICE9IGMpIHsgLyogbm8gQUxJQVMgaGVyZSAqLwotCQlzdHJ1Y3Qgb3AgKnRjID0gY2FzZXBhcnQoYyk7Ci0JCWlmICh0bCA9PSBOVUxMKQotCQkJdCA9IHRsID0gdGMsIHRsLT5yaWdodCA9IE5VTEw7Ci0JCWVsc2UKLQkJCXRsLT5yaWdodCA9IHRjLCB0bCA9IHRjOwotCX0KLQltdXN0aGF2ZShjLCBLRVlXT1JEfEFMSUFTKTsKLQlyZXR1cm4gKHQpOwotfQotCi1zdGF0aWMgc3RydWN0IG9wICoKLWNhc2VwYXJ0KGludCBlbmR0b2spCi17Ci0Jc3RydWN0IG9wICp0OwotCVhQdHJWIHB0bnM7Ci0KLQlYUGluaXQocHRucywgMTYpOwotCXQgPSBuZXd0cChUUEFUKTsKLQkvKiBubyBBTElBUyBoZXJlICovCi0JaWYgKHRva2VuKENPTlRJTiB8IEtFWVdPUkQpICE9ICcoJykKLQkJUkVKRUNUOwotCWRvIHsKLQkJbXVzdGhhdmUoTFdPUkQsIDApOwotCQlYUHB1dChwdG5zLCB5eWx2YWwuY3ApOwotCX0gd2hpbGUgKHRva2VuKDApID09ICd8Jyk7Ci0JUkVKRUNUOwotCVhQcHV0KHB0bnMsIE5VTEwpOwotCXQtPnZhcnMgPSAoY2hhciAqKikgWFBjbG9zZShwdG5zKTsKLQltdXN0aGF2ZSgnKScsIDApOwotCi0JdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKLQkvKiBOb3RlOiBQT1NJWCByZXF1aXJlcyB0aGUgOzsgKi8KLQlpZiAoKHRwZWVrKENPTlRJTnxLRVlXT1JEfEFMSUFTKSkgIT0gZW5kdG9rKQotCQltdXN0aGF2ZShCUkVBSywgQ09OVElOfEtFWVdPUkR8QUxJQVMpOwotCXJldHVybiAodCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3AgKgotZnVuY3Rpb25fYm9keShjaGFyICpuYW1lLAotICAgIGJvb2wga3NoX2Z1bmMpCQkvKiBmdW5jdGlvbiBmb28geyAuLi4gfSB2cyBmb28oKSB7IC4uIH0gKi8KLXsKLQljaGFyICpzbmFtZSwgKnA7Ci0Jc3RydWN0IG9wICp0OwotCWJvb2wgb2xkX2Z1bmNfcGFyc2U7Ci0KLQlzbmFtZSA9IHdkc3RyaXAobmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkvKiBDaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVycyBpbiBuYW1lLiBQT1NJWCBhbmQgQVQmVCBrc2g5MyBzYXkgb25seQotCSAqIGFsbG93IFthLXpBLVpfMC05XSBidXQgdGhpcyBhbGxvd3MgbW9yZSBhcyBvbGQgcGRrc2hzIGhhdmUKLQkgKiBhbGxvd2VkIG1vcmUgKHRoZSBmb2xsb3dpbmcgd2VyZSBuZXZlciBhbGxvd2VkOgotCSAqCU5VTCBUQUIgTkwgU1AgIiAkICYgJyAoICkgOyA8ID0gPiBcIGAgfAotCSAqIENfUVVPVEUgY292ZXJzIGFsbCBidXQgYWRkcyAjICogPyBbIF0KLQkgKi8KLQlmb3IgKHAgPSBzbmFtZTsgKnA7IHArKykKLQkJaWYgKGN0eXBlKCpwLCBDX1FVT1RFKSkKLQkJCXl5ZXJyb3IoIiVzOiBpbnZhbGlkIGZ1bmN0aW9uIG5hbWVcbiIsIHNuYW1lKTsKLQotCS8qIE5vdGUgdGhhdCBQT1NJWCBhbGxvd3Mgb25seSBjb21wb3VuZCBzdGF0ZW1lbnRzIGFmdGVyIGZvbygpLCBzaCBhbmQKLQkgKiBBVCZUIGtzaCBhbGxvdyBhbnkgY29tbWFuZCwgZ28gd2l0aCB0aGUgbGF0ZXIgc2luY2UgaXQgc2hvdWxkbid0Ci0JICogYnJlYWsgYW55dGhpbmcuIEhvd2V2ZXIsIGZvciBmdW5jdGlvbiBmb28sIEFUJlQga3NoIG9ubHkgYWNjZXB0cwotCSAqIGFuIG9wZW4tYnJhY2UuCi0JICovCi0JaWYgKGtzaF9mdW5jKSB7Ci0JCWlmICh0cGVlayhDT05USU58S0VZV09SRHxBTElBUykgPT0gJygnIC8qICkgKi8pIHsKLQkJCXN0cnVjdCB0YmwgKnRwOwotCi0JCQkvKiBmdW5jdGlvbiBmb28gKCkgeyAqLwotCQkJQUNDRVBUOwotCQkJbXVzdGhhdmUoJyknLCAwKTsKLQkJCS8qIGRlZ3JhZGUgdG8gUE9TSVggZnVuY3Rpb24gKi8KLQkJCWtzaF9mdW5jID0gZmFsc2U7Ci0JCQlpZiAoKHRwID0ga3RzZWFyY2goJmFsaWFzZXMsIHNuYW1lLCBoYXNoKHNuYW1lKSkpKQotCQkJCWt0ZGVsZXRlKHRwKTsKLQkJfQotCQltdXN0aGF2ZSgneycsIENPTlRJTnxLRVlXT1JEfEFMSUFTKTsgLyogfSAqLwotCQlSRUpFQ1Q7Ci0JfQotCi0JdCA9IG5ld3RwKFRGVU5DVCk7Ci0JdC0+c3RyID0gc25hbWU7Ci0JdC0+dS5rc2hfZnVuYyA9IGtzaF9mdW5jOwotCXQtPmxpbmVubyA9IHNvdXJjZS0+bGluZTsKLQotCW9sZF9mdW5jX3BhcnNlID0gZS0+ZmxhZ3MgJiBFRl9GVU5DX1BBUlNFOwotCWUtPmZsYWdzIHw9IEVGX0ZVTkNfUEFSU0U7Ci0JaWYgKCh0LT5sZWZ0ID0gZ2V0X2NvbW1hbmQoQ09OVElOKSkgPT0gTlVMTCkgewotCQljaGFyICp0djsKLQkJLyoKLQkJICogUHJvYmFibHkgc29tZXRoaW5nIGxpa2UgZm9vKCkgZm9sbG93ZWQgYnkgZW9mIG9yIDsuCi0JCSAqIFRoaXMgaXMgYWNjZXB0ZWQgYnkgc2ggYW5kIGtzaDg4LgotCQkgKiBUbyBtYWtlICJ0eXBlc2V0IC1mIGZvbyIgd29yayByZWxpYWJseSAoc28gaXRzIG91dHB1dCBjYW4KLQkJICogYmUgdXNlZCBhcyBpbnB1dCksIHdlIHByZXRlbmQgdGhlcmUgaXMgYSBjb2xvbiBoZXJlLgotCQkgKi8KLQkJdC0+bGVmdCA9IG5ld3RwKFRDT00pOwotCQl0LT5sZWZ0LT5hcmdzID0gYWxsb2MoMiAqIHNpemVvZihjaGFyICopLCBBVEVNUCk7Ci0JCXQtPmxlZnQtPmFyZ3NbMF0gPSB0diA9IGFsbG9jKDMsIEFURU1QKTsKLQkJdHZbMF0gPSBDSEFSOwotCQl0dlsxXSA9ICc6JzsKLQkJdHZbMl0gPSBFT1M7Ci0JCXQtPmxlZnQtPmFyZ3NbMV0gPSBOVUxMOwotCQl0LT5sZWZ0LT52YXJzID0gYWxsb2Moc2l6ZW9mKGNoYXIgKiksIEFURU1QKTsKLQkJdC0+bGVmdC0+dmFyc1swXSA9IE5VTEw7Ci0JCXQtPmxlZnQtPmxpbmVubyA9IDE7Ci0JfQotCWlmICghb2xkX2Z1bmNfcGFyc2UpCi0JCWUtPmZsYWdzICY9IH5FRl9GVU5DX1BBUlNFOwotCi0JcmV0dXJuICh0KTsKLX0KLQotc3RhdGljIGNoYXIgKioKLXdvcmRsaXN0KHZvaWQpCi17Ci0JaW50IGM7Ci0JWFB0clYgYXJnczsKLQotCVhQaW5pdChhcmdzLCAxNik7Ci0JLyogUE9TSVggZG9lcyBub3QgZG8gYWxpYXMgZXhwYW5zaW9uIGhlcmUuLi4gKi8KLQlpZiAoKGMgPSB0b2tlbihDT05USU58S0VZV09SRHxBTElBUykpICE9IElOKSB7Ci0JCWlmIChjICE9ICc7JykgLyogbm9uLVBPU0lYLCBidXQgQVQmVCBrc2ggYWNjZXB0cyBhIDsgaGVyZSAqLwotCQkJUkVKRUNUOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQl3aGlsZSAoKGMgPSB0b2tlbigwKSkgPT0gTFdPUkQpCi0JCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7Ci0JaWYgKGMgIT0gJ1xuJyAmJiBjICE9ICc7JykKLQkJc3ludGF4ZXJyKE5VTEwpOwotCWlmIChYUHNpemUoYXJncykgPT0gMCkgewotCQlYUGZyZWUoYXJncyk7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfSBlbHNlIHsKLQkJWFBwdXQoYXJncywgTlVMTCk7Ci0JCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZShhcmdzKSk7Ci0JfQotfQotCi0vKgotICogc3VwcG9ydGluZyBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9wICoKLWJsb2NrKGludCB0eXBlLCBzdHJ1Y3Qgb3AgKnQxLCBzdHJ1Y3Qgb3AgKnQyLCBjaGFyICoqd3ApCi17Ci0Jc3RydWN0IG9wICp0OwotCi0JdCA9IG5ld3RwKHR5cGUpOwotCXQtPmxlZnQgPSB0MTsKLQl0LT5yaWdodCA9IHQyOwotCXQtPnZhcnMgPSB3cDsKLQlyZXR1cm4gKHQpOwotfQotCi1jb25zdCBzdHJ1Y3QgdG9rZW5pbmZvIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXNob3J0IHZhbDsKLQlzaG9ydCByZXNlcnZlZDsKLX0gdG9rZW50YWJbXSA9IHsKLQkvKiBSZXNlcnZlZCB3b3JkcyAqLwotCXsgImlmIiwJCUlGLAl0cnVlIH0sCi0JeyAidGhlbiIsCVRIRU4sCXRydWUgfSwKLQl7ICJlbHNlIiwJRUxTRSwJdHJ1ZSB9LAotCXsgImVsaWYiLAlFTElGLAl0cnVlIH0sCi0JeyAiZmkiLAkJRkksCXRydWUgfSwKLQl7ICJjYXNlIiwJQ0FTRSwJdHJ1ZSB9LAotCXsgImVzYWMiLAlFU0FDLAl0cnVlIH0sCi0JeyAiZm9yIiwJRk9SLAl0cnVlIH0sCi0JeyAic2VsZWN0IiwJU0VMRUNULAl0cnVlIH0sCi0JeyAid2hpbGUiLAlXSElMRSwJdHJ1ZSB9LAotCXsgInVudGlsIiwJVU5USUwsCXRydWUgfSwKLQl7ICJkbyIsCQlETywJdHJ1ZSB9LAotCXsgImRvbmUiLAlET05FLAl0cnVlIH0sCi0JeyAiaW4iLAkJSU4sCXRydWUgfSwKLQl7ICJmdW5jdGlvbiIsCUZVTkNUSU9OLCB0cnVlIH0sCi0JeyAidGltZSIsCVRJTUUsCXRydWUgfSwKLQl7ICJ7IiwJCSd7JywJdHJ1ZSB9LAotCXsgIn0iLAkJJ30nLAl0cnVlIH0sCi0JeyAiISIsCQlCQU5HLAl0cnVlIH0sCi0JeyAiW1siLAkJREJSQUNLRVQsIHRydWUgfSwKLQkvKiBMZXhpY2FsIHRva2VucyAoMFtFT0ZdLCBMV09SRCBhbmQgUkVESVIgaGFuZGxlZCBzcGVjaWFsbHkpICovCi0JeyAiJiYiLAkJTE9HQU5ELAlmYWxzZSB9LAotCXsgInx8IiwJCUxPR09SLAlmYWxzZSB9LAotCXsgIjs7IiwJCUJSRUFLLAlmYWxzZSB9LAotCXsgIigoIiwJCU1EUEFSRU4sIGZhbHNlIH0sCi0JeyAifCYiLAkJQ09QUk9DLAlmYWxzZSB9LAotCS8qIGFuZCBzb21lIHNwZWNpYWwgY2FzZXMuLi4gKi8KLQl7ICJuZXdsaW5lIiwJJ1xuJywJZmFsc2UgfSwKLQl7IE5VTEwsCQkwLAlmYWxzZSB9Ci19OwotCi12b2lkCi1pbml0a2V5d29yZHModm9pZCkKLXsKLQlzdHJ1Y3QgdG9rZW5pbmZvIGNvbnN0ICp0dDsKLQlzdHJ1Y3QgdGJsICpwOwotCi0Ja3Rpbml0KCZrZXl3b3JkcywgQVBFUk0sCi0JICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDIwIGtleXdvcmRzKSAqLyAzMik7Ci0JZm9yICh0dCA9IHRva2VudGFiOyB0dC0+bmFtZTsgdHQrKykgewotCQlpZiAodHQtPnJlc2VydmVkKSB7Ci0JCQlwID0ga3RlbnRlcigma2V5d29yZHMsIHR0LT5uYW1lLCBoYXNoKHR0LT5uYW1lKSk7Ci0JCQlwLT5mbGFnIHw9IERFRklORUR8SVNTRVQ7Ci0JCQlwLT50eXBlID0gQ0tFWVdEOwotCQkJcC0+dmFsLmkgPSB0dC0+dmFsOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotc3ludGF4ZXJyKGNvbnN0IGNoYXIgKndoYXQpCi17Ci0JY2hhciByZWRpcls2XTsJLyogMjw8LSBpcyB0aGUgbG9uZ2VzdCByZWRpcmVjdGlvbiwgSSB0aGluayAqLwotCWNvbnN0IGNoYXIgKnM7Ci0Jc3RydWN0IHRva2VuaW5mbyBjb25zdCAqdHQ7Ci0JaW50IGM7Ci0KLQlpZiAoIXdoYXQpCi0JCXdoYXQgPSAidW5leHBlY3RlZCI7Ci0JUkVKRUNUOwotCWMgPSB0b2tlbigwKTsKLSBBZ2FpbjoKLQlzd2l0Y2ggKGMpIHsKLQljYXNlIDA6Ci0JCWlmIChuZXN0aW5nLnN0YXJ0X3Rva2VuKSB7Ci0JCQljID0gbmVzdGluZy5zdGFydF90b2tlbjsKLQkJCXNvdXJjZS0+ZXJybGluZSA9IG5lc3Rpbmcuc3RhcnRfbGluZTsKLQkJCXdoYXQgPSAidW5tYXRjaGVkIjsKLQkJCWdvdG8gQWdhaW47Ci0JCX0KLQkJLyogZG9uJ3QgcXVvdGUgdGhlIEVPRiAqLwotCQl5eWVycm9yKCIlczogdW5leHBlY3RlZCBFT0ZcbiIsIFRfc3luZXJyKTsKLQkJLyogTk9UUkVBQ0hFRCAqLwotCi0JY2FzZSBMV09SRDoKLQkJcyA9IHNucHRyZWVmKE5VTEwsIDMyLCAiJVMiLCB5eWx2YWwuY3ApOwotCQlicmVhazsKLQotCWNhc2UgUkVESVI6Ci0JCXMgPSBzbnB0cmVlZihyZWRpciwgc2l6ZW9mKHJlZGlyKSwgIiVSIiwgeXlsdmFsLmlvcCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZm9yICh0dCA9IHRva2VudGFiOyB0dC0+bmFtZTsgdHQrKykKLQkJCWlmICh0dC0+dmFsID09IGMpCi0JCQkgICAgYnJlYWs7Ci0JCWlmICh0dC0+bmFtZSkKLQkJCXMgPSB0dC0+bmFtZTsKLQkJZWxzZSB7Ci0JCQlpZiAoYyA+IDAgJiYgYyA8IDI1NikgewotCQkJCXJlZGlyWzBdID0gYzsKLQkJCQlyZWRpclsxXSA9ICdcMCc7Ci0JCQl9IGVsc2UKLQkJCQlzaGZfc25wcmludGYocmVkaXIsIHNpemVvZihyZWRpciksCi0JCQkJCSI/JWQiLCBjKTsKLQkJCXMgPSByZWRpcjsKLQkJfQotCX0KLQl5eWVycm9yKCIlczogJyVzJyAlc1xuIiwgVF9zeW5lcnIsIHMsIHdoYXQpOwotfQotCi1zdGF0aWMgdm9pZAotbmVzdGluZ19wdXNoKHN0cnVjdCBuZXN0aW5nX3N0YXRlICpzYXZlLCBpbnQgdG9rKQotewotCSpzYXZlID0gbmVzdGluZzsKLQluZXN0aW5nLnN0YXJ0X3Rva2VuID0gdG9rOwotCW5lc3Rpbmcuc3RhcnRfbGluZSA9IHNvdXJjZS0+bGluZTsKLX0KLQotc3RhdGljIHZvaWQKLW5lc3RpbmdfcG9wKHN0cnVjdCBuZXN0aW5nX3N0YXRlICpzYXZlZCkKLXsKLQluZXN0aW5nID0gKnNhdmVkOwotfQotCi1zdGF0aWMgc3RydWN0IG9wICoKLW5ld3RwKGludCB0eXBlKQotewotCXN0cnVjdCBvcCAqdDsKLQotCXQgPSBhbGxvYyhzaXplb2Yoc3RydWN0IG9wKSwgQVRFTVApOwotCXQtPnR5cGUgPSB0eXBlOwotCXQtPnUuZXZhbGZsYWdzID0gMDsKLQl0LT5hcmdzID0gTlVMTDsKLQl0LT52YXJzID0gTlVMTDsKLQl0LT5pb2FjdCA9IE5VTEw7Ci0JdC0+bGVmdCA9IHQtPnJpZ2h0ID0gTlVMTDsKLQl0LT5zdHIgPSBOVUxMOwotCXJldHVybiAodCk7Ci19Ci0KLXN0cnVjdCBvcCAqCi1jb21waWxlKFNvdXJjZSAqcykKLXsKLQluZXN0aW5nLnN0YXJ0X3Rva2VuID0gMDsKLQluZXN0aW5nLnN0YXJ0X2xpbmUgPSAwOwotCWhlcmVwID0gaGVyZXM7Ci0Jc291cmNlID0gczsKLQl5eXBhcnNlKCk7Ci0JcmV0dXJuIChvdXR0cmVlKTsKLX0KLQotLyogVGhpcyBrbHVkZ2UgZXhpc3RzIHRvIHRha2UgY2FyZSBvZiBzaC9BVCZUIGtzaCBvZGRpdHkgaW4gd2hpY2gKLSAqIHRoZSBhcmd1bWVudHMgb2YgYWxpYXMvZXhwb3J0L3JlYWRvbmx5L3R5cGVzZXQgaGF2ZSBubyBmaWVsZAotICogc3BsaXR0aW5nLCBmaWxlIGdsb2JiaW5nLCBvciAobm9ybWFsKSB0aWxkZSBleHBhbnNpb24gZG9uZS4KLSAqIEFUJlQga3NoIHNlZW1zIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMgc2luY2UKLSAqCSQgdG91Y2ggYT1hOyB0eXBlc2V0IGE9W2FiXTsgZWNobyAiJGEiCi0gKglhPVthYl0KLSAqCSQgeD10eXBlc2V0OyAkeCBhPVthYl07IGVjaG8gIiRhIgotICoJYT1hCi0gKgkkCi0gKi8KLXN0YXRpYyBpbnQKLWFzc2lnbl9jb21tYW5kKGNoYXIgKnMpCi17Ci0JaWYgKCEqcykKLQkJcmV0dXJuICgwKTsKLQlyZXR1cm4gKChzdHJjbXAocywgImFsaWFzIikgPT0gMCkgfHwKLQkgICAgKHN0cmNtcChzLCAiZXhwb3J0IikgPT0gMCkgfHwKLQkgICAgKHN0cmNtcChzLCAicmVhZG9ubHkiKSA9PSAwKSB8fAotCSAgICAoc3RyY21wKHMsIFRfdHlwZXNldCkgPT0gMCkpOwotfQotCi0vKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiByZWFkaW5nIGFuIGFsaWFzICovCi1zdGF0aWMgaW50Ci1pbmFsaWFzKHN0cnVjdCBzb3VyY2UgKnMpCi17Ci0JZm9yICg7IHMgJiYgcy0+dHlwZSA9PSBTQUxJQVM7IHMgPSBzLT5uZXh0KQotCQlpZiAoIShzLT5mbGFncyAmIFNGX0FMSUFTRU5EKSkKLQkJCXJldHVybiAoMSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotCi0vKiBPcmRlciBpbXBvcnRhbnQgLSBpbmRleGVkIGJ5IFRlc3RfbWV0YSB2YWx1ZXMKLSAqIE5vdGUgdGhhdCB8fCwgJiYsICggYW5kICkgY2FuJ3QgYXBwZWFyIGluIGFzIHVucXVvdGVkIHN0cmluZ3MKLSAqIGluIG5vcm1hbCBzaGVsbCBpbnB1dCwgc28gdGhlc2UgY2FuIGJlIGludGVycHJldGVkIHVuYW1iaWd1b3VzbHkKLSAqIGluIHRoZSBldmFsdWF0aW9uIHBhc3MuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9vcltdID0geyBDSEFSLCAnfCcsIENIQVIsICd8JywgRU9TIH07Ci1zdGF0aWMgY29uc3QgY2hhciBkYnRlc3RfYW5kW10gPSB7IENIQVIsICcmJywgQ0hBUiwgJyYnLCBFT1MgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9ub3RbXSA9IHsgQ0hBUiwgJyEnLCBFT1MgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9vcGFyZW5bXSA9IHsgQ0hBUiwgJygnLCBFT1MgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9jcGFyZW5bXSA9IHsgQ0hBUiwgJyknLCBFT1MgfTsKLWNvbnN0IGNoYXIgKmNvbnN0IGRidGVzdF90b2tlbnNbXSA9IHsKLQlkYnRlc3Rfb3IsIGRidGVzdF9hbmQsIGRidGVzdF9ub3QsCi0JZGJ0ZXN0X29wYXJlbiwgZGJ0ZXN0X2NwYXJlbgotfTsKLWNvbnN0IGNoYXIgZGJfY2xvc2VbXSA9IHsgQ0hBUiwgJ10nLCBDSEFSLCAnXScsIEVPUyB9OwotY29uc3QgY2hhciBkYl9sdGhhbltdID0geyBDSEFSLCAnPCcsIEVPUyB9OwotY29uc3QgY2hhciBkYl9ndGhhbltdID0geyBDSEFSLCAnPicsIEVPUyB9OwotCi0vKgotICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCi0gKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCi0gKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCi0gKi8KLXN0YXRpYyBUZXN0X29wCi1kYnRlc3RwX2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQotewotCWludCBjID0gdHBlZWsoQVJSQVlWQVIgfCAobWV0YSA9PSBUTV9CSU5PUCA/IDAgOiBDT05USU4pKTsKLQlpbnQgdXF3b3JkOwotCWNoYXIgKnNhdmUgPSBOVUxMOwotCVRlc3Rfb3AgcmV0ID0gVE9fTk9OT1A7Ci0KLQkvKiB1bnF1b3RlZCB3b3JkPyAqLwotCXVxd29yZCA9IGMgPT0gTFdPUkQgJiYgKmlkZW50OwotCi0JaWYgKG1ldGEgPT0gVE1fT1IpCi0JCXJldCA9IGMgPT0gTE9HT1IgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0JZWxzZSBpZiAobWV0YSA9PSBUTV9BTkQpCi0JCXJldCA9IGMgPT0gTE9HQU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOwotCWVsc2UgaWYgKG1ldGEgPT0gVE1fTk9UKQotCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoeXlsdmFsLmNwLAotCQkgICAgZGJ0ZXN0X3Rva2Vuc1soaW50KVRNX05PVF0pKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKLQllbHNlIGlmIChtZXRhID09IFRNX09QQVJFTikKLQkJcmV0ID0gYyA9PSAnKCcgLyopKi8gPyBUT19OT05OVUxMIDogVE9fTk9OT1A7Ci0JZWxzZSBpZiAobWV0YSA9PSBUTV9DUEFSRU4pCi0JCXJldCA9IGMgPT0gLyooKi8gJyknID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOwotCWVsc2UgaWYgKG1ldGEgPT0gVE1fVU5PUCB8fCBtZXRhID09IFRNX0JJTk9QKSB7Ci0JCWlmIChtZXRhID09IFRNX0JJTk9QICYmIGMgPT0gUkVESVIgJiYKLQkJICAgICh5eWx2YWwuaW9wLT5mbGFnID09IElPUkVBRCB8fCB5eWx2YWwuaW9wLT5mbGFnID09IElPV1JJVEUpKSB7Ci0JCQlyZXQgPSBUT19OT05OVUxMOwotCQkJc2F2ZSA9IHdkY29weSh5eWx2YWwuaW9wLT5mbGFnID09IElPUkVBRCA/Ci0JCQkgICAgZGJfbHRoYW4gOiBkYl9ndGhhbiwgQVRFTVApOwotCQl9IGVsc2UgaWYgKHVxd29yZCAmJiAocmV0ID0gdGVzdF9pc29wKG1ldGEsIGlkZW50KSkpCi0JCQlzYXZlID0geXlsdmFsLmNwOwotCX0gZWxzZSAvKiBtZXRhID09IFRNX0VORCAqLwotCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoeXlsdmFsLmNwLAotCQkgICAgZGJfY2xvc2UpKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKLQlpZiAocmV0ICE9IFRPX05PTk9QKSB7Ci0JCUFDQ0VQVDsKLQkJaWYgKG1ldGEgPCBORUxFTShkYnRlc3RfdG9rZW5zKSkKLQkJCXNhdmUgPSB3ZGNvcHkoZGJ0ZXN0X3Rva2Vuc1soaW50KW1ldGFdLCBBVEVNUCk7Ci0JCWlmIChzYXZlKQotCQkJWFBwdXQoKnRlLT5wb3MuYXYsIHNhdmUpOwotCX0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRidGVzdHBfZ2V0b3BuZChUZXN0X2VudiAqdGUsIFRlc3Rfb3Agb3AgTUtTSF9BX1VOVVNFRCwKLSAgICBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKLXsKLQlpbnQgYyA9IHRwZWVrKEFSUkFZVkFSKTsKLQotCWlmIChjICE9IExXT1JEKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JQUNDRVBUOwotCVhQcHV0KCp0ZS0+cG9zLmF2LCB5eWx2YWwuY3ApOwotCi0JcmV0dXJuIChudWxsKTsKLX0KLQotc3RhdGljIGludAotZGJ0ZXN0cF9ldmFsKFRlc3RfZW52ICp0ZSBNS1NIX0FfVU5VU0VELCBUZXN0X29wIG9wIE1LU0hfQV9VTlVTRUQsCi0gICAgY29uc3QgY2hhciAqb3BuZDEgTUtTSF9BX1VOVVNFRCwgY29uc3QgY2hhciAqb3BuZDIgTUtTSF9BX1VOVVNFRCwKLSAgICBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKLXsKLQlyZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotZGJ0ZXN0cF9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOwotCi0JaWYgKG9mZnNldCA8IDApIHsKLQkJUkVKRUNUOwotCQkvKiBLbHVkZ3kgdG8gc2F5IHRoZSBsZWFzdC4uLiAqLwotCQlzeW1ib2wgPSBMV09SRDsKLQkJeXlsdmFsLmNwID0gKihYUHB0cnYoKnRlLT5wb3MuYXYpICsgWFBzaXplKCp0ZS0+cG9zLmF2KSArCi0JCSAgICBvZmZzZXQpOwotCX0KLQlzeW50YXhlcnIobXNnKTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3RyZWUuYyBiL21rc2gvc3JjL3RyZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NjFkYi4uMDAwMDAwMAotLS0gYS9ta3NoL3NyYy90cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHRyZWUuYyx2IDEuMTkgMjAwOC8wOC8xMSAyMTo1MDozNSBqYXJlZHkgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLSAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KLSAqCi0gKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKLSAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgotICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCi0gKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKLSAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCi0gKgotICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCi0gKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKLSAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAotICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCi0gKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKLSAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAotICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0Ci0gKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgotICovCi0KLSNpbmNsdWRlICJzaC5oIgotCi1fX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC90cmVlLmMsdiAxLjMwIDIwMTAvMDIvMjUgMjA6MTg6MTkgdGcgRXhwICQiKTsKLQotI2RlZmluZSBJTkRFTlQJNAotCi0jZGVmaW5lIHRwdXRjKGMsIHNoZikgc2hmX3B1dGNoYXIoYywgc2hmKTsKLXN0YXRpYyB2b2lkIHB0cmVlKHN0cnVjdCBvcCAqLCBpbnQsIHN0cnVjdCBzaGYgKik7Ci1zdGF0aWMgdm9pZCBwaW9hY3Qoc3RydWN0IHNoZiAqLCBpbnQsIHN0cnVjdCBpb3dvcmQgKik7Ci1zdGF0aWMgdm9pZCB0cHV0QyhpbnQsIHN0cnVjdCBzaGYgKik7Ci1zdGF0aWMgdm9pZCB0cHV0UyhjaGFyICosIHN0cnVjdCBzaGYgKik7Ci1zdGF0aWMgdm9pZCB2ZnB0cmVlZihzdHJ1Y3Qgc2hmICosIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLXN0YXRpYyBzdHJ1Y3QgaW93b3JkICoqaW9jb3B5KHN0cnVjdCBpb3dvcmQgKiosIEFyZWEgKik7Ci1zdGF0aWMgdm9pZCBpb2ZyZWUoc3RydWN0IGlvd29yZCAqKiwgQXJlYSAqKTsKLQotLyoKLSAqIHByaW50IGEgY29tbWFuZCB0cmVlCi0gKi8KLXN0YXRpYyB2b2lkCi1wdHJlZShzdHJ1Y3Qgb3AgKnQsIGludCBpbmRlbnQsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQljb25zdCBjaGFyICoqdzsKLQlzdHJ1Y3QgaW93b3JkICoqaW9hY3Q7Ci0Jc3RydWN0IG9wICp0MTsKLQotIENoYWluOgotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybjsKLQlzd2l0Y2ggKHQtPnR5cGUpIHsKLQljYXNlIFRDT006Ci0JCWlmICh0LT52YXJzKQotCQkJZm9yICh3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKncgIT0gTlVMTDsgKQotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKLQkJZWxzZQotCQkJc2hmX3B1dHMoIiNuby12YXJzIyAiLCBzaGYpOwotCQlpZiAodC0+YXJncykKLQkJCWZvciAodyA9IHQtPmFyZ3M7ICp3ICE9IE5VTEw7ICkKLQkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMgIiwgKncrKyk7Ci0JCWVsc2UKLQkJCXNoZl9wdXRzKCIjbm8tYXJncyMgIiwgc2hmKTsKLQkJYnJlYWs7Ci0JY2FzZSBURVhFQzoKLQkJdCA9IHQtPmxlZnQ7Ci0JCWdvdG8gQ2hhaW47Ci0JY2FzZSBUUEFSRU46Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyAyLCAiKCAlVCkgIiwgdC0+bGVmdCk7Ci0JCWJyZWFrOwotCWNhc2UgVFBJUEU6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVHwgIiwgdC0+bGVmdCk7Ci0JCXQgPSB0LT5yaWdodDsKLQkJZ290byBDaGFpbjsKLQljYXNlIFRMSVNUOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVQlOyIsIHQtPmxlZnQpOwotCQl0ID0gdC0+cmlnaHQ7Ci0JCWdvdG8gQ2hhaW47Ci0JY2FzZSBUT1I6Ci0JY2FzZSBUQU5EOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVQlcyAlVCIsCi0JCSAgICB0LT5sZWZ0LCAodC0+dHlwZT09VE9SKSA/ICJ8fCIgOiAiJiYiLCB0LT5yaWdodCk7Ci0JCWJyZWFrOwotCWNhc2UgVEJBTkc6Ci0JCXNoZl9wdXRzKCIhICIsIHNoZik7Ci0JCXQgPSB0LT5yaWdodDsKLQkJZ290byBDaGFpbjsKLQljYXNlIFREQlJBQ0tFVDogewotCQlpbnQgaTsKLQotCQlzaGZfcHV0cygiW1siLCBzaGYpOwotCQlmb3IgKGkgPSAwOyB0LT5hcmdzW2ldOyBpKyspCi0JCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiICVTIiwgdC0+YXJnc1tpXSk7Ci0JCXNoZl9wdXRzKCIgXV0gIiwgc2hmKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVFNFTEVDVDoKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgInNlbGVjdCAlcyAiLCB0LT5zdHIpOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgVEZPUjoKLQkJaWYgKHQtPnR5cGUgPT0gVEZPUikKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJmb3IgJXMgIiwgdC0+c3RyKTsKLQkJaWYgKHQtPnZhcnMgIT0gTlVMTCkgewotCQkJc2hmX3B1dHMoImluICIsIHNoZik7Ci0JCQlmb3IgKHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdzsgKQotCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOwotCQl9Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJkbyVOJVQiLCB0LT5sZWZ0KTsKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG9uZSAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBUQ0FTRToKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgImNhc2UgJVMgaW4iLCB0LT5zdHIpOwotCQlmb3IgKHQxID0gdC0+bGVmdDsgdDEgIT0gTlVMTDsgdDEgPSB0MS0+cmlnaHQpIHsKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlTigiKTsKLQkJCWZvciAodyA9IChjb25zdCBjaGFyICoqKXQxLT52YXJzOyAqdyAhPSBOVUxMOyB3KyspCi0JCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTJWMiLCAqdywKLQkJCQkgICAgKHdbMV0gIT0gTlVMTCkgPyAnfCcgOiAnKScpOwotCQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgIiU7JVQlTjs7IiwgdDEtPmxlZnQpOwotCQl9Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlTmVzYWMgIik7Ci0JCWJyZWFrOwotCWNhc2UgVElGOgotCWNhc2UgVEVMSUY6Ci0JCS8qIDMgPT0gc3RybGVuKCJpZiAiKSAqLwotCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgMywgImlmICVUIiwgdC0+bGVmdCk7Ci0JCWZvciAoOzspIHsKLQkJCXQgPSB0LT5yaWdodDsKLQkJCWlmICh0LT5sZWZ0ICE9IE5VTEwpIHsKLQkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKLQkJCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAidGhlbiVOJVQiLAotCQkJCSAgICB0LT5sZWZ0KTsKLQkJCX0KLQkJCWlmICh0LT5yaWdodCA9PSBOVUxMIHx8IHQtPnJpZ2h0LT50eXBlICE9IFRFTElGKQotCQkJCWJyZWFrOwotCQkJdCA9IHQtPnJpZ2h0OwotCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7Ci0JCQkvKiA1ID09IHN0cmxlbigiZWxpZiAiKSAqLwotCQkJZnB0cmVlZihzaGYsIGluZGVudCArIDUsICJlbGlmICVUIiwgdC0+bGVmdCk7Ci0JCX0KLQkJaWYgKHQtPnJpZ2h0ICE9IE5VTEwpIHsKLQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOwotCQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgImVsc2UlOyVUIiwgdC0+cmlnaHQpOwotCQl9Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2ZpICIpOwotCQlicmVhazsKLQljYXNlIFRXSElMRToKLQljYXNlIFRVTlRJTDoKLQkJLyogNiA9PSBzdHJsZW4oIndoaWxlIi8idW50aWwiKSAqLwotCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgNiwgIiVzICVUIiwKLQkJICAgICh0LT50eXBlPT1UV0hJTEUpID8gIndoaWxlIiA6ICJ1bnRpbCIsCi0JCSAgICB0LT5sZWZ0KTsKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG8iKTsKLQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgIiU7JVQiLCB0LT5yaWdodCk7Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2RvbmUgIik7Ci0JCWJyZWFrOwotCWNhc2UgVEJSQUNFOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAieyU7JVQiLCB0LT5sZWZ0KTsKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7fSAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBUQ09QUk9DOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVR8JiAiLCB0LT5sZWZ0KTsKLQkJYnJlYWs7Ci0JY2FzZSBUQVNZTkM6Ci0JCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCYgIiwgdC0+bGVmdCk7Ci0JCWJyZWFrOwotCWNhc2UgVEZVTkNUOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LAotCQkgICAgdC0+dS5rc2hfZnVuYyA/ICJmdW5jdGlvbiAlcyAlVCIgOiAiJXMoKSAlVCIsCi0JCSAgICB0LT5zdHIsIHQtPmxlZnQpOwotCQlicmVhazsKLQljYXNlIFRUSU1FOgotCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAidGltZSAlVCIsIHQtPmxlZnQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzaGZfcHV0cygiPGJvdGNoPiIsIHNoZik7Ci0JCWJyZWFrOwotCX0KLQlpZiAoKGlvYWN0ID0gdC0+aW9hY3QpICE9IE5VTEwpIHsKLQkJaW50CW5lZWRfbmwgPSAwOwotCi0JCXdoaWxlICgqaW9hY3QgIT0gTlVMTCkKLQkJCXBpb2FjdChzaGYsIGluZGVudCwgKmlvYWN0KyspOwotCQkvKiBQcmludCBoZXJlIGRvY3VtZW50cyBhZnRlciBldmVyeXRoaW5nIGVsc2UuLi4gKi8KLQkJZm9yIChpb2FjdCA9IHQtPmlvYWN0OyAqaW9hY3QgIT0gTlVMTDsgKSB7Ci0JCQlzdHJ1Y3QgaW93b3JkICppb3AgPSAqaW9hY3QrKzsKLQotCQkJLyogaGVyZWRvYyBpcyAwIHdoZW4gdHJhY2luZyAoc2V0IC14KSAqLwotCQkJaWYgKChpb3AtPmZsYWcgJiBJT1RZUEUpID09IElPSEVSRSAmJiBpb3AtPmhlcmVkb2MgJiYKLQkJCSAgICAvKiBpb3AtPmRlbGltWzFdID09ICc8JyBtZWFucyBoZXJlIHN0cmluZyAqLwotCQkJICAgICghaW9wLT5kZWxpbSB8fCBpb3AtPmRlbGltWzFdICE9ICc8JykpIHsKLQkJCQl0cHV0YygnXG4nLCBzaGYpOwotCQkJCXNoZl9wdXRzKGlvcC0+aGVyZWRvYywgc2hmKTsKLQkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJXMiLAotCQkJCSAgICBldmFsc3RyKGlvcC0+ZGVsaW0sIDApKTsKLQkJCQluZWVkX25sID0gMTsKLQkJCX0KLQkJfQotCQkvKiBMYXN0IGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSAodGhpcyBvZnRlbgotCQkgKiBsZWFkcyB0byBhbiBleHRyYSBibGFuayBsaW5lLCBidXQgaXRzIG5vdCB3b3J0aCB3b3JyeWluZwotCQkgKiBhYm91dCkKLQkJICovCi0JCWlmIChuZWVkX25sKQotCQkJdHB1dGMoJ1xuJywgc2hmKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1waW9hY3Qoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBzdHJ1Y3QgaW93b3JkICppb3ApCi17Ci0JaW50IGZsYWcgPSBpb3AtPmZsYWc7Ci0JaW50IHR5cGUgPSBmbGFnICYgSU9UWVBFOwotCWludCBleHBlY3RlZDsKLQotCWV4cGVjdGVkID0gKHR5cGUgPT0gSU9SRUFEIHx8IHR5cGUgPT0gSU9SRFdSIHx8IHR5cGUgPT0gSU9IRVJFKSA/IDAgOgotCSAgICAodHlwZSA9PSBJT0NBVCB8fCB0eXBlID09IElPV1JJVEUpID8gMSA6Ci0JICAgICh0eXBlID09IElPRFVQICYmIChpb3AtPnVuaXQgPT0gIShmbGFnICYgSU9SRFVQKSkpID8gaW9wLT51bml0IDoKLQkgICAgaW9wLT51bml0ICsgMTsKLQlpZiAoaW9wLT51bml0ICE9IGV4cGVjdGVkKQotCQlzaGZfZnByaW50ZihzaGYsICIlZCIsIGlvcC0+dW5pdCk7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElPUkVBRDoKLQkJc2hmX3B1dHMoIjwgIiwgc2hmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0hFUkU6Ci0JCXNoZl9wdXRzKGZsYWcgJiBJT1NLSVAgPyAiPDwtIiA6ICI8PCIsIHNoZik7Ci0JCWJyZWFrOwotCWNhc2UgSU9DQVQ6Ci0JCXNoZl9wdXRzKCI+PiAiLCBzaGYpOwotCQlicmVhazsKLQljYXNlIElPV1JJVEU6Ci0JCXNoZl9wdXRzKGZsYWcgJiBJT0NMT0IgPyAiPnwgIiA6ICI+ICIsIHNoZik7Ci0JCWJyZWFrOwotCWNhc2UgSU9SRFdSOgotCQlzaGZfcHV0cygiPD4gIiwgc2hmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0RVUDoKLQkJc2hmX3B1dHMoZmxhZyAmIElPUkRVUCA/ICI8JiIgOiAiPiYiLCBzaGYpOwotCQlicmVhazsKLQl9Ci0JLyogbmFtZS9kZWxpbSBhcmUgMCB3aGVuIHByaW50aW5nIHN5bnRheCBlcnJvcnMgKi8KLQlpZiAodHlwZSA9PSBJT0hFUkUpIHsKLQkJaWYgKGlvcC0+ZGVsaW0pCi0JCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJXMlUyAiLAotCQkJICAgIC8qIGhlcmUgc3RyaW5nICovIGlvcC0+ZGVsaW1bMV0gPT0gJzwnID8gIiIgOiAiICIsCi0JCQkgICAgaW9wLT5kZWxpbSk7Ci0JCWVsc2UKLQkJCXRwdXRjKCcgJywgc2hmKTsKLQl9IGVsc2UgaWYgKGlvcC0+bmFtZSkKLQkJZnB0cmVlZihzaGYsIGluZGVudCwgKGlvcC0+ZmxhZyAmIElPTkFNRVhQKSA/ICIlcyAiIDogIiVTICIsCi0JCSAgICBpb3AtPm5hbWUpOwotfQotCi0KLS8qCi0gKiB2YXJpYW50cyBvZiBmcHV0YywgZnB1dHMgZm9yIHB0cmVlZiBhbmQgc25wdHJlZWYKLSAqLwotc3RhdGljIHZvaWQKLXRwdXRDKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCi17Ci0JaWYgKChjJjB4NjApID09IDApIHsJCS8qIEMwfEMxICovCi0JCXRwdXRjKChjJjB4ODApID8gJyQnIDogJ14nLCBzaGYpOwotCQl0cHV0YygoKGMmMHg3Ril8MHg0MCksIHNoZik7Ci0JfSBlbHNlIGlmICgoYyYweDdGKSA9PSAweDdGKSB7CS8qIERFTCAqLwotCQl0cHV0YygoYyYweDgwKSA/ICckJyA6ICdeJywgc2hmKTsKLQkJdHB1dGMoJz8nLCBzaGYpOwotCX0gZWxzZQotCQl0cHV0YyhjLCBzaGYpOwotfQotCi1zdGF0aWMgdm9pZAotdHB1dFMoY2hhciAqd3AsIHN0cnVjdCBzaGYgKnNoZikKLXsKLQlpbnQgYywgcXVvdGVsZXZlbCA9IDA7Ci0KLQkvKiBwcm9ibGVtczoKLQkgKglgLi4uYCAtPiAkKC4uLikKLQkgKgknZm9vJyAtPiAiZm9vIgotCSAqIGNvdWxkIGNoYW5nZSBlbmNvZGluZyB0bzoKLQkgKglPUVVPVEUgWyInXSAuLi4gQ1FVT1RFIFsiJ10KLQkgKglDT01TVUIgWyhgXSAuLi5cMAkoaGFuZGxlICQgYCBcIGFuZCBtYXliZSAiIGluIGAuLi5gIGNhc2UpCi0JICovCi0Jd2hpbGUgKDEpCi0JCXN3aXRjaCAoKndwKyspIHsKLQkJY2FzZSBFT1M6Ci0JCQlyZXR1cm47Ci0JCWNhc2UgQURFTElNOgotCQljYXNlIENIQVI6Ci0JCQl0cHV0Qygqd3ArKywgc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIFFDSEFSOgotCQkJYyA9ICp3cCsrOwotCQkJaWYgKCFxdW90ZWxldmVsIHx8IChjID09ICciJyB8fCBjID09ICdgJyB8fCBjID09ICckJykpCi0JCQkJdHB1dGMoJ1xcJywgc2hmKTsKLQkJCXRwdXRDKGMsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDT01TVUI6Ci0JCQlzaGZfcHV0cygiJCgiLCBzaGYpOwotCQkJd2hpbGUgKCp3cCAhPSAwKQotCQkJCXRwdXRDKCp3cCsrLCBzaGYpOwotCQkJdHB1dGMoJyknLCBzaGYpOwotCQkJd3ArKzsKLQkJCWJyZWFrOwotCQljYXNlIEVYUFJTVUI6Ci0JCQlzaGZfcHV0cygiJCgoIiwgc2hmKTsKLQkJCXdoaWxlICgqd3AgIT0gMCkKLQkJCQl0cHV0Qygqd3ArKywgc2hmKTsKLQkJCXNoZl9wdXRzKCIpKSIsIHNoZik7Ci0JCQl3cCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1FVT1RFOgotCQkJcXVvdGVsZXZlbCsrOwotCQkJdHB1dGMoJyInLCBzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1FVT1RFOgotCQkJaWYgKHF1b3RlbGV2ZWwpCi0JCQkJcXVvdGVsZXZlbC0tOwotCQkJdHB1dGMoJyInLCBzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1NVQlNUOgotCQkJdHB1dGMoJyQnLCBzaGYpOwotCQkJaWYgKCp3cCsrID09ICd7JykKLQkJCQl0cHV0YygneycsIHNoZik7Ci0JCQl3aGlsZSAoKGMgPSAqd3ArKykgIT0gMCkKLQkJCQl0cHV0QyhjLCBzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1NVQlNUOgotCQkJaWYgKCp3cCsrID09ICd9JykKLQkJCQl0cHV0YygnfScsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUEFUOgotCQkJdHB1dGMoKndwKyssIHNoZik7Ci0JCQl0cHV0YygnKCcsIHNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBTUEFUOgotCQkJdHB1dGMoJ3wnLCBzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BBVDoKLQkJCXRwdXRjKCcpJywgc2hmKTsKLQkJCWJyZWFrOwotCQl9Ci19Ci0KLS8qCi0gKiB0aGlzIGlzIHRoZSBfb25seV8gd2F5IHRvIHJlbGlhYmx5IGhhbmRsZQotICogdmFyaWFibGUgYXJncyB3aXRoIGFuIEFOU0kgY29tcGlsZXIKLSAqLwotLyogVkFSQVJHUyAqLwotaW50Ci1mcHRyZWVmKHN0cnVjdCBzaGYgKnNoZiwgaW50IGluZGVudCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQotCXZhX3N0YXJ0KHZhLCBmbXQpOwotCi0JdmZwdHJlZWYoc2hmLCBpbmRlbnQsIGZtdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogVkFSQVJHUyAqLwotY2hhciAqCi1zbnB0cmVlZihjaGFyICpzLCBpbnQgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCB2YTsKLQlzdHJ1Y3Qgc2hmIHNoZjsKLQotCXNoZl9zb3BlbihzLCBuLCBTSEZfV1IgfCAocyA/IDAgOiBTSEZfRFlOQU1JQyksICZzaGYpOwotCi0JdmFfc3RhcnQodmEsIGZtdCk7Ci0JdmZwdHJlZWYoJnNoZiwgMCwgZm10LCB2YSk7Ci0JdmFfZW5kKHZhKTsKLQotCXJldHVybiAoc2hmX3NjbG9zZSgmc2hmKSk7IC8qIG51bGwgdGVybWluYXRlcyAqLwotfQotCi1zdGF0aWMgdm9pZAotdmZwdHJlZWYoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCi17Ci0JaW50IGM7Ci0KLQl3aGlsZSAoKGMgPSAqZm10KyspKSB7Ci0JCWlmIChjID09ICclJykgewotCQkJc3dpdGNoICgoYyA9ICpmbXQrKykpIHsKLQkJCWNhc2UgJ2MnOgotCQkJCXRwdXRjKHZhX2FyZyh2YSwgaW50KSwgc2hmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotCQkJCXNoZl9wdXRzKHZhX2FyZyh2YSwgY2hhciAqKSwgc2hmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1MnOgkvKiB3b3JkICovCi0JCQkJdHB1dFModmFfYXJnKHZhLCBjaGFyICopLCBzaGYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZCc6CS8qIGRlY2ltYWwgKi8KLQkJCQlzaGZfZnByaW50ZihzaGYsICIlZCIsIHZhX2FyZyh2YSwgaW50KSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd1JzoJLyogZGVjaW1hbCAqLwotCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiV1IiwgdmFfYXJnKHZhLCB1bnNpZ25lZCBpbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1QnOgkvKiBmb3JtYXQgdHJlZSAqLwotCQkJCXB0cmVlKHZhX2FyZyh2YSwgc3RydWN0IG9wICopLCBpbmRlbnQsIHNoZik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc7JzoJLyogbmV3bGluZSBvciA7ICovCi0JCQljYXNlICdOJzoJLyogbmV3bGluZSBvciBzcGFjZSAqLwotCQkJCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgewotCQkJCQlpZiAoYyA9PSAnOycpCi0JCQkJCQl0cHV0YygnOycsIHNoZik7Ci0JCQkJCXRwdXRjKCcgJywgc2hmKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgaTsKLQotCQkJCQl0cHV0YygnXG4nLCBzaGYpOwotCQkJCQlmb3IgKGkgPSBpbmRlbnQ7IGkgPj0gODsgaSAtPSA4KQotCQkJCQkJdHB1dGMoJ1x0Jywgc2hmKTsKLQkJCQkJZm9yICg7IGkgPiAwOyAtLWkpCi0JCQkJCQl0cHV0YygnICcsIHNoZik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnUic6Ci0JCQkJcGlvYWN0KHNoZiwgaW5kZW50LCB2YV9hcmcodmEsIHN0cnVjdCBpb3dvcmQgKikpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl0cHV0YyhjLCBzaGYpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UKLQkJCXRwdXRjKGMsIHNoZik7Ci0JfQotfQotCi0vKgotICogY29weSB0cmVlIChmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbikKLSAqLwotc3RydWN0IG9wICoKLXRjb3B5KHN0cnVjdCBvcCAqdCwgQXJlYSAqYXApCi17Ci0Jc3RydWN0IG9wICpyOwotCWNvbnN0IGNoYXIgKip0dzsKLQljaGFyICoqcnc7Ci0KLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JciA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgb3ApLCBhcCk7Ci0KLQlyLT50eXBlID0gdC0+dHlwZTsKLQlyLT51LmV2YWxmbGFncyA9IHQtPnUuZXZhbGZsYWdzOwotCi0JaWYgKHQtPnR5cGUgPT0gVENBU0UpCi0JCXItPnN0ciA9IHdkY29weSh0LT5zdHIsIGFwKTsKLQllbHNlCi0JCXN0cmR1cHgoci0+c3RyLCB0LT5zdHIsIGFwKTsKLQotCWlmICh0LT52YXJzID09IE5VTEwpCi0JCXItPnZhcnMgPSBOVUxMOwotCWVsc2UgewotCQlmb3IgKHR3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKnR3KysgIT0gTlVMTDsgKQotCQkJOwotCQlydyA9IHItPnZhcnMgPSBhbGxvYygodHcgLSAoY29uc3QgY2hhciAqKil0LT52YXJzICsgMSkgKgotCQkgICAgc2l6ZW9mKCp0dyksIGFwKTsKLQkJZm9yICh0dyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp0dyAhPSBOVUxMOyApCi0JCQkqcncrKyA9IHdkY29weSgqdHcrKywgYXApOwotCQkqcncgPSBOVUxMOwotCX0KLQotCWlmICh0LT5hcmdzID09IE5VTEwpCi0JCXItPmFyZ3MgPSBOVUxMOwotCWVsc2UgewotCQlmb3IgKHR3ID0gdC0+YXJnczsgKnR3KysgIT0gTlVMTDsgKQotCQkJOwotCQlyLT5hcmdzID0gKGNvbnN0IGNoYXIgKiopKHJ3ID0gYWxsb2MoKHR3IC0gdC0+YXJncyArIDEpICoKLQkJICAgIHNpemVvZigqdHcpLCBhcCkpOwotCQlmb3IgKHR3ID0gdC0+YXJnczsgKnR3ICE9IE5VTEw7ICkKLQkJCSpydysrID0gd2Rjb3B5KCp0dysrLCBhcCk7Ci0JCSpydyA9IE5VTEw7Ci0JfQotCi0Jci0+aW9hY3QgPSAodC0+aW9hY3QgPT0gTlVMTCkgPyBOVUxMIDogaW9jb3B5KHQtPmlvYWN0LCBhcCk7Ci0KLQlyLT5sZWZ0ID0gdGNvcHkodC0+bGVmdCwgYXApOwotCXItPnJpZ2h0ID0gdGNvcHkodC0+cmlnaHQsIGFwKTsKLQlyLT5saW5lbm8gPSB0LT5saW5lbm87Ci0KLQlyZXR1cm4gKHIpOwotfQotCi1jaGFyICoKLXdkY29weShjb25zdCBjaGFyICp3cCwgQXJlYSAqYXApCi17Ci0Jc2l6ZV90IGxlbiA9IHdkc2Nhbih3cCwgRU9TKSAtIHdwOwotCXJldHVybiAobWVtY3B5KGFsbG9jKGxlbiwgYXApLCB3cCwgbGVuKSk7Ci19Ci0KLS8qIHJldHVybiB0aGUgcG9zaXRpb24gb2YgcHJlZml4IGMgaW4gd3AgcGx1cyAxICovCi1jb25zdCBjaGFyICoKLXdkc2Nhbihjb25zdCBjaGFyICp3cCwgaW50IGMpCi17Ci0JaW50IG5lc3QgPSAwOwotCi0Jd2hpbGUgKDEpCi0JCXN3aXRjaCAoKndwKyspIHsKLQkJY2FzZSBFT1M6Ci0JCQlyZXR1cm4gKHdwKTsKLQkJY2FzZSBBREVMSU06Ci0JCQlpZiAoYyA9PSBBREVMSU0pCi0JCQkJcmV0dXJuICh3cCArIDEpOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBDSEFSOgotCQljYXNlIFFDSEFSOgotCQkJd3ArKzsKLQkJCWJyZWFrOwotCQljYXNlIENPTVNVQjoKLQkJY2FzZSBFWFBSU1VCOgotCQkJd2hpbGUgKCp3cCsrICE9IDApCi0JCQkJOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1FVT1RFOgotCQljYXNlIENRVU9URToKLQkJCWJyZWFrOwotCQljYXNlIE9TVUJTVDoKLQkJCW5lc3QrKzsKLQkJCXdoaWxlICgqd3ArKyAhPSAnXDAnKQotCQkJCTsKLQkJCWJyZWFrOwotCQljYXNlIENTVUJTVDoKLQkJCXdwKys7Ci0JCQlpZiAoYyA9PSBDU1VCU1QgJiYgbmVzdCA9PSAwKQotCQkJCXJldHVybiAod3ApOwotCQkJbmVzdC0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BBVDoKLQkJCW5lc3QrKzsKLQkJCXdwKys7Ci0JCQlicmVhazsKLQkJY2FzZSBTUEFUOgotCQljYXNlIENQQVQ6Ci0JCQlpZiAoYyA9PSB3cFstMV0gJiYgbmVzdCA9PSAwKQotCQkJCXJldHVybiAod3ApOwotCQkJaWYgKHdwWy0xXSA9PSBDUEFUKQotCQkJCW5lc3QtLTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaW50ZXJuYWxfd2FybmluZ2YoCi0JCQkgICAgIndkc2NhbjogdW5rbm93biBjaGFyIDB4JXggKGNhcnJ5aW5nIG9uKSIsCi0JCQkgICAgd3BbLTFdKTsKLQkJfQotfQotCi0vKiByZXR1cm4gYSBjb3B5IG9mIHdwIHdpdGhvdXQgYW55IG9mIHRoZSBtYXJrIHVwIGNoYXJhY3RlcnMgYW5kCi0gKiB3aXRoIHF1b3RlIGNoYXJhY3RlcnMgKCIgJyBcKSBzdHJpcHBlZC4KLSAqIChzdHJpbmcgaXMgYWxsb2NhdGVkIGZyb20gQVRFTVApCi0gKi8KLWNoYXIgKgotd2RzdHJpcChjb25zdCBjaGFyICp3cCwgYm9vbCBrZWVwcSwgYm9vbCBtYWtlX21hZ2ljKQotewotCXN0cnVjdCBzaGYgc2hmOwotCWludCBjOwotCi0Jc2hmX3NvcGVuKE5VTEwsIDMyLCBTSEZfV1IgfCBTSEZfRFlOQU1JQywgJnNoZik7Ci0KLQkvKiBwcm9ibGVtczoKLQkgKglgLi4uYCAtPiAkKC4uLikKLQkgKgl4JHtmb286LSJoaSJ9IC0+IHgke2ZvbzotaGl9Ci0JICoJeCR7Zm9vOi0naGknfSAtPiB4JHtmb286LWhpfSB1bmxlc3Mga2VlcHEKLQkgKi8KLQl3aGlsZSAoMSkKLQkJc3dpdGNoICgqd3ArKykgewotCQljYXNlIEVPUzoKLQkJCXJldHVybiAoc2hmX3NjbG9zZSgmc2hmKSk7IC8qIG51bGwgdGVybWluYXRlcyAqLwotCQljYXNlIEFERUxJTToKLQkJY2FzZSBDSEFSOgotCQkJYyA9ICp3cCsrOwotCQkJaWYgKG1ha2VfbWFnaWMgJiYgKElTTUFHSUMoYykgfHwgYyA9PSAnWycgfHwgYyA9PSBOT1QgfHwKLQkJCSAgICBjID09ICctJyB8fCBjID09ICddJyB8fCBjID09ICcqJyB8fCBjID09ICc/JykpCi0JCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOwotCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBRQ0hBUjoKLQkJCWMgPSAqd3ArKzsKLQkJCWlmIChrZWVwcSAmJiAoYyA9PSAnIicgfHwgYyA9PSAnYCcgfHwgYyA9PSAnJCcgfHwgYyA9PSAnXFwnKSkKLQkJCQlzaGZfcHV0Y2hhcignXFwnLCAmc2hmKTsKLQkJCXNoZl9wdXRjaGFyKGMsICZzaGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09NU1VCOgotCQkJc2hmX3B1dHMoIiQoIiwgJnNoZik7Ci0JCQl3aGlsZSAoKndwICE9IDApCi0JCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOwotCQkJc2hmX3B1dGNoYXIoJyknLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIEVYUFJTVUI6Ci0JCQlzaGZfcHV0cygiJCgoIiwgJnNoZik7Ci0JCQl3aGlsZSAoKndwICE9IDApCi0JCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOwotCQkJc2hmX3B1dHMoIikpIiwgJnNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUVVPVEU6Ci0JCQlicmVhazsKLQkJY2FzZSBDUVVPVEU6Ci0JCQlicmVhazsKLQkJY2FzZSBPU1VCU1Q6Ci0JCQlzaGZfcHV0Y2hhcignJCcsICZzaGYpOwotCQkJaWYgKCp3cCsrID09ICd7JykKLQkJCSAgICBzaGZfcHV0Y2hhcigneycsICZzaGYpOwotCQkJd2hpbGUgKChjID0gKndwKyspICE9IDApCi0JCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDU1VCU1Q6Ci0JCQlpZiAoKndwKysgPT0gJ30nKQotCQkJCXNoZl9wdXRjaGFyKCd9JywgJnNoZik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUEFUOgotCQkJaWYgKG1ha2VfbWFnaWMpIHsKLQkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7Ci0JCQkJc2hmX3B1dGNoYXIoKndwKysgfCAweDgwLCAmc2hmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hmX3B1dGNoYXIoKndwKyssICZzaGYpOwotCQkJCXNoZl9wdXRjaGFyKCcoJywgJnNoZik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTUEFUOgotCQkJaWYgKG1ha2VfbWFnaWMpCi0JCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOwotCQkJc2hmX3B1dGNoYXIoJ3wnLCAmc2hmKTsKLQkJCWJyZWFrOwotCQljYXNlIENQQVQ6Ci0JCQlpZiAobWFrZV9tYWdpYykKLQkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7Ci0JCQlzaGZfcHV0Y2hhcignKScsICZzaGYpOwotCQkJYnJlYWs7Ci0JCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpb3dvcmQgKioKLWlvY29weShzdHJ1Y3QgaW93b3JkICoqaW93LCBBcmVhICphcCkKLXsKLQlzdHJ1Y3QgaW93b3JkICoqaW9yOwotCWludCBpOwotCi0JZm9yIChpb3IgPSBpb3c7ICppb3IrKyAhPSBOVUxMOyApCi0JCTsKLQlpb3IgPSBhbGxvYygoaW9yIC0gaW93ICsgMSkgKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgYXApOwotCi0JZm9yIChpID0gMDsgaW93W2ldICE9IE5VTEw7IGkrKykgewotCQlzdHJ1Y3QgaW93b3JkICpwLCAqcTsKLQotCQlwID0gaW93W2ldOwotCQlxID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dvcmQpLCBhcCk7Ci0JCWlvcltpXSA9IHE7Ci0JCSpxID0gKnA7Ci0JCWlmIChwLT5uYW1lICE9IE5VTEwpCi0JCQlxLT5uYW1lID0gd2Rjb3B5KHAtPm5hbWUsIGFwKTsKLQkJaWYgKHAtPmRlbGltICE9IE5VTEwpCi0JCQlxLT5kZWxpbSA9IHdkY29weShwLT5kZWxpbSwgYXApOwotCQlpZiAocC0+aGVyZWRvYyAhPSBOVUxMKQotCQkJc3RyZHVweChxLT5oZXJlZG9jLCBwLT5oZXJlZG9jLCBhcCk7Ci0JfQotCWlvcltpXSA9IE5VTEw7Ci0KLQlyZXR1cm4gKGlvcik7Ci19Ci0KLS8qCi0gKiBmcmVlIHRyZWUgKGZvciBmdW5jdGlvbiBkZWZpbml0aW9uKQotICovCi12b2lkCi10ZnJlZShzdHJ1Y3Qgb3AgKnQsIEFyZWEgKmFwKQotewotCWNoYXIgKip3OwotCi0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHQtPnN0ciAhPSBOVUxMKQotCQlhZnJlZSh0LT5zdHIsIGFwKTsKLQotCWlmICh0LT52YXJzICE9IE5VTEwpIHsKLQkJZm9yICh3ID0gdC0+dmFyczsgKncgIT0gTlVMTDsgdysrKQotCQkJYWZyZWUoKncsIGFwKTsKLQkJYWZyZWUodC0+dmFycywgYXApOwotCX0KLQotCWlmICh0LT5hcmdzICE9IE5VTEwpIHsKLQkJdW5pb24gbWtzaF9jY3BoYWNrIGN3OwotCQkvKiBYWFggd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcmlnaHQgKi8KLQkJY3cucm8gPSB0LT5hcmdzOwotCQlmb3IgKHcgPSBjdy5ydzsgKncgIT0gTlVMTDsgdysrKQotCQkJYWZyZWUoKncsIGFwKTsKLQkJYWZyZWUodC0+YXJncywgYXApOwotCX0KLQotCWlmICh0LT5pb2FjdCAhPSBOVUxMKQotCQlpb2ZyZWUodC0+aW9hY3QsIGFwKTsKLQotCXRmcmVlKHQtPmxlZnQsIGFwKTsKLQl0ZnJlZSh0LT5yaWdodCwgYXApOwotCi0JYWZyZWUodCwgYXApOwotfQotCi1zdGF0aWMgdm9pZAotaW9mcmVlKHN0cnVjdCBpb3dvcmQgKippb3csIEFyZWEgKmFwKQotewotCXN0cnVjdCBpb3dvcmQgKippb3A7Ci0Jc3RydWN0IGlvd29yZCAqcDsKLQotCWZvciAoaW9wID0gaW93OyAocCA9ICppb3ArKykgIT0gTlVMTDsgKSB7Ci0JCWlmIChwLT5uYW1lICE9IE5VTEwpCi0JCQlhZnJlZShwLT5uYW1lLCBhcCk7Ci0JCWlmIChwLT5kZWxpbSAhPSBOVUxMKQotCQkJYWZyZWUocC0+ZGVsaW0sIGFwKTsKLQkJaWYgKHAtPmhlcmVkb2MgIT0gTlVMTCkKLQkJCWFmcmVlKHAtPmhlcmVkb2MsIGFwKTsKLQkJYWZyZWUocCwgYXApOwotCX0KLQlhZnJlZShpb3csIGFwKTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3Zhci5jIGIvbWtzaC9zcmMvdmFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTcyOWUuLjAwMDAwMDAKLS0tIGEvbWtzaC9zcmMvdmFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkwICswLDAgQEAKLS8qCSRPcGVuQlNEOiB2YXIuYyx2IDEuMzQgMjAwNy8xMC8xNSAwMjoxNjozNSBkZXJhYWR0IEV4cCAkCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCi0gKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+Ci0gKgotICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCi0gKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KLSAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQotICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCi0gKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgotICoKLSAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bwotICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCi0gKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKLSAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAotICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0Ci0gKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKLSAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAotICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KLSAqLwotCi0jaW5jbHVkZSAic2guaCIKLQotI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCi0jaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgotI2VuZGlmCi0KLV9fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3Zhci5jLHYgMS4xMTAgMjAxMC8wNy8yNSAxMTozNTo0MyB0ZyBFeHAgJCIpOwotCi0vKgotICogVmFyaWFibGVzCi0gKgotICogV0FSTklORzogdW5yZWFkYWJsZSBjb2RlLCBuZWVkcyBhIHJld3JpdGUKLSAqCi0gKiBpZiAoZmxhZyZJTlRFR0VSKSwgdmFsLmkgY29udGFpbnMgaW50ZWdlciB2YWx1ZSwgYW5kIHR5cGUgY29udGFpbnMgYmFzZS4KLSAqIG90aGVyd2lzZSwgKHZhbC5zICsgdHlwZSkgY29udGFpbnMgc3RyaW5nIHZhbHVlLgotICogaWYgKGZsYWcmRVhQT1JUKSwgdmFsLnMgY29udGFpbnMgIm5hbWU9dmFsdWUiIGZvciBFLVogZXhwb3J0aW5nLgotICovCi1zdGF0aWMgc3RydWN0IHRibCB2dGVtcDsKLXN0YXRpYyBzdHJ1Y3QgdGFibGUgc3BlY2lhbHM7Ci1zdGF0aWMgY2hhciAqZm9ybWF0c3RyKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyB2b2lkIGV4cG9ydHByZXAoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGludCBzcGVjaWFsKGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB1bnNwZWNpYWwoY29uc3QgY2hhciAqKTsKLXN0YXRpYyB2b2lkIGdldHNwZWMoc3RydWN0IHRibCAqKTsKLXN0YXRpYyB2b2lkIHNldHNwZWMoc3RydWN0IHRibCAqKTsKLXN0YXRpYyB2b2lkIHVuc2V0c3BlYyhzdHJ1Y3QgdGJsICopOwotc3RhdGljIGludCBnZXRpbnQoc3RydWN0IHRibCAqLCBta3NoX2FyaV90ICosIGJvb2wpOwotc3RhdGljIG1rc2hfYXJpX3QgaW50dmFsKHN0cnVjdCB0YmwgKik7Ci1zdGF0aWMgc3RydWN0IHRibCAqYXJyYXlzZWFyY2goc3RydWN0IHRibCAqLCB1aW50MzJfdCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqYXJyYXlfaW5kZXhfY2FsYyhjb25zdCBjaGFyICosIGJvb2wgKiwgdWludDMyX3QgKik7Ci1zdGF0aWMgdWludDMyX3Qgb2FhdGhhc2hfdXBkYXRlKHJlZ2lzdGVyIHVpbnQzMl90LCByZWdpc3RlciBjb25zdCB1aW50OF90ICosCi0gICAgcmVnaXN0ZXIgc2l6ZV90KTsKLXN0YXRpYyB1aW50MzJfdCBvYWF0aGFzaF9maW5hbGlzZShyZWdpc3RlciB1aW50MzJfdCk7Ci0KLXVpbnQ4X3Qgc2V0X3JlZmZsYWcgPSAwOwotCi0vKgotICogY3JlYXRlIGEgbmV3IGJsb2NrIGZvciBmdW5jdGlvbiBjYWxscyBhbmQgc2ltcGxlIGNvbW1hbmRzCi0gKiBhc3N1bWUgY2FsbGVyIGhhcyBhbGxvY2F0ZWQgYW5kIHNldCB1cCBlLT5sb2MKLSAqLwotdm9pZAotbmV3YmxvY2sodm9pZCkKLXsKLQlzdHJ1Y3QgYmxvY2sgKmw7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmVtcHR5W10gPSB7IG51bGwgfTsKLQotCWwgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrKSwgQVRFTVApOwotCWwtPmZsYWdzID0gMDsKLQlhaW5pdCgmbC0+YXJlYSk7IC8qIHRvZG86IGNvdWxkIHVzZSBlLT5hcmVhIChsLT5hcmVhID0+IGwtPmFyZWFwKSAqLwotCWlmICghZS0+bG9jKSB7Ci0JCWwtPmFyZ2MgPSAwOwotCQlsLT5hcmd2ID0gZW1wdHk7Ci0JfSBlbHNlIHsKLQkJbC0+YXJnYyA9IGUtPmxvYy0+YXJnYzsKLQkJbC0+YXJndiA9IGUtPmxvYy0+YXJndjsKLQl9Ci0JbC0+ZXhpdCA9IGwtPmVycm9yID0gTlVMTDsKLQlrdGluaXQoJmwtPnZhcnMsICZsLT5hcmVhLCAwKTsKLQlrdGluaXQoJmwtPmZ1bnMsICZsLT5hcmVhLCAwKTsKLQlsLT5uZXh0ID0gZS0+bG9jOwotCWUtPmxvYyA9IGw7Ci19Ci0KLS8qCi0gKiBwb3AgYSBibG9jayBoYW5kbGluZyBzcGVjaWFsIHZhcmlhYmxlcwotICovCi12b2lkCi1wb3BibG9jayh2b2lkKQotewotCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKLQlzdHJ1Y3QgdGJsICp2cCwgKip2cHAgPSBsLT52YXJzLnRibHMsICp2cTsKLQlpbnQgaTsKLQotCWUtPmxvYyA9IGwtPm5leHQ7CS8qIHBvcCBibG9jayAqLwotCWZvciAoaSA9IGwtPnZhcnMuc2l6ZTsgLS1pID49IDA7ICkKLQkJaWYgKCh2cCA9ICp2cHArKykgIT0gTlVMTCAmJiAodnAtPmZsYWcmU1BFQ0lBTCkpIHsKLQkJCWlmICgodnEgPSBnbG9iYWwodnAtPm5hbWUpKS0+ZmxhZyAmIElTU0VUKQotCQkJCXNldHNwZWModnEpOwotCQkJZWxzZQotCQkJCXVuc2V0c3BlYyh2cSk7Ci0JCX0KLQlpZiAobC0+ZmxhZ3MgJiBCRl9ET0dFVE9QVFMpCi0JCXVzZXJfb3B0ID0gbC0+Z2V0b3B0c19zdGF0ZTsKLQlhZnJlZWFsbCgmbC0+YXJlYSk7Ci0JYWZyZWUobCwgQVRFTVApOwotfQotCi0vKiBjYWxsZWQgYnkgbWFpbigpIHRvIGluaXRpYWxpc2UgdmFyaWFibGUgZGF0YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIFZBUlNQRUNfREVGTlMKLSNpbmNsdWRlICJ2YXJfc3BlYy5oIgotCi1lbnVtIHZhcl9zcGVjcyB7Ci0jZGVmaW5lIFZBUlNQRUNfRU5VTVMKLSNpbmNsdWRlICJ2YXJfc3BlYy5oIgotCVZfTUFYCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluaXR2YXJfbmFtZXNbXSA9IHsKLSNkZWZpbmUgVkFSU1BFQ19JVEVNUwotI2luY2x1ZGUgInZhcl9zcGVjLmgiCi19OwotCi12b2lkCi1pbml0dmFyKHZvaWQpCi17Ci0JaW50IGkgPSAwOwotCXN0cnVjdCB0YmwgKnRwOwotCi0Ja3Rpbml0KCZzcGVjaWFscywgQVBFUk0sCi0JICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDEyIHNwZWNpYWxzKSAqLyAxNik7Ci0Jd2hpbGUgKGkgPCBWX01BWCAtIDEpIHsKLQkJdHAgPSBrdGVudGVyKCZzcGVjaWFscywgaW5pdHZhcl9uYW1lc1tpXSwKLQkJICAgIGhhc2goaW5pdHZhcl9uYW1lc1tpXSkpOwotCQl0cC0+ZmxhZyA9IERFRklORUR8SVNTRVQ7Ci0JCXRwLT50eXBlID0gKytpOwotCX0KLX0KLQotLyogVXNlZCB0byBjYWxjdWxhdGUgYW4gYXJyYXkgaW5kZXggZm9yIGdsb2JhbCgpL2xvY2FsKCkuIFNldHMgKmFycmF5cCB0bwotICogdHJ1ZSBpZiB0aGlzIGlzIGFuIGFycmF5LCBzZXRzICp2YWxwIHRvIHRoZSBhcnJheSBpbmRleCwgcmV0dXJucwotICogdGhlIGJhc2VuYW1lIG9mIHRoZSBhcnJheS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotYXJyYXlfaW5kZXhfY2FsYyhjb25zdCBjaGFyICpuLCBib29sICphcnJheXAsIHVpbnQzMl90ICp2YWxwKQotewotCWNvbnN0IGNoYXIgKnA7Ci0JaW50IGxlbjsKLQljaGFyICphcCA9IE5VTEw7Ci0KLQkqYXJyYXlwID0gZmFsc2U7Ci0gcmVkb19mcm9tX3JlZjoKLQlwID0gc2tpcF92YXJuYW1lKG4sIGZhbHNlKTsKLQlpZiAoIXNldF9yZWZmbGFnICYmIChwICE9IG4pICYmIGtzaF9pc2FscGh4KG5bMF0pKSB7Ci0JCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKLQkJc3RydWN0IHRibCAqdnA7Ci0JCWNoYXIgKnZuOwotCQl1aW50MzJfdCBoOwotCi0JCXN0cm5kdXB4KHZuLCBuLCBwIC0gbiwgQVRFTVApOwotCQloID0gaGFzaCh2bik7Ci0JCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgKi8KLQkJZG8gewotCQkJdnAgPSBrdHNlYXJjaCgmbC0+dmFycywgdm4sIGgpOwotCQl9IHdoaWxlICghdnAgJiYgKGwgPSBsLT5uZXh0KSk7Ci0JCWFmcmVlKHZuLCBBVEVNUCk7Ci0JCWlmICh2cCAmJiAodnAtPmZsYWcgJiAoREVGSU5FRHxBU1NPQ3xBUlJBWSkpID09Ci0JCSAgICAoREVGSU5FRHxBU1NPQykpIHsKLQkJCWNoYXIgKmNwOwotCi0JCQkvKiBnb3RjaGEhICovCi0JCQljcCA9IHNoZl9zbXByaW50ZigiJXMlcyIsIHN0cl92YWwodnApLCBwKTsKLQkJCWFmcmVlKGFwLCBBVEVNUCk7Ci0JCQluID0gYXAgPSBjcDsKLQkJCWdvdG8gcmVkb19mcm9tX3JlZjsKLQkJfQotCX0KLQotCWlmIChwICE9IG4gJiYgKnAgPT0gJ1snICYmIChsZW4gPSBhcnJheV9yZWZfbGVuKHApKSkgewotCQljaGFyICpzdWIsICp0bXA7Ci0JCW1rc2hfYXJpX3QgcnZhbDsKLQotCQkvKiBDYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSBzdWJzY3JpcHQgKi8KLQkJKmFycmF5cCA9IHRydWU7Ci0JCXN0cm5kdXB4KHRtcCwgcCArIDEsIGxlbiAtIDIsIEFURU1QKTsKLQkJc3ViID0gc3Vic3RpdHV0ZSh0bXAsIDApOwotCQlhZnJlZSh0bXAsIEFURU1QKTsKLQkJc3RybmR1cHgobiwgbiwgcCAtIG4sIEFURU1QKTsKLQkJZXZhbHVhdGUoc3ViLCAmcnZhbCwgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7Ci0JCSp2YWxwID0gKHVpbnQzMl90KXJ2YWw7Ci0JCWFmcmVlKHN1YiwgQVRFTVApOwotCX0KLQlyZXR1cm4gKG4pOwotfQotCi0vKgotICogU2VhcmNoIGZvciB2YXJpYWJsZSwgaWYgbm90IGZvdW5kIGNyZWF0ZSBnbG9iYWxseS4KLSAqLwotc3RydWN0IHRibCAqCi1nbG9iYWwoY29uc3QgY2hhciAqbikKLXsKLQlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7Ci0Jc3RydWN0IHRibCAqdnA7Ci0JaW50IGM7Ci0JYm9vbCBhcnJheTsKLQl1aW50MzJfdCBoLCB2YWw7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhcnJheSAqLwotCW4gPSBhcnJheV9pbmRleF9jYWxjKG4sICZhcnJheSwgJnZhbCk7Ci0JaCA9IGhhc2gobik7Ci0JYyA9IG5bMF07Ci0JaWYgKCFrc2hfaXNhbHBoeChjKSkgewotCQlpZiAoYXJyYXkpCi0JCQllcnJvcmYoImJhZCBzdWJzdGl0dXRpb24iKTsKLQkJdnAgPSAmdnRlbXA7Ci0JCXZwLT5mbGFnID0gREVGSU5FRDsKLQkJdnAtPnR5cGUgPSAwOwotCQl2cC0+YXJlYXAgPSBBVEVNUDsKLQkJKnZwLT5uYW1lID0gYzsKLQkJaWYgKGtzaF9pc2RpZ2l0KGMpKSB7Ci0JCQlmb3IgKGMgPSAwOyBrc2hfaXNkaWdpdCgqbik7IG4rKykKLQkJCQljID0gYyoxMCArICpuLScwJzsKLQkJCWlmIChjIDw9IGwtPmFyZ2MpCi0JCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLwotCQkJCXNldHN0cih2cCwgbC0+YXJndltjXSwgS1NIX1JFVFVSTl9FUlJPUik7Ci0JCQl2cC0+ZmxhZyB8PSBSRE9OTFk7Ci0JCQlyZXR1cm4gKHZwKTsKLQkJfQotCQl2cC0+ZmxhZyB8PSBSRE9OTFk7Ci0JCWlmIChuWzFdICE9ICdcMCcpCi0JCQlyZXR1cm4gKHZwKTsKLQkJdnAtPmZsYWcgfD0gSVNTRVR8SU5URUdFUjsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJyQnOgotCQkJdnAtPnZhbC5pID0ga3NocGlkOwotCQkJYnJlYWs7Ci0JCWNhc2UgJyEnOgotCQkJLyogSWYgbm8gam9iLCBleHBhbmQgdG8gbm90aGluZyAqLwotCQkJaWYgKCh2cC0+dmFsLmkgPSBqX2FzeW5jKCkpID09IDApCi0JCQkJdnAtPmZsYWcgJj0gfihJU1NFVHxJTlRFR0VSKTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXZwLT52YWwuaSA9IGV4c3RhdDsKLQkJCWJyZWFrOwotCQljYXNlICcjJzoKLQkJCXZwLT52YWwuaSA9IGwtPmFyZ2M7Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQl2cC0+ZmxhZyAmPSB+SU5URUdFUjsKLQkJCXZwLT52YWwucyA9IGdldG9wdGlvbnMoKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdnAtPmZsYWcgJj0gfihJU1NFVHxJTlRFR0VSKTsKLQkJfQotCQlyZXR1cm4gKHZwKTsKLQl9Ci0JZm9yIChsID0gZS0+bG9jOyA7IGwgPSBsLT5uZXh0KSB7Ci0JCXZwID0ga3RzZWFyY2goJmwtPnZhcnMsIG4sIGgpOwotCQlpZiAodnAgIT0gTlVMTCkgewotCQkJaWYgKGFycmF5KQotCQkJCXJldHVybiAoYXJyYXlzZWFyY2godnAsIHZhbCkpOwotCQkJZWxzZQotCQkJCXJldHVybiAodnApOwotCQl9Ci0JCWlmIChsLT5uZXh0ID09IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0JdnAgPSBrdGVudGVyKCZsLT52YXJzLCBuLCBoKTsKLQlpZiAoYXJyYXkpCi0JCXZwID0gYXJyYXlzZWFyY2godnAsIHZhbCk7Ci0JdnAtPmZsYWcgfD0gREVGSU5FRDsKLQlpZiAoc3BlY2lhbChuKSkKLQkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKLQlyZXR1cm4gKHZwKTsKLX0KLQotLyoKLSAqIFNlYXJjaCBmb3IgbG9jYWwgdmFyaWFibGUsIGlmIG5vdCBmb3VuZCBjcmVhdGUgbG9jYWxseS4KLSAqLwotc3RydWN0IHRibCAqCi1sb2NhbChjb25zdCBjaGFyICpuLCBib29sIGNvcHkpCi17Ci0Jc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOwotCXN0cnVjdCB0YmwgKnZwOwotCWJvb2wgYXJyYXk7Ci0JdWludDMyX3QgaCwgdmFsOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYXJyYXkgKi8KLQluID0gYXJyYXlfaW5kZXhfY2FsYyhuLCAmYXJyYXksICZ2YWwpOwotCWggPSBoYXNoKG4pOwotCWlmICgha3NoX2lzYWxwaHgoKm4pKSB7Ci0JCXZwID0gJnZ0ZW1wOwotCQl2cC0+ZmxhZyA9IERFRklORUR8UkRPTkxZOwotCQl2cC0+dHlwZSA9IDA7Ci0JCXZwLT5hcmVhcCA9IEFURU1QOwotCQlyZXR1cm4gKHZwKTsKLQl9Ci0JdnAgPSBrdGVudGVyKCZsLT52YXJzLCBuLCBoKTsKLQlpZiAoY29weSAmJiAhKHZwLT5mbGFnICYgREVGSU5FRCkpIHsKLQkJc3RydWN0IGJsb2NrICpsbCA9IGw7Ci0JCXN0cnVjdCB0YmwgKnZxID0gTlVMTDsKLQotCQl3aGlsZSAoKGxsID0gbGwtPm5leHQpICYmICEodnEgPSBrdHNlYXJjaCgmbGwtPnZhcnMsIG4sIGgpKSkKLQkJCTsKLQkJaWYgKHZxKSB7Ci0JCQl2cC0+ZmxhZyB8PSB2cS0+ZmxhZyAmCi0JCQkgICAgKEVYUE9SVCB8IElOVEVHRVIgfCBSRE9OTFkgfCBMSlVTVCB8IFJKVVNUIHwKLQkJCSAgICBaRVJPRklMIHwgTENBU0VWIHwgVUNBU0VWX0FMIHwgSU5UX1UgfCBJTlRfTCk7Ci0JCQlpZiAodnEtPmZsYWcgJiBJTlRFR0VSKQotCQkJCXZwLT50eXBlID0gdnEtPnR5cGU7Ci0JCQl2cC0+dTIuZmllbGQgPSB2cS0+dTIuZmllbGQ7Ci0JCX0KLQl9Ci0JaWYgKGFycmF5KQotCQl2cCA9IGFycmF5c2VhcmNoKHZwLCB2YWwpOwotCXZwLT5mbGFnIHw9IERFRklORUQ7Ci0JaWYgKHNwZWNpYWwobikpCi0JCXZwLT5mbGFnIHw9IFNQRUNJQUw7Ci0JcmV0dXJuICh2cCk7Ci19Ci0KLS8qIGdldCB2YXJpYWJsZSBzdHJpbmcgdmFsdWUgKi8KLWNoYXIgKgotc3RyX3ZhbChzdHJ1Y3QgdGJsICp2cCkKLXsKLQljaGFyICpzOwotCi0JaWYgKCh2cC0+ZmxhZyZTUEVDSUFMKSkKLQkJZ2V0c3BlYyh2cCk7Ci0JaWYgKCEodnAtPmZsYWcmSVNTRVQpKQotCQlzID0gbnVsbDsJCS8qIHNwZWNpYWwgdG8gZG9sbGFyKCkgKi8KLQllbHNlIGlmICghKHZwLT5mbGFnJklOVEVHRVIpKQkvKiBzdHJpbmcgc291cmNlICovCi0JCXMgPSB2cC0+dmFsLnMgKyB2cC0+dHlwZTsKLQllbHNlIHsJCQkJLyogaW50ZWdlciBzb3VyY2UgKi8KLQkJLyogd29yc3QgY2FzZSBudW1iZXIgbGVuZ3RoIGlzIHdoZW4gYmFzZT0yICovCi0JCS8qIDEgKG1pbnVzKSArIDIgKGJhc2UsIHVwIHRvIDM2KSArIDEgKCcjJykgKyBudW1iZXIgb2YgYml0cwotCQkgKiBpbiB0aGUgbWtzaF91YXJpX3QgKyAxIChOVUwpICovCi0JCWNoYXIgc3RyYnVmWzEgKyAyICsgMSArIDggKiBzaXplb2YobWtzaF91YXJpX3QpICsgMV07Ci0JCWNvbnN0IGNoYXIgKmRpZ2l0cyA9ICh2cC0+ZmxhZyAmIFVDQVNFVl9BTCkgPwotCQkgICAgZGlnaXRzX3VjIDogZGlnaXRzX2xjOwotCQlta3NoX3VhcmlfdCBuOwotCQlpbnQgYmFzZTsKLQotCQlzID0gc3RyYnVmICsgc2l6ZW9mKHN0cmJ1Zik7Ci0JCWlmICh2cC0+ZmxhZyAmIElOVF9VKQotCQkJbiA9IHZwLT52YWwudTsKLQkJZWxzZQotCQkJbiA9ICh2cC0+dmFsLmkgPCAwKSA/IC12cC0+dmFsLmkgOiB2cC0+dmFsLmk7Ci0JCWJhc2UgPSAodnAtPnR5cGUgPT0gMCkgPyAxMCA6IHZwLT50eXBlOwotCi0JCWlmIChiYXNlID09IDEpIHsKLQkJCXNpemVfdCBzeiA9IDE7Ci0KLQkJCSoocyA9IHN0cmJ1ZikgPSAnMSc7Ci0JCQlzWzFdID0gJyMnOwotCQkJaWYgKCFVVEZNT0RFIHx8ICgobiAmIDB4RkY4MCkgPT0gMHhFRjgwKSkKLQkJCQkvKiBPUFRVLTE2IC0+IHJhdyBvY3RldCAqLwotCQkJCXNbMl0gPSBuICYgMHhGRjsKLQkJCWVsc2UKLQkJCQlzeiA9IHV0Zl93Y3RvbWIocyArIDIsIG4pOwotCQkJc1syICsgc3pdID0gJ1wwJzsKLQkJfSBlbHNlIHsKLQkJCSotLXMgPSAnXDAnOwotCQkJZG8gewotCQkJCSotLXMgPSBkaWdpdHNbbiAlIGJhc2VdOwotCQkJCW4gLz0gYmFzZTsKLQkJCX0gd2hpbGUgKG4gIT0gMCk7Ci0JCQlpZiAoYmFzZSAhPSAxMCkgewotCQkJCSotLXMgPSAnIyc7Ci0JCQkJKi0tcyA9IGRpZ2l0c1tiYXNlICUgMTBdOwotCQkJCWlmIChiYXNlID49IDEwKQotCQkJCQkqLS1zID0gZGlnaXRzW2Jhc2UgLyAxMF07Ci0JCQl9Ci0JCQlpZiAoISh2cC0+ZmxhZyAmIElOVF9VKSAmJiB2cC0+dmFsLmkgPCAwKQotCQkJCSotLXMgPSAnLSc7Ci0JCX0KLQkJaWYgKHZwLT5mbGFnICYgKFJKVVNUfExKVVNUKSkgLyogY2FzZSBhbHJlYWR5IGRlYWx0IHdpdGggKi8KLQkJCXMgPSBmb3JtYXRzdHIodnAsIHMpOwotCQllbHNlCi0JCQlzdHJkdXB4KHMsIHMsIEFURU1QKTsKLQl9Ci0JcmV0dXJuIChzKTsKLX0KLQotLyogZ2V0IHZhcmlhYmxlIGludGVnZXIgdmFsdWUsIHdpdGggZXJyb3IgY2hlY2tpbmcgKi8KLXN0YXRpYyBta3NoX2FyaV90Ci1pbnR2YWwoc3RydWN0IHRibCAqdnApCi17Ci0JbWtzaF9hcmlfdCBudW07Ci0JaW50IGJhc2U7Ci0KLQliYXNlID0gZ2V0aW50KHZwLCAmbnVtLCBmYWxzZSk7Ci0JaWYgKGJhc2UgPT0gLTEpCi0JCS8qIFhYWCBjaGVjayBjYWxscyAtIGlzIGVycm9yIGhlcmUgb2sgYnkgUE9TSVg/ICovCi0JCWVycm9yZigiJXM6IGJhZCBudW1iZXIiLCBzdHJfdmFsKHZwKSk7Ci0JcmV0dXJuIChudW0pOwotfQotCi0vKiBzZXQgdmFyaWFibGUgdG8gc3RyaW5nIHZhbHVlICovCi1pbnQKLXNldHN0cihzdHJ1Y3QgdGJsICp2cSwgY29uc3QgY2hhciAqcywgaW50IGVycm9yX29rKQotewotCWNoYXIgKnNhbGxvYyA9IE5VTEw7Ci0JaW50IG5vX3JvX2NoZWNrID0gZXJyb3Jfb2sgJiAweDQ7Ci0KLQllcnJvcl9vayAmPSB+MHg0OwotCWlmICgodnEtPmZsYWcgJiBSRE9OTFkpICYmICFub19yb19jaGVjaykgewotCQl3YXJuaW5nZih0cnVlLCAiJXM6IGlzIHJlYWQgb25seSIsIHZxLT5uYW1lKTsKLQkJaWYgKCFlcnJvcl9vaykKLQkJCWVycm9yZnooKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKCEodnEtPmZsYWcmSU5URUdFUikpIHsgLyogc3RyaW5nIGRlc3QgKi8KLQkJaWYgKCh2cS0+ZmxhZyZBTExPQykpIHsKLQkJCS8qIGRlYnVnZ2luZyAqLwotCQkJaWYgKHMgPj0gdnEtPnZhbC5zICYmCi0JCQkgICAgcyA8PSB2cS0+dmFsLnMgKyBzdHJsZW4odnEtPnZhbC5zKSkKLQkJCQlpbnRlcm5hbF9lcnJvcmYoCi0JCQkJICAgICJzZXRzdHI6ICVzPSVzOiBhc3NpZ25pbmcgdG8gc2VsZiIsCi0JCQkJICAgIHZxLT5uYW1lLCBzKTsKLQkJCWFmcmVlKHZxLT52YWwucywgdnEtPmFyZWFwKTsKLQkJfQotCQl2cS0+ZmxhZyAmPSB+KElTU0VUfEFMTE9DKTsKLQkJdnEtPnR5cGUgPSAwOwotCQlpZiAocyAmJiAodnEtPmZsYWcgJiAoVUNBU0VWX0FMfExDQVNFVnxMSlVTVHxSSlVTVCkpKQotCQkJcyA9IHNhbGxvYyA9IGZvcm1hdHN0cih2cSwgcyk7Ci0JCWlmICgodnEtPmZsYWcmRVhQT1JUKSkKLQkJCWV4cG9ydHByZXAodnEsIHMpOwotCQllbHNlIHsKLQkJCXN0cmR1cHgodnEtPnZhbC5zLCBzLCB2cS0+YXJlYXApOwotCQkJdnEtPmZsYWcgfD0gQUxMT0M7Ci0JCX0KLQl9IGVsc2UgewkJLyogaW50ZWdlciBkZXN0ICovCi0JCWlmICghdl9ldmFsdWF0ZSh2cSwgcywgZXJyb3Jfb2ssIHRydWUpKQotCQkJcmV0dXJuICgwKTsKLQl9Ci0JdnEtPmZsYWcgfD0gSVNTRVQ7Ci0JaWYgKCh2cS0+ZmxhZyZTUEVDSUFMKSkKLQkJc2V0c3BlYyh2cSk7Ci0JYWZyZWUoc2FsbG9jLCBBVEVNUCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyogc2V0IHZhcmlhYmxlIHRvIGludGVnZXIgKi8KLXZvaWQKLXNldGludChzdHJ1Y3QgdGJsICp2cSwgbWtzaF9hcmlfdCBuKQotewotCWlmICghKHZxLT5mbGFnJklOVEVHRVIpKSB7Ci0JCXN0cnVjdCB0YmwgKnZwID0gJnZ0ZW1wOwotCQl2cC0+ZmxhZyA9IChJU1NFVHxJTlRFR0VSKTsKLQkJdnAtPnR5cGUgPSAwOwotCQl2cC0+YXJlYXAgPSBBVEVNUDsKLQkJdnAtPnZhbC5pID0gbjsKLQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLwotCQlzZXRzdHIodnEsIHN0cl92YWwodnApLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQl9IGVsc2UKLQkJdnEtPnZhbC5pID0gbjsKLQl2cS0+ZmxhZyB8PSBJU1NFVDsKLQlpZiAoKHZxLT5mbGFnJlNQRUNJQUwpKQotCQlzZXRzcGVjKHZxKTsKLX0KLQotc3RhdGljIGludAotZ2V0aW50KHN0cnVjdCB0YmwgKnZwLCBta3NoX2FyaV90ICpudW1wLCBib29sIGFyaXRoKQotewotCWNoYXIgKnM7Ci0JaW50IGMsIGJhc2UsIG5lZzsKLQlib29sIGhhdmVfYmFzZSA9IGZhbHNlOwotCW1rc2hfYXJpX3QgbnVtOwotCi0JaWYgKHZwLT5mbGFnJlNQRUNJQUwpCi0JCWdldHNwZWModnApOwotCS8qIFhYWCBpcyBpdCBwb3NzaWJsZSBmb3IgSVNTRVQgdG8gYmUgc2V0IGFuZCB2YWwucyB0byBiZSAwPyAqLwotCWlmICghKHZwLT5mbGFnJklTU0VUKSB8fCAoISh2cC0+ZmxhZyZJTlRFR0VSKSAmJiB2cC0+dmFsLnMgPT0gTlVMTCkpCi0JCXJldHVybiAoLTEpOwotCWlmICh2cC0+ZmxhZyZJTlRFR0VSKSB7Ci0JCSpudW1wID0gdnAtPnZhbC5pOwotCQlyZXR1cm4gKHZwLT50eXBlKTsKLQl9Ci0JcyA9IHZwLT52YWwucyArIHZwLT50eXBlOwotCWlmIChzID09IE5VTEwpCS8qIHJlZHVuZGFudCBnaXZlbiBpbml0aWFsIHRlc3QgKi8KLQkJcyA9IG51bGw7Ci0JYmFzZSA9IDEwOwotCW51bSA9IDA7Ci0JbmVnID0gMDsKLQlpZiAoYXJpdGggJiYgKnMgPT0gJzAnICYmICoocysxKSkgewotCQlzKys7Ci0JCWlmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSB7Ci0JCQlzKys7Ci0JCQliYXNlID0gMTY7Ci0JCX0gZWxzZSBpZiAodnAtPmZsYWcgJiBaRVJPRklMKSB7Ci0JCQl3aGlsZSAoKnMgPT0gJzAnKQotCQkJCXMrKzsKLQkJfSBlbHNlCi0JCQliYXNlID0gODsKLQkJaGF2ZV9iYXNlID0gdHJ1ZTsKLQl9Ci0JZm9yIChjID0gKnMrKzsgYyA7IGMgPSAqcysrKSB7Ci0JCWlmIChjID09ICctJykgewotCQkJbmVnKys7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChjID09ICcjJykgewotCQkJYmFzZSA9IChpbnQpbnVtOwotCQkJaWYgKGhhdmVfYmFzZSB8fCBiYXNlIDwgMSB8fCBiYXNlID4gMzYpCi0JCQkJcmV0dXJuICgtMSk7Ci0JCQlpZiAoYmFzZSA9PSAxKSB7Ci0JCQkJdW5zaWduZWQgaW50IHdjOwotCi0JCQkJaWYgKCFVVEZNT0RFKQotCQkJCQl3YyA9ICoodW5zaWduZWQgY2hhciAqKXM7Ci0JCQkJZWxzZSBpZiAodXRmX21idG93Yygmd2MsIHMpID09IChzaXplX3QpLTEpCi0JCQkJCS8qIE9QVFUtOCAtPiBPUFRVLTE2ICovCi0JCQkJCS8qCi0JCQkJCSAqICh3aXRoIGEgdHdpc3Q6IDEjXHVFRjgwIGNvbnZlcnRzCi0JCQkJCSAqIHRoZSBzYW1lIGFzIDEjXHg4MCBkb2VzLCB0aHVzIGlzCi0JCQkJCSAqIG5vdCByb3VuZC10cmlwcGluZyBjb3JyZWN0bHkgWFhYKQotCQkJCQkgKi8KLQkJCQkJd2MgPSAweEVGMDAgKyAqKHVuc2lnbmVkIGNoYXIgKilzOwotCQkJCSpudW1wID0gKG1rc2hfYXJpX3Qpd2M7Ci0JCQkJcmV0dXJuICgxKTsKLQkJCX0KLQkJCW51bSA9IDA7Ci0JCQloYXZlX2Jhc2UgPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpCi0JCQljIC09ICcwJzsKLQkJZWxzZSBpZiAoa3NoX2lzbG93ZXIoYykpCi0JCQljIC09ICdhJyAtIDEwOwotCQllbHNlIGlmIChrc2hfaXN1cHBlcihjKSkKLQkJCWMgLT0gJ0EnIC0gMTA7Ci0JCWVsc2UKLQkJCXJldHVybiAoLTEpOwotCQlpZiAoYyA8IDAgfHwgYyA+PSBiYXNlKQotCQkJcmV0dXJuICgtMSk7Ci0JCW51bSA9IG51bSAqIGJhc2UgKyBjOwotCX0KLQlpZiAobmVnKQotCQludW0gPSAtbnVtOwotCSpudW1wID0gbnVtOwotCXJldHVybiAoYmFzZSk7Ci19Ci0KLS8qIGNvbnZlcnQgdmFyaWFibGUgdnEgdG8gaW50ZWdlciB2YXJpYWJsZSwgc2V0dGluZyBpdHMgdmFsdWUgZnJvbSB2cAotICogKHZxIGFuZCB2cCBtYXkgYmUgdGhlIHNhbWUpCi0gKi8KLXN0cnVjdCB0YmwgKgotc2V0aW50X3Yoc3RydWN0IHRibCAqdnEsIHN0cnVjdCB0YmwgKnZwLCBib29sIGFyaXRoKQotewotCWludCBiYXNlOwotCW1rc2hfYXJpX3QgbnVtOwotCi0JaWYgKChiYXNlID0gZ2V0aW50KHZwLCAmbnVtLCBhcml0aCkpID09IC0xKQotCQlyZXR1cm4gKE5VTEwpOwotCWlmICghKHZxLT5mbGFnICYgSU5URUdFUikgJiYgKHZxLT5mbGFnICYgQUxMT0MpKSB7Ci0JCXZxLT5mbGFnICY9IH5BTExPQzsKLQkJYWZyZWUodnEtPnZhbC5zLCB2cS0+YXJlYXApOwotCX0KLQl2cS0+dmFsLmkgPSBudW07Ci0JaWYgKHZxLT50eXBlID09IDApIC8qIGRlZmF1bHQgYmFzZSAqLwotCQl2cS0+dHlwZSA9IGJhc2U7Ci0JdnEtPmZsYWcgfD0gSVNTRVR8SU5URUdFUjsKLQlpZiAodnEtPmZsYWcmU1BFQ0lBTCkKLQkJc2V0c3BlYyh2cSk7Ci0JcmV0dXJuICh2cSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWZvcm1hdHN0cihzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqcykKLXsKLQlpbnQgb2xlbiwgbmxlbjsKLQljaGFyICpwLCAqcTsKLQlzaXplX3QgcHNpejsKLQotCW9sZW4gPSB1dGZfbWJzd2lkdGgocyk7Ci0KLQlpZiAodnAtPmZsYWcgJiAoUkpVU1R8TEpVU1QpKSB7Ci0JCWlmICghdnAtPnUyLmZpZWxkKQkvKiBkZWZhdWx0IGZpZWxkIHdpZHRoICovCi0JCQl2cC0+dTIuZmllbGQgPSBvbGVuOwotCQlubGVuID0gdnAtPnUyLmZpZWxkOwotCX0gZWxzZQotCQlubGVuID0gb2xlbjsKLQotCXAgPSBhbGxvYygocHNpeiA9IG5sZW4gKiAvKiBNQl9MRU5fTUFYICovIDMgKyAxKSwgQVRFTVApOwotCWlmICh2cC0+ZmxhZyAmIChSSlVTVHxMSlVTVCkpIHsKLQkJaW50IHNsZW4gPSBvbGVuLCBpID0gMDsKLQotCQlpZiAodnAtPmZsYWcgJiBSSlVTVCkgewotCQkJY29uc3QgY2hhciAqcXEgPSBzOwotCQkJaW50IG4gPSAwOwotCi0JCQl3aGlsZSAoaSA8IHNsZW4pCi0JCQkJaSArPSB1dGZfd2lkdGhhZGoocXEsICZxcSk7Ci0JCQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKEFUJlQgdXNlcyBxcVstMV0gPT0gJyAnKSAqLwotCQkJd2hpbGUgKHFxID4gcyAmJiBrc2hfaXNzcGFjZShxcVstMV0pKSB7Ci0JCQkJLS1xcTsKLQkJCQktLXNsZW47Ci0JCQl9Ci0JCQlpZiAodnAtPmZsYWcgJiBaRVJPRklMICYmIHZwLT5mbGFnICYgSU5URUdFUikgewotCQkJCWlmIChzWzFdID09ICcjJykKLQkJCQkJbiA9IDI7Ci0JCQkJZWxzZSBpZiAoc1syXSA9PSAnIycpCi0JCQkJCW4gPSAzOwotCQkJCWlmICh2cC0+dTIuZmllbGQgPD0gbikKLQkJCQkJbiA9IDA7Ci0JCQl9Ci0JCQlpZiAobikgewotCQkJCW1lbWNweShwLCBzLCBuKTsKLQkJCQlzICs9IG47Ci0JCQl9Ci0JCQl3aGlsZSAoc2xlbiA+IHZwLT51Mi5maWVsZCkKLQkJCQlzbGVuIC09IHV0Zl93aWR0aGFkaihzLCAmcyk7Ci0JCQlpZiAodnAtPnUyLmZpZWxkIC0gc2xlbikKLQkJCQltZW1zZXQocCArIG4sICh2cC0+ZmxhZyAmIFpFUk9GSUwpID8gJzAnIDogJyAnLAotCQkJCSAgICB2cC0+dTIuZmllbGQgLSBzbGVuKTsKLQkJCXNsZW4gLT0gbjsKLQkJCXNoZl9zbnByaW50ZihwICsgdnAtPnUyLmZpZWxkIC0gc2xlbiwKLQkJCSAgICBwc2l6IC0gKHZwLT51Mi5maWVsZCAtIHNsZW4pLAotCQkJICAgICIlLipzIiwgc2xlbiwgcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcy96ZXJvcyAqLwotCQkJd2hpbGUgKGtzaF9pc3NwYWNlKCpzKSkKLQkJCQlzKys7Ci0JCQlpZiAodnAtPmZsYWcgJiBaRVJPRklMKQotCQkJCXdoaWxlICgqcyA9PSAnMCcpCi0JCQkJCXMrKzsKLQkJCXNoZl9zbnByaW50ZihwLCBubGVuICsgMSwgIiUtKi4qcyIsCi0JCQkJdnAtPnUyLmZpZWxkLCB2cC0+dTIuZmllbGQsIHMpOwotCQl9Ci0JfSBlbHNlCi0JCW1lbWNweShwLCBzLCBzdHJsZW4ocykgKyAxKTsKLQotCWlmICh2cC0+ZmxhZyAmIFVDQVNFVl9BTCkgewotCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQotCQkJKnEgPSBrc2hfdG91cHBlcigqcSk7Ci0JfSBlbHNlIGlmICh2cC0+ZmxhZyAmIExDQVNFVikgewotCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQotCQkJKnEgPSBrc2hfdG9sb3dlcigqcSk7Ci0JfQotCi0JcmV0dXJuIChwKTsKLX0KLQotLyoKLSAqIG1ha2UgdnAtPnZhbC5zIGJlICJuYW1lPXZhbHVlIiBmb3IgcXVpY2sgZXhwb3J0aW5nLgotICovCi1zdGF0aWMgdm9pZAotZXhwb3J0cHJlcChzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqdmFsKQotewotCWNoYXIgKnhwOwotCWNoYXIgKm9wID0gKHZwLT5mbGFnJkFMTE9DKSA/IHZwLT52YWwucyA6IE5VTEw7Ci0JaW50IG5hbWVsZW4gPSBzdHJsZW4odnAtPm5hbWUpOwotCWludCB2YWxsZW4gPSBzdHJsZW4odmFsKSArIDE7Ci0KLQl2cC0+ZmxhZyB8PSBBTExPQzsKLQl4cCA9IGFsbG9jKG5hbWVsZW4gKyAxICsgdmFsbGVuLCB2cC0+YXJlYXApOwotCW1lbWNweSh2cC0+dmFsLnMgPSB4cCwgdnAtPm5hbWUsIG5hbWVsZW4pOwotCXhwICs9IG5hbWVsZW47Ci0JKnhwKysgPSAnPSc7Ci0JdnAtPnR5cGUgPSB4cCAtIHZwLT52YWwuczsgLyogb2Zmc2V0IHRvIHZhbHVlICovCi0JbWVtY3B5KHhwLCB2YWwsIHZhbGxlbik7Ci0JaWYgKG9wICE9IE5VTEwpCi0JCWFmcmVlKG9wLCB2cC0+YXJlYXApOwotfQotCi0vKgotICogbG9va3VwIHZhcmlhYmxlIChhY2NvcmRpbmcgdG8gKHNldCZMT0NBTCkpLAotICogc2V0IGl0cyBhdHRyaWJ1dGVzIChJTlRFR0VSLCBSRE9OTFksIEVYUE9SVCwgVFJBQ0UsIExKVVNULCBSSlVTVCwgWkVST0ZJTCwKLSAqIExDQVNFViwgVUNBU0VWX0FMKSwgYW5kIG9wdGlvbmFsbHkgc2V0IGl0cyB2YWx1ZSBpZiBhbiBhc3NpZ25tZW50LgotICovCi1zdHJ1Y3QgdGJsICoKLXR5cGVzZXQoY29uc3QgY2hhciAqdmFyLCBUZmxhZyBzZXQsIFRmbGFnIGNsciwgaW50IGZpZWxkLCBpbnQgYmFzZSkKLXsKLQlzdHJ1Y3QgdGJsICp2cDsKLQlzdHJ1Y3QgdGJsICp2cGJhc2UsICp0OwotCWNoYXIgKnR2YXI7Ci0JY29uc3QgY2hhciAqdmFsOwotCWludCBsZW47Ci0KLQkvKiBjaGVjayBmb3IgdmFsaWQgdmFyaWFibGUgbmFtZSwgc2VhcmNoIGZvciB2YWx1ZSAqLwotCXZhbCA9IHNraXBfdmFybmFtZSh2YXIsIGZhbHNlKTsKLQlpZiAodmFsID09IHZhcikKLQkJcmV0dXJuIChOVUxMKTsKLQlta3NzZXJ0KHZhciAhPSBOVUxMKTsKLQlta3NzZXJ0KCp2YXIgIT0gMCk7Ci0JaWYgKCp2YWwgPT0gJ1snKSB7Ci0JCWlmIChzZXRfcmVmZmxhZykKLQkJCWVycm9yZigiJXM6IHJlZmVyZW5jZSB2YXJpYWJsZSBjYW5ub3QgYmUgYW4gYXJyYXkiLAotCQkJICAgIHZhcik7Ci0JCWxlbiA9IGFycmF5X3JlZl9sZW4odmFsKTsKLQkJaWYgKGxlbiA9PSAwKQotCQkJcmV0dXJuIChOVUxMKTsKLQkJLyogSU1QT1JUIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzaGVsbCBzdGFydHMgdXAgYW5kIGlzCi0JCSAqIHNldHRpbmcgdXAgaXRzIGVudmlyb25tZW50LiBBbGxvdyBvbmx5IHNpbXBsZSBhcnJheQotCQkgKiByZWZlcmVuY2VzIGF0IHRoaXMgdGltZSBzaW5jZSBwYXJhbWV0ZXIvY29tbWFuZCBzdWJzdGl0dXRpb24KLQkJICogaXMgcHJlZm9ybWVkIG9uIHRoZSBbZXhwcmVzc2lvbl0gd2hpY2ggd291bGQgYmUgYSBtYWpvcgotCQkgKiBzZWN1cml0eSBob2xlLgotCQkgKi8KLQkJaWYgKHNldCAmIElNUE9SVCkgewotCQkJaW50IGk7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgbGVuIC0gMTsgaSsrKQotCQkJCWlmICgha3NoX2lzZGlnaXQodmFsW2ldKSkKLQkJCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCQl2YWwgKz0gbGVuOwotCX0KLQlpZiAoKnZhbCA9PSAnPScpCi0JCXN0cm5kdXB4KHR2YXIsIHZhciwgdmFsKysgLSB2YXIsIEFURU1QKTsKLQllbHNlIHsKLQkJLyogSW1wb3J0aW5nIGZyb20gb3JpZ2luYWwgZW52aXJvbm1lbnQ6IG11c3QgaGF2ZSBhbiA9ICovCi0JCWlmIChzZXQgJiBJTVBPUlQpCi0JCQlyZXR1cm4gKE5VTEwpOwotCQlzdHJkdXB4KHR2YXIsIHZhciwgQVRFTVApOwotCQl2YWwgPSBOVUxMOwotCQkvKiBoYW5kbGUgZm9vWypdIOKHkiBmb28gKHdob2xlIGFycmF5KSBtYXBwaW5nIGZvciBSMzliICovCi0JCWxlbiA9IHN0cmxlbih0dmFyKTsKLQkJaWYgKGxlbiA+IDMgJiYgdHZhcltsZW4tM10gPT0gJ1snICYmIHR2YXJbbGVuLTJdID09ICcqJyAmJgotCQkgICAgdHZhcltsZW4tMV0gPT0gJ10nKQotCQkJdHZhcltsZW4tM10gPSAnXDAnOwotCX0KLQotCS8qIFByZXZlbnQgdHlwZXNldCBmcm9tIGNyZWF0aW5nIGEgbG9jYWwgUEFUSC9FTlYvU0hFTEwgKi8KLQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgKHN0cmNtcCh0dmFyLCAiUEFUSCIpID09IDAgfHwKLQkgICAgc3RyY21wKHR2YXIsICJFTlYiKSA9PSAwIHx8IHN0cmNtcCh0dmFyLCAiU0hFTEwiKSA9PSAwKSkKLQkJZXJyb3JmKCIlczogcmVzdHJpY3RlZCIsIHR2YXIpOwotCi0JdnAgPSAoc2V0JkxPQ0FMKSA/IGxvY2FsKHR2YXIsIChzZXQgJiBMT0NBTF9DT1BZKSA/IHRydWUgOiBmYWxzZSkgOgotCSAgICBnbG9iYWwodHZhcik7Ci0JaWYgKHNldF9yZWZmbGFnID09IDIgJiYgKHZwLT5mbGFnICYgKEFSUkFZfEFTU09DKSkgPT0gQVNTT0MpCi0JCXZwLT5mbGFnICY9IH5BU1NPQzsKLQllbHNlIGlmIChzZXRfcmVmZmxhZyA9PSAxKSB7Ci0JCWlmICh2cC0+ZmxhZyAmIEFSUkFZKSB7Ci0JCQlzdHJ1Y3QgdGJsICphLCAqdG1wOwotCi0JCQkvKiBGcmVlIHVwIGVudGlyZSBhcnJheSAqLwotCQkJZm9yIChhID0gdnAtPnUuYXJyYXk7IGE7ICkgewotCQkJCXRtcCA9IGE7Ci0JCQkJYSA9IGEtPnUuYXJyYXk7Ci0JCQkJaWYgKHRtcC0+ZmxhZyAmIEFMTE9DKQotCQkJCQlhZnJlZSh0bXAtPnZhbC5zLCB0bXAtPmFyZWFwKTsKLQkJCQlhZnJlZSh0bXAsIHRtcC0+YXJlYXApOwotCQkJfQotCQkJdnAtPnUuYXJyYXkgPSBOVUxMOwotCQkJdnAtPmZsYWcgJj0gfkFSUkFZOwotCQl9Ci0JCXZwLT5mbGFnIHw9IEFTU09DOwotCX0KLQotCXNldCAmPSB+KExPQ0FMfExPQ0FMX0NPUFkpOwotCi0JdnBiYXNlID0gKHZwLT5mbGFnICYgQVJSQVkpID8gZ2xvYmFsKGFycmF5bmFtZSh2YXIpKSA6IHZwOwotCi0JLyogb25seSBhbGxvdyBleHBvcnQgZmxhZyB0byBiZSBzZXQuIEFUJlQga3NoIGFsbG93cyBhbnkgYXR0cmlidXRlIHRvCi0JICogYmUgY2hhbmdlZCB3aGljaCBtZWFucyBpdCBjYW4gYmUgdHJ1bmNhdGVkIG9yIG1vZGlmaWVkICgtTC8tUi8tWi8taSkKLQkgKi8KLQlpZiAoKHZwYmFzZS0+ZmxhZyZSRE9OTFkpICYmCi0JICAgICh2YWwgfHwgY2xyIHx8IChzZXQgJiB+RVhQT1JUKSkpCi0JCS8qIFhYWCBjaGVjayBjYWxscyAtIGlzIGVycm9yIGhlcmUgb2sgYnkgUE9TSVg/ICovCi0JCWVycm9yZigiJXM6IGlzIHJlYWQgb25seSIsIHR2YXIpOwotCWFmcmVlKHR2YXIsIEFURU1QKTsKLQotCS8qIG1vc3QgY2FsbHMgYXJlIHdpdGggc2V0L2NsciA9PSAwICovCi0JaWYgKHNldCB8IGNscikgewotCQlib29sIG9rID0gdHJ1ZTsKLQotCQkvKiBYWFggaWYgeFswXSBpc24ndCBzZXQsIHRoZXJlIHdpbGwgYmUgcHJvYmxlbXM6IG5lZWQgdG8gaGF2ZQotCQkgKiBvbmUgY29weSBvZiBhdHRyaWJ1dGVzIGZvciBhcnJheXMuLi4KLQkJICovCi0JCWZvciAodCA9IHZwYmFzZTsgdDsgdCA9IHQtPnUuYXJyYXkpIHsKLQkJCWJvb2wgZmFrZV9hc3NpZ247Ci0JCQljaGFyICpzID0gTlVMTDsKLQkJCWNoYXIgKmZyZWVfbWUgPSBOVUxMOwotCi0JCQlmYWtlX2Fzc2lnbiA9ICh0LT5mbGFnICYgSVNTRVQpICYmICghdmFsIHx8IHQgIT0gdnApICYmCi0JCQkgICAgKChzZXQgJiAoVUNBU0VWX0FMfExDQVNFVnxMSlVTVHxSSlVTVHxaRVJPRklMKSkgfHwKLQkJCSAgICAoKHQtPmZsYWcgJiBJTlRFR0VSKSAmJiAoY2xyICYgSU5URUdFUikpIHx8Ci0JCQkgICAgKCEodC0+ZmxhZyAmIElOVEVHRVIpICYmIChzZXQgJiBJTlRFR0VSKSkpOwotCQkJaWYgKGZha2VfYXNzaWduKSB7Ci0JCQkJaWYgKHQtPmZsYWcgJiBJTlRFR0VSKSB7Ci0JCQkJCXMgPSBzdHJfdmFsKHQpOwotCQkJCQlmcmVlX21lID0gTlVMTDsKLQkJCQl9IGVsc2UgewotCQkJCQlzID0gdC0+dmFsLnMgKyB0LT50eXBlOwotCQkJCQlmcmVlX21lID0gKHQtPmZsYWcgJiBBTExPQykgPyB0LT52YWwucyA6Ci0JCQkJCSAgICBOVUxMOwotCQkJCX0KLQkJCQl0LT5mbGFnICY9IH5BTExPQzsKLQkJCX0KLQkJCWlmICghKHQtPmZsYWcgJiBJTlRFR0VSKSAmJiAoc2V0ICYgSU5URUdFUikpIHsKLQkJCQl0LT50eXBlID0gMDsKLQkJCQl0LT5mbGFnICY9IH5BTExPQzsKLQkJCX0KLQkJCXQtPmZsYWcgPSAodC0+ZmxhZyB8IHNldCkgJiB+Y2xyOwotCQkJLyogRG9uJ3QgY2hhbmdlIGJhc2UgaWYgYXNzaWdubWVudCBpcyB0byBiZSBkb25lLAotCQkJICogaW4gY2FzZSBhc3NpZ25tZW50IGZhaWxzLgotCQkJICovCi0JCQlpZiAoKHNldCAmIElOVEVHRVIpICYmIGJhc2UgPiAwICYmICghdmFsIHx8IHQgIT0gdnApKQotCQkJCXQtPnR5cGUgPSBiYXNlOwotCQkJaWYgKHNldCAmIChMSlVTVHxSSlVTVHxaRVJPRklMKSkKLQkJCQl0LT51Mi5maWVsZCA9IGZpZWxkOwotCQkJaWYgKGZha2VfYXNzaWduKSB7Ci0JCQkJaWYgKCFzZXRzdHIodCwgcywgS1NIX1JFVFVSTl9FUlJPUikpIHsKLQkJCQkJLyogU29tZXdoYXQgYXJiaXRyYXJ5IGFjdGlvbiBoZXJlOgotCQkJCQkgKiB6YXAgY29udGVudHMgb2YgdmFyaWFibGUsIGJ1dCBrZWVwCi0JCQkJCSAqIHRoZSBmbGFnIHNldHRpbmdzLgotCQkJCQkgKi8KLQkJCQkJb2sgPSBmYWxzZTsKLQkJCQkJaWYgKHQtPmZsYWcgJiBJTlRFR0VSKQotCQkJCQkJdC0+ZmxhZyAmPSB+SVNTRVQ7Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHQtPmZsYWcgJiBBTExPQykKLQkJCQkJCQlhZnJlZSh0LT52YWwucywgdC0+YXJlYXApOwotCQkJCQkJdC0+ZmxhZyAmPSB+KElTU0VUfEFMTE9DKTsKLQkJCQkJCXQtPnR5cGUgPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmcmVlX21lKQotCQkJCQlhZnJlZShmcmVlX21lLCB0LT5hcmVhcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFvaykKLQkJCWVycm9yZnooKTsKLQl9Ci0KLQlpZiAodmFsICE9IE5VTEwpIHsKLQkJaWYgKHZwLT5mbGFnJklOVEVHRVIpIHsKLQkJCS8qIGRvIG5vdCB6ZXJvIGJhc2UgYmVmb3JlIGFzc2lnbm1lbnQgKi8KLQkJCXNldHN0cih2cCwgdmFsLCBLU0hfVU5XSU5EX0VSUk9SIHwgMHg0KTsKLQkJCS8qIERvbmUgYWZ0ZXIgYXNzaWdubWVudCB0byBvdmVycmlkZSBkZWZhdWx0ICovCi0JCQlpZiAoYmFzZSA+IDApCi0JCQkJdnAtPnR5cGUgPSBiYXNlOwotCQl9IGVsc2UKLQkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIChyZWFkb25seSBjaGVjayBhbHJlYWR5IGRvbmUpICovCi0JCQlzZXRzdHIodnAsIHZhbCwgS1NIX1JFVFVSTl9FUlJPUiB8IDB4NCk7Ci0JfQotCi0JLyogb25seSB4WzBdIGlzIGV2ZXIgZXhwb3J0ZWQsIHNvIHVzZSB2cGJhc2UgKi8KLQlpZiAoKHZwYmFzZS0+ZmxhZyZFWFBPUlQpICYmICEodnBiYXNlLT5mbGFnJklOVEVHRVIpICYmCi0JICAgIHZwYmFzZS0+dHlwZSA9PSAwKQotCQlleHBvcnRwcmVwKHZwYmFzZSwgKHZwYmFzZS0+ZmxhZyZJU1NFVCkgPyB2cGJhc2UtPnZhbC5zIDogbnVsbCk7Ci0KLQlyZXR1cm4gKHZwKTsKLX0KLQotLyoqCi0gKiBVbnNldCBhIHZhcmlhYmxlLiBUaGUgZmxhZ3MgY2FuIGJlOgotICogfDEJPSB0ZWFyIGRvd24gZW50aXJlIGFycmF5Ci0gKiB8Mgk9IGtlZXAgYXR0cmlidXRlcywgb25seSB1bnNldCBjb250ZW50Ci0gKi8KLXZvaWQKLXVuc2V0KHN0cnVjdCB0YmwgKnZwLCBpbnQgZmxhZ3MpCi17Ci0JaWYgKHZwLT5mbGFnICYgQUxMT0MpCi0JCWFmcmVlKHZwLT52YWwucywgdnAtPmFyZWFwKTsKLQlpZiAoKHZwLT5mbGFnICYgQVJSQVkpICYmIChmbGFncyAmIDEpKSB7Ci0JCXN0cnVjdCB0YmwgKmEsICp0bXA7Ci0KLQkJLyogRnJlZSB1cCBlbnRpcmUgYXJyYXkgKi8KLQkJZm9yIChhID0gdnAtPnUuYXJyYXk7IGE7ICkgewotCQkJdG1wID0gYTsKLQkJCWEgPSBhLT51LmFycmF5OwotCQkJaWYgKHRtcC0+ZmxhZyAmIEFMTE9DKQotCQkJCWFmcmVlKHRtcC0+dmFsLnMsIHRtcC0+YXJlYXApOwotCQkJYWZyZWUodG1wLCB0bXAtPmFyZWFwKTsKLQkJfQotCQl2cC0+dS5hcnJheSA9IE5VTEw7Ci0JfQotCWlmIChmbGFncyAmIDIpIHsKLQkJdnAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7Ci0JCXJldHVybjsKLQl9Ci0JLyogSWYgZm9vWzBdIGlzIGJlaW5nIHVuc2V0LCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcnJheSBpcyBrZXB0Li4uICovCi0JdnAtPmZsYWcgJj0gU1BFQ0lBTCB8ICgoZmxhZ3MgJiAxKSA/IDAgOiBBUlJBWXxERUZJTkVEKTsKLQlpZiAodnAtPmZsYWcgJiBTUEVDSUFMKQotCQl1bnNldHNwZWModnApOwkvKiByZXNwb25zaWJsZSBmb3IgJ3Vuc3BlY2lhbCdpbmcgdmFyICovCi19Ci0KLS8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIgcGFzdCBhIGxlZ2FsIHZhcmlhYmxlIG5hbWUgKHJldHVybnMgdGhlCi0gKiBhcmd1bWVudCBpZiB0aGVyZSBpcyBubyBsZWdhbCBuYW1lLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGVybWluYXRpbmcKLSAqIE5VTCBpZiB3aG9sZSBzdHJpbmcgaXMgbGVnYWwpLgotICovCi1jb25zdCBjaGFyICoKLXNraXBfdmFybmFtZShjb25zdCBjaGFyICpzLCBpbnQgYW9rKQotewotCWludCBhbGVuOwotCi0JaWYgKHMgJiYga3NoX2lzYWxwaHgoKnMpKSB7Ci0JCXdoaWxlICgqKytzICYmIGtzaF9pc2FsbnV4KCpzKSkKLQkJCTsKLQkJaWYgKGFvayAmJiAqcyA9PSAnWycgJiYgKGFsZW4gPSBhcnJheV9yZWZfbGVuKHMpKSkKLQkJCXMgKz0gYWxlbjsKLQl9Ci0JcmV0dXJuIChzKTsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIHBhc3QgYW55IGxlZ2FsIHZhcmlhYmxlIG5hbWUgKi8KLWNvbnN0IGNoYXIgKgotc2tpcF93ZHZhcm5hbWUoY29uc3QgY2hhciAqcywKLSAgICBpbnQgYW9rKQkJCQkvKiBza2lwIGFycmF5IGRlLXJlZmVyZW5jZT8gKi8KLXsKLQlpZiAoc1swXSA9PSBDSEFSICYmIGtzaF9pc2FscGh4KHNbMV0pKSB7Ci0JCWRvIHsKLQkJCXMgKz0gMjsKLQkJfSB3aGlsZSAoc1swXSA9PSBDSEFSICYmIGtzaF9pc2FsbnV4KHNbMV0pKTsKLQkJaWYgKGFvayAmJiBzWzBdID09IENIQVIgJiYgc1sxXSA9PSAnWycpIHsKLQkJCS8qIHNraXAgcG9zc2libGUgYXJyYXkgZGUtcmVmZXJlbmNlICovCi0JCQljb25zdCBjaGFyICpwID0gczsKLQkJCWNoYXIgYzsKLQkJCWludCBkZXB0aCA9IDA7Ci0KLQkJCXdoaWxlICgxKSB7Ci0JCQkJaWYgKHBbMF0gIT0gQ0hBUikKLQkJCQkJYnJlYWs7Ci0JCQkJYyA9IHBbMV07Ci0JCQkJcCArPSAyOwotCQkJCWlmIChjID09ICdbJykKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlIGlmIChjID09ICddJyAmJiAtLWRlcHRoID09IDApIHsKLQkJCQkJcyA9IHA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gKHMpOwotfQotCi0vKiBDaGVjayBpZiBjb2RlZCBzdHJpbmcgcyBpcyBhIHZhcmlhYmxlIG5hbWUgKi8KLWludAotaXNfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKnMsIGludCBhb2spCi17Ci0JY29uc3QgY2hhciAqcCA9IHNraXBfd2R2YXJuYW1lKHMsIGFvayk7Ci0KLQlyZXR1cm4gKHAgIT0gcyAmJiBwWzBdID09IEVPUyk7Ci19Ci0KLS8qIENoZWNrIGlmIGNvZGVkIHN0cmluZyBzIGlzIGEgdmFyaWFibGUgYXNzaWdubWVudCAqLwotaW50Ci1pc193ZHZhcmFzc2lnbihjb25zdCBjaGFyICpzKQotewotCWNvbnN0IGNoYXIgKnAgPSBza2lwX3dkdmFybmFtZShzLCB0cnVlKTsKLQotCXJldHVybiAocCAhPSBzICYmIHBbMF0gPT0gQ0hBUiAmJiBwWzFdID09ICc9Jyk7Ci19Ci0KLS8qCi0gKiBNYWtlIHRoZSBleHBvcnRlZCBlbnZpcm9ubWVudCBmcm9tIHRoZSBleHBvcnRlZCBuYW1lcyBpbiB0aGUgZGljdGlvbmFyeS4KLSAqLwotY2hhciAqKgotbWFrZW52KHZvaWQpCi17Ci0Jc3RydWN0IGJsb2NrICpsOwotCVhQdHJWIGRlbnY7Ci0Jc3RydWN0IHRibCAqdnAsICoqdnBwOwotCWludCBpOwotCi0JWFBpbml0KGRlbnYsIDY0KTsKLQlmb3IgKGwgPSBlLT5sb2M7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JCWZvciAodnBwID0gbC0+dmFycy50YmxzLCBpID0gbC0+dmFycy5zaXplOyAtLWkgPj0gMDsgKQotCQkJaWYgKCh2cCA9ICp2cHArKykgIT0gTlVMTCAmJgotCQkJICAgICh2cC0+ZmxhZyYoSVNTRVR8RVhQT1JUKSkgPT0gKElTU0VUfEVYUE9SVCkpIHsKLQkJCQlzdHJ1Y3QgYmxvY2sgKmwyOwotCQkJCXN0cnVjdCB0YmwgKnZwMjsKLQkJCQl1aW50MzJfdCBoID0gaGFzaCh2cC0+bmFtZSk7Ci0KLQkJCQkvKiB1bmV4cG9ydCBhbnkgcmVkZWZpbmVkIGluc3RhbmNlcyAqLwotCQkJCWZvciAobDIgPSBsLT5uZXh0OyBsMiAhPSBOVUxMOyBsMiA9IGwyLT5uZXh0KSB7Ci0JCQkJCXZwMiA9IGt0c2VhcmNoKCZsMi0+dmFycywgdnAtPm5hbWUsIGgpOwotCQkJCQlpZiAodnAyICE9IE5VTEwpCi0JCQkJCQl2cDItPmZsYWcgJj0gfkVYUE9SVDsKLQkJCQl9Ci0JCQkJaWYgKCh2cC0+ZmxhZyZJTlRFR0VSKSkgewotCQkJCQkvKiBpbnRlZ2VyIHRvIHN0cmluZyAqLwotCQkJCQljaGFyICp2YWw7Ci0JCQkJCXZhbCA9IHN0cl92YWwodnApOwotCQkJCQl2cC0+ZmxhZyAmPSB+KElOVEVHRVJ8UkRPTkxZfFNQRUNJQUwpOwotCQkJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCi0JCQkJCXNldHN0cih2cCwgdmFsLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQkJCQl9Ci0JCQkJWFBwdXQoZGVudiwgdnAtPnZhbC5zKTsKLQkJCX0KLQlYUHB1dChkZW52LCBOVUxMKTsKLQlyZXR1cm4gKChjaGFyICoqKVhQY2xvc2UoZGVudikpOwotfQotCi0vKiBCb2IgSmVua2lucycgb25lLWF0LWEtdGltZSBoYXNoICovCi1zdGF0aWMgdWludDMyX3QKLW9hYXRoYXNoX3VwZGF0ZShyZWdpc3RlciB1aW50MzJfdCBoLCByZWdpc3RlciBjb25zdCB1aW50OF90ICpjcCwKLSAgICByZWdpc3RlciBzaXplX3QgbikKLXsKLQl3aGlsZSAobi0tKSB7Ci0JCWggKz0gKmNwKys7Ci0JCWggKz0gaCA8PCAxMDsKLQkJaCBePSBoID4+IDY7Ci0JfQotCi0JcmV0dXJuIChoKTsKLX0KLQotc3RhdGljIHVpbnQzMl90Ci1vYWF0aGFzaF9maW5hbGlzZShyZWdpc3RlciB1aW50MzJfdCBoKQotewotCWggKz0gaCA8PCAzOwotCWggXj0gaCA+PiAxMTsKLQloICs9IGggPDwgMTU7Ci0KLQlyZXR1cm4gKGgpOwotfQotCi11aW50MzJfdAotb2FhdGhhc2hfZnVsbChyZWdpc3RlciBjb25zdCB1aW50OF90ICpicCkKLXsKLQlyZWdpc3RlciB1aW50MzJfdCBoID0gMDsKLQlyZWdpc3RlciB1aW50OF90IGM7Ci0KLQl3aGlsZSAoKGMgPSAqYnArKykpIHsKLQkJaCArPSBjOwotCQloICs9IGggPDwgMTA7Ci0JCWggXj0gaCA+PiA2OwotCX0KLQotCXJldHVybiAob2FhdGhhc2hfZmluYWxpc2UoaCkpOwotfQotCi12b2lkCi1jaGFuZ2VfcmFuZG9tKGNvbnN0IHZvaWQgKnZwLCBzaXplX3QgbikKLXsKLQlyZWdpc3RlciB1aW50MzJfdCBoID0gMHgxMDA7Ci0jaWYgZGVmaW5lZChfX09wZW5CU0RfXykKLQlpbnQgbWliWzJdOwotCXVpbnQ4X3Qga1szXTsKLQlzaXplX3Qga2xlbjsKLSNlbmRpZgotCi0Ja3Noc3RhdGVfdi5jcl9kcCA9IHZwOwotCWtzaHN0YXRlX3YuY3JfZHN6ID0gbjsKLQlnZXR0aW1lb2ZkYXkoJmtzaHN0YXRlX3YuY3JfdHYsIE5VTEwpOwotCWggPSBvYWF0aGFzaF91cGRhdGUob2FhdGhhc2hfdXBkYXRlKGgsICh2b2lkICopJmtzaHN0YXRlX3YsCi0JICAgIHNpemVvZihrc2hzdGF0ZV92KSksIHZwLCBuKTsKLQlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSBvYWF0aGFzaF9maW5hbGlzZShoKTsKLQotI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCi0JLyogT3BlbkJTRCwgTWlyQlNEOiBwcm9wZXIga2VybmVsIGVudHJvcHkgY29tZXMgYXQgemVybyBjb3N0ICovCi0KLQltaWJbMF0gPSBDVExfS0VSTjsKLQltaWJbMV0gPSBLRVJOX0FSTkQ7Ci0Ja2xlbiA9IHNpemVvZihrKTsKLQlzeXNjdGwobWliLCAyLCBrLCAma2xlbiwgJmtzaHN0YXRlX3YubGNnX3N0YXRlXywKLQkgICAgc2l6ZW9mKGtzaHN0YXRlX3YubGNnX3N0YXRlXykpOwotCS8qIHdlIGlnbm9yZSBmYWlsdXJlcyBhbmQgdGFrZSBpbiBrIGFueXdheSAqLwotCWggPSBvYWF0aGFzaF91cGRhdGUoaCwgaywgc2l6ZW9mKGspKTsKLQlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSBvYWF0aGFzaF9maW5hbGlzZShoKTsKLSNlbGlmIGRlZmluZWQoTUtTSF9BNFBCKQotCS8qIGZvcmNlZCBieSB0aGUgdXNlciB0byB1c2UgYXJjNHJhbmRvbV9wdXNoYigzKSDigKIgQ3lnd2luPyAqLwotCXsKLQkJdWludDMyX3QgcHJ2OwotCi0JCXBydiA9IGFyYzRyYW5kb21fcHVzaGIoJmtzaHN0YXRlX3YubGNnX3N0YXRlXywKLQkJICAgIHNpemVvZihrc2hzdGF0ZV92LmxjZ19zdGF0ZV8pKTsKLQkJaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCAmcHJ2LCBzaXplb2YocHJ2KSk7Ci0JfQotCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBoYW5kbGUgc3BlY2lhbCB2YXJpYWJsZXMgd2l0aCBzaWRlIGVmZmVjdHMgLSBQQVRILCBTRUNPTkRTLgotICovCi0KLS8qIFRlc3QgaWYgbmFtZSBpcyBhIHNwZWNpYWwgcGFyYW1ldGVyICovCi1zdGF0aWMgaW50Ci1zcGVjaWFsKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRibCAqdHA7Ci0KLQl0cCA9IGt0c2VhcmNoKCZzcGVjaWFscywgbmFtZSwgaGFzaChuYW1lKSk7Ci0JcmV0dXJuICh0cCAmJiAodHAtPmZsYWcgJiBJU1NFVCkgPyB0cC0+dHlwZSA6IFZfTk9ORSk7Ci19Ci0KLS8qIE1ha2UgYSB2YXJpYWJsZSBub24tc3BlY2lhbCAqLwotc3RhdGljIHZvaWQKLXVuc3BlY2lhbChjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCB0YmwgKnRwOwotCi0JdHAgPSBrdHNlYXJjaCgmc3BlY2lhbHMsIG5hbWUsIGhhc2gobmFtZSkpOwotCWlmICh0cCkKLQkJa3RkZWxldGUodHApOwotfQotCi1zdGF0aWMgdGltZV90IHNlY29uZHM7CQkvKiB0aW1lIFNFQ09ORFMgbGFzdCBzZXQgKi8KLXN0YXRpYyBpbnQgdXNlcl9saW5lbm87CQkvKiB3aGF0IHVzZXIgc2V0ICRMSU5FTk8gdG8gKi8KLQotc3RhdGljIHZvaWQKLWdldHNwZWMoc3RydWN0IHRibCAqdnApCi17Ci0JcmVnaXN0ZXIgbWtzaF9hcmlfdCBpOwotCWludCBzdDsKLQotCXN3aXRjaCAoKHN0ID0gc3BlY2lhbCh2cC0+bmFtZSkpKSB7Ci0JY2FzZSBWX1NFQ09ORFM6Ci0JCS8qCi0JCSAqIE9uIHN0YXJ0IHVwIHRoZSB2YWx1ZSBvZiBTRUNPTkRTIGlzIHVzZWQgYmVmb3JlCi0JCSAqIGl0IGhhcyBiZWVuIHNldCAtIGRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZQotCQkgKiAoc2VlIGluaXRjb21zW10gaW4gbWFpbi5jKS4KLQkJICovCi0JCWlmICh2cC0+ZmxhZyAmIElTU0VUKSB7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0JCQlpID0gdHYudHZfc2VjIC0gc2Vjb25kczsKLQkJfSBlbHNlCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCWNhc2UgVl9SQU5ET006Ci0JCS8qCi0JCSAqIHRoaXMgaXMgdGhlIHNhbWUgTGluZWFyIENvbmdydWVudGlhbCBQUk5HIGFzIEJvcmxhbmQKLQkJICogQy9DKysgYWxsZWdlZGx5IHVzZXMgaW4gaXRzIGJ1aWx0LWluIHJhbmQoKSBmdW5jdGlvbgotCQkgKi8KLQkJaSA9ICgoa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0KLQkJICAgIDIyNjk1NDc3ICoga3Noc3RhdGVfdi5sY2dfc3RhdGVfICsgMSkgPj4gMTYpICYgMHg3RkZGOwotCQlicmVhazsKLQljYXNlIFZfSElTVFNJWkU6Ci0JCWkgPSBoaXN0c2l6ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWX09QVElORDoKLQkJaSA9IHVzZXJfb3B0LnVvcHRpbmQ7Ci0JCWJyZWFrOwotCWNhc2UgVl9MSU5FTk86Ci0JCWkgPSBjdXJyZW50X2xpbmVubyArIHVzZXJfbGluZW5vOwotCQlicmVhazsKLQljYXNlIFZfQ09MVU1OUzoKLQljYXNlIFZfTElORVM6Ci0JCS8qCi0JCSAqIERvIE5PVCBleHBvcnQgQ09MVU1OUy9MSU5FUy4gTWFueSBhcHBsaWNhdGlvbnMKLQkJICogY2hlY2sgQ09MVU1OUy9MSU5FUyBiZWZvcmUgY2hlY2tpbmcgd3Mud3NfY29sL3JvdywKLQkJICogc28gaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggQy9MIGluIHRoZSBlbnZpcm9uCi0JCSAqIGFuZCB0aGUgd2luZG93IGlzIHRoZW4gcmVzaXplZCwgdGhlIGFwcCB3b24ndAotCQkgKiBzZWUgdGhlIGNoYW5nZSBjYXVzZSB0aGUgZW52aXJvbiBkb2Vzbid0IGNoYW5nZS4KLQkJICovCi0JCWNoYW5nZV93aW5zeigpOwotCQlpID0gc3QgPT0gVl9DT0xVTU5TID8geF9jb2xzIDogeF9saW5zOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nLCBkbyBub3QgdG91Y2ggdnAgYXQgYWxsICovCi0JCXJldHVybjsKLQl9Ci0JdnAtPmZsYWcgJj0gflNQRUNJQUw7Ci0Jc2V0aW50KHZwLCBpKTsKLQl2cC0+ZmxhZyB8PSBTUEVDSUFMOwotfQotCi1zdGF0aWMgdm9pZAotc2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKLXsKLQlta3NoX2FyaV90IGk7Ci0JY2hhciAqczsKLQlpbnQgc3Q7Ci0KLQlzd2l0Y2ggKChzdCA9IHNwZWNpYWwodnAtPm5hbWUpKSkgewotCWNhc2UgVl9QQVRIOgotCQlpZiAocGF0aCkKLQkJCWFmcmVlKHBhdGgsIEFQRVJNKTsKLQkJcyA9IHN0cl92YWwodnApOwotCQlzdHJkdXB4KHBhdGgsIHMsIEFQRVJNKTsKLQkJZmx1c2hjb20oMSk7CS8qIGNsZWFyIHRyYWNrZWQgYWxpYXNlcyAqLwotCQlyZXR1cm47Ci0JY2FzZSBWX0lGUzoKLQkJc2V0Y3R5cGVzKHMgPSBzdHJfdmFsKHZwKSwgQ19JRlMpOwotCQlpZnMwID0gKnM7Ci0JCXJldHVybjsKLQljYXNlIFZfVE1QRElSOgotCQlpZiAodG1wZGlyKSB7Ci0JCQlhZnJlZSh0bXBkaXIsIEFQRVJNKTsKLQkJCXRtcGRpciA9IE5VTEw7Ci0JCX0KLQkJLyogVXNlIHRtcGRpciBpZmYgaXQgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXMgd3JpdGFibGUgYW5kCi0JCSAqIHNlYXJjaGFibGUgYW5kIGlzIGEgZGlyZWN0b3J5Li4uCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQotCQkJcyA9IHN0cl92YWwodnApOwotCQkJaWYgKHNbMF0gPT0gJy8nICYmIGFjY2VzcyhzLCBXX09LfFhfT0spID09IDAgJiYKLQkJCSAgICBzdGF0KHMsICZzdGF0YikgPT0gMCAmJiBTX0lTRElSKHN0YXRiLnN0X21vZGUpKQotCQkJCXN0cmR1cHgodG1wZGlyLCBzLCBBUEVSTSk7Ci0JCX0KLQkJYnJlYWs7Ci0jaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKLQljYXNlIFZfSElTVEZJTEU6Ci0JCXNldGhpc3RmaWxlKHN0cl92YWwodnApKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIFZfVE1PVVQ6Ci0JCS8qIEFUJlQga3NoIHNlZW1zIHRvIGRvIHRoaXMgKG9ubHkgbGlzdGVuIGlmIGludGVnZXIpICovCi0JCWlmICh2cC0+ZmxhZyAmIElOVEVHRVIpCi0JCQlrc2hfdG1vdXQgPSB2cC0+dmFsLmkgPj0gMCA/IHZwLT52YWwuaSA6IDA7Ci0JCWJyZWFrOwotCi0JLyogY29tbW9uIHN1Yi1jYXNlcyAqLwotCWNhc2UgVl9PUFRJTkQ6Ci0JY2FzZSBWX0hJU1RTSVpFOgotCWNhc2UgVl9DT0xVTU5TOgotCWNhc2UgVl9MSU5FUzoKLQljYXNlIFZfUkFORE9NOgotCWNhc2UgVl9TRUNPTkRTOgotCWNhc2UgVl9MSU5FTk86Ci0JCXZwLT5mbGFnICY9IH5TUEVDSUFMOwotCQlpID0gaW50dmFsKHZwKTsKLQkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogZG8gbm90aGluZywgZG8gbm90IHRvdWNoIHZwIGF0IGFsbCAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogcHJvY2VzcyB0aGUgc2luZ3VsYXIgcGFydHMgb2YgdGhlIGNvbW1vbiBjYXNlcyAqLwotCi0Jc3dpdGNoIChzdCkgewotCWNhc2UgVl9PUFRJTkQ6Ci0JCWdldG9wdHNfcmVzZXQoKGludClpKTsKLQkJYnJlYWs7Ci0JY2FzZSBWX0hJU1RTSVpFOgotCQlzZXRoaXN0c2l6ZSgoaW50KWkpOwotCQlicmVhazsKLQljYXNlIFZfQ09MVU1OUzoKLQkJaWYgKGkgPj0gTUlOX0NPTFMpCi0JCQl4X2NvbHMgPSBpOwotCQlicmVhazsKLQljYXNlIFZfTElORVM6Ci0JCWlmIChpID49IE1JTl9MSU5TKQotCQkJeF9saW5zID0gaTsKLQkJYnJlYWs7Ci0JY2FzZSBWX1JBTkRPTToKLQkJLyoKLQkJICogbWtzaCBSMzlkKyBubyBsb25nZXIgaGFzIHRoZSB0cmFkaXRpb25hbCByZXBlYXRhYmlsaXR5Ci0JCSAqIG9mICRSQU5ET00gc2VxdWVuY2VzLCBidXQgYWx3YXlzIHJldGFpbnMgc3RhdGUKLQkJICovCi0JCWNoYW5nZV9yYW5kb20oJmksIHNpemVvZihpKSk7Ci0JCWJyZWFrOwotCWNhc2UgVl9TRUNPTkRTOgotCQl7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0JCQlzZWNvbmRzID0gdHYudHZfc2VjIC0gaTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZfTElORU5POgotCQkvKiBUaGUgLTEgaXMgYmVjYXVzZSBsaW5lIG51bWJlcmluZyBzdGFydHMgYXQgMS4gKi8KLQkJdXNlcl9saW5lbm8gPSAodW5zaWduZWQgaW50KWkgLSBjdXJyZW50X2xpbmVubyAtIDE7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXVuc2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKLXsKLQlzd2l0Y2ggKHNwZWNpYWwodnAtPm5hbWUpKSB7Ci0JY2FzZSBWX1BBVEg6Ci0JCWlmIChwYXRoKQotCQkJYWZyZWUocGF0aCwgQVBFUk0pOwotCQlzdHJkdXB4KHBhdGgsIGRlZl9wYXRoLCBBUEVSTSk7Ci0JCWZsdXNoY29tKDEpOwkvKiBjbGVhciB0cmFja2VkIGFsaWFzZXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSBWX0lGUzoKLQkJc2V0Y3R5cGVzKCIgXHRcbiIsIENfSUZTKTsKLQkJaWZzMCA9ICcgJzsKLQkJYnJlYWs7Ci0JY2FzZSBWX1RNUERJUjoKLQkJLyogc2hvdWxkIG5vdCBiZWNvbWUgdW5zcGVjaWFsICovCi0JCWlmICh0bXBkaXIpIHsKLQkJCWFmcmVlKHRtcGRpciwgQVBFUk0pOwotCQkJdG1wZGlyID0gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIFZfTElORU5POgotCWNhc2UgVl9SQU5ET006Ci0JY2FzZSBWX1NFQ09ORFM6Ci0JY2FzZSBWX1RNT1VUOgkJLyogQVQmVCBrc2ggbGVhdmVzIHByZXZpb3VzIHZhbHVlIGluIHBsYWNlICovCi0JCXVuc3BlY2lhbCh2cC0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JLyoKLQkgKiBBVCZUIGtzaCBtYW4gcGFnZSBzYXlzIE9QVElORCwgT1BUQVJHIGFuZCBfIGxvc2Ugc3BlY2lhbAotCSAqIG1lYW5pbmcsIGJ1dCBPUFRBUkcgZG9lcyBub3QgKHN0aWxsIHNldCBieSBnZXRvcHRzKSBhbmQgXyBpcwotCSAqIGFsc28gc3RpbGwgc2V0IGluIHZhcmlvdXMgcGxhY2VzLiBEb24ndCBrbm93IHdoYXQgQVQmVCBkb2VzCi0JICogZm9yIEhJU1RTSVpFLCBISVNURklMRS4gVW5zZXR0aW5nIHRoZXNlIGluIEFUJlQga3NoIGRvZXMgbm90Ci0JICogbG9vc2UgdGhlICdzcGVjaWFsbmVzcyc6IElGUywgQ09MVU1OUywgUEFUSCwgVE1QRElSCi0JICovCi0JfQotfQotCi0vKgotICogU2VhcmNoIGZvciAoYW5kIHBvc3NpYmx5IGNyZWF0ZSkgYSB0YWJsZSBlbnRyeSBzdGFydGluZyB3aXRoCi0gKiB2cCwgaW5kZXhlZCBieSB2YWwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdGJsICoKLWFycmF5c2VhcmNoKHN0cnVjdCB0YmwgKnZwLCB1aW50MzJfdCB2YWwpCi17Ci0Jc3RydWN0IHRibCAqcHJldiwgKmN1cnIsICpuZXdzOwotCXNpemVfdCBsZW47Ci0KLQl2cC0+ZmxhZyA9ICh2cC0+ZmxhZyB8IChBUlJBWXxERUZJTkVEKSkgJiB+QVNTT0M7Ci0JLyogVGhlIHRhYmxlIGVudHJ5IGlzIGFsd2F5cyBbMF0gKi8KLQlpZiAodmFsID09IDApCi0JCXJldHVybiAodnApOwotCXByZXYgPSB2cDsKLQljdXJyID0gdnAtPnUuYXJyYXk7Ci0Jd2hpbGUgKGN1cnIgJiYgY3Vyci0+dWEuaW5kZXggPCB2YWwpIHsKLQkJcHJldiA9IGN1cnI7Ci0JCWN1cnIgPSBjdXJyLT51LmFycmF5OwotCX0KLQlpZiAoY3VyciAmJiBjdXJyLT51YS5pbmRleCA9PSB2YWwpIHsKLQkJaWYgKGN1cnItPmZsYWcmSVNTRVQpCi0JCQlyZXR1cm4gKGN1cnIpOwotCQluZXdzID0gY3VycjsKLQl9IGVsc2UKLQkJbmV3cyA9IE5VTEw7Ci0JbGVuID0gc3RybGVuKHZwLT5uYW1lKSArIDE7Ci0JaWYgKCFuZXdzKSB7Ci0JCW5ld3MgPSBhbGxvYyhvZmZzZXRvZihzdHJ1Y3QgdGJsLCBuYW1lWzBdKSArIGxlbiwgdnAtPmFyZWFwKTsKLQkJbWVtY3B5KG5ld3MtPm5hbWUsIHZwLT5uYW1lLCBsZW4pOwotCX0KLQluZXdzLT5mbGFnID0gKHZwLT5mbGFnICYgfihBTExPQ3xERUZJTkVEfElTU0VUfFNQRUNJQUwpKSB8IEFJTkRFWDsKLQluZXdzLT50eXBlID0gdnAtPnR5cGU7Ci0JbmV3cy0+YXJlYXAgPSB2cC0+YXJlYXA7Ci0JbmV3cy0+dTIuZmllbGQgPSB2cC0+dTIuZmllbGQ7Ci0JbmV3cy0+dWEuaW5kZXggPSB2YWw7Ci0KLQlpZiAoY3VyciAhPSBuZXdzKSB7CQkvKiBub3QgcmV1c2luZyBvbGQgYXJyYXkgZW50cnkgKi8KLQkJcHJldi0+dS5hcnJheSA9IG5ld3M7Ci0JCW5ld3MtPnUuYXJyYXkgPSBjdXJyOwotCX0KLQlyZXR1cm4gKG5ld3MpOwotfQotCi0vKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBhcnJheSByZWZlcmVuY2UgKGVnLCBbMSsyXSkgLSBjcCBpcyBhc3N1bWVkCi0gKiB0byBwb2ludCB0byB0aGUgb3BlbiBicmFja2V0LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgY2xvc2luZwotICogYnJhY2tldC4KLSAqLwotaW50Ci1hcnJheV9yZWZfbGVuKGNvbnN0IGNoYXIgKmNwKQotewotCWNvbnN0IGNoYXIgKnMgPSBjcDsKLQlpbnQgYzsKLQlpbnQgZGVwdGggPSAwOwotCi0Jd2hpbGUgKChjID0gKnMrKykgJiYgKGMgIT0gJ10nIHx8IC0tZGVwdGgpKQotCQlpZiAoYyA9PSAnWycpCi0JCQlkZXB0aCsrOwotCWlmICghYykKLQkJcmV0dXJuICgwKTsKLQlyZXR1cm4gKHMgLSBjcCk7Ci19Ci0KLS8qCi0gKiBNYWtlIGEgY29weSBvZiB0aGUgYmFzZSBvZiBhbiBhcnJheSBuYW1lCi0gKi8KLWNoYXIgKgotYXJyYXluYW1lKGNvbnN0IGNoYXIgKnN0cikKLXsKLQljb25zdCBjaGFyICpwOwotCWNoYXIgKnJ2OwotCi0JaWYgKChwID0gY3N0cmNocihzdHIsICdbJykpID09IDApCi0JCS8qIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3aHkgd29ycnk/ICovCi0JCXN0cmR1cHgocnYsIHN0ciwgQVRFTVApOwotCWVsc2UKLQkJc3RybmR1cHgocnYsIHN0ciwgcCAtIHN0ciwgQVRFTVApOwotCi0JcmV0dXJuIChydik7Ci19Ci0KLS8qIHNldCAob3Igb3ZlcndyaXRlLCBpZiByZXNldCkgdGhlIGFycmF5IHZhcmlhYmxlIHZhciB0byB0aGUgdmFsdWVzIGluIHZhbHMgKi8KLW1rc2hfdWFyaV90Ci1zZXRfYXJyYXkoY29uc3QgY2hhciAqdmFyLCBib29sIHJlc2V0LCBjb25zdCBjaGFyICoqdmFscykKLXsKLQlzdHJ1Y3QgdGJsICp2cCwgKnZxOwotCW1rc2hfdWFyaV90IGk7Ci0JY29uc3QgY2hhciAqY2NwOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JY2hhciAqY3A7Ci0JbWtzaF91YXJpX3QgajsKLSNlbmRpZgotCi0JLyogdG8gZ2V0IGxvY2FsIGFycmF5LCB1c2UgInR5cGVzZXQgZm9vOyBzZXQgLUEgZm9vIiAqLwotCXZwID0gZ2xvYmFsKHZhcik7Ci0KLQkvKiBOb3RlOiBBVCZUIGtzaCBhbGxvd3Mgc2V0IC1BIGJ1dCBub3Qgc2V0ICtBIG9mIGEgcmVhZC1vbmx5IHZhciAqLwotCWlmICgodnAtPmZsYWcmUkRPTkxZKSkKLQkJZXJyb3JmKCIlczogaXMgcmVhZCBvbmx5IiwgdmFyKTsKLQkvKiBUaGlzIGNvZGUgaXMgcXVpdGUgbm9uLW9wdGltYWwgKi8KLQlpZiAocmVzZXQpCi0JCS8qIHRyYXNoIGV4aXN0aW5nIHZhbHVlcyBhbmQgYXR0cmlidXRlcyAqLwotCQl1bnNldCh2cCwgMSk7Ci0JLyogdG9kbzogd291bGQgYmUgbmljZSBmb3IgYXNzaWdubWVudCB0byBjb21wbGV0ZWx5IHN1Y2NlZWQgb3IKLQkgKiBjb21wbGV0ZWx5IGZhaWwuIE9ubHkgcmVhbGx5IGVmZmVjdHMgaW50ZWdlciBhcnJheXM6Ci0JICogZXZhbHVhdGlvbiBvZiBzb21lIG9mIHZhbHNbXSBtYXkgZmFpbC4uLgotCSAqLwotCWkgPSAwOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JaiA9IDA7Ci0jZWxzZQotI2RlZmluZSBqIGkKLSNlbmRpZgotCXdoaWxlICgoY2NwID0gdmFsc1tpXSkpIHsKLSNpZm5kZWYgTUtTSF9TTUFMTAotCQlpZiAoKmNjcCA9PSAnWycpIHsKLQkJCWludCBsZXZlbCA9IDA7Ci0KLQkJCXdoaWxlICgqY2NwKSB7Ci0JCQkJaWYgKCpjY3AgPT0gJ10nICYmIC0tbGV2ZWwgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCpjY3AgPT0gJ1snKQotCQkJCQkrK2xldmVsOwotCQkJCSsrY2NwOwotCQkJfQotCQkJaWYgKCpjY3AgPT0gJ10nICYmIGxldmVsID09IDAgJiYgY2NwWzFdID09ICc9JykgewotCQkJCXN0cm5kdXB4KGNwLCB2YWxzW2ldICsgMSwgY2NwIC0gKHZhbHNbaV0gKyAxKSwKLQkJCQkgICAgQVRFTVApOwotCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoY3AsIDApLCAobWtzaF9hcmlfdCAqKSZqLAotCQkJCSAgICBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKLQkJCQlhZnJlZShjcCwgQVRFTVApOwotCQkJCWNjcCArPSAyOwotCQkJfSBlbHNlCi0JCQkJY2NwID0gdmFsc1tpXTsKLQkJfQotI2VuZGlmCi0KLQkJdnEgPSBhcnJheXNlYXJjaCh2cCwgaik7Ci0JCS8qIHdvdWxkIGJlIG5pY2UgdG8gZGVhbCB3aXRoIGVycm9ycyBoZXJlLi4uIChzZWUgYWJvdmUpICovCi0JCXNldHN0cih2cSwgY2NwLCBLU0hfUkVUVVJOX0VSUk9SKTsKLQkJaSsrOwotI2lmbmRlZiBNS1NIX1NNQUxMCi0JCWorKzsKLSNlbmRpZgotCX0KLQotCXJldHVybiAoaSk7Ci19Ci0KLXZvaWQKLWNoYW5nZV93aW5zeih2b2lkKQotewotCWlmICh4X2xpbnMgPCAwKSB7Ci0JCS8qIGZpcnN0IHRpbWUgaW5pdGlhbGlzYXRpb24gKi8KLSNpZmRlZiBUSU9DR1dJTlNaCi0JCWlmICh0dHlfZmQgPCAwKQotCQkJLyogbm9uLUZUQUxLSU5HLCB0cnkgdG8gZ2V0IGFuIGZkIGFueXdheSAqLwotCQkJdHR5X2luaXQoZmFsc2UsIGZhbHNlKTsKLSNlbmRpZgotCQl4X2NvbHMgPSAtMTsKLQl9Ci0KLSNpZmRlZiBUSU9DR1dJTlNaCi0JLyogY2hlY2sgaWYgd2luZG93IHNpemUgaGFzIGNoYW5nZWQgKi8KLQlpZiAodHR5X2ZkID49IDApIHsKLQkJc3RydWN0IHdpbnNpemUgd3M7Ci0KLQkJaWYgKGlvY3RsKHR0eV9mZCwgVElPQ0dXSU5TWiwgJndzKSA+PSAwKSB7Ci0JCQlpZiAod3Mud3NfY29sKQotCQkJCXhfY29scyA9IHdzLndzX2NvbDsKLQkJCWlmICh3cy53c19yb3cpCi0JCQkJeF9saW5zID0gd3Mud3Nfcm93OwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBib3VuZHMgY2hlY2sgZm9yIHNhbmUgdmFsdWVzLCB1c2UgZGVmYXVsdHMgb3RoZXJ3aXNlICovCi0JaWYgKHhfY29scyA8IE1JTl9DT0xTKQotCQl4X2NvbHMgPSA4MDsKLQlpZiAoeF9saW5zIDwgTUlOX0xJTlMpCi0JCXhfbGlucyA9IDI0OwotCi0jaWZkZWYgU0lHV0lOQ0gKLQlnb3Rfd2luY2ggPSAwOwotI2VuZGlmCi19Ci0KLXVpbnQzMl90Ci1ldmlsaGFzaChjb25zdCBjaGFyICpzKQotewotCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAweDEwMDsKLQotCWggPSBvYWF0aGFzaF91cGRhdGUoaCwgKHZvaWQgKikma3Noc3RhdGVfZiwgc2l6ZW9mKGtzaHN0YXRlX2YpKTsKLQlrc2hzdGF0ZV9mLmggPSBvYWF0aGFzaF9mdWxsKChjb25zdCB1aW50OF90ICopcyk7Ci0JcmV0dXJuIChvYWF0aGFzaF9maW5hbGlzZShvYWF0aGFzaF91cGRhdGUoaCwKLQkgICAgKHZvaWQgKikma3Noc3RhdGVfZi5oLCBzaXplb2Yoa3Noc3RhdGVfZi5oKSkpKTsKLX0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3Zhcl9zcGVjLmggYi9ta3NoL3NyYy92YXJfc3BlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDM1Y2M5Li4wMDAwMDAwCi0tLSBhL21rc2gvc3JjL3Zhcl9zcGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jaWYgZGVmaW5lZChWQVJTUEVDX0RFRk5TKQotX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvdmFyX3NwZWMuaCx2IDEuMSAyMDA5LzA5LzI2IDAzOjQwOjAzIHRnIEV4cCAkIik7Ci0jZGVmaW5lIEZOKG5hbWUpCQkJLyogbm90aGluZyAqLwotI2VsaWYgZGVmaW5lZChWQVJTUEVDX0VOVU1TKQotI2RlZmluZSBGTihuYW1lKQkJCVZfIyNuYW1lLAotI2RlZmluZSBGMChuYW1lKQkJCVZfIyNuYW1lID0gMCwKLSNlbGlmIGRlZmluZWQoVkFSU1BFQ19JVEVNUykKLSNkZWZpbmUgRjAobmFtZSkJCQkvKiBub3RoaW5nICovCi0jZGVmaW5lIEZOKG5hbWUpCQkJI25hbWUsCi0jZW5kaWYKLQotI2lmbmRlZiBGMAotI2RlZmluZSBGMCBGTgotI2VuZGlmCi0KLS8qIDAgaXMgYWx3YXlzIFZfTk9ORSAqLwotRjAoTk9ORSkKLQotLyogMSBhbmQgdXAgYXJlIHNwZWNpYWwgdmFyaWFibGVzICovCi1GTihDT0xVTU5TKQotI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCi1GTihISVNURklMRSkKLSNlbmRpZgotRk4oSElTVFNJWkUpCi1GTihJRlMpCi1GTihMSU5FTk8pCi1GTihMSU5FUykKLUZOKE9QVElORCkKLUZOKFBBVEgpCi1GTihSQU5ET00pCi1GTihTRUNPTkRTKQotRk4oVE1PVVQpCi1GTihUTVBESVIpCi0KLSN1bmRlZiBGTgotI3VuZGVmIEYwCi0jdW5kZWYgVkFSU1BFQ19ERUZOUwotI3VuZGVmIFZBUlNQRUNfRU5VTVMKLSN1bmRlZiBWQVJTUEVDX0lURU1TCg==