LyoKICoJVmlkZW8gZm9yIExpbnV4IFR3bwogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCVRoaXMgZmlsZSByZXBsYWNlcyB0aGUgdmlkZW9kZXYuYyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUKICoJcmVndWxhciBrZXJuZWwgZGlzdHJpYnV0aW9uLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KICoJCWJhc2VkIG9uIGNvZGUgYnkgQWxhbiBDb3gsIDxhbGFuQGN5bXJ1Lm5ldD4KICoKICovCgovKgogKiBWaWRlbyBjYXB0dXJlIGludGVyZmFjZSBmb3IgTGludXgKICoKICoJQSBnZW5lcmljIHZpZGVvIGRldmljZSBpbnRlcmZhY2UgZm9yIHRoZSBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtCiAqCXVzaW5nIGEgc2V0IG9mIGRldmljZSBzdHJ1Y3R1cmVzL3ZlY3RvcnMgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zLgogKgogKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogQXV0aG9yOglBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KICoKICogRml4ZXM6CiAqLwoKLyoKICogVmlkZW80bGludXggMS8yIGludGVncmF0aW9uIGJ5IEp1c3RpbiBTY2hvZW1hbgogKiA8anVzdGluQHN1bnRpZ2VyLmVlLnVwLmFjLnphPgogKiAyLjQgUFJPQ0ZTIHN1cHBvcnQgcG9ydGVkIGZyb20gMi40IGtlcm5lbHMgYnkKICogIEnxYWtpIEdhcmPtYSBFdHhlYmFycmlhIDxnYXJldHhlQGV1c2thbG5ldC5uZXQ+CiAqIE1ha2VmaWxlIGZpeCBieSAiVy4gTWljaGFlbCBQZXR1bGxvIiA8bWlrZUBmbHluLm9yZz4KICogMi40IGRldmZzIHN1cHBvcnQgcG9ydGVkIGZyb20gMi40IGtlcm5lbHMgYnkKICogIERhbiBNZXJpbGxhdCA8ZGFuQG1lcmlsbGF0Lm9yZz4KICogQWRkZWQgR2VyZCBLbm9ycnMgdjRsMSBlbmhhbmNlbWVudHMgKEp1c3RpbiBTY2hvZW1hbikKICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiNkZWZpbmUgX19PTERfVklESU9DXyAvKiBUbyBhbGxvdyBmaXhpbmcgb2xkIGNhbGxzKi8KI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CgojaWZkZWYgQ09ORklHX0tNT0QKI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfVVNUKSB8fCBkZWZpbmVkKENPTkZJR19VU1RfTU9EVUxFKQojaW5jbHVkZSA8bGludXgvdXN0Lmg+CiNlbmRpZgoKCiNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgoKTU9EVUxFX0FVVEhPUigiQmlsbCBEaXJrcywgSnVzdGluIFNjaG9lbWFuLCBHZXJkIEtub3JyIik7Ck1PRFVMRV9ERVNDUklQVElPTigibWlzYyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2NGwyIGRldmljZSBkcml2ZXJzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCi8qCiAqCiAqCVYgNCBMIDIgICBEIFIgSSBWIEUgUiAgIEggRSBMIFAgRSBSICAgQSBQIEkKICoKICovCgovKgogKiAgVmlkZW8gU3RhbmRhcmQgT3BlcmF0aW9ucyAoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBTY2hpbWVrKQogKi8KCgovKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgYSB2NGwyX3N0YW5kYXJkIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gdGhlCiAgICdpZCcgYW5kICd0cmFuc21pc3Npb24nIHBhcmFtZXRlcnMuICBSZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLiAgKi8KaW50IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMsCgkJCSAgICAgaW50IGlkLCBjaGFyICpuYW1lKQp7Cgl1MzIgaW5kZXggPSB2cy0+aW5kZXg7CgoJbWVtc2V0KHZzLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKTsKCXZzLT5pbmRleCA9IGluZGV4OwoJdnMtPmlkICAgID0gaWQ7CglpZiAoaWQgJiBWNEwyX1NURF81MjVfNjApIHsKCQl2cy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTAwMTsKCQl2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAzMDAwMDsKCQl2cy0+ZnJhbWVsaW5lcyA9IDUyNTsKCX0gZWxzZSB7CgkJdnMtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CgkJdnMtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CgkJdnMtPmZyYW1lbGluZXMgPSA2MjU7Cgl9CglzdHJsY3B5KHZzLT5uYW1lLG5hbWUsc2l6ZW9mKHZzLT5uYW1lKSk7CglyZXR1cm4gMDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogcHJpb3JpdHkgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiNkZWZpbmUgVjRMMl9QUklPX1ZBTElEKHZhbCkgKHZhbCA9PSBWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQgICB8fCBcCgkJCSAgICAgIHZhbCA9PSBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFICB8fCBcCgkJCSAgICAgIHZhbCA9PSBWNEwyX1BSSU9SSVRZX1JFQ09SRCkKCmludCB2NGwyX3ByaW9faW5pdChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpCnsKCW1lbXNldChnbG9iYWwsMCxzaXplb2YoKmdsb2JhbCkpOwoJcmV0dXJuIDA7Cn0KCmludCB2NGwyX3ByaW9fY2hhbmdlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCwKCQkgICAgIGVudW0gdjRsMl9wcmlvcml0eSBuZXcpCnsKCWlmICghVjRMMl9QUklPX1ZBTElEKG5ldykpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoKmxvY2FsID09IG5ldykKCQlyZXR1cm4gMDsKCglhdG9taWNfaW5jKCZnbG9iYWwtPnByaW9zW25ld10pOwoJaWYgKFY0TDJfUFJJT19WQUxJRCgqbG9jYWwpKQoJCWF0b21pY19kZWMoJmdsb2JhbC0+cHJpb3NbKmxvY2FsXSk7CgkqbG9jYWwgPSBuZXc7CglyZXR1cm4gMDsKfQoKaW50IHY0bDJfcHJpb19vcGVuKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCkKewoJcmV0dXJuIHY0bDJfcHJpb19jaGFuZ2UoZ2xvYmFsLGxvY2FsLFY0TDJfUFJJT1JJVFlfREVGQVVMVCk7Cn0KCmludCB2NGwyX3ByaW9fY2xvc2Uoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQp7CglpZiAoVjRMMl9QUklPX1ZBTElEKCpsb2NhbCkpCgkJYXRvbWljX2RlYygmZ2xvYmFsLT5wcmlvc1sqbG9jYWxdKTsKCXJldHVybiAwOwp9CgplbnVtIHY0bDJfcHJpb3JpdHkgdjRsMl9wcmlvX21heChzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwpCnsKCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsLT5wcmlvc1tWNEwyX1BSSU9SSVRZX1JFQ09SRF0pID4gMCkKCQlyZXR1cm4gVjRMMl9QUklPUklUWV9SRUNPUkQ7CglpZiAoYXRvbWljX3JlYWQoJmdsb2JhbC0+cHJpb3NbVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRV0pID4gMCkKCQlyZXR1cm4gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRTsKCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsLT5wcmlvc1tWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkRdKSA+IDApCgkJcmV0dXJuIFY0TDJfUFJJT1JJVFlfQkFDS0dST1VORDsKCXJldHVybiBWNEwyX1BSSU9SSVRZX1VOU0VUOwp9CgppbnQgdjRsMl9wcmlvX2NoZWNrKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCkKewoJaWYgKCpsb2NhbCA8IHY0bDJfcHJpb19tYXgoZ2xvYmFsKSkKCQlyZXR1cm4gLUVCVVNZOwoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIGFycmF5cyBmb3IgcHJldHR5LXByaW50aW5nIGRlYnVnIG1lc3NhZ2VzIG9mIGVudW0gdHlwZXMgICAgICAqLwoKY2hhciAqdjRsMl9maWVsZF9uYW1lc1tdID0gewoJW1Y0TDJfRklFTERfQU5ZXSAgICAgICAgPSAiYW55IiwKCVtWNEwyX0ZJRUxEX05PTkVdICAgICAgID0gIm5vbmUiLAoJW1Y0TDJfRklFTERfVE9QXSAgICAgICAgPSAidG9wIiwKCVtWNEwyX0ZJRUxEX0JPVFRPTV0gICAgID0gImJvdHRvbSIsCglbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEXSA9ICJpbnRlcmxhY2VkIiwKCVtWNEwyX0ZJRUxEX1NFUV9UQl0gICAgID0gInNlcS10YiIsCglbVjRMMl9GSUVMRF9TRVFfQlRdICAgICA9ICJzZXEtYnQiLAoJW1Y0TDJfRklFTERfQUxURVJOQVRFXSAgPSAiYWx0ZXJuYXRlIiwKfTsKCmNoYXIgKnY0bDJfdHlwZV9uYW1lc1tdID0gewoJW1Y0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV0gPSAidmlkZW8tY2FwIiwKCVtWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVldID0gInZpZGVvLW92ZXIiLAoJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUXSAgPSAidmlkZW8tb3V0IiwKCVtWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFXSAgID0gInZiaS1jYXAiLAoJW1Y0TDJfQlVGX1RZUEVfVkJJX09VVFBVVF0gICAgPSAidmJpLW91dCIsCn07CgpzdGF0aWMgY2hhciAqdjRsMl9tZW1vcnlfbmFtZXNbXSA9IHsKCVtWNEwyX01FTU9SWV9NTUFQXSAgICA9ICJtbWFwIiwKCVtWNEwyX01FTU9SWV9VU0VSUFRSXSA9ICJ1c2VycHRyIiwKCVtWNEwyX01FTU9SWV9PVkVSTEFZXSA9ICJvdmVybGF5IiwKfTsKCiNkZWZpbmUgcHJ0X25hbWVzKGEsYXJyKSAoKChhKT49MCkmJigoYSk8QVJSQVlfU0laRShhcnIpKSk/YXJyW2FdOiJ1bmtub3duIgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGRlYnVnIGhlbHAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVApzdGF0aWMgY29uc3QgY2hhciAqdjRsMV9pb2N0bHNbXSA9IHsKCVtfSU9DX05SKFZJRElPQ0dDQVApXSAgICAgICA9ICJWSURJT0NHQ0FQIiwKCVtfSU9DX05SKFZJRElPQ0dDSEFOKV0gICAgICA9ICJWSURJT0NHQ0hBTiIsCglbX0lPQ19OUihWSURJT0NTQ0hBTildICAgICAgPSAiVklESU9DU0NIQU4iLAoJW19JT0NfTlIoVklESU9DR1RVTkVSKV0gICAgID0gIlZJRElPQ0dUVU5FUiIsCglbX0lPQ19OUihWSURJT0NTVFVORVIpXSAgICAgPSAiVklESU9DU1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ0dQSUNUKV0gICAgICA9ICJWSURJT0NHUElDVCIsCglbX0lPQ19OUihWSURJT0NTUElDVCldICAgICAgPSAiVklESU9DU1BJQ1QiLAoJW19JT0NfTlIoVklESU9DQ0FQVFVSRSldICAgID0gIlZJRElPQ0NBUFRVUkUiLAoJW19JT0NfTlIoVklESU9DR1dJTildICAgICAgID0gIlZJRElPQ0dXSU4iLAoJW19JT0NfTlIoVklESU9DU1dJTildICAgICAgID0gIlZJRElPQ1NXSU4iLAoJW19JT0NfTlIoVklESU9DR0ZCVUYpXSAgICAgID0gIlZJRElPQ0dGQlVGIiwKCVtfSU9DX05SKFZJRElPQ1NGQlVGKV0gICAgICA9ICJWSURJT0NTRkJVRiIsCglbX0lPQ19OUihWSURJT0NLRVkpXSAgICAgICAgPSAiVklESU9DS0VZIiwKCVtfSU9DX05SKFZJRElPQ0dGUkVRKV0gICAgICA9ICJWSURJT0NHRlJFUSIsCglbX0lPQ19OUihWSURJT0NTRlJFUSldICAgICAgPSAiVklESU9DU0ZSRVEiLAoJW19JT0NfTlIoVklESU9DR0FVRElPKV0gICAgID0gIlZJRElPQ0dBVURJTyIsCglbX0lPQ19OUihWSURJT0NTQVVESU8pXSAgICAgPSAiVklESU9DU0FVRElPIiwKCVtfSU9DX05SKFZJRElPQ1NZTkMpXSAgICAgICA9ICJWSURJT0NTWU5DIiwKCVtfSU9DX05SKFZJRElPQ01DQVBUVVJFKV0gICA9ICJWSURJT0NNQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NHTUJVRildICAgICAgPSAiVklESU9DR01CVUYiLAoJW19JT0NfTlIoVklESU9DR1VOSVQpXSAgICAgID0gIlZJRElPQ0dVTklUIiwKCVtfSU9DX05SKFZJRElPQ0dDQVBUVVJFKV0gICA9ICJWSURJT0NHQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NTQ0FQVFVSRSldICAgPSAiVklESU9DU0NBUFRVUkUiLAoJW19JT0NfTlIoVklESU9DU1BMQVlNT0RFKV0gID0gIlZJRElPQ1NQTEFZTU9ERSIsCglbX0lPQ19OUihWSURJT0NTV1JJVEVNT0RFKV0gPSAiVklESU9DU1dSSVRFTU9ERSIsCglbX0lPQ19OUihWSURJT0NHUExBWUlORk8pXSAgPSAiVklESU9DR1BMQVlJTkZPIiwKCVtfSU9DX05SKFZJRElPQ1NNSUNST0NPREUpXSA9ICJWSURJT0NTTUlDUk9DT0RFIiwKCVtfSU9DX05SKFZJRElPQ0dWQklGTVQpXSAgICA9ICJWSURJT0NHVkJJRk1UIiwKCVtfSU9DX05SKFZJRElPQ1NWQklGTVQpXSAgICA9ICJWSURJT0NTVkJJRk1UIgp9OwojZGVmaW5lIFY0TDFfSU9DVExTIEFSUkFZX1NJWkUodjRsMV9pb2N0bHMpCiNlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIgKnY0bDJfaW9jdGxzW10gPSB7CglbX0lPQ19OUihWSURJT0NfUVVFUllDQVApXSAgICAgICAgID0gIlZJRElPQ19RVUVSWUNBUCIsCglbX0lPQ19OUihWSURJT0NfUkVTRVJWRUQpXSAgICAgICAgID0gIlZJRElPQ19SRVNFUlZFRCIsCglbX0lPQ19OUihWSURJT0NfRU5VTV9GTVQpXSAgICAgICAgID0gIlZJRElPQ19FTlVNX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfR19GTVQpXSAgICAgICAgICAgID0gIlZJRElPQ19HX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfU19GTVQpXSAgICAgICAgICAgID0gIlZJRElPQ19TX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfR19NUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19HX01QRUdDT01QIiwKCVtfSU9DX05SKFZJRElPQ19TX01QRUdDT01QKV0gICAgICAgPSAiVklESU9DX1NfTVBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1JFUUJVRlMpXSAgICAgICAgICA9ICJWSURJT0NfUkVRQlVGUyIsCglbX0lPQ19OUihWSURJT0NfUVVFUllCVUYpXSAgICAgICAgID0gIlZJRElPQ19RVUVSWUJVRiIsCglbX0lPQ19OUihWSURJT0NfR19GQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19HX0ZCVUYiLAoJW19JT0NfTlIoVklESU9DX1NfRkJVRildICAgICAgICAgICA9ICJWSURJT0NfU19GQlVGIiwKCVtfSU9DX05SKFZJRElPQ19PVkVSTEFZKV0gICAgICAgICAgPSAiVklESU9DX09WRVJMQVkiLAoJW19JT0NfTlIoVklESU9DX1FCVUYpXSAgICAgICAgICAgICA9ICJWSURJT0NfUUJVRiIsCglbX0lPQ19OUihWSURJT0NfRFFCVUYpXSAgICAgICAgICAgID0gIlZJRElPQ19EUUJVRiIsCglbX0lPQ19OUihWSURJT0NfU1RSRUFNT04pXSAgICAgICAgID0gIlZJRElPQ19TVFJFQU1PTiIsCglbX0lPQ19OUihWSURJT0NfU1RSRUFNT0ZGKV0gICAgICAgID0gIlZJRElPQ19TVFJFQU1PRkYiLAoJW19JT0NfTlIoVklESU9DX0dfUEFSTSldICAgICAgICAgICA9ICJWSURJT0NfR19QQVJNIiwKCVtfSU9DX05SKFZJRElPQ19TX1BBUk0pXSAgICAgICAgICAgPSAiVklESU9DX1NfUEFSTSIsCglbX0lPQ19OUihWSURJT0NfR19TVEQpXSAgICAgICAgICAgID0gIlZJRElPQ19HX1NURCIsCglbX0lPQ19OUihWSURJT0NfU19TVEQpXSAgICAgICAgICAgID0gIlZJRElPQ19TX1NURCIsCglbX0lPQ19OUihWSURJT0NfRU5VTVNURCldICAgICAgICAgID0gIlZJRElPQ19FTlVNU1REIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNSU5QVVQpXSAgICAgICAgPSAiVklESU9DX0VOVU1JTlBVVCIsCglbX0lPQ19OUihWSURJT0NfR19DVFJMKV0gICAgICAgICAgID0gIlZJRElPQ19HX0NUUkwiLAoJW19JT0NfTlIoVklESU9DX1NfQ1RSTCldICAgICAgICAgICA9ICJWSURJT0NfU19DVFJMIiwKCVtfSU9DX05SKFZJRElPQ19HX1RVTkVSKV0gICAgICAgICAgPSAiVklESU9DX0dfVFVORVIiLAoJW19JT0NfTlIoVklESU9DX1NfVFVORVIpXSAgICAgICAgICA9ICJWSURJT0NfU19UVU5FUiIsCglbX0lPQ19OUihWSURJT0NfR19BVURJTyldICAgICAgICAgID0gIlZJRElPQ19HX0FVRElPIiwKCVtfSU9DX05SKFZJRElPQ19TX0FVRElPKV0gICAgICAgICAgPSAiVklESU9DX1NfQVVESU8iLAoJW19JT0NfTlIoVklESU9DX1FVRVJZQ1RSTCldICAgICAgICA9ICJWSURJT0NfUVVFUllDVFJMIiwKCVtfSU9DX05SKFZJRElPQ19RVUVSWU1FTlUpXSAgICAgICAgPSAiVklESU9DX1FVRVJZTUVOVSIsCglbX0lPQ19OUihWSURJT0NfR19JTlBVVCldICAgICAgICAgID0gIlZJRElPQ19HX0lOUFVUIiwKCVtfSU9DX05SKFZJRElPQ19TX0lOUFVUKV0gICAgICAgICAgPSAiVklESU9DX1NfSU5QVVQiLAoJW19JT0NfTlIoVklESU9DX0dfT1VUUFVUKV0gICAgICAgICA9ICJWSURJT0NfR19PVVRQVVQiLAoJW19JT0NfTlIoVklESU9DX1NfT1VUUFVUKV0gICAgICAgICA9ICJWSURJT0NfU19PVVRQVVQiLAoJW19JT0NfTlIoVklESU9DX0VOVU1PVVRQVVQpXSAgICAgICA9ICJWSURJT0NfRU5VTU9VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfR19BVURPVVQpXSAgICAgICAgID0gIlZJRElPQ19HX0FVRE9VVCIsCglbX0lPQ19OUihWSURJT0NfU19BVURPVVQpXSAgICAgICAgID0gIlZJRElPQ19TX0FVRE9VVCIsCglbX0lPQ19OUihWSURJT0NfR19NT0RVTEFUT1IpXSAgICAgID0gIlZJRElPQ19HX01PRFVMQVRPUiIsCglbX0lPQ19OUihWSURJT0NfU19NT0RVTEFUT1IpXSAgICAgID0gIlZJRElPQ19TX01PRFVMQVRPUiIsCglbX0lPQ19OUihWSURJT0NfR19GUkVRVUVOQ1kpXSAgICAgID0gIlZJRElPQ19HX0ZSRVFVRU5DWSIsCglbX0lPQ19OUihWSURJT0NfU19GUkVRVUVOQ1kpXSAgICAgID0gIlZJRElPQ19TX0ZSRVFVRU5DWSIsCglbX0lPQ19OUihWSURJT0NfQ1JPUENBUCldICAgICAgICAgID0gIlZJRElPQ19DUk9QQ0FQIiwKCVtfSU9DX05SKFZJRElPQ19HX0NST1ApXSAgICAgICAgICAgPSAiVklESU9DX0dfQ1JPUCIsCglbX0lPQ19OUihWSURJT0NfU19DUk9QKV0gICAgICAgICAgID0gIlZJRElPQ19TX0NST1AiLAoJW19JT0NfTlIoVklESU9DX0dfSlBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfR19KUEVHQ09NUCIsCglbX0lPQ19OUihWSURJT0NfU19KUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19TX0pQRUdDT01QIiwKCVtfSU9DX05SKFZJRElPQ19RVUVSWVNURCldICAgICAgICAgPSAiVklESU9DX1FVRVJZU1REIiwKCVtfSU9DX05SKFZJRElPQ19UUllfRk1UKV0gICAgICAgICAgPSAiVklESU9DX1RSWV9GTVQiLAoJW19JT0NfTlIoVklESU9DX0VOVU1BVURJTyldICAgICAgICA9ICJWSURJT0NfRU5VTUFVRElPIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNQVVET1VUKV0gICAgICAgPSAiVklESU9DX0VOVU1BVURPVVQiLAoJW19JT0NfTlIoVklESU9DX0dfUFJJT1JJVFkpXSAgICAgICA9ICJWSURJT0NfR19QUklPUklUWSIsCglbX0lPQ19OUihWSURJT0NfU19QUklPUklUWSldICAgICAgID0gIlZJRElPQ19TX1BSSU9SSVRZIiwKI2lmIDEKCVtfSU9DX05SKFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQKV0gPSAiVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAiLAojZW5kaWYKCVtfSU9DX05SKFZJRElPQ19MT0dfU1RBVFVTKV0gICAgICAgPSAiVklESU9DX0xPR19TVEFUVVMiLAoJW19JT0NfTlIoVklESU9DX0dfRVhUX0NUUkxTKV0gICAgICA9ICJWSURJT0NfR19FWFRfQ1RSTFMiLAoJW19JT0NfTlIoVklESU9DX1NfRVhUX0NUUkxTKV0gICAgICA9ICJWSURJT0NfU19FWFRfQ1RSTFMiLAoJW19JT0NfTlIoVklESU9DX1RSWV9FWFRfQ1RSTFMpXSAgICA9ICJWSURJT0NfVFJZX0VYVF9DVFJMUyIKfTsKI2RlZmluZSBWNEwyX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQoKc3RhdGljIGNvbnN0IGNoYXIgKnY0bDJfaW50X2lvY3Rsc1tdID0gewojaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCglbX0lPQ19OUihERUNPREVSX0dFVF9DQVBBQklMSVRJRVMpXSAgICA9ICJERUNPREVSX0dFVF9DQVBBQklMSVRJRVMiLAoJW19JT0NfTlIoREVDT0RFUl9HRVRfU1RBVFVTKV0gICAgICAgICAgPSAiREVDT0RFUl9HRVRfU1RBVFVTIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX05PUk0pXSAgICAgICAgICAgID0gIkRFQ09ERVJfU0VUX05PUk0iLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfSU5QVVQpXSAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfSU5QVVQiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfT1VUUFVUKV0gICAgICAgICAgPSAiREVDT0RFUl9TRVRfT1VUUFVUIiwKCVtfSU9DX05SKERFQ09ERVJfRU5BQkxFX09VVFBVVCldICAgICAgID0gIkRFQ09ERVJfRU5BQkxFX09VVFBVVCIsCglbX0lPQ19OUihERUNPREVSX1NFVF9QSUNUVVJFKV0gICAgICAgICA9ICJERUNPREVSX1NFVF9QSUNUVVJFIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX0dQSU8pXSAgICAgICAgICAgID0gIkRFQ09ERVJfU0VUX0dQSU8iLAoJW19JT0NfTlIoREVDT0RFUl9JTklUKV0gICAgICAgICAgICAgICAgPSAiREVDT0RFUl9JTklUIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX1ZCSV9CWVBBU1MpXSAgICAgID0gIkRFQ09ERVJfU0VUX1ZCSV9CWVBBU1MiLAoJW19JT0NfTlIoREVDT0RFUl9EVU1QKV0gICAgICAgICAgICAgICAgPSAiREVDT0RFUl9EVU1QIiwKI2VuZGlmCglbX0lPQ19OUihBVURDX1NFVF9SQURJTyldICAgICAgICAgICAgICA9ICJBVURDX1NFVF9SQURJTyIsCgoJW19JT0NfTlIoVFVORVJfU0VUX1RZUEVfQUREUildICAgICAgICAgPSAiVFVORVJfU0VUX1RZUEVfQUREUiIsCglbX0lPQ19OUihUVU5FUl9TRVRfU1RBTkRCWSldICAgICAgICAgICA9ICJUVU5FUl9TRVRfU1RBTkRCWSIsCglbX0lPQ19OUihUREE5ODg3X1NFVF9DT05GSUcpXSAgICAgICAgICA9ICJUREE5ODg3X1NFVF9DT05GSUciLAoKCVtfSU9DX05SKFZJRElPQ19JTlRfU19UVU5FUl9NT0RFKV0gICAgID0gIlZJRElPQ19JTlRfU19UVU5FUl9NT0RFIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19SRUdJU1RFUildICAgICAgID0gIlZJRElPQ19JTlRfU19SRUdJU1RFUiIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfUkVHSVNURVIpXSAgICAgICA9ICJWSURJT0NfSU5UX0dfUkVHSVNURVIiLAoJW19JT0NfTlIoVklESU9DX0lOVF9SRVNFVCldICAgICAgICAgICAgPSAiVklESU9DX0lOVF9SRVNFVCIsCglbX0lPQ19OUihWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEpXSA9ICJWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUpXSAgPSAiVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUiLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX1ZCSV9EQVRBKV0gICAgICAgPSAiVklESU9DX0lOVF9TX1ZCSV9EQVRBIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19WQklfREFUQSldICAgICAgID0gIlZJRElPQ19JTlRfR19WQklfREFUQSIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfQ0hJUF9JREVOVCldICAgICA9ICJWSURJT0NfSU5UX0dfQ0hJUF9JREVOVCIsCglbX0lPQ19OUihWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRKV0gICA9ICJWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19TVEFOREJZKV0gICAgICAgID0gIlZJRElPQ19JTlRfU19TVEFOREJZIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEpXSAgID0gIlZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEiCn07CiNkZWZpbmUgVjRMMl9JTlRfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pbnRfaW9jdGxzKQoKc3RhdGljIHZvaWQgdjRsX3ByaW50X3BpeF9mbXQgKGNoYXIgKnMsIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmZtdCkKewoJcHJpbnRrICgiJXM6IHdpZHRoPSVkLCBoZWlnaHQ9JWQsIGZvcm1hdD0lZCwgZmllbGQ9JXMsICIKCQkiYnl0ZXNwZXJsaW5lPSVkIHNpemVpbWFnZT0lZCwgY29sb3JzcGFjZT0lZFxuIiwgcywKCQlmbXQtPndpZHRoLGZtdC0+aGVpZ2h0LGZtdC0+cGl4ZWxmb3JtYXQsCgkJcHJ0X25hbWVzKGZtdC0+ZmllbGQsdjRsMl9maWVsZF9uYW1lcyksCgkJZm10LT5ieXRlc3BlcmxpbmUsZm10LT5zaXplaW1hZ2UsZm10LT5jb2xvcnNwYWNlKTsKfTsKCi8qIENvbW1vbiBpb2N0bCBkZWJ1ZyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieQogICBleHRlcm5hbCBpb2N0bCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGludGVybmFsIFY0TCBpb2N0bCAqLwp2b2lkIHY0bF9wcmludGtfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKewoJY2hhciAqZGlyOwoKCXN3aXRjaCAoX0lPQ19ESVIoY21kKSkgewoJY2FzZSBfSU9DX05PTkU6ICAgICAgICAgICAgICBkaXIgPSAiLS0iOyBicmVhazsKCWNhc2UgX0lPQ19SRUFEOiAgICAgICAgICAgICAgZGlyID0gInItIjsgYnJlYWs7CgljYXNlIF9JT0NfV1JJVEU6ICAgICAgICAgICAgIGRpciA9ICItdyI7IGJyZWFrOwoJY2FzZSBfSU9DX1JFQUQgfCBfSU9DX1dSSVRFOiBkaXIgPSAicnciOyBicmVhazsKCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgZGlyID0gIipFUlIqIjsgYnJlYWs7Cgl9Cglzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CgljYXNlICdkJzoKCQlwcmludGsoInY0bDJfaW50IGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lOVF9JT0NUTFMpID8KCQkgICAgICAgdjRsMl9pbnRfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiVU5LTk9XTiIsIGRpciwgY21kKTsKCQlicmVhazsKI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAoJY2FzZSAndic6CgkJcHJpbnRrKCJ2NGwxIGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwxX0lPQ1RMUykgPwoJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CgkJYnJlYWs7CiNlbmRpZgoJY2FzZSAnVic6CgkJcHJpbnRrKCJ2NGwyIGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPwoJCSAgICAgICB2NGwyX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGsoInVua25vd24gaW9jdGwgJyVjJywgZGlyPSVzLCAjJWQgKDB4JTA4eClcbiIsCgkJICAgICAgIF9JT0NfVFlQRShjbWQpLCBkaXIsIF9JT0NfTlIoY21kKSwgY21kKTsKCX0KfQoKLyogQ29tbW9uIGlvY3RsIGRlYnVnIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5CiAgIGV4dGVybmFsIGlvY3RsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgaW50ZXJuYWwgVjRMIGlvY3RsIGFuZCBpdHMKICAgYXJndW1lbnRzICovCnZvaWQgdjRsX3ByaW50a19pb2N0bF9hcmcoY2hhciAqcyx1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCnsKCXByaW50ayhzKTsKCXByaW50aygiOiAiKTsKCXY0bF9wcmludGtfaW9jdGwoY21kKTsKCXN3aXRjaCAoY21kKSB7CgljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgoJewoJCWVudW0gdjRsMl9jaGlwX2lkZW50ICAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGNoaXAgaWRlbnQ9JWRcbiIsIHMsICpwKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfUFJJT1JJVFk6CgljYXNlIFZJRElPQ19TX1BSSU9SSVRZOgoJewoJCWVudW0gdjRsMl9wcmlvcml0eSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHByaW9yaXR5PSVkXG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19JTlRfU19UVU5FUl9NT0RFOgoJewoJCWVudW0gdjRsMl90dW5lcl90eXBlICpwPWFyZzsKCQlwcmludGsgKCIlczogdHVuZXIgdHlwZT0lZFxuIiwgcywgKnApOwoJCWJyZWFrOwoJfQojaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCgljYXNlIERFQ09ERVJfU0VUX1ZCSV9CWVBBU1M6CgljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKCWNhc2UgREVDT0RFUl9HRVRfU1RBVFVTOgoJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6CgljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgoJY2FzZSBERUNPREVSX1NFVF9HUElPOgoJY2FzZSBERUNPREVSX1NFVF9OT1JNOgoJY2FzZSBWSURJT0NDQVBUVVJFOgoJY2FzZSBWSURJT0NTWU5DOgoJY2FzZSBWSURJT0NTV1JJVEVNT0RFOgojZW5kaWYKCWNhc2UgVFVORVJfU0VUX1RZUEVfQUREUjoKCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CgljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKI2lmZGVmIF9fT0xEX1ZJRElPQ18KCWNhc2UgVklESU9DX09WRVJMQVlfT0xEOgojZW5kaWYKCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKCWNhc2UgVklESU9DX0dfT1VUUFVUOgoJY2FzZSBWSURJT0NfU19PVVRQVVQ6CgljYXNlIFZJRElPQ19TVFJFQU1PTjoKCWNhc2UgVklESU9DX0dfSU5QVVQ6CgljYXNlIFZJRElPQ19PVkVSTEFZOgoJY2FzZSBWSURJT0NfU19JTlBVVDoKCXsKCQlpbnQgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB2YWx1ZT0lZFxuIiwgcywgKnApOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19BVURJTzoKCWNhc2UgVklESU9DX1NfQVVESU86CgljYXNlIFZJRElPQ19FTlVNQVVESU86CiNpZmRlZiBfX09MRF9WSURJT0NfCgljYXNlIFZJRElPQ19HX0FVRElPX09MRDoKI2VuZGlmCgl7CgkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOwoKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsIG1vZGU9JWRcbiIsCgkJCXMscC0+aW5kZXgsIHAtPm5hbWUscC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0FVRE9VVDoKCWNhc2UgVklESU9DX1NfQVVET1VUOgoJY2FzZSBWSURJT0NfRU5VTUFVRE9VVDoKI2lmZGVmIF9fT0xEX1ZJRElPQ18KCWNhc2UgVklESU9DX0dfQVVET1VUX09MRDoKI2VuZGlmCgl7CgkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgbW9kZT0lZFxuIiwgcywKCQkJCXAtPmluZGV4LCBwLT5uYW1lLCBwLT5jYXBhYmlsaXR5LHAtPm1vZGUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfUUJVRjoKCWNhc2UgVklESU9DX0RRQlVGOgoJY2FzZSBWSURJT0NfUVVFUllCVUY6Cgl7CgkJc3RydWN0IHY0bDJfYnVmZmVyICpwPWFyZzsKCQlzdHJ1Y3QgdjRsMl90aW1lY29kZSAqdGM9JnAtPnRpbWVjb2RlOwoJCXByaW50ayAoIiVzOiAlMDJsZDolMDJkOiUwMmQuJTA4bGQgaW5kZXg9JWQsIHR5cGU9JXMsICIKCQkJImJ5dGVzdXNlZD0lZCwgZmxhZ3M9MHglMDh4LCAiCgkJCSJmaWVsZD0lMGQsIHNlcXVlbmNlPSVkLCBtZW1vcnk9JXMsIG9mZnNldC91c2VycHRyPTB4JTA4bHhcbiIsCgkJCQlzLAoJCQkJKHAtPnRpbWVzdGFtcC50dl9zZWMvMzYwMCksCgkJCQkoaW50KShwLT50aW1lc3RhbXAudHZfc2VjLzYwKSU2MCwKCQkJCShpbnQpKHAtPnRpbWVzdGFtcC50dl9zZWMlNjApLAoJCQkJcC0+dGltZXN0YW1wLnR2X3VzZWMsCgkJCQlwLT5pbmRleCwKCQkJCXBydF9uYW1lcyhwLT50eXBlLHY0bDJfdHlwZV9uYW1lcyksCgkJCQlwLT5ieXRlc3VzZWQscC0+ZmxhZ3MsCgkJCQlwLT5maWVsZCxwLT5zZXF1ZW5jZSwKCQkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpLAoJCQkJcC0+bS51c2VycHRyKTsKCQlwcmludGsgKCIlczogdGltZWNvZGU9ICUwMmQ6JTAyZDolMDJkIHR5cGU9JWQsICIKCQkJImZsYWdzPTB4JTA4eCwgZnJhbWVzPSVkLCB1c2VyYml0cz0weCUwOHhcbiIsCgkJCQlzLHRjLT5ob3Vycyx0Yy0+bWludXRlcyx0Yy0+c2Vjb25kcywKCQkJCXRjLT50eXBlLCB0Yy0+ZmxhZ3MsIHRjLT5mcmFtZXMsICooX191MzIgKikgdGMtPnVzZXJiaXRzKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX1FVRVJZQ0FQOgoJewoJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBkcml2ZXI9JXMsIGNhcmQ9JXMsIGJ1cz0lcywgdmVyc2lvbj0weCUwOHgsICIKCQkJImNhcGFiaWxpdGllcz0weCUwOHhcbiIsIHMsCgkJCQlwLT5kcml2ZXIscC0+Y2FyZCxwLT5idXNfaW5mbywKCQkJCXAtPnZlcnNpb24sCgkJCQlwLT5jYXBhYmlsaXRpZXMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19DVFJMOgoJY2FzZSBWSURJT0NfU19DVFJMOgojaWZkZWYgX19PTERfVklESU9DXwoJY2FzZSBWSURJT0NfU19DVFJMX09MRDoKI2VuZGlmCgl7CgkJc3RydWN0IHY0bDJfY29udHJvbCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGlkPSVkLCB2YWx1ZT0lZFxuIiwgcywgcC0+aWQsIHAtPnZhbHVlKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgoJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CgljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgoJewoJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqcCA9IGFyZzsKCQlpbnQgaTsKCgkJcHJpbnRrKCIlczogY3RybF9jbGFzcz0lZCwgY291bnQ9JWRcbiIsIHMsIHAtPmN0cmxfY2xhc3MsIHAtPmNvdW50KTsKCQlmb3IgKGkgPSAwOyBpIDwgcC0+Y291bnQ7IGkrKykgewoJCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqYyA9ICZwLT5jb250cm9sc1tpXTsKCQkJaWYgKGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMpCgkJCQlwcmludGsoIiVzOiBpZD0lZFxuIiwgcywgYy0+aWQpOwoJCQllbHNlCgkJCQlwcmludGsoIiVzOiBpZD0lZCwgdmFsdWU9JWRcbiIsIHMsIGMtPmlkLCBjLT52YWx1ZSk7CgkJfQoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19DUk9QOgoJY2FzZSBWSURJT0NfU19DUk9QOgoJewoJCXN0cnVjdCB2NGwyX2Nyb3AgKnA9YXJnOwoJCS8qRklYTUU6IFNob3VsZCBhbHNvIHNob3cgcmVjdCBzdHJ1Y3RzICovCgkJcHJpbnRrICgiJXM6IHR5cGU9JWRcbiIsIHMsIHAtPnR5cGUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfQ1JPUENBUDoKI2lmZGVmIF9fT0xEX1ZJRElPQ18KCWNhc2UgVklESU9DX0NST1BDQVBfT0xEOgojZW5kaWYKCXsKCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpwPWFyZzsKCQkvKkZJWE1FOiBTaG91bGQgYWxzbyBzaG93IHJlY3Qgc3RydWN0cyAqLwoJCXByaW50ayAoIiVzOiB0eXBlPSVkXG4iLCBzLCBwLT50eXBlKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkU6Cgl7CgkJc3RydWN0IHY0bDJfZGVjb2RlX3ZiaV9saW5lICpwPWFyZzsKCQlwcmludGsgKCIlczogaXNfc2Vjb25kX2ZpZWxkPSVkLCBwdHI9MHglMDhseCwgbGluZT0lZCwgIgoJCQkidHlwZT0lZFxuIiwgcywKCQkJCXAtPmlzX3NlY29uZF9maWVsZCwodW5zaWduZWQgbG9uZylwLT5wLHAtPmxpbmUscC0+dHlwZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19FTlVNX0ZNVDoKCXsKCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIHR5cGU9JWQsIGZsYWdzPSVkLCBkZXNjcmlwdGlvbj0lcywiCgkJCSIgcGl4ZWxmb3JtYXQ9JWRcbiIsIHMsCgkJCQlwLT5pbmRleCwgcC0+dHlwZSwgcC0+ZmxhZ3MscC0+ZGVzY3JpcHRpb24sCgkJCQlwLT5waXhlbGZvcm1hdCk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19GTVQ6CgljYXNlIFZJRElPQ19TX0ZNVDoKCWNhc2UgVklESU9DX1RSWV9GTVQ6Cgl7CgkJc3RydWN0IHY0bDJfZm9ybWF0ICpwPWFyZzsKCQlwcmludGsgKCIlczogdHlwZT0lc1xuIiwgcywKCQkJCXBydF9uYW1lcyhwLT50eXBlLHY0bDJfdHlwZV9uYW1lcykpOwoJCXN3aXRjaCAocC0+dHlwZSkgewoJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgoJCQl2NGxfcHJpbnRfcGl4X2ZtdCAocywgJnAtPmZtdC5waXgpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9Cgl9CgljYXNlIFZJRElPQ19HX0ZCVUY6CgljYXNlIFZJRElPQ19TX0ZCVUY6Cgl7CgkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBjYXBhYmlsaXR5PSVkLCBmbGFncz0lZCwgYmFzZT0weCUwOGx4XG4iLCBzLAoJCQkJcC0+Y2FwYWJpbGl0eSxwLT5mbGFncywgKHVuc2lnbmVkIGxvbmcpcC0+YmFzZSk7CgkJdjRsX3ByaW50X3BpeF9mbXQgKHMsICZwLT5mbXQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CgljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKCXsKCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0dW5lcj0lZCwgdHlwZT0lZCwgZnJlcXVlbmN5PSVkXG4iLCBzLAoJCQkJcC0+dHVuZXIscC0+dHlwZSxwLT5mcmVxdWVuY3kpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgoJewoJCXN0cnVjdCB2NGwyX2lucHV0ICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsIGF1ZGlvc2V0PSVkLCAiCgkJCSJ0dW5lcj0lZCwgc3RkPSVMZCwgc3RhdHVzPSVkXG4iLCBzLAoJCQkJcC0+aW5kZXgscC0+bmFtZSxwLT50eXBlLHAtPmF1ZGlvc2V0LAoJCQkJcC0+dHVuZXIsCgkJCQkodW5zaWduZWQgbG9uZyBsb25nKXAtPnN0ZCwKCQkJCXAtPnN0YXR1cyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX0pQRUdDT01QOgoJY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKCXsKCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnA9YXJnOwoJCXByaW50ayAoIiVzOiBxdWFsaXR5PSVkLCBBUFBuPSVkLCBBUFBfbGVuPSVkLCBDT01fbGVuPSVkLCIKCQkJIiBqcGVnX21hcmtlcnM9JWRcbiIsIHMsCgkJCQlwLT5xdWFsaXR5LHAtPkFQUG4scC0+QVBQX2xlbiwKCQkJCXAtPkNPTV9sZW4scC0+anBlZ19tYXJrZXJzKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfTU9EVUxBVE9SOgoJY2FzZSBWSURJT0NfU19NT0RVTEFUT1I6Cgl7CgkJc3RydWN0IHY0bDJfbW9kdWxhdG9yICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsIHJhbmdlbG93PSVkLCIKCQkJIiByYW5nZWhpZ2g9JWQsIHR4c3ViY2hhbnM9JWRcbiIsIHMsCgkJCQlwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LHAtPnJhbmdlbG93LAoJCQkJcC0+cmFuZ2VoaWdoLHAtPnR4c3ViY2hhbnMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19NUEVHQ09NUDoKCWNhc2UgVklESU9DX1NfTVBFR0NPTVA6Cgl7CgkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcD1hcmc7CgkJLypGSVhNRTogU2V2ZXJhbCBmaWVsZHMgbm90IHNob3duICovCgkJcHJpbnRrICgiJXM6IHRzX3BpZF9wbXQ9JWQsIHRzX3BpZF9hdWRpbz0lZCwgdHNfcGlkX3ZpZGVvPSVkLCAiCgkJCSJ0c19waWRfcGNyPSVkLCBwc19zaXplPSVkLCBhdV9zYW1wbGVfcmF0ZT0lZCwgIgoJCQkiYXVfcGVzaWQ9JWMsIHZpX2ZyYW1lX3JhdGU9JWQsIHZpX2ZyYW1lc19wZXJfZ29wPSVkLCAiCgkJCSJ2aV9iZnJhbWVzX2NvdW50PSVkLCB2aV9wZXNpZD0lY1xuIiwgcywKCQkJCXAtPnRzX3BpZF9wbXQscC0+dHNfcGlkX2F1ZGlvLCBwLT50c19waWRfdmlkZW8sCgkJCQlwLT50c19waWRfcGNyLCBwLT5wc19zaXplLCBwLT5hdV9zYW1wbGVfcmF0ZSwKCQkJCXAtPmF1X3Blc2lkLCBwLT52aV9mcmFtZV9yYXRlLAoJCQkJcC0+dmlfZnJhbWVzX3Blcl9nb3AsIHAtPnZpX2JmcmFtZXNfY291bnQsCgkJCQlwLT52aV9wZXNpZCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19FTlVNT1VUUFVUOgoJewoJCXN0cnVjdCB2NGwyX291dHB1dCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGluZGV4PSVkLCBuYW1lPSVzLHR5cGU9JWQsIGF1ZGlvc2V0PSVkLCAiCgkJCSJtb2R1bGF0b3I9JWQsIHN0ZD0lTGRcbiIsCgkJCQlzLHAtPmluZGV4LHAtPm5hbWUscC0+dHlwZSxwLT5hdWRpb3NldCwKCQkJCXAtPm1vZHVsYXRvciwKCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c3RkKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKCXsKCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBpZD0lZCwgdHlwZT0lZCwgbmFtZT0lcywgbWluL21heD0lZC8lZCwiCgkJCSIgc3RlcD0lZCwgZGVmYXVsdD0lZCwgZmxhZ3M9MHglMDh4XG4iLCBzLAoJCQkJcC0+aWQscC0+dHlwZSxwLT5uYW1lLHAtPm1pbmltdW0scC0+bWF4aW11bSwKCQkJCXAtPnN0ZXAscC0+ZGVmYXVsdF92YWx1ZSxwLT5mbGFncyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19RVUVSWU1FTlU6Cgl7CgkJc3RydWN0IHY0bDJfcXVlcnltZW51ICpwPWFyZzsKCQlwcmludGsgKCIlczogaWQ9JWQsIGluZGV4PSVkLCBuYW1lPSVzXG4iLCBzLAoJCQkJcC0+aWQscC0+aW5kZXgscC0+bmFtZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19JTlRfR19SRUdJU1RFUjoKCWNhc2UgVklESU9DX0lOVF9TX1JFR0lTVEVSOgoJewoJCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpwPWFyZzsKCQlwcmludGsgKCIlczogaTJjX2lkPSVkLCByZWc9JWx1LCB2YWw9JWRcbiIsIHMsCgkJCQlwLT5pMmNfaWQscC0+cmVnLHAtPnZhbCk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfUkVRQlVGUzoKCXsKCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGNvdW50PSVkLCB0eXBlPSVzLCBtZW1vcnk9JXNcbiIsIHMsCgkJCQlwLT5jb3VudCwKCQkJCXBydF9uYW1lcyhwLT50eXBlLHY0bDJfdHlwZV9uYW1lcyksCgkJCQlwcnRfbmFtZXMocC0+bWVtb3J5LHY0bDJfbWVtb3J5X25hbWVzKSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgoJY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKCWNhc2UgVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkc6CgljYXNlIFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HOgoJewoJCXN0cnVjdCB2NGwyX3JvdXRpbmcgICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5wdXQ9MHgleCwgb3V0cHV0PTB4JXhcbiIsIHMsIHAtPmlucHV0LCBwLT5vdXRwdXQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVROgoJewoJCXN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGZyZXE9JXUsIGZsYWdzPTB4JXhcbiIsIHMsIHAtPmZyZXEsIHAtPmZsYWdzKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVA6Cgl7CgkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBzZXJ2aWNlX3NldD0lZFxuIiwgcywKCQkJCXAtPnNlcnZpY2Vfc2V0KTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0lOVF9TX1ZCSV9EQVRBOgoJY2FzZSBWSURJT0NfSU5UX0dfVkJJX0RBVEE6Cgl7CgkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGlkPSVkLCBmaWVsZD0lZCwgbGluZT0lZFxuIiwgcywKCQkJCXAtPmlkLCBwLT5maWVsZCwgcC0+bGluZSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19FTlVNU1REOgoJewoJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpwPWFyZzsKCQlwcmludGsgKCIlczogaW5kZXg9JWQsIGlkPSVMZCwgbmFtZT0lcywgZnBzPSVkLyVkLCAiCgkJCSJmcmFtZWxpbmVzPSVkXG4iLCBzLCBwLT5pbmRleCwKCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcC0+aWQsIHAtPm5hbWUsCgkJCQlwLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IsCgkJCQlwLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciwKCQkJCXAtPmZyYW1lbGluZXMpOwoKCQlicmVhazsKCX0KCWNhc2UgVklESU9DX0dfUEFSTToKCWNhc2UgVklESU9DX1NfUEFSTToKI2lmZGVmIF9fT0xEX1ZJRElPQ18KCWNhc2UgVklESU9DX1NfUEFSTV9PTEQ6CiNlbmRpZgoJewoJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0eXBlPSVkXG4iLCBzLCBwLT50eXBlKTsKCgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ19HX1RVTkVSOgoJY2FzZSBWSURJT0NfU19UVU5FUjoKCXsKCQlzdHJ1Y3QgdjRsMl90dW5lciAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGluZGV4PSVkLCBuYW1lPSVzLCB0eXBlPSVkLCBjYXBhYmlsaXR5PSVkLCAiCgkJCSJyYW5nZWxvdz0lZCwgcmFuZ2VoaWdoPSVkLCBzaWduYWw9JWQsIGFmYz0lZCwgIgoJCQkicnhzdWJjaGFucz0lZCwgYXVkbW9kZT0lZFxuIiwgcywKCQkJCXAtPmluZGV4LCBwLT5uYW1lLCBwLT50eXBlLAoJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+cmFuZ2Vsb3cscC0+cmFuZ2VoaWdoLAoJCQkJcC0+cnhzdWJjaGFucywgcC0+YXVkbW9kZSwgcC0+c2lnbmFsLAoJCQkJcC0+YWZjKTsKCQlicmVhazsKCX0KI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAoJY2FzZSBWSURJT0NHVkJJRk1UOgoJY2FzZSBWSURJT0NTVkJJRk1UOgoJewoJCXN0cnVjdCB2YmlfZm9ybWF0ICpwPWFyZzsKCQlwcmludGsgKCIlczogc2FtcGxpbmdfcmF0ZT0lZCwgc2FtcGxlc19wZXJfbGluZT0lZCwgIgoJCQkic2FtcGxlX2Zvcm1hdD0lZCwgc3RhcnQ9JWQvJWQsIGNvdW50PSVkLyVkLCBmbGFncz0lZFxuIiwgcywKCQkJCXAtPnNhbXBsaW5nX3JhdGUscC0+c2FtcGxlc19wZXJfbGluZSwKCQkJCXAtPnNhbXBsZV9mb3JtYXQscC0+c3RhcnRbMF0scC0+c3RhcnRbMV0sCgkJCQlwLT5jb3VudFswXSxwLT5jb3VudFsxXSxwLT5mbGFncyk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dBVURJTzoKCWNhc2UgVklESU9DU0FVRElPOgoJewoJCXN0cnVjdCB2aWRlb19hdWRpbyAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGF1ZGlvPSVkLCB2b2x1bWU9JWQsIGJhc3M9JWQsIHRyZWJsZT0lZCwgIgoJCQkiZmxhZ3M9JWQsIG5hbWU9JXMsIG1vZGU9JWQsIGJhbGFuY2U9JWQsIHN0ZXA9JWRcbiIsCgkJCQlzLHAtPmF1ZGlvLHAtPnZvbHVtZSxwLT5iYXNzLCBwLT50cmVibGUsCgkJCQlwLT5mbGFncyxwLT5uYW1lLHAtPm1vZGUscC0+YmFsYW5jZSxwLT5zdGVwKTsKCQlicmVhazsKCX0KCWNhc2UgVklESU9DR0ZCVUY6CgljYXNlIFZJRElPQ1NGQlVGOgoJewoJCXN0cnVjdCB2aWRlb19idWZmZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBiYXNlPSUwOGx4LCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBkZXB0aD0lZCwgIgoJCQkiYnl0ZXNwZXJsaW5lPSVkXG4iLCBzLAoJCQkJKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UsIHAtPmhlaWdodCwgcC0+d2lkdGgsCgkJCQlwLT5kZXB0aCxwLT5ieXRlc3BlcmxpbmUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0FQOgoJewoJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpwPWFyZzsKCQlwcmludGsgKCIlczogbmFtZT0lcywgdHlwZT0lZCwgY2hhbm5lbHM9JWQsIGF1ZGlvcz0lZCwgIgoJCQkibWF4d2lkdGg9JWQsIG1heGhlaWdodD0lZCwgbWlud2lkdGg9JWQsIG1pbmhlaWdodD0lZFxuIiwKCQkJCXMscC0+bmFtZSxwLT50eXBlLHAtPmNoYW5uZWxzLHAtPmF1ZGlvcywKCQkJCXAtPm1heHdpZHRoLHAtPm1heGhlaWdodCxwLT5taW53aWR0aCwKCQkJCXAtPm1pbmhlaWdodCk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0FQVFVSRToKCWNhc2UgVklESU9DU0NBUFRVUkU6Cgl7CgkJc3RydWN0IHZpZGVvX2NhcHR1cmUgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB4PSVkLCB5PSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkLCBkZWNpbWF0aW9uPSVkLCIKCQkJIiBmbGFncz0lZFxuIiwgcywKCQkJCXAtPngsIHAtPnkscC0+d2lkdGgsIHAtPmhlaWdodCwKCQkJCXAtPmRlY2ltYXRpb24scC0+ZmxhZ3MpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHQ0hBTjoKCWNhc2UgVklESU9DU0NIQU46Cgl7CgkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnA9YXJnOwoJCXByaW50ayAoIiVzOiBjaGFubmVsPSVkLCBuYW1lPSVzLCB0dW5lcnM9JWQsIGZsYWdzPSVkLCAiCgkJCSJ0eXBlPSVkLCBub3JtPSVkXG4iLCBzLAoJCQkJcC0+Y2hhbm5lbCxwLT5uYW1lLHAtPnR1bmVycywKCQkJCXAtPmZsYWdzLHAtPnR5cGUscC0+bm9ybSk7CgoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NTTUlDUk9DT0RFOgoJewoJCXN0cnVjdCB2aWRlb19jb2RlICpwPWFyZzsKCQlwcmludGsgKCIlczogbG9hZHdoYXQ9JXMsIGRhdGFzaXplPSVkXG4iLCBzLAoJCQkJcC0+bG9hZHdoYXQscC0+ZGF0YXNpemUpOwoJCWJyZWFrOwoJfQoJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6Cgl7CgkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGZsYWdzPSVkLCBpbnB1dHM9JWQsIG91dHB1dHM9JWRcbiIsIHMsCgkJCQlwLT5mbGFncyxwLT5pbnB1dHMscC0+b3V0cHV0cyk7CgkJYnJlYWs7Cgl9CgljYXNlIERFQ09ERVJfSU5JVDoKCXsKCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9pbml0ICpwPWFyZzsKCQlwcmludGsgKCIlczogbGVuPSVjXG4iLCBzLCBwLT5sZW4pOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHUExBWUlORk86Cgl7CgkJc3RydWN0IHZpZGVvX2luZm8gKnA9YXJnOwoJCXByaW50ayAoIiVzOiBmcmFtZV9jb3VudD0lZCwgaF9zaXplPSVkLCB2X3NpemU9JWQsICIKCQkJInNtcHRlX3RpbWVjb2RlPSVkLCBwaWN0dXJlX3R5cGU9JWQsICIKCQkJInRlbXBvcmFsX3JlZmVyZW5jZT0lZCwgdXNlcl9kYXRhPSVzXG4iLCBzLAoJCQkJcC0+ZnJhbWVfY291bnQsIHAtPmhfc2l6ZSwKCQkJCXAtPnZfc2l6ZSwgcC0+c21wdGVfdGltZWNvZGUsCgkJCQlwLT5waWN0dXJlX3R5cGUsIHAtPnRlbXBvcmFsX3JlZmVyZW5jZSwKCQkJCXAtPnVzZXJfZGF0YSk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0tFWToKCXsKCQlzdHJ1Y3QgdmlkZW9fa2V5ICpwPWFyZzsKCQlwcmludGsgKCIlczoga2V5PSVzLCBmbGFncz0lZFxuIiwgcywKCQkJCXAtPmtleSwgcC0+ZmxhZ3MpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHTUJVRjoKCXsKCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHNpemU9JWQsIGZyYW1lcz0lZCwgb2Zmc2V0cz0weCUwOGx4XG4iLCBzLAoJCQkJcC0+c2l6ZSwKCQkJCXAtPmZyYW1lcywKCQkJCSh1bnNpZ25lZCBsb25nKXAtPm9mZnNldHMpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NNQ0FQVFVSRToKCXsKCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IGZyYW1lPSVkLCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBmb3JtYXQ9JWRcbiIsIHMsCgkJCQlwLT5mcmFtZSwKCQkJCXAtPmhlaWdodCwgcC0+d2lkdGgsCgkJCQlwLT5mb3JtYXQpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHUElDVDoKCWNhc2UgVklESU9DU1BJQ1Q6CgljYXNlIERFQ09ERVJfU0VUX1BJQ1RVUkU6Cgl7CgkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnA9YXJnOwoKCQlwcmludGsgKCIlczogYnJpZ2h0bmVzcz0lZCwgaHVlPSVkLCBjb2xvdXI9JWQsIGNvbnRyYXN0PSVkLCIKCQkJIiB3aGl0ZW5lc3M9JWQsIGRlcHRoPSVkLCBwYWxldHRlPSVkXG4iLCBzLAoJCQkJcC0+YnJpZ2h0bmVzcywgcC0+aHVlLCBwLT5jb2xvdXIsCgkJCQlwLT5jb250cmFzdCwgcC0+d2hpdGVuZXNzLCBwLT5kZXB0aCwKCQkJCXAtPnBhbGV0dGUpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NTUExBWU1PREU6Cgl7CgkJc3RydWN0IHZpZGVvX3BsYXlfbW9kZSAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IG1vZGU9JWQsIHAxPSVkLCBwMj0lZFxuIiwgcywKCQkJCXAtPm1vZGUscC0+cDEscC0+cDIpOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NHVFVORVI6CgljYXNlIFZJRElPQ1NUVU5FUjoKCXsKCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnA9YXJnOwoJCXByaW50ayAoIiVzOiB0dW5lcj0lZCwgbmFtZT0lcywgcmFuZ2Vsb3c9JWxkLCByYW5nZWhpZ2g9JWxkLCAiCgkJCSJmbGFncz0lZCwgbW9kZT0lZCwgc2lnbmFsPSVkXG4iLCBzLAoJCQkJcC0+dHVuZXIsIHAtPm5hbWUscC0+cmFuZ2Vsb3csIHAtPnJhbmdlaGlnaCwKCQkJCXAtPmZsYWdzLHAtPm1vZGUsIHAtPnNpZ25hbCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dVTklUOgoJewoJCXN0cnVjdCB2aWRlb191bml0ICpwPWFyZzsKCQlwcmludGsgKCIlczogdmlkZW89JWQsIHZiaT0lZCwgcmFkaW89JWQsIGF1ZGlvPSVkLCAiCgkJCSJ0ZWxldGV4dD0lZFxuIiwgcywKCQkJCXAtPnZpZGVvLHAtPnZiaSxwLT5yYWRpbyxwLT5hdWRpbyxwLT50ZWxldGV4dCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dXSU46CgljYXNlIFZJRElPQ1NXSU46Cgl7CgkJc3RydWN0IHZpZGVvX3dpbmRvdyAqcD1hcmc7CgkJcHJpbnRrICgiJXM6IHg9JWQsIHk9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWQsIGNocm9tYWtleT0lZCwiCgkJCSIgZmxhZ3M9JWQsIGNsaXBjb3VudD0lZFxuIiwgcywKCQkJCXAtPngsIHAtPnkscC0+d2lkdGgsIHAtPmhlaWdodCwKCQkJCXAtPmNocm9tYWtleSxwLT5mbGFncywKCQkJCXAtPmNsaXBjb3VudCk7CgkJYnJlYWs7Cgl9CgljYXNlIFZJRElPQ0dGUkVROgoJY2FzZSBWSURJT0NTRlJFUToKCXsKCQl1bnNpZ25lZCBsb25nICpwPWFyZzsKCQlwcmludGsgKCIlczogdmFsdWU9JWx1XG4iLCBzLCAqcCk7CgkJYnJlYWs7Cgl9CiNlbmRpZgoJY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6CgljYXNlIFZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVE6CgljYXNlIFZJRElPQ19JTlRfU19TVEFOREJZOgoJewoJCXUzMiAqcD1hcmc7CgoJCXByaW50ayAoIiVzOiB2YWx1ZT0lZFxuIiwgcywgKnApOwoJCWJyZWFrOwoJfQoJY2FzZSBWSURJT0NfR19TVEQ6CgljYXNlIFZJRElPQ19TX1NURDoKCWNhc2UgVklESU9DX1FVRVJZU1REOgoJewoJCXY0bDJfc3RkX2lkICpwPWFyZzsKCgkJcHJpbnRrICgiJXM6IHZhbHVlPSVMdVxuIiwgcywgKHVuc2lnbmVkIGxvbmcgbG9uZykqcCk7CgkJYnJlYWs7Cgl9Cgl9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb250cm9sIGhhbmRsaW5nCQkJICAgICAqLwoKLyogQ2hlY2sgZm9yIGNvcnJlY3RuZXNzIG9mIHRoZSBjdHJsJ3MgdmFsdWUgYmFzZWQgb24gdGhlIGRhdGEgZnJvbQogICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgYW5kIHRoZSBhdmFpbGFibGUgbWVudSBpdGVtcy4gTm90ZSB0aGF0CiAgIG1lbnVfaXRlbXMgbWF5IGJlIE5VTEwsIGluIHRoYXQgY2FzZSBpdCBpcyBpZ25vcmVkLiAqLwppbnQgdjRsMl9jdHJsX2NoZWNrKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAoJCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQp7CglpZiAocWN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAocWN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCkKCQlyZXR1cm4gLUVCVVNZOwoJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiB8fAoJICAgIHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NCB8fAoJICAgIHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1MpCgkJcmV0dXJuIDA7CglpZiAoY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSB8fCBjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtKQoJCXJldHVybiAtRVJBTkdFOwoJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUgJiYgbWVudV9pdGVtcyAhPSBOVUxMKSB7CgkJaWYgKG1lbnVfaXRlbXNbY3RybC0+dmFsdWVdID09IE5VTEwgfHwKCQkgICAgbWVudV9pdGVtc1tjdHJsLT52YWx1ZV1bMF0gPT0gJ1wwJykKCQkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gMDsKfQoKLyogUmV0dXJucyBOVUxMIG9yIGEgY2hhcmFjdGVyIHBvaW50ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgbWVudSBmb3IKICAgdGhlIGdpdmVuIGNvbnRyb2wgSUQuIFRoZSBwb2ludGVyIGFycmF5IGVuZHMgd2l0aCBhIE5VTEwgcG9pbnRlci4KICAgQW4gZW1wdHkgc3RyaW5nIHNpZ25pZmllcyBhIG1lbnUgZW50cnkgdGhhdCBpcyBpbnZhbGlkLiBUaGlzIGFsbG93cwogICBkcml2ZXJzIHRvIGRpc2FibGUgY2VydGFpbiBvcHRpb25zIGlmIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICovCmNvbnN0IGNoYXIgKip2NGwyX2N0cmxfZ2V0X21lbnUodTMyIGlkKQp7CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxW10gPSB7CgkJIjQ0LjEga0h6IiwKCQkiNDgga0h6IiwKCQkiMzIga0h6IiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fZW5jb2RpbmdbXSA9IHsKCQkiTGF5ZXIgSSIsCgkJIkxheWVyIElJIiwKCQkiTGF5ZXIgSUlJIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDFfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNjQga2JwcyIsCgkJIjk2IGticHMiLAoJCSIxMjgga2JwcyIsCgkJIjE2MCBrYnBzIiwKCQkiMTkyIGticHMiLAoJCSIyMjQga2JwcyIsCgkJIjI1NiBrYnBzIiwKCQkiMjg4IGticHMiLAoJCSIzMjAga2JwcyIsCgkJIjM1MiBrYnBzIiwKCQkiMzg0IGticHMiLAoJCSI0MTYga2JwcyIsCgkJIjQ0OCBrYnBzIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDJfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNDgga2JwcyIsCgkJIjU2IGticHMiLAoJCSI2NCBrYnBzIiwKCQkiODAga2JwcyIsCgkJIjk2IGticHMiLAoJCSIxMTIga2JwcyIsCgkJIjEyOCBrYnBzIiwKCQkiMTYwIGticHMiLAoJCSIxOTIga2JwcyIsCgkJIjIyNCBrYnBzIiwKCQkiMjU2IGticHMiLAoJCSIzMjAga2JwcyIsCgkJIjM4NCBrYnBzIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDNfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNDAga2JwcyIsCgkJIjQ4IGticHMiLAoJCSI1NiBrYnBzIiwKCQkiNjQga2JwcyIsCgkJIjgwIGticHMiLAoJCSI5NiBrYnBzIiwKCQkiMTEyIGticHMiLAoJCSIxMjgga2JwcyIsCgkJIjE2MCBrYnBzIiwKCQkiMTkyIGticHMiLAoJCSIyMjQga2JwcyIsCgkJIjI1NiBrYnBzIiwKCQkiMzIwIGticHMiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19tb2RlW10gPSB7CgkJIlN0ZXJlbyIsCgkJIkpvaW50IFN0ZXJlbyIsCgkJIkR1YWwiLAoJCSJNb25vIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbW9kZV9leHRlbnNpb25bXSA9IHsKCQkiQm91bmQgNCIsCgkJIkJvdW5kIDgiLAoJCSJCb3VuZCAxMiIsCgkJIkJvdW5kIDE2IiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fZW1waGFzaXNbXSA9IHsKCQkiTm8gRW1waGFzaXMiLAoJCSI1MC8xNSB1cyIsCgkJIkNDSVRUIEoxNyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2NyY1tdID0gewoJCSJObyBDUkMiLAoJCSIxNi1iaXQgQ1JDIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fZW5jb2RpbmdbXSA9IHsKCQkiTVBFRy0xIiwKCQkiTVBFRy0yIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYXNwZWN0W10gPSB7CgkJIjF4MSIsCgkJIjR4MyIsCgkJIjE2eDkiLAoJCSIyLjIxeDEiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19iaXRyYXRlX21vZGVbXSA9IHsKCQkiVmFyaWFibGUgQml0cmF0ZSIsCgkJIkNvbnN0YW50IEJpdHJhdGUiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19zdHJlYW1fdHlwZVtdID0gewoJCSJNUEVHLTIgUHJvZ3JhbSBTdHJlYW0iLAoJCSJNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSIsCgkJIk1QRUctMSBTeXN0ZW0gU3RyZWFtIiwKCQkiTVBFRy0yIERWRC1jb21wYXRpYmxlIFN0cmVhbSIsCgkJIk1QRUctMSBWQ0QtY29tcGF0aWJsZSBTdHJlYW0iLAoJCSJNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3N0cmVhbV92YmlfZm10W10gPSB7CgkJIk5vIFZCSSIsCgkJIlByaXZhdGUgcGFja2V0LCBJVlRWIGZvcm1hdCIsCgkJTlVMTAoJfTsKCglzd2l0Y2ggKGlkKSB7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgkJCXJldHVybiBtcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJCQlyZXR1cm4gbXBlZ19hdWRpb19lbmNvZGluZzsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDFfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDJfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDNfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbW9kZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fZW1waGFzaXM7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fY3JjOwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKCQkJcmV0dXJuIG1wZWdfdmlkZW9fZW5jb2Rpbmc7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCQkJcmV0dXJuIG1wZWdfdmlkZW9fYXNwZWN0OwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgkJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOwoJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKCQkJcmV0dXJuIG1wZWdfc3RyZWFtX3ZiaV9mbXQ7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIE5VTEw7Cgl9Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKi8KaW50IHY0bDJfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKQp7Cgljb25zdCBjaGFyICpuYW1lOwoKCXFjdHJsLT5mbGFncyA9IDA7Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJLyogVVNFUiBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOiAJbmFtZSA9ICJVc2VyIENvbnRyb2xzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogCW5hbWUgPSAiVm9sdW1lIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IAluYW1lID0gIk11dGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRTogCW5hbWUgPSAiQmFsYW5jZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOiAJbmFtZSA9ICJCYXNzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRTogCW5hbWUgPSAiVHJlYmxlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOiAJbmFtZSA9ICJMb3VkbmVzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiAJbmFtZSA9ICJCcmlnaHRuZXNzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOiAJbmFtZSA9ICJDb250cmFzdCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiAJbmFtZSA9ICJTYXR1cmF0aW9uIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0hVRTogCQluYW1lID0gIkh1ZSI7IGJyZWFrOwoKCS8qIE1QRUcgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzogCQluYW1lID0gIk1QRUcgRW5jb2RlciBDb250cm9scyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6IG5hbWUgPSAiQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6IAluYW1lID0gIkF1ZGlvIEVuY29kaW5nIExheWVyIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSSBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSUkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJSSBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERTogCQluYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046IG5hbWUgPSAiQXVkaW8gU3RlcmVvIE1vZGUgRXh0ZW5zaW9uIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6IAluYW1lID0gIkF1ZGlvIEVtcGhhc2lzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOiAJCW5hbWUgPSAiQXVkaW8gQ1JDIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6IAluYW1lID0gIlZpZGVvIEVuY29kaW5nIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOiAJbmFtZSA9ICJWaWRlbyBBc3BlY3QiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzogCW5hbWUgPSAiVmlkZW8gQiBGcmFtZXMiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRTogCW5hbWUgPSAiVmlkZW8gR09QIFNpemUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRTogCW5hbWUgPSAiVmlkZW8gR09QIENsb3N1cmUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjogCW5hbWUgPSAiVmlkZW8gUHVsbGRvd24iOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6IAluYW1lID0gIlZpZGVvIEJpdHJhdGUgTW9kZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6IAluYW1lID0gIlZpZGVvIEJpdHJhdGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6IAluYW1lID0gIlZpZGVvIFBlYWsgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046IG5hbWUgPSAiVmlkZW8gVGVtcG9yYWwgRGVjaW1hdGlvbiI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOiAJbmFtZSA9ICJTdHJlYW0gVHlwZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOiAJbmFtZSA9ICJTdHJlYW0gUE1UIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOiAJbmFtZSA9ICJTdHJlYW0gQXVkaW8gUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86IAluYW1lID0gIlN0cmVhbSBWaWRlbyBQcm9ncmFtIElEIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6IAluYW1lID0gIlN0cmVhbSBQQ1IgUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86IG5hbWUgPSAiU3RyZWFtIFBFUyBBdWRpbyBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86IG5hbWUgPSAiU3RyZWFtIFBFUyBWaWRlbyBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOgluYW1lID0gIlN0cmVhbSBWQkkgRm9ybWF0IjsgYnJlYWs7CgoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXN3aXRjaCAocWN0cmwtPmlkKSB7CgljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CgljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgoJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjsKCQltaW4gPSAwOwoJCW1heCA9IHN0ZXAgPSAxOwoJCWJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzoKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CgkJc3RlcCA9IDE7CgkJYnJlYWs7CgljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6CgljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6CgkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTOwoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7CgkJbWluID0gbWF4ID0gc3RlcCA9IGRlZiA9IDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKCQlicmVhazsKCX0KCXN3aXRjaCAocWN0cmwtPmlkKSB7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKCQlicmVhazsKCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgoJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgoJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgoJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CgljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgoJY2FzZSBWNEwyX0NJRF9IVUU6CgkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKCQlicmVhazsKCX0KCXFjdHJsLT5taW5pbXVtID0gbWluOwoJcWN0cmwtPm1heGltdW0gPSBtYXg7CglxY3RybC0+c3RlcCA9IHN0ZXA7CglxY3RybC0+ZGVmYXVsdF92YWx1ZSA9IGRlZjsKCXFjdHJsLT5yZXNlcnZlZFswXSA9IHFjdHJsLT5yZXNlcnZlZFsxXSA9IDA7CglzbnByaW50ZihxY3RybC0+bmFtZSwgc2l6ZW9mKHFjdHJsLT5uYW1lKSwgbmFtZSk7CglyZXR1cm4gMDsKfQoKLyogRmlsbCBpbiBhIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB3aXRoIHN0YW5kYXJkIHZhbHVlcyBiYXNlZCBvbgogICB0aGUgY29udHJvbCBJRC4gKi8KaW50IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQp7Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJLyogVVNFUiBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMCwgMCwgMCk7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDY1NTM1LCA2NTUzNSAvIDEwMCwgNTg4ODApOwoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgoJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgoJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgoJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCA2NTUzNSwgNjU1MzUgLyAxMDAsIDMyNzY4KTsKCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMTI4KTsKCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CgljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxMjcsIDEsIDY0KTsKCWNhc2UgVjRMMl9DSURfSFVFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgLTEyOCwgMTI3LCAxLCAwKTsKCgkvKiBNUEVHIGNvbnRyb2xzICovCgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCwKCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzMyMDAwLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMik7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMkssCgkJCQlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjU2Syk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMkssCgkJCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0Syk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMkssCgkJCQlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMjBLLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8sCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9NT05PLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPKTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCwKCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xNiwgMSwKCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80KTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSwKCQkJCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19DQ0lUVF9KMTcsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSwKCQkJCVY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEsCgkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLCAxLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMik7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwLCAxLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMzMsIDEsIDIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMSwgMzQsIDEsIDEyKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDEpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIsIDEsCgkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUik7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI3MDAwMDAwLCAxLCA2MDAwMDAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNzAwMDAwMCwgMSwgODAwMDAwMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1NWQ0QsIDEsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMTYpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU86CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNjApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNTYpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjU5KTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfTk9ORSwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWLCAxLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX05PTkUpOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKLyogRmlsbCBpbiBhIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSBiYXNlZCBvbiB0aGUgc3RydWN0IHY0bDJfcXVlcnljdHJsIGFuZAogICB0aGUgbWVudS4gVGhlIHFjdHJsIHBvaW50ZXIgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZC4gKi8KaW50IHY0bDJfY3RybF9xdWVyeV9tZW51KHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCgkgICAgICAgY29uc3QgY2hhciAqKm1lbnVfaXRlbXMpCnsKCWludCBpOwoKCWlmIChtZW51X2l0ZW1zID09IE5VTEwgfHwKCSAgICAocWN0cmwgJiYgKHFtZW51LT5pbmRleCA8IHFjdHJsLT5taW5pbXVtIHx8IHFtZW51LT5pbmRleCA+IHFjdHJsLT5tYXhpbXVtKSkpCgkJcmV0dXJuIC1FSU5WQUw7Cglmb3IgKGkgPSAwOyBpIDwgcW1lbnUtPmluZGV4ICYmIG1lbnVfaXRlbXNbaV07IGkrKykgOwoJaWYgKG1lbnVfaXRlbXNbaV0gPT0gTlVMTCB8fCBtZW51X2l0ZW1zW2ldWzBdID09ICdcMCcpCgkJcmV0dXJuIC1FSU5WQUw7CglzbnByaW50ZihxbWVudS0+bmFtZSwgc2l6ZW9mKHFtZW51LT5uYW1lKSwgbWVudV9pdGVtc1txbWVudS0+aW5kZXhdKTsKCXFtZW51LT5yZXNlcnZlZCA9IDA7CglyZXR1cm4gMDsKfQoKLyogY3RybF9jbGFzc2VzIHBvaW50cyB0byBhbiBhcnJheSBvZiB1MzIgcG9pbnRlcnMsIHRoZSBsYXN0IGVsZW1lbnQgaXMKICAgYSBOVUxMIHBvaW50ZXIuIEVhY2ggdTMyIGFycmF5IGlzIGEgMC10ZXJtaW5hdGVkIGFycmF5IG9mIGNvbnRyb2wgSURzLgogICBFYWNoIGFycmF5IG11c3QgYmUgc29ydGVkIGxvdyB0byBoaWdoIGFuZCBiZWxvbmcgdG8gdGhlIHNhbWUgY29udHJvbAogICBjbGFzcy4gVGhlIGFycmF5IG9mIHUzMiBwb2ludGVyIG11c3QgYWxzbyBiZSBzb3J0ZWQsIGZyb20gbG93IGNsYXNzIElEcwogICB0byBoaWdoIGNsYXNzIElEcy4KCiAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgSUQgdGhhdCBmb2xsb3dzIGFmdGVyIHRoZSBnaXZlbiBJRC4KICAgV2hlbiBubyBtb3JlIGNvbnRyb2xzIGFyZSBhdmFpbGFibGUgMCBpcyByZXR1cm5lZC4gKi8KdTMyIHY0bDJfY3RybF9uZXh0KGNvbnN0IHUzMiAqIGNvbnN0ICogY3RybF9jbGFzc2VzLCB1MzIgaWQpCnsKCXUzMiBjdHJsX2NsYXNzOwoJY29uc3QgdTMyICpwY3RybDsKCgkvKiBpZiBubyBxdWVyeSBpcyBkZXNpcmVkLCB0aGVuIGp1c3QgcmV0dXJuIHRoZSBjb250cm9sIElEICovCglpZiAoKGlkICYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMKSA9PSAwKQoJCXJldHVybiBpZDsKCWlmIChjdHJsX2NsYXNzZXMgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCWlkICY9IFY0TDJfQ1RSTF9JRF9NQVNLOwoJY3RybF9jbGFzcyA9IFY0TDJfQ1RSTF9JRDJDTEFTUyhpZCk7CglpZCsrOwkvKiBzZWxlY3QgbmV4dCBjb250cm9sICovCgkvKiBmaW5kIGZpcnN0IGNsYXNzIHRoYXQgbWF0Y2hlcyAob3IgaXMgZ3JlYXRlciB0aGFuKSB0aGUgY2xhc3Mgb2YKCSAgIHRoZSBJRCAqLwoJd2hpbGUgKCpjdHJsX2NsYXNzZXMgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKCoqY3RybF9jbGFzc2VzKSA8IGN0cmxfY2xhc3MpCgkJY3RybF9jbGFzc2VzKys7CgkvKiBubyBtb3JlIGNsYXNzZXMgKi8KCWlmICgqY3RybF9jbGFzc2VzID09IE5VTEwpCgkJcmV0dXJuIDA7CglwY3RybCA9ICpjdHJsX2NsYXNzZXM7CgkvKiBmaW5kIGZpcnN0IGN0cmwgd2l0aGluIHRoZSBjbGFzcyB0aGF0IGlzID49IElEICovCgl3aGlsZSAoKnBjdHJsICYmICpwY3RybCA8IGlkKSBwY3RybCsrOwoJaWYgKCpwY3RybCkKCQlyZXR1cm4gKnBjdHJsOwoJLyogd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnRyb2xzIG9mIHRoZSBjdXJyZW50IGNsYXNzLiAqLwoJLyogY29udGludWUgd2l0aCBuZXh0IGNsYXNzIGlmIGF2YWlsYWJsZSAqLwoJY3RybF9jbGFzc2VzKys7CglpZiAoKmN0cmxfY2xhc3NlcyA9PSBOVUxMKQoJCXJldHVybiAwOwoJcmV0dXJuICoqY3RybF9jbGFzc2VzOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKRVhQT1JUX1NZTUJPTCh2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QpOwoKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9faW5pdCk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2NoYW5nZSk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX29wZW4pOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19jbG9zZSk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX21heCk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2NoZWNrKTsKCkVYUE9SVF9TWU1CT0wodjRsMl9maWVsZF9uYW1lcyk7CkVYUE9SVF9TWU1CT0wodjRsMl90eXBlX25hbWVzKTsKRVhQT1JUX1NZTUJPTCh2NGxfcHJpbnRrX2lvY3RsKTsKRVhQT1JUX1NZTUJPTCh2NGxfcHJpbnRrX2lvY3RsX2FyZyk7CgpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9uZXh0KTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfY2hlY2spOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9nZXRfbWVudSk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X21lbnUpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9maWxsKTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQpOwoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=