LyoKICogIENvcHlyaWdodCCpIDIwMDEgRmxhZ2EgaGYuIE1lZGljYWwgRGV2aWNlcywgS+FyaSBEYXbt8HNzb24gPGtkQGZsYWdhLmlzPgogKgogKiAgJElkOiBjZmlfZmxhZ2FkbS5jLHYgMS4xNCAyMDA0LzExLzA0IDEzOjI0OjE0IGdsZWl4bmVyIEV4cCAkCiAqICAKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECiAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgogKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAogKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCiAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCiAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgojaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgojaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KCgovKiBXZSBzcGxpdCB0aGUgZmxhc2ggY2hpcCB1cCBpbnRvIGZvdXIgcGFydHMuCiAqIDE6IGJvb3Rsb2FkZXIgZmlydHMgMTI4awkJCSgweDAwMDAwMDAwIC0gMHgwMDAxRkZGRikgc2l6ZSAweDAyMDAwMAogKiAyOiBrZXJuZWwgNjQwawkJCQkJKDB4MDAwMjAwMDAgLSAweDAwMEJGRkZGKSBzaXplIDB4MEEwMDAwCiAqIDM6IGNvbXByZXNzZWQgMTUzNmsgcm9vdCByYW1kaXNrCSgweDAwMEMwMDAwIC0gMHgwMDIzRkZGRikgc2l6ZSAweDE4MDAwMAogKiA0OiB3cml0ZWFibGUgZGlza3BhcnRpdGlvbiAoamZmcykoMHgwMDI0MDAwMCAtIDB4MDAzRkZGRkYpIHNpemUgMHgxQzAwMDAKICovCgojZGVmaW5lIEZMQVNIX1BIWVNfQUREUiAweDQwMDAwMDAwCiNkZWZpbmUgRkxBU0hfU0laRSAweDQwMDAwMCAgCgojZGVmaW5lIEZMQVNIX1BBUlRJVElPTjBfQUREUiAweDAwMDAwMDAwCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OMF9TSVpFIDB4MDAwMjAwMDAKCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OMV9BRERSIDB4MDAwMjAwMDAKI2RlZmluZSBGTEFTSF9QQVJUSVRJT04xX1NJWkUgMHgwMDBBMDAwMAoKI2RlZmluZSBGTEFTSF9QQVJUSVRJT04yX0FERFIgMHgwMDBDMDAwMAojZGVmaW5lIEZMQVNIX1BBUlRJVElPTjJfU0laRSAweDAwMTgwMDAwCgojZGVmaW5lIEZMQVNIX1BBUlRJVElPTjNfQUREUiAweDAwMjQwMDAwCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OM19TSVpFIDB4MDAxQzAwMDAKCgpzdHJ1Y3QgbWFwX2luZm8gZmxhZ2FkbV9tYXAgPSB7CgkJLm5hbWUgPQkJIkZsYWdhRE0gZmxhc2ggZGV2aWNlIiwKCQkuc2l6ZSA9CQlGTEFTSF9TSVpFLAoJCS5iYW5rd2lkdGggPQkyLAp9OwoKc3RydWN0IG10ZF9wYXJ0aXRpb24gZmxhZ2FkbV9wYXJ0c1tdID0gewoJewoJCS5uYW1lID0JCSJCb290bG9hZGVyIiwKCQkub2Zmc2V0CT0JRkxBU0hfUEFSVElUSU9OMF9BRERSLAoJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjBfU0laRQoJfSwKCXsKCQkubmFtZSA9CQkiS2VybmVsIGltYWdlIiwKCQkub2Zmc2V0ID0JRkxBU0hfUEFSVElUSU9OMV9BRERSLAoJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjFfU0laRQoJfSwKCXsKCQkubmFtZSA9CQkiSW5pdGlhbCByYW1kaXNrIGltYWdlIiwKCQkub2Zmc2V0ID0JRkxBU0hfUEFSVElUSU9OMl9BRERSLAoJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjJfU0laRQoJfSwKCXsJCgkJLm5hbWUgPQkJIlBlcnNpc3RhbnQgc3RvcmFnZSIsCgkJLm9mZnNldCA9CUZMQVNIX1BBUlRJVElPTjNfQUREUiwKCQkuc2l6ZSA9CQlGTEFTSF9QQVJUSVRJT04zX1NJWkUKCX0KfTsKCiNkZWZpbmUgUEFSVElUSU9OX0NPVU5UIChzaXplb2YoZmxhZ2FkbV9wYXJ0cykvc2l6ZW9mKHN0cnVjdCBtdGRfcGFydGl0aW9uKSkKCnN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOwoKaW50IF9faW5pdCBpbml0X2ZsYWdhZG0odm9pZCkKewkKCXByaW50ayhLRVJOX05PVElDRSAiRmxhZ2FETSBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLAoJCQlGTEFTSF9TSVpFLCBGTEFTSF9QSFlTX0FERFIpOwoJCglmbGFnYWRtX21hcC5waHlzID0gRkxBU0hfUEhZU19BRERSOwoJZmxhZ2FkbV9tYXAudmlydCA9IGlvcmVtYXAoRkxBU0hfUEhZU19BRERSLAoJCQkJCUZMQVNIX1NJWkUpOwoKCWlmICghZmxhZ2FkbV9tYXAudmlydCkgewoJCXByaW50aygiRmFpbGVkIHRvIGlvcmVtYXBcbiIpOwoJCXJldHVybiAtRUlPOwoJfQoKCXNpbXBsZV9tYXBfaW5pdCgmZmxhZ2FkbV9tYXApOwoKCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmZmxhZ2FkbV9tYXApOwoJaWYgKG15bXRkKSB7CgkJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CgkJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBmbGFnYWRtX3BhcnRzLCBQQVJUSVRJT05fQ09VTlQpOwoJCXByaW50ayhLRVJOX05PVElDRSAiRmxhZ2FETSBmbGFzaCBkZXZpY2UgaW5pdGlhbGl6ZWRcbiIpOwoJCXJldHVybiAwOwoJfQoKCWlvdW5tYXAoKHZvaWQgKilmbGFnYWRtX21hcC52aXJ0KTsKCXJldHVybiAtRU5YSU87Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2ZsYWdhZG0odm9pZCkKewoJaWYgKG15bXRkKSB7CgkJZGVsX210ZF9wYXJ0aXRpb25zKG15bXRkKTsKCQltYXBfZGVzdHJveShteW10ZCk7Cgl9CglpZiAoZmxhZ2FkbV9tYXAudmlydCkgewoJCWlvdW5tYXAoKHZvaWQgKilmbGFnYWRtX21hcC52aXJ0KTsKCQlmbGFnYWRtX21hcC52aXJ0ID0gMDsKCX0KfQoKbW9kdWxlX2luaXQoaW5pdF9mbGFnYWRtKTsKbW9kdWxlX2V4aXQoY2xlYW51cF9mbGFnYWRtKTsKCgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkvhcmkgRGF27fBzc29uIDxrZEBmbGFnYS5pcz4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgRmxhZ2EgZGlnaXRhbCBtb2R1bGUiKTsK