LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgcm91dGluZXMgcmVxdWlyZWQgdG8gcGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqICAgbGlzdGVkIGluIGEgY29uZmlnIGZpbGUsIGlmIHRoYXQgY29uZmlnIGZpbGUgZXhpc3RzLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBPbmx5IGluY2x1ZGUgdGhpcyBmaWxlIGlmIFVTRV9QUk9GSUxFIGlzIGRlZmluZWQgKi8KI2lmZGVmIFVTRV9QUk9GSUxFCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIHBhcnNlIGNvbmZpZyBmaWxlICovCiNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKI2RlZmluZSBCSU5fREwgMQoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLyogI2luY2x1ZGUgPGhjZmRlZi5oPiAqLwoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfZW5jLmg+CiNpbmNsdWRlIDx3bF9tYWluLmg+CiNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZ2xvYmFsIHZhcmlhYmxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogRGVmaW5pdGlvbiBuZWVkZWQgdG8gcHJldmVudCB1bnJlc29sdmVkIGV4dGVybmFsIGluIHVuaXN0ZC5oICovCnN0YXRpYyBpbnQgZXJybm87CgojaWYgREJHCmV4dGVybiBwX3UzMiAgICBEZWJ1Z0ZsYWc7CmV4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOwojZW5kaWYKCmludCBwYXJzZV95ZXNfbm8oY2hhciAqdmFsdWUpOwoKCmludCBwYXJzZV95ZXNfbm8oY2hhciAqdmFsdWUpCnsKaW50IHJjID0gMDsJCQkJCQkJCQkJLyogZGVmYXVsdCB0byBOTyBmb3IgaW52YWxpZCBwYXJhbWV0ZXJzICovCgoJaWYgKHN0cmxlbih2YWx1ZSkgPT0gMSkgewoJCWlmICgodmFsdWVbMF0gfCAoJ1knXid5JykpID09ICd5JykKCQkJcmMgPSAxOwoJLyogfSBlbHNlIHsgKi8KCQkvKiB0aGlzIHNob3VsZCBub3QgYmUgZGVidWcgdGltZSBpbmZvLCBpdCBpcyBhbiBlbmR1c2VyIGRhdGEgZW50cnkgZXJyb3IgOz8gKi8KCQkvKiBEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MpOyAqLwoJfQoJcmV0dXJuIHJjOwp9IC8qIHBhcnNlX3llc19ubyAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXBhcnNlX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBkZXZpY2UncyBjb25maWcgZmlsZSBhbmQgcGFyc2VzIHRoZSBvcHRpb25zIGZyb20KICogICBpdCwgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgY29uZmlndXJlIGl0c2VsZi4gSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlCiAqICAgb3IgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgb3B0aW9ucyBhbHJlYWR5CiAqICAgcGFyc2VkIGZyb20gY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBwYXJzZV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJaW50CQkJCSAgICBmaWxlX2Rlc2M7CiNpZiAwIC8qIEJJTl9ETCAqLwoJaW50CQkJCXJjOwoJY2hhcgkJCQkqY3AgPSBOVUxMOwojZW5kaWYgLyogQklOX0RMICovCgljaGFyICAgICAgICAgICAgICAgIGJ1ZmZlcltNQVhfTElORV9TSVpFXTsKCWNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbTUFYX0xJTkVfU0laRV07CgltbV9zZWdtZW50X3QJICAgIGZzOwoJc3RydWN0IHdsX3ByaXZhdGUgICAqd3ZsYW5fY29uZmlnID0gTlVMTDsKCUVOQ1NUUkNUICAgICAgICAgICAgc0VuY3J5cHRpb247CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoInBhcnNlX2NvbmZpZyIpOwoJREJHX0VOVEVSKERiZ0luZm8pOwoKCS8qIEdldCB0aGUgd2F2ZWxhbiBzcGVjaWZpYyBpbmZvIGZvciB0aGlzIGRldmljZSAqLwoJd3ZsYW5fY29uZmlnID0gZGV2LT5wcml2OwoJaWYgKHd2bGFuX2NvbmZpZyA9PSBOVUxMKSB7CgkJREJHX0VSUk9SKERiZ0luZm8sICJXYXZlbGFuIHNwZWNpZmljIGluZm8gc3RydWN0IG5vdCBwcmVzZW50P1xuIik7CgkJcmV0dXJuOwoJfQoKCS8qIHNldHVwIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24gc3RyaW5nICovCglzdHJjcHkod3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sIERFRl9DUllQVF9TVFIpOwoKCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCglmcyA9IGdldF9mcygpOwoJc2V0X2ZzKGdldF9kcygpKTsKCgkvKiBEZXRlcm1pbmUgdGhlIGZpbGVuYW1lIGZvciB0aGlzIGRldmljZSBhbmQgYXR0ZW1wdCB0byBvcGVuIGl0ICovCglzcHJpbnRmKGZpbGVuYW1lLCAiJXMlcyIsIFJPT1RfQ09ORklHX0ZJTEVOQU1FLCBkZXYtPm5hbWUpOwoJZmlsZV9kZXNjID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIDApOwoJaWYgKGZpbGVfZGVzYyAhPSAtMSkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiV2lyZWxlc3MgY29uZmlnIGZpbGUgZm91bmQuIFBhcnNpbmcgb3B0aW9ucy4uLlxuIik7CgoJCS8qIFJlYWQgb3V0IHRoZSBvcHRpb25zICovCgkJd2hpbGUgKHJlYWRsaW5lKGZpbGVfZGVzYywgYnVmZmVyKSkKCQkJdHJhbnNsYXRlX29wdGlvbihidWZmZXIsIHd2bGFuX2NvbmZpZyk7CgkJLyogQ2xvc2UgdGhlIGZpbGUgKi8KCQljbG9zZShmaWxlX2Rlc2MpOwkvKiA7P2V2ZW4gaWYgZmlsZV9kZXNjID09IC0xID8/PyAqLwoJfSBlbHNlIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIk5vIGl3Y29uZmlnIGZpbGUgZm91bmQgZm9yIHRoaXMgZGV2aWNlOyAiCgkJCQkgICAiY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cyB3aWxsIGJlIHVzZWRcbiIpOwoJfQoJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCglzZXRfZnMoZnMpOwoKCS8qIGNvbnZlcnQgdGhlIFdFUCBrZXlzLCBpZiByZWFkIGluIGFzIGtleTEsIGtleTIsIHR5cGUgb2YgZGF0YSAqLwoJaWYgKHd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbikgewoJCW1lbXNldCgmc0VuY3J5cHRpb24sIDAsIHNpemVvZihzRW5jcnlwdGlvbikpOwoKCQl3bF93ZXBfZGVjb2RlKENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwKCQkJCQkJICAgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pOwoKCQkvKiB0aGUgTGludXggZHJpdmVyIGxpa2VzIHRvIHVzZSAxLTQgZm9yIHRoZSBrZXkgSURzLCBhbmQgdGhlbgoJCSAgIGNvbnZlcnQgdG8gMC0zIHdoZW4gc2VuZGluZyB0byB0aGUgY2FyZC4gIFRoZSBXaW5kb3dzIGNvZGUKCQkgICBiYXNlIHVzZWQgMC0zIGluIHRoZSBBUEkgRExMLCB3aGljaCB3YXMgcG9ydGVkIHRvIExpbnV4LiAgRm9yCgkJICAgdGhlIHNha2Ugb2YgdGhlIHVzZXIgZXhwZXJpZW5jZSwgd2UgZGVjaWRlZCB0byBrZWVwIDAtMyBhcyB0aGUKCQkgICBudW1iZXJzIHVzZWQgaW4gdGhlIERMTDsgYW5kIHdpbGwgcGVyZm9ybSB0aGUgKzEgY29udmVyc2lvbiBoZXJlLgoJCSAgIFdlIGNvdWxkIGhhdmUgY29udmVydGVkICB0aGUgZW50aXJlIExpbnV4IGRyaXZlciwgYnV0IHRoaXMgaXMKCQkgICBsZXNzIG9idHJ1c2l2ZS4gIFRoaXMgbWF5IGJlIGEgInRvZG8iIHRvIGNvbnZlcnQgdGhlIHdob2xlIGRyaXZlciAqLwoJCXNFbmNyeXB0aW9uLndFbmFibGVkID0gd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uOwoJCXNFbmNyeXB0aW9uLndUeEtleUlEID0gd3ZsYW5fY29uZmlnLT5UcmFuc21pdEtleUlEIC0gMTsKCgkJbWVtY3B5KCZzRW5jcnlwdGlvbi5FbmNTdHIsICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLAoJCQkJc2l6ZW9mKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QpKTsKCgkJbWVtc2V0KHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2Yod3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pKTsKCgkJd2xfd2VwX2NvZGUoQ1JZUFRfQ09ERSwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sICZzRW5jcnlwdGlvbiwKCQkJCQkJIHNpemVvZihzRW5jcnlwdGlvbikpOwoJfQoKCS8qIGRlY29kZSB0aGUgZW5jcnlwdGlvbiBzdHJpbmcgZm9yIHRoZSBjYWxsIHRvIHdsX2NvbW1pdCgpICovCgl3bF93ZXBfZGVjb2RlKENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24pOwoKCXd2bGFuX2NvbmZpZy0+VHJhbnNtaXRLZXlJRCAgICA9IHNFbmNyeXB0aW9uLndUeEtleUlEICsgMTsKCXd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbiA9IHNFbmNyeXB0aW9uLndFbmFibGVkOwoKCW1lbWNweSgmd3ZsYW5fY29uZmlnLT5EZWZhdWx0S2V5cywgJnNFbmNyeXB0aW9uLkVuY1N0ciwKCQkJc2l6ZW9mKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QpKTsKCiNpZiAwIC8qIEJJTl9ETCAqLwoJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCgkJZnMgPSBnZXRfZnMoKTsKCQlzZXRfZnMoZ2V0X2RzKCkpOwoKCQkvKiA7P2p1c3QgdG8gZmFrZSBzb21ldGhpbmcgKi8KCQlzdHJjcHkoLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsICIvZXRjL2FnZXJlL2Z3LmJpbiIpOwoJCWZpbGVfZGVzYyA9IG9wZW4oLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsIDAsIDApOwoJCWlmIChmaWxlX2Rlc2MgPT0gLTEpIHsKCQkJREJHX0VSUk9SKERiZ0luZm8sICJObyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKCQl9IGVsc2UgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKI2RlZmluZSBESEZfQUxMT0NfU0laRSA5NjAwMAkJCS8qIGp1c3QgYmVsb3cgOTZLLCBsZXQncyBob3BlIGl0IHN1ZmZpY2VzIGZvciBub3cgYW5kIGZvciB0aGUgZnV0dXJlICovCgkJCWNwID0gdm1hbGxvYyhESEZfQUxMT0NfU0laRSk7CgkJCWlmIChjcCA9PSBOVUxMKSB7CgkJCQlEQkdfRVJST1IoRGJnSW5mbywgImVycm9yIGluIHZtYWxsb2NcbiIpOwoJCQl9IGVsc2UgewoJCQkJcmMgPSByZWFkKGZpbGVfZGVzYywgY3AsIERIRl9BTExPQ19TSVpFKTsKCQkJCWlmIChyYyA9PSBESEZfQUxMT0NfU0laRSkgewoJCQkJCURCR19FUlJPUihEYmdJbmZvLCAiYnVmZmVyIHRvbyBzbWFsbCwgJWRcbiIsIERIRl9BTExPQ19TSVpFKTsKCQkJCX0gZWxzZSBpZiAocmMgPiAwKSB7CgkJCQkJREJHX1RSQUNFKERiZ0luZm8sICJyZWFkIE8uSy46ICVkIGJ5dGVzICAlLjEyc1xuIiwgcmMsIGNwKTsKCQkJCQlyYyA9IHJlYWQoZmlsZV9kZXNjLCAmY3BbcmNdLCAxKTsKCQkJCQlpZiAocmMgPT0gMCkKCQkJCQkJREJHX1RSQUNFKERiZ0luZm8sICJubyBtb3JlIHRvIHJlYWRcbiIpOwoJCQkJfQoJCQkJaWYgKHJjICE9IDApIHsKCQkJCQlEQkdfRVJST1IoRGJnSW5mbywgImZpbGUgbm90IHJlYWQgaW4gb25lIHN3b29wIG9yIG90aGVyIGVycm9yIlwKCQkJCQkJCQkJCSIsIGdpdmUgdXAsIHRvbyBjb21wbGljYXRlZCwgcmMgPSAlMFhcbiIsIHJjKTsKCQkJCX0KCQkJCXZmcmVlKGNwKTsKCQkJfQoJCQljbG9zZShmaWxlX2Rlc2MpOwoJCX0KCQlzZXRfZnMoZnMpOwkJCS8qIFJldHVybiB0byB0aGUgb3JpZ2luYWwgY29udGV4dCAqLwojZW5kaWYgLyogQklOX0RMICovCgoJREJHX0xFQVZFKERiZ0luZm8pOwoJcmV0dXJuOwp9IC8qIHBhcnNlX2NvbmZpZyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcmVhZGxpbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBpbiBkYXRhIGZyb20gYSBnaXZlbiBmaWxlIG9uZSBsaW5lIGF0IGEgdGltZSwKICogICBjb252ZXJ0aW5nIHRoZSBkZXRlY3RlZCBuZXdsaW5lIGNoYXJhY3RlciAnXG4nIHRvIGEgbnVsbCAnXDAnLiBOb3RlIHRoYXQKICogICB0aGUgZmlsZSBkZXNjcmlwdG9yIG11c3QgYmUgdmFsaWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZmlsZWRlc2MgICAgLSB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUKICogICAgICBidWZmZXIgICAgICAtIGEgYnVmZmVyIHBvaW50ZXIsIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyLCB0byB3aGljaCB0aGUKICogICAgICAgICAgICAgICAgICAgIGxpbmUgd2lsbCBiZSBzdG9yZWQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogKiAgICAgIC0xIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCByZWFkbGluZShpbnQgZmlsZWRlc2MsIGNoYXIgKmJ1ZmZlcikKewoJaW50IHJlc3VsdCA9IC0xOwoJaW50IGJ5dGVzX3JlYWQgPSAwOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCS8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGdvb2QgKi8KCWlmIChmaWxlZGVzYyAhPSAtMSkgewoJCS8qIFJlYWQgaW4gZnJvbSB0aGUgZmlsZSBieXRlIGJ5IGJ5dGUgdW50aWwgYSBuZXdsaW5lIGlzIHJlYWNoZWQgKi8KCQl3aGlsZSAoKHJlc3VsdCA9IHJlYWQoZmlsZWRlc2MsICZidWZmZXJbYnl0ZXNfcmVhZF0sIDEpKSA9PSAxKSB7CgkJCWlmIChidWZmZXJbYnl0ZXNfcmVhZF0gPT0gJ1xuJykgewoJCQkJYnVmZmVyW2J5dGVzX3JlYWRdID0gJ1wwJzsKCQkJCWJ5dGVzX3JlYWQrKzsKCQkJCWJyZWFrOwoJCQl9CgkJCWJ5dGVzX3JlYWQrKzsKCQl9Cgl9CgoJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwoJaWYgKHJlc3VsdCA9PSAtMSkKCQlyZXR1cm4gcmVzdWx0OwoJZWxzZQoJCXJldHVybiBieXRlc19yZWFkOwp9IC8qIHJlYWRsaW5lICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl0cmFuc2xhdGVfb3B0aW9uKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaW5lIHJlYWQgaW4gZnJvbSB0aGUgY29uZmlnIGZpbGUgYW5kIHBhcnNlcyBvdXQKICogICB0aGUga2V5L3ZhbHVlIHBhaXJzLiBJdCB0aGVuIGRldGVybWluZXMgd2hpY2gga2V5IGhhcyBiZWVuIHBhcnNlZCBhbmQgc2V0cwogKiAgIHRoZSBjYXJkJ3MgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWUgZ2l2ZW4uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGJ1ZmZlciAtIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBsaW5lIHRvIHRyYW5zbGF0ZQogKiAgICAgIGNvbmZpZyAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB0cmFuc2xhdGVfb3B0aW9uKGNoYXIgKmJ1ZmZlciwgc3RydWN0IHdsX3ByaXZhdGUgKmxwKQp7Cgl1bnNpZ25lZCBpbnQgdmFsdWVfY29udmVydCA9IDA7CglpbnQgc3RyaW5nX2xlbmd0aCA9IDA7CgljaGFyICprZXkgPSBOVUxMOwoJY2hhciAqdmFsdWUgPSBOVUxMOwoJdV9jaGFyIG1hY192YWx1ZVtFVEhfQUxFTl07CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoInRyYW5zbGF0ZV9vcHRpb24iKTsKCglpZiAoYnVmZmVyID09IE5VTEwgfHwgbHAgPT0gTlVMTCkgewoJCURCR19FUlJPUihEYmdJbmZvLCAiQ29uZmlnIGZpbGUgYnVmZmVyIGFuZC9vciB3YXZlbGFuIGJ1ZmZlciBwdHIgTlVMTFxuIik7CgkJcmV0dXJuOwoJfQoKCVBhcnNlQ29uZmlnTGluZShidWZmZXIsICZrZXksICZ2YWx1ZSk7CgoJaWYgKGtleSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpCgkJcmV0dXJuOwoKCS8qIERldGVybWluZSB3aGljaCBrZXkgaXQgaXMgYW5kIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiAqLwoKCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB1c2VkIGluIGFsbCBzY2VuYXJpb3MgKi8KI2lmIERCRwoJLyogaGFuZGxlIERlYnVnRmxhZyBhcyBlYXJseSBhcyBwb3NzaWJsZSBzbyBpdCBzdGFydHMgaXRzIGluZmx1ZW5jZSBhcyBlYXJseQoJICogYXMgcG9zc2libGUKCSAqLwoJaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9ERUJVR19GTEFHKSA9PSAwKSB7CgkJaWYgKERlYnVnRmxhZyA9PSB+MCkgewkJCS8qIGlmIERlYnVnRmxhZyBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KCQkJaWYgKERiZ0luZm8tPkRlYnVnRmxhZyA9PSAwKSB7CS8qIGlmIHBjX2RlYnVnIGRpZCBub3Qgc2V0IERlYnVnRmxhZyAoaS5lLnBjX2RlYnVnIGlzCgkJCQkJCQkJCQkJICogbm90IHNwZWNpZmllZCBvciBzcGVjaWZpZWQgb3V0c2lkZSB0aGUgNC04IHJhbmdlCgkJCQkJCQkJCQkJICovCgkJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX0RFRkFVTFRTOwoJCQl9CgkJfSBlbHNlIHsKCQkJRGJnSW5mby0+RGVidWdGbGFnID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOyAvKiA7P0RlYnVnRmxhZzsgKi8KCQl9CgkJRGJnSW5mby0+RGVidWdGbGFnID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOyAvKiA7P0RlbGV0ZSBBU0FQICovCgl9CiNlbmRpZiAvKiBEQkcgKi8KCWlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUsIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQVVUSF9LRVlfTUdNVF9TVUlURSkgfHwgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSkpCgkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0JSU0NfMkdIWikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0JSU0NfMkdIWiwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9CUlNDKSB8fCAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDKSkKCQkJbHAtPmJyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQlJTQ18yR0haKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0JSU0NfNUdIWikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0JSU0NfNUdIWiwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9CUlNDKSB8fCAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDKSkKCQkJbHAtPmJyc2NbMV0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQlJTQ181R0haKTsKCX0gZWxzZSBpZiAoKHN0cmNtcChrZXksIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQpID09IDApIHx8IChzdHJjbXAoa2V5LCBQQVJNX05BTUVfT1dOX1NTSUQpID09IDApKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICJTU0lELCB2YWx1ZTogJXNcbiIsIHZhbHVlKTsKCgkJbWVtc2V0KGxwLT5OZXR3b3JrTmFtZSwgMCwgKFBBUk1fTUFYX05BTUVfTEVOICsgMSkpOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCgkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbih2YWx1ZSk7CgkJaWYgKHN0cmluZ19sZW5ndGggPiBQQVJNX01BWF9OQU1FX0xFTikgewoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiU1NJRCB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIpOwoJCQlzdHJpbmdfbGVuZ3RoID0gUEFSTV9NQVhfTkFNRV9MRU47CgkJfQoKCQltZW1jcHkobHAtPk5ldHdvcmtOYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCk7Cgl9CiNpZiAwCgllbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkRPV05MT0FEX0ZJUk1XQVJFLCB2YWx1ZTogJXNcbiIsIHZhbHVlKTsKCQltZW1zZXQobHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCAwLCAoTUFYX0xJTkVfU0laRSArIDEpKTsKCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCgkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbih2YWx1ZSk7CgkJaWYgKHN0cmluZ19sZW5ndGggPiBNQVhfTElORV9TSVpFKQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgbmFtZSB0b28gbG9uZzsgd2lsbCBiZSBpZ25vcmVkXG4iKTsKCQllbHNlCgkJCW1lbWNweShscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoKTsKCX0KI2VuZGlmCgllbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04pID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9FTkFCTEVfRU5DUllQVElPTikgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04pKQoJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJZWxzZQoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04pOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfRU5DUllQVElPTikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VOQ1JZUFRJT04sIHZhbHVlKTsKCgkJbWVtc2V0KGxwLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZihscC0+c3pFbmNyeXB0aW9uKSk7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKCQlpZiAoc3RyaW5nX2xlbmd0aCA+IHNpemVvZihscC0+c3pFbmNyeXB0aW9uKSkgewoJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTik7CgkJCXN0cmluZ19sZW5ndGggPSBzaXplb2YobHAtPnN6RW5jcnlwdGlvbik7CgkJfQoKCQltZW1jcHkobHAtPnN6RW5jcnlwdGlvbiwgdmFsdWUsIHN0cmluZ19sZW5ndGgpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfS0VZMSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTEsIHZhbHVlKTsKCgkJaWYgKGlzX3ZhbGlkX2tleV9zdHJpbmcodmFsdWUpKSB7CgkJCW1lbXNldChscC0+RGVmYXVsdEtleXMua2V5WzBdLmtleSwgMCwgTUFYX0tFWV9TSVpFKTsKCgkJCWtleV9zdHJpbmcya2V5KHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVswXSk7CgkJfSBlbHNlIHsKCQkJIERCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVkxKTsKCQl9Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9LRVkyKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMiwgdmFsdWUpOwoKCQlpZiAoaXNfdmFsaWRfa2V5X3N0cmluZyh2YWx1ZSkpIHsKCQkJbWVtc2V0KGxwLT5EZWZhdWx0S2V5cy5rZXlbMV0ua2V5LCAwLCBNQVhfS0VZX1NJWkUpOwoKCQkJa2V5X3N0cmluZzJrZXkodmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzFdKTsKCQl9IGVsc2UgewoJCQkgREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTIpOwoJCX0KCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0tFWTMpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVkzLCB2YWx1ZSk7CgoJCWlmIChpc192YWxpZF9rZXlfc3RyaW5nKHZhbHVlKSkgewoJCQltZW1zZXQobHAtPkRlZmF1bHRLZXlzLmtleVsyXS5rZXksIDAsIE1BWF9LRVlfU0laRSk7CgoJCQlrZXlfc3RyaW5nMmtleSh2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbMl0pOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZMyk7CgkJfQoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfS0VZNCkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTQsIHZhbHVlKTsKCgkJaWYgKGlzX3ZhbGlkX2tleV9zdHJpbmcodmFsdWUpKSB7CgkJCW1lbXNldChscC0+RGVmYXVsdEtleXMua2V5WzNdLmtleSwgMCwgTUFYX0tFWV9TSVpFKTsKCgkJCWtleV9zdHJpbmcya2V5KHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVszXSk7CgkJfSBlbHNlIHsKCQkJIERCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVk0KTsKCQl9Cgl9CgkvKiBOZXcgUGFyYW1ldGVycyBmb3IgV0FSUCAqLwoJZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0xPQURfQkFMQU5DSU5HKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcsIHZhbHVlKTsKCQlscC0+bG9hZEJhbGFuY2luZyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiwgdmFsdWUpOwoJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgdmFsdWUpOwoJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFKSA9PSAwKSB7CgkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSkpCgkJCWxwLT5NdWx0aWNhc3RSYXRlWzBdID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKHdsX2lzX2FfdmFsaWRfY2hhbih2YWx1ZV9jb252ZXJ0KSkgewoJCQlpZiAodmFsdWVfY29udmVydCA+IDE0KQoJCQkJdmFsdWVfY29udmVydCA9IHZhbHVlX2NvbnZlcnQgfCAweDEwMDsKCQkJbHAtPkNoYW5uZWwgPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCk7CgkJfQoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfT1dOX05BTUUpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSwgdmFsdWUpOwoKCQltZW1zZXQobHAtPlN0YXRpb25OYW1lLCAwLCAoUEFSTV9NQVhfTkFNRV9MRU4gKyAxKSk7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKCQlpZiAoc3RyaW5nX2xlbmd0aCA+IFBBUk1fTUFYX05BTUVfTEVOKSB7CgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSk7CgkJCXN0cmluZ19sZW5ndGggPSBQQVJNX01BWF9OQU1FX0xFTjsKCQl9CgoJCW1lbWNweShscC0+U3RhdGlvbk5hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCB2YWx1ZSk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQpKQoJCQlscC0+UlRTVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1NSU0NfMkdIWikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NSU0NfMkdIWiwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TUlNDKSB8fCAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TUlNDKSkKCQkJbHAtPnNyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1NSU0NfNUdIWikgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NSU0NfNUdIWiwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TUlNDKSB8fCAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TUlNDKSkKCQkJbHAtPnNyc2NbMV0gPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ181R0haKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSkpCgkJCWxwLT5EaXN0YW5jZUJldHdlZW5BUHMgPSB2YWx1ZV9jb252ZXJ0OwoJCWVsc2UKCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSk7Cgl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9LRVkpID09IDApIHsKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9LRVksIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfS0VZKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9LRVkpKQoJCQlscC0+VHJhbnNtaXRLZXlJRCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9LRVkpOwoJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUkFURSkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUsIHZhbHVlKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSkpCgkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFKTsKCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCkgPT0gMCkgewoJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCwgdmFsdWUpOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9QT1dfTEVWRUwpIHx8ICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1BPV19MRVZFTCkpCgkJCWxwLT50eFBvd0xldmVsID0gdmFsdWVfY29udmVydDsKCQllbHNlCgkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwpOwoJfQoKCS8qIE5lZWQgdG8gYWRkPyA6IENvdW50cnkgY29kZSwgU2hvcnQvTG9uZyByZXRyeSAqLwoKCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBTVEEgbW9kZSAqLwojaWYgMSAvKiA7PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCi8qIDs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQgKi8KCWlmIChDTlZfSU5UX1RPX0xJVFRMRShscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQpID09IENPTVBfSURfRldfU1RBKSB7CgkJCQkJLyogOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlICovCgkJaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9QT1JUX1RZUEUpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPT0gUEFSTV9NSU5fUE9SVF9UWVBFKSB8fCAodmFsdWVfY29udmVydCA9PSBQQVJNX01BWF9QT1JUX1RZUEUpKQoJCQkJbHAtPlBvcnRUeXBlID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BPUlRfVFlQRSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUE1fRU5BQkxFRCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9FTkFCTEVELCB2YWx1ZSk7CgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkvKiA7PyBob3cgYWJvdXQgd2xfbWFpbi5jIGNvbnRhaW5pbmcKCSAqIFZBTElEX1BBUkFNKFBBUk1fUE1fRU5BQkxFRCA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCB8fAoJICoJCQkJCSAoUEFSTV9QTV9FTkFCTEVEICYgMHg3RkZGKSA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCk7CgkgKi8KCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ICYgMHg3RkZGKSA8PSBQQVJNX01BWF9QTV9FTkFCTEVEKSB7CgkJCQlscC0+UE1FbmFibGVkID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QTV9FTkFCTEVEKTsKCQkJCS8qIDs/dGhpcyBpcyBhIGRhdGEgZW50cnkgZXJyb3IsIGhlbmNlIG5vdCBhIERCR19XQVJOSU5HICovCgkJCX0KCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9DUkVBVEVfSUJTUykgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DUkVBVEVfSUJTUywgdmFsdWUpOwoJCQlscC0+Q3JlYXRlSUJTUyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1JYKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCwgdmFsdWUpOwoJCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTUFYX1NMRUVQKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IDApICYmICh2YWx1ZV9jb252ZXJ0IDw9IDY1NTM1KSkKCQkJCWxwLT5NYXhTbGVlcER1cmF0aW9uID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTkVUV09SS19BRERSKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX05FVFdPUktfQUREUiwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT5NQUNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX05FVFdPUktfQUREUik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04pID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04sIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9BVVRIRU5USUNBVElPTikgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSEVOVElDQVRJT04pKQoJCQkJbHAtPmF1dGhlbnRpY2F0aW9uID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0FUSU1fV0lORE9XKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cpKQoJCQkJbHAtPmF0aW1XaW5kb3cgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTikgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1BNX0hPTERPVkVSX0RVUkFUSU9OKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9QTV9IT0xET1ZFUl9EVVJBVElPTikpCgkJCQlscC0+aG9sZG92ZXJEdXJhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFLCB2YWx1ZSk7CgkJCWxwLT5wcm9taXNjdW91c01vZGUgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9DT05ORUNUSU9OX0NPTlRST0wpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0NPTk5FQ1RJT05fQ09OVFJPTCkpCgkJCQlscC0+Y29ubmVjdGlvbkNvbnRyb2wgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MKTsKCQl9CgoJCS8qIE5lZWQgdG8gYWRkPyA6IFByb2JlIERhdGEgUmF0ZSAqLwoJfQojZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KCgkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gQVAgbW9kZSAqLwojaWYgMSAvKiA7PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KCQkvKiA7P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50ICovCglpZiAoQ05WX0lOVF9UT19MSVRUTEUobHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkKSA9PSBDT01QX0lEX0ZXX0FQKSB7CgkJaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9ELCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fRFRJTV9QRVJJT0QpCgkJCQlscC0+RFRJTVBlcmlvZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JFSkVDVF9BTlkpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgdmFsdWUpOwoJCQlscC0+UmVqZWN0QW55ID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVEKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsIHZhbHVlKTsKCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORykgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCB2YWx1ZSk7CgkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksIHZhbHVlKTsKCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fQkVBQ09OX0lOVEVSVkFMKQoJCQkJbHAtPm93bkJlYWNvbkludGVydmFsID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9DT0VYSVNURU5DRSkKCQkJCWxwLT5jb2V4aXN0ZW5jZSA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT0VYSVNURU5DRSk7CgkJfQoKI2lmZGVmIFVTRV9XRFMKCQllbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEKSkKCQkJCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpCgkJCQlscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMykgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMywgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQpKQoJCQkJbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMyk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEKSkKCQkJCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpCgkJCQlscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENikgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQpKQoJCQkJbHAtPndkc19wb3J0WzVdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUkFURTEpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTEsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFKSkKCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUxKTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9SQVRFMikgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMiwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUpKQoJCQkJbHAtPndkc19wb3J0WzFdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTIpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX1JBVEUzKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUzLCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSkpCgkJCQlscC0+d2RzX3BvcnRbMl0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMyk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfVFhfUkFURTQpID09IDApIHsKCQkJREJHX1RSQUNFKERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTQsIHZhbHVlKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgodmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFKSAmJiAodmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFKSkKCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU0KTsKCQl9IGVsc2UgaWYgKHN0cmNtcChrZXksIFBBUk1fTkFNRV9UWF9SQVRFNSkgPT0gMCkgewoJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSwgdmFsdWUpOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCh2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUpICYmICh2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUpKQoJCQkJbHAtPndkc19wb3J0WzRdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OwoJCQllbHNlCgkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTUpOwoJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgUEFSTV9OQU1FX1RYX1JBVEU2KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU2LCB2YWx1ZSk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSkgJiYgKHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSkpCgkJCQlscC0+d2RzX3BvcnRbNV0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CgkJCWVsc2UKCQkJCURCR19XQVJOSU5HKERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MxKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MyKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMik7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1MzKSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMywgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMyk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M0KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M1KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSk7CgkJfSBlbHNlIGlmIChzdHJjbXAoa2V5LCBQQVJNX05BTUVfV0RTX0FERFJFU1M2KSA9PSAwKSB7CgkJCURCR19UUkFDRShEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiwgdmFsdWUpOwoKCQkJaWYgKHBhcnNlX21hY19hZGRyZXNzKHZhbHVlLCBtYWNfdmFsdWUpID09IEVUSF9BTEVOKQoJCQkJbWVtY3B5KGxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOKTsKCQkJZWxzZQoJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNik7CgkJfQojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCX0KI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KCglyZXR1cm47Cn0gLyogdHJhbnNsYXRlX29wdGlvbiAqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcGFyc2VfbWFjX2FkZHJlc3MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHBhcnNlIGEgbWFjIGFkZHJlc3Mgc3RyaW5nIGFuZCBjb252ZXJ0IGl0IHRvIGEgYnl0ZQogKiAgIGFycmF5LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB2YWx1ZSAgICAgICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcKICogICAgICBieXRlX2FycmF5ICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBieXRlIGFycmF5IG9mIGxlbmd0aAogKiAgICAgICAgICAgICAgICAgICAgRVRIX0FMRU4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmluYWwgTUFDIGFkZHJlc3MsIHNob3VsZCBlcXVhbCB0byBFVEhfQUxFTi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHBhcnNlX21hY19hZGRyZXNzKGNoYXIgKnZhbHVlLCB1X2NoYXIgKmJ5dGVfYXJyYXkpCnsKCWludCAgICAgdmFsdWVfb2Zmc2V0ID0gMDsKCWludCAgICAgYXJyYXlfb2Zmc2V0ID0gMDsKCWludCAgICAgZmllbGRfb2Zmc2V0ID0gMDsKCWNoYXIgICAgYnl0ZV9maWVsZFszXTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgltZW1zZXQoYnl0ZV9maWVsZCwgJ1wwJywgMyk7CgoJd2hpbGUgKHZhbHVlW3ZhbHVlX29mZnNldF0gIT0gJ1wwJykgewoJCS8qIFNraXAgb3ZlciB0aGUgY29sb24gY2hhcnMgc2VwZXJhdGluZyB0aGUgYnl0ZXMsIGlmIHRoZXkgZXhpc3QgKi8KCQlpZiAodmFsdWVbdmFsdWVfb2Zmc2V0XSA9PSAnOicpIHsKCQkJdmFsdWVfb2Zmc2V0Kys7CgkJCWNvbnRpbnVlOwoJCX0KCgkJYnl0ZV9maWVsZFtmaWVsZF9vZmZzZXRdID0gdmFsdWVbdmFsdWVfb2Zmc2V0XTsKCQlmaWVsZF9vZmZzZXQrKzsKCQl2YWx1ZV9vZmZzZXQrKzsKCgkJLyogT25jZSB0aGUgYnl0ZV9maWVsZCBpcyBmaWxsZWQsIGNvbnZlcnQgaXQgYW5kIHN0b3JlIGl0ICovCgkJaWYgKGZpZWxkX29mZnNldCA9PSAyKSB7CgkJCWJ5dGVfZmllbGRbZmllbGRfb2Zmc2V0XSA9ICdcMCc7CgkJCWJ5dGVfYXJyYXlbYXJyYXlfb2Zmc2V0XSA9IHNpbXBsZV9zdHJ0b3VsKGJ5dGVfZmllbGQsIE5VTEwsIDE2KTsKCQkJZmllbGRfb2Zmc2V0ID0gMDsKCQkJYXJyYXlfb2Zmc2V0Kys7CgkJfQoJfQoKCS8qIFVzZSB0aGUgYXJyYXlfb2Zmc2V0IGFzIGEgY2hlY2s7IDYgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlCgkgICBieXRlX2FycmF5ICovCglyZXR1cm4gYXJyYXlfb2Zmc2V0Owp9IC8qIHBhcnNlX21hY19hZGRyZXNzICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglQYXJzZUNvbmZpZ0xpbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUGFyc2VzIGEgbGluZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaW50byBhbiBMLXZhbCBhbmQgYW4gUi12YWwsCiAqICByZXByZXNlbnRpbmcgYSBrZXkvdmFsdWUgcGFpci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcHN6TGluZSAgICAgLSB0aGUgbGluZSBmcm9tIHRoZSBjb25maWcgZmlsZSB0byBwYXJzZQogKiAgICAgIHBwc3pMVmFsICAgIC0gdGhlIHJlc3VsdGluZyBMLXZhbCAoS2V5KQogKiAgICAgIHBwc3pSVmFsICAgIC0gdGhlIHJlc3VsdGluZyBSLXZhbCAoVmFsdWUpCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIFBhcnNlQ29uZmlnTGluZShjaGFyICpwc3pMaW5lLCBjaGFyICoqcHBzekxWYWwsIGNoYXIgKipwcHN6UlZhbCkKewoJaW50IGk7CglpbnQgc2l6ZTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCglEQkdfRlVOQygiUGFyc2VDb25maWdMaW5lIik7CglEQkdfRU5URVIoRGJnSW5mbyk7CgoJLyogZ2V0IGEgc25hcHNob3Qgb2Ygb3VyIHN0cmluZyBzaXplICovCglzaXplICAgICAgPSBzdHJsZW4ocHN6TGluZSk7CgkqcHBzekxWYWwgPSBOVUxMOwoJKnBwc3pSVmFsID0gTlVMTDsKCglpZiAocHN6TGluZVswXSAhPSAnIycgJiYJCQkJCQkJLyogc2tpcCB0aGUgbGluZSBpZiBpdCBpcyBhIGNvbW1lbnQgKi8KCQkgcHN6TGluZVswXSAhPSAnXG4nICYmCQkJCQkJCS8qIGlmIGl0J3MgYW4gZW1wdHkgVU5JWCBsaW5lLCBkbyBub3RoaW5nICovCgkJICEocHN6TGluZVswXSA9PSAnXHInICYmIHBzekxpbmVbMV0gPT0gJ1xuJykJLyogaWYgaXQncyBhbiBlbXB0eSBNUy1ET1MgbGluZSwgZG8gbm90aGluZyAqLwoJICAgKSB7CgkJLyogYWR2YW5jZSBwYXN0IGFueSB3aGl0ZXNwYWNlLCBhbmQgYXNzaWduIHRoZSBMLXZhbHVlICovCgkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlpZiAocHN6TGluZVtpXSAhPSAnICcpIHsKCQkJCSpwcHN6TFZhbCA9ICZwc3pMaW5lW2ldOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJLyogYWR2YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBsLXZhbHVlKi8KCQlmb3IgKGkrKzsgaSA8IHNpemU7IGkrKykgewoJCQlpZiAocHN6TGluZVtpXSA9PSAnICcgfHwgcHN6TGluZVtpXSA9PSAnPScpIHsKCQkJCXBzekxpbmVbaV0gPSAnXDAnOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJLyogbWFrZSBhbnkgd2hpdGVzcGFjZSBhbmQgdGhlIGVxdWFsIHNpZ24gYSBOVUxMIGNoYXJhY3RlciwgYW5kCgkJICAgYWR2YW5jZSB0byB0aGUgUi1WYWx1ZSAqLwoJCWZvciAoaSsrOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChwc3pMaW5lW2ldID09ICcgJyB8fCBwc3pMaW5lW2ldID09ICc9JykgewoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCQljb250aW51ZTsKCQkJfQoJCQkqcHBzelJWYWwgPSAmcHN6TGluZVtpXTsKCQkJYnJlYWs7CgkJfQoJCS8qIG1ha2UgdGhlIGxpbmUgZW5kaW5nIGNoYXJhY3RlcihzKSBhIE5VTEwgKi8KCQlmb3IgKGkrKzsgaSA8IHNpemU7IGkrKykgewoJCQlpZiAocHN6TGluZVtpXSA9PSAnXG4nKQoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCWlmICgocHN6TGluZVtpXSA9PSAnXHInKSAmJiAocHN6TGluZVtpKzFdID09ICdcbicpKQoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJfQoJfQoJREJHX0xFQVZFKERiZ0luZm8pOwp9IC8qIFBhcnNlQ29uZmlnTGluZSAqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLwo=