Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKICoKICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCiAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgogKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KICovCi8qCiAqCiAqIHRlcm0uYzogZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgdGVybWluYWwKICoKICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EsIE1TRE9TLCBhbmQgV2luMzIgaW5jbHVkZWQKICoKICogTk9URTogcGFkZGluZyBhbmQgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBwZXJmb3JtZWQsCiAqIHdoZW4gY29tcGlsaW5nIHdpdGhvdXQgSEFWRV9UR0VURU5ULCB3ZSB1c2UgdHB1dHMoKSBhbmQgdGdvdG8oKSBkdW1taWVzLgogKi8KCi8qCiAqIFNvbWUgc3lzdGVtcyBoYXZlIGEgcHJvdG90eXBlIGZvciB0Z2V0c3RyKCkgd2l0aCAoY2hhciAqKSBpbnN0ZWFkIG9mCiAqIChjaGFyICoqKS4gVGhpcyBkZWZpbmUgcmVtb3ZlcyB0aGF0IHByb3RvdHlwZS4gV2UgaW5jbHVkZSBvdXIgb3duIHByb3RvdHlwZQogKiBiZWxvdy4KICovCgojZGVmaW5lIHRnZXRzdHIgdGdldHN0cl9kZWZpbmVkX3dyb25nCiNpbmNsdWRlICJ2aW0uaCIKCiNpZmRlZiBIQVZFX1RHRVRFTlQKIyBpZmRlZiBIQVZFX1RFUk1JT1NfSAojICBpbmNsdWRlIDx0ZXJtaW9zLmg+CSAgICAvKiBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3Igc29tZSBMaW51eCAqLwojIGVuZGlmCiMgaWZkZWYgSEFWRV9URVJNQ0FQX0gKIyAgaW5jbHVkZSA8dGVybWNhcC5oPgojIGVuZGlmCgovKgogKiBBIGZldyBsaW51eCBzeXN0ZW1zIGRlZmluZSBvdXRmdW50eXBlIGluIHRlcm1jYXAuaCB0byBiZSB1c2VkIGFzIHRoZSB0aGlyZAogKiBhcmd1bWVudCBmb3IgdHB1dHMoKS4KICovCiMgaWZkZWYgVk1TCiMgIGRlZmluZSBUUFVUU0ZVTkNBU1QKIyBlbHNlCiMgIGlmZGVmIEhBVkVfT1VURlVOVFlQRQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAob3V0ZnVudHlwZSkKIyAgZWxzZQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAoaW50ICgqKSgpKQojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKI3VuZGVmIHRnZXRzdHIKCi8qCiAqIEhlcmUgYXJlIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4gIFRoZXkgYXJlIG5vdCBzdG9yZWQgYXMgY29tcGxldGUKICogVGNhcnIgc3RydWN0dXJlcywgYXMgc3VjaCBhIHN0cnVjdHVyZSBpcyB0b28gYmlnLgogKgogKiBUaGUgZW50cmllcyBhcmUgY29tcGFjdCwgdGhlcmVmb3JlIHRoZXkgbm9ybWFsbHkgYXJlIGluY2x1ZGVkIGV2ZW4gd2hlbgogKiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZC4gV2hlbiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCwgdGhlIGJ1aWx0aW4gZW50cmllcwogKiBjYW4gYmUgYWNjZXNzZWQgd2l0aCAiYnVpbHRpbl9hbWlnYSIsICJidWlsdGluX2Fuc2kiLCAiYnVpbHRpbl9kZWJ1ZyIsIGV0Yy4KICoKICogRWFjaCB0ZXJtY2FwIGlzIGEgbGlzdCBvZiBidWlsdGluX3Rlcm0gc3RydWN0dXJlcy4gSXQgYWx3YXlzIHN0YXJ0cyB3aXRoCiAqIEtTX05BTUUsIHdoaWNoIHNlcGFyYXRlcyB0aGUgZW50cmllcy4gIFNlZSBwYXJzZV9idWlsdGluX3RjYXAoKSBmb3IgYWxsCiAqIGRldGFpbHMuCiAqIGJ0X2VudHJ5IGlzIGVpdGhlciBhIEtTX3h4eCBjb2RlICg+PSAwKSwgb3IgYSBLX3h4eCBjb2RlLgogKgogKiBFbnRyaWVzIG1hcmtlZCB3aXRoICJndWVzc2VkIiBtYXkgYmUgd3JvbmcuCiAqLwpzdHJ1Y3QgYnVpbHRpbl90ZXJtCnsKICAgIGludAkJYnRfZW50cnk7CiAgICBjaGFyCSpidF9zdHJpbmc7Cn07CgovKiBzdGFydCBvZiBrZXlzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSB1c2VkIGJ5IFZpbSBidXQgY2FuIGJlIG1hcHBlZCAqLwojZGVmaW5lIEJUX0VYVFJBX0tFWVMJMHgxMDEKCnN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpmaW5kX2J1aWx0aW5fdGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwpzdGF0aWMgdm9pZCBwYXJzZV9idWlsdGluX3RjYXAgX19BUkdTKChjaGFyX3UgKnMpKTsKc3RhdGljIHZvaWQgdGVybV9jb2xvciBfX0FSR1MoKGNoYXJfdSAqcywgaW50IG4pKTsKc3RhdGljIHZvaWQgZ2F0aGVyX3Rlcm1sZWFkZXIgX19BUkdTKCh2b2lkKSk7CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQpzdGF0aWMgdm9pZCByZXFfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwpzdGF0aWMgdm9pZCByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0gX19BUkdTKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGdvdF9jb2RlX2Zyb21fdGVybSBfX0FSR1MoKGNoYXJfdSAqY29kZSwgaW50IGxlbikpOwpzdGF0aWMgdm9pZCBjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwojZW5kaWYKI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKc3RhdGljIGludCBnZXRfYnl0ZXNfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGludCkpOwojZW5kaWYKc3RhdGljIHZvaWQgZGVsX3Rlcm1jb2RlX2lkeCBfX0FSR1MoKGludCBpZHgpKTsKc3RhdGljIGludCB0ZXJtX2lzX2J1aWx0aW4gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKc3RhdGljIGludCB0ZXJtXzd0bzhiaXQgX19BUkdTKChjaGFyX3UgKnApKTsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCnN0YXRpYyB2b2lkIHN3aXRjaF90b184Yml0IF9fQVJHUygodm9pZCkpOwojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKc3RhdGljIGNoYXJfdSAqdGdldGVudF9lcnJvciBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOwoKLyoKICogSGVyZSBpcyBvdXIgb3duIHByb3RvdHlwZSBmb3IgdGdldHN0cigpLCBhbnkgcHJvdG90eXBlcyBmcm9tIHRoZSBpbmNsdWRlCiAqIGZpbGVzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGVmaW5lIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCiAqLwpjaGFyCQkqdGdldHN0ciBfX0FSR1MoKGNoYXIgKiwgY2hhciAqKikpOwoKIyBpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQovKiBSZXF1ZXN0IFRlcm1pbmFsIFZlcnNpb24gc3RhdHVzOiAqLwojICBkZWZpbmUgQ1JWX0dFVAkxCS8qIHNlbmQgVF9DUlYgd2hlbiBzd2l0Y2hlZCB0byBSQVcgbW9kZSAqLwojICBkZWZpbmUgQ1JWX1NFTlQJMgkvKiBkaWQgc2VuZCBUX0NSViwgd2FpdGluZyBmb3IgYW5zd2VyICovCiMgIGRlZmluZSBDUlZfR09UCTMJLyogcmVjZWl2ZWQgVF9DUlYgcmVzcG9uc2UgKi8Kc3RhdGljIGludCBjcnZfc3RhdHVzID0gQ1JWX0dFVDsKIyBlbmRpZgoKLyoKICogRG9uJ3QgZGVjbGFyZSB0aGVzZSB2YXJpYWJsZXMgaWYgdGVybWNhcC5oIGNvbnRhaW5zIHRoZW0uCiAqIEF1dG9jb25mIGNoZWNrcyBpZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGV4dGVybiAobm90IGFsbAogKiBzeXN0ZW1zIGhhdmUgdGhlbSkuCiAqIFNvbWUgdmVyc2lvbnMgZGVmaW5lIG9zcGVlZCB0byBiZSBzcGVlZF90LCBidXQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aAogKiBCU0QsIHdoZXJlIG9zcGVlZCBpcyBzaG9ydCBhbmQgc3BlZWRfdCBpcyBsb25nLgogKi8KIyBpZm5kZWYgSEFWRV9PU1BFRUQKIyAgaWZkZWYgT1NQRUVEX0VYVEVSTgpleHRlcm4gc2hvcnQgb3NwZWVkOwojICAgZWxzZQpzaG9ydCBvc3BlZWQ7CiMgICBlbmRpZgojIGVuZGlmCiMgaWZuZGVmIEhBVkVfVVBfQkNfUEMKIyAgaWZkZWYgVVBfQkNfUENfRVhURVJOCmV4dGVybiBjaGFyICpVUCwgKkJDLCBQQzsKIyAgZWxzZQpjaGFyICpVUCwgKkJDLCBQQzsKIyAgZW5kaWYKIyBlbmRpZgoKIyBkZWZpbmUgVEdFVFNUUihzLCBwKQl2aW1fdGdldHN0cigocyksIChwKSkKIyBkZWZpbmUgVEdFVEVOVChiLCB0KQl0Z2V0ZW50KChjaGFyICopKGIpLCAoY2hhciAqKSh0KSkKc3RhdGljIGNoYXJfdSAqdmltX3RnZXRzdHIgX19BUkdTKChjaGFyICpzLCBjaGFyX3UgKipwcCkpOwojZW5kaWYgLyogSEFWRV9UR0VURU5UICovCgpzdGF0aWMgaW50ICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CS8qIGRldGVjdGVkIDgtYml0IHRlcm1pbmFsICovCgpzdGF0aWMgc3RydWN0IGJ1aWx0aW5fdGVybSBidWlsdGluX3Rlcm1jYXBzW10gPQp7CgojaWYgZGVmaW5lZChGRUFUX0dVSSkKLyoKICogR1VJIHBzZXVkbyB0ZXJtLWNhcC4KICovCiAgICB7KGludClLU19OQU1FLAkiZ3VpIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzN8JCIsIEVTQ19TVFIgInwkIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzfGkiLCBFU0NfU1RSICJ8aSIpfSwKIyBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM3wlcDElZEkiLCBFU0NfU1RSICJ8JXAxJWRJIil9LAojIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzN8JWRJIiwgRVNDX1NUUiAifCVkSSIpfSwKIyBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzfGQiLCBFU0NfU1RSICJ8ZCIpfSwKIyBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlcDElZEQiLCBFU0NfU1RSICJ8JXAxJWREIil9LAogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzfCVwMSVkOyVwMiVkUiIsIEVTQ19TVFIgInwlcDElZDslcDIlZFIiKX0sCiMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVwMSVkOyVwMiVkViIsIEVTQ19TVFIgInwlcDElZDslcDIlZFYiKX0sCiMgIGVuZGlmCiMgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlZEQiLCBFU0NfU1RSICJ8JWREIil9LAogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzfCVkOyVkUiIsIEVTQ19TVFIgInwlZDslZFIiKX0sCiMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVkOyVkViIsIEVTQ19TVFIgInwlZDslZFYiKX0sCiMgIGVuZGlmCiMgZW5kaWYKICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM3xDIiwgRVNDX1NUUiAifEMiKX0sCgkJCS8qIGF0dHJpYnV0ZXMgc3dpdGNoZWQgb24gd2l0aCAnaCcsIG9mZiB3aXRoICogJ0gnICovCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzN8MzFIIiwgRVNDX1NUUiAifDMxSCIpfSwgLyogSExfQUxMICovCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzN8MWgiLCBFU0NfU1RSICJ8MWgiKX0sICAgLyogSExfSU5WRVJTRSAqLwogICAgeyhpbnQpS1NfTUQsCUlGX0VCKCJcMDMzfDJoIiwgRVNDX1NUUiAifDJoIil9LCAgIC8qIEhMX0JPTEQgKi8KICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3wxNkgiLCBFU0NfU1RSICJ8MTZIIil9LCAvKiBITF9TVEFORE9VVCAqLwogICAgeyhpbnQpS1NfU08sCUlGX0VCKCJcMDMzfDE2aCIsIEVTQ19TVFIgInwxNmgiKX0sIC8qIEhMX1NUQU5ET1VUICovCiAgICB7KGludClLU19VRSwJSUZfRUIoIlwwMzN8OEgiLCBFU0NfU1RSICJ8OEgiKX0sICAgLyogSExfVU5ERVJMSU5FICovCiAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzN8OGgiLCBFU0NfU1RSICJ8OGgiKX0sICAgLyogSExfVU5ERVJMSU5FICovCiAgICB7KGludClLU19VQ0UsCUlGX0VCKCJcMDMzfDhDIiwgRVNDX1NUUiAifDhDIil9LCAgIC8qIEhMX1VOREVSQ1VSTCAqLwogICAgeyhpbnQpS1NfVUNTLAlJRl9FQigiXDAzM3w4YyIsIEVTQ19TVFIgInw4YyIpfSwgICAvKiBITF9VTkRFUkNVUkwgKi8KICAgIHsoaW50KUtTX0NaUiwJSUZfRUIoIlwwMzN8NEgiLCBFU0NfU1RSICJ8NEgiKX0sICAgLyogSExfSVRBTElDICovCiAgICB7KGludClLU19DWkgsCUlGX0VCKCJcMDMzfDRoIiwgRVNDX1NUUiAifDRoIil9LCAgIC8qIEhMX0lUQUxJQyAqLwogICAgeyhpbnQpS1NfVkIsCUlGX0VCKCJcMDMzfGYiLCBFU0NfU1RSICJ8ZiIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCQkvKiBjdXJzb3ItbGVmdCA9IEJTICovCiAgICB7KGludClLU19ORCwJIlwwMTQifSwJLyogY3Vyc29yLXJpZ2h0ID0gQ1RSTC1MICovCiMgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZE0iLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRNIil9LAojIGVsc2UKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlZDslZE0iLCBFU0NfU1RSICJ8JWQ7JWRNIil9LAojIGVuZGlmCgkvKiB0aGVyZSBhcmUgbm8ga2V5IHNlcXVlbmNlcyBoZXJlLCB0aGUgR1VJIHNlcXVlbmNlcyBhcmUgcmVjb2duaXplZAoJICogaW4gY2hlY2tfdGVybWNvZGUoKSAqLwojZW5kaWYKCiNpZm5kZWYgTk9fQlVJTFRJTl9UQ0FQUwojIGlmIGRlZmluZWQoUklTQ09TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBEZWZhdWx0IGZvciB0aGUgQWNvcm4uCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJInJpc2NvcyJ9LAogICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCQkvKiBDbHMgYW5kIEhvbWUgQ3Vyc29yICovCiAgICB7KGludClLU19DTSwJIlwwMDElZFwwMDElZFwwMDIifSwJLyogUG9zaXRpb24gY3Vyc29yICovCgogICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCQkvKiBBbGxvdyAxNiBjb2xvcnMgKi8KCiAgICB7KGludClLU19DQUYsCSJcMDAxJWRcMDIxIn0sCQkvKiBTZXQgZm9yZWdyb3VuZCBjb2xvdXIgKi8KICAgIHsoaW50KUtTX0NBQiwJIlwwMDElZFwwMjIifSwJCS8qIFNldCBiYWNrZ3JvdW5kIGNvbG91ciAqLwoKCiAgICB7KGludClLU19NRSwJIlwwMDQifSwJCS8qIE5vcm1hbCBtb2RlICovCiAgICB7KGludClLU19NUiwJIlwwMDUifSwJCS8qIFJldmVyc2UgKi8KCiAgICB7KGludClLU19WSSwJIlwwMTYifSwJCS8qIEN1cnNvciBpbnZpc2libGUgKi8KICAgIHsoaW50KUtTX1ZFLAkiXDAxNyJ9LAkJLyogQ3Vyc29yIHZpc2libGUgKi8KICAgIHsoaW50KUtTX1ZTLAkiXDAyMCJ9LAkJLyogQ3Vyc29yIHZlcnkgdmlzaWJsZSAqLwoKICAgIHsoaW50KUtTX0NTLAkiXDAwMSVkXDAwMSVkXDAwMyJ9LAkvKiBTZXQgc2Nyb2xsIHJlZ2lvbiAqLwogICAgeyhpbnQpS1NfU1IsCSJcMDIzIn0sCQkvKiBTY3JvbGwgdGV4dCBkb3duICovCiAgICB7S19VUCwJCSJcMjE3In0sCiAgICB7S19ET1dOLAkJIlwyMTYifSwKICAgIHtLX0xFRlQsCQkiXDIxNCJ9LAogICAge0tfUklHSFQsCQkiXDIxNSJ9LAogICAge0tfU19VUCwJCSJcMjM3In0sCiAgICB7S19TX0RPV04sCQkiXDIzNiJ9LAogICAge0tfU19MRUZULAkJIlwyMzQifSwKICAgIHtLX1NfUklHSFQsCQkiXDIzNSJ9LAoKICAgIHtLX0YxLAkJIlwyMDEifSwKICAgIHtLX0YyLAkJIlwyMDIifSwKICAgIHtLX0YzLAkJIlwyMDMifSwKICAgIHtLX0Y0LAkJIlwyMDQifSwKICAgIHtLX0Y1LAkJIlwyMDUifSwKICAgIHtLX0Y2LAkJIlwyMDYifSwKICAgIHtLX0Y3LAkJIlwyMDcifSwKICAgIHtLX0Y4LAkJIlwyMTAifSwKICAgIHtLX0Y5LAkJIlwyMTEifSwKICAgIHtLX0YxMCwJCSJcMzEyIn0sCiAgICB7S19GMTEsCQkiXDMxMyJ9LAogICAge0tfRjEyLAkJIlwzMTQifSwKICAgIHtLX1NfRjEsCQkiXDIyMSJ9LAogICAge0tfU19GMiwJCSJcMjIyIn0sCiAgICB7S19TX0YzLAkJIlwyMjMifSwKICAgIHtLX1NfRjQsCQkiXDIyNCJ9LAogICAge0tfU19GNSwJCSJcMjI1In0sCiAgICB7S19TX0Y2LAkJIlwyMjYifSwKICAgIHtLX1NfRjcsCQkiXDIyNyJ9LAogICAge0tfU19GOCwJCSJcMjMwIn0sCiAgICB7S19TX0Y5LAkJIlwyMzEifSwKICAgIHtLX1NfRjEwLAkJIlwzMzIifSwKICAgIHtLX1NfRjExLAkJIlwzMzMifSwKICAgIHtLX1NfRjEyLAkJIlwzMzQifSwKICAgIHtLX0JTLAkJIlwwMTAifSwKICAgIHtLX0lOUywJCSJcMzE1In0sCiAgICB7S19ERUwsCQkiXDE3NyJ9LAogICAge0tfSE9NRSwJCSJcMDM2In0sCiAgICB7S19FTkQsCQkiXDIxMyJ9LAogICAge0tfUEFHRVVQLAkJIlwyMzcifSwKICAgIHtLX1BBR0VET1dOLAkiXDIzNiJ9LAojIGVuZGlmCS8qIEFjb3JuIHRlcm1pbmFsICovCgoKIyBpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBBbWlnYSBjb25zb2xlIHdpbmRvdywgZGVmYXVsdCBmb3IgQW1pZ2EKICovCiAgICB7KGludClLU19OQU1FLAkiYW1pZ2EifSwKICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCiAgICB7KGludClLU19DRCwJIlwwMzNbSiJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJXAxJWRMIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slcDElZE0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAogICAgeyhpbnQpS1NfVkksCSJcMDMzWzAgcCJ9LAogICAgeyhpbnQpS1NfVkUsCSJcMDMzWzEgcCJ9LAogICAgeyhpbnQpS1NfTUUsCSJcMDMzWzBtIn0sCiAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwKICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAogICAgeyhpbnQpS1NfU0UsCSJcMDMzWzBtIn0sCiAgICB7KGludClLU19TTywJIlwwMzNbMzNtIn0sCiAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwKICAgIHsoaW50KUtTX1VFLAkiXDAzM1swbSJ9LAogICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szbSJ9LAogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1swbSJ9LAojaWYgZGVmaW5lZChfX01PUlBIT1NfXykgfHwgZGVmaW5lZChfX0FST1NfXykKICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwojZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiNpZiBkZWZpbmVkKF9fTU9SUEhPU19fKQogICAgeyhpbnQpS1NfU1IsCSJcMDMzTSJ9LAojZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCiMgIGVuZGlmCiAgICB7S19VUCwJCSJcMjMzQSJ9LAogICAge0tfRE9XTiwJCSJcMjMzQiJ9LAogICAge0tfTEVGVCwJCSJcMjMzRCJ9LAogICAge0tfUklHSFQsCQkiXDIzM0MifSwKICAgIHtLX1NfVVAsCQkiXDIzM1QifSwKICAgIHtLX1NfRE9XTiwJCSJcMjMzUyJ9LAogICAge0tfU19MRUZULAkJIlwyMzMgQSJ9LAogICAge0tfU19SSUdIVCwJCSJcMjMzIEAifSwKICAgIHtLX1NfVEFCLAkJIlwyMzNaIn0sCiAgICB7S19GMSwJCSJcMjMzXDA2MH4ifSwvKiBzb21lIGNvbXBpbGVycyBkb24ndCBkaWcgIlwyMzMwIiAqLwogICAge0tfRjIsCQkiXDIzM1wwNjF+In0sCiAgICB7S19GMywJCSJcMjMzXDA2Mn4ifSwKICAgIHtLX0Y0LAkJIlwyMzNcMDYzfiJ9LAogICAge0tfRjUsCQkiXDIzM1wwNjR+In0sCiAgICB7S19GNiwJCSJcMjMzXDA2NX4ifSwKICAgIHtLX0Y3LAkJIlwyMzNcMDY2fiJ9LAogICAge0tfRjgsCQkiXDIzM1wwNjd+In0sCiAgICB7S19GOSwJCSJcMjMzXDA3MH4ifSwKICAgIHtLX0YxMCwJCSJcMjMzXDA3MX4ifSwKICAgIHtLX1NfRjEsCQkiXDIzM1wwNjFcMDYwfiJ9LAogICAge0tfU19GMiwJCSJcMjMzXDA2MVwwNjF+In0sCiAgICB7S19TX0YzLAkJIlwyMzNcMDYxXDA2Mn4ifSwKICAgIHtLX1NfRjQsCQkiXDIzM1wwNjFcMDYzfiJ9LAogICAge0tfU19GNSwJCSJcMjMzXDA2MVwwNjR+In0sCiAgICB7S19TX0Y2LAkJIlwyMzNcMDYxXDA2NX4ifSwKICAgIHtLX1NfRjcsCQkiXDIzM1wwNjFcMDY2fiJ9LAogICAge0tfU19GOCwJCSJcMjMzXDA2MVwwNjd+In0sCiAgICB7S19TX0Y5LAkJIlwyMzNcMDYxXDA3MH4ifSwKICAgIHtLX1NfRjEwLAkJIlwyMzNcMDYxXDA3MX4ifSwKICAgIHtLX0hFTFAsCQkiXDIzMz9+In0sCiAgICB7S19JTlMsCQkiXDIzM1wwNjRcMDYwfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCiAgICB7S19QQUdFVVAsCQkiXDIzM1wwNjRcMDYxfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCiAgICB7S19QQUdFRE9XTiwJIlwyMzNcMDY0XDA2Mn4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLwogICAge0tfSE9NRSwJCSJcMjMzXDA2NFwwNjR+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KICAgIHtLX0VORCwJCSJcMjMzXDA2NFwwNjV+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KCiAgICB7QlRfRVhUUkFfS0VZUywJIiJ9LAogICAge1RFUk1DQVAyS0VZKCcjJywgJzInKSwgIlwyMzNcMDY1XDA2NH4ifSwJLyogc2hpZnRlZCBob21lIGtleSAqLwogICAge1RFUk1DQVAyS0VZKCcjJywgJzMnKSwgIlwyMzNcMDY1XDA2MH4ifSwJLyogc2hpZnRlZCBpbnNlcnQga2V5ICovCiAgICB7VEVSTUNBUDJLRVkoJyonLCAnNycpLCAiXDIzM1wwNjVcMDY1fiJ9LAkvKiBzaGlmdGVkIGVuZCBrZXkgKi8KIyBlbmRpZgoKIyBpZiBkZWZpbmVkKF9fQkVPU19fKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBhbG1vc3Qgc3RhbmRhcmQgQU5TSSB0ZXJtaW5hbCwgZGVmYXVsdCBmb3IgYmVib3gKICovCiAgICB7KGludClLU19OQU1FLAkiYmVvcy1hbnNpIn0sCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCiMgIGVuZGlmCiNpZmRlZiBCRU9TX1BSX09SX0JFVFRFUgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM1slaSVkOyVkciJ9LAkvKiBzY3JvbGwgcmVnaW9uICovCiMgIGVuZGlmCiNlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzW0hcMDMzWzJKIn0sCiNpZmRlZiBub3R5ZXQKICAgIHsoaW50KUtTX1ZJLAkiW1ZJXSJ9LCAvKiBjdXJzb3IgaW52aXNpYmxlLCBWVDMyMDogQ1NJID8gMjUgbCAqLwogICAgeyhpbnQpS1NfVkUsCSJbVkVdIn0sIC8qIGN1cnNvciB2aXNpYmxlLCBWVDMyMDogQ1NJID8gMjUgaCAqLwojZW5kaWYKICAgIHsoaW50KUtTX01FLAkiXDAzM1ttIn0sCS8qIG5vcm1hbCBtb2RlICovCiAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwJLyogcmV2ZXJzZSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCS8qIGJvbGQgKi8KICAgIHsoaW50KUtTX1NPLAkiXDAzM1szMW0ifSwJLyogc3RhbmRvdXQgbW9kZTogcmVkICovCiAgICB7KGludClLU19TRSwJIlwwMzNbbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbMzVtIn0sCS8qIGl0YWxpYzogcHVycGxlICovCiAgICB7KGludClLU19DWlIsCSJcMDMzW20ifSwJLyogaXRhbGljIGVuZCAqLwogICAgeyhpbnQpS1NfVVMsCSJcMDMzWzRtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzW20ifSwJLyogdW5kZXJzY29yZSBlbmQgKi8KICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwogICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYWZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgojaWYgZGVmaW5lZChCRU9TX0RSOCkKICAgIHsoaW50KUtTX0RCLAkiIn0sCQkvKiBoYWNrISBzZWUgc2NyZWVuLmMgKi8KI2VuZGlmCgogICAge0tfVVAsCQkiXDAzM1tBIn0sCiAgICB7S19ET1dOLAkJIlwwMzNbQiJ9LAogICAge0tfTEVGVCwJCSJcMDMzW0QifSwKICAgIHtLX1JJR0hULAkJIlwwMzNbQyJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChTT01FX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKLyoKICogc3RhbmRhcmQgQU5TSSB0ZXJtaW5hbCwgZGVmYXVsdCBmb3IgdW5peAogKi8KICAgIHsoaW50KUtTX05BTUUsCSJhbnNpIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slZEwiLCBFU0NfU1RSICJbJWRMIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slZE0iLCBFU0NfU1RSICJbJWRNIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1swbSIsIEVTQ19TVFIgIlswbSIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLCBFU0NfU1RSICJbJWklcDElZDslcDIlZEgiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVkOyVkSCIsIEVTQ19TVFIgIlslaSVkOyVkSCIpfSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJXAxJWRDIiwgRVNDX1NUUiAiWyVwMSVkQyIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAojICBlbmRpZgojIGVuZGlmCgojIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKLyoKICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIHdoZW4gbmFuc2kuc3lzIG9yIGVxdWl2YWxlbnQgaGFzIGJlZW4gaW5zdGFsbGVkLgogKiBGdW5jdGlvbiBrZXlzIG9uIGEgUEMgYXJlIHByZWNlZGVkIHdpdGggYSBOVUwuIFRoZXNlIGFyZSBjb252ZXJ0ZWQgaW50bwogKiBLX05VTCAnXDMxNicgaW4gbWNoX2luY2hhcigpLCBiZWNhdXNlIHdlIGNhbm5vdCBoYW5kbGUgTlVMcyBpbiBrZXkgY29kZXMuCiAqIENUUkwtYXJyb3cgaXMgdXNlZCBpbnN0ZWFkIG9mIFNISUZULWFycm93LgogKi8KI2lmZGVmIF9fRU1YX18KICAgIHsoaW50KUtTX05BTUUsCSJvczJhbnNpIn0sCiNlbHNlCiAgICB7KGludClLU19OQU1FLAkicGNhbnNpIn0sCiAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKI2VuZGlmCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0wsCSJcMDMzWzJKIn0sCiAgICB7KGludClLU19NRSwJIlwwMzNbMG0ifSwKICAgIHsoaW50KUtTX01SLAkiXDAzM1s1bSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyZXkgKi8KICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCiAgICB7KGludClLU19TRSwJIlwwMzNbMG0ifSwJLyogc3RhbmRvdXQgZW5kICovCiAgICB7KGludClLU19TTywJIlwwMzNbMzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCiAgICB7KGludClLU19DWkgsCSJcMDMzWzM0OzQzbSJ9LAkvKiBpdGFsaWMgbW9kZTogYmx1ZSB0ZXh0IG9uIHllbGxvdyAqLwogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1swbSJ9LAkvKiBpdGFsaWMgbW9kZSBlbmQgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM1szNjs0MW0ifSwJLyogdW5kZXJzY29yZSBtb2RlOiBjeWFuIHRleHQgb24gcmVkICovCiAgICB7KGludClLU19VRSwJIlwwMzNbMG0ifSwJLyogdW5kZXJzY29yZSBtb2RlIGVuZCAqLwogICAgeyhpbnQpS1NfQ0NPLAkiOCJ9LAkJLyogYWxsb3cgOCBjb2xvcnMgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVwMSVkbSJ9LC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlcDElZG0ifSwvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVkbSJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbmRpZgogICAgeyhpbnQpS1NfT1AsCSJcMDMzWzBtIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwogICAgeyhpbnQpS1NfTVMsCSJ5In0sCiAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KICAgIHsoaW50KUtTX0xFLAkiXGIifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAojICBlbHNlCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklZDslZEgifSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCiMgIGVuZGlmCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAogICAge0tfU19SSUdIVCwJCSJcMzE2dCJ9LAogICAge0tfRjEsCQkiXDMxNjsifSwKICAgIHtLX0YyLAkJIlwzMTY8In0sCiAgICB7S19GMywJCSJcMzE2PSJ9LAogICAge0tfRjQsCQkiXDMxNj4ifSwKICAgIHtLX0Y1LAkJIlwzMTY/In0sCiAgICB7S19GNiwJCSJcMzE2QCJ9LAogICAge0tfRjcsCQkiXDMxNkEifSwKICAgIHtLX0Y4LAkJIlwzMTZCIn0sCiAgICB7S19GOSwJCSJcMzE2QyJ9LAogICAge0tfRjEwLAkJIlwzMTZEIn0sCiAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCS8qIGd1ZXNzZWQgKi8KICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKICAgIHtLX1NfRjcsCQkiXDMxNloifSwKICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCiAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAogICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfU19GMTIsCQkiXDMxNlwyMTAifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfSU5TLAkJIlwzMTZSIn0sCiAgICB7S19ERUwsCQkiXDMxNlMifSwKICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKICAgIHtLX0VORCwJCSJcMzE2TyJ9LAogICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAogICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChNU0RPUykKLyoKICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIGZvciB0aGUgcGMgdmlkZW8uICBUaGUgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggRVNDIHwKICogYXJlIHRyYW5zbGF0ZWQgaW50byBjb25pbyBjYWxscyBpbiBvc19tc2Rvcy5jLiBEZWZhdWx0IGZvciBNU0RPUy4KICovCiAgICB7KGludClLU19OQU1FLAkicGN0ZXJtIn0sCiAgICB7KGludClLU19DRSwJIlwwMzN8SyJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzfEwifSwKICAgIHsoaW50KUtTX0RMLAkiXDAzM3xNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwKIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJXAxJWQ7JXAyJWRWIn0sCiMgICBlbmRpZgojICBlbHNlCiAgICB7KGludClLU19DUywJIlwwMzN8JWklZDslZHIifSwKIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJWQ7JWRWIn0sCiMgICBlbmRpZgojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzfEoifSwKICAgIHsoaW50KUtTX01FLAkiXDAzM3wwbSJ9LAkvKiBub3JtYWwgKi8KICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JleSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCiAgICB7KGludClLU19TRSwJIlwwMzN8MG0ifSwJLyogc3RhbmRvdXQgZW5kICovCiAgICB7KGludClLU19TTywJIlwwMzN8MzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCiAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljIG1vZGU6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KICAgIHsoaW50KUtTX0NaUiwJIlwwMzN8MG0ifSwJLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSBlbmQgKi8KICAgIHsoaW50KUtTX0NDTywJIjE2In0sCQkvKiBhbGxvdyAxNiBjb2xvcnMgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JXAxJWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzfCVwMSVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzfCVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzN8JWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJWQ7JWRIIn0sCiMgIGVuZGlmCiNpZmRlZiBESkdQUAogICAgeyhpbnQpS1NfVkIsCSJcMDMzfEIifSwJLyogdmlzdWFsIGJlbGwgKi8KI2VuZGlmCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAogICAge0tfU19SSUdIVCwJCSJcMzE2dCJ9LAogICAge0tfU19UQUIsCQkiXDMxNlwwMTcifSwKICAgIHtLX0YxLAkJIlwzMTY7In0sCiAgICB7S19GMiwJCSJcMzE2PCJ9LAogICAge0tfRjMsCQkiXDMxNj0ifSwKICAgIHtLX0Y0LAkJIlwzMTY+In0sCiAgICB7S19GNSwJCSJcMzE2PyJ9LAogICAge0tfRjYsCQkiXDMxNkAifSwKICAgIHtLX0Y3LAkJIlwzMTZBIn0sCiAgICB7S19GOCwJCSJcMzE2QiJ9LAogICAge0tfRjksCQkiXDMxNkMifSwKICAgIHtLX0YxMCwJCSJcMzE2RCJ9LAogICAge0tfRjExLAkJIlwzMTZcMjA1In0sCiAgICB7S19GMTIsCQkiXDMxNlwyMDYifSwKICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKICAgIHtLX1NfRjcsCQkiXDMxNloifSwKICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCiAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAogICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwKICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCiAgICB7S19JTlMsCQkiXDMxNlIifSwKICAgIHtLX0RFTCwJCSJcMzE2UyJ9LAogICAge0tfSE9NRSwJCSJcMzE2RyJ9LAogICAge0tfRU5ELAkJIlwzMTZPIn0sCiAgICB7S19QQUdFRE9XTiwJIlwzMTZRIn0sCiAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKICAgIHtLX0tQTFVTLAkJIlwzMTZOIn0sCiAgICB7S19LTUlOVVMsCQkiXDMxNkoifSwKICAgIHtLX0tNVUxUSVBMWSwJIlwzMTY3In0sCiAgICB7S19LMCwJCSJcMzE2XDMzMiJ9LAogICAge0tfSzEsCQkiXDMxNlwzMzYifSwKICAgIHtLX0syLAkJIlwzMTZcMzQyIn0sCiAgICB7S19LMywJCSJcMzE2XDM0NiJ9LAogICAge0tfSzQsCQkiXDMxNlwzNTIifSwKICAgIHtLX0s1LAkJIlwzMTZcMzU2In0sCiAgICB7S19LNiwJCSJcMzE2XDM2MiJ9LAogICAge0tfSzcsCQkiXDMxNlwzNjYifSwKICAgIHtLX0s4LAkJIlwzMTZcMzcyIn0sCiAgICB7S19LOSwJCSJcMzE2XDM3NiJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQovKgogKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgZm9yIHRoZSBXaW4zMiBDb25zb2xlIC4gIFRoZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aAogKiBFU0MgfCBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvbnNvbGUgY2FsbHMgaW4gb3Nfd2luMzIuYy4gIFRoZSBmdW5jdGlvbiBrZXlzCiAqIGFyZSBhbHNvIHRyYW5zbGF0ZWQgaW4gb3Nfd2luMzIuYy4KICovCiAgICB7KGludClLU19OQU1FLAkid2luMzIifSwKICAgIHsoaW50KUtTX0NFLAkiXDAzM3xLIn0sCS8qIGNsZWFyIHRvIGVuZCBvZiBsaW5lICovCiAgICB7KGludClLU19BTCwJIlwwMzN8TCJ9LAkvKiBhZGQgbmV3IGJsYW5rIGxpbmUgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIlwwMzN8JXAxJWRMIn0sCS8qIGFkZCBudW1iZXIgb2YgbmV3IGJsYW5rIGxpbmVzICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIlwwMzN8JWRMIn0sCS8qIGFkZCBudW1iZXIgb2YgbmV3IGJsYW5rIGxpbmVzICovCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAkvKiBkZWxldGUgbGluZSAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM3wlcDElZE0ifSwJLyogZGVsZXRlIG51bWJlciBvZiBsaW5lcyAqLwojICBlbHNlCiAgICB7KGludClLU19DREwsCSJcMDMzfCVkTSJ9LAkvKiBkZWxldGUgbnVtYmVyIG9mIGxpbmVzICovCiMgIGVuZGlmCiAgICB7KGludClLU19DTCwJIlwwMzN8SiJ9LAkvKiBjbGVhciBzY3JlZW4gKi8KICAgIHsoaW50KUtTX0NELAkiXDAzM3xqIn0sCS8qIGNsZWFyIHRvIGVuZCBvZiBkaXNwbGF5ICovCiAgICB7KGludClLU19WSSwJIlwwMzN8diJ9LAkvKiBjdXJzb3IgaW52aXNpYmxlICovCiAgICB7KGludClLU19WRSwJIlwwMzN8ViJ9LAkvKiBjdXJzb3IgdmlzaWJsZSAqLwoKICAgIHsoaW50KUtTX01FLAkiXDAzM3wwbSJ9LAkvKiBub3JtYWwgKi8KICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JheSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSBvbiBibGFjayAqLwojaWYgMQogICAgeyhpbnQpS1NfU08sCSJcMDMzfDMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzfDBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLwojZWxzZQogICAgeyhpbnQpS1NfU08sCSJcMDMzfEYifSwJLyogc3RhbmRvdXQ6IGhpZ2ggaW50ZW5zaXR5ICovCiAgICB7KGludClLU19TRSwJIlwwMzN8ZiJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KI2VuZGlmCiAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsCSJcMDMzfDBtIn0sCS8qIGl0YWxpYyBlbmQgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM3w2N20ifSwJLyogdW5kZXJzY29yZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgZW5kICovCiAgICB7KGludClLU19DQ08sCSIxNiJ9LAkJLyogYWxsb3cgMTYgY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlcDElZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVuZGlmCgogICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYXZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzN8JWklcDElZDslcDIlZEgifSwvKiBjdXJzb3IgbW90aW9uICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LC8qIGN1cnNvciBtb3Rpb24gKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCiAgICB7KGludClLU19USSwJIlwwMzN8UyJ9LAkvKiBwdXQgdGVybWluYWwgaW4gdGVybWNhcCBtb2RlICovCiAgICB7KGludClLU19URSwJIlwwMzN8RSJ9LAkvKiBvdXQgb2YgdGVybWNhcCBtb2RlICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwvKiBzY3JvbGwgcmVnaW9uICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVkOyVkciJ9LC8qIHNjcm9sbCByZWdpb24gKi8KIyAgZW5kaWYKCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfVVAsCQkiXDMxNlwzMDQifSwKICAgIHtLX1NfRE9XTiwJCSJcMzE2XDMxNyJ9LAogICAge0tfU19MRUZULAkJIlwzMTZcMzExIn0sCiAgICB7S19DX0xFRlQsCQkiXDMxNnMifSwKICAgIHtLX1NfUklHSFQsCQkiXDMxNlwzMTMifSwKICAgIHtLX0NfUklHSFQsCQkiXDMxNnQifSwKICAgIHtLX1NfVEFCLAkJIlwzMTZcMDE3In0sCiAgICB7S19GMSwJCSJcMzE2OyJ9LAogICAge0tfRjIsCQkiXDMxNjwifSwKICAgIHtLX0YzLAkJIlwzMTY9In0sCiAgICB7S19GNCwJCSJcMzE2PiJ9LAogICAge0tfRjUsCQkiXDMxNj8ifSwKICAgIHtLX0Y2LAkJIlwzMTZAIn0sCiAgICB7S19GNywJCSJcMzE2QSJ9LAogICAge0tfRjgsCQkiXDMxNkIifSwKICAgIHtLX0Y5LAkJIlwzMTZDIn0sCiAgICB7S19GMTAsCQkiXDMxNkQifSwKICAgIHtLX0YxMSwJCSJcMzE2XDIwNSJ9LAogICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCiAgICB7S19TX0YxLAkJIlwzMTZUIn0sCiAgICB7S19TX0YyLAkJIlwzMTZVIn0sCiAgICB7S19TX0YzLAkJIlwzMTZWIn0sCiAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCiAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCiAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCiAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCiAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCiAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAogICAge0tfU19GMTAsCQkiXDMxNl0ifSwKICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCiAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAogICAge0tfSU5TLAkJIlwzMTZSIn0sCiAgICB7S19ERUwsCQkiXDMxNlMifSwKICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKICAgIHtLX1NfSE9NRSwJCSJcMzE2XDMwMiJ9LAogICAge0tfQ19IT01FLAkJIlwzMTZ3In0sCiAgICB7S19FTkQsCQkiXDMxNk8ifSwKICAgIHtLX1NfRU5ELAkJIlwzMTZcMzE1In0sCiAgICB7S19DX0VORCwJCSJcMzE2dSJ9LAogICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAogICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiAgICB7S19LUExVUywJCSJcMzE2TiJ9LAogICAge0tfS01JTlVTLAkJIlwzMTZKIn0sCiAgICB7S19LTVVMVElQTFksCSJcMzE2XDA2NyJ9LAogICAge0tfSzAsCQkiXDMxNlwzMzIifSwKICAgIHtLX0sxLAkJIlwzMTZcMzM2In0sCiAgICB7S19LMiwJCSJcMzE2XDM0MiJ9LAogICAge0tfSzMsCQkiXDMxNlwzNDYifSwKICAgIHtLX0s0LAkJIlwzMTZcMzUyIn0sCiAgICB7S19LNSwJCSJcMzE2XDM1NiJ9LAogICAge0tfSzYsCQkiXDMxNlwzNjIifSwKICAgIHtLX0s3LAkJIlwzMTZcMzY2In0sCiAgICB7S19LOCwJCSJcMzE2XDM3MiJ9LAogICAge0tfSzksCQkiXDMxNlwzNzYifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogVlQzMjAgaXMgd29ya2luZyBhcyBhbiBBTlNJIHRlcm1pbmFsIGNvbXBhdGlibGUgREVDIHRlcm1pbmFsLgogKiAoaXQgY292ZXJzIFZUMXgwLCBWVDJ4MCBhbmQgVlQzeDAgdXAgdG8gVlQzMjAgb24gVk1TIGFzIHdlbGwpCiAqIE5vdGU6IEtfRjEuLi5LX0Y1IGFyZSBmb3IgaW50ZXJuYWwgdXNlLCBzaG91bGQgbm90IGJlIGRlZmluZWQuCiAqIFRPRE86LSByZXdyaXRlIEVTQ1sgY29kZXMgdG8gQ1NJCiAqICAgICAgLSBrZXlib2FyZCBsYW5ndWFnZXMgKENTSSA/IDI2IG4pCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJInZ0MzIwIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slZEwiLCBFU0NfU1RSICJbJWRMIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slZE0iLCBFU0NfU1RSICJbJWRNIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM1tKIiwgRVNDX1NUUiAiW0oiKX0sCiAgICB7KGludClLU19DQ08sCSI4In0sCQkJLyogYWxsb3cgOCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1swbSIsIEVTQ19TVFIgIlswbSIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKICAgIHsoaW50KUtTX01ELAlJRl9FQigiXDAzM1sxbSIsIEVTQ19TVFIgIlsxbSIpfSwgIC8qIGJvbGQgbW9kZSAqLwogICAgeyhpbnQpS1NfU0UsCUlGX0VCKCJcMDMzWzIybSIsIEVTQ19TVFIgIlsyMm0iKX0sLyogbm9ybWFsIG1vZGUgKi8KICAgIHsoaW50KUtTX1VFLAlJRl9FQigiXDAzM1syNG0iLCBFU0NfU1RSICJbMjRtIil9LC8qIGV4aXQgdW5kZXJzY29yZSBtb2RlICovCiAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzNbNG0iLCBFU0NfU1RSICJbNG0iKX0sICAvKiB1bmRlcnNjb3JlIG1vZGUgKi8KICAgIHsoaW50KUtTX0NaSCwJSUZfRUIoIlwwMzNbMzQ7NDNtIiwgRVNDX1NUUiAiWzM0OzQzbSIpfSwgIC8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsCUlGX0VCKCJcMDMzWzBtIiwgRVNDX1NUUiAiWzBtIil9LAkgICAgLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19DQUIsCUlGX0VCKCJcMDMzWzQlZG0iLCBFU0NfU1RSICJbNCVkbSIpfSwJICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAlJRl9FQigiXDAzM1szJWRtIiwgRVNDX1NUUiAiWzMlZG0iKX0sCSAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KICAgIHsoaW50KUtTX0NTQiwJSUZfRUIoIlwwMzNbMTAyOyVkbSIsIEVTQ19TVFIgIlsxMDI7JWRtIil9LAkvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NTRiwJSUZfRUIoIlwwMzNbMTAxOyVkbSIsIEVTQ19TVFIgIlsxMDE7JWRtIil9LAkvKiBzZXQgc2NyZWVuIGZvcmVncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojICBlbmRpZgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slcDElZEMiLCBFU0NfU1RSICJbJXAxJWRDIil9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVkQyIsIEVTQ19TVFIgIlslZEMiKX0sCiMgIGVuZGlmCiAgICB7S19VUCwJCUlGX0VCKCJcMDMzW0EiLCBFU0NfU1RSICJbQSIpfSwKICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM1tCIiwgRVNDX1NUUiAiW0IiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzW0MiLCBFU0NfU1RSICJbQyIpfSwKICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM1tEIiwgRVNDX1NUUiAiW0QiKX0sCiAgICB7S19GMSwJCUlGX0VCKCJcMDMzWzExfiIsIEVTQ19TVFIgIlsxMX4iKX0sCiAgICB7S19GMiwJCUlGX0VCKCJcMDMzWzEyfiIsIEVTQ19TVFIgIlsxMn4iKX0sCiAgICB7S19GMywJCUlGX0VCKCJcMDMzWzEzfiIsIEVTQ19TVFIgIlsxM34iKX0sCiAgICB7S19GNCwJCUlGX0VCKCJcMDMzWzE0fiIsIEVTQ19TVFIgIlsxNH4iKX0sCiAgICB7S19GNSwJCUlGX0VCKCJcMDMzWzE1fiIsIEVTQ19TVFIgIlsxNX4iKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3fiIsIEVTQ19TVFIgIlsxN34iKX0sCiAgICB7S19GNywJCUlGX0VCKCJcMDMzWzE4fiIsIEVTQ19TVFIgIlsxOH4iKX0sCiAgICB7S19GOCwJCUlGX0VCKCJcMDMzWzE5fiIsIEVTQ19TVFIgIlsxOX4iKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwfiIsIEVTQ19TVFIgIlsyMH4iKX0sCiAgICB7S19GMTAsCQlJRl9FQigiXDAzM1syMX4iLCBFU0NfU1RSICJbMjF+Iil9LAogICAge0tfRjExLAkJSUZfRUIoIlwwMzNbMjN+IiwgRVNDX1NUUiAiWzIzfiIpfSwKICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0fiIsIEVTQ19TVFIgIlsyNH4iKX0sCiAgICB7S19GMTMsCQlJRl9FQigiXDAzM1syNX4iLCBFU0NfU1RSICJbMjV+Iil9LAogICAge0tfRjE0LAkJSUZfRUIoIlwwMzNbMjZ+IiwgRVNDX1NUUiAiWzI2fiIpfSwKICAgIHtLX0YxNSwJCUlGX0VCKCJcMDMzWzI4fiIsIEVTQ19TVFIgIlsyOH4iKX0sCS8qIEhlbHAgKi8KICAgIHtLX0YxNiwJCUlGX0VCKCJcMDMzWzI5fiIsIEVTQ19TVFIgIlsyOX4iKX0sCS8qIFNlbGVjdCAqLwogICAge0tfRjE3LAkJSUZfRUIoIlwwMzNbMzF+IiwgRVNDX1NUUiAiWzMxfiIpfSwKICAgIHtLX0YxOCwJCUlGX0VCKCJcMDMzWzMyfiIsIEVTQ19TVFIgIlszMn4iKX0sCiAgICB7S19GMTksCQlJRl9FQigiXDAzM1szM34iLCBFU0NfU1RSICJbMzN+Iil9LAogICAge0tfRjIwLAkJSUZfRUIoIlwwMzNbMzR+IiwgRVNDX1NUUiAiWzM0fiIpfSwKICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzWzJ+IiwgRVNDX1NUUiAiWzJ+Iil9LAogICAge0tfREVMLAkJSUZfRUIoIlwwMzNbM34iLCBFU0NfU1RSICJbM34iKX0sCiAgICB7S19IT01FLAkJSUZfRUIoIlwwMzNbMX4iLCBFU0NfU1RSICJbMX4iKX0sCiAgICB7S19FTkQsCQlJRl9FQigiXDAzM1s0fiIsIEVTQ19TVFIgIls0fiIpfSwKICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzWzV+IiwgRVNDX1NUUiAiWzV+Iil9LAogICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzWzZ+IiwgRVNDX1NUUiAiWzZ+Iil9LAogICAge0tfS1BMVVMsCQlJRl9FQigiXDAzM09rIiwgRVNDX1NUUiAiT2siKX0sCS8qIGtleXBhZCBwbHVzICovCiAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM09tIiwgRVNDX1NUUiAiT20iKX0sCS8qIGtleXBhZCBtaW51cyAqLwogICAge0tfS0RJVklERSwJCUlGX0VCKCJcMDMzT28iLCBFU0NfU1RSICJPbyIpfSwJLyoga2V5cGFkIC8gKi8KICAgIHtLX0tNVUxUSVBMWSwJSUZfRUIoIlwwMzNPaiIsIEVTQ19TVFIgIk9qIil9LAkvKiBrZXlwYWQgKiAqLwogICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPTSIsIEVTQ19TVFIgIk9NIil9LAkvKiBrZXlwYWQgRW50ZXIgKi8KICAgIHtLX0JTLAkJIlx4N2YifSwJLyogZm9yIHNvbWUgcmVhc29uIDAxNzcgZG9lc24ndCB3b3JrICovCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX01JTlRfXykKLyoKICogT3JkaW5hcnkgdnQ1MgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJ2dDUyIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNLIiwgRVNDX1NUUiAiSyIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM0oiLCBFU0NfU1RSICJKIil9LAogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWSUrICUrICIsIEVTQ19TVFIgIlklKyAlKyAiKX0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIF9fTUlOVF9fCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNMIiwgRVNDX1NUUiAiTCIpfSwKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM00iLCBFU0NfU1RSICJNIil9LAogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzRSIsIEVTQ19TVFIgIkUiKX0sCiAgICB7KGludClLU19TUiwJSUZfRUIoIlwwMzNJIiwgRVNDX1NUUiAiSSIpfSwKICAgIHsoaW50KUtTX1ZFLAlJRl9FQigiXDAzM2UiLCBFU0NfU1RSICJlIil9LAogICAgeyhpbnQpS1NfVkksCUlGX0VCKCJcMDMzZiIsIEVTQ19TVFIgImYiKX0sCiAgICB7KGludClLU19TTywJSUZfRUIoIlwwMzNwIiwgRVNDX1NUUiAicCIpfSwKICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAogICAge0tfVVAsCQlJRl9FQigiXDAzM0EiLCBFU0NfU1RSICJBIil9LAogICAge0tfRE9XTiwJCUlGX0VCKCJcMDMzQiIsIEVTQ19TVFIgIkIiKX0sCiAgICB7S19MRUZULAkJSUZfRUIoIlwwMzNEIiwgRVNDX1NUUiAiRCIpfSwKICAgIHtLX1JJR0hULAkJSUZfRUIoIlwwMzNDIiwgRVNDX1NUUiAiQyIpfSwKICAgIHtLX1NfVVAsCQlJRl9FQigiXDAzM2EiLCBFU0NfU1RSICJhIil9LAogICAge0tfU19ET1dOLAkJSUZfRUIoIlwwMzNiIiwgRVNDX1NUUiAiYiIpfSwKICAgIHtLX1NfTEVGVCwJCUlGX0VCKCJcMDMzZCIsIEVTQ19TVFIgImQiKX0sCiAgICB7S19TX1JJR0hULAkJSUZfRUIoIlwwMzNjIiwgRVNDX1NUUiAiYyIpfSwKICAgIHtLX0YxLAkJSUZfRUIoIlwwMzNQIiwgRVNDX1NUUiAiUCIpfSwKICAgIHtLX0YyLAkJSUZfRUIoIlwwMzNRIiwgRVNDX1NUUiAiUSIpfSwKICAgIHtLX0YzLAkJSUZfRUIoIlwwMzNSIiwgRVNDX1NUUiAiUiIpfSwKICAgIHtLX0Y0LAkJSUZfRUIoIlwwMzNTIiwgRVNDX1NUUiAiUyIpfSwKICAgIHtLX0Y1LAkJSUZfRUIoIlwwMzNUIiwgRVNDX1NUUiAiVCIpfSwKICAgIHtLX0Y2LAkJSUZfRUIoIlwwMzNVIiwgRVNDX1NUUiAiVSIpfSwKICAgIHtLX0Y3LAkJSUZfRUIoIlwwMzNWIiwgRVNDX1NUUiAiViIpfSwKICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNXIiwgRVNDX1NUUiAiVyIpfSwKICAgIHtLX0Y5LAkJSUZfRUIoIlwwMzNYIiwgRVNDX1NUUiAiWCIpfSwKICAgIHtLX0YxMCwJCUlGX0VCKCJcMDMzWSIsIEVTQ19TVFIgIlkiKX0sCiAgICB7S19TX0YxLAkJSUZfRUIoIlwwMzNwIiwgRVNDX1NUUiAicCIpfSwKICAgIHtLX1NfRjIsCQlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAogICAge0tfU19GMywJCUlGX0VCKCJcMDMzciIsIEVTQ19TVFIgInIiKX0sCiAgICB7S19TX0Y0LAkJSUZfRUIoIlwwMzNzIiwgRVNDX1NUUiAicyIpfSwKICAgIHtLX1NfRjUsCQlJRl9FQigiXDAzM3QiLCBFU0NfU1RSICJ0Iil9LAogICAge0tfU19GNiwJCUlGX0VCKCJcMDMzdSIsIEVTQ19TVFIgInUiKX0sCiAgICB7S19TX0Y3LAkJSUZfRUIoIlwwMzN2IiwgRVNDX1NUUiAidiIpfSwKICAgIHtLX1NfRjgsCQlJRl9FQigiXDAzM3ciLCBFU0NfU1RSICJ3Iil9LAogICAge0tfU19GOSwJCUlGX0VCKCJcMDMzeCIsIEVTQ19TVFIgIngiKX0sCiAgICB7S19TX0YxMCwJCUlGX0VCKCJcMDMzeSIsIEVTQ19TVFIgInkiKX0sCiAgICB7S19JTlMsCQlJRl9FQigiXDAzM0kiLCBFU0NfU1RSICJJIil9LAogICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzRSIsIEVTQ19TVFIgIkUiKX0sCiAgICB7S19QQUdFRE9XTiwJSUZfRUIoIlwwMzNiIiwgRVNDX1NUUiAiYiIpfSwKICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzYSIsIEVTQ19TVFIgImEiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1QiLCBFU0NfU1RSICJUIil9LAogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzVSIsIEVTQ19TVFIgIlUiKX0sCiAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzNIXDAzM0oiLCBFU0NfU1RSICJIIiBFU0NfU1RSX25jICJKIil9LAogICAgeyhpbnQpS1NfTUUsCUlGX0VCKCJcMDMzU08iLCBFU0NfU1RSICJTTyIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1MyIiwgRVNDX1NUUiAiUzIiKX0sCiAgICB7KGludClLU19NUywJInkifSwKIyAgZW5kaWYKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoU09NRV9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCiAgICB7KGludClLU19OQU1FLAkieHRlcm0ifSwKICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM1tLIiwgRVNDX1NUUiAiW0siKX0sCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNbTCIsIEVTQ19TVFIgIltMIil9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slcDElZEwiLCBFU0NfU1RSICJbJXAxJWRMIil9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVkTCIsIEVTQ19TVFIgIlslZEwiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNbTSIsIEVTQ19TVFIgIltNIil9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slcDElZE0iLCBFU0NfU1RSICJbJXAxJWRNIil9LAojICBlbHNlCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVkTSIsIEVTQ19TVFIgIlslZE0iKX0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZHIiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkciIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzWyVpJWQ7JWRyIiwgRVNDX1NUUiAiWyVpJWQ7JWRyIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM1tKIiwgRVNDX1NUUiAiW0oiKX0sCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbbSIsIEVTQ19TVFIgIlttIil9LAogICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzWzdtIiwgRVNDX1NUUiAiWzdtIil9LAogICAgeyhpbnQpS1NfTUQsCUlGX0VCKCJcMDMzWzFtIiwgRVNDX1NUUiAiWzFtIil9LAogICAgeyhpbnQpS1NfVUUsCUlGX0VCKCJcMDMzW20iLCBFU0NfU1RSICJbbSIpfSwKICAgIHsoaW50KUtTX1VTLAlJRl9FQigiXDAzM1s0bSIsIEVTQ19TVFIgIls0bSIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCUlGX0VCKCJcMDMzTSIsIEVTQ19TVFIgIk0iKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJWRDIiwgRVNDX1NUUiAiWyVkQyIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0tTLAlJRl9FQigiXDAzM1s/MWhcMDMzPSIsIEVTQ19TVFIgIls/MWgiIEVTQ19TVFJfbmMgIj0iKX0sCiAgICB7KGludClLU19LRSwJSUZfRUIoIlwwMzNbPzFsXDAzMz4iLCBFU0NfU1RSICJbPzFsIiBFU0NfU1RSX25jICI+Iil9LAojICBpZmRlZiBGRUFUX1hURVJNX1NBVkUKICAgIHsoaW50KUtTX1RJLAlJRl9FQigiXDAzMzdcMDMzWz80N2giLCBFU0NfU1RSICI3IiBFU0NfU1RSX25jICJbPzQ3aCIpfSwKICAgIHsoaW50KUtTX1RFLAlJRl9FQigiXDAzM1sySlwwMzNbPzQ3bFwwMzM4IiwKCQkJCSAgRVNDX1NUUiAiWzJKIiBFU0NfU1RSX25jICJbPzQ3bCIgRVNDX1NUUl9uYyAiOCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NJUywJSUZfRUIoIlwwMzNdMTsiLCBFU0NfU1RSICJdMTsiKX0sCiAgICB7KGludClLU19DSUUsCSJcMDA3In0sCiAgICB7KGludClLU19UUywJSUZfRUIoIlwwMzNdMjsiLCBFU0NfU1RSICJdMjsiKX0sCiAgICB7KGludClLU19GUywJIlwwMDcifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NXUywJSUZfRUIoIlwwMzNbODslcDElZDslcDIlZHQiLAoJCQkJCQkgIEVTQ19TVFIgIls4OyVwMSVkOyVwMiVkdCIpfSwKICAgIHsoaW50KUtTX0NXUCwJSUZfRUIoIlwwMzNbMzslcDElZDslcDIlZHQiLAoJCQkJCQkgIEVTQ19TVFIgIlszOyVwMSVkOyVwMiVkdCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1dTLAlJRl9FQigiXDAzM1s4OyVkOyVkdCIsIEVTQ19TVFIgIls4OyVkOyVkdCIpfSwKICAgIHsoaW50KUtTX0NXUCwJSUZfRUIoIlwwMzNbMzslZDslZHQiLCBFU0NfU1RSICJbMzslZDslZHQiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19DUlYsCUlGX0VCKCJcMDMzWz5jIiwgRVNDX1NUUiAiWz5jIil9LAoKICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNPKkEiLCBFU0NfU1RSICJPKkEiKX0sCiAgICB7S19ET1dOLAkJSUZfRUIoIlwwMzNPKkIiLCBFU0NfU1RSICJPKkIiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzTypDIiwgRVNDX1NUUiAiTypDIil9LAogICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzTypEIiwgRVNDX1NUUiAiTypEIil9LAogICAgLyogQW4gZXh0cmEgc2V0IG9mIGN1cnNvciBrZXlzIGZvciB2dDEwMCBtb2RlICovCiAgICB7S19YVVAsCQlJRl9FQigiXDAzM1sxOypBIiwgRVNDX1NUUiAiWzE7KkEiKX0sCiAgICB7S19YRE9XTiwJCUlGX0VCKCJcMDMzWzE7KkIiLCBFU0NfU1RSICJbMTsqQiIpfSwKICAgIHtLX1hSSUdIVCwJCUlGX0VCKCJcMDMzWzE7KkMiLCBFU0NfU1RSICJbMTsqQyIpfSwKICAgIHtLX1hMRUZULAkJSUZfRUIoIlwwMzNbMTsqRCIsIEVTQ19TVFIgIlsxOypEIil9LAogICAgLyogQW4gZXh0cmEgc2V0IG9mIGZ1bmN0aW9uIGtleXMgZm9yIHZ0MTAwIG1vZGUgKi8KICAgIHtLX1hGMSwJCUlGX0VCKCJcMDMzTypQIiwgRVNDX1NUUiAiTypQIil9LAogICAge0tfWEYyLAkJSUZfRUIoIlwwMzNPKlEiLCBFU0NfU1RSICJPKlEiKX0sCiAgICB7S19YRjMsCQlJRl9FQigiXDAzM08qUiIsIEVTQ19TVFIgIk8qUiIpfSwKICAgIHtLX1hGNCwJCUlGX0VCKCJcMDMzTypTIiwgRVNDX1NUUiAiTypTIil9LAogICAge0tfRjEsCQlJRl9FQigiXDAzM1sxMTsqfiIsIEVTQ19TVFIgIlsxMTsqfiIpfSwKICAgIHtLX0YyLAkJSUZfRUIoIlwwMzNbMTI7Kn4iLCBFU0NfU1RSICJbMTI7Kn4iKX0sCiAgICB7S19GMywJCUlGX0VCKCJcMDMzWzEzOyp+IiwgRVNDX1NUUiAiWzEzOyp+Iil9LAogICAge0tfRjQsCQlJRl9FQigiXDAzM1sxNDsqfiIsIEVTQ19TVFIgIlsxNDsqfiIpfSwKICAgIHtLX0Y1LAkJSUZfRUIoIlwwMzNbMTU7Kn4iLCBFU0NfU1RSICJbMTU7Kn4iKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3Oyp+IiwgRVNDX1NUUiAiWzE3Oyp+Iil9LAogICAge0tfRjcsCQlJRl9FQigiXDAzM1sxODsqfiIsIEVTQ19TVFIgIlsxODsqfiIpfSwKICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNbMTk7Kn4iLCBFU0NfU1RSICJbMTk7Kn4iKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwOyp+IiwgRVNDX1NUUiAiWzIwOyp+Iil9LAogICAge0tfRjEwLAkJSUZfRUIoIlwwMzNbMjE7Kn4iLCBFU0NfU1RSICJbMjE7Kn4iKX0sCiAgICB7S19GMTEsCQlJRl9FQigiXDAzM1syMzsqfiIsIEVTQ19TVFIgIlsyMzsqfiIpfSwKICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0Oyp+IiwgRVNDX1NUUiAiWzI0Oyp+Iil9LAogICAge0tfU19UQUIsCQlJRl9FQigiXDAzM1taIiwgRVNDX1NUUiAiW1oiKX0sCiAgICB7S19IRUxQLAkJSUZfRUIoIlwwMzNbMjg7Kn4iLCBFU0NfU1RSICJbMjg7Kn4iKX0sCiAgICB7S19VTkRPLAkJSUZfRUIoIlwwMzNbMjY7Kn4iLCBFU0NfU1RSICJbMjY7Kn4iKX0sCiAgICB7S19JTlMsCQlJRl9FQigiXDAzM1syOyp+IiwgRVNDX1NUUiAiWzI7Kn4iKX0sCiAgICB7S19IT01FLAkJSUZfRUIoIlwwMzNbMTsqSCIsIEVTQ19TVFIgIlsxOypIIil9LAogICAgLyoge0tfU19IT01FLAkJSUZfRUIoIlwwMzNPMkgiLCBFU0NfU1RSICJPMkgiKX0sICovCiAgICAvKiB7S19DX0hPTUUsCQlJRl9FQigiXDAzM081SCIsIEVTQ19TVFIgIk81SCIpfSwgKi8KICAgIHtLX0tIT01FLAkJSUZfRUIoIlwwMzNbMTsqfiIsIEVTQ19TVFIgIlsxOyp+Iil9LAogICAge0tfWEhPTUUsCQlJRl9FQigiXDAzM08qSCIsIEVTQ19TVFIgIk8qSCIpfSwJLyogb3RoZXIgSG9tZSAqLwogICAge0tfWkhPTUUsCQlJRl9FQigiXDAzM1s3Oyp+IiwgRVNDX1NUUiAiWzc7Kn4iKX0sCS8qIG90aGVyIEhvbWUgKi8KICAgIHtLX0VORCwJCUlGX0VCKCJcMDMzWzE7KkYiLCBFU0NfU1RSICJbMTsqRiIpfSwKICAgIC8qIHtLX1NfRU5ELAkJSUZfRUIoIlwwMzNPMkYiLCBFU0NfU1RSICJPMkYiKX0sICovCiAgICAvKiB7S19DX0VORCwJCUlGX0VCKCJcMDMzTzVGIiwgRVNDX1NUUiAiTzVGIil9LCAqLwogICAge0tfS0VORCwJCUlGX0VCKCJcMDMzWzQ7Kn4iLCBFU0NfU1RSICJbNDsqfiIpfSwKICAgIHtLX1hFTkQsCQlJRl9FQigiXDAzM08qRiIsIEVTQ19TVFIgIk8qRiIpfSwJLyogb3RoZXIgRW5kICovCiAgICB7S19aRU5ELAkJSUZfRUIoIlwwMzNbODsqfiIsIEVTQ19TVFIgIls4Oyp+Iil9LAogICAge0tfUEFHRVVQLAkJSUZfRUIoIlwwMzNbNTsqfiIsIEVTQ19TVFIgIls1Oyp+Iil9LAogICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzWzY7Kn4iLCBFU0NfU1RSICJbNjsqfiIpfSwKICAgIHtLX0tQTFVTLAkJSUZfRUIoIlwwMzNPKmsiLCBFU0NfU1RSICJPKmsiKX0sCS8qIGtleXBhZCBwbHVzICovCiAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM08qbSIsIEVTQ19TVFIgIk8qbSIpfSwJLyoga2V5cGFkIG1pbnVzICovCiAgICB7S19LRElWSURFLAkJSUZfRUIoIlwwMzNPKm8iLCBFU0NfU1RSICJPKm8iKX0sCS8qIGtleXBhZCAvICovCiAgICB7S19LTVVMVElQTFksCUlGX0VCKCJcMDMzTypqIiwgRVNDX1NUUiAiTypqIil9LAkvKiBrZXlwYWQgKiAqLwogICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPKk0iLCBFU0NfU1RSICJPKk0iKX0sCS8qIGtleXBhZCBFbnRlciAqLwogICAge0tfS1BPSU5ULAkJSUZfRUIoIlwwMzNPKm4iLCBFU0NfU1RSICJPKm4iKX0sCS8qIGtleXBhZCAuICovCiAgICB7S19LREVMLAkJSUZfRUIoIlwwMzNbMzsqfiIsIEVTQ19TVFIgIlszOyp+Iil9LAkvKiBrZXlwYWQgRGVsICovCgogICAge0JUX0VYVFJBX0tFWVMsICAgIiJ9LAogICAge1RFUk1DQVAyS0VZKCdrJywgJzAnKSwgSUZfRUIoIlwwMzNbMTA7Kn4iLCBFU0NfU1RSICJbMTA7Kn4iKX0sIC8qIEYwICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnMycpLCBJRl9FQigiXDAzM1syNTsqfiIsIEVTQ19TVFIgIlsyNTsqfiIpfSwgLyogRjEzICovCiAgICAvKiBGMTQgYW5kIEYxNSBhcmUgbWlzc2luZywgYmVjYXVzZSB0aGV5IHNlbmQgdGhlIHNhbWUgY29kZXMgYXMgdGhlIHVuZG8KICAgICAqIGFuZCBoZWxwIGtleSwgYWx0aG91Z2ggdGhleSBkb24ndCB3b3JrIG9uIGFsbCBrZXlib2FyZHMuICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNicpLCBJRl9FQigiXDAzM1syOTsqfiIsIEVTQ19TVFIgIlsyOTsqfiIpfSwgLyogRjE2ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNycpLCBJRl9FQigiXDAzM1szMTsqfiIsIEVTQ19TVFIgIlszMTsqfiIpfSwgLyogRjE3ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOCcpLCBJRl9FQigiXDAzM1szMjsqfiIsIEVTQ19TVFIgIlszMjsqfiIpfSwgLyogRjE4ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOScpLCBJRl9FQigiXDAzM1szMzsqfiIsIEVTQ19TVFIgIlszMzsqfiIpfSwgLyogRjE5ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnQScpLCBJRl9FQigiXDAzM1szNDsqfiIsIEVTQ19TVFIgIlszNDsqfiIpfSwgLyogRjIwICovCgogICAge1RFUk1DQVAyS0VZKCdGJywgJ0InKSwgSUZfRUIoIlwwMzNbNDI7Kn4iLCBFU0NfU1RSICJbNDI7Kn4iKX0sIC8qIEYyMSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0MnKSwgSUZfRUIoIlwwMzNbNDM7Kn4iLCBFU0NfU1RSICJbNDM7Kn4iKX0sIC8qIEYyMiAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0QnKSwgSUZfRUIoIlwwMzNbNDQ7Kn4iLCBFU0NfU1RSICJbNDQ7Kn4iKX0sIC8qIEYyMyAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0UnKSwgSUZfRUIoIlwwMzNbNDU7Kn4iLCBFU0NfU1RSICJbNDU7Kn4iKX0sIC8qIEYyNCAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0YnKSwgSUZfRUIoIlwwMzNbNDY7Kn4iLCBFU0NfU1RSICJbNDY7Kn4iKX0sIC8qIEYyNSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0cnKSwgSUZfRUIoIlwwMzNbNDc7Kn4iLCBFU0NfU1RSICJbNDc7Kn4iKX0sIC8qIEYyNiAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0gnKSwgSUZfRUIoIlwwMzNbNDg7Kn4iLCBFU0NfU1RSICJbNDg7Kn4iKX0sIC8qIEYyNyAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0knKSwgSUZfRUIoIlwwMzNbNDk7Kn4iLCBFU0NfU1RSICJbNDk7Kn4iKX0sIC8qIEYyOCAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0onKSwgSUZfRUIoIlwwMzNbNTA7Kn4iLCBFU0NfU1RSICJbNTA7Kn4iKX0sIC8qIEYyOSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0snKSwgSUZfRUIoIlwwMzNbNTE7Kn4iLCBFU0NfU1RSICJbNTE7Kn4iKX0sIC8qIEYzMCAqLwoKICAgIHtURVJNQ0FQMktFWSgnRicsICdMJyksIElGX0VCKCJcMDMzWzUyOyp+IiwgRVNDX1NUUiAiWzUyOyp+Iil9LCAvKiBGMzEgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdNJyksIElGX0VCKCJcMDMzWzUzOyp+IiwgRVNDX1NUUiAiWzUzOyp+Iil9LCAvKiBGMzIgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdOJyksIElGX0VCKCJcMDMzWzU0Oyp+IiwgRVNDX1NUUiAiWzU0Oyp+Iil9LCAvKiBGMzMgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdPJyksIElGX0VCKCJcMDMzWzU1Oyp+IiwgRVNDX1NUUiAiWzU1Oyp+Iil9LCAvKiBGMzQgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdQJyksIElGX0VCKCJcMDMzWzU2Oyp+IiwgRVNDX1NUUiAiWzU2Oyp+Iil9LCAvKiBGMzUgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdRJyksIElGX0VCKCJcMDMzWzU3Oyp+IiwgRVNDX1NUUiAiWzU3Oyp+Iil9LCAvKiBGMzYgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdSJyksIElGX0VCKCJcMDMzWzU4Oyp+IiwgRVNDX1NUUiAiWzU4Oyp+Iil9LCAvKiBGMzcgKi8KIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCi8qCiAqIGlyaXMtYW5zaSBmb3IgU2lsaWNvbiBHcmFwaGljcyBtYWNoaW5lcy4KICovCiAgICB7KGludClLU19OQU1FLAkiaXJpcy1hbnNpIn0sCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCiMgIGVuZGlmCiNpZiAwCS8qIFRoZSBzY3JvbGwgcmVnaW9uIGlzIG5vdCB3b3JraW5nIGFzIFZpbSBleHBlY3RzLiAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM1slaSVkOyVkciJ9LAojICBlbmRpZgojZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAzM1tIXDAzM1sySiJ9LAogICAgeyhpbnQpS1NfVkUsCSJcMDMzWzkveVwwMzNbMTIveSJ9LAkvKiBUaGVzZSBhcmVuJ3QgZG9jdW1lbnRlZCAqLwogICAgeyhpbnQpS1NfVlMsCSJcMDMzWzEwL3lcMDMzWz0xaFwwMzNbPTJsIn0sIC8qIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkICovCiAgICB7KGludClLU19USSwJIlwwMzNbPTZoIn0sCiAgICB7KGludClLU19URSwJIlwwMzNbPTZsIn0sCiAgICB7KGludClLU19TRSwJIlwwMzNbMjE7MjdtIn0sCiAgICB7KGludClLU19TTywJIlwwMzNbMTs3bSJ9LAogICAgeyhpbnQpS1NfTUUsCSJcMDMzW20ifSwKICAgIHsoaW50KUtTX01SLAkiXDAzM1s3bSJ9LAogICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCiAgICB7KGludClLU19DQ08sCSI4In0sCQkJLyogYWxsb3cgOCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbM20ifSwJCS8qIGl0YWxpYyBtb2RlIG9uICovCiAgICB7KGludClLU19DWlIsCSJcMDMzWzIzbSJ9LAkJLyogaXRhbGljIG1vZGUgb2ZmICovCiAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwJCS8qIHVuZGVybGluZSBvbiAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzWzI0bSJ9LAkJLyogdW5kZXJsaW5lIG9mZiAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JXAxJWRtIn0sICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sICAgIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ1NCLAkiXDAzM1sxMDI7JXAxJWRtIn0sIC8qIHNldCBzY3JlZW4gYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ1NGLAkiXDAzM1sxMDE7JXAxJWRtIn0sIC8qIHNldCBzY3JlZW4gZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCSAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KICAgIHsoaW50KUtTX0NTQiwJIlwwMzNbMTAyOyVkbSJ9LCAgICAvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NTRiwJIlwwMzNbMTAxOyVkbSJ9LCAgICAvKiBzZXQgc2NyZWVuIGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogZ3Vlc3NlZCAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0lTLAkiXDAzM1AzLnkifSwKICAgIHsoaW50KUtTX0NJRSwJIlwyMzQifSwgICAgLyogU1QgIlN0cmluZyBUZXJtaW5hdG9yIiAqLwogICAgeyhpbnQpS1NfVFMsCSJcMDMzUDEueSJ9LAogICAgeyhpbnQpS1NfRlMsCSJcMjM0In0sICAgIC8qIFNUICJTdHJpbmcgVGVybWluYXRvciIgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NXUywJIlwwMzNbMjAzOyVwMSVkOyVwMiVkL3kifSwKICAgIHsoaW50KUtTX0NXUCwJIlwwMzNbMjA1OyVwMSVkOyVwMiVkL3kifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1dTLAkiXDAzM1syMDM7JWQ7JWQveSJ9LAogICAgeyhpbnQpS1NfQ1dQLAkiXDAzM1syMDU7JWQ7JWQveSJ9LAojICBlbmRpZgogICAge0tfVVAsCQkiXDAzM1tBIn0sCiAgICB7S19ET1dOLAkJIlwwMzNbQiJ9LAogICAge0tfTEVGVCwJCSJcMDMzW0QifSwKICAgIHtLX1JJR0hULAkJIlwwMzNbQyJ9LAogICAge0tfU19VUCwJCSJcMDMzWzE2MXEifSwKICAgIHtLX1NfRE9XTiwJCSJcMDMzWzE2NHEifSwKICAgIHtLX1NfTEVGVCwJCSJcMDMzWzE1OHEifSwKICAgIHtLX1NfUklHSFQsCQkiXDAzM1sxNjdxIn0sCiAgICB7S19GMSwJCSJcMDMzWzAwMXEifSwKICAgIHtLX0YyLAkJIlwwMzNbMDAycSJ9LAogICAge0tfRjMsCQkiXDAzM1swMDNxIn0sCiAgICB7S19GNCwJCSJcMDMzWzAwNHEifSwKICAgIHtLX0Y1LAkJIlwwMzNbMDA1cSJ9LAogICAge0tfRjYsCQkiXDAzM1swMDZxIn0sCiAgICB7S19GNywJCSJcMDMzWzAwN3EifSwKICAgIHtLX0Y4LAkJIlwwMzNbMDA4cSJ9LAogICAge0tfRjksCQkiXDAzM1swMDlxIn0sCiAgICB7S19GMTAsCQkiXDAzM1swMTBxIn0sCiAgICB7S19GMTEsCQkiXDAzM1swMTFxIn0sCiAgICB7S19GMTIsCQkiXDAzM1swMTJxIn0sCiAgICB7S19TX0YxLAkJIlwwMzNbMDEzcSJ9LAogICAge0tfU19GMiwJCSJcMDMzWzAxNHEifSwKICAgIHtLX1NfRjMsCQkiXDAzM1swMTVxIn0sCiAgICB7S19TX0Y0LAkJIlwwMzNbMDE2cSJ9LAogICAge0tfU19GNSwJCSJcMDMzWzAxN3EifSwKICAgIHtLX1NfRjYsCQkiXDAzM1swMThxIn0sCiAgICB7S19TX0Y3LAkJIlwwMzNbMDE5cSJ9LAogICAge0tfU19GOCwJCSJcMDMzWzAyMHEifSwKICAgIHtLX1NfRjksCQkiXDAzM1swMjFxIn0sCiAgICB7S19TX0YxMCwJCSJcMDMzWzAyMnEifSwKICAgIHtLX1NfRjExLAkJIlwwMzNbMDIzcSJ9LAogICAge0tfU19GMTIsCQkiXDAzM1swMjRxIn0sCiAgICB7S19JTlMsCQkiXDAzM1sxMzlxIn0sCiAgICB7S19IT01FLAkJIlwwMzNbSCJ9LAogICAge0tfRU5ELAkJIlwwMzNbMTQ2cSJ9LAogICAge0tfUEFHRVVQLAkJIlwwMzNbMTUwcSJ9LAogICAge0tfUEFHRURPV04sCSJcMDMzWzE1NHEifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBmb3IgZGVidWdnaW5nCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImRlYnVnIn0sCiAgICB7KGludClLU19DRSwJIltDRV0ifSwKICAgIHsoaW50KUtTX0NELAkiW0NEXSJ9LAogICAgeyhpbnQpS1NfQUwsCSJbQUxdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJbQ0FMJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIltDQUwlZF0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAkiW0RMXSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiW0NETCVwMSVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DREwsCSJbQ0RMJWRdIn0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlslcDElZENTJXAyJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiWyVkQ1MlZF0ifSwKIyAgZW5kaWYKIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKIyAgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DU1YsCSJbJXAxJWRDU1YlcDIlZF0ifSwKIyAgIGVsc2UKICAgIHsoaW50KUtTX0NTViwJIlslZENTViVkXSJ9LAojICAgZW5kaWYKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIltDQUIlcDElZF0ifSwKICAgIHsoaW50KUtTX0NBRiwJIltDQUYlcDElZF0ifSwKICAgIHsoaW50KUtTX0NTQiwJIltDU0IlcDElZF0ifSwKICAgIHsoaW50KUtTX0NTRiwJIltDU0YlcDElZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiW0NBQiVkXSJ9LAogICAgeyhpbnQpS1NfQ0FGLAkiW0NBRiVkXSJ9LAogICAgeyhpbnQpS1NfQ1NCLAkiW0NTQiVkXSJ9LAogICAgeyhpbnQpS1NfQ1NGLAkiW0NTRiVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfT1AsCSJbT1BdIn0sCiAgICB7KGludClLU19MRSwJIltMRV0ifSwKICAgIHsoaW50KUtTX0NMLAkiW0NMXSJ9LAogICAgeyhpbnQpS1NfVkksCSJbVkldIn0sCiAgICB7KGludClLU19WRSwJIltWRV0ifSwKICAgIHsoaW50KUtTX1ZTLAkiW1ZTXSJ9LAogICAgeyhpbnQpS1NfTUUsCSJbTUVdIn0sCiAgICB7KGludClLU19NUiwJIltNUl0ifSwKICAgIHsoaW50KUtTX01CLAkiW01CXSJ9LAogICAgeyhpbnQpS1NfTUQsCSJbTURdIn0sCiAgICB7KGludClLU19TRSwJIltTRV0ifSwKICAgIHsoaW50KUtTX1NPLAkiW1NPXSJ9LAogICAgeyhpbnQpS1NfVUUsCSJbVUVdIn0sCiAgICB7KGludClLU19VUywJIltVU10ifSwKICAgIHsoaW50KUtTX1VDRSwJIltVQ0VdIn0sCiAgICB7KGludClLU19VQ1MsCSJbVUNTXSJ9LAogICAgeyhpbnQpS1NfTVMsCSJbTVNdIn0sCiAgICB7KGludClLU19VVCwJIltVVF0ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiWyVwMSVkQ00lcDIlZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJbJWRDTSVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCSJbU1JdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJbQ1JJJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIltDUkklZF0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX1ZCLAkiW1ZCXSJ9LAogICAgeyhpbnQpS1NfS1MsCSJbS1NdIn0sCiAgICB7KGludClLU19LRSwJIltLRV0ifSwKICAgIHsoaW50KUtTX1RJLAkiW1RJXSJ9LAogICAgeyhpbnQpS1NfVEUsCSJbVEVdIn0sCiAgICB7KGludClLU19DSVMsCSJbQ0lTXSJ9LAogICAgeyhpbnQpS1NfQ0lFLAkiW0NJRV0ifSwKICAgIHsoaW50KUtTX1RTLAkiW1RTXSJ9LAogICAgeyhpbnQpS1NfRlMsCSJbRlNdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DV1MsCSJbJXAxJWRDV1MlcDIlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslcDElZENXUCVwMiVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DV1MsCSJbJWRDV1MlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslZENXUCVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ1JWLAkiW0NSVl0ifSwKICAgIHtLX1VQLAkJIltLVV0ifSwKICAgIHtLX0RPV04sCQkiW0tEXSJ9LAogICAge0tfTEVGVCwJCSJbS0xdIn0sCiAgICB7S19SSUdIVCwJCSJbS1JdIn0sCiAgICB7S19YVVAsCQkiW3hLVV0ifSwKICAgIHtLX1hET1dOLAkJIlt4S0RdIn0sCiAgICB7S19YTEVGVCwJCSJbeEtMXSJ9LAogICAge0tfWFJJR0hULAkJIlt4S1JdIn0sCiAgICB7S19TX1VQLAkJIltTLUtVXSJ9LAogICAge0tfU19ET1dOLAkJIltTLUtEXSJ9LAogICAge0tfU19MRUZULAkJIltTLUtMXSJ9LAogICAge0tfQ19MRUZULAkJIltDLUtMXSJ9LAogICAge0tfU19SSUdIVCwJCSJbUy1LUl0ifSwKICAgIHtLX0NfUklHSFQsCQkiW0MtS1JdIn0sCiAgICB7S19GMSwJCSJbRjFdIn0sCiAgICB7S19YRjEsCQkiW3hGMV0ifSwKICAgIHtLX0YyLAkJIltGMl0ifSwKICAgIHtLX1hGMiwJCSJbeEYyXSJ9LAogICAge0tfRjMsCQkiW0YzXSJ9LAogICAge0tfWEYzLAkJIlt4RjNdIn0sCiAgICB7S19GNCwJCSJbRjRdIn0sCiAgICB7S19YRjQsCQkiW3hGNF0ifSwKICAgIHtLX0Y1LAkJIltGNV0ifSwKICAgIHtLX0Y2LAkJIltGNl0ifSwKICAgIHtLX0Y3LAkJIltGN10ifSwKICAgIHtLX0Y4LAkJIltGOF0ifSwKICAgIHtLX0Y5LAkJIltGOV0ifSwKICAgIHtLX0YxMCwJCSJbRjEwXSJ9LAogICAge0tfRjExLAkJIltGMTFdIn0sCiAgICB7S19GMTIsCQkiW0YxMl0ifSwKICAgIHtLX1NfRjEsCQkiW1MtRjFdIn0sCiAgICB7S19TX1hGMSwJCSJbUy14RjFdIn0sCiAgICB7S19TX0YyLAkJIltTLUYyXSJ9LAogICAge0tfU19YRjIsCQkiW1MteEYyXSJ9LAogICAge0tfU19GMywJCSJbUy1GM10ifSwKICAgIHtLX1NfWEYzLAkJIltTLXhGM10ifSwKICAgIHtLX1NfRjQsCQkiW1MtRjRdIn0sCiAgICB7S19TX1hGNCwJCSJbUy14RjRdIn0sCiAgICB7S19TX0Y1LAkJIltTLUY1XSJ9LAogICAge0tfU19GNiwJCSJbUy1GNl0ifSwKICAgIHtLX1NfRjcsCQkiW1MtRjddIn0sCiAgICB7S19TX0Y4LAkJIltTLUY4XSJ9LAogICAge0tfU19GOSwJCSJbUy1GOV0ifSwKICAgIHtLX1NfRjEwLAkJIltTLUYxMF0ifSwKICAgIHtLX1NfRjExLAkJIltTLUYxMV0ifSwKICAgIHtLX1NfRjEyLAkJIltTLUYxMl0ifSwKICAgIHtLX0hFTFAsCQkiW0hFTFBdIn0sCiAgICB7S19VTkRPLAkJIltVTkRPXSJ9LAogICAge0tfQlMsCQkiW0JTXSJ9LAogICAge0tfSU5TLAkJIltJTlNdIn0sCiAgICB7S19LSU5TLAkJIltLSU5TXSJ9LAogICAge0tfREVMLAkJIltERUxdIn0sCiAgICB7S19LREVMLAkJIltLREVMXSJ9LAogICAge0tfSE9NRSwJCSJbSE9NRV0ifSwKICAgIHtLX1NfSE9NRSwJCSJbQy1IT01FXSJ9LAogICAge0tfQ19IT01FLAkJIltDLUhPTUVdIn0sCiAgICB7S19LSE9NRSwJCSJbS0hPTUVdIn0sCiAgICB7S19YSE9NRSwJCSJbWEhPTUVdIn0sCiAgICB7S19aSE9NRSwJCSJbWkhPTUVdIn0sCiAgICB7S19FTkQsCQkiW0VORF0ifSwKICAgIHtLX1NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0tFTkQsCQkiW0tFTkRdIn0sCiAgICB7S19YRU5ELAkJIltYRU5EXSJ9LAogICAge0tfWkVORCwJCSJbWkVORF0ifSwKICAgIHtLX1BBR0VVUCwJCSJbUEFHRVVQXSJ9LAogICAge0tfUEFHRURPV04sCSJbUEFHRURPV05dIn0sCiAgICB7S19LUEFHRVVQLAkJIltLUEFHRVVQXSJ9LAogICAge0tfS1BBR0VET1dOLAkiW0tQQUdFRE9XTl0ifSwKICAgIHtLX01PVVNFLAkJIltNT1VTRV0ifSwKICAgIHtLX0tQTFVTLAkJIltLUExVU10ifSwKICAgIHtLX0tNSU5VUywJCSJbS01JTlVTXSJ9LAogICAge0tfS0RJVklERSwJCSJbS0RJVklERV0ifSwKICAgIHtLX0tNVUxUSVBMWSwJIltLTVVMVElQTFldIn0sCiAgICB7S19LRU5URVIsCQkiW0tFTlRFUl0ifSwKICAgIHtLX0tQT0lOVCwJCSJbS1BPSU5UXSJ9LAogICAge0tfSzAsCQkiW0swXSJ9LAogICAge0tfSzEsCQkiW0sxXSJ9LAogICAge0tfSzIsCQkiW0syXSJ9LAogICAge0tfSzMsCQkiW0szXSJ9LAogICAge0tfSzQsCQkiW0s0XSJ9LAogICAge0tfSzUsCQkiW0s1XSJ9LAogICAge0tfSzYsCQkiW0s2XSJ9LAogICAge0tfSzcsCQkiW0s3XSJ9LAogICAge0tfSzgsCQkiW0s4XSJ9LAogICAge0tfSzksCQkiW0s5XSJ9LAojIGVuZGlmCgojZW5kaWYgLyogTk9fQlVJTFRJTl9UQ0FQUyAqLwoKLyoKICogVGhlIG1vc3QgbWluaW1hbCB0ZXJtaW5hbDogb25seSBjbGVhciBzY3JlZW4gYW5kIGN1cnNvciBwb3NpdGlvbmluZwogKiBBbHdheXMgaW5jbHVkZWQuCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImR1bWIifSwKICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAojaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsCgkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAojZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojZW5kaWYKCi8qCiAqIGVuZCBtYXJrZXIKICovCiAgICB7KGludClLU19OQU1FLAlOVUxMfQoKfTsJLyogZW5kIG9mIGJ1aWx0aW5fdGVybWNhcHMgKi8KCi8qCiAqIERFRkFVTFRfVEVSTSBpcyB1c2VkLCB3aGVuIG5vIHRlcm1pbmFsIGlzIHNwZWNpZmllZCB3aXRoIC1UIG9wdGlvbiBvciAkVEVSTS4KICovCiNpZmRlZiBSSVNDT1MKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikicmlzY29zIgojZW5kaWYKCiNpZmRlZiBBTUlHQQojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJhbWlnYSIKI2VuZGlmCgojaWZkZWYgTVNXSU4KIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikid2luMzIiCiNlbmRpZgoKI2lmZGVmIE1TRE9TCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInBjdGVybSIKI2VuZGlmCgojaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChfX01JTlRfXykKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikiYW5zaSIKI2VuZGlmCgojaWZkZWYgX19NSU5UX18KIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikidnQ1MiIKI2VuZGlmCgojaWZkZWYgX19FTVhfXwojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJvczJhbnNpIgojZW5kaWYKCiNpZmRlZiBWTVMKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikidnQzMjAiCiNlbmRpZgoKI2lmZGVmIF9fQkVPU19fCiMgdW5kZWYgREVGQVVMVF9URVJNCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImJlb3MtYW5zaSIKI2VuZGlmCgojaWZuZGVmIERFRkFVTFRfVEVSTQojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJkdW1iIgojZW5kaWYKCi8qCiAqIFRlcm1fc3RyaW5ncyBjb250YWlucyBjdXJyZW50bHkgdXNlZCB0ZXJtaW5hbCBvdXRwdXQgc3RyaW5ncy4KICogSXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgYnkgcGFyc2VfYnVpbHRpbl90Y2FwKCkuCiAqIFRoZSB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgYnkgc2V0dGluZyB0aGUgb3B0aW9uIHdpdGggdGhlIHNhbWUgbmFtZS4KICovCmNoYXJfdSAqKHRlcm1fc3RyaW5nc1soaW50KUtTX0xBU1QgKyAxXSk7CgpzdGF0aWMgaW50CW5lZWRfZ2F0aGVyID0gRkFMU0U7CSAgICAvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCnN0YXRpYyBjaGFyX3UJdGVybWxlYWRlclsyNTYgKyAxXTsJICAgIC8qIGZvciBjaGVja190ZXJtY29kZSgpICovCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQpzdGF0aWMgaW50CWNoZWNrX2Zvcl9jb2RlcyA9IEZBTFNFOyAgICAvKiBjaGVjayBmb3Iga2V5IGNvZGUgcmVzcG9uc2UgKi8KI2VuZGlmCgogICAgc3RhdGljIHN0cnVjdCBidWlsdGluX3Rlcm0gKgpmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKQogICAgY2hhcl91CSp0ZXJtOwp7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpwOwoKICAgIHAgPSBidWlsdGluX3Rlcm1jYXBzOwogICAgd2hpbGUgKHAtPmJ0X3N0cmluZyAhPSBOVUxMKQogICAgewoJaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTkFNRSkKCXsKI2lmZGVmIFVOSVgKCSAgICBpZiAoU1RSQ01QKHAtPmJ0X3N0cmluZywgImlyaXMtYW5zaSIpID09IDAgJiYgdmltX2lzX2lyaXModGVybSkpCgkJcmV0dXJuIHA7CgkgICAgZWxzZSBpZiAoU1RSQ01QKHAtPmJ0X3N0cmluZywgInh0ZXJtIikgPT0gMCAmJiB2aW1faXNfeHRlcm0odGVybSkpCgkJcmV0dXJuIHA7CgkgICAgZWxzZQojZW5kaWYKI2lmZGVmIFZNUwoJCWlmIChTVFJDTVAocC0+YnRfc3RyaW5nLCAidnQzMjAiKSA9PSAwICYmIHZpbV9pc192dDMwMCh0ZXJtKSkKCQkgICAgcmV0dXJuIHA7CgkJZWxzZQojZW5kaWYKCQkgIGlmIChTVFJDTVAodGVybSwgcC0+YnRfc3RyaW5nKSA9PSAwKQoJCSAgICByZXR1cm4gcDsKCX0KCSsrcDsKICAgIH0KICAgIHJldHVybiBwOwp9CgovKgogKiBQYXJzaW5nIG9mIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4KICogQ2FsbGVyIHNob3VsZCBjaGVjayBpZiAnbmFtZScgaXMgYSB2YWxpZCBidWlsdGluIHRlcm0uCiAqIFRoZSB0ZXJtaW5hbCdzIG5hbWUgaXMgbm90IHNldCwgYXMgdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGVybWNhcGluaXQoKS4KICovCiAgICBzdGF0aWMgdm9pZApwYXJzZV9idWlsdGluX3RjYXAodGVybSkKICAgIGNoYXJfdSAgKnRlcm07CnsKICAgIHN0cnVjdCBidWlsdGluX3Rlcm0JICAgICpwOwogICAgY2hhcl91CQkgICAgbmFtZVsyXTsKICAgIGludAkJCSAgICB0ZXJtXzhiaXQ7CgogICAgcCA9IGZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pOwogICAgdGVybV84Yml0ID0gdGVybV9pc184Yml0KHRlcm0pOwoKICAgIC8qIERvIG5vdCBwYXJzZSBpZiBidWlsdGluIHRlcm0gbm90IGZvdW5kICovCiAgICBpZiAocC0+YnRfc3RyaW5nID09IE5VTEwpCglyZXR1cm47CgogICAgZm9yICgrK3A7IHAtPmJ0X2VudHJ5ICE9IChpbnQpS1NfTkFNRSAmJiBwLT5idF9lbnRyeSAhPSBCVF9FWFRSQV9LRVlTOyArK3ApCiAgICB7CglpZiAoKGludClwLT5idF9lbnRyeSA+PSAwKQkvKiBLU194eCBlbnRyeSAqLwoJewoJICAgIC8qIE9ubHkgc2V0IHRoZSB2YWx1ZSBpZiBpdCB3YXNuJ3Qgc2V0IHlldC4gKi8KCSAgICBpZiAodGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSA9PSBOVUxMCgkJCQkgfHwgdGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSA9PSBlbXB0eV9vcHRpb24pCgkgICAgewoJCS8qIDhiaXQgdGVybWluYWw6IHVzZSBDU0kgaW5zdGVhZCBvZiA8RXNjPlsgKi8KCQlpZiAodGVybV84Yml0ICYmIHRlcm1fN3RvOGJpdCgoY2hhcl91ICopcC0+YnRfc3RyaW5nKSAhPSAwKQoJCXsKCQkgICAgY2hhcl91ICAqcywgKnQ7CgoJCSAgICBzID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKXAtPmJ0X3N0cmluZyk7CgkJICAgIGlmIChzICE9IE5VTEwpCgkJICAgIHsKCQkJZm9yICh0ID0gczsgKnQ7ICsrdCkKCQkJICAgIGlmICh0ZXJtXzd0bzhiaXQodCkpCgkJCSAgICB7CgkJCQkqdCA9IHRlcm1fN3RvOGJpdCh0KTsKCQkJCVNUUkNQWSh0ICsgMSwgdCArIDIpOwoJCQkgICAgfQoJCQl0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID0gczsKCQkJc2V0X3Rlcm1fb3B0aW9uX2FsbG9jZWQoJnRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0pOwoJCSAgICB9CgkJfQoJCWVsc2UKCQkgICAgdGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSA9IChjaGFyX3UgKilwLT5idF9zdHJpbmc7CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIG5hbWVbMF0gPSBLRVkyVEVSTUNBUDAoKGludClwLT5idF9lbnRyeSk7CgkgICAgbmFtZVsxXSA9IEtFWTJURVJNQ0FQMSgoaW50KXAtPmJ0X2VudHJ5KTsKCSAgICBpZiAoZmluZF90ZXJtY29kZShuYW1lKSA9PSBOVUxMKQoJCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopcC0+YnRfc3RyaW5nLCB0ZXJtXzhiaXQpOwoJfQogICAgfQp9CiNpZiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgfHwgZGVmaW5lZChGRUFUX1RFUk1SRVNQT05TRSkKc3RhdGljIHZvaWQgc2V0X2NvbG9yX2NvdW50IF9fQVJHUygoaW50IG5yKSk7CgovKgogKiBTZXQgbnVtYmVyIG9mIGNvbG9ycy4KICogU3RvcmUgaXQgYXMgYSBudW1iZXIgaW4gdF9jb2xvcnMuCiAqIFN0b3JlIGl0IGFzIGEgc3RyaW5nIGluIFRfQ0NPICh1c2luZyBucl9jb2xvcnNbXSkuCiAqLwogICAgc3RhdGljIHZvaWQKc2V0X2NvbG9yX2NvdW50KG5yKQogICAgaW50CQlucjsKewogICAgY2hhcl91CW5yX2NvbG9yc1syMF07CQkvKiBzdHJpbmcgZm9yIG51bWJlciBvZiBjb2xvcnMgKi8KCiAgICB0X2NvbG9ycyA9IG5yOwogICAgaWYgKHRfY29sb3JzID4gMSkKCXNwcmludGYoKGNoYXIgKilucl9jb2xvcnMsICIlZCIsIHRfY29sb3JzKTsKICAgIGVsc2UKCSpucl9jb2xvcnMgPSBOVUw7CiAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0X0NvIiwgLTEsIG5yX2NvbG9ycywgT1BUX0ZSRUUsIDApOwp9CiNlbmRpZgoKI2lmZGVmIEhBVkVfVEdFVEVOVApzdGF0aWMgY2hhciAqKGtleV9uYW1lc1tdKSA9CnsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCiAgICAvKiBEbyB0aGlzIG9uZSBmaXJzdCwgaXQgbWF5IGNhdXNlIGEgc2NyZWVuIHJlZHJhdy4gKi8KICAgICJDbyIsCiNlbmRpZgogICAgImt1IiwgImtkIiwgImtyIiwgImtsIiwKIyBpZmRlZiBBUkNISUUKICAgICJzdSIsICJzZCIsCQkvKiBUZXJtY2FwIGNvZGUgbWFkZSB1cCEgKi8KIyBlbmRpZgogICAgIiMyIiwgIiM0IiwgIiVpIiwgIio3IiwKICAgICJrMSIsICJrMiIsICJrMyIsICJrNCIsICJrNSIsICJrNiIsCiAgICAiazciLCAiazgiLCAiazkiLCAiazsiLCAiRjEiLCAiRjIiLAogICAgIiUxIiwgIiY4IiwgImtiIiwgImtJIiwgImtEIiwgImtoIiwKICAgICJANyIsICJrUCIsICJrTiIsICJLMSIsICJLMyIsICJLNCIsICJLNSIsICJrQiIsCiAgICBOVUxMCn07CiNlbmRpZgoKLyoKICogU2V0IHRlcm1pbmFsIG9wdGlvbnMgZm9yIHRlcm1pbmFsICJ0ZXJtIi4KICogUmV0dXJuIE9LIGlmIHRlcm1pbmFsICd0ZXJtJyB3YXMgZm91bmQgaW4gYSB0ZXJtY2FwLCBGQUlMIG90aGVyd2lzZS4KICoKICogV2hpbGUgZG9pbmcgdGhpcywgdW50aWwgdHRlc3QoKSwgc29tZSBvcHRpb25zIG1heSBiZSBOVUxMLCBiZSBjYXJlZnVsLgogKi8KICAgIGludApzZXRfdGVybW5hbWUodGVybSkKICAgIGNoYXJfdSAqdGVybTsKewogICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqdGVybXA7CiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIGludAkJYnVpbHRpbl9maXJzdCA9IHBfdGJpOwogICAgaW50CQl0cnk7CiAgICBpbnQJCXRlcm1jYXBfY2xlYXJlZCA9IEZBTFNFOwojZW5kaWYKICAgIGludAkJd2lkdGggPSAwLCBoZWlnaHQgPSAwOwogICAgY2hhcl91CSplcnJvcl9tc2cgPSBOVUxMOwogICAgY2hhcl91CSpic19wLCAqZGVsX3A7CgogICAgLyogSW4gc2lsZWN0IG1vZGUgKGV4IC1zKSB3ZSBkb24ndCB1c2UgdGhlICd0ZXJtJyBvcHRpb24uICovCiAgICBpZiAoc2lsZW50X21vZGUpCglyZXR1cm4gT0s7CgogICAgZGV0ZWN0ZWRfOGJpdCA9IEZBTFNFOwkJLyogcmVzZXQgOC1iaXQgZGV0ZWN0aW9uICovCgogICAgaWYgKHRlcm1faXNfYnVpbHRpbih0ZXJtKSkKICAgIHsKCXRlcm0gKz0gODsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJYnVpbHRpbl9maXJzdCA9IDE7CiNlbmRpZgogICAgfQoKLyoKICogSWYgSEFWRV9UR0VURU5UIGlzIG5vdCBkZWZpbmVkLCBvbmx5IHRoZSBidWlsdGluIHRlcm1jYXAgaXMgdXNlZCwgb3RoZXJ3aXNlOgogKiAgIElmIGJ1aWx0aW5fZmlyc3QgaXMgVFJVRToKICogICAgIDAuIHRyeSBidWlsdGluIHRlcm1jYXAKICogICAgIDEuIHRyeSBleHRlcm5hbCB0ZXJtY2FwCiAqICAgICAyLiBpZiBib3RoIGZhaWwgZGVmYXVsdCB0byBhIGJ1aWx0aW4gdGVybWluYWwKICogICBJZiBidWlsdGluX2ZpcnN0IGlzIEZBTFNFOgogKiAgICAgMS4gdHJ5IGV4dGVybmFsIHRlcm1jYXAKICogICAgIDIuIHRyeSBidWlsdGluIHRlcm1jYXAsIGlmIGJvdGggZmFpbCBkZWZhdWx0IHRvIGEgYnVpbHRpbiB0ZXJtaW5hbAogKi8KI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgZm9yICh0cnkgPSBidWlsdGluX2ZpcnN0ID8gMCA6IDE7IHRyeSA8IDM7ICsrdHJ5KQogICAgewoJLyoKCSAqIFVzZSBleHRlcm5hbCB0ZXJtY2FwCgkgKi8KCWlmICh0cnkgPT0gMSkKCXsKCSAgICBjaGFyX3UJICAgICpwOwoJICAgIHN0YXRpYyBjaGFyX3UgICB0c3RyYnVmW1RCVUZTWl07CgkgICAgaW50CQkgICAgaTsKCSAgICBjaGFyX3UJICAgIHRidWZbVEJVRlNaXTsKCSAgICBjaGFyX3UJICAgICp0cDsKCSAgICBzdGF0aWMgc3RydWN0IHsKCQkJICAgIGVudW0gU3BlY2lhbEtleSBkZXN0OyAvKiBpbmRleCBpbiB0ZXJtX3N0cmluZ3NbXSAqLwoJCQkgICAgY2hhciAqbmFtZTsJCSAgLyogdGVybWNhcCBuYW1lIGZvciBzdHJpbmcgKi8KCQkJICB9IHN0cmluZ19uYW1lc1tdID0KCQkJICAgIHsJe0tTX0NFLCAiY2UifSwge0tTX0FMLCAiYWwifSwge0tTX0NBTCwiQUwifSwKCQkJCXtLU19ETCwgImRsIn0sIHtLU19DREwsIkRMIn0sIHtLU19DUywgImNzIn0sCgkJCQl7S1NfQ0wsICJjbCJ9LCB7S1NfQ0QsICJjZCJ9LAoJCQkJe0tTX1ZJLCAidmkifSwge0tTX1ZFLCAidmUifSwge0tTX01CLCAibWIifSwKCQkJCXtLU19WUywgInZzIn0sIHtLU19NRSwgIm1lIn0sIHtLU19NUiwgIm1yIn0sCgkJCQl7S1NfTUQsICJtZCJ9LCB7S1NfU0UsICJzZSJ9LCB7S1NfU08sICJzbyJ9LAoJCQkJe0tTX0NaSCwiWkgifSwge0tTX0NaUiwiWlIifSwge0tTX1VFLCAidWUifSwKCQkJCXtLU19VUywgInVzIn0sIHtLU19VQ0UsICJDZSJ9LCB7S1NfVUNTLCAiQ3MifSwKCQkJCXtLU19DTSwgImNtIn0sIHtLU19TUiwgInNyIn0sCgkJCQl7S1NfQ1JJLCJSSSJ9LCB7S1NfVkIsICJ2YiJ9LCB7S1NfS1MsICJrcyJ9LAoJCQkJe0tTX0tFLCAia2UifSwge0tTX1RJLCAidGkifSwge0tTX1RFLCAidGUifSwKCQkJCXtLU19CQywgImJjIn0sIHtLU19DU0IsIlNiIn0sIHtLU19DU0YsIlNmIn0sCgkJCQl7S1NfQ0FCLCJBQiJ9LCB7S1NfQ0FGLCJBRiJ9LCB7S1NfTEUsICJsZSJ9LAoJCQkJe0tTX05ELCAibmQifSwge0tTX09QLCAib3AifSwge0tTX0NSViwgIlJWIn0sCgkJCQl7S1NfQ0lTLCAiSVMifSwge0tTX0NJRSwgIklFIn0sCgkJCQl7S1NfVFMsICJ0cyJ9LCB7S1NfRlMsICJmcyJ9LAoJCQkJe0tTX0NXUCwgIldQIn0sIHtLU19DV1MsICJXUyJ9LAoJCQkJe0tTX0NTSSwgIlNJIn0sIHtLU19DRUksICJFSSJ9LAoJCQkJeyhlbnVtIFNwZWNpYWxLZXkpMCwgTlVMTH0KCQkJICAgIH07CgoJICAgIC8qCgkgICAgICogSWYgdGhlIGV4dGVybmFsIHRlcm1jYXAgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIGVudHJ5LCB0cnkgdGhlCgkgICAgICogYnVpbHRpbiBvbmVzLgoJICAgICAqLwoJICAgIGlmICgoZXJyb3JfbXNnID0gdGdldGVudF9lcnJvcih0YnVmLCB0ZXJtKSkgPT0gTlVMTCkKCSAgICB7CgkJdHAgPSB0c3RyYnVmOwoJCWlmICghdGVybWNhcF9jbGVhcmVkKQoJCXsKCQkgICAgY2xlYXJfdGVybW9wdGlvbnMoKTsJLyogY2xlYXIgb2xkIG9wdGlvbnMgKi8KCQkgICAgdGVybWNhcF9jbGVhcmVkID0gVFJVRTsKCQl9CgoJICAgIC8qIGdldCBvdXRwdXQgc3RyaW5ncyAqLwoJCWZvciAoaSA9IDA7IHN0cmluZ19uYW1lc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKCQl7CgkJICAgIGlmICh0ZXJtX3N0cihzdHJpbmdfbmFtZXNbaV0uZGVzdCkgPT0gTlVMTAoJCQkgICAgfHwgdGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID09IGVtcHR5X29wdGlvbikKCQkJdGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID0KCQkJCQkgICBUR0VUU1RSKHN0cmluZ19uYW1lc1tpXS5uYW1lLCAmdHApOwoJCX0KCgkJLyogdGdldGZsYWcoKSByZXR1cm5zIDEgaWYgdGhlIGZsYWcgaXMgcHJlc2VudCwgMCBpZiBub3QgYW5kCgkJICogcG9zc2libHkgLTEgaWYgdGhlIGZsYWcgZG9lc24ndCBleGlzdC4gKi8KCQlpZiAoKFRfTVMgPT0gTlVMTCB8fCBUX01TID09IGVtcHR5X29wdGlvbikKCQkJCQkJCSYmIHRnZXRmbGFnKCJtcyIpID4gMCkKCQkgICAgVF9NUyA9IChjaGFyX3UgKikieSI7CgkJaWYgKChUX1hTID09IE5VTEwgfHwgVF9YUyA9PSBlbXB0eV9vcHRpb24pCgkJCQkJCQkmJiB0Z2V0ZmxhZygieHMiKSA+IDApCgkJICAgIFRfWFMgPSAoY2hhcl91ICopInkiOwoJCWlmICgoVF9EQiA9PSBOVUxMIHx8IFRfREIgPT0gZW1wdHlfb3B0aW9uKQoJCQkJCQkJJiYgdGdldGZsYWcoImRiIikgPiAwKQoJCSAgICBUX0RCID0gKGNoYXJfdSAqKSJ5IjsKCQlpZiAoKFRfREEgPT0gTlVMTCB8fCBUX0RBID09IGVtcHR5X29wdGlvbikKCQkJCQkJCSYmIHRnZXRmbGFnKCJkYSIpID4gMCkKCQkgICAgVF9EQSA9IChjaGFyX3UgKikieSI7CgkJaWYgKChUX1VUID09IE5VTEwgfHwgVF9VVCA9PSBlbXB0eV9vcHRpb24pCgkJCQkJCQkmJiB0Z2V0ZmxhZygidXQiKSA+IDApCgkJICAgIFRfVVQgPSAoY2hhcl91ICopInkiOwoKCgkJLyoKCQkgKiBnZXQga2V5IGNvZGVzCgkJICovCgkJZm9yIChpID0gMDsga2V5X25hbWVzW2ldICE9IE5VTEw7ICsraSkKCQl7CgkJICAgIGlmIChmaW5kX3Rlcm1jb2RlKChjaGFyX3UgKilrZXlfbmFtZXNbaV0pID09IE5VTEwpCgkJICAgIHsKCQkJcCA9IFRHRVRTVFIoa2V5X25hbWVzW2ldLCAmdHApOwoJCQkvKiBpZiBjdXJzb3ItbGVmdCA9PSBiYWNrc3BhY2UsIGlnbm9yZSBpdCAodGVsZXZpZGVvCgkJCSAqIDkyNSkgKi8KCQkJaWYgKHAgIT0gTlVMTAoJCQkJJiYgKCpwICE9IEN0cmxfSAoJCQkJICAgIHx8IGtleV9uYW1lc1tpXVswXSAhPSAnaycKCQkJCSAgICB8fCBrZXlfbmFtZXNbaV1bMV0gIT0gJ2wnKSkKCQkJICAgIGFkZF90ZXJtY29kZSgoY2hhcl91ICopa2V5X25hbWVzW2ldLCBwLCBGQUxTRSk7CgkJICAgIH0KCQl9CgoJCWlmIChoZWlnaHQgPT0gMCkKCQkgICAgaGVpZ2h0ID0gdGdldG51bSgibGkiKTsKCQlpZiAod2lkdGggPT0gMCkKCQkgICAgd2lkdGggPSB0Z2V0bnVtKCJjbyIpOwoKCQkvKgoJCSAqIEdldCBudW1iZXIgb2YgY29sb3JzIChpZiBub3QgZG9uZSBhbHJlYWR5KS4KCQkgKi8KCQlpZiAodGVybV9zdHIoS1NfQ0NPKSA9PSBOVUxMCgkJCXx8IHRlcm1fc3RyKEtTX0NDTykgPT0gZW1wdHlfb3B0aW9uKQoJCSAgICBzZXRfY29sb3JfY291bnQodGdldG51bSgiQ28iKSk7CgojIGlmbmRlZiBocHV4CgkJQkMgPSAoY2hhciAqKVRHRVRTVFIoImJjIiwgJnRwKTsKCQlVUCA9IChjaGFyICopVEdFVFNUUigidXAiLCAmdHApOwoJCXAgPSBUR0VUU1RSKCJwYyIsICZ0cCk7CgkJaWYgKHApCgkJICAgIFBDID0gKnA7CiMgZW5kaWYgLyogaHB1eCAqLwoJICAgIH0KCX0KCWVsc2UJICAgIC8qIHRyeSA9PSAwIHx8IHRyeSA9PSAyICovCiNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KCS8qCgkgKiBVc2UgYnVpbHRpbiB0ZXJtY2FwCgkgKi8KCXsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJICAgIC8qCgkgICAgICogSWYgYnVpbHRpbiB0ZXJtY2FwIHdhcyBhbHJlYWR5IHVzZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VhcmNoCgkgICAgICogZm9yIHRoZSBidWlsdGluIHRlcm1jYXAgYWdhaW4sIHF1aXQgbm93LgoJICAgICAqLwoJICAgIGlmICh0cnkgPT0gMiAmJiBidWlsdGluX2ZpcnN0ICYmIHRlcm1jYXBfY2xlYXJlZCkKCQlicmVhazsKI2VuZGlmCgkgICAgLyoKCSAgICAgKiBzZWFyY2ggZm9yICd0ZXJtJyBpbiBidWlsdGluX3Rlcm1jYXBzW10KCSAgICAgKi8KCSAgICB0ZXJtcCA9IGZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pOwoJICAgIGlmICh0ZXJtcC0+YnRfc3RyaW5nID09IE5VTEwpCS8qIGRpZCBub3QgZmluZCBpdCAqLwoJICAgIHsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJCS8qCgkJICogSWYgdHJ5ID09IDAsIGZpcnN0IHRyeSB0aGUgZXh0ZXJuYWwgdGVybWNhcC4gSWYgdGhhdCBpcyBub3QKCQkgKiBmb3VuZCB3ZSdsbCBnZXQgYmFjayBoZXJlIHdpdGggdHJ5ID09IDIuCgkJICogSWYgdGVybWNhcF9jbGVhcmVkIGlzIHNldCB3ZSB1c2VkIHRoZSBleHRlcm5hbCB0ZXJtY2FwLAoJCSAqIGRvbid0IGNvbXBsYWluIGFib3V0IG5vdCBmaW5kaW5nIHRoZSB0ZXJtIGluIHRoZSBidWlsdGluCgkJICogdGVybWNhcC4KCQkgKi8KCQlpZiAodHJ5ID09IDApCQkJLyogdHJ5IGV4dGVybmFsIG9uZSAqLwoJCSAgICBjb250aW51ZTsKCQlpZiAodGVybWNhcF9jbGVhcmVkKQkJLyogZm91bmQgaW4gZXh0ZXJuYWwgdGVybWNhcCAqLwoJCSAgICBicmVhazsKI2VuZGlmCgoJCW1jaF9lcnJtc2coIlxyXG4iKTsKCQlpZiAoZXJyb3JfbXNnICE9IE5VTEwpCgkJewoJCSAgICBtY2hfZXJybXNnKChjaGFyICopZXJyb3JfbXNnKTsKCQkgICAgbWNoX2Vycm1zZygiXHJcbiIpOwoJCX0KCQltY2hfZXJybXNnKCInIik7CgkJbWNoX2Vycm1zZygoY2hhciAqKXRlcm0pOwoJCW1jaF9lcnJtc2coXygiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IikpOwoJCW1jaF9lcnJtc2coIlxyXG4iKTsKCQlmb3IgKHRlcm1wID0gJihidWlsdGluX3Rlcm1jYXBzWzBdKTsgdGVybXAtPmJ0X3N0cmluZyAhPSBOVUxMOwoJCQkJCQkJCSAgICAgICsrdGVybXApCgkJewoJCSAgICBpZiAodGVybXAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTkFNRSkKCQkgICAgewojaWZkZWYgSEFWRV9UR0VURU5UCgkJCW1jaF9lcnJtc2coIiAgICBidWlsdGluXyIpOwojZWxzZQoJCQltY2hfZXJybXNnKCIgICAgIik7CiNlbmRpZgoJCQltY2hfZXJybXNnKHRlcm1wLT5idF9zdHJpbmcpOwoJCQltY2hfZXJybXNnKCJcclxuIik7CgkJICAgIH0KCQl9CgkJLyogd2hlbiB1c2VyIHR5cGVkIDpzZXQgdGVybT14eHgsIHF1aXQgaGVyZSAqLwoJCWlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4pCgkJewoJCSAgICBzY3JlZW5fc3RhcnQoKTsJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCgkJICAgIHdhaXRfcmV0dXJuKFRSVUUpOwoJCSAgICByZXR1cm4gRkFJTDsKCQl9CgkJdGVybSA9IERFRkFVTFRfVEVSTTsKCQltY2hfZXJybXNnKF8oImRlZmF1bHRpbmcgdG8gJyIpKTsKCQltY2hfZXJybXNnKChjaGFyICopdGVybSk7CgkJbWNoX2Vycm1zZygiJ1xyXG4iKTsKCQlpZiAoZW1zZ19zaWxlbnQgPT0gMCkKCQl7CgkJICAgIHNjcmVlbl9zdGFydCgpOwkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KCQkgICAgb3V0X2ZsdXNoKCk7CgkJICAgIHVpX2RlbGF5KDIwMDBMLCBUUlVFKTsKCQl9CgkJc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikidGVybSIsIC0xLCB0ZXJtLAoJCQkJCQkJCSBPUFRfRlJFRSwgMCk7CgkJZGlzcGxheV9lcnJvcnMoKTsKCSAgICB9CgkgICAgb3V0X2ZsdXNoKCk7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCSAgICBpZiAoIXRlcm1jYXBfY2xlYXJlZCkKCSAgICB7CiNlbmRpZgoJCWNsZWFyX3Rlcm1vcHRpb25zKCk7CSAgICAvKiBjbGVhciBvbGQgb3B0aW9ucyAqLwojaWZkZWYgSEFWRV9UR0VURU5UCgkJdGVybWNhcF9jbGVhcmVkID0gVFJVRTsKCSAgICB9CiNlbmRpZgoJICAgIHBhcnNlX2J1aWx0aW5fdGNhcCh0ZXJtKTsKI2lmZGVmIEZFQVRfR1VJCgkgICAgaWYgKHRlcm1faXNfZ3VpKHRlcm0pKQoJICAgIHsKCQlvdXRfZmx1c2goKTsKCQlndWlfaW5pdCgpOwoJCS8qIElmIHN0YXJ0aW5nIHRoZSBHVUkgZmFpbGVkLCBkb24ndCBkbyBhbnkgb2YgdGhlIG90aGVyCgkJICogdGhpbmdzIGZvciB0aGlzIHRlcm1pbmFsICovCgkJaWYgKCFndWkuaW5fdXNlKQoJCSAgICByZXR1cm4gRkFJTDsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJCWJyZWFrOwkJLyogZG9uJ3QgdHJ5IHVzaW5nIGV4dGVybmFsIHRlcm1jYXAgKi8KI2VuZGlmCgkgICAgfQojZW5kaWYgLyogRkVBVF9HVUkgKi8KCX0KI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgfQojZW5kaWYKCi8qCiAqIHNwZWNpYWw6IFRoZXJlIGlzIG5vIGluZm8gaW4gdGhlIHRlcm1jYXAgYWJvdXQgd2hldGhlciB0aGUgY3Vyc29yCiAqIHBvc2l0aW9uaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2NyZWVuIG9yIHRvIHRoZSBzdGFydCBvZiB0aGUKICogc2Nyb2xsaW5nIHJlZ2lvbi4gIFdlIGp1c3QgZ3Vlc3MgaGVyZS4gT25seSBtc2RvcyBwY3Rlcm0gaXMga25vd24gdG8gZG8gaXQKICogcmVsYXRpdmUuCiAqLwogICAgaWYgKFNUUkNNUCh0ZXJtLCAicGN0ZXJtIikgPT0gMCkKCVRfQ0NTID0gKGNoYXJfdSAqKSJ5ZXMiOwogICAgZWxzZQoJVF9DQ1MgPSBlbXB0eV9vcHRpb247CgojaWZkZWYgVU5JWAovKgogKiBBbnkgInN0dHkiIHNldHRpbmdzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvciB0X2tiIGZyb20gdGhlIHRlcm1jYXAuCiAqIFRoaXMgaXMgaW4gb3NfdW5peC5jLCBiZWNhdXNlIGl0IGRlcGVuZHMgYSBsb3Qgb24gdGhlIHZlcnNpb24gb2YgdW5peCB0aGF0CiAqIGlzIGJlaW5nIHVzZWQuCiAqIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgR1VJIGlzIGFjdGl2ZSwgaXQgdXNlcyAidF9rYiIgYW5kICJ0X2tEIiBkaXJlY3RseS4KICovCiNpZmRlZiBGRUFUX0dVSQogICAgaWYgKCFndWkuaW5fdXNlKQojZW5kaWYKCWdldF9zdHR5KCk7CiNlbmRpZgoKLyoKICogSWYgdGhlIHRlcm1jYXAgaGFzIG5vIGVudHJ5IGZvciAnYnMnIGFuZC9vciAnZGVsJyBhbmQgdGhlIGlvY3RsKCkgYWxzbwogKiBkaWRuJ3Qgd29yaywgdXNlIHRoZSBkZWZhdWx0IENUUkwtSAogKiBUaGUgZGVmYXVsdCBmb3IgdF9rRCBpcyBERUwsIHVubGVzcyB0X2tiIGlzIERFTC4KICogVGhlIHZpbV9zdHJzYXZlJ2Qgc3RyaW5ncyBhcmUgcHJvYmFibHkgbG9zdCBmb3JldmVyLCB3ZWxsIGl0J3Mgb25seSB0d28KICogYnl0ZXMuICBEb24ndCBkbyB0aGlzIHdoZW4gdGhlIEdVSSBpcyBhY3RpdmUsIGl0IHVzZXMgInRfa2IiIGFuZCAidF9rRCIKICogZGlyZWN0bHkuCiAqLwojaWZkZWYgRkVBVF9HVUkKICAgIGlmICghZ3VpLmluX3VzZSkKI2VuZGlmCiAgICB7Cglic19wID0gZmluZF90ZXJtY29kZSgoY2hhcl91ICopImtiIik7CglkZWxfcCA9IGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKSJrRCIpOwoJaWYgKGJzX3AgPT0gTlVMTCB8fCAqYnNfcCA9PSBOVUwpCgkgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKikia2IiLCAoYnNfcCA9IChjaGFyX3UgKilDVFJMX0hfU1RSKSwgRkFMU0UpOwoJaWYgKChkZWxfcCA9PSBOVUxMIHx8ICpkZWxfcCA9PSBOVUwpICYmCgkJCQkJICAgIChic19wID09IE5VTEwgfHwgKmJzX3AgIT0gREVMKSkKCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKSJrRCIsIChjaGFyX3UgKilERUxfU1RSLCBGQUxTRSk7CiAgICB9CgojaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKICAgIHRlcm1faXNfeHRlcm0gPSB2aW1faXNfeHRlcm0odGVybSk7CiNlbmRpZgoKI2lmZGVmIEZFQVRfTU9VU0UKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQojICBpZmRlZiBGRUFUX01PVVNFX1RUWQogICAgLyoKICAgICAqIEZvciBVbml4LCBzZXQgdGhlICd0dHltb3VzZScgb3B0aW9uIHRvIHRoZSB0eXBlIG9mIG1vdXNlIHRvIGJlIHVzZWQuCiAgICAgKiBUaGUgdGVybWNvZGUgZm9yIHRoZSBtb3VzZSBpcyBhZGRlZCBhcyBhIHNpZGUgZWZmZWN0IGluIG9wdGlvbi5jLgogICAgICovCiAgICB7CgljaGFyX3UJKnA7CgoJcCA9IChjaGFyX3UgKikiIjsKIyAgaWZkZWYgRkVBVF9NT1VTRV9YVEVSTQojICAgaWZkZWYgRkVBVF9DTElQQk9BUkQKIyAgICBpZmRlZiBGRUFUX0dVSQoJaWYgKCFndWkuaW5fdXNlKQojICAgIGVuZGlmCgkgICAgY2xpcF9pbml0KEZBTFNFKTsKIyAgIGVuZGlmCglpZiAodGVybV9pc194dGVybSkKCXsKCSAgICBpZiAodXNlX3h0ZXJtX21vdXNlKCkpCgkJcCA9IE5VTEw7CS8qIGtlZXAgZXhpc3RpbmcgdmFsdWUsIG1pZ2h0IGJlICJ4dGVybTIiICovCgkgICAgZWxzZQoJCXAgPSAoY2hhcl91ICopInh0ZXJtIjsKCX0KIyAgZW5kaWYKCWlmIChwICE9IE5VTEwpCgkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInR0eW0iLCAwTCwgcCwgMCk7CglpZiAocCA9PSBOVUxMCiMgICBpZmRlZiBGRUFUX0dVSQoJCXx8IGd1aS5pbl91c2UKIyAgIGVuZGlmCgkJKQoJICAgIGNoZWNrX21vdXNlX3Rlcm1jb2RlKCk7CS8qIHNldCBtb3VzZSB0ZXJtY29kZSBhbnl3YXkgKi8KICAgIH0KIyAgZW5kaWYKIyBlbHNlCiAgICBzZXRfbW91c2VfdGVybWNvZGUoS1NfTU9VU0UsIChjaGFyX3UgKikiXDIzM00iKTsKIyBlbmRpZgojZW5kaWYJLyogRkVBVF9NT1VTRSAqLwoKI2lmZGVmIEZFQVRfU05JRkYKICAgIHsKCWNoYXJfdQluYW1lWzJdOwoKCW5hbWVbMF0gPSAoaW50KUtTX0VYVFJBOwoJbmFtZVsxXSA9IChpbnQpS0VfU05JRkY7CglhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKSJcMjMzc25pZmYiLCBGQUxTRSk7CiAgICB9CiNlbmRpZgoKI2lmZGVmIFVTRV9URVJNX0NPTlNPTEUKICAgIC8qIERFRkFVTFRfVEVSTSBpbmRpY2F0ZXMgdGhhdCBpdCBpcyB0aGUgbWFjaGluZSBjb25zb2xlLiAqLwogICAgaWYgKFNUUkNNUCh0ZXJtLCBERUZBVUxUX1RFUk0pICE9IDApCgl0ZXJtX2NvbnNvbGUgPSBGQUxTRTsKICAgIGVsc2UKICAgIHsKCXRlcm1fY29uc29sZSA9IFRSVUU7CiMgaWZkZWYgQU1JR0EKCXdpbl9yZXNpemVfb24oKTsJLyogZW5hYmxlIHdpbmRvdyByZXNpemluZyByZXBvcnRzICovCiMgZW5kaWYKICAgIH0KI2VuZGlmCgojaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKICAgIC8qCiAgICAgKiAndHR5ZmFzdCcgaXMgZGVmYXVsdCBvbiBmb3IgeHRlcm0sIGlyaXMtYW5zaSBhbmQgYSBmZXcgb3RoZXJzLgogICAgICovCiAgICBpZiAodmltX2lzX2Zhc3R0ZXJtKHRlcm0pKQoJcF90ZiA9IFRSVUU7CiNlbmRpZgojaWZkZWYgVVNFX1RFUk1fQ09OU09MRQogICAgLyoKICAgICAqICd0dHlmYXN0JyBpcyBkZWZhdWx0IG9uIGNvbnNvbGVzCiAgICAgKi8KICAgIGlmICh0ZXJtX2NvbnNvbGUpCglwX3RmID0gVFJVRTsKI2VuZGlmCgogICAgdHRlc3QoVFJVRSk7CS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgc2V0IG9mIHRlcm1pbmFsIGNvZGVzICovCgogICAgZnVsbF9zY3JlZW4gPSBUUlVFOwkJLyogd2UgY2FuIHVzZSB0ZXJtY2FwIGNvZGVzIGZyb20gbm93IG9uICovCiAgICBzZXRfdGVybV9kZWZhdWx0cygpOwkvKiB1c2UgY3VycmVudCB2YWx1ZXMgYXMgZGVmYXVsdHMgKi8KI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCiAgICBjcnZfc3RhdHVzID0gQ1JWX0dFVDsJLyogR2V0IHRlcm1pbmFsIHZlcnNpb24gbGF0ZXIgKi8KI2VuZGlmCgogICAgLyoKICAgICAqIEluaXRpYWxpemUgdGhlIHRlcm1pbmFsIHdpdGggdGhlIGFwcHJvcHJpYXRlIHRlcm1jYXAgY29kZXMuCiAgICAgKiBTZXQgdGhlIG1vdXNlIGFuZCB3aW5kb3cgdGl0bGUgaWYgcG9zc2libGUuCiAgICAgKiBEb24ndCBkbyB0aGlzIHdoZW4gc3RhcnRpbmcsIG5lZWQgdG8gcGFyc2UgdGhlIC52aW1yYyBmaXJzdCwgYmVjYXVzZSBpdAogICAgICogbWF5IHJlZGVmaW5lIHRfVEkgZXRjLgogICAgICovCiAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQogICAgewoJc3RhcnR0ZXJtY2FwKCk7CQkvKiBtYXkgY2hhbmdlIHRlcm1pbmFsIG1vZGUgKi8KI2lmZGVmIEZFQVRfTU9VU0UKCXNldG1vdXNlKCk7CQkvKiBtYXkgc3RhcnQgdXNpbmcgdGhlIG1vdXNlICovCiNlbmRpZgojaWZkZWYgRkVBVF9USVRMRQoJbWFrZXRpdGxlKCk7CQkvKiBtYXkgZGlzcGxheSB3aW5kb3cgdGl0bGUgKi8KI2VuZGlmCiAgICB9CgoJLyogZGlzcGxheSBpbml0aWFsIHNjcmVlbiBhZnRlciB0dGVzdCgpIGNoZWNraW5nLiBqdy4gKi8KICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKQogICAgewoJLyogdGVybWNhcCBmYWlsZWQgdG8gcmVwb3J0IHNpemUgKi8KCS8qIHNldCBkZWZhdWx0cywgaW4gY2FzZSB1aV9nZXRfc2hlbGxzaXplKCkgYWxzbyBmYWlscyAqLwoJd2lkdGggPSA4MDsKI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKCWhlaWdodCA9IDI1OwkgICAgLyogY29uc29sZSBpcyBvZnRlbiAyNSBsaW5lcyAqLwojZWxzZQoJaGVpZ2h0ID0gMjQ7CSAgICAvKiBtb3N0IHRlcm1pbmFscyBhcmUgMjQgbGluZXMgKi8KI2VuZGlmCiAgICB9CiAgICBzZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIEZBTFNFKTsJLyogbWF5IGNoYW5nZSBSb3dzICovCiAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQogICAgewoJaWYgKHNjcm9sbF9yZWdpb24pCgkgICAgc2Nyb2xsX3JlZ2lvbl9yZXNldCgpOwkJLyogSW4gY2FzZSBSb3dzIGNoYW5nZWQgKi8KCWNoZWNrX21hcF9rZXljb2RlcygpOwkvKiBjaGVjayBtYXBwaW5ncyBmb3IgdGVybWluYWwgY29kZXMgdXNlZCAqLwoKI2lmZGVmIEZFQVRfQVVUT0NNRAoJewoJICAgIGJ1Zl9UCSpvbGRfY3VyYnVmOwoKCSAgICAvKgoJICAgICAqIEV4ZWN1dGUgdGhlIFRlcm1DaGFuZ2VkIGF1dG9jb21tYW5kcyBmb3IgZWFjaCBidWZmZXIgdGhhdCBpcwoJICAgICAqIGxvYWRlZC4KCSAgICAgKi8KCSAgICBvbGRfY3VyYnVmID0gY3VyYnVmOwoJICAgIGZvciAoY3VyYnVmID0gZmlyc3RidWY7IGN1cmJ1ZiAhPSBOVUxMOyBjdXJidWYgPSBjdXJidWYtPmJfbmV4dCkKCSAgICB7CgkJaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgIT0gTlVMTCkKCQkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfVEVSTUNIQU5HRUQsIE5VTEwsIE5VTEwsIEZBTFNFLAoJCQkJCQkJCSAgICAgIGN1cmJ1Zik7CgkgICAgfQoJICAgIGlmIChidWZfdmFsaWQob2xkX2N1cmJ1ZikpCgkJY3VyYnVmID0gb2xkX2N1cmJ1ZjsKCX0KI2VuZGlmCiAgICB9CgojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKICAgIG1heV9yZXFfdGVybXJlc3BvbnNlKCk7CiNlbmRpZgoKICAgIHJldHVybiBPSzsKfQoKI2lmIGRlZmluZWQoRkVBVF9NT1VTRSkgfHwgZGVmaW5lZChQUk9UTykKCiMgaWZkZWYgRkVBVF9NT1VTRV9UVFkKIyAgZGVmaW5lIEhNVF9OT1JNQUwJMQojICBkZWZpbmUgSE1UX05FVFRFUk0JMgojICBkZWZpbmUgSE1UX0RFQwk0CiMgIGRlZmluZSBITVRfSlNCVEVSTQk4CiMgIGRlZmluZSBITVRfUFRFUk0JMTYKc3RhdGljIGludCBoYXNfbW91c2VfdGVybWNvZGUgPSAwOwojIGVuZGlmCgojIGlmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9ORVQpIFwKCXx8IGRlZmluZWQoRkVBVF9NT1VTRV9ERUMpKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfSlNCKSBcCgl8fCBkZWZpbmVkKEZFQVRfTU9VU0VfUFRFUk0pIHx8IGRlZmluZWQoUFJPVE8pCiAgICB2b2lkCnNldF9tb3VzZV90ZXJtY29kZShuLCBzKQogICAgaW50CQluOwkvKiBLU19NT1VTRSwgS1NfTkVUVEVSTV9NT1VTRSBvciBLU19ERUNfTU9VU0UgKi8KICAgIGNoYXJfdQkqczsKewogICAgY2hhcl91CW5hbWVbMl07CgogICAgbmFtZVswXSA9IG47CiAgICBuYW1lWzFdID0gS0VfRklMTEVSOwogICAgYWRkX3Rlcm1jb2RlKG5hbWUsIHMsIEZBTFNFKTsKIyAgaWZkZWYgRkVBVF9NT1VTRV9UVFkKIyAgIGlmZGVmIEZFQVRfTU9VU0VfSlNCCiAgICBpZiAobiA9PSBLU19KU0JURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9KU0JURVJNOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfTkVUCiAgICBpZiAobiA9PSBLU19ORVRURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9ORVRURVJNOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfREVDCiAgICBpZiAobiA9PSBLU19ERUNfTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX0RFQzsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX1BURVJNCiAgICBpZiAobiA9PSBLU19QVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfUFRFUk07CiAgICBlbHNlCiMgICBlbmRpZgoJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9OT1JNQUw7CiMgIGVuZGlmCn0KIyBlbmRpZgoKIyBpZiAoKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoT1MyKSkgXAoJJiYgKGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0RFQykgXAoJICAgIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9HUE0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9QVEVSTSkpKSBcCgkgICAgfHwgZGVmaW5lZChQUk9UTykKICAgIHZvaWQKZGVsX21vdXNlX3Rlcm1jb2RlKG4pCiAgICBpbnQJCW47CS8qIEtTX01PVVNFLCBLU19ORVRURVJNX01PVVNFIG9yIEtTX0RFQ19NT1VTRSAqLwp7CiAgICBjaGFyX3UJbmFtZVsyXTsKCiAgICBuYW1lWzBdID0gbjsKICAgIG5hbWVbMV0gPSBLRV9GSUxMRVI7CiAgICBkZWxfdGVybWNvZGUobmFtZSk7CiMgIGlmZGVmIEZFQVRfTU9VU0VfVFRZCiMgICBpZmRlZiBGRUFUX01PVVNFX0pTQgogICAgaWYgKG4gPT0gS1NfSlNCVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX0pTQlRFUk07CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9ORVQKICAgIGlmIChuID09IEtTX05FVFRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9ORVRURVJNOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfREVDCiAgICBpZiAobiA9PSBLU19ERUNfTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9ERUM7CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQogICAgaWYgKG4gPT0gS1NfUFRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9QVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCgloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9OT1JNQUw7CiMgIGVuZGlmCn0KIyBlbmRpZgojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKLyoKICogQ2FsbCB0Z2V0ZW50KCkKICogUmV0dXJuIGVycm9yIG1lc3NhZ2UgaWYgaXQgZmFpbHMsIE5VTEwgaWYgaXQncyBPSy4KICovCiAgICBzdGF0aWMgY2hhcl91ICoKdGdldGVudF9lcnJvcih0YnVmLCB0ZXJtKQogICAgY2hhcl91ICAqdGJ1ZjsKICAgIGNoYXJfdSAgKnRlcm07CnsKICAgIGludAkgICAgaTsKCiAgICBpID0gVEdFVEVOVCh0YnVmLCB0ZXJtKTsKICAgIGlmIChpIDwgMAkJICAgIC8qIC0xIGlzIGFsd2F5cyBhbiBlcnJvciAqLwojIGlmZGVmIFRHRVRFTlRfWkVST19FUlIKCSAgICB8fCBpID09IDAJICAgIC8qIHNvbWV0aW1lcyB6ZXJvIGlzIGFsc28gYW4gZXJyb3IgKi8KIyBlbmRpZgogICAgICAgKQogICAgewoJLyogT24gRnJlZUJTRCB0cHV0cygpIGdldHMgYSBTRUdWIGFmdGVyIGEgdGdldGVudCgpIHdoaWNoIGZhaWxzLiAgQ2FsbAoJICogdGdldGVudCgpIHdpdGggdGhlIGFsd2F5cyBleGlzdGluZyAiZHVtYiIgZW50cnkgdG8gYXZvaWQgYSBjcmFzaCBvcgoJICogaGFuZy4gKi8KCSh2b2lkKVRHRVRFTlQodGJ1ZiwgImR1bWIiKTsKCglpZiAoaSA8IDApCiMgaWZkZWYgVEdFVEVOVF9aRVJPX0VSUgoJICAgIHJldHVybiAoY2hhcl91ICopXygiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIik7CglpZiAoaSA9PSAwKQojIGVuZGlmCiNpZmRlZiBURVJNSU5GTwoJICAgIHJldHVybiAoY2hhcl91ICopXygiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIik7CiNlbHNlCgkgICAgcmV0dXJuIChjaGFyX3UgKilfKCJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIpOwojZW5kaWYKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBTb21lIHZlcnNpb25zIG9mIHRnZXRzdHIoKSBoYXZlIGJlZW4gcmVwb3J0ZWQgdG8gcmV0dXJuIC0xIGluc3RlYWQgb2YgTlVMTC4KICogRml4IHRoYXQgaGVyZS4KICovCiAgICBzdGF0aWMgY2hhcl91ICoKdmltX3RnZXRzdHIocywgcHApCiAgICBjaGFyCSpzOwogICAgY2hhcl91CSoqcHA7CnsKICAgIGNoYXIJKnA7CgogICAgcCA9IHRnZXRzdHIocywgKGNoYXIgKiopcHApOwogICAgaWYgKHAgPT0gKGNoYXIgKiktMSkKCXAgPSBOVUxMOwogICAgcmV0dXJuIChjaGFyX3UgKilwOwp9CiNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KCiNpZiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgJiYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChNQUNPU19YKSkKLyoKICogR2V0IENvbHVtbnMgYW5kIFJvd3MgZnJvbSB0aGUgdGVybWNhcC4gVXNlZCBhZnRlciBhIHdpbmRvdyBzaWduYWwgaWYgdGhlCiAqIGlvY3RsKCkgZmFpbHMuIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBjYWxsIHRnZXRlbnQgZWFjaCB0aW1lIGlmIHRoZSAiY28iCiAqIGFuZCAibGkiIGVudHJpZXMgbmV2ZXIgY2hhbmdlLiBCdXQgb24gc29tZSBzeXN0ZW1zIHRoaXMgd29ya3MuCiAqIEVycm9ycyB3aGlsZSBnZXR0aW5nIHRoZSBlbnRyaWVzIGFyZSBpZ25vcmVkLgogKi8KICAgIHZvaWQKZ2V0bGluZWNvbChjcCwgcnApCiAgICBsb25nCSpjcDsJLyogcG9pbnRlciB0byBjb2x1bW5zICovCiAgICBsb25nCSpycDsJLyogcG9pbnRlciB0byByb3dzICovCnsKICAgIGNoYXJfdQl0YnVmW1RCVUZTWl07CgogICAgaWYgKFRfTkFNRSAhPSBOVUxMICYmICpUX05BTUUgIT0gTlVMICYmIHRnZXRlbnRfZXJyb3IodGJ1ZiwgVF9OQU1FKSA9PSBOVUxMKQogICAgewoJaWYgKCpjcCA9PSAwKQoJICAgICpjcCA9IHRnZXRudW0oImNvIik7CglpZiAoKnJwID09IDApCgkgICAgKnJwID0gdGdldG51bSgibGkiKTsKICAgIH0KfQojZW5kaWYgLyogZGVmaW5lZChIQVZFX1RHRVRFTlQpICYmIGRlZmluZWQoVU5JWCkgKi8KCi8qCiAqIEdldCBhIHN0cmluZyBlbnRyeSBmcm9tIHRoZSB0ZXJtY2FwIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgdGVybWNvZGVzLgogKiBVc2VkIGZvciA8dF94eD4gc3BlY2lhbCBrZXlzLgogKiBHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUgd2hlbiBub3Qgc291cmNpbmcuCiAqIElmIGZvcmNlIGdpdmVuLCByZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5LgogKiBSZXR1cm4gRkFJTCBpZiB0aGUgZW50cnkgd2FzIG5vdCBmb3VuZCwgT0sgaWYgdGhlIGVudHJ5IHdhcyBhZGRlZC4KICovCiAgICBpbnQKYWRkX3Rlcm1jYXBfZW50cnkobmFtZSwgZm9yY2UpCiAgICBjaGFyX3UgICpuYW1lOwogICAgaW50CSAgICBmb3JjZTsKewogICAgY2hhcl91ICAqdGVybTsKICAgIGludAkgICAga2V5OwogICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqdGVybXA7CiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIGNoYXJfdSAgKnN0cmluZzsKICAgIGludAkgICAgaTsKICAgIGludAkgICAgYnVpbHRpbl9maXJzdDsKICAgIGNoYXJfdSAgdGJ1ZltUQlVGU1pdOwogICAgY2hhcl91ICB0c3RyYnVmW1RCVUZTWl07CiAgICBjaGFyX3UgICp0cCA9IHRzdHJidWY7CiAgICBjaGFyX3UgICplcnJvcl9tc2cgPSBOVUxMOwojZW5kaWYKCi8qCiAqIElmIHRoZSBHVUkgaXMgcnVubmluZyBvciB3aWxsIHN0YXJ0IGluIGEgbW9tZW50LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGtleXMKICogdGhhdCB0aGUgR1VJIGNhbiBwcm9kdWNlLgogKi8KI2lmZGVmIEZFQVRfR1VJCiAgICBpZiAoZ3VpLmluX3VzZSB8fCBndWkuc3RhcnRpbmcpCglyZXR1cm4gZ3VpX21jaF9oYXNrZXkobmFtZSk7CiNlbmRpZgoKICAgIGlmICghZm9yY2UgJiYgZmluZF90ZXJtY29kZShuYW1lKSAhPSBOVUxMKQkgICAgLyogaXQncyBhbHJlYWR5IHRoZXJlICovCglyZXR1cm4gT0s7CgogICAgdGVybSA9IFRfTkFNRTsKICAgIGlmICh0ZXJtID09IE5VTEwgfHwgKnRlcm0gPT0gTlVMKQkgICAgLyogJ3Rlcm0nIG5vdCBkZWZpbmVkIHlldCAqLwoJcmV0dXJuIEZBSUw7CgogICAgaWYgKHRlcm1faXNfYnVpbHRpbih0ZXJtKSkJCSAgICAvKiBuYW1lIHN0YXJ0cyB3aXRoICJidWlsdGluXyIgKi8KICAgIHsKCXRlcm0gKz0gODsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJYnVpbHRpbl9maXJzdCA9IFRSVUU7CiNlbmRpZgogICAgfQojaWZkZWYgSEFWRV9UR0VURU5UCiAgICBlbHNlCglidWlsdGluX2ZpcnN0ID0gcF90Ymk7CiNlbmRpZgoKI2lmZGVmIEhBVkVfVEdFVEVOVAovKgogKiBXZSBjYW4gZ2V0IHRoZSBlbnRyeSBmcm9tIHRoZSBidWlsdGluIHRlcm1jYXAgYW5kIGZyb20gdGhlIGV4dGVybmFsIG9uZS4KICogSWYgJ3R0eWJ1aWx0aW4nIGlzIG9uIG9yIHRoZSB0ZXJtaW5hbCBuYW1lIHN0YXJ0cyB3aXRoICJidWlsdGluXyIsIHRyeQogKiBidWlsdGluIHRlcm1jYXAgZmlyc3QuCiAqIElmICd0dHlidWlsdGluJyBpcyBvZmYsIHRyeSBleHRlcm5hbCB0ZXJtY2FwIGZpcnN0LgogKi8KICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCiAgICB7CglpZiAoIWJ1aWx0aW5fZmlyc3QgPT0gaSkKI2VuZGlmCgkvKgoJICogU2VhcmNoIGluIGJ1aWx0aW4gdGVybWNhcAoJICovCgl7CgkgICAgdGVybXAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKCSAgICBpZiAodGVybXAtPmJ0X3N0cmluZyAhPSBOVUxMKQkvKiBmb3VuZCBpdCAqLwoJICAgIHsKCQlrZXkgPSBURVJNQ0FQMktFWShuYW1lWzBdLCBuYW1lWzFdKTsKCQl3aGlsZSAodGVybXAtPmJ0X2VudHJ5ICE9IChpbnQpS1NfTkFNRSkKCQl7CgkJICAgIGlmICgoaW50KXRlcm1wLT5idF9lbnRyeSA9PSBrZXkpCgkJICAgIHsKCQkJYWRkX3Rlcm1jb2RlKG5hbWUsIChjaGFyX3UgKil0ZXJtcC0+YnRfc3RyaW5nLAoJCQkJCQkJICB0ZXJtX2lzXzhiaXQodGVybSkpOwoJCQlyZXR1cm4gT0s7CgkJICAgIH0KCQkgICAgKyt0ZXJtcDsKCQl9CgkgICAgfQoJfQojaWZkZWYgSEFWRV9UR0VURU5UCgllbHNlCgkvKgoJICogU2VhcmNoIGluIGV4dGVybmFsIHRlcm1jYXAKCSAqLwoJewoJICAgIGVycm9yX21zZyA9IHRnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSk7CgkgICAgaWYgKGVycm9yX21zZyA9PSBOVUxMKQoJICAgIHsKCQlzdHJpbmcgPSBUR0VUU1RSKChjaGFyICopbmFtZSwgJnRwKTsKCQlpZiAoc3RyaW5nICE9IE5VTEwgJiYgKnN0cmluZyAhPSBOVUwpCgkJewoJCSAgICBhZGRfdGVybWNvZGUobmFtZSwgc3RyaW5nLCBGQUxTRSk7CgkJICAgIHJldHVybiBPSzsKCQl9CgkgICAgfQoJfQogICAgfQojZW5kaWYKCiAgICBpZiAoc291cmNpbmdfbmFtZSA9PSBOVUxMKQogICAgewojaWZkZWYgSEFWRV9UR0VURU5UCglpZiAoZXJyb3JfbXNnICE9IE5VTEwpCgkgICAgRU1TRyhlcnJvcl9tc2cpOwoJZWxzZQojZW5kaWYKCSAgICBFTVNHMihfKCJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIpLCBuYW1lKTsKICAgIH0KICAgIHJldHVybiBGQUlMOwp9CgogICAgc3RhdGljIGludAp0ZXJtX2lzX2J1aWx0aW4obmFtZSkKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIHJldHVybiAoU1RSTkNNUChuYW1lLCAiYnVpbHRpbl8iLCAoc2l6ZV90KTgpID09IDApOwp9CgovKgogKiBSZXR1cm4gVFJVRSBpZiB0ZXJtaW5hbCAibmFtZSIgdXNlcyBDU0kgaW5zdGVhZCBvZiA8RXNjPlsuCiAqIEFzc3VtZSB0aGF0IHRoZSB0ZXJtaW5hbCBpcyB1c2luZyA4LWJpdCBjb250cm9scyB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zCiAqICI4Yml0IiwgbGlrZSBpbiAieHRlcm0tOGJpdCIuCiAqLwogICAgaW50CnRlcm1faXNfOGJpdChuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgcmV0dXJuIChkZXRlY3RlZF84Yml0IHx8IHN0cnN0cigoY2hhciAqKW5hbWUsICI4Yml0IikgIT0gTlVMTCk7Cn0KCi8qCiAqIFRyYW5zbGF0ZSB0ZXJtaW5hbCBjb250cm9sIGNoYXJzIGZyb20gNy1iaXQgdG8gOC1iaXQ6CiAqIDxFc2M+WyAtPiBDU0kKICogPEVzYz5dIC0+IDxNLUMtXT4KICogPEVzYz5PIC0+IDxNLUMtTz4KICovCiAgICBzdGF0aWMgaW50CnRlcm1fN3RvOGJpdChwKQogICAgY2hhcl91ICAqcDsKewogICAgaWYgKCpwID09IEVTQykKICAgIHsKCWlmIChwWzFdID09ICdbJykKCSAgICByZXR1cm4gQ1NJOwoJaWYgKHBbMV0gPT0gJ10nKQoJICAgIHJldHVybiAweDlkOwoJaWYgKHBbMV0gPT0gJ08nKQoJICAgIHJldHVybiAweDhmOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCiNpZmRlZiBGRUFUX0dVSQogICAgaW50CnRlcm1faXNfZ3VpKG5hbWUpCiAgICBjaGFyX3UgICpuYW1lOwp7CiAgICByZXR1cm4gKFNUUkNNUChuYW1lLCAiYnVpbHRpbl9ndWkiKSA9PSAwIHx8IFNUUkNNUChuYW1lLCAiZ3VpIikgPT0gMCk7Cn0KI2VuZGlmCgojaWYgIWRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKFBST1RPKQoKICAgIGNoYXJfdSAqCnRsdG9hKGkpCiAgICB1bnNpZ25lZCBsb25nIGk7CnsKICAgIHN0YXRpYyBjaGFyX3UgYnVmWzE2XTsKICAgIGNoYXJfdQkqcDsKCiAgICBwID0gYnVmICsgMTU7CiAgICAqcCA9ICdcMCc7CiAgICBkbwogICAgewoJLS1wOwoJKnAgPSAoY2hhcl91KSAoaSAlIDEwICsgJzAnKTsKCWkgLz0gMTA7CiAgICB9CiAgICB3aGlsZSAoaSA+IDAgJiYgcCA+IGJ1Zik7CiAgICByZXR1cm4gcDsKfQojZW5kaWYKCiNpZm5kZWYgSEFWRV9UR0VURU5UCgovKgogKiBtaW5pbWFsIHRnb3RvKCkgaW1wbGVtZW50YXRpb24uCiAqIG5vIHBhZGRpbmcgYW5kIHdlIG9ubHkgcGFyc2UgZm9yICVpICVkIGFuZCAlK2NoYXIKICovCnN0YXRpYyBjaGFyICp0Z290byBfX0FSR1MoKGNoYXIgKiwgaW50LCBpbnQpKTsKCiAgICBzdGF0aWMgY2hhciAqCnRnb3RvKGNtLCB4LCB5KQogICAgY2hhciAqY207CiAgICBpbnQgeCwgeTsKewogICAgc3RhdGljIGNoYXIgYnVmWzMwXTsKICAgIGNoYXIgKnAsICpzLCAqZTsKCiAgICBpZiAoIWNtKQoJcmV0dXJuICJPT1BTIjsKICAgIGUgPSBidWYgKyAyOTsKICAgIGZvciAocyA9IGJ1ZjsgcyA8IGUgJiYgKmNtOyBjbSsrKQogICAgewoJaWYgKCpjbSAhPSAnJScpCgl7CgkgICAgKnMrKyA9ICpjbTsKCSAgICBjb250aW51ZTsKCX0KCXN3aXRjaCAoKisrY20pCgl7CgljYXNlICdkJzoKCSAgICBwID0gKGNoYXIgKil0bHRvYSgodW5zaWduZWQgbG9uZyl5KTsKCSAgICB5ID0geDsKCSAgICB3aGlsZSAoKnApCgkJKnMrKyA9ICpwKys7CgkgICAgYnJlYWs7CgljYXNlICdpJzoKCSAgICB4Kys7CgkgICAgeSsrOwoJICAgIGJyZWFrOwoJY2FzZSAnKyc6CgkgICAgKnMrKyA9IChjaGFyKSgqKytjbSArIHkpOwoJICAgIHkgPSB4OwoJICAgIGJyZWFrOwoJY2FzZSAnJSc6CgkgICAgKnMrKyA9ICpjbTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgcmV0dXJuICJPT1BTIjsKCX0KICAgIH0KICAgICpzID0gJ1wwJzsKICAgIHJldHVybiBidWY7Cn0KCiNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KCi8qCiAqIFNldCB0aGUgdGVybWluYWwgbmFtZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgb3B0aW9ucy4KICogSWYgIm5hbWUiIGlzIE5VTEwgb3IgZW1wdHksIGdldCB0aGUgdGVybWluYWwgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICogSWYgdGhhdCBmYWlscywgdXNlIHRoZSBkZWZhdWx0IHRlcm1pbmFsIG5hbWUuCiAqLwogICAgdm9pZAp0ZXJtY2FwaW5pdChuYW1lKQogICAgY2hhcl91ICpuYW1lOwp7CiAgICBjaGFyX3UJKnRlcm07CgogICAgaWYgKG5hbWUgIT0gTlVMTCAmJiAqbmFtZSA9PSBOVUwpCgluYW1lID0gTlVMTDsJICAgIC8qIGVtcHR5IG5hbWUgaXMgZXF1YWwgdG8gbm8gbmFtZSAqLwogICAgdGVybSA9IG5hbWU7CgojaWZkZWYgX19CRU9TX18KICAgIC8qCiAgICAgKiBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vcm1hbGx5IHNldCB0byAnYW5zaScgb24gdGhlIEJlYm94OwogICAgICogU2luY2UgdGhlIEJlQm94IGRvZXNuJ3QgcXVpdGUgc3VwcG9ydCBmdWxsIEFOU0kgeWV0LCB3ZSB1c2Ugb3VyCiAgICAgKiBvd24gY3VzdG9tICdhbnNpLWJlb3MnIHRlcm1jYXAgaW5zdGVhZCwgdW5sZXNzIHRoZSAtVCBvcHRpb24gaGFzCiAgICAgKiBiZWVuIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgKi8KICAgIGlmICh0ZXJtID09IE5VTEwKCQkgJiYgc3RyY21wKChjaGFyICopbWNoX2dldGVudigoY2hhcl91ICopIlRFUk0iKSwgImFuc2kiKSA9PSAwKQoJdGVybSA9IERFRkFVTFRfVEVSTTsKI2VuZGlmCiNpZm5kZWYgTVNXSU4KICAgIGlmICh0ZXJtID09IE5VTEwpCgl0ZXJtID0gbWNoX2dldGVudigoY2hhcl91ICopIlRFUk0iKTsKI2VuZGlmCiAgICBpZiAodGVybSA9PSBOVUxMIHx8ICp0ZXJtID09IE5VTCkKCXRlcm0gPSBERUZBVUxUX1RFUk07CiAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0ZXJtIiwgLTEsIHRlcm0sIE9QVF9GUkVFLCAwKTsKCiAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdGVybWluYWwgbmFtZS4gKi8KICAgIHNldF9zdHJpbmdfZGVmYXVsdCgidGVybSIsIHRlcm0pOwogICAgc2V0X3N0cmluZ19kZWZhdWx0KCJ0dHl0eXBlIiwgdGVybSk7CgogICAgLyoKICAgICAqIEF2b2lkIHVzaW5nICJ0ZXJtIiBoZXJlLCBiZWNhdXNlIHRoZSBuZXh0IG1jaF9nZXRlbnYoKSBtYXkgb3ZlcndyaXRlIGl0LgogICAgICovCiAgICBzZXRfdGVybW5hbWUoVF9OQU1FICE9IE5VTEwgPyBUX05BTUUgOiB0ZXJtKTsKfQoKLyoKICogdGhlIG51bWJlciBvZiBjYWxscyB0byB1aV93cml0ZSBpcyByZWR1Y2VkIGJ5IHVzaW5nIHRoZSBidWZmZXIgIm91dF9idWYiCiAqLwojaWZkZWYgRE9TMTYKIyBkZWZpbmUgT1VUX1NJWkUJMjU1CQkvKiBvbmx5IGhhdmUgNjQwSyB0b3RhbC4uLiAqLwojZWxzZQojIGlmZGVmIEZFQVRfR1VJX1cxNgojICBkZWZpbmUgT1VUX1NJWkUJMTAyMwkJLyogU2F2ZSBwcmVjaW91cyAxSyBuZWFyIGRhdGEgKi8KIyBlbHNlCiMgIGRlZmluZSBPVVRfU0laRQkyMDQ3CiMgZW5kaWYKI2VuZGlmCgkgICAgLyogQWRkIG9uZSB0byBhbGxvdyBtY2hfd3JpdGUoKSBpbiBvc193aW4zMi5jIHRvIGFwcGVuZCBhIE5VTCAqLwpzdGF0aWMgY2hhcl91CQlvdXRfYnVmW09VVF9TSVpFICsgMV07CnN0YXRpYyBpbnQJCW91dF9wb3MgPSAwOwkvKiBudW1iZXIgb2YgY2hhcnMgaW4gb3V0X2J1ZiAqLwoKLyoKICogb3V0X2ZsdXNoKCk6IGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyCiAqLwogICAgdm9pZApvdXRfZmx1c2goKQp7CiAgICBpbnQJICAgIGxlbjsKCiAgICBpZiAob3V0X3BvcyAhPSAwKQogICAgewoJLyogc2V0IG91dF9wb3MgdG8gMCBiZWZvcmUgdWlfd3JpdGUsIHRvIGF2b2lkIHJlY3Vyc2l2ZW5lc3MgKi8KCWxlbiA9IG91dF9wb3M7CglvdXRfcG9zID0gMDsKCXVpX3dyaXRlKG91dF9idWYsIGxlbik7CiAgICB9Cn0KCiNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFNvbWV0aW1lcyBhIGJ5dGUgb3V0IG9mIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgaXMgd3JpdHRlbiB3aXRoIG91dF9jaGFyKCkuCiAqIFRvIGF2b2lkIGZsdXNoaW5nIGhhbGYgb2YgdGhlIGNoYXJhY3RlciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZpcnN0LgogKi8KICAgIHZvaWQKb3V0X2ZsdXNoX2NoZWNrKCkKewogICAgaWYgKGVuY19kYmNzICE9IDAgJiYgb3V0X3BvcyA+PSBPVVRfU0laRSAtIE1CX01BWEJZVEVTKQoJb3V0X2ZsdXNoKCk7Cn0KI2VuZGlmCgojaWZkZWYgRkVBVF9HVUkKLyoKICogb3V0X3RyYXNoKCk6IFRocm93IGF3YXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyCiAqLwogICAgdm9pZApvdXRfdHJhc2goKQp7CiAgICBvdXRfcG9zID0gMDsKfQojZW5kaWYKCi8qCiAqIG91dF9jaGFyKGMpOiBwdXQgYSBieXRlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCiAqCQlGbHVzaCBpdCBpZiBpdCBiZWNvbWVzIGZ1bGwuCiAqIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBvdXRwdXR0aW5nIHRleHQgb24gdGhlIHNjcmVlbiAodXNlIGZ1bmN0aW9ucwogKiBsaWtlIG1zZ19wdXRzKCkgYW5kIHNjcmVlbl9wdXRjaGFyKCkgZm9yIHRoYXQpLgogKi8KICAgIHZvaWQKb3V0X2NoYXIoYykKICAgIHVuc2lnbmVkCWM7CnsKI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoTUFDT1NfWF9VTklYKQogICAgaWYgKGMgPT0gJ1xuJykJLyogdHVybiBMRiBpbnRvIENSLUxGIChDUk1PRCBkb2Vzbid0IHNlZW0gdG8gZG8gdGhpcykgKi8KCW91dF9jaGFyKCdccicpOwojZW5kaWYKCiAgICBvdXRfYnVmW291dF9wb3MrK10gPSBjOwoKICAgIC8qIEZvciB0ZXN0aW5nIHdlIGZsdXNoIGVhY2ggdGltZS4gKi8KICAgIGlmIChvdXRfcG9zID49IE9VVF9TSVpFIHx8IHBfd2QpCglvdXRfZmx1c2goKTsKfQoKc3RhdGljIHZvaWQgb3V0X2NoYXJfbmYgX19BUkdTKCh1bnNpZ25lZCkpOwoKLyoKICogb3V0X2NoYXJfbmYoYyk6IGxpa2Ugb3V0X2NoYXIoKSwgYnV0IGRvbid0IGZsdXNoIHdoZW4gcF93ZCBpcyBzZXQKICovCiAgICBzdGF0aWMgdm9pZApvdXRfY2hhcl9uZihjKQogICAgdW5zaWduZWQJYzsKewojaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChNQUNPU19YX1VOSVgpCiAgICBpZiAoYyA9PSAnXG4nKQkvKiB0dXJuIExGIGludG8gQ1ItTEYgKENSTU9EIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzKSAqLwoJb3V0X2NoYXJfbmYoJ1xyJyk7CiNlbmRpZgoKICAgIG91dF9idWZbb3V0X3BvcysrXSA9IGM7CgogICAgaWYgKG91dF9wb3MgPj0gT1VUX1NJWkUpCglvdXRfZmx1c2goKTsKfQoKLyoKICogQSBuZXZlci1wYWRkaW5nIG91dF9zdHIuCiAqIHVzZSB0aGlzIHdoZW5ldmVyIHlvdSBkb24ndCB3YW50IHRvIHJ1biB0aGUgc3RyaW5nIHRocm91Z2ggdHB1dHMuCiAqIHRwdXRzIGFib3ZlIGlzIGhhcm1sZXNzLCBidXQgdHB1dHMgZnJvbSB0aGUgdGVybWNhcCBsaWJyYXJ5CiAqIGlzIGxpa2VseSB0byBzdHJpcCBvZmYgbGVhZGluZyBkaWdpdHMsIHRoYXQgaXQgbWlzdGFrZXMgZm9yIHBhZGRpbmcKICogaW5mb3JtYXRpb24sIGFuZCAiJWkiLCAiJWQiLCBldGMuCiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd3JpdGluZyB0ZXJtaW5hbCBjb2Rlcywgbm90IGZvciBvdXRwdXR0aW5nCiAqIG5vcm1hbCB0ZXh0ICh1c2UgZnVuY3Rpb25zIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCiAqLwogICAgdm9pZApvdXRfc3RyX25mKHMpCiAgICBjaGFyX3UgKnM7CnsKICAgIGlmIChvdXRfcG9zID4gT1VUX1NJWkUgLSAyMCkgIC8qIGF2b2lkIHRlcm1pbmFsIHN0cmluZ3MgYmVpbmcgc3BsaXQgdXAgKi8KCW91dF9mbHVzaCgpOwogICAgd2hpbGUgKCpzKQoJb3V0X2NoYXJfbmYoKnMrKyk7CgogICAgLyogRm9yIHRlc3Rpbmcgd2Ugd3JpdGUgb25lIHN0cmluZyBhdCBhIHRpbWUuICovCiAgICBpZiAocF93ZCkKCW91dF9mbHVzaCgpOwp9CgovKgogKiBvdXRfc3RyKHMpOiBQdXQgYSBjaGFyYWN0ZXIgc3RyaW5nIGEgYnl0ZSBhdCBhIHRpbWUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KICogSWYgSEFWRV9UR0VURU5UIGlzIGRlZmluZWQgdXNlIHRoZSB0ZXJtY2FwIHBhcnNlci4gKGp3KQogKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHdyaXRpbmcgdGVybWluYWwgY29kZXMsIG5vdCBmb3Igb3V0cHV0dGluZwogKiBub3JtYWwgdGV4dCAodXNlIGZ1bmN0aW9ucyBsaWtlIG1zZ19wdXRzKCkgYW5kIHNjcmVlbl9wdXRjaGFyKCkgZm9yIHRoYXQpLgogKi8KICAgIHZvaWQKb3V0X3N0cihzKQogICAgY2hhcl91CSAqczsKewogICAgaWYgKHMgIT0gTlVMTCAmJiAqcykKICAgIHsKI2lmZGVmIEZFQVRfR1VJCgkvKiBEb24ndCB1c2UgdHB1dHMoKSB3aGVuIEdVSSBpcyB1c2VkLCBuY3Vyc2VzIGNyYXNoZXMuICovCglpZiAoZ3VpLmluX3VzZSkKCXsKCSAgICBvdXRfc3RyX25mKHMpOwoJICAgIHJldHVybjsKCX0KI2VuZGlmCgkvKiBhdm9pZCB0ZXJtaW5hbCBzdHJpbmdzIGJlaW5nIHNwbGl0IHVwICovCglpZiAob3V0X3BvcyA+IE9VVF9TSVpFIC0gMjApCgkgICAgb3V0X2ZsdXNoKCk7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCXRwdXRzKChjaGFyICopcywgMSwgVFBVVFNGVU5DQVNUIG91dF9jaGFyX25mKTsKI2Vsc2UKCXdoaWxlICgqcykKCSAgICBvdXRfY2hhcl9uZigqcysrKTsKI2VuZGlmCgoJLyogRm9yIHRlc3Rpbmcgd2Ugd3JpdGUgb25lIHN0cmluZyBhdCBhIHRpbWUuICovCglpZiAocF93ZCkKCSAgICBvdXRfZmx1c2goKTsKICAgIH0KfQoKLyoKICogY3Vyc29yIHBvc2l0aW9uaW5nIHVzaW5nIHRlcm1jYXAgcGFyc2VyLiAoancpCiAqLwogICAgdm9pZAp0ZXJtX3dpbmRnb3RvKHJvdywgY29sKQogICAgaW50CSAgICByb3c7CiAgICBpbnQJICAgIGNvbDsKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ00sIGNvbCwgcm93KSk7Cn0KCiAgICB2b2lkCnRlcm1fY3Vyc29yX3JpZ2h0KGkpCiAgICBpbnQJICAgIGk7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NSSSwgMCwgaSkpOwp9CgogICAgdm9pZAp0ZXJtX2FwcGVuZF9saW5lcyhsaW5lX2NvdW50KQogICAgaW50CSAgICBsaW5lX2NvdW50Owp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DQUwsIDAsIGxpbmVfY291bnQpKTsKfQoKICAgIHZvaWQKdGVybV9kZWxldGVfbGluZXMobGluZV9jb3VudCkKICAgIGludAkgICAgbGluZV9jb3VudDsKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ0RMLCAwLCBsaW5lX2NvdW50KSk7Cn0KCiNpZiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgfHwgZGVmaW5lZChQUk9UTykKICAgIHZvaWQKdGVybV9zZXRfd2lucG9zKHgsIHkpCiAgICBpbnQJICAgIHg7CiAgICBpbnQJICAgIHk7CnsKICAgIC8qIENhbid0IGhhbmRsZSBhIG5lZ2F0aXZlIHZhbHVlIGhlcmUgKi8KICAgIGlmICh4IDwgMCkKCXggPSAwOwogICAgaWYgKHkgPCAwKQoJeSA9IDA7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DV1AsIHksIHgpKTsKfQoKICAgIHZvaWQKdGVybV9zZXRfd2luc2l6ZSh3aWR0aCwgaGVpZ2h0KQogICAgaW50CSAgICB3aWR0aDsKICAgIGludAkgICAgaGVpZ2h0Owp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DV1MsIGhlaWdodCwgd2lkdGgpKTsKfQojZW5kaWYKCiAgICB2b2lkCnRlcm1fZmdfY29sb3IobikKICAgIGludAkgICAgbjsKewogICAgLyogVXNlICJBRiIgdGVybWNhcCBlbnRyeSBpZiBwcmVzZW50LCAiU2YiIGVudHJ5IG90aGVyd2lzZSAqLwogICAgaWYgKCpUX0NBRikKCXRlcm1fY29sb3IoVF9DQUYsIG4pOwogICAgZWxzZSBpZiAoKlRfQ1NGKQoJdGVybV9jb2xvcihUX0NTRiwgbik7Cn0KCiAgICB2b2lkCnRlcm1fYmdfY29sb3IobikKICAgIGludAkgICAgbjsKewogICAgLyogVXNlICJBQiIgdGVybWNhcCBlbnRyeSBpZiBwcmVzZW50LCAiU2IiIGVudHJ5IG90aGVyd2lzZSAqLwogICAgaWYgKCpUX0NBQikKCXRlcm1fY29sb3IoVF9DQUIsIG4pOwogICAgZWxzZSBpZiAoKlRfQ1NCKQoJdGVybV9jb2xvcihUX0NTQiwgbik7Cn0KCiAgICBzdGF0aWMgdm9pZAp0ZXJtX2NvbG9yKHMsIG4pCiAgICBjaGFyX3UJKnM7CiAgICBpbnQJCW47CnsKICAgIGNoYXIJYnVmWzIwXTsKICAgIGludCBpID0gMjsJLyogaW5kZXggaW4gc1tdIGp1c3QgYWZ0ZXIgPEVzYz5bIG9yIENTSSAqLwoKICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgb2YgMTYgY29sb3JzLCBiZWNhdXNlIHRlcm1jYXAgY2FuJ3QgaGFuZGxlIGl0ICovCiAgICAvKiBBbHNvIGFjY2VwdCAiXGVbMyVkbSIgZm9yIFRFUk1JTkZPLCBpdCBpcyBzb21ldGltZXMgdXNlZCAqLwogICAgLyogQWxzbyBhY2NlcHQgQ1NJIGluc3RlYWQgb2YgPEVzYz5bICovCiAgICBpZiAobiA+PSA4ICYmIHRfY29sb3JzID49IDE2CgkgICAgICAmJiAoKHNbMF0gPT0gRVNDICYmIHNbMV0gPT0gJ1snKSB8fCAoc1swXSA9PSBDU0kgJiYgKGkgPSAxKSA9PSAxKSkKCSAgICAgICYmIHNbaV0gIT0gTlVMCgkgICAgICAmJiAoU1RSQ01QKHMgKyBpICsgMSwgIiVwMSVkbSIpID09IDAKCQkgIHx8IFNUUkNNUChzICsgaSArIDEsICIlZG0iKSA9PSAwKQoJICAgICAgJiYgKHNbaV0gPT0gJzMnIHx8IHNbaV0gPT0gJzQnKSkKICAgIHsKCXNwcmludGYoYnVmLAojaWZkZWYgVEVSTUlORk8KCQkiJXMlcyUlcDElJWRtIiwKI2Vsc2UKCQkiJXMlcyUlZG0iLAojZW5kaWYKCQlpID09IDIgPyBJRl9FQigiXDAzM1siLCBFU0NfU1RSICJbIikgOiAiXDIzMyIsCgkJc1tpXSA9PSAnMycgPyAobiA+PSAxNiA/ICIzODs1OyIgOiAiOSIpCgkJCSAgICA6IChuID49IDE2ID8gIjQ4OzU7IiA6ICIxMCIpKTsKCU9VVF9TVFIodGdvdG8oYnVmLCAwLCBuID49IDE2ID8gbiA6IG4gLSA4KSk7CiAgICB9CiAgICBlbHNlCglPVVRfU1RSKHRnb3RvKChjaGFyICopcywgMCwgbikpOwp9CgojaWYgKGRlZmluZWQoRkVBVF9USVRMRSkgJiYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TX1gpKSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogR2VuZXJpYyBmdW5jdGlvbiB0byBzZXQgd2luZG93IHRpdGxlLCB1c2luZyB0X3RzIGFuZCB0X2ZzLgogKi8KICAgIHZvaWQKdGVybV9zZXR0aXRsZSh0aXRsZSkKICAgIGNoYXJfdQkqdGl0bGU7CnsKICAgIC8qIHRfdHMgdGFrZXMgb25lIGFyZ3VtZW50OiBjb2x1bW4gaW4gc3RhdHVzIGxpbmUgKi8KICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX1RTLCAwLCAwKSk7CS8qIHNldCB0aXRsZSBzdGFydCAqLwogICAgb3V0X3N0cl9uZih0aXRsZSk7CiAgICBvdXRfc3RyKFRfRlMpOwkJCS8qIHNldCB0aXRsZSBlbmQgKi8KICAgIG91dF9mbHVzaCgpOwp9CiNlbmRpZgoKLyoKICogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzZXQgb3IgdGVybWluYWwgb3B0aW9ucy4KICogUmVwbGFjZSBhbGwgZW50cmllcyB0aGF0IGFyZSBOVUxMIGJ5IGVtcHR5X29wdGlvbgogKi8KICAgIHZvaWQKdHRlc3QocGFpcnMpCiAgICBpbnQJcGFpcnM7CnsKICAgIGNoZWNrX29wdGlvbnMoKTsJCSAgICAvKiBtYWtlIHN1cmUgbm8gb3B0aW9ucyBhcmUgTlVMTCAqLwoKICAgIC8qCiAgICAgKiBNVVNUIGhhdmUgImNtIjogY3Vyc29yIG1vdGlvbi4KICAgICAqLwogICAgaWYgKCpUX0NNID09IE5VTCkKCUVNU0coXygiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiKSk7CgogICAgLyoKICAgICAqIGlmICJjcyIgZGVmaW5lZCwgdXNlIGEgc2Nyb2xsIHJlZ2lvbiwgaXQncyBmYXN0ZXIuCiAgICAgKi8KICAgIGlmICgqVF9DUyAhPSBOVUwpCglzY3JvbGxfcmVnaW9uID0gVFJVRTsKICAgIGVsc2UKCXNjcm9sbF9yZWdpb24gPSBGQUxTRTsKCiAgICBpZiAocGFpcnMpCiAgICB7CgkvKgoJICogb3B0aW9uYWwgcGFpcnMKCSAqLwoJLyogVFAgZ29lcyB0byBub3JtYWwgbW9kZSBmb3IgVEkgKGludmVydCkgYW5kIFRCIChib2xkKSAqLwoJaWYgKCpUX01FID09IE5VTCkKCSAgICBUX01FID0gVF9NUiA9IFRfTUQgPSBUX01CID0gZW1wdHlfb3B0aW9uOwoJaWYgKCpUX1NPID09IE5VTCB8fCAqVF9TRSA9PSBOVUwpCgkgICAgVF9TTyA9IFRfU0UgPSBlbXB0eV9vcHRpb247CglpZiAoKlRfVVMgPT0gTlVMIHx8ICpUX1VFID09IE5VTCkKCSAgICBUX1VTID0gVF9VRSA9IGVtcHR5X29wdGlvbjsKCWlmICgqVF9DWkggPT0gTlVMIHx8ICpUX0NaUiA9PSBOVUwpCgkgICAgVF9DWkggPSBUX0NaUiA9IGVtcHR5X29wdGlvbjsKCgkvKiBUX1ZFIGlzIG5lZWRlZCBldmVuIHRob3VnaCBUX1ZJIGlzIG5vdCBkZWZpbmVkICovCglpZiAoKlRfVkUgPT0gTlVMKQoJICAgIFRfVkkgPSBlbXB0eV9vcHRpb247CgoJLyogaWYgJ21yJyBvciAnbWUnIGlzIG5vdCBkZWZpbmVkIHVzZSAnc28nIGFuZCAnc2UnICovCglpZiAoKlRfTUUgPT0gTlVMKQoJewoJICAgIFRfTUUgPSBUX1NFOwoJICAgIFRfTVIgPSBUX1NPOwoJICAgIFRfTUQgPSBUX1NPOwoJfQoKCS8qIGlmICdzbycgb3IgJ3NlJyBpcyBub3QgZGVmaW5lZCB1c2UgJ21yJyBhbmQgJ21lJyAqLwoJaWYgKCpUX1NPID09IE5VTCkKCXsKCSAgICBUX1NFID0gVF9NRTsKCSAgICBpZiAoKlRfTVIgPT0gTlVMKQoJCVRfU08gPSBUX01EOwoJICAgIGVsc2UKCQlUX1NPID0gVF9NUjsKCX0KCgkvKiBpZiAnWkgnIG9yICdaUicgaXMgbm90IGRlZmluZWQgdXNlICdtcicgYW5kICdtZScgKi8KCWlmICgqVF9DWkggPT0gTlVMKQoJewoJICAgIFRfQ1pSID0gVF9NRTsKCSAgICBpZiAoKlRfTVIgPT0gTlVMKQoJCVRfQ1pIID0gVF9NRDsKCSAgICBlbHNlCgkJVF9DWkggPSBUX01SOwoJfQoKCS8qICJTYiIgYW5kICJTZiIgY29tZSBpbiBwYWlycyAqLwoJaWYgKCpUX0NTQiA9PSBOVUwgfHwgKlRfQ1NGID09IE5VTCkKCXsKCSAgICBUX0NTQiA9IGVtcHR5X29wdGlvbjsKCSAgICBUX0NTRiA9IGVtcHR5X29wdGlvbjsKCX0KCgkvKiAiQUIiIGFuZCAiQUYiIGNvbWUgaW4gcGFpcnMgKi8KCWlmICgqVF9DQUIgPT0gTlVMIHx8ICpUX0NBRiA9PSBOVUwpCgl7CgkgICAgVF9DQUIgPSBlbXB0eV9vcHRpb247CgkgICAgVF9DQUYgPSBlbXB0eV9vcHRpb247Cgl9CgoJLyogaWYgJ1NiJyBhbmQgJ0FCJyBhcmUgbm90IGRlZmluZWQsIHJlc2V0ICJDbyIgKi8KCWlmICgqVF9DU0IgPT0gTlVMICYmICpUX0NBQiA9PSBOVUwpCgkgICAgVF9DQ08gPSBlbXB0eV9vcHRpb247CgoJLyogU2V0ICd3ZWlyZGludmVydCcgYWNjb3JkaW5nIHRvIHZhbHVlIG9mICd0X3hzJyAqLwoJcF93aXYgPSAoKlRfWFMgIT0gTlVMKTsKICAgIH0KICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsKCiAgICAvKiBTZXQgdF9jb2xvcnMgdG8gdGhlIHZhbHVlIG9mIHRfQ28uICovCiAgICB0X2NvbG9ycyA9IGF0b2koKGNoYXIgKilUX0NDTyk7Cn0KCiNpZiAoZGVmaW5lZChGRUFUX0dVSSkgJiYgKGRlZmluZWQoRkVBVF9NRU5VKSB8fCAhZGVmaW5lZChVU0VfT05fRkxZX1NDUk9MTCkpKSBcCgl8fCBkZWZpbmVkKFBST1RPKQovKgogKiBSZXByZXNlbnQgdGhlIGdpdmVuIGxvbmdfdSBhcyBpbmRpdmlkdWFsIGJ5dGVzLCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50CiAqIGJ5dGUgZmlyc3QsIGFuZCBzdG9yZSB0aGVtIGluIGRzdC4KICovCiAgICB2b2lkCmFkZF9sb25nX3RvX2J1Zih2YWwsIGRzdCkKICAgIGxvbmdfdSAgdmFsOwogICAgY2hhcl91ICAqZHN0Owp7CiAgICBpbnQJICAgIGk7CiAgICBpbnQJICAgIHNoaWZ0OwoKICAgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZW9mKGxvbmdfdSk7IGkrKykKICAgIHsKCXNoaWZ0ID0gOCAqIChzaXplb2YobG9uZ191KSAtIGkpOwoJZHN0W2kgLSAxXSA9IChjaGFyX3UpICgodmFsID4+IHNoaWZ0KSAmIDB4ZmYpOwogICAgfQp9CgpzdGF0aWMgaW50IGdldF9sb25nX2Zyb21fYnVmIF9fQVJHUygoY2hhcl91ICpidWYsIGxvbmdfdSAqdmFsKSk7CgovKgogKiBJbnRlcnByZXQgdGhlIG5leHQgc3RyaW5nIG9mIGJ5dGVzIGluIGJ1ZiBhcyBhIGxvbmcgaW50ZWdlciwgd2l0aCB0aGUgbW9zdAogKiBzaWduaWZpY2FudCBieXRlIGZpcnN0LiAgTm90ZSB0aGF0IGl0IGlzIGFzc3VtZWQgdGhhdCBidWYgaGFzIGJlZW4gdGhyb3VnaAogKiBpbmNoYXIoKSwgc28gdGhhdCBOVUwgYW5kIEtfU1BFQ0lBTCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIHRocmVlIGJ5dGVzIGVhY2guCiAqIFB1dHMgcmVzdWx0IGluIHZhbCwgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gYnVmCiAqIChiZXR3ZWVuIHNpemVvZihsb25nX3UpIGFuZCAyICogc2l6ZW9mKGxvbmdfdSkpLCBvciAtMSBpZiBub3QgZW5vdWdoIGJ5dGVzCiAqIHdlcmUgcHJlc2VudC4KICovCiAgICBzdGF0aWMgaW50CmdldF9sb25nX2Zyb21fYnVmKGJ1ZiwgdmFsKQogICAgY2hhcl91ICAqYnVmOwogICAgbG9uZ191ICAqdmFsOwp7CiAgICBpbnQJICAgIGxlbjsKICAgIGNoYXJfdSAgYnl0ZXNbc2l6ZW9mKGxvbmdfdSldOwogICAgaW50CSAgICBpOwogICAgaW50CSAgICBzaGlmdDsKCiAgICAqdmFsID0gMDsKICAgIGxlbiA9IGdldF9ieXRlc19mcm9tX2J1ZihidWYsIGJ5dGVzLCAoaW50KXNpemVvZihsb25nX3UpKTsKICAgIGlmIChsZW4gIT0gLTEpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGxvbmdfdSk7IGkrKykKCXsKCSAgICBzaGlmdCA9IDggKiAoc2l6ZW9mKGxvbmdfdSkgLSAxIC0gaSk7CgkgICAgKnZhbCArPSAobG9uZ191KWJ5dGVzW2ldIDw8IHNoaWZ0OwoJfQogICAgfQogICAgcmV0dXJuIGxlbjsKfQojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRfR1VJKSBcCiAgICB8fCAoZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSkpCi8qCiAqIFJlYWQgdGhlIG5leHQgbnVtX2J5dGVzIGJ5dGVzIGZyb20gYnVmLCBhbmQgc3RvcmUgdGhlbSBpbiBieXRlcy4gIEFzc3VtZQogKiB0aGF0IGJ1ZiBoYXMgYmVlbiB0aHJvdWdoIGluY2hhcigpLglSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQKICogZnJvbSBidWYgKGJldHdlZW4gbnVtX2J5dGVzIGFuZCBudW1fYnl0ZXMqMiksIG9yIC0xIGlmIG5vdCBlbm91Z2ggYnl0ZXMgd2VyZQogKiBhdmFpbGFibGUuCiAqLwogICAgc3RhdGljIGludApnZXRfYnl0ZXNfZnJvbV9idWYoYnVmLCBieXRlcywgbnVtX2J5dGVzKQogICAgY2hhcl91ICAqYnVmOwogICAgY2hhcl91ICAqYnl0ZXM7CiAgICBpbnQJICAgIG51bV9ieXRlczsKewogICAgaW50CSAgICBsZW4gPSAwOwogICAgaW50CSAgICBpOwogICAgY2hhcl91ICBjOwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXM7IGkrKykKICAgIHsKCWlmICgoYyA9IGJ1ZltsZW4rK10pID09IE5VTCkKCSAgICByZXR1cm4gLTE7CglpZiAoYyA9PSBLX1NQRUNJQUwpCgl7CgkgICAgaWYgKGJ1ZltsZW5dID09IE5VTCB8fCBidWZbbGVuICsgMV0gPT0gTlVMKQkgICAgLyogY2Fubm90IGhhcHBlbj8gKi8KCQlyZXR1cm4gLTE7CgkgICAgaWYgKGJ1ZltsZW4rK10gPT0gKGludClLU19aRVJPKQoJCWMgPSBOVUw7CgkgICAgKytsZW47CS8qIHNraXAgS0VfRklMTEVSICovCgkgICAgLyogZWxzZSBpdCBzaG91bGQgYmUgS1NfU1BFQ0lBTCwgYW5kIGMgYWxyZWFkeSBlcXVhbHMgS19TUEVDSUFMICovCgl9CgllbHNlIGlmIChjID09IENTSSAmJiBidWZbbGVuXSA9PSBLU19FWFRSQQoJCQkJCSAgICAgICAmJiBidWZbbGVuICsgMV0gPT0gKGludClLRV9DU0kpCgkgICAgLyogQ1NJIGlzIHN0b3JlZCBhcyBDU0kgS1NfU1BFQ0lBTCBLRV9DU0kgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKCSAgICAgKiB0aGUgc3RhcnQgb2YgYSBzcGVjaWFsIGtleSwgc2VlIGFkZF90b19pbnB1dF9idWZfY3NpKCkuICovCgkgICAgbGVuICs9IDI7CglieXRlc1tpXSA9IGM7CiAgICB9CiAgICByZXR1cm4gbGVuOwp9CiNlbmRpZgoKLyoKICogQ2hlY2sgaWYgdGhlIG5ldyBzaGVsbCBzaXplIGlzIHZhbGlkLCBjb3JyZWN0IGl0IGlmIGl0J3MgdG9vIHNtYWxsLgogKi8KICAgIHZvaWQKY2hlY2tfc2hlbGxzaXplKCkKewogICAgaWYgKENvbHVtbnMgPCBNSU5fQ09MVU1OUykKCUNvbHVtbnMgPSBNSU5fQ09MVU1OUzsKICAgIGlmIChSb3dzIDwgbWluX3Jvd3MoKSkJLyogbmVlZCByb29tIGZvciBvbmUgd2luZG93IGFuZCBjb21tYW5kIGxpbmUgKi8KCVJvd3MgPSBtaW5fcm93cygpOwp9CgovKgogKiBJbnZva2VkIGp1c3QgYmVmb3JlIHRoZSBzY3JlZW4gc3RydWN0dXJlcyBhcmUgZ29pbmcgdG8gYmUgKHJlKWFsbG9jYXRlZC4KICovCiAgICB2b2lkCndpbl9uZXdfc2hlbGxzaXplKCkKewogICAgc3RhdGljIGludAlvbGRfUm93cyA9IDA7CiAgICBzdGF0aWMgaW50CW9sZF9Db2x1bW5zID0gMDsKCiAgICBpZiAob2xkX1Jvd3MgIT0gUm93cyB8fCBvbGRfQ29sdW1ucyAhPSBDb2x1bW5zKQoJdWlfbmV3X3NoZWxsc2l6ZSgpOwogICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MpCiAgICB7CgkvKiBpZiAnd2luZG93JyB1c2VzIHRoZSB3aG9sZSBzY3JlZW4sIGtlZXAgaXQgdXNpbmcgdGhhdCAqLwoJaWYgKHBfd2luZG93ID09IG9sZF9Sb3dzIC0gMSB8fCBvbGRfUm93cyA9PSAwKQoJICAgIHBfd2luZG93ID0gUm93cyAtIDE7CglvbGRfUm93cyA9IFJvd3M7CglzaGVsbF9uZXdfcm93cygpOwkvKiB1cGRhdGUgd2luZG93IHNpemVzICovCiAgICB9CiAgICBpZiAob2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKICAgIHsKCW9sZF9Db2x1bW5zID0gQ29sdW1uczsKI2lmZGVmIEZFQVRfVkVSVFNQTElUCglzaGVsbF9uZXdfY29sdW1ucygpOwkvKiB1cGRhdGUgd2luZG93IHNpemVzICovCiNlbmRpZgogICAgfQp9CgovKgogKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgVmltIHNoZWxsIGhhcyBiZWVuIHJlc2l6ZWQgaW4gYW55IHdheS4KICogV2lsbCBvYnRhaW4gdGhlIGN1cnJlbnQgc2l6ZSBhbmQgcmVkcmF3IChhbHNvIHdoZW4gc2l6ZSBkaWRuJ3QgY2hhbmdlKS4KICovCiAgICB2b2lkCnNoZWxsX3Jlc2l6ZWQoKQp7CiAgICBzZXRfc2hlbGxzaXplKDAsIDAsIEZBTFNFKTsKfQoKLyoKICogQ2hlY2sgaWYgdGhlIHNoZWxsIHNpemUgY2hhbmdlZC4gIEhhbmRsZSBhIHJlc2l6ZS4KICogV2hlbiB0aGUgc2l6ZSBkaWRuJ3QgY2hhbmdlLCBub3RoaW5nIGhhcHBlbnMuCiAqLwogICAgdm9pZApzaGVsbF9yZXNpemVkX2NoZWNrKCkKewogICAgaW50CQlvbGRfUm93cyA9IFJvd3M7CiAgICBpbnQJCW9sZF9Db2x1bW5zID0gQ29sdW1uczsKCiAgICAodm9pZCl1aV9nZXRfc2hlbGxzaXplKCk7CiAgICBjaGVja19zaGVsbHNpemUoKTsKICAgIGlmIChvbGRfUm93cyAhPSBSb3dzIHx8IG9sZF9Db2x1bW5zICE9IENvbHVtbnMpCglzaGVsbF9yZXNpemVkKCk7Cn0KCi8qCiAqIFNldCBzaXplIG9mIHRoZSBWaW0gc2hlbGwuCiAqIElmICdtdXN0c2V0JyBpcyBUUlVFLCB3ZSBtdXN0IHNldCBSb3dzIGFuZCBDb2x1bW5zLCBkbyBub3QgZ2V0IHRoZSByZWFsCiAqIHdpbmRvdyBzaXplICh0aGlzIGlzIHVzZWQgZm9yIHRoZSA6d2luIGNvbW1hbmQpLgogKiBJZiAnbXVzdHNldCcgaXMgRkFMU0UsIHdlIG1heSB0cnkgdG8gZ2V0IHRoZSByZWFsIHdpbmRvdyBzaXplIGFuZCBpZgogKiBpdCBmYWlscyB1c2UgJ3dpZHRoJyBhbmQgJ2hlaWdodCcuCiAqLwogICAgdm9pZApzZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIG11c3RzZXQpCiAgICBpbnQJICAgIHdpZHRoLCBoZWlnaHQ7CiAgICBpbnQJICAgIG11c3RzZXQ7CnsKICAgIHN0YXRpYyBpbnQJCWJ1c3kgPSBGQUxTRTsKCiAgICAvKgogICAgICogQXZvaWQgcmVjdXJzaXZlbmVzcywgY2FuIGhhcHBlbiB3aGVuIHNldHRpbmcgdGhlIHdpbmRvdyBzaXplIGNhdXNlcwogICAgICogYW5vdGhlciB3aW5kb3ctY2hhbmdlZCBzaWduYWwuCiAgICAgKi8KICAgIGlmIChidXN5KQoJcmV0dXJuOwoKICAgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkgICAgLyoganVzdCBjaGVja2luZy4uLiAqLwoJcmV0dXJuOwoKICAgIGlmIChTdGF0ZSA9PSBISVRSRVRVUk4gfHwgU3RhdGUgPT0gU0VUV1NJWkUpIC8qIHBvc3Rwb25lIHRoZSByZXNpemluZyAqLwogICAgewoJU3RhdGUgPSBTRVRXU0laRTsKCXJldHVybjsKICAgIH0KCiAgICArK2J1c3k7CgojaWZkZWYgQU1JR0EKICAgIG91dF9mbHVzaCgpOwkgICAgLyogbXVzdCBkbyB0aGlzIGJlZm9yZSBtY2hfZ2V0X3NoZWxsc2l6ZSgpIGZvcgoJCQkgICAgICAgc29tZSBvYnNjdXJlIHJlYXNvbiAqLwojZW5kaWYKCiAgICBpZiAobXVzdHNldCB8fCAodWlfZ2V0X3NoZWxsc2l6ZSgpID09IEZBSUwgJiYgaGVpZ2h0ICE9IDApKQogICAgewoJUm93cyA9IGhlaWdodDsKCUNvbHVtbnMgPSB3aWR0aDsKCWNoZWNrX3NoZWxsc2l6ZSgpOwoJdWlfc2V0X3NoZWxsc2l6ZShtdXN0c2V0KTsKICAgIH0KICAgIGVsc2UKCWNoZWNrX3NoZWxsc2l6ZSgpOwoKICAgIC8qIFRoZSB3aW5kb3cgbGF5b3V0IHVzZWQgdG8gYmUgYWRqdXN0ZWQgaGVyZSwgYnV0IGl0IG5vdyBoYXBwZW5zIGluCiAgICAgKiBzY3JlZW5hbGxvYygpIChhbHNvIGludm9rZWQgZnJvbSBzY3JlZW5jbGVhcigpKS4gIFRoYXQgaXMgYmVjYXVzZSB0aGUKICAgICAqICJidXN5IiBjaGVjayBhYm92ZSBtYXkgc2tpcCB0aGlzLCBidXQgbm90IHNjcmVlbmFsbG9jKCkuICovCgogICAgaWYgKFN0YXRlICE9IEFTS01PUkUgJiYgU3RhdGUgIT0gRVhURVJOQ01EICYmIFN0YXRlICE9IENPTkZJUk0pCglzY3JlZW5jbGVhcigpOwogICAgZWxzZQoJc2NyZWVuX3N0YXJ0KCk7CSAgICAvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KCiAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQogICAgewojaWZkZWYgRkVBVF9USVRMRQoJbWFrZXRpdGxlKCk7CiNlbmRpZgoJY2hhbmdlZF9saW5lX2Fidl9jdXJzKCk7CglpbnZhbGlkYXRlX2JvdGxpbmUoKTsKCgkvKgoJICogV2Ugb25seSByZWRyYXcgd2hlbiBpdCdzIG5lZWRlZDoKCSAqIC0gV2hpbGUgYXQgdGhlIG1vcmUgcHJvbXB0IG9yIGV4ZWN1dGluZyBhbiBleHRlcm5hbCBjb21tYW5kLCBkb24ndAoJICogICByZWRyYXcsIGJ1dCBwb3NpdGlvbiB0aGUgY3Vyc29yLgoJICogLSBXaGlsZSBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUsIG9ubHkgcmVkcmF3IHRoYXQuCgkgKiAtIGluIEV4IG1vZGUsIGRvbid0IHJlZHJhdyBhbnl0aGluZy4KCSAqIC0gT3RoZXJ3aXNlLCByZWRyYXcgcmlnaHQgbm93LCBhbmQgcG9zaXRpb24gdGhlIGN1cnNvci4KCSAqIEFsd2F5cyBuZWVkIHRvIGNhbGwgdXBkYXRlX3NjcmVlbigpIG9yIHNjcmVlbmFsbG9jKCksIHRvIG1ha2UKCSAqIHN1cmUgUm93cy9Db2x1bW5zIGFuZCB0aGUgc2l6ZSBvZiBTY3JlZW5MaW5lc1tdIGlzIGNvcnJlY3QhCgkgKi8KCWlmIChTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IEVYVEVSTkNNRCB8fCBTdGF0ZSA9PSBDT05GSVJNCgkJCQkJCQkgICAgIHx8IGV4bW9kZV9hY3RpdmUpCgl7CgkgICAgc2NyZWVuYWxsb2MoRkFMU0UpOwoJICAgIHJlcGVhdF9tZXNzYWdlKCk7Cgl9CgllbHNlCgl7CiNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKCSAgICBpZiAoY3Vyd2luLT53X3Bfc2NiKQoJCWRvX2NoZWNrX3Njcm9sbGJpbmQoVFJVRSk7CiNlbmRpZgoJICAgIGlmIChTdGF0ZSAmIENNRExJTkUpCgkgICAgewoJCXVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKCQlyZWRyYXdjbWRsaW5lKCk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJdXBkYXRlX3RvcGxpbmUoKTsKI2lmIGRlZmluZWQoRkVBVF9JTlNfRVhQQU5EKQoJCWlmIChwdW1fdmlzaWJsZSgpKQoJCXsKCQkgICAgcmVkcmF3X2xhdGVyKE5PVF9WQUxJRCk7CgkJICAgIGluc19jb21wbF9zaG93X3B1bSgpOyAvKiBUaGlzIGluY2x1ZGVzIHRoZSByZWRyYXcuICovCgkJfQoJCWVsc2UKI2VuZGlmCgkJICAgIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKCQlpZiAocmVkcmF3aW5nKCkpCgkJICAgIHNldGN1cnNvcigpOwoJICAgIH0KCX0KCWN1cnNvcl9vbigpOwkgICAgLyogcmVkcmF3aW5nIG1heSBoYXZlIHN3aXRjaGVkIGl0IG9mZiAqLwogICAgfQogICAgb3V0X2ZsdXNoKCk7CiAgICAtLWJ1c3k7Cn0KCi8qCiAqIFNldCB0aGUgdGVybWluYWwgdG8gVE1PREVfUkFXIChmb3IgTm9ybWFsIG1vZGUpIG9yIFRNT0RFX0NPT0sgKGZvciBleHRlcm5hbAogKiBjb21tYW5kcyBhbmQgRXggbW9kZSkuCiAqLwogICAgdm9pZApzZXR0bW9kZSh0bW9kZSkKICAgIGludAkgdG1vZGU7CnsKI2lmZGVmIEZFQVRfR1VJCiAgICAvKiBkb24ndCBzZXQgdGhlIHRlcm0gd2hlcmUgZ3ZpbSB3YXMgc3RhcnRlZCB0byBhbnkgbW9kZSAqLwogICAgaWYgKGd1aS5pbl91c2UpCglyZXR1cm47CiNlbmRpZgoKICAgIGlmIChmdWxsX3NjcmVlbikKICAgIHsKCS8qCgkgKiBXaGVuIHJldHVybmluZyBhZnRlciBjYWxsaW5nIGEgc2hlbGwgd2Ugd2FudCB0byByZWFsbHkgc2V0IHRoZQoJICogdGVybWluYWwgdG8gcmF3IG1vZGUsIGV2ZW4gdGhvdWdoIHdlIHRoaW5rIGl0IGFscmVhZHkgaXMsIGJlY2F1c2UKCSAqIHRoZSBzaGVsbCBwcm9ncmFtIG1heSBoYXZlIHJlc2V0IHRoZSB0ZXJtaW5hbCBtb2RlLgoJICogV2hlbiB3ZSB0aGluayB0aGUgdGVybWluYWwgaXMgbm9ybWFsLCBkb24ndCB0cnkgdG8gc2V0IGl0IHRvCgkgKiBub3JtYWwgYWdhaW4sIGJlY2F1c2UgdGhhdCBjYXVzZXMgcHJvYmxlbXMgKGxvZ291dCEpIG9uIHNvbWUKCSAqIG1hY2hpbmVzLgoJICovCglpZiAodG1vZGUgIT0gVE1PREVfQ09PSyB8fCBjdXJfdG1vZGUgIT0gVE1PREVfQ09PSykKCXsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCgkgICAgLyogTWF5IG5lZWQgdG8gY2hlY2sgZm9yIFRfQ1JWIHJlc3BvbnNlIGFuZCB0ZXJtY29kZXMsIGl0IGRvZXNuJ3QKCSAgICAgKiB3b3JrIGluIENvb2tlZCBtb2RlLCBhbiBleHRlcm5hbCBwcm9ncmFtIG1heSBnZXQgdGhlbS4gKi8KCSAgICBpZiAodG1vZGUgIT0gVE1PREVfUkFXICYmIGNydl9zdGF0dXMgPT0gQ1JWX1NFTlQpCgkJKHZvaWQpdnBlZWtjX25vbWFwKCk7CgkgICAgY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOwojZW5kaWYKI2lmZGVmIEZFQVRfTU9VU0VfVFRZCgkgICAgaWYgKHRtb2RlICE9IFRNT0RFX1JBVykKCQltY2hfc2V0bW91c2UoRkFMU0UpOwkJLyogc3dpdGNoIG1vdXNlIG9mZiAqLwojZW5kaWYKCSAgICBvdXRfZmx1c2goKTsKCSAgICBtY2hfc2V0dG1vZGUodG1vZGUpOyAgICAvKiBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uICovCgkgICAgY3VyX3Rtb2RlID0gdG1vZGU7CiNpZmRlZiBGRUFUX01PVVNFCgkgICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKCQlzZXRtb3VzZSgpOwkJCS8qIG1heSBzd2l0Y2ggbW91c2Ugb24gKi8KI2VuZGlmCgkgICAgb3V0X2ZsdXNoKCk7Cgl9CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQoJbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKI2VuZGlmCiAgICB9Cn0KCiAgICB2b2lkCnN0YXJ0dGVybWNhcCgpCnsKICAgIGlmIChmdWxsX3NjcmVlbiAmJiAhdGVybWNhcF9hY3RpdmUpCiAgICB7CglvdXRfc3RyKFRfVEkpOwkJCS8qIHN0YXJ0IHRlcm1jYXAgbW9kZSAqLwoJb3V0X3N0cihUX0tTKTsJCQkvKiBzdGFydCAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCglvdXRfZmx1c2goKTsKCXRlcm1jYXBfYWN0aXZlID0gVFJVRTsKCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCW1heV9yZXFfdGVybXJlc3BvbnNlKCk7CgkvKiBJbW1lZGlhdGVseSBjaGVjayBmb3IgYSByZXNwb25zZS4gIElmIHRfQ28gY2hhbmdlcywgd2UgZG9uJ3Qgd2FudAoJICogdG8gcmVkcmF3IHdpdGggd3JvbmcgY29sb3JzIGZpcnN0LiAqLwoJY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOwojZW5kaWYKICAgIH0KfQoKICAgIHZvaWQKc3RvcHRlcm1jYXAoKQp7CiAgICBzY3JlZW5fc3RvcF9oaWdobGlnaHQoKTsKICAgIHJlc2V0X2N0ZXJtX2NvbG9ycygpOwogICAgaWYgKHRlcm1jYXBfYWN0aXZlKQogICAgewojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCS8qIE1heSBuZWVkIHRvIGNoZWNrIGZvciBUX0NSViByZXNwb25zZS4gKi8KCWlmIChjcnZfc3RhdHVzID09IENSVl9TRU5UKQoJICAgICh2b2lkKXZwZWVrY19ub21hcCgpOwoJLyogQ2hlY2sgZm9yIHRlcm1jb2RlcyBmaXJzdCwgb3RoZXJ3aXNlIGFuIGV4dGVybmFsIHByb2dyYW0gbWF5IGdldAoJICogdGhlbS4gKi8KCWNoZWNrX2Zvcl9jb2Rlc19mcm9tX3Rlcm0oKTsKI2VuZGlmCglvdXRfc3RyKFRfS0UpOwkJCS8qIHN0b3AgImtleXBhZCB0cmFuc21pdCIgbW9kZSAqLwoJb3V0X2ZsdXNoKCk7Cgl0ZXJtY2FwX2FjdGl2ZSA9IEZBTFNFOwoJY3Vyc29yX29uKCk7CQkJLyoganVzdCBpbiBjYXNlIGl0IGlzIHN0aWxsIG9mZiAqLwoJb3V0X3N0cihUX1RFKTsJCQkvKiBzdG9wIHRlcm1jYXAgbW9kZSAqLwoJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCglvdXRfZmx1c2goKTsKICAgIH0KfQoKI2lmIGRlZmluZWQoRkVBVF9URVJNUkVTUE9OU0UpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFJlcXVlc3QgdmVyc2lvbiBzdHJpbmcgKGZvciB4dGVybSkgd2hlbiBuZWVkZWQuCiAqIE9ubHkgZG8gdGhpcyBhZnRlciBzd2l0Y2hpbmcgdG8gcmF3IG1vZGUsIG90aGVyd2lzZSB0aGUgcmVzdWx0IHdpbGwgYmUKICogZWNob2VkLgogKiBPbmx5IGRvIHRoaXMgYWZ0ZXIgc3RhcnR1cCBoYXMgZmluaXNoZWQsIHRvIGF2b2lkIHRoYXQgdGhlIHJlc3BvbnNlIGNvbWVzCiAqIHdoaWxlIGV4ZWN1dGluZyAiLWMgIWNtZCIgb3IgZXZlbiBhZnRlciAiLWMgcXVpdCIuCiAqIE9ubHkgZG8gdGhpcyBhZnRlciB0ZXJtY2FwIG1vZGUgaGFzIGJlZW4gc3RhcnRlZCwgb3RoZXJ3aXNlIHRoZSBjb2RlcyBmb3IKICogdGhlIGN1cnNvciBrZXlzIG1heSBiZSB3cm9uZy4KICogT25seSBkbyB0aGlzIHdoZW4gJ2VzY2tleXMnIGlzIG9uLCBvdGhlcndpc2UgdGhlIHJlc3BvbnNlIGNhdXNlcyB0cm91YmxlIGluCiAqIEluc2VydCBtb2RlLgogKiBPbiBVbml4IG9ubHkgZG8gaXQgd2hlbiBib3RoIG91dHB1dCBhbmQgaW5wdXQgYXJlIGEgdHR5IChhdm9pZCB3cml0aW5nCiAqIHJlcXVlc3QgdG8gdGVybWluYWwgd2hpbGUgcmVhZGluZyBmcm9tIGEgZmlsZSkuCiAqIFRoZSByZXN1bHQgaXMgY2F1Z2h0IGluIGNoZWNrX3Rlcm1jb2RlKCkuCiAqLwogICAgdm9pZAptYXlfcmVxX3Rlcm1yZXNwb25zZSgpCnsKICAgIGlmIChjcnZfc3RhdHVzID09IENSVl9HRVQKCSAgICAmJiBjdXJfdG1vZGUgPT0gVE1PREVfUkFXCgkgICAgJiYgc3RhcnRpbmcgPT0gMAoJICAgICYmIHRlcm1jYXBfYWN0aXZlCgkgICAgJiYgcF9lawojIGlmZGVmIFVOSVgKCSAgICAmJiBpc2F0dHkoMSkKCSAgICAmJiBpc2F0dHkocmVhZF9jbWRfZmQpCiMgZW5kaWYKCSAgICAmJiAqVF9DUlYgIT0gTlVMKQogICAgewoJb3V0X3N0cihUX0NSVik7CgljcnZfc3RhdHVzID0gQ1JWX1NFTlQ7CgkvKiBjaGVjayBmb3IgdGhlIGNoYXJhY3RlcnMgbm93LCBvdGhlcndpc2UgdGhleSBtaWdodCBiZSBlYXRlbiBieQoJICogZ2V0X2tleXN0cm9rZSgpICovCglvdXRfZmx1c2goKTsKCSh2b2lkKXZwZWVrY19ub21hcCgpOwogICAgfQp9CiNlbmRpZgoKLyoKICogUmV0dXJuIFRSVUUgd2hlbiBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgc2NyZWVuLgogKi8KICAgIGludApzd2FwcGluZ19zY3JlZW4oKQp7CiAgICByZXR1cm4gKGZ1bGxfc2NyZWVuICYmICpUX1RJICE9IE5VTCk7Cn0KCiNpZmRlZiBGRUFUX01PVVNFCi8qCiAqIHNldG1vdXNlKCkgLSBzd2l0Y2ggbW91c2Ugb24vb2ZmIGRlcGVuZGluZyBvbiBjdXJyZW50IG1vZGUgYW5kICdtb3VzZScKICovCiAgICB2b2lkCnNldG1vdXNlKCkKewojIGlmZGVmIEZFQVRfTU9VU0VfVFRZCiAgICBpbnQJICAgIGNoZWNrZm9yOwojIGVuZGlmCgojIGlmZGVmIEZFQVRfTU9VU0VTSEFQRQogICAgdXBkYXRlX21vdXNlc2hhcGUoLTEpOwojIGVuZGlmCgojIGlmZGVmIEZFQVRfTU9VU0VfVFRZIC8qIFNob3VsZCBiZSBvdXRzaWRlIHByb2MsIGJ1dCBtYXkgYnJlYWsgTU9VU0VTSEFQRSAqLwojICBpZmRlZiBGRUFUX0dVSQogICAgLyogSW4gdGhlIEdVSSB0aGUgbW91c2UgaXMgYWx3YXlzIGVuYWJsZWQuICovCiAgICBpZiAoZ3VpLmluX3VzZSkKCXJldHVybjsKIyAgZW5kaWYKICAgIC8qIGJlIHF1aWNrIHdoZW4gbW91c2UgaXMgb2ZmICovCiAgICBpZiAoKnBfbW91c2UgPT0gTlVMIHx8IGhhc19tb3VzZV90ZXJtY29kZSA9PSAwKQoJcmV0dXJuOwoKICAgIC8qIGRvbid0IHN3aXRjaCBtb3VzZSBvbiB3aGVuIG5vdCBpbiByYXcgbW9kZSAoRXggbW9kZSkgKi8KICAgIGlmIChjdXJfdG1vZGUgIT0gVE1PREVfUkFXKQogICAgewoJbWNoX3NldG1vdXNlKEZBTFNFKTsKCXJldHVybjsKICAgIH0KCiMgIGlmZGVmIEZFQVRfVklTVUFMCiAgICBpZiAoVklzdWFsX2FjdGl2ZSkKCWNoZWNrZm9yID0gTU9VU0VfVklTVUFMOwogICAgZWxzZQojICBlbmRpZgoJaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IFNFVFdTSVpFKQoJY2hlY2tmb3IgPSBNT1VTRV9SRVRVUk47CiAgICBlbHNlIGlmIChTdGF0ZSAmIElOU0VSVCkKCWNoZWNrZm9yID0gTU9VU0VfSU5TRVJUOwogICAgZWxzZSBpZiAoU3RhdGUgJiBDTURMSU5FKQoJY2hlY2tmb3IgPSBNT1VTRV9DT01NQU5EOwogICAgZWxzZSBpZiAoU3RhdGUgPT0gQ09ORklSTSB8fCBTdGF0ZSA9PSBFWFRFUk5DTUQpCgljaGVja2ZvciA9ICcgJzsgLyogZG9uJ3QgdXNlIG1vdXNlIGZvciAiOmNvbmZpcm0iIG9yICI6IWNtZCIgKi8KICAgIGVsc2UKCWNoZWNrZm9yID0gTU9VU0VfTk9STUFMOyAgICAvKiBhc3N1bWUgbm9ybWFsIG1vZGUgKi8KCiAgICBpZiAobW91c2VfaGFzKGNoZWNrZm9yKSkKCW1jaF9zZXRtb3VzZShUUlVFKTsKICAgIGVsc2UKCW1jaF9zZXRtb3VzZShGQUxTRSk7CiMgZW5kaWYKfQoKLyoKICogUmV0dXJuIFRSVUUgaWYKICogLSAiYyIgaXMgaW4gJ21vdXNlJywgb3IKICogLSAnYScgaXMgaW4gJ21vdXNlJyBhbmQgImMiIGlzIGluIE1PVVNFX0EsIG9yCiAqIC0gdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGEgaGVscCBmaWxlIGFuZCAnaCcgaXMgaW4gJ21vdXNlJyBhbmQgd2UgYXJlIGluIGEKICogICBub3JtYWwgZWRpdGluZyBtb2RlIChub3QgYXQgaGl0LXJldHVybiBtZXNzYWdlKS4KICovCiAgICBpbnQKbW91c2VfaGFzKGMpCiAgICBpbnQJICAgIGM7CnsKICAgIGNoYXJfdQkqcDsKCiAgICBmb3IgKHAgPSBwX21vdXNlOyAqcDsgKytwKQoJc3dpdGNoICgqcCkKCXsKCSAgICBjYXNlICdhJzogaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKU1PVVNFX0EsIGMpICE9IE5VTEwpCgkJCSAgcmV0dXJuIFRSVUU7CgkJICAgICAgYnJlYWs7CgkgICAgY2FzZSBNT1VTRV9IRUxQOiBpZiAoYyAhPSBNT1VTRV9SRVRVUk4gJiYgY3VyYnVmLT5iX2hlbHApCgkJCQkgcmV0dXJuIFRSVUU7CgkJCSAgICAgYnJlYWs7CgkgICAgZGVmYXVsdDogaWYgKGMgPT0gKnApIHJldHVybiBUUlVFOyBicmVhazsKCX0KICAgIHJldHVybiBGQUxTRTsKfQoKLyoKICogUmV0dXJuIFRSVUUgd2hlbiAnbW91c2Vtb2RlbCcgaXMgc2V0IHRvICJwb3B1cCIgb3IgInBvcHVwX3NldHBvcyIuCiAqLwogICAgaW50Cm1vdXNlX21vZGVsX3BvcHVwKCkKewogICAgcmV0dXJuIChwX21vdXNlbVswXSA9PSAncCcpOwp9CiNlbmRpZgoKLyoKICogQnkgb3V0cHV0dGluZyB0aGUgJ2N1cnNvciB2ZXJ5IHZpc2libGUnIHRlcm1jYXAgY29kZSwgZm9yIHNvbWUgd2luZG93ZWQKICogdGVybWluYWxzIHRoaXMgbWFrZXMgdGhlIHNjcmVlbiBzY3JvbGxlZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbi4KICogVXNlZCB3aGVuIHN0YXJ0aW5nIFZpbSBvciByZXR1cm5pbmcgZnJvbSBhIHNoZWxsLgogKi8KICAgIHZvaWQKc2Nyb2xsX3N0YXJ0KCkKewogICAgaWYgKCpUX1ZTICE9IE5VTCkKICAgIHsKCW91dF9zdHIoVF9WUyk7CglvdXRfc3RyKFRfVkUpOwoJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCiAgICB9Cn0KCnN0YXRpYyBpbnQgY3Vyc29yX2lzX29mZiA9IEZBTFNFOwoKLyoKICogRW5hYmxlIHRoZSBjdXJzb3IuCiAqLwogICAgdm9pZApjdXJzb3Jfb24oKQp7CiAgICBpZiAoY3Vyc29yX2lzX29mZikKICAgIHsKCW91dF9zdHIoVF9WRSk7CgljdXJzb3JfaXNfb2ZmID0gRkFMU0U7CiAgICB9Cn0KCi8qCiAqIERpc2FibGUgdGhlIGN1cnNvci4KICovCiAgICB2b2lkCmN1cnNvcl9vZmYoKQp7CiAgICBpZiAoZnVsbF9zY3JlZW4pCiAgICB7CglpZiAoIWN1cnNvcl9pc19vZmYpCgkgICAgb3V0X3N0cihUX1ZJKTsJICAgIC8qIGRpc2FibGUgY3Vyc29yICovCgljdXJzb3JfaXNfb2ZmID0gVFJVRTsKICAgIH0KfQoKI2lmIGRlZmluZWQoQ1VSU09SX1NIQVBFKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBTZXQgY3Vyc29yIHNoYXBlIHRvIG1hdGNoIEluc2VydCBtb2RlLgogKi8KICAgIHZvaWQKdGVybV9jdXJzb3Jfc2hhcGUoKQp7CiAgICBzdGF0aWMgaW50IHNob3dpbmdfaW5zZXJ0X21vZGUgPSBNQVlCRTsKCiAgICBpZiAoIWZ1bGxfc2NyZWVuIHx8ICpUX0NTSSA9PSBOVUwgfHwgKlRfQ0VJID09IE5VTCkKCXJldHVybjsKCiAgICBpZiAoU3RhdGUgJiBJTlNFUlQpCiAgICB7CglpZiAoc2hvd2luZ19pbnNlcnRfbW9kZSAhPSBUUlVFKQoJICAgIG91dF9zdHIoVF9DU0kpOwkgICAgLyogSW5zZXJ0IG1vZGUgY3Vyc29yICovCglzaG93aW5nX2luc2VydF9tb2RlID0gVFJVRTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmIChzaG93aW5nX2luc2VydF9tb2RlICE9IEZBTFNFKQoJICAgIG91dF9zdHIoVF9DRUkpOwkgICAgLyogbm9uLUluc2VydCBtb2RlIGN1cnNvciAqLwoJc2hvd2luZ19pbnNlcnRfbW9kZSA9IEZBTFNFOwogICAgfQp9CiNlbmRpZgoKLyoKICogU2V0IHNjcm9sbGluZyByZWdpb24gZm9yIHdpbmRvdyAnd3AnLgogKiBUaGUgcmVnaW9uIHN0YXJ0cyAnb2ZmJyBsaW5lcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgd2luZG93LgogKiBBbHNvIHNldCB0aGUgdmVydGljYWwgc2Nyb2xsIHJlZ2lvbiBmb3IgYSB2ZXJ0aWNhbGx5IHNwbGl0IHdpbmRvdy4gIEFsd2F5cwogKiB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgd2luZG93LCBleGNsdWRpbmcgdGhlIHZlcnRpY2FsIHNlcGFyYXRvci4KICovCiAgICB2b2lkCnNjcm9sbF9yZWdpb25fc2V0KHdwLCBvZmYpCiAgICB3aW5fVAkqd3A7CiAgICBpbnQJCW9mZjsKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1MsIFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodCAtIDEsCgkJCQkJCQkgV19XSU5ST1cod3ApICsgb2ZmKSk7CiNpZmRlZiBGRUFUX1ZFUlRTUExJVAogICAgaWYgKCpUX0NTViAhPSBOVUwgJiYgd3AtPndfd2lkdGggIT0gQ29sdW1ucykKCU9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTViwgV19XSU5DT0wod3ApICsgd3AtPndfd2lkdGggLSAxLAoJCQkJCQkJICAgICAgIFdfV0lOQ09MKHdwKSkpOwojZW5kaWYKICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwp9CgovKgogKiBSZXNldCBzY3JvbGxpbmcgcmVnaW9uIHRvIHRoZSB3aG9sZSBzY3JlZW4uCiAqLwogICAgdm9pZApzY3JvbGxfcmVnaW9uX3Jlc2V0KCkKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1MsIChpbnQpUm93cyAtIDEsIDApKTsKI2lmZGVmIEZFQVRfVkVSVFNQTElUCiAgICBpZiAoKlRfQ1NWICE9IE5VTCkKCU9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTViwgKGludClDb2x1bW5zIC0gMSwgMCkpOwojZW5kaWYKICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwp9CgoKLyoKICogTGlzdCBvZiB0ZXJtaW5hbCBjb2RlcyB0aGF0IGFyZSBjdXJyZW50bHkgcmVjb2duaXplZC4KICovCgpzdGF0aWMgc3RydWN0IHRlcm1jb2RlCnsKICAgIGNoYXJfdSAgbmFtZVsyXTsJICAgIC8qIHRlcm1jYXAgbmFtZSBvZiBlbnRyeSAqLwogICAgY2hhcl91ICAqY29kZTsJICAgIC8qIHRlcm1pbmFsIGNvZGUgKGluIGFsbG9jYXRlZCBtZW1vcnkpICovCiAgICBpbnQJICAgIGxlbjsJICAgIC8qIFNUUkxFTihjb2RlKSAqLwogICAgaW50CSAgICBtb2RsZW47CSAgICAvKiBsZW5ndGggb2YgcGFydCBiZWZvcmUgIjsqfiIuICovCn0gKnRlcm1jb2RlcyA9IE5VTEw7CgpzdGF0aWMgaW50ICB0Y19tYXhfbGVuID0gMDsgLyogbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0ZXJtY29kZXNbXSBjYW4gaG9sZCAqLwpzdGF0aWMgaW50ICB0Y19sZW4gPSAwOwkgICAgLyogY3VycmVudCBudW1iZXIgb2YgZW50cmllcyBpbiB0ZXJtY29kZXNbXSAqLwoKc3RhdGljIGludCB0ZXJtY29kZV9zdGFyIF9fQVJHUygoY2hhcl91ICpjb2RlLCBpbnQgbGVuKSk7CgogICAgdm9pZApjbGVhcl90ZXJtY29kZXMoKQp7CiAgICB3aGlsZSAodGNfbGVuID4gMCkKCXZpbV9mcmVlKHRlcm1jb2Rlc1stLXRjX2xlbl0uY29kZSk7CiAgICB2aW1fZnJlZSh0ZXJtY29kZXMpOwogICAgdGVybWNvZGVzID0gTlVMTDsKICAgIHRjX21heF9sZW4gPSAwOwoKI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgQkMgPSAoY2hhciAqKWVtcHR5X29wdGlvbjsKICAgIFVQID0gKGNoYXIgKillbXB0eV9vcHRpb247CiAgICBQQyA9IE5VTDsJCQkvKiBzZXQgcGFkIGNoYXJhY3RlciB0byBOVUwgKi8KICAgIG9zcGVlZCA9IDA7CiNlbmRpZgoKICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KfQoKI2RlZmluZSBBVENfRlJPTV9URVJNIDU1CgovKgogKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGxpc3Qgb2YgdGVybWluYWwgY29kZXMuCiAqIFRoZSBsaXN0IGlzIGtlcHQgYWxwaGFiZXRpY2FsIGZvciAiOnNldCB0ZXJtY2FwIgogKiAiZmxhZ3MiIGlzIFRSVUUgd2hlbiByZXBsYWNpbmcgNy1iaXQgYnkgOC1iaXQgY29udHJvbHMgaXMgZGVzaXJlZC4KICogImZsYWdzIiBjYW4gYWxzbyBiZSBBVENfRlJPTV9URVJNIGZvciBnb3RfY29kZV9mcm9tX3Rlcm0oKS4KICovCiAgICB2b2lkCmFkZF90ZXJtY29kZShuYW1lLCBzdHJpbmcsIGZsYWdzKQogICAgY2hhcl91CSpuYW1lOwogICAgY2hhcl91CSpzdHJpbmc7CiAgICBpbnQJCWZsYWdzOwp7CiAgICBzdHJ1Y3QgdGVybWNvZGUgKm5ld190YzsKICAgIGludAkJICAgIGksIGo7CiAgICBjaGFyX3UJICAgICpzOwogICAgaW50CQkgICAgbGVuOwoKICAgIGlmIChzdHJpbmcgPT0gTlVMTCB8fCAqc3RyaW5nID09IE5VTCkKICAgIHsKCWRlbF90ZXJtY29kZShuYW1lKTsKCXJldHVybjsKICAgIH0KCiAgICBzID0gdmltX3N0cnNhdmUoc3RyaW5nKTsKICAgIGlmIChzID09IE5VTEwpCglyZXR1cm47CgogICAgLyogQ2hhbmdlIGxlYWRpbmcgPEVzYz5bIHRvIENTSSwgY2hhbmdlIDxFc2M+TyB0byA8TS1PPi4gKi8KICAgIGlmIChmbGFncyAhPSAwICYmIGZsYWdzICE9IEFUQ19GUk9NX1RFUk0gJiYgdGVybV83dG84Yml0KHN0cmluZykgIT0gMCkKICAgIHsKCW1jaF9tZW1tb3ZlKHMsIHMgKyAxLCBTVFJMRU4ocykpOwoJc1swXSA9IHRlcm1fN3RvOGJpdChzdHJpbmcpOwogICAgfQogICAgbGVuID0gKGludClTVFJMRU4ocyk7CgogICAgbmVlZF9nYXRoZXIgPSBUUlVFOwkJLyogbmVlZCB0byBmaWxsIHRlcm1sZWFkZXJbXSAqLwoKICAgIC8qCiAgICAgKiBuZWVkIHRvIG1ha2Ugc3BhY2UgZm9yIG1vcmUgZW50cmllcwogICAgICovCiAgICBpZiAodGNfbGVuID09IHRjX21heF9sZW4pCiAgICB7Cgl0Y19tYXhfbGVuICs9IDIwOwoJbmV3X3RjID0gKHN0cnVjdCB0ZXJtY29kZSAqKWFsbG9jKAoJCQkgICAgKHVuc2lnbmVkKSh0Y19tYXhfbGVuICogc2l6ZW9mKHN0cnVjdCB0ZXJtY29kZSkpKTsKCWlmIChuZXdfdGMgPT0gTlVMTCkKCXsKCSAgICB0Y19tYXhfbGVuIC09IDIwOwoJICAgIHJldHVybjsKCX0KCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCSAgICBuZXdfdGNbaV0gPSB0ZXJtY29kZXNbaV07Cgl2aW1fZnJlZSh0ZXJtY29kZXMpOwoJdGVybWNvZGVzID0gbmV3X3RjOwogICAgfQoKICAgIC8qCiAgICAgKiBMb29rIGZvciBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIG5hbWUsIGl0IGlzIHJlcGxhY2VkLgogICAgICogTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgdGhhdCBpcyBhbHBoYWJldGljYWwgaGlnaGVyLCB0aGUgbmV3IGVudHJ5CiAgICAgKiBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZiBpdC4KICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQogICAgewoJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdIDwgbmFtZVswXSkKCSAgICBjb250aW51ZTsKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdKQoJewoJICAgIGlmICh0ZXJtY29kZXNbaV0ubmFtZVsxXSA8IG5hbWVbMV0pCgkJY29udGludWU7CgkgICAgLyoKCSAgICAgKiBFeGFjdCBtYXRjaDogTWF5IHJlcGxhY2Ugb2xkIGNvZGUuCgkgICAgICovCgkgICAgaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCgkgICAgewoJCWlmIChmbGFncyA9PSBBVENfRlJPTV9URVJNICYmIChqID0gdGVybWNvZGVfc3RhcigKCQkJCSAgICB0ZXJtY29kZXNbaV0uY29kZSwgdGVybWNvZGVzW2ldLmxlbikpID4gMCkKCQl7CgkJICAgIC8qIERvbid0IHJlcGxhY2UgRVNDWzEyMzsqWCBvciBFU0MgTypYIHdpdGggYW5vdGhlciB3aGVuCgkJICAgICAqIGludm9rZWQgZnJvbSBnb3RfY29kZV9mcm9tX3Rlcm0oKS4gKi8KCQkgICAgaWYgKGxlbiA9PSB0ZXJtY29kZXNbaV0ubGVuIC0gagoJCQkgICAgJiYgU1RSTkNNUChzLCB0ZXJtY29kZXNbaV0uY29kZSwgbGVuIC0gMSkgPT0gMAoJCQkgICAgJiYgc1tsZW4gLSAxXQoJCQkJICAgPT0gdGVybWNvZGVzW2ldLmNvZGVbdGVybWNvZGVzW2ldLmxlbiAtIDFdKQoJCSAgICB7CgkJCS8qIFRoZXkgYXJlIGVxdWFsIGJ1dCBmb3IgdGhlICI7KiI6IGRvbid0IGFkZCBpdC4gKi8KCQkJdmltX2ZyZWUocyk7CgkJCXJldHVybjsKCQkgICAgfQoJCX0KCQllbHNlCgkJewoJCSAgICAvKiBSZXBsYWNlIG9sZCBjb2RlLiAqLwoJCSAgICB2aW1fZnJlZSh0ZXJtY29kZXNbaV0uY29kZSk7CgkJICAgIC0tdGNfbGVuOwoJCSAgICBicmVhazsKCQl9CgkgICAgfQoJfQoJLyoKCSAqIEZvdW5kIGFscGhhYmV0aWNhbCBsYXJnZXIgZW50cnksIG1vdmUgcmVzdCB0byBpbnNlcnQgbmV3IGVudHJ5CgkgKi8KCWZvciAoaiA9IHRjX2xlbjsgaiA+IGk7IC0taikKCSAgICB0ZXJtY29kZXNbal0gPSB0ZXJtY29kZXNbaiAtIDFdOwoJYnJlYWs7CiAgICB9CgogICAgdGVybWNvZGVzW2ldLm5hbWVbMF0gPSBuYW1lWzBdOwogICAgdGVybWNvZGVzW2ldLm5hbWVbMV0gPSBuYW1lWzFdOwogICAgdGVybWNvZGVzW2ldLmNvZGUgPSBzOwogICAgdGVybWNvZGVzW2ldLmxlbiA9IGxlbjsKCiAgICAvKiBGb3IgeHRlcm0gd2UgcmVjb2duaXplIHNwZWNpYWwgY29kZXMgbGlrZSAiRVNDWzQyOypYIiBhbmQgIkVTQyBPKlgiIHRoYXQKICAgICAqIGFjY2VwdCBtb2RpZmllcnMuICovCiAgICB0ZXJtY29kZXNbaV0ubW9kbGVuID0gMDsKICAgIGogPSB0ZXJtY29kZV9zdGFyKHMsIGxlbik7CiAgICBpZiAoaiA+IDApCgl0ZXJtY29kZXNbaV0ubW9kbGVuID0gbGVuIC0gMSAtIGo7CiAgICArK3RjX2xlbjsKfQoKLyoKICogQ2hlY2sgdGVybWNvZGUgImNvZGVbbGVuXSIgZm9yIGVuZGluZyBpbiA7KlgsIDxFc2M+TypYIG9yIDxNLU8+KlguCiAqIFRoZSAiWCIgY2FuIGJlIGFueSBjaGFyYWN0ZXIuCiAqIFJldHVybiAwIGlmIG5vdCBmb3VuZCwgMiBmb3IgOypYIGFuZCAxIGZvciBPKlggYW5kIDxNLU8+KlguCiAqLwogICAgc3RhdGljIGludAp0ZXJtY29kZV9zdGFyKGNvZGUsIGxlbikKICAgIGNoYXJfdQkqY29kZTsKICAgIGludAkJbGVuOwp7CiAgICAvKiBTaG9ydGVzdCBpcyA8TS1PPipYLiAgV2l0aCA7IHNob3J0ZXN0IGlzIDxDU0k+MTsqWCAqLwogICAgaWYgKGxlbiA+PSAzICYmIGNvZGVbbGVuIC0gMl0gPT0gJyonKQogICAgewoJaWYgKGxlbiA+PSA1ICYmIGNvZGVbbGVuIC0gM10gPT0gJzsnKQoJICAgIHJldHVybiAyOwoJaWYgKChsZW4gPj0gNCAmJiBjb2RlW2xlbiAtIDNdID09ICdPJykgfHwgY29kZVtsZW4gLSAzXSA9PSAnTycgKyAxMjgpCgkgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKICAgIGNoYXJfdSAgKgpmaW5kX3Rlcm1jb2RlKG5hbWUpCiAgICBjaGFyX3UgICpuYW1lOwp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IG5hbWVbMF0gJiYgdGVybWNvZGVzW2ldLm5hbWVbMV0gPT0gbmFtZVsxXSkKCSAgICByZXR1cm4gdGVybWNvZGVzW2ldLmNvZGU7CiAgICByZXR1cm4gTlVMTDsKfQoKI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQogICAgY2hhcl91ICoKZ2V0X3Rlcm1jb2RlKGkpCiAgICBpbnQJICAgIGk7CnsKICAgIGlmIChpID49IHRjX2xlbikKCXJldHVybiBOVUxMOwogICAgcmV0dXJuICZ0ZXJtY29kZXNbaV0ubmFtZVswXTsKfQojZW5kaWYKCiAgICB2b2lkCmRlbF90ZXJtY29kZShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgaW50CSAgICBpOwoKICAgIGlmICh0ZXJtY29kZXMgPT0gTlVMTCkJLyogbm90aGluZyB0aGVyZSB5ZXQgKi8KCXJldHVybjsKCiAgICBuZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCgogICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IG5hbWVbMF0gJiYgdGVybWNvZGVzW2ldLm5hbWVbMV0gPT0gbmFtZVsxXSkKCXsKCSAgICBkZWxfdGVybWNvZGVfaWR4KGkpOwoJICAgIHJldHVybjsKCX0KICAgIC8qIG5vdCBmb3VuZC4gR2l2ZSBlcnJvciBtZXNzYWdlPyAqLwp9CgogICAgc3RhdGljIHZvaWQKZGVsX3Rlcm1jb2RlX2lkeChpZHgpCiAgICBpbnQJCWlkeDsKewogICAgaW50CQlpOwoKICAgIHZpbV9mcmVlKHRlcm1jb2Rlc1tpZHhdLmNvZGUpOwogICAgLS10Y19sZW47CiAgICBmb3IgKGkgPSBpZHg7IGkgPCB0Y19sZW47ICsraSkKCXRlcm1jb2Rlc1tpXSA9IHRlcm1jb2Rlc1tpICsgMV07Cn0KCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQovKgogKiBDYWxsZWQgd2hlbiBkZXRlY3RlZCB0aGF0IHRoZSB0ZXJtaW5hbCBzZW5kcyA4LWJpdCBjb2Rlcy4KICogQ29udmVydCBhbGwgNy1iaXQgY29kZXMgdG8gdGhlaXIgOC1iaXQgZXF1aXZhbGVudC4KICovCiAgICBzdGF0aWMgdm9pZApzd2l0Y2hfdG9fOGJpdCgpCnsKICAgIGludAkJaTsKICAgIGludAkJYzsKCiAgICAvKiBPbmx5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHdoZW4gbm90IGFscmVhZHkgdXNpbmcgOC1iaXQgY29kZXMuICovCiAgICBpZiAoIXRlcm1faXNfOGJpdChUX05BTUUpKQogICAgewoJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJewoJICAgIGMgPSB0ZXJtXzd0bzhiaXQodGVybWNvZGVzW2ldLmNvZGUpOwoJICAgIGlmIChjICE9IDApCgkgICAgewoJCW1jaF9tZW1tb3ZlKHRlcm1jb2Rlc1tpXS5jb2RlICsgMSwgdGVybWNvZGVzW2ldLmNvZGUgKyAyLAoJCQkJCSAgICAgICBTVFJMRU4odGVybWNvZGVzW2ldLmNvZGUgKyAxKSk7CgkJdGVybWNvZGVzW2ldLmNvZGVbMF0gPSBjOwoJICAgIH0KCX0KCW5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KICAgIH0KICAgIGRldGVjdGVkXzhiaXQgPSBUUlVFOwp9CiNlbmRpZgoKI2lmZGVmIENIRUNLX0RPVUJMRV9DTElDSwpzdGF0aWMgbGluZW5yX1Qgb3JpZ190b3BsaW5lID0gMDsKIyBpZmRlZiBGRUFUX0RJRkYKc3RhdGljIGludCBvcmlnX3RvcGZpbGwgPSAwOwojIGVuZGlmCiNlbmRpZgojaWYgKGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKENIRUNLX0RPVUJMRV9DTElDSykpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIENoZWNraW5nIGZvciBkb3VibGUgY2xpY2tzIG91cnNlbHZlcy4KICogIm9yaWdfdG9wbGluZSIgaXMgdXNlZCB0byBhdm9pZCBkZXRlY3RpbmcgYSBkb3VibGUtY2xpY2sgd2hlbiB0aGUgd2luZG93CiAqIGNvbnRlbnRzIHNjcm9sbGVkIChlLmcuLCB3aGVuICdzY3JvbGxvZmYnIGlzIG5vbi16ZXJvKS4KICovCi8qCiAqIFNldCBvcmlnX3RvcGxpbmUuICBVc2VkIHdoZW4ganVtcGluZyB0byBhbm90aGVyIHdpbmRvdywgc28gdGhhdCBhIGRvdWJsZQogKiBjbGljayBzdGlsbCB3b3Jrcy4KICovCiAgICB2b2lkCnNldF9tb3VzZV90b3BsaW5lKHdwKQogICAgd2luX1QJKndwOwp7CiAgICBvcmlnX3RvcGxpbmUgPSB3cC0+d190b3BsaW5lOwojIGlmZGVmIEZFQVRfRElGRgogICAgb3JpZ190b3BmaWxsID0gd3AtPndfdG9wZmlsbDsKIyBlbmRpZgp9CiNlbmRpZgoKLyoKICogQ2hlY2sgaWYgdHlwZWJ1Zi50Yl9idWZbXSBjb250YWlucyBhIHRlcm1pbmFsIGtleSBjb2RlLgogKiBDaGVjayBmcm9tIHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmXSB0byB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZgogKiArIG1heF9vZmZzZXRdLgogKiBSZXR1cm4gMCBmb3Igbm8gbWF0Y2gsIC0xIGZvciBwYXJ0aWFsIG1hdGNoLCA+IDAgZm9yIGZ1bGwgbWF0Y2guCiAqIFdpdGggYSBtYXRjaCwgdGhlIG1hdGNoIGlzIHJlbW92ZWQsIHRoZSByZXBsYWNlbWVudCBjb2RlIGlzIGluc2VydGVkIGluCiAqIHR5cGVidWYudGJfYnVmW10gYW5kIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0eXBlYnVmLnRiX2J1ZltdIGlzCiAqIHJldHVybmVkLgogKiBXaGVuICJidWYiIGlzIG5vdCBOVUxMLCBpdCBpcyB1c2VkIGluc3RlYWQgb2YgdHlwZWJ1Zi50Yl9idWZbXS4gImJ1ZmxlbiIgaXMKICogdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnVmW10uCiAqLwogICAgaW50CmNoZWNrX3Rlcm1jb2RlKG1heF9vZmZzZXQsIGJ1ZiwgYnVmbGVuKQogICAgaW50CQltYXhfb2Zmc2V0OwogICAgY2hhcl91CSpidWY7CiAgICBpbnQJCWJ1ZmxlbjsKewogICAgY2hhcl91CSp0cDsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJc2xlbiA9IDA7CS8qIGluaXQgZm9yIEdDQyAqLwogICAgaW50CQltb2RzbGVuOwogICAgaW50CQlsZW47CiAgICBpbnQJCW9mZnNldDsKICAgIGNoYXJfdQlrZXlfbmFtZVsyXTsKICAgIGludAkJbW9kaWZpZXJzOwogICAgaW50CQlrZXk7CiAgICBpbnQJCW5ld19zbGVuOwogICAgaW50CQlleHRyYTsKICAgIGNoYXJfdQlzdHJpbmdbTUFYX0tFWV9DT0RFX0xFTiArIDFdOwogICAgaW50CQlpLCBqOwogICAgaW50CQlpZHggPSAwOwojaWZkZWYgRkVBVF9NT1VTRQojIGlmICFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX0dVSSkKICAgIGNoYXJfdQlieXRlc1s2XTsKICAgIGludAkJbnVtX2J5dGVzOwojIGVuZGlmCiAgICBpbnQJCW1vdXNlX2NvZGUgPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCiAgICBpbnQJCWlzX2NsaWNrLCBpc19kcmFnOwogICAgaW50CQl3aGVlbF9jb2RlID0gMDsKICAgIGludAkJY3VycmVudF9idXR0b247CiAgICBzdGF0aWMgaW50CWhlbGRfYnV0dG9uID0gTU9VU0VfUkVMRUFTRTsKICAgIHN0YXRpYyBpbnQJb3JpZ19udW1fY2xpY2tzID0gMTsKICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9jb2RlID0gMHgwOwojIGlmZGVmIENIRUNLX0RPVUJMRV9DTElDSwogICAgc3RhdGljIGludAlvcmlnX21vdXNlX2NvbCA9IDA7CiAgICBzdGF0aWMgaW50CW9yaWdfbW91c2Vfcm93ID0gMDsKICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCAgb3JpZ19tb3VzZV90aW1lID0gezAsIDB9OwoJCQkJCS8qIHRpbWUgb2YgcHJldmlvdXMgbW91c2UgY2xpY2sgKi8KICAgIHN0cnVjdCB0aW1ldmFsICBtb3VzZV90aW1lOwkJLyogdGltZSBvZiBjdXJyZW50IG1vdXNlIGNsaWNrICovCiAgICBsb25nCXRpbWVkaWZmOwkJLyogZWxhcHNlZCB0aW1lIGluIG1zZWMgKi8KIyBlbmRpZgojZW5kaWYKICAgIGludAkJY3BvX2tvZmZzZXQ7CiNpZmRlZiBGRUFUX01PVVNFX0dQTQogICAgZXh0ZXJuIGludAlncG1fZmxhZzsgLyogZ3BtIGxpYnJhcnkgdmFyaWFibGUgKi8KI2VuZGlmCgogICAgY3BvX2tvZmZzZXQgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tPRkZTRVQpICE9IE5VTEwpOwoKICAgIC8qCiAgICAgKiBTcGVlZCB1cCB0aGUgY2hlY2tzIGZvciB0ZXJtaW5hbCBjb2RlcyBieSBnYXRoZXJpbmcgYWxsIGZpcnN0IGJ5dGVzCiAgICAgKiB1c2VkIGluIHRlcm1sZWFkZXJbXS4gIE9mdGVuIHRoaXMgaXMganVzdCBhIHNpbmdsZSA8RXNjPi4KICAgICAqLwogICAgaWYgKG5lZWRfZ2F0aGVyKQoJZ2F0aGVyX3Rlcm1sZWFkZXIoKTsKCiAgICAvKgogICAgICogQ2hlY2sgYXQgc2V2ZXJhbCBwb3NpdGlvbnMgaW4gdHlwZWJ1Zi50Yl9idWZbXSwgdG8gY2F0Y2ggc29tZXRoaW5nIGxpa2UKICAgICAqICJ4PFVwPiIgdGhhdCBjYW4gYmUgbWFwcGVkLiBTdG9wIGF0IG1heF9vZmZzZXQsIGJlY2F1c2UgY2hhcmFjdGVycwogICAgICogYWZ0ZXIgdGhhdCBjYW5ub3QgYmUgdXNlZCBmb3IgbWFwcGluZywgYW5kIHdpdGggQHIgY29tbWFuZHMKICAgICAqIHR5cGVidWYudGJfYnVmW10KICAgICAqIGNhbiBiZWNvbWUgdmVyeSBsb25nLgogICAgICogVGhpcyBpcyB1c2VkIG9mdGVuLCBLRUVQIElUIEZBU1QhCiAgICAgKi8KICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbWF4X29mZnNldDsgKytvZmZzZXQpCiAgICB7CglpZiAoYnVmID09IE5VTEwpCgl7CgkgICAgaWYgKG9mZnNldCA+PSB0eXBlYnVmLnRiX2xlbikKCQlicmVhazsKCSAgICB0cCA9IHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYgKyBvZmZzZXQ7CgkgICAgbGVuID0gdHlwZWJ1Zi50Yl9sZW4gLSBvZmZzZXQ7CS8qIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi8KCX0KCWVsc2UKCXsKCSAgICBpZiAob2Zmc2V0ID49IGJ1ZmxlbikKCQlicmVhazsKCSAgICB0cCA9IGJ1ZiArIG9mZnNldDsKCSAgICBsZW4gPSBidWZsZW4gLSBvZmZzZXQ7Cgl9CgoJLyoKCSAqIERvbid0IGNoZWNrIGNoYXJhY3RlcnMgYWZ0ZXIgS19TUEVDSUFMLCB0aG9zZSBhcmUgYWxyZWFkeQoJICogdHJhbnNsYXRlZCB0ZXJtaW5hbCBjaGFycyAoYXZvaWQgdHJhbnNsYXRpbmcgfkBeSHgpLgoJICovCglpZiAoKnRwID09IEtfU1BFQ0lBTCkKCXsKCSAgICBvZmZzZXQgKz0gMjsJLyogdGhlcmUgYXJlIGFsd2F5cyAyIGV4dHJhIGNoYXJhY3RlcnMgKi8KCSAgICBjb250aW51ZTsKCX0KCgkvKgoJICogU2tpcCB0aGlzIHBvc2l0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3QgYXBwZWFyIGFzIHRoZSBmaXJzdAoJICogY2hhcmFjdGVyIGluIHRlcm1fc3RyaW5ncy4gVGhpcyBzcGVlZHMgdXAgYSBsb3QsIHNpbmNlIG1vc3QKCSAqIHRlcm1jb2RlcyBzdGFydCB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlciAoRVNDIG9yIENTSSkuCgkgKi8KCWkgPSAqdHA7Cglmb3IgKHAgPSB0ZXJtbGVhZGVyOyAqcCAmJiAqcCAhPSBpOyArK3ApCgkgICAgOwoJaWYgKCpwID09IE5VTCkKCSAgICBjb250aW51ZTsKCgkvKgoJICogU2tpcCB0aGlzIHBvc2l0aW9uIGlmIHBfZWsgaXMgbm90IHNldCBhbmQgdHBbMF0gaXMgYW4gRVNDIGFuZCB3ZQoJICogYXJlIGluIEluc2VydCBtb2RlLgoJICovCglpZiAoKnRwID09IEVTQyAmJiAhcF9layAmJiAoU3RhdGUgJiBJTlNFUlQpKQoJICAgIGNvbnRpbnVlOwoKCWtleV9uYW1lWzBdID0gTlVMOwkvKiBubyBrZXkgbmFtZSBmb3VuZCB5ZXQgKi8KCWtleV9uYW1lWzFdID0gTlVMOwkvKiBubyBrZXkgbmFtZSBmb3VuZCB5ZXQgKi8KCW1vZGlmaWVycyA9IDA7CQkvKiBubyBtb2RpZmllcnMgeWV0ICovCgojaWZkZWYgRkVBVF9HVUkKCWlmIChndWkuaW5fdXNlKQoJewoJICAgIC8qCgkgICAgICogR1VJIHNwZWNpYWwga2V5IGNvZGVzIGFyZSBhbGwgb2YgdGhlIGZvcm0gW0NTSSB4eF0uCgkgICAgICovCgkgICAgaWYgKCp0cCA9PSBDU0kpCSAgICAvKiBTcGVjaWFsIGtleSBmcm9tIEdVSSAqLwoJICAgIHsKCQlpZiAobGVuIDwgMykKCQkgICAgcmV0dXJuIC0xOwkgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLwoJCXNsZW4gPSAzOwoJCWtleV9uYW1lWzBdID0gdHBbMV07CgkJa2V5X25hbWVbMV0gPSB0cFsyXTsKCSAgICB9Cgl9CgllbHNlCiNlbmRpZiAvKiBGRUFUX0dVSSAqLwoJewoJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdGNfbGVuOyArK2lkeCkKCSAgICB7CgkJLyoKCQkgKiBJZ25vcmUgdGhlIGVudHJ5IGlmIHdlIGFyZSBub3QgYXQgdGhlIHN0YXJ0IG9mCgkJICogdHlwZWJ1Zi50Yl9idWZbXQoJCSAqIGFuZCB0aGVyZSBhcmUgbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2UgYSBtYXRjaC4KCQkgKiBCdXQgb25seSB3aGVuIHRoZSAnSycgZmxhZyBpcyBpbiAnY3BvcHRpb25zJy4KCQkgKi8KCQlzbGVuID0gdGVybWNvZGVzW2lkeF0ubGVuOwoJCWlmIChjcG9fa29mZnNldCAmJiBvZmZzZXQgJiYgbGVuIDwgc2xlbikKCQkgICAgY29udGludWU7CgkJaWYgKFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwgdHAsCgkJCQkgICAgIChzaXplX3QpKHNsZW4gPiBsZW4gPyBsZW4gOiBzbGVuKSkgPT0gMCkKCQl7CgkJICAgIGlmIChsZW4gPCBzbGVuKQkJLyogZ290IGEgcGFydGlhbCBzZXF1ZW5jZSAqLwoJCQlyZXR1cm4gLTE7CQkvKiBuZWVkIHRvIGdldCBtb3JlIGNoYXJzICovCgoJCSAgICAvKgoJCSAgICAgKiBXaGVuIGZvdW5kIGEga2V5cGFkIGtleSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBrZXkKCQkgICAgICogdGhhdCBtYXRjaGVzIGFuZCB1c2UgdGhhdCBvbmUuICBUaGlzIG1ha2VzIDxIb21lPiB0byBiZQoJCSAgICAgKiBmb3VuZCBpbnN0ZWFkIG9mIDxrSG9tZT4gd2hlbiB0aGV5IHByb2R1Y2UgdGhlIHNhbWUKCQkgICAgICoga2V5IGNvZGUuCgkJICAgICAqLwoJCSAgICBpZiAodGVybWNvZGVzW2lkeF0ubmFtZVswXSA9PSAnSycKCQkJCSAgICAgICAmJiBWSU1fSVNESUdJVCh0ZXJtY29kZXNbaWR4XS5uYW1lWzFdKSkKCQkgICAgewoJCQlmb3IgKGogPSBpZHggKyAxOyBqIDwgdGNfbGVuOyArK2opCgkJCSAgICBpZiAodGVybWNvZGVzW2pdLmxlbiA9PSBzbGVuICYmCgkJCQkgICAgU1RSTkNNUCh0ZXJtY29kZXNbaWR4XS5jb2RlLAoJCQkJCSAgICB0ZXJtY29kZXNbal0uY29kZSwgc2xlbikgPT0gMCkKCQkJICAgIHsKCQkJCWlkeCA9IGo7CgkJCQlicmVhazsKCQkJICAgIH0KCQkgICAgfQoKCQkgICAga2V5X25hbWVbMF0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzBdOwoJCSAgICBrZXlfbmFtZVsxXSA9IHRlcm1jb2Rlc1tpZHhdLm5hbWVbMV07CgkJICAgIGJyZWFrOwoJCX0KCgkJLyoKCQkgKiBDaGVjayBmb3IgY29kZSB3aXRoIG1vZGlmaWVyLCBsaWtlIHh0ZXJtIHVzZXM6CgkJICogPEVzYz5bMTIzOypYICAobW9kc2xlbiA9PSBzbGVuIC0gMykKCQkgKiBBbHNvIDxFc2M+TypYIGFuZCA8TS1PPipYIChtb2RzbGVuID09IHNsZW4gLSAyKS4KCQkgKiBXaGVuIHRoZXJlIGlzIGEgbW9kaWZpZXIgdGhlICogbWF0Y2hlcyBhIG51bWJlci4KCQkgKiBXaGVuIHRoZXJlIGlzIG5vIG1vZGlmaWVyIHRoZSA7KiBvciAqIGlzIG9taXR0ZWQuCgkJICovCgkJaWYgKHRlcm1jb2Rlc1tpZHhdLm1vZGxlbiA+IDApCgkJewoJCSAgICBtb2RzbGVuID0gdGVybWNvZGVzW2lkeF0ubW9kbGVuOwoJCSAgICBpZiAoY3BvX2tvZmZzZXQgJiYgb2Zmc2V0ICYmIGxlbiA8IG1vZHNsZW4pCgkJCWNvbnRpbnVlOwoJCSAgICBpZiAoU1RSTkNNUCh0ZXJtY29kZXNbaWR4XS5jb2RlLCB0cCwKCQkJCShzaXplX3QpKG1vZHNsZW4gPiBsZW4gPyBsZW4gOiBtb2RzbGVuKSkgPT0gMCkKCQkgICAgewoJCQlpbnQJICAgIG47CgoJCQlpZiAobGVuIDw9IG1vZHNsZW4pCS8qIGdvdCBhIHBhcnRpYWwgc2VxdWVuY2UgKi8KCQkJICAgIHJldHVybiAtMTsJCS8qIG5lZWQgdG8gZ2V0IG1vcmUgY2hhcnMgKi8KCgkJCWlmICh0cFttb2RzbGVuXSA9PSB0ZXJtY29kZXNbaWR4XS5jb2RlW3NsZW4gLSAxXSkKCQkJICAgIHNsZW4gPSBtb2RzbGVuICsgMTsJLyogbm8gbW9kaWZpZXJzICovCgkJCWVsc2UgaWYgKHRwW21vZHNsZW5dICE9ICc7JyAmJiBtb2RzbGVuID09IHNsZW4gLSAzKQoJCQkgICAgY29udGludWU7CS8qIG5vIG1hdGNoICovCgkJCWVsc2UKCQkJewoJCQkgICAgLyogU2tpcCBvdmVyIHRoZSBkaWdpdHMsIHRoZSBmaW5hbCBjaGFyIG11c3QKCQkJICAgICAqIGZvbGxvdy4gKi8KCQkJICAgIGZvciAoaiA9IHNsZW4gLSAyOyBqIDwgbGVuICYmIGlzZGlnaXQodHBbal0pOyArK2opCgkJCQk7CgkJCSAgICArK2o7CgkJCSAgICBpZiAobGVuIDwgaikJLyogZ290IGEgcGFydGlhbCBzZXF1ZW5jZSAqLwoJCQkJcmV0dXJuIC0xOwkvKiBuZWVkIHRvIGdldCBtb3JlIGNoYXJzICovCgkJCSAgICBpZiAodHBbaiAtIDFdICE9IHRlcm1jb2Rlc1tpZHhdLmNvZGVbc2xlbiAtIDFdKQoJCQkJY29udGludWU7CS8qIG5vIG1hdGNoICovCgoJCQkgICAgLyogTWF0Y2ghICBDb252ZXJ0IG1vZGlmaWVyIGJpdHMuICovCgkJCSAgICBuID0gYXRvaSgoY2hhciAqKXRwICsgc2xlbiAtIDIpIC0gMTsKCQkJICAgIGlmIChuICYgMSkKCQkJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKCQkJICAgIGlmIChuICYgMikKCQkJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19BTFQ7CgkJCSAgICBpZiAobiAmIDQpCgkJCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKCQkJICAgIGlmIChuICYgOCkKCQkJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19NRVRBOwoKCQkJICAgIHNsZW4gPSBqOwoJCQl9CgkJCWtleV9uYW1lWzBdID0gdGVybWNvZGVzW2lkeF0ubmFtZVswXTsKCQkJa2V5X25hbWVbMV0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzFdOwoJCQlicmVhazsKCQkgICAgfQoJCX0KCSAgICB9Cgl9CgojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCWlmIChrZXlfbmFtZVswXSA9PSBOVUwpCgl7CgkgICAgLyogQ2hlY2sgZm9yIHh0ZXJtIHZlcnNpb24gc3RyaW5nOiAiPEVzYz5bPnt4fTt7dmVyc307e3l9YyIuICBBbHNvCgkgICAgICogZWF0IG90aGVyIHBvc3NpYmxlIHJlc3BvbnNlcyB0byB0X1JWLCByeHZ0IHJldHVybnMKCSAgICAgKiAiPEVzYz5bPzE7MmMiLiAgQWxzbyBhY2NlcHQgQ1NJIGluc3RlYWQgb2YgPEVzYz5bLiAqLwoJICAgIGlmICgqVF9DUlYgIT0gTlVMICYmICgodHBbMF0gPT0gRVNDICYmIHRwWzFdID09ICdbJyAmJiBsZW4gPj0gMykKCQkJCQkgICAgICAgfHwgKHRwWzBdID09IENTSSAmJiBsZW4gPj0gMikpKQoJICAgIHsKCQlqID0gMDsKCQlleHRyYSA9IDA7CgkJZm9yIChpID0gMiArICh0cFswXSAhPSBDU0kpOwoJCQlpIDwgbGVuICYmIChWSU1fSVNESUdJVCh0cFtpXSkKCQkJICAgIHx8IHRwW2ldID09ICc7JyB8fCB0cFtpXSA9PSAnLicpOyArK2kpCgkJICAgIGlmICh0cFtpXSA9PSAnOycgJiYgKytqID09IDEpCgkJCWV4dHJhID0gYXRvaSgoY2hhciAqKXRwICsgaSArIDEpOwoJCWlmIChpID09IGxlbikKCQkgICAgcmV0dXJuIC0xOwkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzICovCgoJCS8qIGVhdCBpdCB3aGVuIGF0IGxlYXN0IG9uZSBkaWdpdCBhbmQgZW5kaW5nIGluICdjJyAqLwoJCWlmIChpID4gMiArICh0cFswXSAhPSBDU0kpICYmIHRwW2ldID09ICdjJykKCQl7CgkJICAgIGNydl9zdGF0dXMgPSBDUlZfR09UOwoKCQkgICAgLyogSWYgdGhpcyBjb2RlIHN0YXJ0cyB3aXRoIENTSSwgeW91IGNhbiBiZXQgdGhhdCB0aGUKCQkgICAgICogdGVybWluYWwgdXNlcyA4LWJpdCBjb2Rlcy4gKi8KCQkgICAgaWYgKHRwWzBdID09IENTSSkKCQkJc3dpdGNoX3RvXzhiaXQoKTsKCgkJICAgIC8qIHJ4dnQgc2VuZHMgaXRzIHZlcnNpb24gbnVtYmVyOiAiMjA3MDMiIGlzIDIuNy4zLgoJCSAgICAgKiBJZ25vcmUgaXQgZm9yIHdoZW4gdGhlIHVzZXIgaGFzIHNldCAndGVybScgdG8geHRlcm0sCgkJICAgICAqIGV2ZW4gdGhvdWdoIGl0J3MgYW4gcnh2dC4gKi8KCQkgICAgaWYgKGV4dHJhID4gMjAwMDApCgkJCWV4dHJhID0gMDsKCgkJICAgIGlmICh0cFsxICsgKHRwWzBdICE9IENTSSldID09ICc+JyAmJiBqID09IDIpCgkJICAgIHsKCQkJLyogaWYgeHRlcm0gdmVyc2lvbiA+PSA5NSB1c2UgbW91c2UgZHJhZ2dpbmcgKi8KCQkJaWYgKGV4dHJhID49IDk1KQoJCQkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInR0eW0iLCAwTCwKCQkJCQkJICAgICAgIChjaGFyX3UgKikieHRlcm0yIiwgMCk7CgkJCS8qIGlmIHh0ZXJtIHZlcnNpb24gPj0gMTQxIHRyeSB0byBnZXQgdGVybWNhcCBjb2RlcyAqLwoJCQlpZiAoZXh0cmEgPj0gMTQxKQoJCQl7CgkJCSAgICBjaGVja19mb3JfY29kZXMgPSBUUlVFOwoJCQkgICAgbmVlZF9nYXRoZXIgPSBUUlVFOwoJCQkgICAgcmVxX2NvZGVzX2Zyb21fdGVybSgpOwoJCQl9CgkJICAgIH0KIyBpZmRlZiBGRUFUX0VWQUwKCQkgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX1RFUk1SRVNQT05TRSwgdHAsIGkgKyAxKTsKIyBlbmRpZgojIGlmZGVmIEZFQVRfQVVUT0NNRAoJCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9URVJNUkVTUE9OU0UsCgkJCQkJCSAgIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOwojIGVuZGlmCgkJICAgIGtleV9uYW1lWzBdID0gKGludClLU19FWFRSQTsKCQkgICAga2V5X25hbWVbMV0gPSAoaW50KUtFX0lHTk9SRTsKCQkgICAgc2xlbiA9IGkgKyAxOwoJCX0KCSAgICB9CgoJICAgIC8qIENoZWNrIGZvciAnPEVzYz5QMStyPGhleCBieXRlcz48RXNjPlwnLiAgQSAiMCIgaW5zdGVhZCBvZiB0aGUKCSAgICAgKiAiMSIgbWVhbnMgYW4gaW52YWxpZCByZXF1ZXN0LiAqLwoJICAgIGVsc2UgaWYgKGNoZWNrX2Zvcl9jb2RlcwoJCSAgICAmJiAoKHRwWzBdID09IEVTQyAmJiB0cFsxXSA9PSAnUCcgJiYgbGVuID49IDIpCgkJCXx8IHRwWzBdID09IERDUykpCgkgICAgewoJCWogPSAxICsgKHRwWzBdICE9IERDUyk7CgkJZm9yIChpID0gajsgaSA8IGxlbjsgKytpKQoJCSAgICBpZiAoKHRwW2ldID09IEVTQyAmJiB0cFtpICsgMV0gPT0gJ1xcJyAmJiBpICsgMSA8IGxlbikKCQkJICAgIHx8IHRwW2ldID09IFNURVJNKQoJCSAgICB7CgkJCWlmIChpIC0gaiA+PSAzICYmIHRwW2ogKyAxXSA9PSAnKycgJiYgdHBbaiArIDJdID09ICdyJykKCQkJICAgIGdvdF9jb2RlX2Zyb21fdGVybSh0cCArIGosIGkpOwoJCQlrZXlfbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CgkJCWtleV9uYW1lWzFdID0gKGludClLRV9JR05PUkU7CgkJCXNsZW4gPSBpICsgMSArICh0cFtpXSA9PSBFU0MpOwoJCQlicmVhazsKCQkgICAgfQoKCQlpZiAoaSA9PSBsZW4pCgkJICAgIHJldHVybiAtMTsJCS8qIG5vdCBlbm91Z2ggY2hhcmFjdGVycyAqLwoJICAgIH0KCX0KI2VuZGlmCgoJaWYgKGtleV9uYW1lWzBdID09IE5VTCkKCSAgICBjb250aW51ZTsJICAgIC8qIE5vIG1hdGNoIGF0IHRoaXMgcG9zaXRpb24sIHRyeSBuZXh0IG9uZSAqLwoKCS8qIFdlIG9ubHkgZ2V0IGhlcmUgd2hlbiB3ZSBoYXZlIGEgY29tcGxldGUgdGVybWNvZGUgbWF0Y2ggKi8KCiNpZmRlZiBGRUFUX01PVVNFCiMgaWZkZWYgRkVBVF9HVUkKCS8qCgkgKiBPbmx5IGluIHRoZSBHVUk6IEZldGNoIHRoZSBwb2ludGVyIGNvb3JkaW5hdGVzIG9mIHRoZSBzY3JvbGwgZXZlbnQKCSAqIHNvIHRoYXQgd2Uga25vdyB3aGljaCB3aW5kb3cgdG8gc2Nyb2xsIGxhdGVyLgoJICovCglpZiAoZ3VpLmluX3VzZQoJCSYmIGtleV9uYW1lWzBdID09IChpbnQpS1NfRVhUUkEKCQkmJiAoa2V5X25hbWVbMV0gPT0gKGludClLRV9YMU1PVVNFCgkJICAgIHx8IGtleV9uYW1lWzFdID09IChpbnQpS0VfWDJNT1VTRQoJCSAgICB8fCBrZXlfbmFtZVsxXSA9PSAoaW50KUtFX01PVVNFRE9XTgoJCSAgICB8fCBrZXlfbmFtZVsxXSA9PSAoaW50KUtFX01PVVNFVVApKQoJewoJICAgIG51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCA0KTsKCSAgICBpZiAobnVtX2J5dGVzID09IC0xKQkvKiBub3QgZW5vdWdoIGNvb3JkaW5hdGVzICovCgkJcmV0dXJuIC0xOwoJICAgIG1vdXNlX2NvbCA9IDEyOCAqIChieXRlc1swXSAtICcgJyAtIDEpICsgYnl0ZXNbMV0gLSAnICcgLSAxOwoJICAgIG1vdXNlX3JvdyA9IDEyOCAqIChieXRlc1syXSAtICcgJyAtIDEpICsgYnl0ZXNbM10gLSAnICcgLSAxOwoJICAgIHNsZW4gKz0gbnVtX2J5dGVzOwoJfQoJZWxzZQojIGVuZGlmCgkvKgoJICogSWYgaXQgaXMgYSBtb3VzZSBjbGljaywgZ2V0IHRoZSBjb29yZGluYXRlcy4KCSAqLwoJaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTU9VU0UKIyBpZmRlZiBGRUFUX01PVVNFX0pTQgoJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfSlNCVEVSTV9NT1VTRQojIGVuZGlmCiMgaWZkZWYgRkVBVF9NT1VTRV9ORVQKCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX05FVFRFUk1fTU9VU0UKIyBlbmRpZgojIGlmZGVmIEZFQVRfTU9VU0VfREVDCgkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19ERUNfTU9VU0UKIyBlbmRpZgojIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX1BURVJNX01PVVNFCiMgZW5kaWYKCQkpCgl7CgkgICAgaXNfY2xpY2sgPSBpc19kcmFnID0gRkFMU0U7CgojIGlmICFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX0dVSSkKCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NT1VTRSkKCSAgICB7CgkJLyoKCQkgKiBGb3IgeHRlcm0gYW5kIE1TRE9TIHdlIGdldCAiPHRfbW91c2U+c2NyIiwgd2hlcmUKCQkgKiAgcyA9PSBlbmNvZGVkIGJ1dHRvbiBzdGF0ZToKCQkgKgkgICAweDIwID0gbGVmdCBidXR0b24gZG93bgoJCSAqCSAgIDB4MjEgPSBtaWRkbGUgYnV0dG9uIGRvd24KCQkgKgkgICAweDIyID0gcmlnaHQgYnV0dG9uIGRvd24KCQkgKgkgICAweDIzID0gYW55IGJ1dHRvbiByZWxlYXNlCgkJICoJICAgMHg2MCA9IGJ1dHRvbiA0IGRvd24gKHNjcm9sbCB3aGVlbCBkb3duKQoJCSAqCSAgIDB4NjEgPSBidXR0b24gNSBkb3duIChzY3JvbGwgd2hlZWwgdXApCgkJICoJYWRkIDB4MDQgZm9yIFNISUZUCgkJICoJYWRkIDB4MDggZm9yIEFMVAoJCSAqCWFkZCAweDEwIGZvciBDVFJMCgkJICoJYWRkIDB4MjAgZm9yIG1vdXNlIGRyYWcgKDB4NDAgaXMgZHJhZyB3aXRoIGxlZnQgYnV0dG9uKQoJCSAqICBjID09IGNvbHVtbiArICcgJyArIDEgPT0gY29sdW1uICsgMzMKCQkgKiAgciA9PSByb3cgKyAnICcgKyAxID09IHJvdyArIDMzCgkJICoKCQkgKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHBhc3NlZCBvbiB0aHJvdWdoIGdsb2JhbCB2YXJpYWJsZXMuCgkJICogVWdseSwgYnV0IHRoaXMgYXZvaWRzIHRyb3VibGUgd2l0aCBtb3VzZSBjbGlja3MgYXQgYW4KCQkgKiB1bmV4cGVjdGVkIG1vbWVudCBhbmQgYWxsb3dzIGZvciBtYXBwaW5nIHRoZW0uCgkJICovCgkJZm9yICg7OykKCQl7CiNpZmRlZiBGRUFUX0dVSQoJCSAgICBpZiAoZ3VpLmluX3VzZSkKCQkgICAgewoJCQkvKiBHVUkgdXNlcyBtb3JlIGJpdHMgZm9yIGNvbHVtbnMgPiAyMjMgKi8KCQkJbnVtX2J5dGVzID0gZ2V0X2J5dGVzX2Zyb21fYnVmKHRwICsgc2xlbiwgYnl0ZXMsIDUpOwoJCQlpZiAobnVtX2J5dGVzID09IC0xKQkvKiBub3QgZW5vdWdoIGNvb3JkaW5hdGVzICovCgkJCSAgICByZXR1cm4gLTE7CgkJCW1vdXNlX2NvZGUgPSBieXRlc1swXTsKCQkJbW91c2VfY29sID0gMTI4ICogKGJ5dGVzWzFdIC0gJyAnIC0gMSkKCQkJCQkJCSArIGJ5dGVzWzJdIC0gJyAnIC0gMTsKCQkJbW91c2Vfcm93ID0gMTI4ICogKGJ5dGVzWzNdIC0gJyAnIC0gMSkKCQkJCQkJCSArIGJ5dGVzWzRdIC0gJyAnIC0gMTsKCQkgICAgfQoJCSAgICBlbHNlCiNlbmRpZgoJCSAgICB7CgkJCW51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCAzKTsKCQkJaWYgKG51bV9ieXRlcyA9PSAtMSkJLyogbm90IGVub3VnaCBjb29yZGluYXRlcyAqLwoJCQkgICAgcmV0dXJuIC0xOwoJCQltb3VzZV9jb2RlID0gYnl0ZXNbMF07CgkJCW1vdXNlX2NvbCA9IGJ5dGVzWzFdIC0gJyAnIC0gMTsKCQkJbW91c2Vfcm93ID0gYnl0ZXNbMl0gLSAnICcgLSAxOwoJCSAgICB9CgkJICAgIHNsZW4gKz0gbnVtX2J5dGVzOwoKCQkgICAgLyogSWYgdGhlIGZvbGxvd2luZyBieXRlcyBpcyBhbHNvIGEgbW91c2UgY29kZSBhbmQgaXQgaGFzCgkJICAgICAqIHRoZSBzYW1lIGNvZGUsIGR1bXAgdGhpcyBvbmUgYW5kIGdldCB0aGUgbmV4dC4gIFRoaXMKCQkgICAgICogbWFrZXMgZHJhZ2dpbmcgYSB3aG9sZSBsb3QgZmFzdGVyLiAqLwojaWZkZWYgRkVBVF9HVUkKCQkgICAgaWYgKGd1aS5pbl91c2UpCgkJCWogPSAzOwoJCSAgICBlbHNlCiNlbmRpZgoJCQlqID0gdGVybWNvZGVzW2lkeF0ubGVuOwoJCSAgICBpZiAoU1RSTkNNUCh0cCwgdHAgKyBzbGVuLCAoc2l6ZV90KWopID09IDAKCQkJICAgICYmIHRwW3NsZW4gKyBqXSA9PSBtb3VzZV9jb2RlCgkJCSAgICAmJiB0cFtzbGVuICsgaiArIDFdICE9IE5VTAoJCQkgICAgJiYgdHBbc2xlbiArIGogKyAyXSAhPSBOVUwKI2lmZGVmIEZFQVRfR1VJCgkJCSAgICAmJiAoIWd1aS5pbl91c2UKCQkJCXx8ICh0cFtzbGVuICsgaiArIDNdICE9IE5VTAoJCQkJCSYmIHRwW3NsZW4gKyBqICsgNF0gIT0gTlVMKSkKI2VuZGlmCgkJCSAgICApCgkJCXNsZW4gKz0gajsKCQkgICAgZWxzZQoJCQlicmVhazsKCQl9CgojICBpZiAhZGVmaW5lZChNU1dJTikgJiYgIWRlZmluZWQoTVNET1MpCgkJLyoKCQkgKiBIYW5kbGUgbW91c2UgZXZlbnRzLgoJCSAqIFJlY29nbml6ZSB0aGUgeHRlcm0gbW91c2Ugd2hlZWwsIGJ1dCBub3QgaW4gdGhlIEdVSSwgdGhlCgkJICogTGludXggY29uc29sZSB3aXRoIEdQTSBhbmQgdGhlIE1TLURPUyBvciBXaW4zMiBjb25zb2xlCgkJICogKG11bHRpLWNsaWNrcyB1c2UgPj0gMHg2MCkuCgkJICovCgkJaWYgKG1vdXNlX2NvZGUgPj0gTU9VU0VXSEVFTF9MT1cKIyAgIGlmZGVmIEZFQVRfR1VJCgkJCSYmICFndWkuaW5fdXNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9HUE0KCQkJJiYgZ3BtX2ZsYWcgPT0gMAojICAgZW5kaWYKCQkJKQoJCXsKCQkgICAgLyogS2VlcCB0aGUgbW91c2VfY29kZSBiZWZvcmUgaXQncyBjaGFuZ2VkLCBzbyB0aGF0IHdlCgkJICAgICAqIHJlbWVtYmVyIHRoYXQgaXQgd2FzIGEgbW91c2Ugd2hlZWwgY2xpY2suICovCgkJICAgIHdoZWVsX2NvZGUgPSBtb3VzZV9jb2RlOwoJCX0KIyAgIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KCQllbHNlIGlmIChoZWxkX2J1dHRvbiA9PSBNT1VTRV9SRUxFQVNFCiMgICAgaWZkZWYgRkVBVF9HVUkKCQkJJiYgIWd1aS5pbl91c2UKIyAgICBlbmRpZgoJCQkmJiAobW91c2VfY29kZSA9PSAweDIzIHx8IG1vdXNlX2NvZGUgPT0gMHgyNCkpCgkJewoJCSAgICAvKiBBcHBhcmVudGx5IHVzZWQgYnkgcnh2dCBzY3JvbGwgd2hlZWwuICovCgkJICAgIHdoZWVsX2NvZGUgPSBtb3VzZV9jb2RlIC0gMHgyMyArIE1PVVNFV0hFRUxfTE9XOwoJCX0KIyAgIGVuZGlmCgojICAgaWYgZGVmaW5lZChVTklYKSAmJiBkZWZpbmVkKEZFQVRfTU9VU0VfVFRZKQoJCWVsc2UgaWYgKHVzZV94dGVybV9tb3VzZSgpID4gMSkKCQl7CgkJICAgIGlmIChtb3VzZV9jb2RlICYgTU9VU0VfRFJBR19YVEVSTSkKCQkJbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOwoJCX0KIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX1hDTElQQk9BUkQKCQllbHNlIGlmICghKG1vdXNlX2NvZGUgJiBNT1VTRV9EUkFHICYgfk1PVVNFX0NMSUNLX01BU0spKQoJCXsKCQkgICAgaWYgKChtb3VzZV9jb2RlICYgTU9VU0VfUkVMRUFTRSkgPT0gTU9VU0VfUkVMRUFTRSkKCQkJc3RvcF94dGVybV90cmFjZSgpOwoJCSAgICBlbHNlCgkJCXN0YXJ0X3h0ZXJtX3RyYWNlKG1vdXNlX2NvZGUpOwoJCX0KIyAgIGVuZGlmCiMgIGVuZGlmCgkgICAgfQojIGVuZGlmIC8qICFVTklYIHx8IEZFQVRfTU9VU0VfWFRFUk0gKi8KIyBpZmRlZiBGRUFUX01PVVNFX05FVAoJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX05FVFRFUk1fTU9VU0UpCgkgICAgewoJCWludCBtYywgbXI7CgoJCS8qIGV4cGVjdCBhIHJhdGhlciBsaW1pdGVkIHNlcXVlbmNlIGxpa2U6IGJhbGFuY2luZyB7CgkJICogXDAzM302LDQ1XHIKCQkgKiAnNicgaXMgdGhlIHJvdywgNDUgaXMgdGhlIGNvbHVtbgoJCSAqLwoJCXAgPSB0cCArIHNsZW47CgkJbXIgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICcsJykKCQkgICAgcmV0dXJuIC0xOwoJCW1jID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnXHInKQoJCSAgICByZXR1cm4gLTE7CgoJCW1vdXNlX2NvbCA9IG1jIC0gMTsKCQltb3VzZV9yb3cgPSBtciAtIDE7CgkJbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7CgkJc2xlbiArPSAoaW50KShwIC0gKHRwICsgc2xlbikpOwoJICAgIH0KIyBlbmRpZgkvKiBGRUFUX01PVVNFX05FVCAqLwojIGlmZGVmIEZFQVRfTU9VU0VfSlNCCgkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfSlNCVEVSTV9NT1VTRSkKCSAgICB7CgkJaW50IG11bHQsIHZhbCwgaXRlciwgYnV0dG9uLCBzdGF0dXM7CgoJCS8qIEpTQlRFUk0gSW5wdXQgTW9kZWwKCQkgKiBcMDMzWzB+encgdW5pcSBlc2NhcGUgc2VxdWVuY2UKCQkgKiAoTC14KSAgTGVmdCBidXR0b24gcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZwoJCSAqIChNLXgpICBNaWRkbGUgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKCQkgKiAoUi14KSAgUmlnaHQgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKCQkgKiAoU0RtZHUpICBTaW5nbGUgLCBEb3VibGUgY2xpY2ssIG0gbW91c2UgbW92ZSBkIGJ1dHRvbiBkb3duCgkJICoJCQkJCQkgICB1IGJ1dHRvbiB1cAoJCSAqICAjIyMgICBYIGN1cnNvciBwb3NpdGlvbiBwYWRkZWQgdG8gMyBkaWdpdHMKCQkgKiAgIyMjICAgWSBjdXJzb3IgcG9zaXRpb24gcGFkZGVkIHRvIDMgZGlnaXRzCgkJICogKHMteCkgIFNISUZUIGtleSBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCgkJICogKGMteCkgIENUUkwga2V5IHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKCQkgKiBcMDMzXFwgdGVybWluYXRlaW5nIHNlcXVlbmNlCgkJICovCgoJCXAgPSB0cCArIHNsZW47CgkJYnV0dG9uID0gbW91c2VfY29kZSA9IDA7CgkJc3dpdGNoICgqcCsrKQoJCXsKCQkgICAgY2FzZSAnTCc6IGJ1dHRvbiA9IDE7IGJyZWFrOwoJCSAgICBjYXNlICctJzogYnJlYWs7CgkJICAgIGNhc2UgJ3gnOiBicmVhazsgLyogaWdub3JlIHNlcXVlbmNlICovCgkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoJCXN3aXRjaCAoKnArKykKCQl7CgkJICAgIGNhc2UgJ00nOiBidXR0b24gfD0gMjsgYnJlYWs7CgkJICAgIGNhc2UgJy0nOiBicmVhazsKCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgkJc3dpdGNoICgqcCsrKQoJCXsKCQkgICAgY2FzZSAnUic6IGJ1dHRvbiB8PSA0OyBicmVhazsKCQkgICAgY2FzZSAnLSc6IGJyZWFrOwoJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLwoJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCQlzdGF0dXMgPSAqcCsrOwoJCWZvciAodmFsID0gMCwgbXVsdCA9IDEwMCwgaXRlciA9IDA7IGl0ZXIgPCAzOyBpdGVyKyssCgkJCQkJCQkgICAgICBtdWx0IC89IDEwLCBwKyspCgkJICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQoJCQl2YWwgKz0gKCpwIC0gJzAnKSAqIG11bHQ7CgkJICAgIGVsc2UKCQkJcmV0dXJuIC0xOwoJCW1vdXNlX2NvbCA9IHZhbDsKCQlmb3IgKHZhbCA9IDAsIG11bHQgPSAxMDAsIGl0ZXIgPSAwOyBpdGVyIDwgMzsgaXRlcisrLAoJCQkJCQkJICAgICAgbXVsdCAvPSAxMCwgcCsrKQoJCSAgICBpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKCQkJdmFsICs9ICgqcCAtICcwJykgKiBtdWx0OwoJCSAgICBlbHNlCgkJCXJldHVybiAtMTsKCQltb3VzZV9yb3cgPSB2YWw7CgkJc3dpdGNoICgqcCsrKQoJCXsKCQkgICAgY2FzZSAncyc6IGJ1dHRvbiB8PSA4OyBicmVhazsgIC8qIFNISUZUIGtleSBQcmVzc2VkICovCgkJICAgIGNhc2UgJy0nOiBicmVhazsgIC8qIE5vdCBQcmVzc2VkICovCgkJICAgIGNhc2UgJ3gnOiBicmVhazsgIC8qIE5vdCBSZXBvcnRpbmcgKi8KCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgkJc3dpdGNoICgqcCsrKQoJCXsKCQkgICAgY2FzZSAnYyc6IGJ1dHRvbiB8PSAxNjsgYnJlYWs7ICAvKiBDVFJMIGtleSBQcmVzc2VkICovCgkJICAgIGNhc2UgJy0nOiBicmVhazsgIC8qIE5vdCBQcmVzc2VkICovCgkJICAgIGNhc2UgJ3gnOiBicmVhazsgIC8qIE5vdCBSZXBvcnRpbmcgKi8KCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgkJaWYgKCpwKysgIT0gJ1wwMzMnKQoJCSAgICByZXR1cm4gLTE7CgkJaWYgKCpwKysgIT0gJ1xcJykKCQkgICAgcmV0dXJuIC0xOwoJCXN3aXRjaCAoc3RhdHVzKQoJCXsKCQkgICAgY2FzZSAnRCc6IC8qIERvdWJsZSBDbGljayAqLwoJCSAgICBjYXNlICdTJzogLyogU2luZ2xlIENsaWNrICovCgkJCWlmIChidXR0b24gJiAxKSBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQ7CgkJCWlmIChidXR0b24gJiAyKSBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRTsKCQkJaWYgKGJ1dHRvbiAmIDQpIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQ7CgkJCWlmIChidXR0b24gJiA4KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOwoJCQlpZiAoYnV0dG9uICYgMTYpIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKCQkJYnJlYWs7CgkJICAgIGNhc2UgJ20nOiAvKiBNb3VzZSBtb3ZlICovCgkJCWlmIChidXR0b24gJiAxKSBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQ7CgkJCWlmIChidXR0b24gJiAyKSBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRTsKCQkJaWYgKGJ1dHRvbiAmIDQpIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQ7CgkJCWlmIChidXR0b24gJiA4KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOwoJCQlpZiAoYnV0dG9uICYgMTYpIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKCQkJaWYgKChidXR0b24gJiA3KSAhPSAwKQoJCQl7CgkJCSAgICBoZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGU7CgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CgkJCX0KCQkJaXNfZHJhZyA9IFRSVUU7CgkJCXNob3dtb2RlKCk7CgkJCWJyZWFrOwoJCSAgICBjYXNlICdkJzogLyogQnV0dG9uIERvd24gKi8KCQkJaWYgKGJ1dHRvbiAmIDEpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVDsKCQkJaWYgKGJ1dHRvbiAmIDIpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFOwoJCQlpZiAoYnV0dG9uICYgNCkgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVDsKCQkJaWYgKGJ1dHRvbiAmIDgpIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CgkJCWlmIChidXR0b24gJiAxNikgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOwoJCQlicmVhazsKCQkgICAgY2FzZSAndSc6IC8qIEJ1dHRvbiBVcCAqLwoJCQlpZiAoYnV0dG9uICYgMSkKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVCB8IE1PVVNFX1JFTEVBU0U7CgkJCWlmIChidXR0b24gJiAyKQoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEUgfCBNT1VTRV9SRUxFQVNFOwoJCQlpZiAoYnV0dG9uICYgNCkKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQgfCBNT1VTRV9SRUxFQVNFOwoJCQlpZiAoYnV0dG9uICYgOCkKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CgkJCWlmIChidXR0b24gJiAxNikKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKCQkJYnJlYWs7CgkJICAgIGRlZmF1bHQ6IHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgoJCXNsZW4gKz0gKHAgLSAodHAgKyBzbGVuKSk7CgkgICAgfQojIGVuZGlmIC8qIEZFQVRfTU9VU0VfSlNCICovCiMgaWZkZWYgRkVBVF9NT1VTRV9ERUMKCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19ERUNfTU9VU0UpCgkgICAgewoJICAgICAgIC8qIFRoZSBERUMgTG9jYXRvciBJbnB1dCBNb2RlbAoJCSogTmV0dGVybSBkZWxpdmVycyB0aGUgY29kZSBzZXF1ZW5jZToKCQkqICBcMDMzWzI7NDsyNDs4MCZ3ICAobGVmdCBidXR0b24gZG93bikKCQkqICBcMDMzWzM7MDsyNDs4MCZ3ICAobGVmdCBidXR0b24gdXApCgkJKiAgXDAzM1s2OzE7MjQ7ODAmdyAgKHJpZ2h0IGJ1dHRvbiBkb3duKQoJCSogIFwwMzNbNzswOzI0OzgwJncgIChyaWdodCBidXR0b24gdXApCgkJKiBDU0kgUGUgOyBQYiA7IFByIDsgUGMgOyBQcCAmIHcKCQkqIFBlIGlzIHRoZSBldmVudCBjb2RlCgkJKiBQYiBpcyB0aGUgYnV0dG9uIGNvZGUKCQkqIFByIGlzIHRoZSByb3cgY29vcmRpbmF0ZQoJCSogUGMgaXMgdGhlIGNvbHVtbiBjb29yZGluYXRlCgkJKiBQcCBpcyB0aGUgdGhpcmQgY29vcmRpbmF0ZSAocGFnZSBudW1iZXIpCgkJKiBQZSwgdGhlIGV2ZW50IGNvZGUgaW5kaWNhdGVzIHdoYXQgZXZlbnQgY2F1c2VkIHRoaXMgcmVwb3J0CgkJKiAgICBUaGUgZm9sbG93aW5nIGV2ZW50IGNvZGVzIGFyZSBkZWZpbmVkOgoJCSogICAgMCAtIHJlcXVlc3QsIHRoZSB0ZXJtaW5hbCByZWNlaXZlZCBhbiBleHBsaWNpdCByZXF1ZXN0CgkJKgkgZm9yIGEgbG9jYXRvciByZXBvcnQsIGJ1dCB0aGUgbG9jYXRvciBpcyB1bmF2YWlsYWJsZQoJCSogICAgMSAtIHJlcXVlc3QsIHRoZSB0ZXJtaW5hbCByZWNlaXZlZCBhbiBleHBsaWNpdCByZXF1ZXN0CgkJKgkgZm9yIGEgbG9jYXRvciByZXBvcnQKCQkqICAgIDIgLSBsZWZ0IGJ1dHRvbiBkb3duCgkJKiAgICAzIC0gbGVmdCBidXR0b24gdXAKCQkqICAgIDQgLSBtaWRkbGUgYnV0dG9uIGRvd24KCQkqICAgIDUgLSBtaWRkbGUgYnV0dG9uIHVwCgkJKiAgICA2IC0gcmlnaHQgYnV0dG9uIGRvd24KCQkqICAgIDcgLSByaWdodCBidXR0b24gdXAKCQkqICAgIDggLSBmb3VydGggYnV0dG9uIGRvd24KCQkqICAgIDkgLSBmb3VydGggYnV0dG9uIHVwCgkJKiAgICAxMCAtIGxvY2F0b3Igb3V0c2lkZSBmaWx0ZXIgcmVjdGFuZ2xlCgkJKiBQYiwgdGhlIGJ1dHRvbiBjb2RlLCBBU0NJSSBkZWNpbWFsIDAtMTUgaW5kaWNhdGluZyB3aGljaAoJCSogICBidXR0b25zIGFyZSBkb3duIGlmIGFueS4gVGhlIHN0YXRlIG9mIHRoZSBmb3VyIGJ1dHRvbnMKCQkqICAgb24gdGhlIGxvY2F0b3IgY29ycmVzcG9uZCB0byB0aGUgbG93IGZvdXIgYml0cyBvZiB0aGUKCQkqICAgZGVjaW1hbCB2YWx1ZSwKCQkqICAgIjEiIG1lYW5zIGJ1dHRvbiBkZXByZXNzZWQKCQkqICAgMCAtIG5vIGJ1dHRvbnMgZG93biwKCQkqICAgMSAtIHJpZ2h0LAoJCSogICAyIC0gbWlkZGxlLAoJCSogICA0IC0gbGVmdCwKCQkqICAgOCAtIGZvdXJ0aAoJCSogUHIgaXMgdGhlIHJvdyBjb29yZGluYXRlIG9mIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGluIHRoZSBwYWdlLAoJCSogICBlbmNvZGVkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgdmFsdWUuCgkJKiAgIElmIFByIGlzIG9taXR0ZWQsIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGlzIHVuZGVmaW5lZAoJCSogICAob3V0c2lkZSB0aGUgdGVybWluYWwgd2luZG93IGZvciBleGFtcGxlKS4KCQkqIFBjIGlzIHRoZSBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRvciBwb3NpdGlvbiBpbiB0aGUKCQkqICAgcGFnZSwgZW5jb2RlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIHZhbHVlLgoJCSogICBJZiBQYyBpcyBvbWl0dGVkLCB0aGUgbG9jYXRvciBwb3NpdGlvbiBpcyB1bmRlZmluZWQKCQkqICAgKG91dHNpZGUgdGhlIHRlcm1pbmFsIHdpbmRvdyBmb3IgZXhhbXBsZSkuCgkJKiBQcCBpcyB0aGUgcGFnZSBjb29yZGluYXRlIG9mIHRoZSBsb2NhdG9yIHBvc2l0aW9uCgkJKiAgIGVuY29kZWQgYXMgYW4gQVNDSUkgZGVjaW1hbCB2YWx1ZS4KCQkqICAgVGhlIHBhZ2UgY29vcmRpbmF0ZSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgbG9jYXRvciBpcyBvbgoJCSogICBwYWdlIG9uZSAodGhlIGRlZmF1bHQpLiAgV2UgaWdub3JlIGl0IGFueXdheS4KCQkqLwoJCWludCBQZSwgUGIsIFByLCBQYzsKCgkJcCA9IHRwICsgc2xlbjsKCgkJLyogZ2V0IGV2ZW50IHN0YXR1cyAqLwoJCVBlID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCgkJLyogZ2V0IGJ1dHRvbiBzdGF0dXMgKi8KCQlQYiA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgoJCS8qIGdldCByb3cgc3RhdHVzICovCgkJUHIgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoKCQkvKiBnZXQgY29sdW1uIHN0YXR1cyAqLwoJCVBjID0gZ2V0ZGlnaXRzKCZwKTsKCgkJLyogdGhlIHBhZ2UgcGFyYW1ldGVyIGlzIG9wdGlvbmFsICovCgkJaWYgKCpwID09ICc7JykKCQl7CgkJICAgIHArKzsKCQkgICAgKHZvaWQpZ2V0ZGlnaXRzKCZwKTsKCQl9CgkJaWYgKCpwKysgIT0gJyYnKQoJCSAgICByZXR1cm4gLTE7CgkJaWYgKCpwKysgIT0gJ3cnKQoJCSAgICByZXR1cm4gLTE7CgoJCW1vdXNlX2NvZGUgPSAwOwoJCXN3aXRjaCAoUGUpCgkJewoJCWNhc2UgIDA6IHJldHVybiAtMTsgLyogcG9zaXRpb24gcmVxdWVzdCB3aGlsZSB1bmF2YWlsYWJsZSAqLwoJCWNhc2UgIDE6IC8qIGEgcmVzcG9uc2UgdG8gYSBsb2NhdG9yIHBvc2l0aW9uIHJlcXVlc3QgaW5jbHVkZXMKCQkJICAgIHRoZSBzdGF0dXMgb2YgYWxsIGJ1dHRvbnMgKi8KCQkJIFBiICY9IDc7ICAgLyogbWFzayBvZmYgYW5kIGlnbm9yZSBmb3VydGggYnV0dG9uICovCgkJCSBpZiAoUGIgJiA0KQoJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfTEVGVDsKCQkJIGlmIChQYiAmIDIpCgkJCSAgICAgbW91c2VfY29kZSAgPSBNT1VTRV9NSURETEU7CgkJCSBpZiAoUGIgJiAxKQoJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfUklHSFQ7CgkJCSBpZiAoUGIpCgkJCSB7CgkJCSAgICAgaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlOwoJCQkgICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKCQkJICAgICBXYW50UXVlcnlNb3VzZSA9IFRSVUU7CgkJCSB9CgkJCSBpc19kcmFnID0gVFJVRTsKCQkJIHNob3dtb2RlKCk7CgkJCSBicmVhazsKCQljYXNlICAyOiBtb3VzZV9jb2RlID0gTU9VU0VfTEVGVDsKCQkJIFdhbnRRdWVyeU1vdXNlID0gVFJVRTsKCQkJIGJyZWFrOwoJCWNhc2UgIDM6IG1vdXNlX2NvZGUgPSBNT1VTRV9SRUxFQVNFIHwgTU9VU0VfTEVGVDsKCQkJIGJyZWFrOwoJCWNhc2UgIDQ6IG1vdXNlX2NvZGUgPSBNT1VTRV9NSURETEU7CgkJCSBXYW50UXVlcnlNb3VzZSA9IFRSVUU7CgkJCSBicmVhazsKCQljYXNlICA1OiBtb3VzZV9jb2RlID0gTU9VU0VfUkVMRUFTRSB8IE1PVVNFX01JRERMRTsKCQkJIGJyZWFrOwoJCWNhc2UgIDY6IG1vdXNlX2NvZGUgPSBNT1VTRV9SSUdIVDsKCQkJIFdhbnRRdWVyeU1vdXNlID0gVFJVRTsKCQkJIGJyZWFrOwoJCWNhc2UgIDc6IG1vdXNlX2NvZGUgPSBNT1VTRV9SRUxFQVNFIHwgTU9VU0VfUklHSFQ7CgkJCSBicmVhazsKCQljYXNlICA4OiByZXR1cm4gLTE7IC8qIGZvdXJ0aCBidXR0b24gZG93biAqLwoJCWNhc2UgIDk6IHJldHVybiAtMTsgLyogZm91cnRoIGJ1dHRvbiB1cCAqLwoJCWNhc2UgMTA6IHJldHVybiAtMTsgLyogbW91c2Ugb3V0c2lkZSBvZiBmaWx0ZXIgcmVjdGFuZ2xlICovCgkJZGVmYXVsdDogcmV0dXJuIC0xOyAvKiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KCQl9CgoJCW1vdXNlX2NvbCA9IFBjIC0gMTsKCQltb3VzZV9yb3cgPSBQciAtIDE7CgoJCXNsZW4gKz0gKGludCkocCAtICh0cCArIHNsZW4pKTsKCSAgICB9CiMgZW5kaWYgLyogRkVBVF9NT1VTRV9ERUMgKi8KIyBpZmRlZiBGRUFUX01PVVNFX1BURVJNCgkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfUFRFUk1fTU9VU0UpCgkgICAgewoJCWludCBidXR0b24sIG51bV9jbGlja3MsIGFjdGlvbiwgbWMsIG1yOwoKCQlwID0gdHAgKyBzbGVuOwoKCQlhY3Rpb24gPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoKCQltb3VzZV9yb3cgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoJCW1vdXNlX2NvbCA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgoJCWJ1dHRvbiA9IGdldGRpZ2l0cygmcCk7CgkJbW91c2VfY29kZSA9IDA7CgoJCXN3aXRjaCggYnV0dG9uICkKCQl7CgkJICAgIGNhc2UgNDogbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7IGJyZWFrOwoJCSAgICBjYXNlIDE6IG1vdXNlX2NvZGUgPSBNT1VTRV9SSUdIVDsgYnJlYWs7CgkJICAgIGNhc2UgMjogbW91c2VfY29kZSA9IE1PVVNFX01JRERMRTsgYnJlYWs7CgkJICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKCQl9CgoJCXN3aXRjaCggYWN0aW9uICkKCQl7CgkJICAgIGNhc2UgMzE6IC8qIEluaXRpYWwgcHJlc3MgKi8KCQkJaWYgKCpwKysgIT0gJzsnKQoJCQkgICAgcmV0dXJuIC0xOwoKCQkJbnVtX2NsaWNrcyA9IGdldGRpZ2l0cygmcCk7IC8qIE5vdCB1c2VkICovCgkJCWJyZWFrOwoKCQkgICAgY2FzZSAzMjogLyogUmVsZWFzZSAqLwoJCQltb3VzZV9jb2RlIHw9IE1PVVNFX1JFTEVBU0U7CgkJCWJyZWFrOwoKCQkgICAgY2FzZSAzMzogLyogRHJhZyAqLwoJCQloZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGU7CgkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKCQkJYnJlYWs7CgoJCSAgICBkZWZhdWx0OgoJCQlyZXR1cm4gLTE7CgkJfQoKCQlpZiAoKnArKyAhPSAndCcpCgkJICAgIHJldHVybiAtMTsKCgkJc2xlbiArPSAocCAtICh0cCArIHNsZW4pKTsKCSAgICB9CiMgZW5kaWYgLyogRkVBVF9NT1VTRV9QVEVSTSAqLwoKCSAgICAvKiBJbnRlcnByZXQgdGhlIG1vdXNlIGNvZGUgKi8KCSAgICBjdXJyZW50X2J1dHRvbiA9IChtb3VzZV9jb2RlICYgTU9VU0VfQ0xJQ0tfTUFTSyk7CgkgICAgaWYgKGN1cnJlbnRfYnV0dG9uID09IE1PVVNFX1JFTEVBU0UKIyBpZmRlZiBGRUFUX01PVVNFX1hURVJNCgkJICAgICYmIHdoZWVsX2NvZGUgPT0gMAojIGVuZGlmCgkJICAgICkKCSAgICB7CgkJLyoKCQkgKiBJZiB3ZSBnZXQgYSBtb3VzZSBkcmFnIG9yIHJlbGVhc2UgZXZlbnQgd2hlbgoJCSAqIHRoZXJlIGlzIG5vIG1vdXNlIGJ1dHRvbiBoZWxkIGRvd24gKGhlbGRfYnV0dG9uID09CgkJICogTU9VU0VfUkVMRUFTRSksIHByb2R1Y2UgYSBLX0lHTk9SRSBiZWxvdy4KCQkgKiAoY2FuIGhhcHBlbiB3aGVuIHlvdSBob2xkIGRvd24gdHdvIGJ1dHRvbnMKCQkgKiBhbmQgdGhlbiBsZXQgdGhlbSBnbywgb3IgY2xpY2sgaW4gdGhlIG1lbnUgYmFyLCBidXQgbm90CgkJICogb24gYSBtZW51LCBhbmQgZHJhZyBpbnRvIHRoZSB0ZXh0KS4KCQkgKi8KCQlpZiAoKG1vdXNlX2NvZGUgJiBNT1VTRV9EUkFHKSA9PSBNT1VTRV9EUkFHKQoJCSAgICBpc19kcmFnID0gVFJVRTsKCQljdXJyZW50X2J1dHRvbiA9IGhlbGRfYnV0dG9uOwoJICAgIH0KCSAgICBlbHNlIGlmICh3aGVlbF9jb2RlID09IDApCgkgICAgewojIGlmZGVmIENIRUNLX0RPVUJMRV9DTElDSwojICBpZmRlZiBGRUFUX01PVVNFX0dQTQojICAgaWZkZWYgRkVBVF9HVUkKCQkvKgoJCSAqIE9ubHkgZm9yIFVuaXgsIHdoZW4gR1VJIG9yIGdwbSBpcyBub3QgYWN0aXZlLCB3ZSBoYW5kbGUKCQkgKiBtdWx0aS1jbGlja3MgaGVyZS4KCQkgKi8KCQlpZiAoZ3BtX2ZsYWcgPT0gMCAmJiAhZ3VpLmluX3VzZSkKIyAgIGVsc2UKCQlpZiAoZ3BtX2ZsYWcgPT0gMCkKIyAgIGVuZGlmCiMgIGVsc2UKIyAgIGlmZGVmIEZFQVRfR1VJCgkJaWYgKCFndWkuaW5fdXNlKQojICAgZW5kaWYKIyAgZW5kaWYKCQl7CgkJICAgIC8qCgkJICAgICAqIENvbXB1dGUgdGhlIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgcHJldmlvdXMgbW91c2UgY2xpY2suCgkJICAgICAqLwoJCSAgICBnZXR0aW1lb2ZkYXkoJm1vdXNlX3RpbWUsIE5VTEwpOwoJCSAgICB0aW1lZGlmZiA9IChtb3VzZV90aW1lLnR2X3VzZWMKCQkJCQkgICAgLSBvcmlnX21vdXNlX3RpbWUudHZfdXNlYykgLyAxMDAwOwoJCSAgICBpZiAodGltZWRpZmYgPCAwKQoJCQktLW9yaWdfbW91c2VfdGltZS50dl9zZWM7CgkJICAgIHRpbWVkaWZmICs9IChtb3VzZV90aW1lLnR2X3NlYwoJCQkJCSAgICAgLSBvcmlnX21vdXNlX3RpbWUudHZfc2VjKSAqIDEwMDA7CgkJICAgIG9yaWdfbW91c2VfdGltZSA9IG1vdXNlX3RpbWU7CgkJICAgIGlmIChtb3VzZV9jb2RlID09IG9yaWdfbW91c2VfY29kZQoJCQkgICAgJiYgdGltZWRpZmYgPCBwX21vdXNldAoJCQkgICAgJiYgb3JpZ19udW1fY2xpY2tzICE9IDQKCQkJICAgICYmIG9yaWdfbW91c2VfY29sID09IG1vdXNlX2NvbAoJCQkgICAgJiYgb3JpZ19tb3VzZV9yb3cgPT0gbW91c2Vfcm93CgkJCSAgICAmJiAoKG9yaWdfdG9wbGluZSA9PSBjdXJ3aW4tPndfdG9wbGluZQojaWZkZWYgRkVBVF9ESUZGCgkJCQkgICAgJiYgb3JpZ190b3BmaWxsID09IGN1cndpbi0+d190b3BmaWxsCiNlbmRpZgoJCQkJKQojaWZkZWYgRkVBVF9XSU5ET1dTCgkJCQkvKiBEb3VibGUgY2xpY2sgaW4gdGFiIHBhZ2VzIGxpbmUgYWxzbyB3b3JrcwoJCQkJICogd2hlbiB3aW5kb3cgY29udGVudHMgY2hhbmdlcy4gKi8KCQkJCXx8IChtb3VzZV9yb3cgPT0gMCAmJiBmaXJzdHdpbi0+d193aW5yb3cgPiAwKQojZW5kaWYKCQkJICAgICAgICkKCQkJICAgICkKCQkJKytvcmlnX251bV9jbGlja3M7CgkJICAgIGVsc2UKCQkJb3JpZ19udW1fY2xpY2tzID0gMTsKCQkgICAgb3JpZ19tb3VzZV9jb2wgPSBtb3VzZV9jb2w7CgkJICAgIG9yaWdfbW91c2Vfcm93ID0gbW91c2Vfcm93OwoJCSAgICBvcmlnX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKI2lmZGVmIEZFQVRfRElGRgoJCSAgICBvcmlnX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKI2VuZGlmCgkJfQojICBpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfR1BNKQoJCWVsc2UKCQkgICAgb3JpZ19udW1fY2xpY2tzID0gTlVNX01PVVNFX0NMSUNLUyhtb3VzZV9jb2RlKTsKIyAgZW5kaWYKIyBlbHNlCgkJb3JpZ19udW1fY2xpY2tzID0gTlVNX01PVVNFX0NMSUNLUyhtb3VzZV9jb2RlKTsKIyBlbmRpZgoJCWlzX2NsaWNrID0gVFJVRTsKCQlvcmlnX21vdXNlX2NvZGUgPSBtb3VzZV9jb2RlOwoJICAgIH0KCSAgICBpZiAoIWlzX2RyYWcpCgkJaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlICYgTU9VU0VfQ0xJQ0tfTUFTSzsKCgkgICAgLyoKCSAgICAgKiBUcmFuc2xhdGUgdGhlIGFjdHVhbCBtb3VzZSBldmVudCBpbnRvIGEgcHNldWRvIG1vdXNlIGV2ZW50LgoJICAgICAqIEZpcnN0IHdvcmsgb3V0IHdoYXQgbW9kaWZpZXJzIGFyZSB0byBiZSB1c2VkLgoJICAgICAqLwoJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9TSElGVCkKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfU0hJRlQ7CgkgICAgaWYgKG9yaWdfbW91c2VfY29kZSAmIE1PVVNFX0NUUkwpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CgkgICAgaWYgKG9yaWdfbW91c2VfY29kZSAmIE1PVVNFX0FMVCkKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOwoJICAgIGlmIChvcmlnX251bV9jbGlja3MgPT0gMikKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfMkNMSUNLOwoJICAgIGVsc2UgaWYgKG9yaWdfbnVtX2NsaWNrcyA9PSAzKQoJCW1vZGlmaWVycyB8PSBNT0RfTUFTS18zQ0xJQ0s7CgkgICAgZWxzZSBpZiAob3JpZ19udW1fY2xpY2tzID09IDQpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLXzRDTElDSzsKCgkgICAgLyogV29yayBvdXQgb3VyIHBzZXVkbyBtb3VzZSBldmVudCAqLwoJICAgIGtleV9uYW1lWzBdID0gKGludClLU19FWFRSQTsKCSAgICBpZiAod2hlZWxfY29kZSAhPSAwKQoJCWtleV9uYW1lWzFdID0gKHdoZWVsX2NvZGUgJiAxKQoJCQkJCT8gKGludClLRV9NT1VTRVVQIDogKGludClLRV9NT1VTRURPV047CgkgICAgZWxzZQoJCWtleV9uYW1lWzFdID0gZ2V0X3BzZXVkb19tb3VzZV9jb2RlKGN1cnJlbnRfYnV0dG9uLAoJCQkJCQkJICAgaXNfY2xpY2ssIGlzX2RyYWcpOwoJfQojZW5kaWYgLyogRkVBVF9NT1VTRSAqLwoKI2lmZGVmIEZFQVRfR1VJCgkvKgoJICogSWYgdXNpbmcgdGhlIEdVSSwgdGhlbiB3ZSBnZXQgbWVudSBhbmQgc2Nyb2xsYmFyIGV2ZW50cy4KCSAqCgkgKiBBIG1lbnUgZXZlbnQgaXMgZW5jb2RlZCBhcyBLX1NQRUNJQUwsIEtTX01FTlUsIEtFX0ZJTExFUiBmb2xsb3dlZCBieQoJICogZm91ciBieXRlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gYXMgYSBwb2ludGVyIHRvIHRoZSB2aW1tZW51X1QKCSAqIHN0cnVjdHVyZS4KCSAqCgkgKiBBIHRhYiBsaW5lIGV2ZW50IGlzIGVuY29kZWQgYXMgS19TUEVDSUFMIEtTX1RBQkxJTkUgbnIsIHdoZXJlICJuciIKCSAqIGlzIG9uZSBieXRlIHdpdGggdGhlIHRhYiBpbmRleC4KCSAqCgkgKiBBIHNjcm9sbGJhciBldmVudCBpcyBLX1NQRUNJQUwsIEtTX1ZFUl9TQ1JPTExCQVIsIEtFX0ZJTExFUiBmb2xsb3dlZAoJICogYnkgb25lIGJ5dGUgcmVwcmVzZW50aW5nIHRoZSBzY3JvbGxiYXIgbnVtYmVyLCBhbmQgdGhlbiBmb3VyIGJ5dGVzCgkgKiByZXByZXNlbnRpbmcgYSBsb25nX3Ugd2hpY2ggaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgc2Nyb2xsYmFyLgoJICoKCSAqIEEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgZXZlbnQgaXMgS19TUEVDSUFMLCBLU19IT1JfU0NST0xMQkFSLAoJICogS0VfRklMTEVSIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMgcmVwcmVzZW50aW5nIGEgbG9uZ191IHdoaWNoIGlzIHRoZQoJICogbmV3IHZhbHVlIG9mIHRoZSBzY3JvbGxiYXIuCgkgKi8KIyBpZmRlZiBGRUFUX01FTlUKCWVsc2UgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTUVOVSkKCXsKCSAgICBsb25nX3UJdmFsOwoKCSAgICBudW1fYnl0ZXMgPSBnZXRfbG9uZ19mcm9tX2J1Zih0cCArIHNsZW4sICZ2YWwpOwoJICAgIGlmIChudW1fYnl0ZXMgPT0gLTEpCgkJcmV0dXJuIC0xOwoJICAgIGN1cnJlbnRfbWVudSA9ICh2aW1tZW51X1QgKil2YWw7CgkgICAgc2xlbiArPSBudW1fYnl0ZXM7CgoJICAgIC8qIFRoZSBtZW51IG1heSBoYXZlIGJlZW4gZGVsZXRlZCByaWdodCBhZnRlciBpdCB3YXMgdXNlZCwgY2hlY2sKCSAgICAgKiBmb3IgdGhhdC4gKi8KCSAgICBpZiAoY2hlY2tfbWVudV9wb2ludGVyKHJvb3RfbWVudSwgY3VycmVudF9tZW51KSA9PSBGQUlMKQoJICAgIHsKCQlrZXlfbmFtZVswXSA9IEtTX0VYVFJBOwoJCWtleV9uYW1lWzFdID0gKGludClLRV9JR05PUkU7CgkgICAgfQoJfQojIGVuZGlmCiMgaWZkZWYgRkVBVF9HVUlfVEFCTElORQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19UQUJMSU5FKQoJewoJICAgIC8qIFNlbGVjdGluZyB0YWJsaW5lIHRhYiBvciB1c2luZyBpdHMgbWVudS4gKi8KCSAgICBudW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgMSk7CgkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkKCQlyZXR1cm4gLTE7CgkgICAgY3VycmVudF90YWIgPSAoaW50KWJ5dGVzWzBdOwoJICAgIGlmIChjdXJyZW50X3RhYiA9PSAyNTUpCS8qIC0xIGluIGEgYnl0ZSBnaXZlcyAyNTUgKi8KCQljdXJyZW50X3RhYiA9IC0xOwoJICAgIHNsZW4gKz0gbnVtX2J5dGVzOwoJfQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19UQUJNRU5VKQoJewoJICAgIC8qIFNlbGVjdGluZyB0YWJsaW5lIHRhYiBvciB1c2luZyBpdHMgbWVudS4gKi8KCSAgICBudW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgMik7CgkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkKCQlyZXR1cm4gLTE7CgkgICAgY3VycmVudF90YWIgPSAoaW50KWJ5dGVzWzBdOwoJICAgIGN1cnJlbnRfdGFibWVudSA9IChpbnQpYnl0ZXNbMV07CgkgICAgc2xlbiArPSBudW1fYnl0ZXM7Cgl9CiMgZW5kaWYKIyBpZm5kZWYgVVNFX09OX0ZMWV9TQ1JPTEwKCWVsc2UgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfVkVSX1NDUk9MTEJBUikKCXsKCSAgICBsb25nX3UJdmFsOwoKCSAgICAvKiBHZXQgdGhlIGxhc3Qgc2Nyb2xsYmFyIGV2ZW50IGluIHRoZSBxdWV1ZSBvZiB0aGUgc2FtZSB0eXBlICovCgkgICAgaiA9IDA7CgkgICAgZm9yIChpID0gMDsgdHBbal0gPT0gQ1NJICYmIHRwW2ogKyAxXSA9PSBLU19WRVJfU0NST0xMQkFSCgkJCQkJCSAgICAgJiYgdHBbaiArIDJdICE9IE5VTDsgKytpKQoJICAgIHsKCQlqICs9IDM7CgkJbnVtX2J5dGVzID0gZ2V0X2J5dGVzX2Zyb21fYnVmKHRwICsgaiwgYnl0ZXMsIDEpOwoJCWlmIChudW1fYnl0ZXMgPT0gLTEpCgkJICAgIGJyZWFrOwoJCWlmIChpID09IDApCgkJICAgIGN1cnJlbnRfc2Nyb2xsYmFyID0gKGludClieXRlc1swXTsKCQllbHNlIGlmIChjdXJyZW50X3Njcm9sbGJhciAhPSAoaW50KWJ5dGVzWzBdKQoJCSAgICBicmVhazsKCQlqICs9IG51bV9ieXRlczsKCQludW1fYnl0ZXMgPSBnZXRfbG9uZ19mcm9tX2J1Zih0cCArIGosICZ2YWwpOwoJCWlmIChudW1fYnl0ZXMgPT0gLTEpCgkJICAgIGJyZWFrOwoJCXNjcm9sbGJhcl92YWx1ZSA9IHZhbDsKCQlqICs9IG51bV9ieXRlczsKCQlzbGVuID0gajsKCSAgICB9CgkgICAgaWYgKGkgPT0gMCkJCS8qIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byBtYWtlIG9uZSAqLwoJCXJldHVybiAtMTsKCX0KCWVsc2UgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfSE9SX1NDUk9MTEJBUikKCXsKCSAgICBsb25nX3UJdmFsOwoKCSAgICAvKiBHZXQgdGhlIGxhc3QgaG9yaXouIHNjcm9sbGJhciBldmVudCBpbiB0aGUgcXVldWUgKi8KCSAgICBqID0gMDsKCSAgICBmb3IgKGkgPSAwOyB0cFtqXSA9PSBDU0kgJiYgdHBbaiArIDFdID09IEtTX0hPUl9TQ1JPTExCQVIKCQkJCQkJICAgICAmJiB0cFtqICsgMl0gIT0gTlVMOyArK2kpCgkgICAgewoJCWogKz0gMzsKCQludW1fYnl0ZXMgPSBnZXRfbG9uZ19mcm9tX2J1Zih0cCArIGosICZ2YWwpOwoJCWlmIChudW1fYnl0ZXMgPT0gLTEpCgkJICAgIGJyZWFrOwoJCXNjcm9sbGJhcl92YWx1ZSA9IHZhbDsKCQlqICs9IG51bV9ieXRlczsKCQlzbGVuID0gajsKCSAgICB9CgkgICAgaWYgKGkgPT0gMCkJCS8qIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byBtYWtlIG9uZSAqLwoJCXJldHVybiAtMTsKCX0KIyBlbmRpZiAvKiAhVVNFX09OX0ZMWV9TQ1JPTEwgKi8KI2VuZGlmIC8qIEZFQVRfR1VJICovCgoJLyoKCSAqIENoYW5nZSA8eEhvbWU+IHRvIDxIb21lPiwgPHhVcD4gdG8gPFVwPiwgZXRjLgoJICovCglrZXkgPSBoYW5kbGVfeF9rZXlzKFRFUk1DQVAyS0VZKGtleV9uYW1lWzBdLCBrZXlfbmFtZVsxXSkpOwoKCS8qCgkgKiBBZGQgYW55IG1vZGlmaWVyIGNvZGVzIHRvIG91ciBzdHJpbmcuCgkgKi8KCW5ld19zbGVuID0gMDsJCS8qIExlbmd0aCBvZiB3aGF0IHdpbGwgcmVwbGFjZSB0aGUgdGVybWNvZGUgKi8KCWlmIChtb2RpZmllcnMgIT0gMCkKCXsKCSAgICAvKiBTb21lIGtleXMgaGF2ZSB0aGUgbW9kaWZpZXIgaW5jbHVkZWQuICBOZWVkIHRvIGhhbmRsZSB0aGF0IGhlcmUKCSAgICAgKiB0byBtYWtlIG1hcHBpbmdzIHdvcmsuICovCgkgICAga2V5ID0gc2ltcGxpZnlfa2V5KGtleSwgJm1vZGlmaWVycyk7CgkgICAgaWYgKG1vZGlmaWVycyAhPSAwKQoJICAgIHsKCQlzdHJpbmdbbmV3X3NsZW4rK10gPSBLX1NQRUNJQUw7CgkJc3RyaW5nW25ld19zbGVuKytdID0gKGludClLU19NT0RJRklFUjsKCQlzdHJpbmdbbmV3X3NsZW4rK10gPSBtb2RpZmllcnM7CgkgICAgfQoJfQoKCS8qIEZpbmFsbHksIGFkZCB0aGUgc3BlY2lhbCBrZXkgY29kZSB0byBvdXIgc3RyaW5nICovCglrZXlfbmFtZVswXSA9IEtFWTJURVJNQ0FQMChrZXkpOwoJa2V5X25hbWVbMV0gPSBLRVkyVEVSTUNBUDEoa2V5KTsKCWlmIChrZXlfbmFtZVswXSA9PSBLU19LRVkpCgkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMV07CS8qIGZyb20gIjpzZXQgPE0tYj49eHgiICovCgllbHNlCgl7CgkgICAgc3RyaW5nW25ld19zbGVuKytdID0gS19TUEVDSUFMOwoJICAgIHN0cmluZ1tuZXdfc2xlbisrXSA9IGtleV9uYW1lWzBdOwoJICAgIHN0cmluZ1tuZXdfc2xlbisrXSA9IGtleV9uYW1lWzFdOwoJfQoJc3RyaW5nW25ld19zbGVuXSA9IE5VTDsKCWV4dHJhID0gbmV3X3NsZW4gLSBzbGVuOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJewoJICAgIGlmIChleHRyYSA8IDApCgkJLyogcmVtb3ZlIG1hdGNoZWQgY2hhcnMsIHRha2luZyBjYXJlIG9mIG5vcmVtYXAgKi8KCQlkZWxfdHlwZWJ1ZigtZXh0cmEsIG9mZnNldCk7CgkgICAgZWxzZSBpZiAoZXh0cmEgPiAwKQoJCS8qIGluc2VydCB0aGUgZXh0cmEgc3BhY2Ugd2UgbmVlZCAqLwoJCWluc190eXBlYnVmKHN0cmluZyArIHNsZW4sIFJFTUFQX1lFUywgb2Zmc2V0LCBGQUxTRSwgRkFMU0UpOwoKCSAgICAvKgoJICAgICAqIENhcmVmdWw6IGRlbF90eXBlYnVmKCkgYW5kIGluc190eXBlYnVmKCkgbWF5IGhhdmUgcmVhbGxvY2F0ZWQKCSAgICAgKiB0eXBlYnVmLnRiX2J1ZltdIQoJICAgICAqLwoJICAgIG1jaF9tZW1tb3ZlKHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYgKyBvZmZzZXQsIHN0cmluZywKCQkJCQkJCSAgICAoc2l6ZV90KW5ld19zbGVuKTsKCX0KCWVsc2UKCXsKCSAgICBpZiAoZXh0cmEgPCAwKQoJCS8qIHJlbW92ZSBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KCQltY2hfbWVtbW92ZShidWYgKyBvZmZzZXQsIGJ1ZiArIG9mZnNldCAtIGV4dHJhLAoJCQkJCSAgIChzaXplX3QpKGJ1ZmxlbiArIG9mZnNldCArIGV4dHJhKSk7CgkgICAgZWxzZSBpZiAoZXh0cmEgPiAwKQoJCS8qIGluc2VydCB0aGUgZXh0cmEgc3BhY2Ugd2UgbmVlZCAqLwoJCW1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCArIGV4dHJhLCBidWYgKyBvZmZzZXQsCgkJCQkJCSAgIChzaXplX3QpKGJ1ZmxlbiAtIG9mZnNldCkpOwoJICAgIG1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCwgc3RyaW5nLCAoc2l6ZV90KW5ld19zbGVuKTsKCX0KCXJldHVybiAobGVuICsgZXh0cmEgKyBvZmZzZXQpOwogICAgfQoKICAgIHJldHVybiAwOwkJCSAgICAvKiBubyBtYXRjaCBmb3VuZCAqLwp9CgovKgogKiBSZXBsYWNlIGFueSB0ZXJtaW5hbCBjb2RlIHN0cmluZ3MgaW4gZnJvbVtdIHdpdGggdGhlIGVxdWl2YWxlbnQgaW50ZXJuYWwKICogdmltIHJlcHJlc2VudGF0aW9uLglUaGlzIGlzIHVzZWQgZm9yIHRoZSAiZnJvbSIgYW5kICJ0byIgcGFydCBvZiBhCiAqIG1hcHBpbmcsIGFuZCB0aGUgInRvIiBwYXJ0IG9mIGEgbWVudSBjb21tYW5kLgogKiBBbnkgc3RyaW5ncyBsaWtlICI8Qy1VUD4iIGFyZSBhbHNvIHJlcGxhY2VkLCB1bmxlc3MgJ2Nwb3B0aW9ucycgY29udGFpbnMKICogJzwnLgogKiBLX1NQRUNJQUwgYnkgaXRzZWxmIGlzIHJlcGxhY2VkIGJ5IEtfU1BFQ0lBTCBLU19TUEVDSUFMIEtFX0ZJTExFUi4KICoKICogVGhlIHJlcGxhY2VtZW50IGlzIGRvbmUgaW4gcmVzdWx0W10gYW5kIGZpbmFsbHkgY29waWVkIGludG8gYWxsb2NhdGVkCiAqIG1lbW9yeS4gSWYgdGhpcyBhbGwgd29ya3Mgd2VsbCAqYnVmcCBpcyBzZXQgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGEKICogcG9pbnRlciB0byBpdCBpcyByZXR1cm5lZC4gSWYgc29tZXRoaW5nIGZhaWxzICpidWZwIGlzIHNldCB0byBOVUxMIGFuZCBmcm9tCiAqIGlzIHJldHVybmVkLgogKgogKiBDVFJMLVYgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZC4gIFdoZW4gImZyb21fcGFydCIgaXMgVFJVRSwgYSB0cmFpbGluZyBDVFJMLVYKICogaXMgaW5jbHVkZWQsIG90aGVyd2lzZSBpdCBpcyByZW1vdmVkIChmb3IgIjptYXAgeHggXlYiLCBtYXBzIHh4IHRvCiAqIG5vdGhpbmcpLiAgV2hlbiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdCJywgYSBiYWNrc2xhc2ggY2FuIGJlIHVzZWQKICogaW5zdGVhZCBvZiBhIENUUkwtVi4KICovCiAgICBjaGFyX3UgKgpyZXBsYWNlX3Rlcm1jb2Rlcyhmcm9tLCBidWZwLCBmcm9tX3BhcnQsIGRvX2x0LCBzcGVjaWFsKQogICAgY2hhcl91CSpmcm9tOwogICAgY2hhcl91CSoqYnVmcDsKICAgIGludAkJZnJvbV9wYXJ0OwogICAgaW50CQlkb19sdDsJCS8qIGFsc28gdHJhbnNsYXRlIDxsdD4gKi8KICAgIGludAkJc3BlY2lhbDsJLyogYWx3YXlzIGFjY2VwdCA8a2V5PiBub3RhdGlvbiAqLwp7CiAgICBpbnQJCWk7CiAgICBpbnQJCXNsZW47CiAgICBpbnQJCWtleTsKICAgIGludAkJZGxlbiA9IDA7CiAgICBjaGFyX3UJKnNyYzsKICAgIGludAkJZG9fYmFja3NsYXNoOwkvKiBiYWNrc2xhc2ggaXMgYSBzcGVjaWFsIGNoYXJhY3RlciAqLwogICAgaW50CQlkb19zcGVjaWFsOwkvKiByZWNvZ25pemUgPD4ga2V5IGNvZGVzICovCiAgICBpbnQJCWRvX2tleV9jb2RlOwkvKiByZWNvZ25pemUgcmF3IGtleSBjb2RlcyAqLwogICAgY2hhcl91CSpyZXN1bHQ7CS8qIGJ1ZmZlciBmb3IgcmVzdWx0aW5nIHN0cmluZyAqLwoKICAgIGRvX2JhY2tzbGFzaCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlNMQVNIKSA9PSBOVUxMKTsKICAgIGRvX3NwZWNpYWwgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX1NQRUNJKSA9PSBOVUxMKSB8fCBzcGVjaWFsOwogICAgZG9fa2V5X2NvZGUgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tFWUNPREUpID09IE5VTEwpOwoKICAgIC8qCiAgICAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRyYW5zbGF0aW9uLiAgV29yc3QgY2FzZSBhIHNpbmdsZSBjaGFyYWN0ZXIgaXMKICAgICAqIHJlcGxhY2VkIGJ5IDYgYnl0ZXMgKHNoaWZ0ZWQgc3BlY2lhbCBrZXkpLCBwbHVzIGEgTlVMIGF0IHRoZSBlbmQuCiAgICAgKi8KICAgIHJlc3VsdCA9IGFsbG9jKCh1bnNpZ25lZClTVFJMRU4oZnJvbSkgKiA2ICsgMSk7CiAgICBpZiAocmVzdWx0ID09IE5VTEwpCQkvKiBvdXQgb2YgbWVtb3J5ICovCiAgICB7CgkqYnVmcCA9IE5VTEw7CglyZXR1cm4gZnJvbTsKICAgIH0KCiAgICBzcmMgPSBmcm9tOwoKICAgIC8qCiAgICAgKiBDaGVjayBmb3IgI24gYXQgc3RhcnQgb25seTogZnVuY3Rpb24ga2V5IG4KICAgICAqLwogICAgaWYgKGZyb21fcGFydCAmJiBzcmNbMF0gPT0gJyMnICYmIFZJTV9JU0RJR0lUKHNyY1sxXSkpICAvKiBmdW5jdGlvbiBrZXkgKi8KICAgIHsKCXJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOwoJcmVzdWx0W2RsZW4rK10gPSAnayc7CglpZiAoc3JjWzFdID09ICcwJykKCSAgICByZXN1bHRbZGxlbisrXSA9ICc7JzsJLyogIzAgaXMgRjEwIGlzICJrOyIgKi8KCWVsc2UKCSAgICByZXN1bHRbZGxlbisrXSA9IHNyY1sxXTsJLyogIzMgaXMgRjMgaXMgImszIiAqLwoJc3JjICs9IDI7CiAgICB9CgogICAgLyoKICAgICAqIENvcHkgZWFjaCBieXRlIGZyb20gKmZyb20gdG8gcmVzdWx0W2RsZW5dCiAgICAgKi8KICAgIHdoaWxlICgqc3JjICE9IE5VTCkKICAgIHsKCS8qCgkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICc8JywgY2hlY2sgZm9yIHNwZWNpYWwga2V5IGNvZGVzLAoJICogbGlrZSAiPEMtUy1Nb3VzZUxlZnQ+IgoJICovCglpZiAoZG9fc3BlY2lhbCAmJiAoZG9fbHQgfHwgU1RSTkNNUChzcmMsICI8bHQ+IiwgNCkgIT0gMCkpCgl7CiNpZmRlZiBGRUFUX0VWQUwKCSAgICAvKgoJICAgICAqIFJlcGxhY2UgPFNJRD4gYnkgS19TTlIgPHNjcmlwdC1ucj4gXy4KCSAgICAgKiAocm9vbTogNSAqIDYgPSAzMCBieXRlczsgbmVlZGVkOiAzICsgPG5yPiArIDEgPD0gMTQpCgkgICAgICovCgkgICAgaWYgKFNUUk5JQ01QKHNyYywgIjxTSUQ+IiwgNSkgPT0gMCkKCSAgICB7CgkJaWYgKGN1cnJlbnRfU0lEIDw9IDApCgkJICAgIEVNU0coXyhlX3VzaW5nc2lkKSk7CgkJZWxzZQoJCXsKCQkgICAgc3JjICs9IDU7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOwoJCSAgICByZXN1bHRbZGxlbisrXSA9IChpbnQpS1NfRVhUUkE7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gKGludClLRV9TTlI7CgkJICAgIHNwcmludGYoKGNoYXIgKilyZXN1bHQgKyBkbGVuLCAiJWxkIiwgKGxvbmcpY3VycmVudF9TSUQpOwoJCSAgICBkbGVuICs9IChpbnQpU1RSTEVOKHJlc3VsdCArIGRsZW4pOwoJCSAgICByZXN1bHRbZGxlbisrXSA9ICdfJzsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0KI2VuZGlmCgoJICAgIHNsZW4gPSB0cmFuc19zcGVjaWFsKCZzcmMsIHJlc3VsdCArIGRsZW4sIFRSVUUpOwoJICAgIGlmIChzbGVuKQoJICAgIHsKCQlkbGVuICs9IHNsZW47CgkJY29udGludWU7CgkgICAgfQoJfQoKCS8qCgkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdrJywgc2VlIGlmIGl0J3MgYW4gYWN0dWFsIGtleS1jb2RlLgoJICogTm90ZSB0aGF0IHRoaXMgaXMgYWxzbyBjaGVja2VkIGFmdGVyIHJlcGxhY2luZyB0aGUgPD4gZm9ybS4KCSAqIFNpbmdsZSBjaGFyYWN0ZXIgY29kZXMgYXJlIE5PVCByZXBsYWNlZCAoZS5nLiBeSCBvciBERUwpLCBiZWNhdXNlCgkgKiBpdCBjb3VsZCBiZSBhIGNoYXJhY3RlciBpbiB0aGUgZmlsZS4KCSAqLwoJaWYgKGRvX2tleV9jb2RlKQoJewoJICAgIGkgPSBmaW5kX3Rlcm1fYnlrZXlzKHNyYyk7CgkgICAgaWYgKGkgPj0gMCkKCSAgICB7CgkJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJcmVzdWx0W2RsZW4rK10gPSB0ZXJtY29kZXNbaV0ubmFtZVswXTsKCQlyZXN1bHRbZGxlbisrXSA9IHRlcm1jb2Rlc1tpXS5uYW1lWzFdOwoJCXNyYyArPSB0ZXJtY29kZXNbaV0ubGVuOwoJCS8qIElmIHRlcm1pbmFsIGNvZGUgbWF0Y2hlZCwgY29udGludWUgYWZ0ZXIgaXQuICovCgkJY29udGludWU7CgkgICAgfQoJfQoKI2lmZGVmIEZFQVRfRVZBTAoJaWYgKGRvX3NwZWNpYWwpCgl7CgkgICAgY2hhcl91CSpwLCAqcywgbGVuOwoKCSAgICAvKgoJICAgICAqIFJlcGxhY2UgPExlYWRlcj4gYnkgdGhlIHZhbHVlIG9mICJtYXBsZWFkZXIiLgoJICAgICAqIFJlcGxhY2UgPExvY2FsTGVhZGVyPiBieSB0aGUgdmFsdWUgb2YgIm1hcGxvY2FsbGVhZGVyIi4KCSAgICAgKiBJZiAibWFwbGVhZGVyIiBvciAibWFwbG9jYWxsZWFkZXIiIGlzbid0IHNldCB1c2UgYSBiYWNrc2xhc2guCgkgICAgICovCgkgICAgaWYgKFNUUk5JQ01QKHNyYywgIjxMZWFkZXI+IiwgOCkgPT0gMCkKCSAgICB7CgkJbGVuID0gODsKCQlwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImc6bWFwbGVhZGVyIik7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUk5JQ01QKHNyYywgIjxMb2NhbExlYWRlcj4iLCAxMykgPT0gMCkKCSAgICB7CgkJbGVuID0gMTM7CgkJcCA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOm1hcGxvY2FsbGVhZGVyIik7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJbGVuID0gMDsKCQlwID0gTlVMTDsKCSAgICB9CgkgICAgaWYgKGxlbiAhPSAwKQoJICAgIHsKCQkvKiBBbGxvdyB1cCB0byA4ICogNiBjaGFyYWN0ZXJzIGZvciAibWFwbGVhZGVyIi4gKi8KCQlpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCB8fCBTVFJMRU4ocCkgPiA4ICogNikKCQkgICAgcyA9IChjaGFyX3UgKikiXFwiOwoJCWVsc2UKCQkgICAgcyA9IHA7CgkJd2hpbGUgKCpzICE9IE5VTCkKCQkgICAgcmVzdWx0W2RsZW4rK10gPSAqcysrOwoJCXNyYyArPSBsZW47CgkJY29udGludWU7CgkgICAgfQoJfQojZW5kaWYKCgkvKgoJICogUmVtb3ZlIENUUkwtViBhbmQgaWdub3JlIHRoZSBuZXh0IGNoYXJhY3Rlci4KCSAqIEZvciAiZnJvbSIgc2lkZSB0aGUgQ1RSTC1WIGF0IHRoZSBlbmQgaXMgaW5jbHVkZWQsIGZvciB0aGUgInRvIgoJICogcGFydCBpdCBpcyByZW1vdmVkLgoJICogSWYgJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAnQicsIGFsc28gYWNjZXB0IGEgYmFja3NsYXNoLgoJICovCglrZXkgPSAqc3JjOwoJaWYgKGtleSA9PSBDdHJsX1YgfHwgKGRvX2JhY2tzbGFzaCAmJiBrZXkgPT0gJ1xcJykpCgl7CgkgICAgKytzcmM7CQkJCS8qIHNraXAgQ1RSTC1WIG9yIGJhY2tzbGFzaCAqLwoJICAgIGlmICgqc3JjID09IE5VTCkKCSAgICB7CgkJaWYgKGZyb21fcGFydCkKCQkgICAgcmVzdWx0W2RsZW4rK10gPSBrZXk7CgkJYnJlYWs7CgkgICAgfQoJfQoKI2lmZGVmIEZFQVRfTUJZVEUKCS8qIHNraXAgbXVsdGlieXRlIGNoYXIgY29ycmVjdGx5ICovCglmb3IgKGkgPSAoKm1iX3B0cjJsZW4pKHNyYyk7IGkgPiAwOyAtLWkpCiNlbmRpZgoJewoJICAgIC8qCgkgICAgICogSWYgdGhlIGNoYXJhY3RlciBpcyBLX1NQRUNJQUwsIHJlcGxhY2UgaXQgd2l0aCBLX1NQRUNJQUwKCSAgICAgKiBLU19TUEVDSUFMIEtFX0ZJTExFUi4KCSAgICAgKiBJZiBjb21waWxlZCB3aXRoIHRoZSBHVUkgcmVwbGFjZSBDU0kgd2l0aCBLX0NTSS4KCSAgICAgKi8KCSAgICBpZiAoKnNyYyA9PSBLX1NQRUNJQUwpCgkgICAgewoJCXJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOwoJCXJlc3VsdFtkbGVuKytdID0gS1NfU1BFQ0lBTDsKCQlyZXN1bHRbZGxlbisrXSA9IEtFX0ZJTExFUjsKCSAgICB9CiMgaWZkZWYgRkVBVF9HVUkKCSAgICBlbHNlIGlmICgqc3JjID09IENTSSkKCSAgICB7CgkJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJcmVzdWx0W2RsZW4rK10gPSBLU19FWFRSQTsKCQlyZXN1bHRbZGxlbisrXSA9IChpbnQpS0VfQ1NJOwoJICAgIH0KIyBlbmRpZgoJICAgIGVsc2UKCQlyZXN1bHRbZGxlbisrXSA9ICpzcmM7CgkgICAgKytzcmM7Cgl9CiAgICB9CiAgICByZXN1bHRbZGxlbl0gPSBOVUw7CgogICAgLyoKICAgICAqIENvcHkgdGhlIG5ldyBzdHJpbmcgdG8gYWxsb2NhdGVkIG1lbW9yeS4KICAgICAqIElmIHRoaXMgZmFpbHMsIGp1c3QgcmV0dXJuIGZyb20uCiAgICAgKi8KICAgIGlmICgoKmJ1ZnAgPSB2aW1fc3Ryc2F2ZShyZXN1bHQpKSAhPSBOVUxMKQoJZnJvbSA9ICpidWZwOwogICAgdmltX2ZyZWUocmVzdWx0KTsKICAgIHJldHVybiBmcm9tOwp9CgovKgogKiBGaW5kIGEgdGVybWNvZGUgd2l0aCBrZXlzICdzcmMnIChtdXN0IGJlIE5VTCB0ZXJtaW5hdGVkKS4KICogUmV0dXJuIHRoZSBpbmRleCBpbiB0ZXJtY29kZXNbXSwgb3IgLTEgaWYgbm90IGZvdW5kLgogKi8KICAgIGludApmaW5kX3Rlcm1fYnlrZXlzKHNyYykKICAgIGNoYXJfdQkqc3JjOwp7CiAgICBpbnQJCWk7CiAgICBpbnQJCXNsZW47CgogICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQogICAgewoJc2xlbiA9IHRlcm1jb2Rlc1tpXS5sZW47CglpZiAoc2xlbiA+IDEgJiYgU1RSTkNNUCh0ZXJtY29kZXNbaV0uY29kZSwgc3JjLCAoc2l6ZV90KXNsZW4pID09IDApCgkgICAgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCi8qCiAqIEdhdGhlciB0aGUgZmlyc3QgY2hhcmFjdGVycyBpbiB0aGUgdGVybWluYWwga2V5IGNvZGVzIGludG8gYSBzdHJpbmcuCiAqIFVzZWQgdG8gc3BlZWQgdXAgY2hlY2tfdGVybWNvZGUoKS4KICovCiAgICBzdGF0aWMgdm9pZApnYXRoZXJfdGVybWxlYWRlcigpCnsKICAgIGludAkgICAgaTsKICAgIGludAkgICAgbGVuID0gMDsKCiNpZmRlZiBGRUFUX0dVSQogICAgaWYgKGd1aS5pbl91c2UpCgl0ZXJtbGVhZGVyW2xlbisrXSA9IENTSTsgICAgLyogdGhlIEdVSSBjb2RlcyBhcmUgbm90IGluIHRlcm1jb2Rlc1tdICovCiNlbmRpZgojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKICAgIGlmIChjaGVja19mb3JfY29kZXMpCgl0ZXJtbGVhZGVyW2xlbisrXSA9IERDUzsgICAgLyogdGhlIHRlcm1jb2RlIHJlc3BvbnNlIHN0YXJ0cyB3aXRoIERDUwoJCQkJICAgICAgIGluIDgtYml0IG1vZGUgKi8KI2VuZGlmCiAgICB0ZXJtbGVhZGVyW2xlbl0gPSBOVUw7CgogICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJaWYgKHZpbV9zdHJjaHIodGVybWxlYWRlciwgdGVybWNvZGVzW2ldLmNvZGVbMF0pID09IE5VTEwpCgl7CgkgICAgdGVybWxlYWRlcltsZW4rK10gPSB0ZXJtY29kZXNbaV0uY29kZVswXTsKCSAgICB0ZXJtbGVhZGVyW2xlbl0gPSBOVUw7Cgl9CgogICAgbmVlZF9nYXRoZXIgPSBGQUxTRTsKfQoKLyoKICogU2hvdyBhbGwgdGVybWNvZGVzIChmb3IgIjpzZXQgdGVybWNhcCIpCiAqIFRoaXMgY29kZSBsb29rcyBhIGxvdCBsaWtlIHNob3dvcHRpb25zKCksIGJ1dCBpcyBkaWZmZXJlbnQuCiAqLwogICAgdm9pZApzaG93X3Rlcm1jb2RlcygpCnsKICAgIGludAkJY29sOwogICAgaW50CQkqaXRlbXM7CiAgICBpbnQJCWl0ZW1fY291bnQ7CiAgICBpbnQJCXJ1bjsKICAgIGludAkJcm93LCByb3dzOwogICAgaW50CQljb2xzOwogICAgaW50CQlpOwogICAgaW50CQlsZW47CgojZGVmaW5lIElOQzMgMjcJICAgIC8qIHRyeSB0byBtYWtlIHRocmVlIGNvbHVtbnMgKi8KI2RlZmluZSBJTkMyIDQwCSAgICAvKiB0cnkgdG8gbWFrZSB0d28gY29sdW1ucyAqLwojZGVmaW5lIEdBUCAyCSAgICAvKiBzcGFjZXMgYmV0d2VlbiBjb2x1bW5zICovCgogICAgaWYgKHRjX2xlbiA9PSAwKQkgICAgLyogbm8gdGVybWluYWwgY29kZXMgKG11c3QgYmUgR1VJKSAqLwoJcmV0dXJuOwogICAgaXRlbXMgPSAoaW50ICopYWxsb2MoKHVuc2lnbmVkKShzaXplb2YoaW50KSAqIHRjX2xlbikpOwogICAgaWYgKGl0ZW1zID09IE5VTEwpCglyZXR1cm47CgogICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCiAgICBNU0dfUFVUU19USVRMRShfKCJcbi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIpKTsKCiAgICAvKgogICAgICogZG8gdGhlIGxvb3AgdHdvIHRpbWVzOgogICAgICogMS4gZGlzcGxheSB0aGUgc2hvcnQgaXRlbXMgKG5vbi1zdHJpbmdzIGFuZCBzaG9ydCBzdHJpbmdzKQogICAgICogMi4gZGlzcGxheSB0aGUgbWVkaXVtIGl0ZW1zIChtZWRpdW0gbGVuZ3RoIHN0cmluZ3MpCiAgICAgKiAzLiBkaXNwbGF5IHRoZSBsb25nIGl0ZW1zIChyZW1haW5pbmcgc3RyaW5ncykKICAgICAqLwogICAgZm9yIChydW4gPSAxOyBydW4gPD0gMyAmJiAhZ290X2ludDsgKytydW4pCiAgICB7CgkvKgoJICogY29sbGVjdCB0aGUgaXRlbXMgaW4gaXRlbXNbXQoJICovCglpdGVtX2NvdW50ID0gMDsKCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47IGkrKykKCXsKCSAgICBsZW4gPSBzaG93X29uZV90ZXJtY29kZSh0ZXJtY29kZXNbaV0ubmFtZSwKCQkJCQkJICAgIHRlcm1jb2Rlc1tpXS5jb2RlLCBGQUxTRSk7CgkgICAgaWYgKGxlbiA8PSBJTkMzIC0gR0FQID8gcnVuID09IDEKCQkJOiBsZW4gPD0gSU5DMiAtIEdBUCA/IHJ1biA9PSAyCgkJCTogcnVuID09IDMpCgkJaXRlbXNbaXRlbV9jb3VudCsrXSA9IGk7Cgl9CgoJLyoKCSAqIGRpc3BsYXkgdGhlIGl0ZW1zCgkgKi8KCWlmIChydW4gPD0gMikKCXsKCSAgICBjb2xzID0gKENvbHVtbnMgKyBHQVApIC8gKHJ1biA9PSAxID8gSU5DMyA6IElOQzIpOwoJICAgIGlmIChjb2xzID09IDApCgkJY29scyA9IDE7CgkgICAgcm93cyA9IChpdGVtX2NvdW50ICsgY29scyAtIDEpIC8gY29sczsKCX0KCWVsc2UJLyogcnVuID09IDMgKi8KCSAgICByb3dzID0gaXRlbV9jb3VudDsKCWZvciAocm93ID0gMDsgcm93IDwgcm93cyAmJiAhZ290X2ludDsgKytyb3cpCgl7CgkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CQkJLyogZ28gdG8gbmV4dCBsaW5lICovCgkgICAgaWYgKGdvdF9pbnQpCQkJLyogJ3EnIHR5cGVkIGluIG1vcmUgKi8KCQlicmVhazsKCSAgICBjb2wgPSAwOwoJICAgIGZvciAoaSA9IHJvdzsgaSA8IGl0ZW1fY291bnQ7IGkgKz0gcm93cykKCSAgICB7CgkJbXNnX2NvbCA9IGNvbDsJCQkvKiBtYWtlIGNvbHVtbnMgKi8KCQlzaG93X29uZV90ZXJtY29kZSh0ZXJtY29kZXNbaXRlbXNbaV1dLm5hbWUsCgkJCQkJICAgICAgdGVybWNvZGVzW2l0ZW1zW2ldXS5jb2RlLCBUUlVFKTsKCQlpZiAocnVuID09IDIpCgkJICAgIGNvbCArPSBJTkMyOwoJCWVsc2UKCQkgICAgY29sICs9IElOQzM7CgkgICAgfQoJICAgIG91dF9mbHVzaCgpOwoJICAgIHVpX2JyZWFrY2hlY2soKTsKCX0KICAgIH0KICAgIHZpbV9mcmVlKGl0ZW1zKTsKfQoKLyoKICogU2hvdyBvbmUgdGVybWNvZGUgZW50cnkuCiAqIE91dHB1dCBnb2VzIGludG8gSU9idWZmW10KICovCiAgICBpbnQKc2hvd19vbmVfdGVybWNvZGUobmFtZSwgY29kZSwgcHJpbnRpdCkKICAgIGNoYXJfdSAgKm5hbWU7CiAgICBjaGFyX3UgICpjb2RlOwogICAgaW50CSAgICBwcmludGl0Owp7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWxlbjsKCiAgICBpZiAobmFtZVswXSA+ICd+JykKICAgIHsKCUlPYnVmZlswXSA9ICcgJzsKCUlPYnVmZlsxXSA9ICcgJzsKCUlPYnVmZlsyXSA9ICcgJzsKCUlPYnVmZlszXSA9ICcgJzsKICAgIH0KICAgIGVsc2UKICAgIHsKCUlPYnVmZlswXSA9ICd0JzsKCUlPYnVmZlsxXSA9ICdfJzsKCUlPYnVmZlsyXSA9IG5hbWVbMF07CglJT2J1ZmZbM10gPSBuYW1lWzFdOwogICAgfQogICAgSU9idWZmWzRdID0gJyAnOwoKICAgIHAgPSBnZXRfc3BlY2lhbF9rZXlfbmFtZShURVJNQ0FQMktFWShuYW1lWzBdLCBuYW1lWzFdKSwgMCk7CiAgICBpZiAocFsxXSAhPSAndCcpCglTVFJDUFkoSU9idWZmICsgNSwgcCk7CiAgICBlbHNlCglJT2J1ZmZbNV0gPSBOVUw7CiAgICBsZW4gPSAoaW50KVNUUkxFTihJT2J1ZmYpOwogICAgZG8KCUlPYnVmZltsZW4rK10gPSAnICc7CiAgICB3aGlsZSAobGVuIDwgMTcpOwogICAgSU9idWZmW2xlbl0gPSBOVUw7CiAgICBpZiAoY29kZSA9PSBOVUxMKQoJbGVuICs9IDQ7CiAgICBlbHNlCglsZW4gKz0gdmltX3N0cnNpemUoY29kZSk7CgogICAgaWYgKHByaW50aXQpCiAgICB7Cgltc2dfcHV0cyhJT2J1ZmYpOwoJaWYgKGNvZGUgPT0gTlVMTCkKCSAgICBtc2dfcHV0cygoY2hhcl91ICopIk5VTEwiKTsKCWVsc2UKCSAgICBtc2dfb3V0dHJhbnMoY29kZSk7CiAgICB9CiAgICByZXR1cm4gbGVuOwp9CgojaWYgZGVmaW5lZChGRUFUX1RFUk1SRVNQT05TRSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogRm9yIFh0ZXJtID49IDE0MCBjb21waWxlZCB3aXRoIE9QVF9UQ0FQX1FVRVJZOiBPYnRhaW4gdGhlIGFjdHVhbGx5IHVzZWQKICogdGVybWNhcCBjb2RlcyBmcm9tIHRoZSB0ZXJtaW5hbCBpdHNlbGYuCiAqIFdlIGdldCB0aGVtIG9uZSBieSBvbmUgdG8gYXZvaWQgYSB2ZXJ5IGxvbmcgcmVzcG9uc2Ugc3RyaW5nLgogKi8Kc3RhdGljIGludCB4dF9pbmRleF9pbiA9IDA7CnN0YXRpYyBpbnQgeHRfaW5kZXhfb3V0ID0gMDsKCiAgICBzdGF0aWMgdm9pZApyZXFfY29kZXNfZnJvbV90ZXJtKCkKewogICAgeHRfaW5kZXhfb3V0ID0gMDsKICAgIHh0X2luZGV4X2luID0gMDsKICAgIHJlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSgpOwp9CgogICAgc3RhdGljIHZvaWQKcmVxX21vcmVfY29kZXNfZnJvbV90ZXJtKCkKewogICAgY2hhcglidWZbMTFdOwogICAgaW50CQlvbGRfaWR4ID0geHRfaW5kZXhfb3V0OwoKICAgIC8qIERvbid0IGRvIGFueXRoaW5nIHdoZW4gZ29pbmcgdG8gZXhpdC4gKi8KICAgIGlmIChleGl0aW5nKQoJcmV0dXJuOwoKICAgIC8qIFNlbmQgdXAgdG8gMTAgbW9yZSByZXF1ZXN0cyBvdXQgdGhhbiB3ZSByZWNlaXZlZC4gIEF2b2lkIHNlbmRpbmcgdG9vCiAgICAgKiBtYW55LCB0aGVyZSBjYW4gYmUgYSBidWZmZXIgb3ZlcmZsb3cgc29tZXdoZXJlLiAqLwogICAgd2hpbGUgKHh0X2luZGV4X291dCA8IHh0X2luZGV4X2luICsgMTAgJiYga2V5X25hbWVzW3h0X2luZGV4X291dF0gIT0gTlVMTCkKICAgIHsKCXNwcmludGYoYnVmLCAiXDAzM1ArcSUwMnglMDJ4XDAzM1xcIiwKCQkgICAgICBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XVswXSwga2V5X25hbWVzW3h0X2luZGV4X291dF1bMV0pOwoJb3V0X3N0cl9uZigoY2hhcl91ICopYnVmKTsKCSsreHRfaW5kZXhfb3V0OwogICAgfQoKICAgIC8qIFNlbmQgdGhlIGNvZGVzIG91dCByaWdodCBhd2F5LiAqLwogICAgaWYgKHh0X2luZGV4X291dCAhPSBvbGRfaWR4KQoJb3V0X2ZsdXNoKCk7Cn0KCi8qCiAqIERlY29kZSBrZXkgY29kZSByZXNwb25zZSBmcm9tIHh0ZXJtOiAnPEVzYz5QMStyPG5hbWU+PTxzdHJpbmc+PEVzYz5cJy4KICogQSAiMCIgaW5zdGVhZCBvZiB0aGUgIjEiIGluZGljYXRlcyBhIGNvZGUgdGhhdCBpc24ndCBzdXBwb3J0ZWQuCiAqIEJvdGggPG5hbWU+IGFuZCA8c3RyaW5nPiBhcmUgZW5jb2RlZCBpbiBoZXguCiAqICJjb2RlIiBwb2ludHMgdG8gdGhlICIwIiBvciAiMSIuCiAqLwogICAgc3RhdGljIHZvaWQKZ290X2NvZGVfZnJvbV90ZXJtKGNvZGUsIGxlbikKICAgIGNoYXJfdQkqY29kZTsKICAgIGludAkJbGVuOwp7CiNkZWZpbmUgWFRfTEVOIDEwMAogICAgY2hhcl91CW5hbWVbM107CiAgICBjaGFyX3UJc3RyW1hUX0xFTl07CiAgICBpbnQJCWk7CiAgICBpbnQJCWogPSAwOwogICAgaW50CQljOwoKICAgIC8qIEEgJzEnIG1lYW5zIHRoZSBjb2RlIGlzIHN1cHBvcnRlZCwgYSAnMCcgbWVhbnMgaXQgaXNuJ3QuCiAgICAgKiBXaGVuIGhhbGYgdGhlIGxlbmd0aCBpcyA+IFhUX0xFTiB3ZSBjYW4ndCB1c2UgaXQuCiAgICAgKiBPdXIgbmFtZXMgYXJlIGN1cnJlbnRseSBhbGwgMiBjaGFyYWN0ZXJzLiAqLwogICAgaWYgKGNvZGVbMF0gPT0gJzEnICYmIGNvZGVbN10gPT0gJz0nICYmIGxlbiAvIDIgPCBYVF9MRU4pCiAgICB7CgkvKiBHZXQgdGhlIG5hbWUgZnJvbSB0aGUgcmVzcG9uc2UgYW5kIGZpbmQgaXQgaW4gdGhlIHRhYmxlLiAqLwoJbmFtZVswXSA9IGhleGhleDJucihjb2RlICsgMyk7CgluYW1lWzFdID0gaGV4aGV4Mm5yKGNvZGUgKyA1KTsKCW5hbWVbMl0gPSBOVUw7Cglmb3IgKGkgPSAwOyBrZXlfbmFtZXNbaV0gIT0gTlVMTDsgKytpKQoJewoJICAgIGlmIChTVFJDTVAoa2V5X25hbWVzW2ldLCBuYW1lKSA9PSAwKQoJICAgIHsKCQl4dF9pbmRleF9pbiA9IGk7CgkJYnJlYWs7CgkgICAgfQoJfQoJaWYgKGtleV9uYW1lc1tpXSAhPSBOVUxMKQoJewoJICAgIGZvciAoaSA9IDg7IChjID0gaGV4aGV4Mm5yKGNvZGUgKyBpKSkgPj0gMDsgaSArPSAyKQoJCXN0cltqKytdID0gYzsKCSAgICBzdHJbal0gPSBOVUw7CgkgICAgaWYgKG5hbWVbMF0gPT0gJ0MnICYmIG5hbWVbMV0gPT0gJ28nKQoJICAgIHsKCQkvKiBDb2xvciBjb3VudCBpcyBub3QgYSBrZXkgY29kZS4gKi8KCQlpID0gYXRvaSgoY2hhciAqKXN0cik7CgkJaWYgKGkgIT0gdF9jb2xvcnMpCgkJewoJCSAgICAvKiBOciBvZiBjb2xvcnMgY2hhbmdlZCwgaW5pdGlhbGl6ZSBoaWdobGlnaHRpbmcgYW5kCgkJICAgICAqIHJlZHJhdyBldmVyeXRoaW5nLiAgVGhpcyBjYXVzZXMgYSByZWRyYXcsIHdoaWNoIHVzdWFsbHkKCQkgICAgICogY2xlYXJzIHRoZSBtZXNzYWdlLiAgVHJ5IGtlZXBpbmcgdGhlIG1lc3NhZ2UgaWYgaXQKCQkgICAgICogbWlnaHQgd29yay4gKi8KCQkgICAgc2V0X2tlZXBfbXNnX2Zyb21faGlzdCgpOwoJCSAgICBzZXRfY29sb3JfY291bnQoaSk7CgkJICAgIGluaXRfaGlnaGxpZ2h0KFRSVUUsIEZBTFNFKTsKCQkgICAgcmVkcmF3X2xhdGVyKENMRUFSKTsKCQl9CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJLyogRmlyc3QgZGVsZXRlIGFueSBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIGNvZGUuICovCgkJaSA9IGZpbmRfdGVybV9ieWtleXMoc3RyKTsKCQlpZiAoaSA+PSAwKQoJCSAgICBkZWxfdGVybWNvZGVfaWR4KGkpOwoJCWFkZF90ZXJtY29kZShuYW1lLCBzdHIsIEFUQ19GUk9NX1RFUk0pOwoJICAgIH0KCX0KICAgIH0KCiAgICAvKiBNYXkgcmVxdWVzdCBtb3JlIGNvZGVzIG5vdyB0aGF0IHdlIHJlY2VpdmVkIG9uZS4gKi8KICAgICsreHRfaW5kZXhfaW47CiAgICByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKTsKfQoKLyoKICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB1bmFuc3dlcmVkIHJlcXVlc3RzIGFuZCBkZWFsIHdpdGggdGhlbS4KICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIGFuIGV4dGVybmFsIHByb2dyYW0gb3IgZ2V0dGluZyBkaXJlY3QKICoga2V5Ym9hcmQgaW5wdXQuICBXZSBkb24ndCB3YW50IHJlc3BvbnNlcyB0byBiZSBzZW5kIHRvIHRoYXQgcHJvZ3JhbSBvcgogKiBoYW5kbGVkIGFzIHR5cGVkIHRleHQuCiAqLwogICAgc3RhdGljIHZvaWQKY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpCnsKICAgIGludAkJYzsKCiAgICAvKiBJZiBubyBjb2RlcyByZXF1ZXN0ZWQgb3IgYWxsIGFyZSBhbnN3ZXJlZCwgbm8gbmVlZCB0byB3YWl0LiAqLwogICAgaWYgKHh0X2luZGV4X291dCA9PSAwIHx8IHh0X2luZGV4X291dCA9PSB4dF9pbmRleF9pbikKCXJldHVybjsKCiAgICAvKiBWZ2V0YygpIHdpbGwgY2hlY2sgZm9yIGFuZCBoYW5kbGUgYW55IHJlc3BvbnNlLgogICAgICogS2VlcCBjYWxsaW5nIHZwZWVrYygpIHVudGlsIHdlIGRvbid0IGdldCBhbnkgcmVzcG9uc2VzLiAqLwogICAgKytub19tYXBwaW5nOwogICAgKythbGxvd19rZXlzOwogICAgZm9yICg7OykKICAgIHsKCWMgPSB2cGVla2MoKTsKCWlmIChjID09IE5VTCkJICAgIC8qIG5vdGhpbmcgYXZhaWxhYmxlICovCgkgICAgYnJlYWs7CgoJLyogSWYgYSByZXNwb25zZSBpcyByZWNvZ25pemVkIGl0J3MgcmVwbGFjZWQgd2l0aCBLX0lHTk9SRSwgbXVzdCByZWFkCgkgKiBpdCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICBJZiB0aGVyZSBpcyBubyBLX0lHTk9SRSB3ZSBjYW4ndCBkbwoJICogYW55dGhpbmcsIGJyZWFrIGhlcmUgKHRoZXJlIG1pZ2h0IGJlIHNvbWUgcmVzcG9uc2VzIGZ1cnRoZXIgb24sIGJ1dAoJICogd2UgZG9uJ3Qgd2FudCB0byB0aHJvdyBhd2F5IGFueSB0eXBlZCBjaGFycykuICovCglpZiAoYyAhPSBLX1NQRUNJQUwgJiYgYyAhPSBLX0lHTk9SRSkKCSAgICBicmVhazsKCWMgPSB2Z2V0YygpOwoJaWYgKGMgIT0gS19JR05PUkUpCgl7CgkgICAgdnVuZ2V0YyhjKTsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIC0tbm9fbWFwcGluZzsKICAgIC0tYWxsb3dfa2V5czsKfQojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogVHJhbnNsYXRlIGFuIGludGVybmFsIG1hcHBpbmcvYWJicmV2aWF0aW9uIHJlcHJlc2VudGF0aW9uIGludG8gdGhlCiAqIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgb25lIHJlY29nbml6ZWQgYnkgOm1hcC86YWJicmV2IGNvbW1hbmRzOwogKiByZXNwZWN0cyB0aGUgY3VycmVudCBCL2svPCBzZXR0aW5ncyBvZiAnY3BvcHRpb24nLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGV4cGFuZGluZyBtYXBwaW5ncy9hYmJyZXZpYXRpb25zIG9uIHRoZQogKiBjb21tYW5kLWxpbmUsIGFuZCBmb3IgYnVpbGRpbmcgdGhlICJBbWJpZ3VvdXMgbWFwcGluZy4uLiIgZXJyb3IgbWVzc+ZnZS4KICoKICogSXQgdXNlcyBhIGdyb3dhcnJheSB0byBidWlsZCB0aGUgdHJhbnNsYXRpb24gc3RyaW5nIHNpbmNlIHRoZQogKiBsYXR0ZXIgY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9yaWdpbmFsIGRlc2NyaXB0aW9uLiBUaGUgY2FsbGVyIGhhcyB0bwogKiBmcmVlIHRoZSBzdHJpbmcgYWZ0ZXJ3YXJkcy4KICoKICogUmV0dXJucyBOVUxMIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtLgogKi8KICAgIGNoYXJfdSAqCnRyYW5zbGF0ZV9tYXBwaW5nKHN0ciwgZXhwbWFwKQogICAgY2hhcl91CSpzdHI7CiAgICBpbnQJCWV4cG1hcDsgIC8qIFRSVUUgd2hlbiBleHBhbmRpbmcgbWFwcGluZ3Mgb24gY29tbWFuZC1saW5lICovCnsKICAgIGdhcnJheV9UCWdhOwogICAgaW50CQljOwogICAgaW50CQltb2RpZmllcnM7CiAgICBpbnQJCWNwb19ic2xhc2g7CiAgICBpbnQJCWNwb19zcGVjaWFsOwogICAgaW50CQljcG9fa2V5Y29kZTsKCiAgICBnYV9pbml0KCZnYSk7CiAgICBnYS5nYV9pdGVtc2l6ZSA9IDE7CiAgICBnYS5nYV9ncm93c2l6ZSA9IDQwOwoKICAgIGNwb19ic2xhc2ggPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0JTTEFTSCkgIT0gTlVMTCk7CiAgICBjcG9fc3BlY2lhbCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1BFQ0kpICE9IE5VTEwpOwogICAgY3BvX2tleWNvZGUgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tFWUNPREUpID09IE5VTEwpOwoKICAgIGZvciAoOyAqc3RyOyArK3N0cikKICAgIHsKCWMgPSAqc3RyOwoJaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKCXsKCSAgICBtb2RpZmllcnMgPSAwOwoJICAgIGlmIChzdHJbMV0gPT0gS1NfTU9ESUZJRVIpCgkgICAgewoJCXN0cisrOwoJCW1vZGlmaWVycyA9ICorK3N0cjsKCQljID0gKisrc3RyOwoJICAgIH0KCSAgICBpZiAoY3BvX3NwZWNpYWwgJiYgY3BvX2tleWNvZGUgJiYgYyA9PSBLX1NQRUNJQUwgJiYgIW1vZGlmaWVycykKCSAgICB7CgkJaW50CWk7CgoJCS8qIHRyeSB0byBmaW5kIHNwZWNpYWwga2V5IGluIHRlcm1jb2RlcyAqLwoJCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCQkgICAgaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IHN0clsxXQoJCQkJCSAgICAmJiB0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBzdHJbMl0pCgkJCWJyZWFrOwoJCWlmIChpIDwgdGNfbGVuKQoJCXsKCQkgICAgZ2FfY29uY2F0KCZnYSwgdGVybWNvZGVzW2ldLmNvZGUpOwoJCSAgICBzdHIgKz0gMjsKCQkgICAgY29udGludWU7IC8qIGZvciAoc3RyKSAqLwoJCX0KCSAgICB9CgkgICAgaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKCSAgICB7CgkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKCQl7CgkJICAgIGdhX2NsZWFyKCZnYSk7CgkJICAgIHJldHVybiBOVUxMOwoJCX0KCQljID0gVE9fU1BFQ0lBTChzdHJbMV0sIHN0clsyXSk7CgkJaWYgKGMgPT0gS19aRVJPKQkvKiBkaXNwbGF5IDxOdWw+IGFzIF5AICovCgkJICAgIGMgPSBOVUw7CgkJc3RyICs9IDI7CgkgICAgfQoJICAgIGlmIChJU19TUEVDSUFMKGMpIHx8IG1vZGlmaWVycykJLyogc3BlY2lhbCBrZXkgKi8KCSAgICB7CgkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKCQl7CgkJICAgIGdhX2NsZWFyKCZnYSk7CgkJICAgIHJldHVybiBOVUxMOwoJCX0KCQlnYV9jb25jYXQoJmdhLCBnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RpZmllcnMpKTsKCQljb250aW51ZTsgLyogZm9yIChzdHIpICovCgkgICAgfQoJfQoJaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09IEN0cmxfSiB8fCBjID09IEN0cmxfVgoJICAgIHx8IChjID09ICc8JyAmJiAhY3BvX3NwZWNpYWwpIHx8IChjID09ICdcXCcgJiYgIWNwb19ic2xhc2gpKQoJICAgIGdhX2FwcGVuZCgmZ2EsIGNwb19ic2xhc2ggPyBDdHJsX1YgOiAnXFwnKTsKCWlmIChjKQoJICAgIGdhX2FwcGVuZCgmZ2EsIGMpOwogICAgfQogICAgZ2FfYXBwZW5kKCZnYSwgTlVMKTsKICAgIHJldHVybiAoY2hhcl91ICopKGdhLmdhX2RhdGEpOwp9CiNlbmRpZgoKI2lmIChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJKSkgfHwgZGVmaW5lZChQUk9UTykKc3RhdGljIGNoYXIga3NtZV9zdHJbMjBdOwpzdGF0aWMgY2hhciBrc21yX3N0clsyMF07CnN0YXRpYyBjaGFyIGtzbWRfc3RyWzIwXTsKCi8qCiAqIEZvciBXaW4zMiBjb25zb2xlOiB1cGRhdGUgdGVybWNhcCBjb2RlcyBmb3IgZXhpc3RpbmcgY29uc29sZSBhdHRyaWJ1dGVzLgogKi8KICAgIHZvaWQKdXBkYXRlX3RjYXAoYXR0cikKICAgIGludCBhdHRyOwp7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpwOwoKICAgIHAgPSBmaW5kX2J1aWx0aW5fdGVybShERUZBVUxUX1RFUk0pOwogICAgc3ByaW50Zihrc21lX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLCBhdHRyKTsKICAgIHNwcmludGYoa3NtZF9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwKCQkJCSAgICAgYXR0ciB8IDB4MDgpOyAgLyogRk9SRUdST1VORF9JTlRFTlNJVFkgKi8KICAgIHNwcmludGYoa3Ntcl9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwKCQkJCSAoKGF0dHIgJiAweDBGKSA8PCA0KSB8ICgoYXR0ciAmIDB4RjApID4+IDQpKTsKCiAgICB3aGlsZSAocC0+YnRfc3RyaW5nICE9IE5VTEwpCiAgICB7CiAgICAgIGlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX01FKQoJICBwLT5idF9zdHJpbmcgPSAma3NtZV9zdHJbMF07CiAgICAgIGVsc2UgaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTVIpCgkgIHAtPmJ0X3N0cmluZyA9ICZrc21yX3N0clswXTsKICAgICAgZWxzZSBpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19NRCkKCSAgcC0+YnRfc3RyaW5nID0gJmtzbWRfc3RyWzBdOwogICAgICArK3A7CiAgICB9Cn0KI2VuZGlmCg==