ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvV2luZG93c0RlYnVnQWdlbnQuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9XaW5kb3dzRGVidWdBZ2VudC5jcHAKaW5kZXggMWE3MDgyOC4uMjI5ODAyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9XaW5kb3dzRGVidWdBZ2VudC5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9XaW5kb3dzRGVidWdBZ2VudC5jcHAKQEAgLTEsMTcxICsxLDE4MCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIlByb2Nlc3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiV2luZG93c09TRGF0YVNlcnZpY2UuaCIKLSNpbmNsdWRlICJSdW5Db250cm9sU2VydmljZS5oIgotI2luY2x1ZGUgIlNpbXBsZVJlZ2lzdGVyc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJSZWdpc3RlcnNTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiTWVtb3J5U2VydmljZS5oIgotI2luY2x1ZGUgIkxvZ2dpbmdTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiQnJlYWtwb2ludHNTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlICJFdmVudENsaWVudE5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiTG9nZ2VyLmgiCi0KLSNpbmNsdWRlICJUQ0ZIZWFkZXJzLmgiCi0KLXN0YXRpYyBQcm90b2NvbCAqIHByb3RvOwotc3RhdGljIENoYW5uZWxTZXJ2ZXIgKiBzZXJ2Owotc3RhdGljIFRDRkJyb2FkY2FzdEdyb3VwICogYmNnOwotCi1zdGF0aWMgbG9uZyBjaGFubmVsQ291bnQgPSAwOwotCi1zdGF0aWMgdm9pZCBjaGFubmVsX3NlcnZlcl9jb25uZWN0aW5nKENoYW5uZWwgKiBjKSB7Ci0JdHJhY2UoTE9HX1BST1RPQ09MLCAiY2hhbm5lbCBzZXJ2ZXIgY29ubmVjdGluZyIpOwotCi0Jc2VuZF9oZWxsb19tZXNzYWdlKGMpOwotfQotCi1zdGF0aWMgdm9pZCBjaGFubmVsX3NlcnZlcl9jb25uZWN0ZWQoQ2hhbm5lbCAqIGMpIHsKLQljaGFubmVsQ291bnQrKzsKLQlpbnQgaTsKLQotCXRyYWNlKExPR19QUk9UT0NPTCwgImNoYW5uZWwgc2VydmVyIGNvbm5lY3RlZCwgcGVlciBzZXJ2aWNlczoiKTsKLQlmb3IgKGkgPSAwOyBpIDwgYy0+cGVlcl9zZXJ2aWNlX2NudDsgaSsrKSB7Ci0JCXRyYWNlKExPR19QUk9UT0NPTCwgIiAgJXMiLCBjLT5wZWVyX3NlcnZpY2VfbGlzdFtpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaGFubmVsX3NlcnZlcl9yZWNlaXZlKENoYW5uZWwgKiBjKSB7Ci0JaGFuZGxlX3Byb3RvY29sX21lc3NhZ2UoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoYW5uZWxfc2VydmVyX2Rpc2Nvbm5lY3RlZChDaGFubmVsICogYykgewotCXRyYWNlKExPR19QUk9UT0NPTCwgImNoYW5uZWwgc2VydmVyIGRpc2Nvbm5lY3RlZCIpOwotICAgIHByb3RvY29sX3JlbGVhc2UoYy0+cHJvdG9jb2wpOwotCWNoYW5uZWxDb3VudC0tOwotfQotCi1zdGF0aWMgdm9pZCBjaGFubmVsX25ld19jb25uZWN0aW9uKENoYW5uZWxTZXJ2ZXIgKiBzZXJ2LCBDaGFubmVsICogYykgewotCXByb3RvY29sX3JlZmVyZW5jZShwcm90byk7Ci0gICAgYy0+cHJvdG9jb2wgPSBwcm90bzsKLQljLT5jb25uZWN0aW5nID0gY2hhbm5lbF9zZXJ2ZXJfY29ubmVjdGluZzsKLQljLT5jb25uZWN0ZWQgPSBjaGFubmVsX3NlcnZlcl9jb25uZWN0ZWQ7Ci0JYy0+cmVjZWl2ZSA9IGNoYW5uZWxfc2VydmVyX3JlY2VpdmU7Ci0JYy0+ZGlzY29ubmVjdGVkID0gY2hhbm5lbF9zZXJ2ZXJfZGlzY29ubmVjdGVkOwotCWNoYW5uZWxfc2V0X2Jyb2FkY2FzdF9ncm91cChjLCBiY2cpOwotCWNoYW5uZWxfc3RhcnQoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zaHV0ZG93bih2b2lkICp4KSB7Ci0KLQlpZiAoY2hhbm5lbENvdW50IDw9IDApIHsKLQkJdHJhY2UoTE9HX1BST1RPQ09MLCAiY2hlY2tfZm9yX3NodXRkb3duIik7Ci0JCWNhbmNlbF9ldmVudF9sb29wKCk7Ci0JfQotCi0JcG9zdF9ldmVudF93aXRoX2RlbGF5KGNoZWNrX2Zvcl9zaHV0ZG93biwgTlVMTCwgMTIwICogMTAwMDAwMCk7Ci19Ci0KLS8vIG92ZXJyaWRlIHRoaXMgc28gd2UgY2FuIGFjdHVhbGx5IGJyZWFrIG9uIGl0Ci1fQ1JUSU1QIHZvaWQgX19jZGVjbCBfX01JTkdXX05PVEhST1cgX2Fzc2VydCAoY29uc3QgY2hhciogZXJyb3IsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQotewotCWNoYXIgbWVzc2FnZVsyNTZdOwotCXNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwKLQkJCSJGYXRhbCBlcnJvcjogYXNzZXJ0aW9uIGZhaWxlZCBhdCBmaWxlPSVzLCBsaW5lPSVkOiAlc1xuIiwKLQkJCWZpbGUgLGxpbmUsIGVycm9yKTsKLQlmcHV0cyhtZXNzYWdlLCBzdGRlcnIpOwotCXRyYWNlKExPR19BTFdBWVMsIG1lc3NhZ2UpOwotCWV4aXQoMyk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSNpZmRlZiBfREVCVUcKLQlzdGF0aWMgY29uc3QgY2hhciogbG9nX25hbWUgPSAiQzpcXFdpbmRvd3NEZWJ1Z0FnZW50TG9nLnR4dCI7Ci0gICAgbG9nX21vZGUgPSBMT0dfRVZFTlRTIHwgTE9HX0NISUxEIHwgTE9HX1dBSVRQSUQgfCBMT0dfQ09OVEVYVCB8IExPR19QUk9UT0NPTCB8IExPR19BU1lOQ1JFUTsKLSAgICBvcGVuX2xvZ19maWxlKGxvZ19uYW1lKTsKLSNlbmRpZgotCi0JdHJ5IHsKLQkvLyBGb3IgaW50ZXJpbSB0ZXN0IHB1cnBvc2Ugb25seToKLQkvLyBVc2UgdGhpcyB1bnB1Ymxpc2hlZCBvcHRpb24gdG8gdHVybiBvZmYgQnJlYWtwb2ludHNTZXJ2aWNlLAotCS8vIG5hbWVseSB1c2UgRURDIGdlbmVyaWMgYnJlYWtwb2ludHMgbWVjaGFuaXNtLgotCS8vCi0JYm9vbCBpbnN0YWxsQnBTZXJ2aWNlID0gdHJ1ZTsKLQlpZiAoYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItbm9icHNlcnZpY2UiKSA9PSAwKQotCQlpbnN0YWxsQnBTZXJ2aWNlID0gZmFsc2U7Ci0KLQlzdGF0aWMgY29uc3QgY2hhciAqIHVybCA9ICJUQ1A6IjsKLQlQZWVyU2VydmVyICogcHMgPSBOVUxMOwotCWluaV9tZGVwKCk7Ci0JaW5pX3RyYWNlKCk7Ci0JaW5pX2FzeW5jcmVxKCk7Ci0KLQlpbmlfZXZlbnRzX3F1ZXVlKCk7Ci0KLQliY2cgPSBicm9hZGNhc3RfZ3JvdXBfYWxsb2MoKTsKLQlwcm90byA9IHByb3RvY29sX2FsbG9jKCk7Ci0KLQlMb2dUcmFjZSgiU3RhcnRpbmcgdXAiKTsKLQlFdmVudENsaWVudE5vdGlmaWVyOjpicm9hZGNhc3RHcm91cCA9IGJjZzsKLQkKLQluZXcgUHJvY2Vzc1NlcnZpY2UocHJvdG8pOwotCW5ldyBSdW5Db250cm9sU2VydmljZShwcm90byk7Ci0JbmV3IFdpbmRvd3NPU0RhdGFTZXJ2aWNlKHByb3RvKTsKLQluZXcgUmVnaXN0ZXJzU2VydmljZShwcm90byk7Ci0JbmV3IE1lbW9yeVNlcnZpY2UocHJvdG8pOwotCW5ldyBMb2dnaW5nU2VydmljZShwcm90byk7Ci0JaWYgKGluc3RhbGxCcFNlcnZpY2UpCi0JCW5ldyBCcmVha3BvaW50c1NlcnZpY2UocHJvdG8pOwotCQotCXBzID0gY2hhbm5lbF9wZWVyX2Zyb21fdXJsKHVybCk7Ci0KLQlwZWVyX3NlcnZlcl9hZGRwcm9wKHBzLCBsb2Nfc3RyZHVwKCJOYW1lIiksIGxvY19zdHJkdXAoIldpbjMyIERlYnVnIEFnZW50IikpOwotCXBlZXJfc2VydmVyX2FkZHByb3AocHMsIGxvY19zdHJkdXAoIkRlYnVnU3VwcG9ydCIpLCBsb2Nfc3RyZHVwKAotCQkJIldpbjMyIERlYnVnIEFQSSIpKTsKLQotCUxQVFNUUiBscE5hbWVCdWZmZXIgPSBOVUxMOwotCURXT1JEIGxwblNpemUgPSAwOwotCUdldENvbXB1dGVyTmFtZShscE5hbWVCdWZmZXIsICZscG5TaXplKTsKLQlpZiAobHBuU2l6ZSA9PSAwKSAvLyBPbiBXaW4gWFAgdGhpcyBtYXkgcmV0dXJuIHplcm8gZXZlbiBpZiB0aGVyZSBpcyBhIHZhbGlkIG5hbWUKLQkJbHBuU2l6ZSA9IDEwMjQ7Ci0JbHBOYW1lQnVmZmVyID0gbmV3IGNoYXJbKytscG5TaXplXTsKLQlHZXRDb21wdXRlck5hbWUobHBOYW1lQnVmZmVyLCAmbHBuU2l6ZSk7Ci0JcGVlcl9zZXJ2ZXJfYWRkcHJvcChwcywgbG9jX3N0cmR1cCgiRGVzY3JpcHRpb24iKSwgbG9jX3N0cmR1cChscE5hbWVCdWZmZXIpKTsKLQlkZWxldGUgW10gbHBOYW1lQnVmZmVyOwotCi0JaWYgKHBzID09IE5VTEwpIHsKLQkJCUxvZ1RyYWNlKCJpbnZhbGlkIHNlcnZlciBVUkwiKTsKLQkJZXhpdCgxKTsKLQl9Ci0Jc2VydiA9IGNoYW5uZWxfc2VydmVyKHBzKTsKLQlpZiAoc2VydiA9PSBOVUxMKSB7Ci0JCQlMb2dUcmFjZSgiY2Fubm90IGNyZWF0ZSBUQ0Ygc2VydmVyXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0Jc2Vydi0+bmV3X2Nvbm4gPSBjaGFubmVsX25ld19jb25uZWN0aW9uOwotCi0JZGlzY292ZXJ5X3N0YXJ0KCk7Ci0KLSNpZmRlZiBfREVCVUcKLSNlbHNlCi0JcG9zdF9ldmVudF93aXRoX2RlbGF5KGNoZWNrX2Zvcl9zaHV0ZG93biwgTlVMTCwgMzAgKiAxMDAwMDAwKTsKLSNlbmRpZgotCi0JcnVuX2V2ZW50X2xvb3AoKTsKLQl9IGNhdGNoICguLi4pIHsKLQkJTG9nVHJhY2UoIkV4Y2VwdGlvbiB0aHJvd24sIGNhdWdodCBhdCBtYWluIik7Ci0JfQotCXJldHVybiAwOwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNpbmNsdWRlICJQcm9jZXNzU2VydmljZS5oIg0KKyNpbmNsdWRlICJXaW5kb3dzT1NEYXRhU2VydmljZS5oIg0KKyNpbmNsdWRlICJSdW5Db250cm9sU2VydmljZS5oIg0KKyNpbmNsdWRlICJTaW1wbGVSZWdpc3RlcnNTZXJ2aWNlLmgiDQorI2luY2x1ZGUgIlJlZ2lzdGVyc1NlcnZpY2UuaCINCisjaW5jbHVkZSAiTWVtb3J5U2VydmljZS5oIg0KKyNpbmNsdWRlICJMb2dnaW5nU2VydmljZS5oIg0KKyNpbmNsdWRlICJTZXR0aW5nc1NlcnZpY2UuaCINCisjaW5jbHVkZSAiQnJlYWtwb2ludHNTZXJ2aWNlLmgiDQorDQorI2luY2x1ZGUgIkV2ZW50Q2xpZW50Tm90aWZpZXIuaCINCisjaW5jbHVkZSAiTG9nZ2VyLmgiDQorDQorI2luY2x1ZGUgIlRDRkhlYWRlcnMuaCINCisNCitzdGF0aWMgUHJvdG9jb2wgKiBwcm90bzsNCitzdGF0aWMgQ2hhbm5lbFNlcnZlciAqIHNlcnY7DQorc3RhdGljIFRDRkJyb2FkY2FzdEdyb3VwICogYmNnOw0KKw0KK3N0YXRpYyBsb25nIGNoYW5uZWxDb3VudCA9IDA7DQorDQorc3RhdGljIHZvaWQgY2hhbm5lbF9zZXJ2ZXJfY29ubmVjdGluZyhDaGFubmVsICogYykgew0KKwl0cmFjZShMT0dfUFJPVE9DT0wsICJjaGFubmVsIHNlcnZlciBjb25uZWN0aW5nIik7DQorDQorCXNlbmRfaGVsbG9fbWVzc2FnZShjKTsNCit9DQorDQorc3RhdGljIHZvaWQgY2hhbm5lbF9zZXJ2ZXJfY29ubmVjdGVkKENoYW5uZWwgKiBjKSB7DQorCWNoYW5uZWxDb3VudCsrOw0KKwlpbnQgaTsNCisNCisJdHJhY2UoTE9HX1BST1RPQ09MLCAiY2hhbm5lbCBzZXJ2ZXIgY29ubmVjdGVkLCBwZWVyIHNlcnZpY2VzOiIpOw0KKwlmb3IgKGkgPSAwOyBpIDwgYy0+cGVlcl9zZXJ2aWNlX2NudDsgaSsrKSB7DQorCQl0cmFjZShMT0dfUFJPVE9DT0wsICIgICVzIiwgYy0+cGVlcl9zZXJ2aWNlX2xpc3RbaV0pOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGNoYW5uZWxfc2VydmVyX3JlY2VpdmUoQ2hhbm5lbCAqIGMpIHsNCisJaGFuZGxlX3Byb3RvY29sX21lc3NhZ2UoYyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGNoYW5uZWxfc2VydmVyX2Rpc2Nvbm5lY3RlZChDaGFubmVsICogYykgew0KKwl0cmFjZShMT0dfUFJPVE9DT0wsICJjaGFubmVsIHNlcnZlciBkaXNjb25uZWN0ZWQiKTsNCisgICAgcHJvdG9jb2xfcmVsZWFzZShjLT5wcm90b2NvbCk7DQorCWNoYW5uZWxDb3VudC0tOw0KK30NCisNCitzdGF0aWMgdm9pZCBjaGFubmVsX25ld19jb25uZWN0aW9uKENoYW5uZWxTZXJ2ZXIgKiBzZXJ2LCBDaGFubmVsICogYykgew0KKwlwcm90b2NvbF9yZWZlcmVuY2UocHJvdG8pOw0KKyAgICBjLT5wcm90b2NvbCA9IHByb3RvOw0KKwljLT5jb25uZWN0aW5nID0gY2hhbm5lbF9zZXJ2ZXJfY29ubmVjdGluZzsNCisJYy0+Y29ubmVjdGVkID0gY2hhbm5lbF9zZXJ2ZXJfY29ubmVjdGVkOw0KKwljLT5yZWNlaXZlID0gY2hhbm5lbF9zZXJ2ZXJfcmVjZWl2ZTsNCisJYy0+ZGlzY29ubmVjdGVkID0gY2hhbm5lbF9zZXJ2ZXJfZGlzY29ubmVjdGVkOw0KKwljaGFubmVsX3NldF9icm9hZGNhc3RfZ3JvdXAoYywgYmNnKTsNCisJY2hhbm5lbF9zdGFydChjKTsNCit9DQorDQorc3RhdGljIHZvaWQgY2hlY2tfZm9yX3NodXRkb3duKHZvaWQgKngpIHsNCisNCisJaWYgKGNoYW5uZWxDb3VudCA8PSAwKSB7DQorCQl0cmFjZShMT0dfUFJPVE9DT0wsICJjaGVja19mb3Jfc2h1dGRvd24iKTsNCisJCWNhbmNlbF9ldmVudF9sb29wKCk7DQorCX0NCisNCisJcG9zdF9ldmVudF93aXRoX2RlbGF5KGNoZWNrX2Zvcl9zaHV0ZG93biwgTlVMTCwgMTIwICogMTAwMDAwMCk7DQorfQ0KKw0KKy8qDQorICogQ2VudHJhbCBwb2ludCBmb3IgY2xlYW51cCBhZnRlciBkZWJ1ZyBzZXNzaW9uIGVuZHMuCisgKi8NCit2b2lkIGRlYnVnX3Nlc3Npb25fZW5kcygpIHsNCisJU2V0dGluZ3NTZXJ2aWNlOjpkZWJ1Z1Nlc3Npb25FbmRzKCk7DQorfQ0KKw0KKy8vIG92ZXJyaWRlIHRoaXMgc28gd2UgY2FuIGFjdHVhbGx5IGJyZWFrIG9uIGl0DQorX0NSVElNUCB2b2lkIF9fY2RlY2wgX19NSU5HV19OT1RIUk9XIF9hc3NlcnQgKGNvbnN0IGNoYXIqIGVycm9yLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkNCit7DQorCWNoYXIgbWVzc2FnZVsyNTZdOw0KKwlzbnByaW50ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksDQorCQkJIkZhdGFsIGVycm9yOiBhc3NlcnRpb24gZmFpbGVkIGF0IGZpbGU9JXMsIGxpbmU9JWQ6ICVzXG4iLA0KKwkJCWZpbGUgLGxpbmUsIGVycm9yKTsNCisJZnB1dHMobWVzc2FnZSwgc3RkZXJyKTsNCisJdHJhY2UoTE9HX0FMV0FZUywgbWVzc2FnZSk7DQorCWV4aXQoMyk7DQorfQ0KKw0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsNCisjaWZkZWYgX0RFQlVHDQorCXN0YXRpYyBjb25zdCBjaGFyKiBsb2dfbmFtZSA9ICJDOlxcV2luZG93c0RlYnVnQWdlbnRMb2cudHh0IjsNCisgICAgbG9nX21vZGUgPSBMT0dfRVZFTlRTIHwgTE9HX0NISUxEIHwgTE9HX1dBSVRQSUQgfCBMT0dfQ09OVEVYVCB8IExPR19QUk9UT0NPTCB8IExPR19BU1lOQ1JFUTsNCisgICAgb3Blbl9sb2dfZmlsZShsb2dfbmFtZSk7DQorI2VuZGlmDQorDQorCXRyeSB7DQorCS8vIEZvciBpbnRlcmltIHRlc3QgcHVycG9zZSBvbmx5Og0KKwkvLyBVc2UgdGhpcyB1bnB1Ymxpc2hlZCBvcHRpb24gdG8gdHVybiBvZmYgQnJlYWtwb2ludHNTZXJ2aWNlLA0KKwkvLyBuYW1lbHkgdXNlIEVEQyBnZW5lcmljIGJyZWFrcG9pbnRzIG1lY2hhbmlzbS4NCisJLy8NCisJYm9vbCBpbnN0YWxsQnBTZXJ2aWNlID0gdHJ1ZTsNCisJaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLW5vYnBzZXJ2aWNlIikgPT0gMCkNCisJCWluc3RhbGxCcFNlcnZpY2UgPSBmYWxzZTsNCisNCisJc3RhdGljIGNvbnN0IGNoYXIgKiB1cmwgPSAiVENQOiI7DQorCVBlZXJTZXJ2ZXIgKiBwcyA9IE5VTEw7DQorCWluaV9tZGVwKCk7DQorCWluaV90cmFjZSgpOw0KKwlpbmlfYXN5bmNyZXEoKTsNCisNCisJaW5pX2V2ZW50c19xdWV1ZSgpOw0KKw0KKwliY2cgPSBicm9hZGNhc3RfZ3JvdXBfYWxsb2MoKTsNCisJcHJvdG8gPSBwcm90b2NvbF9hbGxvYygpOw0KKw0KKwlMb2dUcmFjZSgiU3RhcnRpbmcgdXAiKTsNCisJRXZlbnRDbGllbnROb3RpZmllcjo6YnJvYWRjYXN0R3JvdXAgPSBiY2c7DQorCQ0KKwluZXcgUHJvY2Vzc1NlcnZpY2UocHJvdG8pOw0KKwluZXcgUnVuQ29udHJvbFNlcnZpY2UocHJvdG8pOw0KKwluZXcgV2luZG93c09TRGF0YVNlcnZpY2UocHJvdG8pOw0KKwluZXcgUmVnaXN0ZXJzU2VydmljZShwcm90byk7DQorCW5ldyBNZW1vcnlTZXJ2aWNlKHByb3RvKTsNCisJbmV3IExvZ2dpbmdTZXJ2aWNlKHByb3RvKTsNCisJbmV3IFNldHRpbmdzU2VydmljZShwcm90byk7DQorCWlmIChpbnN0YWxsQnBTZXJ2aWNlKQ0KKwkJbmV3IEJyZWFrcG9pbnRzU2VydmljZShwcm90byk7DQorCQ0KKwlwcyA9IGNoYW5uZWxfcGVlcl9mcm9tX3VybCh1cmwpOw0KKw0KKwlwZWVyX3NlcnZlcl9hZGRwcm9wKHBzLCBsb2Nfc3RyZHVwKCJOYW1lIiksIGxvY19zdHJkdXAoIldpbjMyIERlYnVnIEFnZW50IikpOw0KKwlwZWVyX3NlcnZlcl9hZGRwcm9wKHBzLCBsb2Nfc3RyZHVwKCJEZWJ1Z1N1cHBvcnQiKSwgbG9jX3N0cmR1cCgNCisJCQkiV2luMzIgRGVidWcgQVBJIikpOw0KKw0KKwlMUFRTVFIgbHBOYW1lQnVmZmVyID0gTlVMTDsNCisJRFdPUkQgbHBuU2l6ZSA9IDA7DQorCUdldENvbXB1dGVyTmFtZShscE5hbWVCdWZmZXIsICZscG5TaXplKTsNCisJaWYgKGxwblNpemUgPT0gMCkgLy8gT24gV2luIFhQIHRoaXMgbWF5IHJldHVybiB6ZXJvIGV2ZW4gaWYgdGhlcmUgaXMgYSB2YWxpZCBuYW1lDQorCQlscG5TaXplID0gMTAyNDsNCisJbHBOYW1lQnVmZmVyID0gbmV3IGNoYXJbKytscG5TaXplXTsNCisJR2V0Q29tcHV0ZXJOYW1lKGxwTmFtZUJ1ZmZlciwgJmxwblNpemUpOw0KKwlwZWVyX3NlcnZlcl9hZGRwcm9wKHBzLCBsb2Nfc3RyZHVwKCJEZXNjcmlwdGlvbiIpLCBsb2Nfc3RyZHVwKGxwTmFtZUJ1ZmZlcikpOw0KKwlkZWxldGUgW10gbHBOYW1lQnVmZmVyOw0KKw0KKwlpZiAocHMgPT0gTlVMTCkgew0KKwkJCUxvZ1RyYWNlKCJpbnZhbGlkIHNlcnZlciBVUkwiKTsNCisJCWV4aXQoMSk7DQorCX0NCisJc2VydiA9IGNoYW5uZWxfc2VydmVyKHBzKTsNCisJaWYgKHNlcnYgPT0gTlVMTCkgew0KKwkJCUxvZ1RyYWNlKCJjYW5ub3QgY3JlYXRlIFRDRiBzZXJ2ZXJcbiIpOw0KKwkJZXhpdCgxKTsNCisJfQ0KKwlzZXJ2LT5uZXdfY29ubiA9IGNoYW5uZWxfbmV3X2Nvbm5lY3Rpb247DQorDQorCWRpc2NvdmVyeV9zdGFydCgpOw0KKw0KKyNpZmRlZiBfREVCVUcNCisjZWxzZQ0KKwlwb3N0X2V2ZW50X3dpdGhfZGVsYXkoY2hlY2tfZm9yX3NodXRkb3duLCBOVUxMLCAzMCAqIDEwMDAwMDApOw0KKyNlbmRpZg0KKw0KKwlydW5fZXZlbnRfbG9vcCgpOw0KKwl9IGNhdGNoICguLi4pIHsNCisJCUxvZ1RyYWNlKCJFeGNlcHRpb24gdGhyb3duLCBjYXVnaHQgYXQgbWFpbiIpOw0KKwl9DQorCXJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9FdmVudENsaWVudE5vdGlmaWVyLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L0V2ZW50Q2xpZW50Tm90aWZpZXIuY3BwCmluZGV4IDIyNDRhYWMuLjlhYTQ0YTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L0V2ZW50Q2xpZW50Tm90aWZpZXIuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L0V2ZW50Q2xpZW50Tm90aWZpZXIuY3BwCkBAIC0xLDI0MiArMSwyNTQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkV2ZW50Q2xpZW50Tm90aWZpZXIuaCIKLSNpbmNsdWRlICJUQ0ZIZWFkZXJzLmgiCi0jaW5jbHVkZSAiTG9nZ2VyLmgiCi0jaW5jbHVkZSAiQWdlbnRVdGlscy5oIgotI2luY2x1ZGUgIlRDRk91dHB1dFN0cmVhbS5oIgotI2luY2x1ZGUgIlByb3RvY29sQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiVGhyZWFkQ29udGV4dC5oIgotCi1UQ0ZCcm9hZGNhc3RHcm91cCAqIEV2ZW50Q2xpZW50Tm90aWZpZXI6OmJyb2FkY2FzdEdyb3VwID0gTlVMTDsKLQotc3RhdGljIGNvbnN0IGNoYXIgUlVOX0NPTlRST0xbXSA9ICJSdW5Db250cm9sIjsKLQotU2VuZFJlbW92ZWRFdmVudFBhcmFtczo6U2VuZFJlbW92ZWRFdmVudFBhcmFtcyhDb250ZXh0KiBjb250ZXh0XywgYm9vbCBkZWxldGVfKSB7Ci0JY29udGV4dCA9IGNvbnRleHRfOwotCWRlbGV0ZUNvbnRleHQgPSBkZWxldGVfOwotfQotCi1TZW5kRXhlRXZlbnRQYXJhbXM6OlNlbmRFeGVFdmVudFBhcmFtcyhDb250ZXh0KiBjb250ZXh0XywgdW5zaWduZWQgbG9uZyBwY0FkZHJlc3NfLCBjb25zdCBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzXykgewotCWNvbnRleHQgPSBjb250ZXh0XzsKLQlwcm9wZXJ0aWVzID0gcHJvcGVydGllc187Ci0JcGNBZGRyZXNzID0gcGNBZGRyZXNzXzsKLX0KLQotU2VuZEV4Y2VwdGlvbkV2ZW50UGFyYW1zOjpTZW5kRXhjZXB0aW9uRXZlbnRQYXJhbXMoQ29udGV4dCogY29udGV4dF8sCi0JCWNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbl8pIHsKLQljb250ZXh0ID0gY29udGV4dF87Ci0JZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbl87Ci19Ci0KLVNlbmRTdXNwZW5kRXZlbnRQYXJhbXM6OlNlbmRTdXNwZW5kRXZlbnRQYXJhbXMoQ29udGV4dCogY29udGV4dF8sIHVuc2lnbmVkIGxvbmcgcGNBZGRyZXNzXywKLQkJY29uc3QgY2hhciogcmVhc29uXywgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2VfKSB7Ci0JY29udGV4dCA9IGNvbnRleHRfOwotCXBjQWRkcmVzcyA9IHBjQWRkcmVzc187Ci0JcmVhc29uID0gcmVhc29uXzsKLQltZXNzYWdlID0gbWVzc2FnZV87Ci19Ci0KLXZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRBZGRlZChDb250ZXh0KiBjb250ZXh0KSB7Ci0JcG9zdF9ldmVudChFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEFkZGVkQ2FsbGJhY2ssIGNvbnRleHQpOwotfQotCi12b2lkIEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0QWRkZWRDYWxsYmFjayh2b2lkKiBjb250ZXh0KSB7Ci0JVENGT3V0cHV0U3RyZWFtIG91dCgmYnJvYWRjYXN0R3JvdXAtPm91dCk7Ci0KLQlvdXQud3JpdGVTdHJpbmdaKCJFIik7Ci0Jb3V0LndyaXRlU3RyaW5nWihSVU5fQ09OVFJPTCk7Ci0Jb3V0LndyaXRlU3RyaW5nWigiY29udGV4dEFkZGVkIik7Ci0KLQkvLyA8YXJyYXkgb2YgY29udGV4dCBkYXRhPgotCW91dC53cml0ZUNoYXJhY3RlcignWycpOwotCVdyaXRlQ29udGV4dCgqKENvbnRleHQqKSBjb250ZXh0LCBvdXQpOwotCW91dC53cml0ZUNoYXJhY3RlcignXScpOwotCW91dC53cml0ZVplcm8oKTsKLQotCW91dC53cml0ZUNvbXBsZXRlKCk7Ci0KLQlzdGQ6OnN0cmluZyBjb250ZXh0SUQgPSAoKENvbnRleHQqKSBjb250ZXh0KS0+R2V0SUQoKTsKLQotCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEFkZGVkICIsICJjb250ZXh0IGlkOiAlcyIsCi0JCQljb250ZXh0SUQuY19zdHIoKSk7Ci0KLX0KLQotdm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFJlbW92ZWQoQ29udGV4dCogY29udGV4dCwgYm9vbCBkZWxldGVDb250ZXh0KSB7Ci0JU2VuZFJlbW92ZWRFdmVudFBhcmFtcyogcGFyYW1zID0gbmV3IFNlbmRSZW1vdmVkRXZlbnRQYXJhbXMoY29udGV4dCwgZGVsZXRlQ29udGV4dCk7Ci0JcG9zdF9ldmVudChFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFJlbW92ZWRDYWxsYmFjaywgcGFyYW1zKTsKLX0KLQotdm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFJlbW92ZWRDYWxsYmFjayh2b2lkKiBjb250ZXh0KSB7Ci0JU2VuZFJlbW92ZWRFdmVudFBhcmFtcyogcGFyYW1zID0gKFNlbmRSZW1vdmVkRXZlbnRQYXJhbXMqKSBjb250ZXh0OwotCVRDRk91dHB1dFN0cmVhbSBvdXQoJmJyb2FkY2FzdEdyb3VwLT5vdXQpOwotCi0Jb3V0LndyaXRlU3RyaW5nWigiRSIpOwotCW91dC53cml0ZVN0cmluZ1ooUlVOX0NPTlRST0wpOwotCW91dC53cml0ZVN0cmluZ1ooImNvbnRleHRSZW1vdmVkIik7Ci0KLQkvKiA8YXJyYXkgb2YgY29udGV4dCBkYXRhPiAqLwotCW91dC53cml0ZUNoYXJhY3RlcignWycpOwotCW91dC53cml0ZVN0cmluZyhwYXJhbXMtPmNvbnRleHQtPkdldElEKCkuY19zdHIoKSk7Ci0Jb3V0LndyaXRlQ2hhcmFjdGVyKCddJyk7Ci0Jb3V0LndyaXRlWmVybygpOwotCi0Jb3V0LndyaXRlQ29tcGxldGUoKTsKLQotCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFJlbW92ZWQgIiwgImNvbnRleHQgaWQ6ICVkIiwKLQkJCXBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpKTsKLQotCWlmIChwYXJhbXMtPmRlbGV0ZUNvbnRleHQpCi0JCWRlbGV0ZSBwYXJhbXMtPmNvbnRleHQ7Ci0KLQlkZWxldGUgcGFyYW1zOwotCi19Ci0KLXZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZEV4ZWN1dGFibGVFdmVudChDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBsb25nIHBjQWRkcmVzcywgY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllcykgeyAKLQlwb3N0X2V2ZW50KEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRFeGVjdXRhYmxlRXZlbnRDYWxsYmFjaywKLQkJCW5ldyBTZW5kRXhlRXZlbnRQYXJhbXMoY29udGV4dCwgcGNBZGRyZXNzLCBwcm9wZXJ0aWVzKSk7Ci19Ci0KLXZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZEV4ZWN1dGFibGVFdmVudENhbGxiYWNrKHZvaWQqIHBhcmFtcykgewotCVNlbmRFeGVFdmVudFBhcmFtcyogZXZlbnRQYXJhbXMgPSAoU2VuZEV4ZUV2ZW50UGFyYW1zKikgcGFyYW1zOwotCi0JVENGT3V0cHV0U3RyZWFtIG91dCgmYnJvYWRjYXN0R3JvdXAtPm91dCk7Ci0KLQlvdXQud3JpdGVTdHJpbmdaKCJFIik7Ci0Jb3V0LndyaXRlU3RyaW5nWihSVU5fQ09OVFJPTCk7Ci0Jb3V0LndyaXRlU3RyaW5nWigiY29udGV4dFN1c3BlbmRlZCIpOwotCi0Jb3V0LndyaXRlU3RyaW5nKGV2ZW50UGFyYW1zLT5jb250ZXh0LT5HZXRJRCgpKTsKLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlvdXQud3JpdGVMb25nKGV2ZW50UGFyYW1zLT5wY0FkZHJlc3MpOwotCW91dC53cml0ZVplcm8oKTsKLQotCW91dC53cml0ZVN0cmluZyhSRUFTT05fU0hBUkVETElCKTsKLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlXcml0ZVByb3BlcnRpZXMoZXZlbnRQYXJhbXMtPnByb3BlcnRpZXMsIG91dCk7Ci0KLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlvdXQud3JpdGVDb21wbGV0ZSgpOwotCi0jaWYgRU5BQkxFX1RyYWNlCi0JUHJvcGVydHlWYWx1ZSogZXhlID0gMDsKLQlQcm9wZXJ0aWVzOjpjb25zdF9pdGVyYXRvciBpdGVyID0gZXZlbnRQYXJhbXMtPnByb3BlcnRpZXMuZmluZChQUk9QX05BTUUpOwotCWlmIChpdGVyICE9IGV2ZW50UGFyYW1zLT5wcm9wZXJ0aWVzLmVuZCgpKQotCQlleGUgPSBpdGVyLT5zZWNvbmQ7Ci0JTG9nVHJhY2UoIkV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRFeGVjdXRhYmxlRXZlbnQiLAotCQkJImNvbnRleHQgaWQ6ICVzIGV4ZWN1dGFibGU6ICVzIGFkZHJlc3M6ICVYIiwKLQkJCWV2ZW50UGFyYW1zLT5jb250ZXh0LT5HZXRJRCgpLmNfc3RyKCksCi0JCQlleGUgPyBleGUtPmdldFN0cmluZ1ZhbHVlKCkuY19zdHIoKSA6ICI8bm9uZT4iLCAKLQkJCWV2ZW50UGFyYW1zLT5wY0FkZHJlc3MpOwotI2VuZGlmCi0JCi0JZGVsZXRlIGV2ZW50UGFyYW1zOwotfQotCi12b2lkIEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0U3VzcGVuZGVkKENvbnRleHQqIGNvbnRleHQsCi0JCXVuc2lnbmVkIGxvbmcgcGNBZGRyZXNzLCBjb25zdCBjaGFyKiByZWFzb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0JcG9zdF9ldmVudChFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZENhbGxiYWNrLAotCQkJbmV3IFNlbmRTdXNwZW5kRXZlbnRQYXJhbXMoY29udGV4dCwgcGNBZGRyZXNzLCByZWFzb24sIG1lc3NhZ2UpKTsKLX0KLQotdm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZENhbGxiYWNrKHZvaWQqIHBhcmFtc18pIHsKLQlTZW5kU3VzcGVuZEV2ZW50UGFyYW1zKiBwYXJhbXMgPSAoU2VuZFN1c3BlbmRFdmVudFBhcmFtcyopIHBhcmFtc187Ci0JVENGT3V0cHV0U3RyZWFtIG91dCgmYnJvYWRjYXN0R3JvdXAtPm91dCk7Ci0KLQlvdXQud3JpdGVTdHJpbmdaKCJFIik7Ci0Jb3V0LndyaXRlU3RyaW5nWihSVU5fQ09OVFJPTCk7Ci0Jb3V0LndyaXRlU3RyaW5nWigiY29udGV4dFN1c3BlbmRlZCIpOwotCi0Jb3V0LndyaXRlU3RyaW5nKHBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpKTsKLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlvdXQud3JpdGVMb25nKHBhcmFtcy0+cGNBZGRyZXNzKTsKLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlvdXQud3JpdGVTdHJpbmcocGFyYW1zLT5yZWFzb24pOwotCW91dC53cml0ZVplcm8oKTsKLQotCW91dC53cml0ZUNoYXJhY3RlcigneycpOwotCWlmIChwYXJhbXMtPm1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCW91dC53cml0ZVN0cmluZygibWVzc2FnZSIpOwotCQlvdXQud3JpdGVDaGFyYWN0ZXIoJzonKTsKLQkJb3V0LndyaXRlU3RyaW5nKHBhcmFtcy0+bWVzc2FnZS5jX3N0cigpKTsKLQl9Ci0Jb3V0LndyaXRlQ2hhcmFjdGVyKCd9Jyk7Ci0Jb3V0LndyaXRlWmVybygpOwotCi0Jb3V0LndyaXRlQ29tcGxldGUoKTsKLQotCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZCAiLAotCQkJImNvbnRleHQgaWQ6ICVzIGFkZHJlc3M6ICVYIiwgcGFyYW1zLT5jb250ZXh0LT5HZXRJRCgpLmNfc3RyKCksCi0JCQlwYXJhbXMtPnBjQWRkcmVzcyk7Ci0KLQlkZWxldGUgcGFyYW1zOwotfQotCi0KLQotdm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEV4Y2VwdGlvbihDb250ZXh0KiBjb250ZXh0LAotCQljb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKLQlwb3N0X2V2ZW50KEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0RXhjZXB0aW9uQ2FsbGJhY2ssCi0JCQluZXcgU2VuZEV4Y2VwdGlvbkV2ZW50UGFyYW1zKGNvbnRleHQsIGRlc2NyaXB0aW9uKSk7Ci19Ci0KLXZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRFeGNlcHRpb25DYWxsYmFjayh2b2lkKiBwYXJhbXMpIHsKLQlTZW5kRXhjZXB0aW9uRXZlbnRQYXJhbXMqIGV2ZW50UGFyYW1zID0gKFNlbmRFeGNlcHRpb25FdmVudFBhcmFtcyopIHBhcmFtczsKLQotCVRDRk91dHB1dFN0cmVhbSBvdXQoJmJyb2FkY2FzdEdyb3VwLT5vdXQpOwotCi0Jb3V0LndyaXRlU3RyaW5nWigiRSIpOwotCW91dC53cml0ZVN0cmluZ1ooUlVOX0NPTlRST0wpOwotCW91dC53cml0ZVN0cmluZ1ooImNvbnRleHRFeGNlcHRpb24iKTsKLQotCW91dC53cml0ZVN0cmluZyhldmVudFBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKSk7Ci0Jb3V0LndyaXRlWmVybygpOwotCi0Jb3V0LndyaXRlQ2hhcmFjdGVyKCciJyk7Ci0Jb3V0LndyaXRlU3RyaW5nKGV2ZW50UGFyYW1zLT5kZXNjcmlwdGlvbi5jX3N0cigpKTsKLQlvdXQud3JpdGVDaGFyYWN0ZXIoJyInKTsKLQlvdXQud3JpdGVaZXJvKCk7Ci0KLQlvdXQud3JpdGVDb21wbGV0ZSgpOwotCi0JTG9nVHJhY2UoIkV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0RXhjZXB0aW9uICIsICJjb250ZXh0IGlkOiAlcyIsCi0JCQlldmVudFBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpKTsKLQotCWRlbGV0ZSBldmVudFBhcmFtczsKLX0KLQotdm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpXcml0ZUNvbnRleHQoQ29udGV4dCYgY29udGV4dCwgVENGT3V0cHV0U3RyZWFtJiBvdXQpIHsKLQlXcml0ZVByb3BlcnRpZXMoY29udGV4dC5HZXRQcm9wZXJ0aWVzKCksIG91dCk7Ci19Ci0KLXZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6V3JpdGVQcm9wZXJ0aWVzKGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMsIFRDRk91dHB1dFN0cmVhbSYgb3V0KSB7Ci0Jb3V0LndyaXRlQ2hhcmFjdGVyKCd7Jyk7Ci0KLQlmb3IgKFByb3BlcnRpZXM6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmJlZ2luKCk7Ci0JCQlpdGVyICE9IHByb3BlcnRpZXMuZW5kKCk7IGl0ZXIrKykKLQl7Ci0JCWlmIChpdGVyICE9IHByb3BlcnRpZXMuYmVnaW4oKSkKLQkJCW91dC53cml0ZUNoYXJhY3RlcignLCcpOwotCi0JCW91dC53cml0ZVN0cmluZyhpdGVyLT5maXJzdCk7Ci0JCW91dC53cml0ZUNoYXJhY3RlcignOicpOwotCQlpdGVyLT5zZWNvbmQtPndyaXRlVG9UQ0ZDaGFubmVsKG91dCk7Ci0JfQotCi0Jb3V0LndyaXRlQ2hhcmFjdGVyKCd9Jyk7Ci19CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMCBOb2tpYSBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAiRXZlbnRDbGllbnROb3RpZmllci5oIg0KKyNpbmNsdWRlICJUQ0ZIZWFkZXJzLmgiDQorI2luY2x1ZGUgIkxvZ2dlci5oIg0KKyNpbmNsdWRlICJBZ2VudFV0aWxzLmgiDQorI2luY2x1ZGUgIlRDRk91dHB1dFN0cmVhbS5oIg0KKyNpbmNsdWRlICJQcm90b2NvbENvbnN0YW50cy5oIg0KKyNpbmNsdWRlICJUaHJlYWRDb250ZXh0LmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorDQorZXh0ZXJuIHZvaWQgZGVidWdfc2Vzc2lvbl9lbmRzKCk7DQorDQorVENGQnJvYWRjYXN0R3JvdXAgKiBFdmVudENsaWVudE5vdGlmaWVyOjpicm9hZGNhc3RHcm91cCA9IE5VTEw7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgUlVOX0NPTlRST0xbXSA9ICJSdW5Db250cm9sIjsNCisNCitTZW5kUmVtb3ZlZEV2ZW50UGFyYW1zOjpTZW5kUmVtb3ZlZEV2ZW50UGFyYW1zKENvbnRleHQqIGNvbnRleHRfLCBib29sIGRlbGV0ZV8pIHsNCisJY29udGV4dCA9IGNvbnRleHRfOw0KKwlkZWxldGVDb250ZXh0ID0gZGVsZXRlXzsNCit9DQorDQorU2VuZEV4ZUV2ZW50UGFyYW1zOjpTZW5kRXhlRXZlbnRQYXJhbXMoQ29udGV4dCogY29udGV4dF8sIHVuc2lnbmVkIGxvbmcgcGNBZGRyZXNzXywgY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllc18pIHsNCisJY29udGV4dCA9IGNvbnRleHRfOw0KKwlwcm9wZXJ0aWVzID0gcHJvcGVydGllc187DQorCXBjQWRkcmVzcyA9IHBjQWRkcmVzc187DQorfQ0KKw0KK1NlbmRFeGNlcHRpb25FdmVudFBhcmFtczo6U2VuZEV4Y2VwdGlvbkV2ZW50UGFyYW1zKENvbnRleHQqIGNvbnRleHRfLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uXykgew0KKwljb250ZXh0ID0gY29udGV4dF87DQorCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25fOw0KK30NCisNCitTZW5kU3VzcGVuZEV2ZW50UGFyYW1zOjpTZW5kU3VzcGVuZEV2ZW50UGFyYW1zKENvbnRleHQqIGNvbnRleHRfLCB1bnNpZ25lZCBsb25nIHBjQWRkcmVzc18sDQorCQljb25zdCBjaGFyKiByZWFzb25fLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZV8pIHsNCisJY29udGV4dCA9IGNvbnRleHRfOw0KKwlwY0FkZHJlc3MgPSBwY0FkZHJlc3NfOw0KKwlyZWFzb24gPSByZWFzb25fOw0KKwltZXNzYWdlID0gbWVzc2FnZV87DQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRBZGRlZChDb250ZXh0KiBjb250ZXh0KSB7DQorCXBvc3RfZXZlbnQoRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRBZGRlZENhbGxiYWNrLCBjb250ZXh0KTsNCit9DQorDQordm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEFkZGVkQ2FsbGJhY2sodm9pZCogY29udGV4dCkgew0KKwlUQ0ZPdXRwdXRTdHJlYW0gb3V0KCZicm9hZGNhc3RHcm91cC0+b3V0KTsNCisNCisJb3V0LndyaXRlU3RyaW5nWigiRSIpOw0KKwlvdXQud3JpdGVTdHJpbmdaKFJVTl9DT05UUk9MKTsNCisJb3V0LndyaXRlU3RyaW5nWigiY29udGV4dEFkZGVkIik7DQorDQorCS8vIDxhcnJheSBvZiBjb250ZXh0IGRhdGE+DQorCW91dC53cml0ZUNoYXJhY3RlcignWycpOw0KKwlXcml0ZUNvbnRleHQoKihDb250ZXh0KikgY29udGV4dCwgb3V0KTsNCisJb3V0LndyaXRlQ2hhcmFjdGVyKCddJyk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlQ29tcGxldGUoKTsNCisNCisJc3RkOjpzdHJpbmcgY29udGV4dElEID0gKChDb250ZXh0KikgY29udGV4dCktPkdldElEKCk7DQorDQorCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEFkZGVkICIsICJjb250ZXh0IGlkOiAlcyIsDQorCQkJY29udGV4dElELmNfc3RyKCkpOw0KKw0KK30NCisNCit2b2lkIEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0UmVtb3ZlZChDb250ZXh0KiBjb250ZXh0LCBib29sIGRlbGV0ZUNvbnRleHQpIHsNCisJU2VuZFJlbW92ZWRFdmVudFBhcmFtcyogcGFyYW1zID0gbmV3IFNlbmRSZW1vdmVkRXZlbnRQYXJhbXMoY29udGV4dCwgZGVsZXRlQ29udGV4dCk7DQorCXBvc3RfZXZlbnQoRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRSZW1vdmVkQ2FsbGJhY2ssIHBhcmFtcyk7DQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRSZW1vdmVkQ2FsbGJhY2sodm9pZCogY29udGV4dCkgew0KKwlTZW5kUmVtb3ZlZEV2ZW50UGFyYW1zKiBwYXJhbXMgPSAoU2VuZFJlbW92ZWRFdmVudFBhcmFtcyopIGNvbnRleHQ7DQorCVRDRk91dHB1dFN0cmVhbSBvdXQoJmJyb2FkY2FzdEdyb3VwLT5vdXQpOw0KKw0KKwlvdXQud3JpdGVTdHJpbmdaKCJFIik7DQorCW91dC53cml0ZVN0cmluZ1ooUlVOX0NPTlRST0wpOw0KKwlvdXQud3JpdGVTdHJpbmdaKCJjb250ZXh0UmVtb3ZlZCIpOw0KKw0KKwkvKiA8YXJyYXkgb2YgY29udGV4dCBkYXRhPiAqLw0KKwlvdXQud3JpdGVDaGFyYWN0ZXIoJ1snKTsNCisJb3V0LndyaXRlU3RyaW5nKHBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpKTsNCisJb3V0LndyaXRlQ2hhcmFjdGVyKCddJyk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlQ29tcGxldGUoKTsNCisNCisJTG9nVHJhY2UoIkV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0UmVtb3ZlZCAiLCAiY29udGV4dCBpZDogJWQiLA0KKwkJCXBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpKTsNCisNCisJaWYgKHBhcmFtcy0+ZGVsZXRlQ29udGV4dCkgew0KKwkJQ29udGV4dElEIGlkID0gcGFyYW1zLT5jb250ZXh0LT5HZXRJRCgpOw0KKwkJZGVsZXRlIHBhcmFtcy0+Y29udGV4dDsgLy8gdGhpcyB3aWxsIGRlbGV0ZSB0aGUgY29udGV4dCBhbmQgYWxsIGl0cyBjaGlsZHJlbg0KKw0KKwkJaW50IHJlbWFpbmVkID0gQ29udGV4dE1hbmFnZXI6OmdldENvbnRleHRzKCkuc2l6ZSgpOw0KKwkJdHJhY2UoTE9HX0NPTlRFWFQsICJDb250ZXh0ICVzIGhhcyBkaWVkLiBcblx0XHROdW1iZXIgb2YgY29udGV4dHMgcmVtYWluZWQ6ICVkXG4iLCBpZC5jX3N0cigpLCByZW1haW5lZCk7DQorDQorCQlpZiAocmVtYWluZWQgPT0gMCkgew0KKwkJCWRlYnVnX3Nlc3Npb25fZW5kcygpOw0KKwkJfQ0KKwl9DQorDQorCWRlbGV0ZSBwYXJhbXM7DQorDQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZEV4ZWN1dGFibGVFdmVudChDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBsb25nIHBjQWRkcmVzcywgY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllcykgeyANCisJcG9zdF9ldmVudChFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kRXhlY3V0YWJsZUV2ZW50Q2FsbGJhY2ssDQorCQkJbmV3IFNlbmRFeGVFdmVudFBhcmFtcyhjb250ZXh0LCBwY0FkZHJlc3MsIHByb3BlcnRpZXMpKTsNCit9DQorDQordm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kRXhlY3V0YWJsZUV2ZW50Q2FsbGJhY2sodm9pZCogcGFyYW1zKSB7DQorCVNlbmRFeGVFdmVudFBhcmFtcyogZXZlbnRQYXJhbXMgPSAoU2VuZEV4ZUV2ZW50UGFyYW1zKikgcGFyYW1zOw0KKw0KKwlUQ0ZPdXRwdXRTdHJlYW0gb3V0KCZicm9hZGNhc3RHcm91cC0+b3V0KTsNCisNCisJb3V0LndyaXRlU3RyaW5nWigiRSIpOw0KKwlvdXQud3JpdGVTdHJpbmdaKFJVTl9DT05UUk9MKTsNCisJb3V0LndyaXRlU3RyaW5nWigiY29udGV4dFN1c3BlbmRlZCIpOw0KKw0KKwlvdXQud3JpdGVTdHJpbmcoZXZlbnRQYXJhbXMtPmNvbnRleHQtPkdldElEKCkpOw0KKwlvdXQud3JpdGVaZXJvKCk7DQorDQorCW91dC53cml0ZUxvbmcoZXZlbnRQYXJhbXMtPnBjQWRkcmVzcyk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlU3RyaW5nKFJFQVNPTl9TSEFSRURMSUIpOw0KKwlvdXQud3JpdGVaZXJvKCk7DQorDQorCVdyaXRlUHJvcGVydGllcyhldmVudFBhcmFtcy0+cHJvcGVydGllcywgb3V0KTsNCisNCisJb3V0LndyaXRlWmVybygpOw0KKw0KKwlvdXQud3JpdGVDb21wbGV0ZSgpOw0KKw0KKyNpZiBFTkFCTEVfVHJhY2UNCisJUHJvcGVydHlWYWx1ZSBleGU7DQorCVByb3BlcnRpZXM6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBldmVudFBhcmFtcy0+cHJvcGVydGllcy5maW5kKFBST1BfTkFNRSk7DQorCWlmIChpdGVyICE9IGV2ZW50UGFyYW1zLT5wcm9wZXJ0aWVzLmVuZCgpKQ0KKwkJZXhlID0gaXRlci0+c2Vjb25kOw0KKwlMb2dUcmFjZSgiRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZEV4ZWN1dGFibGVFdmVudCIsDQorCQkJImNvbnRleHQgaWQ6ICVzIGV4ZWN1dGFibGU6ICVzIGFkZHJlc3M6ICVYIiwNCisJCQlldmVudFBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpLA0KKwkJCWV4ZS5nZXRUeXBlKCkgPT0gUFZUX1VOS05PV04gPyBleGUuZ2V0U3RyaW5nVmFsdWUoKS5jX3N0cigpIDogIjxub25lPiIsDQorCQkJZXZlbnRQYXJhbXMtPnBjQWRkcmVzcyk7DQorI2VuZGlmDQorCQ0KKwlkZWxldGUgZXZlbnRQYXJhbXM7DQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRTdXNwZW5kZWQoQ29udGV4dCogY29udGV4dCwNCisJCXVuc2lnbmVkIGxvbmcgcGNBZGRyZXNzLCBjb25zdCBjaGFyKiByZWFzb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7DQorCXBvc3RfZXZlbnQoRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRTdXNwZW5kZWRDYWxsYmFjaywNCisJCQluZXcgU2VuZFN1c3BlbmRFdmVudFBhcmFtcyhjb250ZXh0LCBwY0FkZHJlc3MsIHJlYXNvbiwgbWVzc2FnZSkpOw0KK30NCisNCit2b2lkIEV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0U3VzcGVuZGVkQ2FsbGJhY2sodm9pZCogcGFyYW1zXykgew0KKwlTZW5kU3VzcGVuZEV2ZW50UGFyYW1zKiBwYXJhbXMgPSAoU2VuZFN1c3BlbmRFdmVudFBhcmFtcyopIHBhcmFtc187DQorCVRDRk91dHB1dFN0cmVhbSBvdXQoJmJyb2FkY2FzdEdyb3VwLT5vdXQpOw0KKw0KKwlvdXQud3JpdGVTdHJpbmdaKCJFIik7DQorCW91dC53cml0ZVN0cmluZ1ooUlVOX0NPTlRST0wpOw0KKwlvdXQud3JpdGVTdHJpbmdaKCJjb250ZXh0U3VzcGVuZGVkIik7DQorDQorCW91dC53cml0ZVN0cmluZyhwYXJhbXMtPmNvbnRleHQtPkdldElEKCkuY19zdHIoKSk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlTG9uZyhwYXJhbXMtPnBjQWRkcmVzcyk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlU3RyaW5nKHBhcmFtcy0+cmVhc29uKTsNCisJb3V0LndyaXRlWmVybygpOw0KKw0KKwlvdXQud3JpdGVDaGFyYWN0ZXIoJ3snKTsNCisJaWYgKHBhcmFtcy0+bWVzc2FnZS5sZW5ndGgoKSA+IDApIHsNCisJCW91dC53cml0ZVN0cmluZygibWVzc2FnZSIpOw0KKwkJb3V0LndyaXRlQ2hhcmFjdGVyKCc6Jyk7DQorCQlvdXQud3JpdGVTdHJpbmcocGFyYW1zLT5tZXNzYWdlLmNfc3RyKCkpOw0KKwl9DQorCW91dC53cml0ZUNoYXJhY3RlcignfScpOw0KKwlvdXQud3JpdGVaZXJvKCk7DQorDQorCW91dC53cml0ZUNvbXBsZXRlKCk7DQorDQorCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZCAiLA0KKwkJCSJjb250ZXh0IGlkOiAlcyBhZGRyZXNzOiAlWCIsIHBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKS5jX3N0cigpLA0KKwkJCXBhcmFtcy0+cGNBZGRyZXNzKTsNCisNCisJZGVsZXRlIHBhcmFtczsNCit9DQorDQorDQorDQordm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEV4Y2VwdGlvbihDb250ZXh0KiBjb250ZXh0LA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7DQorCXBvc3RfZXZlbnQoRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRFeGNlcHRpb25DYWxsYmFjaywNCisJCQluZXcgU2VuZEV4Y2VwdGlvbkV2ZW50UGFyYW1zKGNvbnRleHQsIGRlc2NyaXB0aW9uKSk7DQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRFeGNlcHRpb25DYWxsYmFjayh2b2lkKiBwYXJhbXMpIHsNCisJU2VuZEV4Y2VwdGlvbkV2ZW50UGFyYW1zKiBldmVudFBhcmFtcyA9IChTZW5kRXhjZXB0aW9uRXZlbnRQYXJhbXMqKSBwYXJhbXM7DQorDQorCVRDRk91dHB1dFN0cmVhbSBvdXQoJmJyb2FkY2FzdEdyb3VwLT5vdXQpOw0KKw0KKwlvdXQud3JpdGVTdHJpbmdaKCJFIik7DQorCW91dC53cml0ZVN0cmluZ1ooUlVOX0NPTlRST0wpOw0KKwlvdXQud3JpdGVTdHJpbmdaKCJjb250ZXh0RXhjZXB0aW9uIik7DQorDQorCW91dC53cml0ZVN0cmluZyhldmVudFBhcmFtcy0+Y29udGV4dC0+R2V0SUQoKSk7DQorCW91dC53cml0ZVplcm8oKTsNCisNCisJb3V0LndyaXRlQ2hhcmFjdGVyKCciJyk7DQorCW91dC53cml0ZVN0cmluZyhldmVudFBhcmFtcy0+ZGVzY3JpcHRpb24uY19zdHIoKSk7DQorCW91dC53cml0ZUNoYXJhY3RlcignIicpOw0KKwlvdXQud3JpdGVaZXJvKCk7DQorDQorCW91dC53cml0ZUNvbXBsZXRlKCk7DQorDQorCUxvZ1RyYWNlKCJFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEV4Y2VwdGlvbiAiLCAiY29udGV4dCBpZDogJXMiLA0KKwkJCWV2ZW50UGFyYW1zLT5jb250ZXh0LT5HZXRJRCgpLmNfc3RyKCkpOw0KKw0KKwlkZWxldGUgZXZlbnRQYXJhbXM7DQorfQ0KKw0KK3ZvaWQgRXZlbnRDbGllbnROb3RpZmllcjo6V3JpdGVDb250ZXh0KENvbnRleHQmIGNvbnRleHQsIFRDRk91dHB1dFN0cmVhbSYgb3V0KSB7DQorCVdyaXRlUHJvcGVydGllcyhjb250ZXh0LkdldFByb3BlcnRpZXMoKSwgb3V0KTsNCit9DQorDQordm9pZCBFdmVudENsaWVudE5vdGlmaWVyOjpXcml0ZVByb3BlcnRpZXMoY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllcywgVENGT3V0cHV0U3RyZWFtJiBvdXQpIHsNCisJb3V0LndyaXRlQ2hhcmFjdGVyKCd7Jyk7DQorDQorCWZvciAoUHJvcGVydGllczo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuYmVnaW4oKTsNCisJCQlpdGVyICE9IHByb3BlcnRpZXMuZW5kKCk7IGl0ZXIrKykNCisJew0KKwkJaWYgKGl0ZXIgIT0gcHJvcGVydGllcy5iZWdpbigpKQ0KKwkJCW91dC53cml0ZUNoYXJhY3RlcignLCcpOw0KKw0KKwkJb3V0LndyaXRlU3RyaW5nKGl0ZXItPmZpcnN0KTsNCisJCW91dC53cml0ZUNoYXJhY3RlcignOicpOw0KKwkJaXRlci0+c2Vjb25kLndyaXRlVG9UQ0ZDaGFubmVsKG91dCk7DQorCX0NCisNCisJb3V0LndyaXRlQ2hhcmFjdGVyKCd9Jyk7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L0xvZ2dpbmdTZXJ2aWNlLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L0xvZ2dpbmdTZXJ2aWNlLmNwcAppbmRleCAyODYzYTUxLi45YmMyZjBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Mb2dnaW5nU2VydmljZS5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvTG9nZ2luZ1NlcnZpY2UuY3BwCkBAIC0xLDE5OCArMSwxOTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIkxvZ2dpbmdTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiRGVidWdNb25pdG9yLmgiCi0jaW5jbHVkZSAiQ29udGV4dE1hbmFnZXIuaCIKLSNpbmNsdWRlICJUQ0ZDaGFubmVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICogc1NlcnZpY2VOYW1lID0gIkxvZ2dpbmciOwotCi0vLyBJRCBvZiB0aGUgY29uc29sZSB0byB3cml0ZSBkZWJ1ZyBwcm9jZXNzIG91dHB1dCB0bwotc3RhdGljIGNvbnN0IGNoYXIgKiBzV2luZG93c0NvbnNvbGVJRCA9ICJQcm9ncmFtT3V0cHV0Q29uc29sZUxvZ2dlciI7Ci0vLyBOdW1iZXIgb2YgbGlzdGVuZXJzIHRvIHRoZSBzZXJ2aWNlIHV0aWxpemluZyAnc1dpbmRvd3NDb25zb2xlSUQnLgotaW50IExvZ2dpbmdTZXJ2aWNlOjpudW1Db25zb2xlTGlzdGVuZXJzID0gMDsKLQotLyoqCi0qIExvZ2dpbmdTZXJ2aWNlOiBDb21tdW5pY2F0ZXMgd2l0aCBsb2dnaW5nIGhvc3RzIGFuZCBhbGxvd3MgdGhlIGFnZW50IHRvIHNlbmQgYmFjayBtZXNzYWdlcwotKiB0byBiZSBwcmludGVkIHRvIGEgY29uc29sZSBvciBvdGhlcndpc2UgcmVkaXJlY3RlZC4KLSovCi1Mb2dnaW5nU2VydmljZTo6TG9nZ2luZ1NlcnZpY2UoUHJvdG9jb2wgKiBwcm90bykgOgotCVRDRlNlcnZpY2UocHJvdG8pIHsKLQlBZGRDb21tYW5kKCJhZGRMaXN0ZW5lciIsIGNvbW1hbmRfYWRkTGlzdGVuZXIpOwotCUFkZENvbW1hbmQoInJlbW92ZUxpc3RlbmVyIiwgY29tbWFuZF9yZW1vdmVMaXN0ZW5lcik7Ci19Ci0KLUxvZ2dpbmdTZXJ2aWNlOjp+TG9nZ2luZ1NlcnZpY2Uodm9pZCkgewotfQotCi1jb25zdCBjaGFyKiBMb2dnaW5nU2VydmljZTo6R2V0TmFtZSgpIHsKLQlyZXR1cm4gc1NlcnZpY2VOYW1lOwotfQotCi1jb25zdCBjaGFyICogTG9nZ2luZ1NlcnZpY2U6OkdldFdpbmRvd3NDb25zb2xlSUQoKSB7Ci0JcmV0dXJuIHNXaW5kb3dzQ29uc29sZUlEOwotfQotCi12b2lkIExvZ2dpbmdTZXJ2aWNlOjpjb21tYW5kX2FkZExpc3RlbmVyKGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsKLQotCVRDRkNoYW5uZWwgdGNmKGMpOwotCXN0ZDo6c3RyaW5nIGlkID0gdGNmLnJlYWRTdHJpbmcoKTsKLQl0Y2YucmVhZFplcm8oKTsKLQl0Y2YucmVhZENvbXBsZXRlKCk7Ci0JCi0JaWYgKCBpZC5jb21wYXJlKHNXaW5kb3dzQ29uc29sZUlEKSA9PSAwICkKLQkJbnVtQ29uc29sZUxpc3RlbmVycysrOwotCQotCXNlbmRPSyh0b2tlbiwgYyk7Ci19Ci0KLQotdm9pZCBMb2dnaW5nU2VydmljZTo6Y29tbWFuZF9yZW1vdmVMaXN0ZW5lcihjb25zdCBjaGFyICogdG9rZW4sIENoYW5uZWwgKiBjKSB7Ci0JVENGQ2hhbm5lbCB0Y2YoYyk7Ci0Jc3RkOjpzdHJpbmcgaWQgPSB0Y2YucmVhZFN0cmluZygpOwotCXRjZi5yZWFkWmVybygpOwotCi0JaWYgKCBpZC5jb21wYXJlKHNXaW5kb3dzQ29uc29sZUlEKSA9PSAwICkKLQkJbnVtQ29uc29sZUxpc3RlbmVycy0tOwotCi0Jc2VuZE9LKHRva2VuLCBjKTsKLX0KLQotdm9pZCBMb2dnaW5nU2VydmljZTo6c2VuZE9LKGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpCi17Ci0JLy8gU2VuZCBPSyBtZXNzYWdlCi0JVENGQ2hhbm5lbCB0Y2YoYyk7Ci0JdGNmLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgMCk7Ci19Ci0KLQotc3RydWN0IExvZ2dpbmdNZXNzYWdlIHsKLQlDaGFubmVsKiBjaGFubmVsOwotCXN0ZDo6c3RyaW5nIHN0cjsKLQljb25zdCBjaGFyKiBjb25zb2xlSUQ7Ci0JCi0JTG9nZ2luZ01lc3NhZ2UoQ2hhbm5lbCogY2hhbm5lbF8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJfLCBjb25zdCBjaGFyKiBjb25zb2xlSURfKSAKLQkJOiBjaGFubmVsKGNoYW5uZWxfKSwgc3RyKHN0cl8pLCBjb25zb2xlSUQoY29uc29sZUlEXykgCi0JeyB9Ci19OwotCi1zdHJ1Y3QgRGlhbG9nTWVzc2FnZSB7Ci0JQ2hhbm5lbCogY2hhbm5lbDsKLQlJU3RhdHVzOjpTZXZlcml0eSBzZXZlcml0eTsKLQlzdGQ6OnN0cmluZyBzdW1tYXJ5OwotCXN0ZDo6c3RyaW5nIGRldGFpbHM7Ci0KLQlEaWFsb2dNZXNzYWdlKENoYW5uZWwqIGNoYW5uZWxfLCBjb25zdCBJU3RhdHVzOjpTZXZlcml0eSBzZXZlcml0eSwKLQkJCQkJY29uc3Qgc3RkOjpzdHJpbmcmIHN1bW1hcnlfLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV0YWlsc18pCi0JICA6IGNoYW5uZWwoY2hhbm5lbF8pLCBzZXZlcml0eShzZXZlcml0eSksIHN1bW1hcnkoc3VtbWFyeV8pLCBkZXRhaWxzKGRldGFpbHNfKQotCXsgfQotfTsKLQotc3RhdGljIHZvaWQgZW1pdF9sb2dnaW5nX21lc3NhZ2Uodm9pZCAqZGF0YSkgewotCUxvZ2dpbmdNZXNzYWdlKiBtID0gKExvZ2dpbmdNZXNzYWdlKikgZGF0YTsKLQkKLQlUQ0ZDaGFubmVsIHRjZihtLT5jaGFubmVsKTsKLQotCS8vIHdyaXRlIHRvIHRoZSBjb25zb2xlCi0JdGNmLndyaXRlU3RyaW5nWigiRSIpOwotCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsKLQl0Y2Yud3JpdGVTdHJpbmdaKCJ3cml0ZSIpOwotCi0JLyogPGFycmF5IG9mIGNvbnRleHQgZGF0YT4gKi8KLQl0Y2Yud3JpdGVTdHJpbmcobS0+Y29uc29sZUlEKTsKLQl0Y2Yud3JpdGVaZXJvKCk7Ci0JdGNmLndyaXRlU3RyaW5nKG0tPnN0cik7Ci0JdGNmLndyaXRlWmVybygpOwotCXRjZi53cml0ZUNvbXBsZXRlKCk7Ci0JCi0JZGVsZXRlIG07Ci19Ci0KLQotc3RhdGljIHZvaWQgZW1pdF9sb2dnaW5nX21lc3NhZ2Vfd2l0aF9uZXdsaW5lKHZvaWQgKmRhdGEpIHsKLQlMb2dnaW5nTWVzc2FnZSogbSA9IChMb2dnaW5nTWVzc2FnZSopIGRhdGE7Ci0KLQlUQ0ZDaGFubmVsIHRjZihtLT5jaGFubmVsKTsKLQotCS8vIHdyaXRlIHRvIHRoZSBjb25zb2xlCi0JdGNmLndyaXRlU3RyaW5nWigiRSIpOwotCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsKLQl0Y2Yud3JpdGVTdHJpbmdaKCJ3cml0ZWxuIik7Ci0KLQkvKiA8YXJyYXkgb2YgY29udGV4dCBkYXRhPiAqLwotCXRjZi53cml0ZVN0cmluZyhtLT5jb25zb2xlSUQpOwotCXRjZi53cml0ZVplcm8oKTsKLQl0Y2Yud3JpdGVTdHJpbmcobS0+c3RyKTsKLQl0Y2Yud3JpdGVaZXJvKCk7Ci0JdGNmLndyaXRlQ29tcGxldGUoKTsKLQotCWRlbGV0ZSBtOwotfQotCi0KLXN0YXRpYyB2b2lkIGVtaXRfZGlhbG9nX21lc3NhZ2Uodm9pZCAqZGF0YSkgewotCURpYWxvZ01lc3NhZ2UqIG0gPSAoRGlhbG9nTWVzc2FnZSopIGRhdGE7Ci0KLQlUQ0ZDaGFubmVsIHRjZihtLT5jaGFubmVsKTsKLQotCS8vIHdyaXRlIHRvIHRoZSBjb25zb2xlCi0JdGNmLndyaXRlU3RyaW5nWigiRSIpOwotCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsKLQl0Y2Yud3JpdGVTdHJpbmdaKCJkaWFsb2ciKTsKLQotCS8qIDxhcnJheSBvZiBjb250ZXh0IGRhdGE+ICovCi0JdGNmLndyaXRlU3RyaW5nKExvZ2dpbmdTZXJ2aWNlOjpHZXRXaW5kb3dzQ29uc29sZUlEKCkpOwotCXRjZi53cml0ZVplcm8oKTsKLQl0Y2Yud3JpdGVMb25nKChsb25nKW0tPnNldmVyaXR5KTsKLQl0Y2Yud3JpdGVaZXJvKCk7Ci0JdGNmLndyaXRlU3RyaW5nKG0tPnN1bW1hcnkpOwotCXRjZi53cml0ZVplcm8oKTsKLQl0Y2Yud3JpdGVTdHJpbmcobS0+ZGV0YWlscyk7Ci0JdGNmLndyaXRlWmVybygpOwotCXRjZi53cml0ZUNvbXBsZXRlKCk7Ci0KLQlkZWxldGUgbTsKLX0KLQotCi12b2lkIExvZ2dpbmdTZXJ2aWNlOjpXcml0ZUxvZ2dpbmdNZXNzYWdlKENoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IGNoYXIgKmNvbnNvbGVJRCkKLXsKLQljb25zdCBjaGFyICp3aW5kb3dzQ29uc29sZUlEID0gR2V0V2luZG93c0NvbnNvbGVJRCgpOwotCS8vIG9ubHkgc2VuZCBtZXNzYWdlcyB0byB0aGUgcHJvcGVyIGNvbnNvbGUgc2VydmljZSBhbmQgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lcgotCWlmICggbnVtQ29uc29sZUxpc3RlbmVycyA+IDAgJiYgc3RyY21wKHdpbmRvd3NDb25zb2xlSUQsIGNvbnNvbGVJRCkgPT0gMCApCi0JewotCQlMb2dnaW5nTWVzc2FnZSogbWVzc2FnZSA9IG5ldyBMb2dnaW5nTWVzc2FnZShjaGFubmVsLCBzdHIsIGNvbnNvbGVJRCk7Ci0JCXBvc3RfZXZlbnQoZW1pdF9sb2dnaW5nX21lc3NhZ2UsIG1lc3NhZ2UpOwotCX0KLX0KLQotLyoqIHNpbmNlIDIuMCAqLwotdm9pZCBMb2dnaW5nU2VydmljZTo6V3JpdGVMbkxvZ2dpbmdNZXNzYWdlKENoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IGNoYXIgKmNvbnNvbGVJRCkKLXsKLQljb25zdCBjaGFyICp3aW5kb3dzQ29uc29sZUlEID0gR2V0V2luZG93c0NvbnNvbGVJRCgpOwotCS8vIG9ubHkgc2VuZCBtZXNzYWdlcyB0byB0aGUgcHJvcGVyIGNvbnNvbGUgc2VydmljZSBhbmQgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lcgotCWlmICggbnVtQ29uc29sZUxpc3RlbmVycyA+IDAgJiYgc3RyY21wKHdpbmRvd3NDb25zb2xlSUQsIGNvbnNvbGVJRCkgPT0gMCApCi0JewotCQlMb2dnaW5nTWVzc2FnZSogbWVzc2FnZSA9IG5ldyBMb2dnaW5nTWVzc2FnZShjaGFubmVsLCBzdHIsIGNvbnNvbGVJRCk7Ci0JCXBvc3RfZXZlbnQoZW1pdF9sb2dnaW5nX21lc3NhZ2Vfd2l0aF9uZXdsaW5lLCBtZXNzYWdlKTsKLQl9Ci19Ci0KLS8qKiBzaW5jZSAyLjAgKi8KLXZvaWQgTG9nZ2luZ1NlcnZpY2U6OkRpYWxvZyhDaGFubmVsICpjaGFubmVsLCBJU3RhdHVzOjpTZXZlcml0eSBzZXZlcml0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1bW1hcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXRhaWxzKQotewotCURpYWxvZ01lc3NhZ2UqIG1lc3NhZ2UgPSBuZXcgRGlhbG9nTWVzc2FnZShjaGFubmVsLCBzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlscyk7Ci0JcG9zdF9ldmVudChlbWl0X2RpYWxvZ19tZXNzYWdlLCBtZXNzYWdlKTsKLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdHJpbmc+DQorI2luY2x1ZGUgPHZlY3Rvcj4NCisNCisjaW5jbHVkZSAiTG9nZ2luZ1NlcnZpY2UuaCINCisjaW5jbHVkZSAiRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorI2luY2x1ZGUgIlRDRkNoYW5uZWwuaCINCisNCitzdGF0aWMgY29uc3QgY2hhciAqIHNTZXJ2aWNlTmFtZSA9ICJMb2dnaW5nIjsNCisNCisvLyBJRCBvZiB0aGUgY29uc29sZSB0byB3cml0ZSBkZWJ1ZyBwcm9jZXNzIG91dHB1dCB0bw0KK3N0YXRpYyBjb25zdCBjaGFyICogc1dpbmRvd3NDb25zb2xlSUQgPSAiUHJvZ3JhbU91dHB1dENvbnNvbGVMb2dnZXIiOw0KKy8vIE51bWJlciBvZiBsaXN0ZW5lcnMgdG8gdGhlIHNlcnZpY2UgdXRpbGl6aW5nICdzV2luZG93c0NvbnNvbGVJRCcuDQoraW50IExvZ2dpbmdTZXJ2aWNlOjpudW1Db25zb2xlTGlzdGVuZXJzID0gMDsNCisNCisvKioNCisqIExvZ2dpbmdTZXJ2aWNlOiBDb21tdW5pY2F0ZXMgd2l0aCBsb2dnaW5nIGhvc3RzIGFuZCBhbGxvd3MgdGhlIGFnZW50IHRvIHNlbmQgYmFjayBtZXNzYWdlcw0KKyogdG8gYmUgcHJpbnRlZCB0byBhIGNvbnNvbGUgb3Igb3RoZXJ3aXNlIHJlZGlyZWN0ZWQuDQorKi8NCitMb2dnaW5nU2VydmljZTo6TG9nZ2luZ1NlcnZpY2UoUHJvdG9jb2wgKiBwcm90bykgOg0KKwlUQ0ZTZXJ2aWNlKHByb3RvKSB7DQorCUFkZENvbW1hbmQoImFkZExpc3RlbmVyIiwgY29tbWFuZF9hZGRMaXN0ZW5lcik7DQorCUFkZENvbW1hbmQoInJlbW92ZUxpc3RlbmVyIiwgY29tbWFuZF9yZW1vdmVMaXN0ZW5lcik7DQorfQ0KKw0KK0xvZ2dpbmdTZXJ2aWNlOjp+TG9nZ2luZ1NlcnZpY2Uodm9pZCkgew0KK30NCisNCitjb25zdCBjaGFyKiBMb2dnaW5nU2VydmljZTo6R2V0TmFtZSgpIHsNCisJcmV0dXJuIHNTZXJ2aWNlTmFtZTsNCit9DQorDQorY29uc3QgY2hhciAqIExvZ2dpbmdTZXJ2aWNlOjpHZXRXaW5kb3dzQ29uc29sZUlEKCkgew0KKwlyZXR1cm4gc1dpbmRvd3NDb25zb2xlSUQ7DQorfQ0KKw0KK3ZvaWQgTG9nZ2luZ1NlcnZpY2U6OmNvbW1hbmRfYWRkTGlzdGVuZXIoY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgew0KKw0KKwlUQ0ZDaGFubmVsIHRjZihjKTsNCisJc3RkOjpzdHJpbmcgaWQgPSB0Y2YucmVhZFN0cmluZygpOw0KKwl0Y2YucmVhZFplcm8oKTsNCisJdGNmLnJlYWRDb21wbGV0ZSgpOw0KKwkNCisJaWYgKCBpZC5jb21wYXJlKHNXaW5kb3dzQ29uc29sZUlEKSA9PSAwICkNCisJCW51bUNvbnNvbGVMaXN0ZW5lcnMrKzsNCisJDQorCXNlbmRPSyh0b2tlbiwgYyk7DQorfQ0KKw0KKw0KK3ZvaWQgTG9nZ2luZ1NlcnZpY2U6OmNvbW1hbmRfcmVtb3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgew0KKwlUQ0ZDaGFubmVsIHRjZihjKTsNCisJc3RkOjpzdHJpbmcgaWQgPSB0Y2YucmVhZFN0cmluZygpOw0KKwl0Y2YucmVhZFplcm8oKTsNCisJdGNmLnJlYWRDb21wbGV0ZSgpOw0KKw0KKwlpZiAoIGlkLmNvbXBhcmUoc1dpbmRvd3NDb25zb2xlSUQpID09IDAgKQ0KKwkJbnVtQ29uc29sZUxpc3RlbmVycy0tOw0KKw0KKwlzZW5kT0sodG9rZW4sIGMpOw0KK30NCisNCit2b2lkIExvZ2dpbmdTZXJ2aWNlOjpzZW5kT0soY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykNCit7DQorCS8vIFNlbmQgT0sgbWVzc2FnZQ0KKwlUQ0ZDaGFubmVsIHRjZihjKTsNCisJdGNmLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgMCk7DQorfQ0KKw0KKw0KK3N0cnVjdCBMb2dnaW5nTWVzc2FnZSB7DQorCUNoYW5uZWwqIGNoYW5uZWw7DQorCXN0ZDo6c3RyaW5nIHN0cjsNCisJY29uc3QgY2hhciogY29uc29sZUlEOw0KKwkNCisJTG9nZ2luZ01lc3NhZ2UoQ2hhbm5lbCogY2hhbm5lbF8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJfLCBjb25zdCBjaGFyKiBjb25zb2xlSURfKSANCisJCTogY2hhbm5lbChjaGFubmVsXyksIHN0cihzdHJfKSwgY29uc29sZUlEKGNvbnNvbGVJRF8pIA0KKwl7IH0NCit9Ow0KKw0KK3N0cnVjdCBEaWFsb2dNZXNzYWdlIHsNCisJQ2hhbm5lbCogY2hhbm5lbDsNCisJSVN0YXR1czo6U2V2ZXJpdHkgc2V2ZXJpdHk7DQorCXN0ZDo6c3RyaW5nIHN1bW1hcnk7DQorCXN0ZDo6c3RyaW5nIGRldGFpbHM7DQorDQorCURpYWxvZ01lc3NhZ2UoQ2hhbm5lbCogY2hhbm5lbF8sIGNvbnN0IElTdGF0dXM6OlNldmVyaXR5IHNldmVyaXR5LA0KKwkJCQkJY29uc3Qgc3RkOjpzdHJpbmcmIHN1bW1hcnlfLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV0YWlsc18pDQorCSAgOiBjaGFubmVsKGNoYW5uZWxfKSwgc2V2ZXJpdHkoc2V2ZXJpdHkpLCBzdW1tYXJ5KHN1bW1hcnlfKSwgZGV0YWlscyhkZXRhaWxzXykNCisJeyB9DQorfTsNCisNCitzdGF0aWMgdm9pZCBlbWl0X2xvZ2dpbmdfbWVzc2FnZSh2b2lkICpkYXRhKSB7DQorCUxvZ2dpbmdNZXNzYWdlKiBtID0gKExvZ2dpbmdNZXNzYWdlKikgZGF0YTsNCisJDQorCVRDRkNoYW5uZWwgdGNmKG0tPmNoYW5uZWwpOw0KKw0KKwkvLyB3cml0ZSB0byB0aGUgY29uc29sZQ0KKwl0Y2Yud3JpdGVTdHJpbmdaKCJFIik7DQorCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsNCisJdGNmLndyaXRlU3RyaW5nWigid3JpdGUiKTsNCisNCisJLyogPGFycmF5IG9mIGNvbnRleHQgZGF0YT4gKi8NCisJdGNmLndyaXRlU3RyaW5nKG0tPmNvbnNvbGVJRCk7DQorCXRjZi53cml0ZVplcm8oKTsNCisJdGNmLndyaXRlU3RyaW5nKG0tPnN0cik7DQorCXRjZi53cml0ZVplcm8oKTsNCisJdGNmLndyaXRlQ29tcGxldGUoKTsNCisJDQorCWRlbGV0ZSBtOw0KK30NCisNCisNCitzdGF0aWMgdm9pZCBlbWl0X2xvZ2dpbmdfbWVzc2FnZV93aXRoX25ld2xpbmUodm9pZCAqZGF0YSkgew0KKwlMb2dnaW5nTWVzc2FnZSogbSA9IChMb2dnaW5nTWVzc2FnZSopIGRhdGE7DQorDQorCVRDRkNoYW5uZWwgdGNmKG0tPmNoYW5uZWwpOw0KKw0KKwkvLyB3cml0ZSB0byB0aGUgY29uc29sZQ0KKwl0Y2Yud3JpdGVTdHJpbmdaKCJFIik7DQorCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsNCisJdGNmLndyaXRlU3RyaW5nWigid3JpdGVsbiIpOw0KKw0KKwkvKiA8YXJyYXkgb2YgY29udGV4dCBkYXRhPiAqLw0KKwl0Y2Yud3JpdGVTdHJpbmcobS0+Y29uc29sZUlEKTsNCisJdGNmLndyaXRlWmVybygpOw0KKwl0Y2Yud3JpdGVTdHJpbmcobS0+c3RyKTsNCisJdGNmLndyaXRlWmVybygpOw0KKwl0Y2Yud3JpdGVDb21wbGV0ZSgpOw0KKw0KKwlkZWxldGUgbTsNCit9DQorDQorDQorc3RhdGljIHZvaWQgZW1pdF9kaWFsb2dfbWVzc2FnZSh2b2lkICpkYXRhKSB7DQorCURpYWxvZ01lc3NhZ2UqIG0gPSAoRGlhbG9nTWVzc2FnZSopIGRhdGE7DQorDQorCVRDRkNoYW5uZWwgdGNmKG0tPmNoYW5uZWwpOw0KKw0KKwkvLyB3cml0ZSB0byB0aGUgY29uc29sZQ0KKwl0Y2Yud3JpdGVTdHJpbmdaKCJFIik7DQorCXRjZi53cml0ZVN0cmluZ1ooc1NlcnZpY2VOYW1lKTsNCisJdGNmLndyaXRlU3RyaW5nWigiZGlhbG9nIik7DQorDQorCS8qIDxhcnJheSBvZiBjb250ZXh0IGRhdGE+ICovDQorCXRjZi53cml0ZVN0cmluZyhMb2dnaW5nU2VydmljZTo6R2V0V2luZG93c0NvbnNvbGVJRCgpKTsNCisJdGNmLndyaXRlWmVybygpOw0KKwl0Y2Yud3JpdGVMb25nKChsb25nKW0tPnNldmVyaXR5KTsNCisJdGNmLndyaXRlWmVybygpOw0KKwl0Y2Yud3JpdGVTdHJpbmcobS0+c3VtbWFyeSk7DQorCXRjZi53cml0ZVplcm8oKTsNCisJdGNmLndyaXRlU3RyaW5nKG0tPmRldGFpbHMpOw0KKwl0Y2Yud3JpdGVaZXJvKCk7DQorCXRjZi53cml0ZUNvbXBsZXRlKCk7DQorDQorCWRlbGV0ZSBtOw0KK30NCisNCisNCit2b2lkIExvZ2dpbmdTZXJ2aWNlOjpXcml0ZUxvZ2dpbmdNZXNzYWdlKENoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IGNoYXIgKmNvbnNvbGVJRCkNCit7DQorCWNvbnN0IGNoYXIgKndpbmRvd3NDb25zb2xlSUQgPSBHZXRXaW5kb3dzQ29uc29sZUlEKCk7DQorCS8vIG9ubHkgc2VuZCBtZXNzYWdlcyB0byB0aGUgcHJvcGVyIGNvbnNvbGUgc2VydmljZSBhbmQgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lcg0KKwlpZiAoIG51bUNvbnNvbGVMaXN0ZW5lcnMgPiAwICYmIHN0cmNtcCh3aW5kb3dzQ29uc29sZUlELCBjb25zb2xlSUQpID09IDAgKQ0KKwl7DQorCQlMb2dnaW5nTWVzc2FnZSogbWVzc2FnZSA9IG5ldyBMb2dnaW5nTWVzc2FnZShjaGFubmVsLCBzdHIsIGNvbnNvbGVJRCk7DQorCQlwb3N0X2V2ZW50KGVtaXRfbG9nZ2luZ19tZXNzYWdlLCBtZXNzYWdlKTsNCisJfQ0KK30NCisNCisvKiogc2luY2UgMi4wICovDQordm9pZCBMb2dnaW5nU2VydmljZTo6V3JpdGVMbkxvZ2dpbmdNZXNzYWdlKENoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IGNoYXIgKmNvbnNvbGVJRCkNCit7DQorCWNvbnN0IGNoYXIgKndpbmRvd3NDb25zb2xlSUQgPSBHZXRXaW5kb3dzQ29uc29sZUlEKCk7DQorCS8vIG9ubHkgc2VuZCBtZXNzYWdlcyB0byB0aGUgcHJvcGVyIGNvbnNvbGUgc2VydmljZSBhbmQgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBsaXN0ZW5lcg0KKwlpZiAoIG51bUNvbnNvbGVMaXN0ZW5lcnMgPiAwICYmIHN0cmNtcCh3aW5kb3dzQ29uc29sZUlELCBjb25zb2xlSUQpID09IDAgKQ0KKwl7DQorCQlMb2dnaW5nTWVzc2FnZSogbWVzc2FnZSA9IG5ldyBMb2dnaW5nTWVzc2FnZShjaGFubmVsLCBzdHIsIGNvbnNvbGVJRCk7DQorCQlwb3N0X2V2ZW50KGVtaXRfbG9nZ2luZ19tZXNzYWdlX3dpdGhfbmV3bGluZSwgbWVzc2FnZSk7DQorCX0NCit9DQorDQorLyoqIHNpbmNlIDIuMCAqLw0KK3ZvaWQgTG9nZ2luZ1NlcnZpY2U6OkRpYWxvZyhDaGFubmVsICpjaGFubmVsLCBJU3RhdHVzOjpTZXZlcml0eSBzZXZlcml0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1bW1hcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXRhaWxzKQ0KK3sNCisJRGlhbG9nTWVzc2FnZSogbWVzc2FnZSA9IG5ldyBEaWFsb2dNZXNzYWdlKGNoYW5uZWwsIHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWxzKTsNCisJcG9zdF9ldmVudChlbWl0X2RpYWxvZ19tZXNzYWdlLCBtZXNzYWdlKTsNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvUHJvcGVydHlWYWx1ZS5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Qcm9wZXJ0eVZhbHVlLmNwcAppbmRleCA3NTNlOWUyLi5jYjA2NzU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Qcm9wZXJ0eVZhbHVlLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Qcm9wZXJ0eVZhbHVlLmNwcApAQCAtMSw5MSArMSwxMTggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbi4gRmViIDI2LCAyMDEwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgIlByb3BlcnR5VmFsdWUuaCIKLQotUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZSgpIHt9Ci0KLVByb3BlcnR5VmFsdWU6OlByb3BlcnR5VmFsdWUoUHJvcGVydHlWYWx1ZSAmc3JjKSB7Ci0JdHlwZSA9IHNyYy50eXBlOwotCWlmICh0eXBlID09IFBWVF9JTlQpCi0JCXYudl9pbnQgPSBzcmMudi52X2ludDsKLQllbHNlIGlmICh0eXBlID09IFBWVF9VTE9OR19JTlQpCi0JCXYudl9pbnQgPSBzcmMudi52X3Vsb25nX2ludDsKLQllbHNlIGlmICh0eXBlID09IFBWVF9CT09MKQotCQl2LnZfYm9vbCA9IHNyYy52LnZfYm9vbDsKLQllbHNlIGlmICh0eXBlID09IFBWVF9TVFJJTkcpCi0JCXZfc3RyaW5nID0gc3JjLnZfc3RyaW5nOwkvLyBjb3B5ICEKLX0KLQotUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZShpbnQgeCkgewotCXR5cGUgPSBQVlRfSU5UOwotCXYudl9pbnQgPSB4OwotfQotUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZSh1bnNpZ25lZCBsb25nIGludCB4KSB7Ci0JdHlwZSA9IFBWVF9VTE9OR19JTlQ7Ci0Jdi52X3Vsb25nX2ludCA9IHg7Ci19Ci0KLVByb3BlcnR5VmFsdWU6OlByb3BlcnR5VmFsdWUoYm9vbCB4KSB7Ci0JdHlwZSA9IFBWVF9CT09MOwotCXYudl9ib29sID0geDsKLX0KLQotUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZShjb25zdCBjaGFyICp4KSB7Ci0JdHlwZSA9IFBWVF9TVFJJTkc7Ci0Jdl9zdHJpbmcgPSB4OwotfQotCi1Qcm9wZXJ0eVZhbHVlOjpQcm9wZXJ0eVZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB4KSB7Ci0JdHlwZSA9IFBWVF9TVFJJTkc7Ci0Jdl9zdHJpbmcgPSB4OwotfQotCi1Qcm9wZXJ0eVZhbHVlOjp+UHJvcGVydHlWYWx1ZSgpIHsKLX0KLQotCi1Qcm9wZXJ0eVR5cGUgUHJvcGVydHlWYWx1ZTo6Z2V0VHlwZSgpIHsKLQlyZXR1cm4gdHlwZTsKLX0KLQotaW50IFByb3BlcnR5VmFsdWU6OmdldEludFZhbHVlKCkgewotCXJldHVybiB2LnZfaW50OwotfQotCi11bnNpZ25lZCBsb25nIGludCBQcm9wZXJ0eVZhbHVlOjpnZXRVbnNpZ25lZExvbmdJbnRWYWx1ZSgpIHsKLQlyZXR1cm4gdi52X3Vsb25nX2ludDsKLX0KLQotYm9vbCBQcm9wZXJ0eVZhbHVlOjpnZXRCb29sVmFsdWUoKSB7Ci0JcmV0dXJuIHYudl9ib29sOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyYgUHJvcGVydHlWYWx1ZTo6Z2V0U3RyaW5nVmFsdWUoKSB7Ci0JcmV0dXJuIHZfc3RyaW5nOwotfQotCi12b2lkIFByb3BlcnR5VmFsdWU6OndyaXRlVG9UQ0ZDaGFubmVsKFRDRk91dHB1dFN0cmVhbSYgdGNmX3N0cmVhbSkgewotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgUFZUX0lOVDoKLQkJdGNmX3N0cmVhbS53cml0ZUxvbmcodi52X2ludCk7IGJyZWFrOwotCWNhc2UgUFZUX1VMT05HX0lOVDoKLQkJdGNmX3N0cmVhbS53cml0ZVVMb25nKHYudl91bG9uZ19pbnQpOyBicmVhazsKLQljYXNlIFBWVF9CT09MOgotCQl0Y2Zfc3RyZWFtLndyaXRlQm9vbGVhbih2LnZfYm9vbCk7IGJyZWFrOwotCWNhc2UgUFZUX1NUUklORzoKLQkJdGNmX3N0cmVhbS53cml0ZVN0cmluZyh2X3N0cmluZyk7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCWFzc2VydChmYWxzZSk7Ci0JCWJyZWFrOwotCX0KLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLiBGZWIgMjYsIDIwMTANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8YXNzZXJ0Lmg+DQorI2luY2x1ZGUgIlByb3BlcnR5VmFsdWUuaCINCisjaW5jbHVkZSAiTG9nZ2VyLmgiDQorDQorUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZSgpIHsNCisJdHlwZSA9IFBWVF9VTktOT1dOOw0KK30NCisNCitQcm9wZXJ0eVZhbHVlOjpQcm9wZXJ0eVZhbHVlKGNvbnN0IFByb3BlcnR5VmFsdWUgJnNyYykgew0KKwl0eXBlID0gc3JjLnR5cGU7DQorCWlmICh0eXBlID09IFBWVF9JTlQpDQorCQl2LnZfaW50ID0gc3JjLnYudl9pbnQ7DQorCWVsc2UgaWYgKHR5cGUgPT0gUFZUX1VMT05HX0lOVCkNCisJCXYudl9pbnQgPSBzcmMudi52X3Vsb25nX2ludDsNCisJZWxzZSBpZiAodHlwZSA9PSBQVlRfQk9PTCkNCisJCXYudl9ib29sID0gc3JjLnYudl9ib29sOw0KKwllbHNlIGlmICh0eXBlID09IFBWVF9TVFJJTkcpDQorCQl2X3N0cmluZyA9IHNyYy52X3N0cmluZzsJLy8gY29weSAhDQorfQ0KKw0KK1Byb3BlcnR5VmFsdWU6OlByb3BlcnR5VmFsdWUoaW50IHgpIHsNCisJdHlwZSA9IFBWVF9JTlQ7DQorCXYudl9pbnQgPSB4Ow0KK30NCitQcm9wZXJ0eVZhbHVlOjpQcm9wZXJ0eVZhbHVlKHVuc2lnbmVkIGxvbmcgaW50IHgpIHsNCisJdHlwZSA9IFBWVF9VTE9OR19JTlQ7DQorCXYudl91bG9uZ19pbnQgPSB4Ow0KK30NCisNCitQcm9wZXJ0eVZhbHVlOjpQcm9wZXJ0eVZhbHVlKGJvb2wgeCkgew0KKwl0eXBlID0gUFZUX0JPT0w7DQorCXYudl9ib29sID0geDsNCit9DQorDQorUHJvcGVydHlWYWx1ZTo6UHJvcGVydHlWYWx1ZShjb25zdCBjaGFyICp4KSB7DQorCXR5cGUgPSBQVlRfU1RSSU5HOw0KKwl2X3N0cmluZyA9IHg7DQorfQ0KKw0KK1Byb3BlcnR5VmFsdWU6OlByb3BlcnR5VmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHgpIHsNCisJdHlwZSA9IFBWVF9TVFJJTkc7DQorCXZfc3RyaW5nID0geDsNCit9DQorDQorUHJvcGVydHlUeXBlIFByb3BlcnR5VmFsdWU6OmdldFR5cGUoKSB7DQorCXJldHVybiB0eXBlOw0KK30NCisNCitpbnQgUHJvcGVydHlWYWx1ZTo6Z2V0SW50VmFsdWUoKSB7DQorCXJldHVybiB2LnZfaW50Ow0KK30NCisNCit1bnNpZ25lZCBsb25nIGludCBQcm9wZXJ0eVZhbHVlOjpnZXRVbnNpZ25lZExvbmdJbnRWYWx1ZSgpIHsNCisJcmV0dXJuIHYudl91bG9uZ19pbnQ7DQorfQ0KKw0KK2Jvb2wgUHJvcGVydHlWYWx1ZTo6Z2V0Qm9vbFZhbHVlKCkgew0KKwlyZXR1cm4gdi52X2Jvb2w7DQorfQ0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nJiBQcm9wZXJ0eVZhbHVlOjpnZXRTdHJpbmdWYWx1ZSgpIHsNCisJcmV0dXJuIHZfc3RyaW5nOw0KK30NCisNCit2b2lkIFByb3BlcnR5VmFsdWU6OmxvZygpIGNvbnN0ICB7DQorCUxvZ2dlcjo6Z2V0TG9nZ2VyKCkuTG9nKExvZ2dlcjo6TE9HX05PUk1BTCwgIlByb3BlcnR5VmFsdWU6OmxvZyB0eXBlOiAlZCIsIHR5cGUpOw0KKwlzd2l0Y2ggKHR5cGUpIHsNCisJY2FzZSBQVlRfSU5UOg0KKwkJTG9nZ2VyOjpnZXRMb2dnZXIoKS5Mb2coTG9nZ2VyOjpMT0dfTk9STUFMLCAiUHJvcGVydHlWYWx1ZTo6bG9nIHZhbHVlOiAlZCIsIHYudl9pbnQpOyBicmVhazsNCisJY2FzZSBQVlRfVUxPTkdfSU5UOg0KKwkJTG9nZ2VyOjpnZXRMb2dnZXIoKS5Mb2coTG9nZ2VyOjpMT0dfTk9STUFMLCAiUHJvcGVydHlWYWx1ZTo6bG9nIHZhbHVlOiAlWCIsIHYudl91bG9uZ19pbnQpOyBicmVhazsNCisJY2FzZSBQVlRfQk9PTDoNCisJCUxvZ2dlcjo6Z2V0TG9nZ2VyKCkuTG9nKExvZ2dlcjo6TE9HX05PUk1BTCwgIlByb3BlcnR5VmFsdWU6OmxvZyB2YWx1ZTogJWQiLCB2LnZfYm9vbCk7IGJyZWFrOw0KKwljYXNlIFBWVF9TVFJJTkc6DQorCQlMb2dnZXI6OmdldExvZ2dlcigpLkxvZyhMb2dnZXI6OkxPR19OT1JNQUwsICJQcm9wZXJ0eVZhbHVlOjpsb2cgdmFsdWU6ICVzIiwgdl9zdHJpbmcuY19zdHIoKSk7IGJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJYXNzZXJ0KGZhbHNlKTsNCisJCWJyZWFrOw0KKwl9DQorfQ0KKw0KK3ZvaWQgUHJvcGVydHlWYWx1ZTo6d3JpdGVUb1RDRkNoYW5uZWwoVENGT3V0cHV0U3RyZWFtJiB0Y2Zfc3RyZWFtKSBjb25zdCB7DQorCXN3aXRjaCAodHlwZSkgew0KKwljYXNlIFBWVF9JTlQ6DQorCQl0Y2Zfc3RyZWFtLndyaXRlTG9uZyh2LnZfaW50KTsgYnJlYWs7DQorCWNhc2UgUFZUX1VMT05HX0lOVDoNCisJCXRjZl9zdHJlYW0ud3JpdGVVTG9uZyh2LnZfdWxvbmdfaW50KTsgYnJlYWs7DQorCWNhc2UgUFZUX0JPT0w6DQorCQl0Y2Zfc3RyZWFtLndyaXRlQm9vbGVhbih2LnZfYm9vbCk7IGJyZWFrOw0KKwljYXNlIFBWVF9TVFJJTkc6DQorCQl0Y2Zfc3RyZWFtLndyaXRlU3RyaW5nKHZfc3RyaW5nKTsgYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlhc3NlcnQoZmFsc2UpOw0KKwkJYnJlYWs7DQorCX0NCit9DQorDQordm9pZCBsb2dQcm9wZXJ0aWVzKFByb3BlcnRpZXMmIHByb3BlcnRpZXMpDQorew0KKwlMb2dnZXI6OmdldExvZ2dlcigpLkxvZyhMb2dnZXI6OkxPR19OT1JNQUwsICJsb2dQcm9wZXJ0aWVzIik7DQorCWZvciAoUHJvcGVydGllczo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuYmVnaW4oKTsNCisJCQlpdGVyICE9IHByb3BlcnRpZXMuZW5kKCk7IGl0ZXIrKykNCisJew0KKwkJTG9nZ2VyOjpnZXRMb2dnZXIoKS5Mb2coTG9nZ2VyOjpMT0dfTk9STUFMLCAicHJvcCBpZDogJXMiLCBpdGVyLT5maXJzdC5jX3N0cigpKTsNCisJCWl0ZXItPnNlY29uZC5sb2coKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Qcm9wZXJ0eVZhbHVlLmggYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9Qcm9wZXJ0eVZhbHVlLmgKaW5kZXggYTQxMzAyYi4uYWJlMDUwYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvUHJvcGVydHlWYWx1ZS5oCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1Byb3BlcnR5VmFsdWUuaApAQCAtMSw3NCArMSw3NiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBOb2tpYSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLiBGZWIgMjYsIDIwMTAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUFJPUEVSVFlWQUxVRV9IXwotI2RlZmluZSBQUk9QRVJUWVZBTFVFX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgIlRDRk91dHB1dFN0cmVhbS5oIgotCi1lbnVtIFByb3BlcnR5VHlwZSB7Ci0JUFZUX1VOS05PV04sCi0JUFZUX0lOVCwKLQlQVlRfVUxPTkdfSU5ULAotCVBWVF9CT09MLAotCVBWVF9TVFJJTkcKLX07Ci0KLWNsYXNzIFByb3BlcnR5VmFsdWUgewotcHVibGljOgotCVByb3BlcnR5VmFsdWUoKTsKLQotCVByb3BlcnR5VmFsdWUoUHJvcGVydHlWYWx1ZSAmc3JjKTsKLQotCVByb3BlcnR5VmFsdWUoaW50IHgpOwotCQotCVByb3BlcnR5VmFsdWUodW5zaWduZWQgbG9uZyBpbnQgeCk7Ci0KLQlQcm9wZXJ0eVZhbHVlKGJvb2wgeCk7Ci0KLQlQcm9wZXJ0eVZhbHVlKGNvbnN0IGNoYXIgKngpOwotCi0JUHJvcGVydHlWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgeCk7Ci0KLQl+UHJvcGVydHlWYWx1ZSgpOwotCi0JUHJvcGVydHlUeXBlIGdldFR5cGUoKTsKLQotCWludCBnZXRJbnRWYWx1ZSgpOwotCXVuc2lnbmVkIGxvbmcgaW50IGdldFVuc2lnbmVkTG9uZ0ludFZhbHVlKCk7Ci0KLQlib29sIGdldEJvb2xWYWx1ZSgpOwotCi0JY29uc3Qgc3RkOjpzdHJpbmcmIGdldFN0cmluZ1ZhbHVlKCk7Ci0KLQotCXZvaWQgd3JpdGVUb1RDRkNoYW5uZWwoVENGT3V0cHV0U3RyZWFtJiB0Y2Zfc3RyZWFtKTsKLQotcHJpdmF0ZToKLQlQcm9wZXJ0eVR5cGUgdHlwZTsKLQotCXVuaW9uIHsKLQkJaW50IHZfaW50OwkJCi0JCXVuc2lnbmVkIGxvbmcgaW50IHZfdWxvbmdfaW50OwotCQlib29sIHZfYm9vbDsKLQl9IHY7Ci0KLQkvLyAic3RkOjpzdHJpbmciIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluIGEgdW5pb24uCi0JLy8gQnV0IEkgc3RpbGwgcHJlZmVyIHN0ZDo6c3RyaW5nIHRvIGNoYXIqIGZvciBlYXNpZXIgbWVtb3J5IG1hbmFnZW1lbnQuCi0Jc3RkOjpzdHJpbmcgdl9zdHJpbmc7Ci19OwotCi10eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9wZXJ0eVZhbHVlKj4JUHJvcGVydGllczsKLQotI2VuZGlmIC8qIFBST1BFUlRZVkFMVUVfSF8gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLiBGZWIgMjYsIDIwMTANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCisjaWZuZGVmIFBST1BFUlRZVkFMVUVfSF8NCisjZGVmaW5lIFBST1BFUlRZVkFMVUVfSF8NCisNCisjaW5jbHVkZSA8bWFwPg0KKyNpbmNsdWRlIDxzdHJpbmc+DQorI2luY2x1ZGUgIlRDRk91dHB1dFN0cmVhbS5oIg0KKw0KK2VudW0gUHJvcGVydHlUeXBlIHsNCisJUFZUX1VOS05PV04sDQorCVBWVF9JTlQsDQorCVBWVF9VTE9OR19JTlQsDQorCVBWVF9CT09MLA0KKwlQVlRfU1RSSU5HDQorfTsNCisNCitjbGFzcyBQcm9wZXJ0eVZhbHVlIHsNCitwdWJsaWM6DQorCVByb3BlcnR5VmFsdWUoKTsNCisNCisJUHJvcGVydHlWYWx1ZShjb25zdCBQcm9wZXJ0eVZhbHVlICZzcmMpOw0KKw0KKwlQcm9wZXJ0eVZhbHVlKGludCB4KTsNCisJDQorCVByb3BlcnR5VmFsdWUodW5zaWduZWQgbG9uZyBpbnQgeCk7DQorDQorCVByb3BlcnR5VmFsdWUoYm9vbCB4KTsNCisNCisJUHJvcGVydHlWYWx1ZShjb25zdCBjaGFyICp4KTsNCisNCisJUHJvcGVydHlWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgeCk7DQorDQorCVByb3BlcnR5VHlwZSBnZXRUeXBlKCk7DQorDQorCWludCBnZXRJbnRWYWx1ZSgpOw0KKwl1bnNpZ25lZCBsb25nIGludCBnZXRVbnNpZ25lZExvbmdJbnRWYWx1ZSgpOw0KKw0KKwlib29sIGdldEJvb2xWYWx1ZSgpOw0KKw0KKwljb25zdCBzdGQ6OnN0cmluZyYgZ2V0U3RyaW5nVmFsdWUoKTsNCisNCisNCisJdm9pZCB3cml0ZVRvVENGQ2hhbm5lbChUQ0ZPdXRwdXRTdHJlYW0mIHRjZl9zdHJlYW0pIGNvbnN0Ow0KKw0KKwl2b2lkIGxvZygpIGNvbnN0Ow0KKw0KK3ByaXZhdGU6DQorCVByb3BlcnR5VHlwZSB0eXBlOw0KKw0KKwl1bmlvbiB7DQorCQlpbnQgdl9pbnQ7CQkNCisJCXVuc2lnbmVkIGxvbmcgaW50IHZfdWxvbmdfaW50Ow0KKwkJYm9vbCB2X2Jvb2w7DQorCX0gdjsNCisNCisJLy8gInN0ZDo6c3RyaW5nIiBpcyBub3QgYWxsb3dlZCB0byBiZSBpbiBhIHVuaW9uLg0KKwkvLyBCdXQgSSBzdGlsbCBwcmVmZXIgc3RkOjpzdHJpbmcgdG8gY2hhciogZm9yIGVhc2llciBtZW1vcnkgbWFuYWdlbWVudC4NCisJc3RkOjpzdHJpbmcgdl9zdHJpbmc7DQorfTsNCisNCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9wZXJ0eVZhbHVlPglQcm9wZXJ0aWVzOw0KKw0KK3ZvaWQgbG9nUHJvcGVydGllcyhQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKTsNCisNCisjZW5kaWYgLyogUFJPUEVSVFlWQUxVRV9IXyAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1JlZ2lzdGVyR3JvdXBJbkFnZW50LmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1JlZ2lzdGVyR3JvdXBJbkFnZW50LmNwcAppbmRleCAxYjQ4MGVhLi5mMTA0MTk2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9SZWdpc3Rlckdyb3VwSW5BZ2VudC5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvUmVnaXN0ZXJHcm91cEluQWdlbnQuY3BwCkBAIC0xLDUxICsxLDUxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICBGZWIsIDIwMTAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiUmVnaXN0ZXJHcm91cEluQWdlbnQuaCIKLSNpbmNsdWRlICJDb250ZXh0TWFuYWdlci5oIgotI2luY2x1ZGUgImFzc2VydC5oIgotCi0vKioKLSAqIENvbnN0cnVjdCBhIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHQuIFRoZSBpbnRlcm5hbCBJRCBvZiB0aGUgY29udGV4dCB3aWxsIGJlCi0gKiBhdXRvLWdlbmVyYXRlZC4gPGJyPgotICogVGhlIGNvbnN0cnVjdGVkIGNvbnRleHQgd2lsbCBiZSBhZGRlZCBpbiBkZWJ1Z2dlZCBjb250ZXh0IGNhY2hlLiBBbmQgaXQKLSAqIHdpbGwgYmUgYWRkZWQgYXMgY2hpbGQgb2YgdGhlIHBhcmVudCBjb250ZXh0LgotICoKLSAqIEBwYXJhbSBuYW1lCi0gKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGdyb3VwLgotICogQHBhcmFtIHBhcmVudElECi0gKiAgICAgICAgICAgIGludGVybmFsIElEIG9mIHRoZSBwYXJlbnQgKHVzdWFsbHkgYSByZWdpc3RlciBncm91cCkuCi0gKiBAcGFyYW0gcHJvcHMKLSAqICAgICAgICAgICAgaW5pdGlhbCBwcm9wZXJ0aWVzLCBjYW5ub3QgYmUgbnVsbCBidXQgY2FuIGJlIGVtcHR5LiBBbgotICogICAgICAgICAgICBpbnRlcm5hbCBjb3B5IG9mIGl0IHdpbGwgYmUgbWFkZSBpbiB0aGlzIG9iamVjdC4KLSAqLwotUmVnaXN0ZXJHcm91cEluQWdlbnQ6OlJlZ2lzdGVyR3JvdXBJbkFnZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBDb250ZXh0SUQmIHBhcmVudElELCBQcm9wZXJ0aWVzJiBwcm9wcyk6Ci0JQ29udGV4dChwYXJlbnRJRCwgY3JlYXRlSW50ZXJuYWxJRChuYW1lLCBwYXJlbnRJRCksIHByb3BzKQotewotCVNldFByb3BlcnR5KFBST1BfTkFNRSwgbmV3IFByb3BlcnR5VmFsdWUobmFtZSkpOwotCi0JLy8gV2Ugb25seSBuZWVkIHRvIGFkZCByZWdpc3RlciBhcyBkZWJ1Z2dlZCBjb250ZXh0LgotCUNvbnRleHRNYW5hZ2VyOjphZGRDb250ZXh0KHRoaXMpOwotCUNvbnRleHQqIHBhcmVudCA9IENvbnRleHRNYW5hZ2VyOjpmaW5kQ29udGV4dChwYXJlbnRJRCk7Ci0KLQlpZiAocGFyZW50ICE9IE5VTEwpCi0JCXBhcmVudC0+QWRkQ2hpbGQodGhpcyk7Ci0JZWxzZQotCQkvLyBwYXJlbnQgaXMgbm90IGNhY2hlZCwgc2hvdWxkIG5vdCBoYXBwZW4uCi0JCWFzc2VydCAoZmFsc2UpOwotfQotCi1zdGQ6OnN0cmluZyYgUmVnaXN0ZXJHcm91cEluQWdlbnQ6OmNyZWF0ZUludGVybmFsSUQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJlbnRJRCkgewotCXN0ZDo6c3RyaW5nKiByZXQgPSBuZXcgc3RkOjpzdHJpbmcocGFyZW50SUQpOwotCXJldC0+YXBwZW5kKCIucmciKTsKLQlyZXQtPmFwcGVuZChuYW1lKTsKLQlyZXR1cm4gKnJldDsKLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAgRmViLCAyMDEwDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIlJlZ2lzdGVyR3JvdXBJbkFnZW50LmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorI2luY2x1ZGUgImFzc2VydC5oIg0KKw0KKy8qKg0KKyAqIENvbnN0cnVjdCBhIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHQuIFRoZSBpbnRlcm5hbCBJRCBvZiB0aGUgY29udGV4dCB3aWxsIGJlDQorICogYXV0by1nZW5lcmF0ZWQuIDxicj4NCisgKiBUaGUgY29uc3RydWN0ZWQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGluIGRlYnVnZ2VkIGNvbnRleHQgY2FjaGUuIEFuZCBpdA0KKyAqIHdpbGwgYmUgYWRkZWQgYXMgY2hpbGQgb2YgdGhlIHBhcmVudCBjb250ZXh0Lg0KKyAqDQorICogQHBhcmFtIG5hbWUNCisgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGdyb3VwLg0KKyAqIEBwYXJhbSBwYXJlbnRJRA0KKyAqICAgICAgICAgICAgaW50ZXJuYWwgSUQgb2YgdGhlIHBhcmVudCAodXN1YWxseSBhIHJlZ2lzdGVyIGdyb3VwKS4NCisgKiBAcGFyYW0gcHJvcHMNCisgKiAgICAgICAgICAgIGluaXRpYWwgcHJvcGVydGllcywgY2Fubm90IGJlIG51bGwgYnV0IGNhbiBiZSBlbXB0eS4gQW4NCisgKiAgICAgICAgICAgIGludGVybmFsIGNvcHkgb2YgaXQgd2lsbCBiZSBtYWRlIGluIHRoaXMgb2JqZWN0Lg0KKyAqLw0KK1JlZ2lzdGVyR3JvdXBJbkFnZW50OjpSZWdpc3Rlckdyb3VwSW5BZ2VudChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgQ29udGV4dElEJiBwYXJlbnRJRCwgUHJvcGVydGllcyYgcHJvcHMpOg0KKwlDb250ZXh0KHBhcmVudElELCBjcmVhdGVJbnRlcm5hbElEKG5hbWUsIHBhcmVudElEKSwgcHJvcHMpDQorew0KKwlTZXRQcm9wZXJ0eShQUk9QX05BTUUsIFByb3BlcnR5VmFsdWUobmFtZSkpOw0KKw0KKwkvLyBXZSBvbmx5IG5lZWQgdG8gYWRkIHJlZ2lzdGVyIGFzIGRlYnVnZ2VkIGNvbnRleHQuDQorCUNvbnRleHRNYW5hZ2VyOjphZGRDb250ZXh0KHRoaXMpOw0KKwlDb250ZXh0KiBwYXJlbnQgPSBDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQocGFyZW50SUQpOw0KKw0KKwlpZiAocGFyZW50ICE9IE5VTEwpDQorCQlwYXJlbnQtPkFkZENoaWxkKHRoaXMpOw0KKwllbHNlDQorCQkvLyBwYXJlbnQgaXMgbm90IGNhY2hlZCwgc2hvdWxkIG5vdCBoYXBwZW4uDQorCQlhc3NlcnQgKGZhbHNlKTsNCit9DQorDQorc3RkOjpzdHJpbmcmIFJlZ2lzdGVyR3JvdXBJbkFnZW50OjpjcmVhdGVJbnRlcm5hbElEKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyZW50SUQpIHsNCisJc3RkOjpzdHJpbmcqIHJldCA9IG5ldyBzdGQ6OnN0cmluZyhwYXJlbnRJRCk7DQorCXJldC0+YXBwZW5kKCIucmciKTsNCisJcmV0LT5hcHBlbmQobmFtZSk7DQorCXJldHVybiAqcmV0Ow0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9SZWdpc3RlckluQWdlbnQuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvUmVnaXN0ZXJJbkFnZW50LmNwcAppbmRleCAwNmIwNTRmLi42Yzc4OTQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9SZWdpc3RlckluQWdlbnQuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1JlZ2lzdGVySW5BZ2VudC5jcHAKQEAgLTEsNTEgKzEsNTEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gIEZlYiwgMjAxMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJSZWdpc3RlckluQWdlbnQuaCIKLSNpbmNsdWRlICJDb250ZXh0TWFuYWdlci5oIgotI2luY2x1ZGUgImFzc2VydC5oIgotCi0vKioKLSAqIENvbnN0cnVjdCBhIHJlZ2lzdGVyIGNvbnRleHQuIFRoZSBpbnRlcm5hbCBJRCBvZiB0aGUgY29udGV4dCB3aWxsIGJlCi0gKiBhdXRvLWdlbmVyYXRlZC4gPGJyPgotICogVGhlIGNvbnN0cnVjdGVkIGNvbnRleHQgd2lsbCBiZSBhZGRlZCBpbiBkZWJ1Z2dlZCBjb250ZXh0IGNhY2hlLiBBbmQgaXQKLSAqIHdpbGwgYmUgYWRkZWQgYXMgY2hpbGQgb2YgdGhlIHBhcmVudCBjb250ZXh0LgotICoKLSAqIEBwYXJhbSBuYW1lCi0gKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGdyb3VwLgotICogQHBhcmFtIHBhcmVudElECi0gKiAgICAgICAgICAgIGludGVybmFsIElEIG9mIHRoZSBwYXJlbnQgKHVzdWFsbHkgYSByZWdpc3RlciBncm91cCkuCi0gKiBAcGFyYW0gcHJvcHMKLSAqICAgICAgICAgICAgaW5pdGlhbCBwcm9wZXJ0aWVzLCBjYW5ub3QgYmUgbnVsbCBidXQgY2FuIGJlIGVtcHR5LiBBbgotICogICAgICAgICAgICBpbnRlcm5hbCBjb3B5IG9mIGl0IHdpbGwgYmUgbWFkZSBpbiB0aGlzIG9iamVjdC4KLSAqLwotUmVnaXN0ZXJJbkFnZW50OjpSZWdpc3RlckluQWdlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIFByb3BlcnRpZXMmIHByb3BzKToKLQlDb250ZXh0KHBhcmVudElELCBjcmVhdGVJbnRlcm5hbElEKG5hbWUsIHBhcmVudElEKSwgcHJvcHMpCi17Ci0JU2V0UHJvcGVydHkoUFJPUF9OQU1FLCBuZXcgUHJvcGVydHlWYWx1ZShuYW1lKSk7Ci0KLQkvLyBXZSBvbmx5IG5lZWQgdG8gYWRkIHJlZ2lzdGVyIGFzIGRlYnVnZ2VkIGNvbnRleHQuCi0JQ29udGV4dE1hbmFnZXI6OmFkZENvbnRleHQodGhpcyk7Ci0JQ29udGV4dCogcGFyZW50ID0gQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KHBhcmVudElEKTsKLQotCWlmIChwYXJlbnQgIT0gTlVMTCkKLQkJcGFyZW50LT5BZGRDaGlsZCh0aGlzKTsKLQllbHNlCi0JCS8vIHBhcmVudCBpcyBub3QgY2FjaGVkLCBzaG91bGQgbm90IGhhcHBlbi4KLQkJYXNzZXJ0IChmYWxzZSk7Ci19Ci0KLXN0ZDo6c3RyaW5nJiBSZWdpc3RlckluQWdlbnQ6OmNyZWF0ZUludGVybmFsSUQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJlbnRJRCkgewotCXN0ZDo6c3RyaW5nKiByZXQgPSBuZXcgc3RkOjpzdHJpbmcocGFyZW50SUQpOwotCXJldC0+YXBwZW5kKCIuciIpOwotCXJldC0+YXBwZW5kKG5hbWUpOwotCXJldHVybiAqcmV0OwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICBGZWIsIDIwMTANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiUmVnaXN0ZXJJbkFnZW50LmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorI2luY2x1ZGUgImFzc2VydC5oIg0KKw0KKy8qKg0KKyAqIENvbnN0cnVjdCBhIHJlZ2lzdGVyIGNvbnRleHQuIFRoZSBpbnRlcm5hbCBJRCBvZiB0aGUgY29udGV4dCB3aWxsIGJlDQorICogYXV0by1nZW5lcmF0ZWQuIDxicj4NCisgKiBUaGUgY29uc3RydWN0ZWQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGluIGRlYnVnZ2VkIGNvbnRleHQgY2FjaGUuIEFuZCBpdA0KKyAqIHdpbGwgYmUgYWRkZWQgYXMgY2hpbGQgb2YgdGhlIHBhcmVudCBjb250ZXh0Lg0KKyAqDQorICogQHBhcmFtIG5hbWUNCisgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGdyb3VwLg0KKyAqIEBwYXJhbSBwYXJlbnRJRA0KKyAqICAgICAgICAgICAgaW50ZXJuYWwgSUQgb2YgdGhlIHBhcmVudCAodXN1YWxseSBhIHJlZ2lzdGVyIGdyb3VwKS4NCisgKiBAcGFyYW0gcHJvcHMNCisgKiAgICAgICAgICAgIGluaXRpYWwgcHJvcGVydGllcywgY2Fubm90IGJlIG51bGwgYnV0IGNhbiBiZSBlbXB0eS4gQW4NCisgKiAgICAgICAgICAgIGludGVybmFsIGNvcHkgb2YgaXQgd2lsbCBiZSBtYWRlIGluIHRoaXMgb2JqZWN0Lg0KKyAqLw0KK1JlZ2lzdGVySW5BZ2VudDo6UmVnaXN0ZXJJbkFnZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBDb250ZXh0SUQmIHBhcmVudElELCBQcm9wZXJ0aWVzJiBwcm9wcyk6DQorCUNvbnRleHQocGFyZW50SUQsIGNyZWF0ZUludGVybmFsSUQobmFtZSwgcGFyZW50SUQpLCBwcm9wcykNCit7DQorCVNldFByb3BlcnR5KFBST1BfTkFNRSwgUHJvcGVydHlWYWx1ZShuYW1lKSk7DQorDQorCS8vIFdlIG9ubHkgbmVlZCB0byBhZGQgcmVnaXN0ZXIgYXMgZGVidWdnZWQgY29udGV4dC4NCisJQ29udGV4dE1hbmFnZXI6OmFkZENvbnRleHQodGhpcyk7DQorCUNvbnRleHQqIHBhcmVudCA9IENvbnRleHRNYW5hZ2VyOjpmaW5kQ29udGV4dChwYXJlbnRJRCk7DQorDQorCWlmIChwYXJlbnQgIT0gTlVMTCkNCisJCXBhcmVudC0+QWRkQ2hpbGQodGhpcyk7DQorCWVsc2UNCisJCS8vIHBhcmVudCBpcyBub3QgY2FjaGVkLCBzaG91bGQgbm90IGhhcHBlbi4NCisJCWFzc2VydCAoZmFsc2UpOw0KK30NCisNCitzdGQ6OnN0cmluZyYgUmVnaXN0ZXJJbkFnZW50OjpjcmVhdGVJbnRlcm5hbElEKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyZW50SUQpIHsNCisJc3RkOjpzdHJpbmcqIHJldCA9IG5ldyBzdGQ6OnN0cmluZyhwYXJlbnRJRCk7DQorCXJldC0+YXBwZW5kKCIuciIpOw0KKwlyZXQtPmFwcGVuZChuYW1lKTsNCisJcmV0dXJuICpyZXQ7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1J1bkNvbnRyb2xDb250ZXh0LmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1J1bkNvbnRyb2xDb250ZXh0LmNwcAppbmRleCA3MzUwYzNhLi5hNjRhNGE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9SdW5Db250cm9sQ29udGV4dC5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvUnVuQ29udHJvbENvbnRleHQuY3BwCkBAIC0xLDM4ICsxLDM4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIlJ1bkNvbnRyb2xDb250ZXh0LmgiCi0jaW5jbHVkZSAiQWdlbnRVdGlscy5oIgotI2luY2x1ZGUgIlByb3RvY29sQ29uc3RhbnRzLmgiCi0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gTm90ZSB0aGUgImludGVybmFsSUQiIHNob3VsZCByZW1haW4gdGhlIHNhbWUgZm9yIHRoZSBzYW1lIGNvbnRleHQKLSAqIChlLmcuIGEgcHJvY2VzcykgaW4gT1MgZXZlbiB3aGVuIHdlIGNyZWF0ZSAiY29udGV4dCIgb2JqZWN0IGF0IGRpZmZlcmVudCB0aW1lcy4KLSAqLwotUnVuQ29udHJvbENvbnRleHQ6OlJ1bkNvbnRyb2xDb250ZXh0KENvbnRleHRPU0lEIG9zaWQsIGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCkgOgotCUNvbnRleHQocGFyZW50SUQsIGludGVybmFsSUQpLAotCWlzRGVidWdnaW5nKGZhbHNlKQotewotCW9zSUQgPSBvc2lkOwotCi0JaW5pdGlhbGl6ZSgpOwotfQotCi0KLXZvaWQgUnVuQ29udHJvbENvbnRleHQ6OmluaXRpYWxpemUoKQotewotCVNldFByb3BlcnR5KFBST1BfT1NfSUQsIG5ldyBQcm9wZXJ0eVZhbHVlKEdldE9TSUQoKSkpOwotfQotCi1Db250ZXh0T1NJRCBSdW5Db250cm9sQ29udGV4dDo6R2V0T1NJRCgpIHsKLQlyZXR1cm4gb3NJRDsKLX0KLQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMCBOb2tpYSBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJSdW5Db250cm9sQ29udGV4dC5oIg0KKyNpbmNsdWRlICJBZ2VudFV0aWxzLmgiDQorI2luY2x1ZGUgIlByb3RvY29sQ29uc3RhbnRzLmgiDQorDQorLyoNCisgKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gTm90ZSB0aGUgImludGVybmFsSUQiIHNob3VsZCByZW1haW4gdGhlIHNhbWUgZm9yIHRoZSBzYW1lIGNvbnRleHQNCisgKiAoZS5nLiBhIHByb2Nlc3MpIGluIE9TIGV2ZW4gd2hlbiB3ZSBjcmVhdGUgImNvbnRleHQiIG9iamVjdCBhdCBkaWZmZXJlbnQgdGltZXMuDQorICovDQorUnVuQ29udHJvbENvbnRleHQ6OlJ1bkNvbnRyb2xDb250ZXh0KENvbnRleHRPU0lEIG9zaWQsIGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCkgOg0KKwlDb250ZXh0KHBhcmVudElELCBpbnRlcm5hbElEKSwNCisJaXNEZWJ1Z2dpbmcoZmFsc2UpDQorew0KKwlvc0lEID0gb3NpZDsNCisNCisJaW5pdGlhbGl6ZSgpOw0KK30NCisNCisNCit2b2lkIFJ1bkNvbnRyb2xDb250ZXh0Ojppbml0aWFsaXplKCkNCit7DQorCVNldFByb3BlcnR5KFBST1BfT1NfSUQsIFByb3BlcnR5VmFsdWUoR2V0T1NJRCgpKSk7DQorfQ0KKw0KK0NvbnRleHRPU0lEIFJ1bkNvbnRyb2xDb250ZXh0OjpHZXRPU0lEKCkgew0KKwlyZXR1cm4gb3NJRDsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvVENGQ29udGV4dC5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9UQ0ZDb250ZXh0LmNwcAppbmRleCAxMTJmMDI5Li4wNDUwYjg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9UQ0ZDb250ZXh0LmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9UQ0ZDb250ZXh0LmNwcApAQCAtMSw4OCArMSw5MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBOb2tpYSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiVENGQ29udGV4dC5oIgotI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiQWdlbnRVdGlscy5oIgotCi0jdW5kZWYgcmVtb3ZlCi0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4KLSAqLwotQ29udGV4dDo6Q29udGV4dChjb25zdCBDb250ZXh0SUQmIHBhcmVudElELCBjb25zdCBDb250ZXh0SUQmIGludGVybmFsSUQpIHsKLQl0aGlzLT5pbnRlcm5hbElEID0gaW50ZXJuYWxJRDsKLQl0aGlzLT5wYXJlbnRJRCA9IHBhcmVudElEOwotCi0JaW5pdGlhbGl6ZSgpOwotCi0JLy8gRG9uJ3QgYWRkIHRoZSBjb250ZXh0IHRvIGFueSBjb250ZXh0IGNhY2hlIGhlcmUgYXMgdGhlcmUgYXJlIGRpZmZlcmVudAotCS8vIGNhY2hlcyBmb3IgZGlmZmVyZW50IHB1cnBvc2VzLgotCS8vIFNlZSBDb250ZXh0TWFuYWdlciBmb3IgbW9yZS4KLX0KLQotQ29udGV4dDo6Q29udGV4dChjb25zdCBDb250ZXh0SUQmIHBhcmVudElELCBjb25zdCBDb250ZXh0SUQmIGludGVybmFsSUQsIFByb3BlcnRpZXMmIHByb3BzKSB7Ci0JdGhpcy0+aW50ZXJuYWxJRCA9IGludGVybmFsSUQ7Ci0JdGhpcy0+cGFyZW50SUQgPSBwYXJlbnRJRDsKLQotCS8vIENvcHkgdGhlICJwcm9wcyIgdG8gaW50ZXJuYWwgbWVtYmVyLiBXZSBuZWVkIGRlZXAgY29weS4KLQkvLwlwcm9wZXJ0aWVzLmluc2VydChwcm9wcy5iZWdpbigpLCBwcm9wcy5lbmQoKSk7Ci0JZm9yIChQcm9wZXJ0aWVzOjppdGVyYXRvciBpdCA9IHByb3BzLmJlZ2luKCk7IGl0ICE9IHByb3BzLmVuZCgpOyBpdCsrKSB7Ci0JCXByb3BlcnRpZXNbaXQtPmZpcnN0XSA9IG5ldyBQcm9wZXJ0eVZhbHVlKCooaXQtPnNlY29uZCkpOwotCX0KLQotCWluaXRpYWxpemUoKTsKLX0KLQotQ29udGV4dDo6fkNvbnRleHQoKSB7Ci0JLy8gY2xlYXIgcHJvcGVydGllcywgd2hpY2ggaXMgYSBoaW50IHRvIGNsaWVudHMgd2hvIG1heSBzdGlsbAotCS8vIGluY29ycmVjdGx5IGhvbGQgb24gdG8gYSBkZWFsbG9jYXRlZCBjb250ZXh0LgotCWZvciAoUHJvcGVydGllczo6aXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuYmVnaW4oKTsgaXRlciAhPSBwcm9wZXJ0aWVzLmVuZCgpOyBpdGVyKyspCi0JCWRlbGV0ZSBpdGVyLT5zZWNvbmQ7Ci0JcHJvcGVydGllcy5jbGVhcigpOwotfQotCi12b2lkIENvbnRleHQ6OmluaXRpYWxpemUoKQotewotCVNldFByb3BlcnR5KFBST1BfSUQsIG5ldyBQcm9wZXJ0eVZhbHVlKGludGVybmFsSUQpKTsKLQlTZXRQcm9wZXJ0eShQUk9QX1BBUkVOVF9JRCwgbmV3IFByb3BlcnR5VmFsdWUocGFyZW50SUQpKTsKLX0KLQotQ29udGV4dElEIENvbnRleHQ6OkdldElEKCkgewotCXJldHVybiBpbnRlcm5hbElEOwotfQotCi1Db250ZXh0SUQgQ29udGV4dDo6R2V0UGFyZW50SUQoKSB7Ci0JcmV0dXJuIHBhcmVudElEOwotfQotCi1Qcm9wZXJ0aWVzJiBDb250ZXh0OjpHZXRQcm9wZXJ0aWVzKCkgewotCXJldHVybiBwcm9wZXJ0aWVzOwotfQotCi12b2lkIENvbnRleHQ6OkFkZENoaWxkKENvbnRleHQqIGNoaWxkKSB7Ci0JY2hpbGRyZW5fLnB1c2hfYmFjayhjaGlsZCk7Ci19Ci0KLXZvaWQgQ29udGV4dDo6UmVtb3ZlQ2hpbGQoQ29udGV4dCogY2hpbGQpIHsKLQljaGlsZHJlbl8ucmVtb3ZlKGNoaWxkKTsKLX0KLQotc3RkOjpsaXN0PENvbnRleHQqPiYgQ29udGV4dDo6R2V0Q2hpbGRyZW4oKSB7Ci0JcmV0dXJuIGNoaWxkcmVuXzsKLX0KLQotUHJvcGVydHlWYWx1ZSogQ29udGV4dDo6R2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotCXJldHVybiBwcm9wZXJ0aWVzW2tleV07Ci19Ci0KLXZvaWQgQ29udGV4dDo6U2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgUHJvcGVydHlWYWx1ZSogdmFsdWUpIHsKLQlwcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTsKLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJUQ0ZDb250ZXh0LmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorI2luY2x1ZGUgIkFnZW50VXRpbHMuaCINCisNCisjdW5kZWYgcmVtb3ZlDQorDQorLyoNCisgKiBDcmVhdGUgYSBuZXcgY29udGV4dC4NCisgKi8NCitDb250ZXh0OjpDb250ZXh0KGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCkgew0KKwl0aGlzLT5pbnRlcm5hbElEID0gaW50ZXJuYWxJRDsNCisJdGhpcy0+cGFyZW50SUQgPSBwYXJlbnRJRDsNCisNCisJaW5pdGlhbGl6ZSgpOw0KKw0KKwkvLyBEb24ndCBhZGQgdGhlIGNvbnRleHQgdG8gYW55IGNvbnRleHQgY2FjaGUgaGVyZSBhcyB0aGVyZSBhcmUgZGlmZmVyZW50DQorCS8vIGNhY2hlcyBmb3IgZGlmZmVyZW50IHB1cnBvc2VzLg0KKwkvLyBTZWUgQ29udGV4dE1hbmFnZXIgZm9yIG1vcmUuDQorfQ0KKw0KK0NvbnRleHQ6OkNvbnRleHQoY29uc3QgQ29udGV4dElEJiBwYXJlbnRJRCwgY29uc3QgQ29udGV4dElEJiBpbnRlcm5hbElELCBQcm9wZXJ0aWVzJiBwcm9wcykgew0KKwl0aGlzLT5pbnRlcm5hbElEID0gaW50ZXJuYWxJRDsNCisJdGhpcy0+cGFyZW50SUQgPSBwYXJlbnRJRDsNCisJdGhpcy0+cHJvcGVydGllcyA9IHByb3BzOw0KKwlpbml0aWFsaXplKCk7DQorfQ0KKw0KK0NvbnRleHQ6On5Db250ZXh0KCkgew0KKwlwcm9wZXJ0aWVzLmNsZWFyKCk7DQorDQorCS8vIGRlbGV0ZSByZW1haW5pbmcgY2hpbGRyZW4uDQorCS8vDQorCS8vIFRoaXMgbWFrZXMgYSBjb3B5Lg0KKwlzdGQ6Omxpc3Q8Q29udGV4dCAqPiByZW1haW5pbmdLaWRzID0gR2V0Q2hpbGRyZW4oKTsNCisNCisJZm9yIChzdGQ6Omxpc3Q8Q29udGV4dCAqPjo6aXRlcmF0b3IgaXRlciA9IHJlbWFpbmluZ0tpZHMuYmVnaW4oKTsNCisJCWl0ZXIgIT0gcmVtYWluaW5nS2lkcy5lbmQoKTsgaXRlcisrKSB7DQorCQlDb250ZXh0KiBraWQgPSAqaXRlcjsNCisJCWRlbGV0ZSBDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQoa2lkLT5HZXRJRCgpKTsNCisJfQ0KKw0KKwkvLyBSZW1vdmUgdGhpcyBjb250ZXh0IGZyb20gZ2xvYmFsIGNhY2hlLg0KKwlDb250ZXh0TWFuYWdlcjo6cmVtb3ZlQ29udGV4dChHZXRJRCgpKTsNCit9DQorDQordm9pZCBDb250ZXh0Ojppbml0aWFsaXplKCkNCit7DQorCVNldFByb3BlcnR5KFBST1BfSUQsIFByb3BlcnR5VmFsdWUoaW50ZXJuYWxJRCkpOw0KKwlTZXRQcm9wZXJ0eShQUk9QX1BBUkVOVF9JRCwgUHJvcGVydHlWYWx1ZShwYXJlbnRJRCkpOw0KK30NCisNCitDb250ZXh0SUQgQ29udGV4dDo6R2V0SUQoKSB7DQorCXJldHVybiBpbnRlcm5hbElEOw0KK30NCisNCitDb250ZXh0SUQgQ29udGV4dDo6R2V0UGFyZW50SUQoKSB7DQorCXJldHVybiBwYXJlbnRJRDsNCit9DQorDQorUHJvcGVydGllcyYgQ29udGV4dDo6R2V0UHJvcGVydGllcygpIHsNCisJcmV0dXJuIHByb3BlcnRpZXM7DQorfQ0KKw0KK3ZvaWQgQ29udGV4dDo6QWRkQ2hpbGQoQ29udGV4dCogY2hpbGQpIHsNCisJY2hpbGRyZW5fLnB1c2hfYmFjayhjaGlsZCk7DQorfQ0KKw0KK3ZvaWQgQ29udGV4dDo6UmVtb3ZlQ2hpbGQoQ29udGV4dCogY2hpbGQpIHsNCisJY2hpbGRyZW5fLnJlbW92ZShjaGlsZCk7DQorfQ0KKw0KK3N0ZDo6bGlzdDxDb250ZXh0Kj4mIENvbnRleHQ6OkdldENoaWxkcmVuKCkgew0KKwlyZXR1cm4gY2hpbGRyZW5fOw0KK30NCisNCitQcm9wZXJ0eVZhbHVlJiBDb250ZXh0OjpHZXRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7DQorCXJldHVybiBwcm9wZXJ0aWVzW2tleV07DQorfQ0KKw0KK3ZvaWQgQ29udGV4dDo6U2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3QgUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsNCisJcHJvcGVydGllc1trZXldID0gdmFsdWU7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1RDRkNvbnRleHQuaCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvY29tbW9uX2FnZW50L1RDRkNvbnRleHQuaAppbmRleCA0ZDNmNjllLi43OTVlMjllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL2NvbW1vbl9hZ2VudC9UQ0ZDb250ZXh0LmgKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy9jb21tb25fYWdlbnQvVENGQ29udGV4dC5oCkBAIC0xLDk0ICsxLDk0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgVENGQ09OVEVYVF9IXwotI2RlZmluZSBUQ0ZDT05URVhUX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiQWdlbnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJQcm9wZXJ0eVZhbHVlLmgiCi0KLSNkZWZpbmUgUk9PVF9DT05URVhUX0lECSJyb290IgotCi0vKgotICogUHJvcGVydGllcyBvZiBjb250ZXh0LgotICovCi0vKiBGcm9tOiBUQ0YgSVJ1bkNvbnRyb2wuamF2YS4KLSAqLwotI2RlZmluZSBQUk9QX0lEIAkJCSJJRCIKLSNkZWZpbmUgUFJPUF9QQVJFTlRfSUQJCSJQYXJlbnRJRCIKLSNkZWZpbmUgUFJPUF9QUk9DRVNTX0lECQkiUHJvY2Vzc0lEIgotI2RlZmluZSBQUk9QX0lTX0NPTlRBSU5FUgkiSXNDb250YWluZXIiCi0jZGVmaW5lIFBST1BfSEFTX1NUQVRFCQkiSGFzU3RhdGUiCi0jZGVmaW5lIFBST1BfQ0FOX1JFU1VNRQkJIkNhblJlc3VtZSIJLy8gdmFsdWU6IGludC9sb25nCi0jZGVmaW5lIFBST1BfQ0FOX0NPVU5UCQkiQ2FuQ291bnQiCi0jZGVmaW5lIFBST1BfQ0FOX1NVU1BFTkQJIkNhblN1c3BlbmQiCi0jZGVmaW5lIFBST1BfQ0FOX1RFUk1JTkFURQkiQ2FuVGVybWluYXRlIgotCi0vKiBGcm9tOiBUQ0YgSVByb2Nlc3Nlcy5qYXZhCi0gKi8KLS8qKiBJcyB0aGUgY29udGV4dCBhdHRhY2hlZCAqLwotI2RlZmluZSBQUk9QX0FUVEFDSEVECQkiQXR0YWNoZWQiCi0vKiogUHJvY2VzcyBuYW1lLiBDbGllbnQgVUkgY2FuIHNob3cgdGhpcyBuYW1lIHRvIGEgdXNlciAqLwotI2RlZmluZSBQUk9QX05BTUUgCQkJIk5hbWUiCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIENvbnRleHRPU0lEOyAvLyBJRCBpbiB0aGUgT1MKLXR5cGVkZWYgc3RkOjpzdHJpbmcgQ29udGV4dElEOyAvLyBJRCBpbiBkZWJ1Z2dlcgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIENvbnRleHRBZGRyZXNzOyAvKiBUeXBlIHRvIHJlcHJlc2VudCBieXRlZCBhZGRyZXNzIGluc2lkZSBjb250ZXh0IG1lbW9yeSAqLwotCi0vKgotICogQ29udGV4dCBpbiBUQ0YgYWdlbnQuCi0gKiBUaGUgY29udGV4dCBjYW4gYmUgYSBwcm9jZXNzLCB0aHJlYWQsIHJlZ2lzdGVyIGdyb3VwLCByZWdpc3RlciwgZXRjLgotICovCi1jbGFzcyBDb250ZXh0IHsKLXB1YmxpYzoKLQlDb250ZXh0KGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCk7Ci0KLQlDb250ZXh0KGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCwgUHJvcGVydGllcyYgcHJvcHMpOwotCi0JdmlydHVhbCB+Q29udGV4dCgpOwotCi0JLyoKLQkgKiBHZXQgdW5pcXVlIElEIGZvciB0aGUgaW5zdGFuY2UuIFRoaXMgaXMgaW50ZXJuYWwgSUQsIG5vdCBwcm9jZXNzIElECi0JICogb3IgdGhyZWFkIElEIGluIHRoZSBPUy4KLQkgKi8KLQlDb250ZXh0SUQgR2V0SUQoKTsKLQotCS8qIEdldCBpbnRlcm5hbCBJRCBvZiB0aGUgcHJvY2VzcyBpZiB0aGUgY29udGV4dCBpcyBhIHRocmVhZC4KLQkgKiBSZXR1cm4gaW52YWxpZCBpZCBpZiB0aGUgY29udGV4dCBpcyBhIHByb2Nlc3MuCi0JICovCi0JQ29udGV4dElEIEdldFBhcmVudElEKCk7Ci0KLQl2aXJ0dWFsIHN0ZDo6bGlzdDxDb250ZXh0Kj4mIEdldENoaWxkcmVuKCk7Ci0Jdm9pZCBBZGRDaGlsZChDb250ZXh0ICopOwotCXZvaWQgUmVtb3ZlQ2hpbGQoQ29udGV4dCAqKTsKLQotCVByb3BlcnRpZXMmIEdldFByb3BlcnRpZXMoKTsKLQlQcm9wZXJ0eVZhbHVlKiBHZXRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLQl2b2lkIFNldFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIFByb3BlcnR5VmFsdWUqIHZhbHVlKTsKLQotcHJpdmF0ZToKLQl2b2lkIGluaXRpYWxpemUoKTsKLQotCUNvbnRleHRJRCBpbnRlcm5hbElEOwotCUNvbnRleHRJRCBwYXJlbnRJRDsKLQotCXN0ZDo6bGlzdDxDb250ZXh0ICo+IGNoaWxkcmVuXzsKLQlQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci19OwotCi10eXBlZGVmIHZvaWQgQ29udGV4dEF0dGFjaENhbGxCYWNrKGludCwgQ29udGV4dCAqLCB2b2lkICopOwotCi0jZW5kaWYgLyogQ09OVEVYVF9IXyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2lmbmRlZiBUQ0ZDT05URVhUX0hfDQorI2RlZmluZSBUQ0ZDT05URVhUX0hfDQorDQorI2luY2x1ZGUgPG1hcD4NCisjaW5jbHVkZSA8dmVjdG9yPg0KKyNpbmNsdWRlIDxsaXN0Pg0KKyNpbmNsdWRlIDxzdHJpbmc+DQorDQorI2luY2x1ZGUgIkFnZW50RXhjZXB0aW9uLmgiDQorI2luY2x1ZGUgIlByb3BlcnR5VmFsdWUuaCINCisNCisjZGVmaW5lIFJPT1RfQ09OVEVYVF9JRAkicm9vdCINCisNCisvKg0KKyAqIFByb3BlcnRpZXMgb2YgY29udGV4dC4NCisgKi8NCisvKiBGcm9tOiBUQ0YgSVJ1bkNvbnRyb2wuamF2YS4NCisgKi8NCisjZGVmaW5lIFBST1BfSUQgCQkJIklEIg0KKyNkZWZpbmUgUFJPUF9QQVJFTlRfSUQJCSJQYXJlbnRJRCINCisjZGVmaW5lIFBST1BfUFJPQ0VTU19JRAkJIlByb2Nlc3NJRCINCisjZGVmaW5lIFBST1BfSVNfQ09OVEFJTkVSCSJJc0NvbnRhaW5lciINCisjZGVmaW5lIFBST1BfSEFTX1NUQVRFCQkiSGFzU3RhdGUiDQorI2RlZmluZSBQUk9QX0NBTl9SRVNVTUUJCSJDYW5SZXN1bWUiCS8vIHZhbHVlOiBpbnQvbG9uZw0KKyNkZWZpbmUgUFJPUF9DQU5fQ09VTlQJCSJDYW5Db3VudCINCisjZGVmaW5lIFBST1BfQ0FOX1NVU1BFTkQJIkNhblN1c3BlbmQiDQorI2RlZmluZSBQUk9QX0NBTl9URVJNSU5BVEUJIkNhblRlcm1pbmF0ZSINCisNCisvKiBGcm9tOiBUQ0YgSVByb2Nlc3Nlcy5qYXZhDQorICovDQorLyoqIElzIHRoZSBjb250ZXh0IGF0dGFjaGVkICovDQorI2RlZmluZSBQUk9QX0FUVEFDSEVECQkiQXR0YWNoZWQiDQorLyoqIFByb2Nlc3MgbmFtZS4gQ2xpZW50IFVJIGNhbiBzaG93IHRoaXMgbmFtZSB0byBhIHVzZXIgKi8NCisjZGVmaW5lIFBST1BfTkFNRSAJCQkiTmFtZSINCisNCisNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQ29udGV4dE9TSUQ7IC8vIElEIGluIHRoZSBPUw0KK3R5cGVkZWYgc3RkOjpzdHJpbmcgQ29udGV4dElEOyAvLyBJRCBpbiBkZWJ1Z2dlcg0KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBDb250ZXh0QWRkcmVzczsgLyogVHlwZSB0byByZXByZXNlbnQgYnl0ZWQgYWRkcmVzcyBpbnNpZGUgY29udGV4dCBtZW1vcnkgKi8NCisNCisvKg0KKyAqIENvbnRleHQgaW4gVENGIGFnZW50Lg0KKyAqIFRoZSBjb250ZXh0IGNhbiBiZSBhIHByb2Nlc3MsIHRocmVhZCwgcmVnaXN0ZXIgZ3JvdXAsIHJlZ2lzdGVyLCBldGMuDQorICovDQorY2xhc3MgQ29udGV4dCB7DQorcHVibGljOg0KKwlDb250ZXh0KGNvbnN0IENvbnRleHRJRCYgcGFyZW50SUQsIGNvbnN0IENvbnRleHRJRCYgaW50ZXJuYWxJRCk7DQorDQorCUNvbnRleHQoY29uc3QgQ29udGV4dElEJiBwYXJlbnRJRCwgY29uc3QgQ29udGV4dElEJiBpbnRlcm5hbElELCBQcm9wZXJ0aWVzJiBwcm9wcyk7DQorDQorCXZpcnR1YWwgfkNvbnRleHQoKTsNCisNCisJLyoNCisJICogR2V0IHVuaXF1ZSBJRCBmb3IgdGhlIGluc3RhbmNlLiBUaGlzIGlzIGludGVybmFsIElELCBub3QgcHJvY2VzcyBJRA0KKwkgKiBvciB0aHJlYWQgSUQgaW4gdGhlIE9TLg0KKwkgKi8NCisJQ29udGV4dElEIEdldElEKCk7DQorDQorCS8qIEdldCBpbnRlcm5hbCBJRCBvZiB0aGUgcHJvY2VzcyBpZiB0aGUgY29udGV4dCBpcyBhIHRocmVhZC4NCisJICogUmV0dXJuIGludmFsaWQgaWQgaWYgdGhlIGNvbnRleHQgaXMgYSBwcm9jZXNzLg0KKwkgKi8NCisJQ29udGV4dElEIEdldFBhcmVudElEKCk7DQorDQorCXZpcnR1YWwgc3RkOjpsaXN0PENvbnRleHQqPiYgR2V0Q2hpbGRyZW4oKTsNCisJdm9pZCBBZGRDaGlsZChDb250ZXh0ICopOw0KKwl2b2lkIFJlbW92ZUNoaWxkKENvbnRleHQgKik7DQorDQorCVByb3BlcnRpZXMmIEdldFByb3BlcnRpZXMoKTsNCisJUHJvcGVydHlWYWx1ZSYgR2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7DQorCXZvaWQgU2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3QgUHJvcGVydHlWYWx1ZSYgdmFsdWUpOw0KKw0KK3ByaXZhdGU6DQorCXZvaWQgaW5pdGlhbGl6ZSgpOw0KKw0KKwlDb250ZXh0SUQgaW50ZXJuYWxJRDsNCisJQ29udGV4dElEIHBhcmVudElEOw0KKw0KKwlzdGQ6Omxpc3Q8Q29udGV4dCAqPiBjaGlsZHJlbl87DQorCVByb3BlcnRpZXMgcHJvcGVydGllczsNCit9Ow0KKw0KK3R5cGVkZWYgdm9pZCBDb250ZXh0QXR0YWNoQ2FsbEJhY2soaW50LCBDb250ZXh0ICosIHZvaWQgKik7DQorDQorI2VuZGlmIC8qIENPTlRFWFRfSF8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZWdpc3RlckluZm9YODYuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvUmVnaXN0ZXJJbmZvWDg2LmNwcAppbmRleCAwZGM2ZWIyLi44ZTA1MmIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZWdpc3RlckluZm9YODYuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1JlZ2lzdGVySW5mb1g4Ni5jcHAKQEAgLTEsODQgKzEsODQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24uIE1hcmNoLCAyMDEwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlJlZ2lzdGVySW5mb1g4Ni5oIgotCi1zdGQ6Omxpc3Q8UmVnaXN0ZXJHcm91cEluZm8qPiBSZWdpc3RlckluZm9YODY6OnNSZWdpc3Rlckdyb3VwSW5mb3M7Ci0KLXN0ZDo6bGlzdDxSZWdpc3Rlckdyb3VwSW5mbyo+JiBSZWdpc3RlckluZm9YODY6OmdldFJlZ2lzdGVyR3JvdXBJbmZvKCkgewotCWlmIChzUmVnaXN0ZXJHcm91cEluZm9zLnNpemUoKSA9PSAwKQotCQlzZXR1cFJlZ2lzdGVyR3JvdXBJbmZvKCk7Ci0JCi0JcmV0dXJuIHNSZWdpc3Rlckdyb3VwSW5mb3M7Ci19Ci0JCi1SZWdpc3RlckluZm8qIFJlZ2lzdGVySW5mb1g4Njo6c2V0dXBSZWdpc3RlcihQcm9wZXJ0aWVzJiBjb21tUHJvcHMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHJvbGUpIHsKLQlQcm9wZXJ0aWVzIHByb3BzOwotCXByb3BzW1BST1BfTkFNRV0gPSBuZXcgUHJvcGVydHlWYWx1ZShuYW1lKTsKLQlpZiAocm9sZSAhPSBOVUxMKQotCQlwcm9wc1tQUk9QX1JPTEVdID0gbmV3IFByb3BlcnR5VmFsdWUocm9sZSk7Ci0JCi0JcmV0dXJuIG5ldyBSZWdpc3RlckluZm8oY29tbVByb3BzLCBwcm9wcyk7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc3RhdGljIGluZm8gZm9yIHg4NiBiYXNpYyBwcm9ncmFtIGV4ZWN1dGlvbiByZWdpc3RlcnMKLSAqIHdoaWNoIGluY2x1ZGVzIEdQUiwgU2VnbWVudCBSZWdpc3RlcnMgYW5kIEVGTEFHUyAmIEVJUC4KLSAqIFNlZSAiSW50ZWyuIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlIERldmVsb3BlcpJzIE1hbnVhbCIgVm9sIDEuCi0gKi8KLVJlZ2lzdGVyR3JvdXBJbmZvKiBSZWdpc3RlckluZm9YODY6OnNldHVwUmVnR3JvdXBfQmFzaWMoKSB7Ci0JLy8gUHJvcGVydGllcyBjb21tb24gdG8gYWxsIHJlZ2lzdGVycyBpbiB0aGUgZ3JvdXAKLQkvLwotCVByb3BlcnRpZXMgY29tbW9uUHJvcHM7Ci0KLQljb21tb25Qcm9wc1tQUk9QX1NJWkVdID0gbmV3IFByb3BlcnR5VmFsdWUoNCk7Ci0JY29tbW9uUHJvcHNbUFJPUF9SRUFEQUJMRV0gPSBuZXcgUHJvcGVydHlWYWx1ZSh0cnVlKTsKLQljb21tb25Qcm9wc1tQUk9QX1dSSVRFQUJMRV0gPSBuZXcgUHJvcGVydHlWYWx1ZSh0cnVlKTsKLQkvLyBwYXNzIHZhbHVlIGluIGJpZy1lbmRpYW4gc3RyaW5nLgotCS8vIEN1cnJlbnRseSBFREMgaG9zdCBzaWRlIGRvZXMgbm90IGhvbm9yIHRoaXMgeWV0LCBpbnN0ZWFkCi0JLy8gaXQgYWx3YXlzIGFzc3VtZSBiaWctZW5kaWFuLi4uLjAyLzI4LzEwCi0JY29tbW9uUHJvcHNbUFJPUF9CSUdfRU5ESUFOXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRydWUpOwotCS8vIFNlZSBUQ0YgUmVnaXN0ZXJzUHJveHkuQ29udGV4dCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2Ygb3RoZXIgcHJvcGVydGllcy4KLQotCXN0ZDo6bGlzdDxSZWdpc3RlckluZm8qPiByZWdzOwotCi0JcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVBWCIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRUNYIiwgTlVMTCkpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFRFgiLCBOVUxMKSk7Ci0JcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVCWCIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRVNQIiwgUk9MRV9TUCkpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFQlAiLCBST0xFX0ZQKSk7Ci0JcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVTSSIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRURJIiwgTlVMTCkpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJHUyIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRlMiLCBOVUxMKSk7Ci0JcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVTIiwgTlVMTCkpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJEUyIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRUlQIiwgUk9MRV9QQykpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJDUyIsIE5VTEwpKTsKLQlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRUZMIiwgTlVMTCkpOwotCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJTUyIsIE5VTEwpKTsKLQotCVByb3BlcnRpZXMgZ3JvdXBQcm9wczsKLQlncm91cFByb3BzW1BST1BfTkFNRV0gPQluZXcgUHJvcGVydHlWYWx1ZSgiQmFzaWMiKTsKLQlncm91cFByb3BzW1BST1BfREVTQ1JJUFRJT05dID0gbmV3IFByb3BlcnR5VmFsdWUoIkJhc2ljIFByb2dyYW0gRXhlY3V0aW9uIFJlZ2lzdGVycyBvZiB4ODYiKTsKLQlncm91cFByb3BzW1BST1BfUk9MRV0gPQluZXcgUHJvcGVydHlWYWx1ZShST0xFX0NPUkUpOwotCi0JcmV0dXJuIG5ldyBSZWdpc3Rlckdyb3VwSW5mbyhncm91cFByb3BzLCByZWdzKTsKLX0KLQotLyoKLSAqIFNldCB1cCBzdGF0aWMgaW5mbyBhYm91dCBhbGwgcmVnaXN0ZXJzIGFuZCByZWdpc3RlciBncm91cHMgc3VwcG9ydGVkLgotICogTm90ZSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLgotICovCi12b2lkIFJlZ2lzdGVySW5mb1g4Njo6c2V0dXBSZWdpc3Rlckdyb3VwSW5mbygpIHsKLQlzUmVnaXN0ZXJHcm91cEluZm9zLnB1c2hfYmFjayhzZXR1cFJlZ0dyb3VwX0Jhc2ljKCkpOwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLiBNYXJjaCwgMjAxMA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJSZWdpc3RlckluZm9YODYuaCINCisNCitzdGQ6Omxpc3Q8UmVnaXN0ZXJHcm91cEluZm8qPiBSZWdpc3RlckluZm9YODY6OnNSZWdpc3Rlckdyb3VwSW5mb3M7DQorDQorc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvKj4mIFJlZ2lzdGVySW5mb1g4Njo6Z2V0UmVnaXN0ZXJHcm91cEluZm8oKSB7DQorCWlmIChzUmVnaXN0ZXJHcm91cEluZm9zLnNpemUoKSA9PSAwKQ0KKwkJc2V0dXBSZWdpc3Rlckdyb3VwSW5mbygpOw0KKwkNCisJcmV0dXJuIHNSZWdpc3Rlckdyb3VwSW5mb3M7DQorfQ0KKwkNCitSZWdpc3RlckluZm8qIFJlZ2lzdGVySW5mb1g4Njo6c2V0dXBSZWdpc3RlcihQcm9wZXJ0aWVzJiBjb21tUHJvcHMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHJvbGUpIHsNCisJUHJvcGVydGllcyBwcm9wczsNCisJcHJvcHNbUFJPUF9OQU1FXSA9IFByb3BlcnR5VmFsdWUobmFtZSk7DQorCWlmIChyb2xlICE9IE5VTEwpDQorCQlwcm9wc1tQUk9QX1JPTEVdID0gUHJvcGVydHlWYWx1ZShyb2xlKTsNCisJDQorCXJldHVybiBuZXcgUmVnaXN0ZXJJbmZvKGNvbW1Qcm9wcywgcHJvcHMpOw0KK30NCisNCisvKg0KKyAqIFNldCB1cCBzdGF0aWMgaW5mbyBmb3IgeDg2IGJhc2ljIHByb2dyYW0gZXhlY3V0aW9uIHJlZ2lzdGVycw0KKyAqIHdoaWNoIGluY2x1ZGVzIEdQUiwgU2VnbWVudCBSZWdpc3RlcnMgYW5kIEVGTEFHUyAmIEVJUC4NCisgKiBTZWUgIkludGVsriA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXKScyBNYW51YWwiIFZvbCAxLg0KKyAqLw0KK1JlZ2lzdGVyR3JvdXBJbmZvKiBSZWdpc3RlckluZm9YODY6OnNldHVwUmVnR3JvdXBfQmFzaWMoKSB7DQorCS8vIFByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCByZWdpc3RlcnMgaW4gdGhlIGdyb3VwDQorCS8vDQorCVByb3BlcnRpZXMgY29tbW9uUHJvcHM7DQorDQorCWNvbW1vblByb3BzW1BST1BfU0laRV0gPSBQcm9wZXJ0eVZhbHVlKDQpOw0KKwljb21tb25Qcm9wc1tQUk9QX1JFQURBQkxFXSA9IFByb3BlcnR5VmFsdWUodHJ1ZSk7DQorCWNvbW1vblByb3BzW1BST1BfV1JJVEVBQkxFXSA9IFByb3BlcnR5VmFsdWUodHJ1ZSk7DQorCS8vIHBhc3MgdmFsdWUgaW4gYmlnLWVuZGlhbiBzdHJpbmcuDQorCS8vIEN1cnJlbnRseSBFREMgaG9zdCBzaWRlIGRvZXMgbm90IGhvbm9yIHRoaXMgeWV0LCBpbnN0ZWFkDQorCS8vIGl0IGFsd2F5cyBhc3N1bWUgYmlnLWVuZGlhbi4uLi4wMi8yOC8xMA0KKwljb21tb25Qcm9wc1tQUk9QX0JJR19FTkRJQU5dID0gUHJvcGVydHlWYWx1ZSh0cnVlKTsNCisJLy8gU2VlIFRDRiBSZWdpc3RlcnNQcm94eS5Db250ZXh0IGZvciBkZWZhdWx0IHZhbHVlcyBvZiBvdGhlciBwcm9wZXJ0aWVzLg0KKw0KKwlzdGQ6Omxpc3Q8UmVnaXN0ZXJJbmZvKj4gcmVnczsNCisNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVBWCIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVDWCIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVEWCIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVCWCIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVTUCIsIFJPTEVfU1ApKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVCUCIsIFJPTEVfRlApKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVTSSIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkVESSIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkdTIiwgTlVMTCkpOw0KKwlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRlMiLCBOVUxMKSk7DQorCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFUyIsIE5VTEwpKTsNCisJcmVncy5wdXNoX2JhY2soc2V0dXBSZWdpc3Rlcihjb21tb25Qcm9wcywgIkRTIiwgTlVMTCkpOw0KKwlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiRUlQIiwgUk9MRV9QQykpOw0KKwlyZWdzLnB1c2hfYmFjayhzZXR1cFJlZ2lzdGVyKGNvbW1vblByb3BzLCAiQ1MiLCBOVUxMKSk7DQorCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJFRkwiLCBOVUxMKSk7DQorCXJlZ3MucHVzaF9iYWNrKHNldHVwUmVnaXN0ZXIoY29tbW9uUHJvcHMsICJTUyIsIE5VTEwpKTsNCisNCisJUHJvcGVydGllcyBncm91cFByb3BzOw0KKwlncm91cFByb3BzW1BST1BfTkFNRV0gPQlQcm9wZXJ0eVZhbHVlKCJCYXNpYyIpOw0KKwlncm91cFByb3BzW1BST1BfREVTQ1JJUFRJT05dID0gUHJvcGVydHlWYWx1ZSgiQmFzaWMgUHJvZ3JhbSBFeGVjdXRpb24gUmVnaXN0ZXJzIG9mIHg4NiIpOw0KKwlncm91cFByb3BzW1BST1BfUk9MRV0gPQlQcm9wZXJ0eVZhbHVlKFJPTEVfQ09SRSk7DQorDQorCXJldHVybiBuZXcgUmVnaXN0ZXJHcm91cEluZm8oZ3JvdXBQcm9wcywgcmVncyk7DQorfQ0KKw0KKy8qDQorICogU2V0IHVwIHN0YXRpYyBpbmZvIGFib3V0IGFsbCByZWdpc3RlcnMgYW5kIHJlZ2lzdGVyIGdyb3VwcyBzdXBwb3J0ZWQuDQorICogTm90ZSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLg0KKyAqLw0KK3ZvaWQgUmVnaXN0ZXJJbmZvWDg2OjpzZXR1cFJlZ2lzdGVyR3JvdXBJbmZvKCkgew0KKwlzUmVnaXN0ZXJHcm91cEluZm9zLnB1c2hfYmFjayhzZXR1cFJlZ0dyb3VwX0Jhc2ljKCkpOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZWdpc3RlcnNTZXJ2aWNlLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1JlZ2lzdGVyc1NlcnZpY2UuY3BwCmluZGV4IDg0ZDA3Y2EuLmJjOTE3NTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1JlZ2lzdGVyc1NlcnZpY2UuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1JlZ2lzdGVyc1NlcnZpY2UuY3BwCkBAIC0xLDI2MyArMSwyNjMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJSZWdpc3RlcnNTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlICJEZWJ1Z01vbml0b3IuaCIKLSNpbmNsdWRlICJDb250ZXh0TWFuYWdlci5oIgotI2luY2x1ZGUgIkV2ZW50Q2xpZW50Tm90aWZpZXIuaCIKLSNpbmNsdWRlICJMb2dnZXIuaCIKLSNpbmNsdWRlICJUQ0ZDaGFubmVsLmgiCi0jaW5jbHVkZSAiV2luVGhyZWFkLmgiCi0jaW5jbHVkZSAiUmVnaXN0ZXJJbmZvWDg2LmgiCi0jaW5jbHVkZSAiUmVnaXN0ZXJHcm91cEluQWdlbnQuaCIKLSNpbmNsdWRlICJSZWdpc3RlckluQWdlbnQuaCIKLSNpbmNsdWRlICJBZ2VudFV0aWxzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBzU2VydmljZU5hbWUgPSAiUmVnaXN0ZXJzIjsKLQotLyoqCi0gKiBBZGQgcmVnaXN0ZXIgZ3JvdXAgJiByZWdpc3RlciBjb250ZXh0cyBmb3IgdGhlIGdpdmUgdGhyZWFkIGNvbnRleHQuCi0gKgotICogQHBhcmFtIHRocmVhZENvbnRleHRJRAotICogQHJldHVybiBsaXN0IG9mIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHRzLgotICovCi1zdGF0aWMgdm9pZCBhZGRSZWdpc3RlckNvbnRleHRzRm9yVGhyZWFkKHN0ZDo6c3RyaW5nIHRocmVhZENvbnRleHRJRCkgewotCi0JLy8gR2V0IHN0YXRpYyByZWdpc3RlciBpbmZvIGZpcnN0LgotCXN0ZDo6bGlzdDxSZWdpc3Rlckdyb3VwSW5mbyAqPiYgcmdJbmZvTGlzdCA9IFJlZ2lzdGVySW5mb1g4Njo6Z2V0UmVnaXN0ZXJHcm91cEluZm8oKTsKLQotCS8vIE5vdyBhZGQgdGhyZWFkLXNwZWNpZmljIHJlZ2lzdGVyIGNvbnRleHRzLgotCS8vCi0Jc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvICo+OjppdGVyYXRvciBpdDsKLQlmb3IgKGl0ID0gcmdJbmZvTGlzdC5iZWdpbigpOyBpdCAhPSByZ0luZm9MaXN0LmVuZCgpOyBpdCsrKSB7Ci0JCVByb3BlcnRpZXMmIHByb3BzID0gKCppdCktPmdldFByb3BlcnRpZXMoKTsKLQotCQkvLyBUaGlzIHdpbGwgYmUgYWRkZWQgYXMgY2hpbGQgY29udGV4dCBvZiB0aGUgdGhyZWFkLgotCQlSZWdpc3Rlckdyb3VwSW5BZ2VudCogcmdDb250ZXh0ID0gbmV3IFJlZ2lzdGVyR3JvdXBJbkFnZW50KAotCQkJcHJvcHNbUFJPUF9OQU1FXS0+Z2V0U3RyaW5nVmFsdWUoKSwgdGhyZWFkQ29udGV4dElELCBwcm9wcyk7Ci0KLQkJQ29udGV4dElEIHJnQ29udGV4dElEID0gcmdDb250ZXh0LT5HZXRJRCgpOwotCi0JCS8vIE5vdyBhZGQgcmVnaXN0ZXIgY29udGV4dHMgdW5kZXIgdGhlIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHQKLQkJLy8KLQkJc3RkOjpsaXN0PFJlZ2lzdGVySW5mbyo+JiByZWdzID0gKCppdCktPmdldFJlZ2lzdGVycygpOwotCQlmb3IgKHN0ZDo6bGlzdDxSZWdpc3RlckluZm8qPjo6aXRlcmF0b3IgaXQyID0gcmVncy5iZWdpbigpOyBpdDIgIT0gcmVncy5lbmQoKTsgaXQyKyspIHsKLQkJCVByb3BlcnRpZXMmIHJlZ1Byb3BzID0gKCppdDIpLT5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQluZXcgUmVnaXN0ZXJJbkFnZW50KHJlZ1Byb3BzW1BST1BfTkFNRV0tPmdldFN0cmluZ1ZhbHVlKCksIHJnQ29udGV4dElELCByZWdQcm9wcyk7Ci0JCX0KLQl9Ci19Ci0KLVJlZ2lzdGVyc1NlcnZpY2U6OlJlZ2lzdGVyc1NlcnZpY2UoUHJvdG9jb2wgKiBwcm90bykgOgotCVRDRlNlcnZpY2UocHJvdG8pCi17Ci0JQWRkQ29tbWFuZCgiZ2V0Q29udGV4dCIsIGNvbW1hbmRfZ2V0X2NvbnRleHQpOwotCUFkZENvbW1hbmQoImdldENoaWxkcmVuIiwgY29tbWFuZF9nZXRfY2hpbGRyZW4pOwotCUFkZENvbW1hbmQoImdldCIsIGNvbW1hbmRfZ2V0KTsKLQlBZGRDb21tYW5kKCJzZXQiLCBjb21tYW5kX3NldCk7Ci19Ci0KLVJlZ2lzdGVyc1NlcnZpY2U6On5SZWdpc3RlcnNTZXJ2aWNlKCkgewotCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgZGVzdHJ1Y3RvciBzdHViCi19Ci0KLWNvbnN0IGNoYXIqIFJlZ2lzdGVyc1NlcnZpY2U6OkdldE5hbWUoKSB7Ci0JcmV0dXJuIHNTZXJ2aWNlTmFtZTsKLX0KLQotdm9pZCBSZWdpc3RlcnNTZXJ2aWNlOjpjb21tYW5kX2dldF9jb250ZXh0KGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsKLQlMb2dUcmFjZSgiUmVnaXN0ZXJzU2VydmljZTo6Y29tbWFuZF9nZXRfY29udGV4dCIsICJ0b2tlbjogJXMiLCB0b2tlbik7Ci0JVENGQ2hhbm5lbCBjaGFubmVsKGMpOwotCXN0ZDo6c3RyaW5nIGlkID0gY2hhbm5lbC5yZWFkU3RyaW5nKCk7Ci0JY2hhbm5lbC5yZWFkWmVybygpOwotCWNoYW5uZWwucmVhZENvbXBsZXRlKCk7Ci0KLQlDb250ZXh0KiBjb250ZXh0ID0gQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KGlkKTsKLQotCWlmIChjb250ZXh0ID09IE5VTEwpIHsKLQkJLy8gUmV0dXJuIGFuIGludmFsaWQgY29udGV4dCBJRCBlcnJvci4KLQkJY2hhbm5lbC53cml0ZUNvbXBsZXRlUmVwbHkodG9rZW4sIEVSUl9JTlZfQ09OVEVYVCwgMSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JY2hhbm5lbC53cml0ZVJlcGx5SGVhZGVyKHRva2VuKTsKLQljaGFubmVsLndyaXRlRXJyb3IoMCk7Ci0JRXZlbnRDbGllbnROb3RpZmllcjo6V3JpdGVDb250ZXh0KCpjb250ZXh0LCBjaGFubmVsKTsKLQljaGFubmVsLndyaXRlWmVybygpOyAvLyBlbmQgb2YgY29udGV4dAotCWNoYW5uZWwud3JpdGVDb21wbGV0ZSgpOwotCi19Ci0KLXZvaWQgUmVnaXN0ZXJzU2VydmljZTo6Y29tbWFuZF9nZXRfY2hpbGRyZW4oY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgewotCUxvZ1RyYWNlKCJSdW5Db250cm9sOjpjb21tYW5kX2dldF9jaGlsZHJlbiIsICJ0b2tlbjogJXMiLCB0b2tlbik7Ci0JVENGQ2hhbm5lbCBjaGFubmVsKGMpOwotCi0Jc3RkOjpzdHJpbmcgaWQgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsKLQljaGFubmVsLnJlYWRaZXJvKCk7Ci0JY2hhbm5lbC5yZWFkQ29tcGxldGUoKTsKLQotCXN0ZDo6c3RyaW5nIHBhcmVudElEID0gaWQ7Ci0JaWYgKHBhcmVudElELmxlbmd0aCgpID09IDApCi0JCXBhcmVudElEID0gInJvb3QiOwotCi0KLQlDb250ZXh0KiBwYXJlbnQgPSBDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQocGFyZW50SUQpOwotCi0JaWYgKHBhcmVudCA9PSBOVUxMKSB7Ci0JCS8vIFJldHVybiBhbiBpbnZhbGlkIGNvbnRleHQgSUQgZXJyb3IuCi0JCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSU5WX0NPTlRFWFQsIDEpOwotCQlyZXR1cm47Ci0JfQotCQotCWNoYW5uZWwud3JpdGVSZXBseUhlYWRlcih0b2tlbik7Ci0JCi0JY2hhbm5lbC53cml0ZUVycm9yKDApOwotCi0JY2hhbm5lbC53cml0ZUNoYXJhY3RlcignWycpOwotCi0Jc3RkOjpsaXN0PENvbnRleHQqPiYgY2hpbGRyZW4gPSBwYXJlbnQtPkdldENoaWxkcmVuKCk7Ci0KLQlpZiAoTlVMTCAhPSBkeW5hbWljX2Nhc3Q8V2luVGhyZWFkKj4ocGFyZW50KSkgewotCQkvLyBDdXJyZW50bHkgaXQncyBhc3N1bWVkIHRocmVhZCBvbmx5IGhhcyByZWdpc3RlciBncm91cAotCQkvLyBjb250ZXh0cyBhcyBjaGlsZHJlbi4KLQkJLy8gQW5kIHdlIGhvb2sgdXAgdGhlIHJlZ2lzdGVyIGNoaWxkcmVuIHRvIGEgdGhyZWFkIG9ubHkKLQkJLy8gd2hlbiByZXF1ZXN0ZWQuIFRoaXMgd2F5IHdlIGRvbid0IGJvdGhlciBhZGRpbmcgcmVnaXN0ZXJzCi0JCS8vIGZvciBhIHRocmVhZCB0aGF0IHVzZXIgZG9lcyBub3QgY2FyZSBhYm91dC4KLQkJLy8gIC4uLi4uLi4uLi4uLi4uLi4uLjAyLzExLzEwCi0JCWlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCkgewotCQkJLy8gQWRkIHJlZ2lzdGVyIGNvbnRleHRzIGZvciB0aGUgdGhyZWFkIHdoZW4gYWNjZXNzZWQuCi0JCQlhZGRSZWdpc3RlckNvbnRleHRzRm9yVGhyZWFkKHBhcmVudElEKTsKLQkJCWNoaWxkcmVuID0gcGFyZW50LT5HZXRDaGlsZHJlbigpOwotCQl9Ci0KLQl9Ci0Jc3RkOjpsaXN0PENvbnRleHQqPjo6aXRlcmF0b3IgaXRyOwotCWZvciAoaXRyID0gY2hpbGRyZW4uYmVnaW4oKTsgaXRyICE9IGNoaWxkcmVuLmVuZCgpOyBpdHIrKykgewotCQlpZiAoaXRyICE9IGNoaWxkcmVuLmJlZ2luKCkpCi0JCQljaGFubmVsLndyaXRlQ2hhcmFjdGVyKCcsJyk7Ci0JCXN0ZDo6c3RyaW5nIGNvbnRleHRJRCA9ICgoQ29udGV4dCopICppdHIpLT5HZXRJRCgpOwotCQljaGFubmVsLndyaXRlU3RyaW5nKGNvbnRleHRJRCk7Ci0JfQotCi0JY2hhbm5lbC53cml0ZUNoYXJhY3RlcignXScpOwotCWNoYW5uZWwud3JpdGVaZXJvKCk7IC8vIGVuZCBvZiBjb250ZXh0Ci0KLQljaGFubmVsLndyaXRlQ29tcGxldGUoKTsKLX0KLQotLyoqCi0gKiBGaW5kIHRoZSBvd25lciB0aHJlYWQgY29udGV4dCBmb3IgYSByZWdpc3RlciBvciByZWdpc3RlciBncm91cCBjb250ZXh0LgotICogUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgotICogQHBhcmFtIHJlZ0N4dCByZWdpc3RlciBvciByZWdpc3RlciBncm91cCBjb250ZXh0LgotICovCi1XaW5UaHJlYWQqIGdldFRocmVhZEZvclJlZ2lzdGVyQ29udGV4dChDb250ZXh0KiByZWdDeHQpIHsKLQlSZWdpc3Rlckdyb3VwSW5BZ2VudCogcmVnR3JvdXA7Ci0KLQlpZiAoTlVMTCAhPSBkeW5hbWljX2Nhc3Q8UmVnaXN0ZXJJbkFnZW50ICo+KHJlZ0N4dCkpCi0JCXJlZ0dyb3VwID0gZHluYW1pY19jYXN0PFJlZ2lzdGVyR3JvdXBJbkFnZW50Kj4oQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KHJlZ0N4dC0+R2V0UGFyZW50SUQoKSkpOwotCWVsc2UgCi0JCXJlZ0dyb3VwID0gZHluYW1pY19jYXN0PFJlZ2lzdGVyR3JvdXBJbkFnZW50ICo+KHJlZ0N4dCk7Ci0KLQlpZiAocmVnR3JvdXAgPT0gTlVMTCkJIC8vIGludmFsaWQgY29udGV4dAotCQlyZXR1cm4gTlVMTDsKLQkKLQlzdGQ6OnN0cmluZyB0aHJlYWRJRCA9IHJlZ0dyb3VwLT5HZXRQYXJlbnRJRCgpOwotCVdpblRocmVhZCogdGhyZWFkID0gZHluYW1pY19jYXN0PFdpblRocmVhZCAqPihDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQodGhyZWFkSUQpKTsKLQotCXJldHVybiB0aHJlYWQ7Ci19Ci0KLS8qCi0gKiByZWdpc3RlciB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBoZXgtc3RyaW5nIGluIGJpZy1lbmRpYW4KLSAqLwotdm9pZCBSZWdpc3RlcnNTZXJ2aWNlOjpjb21tYW5kX2dldChjb25zdCBjaGFyICogdG9rZW4sIENoYW5uZWwgKiBjKSB7Ci0JVENGQ2hhbm5lbCBjaGFubmVsKGMpOwotCXN0ZDo6c3RyaW5nIHJlZ0N4dElEID0gY2hhbm5lbC5yZWFkU3RyaW5nKCk7Ci0JY2hhbm5lbC5yZWFkWmVybygpOwotCWNoYW5uZWwucmVhZENvbXBsZXRlKCk7Ci0KLQlSZWdpc3RlckluQWdlbnQqIHJlZ0N4dCA9IGR5bmFtaWNfY2FzdDxSZWdpc3RlckluQWdlbnQgKj4oQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KHJlZ0N4dElEKSk7Ci0JV2luVGhyZWFkKiB0aHJlYWQgPSBnZXRUaHJlYWRGb3JSZWdpc3RlckNvbnRleHQocmVnQ3h0KTsKLQotCWlmIChyZWdDeHQgPT0gTlVMTCB8fCB0aHJlYWQgPT0gTlVMTCB8fCAhdGhyZWFkLT5Jc0RlYnVnZ2luZygpKSB7Ci0JCS8vIFJldHVybiBpbnZhbGlkLWNvbnRleHQtSUQgZXJyb3IuCi0JCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSU5WX0NPTlRFWFQsIDEpOwotCQlyZXR1cm47Ci0JfQotCi0JaW50IHJlZ1NpemUgPSByZWdDeHQtPkdldFByb3BlcnRpZXMoKVtQUk9QX1NJWkVdLT5nZXRJbnRWYWx1ZSgpOwotCi0JY2hhciAqdmFsdWVCdWZmID0gdGhyZWFkLT5HZXRSZWdpc3RlclZhbHVlKAotCQkJcmVnQ3h0LT5HZXRQcm9wZXJ0aWVzKClbUFJPUF9OQU1FXS0+Z2V0U3RyaW5nVmFsdWUoKSwKLQkJCXJlZ1NpemUpOwotCi0JaWYgKHZhbHVlQnVmZiA9PSBOVUxMKSB7Ci0JCS8vIG5vIHZhbHVlcyBnb3QuIEFzc3VtaW5nIHRhcmdldCBpcyBydW5uaW5nLgotCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgRVJSX0lTX1JVTk5JTkcsIDEpOwotCQlyZXR1cm47Ci0JfQotCQotCS8vIEN1cnJlbnRseSBFREMgaG9zdCBleHBlY3RzIGJpZy1lbmRpYW4uCi0JQWdlbnRVdGlsczo6U3dhcEJ5dGVzKHZhbHVlQnVmZiwgcmVnU2l6ZSk7Ci0KLQljaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOwotCWNoYW5uZWwud3JpdGVFcnJvcigwKTsKLQotCWNoYW5uZWwud3JpdGVCaW5hcnlEYXRhKHZhbHVlQnVmZiwgcmVnU2l6ZSk7Ci0JZGVsZXRlW10gdmFsdWVCdWZmOwotCi0JY2hhbm5lbC53cml0ZUNvbXBsZXRlKCk7Ci19Ci0KLS8qCi0gKi8KLXZvaWQgUmVnaXN0ZXJzU2VydmljZTo6Y29tbWFuZF9zZXQoY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgewotCVRDRkNoYW5uZWwgY2hhbm5lbChjKTsKLQotCXN0ZDo6c3RyaW5nIHJlZ0N4dElEID0gY2hhbm5lbC5yZWFkU3RyaW5nKCk7Ci0JY2hhbm5lbC5yZWFkWmVybygpOwotCi0JUmVnaXN0ZXJJbkFnZW50KiByZWdDeHQgPSBkeW5hbWljX2Nhc3Q8UmVnaXN0ZXJJbkFnZW50ICo+KENvbnRleHRNYW5hZ2VyOjpmaW5kQ29udGV4dChyZWdDeHRJRCkpOwotCi0JaW50IHJlZ1NpemUgPSA0OwotCWlmIChyZWdDeHQgIT0gTlVMTCkgewotCQlyZWdTaXplID0gcmVnQ3h0LT5HZXRQcm9wZXJ0aWVzKClbUFJPUF9TSVpFXS0+Z2V0SW50VmFsdWUoKTsKLQl9Ci0JY2hhciogdmFsID0gY2hhbm5lbC5yZWFkQmluYXJ5RGF0YShyZWdTaXplKTsKLQljaGFubmVsLnJlYWRaZXJvKCk7Ci0JY2hhbm5lbC5yZWFkQ29tcGxldGUoKTsKLQotCVdpblRocmVhZCogdGhyZWFkID0gZ2V0VGhyZWFkRm9yUmVnaXN0ZXJDb250ZXh0KHJlZ0N4dCk7Ci0KLQlpZiAocmVnQ3h0ID09IE5VTEwgfHwgdGhyZWFkID09IE5VTEwgfHwgIXRocmVhZC0+SXNEZWJ1Z2dpbmcoKSkgewotCQkvLyBSZXR1cm4gaW52YWxpZC1jb250ZXh0LUlEIGVycm9yLgotCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgRVJSX0lOVl9DT05URVhUKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIEN1cnJlbnRseSBFREMgaG9zdCBzZW5kcyBiaWctZW5kaWFuIGRhdGEuCi0JQWdlbnRVdGlsczo6U3dhcEJ5dGVzKHZhbCwgcmVnU2l6ZSk7Ci0KLQlib29sIG9rID0gdGhyZWFkLT5TZXRSZWdpc3RlclZhbHVlKAotCQkJcmVnQ3h0LT5HZXRQcm9wZXJ0aWVzKClbUFJPUF9OQU1FXS0+Z2V0U3RyaW5nVmFsdWUoKSwKLQkJCXJlZ1NpemUsIHZhbCk7Ci0KLQlkZWxldGVbXSB2YWw7Ci0KLQlpZiAoIW9rKSB7Ci0JCS8vIEFzc3VtaW5nIHRhcmdldCBpcyBydW5uaW5nLgotCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgRVJSX0lTX1JVTk5JTkcpOwotCX0KLQllbHNlIHsKLQkJY2hhbm5lbC53cml0ZUNvbXBsZXRlUmVwbHkodG9rZW4sIDApOwotCX0KLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDEwIE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIlJlZ2lzdGVyc1NlcnZpY2UuaCINCisNCisjaW5jbHVkZSAiRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIkNvbnRleHRNYW5hZ2VyLmgiDQorI2luY2x1ZGUgIkV2ZW50Q2xpZW50Tm90aWZpZXIuaCINCisjaW5jbHVkZSAiTG9nZ2VyLmgiDQorI2luY2x1ZGUgIlRDRkNoYW5uZWwuaCINCisjaW5jbHVkZSAiV2luVGhyZWFkLmgiDQorI2luY2x1ZGUgIlJlZ2lzdGVySW5mb1g4Ni5oIg0KKyNpbmNsdWRlICJSZWdpc3Rlckdyb3VwSW5BZ2VudC5oIg0KKyNpbmNsdWRlICJSZWdpc3RlckluQWdlbnQuaCINCisjaW5jbHVkZSAiQWdlbnRVdGlscy5oIg0KKw0KK3N0YXRpYyBjb25zdCBjaGFyKiBzU2VydmljZU5hbWUgPSAiUmVnaXN0ZXJzIjsNCisNCisvKioNCisgKiBBZGQgcmVnaXN0ZXIgZ3JvdXAgJiByZWdpc3RlciBjb250ZXh0cyBmb3IgdGhlIGdpdmUgdGhyZWFkIGNvbnRleHQuDQorICoNCisgKiBAcGFyYW0gdGhyZWFkQ29udGV4dElEDQorICogQHJldHVybiBsaXN0IG9mIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHRzLg0KKyAqLw0KK3N0YXRpYyB2b2lkIGFkZFJlZ2lzdGVyQ29udGV4dHNGb3JUaHJlYWQoc3RkOjpzdHJpbmcgdGhyZWFkQ29udGV4dElEKSB7DQorDQorCS8vIEdldCBzdGF0aWMgcmVnaXN0ZXIgaW5mbyBmaXJzdC4NCisJc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvICo+JiByZ0luZm9MaXN0ID0gUmVnaXN0ZXJJbmZvWDg2OjpnZXRSZWdpc3Rlckdyb3VwSW5mbygpOw0KKw0KKwkvLyBOb3cgYWRkIHRocmVhZC1zcGVjaWZpYyByZWdpc3RlciBjb250ZXh0cy4NCisJLy8NCisJc3RkOjpsaXN0PFJlZ2lzdGVyR3JvdXBJbmZvICo+OjppdGVyYXRvciBpdDsNCisJZm9yIChpdCA9IHJnSW5mb0xpc3QuYmVnaW4oKTsgaXQgIT0gcmdJbmZvTGlzdC5lbmQoKTsgaXQrKykgew0KKwkJUHJvcGVydGllcyYgcHJvcHMgPSAoKml0KS0+Z2V0UHJvcGVydGllcygpOw0KKw0KKwkJLy8gVGhpcyB3aWxsIGJlIGFkZGVkIGFzIGNoaWxkIGNvbnRleHQgb2YgdGhlIHRocmVhZC4NCisJCVJlZ2lzdGVyR3JvdXBJbkFnZW50KiByZ0NvbnRleHQgPSBuZXcgUmVnaXN0ZXJHcm91cEluQWdlbnQoDQorCQkJcHJvcHNbUFJPUF9OQU1FXS5nZXRTdHJpbmdWYWx1ZSgpLCB0aHJlYWRDb250ZXh0SUQsIHByb3BzKTsNCisNCisJCUNvbnRleHRJRCByZ0NvbnRleHRJRCA9IHJnQ29udGV4dC0+R2V0SUQoKTsNCisNCisJCS8vIE5vdyBhZGQgcmVnaXN0ZXIgY29udGV4dHMgdW5kZXIgdGhlIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHQNCisJCS8vDQorCQlzdGQ6Omxpc3Q8UmVnaXN0ZXJJbmZvKj4mIHJlZ3MgPSAoKml0KS0+Z2V0UmVnaXN0ZXJzKCk7DQorCQlmb3IgKHN0ZDo6bGlzdDxSZWdpc3RlckluZm8qPjo6aXRlcmF0b3IgaXQyID0gcmVncy5iZWdpbigpOyBpdDIgIT0gcmVncy5lbmQoKTsgaXQyKyspIHsNCisJCQlQcm9wZXJ0aWVzJiByZWdQcm9wcyA9ICgqaXQyKS0+Z2V0UHJvcGVydGllcygpOw0KKwkJCW5ldyBSZWdpc3RlckluQWdlbnQocmVnUHJvcHNbUFJPUF9OQU1FXS5nZXRTdHJpbmdWYWx1ZSgpLCByZ0NvbnRleHRJRCwgcmVnUHJvcHMpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK1JlZ2lzdGVyc1NlcnZpY2U6OlJlZ2lzdGVyc1NlcnZpY2UoUHJvdG9jb2wgKiBwcm90bykgOg0KKwlUQ0ZTZXJ2aWNlKHByb3RvKQ0KK3sNCisJQWRkQ29tbWFuZCgiZ2V0Q29udGV4dCIsIGNvbW1hbmRfZ2V0X2NvbnRleHQpOw0KKwlBZGRDb21tYW5kKCJnZXRDaGlsZHJlbiIsIGNvbW1hbmRfZ2V0X2NoaWxkcmVuKTsNCisJQWRkQ29tbWFuZCgiZ2V0IiwgY29tbWFuZF9nZXQpOw0KKwlBZGRDb21tYW5kKCJzZXQiLCBjb21tYW5kX3NldCk7DQorfQ0KKw0KK1JlZ2lzdGVyc1NlcnZpY2U6On5SZWdpc3RlcnNTZXJ2aWNlKCkgew0KKwkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGRlc3RydWN0b3Igc3R1Yg0KK30NCisNCitjb25zdCBjaGFyKiBSZWdpc3RlcnNTZXJ2aWNlOjpHZXROYW1lKCkgew0KKwlyZXR1cm4gc1NlcnZpY2VOYW1lOw0KK30NCisNCit2b2lkIFJlZ2lzdGVyc1NlcnZpY2U6OmNvbW1hbmRfZ2V0X2NvbnRleHQoY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgew0KKwlMb2dUcmFjZSgiUmVnaXN0ZXJzU2VydmljZTo6Y29tbWFuZF9nZXRfY29udGV4dCIsICJ0b2tlbjogJXMiLCB0b2tlbik7DQorCVRDRkNoYW5uZWwgY2hhbm5lbChjKTsNCisJc3RkOjpzdHJpbmcgaWQgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsNCisJY2hhbm5lbC5yZWFkWmVybygpOw0KKwljaGFubmVsLnJlYWRDb21wbGV0ZSgpOw0KKw0KKwlDb250ZXh0KiBjb250ZXh0ID0gQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KGlkKTsNCisNCisJaWYgKGNvbnRleHQgPT0gTlVMTCkgew0KKwkJLy8gUmV0dXJuIGFuIGludmFsaWQgY29udGV4dCBJRCBlcnJvci4NCisJCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSU5WX0NPTlRFWFQsIDEpOw0KKwkJcmV0dXJuOw0KKwl9DQorCQ0KKwljaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOw0KKwljaGFubmVsLndyaXRlRXJyb3IoMCk7DQorCUV2ZW50Q2xpZW50Tm90aWZpZXI6OldyaXRlQ29udGV4dCgqY29udGV4dCwgY2hhbm5lbCk7DQorCWNoYW5uZWwud3JpdGVaZXJvKCk7IC8vIGVuZCBvZiBjb250ZXh0DQorCWNoYW5uZWwud3JpdGVDb21wbGV0ZSgpOw0KKw0KK30NCisNCit2b2lkIFJlZ2lzdGVyc1NlcnZpY2U6OmNvbW1hbmRfZ2V0X2NoaWxkcmVuKGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsNCisJTG9nVHJhY2UoIlJ1bkNvbnRyb2w6OmNvbW1hbmRfZ2V0X2NoaWxkcmVuIiwgInRva2VuOiAlcyIsIHRva2VuKTsNCisJVENGQ2hhbm5lbCBjaGFubmVsKGMpOw0KKw0KKwlzdGQ6OnN0cmluZyBpZCA9IGNoYW5uZWwucmVhZFN0cmluZygpOw0KKwljaGFubmVsLnJlYWRaZXJvKCk7DQorCWNoYW5uZWwucmVhZENvbXBsZXRlKCk7DQorDQorCXN0ZDo6c3RyaW5nIHBhcmVudElEID0gaWQ7DQorCWlmIChwYXJlbnRJRC5sZW5ndGgoKSA9PSAwKQ0KKwkJcGFyZW50SUQgPSAicm9vdCI7DQorDQorDQorCUNvbnRleHQqIHBhcmVudCA9IENvbnRleHRNYW5hZ2VyOjpmaW5kQ29udGV4dChwYXJlbnRJRCk7DQorDQorCWlmIChwYXJlbnQgPT0gTlVMTCkgew0KKwkJLy8gUmV0dXJuIGFuIGludmFsaWQgY29udGV4dCBJRCBlcnJvci4NCisJCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSU5WX0NPTlRFWFQsIDEpOw0KKwkJcmV0dXJuOw0KKwl9DQorCQ0KKwljaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOw0KKwkNCisJY2hhbm5lbC53cml0ZUVycm9yKDApOw0KKw0KKwljaGFubmVsLndyaXRlQ2hhcmFjdGVyKCdbJyk7DQorDQorCXN0ZDo6bGlzdDxDb250ZXh0Kj4mIGNoaWxkcmVuID0gcGFyZW50LT5HZXRDaGlsZHJlbigpOw0KKw0KKwlpZiAoTlVMTCAhPSBkeW5hbWljX2Nhc3Q8V2luVGhyZWFkKj4ocGFyZW50KSkgew0KKwkJLy8gQ3VycmVudGx5IGl0J3MgYXNzdW1lZCB0aHJlYWQgb25seSBoYXMgcmVnaXN0ZXIgZ3JvdXANCisJCS8vIGNvbnRleHRzIGFzIGNoaWxkcmVuLg0KKwkJLy8gQW5kIHdlIGhvb2sgdXAgdGhlIHJlZ2lzdGVyIGNoaWxkcmVuIHRvIGEgdGhyZWFkIG9ubHkNCisJCS8vIHdoZW4gcmVxdWVzdGVkLiBUaGlzIHdheSB3ZSBkb24ndCBib3RoZXIgYWRkaW5nIHJlZ2lzdGVycw0KKwkJLy8gZm9yIGEgdGhyZWFkIHRoYXQgdXNlciBkb2VzIG5vdCBjYXJlIGFib3V0Lg0KKwkJLy8gIC4uLi4uLi4uLi4uLi4uLi4uLjAyLzExLzEwDQorCQlpZiAoY2hpbGRyZW4uc2l6ZSgpID09IDApIHsNCisJCQkvLyBBZGQgcmVnaXN0ZXIgY29udGV4dHMgZm9yIHRoZSB0aHJlYWQgd2hlbiBhY2Nlc3NlZC4NCisJCQlhZGRSZWdpc3RlckNvbnRleHRzRm9yVGhyZWFkKHBhcmVudElEKTsNCisJCQljaGlsZHJlbiA9IHBhcmVudC0+R2V0Q2hpbGRyZW4oKTsNCisJCX0NCisNCisJfQ0KKwlzdGQ6Omxpc3Q8Q29udGV4dCo+OjppdGVyYXRvciBpdHI7DQorCWZvciAoaXRyID0gY2hpbGRyZW4uYmVnaW4oKTsgaXRyICE9IGNoaWxkcmVuLmVuZCgpOyBpdHIrKykgew0KKwkJaWYgKGl0ciAhPSBjaGlsZHJlbi5iZWdpbigpKQ0KKwkJCWNoYW5uZWwud3JpdGVDaGFyYWN0ZXIoJywnKTsNCisJCXN0ZDo6c3RyaW5nIGNvbnRleHRJRCA9ICgoQ29udGV4dCopICppdHIpLT5HZXRJRCgpOw0KKwkJY2hhbm5lbC53cml0ZVN0cmluZyhjb250ZXh0SUQpOw0KKwl9DQorDQorCWNoYW5uZWwud3JpdGVDaGFyYWN0ZXIoJ10nKTsNCisJY2hhbm5lbC53cml0ZVplcm8oKTsgLy8gZW5kIG9mIGNvbnRleHQNCisNCisJY2hhbm5lbC53cml0ZUNvbXBsZXRlKCk7DQorfQ0KKw0KKy8qKg0KKyAqIEZpbmQgdGhlIG93bmVyIHRocmVhZCBjb250ZXh0IGZvciBhIHJlZ2lzdGVyIG9yIHJlZ2lzdGVyIGdyb3VwIGNvbnRleHQuDQorICogUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLg0KKyAqIEBwYXJhbSByZWdDeHQgcmVnaXN0ZXIgb3IgcmVnaXN0ZXIgZ3JvdXAgY29udGV4dC4NCisgKi8NCitXaW5UaHJlYWQqIGdldFRocmVhZEZvclJlZ2lzdGVyQ29udGV4dChDb250ZXh0KiByZWdDeHQpIHsNCisJUmVnaXN0ZXJHcm91cEluQWdlbnQqIHJlZ0dyb3VwOw0KKw0KKwlpZiAoTlVMTCAhPSBkeW5hbWljX2Nhc3Q8UmVnaXN0ZXJJbkFnZW50ICo+KHJlZ0N4dCkpDQorCQlyZWdHcm91cCA9IGR5bmFtaWNfY2FzdDxSZWdpc3Rlckdyb3VwSW5BZ2VudCo+KENvbnRleHRNYW5hZ2VyOjpmaW5kQ29udGV4dChyZWdDeHQtPkdldFBhcmVudElEKCkpKTsNCisJZWxzZSANCisJCXJlZ0dyb3VwID0gZHluYW1pY19jYXN0PFJlZ2lzdGVyR3JvdXBJbkFnZW50ICo+KHJlZ0N4dCk7DQorDQorCWlmIChyZWdHcm91cCA9PSBOVUxMKQkgLy8gaW52YWxpZCBjb250ZXh0DQorCQlyZXR1cm4gTlVMTDsNCisJDQorCXN0ZDo6c3RyaW5nIHRocmVhZElEID0gcmVnR3JvdXAtPkdldFBhcmVudElEKCk7DQorCVdpblRocmVhZCogdGhyZWFkID0gZHluYW1pY19jYXN0PFdpblRocmVhZCAqPihDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQodGhyZWFkSUQpKTsNCisNCisJcmV0dXJuIHRocmVhZDsNCit9DQorDQorLyoNCisgKiByZWdpc3RlciB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBoZXgtc3RyaW5nIGluIGJpZy1lbmRpYW4NCisgKi8NCit2b2lkIFJlZ2lzdGVyc1NlcnZpY2U6OmNvbW1hbmRfZ2V0KGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsNCisJVENGQ2hhbm5lbCBjaGFubmVsKGMpOw0KKwlzdGQ6OnN0cmluZyByZWdDeHRJRCA9IGNoYW5uZWwucmVhZFN0cmluZygpOw0KKwljaGFubmVsLnJlYWRaZXJvKCk7DQorCWNoYW5uZWwucmVhZENvbXBsZXRlKCk7DQorDQorCVJlZ2lzdGVySW5BZ2VudCogcmVnQ3h0ID0gZHluYW1pY19jYXN0PFJlZ2lzdGVySW5BZ2VudCAqPihDb250ZXh0TWFuYWdlcjo6ZmluZENvbnRleHQocmVnQ3h0SUQpKTsNCisJV2luVGhyZWFkKiB0aHJlYWQgPSBnZXRUaHJlYWRGb3JSZWdpc3RlckNvbnRleHQocmVnQ3h0KTsNCisNCisJaWYgKHJlZ0N4dCA9PSBOVUxMIHx8IHRocmVhZCA9PSBOVUxMIHx8ICF0aHJlYWQtPklzRGVidWdnaW5nKCkpIHsNCisJCS8vIFJldHVybiBpbnZhbGlkLWNvbnRleHQtSUQgZXJyb3IuDQorCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgRVJSX0lOVl9DT05URVhULCAxKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwlpbnQgcmVnU2l6ZSA9IHJlZ0N4dC0+R2V0UHJvcGVydGllcygpW1BST1BfU0laRV0uZ2V0SW50VmFsdWUoKTsNCisNCisJY2hhciAqdmFsdWVCdWZmID0gdGhyZWFkLT5HZXRSZWdpc3RlclZhbHVlKA0KKwkJCXJlZ0N4dC0+R2V0UHJvcGVydGllcygpW1BST1BfTkFNRV0uZ2V0U3RyaW5nVmFsdWUoKSwNCisJCQlyZWdTaXplKTsNCisNCisJaWYgKHZhbHVlQnVmZiA9PSBOVUxMKSB7DQorCQkvLyBubyB2YWx1ZXMgZ290LiBBc3N1bWluZyB0YXJnZXQgaXMgcnVubmluZy4NCisJCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSVNfUlVOTklORywgMSk7DQorCQlyZXR1cm47DQorCX0NCisJDQorCS8vIEN1cnJlbnRseSBFREMgaG9zdCBleHBlY3RzIGJpZy1lbmRpYW4uDQorCUFnZW50VXRpbHM6OlN3YXBCeXRlcyh2YWx1ZUJ1ZmYsIHJlZ1NpemUpOw0KKw0KKwljaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOw0KKwljaGFubmVsLndyaXRlRXJyb3IoMCk7DQorDQorCWNoYW5uZWwud3JpdGVCaW5hcnlEYXRhKHZhbHVlQnVmZiwgcmVnU2l6ZSk7DQorCWRlbGV0ZVtdIHZhbHVlQnVmZjsNCisNCisJY2hhbm5lbC53cml0ZUNvbXBsZXRlKCk7DQorfQ0KKw0KKy8qDQorICovDQordm9pZCBSZWdpc3RlcnNTZXJ2aWNlOjpjb21tYW5kX3NldChjb25zdCBjaGFyICogdG9rZW4sIENoYW5uZWwgKiBjKSB7DQorCVRDRkNoYW5uZWwgY2hhbm5lbChjKTsNCisNCisJc3RkOjpzdHJpbmcgcmVnQ3h0SUQgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsNCisJY2hhbm5lbC5yZWFkWmVybygpOw0KKw0KKwlSZWdpc3RlckluQWdlbnQqIHJlZ0N4dCA9IGR5bmFtaWNfY2FzdDxSZWdpc3RlckluQWdlbnQgKj4oQ29udGV4dE1hbmFnZXI6OmZpbmRDb250ZXh0KHJlZ0N4dElEKSk7DQorDQorCWludCByZWdTaXplID0gNDsNCisJaWYgKHJlZ0N4dCAhPSBOVUxMKSB7DQorCQlyZWdTaXplID0gcmVnQ3h0LT5HZXRQcm9wZXJ0aWVzKClbUFJPUF9TSVpFXS5nZXRJbnRWYWx1ZSgpOw0KKwl9DQorCWNoYXIqIHZhbCA9IGNoYW5uZWwucmVhZEJpbmFyeURhdGEocmVnU2l6ZSk7DQorCWNoYW5uZWwucmVhZFplcm8oKTsNCisJY2hhbm5lbC5yZWFkQ29tcGxldGUoKTsNCisNCisJV2luVGhyZWFkKiB0aHJlYWQgPSBnZXRUaHJlYWRGb3JSZWdpc3RlckNvbnRleHQocmVnQ3h0KTsNCisNCisJaWYgKHJlZ0N4dCA9PSBOVUxMIHx8IHRocmVhZCA9PSBOVUxMIHx8ICF0aHJlYWQtPklzRGVidWdnaW5nKCkpIHsNCisJCS8vIFJldHVybiBpbnZhbGlkLWNvbnRleHQtSUQgZXJyb3IuDQorCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgRVJSX0lOVl9DT05URVhUKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwkvLyBDdXJyZW50bHkgRURDIGhvc3Qgc2VuZHMgYmlnLWVuZGlhbiBkYXRhLg0KKwlBZ2VudFV0aWxzOjpTd2FwQnl0ZXModmFsLCByZWdTaXplKTsNCisNCisJYm9vbCBvayA9IHRocmVhZC0+U2V0UmVnaXN0ZXJWYWx1ZSgNCisJCQlyZWdDeHQtPkdldFByb3BlcnRpZXMoKVtQUk9QX05BTUVdLmdldFN0cmluZ1ZhbHVlKCksDQorCQkJcmVnU2l6ZSwgdmFsKTsNCisNCisJZGVsZXRlW10gdmFsOw0KKw0KKwlpZiAoIW9rKSB7DQorCQkvLyBBc3N1bWluZyB0YXJnZXQgaXMgcnVubmluZy4NCisJCWNoYW5uZWwud3JpdGVDb21wbGV0ZVJlcGx5KHRva2VuLCBFUlJfSVNfUlVOTklORyk7DQorCX0NCisJZWxzZSB7DQorCQljaGFubmVsLndyaXRlQ29tcGxldGVSZXBseSh0b2tlbiwgMCk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvUmVzdW1lQ29udGV4dEFjdGlvbi5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZXN1bWVDb250ZXh0QWN0aW9uLmNwcAppbmRleCAzZWU1ZjFlLi40MjFmMDkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZXN1bWVDb250ZXh0QWN0aW9uLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZXN1bWVDb250ZXh0QWN0aW9uLmNwcApAQCAtMSw3OSArMSw3OSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiUmVzdW1lQ29udGV4dEFjdGlvbi5oIgotI2luY2x1ZGUgIlRDRkNvbnRleHQuaCIKLSNpbmNsdWRlICJXaW5Qcm9jZXNzLmgiCi0jaW5jbHVkZSAiV2luVGhyZWFkLmgiCi0jaW5jbHVkZSAiV2luRGVidWdNb25pdG9yLmgiCi0jaW5jbHVkZSAiUnVuQ29udHJvbFNlcnZpY2UuaCIKLSNpbmNsdWRlICJCcmVha3BvaW50c1NlcnZpY2UuaCIKLQotUmVzdW1lQ29udGV4dEFjdGlvbjo6UmVzdW1lQ29udGV4dEFjdGlvbihjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zLAotCQlXaW5Qcm9jZXNzJiBwcm9jZXNzLAotCQlXaW5UaHJlYWQmIHRocmVhZCwKLQkJbG9uZyByZXN1bWVNb2RlKSA6IEFnZW50QWN0aW9uKHBhcmFtcyksIHByb2Nlc3NfKHByb2Nlc3MpLCB0aHJlYWRfKHRocmVhZCkgewotCXJlc3VtZU1vZGVfID0gcmVzdW1lTW9kZTsKLX0KLQotUmVzdW1lQ29udGV4dEFjdGlvbjo6flJlc3VtZUNvbnRleHRBY3Rpb24odm9pZCkgewotfQotCi0vKgotICogVGhpcyB3aWxsICYgbXVzdCBiZSBydW4gaW4gZGVidWdnZXIgbW9uaXRvciB0aHJlYWQuCi0gKi8KLXZvaWQgUmVzdW1lQ29udGV4dEFjdGlvbjo6UnVuKCkgewotCS8vIFNpbmdsZSBzdGVwIG92ZXIgYSBicmVha3BvaW50IChpZiBhbnkpIGF0IGN1cnJlbnQgUEMuCi0JLy8KLQlUQnJlYWtwb2ludCogYnBBdFN0YXJ0QWRkcmVzcyA9IEJyZWFrcG9pbnRzU2VydmljZTo6RmluZEJyZWFrcG9pbnRCeUFkZHJlc3MocHJvY2Vzc18uR2V0UHJvY2Vzc0hhbmRsZSgpLCB0aHJlYWRfLkdldFBDQWRkcmVzcygpKTsKLQlpZiAoYnBBdFN0YXJ0QWRkcmVzcykgewotCQlCcmVha3BvaW50c1NlcnZpY2U6OkNsZWFyQnJlYWsoYnBBdFN0YXJ0QWRkcmVzcyk7Ci0JCXRocmVhZF8uRW5hYmxlU2luZ2xlU3RlcCgpOwotCX0KLQllbHNlIGlmIChyZXN1bWVNb2RlXyA9PSBSTV9TVEVQX0lOVE8pCi0JCXRocmVhZF8uRW5hYmxlU2luZ2xlU3RlcCgpOwotCi0JQ29udGludWVEZWJ1Z0V2ZW50KHByb2Nlc3NfLkdldE9TSUQoKSwgdGhyZWFkXy5HZXRPU0lEKCksIERCR19DT05USU5VRSk7Ci0KLQkvLyBub3RpZnkgaG9zdCB0aGUgUmVzdW1lIGFjdGlvbiBpcyBkb25lIGJlZm9yZQotCS8vIGFueSBzdXNwZW5kIGV2ZW50IGlzIHJlcG9ydGVkLgotCXBhcmFtcy5yZXBvcnRTdWNjZXNzRm9yQWN0aW9uKCk7Ci0KLQlpZiAoYnBBdFN0YXJ0QWRkcmVzcykgewotCQlERUJVR19FVkVOVCBkZWJ1Z0V2ZW50OwotCi0JCWlmIChXYWl0Rm9yRGVidWdFdmVudCgmZGVidWdFdmVudCwgMjAwIC8qIG1zICovKSkgewotCQkJLy8gRG9uZSBleGVjdXRpbmcgc2luZ2xlIGluc3RydWN0aW9uLgotCQkJQnJlYWtwb2ludHNTZXJ2aWNlOjpJbnNlcnRCcmVhayhicEF0U3RhcnRBZGRyZXNzKTsJLy8gcmVzdG9yZSB0aGUgYnAKLQotCQkJaWYgKGRlYnVnRXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPT0gRVhDRVBUSU9OX1NJTkdMRV9TVEVQKSB7Ci0JCQkJaWYgKHJlc3VtZU1vZGVfID09IFJNX1NURVBfSU5UTykKLQkJCQkJLy8gc2luZ2xlLXN0ZXAgZG9uZSwgcmVwb3J0IHN1c3BlbmQgZXZlbnQgdG8gaG9zdC4KLQkJCQkJcHJvY2Vzc18uR2V0TW9uaXRvcigpLT5IYW5kbGVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQpOwotCQkJCWVsc2UgewotCQkJCQkvLyBvdGhlciByZXN1bWUgbW9kZXMKLQkJCQkJLy8gSWdub3JlIHRoZSBTSU5HTEVfU1RFUCBldmVudCwgZ28gb24gdG8gUmVzdW1lIGFnYWluCi0JCQkJCUNvbnRpbnVlRGVidWdFdmVudChwcm9jZXNzXy5HZXRPU0lEKCksIHRocmVhZF8uR2V0T1NJRCgpLCBEQkdfQ09OVElOVUUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIE90aGVyIGV4Y2VwdGlvbnMKLQkJCQkvLyBIYW5kbGUgdGhlIGV2ZW50LCBzYXksIHJlcG9ydCB0byBob3N0LgotCQkJCXByb2Nlc3NfLkdldE1vbml0b3IoKS0+SGFuZGxlRGVidWdFdmVudChkZWJ1Z0V2ZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyYWNlKExPR19BTFdBWVMsICJGYWlsZWQgdG8gZXhlY3V0ZSBvbmUgaW5zdHJ1Y3Rpb24uIEVycm9yOiAlZCIsIEdldExhc3RFcnJvcigpKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gdGhlIGV2ZW50IGxvb3Agb2YgbW9uaXRvciB0aHJlYWQgd291bGQgY2F0Y2ggYW5kIHJlcG9ydCBldmVudC4KLQl9Ci19CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAiUmVzdW1lQ29udGV4dEFjdGlvbi5oIg0KKyNpbmNsdWRlICJUQ0ZDb250ZXh0LmgiDQorI2luY2x1ZGUgIldpblByb2Nlc3MuaCINCisjaW5jbHVkZSAiV2luVGhyZWFkLmgiDQorI2luY2x1ZGUgIldpbkRlYnVnTW9uaXRvci5oIg0KKyNpbmNsdWRlICJSdW5Db250cm9sU2VydmljZS5oIg0KKyNpbmNsdWRlICJCcmVha3BvaW50c1NlcnZpY2UuaCINCisNCitSZXN1bWVDb250ZXh0QWN0aW9uOjpSZXN1bWVDb250ZXh0QWN0aW9uKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMsDQorCQlXaW5Qcm9jZXNzJiBwcm9jZXNzLA0KKwkJV2luVGhyZWFkJiB0aHJlYWQsDQorCQlsb25nIHJlc3VtZU1vZGUpIDogQWdlbnRBY3Rpb24ocGFyYW1zKSwgcHJvY2Vzc18ocHJvY2VzcyksIHRocmVhZF8odGhyZWFkKSB7DQorCXJlc3VtZU1vZGVfID0gcmVzdW1lTW9kZTsNCit9DQorDQorUmVzdW1lQ29udGV4dEFjdGlvbjo6flJlc3VtZUNvbnRleHRBY3Rpb24odm9pZCkgew0KK30NCisNCisvKg0KKyAqIFRoaXMgd2lsbCAmIG11c3QgYmUgcnVuIGluIGRlYnVnZ2VyIG1vbml0b3IgdGhyZWFkLg0KKyAqLw0KK3ZvaWQgUmVzdW1lQ29udGV4dEFjdGlvbjo6UnVuKCkgew0KKwkvLyBTaW5nbGUgc3RlcCBvdmVyIGEgYnJlYWtwb2ludCAoaWYgYW55KSBhdCBjdXJyZW50IFBDLg0KKwkvLw0KKwlUQnJlYWtwb2ludCogYnBBdFN0YXJ0QWRkcmVzcyA9IEJyZWFrcG9pbnRzU2VydmljZTo6RmluZEJyZWFrcG9pbnRCeUFkZHJlc3MocHJvY2Vzc18uR2V0UHJvY2Vzc0hhbmRsZSgpLCB0aHJlYWRfLkdldFBDQWRkcmVzcygpKTsNCisJaWYgKGJwQXRTdGFydEFkZHJlc3MpIHsNCisJCUJyZWFrcG9pbnRzU2VydmljZTo6Q2xlYXJCcmVhayhicEF0U3RhcnRBZGRyZXNzKTsNCisJCXRocmVhZF8uRW5hYmxlU2luZ2xlU3RlcCgpOw0KKwl9DQorCWVsc2UgaWYgKHJlc3VtZU1vZGVfID09IFJNX1NURVBfSU5UTykNCisJCXRocmVhZF8uRW5hYmxlU2luZ2xlU3RlcCgpOw0KKw0KKwlDb250aW51ZURlYnVnRXZlbnQocHJvY2Vzc18uR2V0T1NJRCgpLCB0aHJlYWRfLkdldE9TSUQoKSwgdGhyZWFkXy5HZXRDb250aW51ZVN0YXR1cygpKTsNCisNCisJLy8gbm90aWZ5IGhvc3QgdGhlIFJlc3VtZSBhY3Rpb24gaXMgZG9uZSBiZWZvcmUNCisJLy8gYW55IHN1c3BlbmQgZXZlbnQgaXMgcmVwb3J0ZWQuDQorCXBhcmFtcy5yZXBvcnRTdWNjZXNzRm9yQWN0aW9uKCk7DQorDQorCWlmIChicEF0U3RhcnRBZGRyZXNzKSB7DQorCQlERUJVR19FVkVOVCBkZWJ1Z0V2ZW50Ow0KKw0KKwkJaWYgKFdhaXRGb3JEZWJ1Z0V2ZW50KCZkZWJ1Z0V2ZW50LCAyMDAgLyogbXMgKi8pKSB7DQorCQkJLy8gRG9uZSBleGVjdXRpbmcgc2luZ2xlIGluc3RydWN0aW9uLg0KKwkJCUJyZWFrcG9pbnRzU2VydmljZTo6SW5zZXJ0QnJlYWsoYnBBdFN0YXJ0QWRkcmVzcyk7CS8vIHJlc3RvcmUgdGhlIGJwDQorDQorCQkJaWYgKGRlYnVnRXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPT0gRVhDRVBUSU9OX1NJTkdMRV9TVEVQKSB7DQorCQkJCWlmIChyZXN1bWVNb2RlXyA9PSBSTV9TVEVQX0lOVE8pDQorCQkJCQkvLyBzaW5nbGUtc3RlcCBkb25lLCByZXBvcnQgc3VzcGVuZCBldmVudCB0byBob3N0Lg0KKwkJCQkJcHJvY2Vzc18uR2V0TW9uaXRvcigpLT5IYW5kbGVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQpOw0KKwkJCQllbHNlIHsNCisJCQkJCS8vIG90aGVyIHJlc3VtZSBtb2Rlcw0KKwkJCQkJLy8gSWdub3JlIHRoZSBTSU5HTEVfU1RFUCBldmVudCwgZ28gb24gdG8gUmVzdW1lIGFnYWluDQorCQkJCQlDb250aW51ZURlYnVnRXZlbnQocHJvY2Vzc18uR2V0T1NJRCgpLCB0aHJlYWRfLkdldE9TSUQoKSwgREJHX0NPTlRJTlVFKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIHsNCisJCQkJLy8gT3RoZXIgZXhjZXB0aW9ucw0KKwkJCQkvLyBIYW5kbGUgdGhlIGV2ZW50LCBzYXksIHJlcG9ydCB0byBob3N0Lg0KKwkJCQlwcm9jZXNzXy5HZXRNb25pdG9yKCktPkhhbmRsZURlYnVnRXZlbnQoZGVidWdFdmVudCk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdHJhY2UoTE9HX0FMV0FZUywgIkZhaWxlZCB0byBleGVjdXRlIG9uZSBpbnN0cnVjdGlvbi4gRXJyb3I6ICVkIiwgR2V0TGFzdEVycm9yKCkpOw0KKwkJfQ0KKwl9DQorCWVsc2Ugew0KKwkJLy8gdGhlIGV2ZW50IGxvb3Agb2YgbW9uaXRvciB0aHJlYWQgd291bGQgY2F0Y2ggYW5kIHJlcG9ydCBldmVudC4NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9TZXR0aW5nc1NlcnZpY2UuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA2ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgPHN0cmluZz4NCisjaW5jbHVkZSA8dmVjdG9yPg0KKw0KKyNpbmNsdWRlICJTZXR0aW5nc1NlcnZpY2UuaCINCisjaW5jbHVkZSAiVENGQ2hhbm5lbC5oIg0KKyNpbmNsdWRlICJXaW5EZWJ1Z01vbml0b3IuaCINCisNCisjZGVmaW5lIF9FWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTgkJCQkxIDw8IDA7DQorI2RlZmluZSBfRVhDRVBUSU9OX0FSUkFZX0JPVU5EU19FWENFRURFRAkJMSA8PCAxOw0KKyNkZWZpbmUgX0VYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQJCTEgPDwgMjsNCisjZGVmaW5lIF9FWENFUFRJT05fRkxUX0RFTk9STUFMX09QRVJBTkQJCQkxIDw8IDM7DQorI2RlZmluZSBfRVhDRVBUSU9OX0ZMVF9ESVZJREVfQllfWkVSTwkJCTEgPDwgNDsNCisjZGVmaW5lIF9FWENFUFRJT05fRkxUX0lORVhBQ1RfUkVTVUxUCQkJMSA8PCA1Ow0KKyNkZWZpbmUgX0VYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT04JCTEgPDwgNjsNCisjZGVmaW5lIF9FWENFUFRJT05fRkxUX09WRVJGTE9XCQkJCQkxIDw8IDc7DQorI2RlZmluZSBfRVhDRVBUSU9OX0ZMVF9TVEFDS19DSEVDSwkJCQkxIDw8IDg7DQorI2RlZmluZSBfRVhDRVBUSU9OX0ZMVF9VTkRFUkZMT1cJCQkJMSA8PCA5Ow0KKyNkZWZpbmUgX0VYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OCQkJMSA8PCAxMDsNCisjZGVmaW5lIF9FWENFUFRJT05fSU5fUEFHRV9FUlJPUgkJCQkxIDw8IDExOw0KKyNkZWZpbmUgX0VYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8JCQkxIDw8IDEyOw0KKyNkZWZpbmUgX0VYQ0VQVElPTl9JTlRfT1ZFUkZMT1cJCQkJCTEgPDwgMTM7DQorI2RlZmluZSBfRVhDRVBUSU9OX0lOVkFMSURfRElTUE9TSVRJT04JCQkxIDw8IDE0Ow0KKyNkZWZpbmUgX0VYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT04JCTEgPDwgMTU7DQorI2RlZmluZSBfRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT04JCQkJMSA8PCAxNjsNCisjZGVmaW5lIF9FWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1cJCQkJMSA8PCAxNzsNCisjZGVmaW5lIF9FWENFUFRJT05fR1VBUkRfUEFHRQkJCQkJMSA8PCAxODsNCisjZGVmaW5lIF9FWENFUFRJT05fSU5WQUxJRF9IQU5ETEUJCQkJMSA8PCAxOTsNCisjZGVmaW5lIF9EQkdfQ09OVFJPTF9DCQkJCQkJCTEgPDwgMjA7DQorI2RlZmluZSBfREJHX0NPTlRST0xfQlJFQUsJCQkJCQkxIDw8IDIxOw0KKyNkZWZpbmUgX1NUQVRVU19OT19NRU1PUlkJCQkJCQkxIDw8IDIyOw0KKyNkZWZpbmUgX1NUQVRVU19ETExfSU5JVF9GQUlMRUQJCQkJCTEgPDwgMjM7DQorI2RlZmluZSBfU1RBVFVTX0RMTF9OT1RfRk9VTkQJCQkJCTEgPDwgMjQ7DQorI2RlZmluZSBfU1RBVFVTX0VOVFJZUE9JTlRfTk9UX0ZPVU5ECQkJMSA8PCAyNTsNCisjZGVmaW5lIF9NU19DUExVU19FWENFUFRJT04JCQkJCQkxIDw8IDI2Ow0KKw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogc1NlcnZpY2VOYW1lID0gIlNldHRpbmdzIjsNCisNCitzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1vZHVsZXNUb0RlYnVnOw0KK3N0YXRpYyBib29sIGFsbG93RmlsZW5hbWVNYXRjaDsNCitzdGF0aWMgYm9vbCBlbmFibGVEZWJ1Z1N0cmluZ0xvZ2dpbmc7DQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZXhjZXB0aW9uc0JpdG1hc2s7DQorc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZXR0aW5nSWRBcnJheTsNCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGV4ZWN1dGFibGVzOw0KKw0KK1NldHRpbmdzU2VydmljZTo6U2V0dGluZ3NTZXJ2aWNlKFByb3RvY29sICogcHJvdG8pIDoNCisJVENGU2VydmljZShwcm90bykgew0KKwlhbGxvd0ZpbGVuYW1lTWF0Y2ggPSBmYWxzZTsNCisJZW5hYmxlRGVidWdTdHJpbmdMb2dnaW5nID0gdHJ1ZTsNCisJZXhjZXB0aW9uc0JpdG1hc2sgPSAweDAwMDAwMDAwTDsgLy8gbm8gZXhjZXB0aW9ucyByZXBvcnRlZCBieSBkZWZhdWx0DQorDQorICAgIEFkZENvbW1hbmQoImdldCIsIGNvbW1hbmRfZ2V0X3NldHRpbmdzKTsJCS8vIGNvbXBhdGliaWxpdHkgLS0gbm90IHVzZWQNCisgICAgQWRkQ29tbWFuZCgiZ2V0SWRzIiwgY29tbWFuZF9nZXRfc2V0dGluZ3MpOw0KKyAgICBBZGRDb21tYW5kKCJzZXQiLCBjb21tYW5kX3NldF9zZXR0aW5ncyk7DQorfQ0KKw0KK1NldHRpbmdzU2VydmljZTo6flNldHRpbmdzU2VydmljZSh2b2lkKSB7DQorfQ0KKw0KK2NvbnN0IGNoYXIqIFNldHRpbmdzU2VydmljZTo6R2V0TmFtZSgpIHsNCisJcmV0dXJuIHNTZXJ2aWNlTmFtZTsNCit9DQorDQordm9pZCBTZXR0aW5nc1NlcnZpY2U6OmNvbW1hbmRfZ2V0X3NldHRpbmdzKGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsNCisgICAgVENGQ2hhbm5lbCBjaGFubmVsKGMpOw0KKw0KKyAgICBjaGFubmVsLnJlYWRDb21wbGV0ZSgpOw0KKw0KKyAgICBjaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOw0KKyAgICBjaGFubmVsLndyaXRlRXJyb3IoMCk7DQorICAgIHdyaXRlX3N0cmVhbSgmYy0+b3V0LCdbJyk7DQorICAgIHdyaXRlX3N0cmVhbSgmYy0+b3V0LCddJyk7DQorDQorICAgIGNoYW5uZWwud3JpdGVaZXJvKCk7DQorICAgIGNoYW5uZWwud3JpdGVDb21wbGV0ZSgpOw0KK30NCisNCitzdGF0aWMgdm9pZCByZWFkX3NldHRpbmdfaWQoSW5wdXRTdHJlYW0gKiBpbnAsIHZvaWQgKiBhcmcpDQorew0KKyAgICBDaGFubmVsKiBjID0gc3RhdGljX2Nhc3Q8Q2hhbm5lbCo+KGFyZyk7DQorDQorICAgIFRDRkNoYW5uZWwgY2hhbm5lbChjKTsNCisgICAgc3RkOjpzdHJpbmcgaWQgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsNCisgICAgc2V0dGluZ0lkQXJyYXkucHVzaF9iYWNrKGlkKTsNCit9DQorDQorc3RhdGljIHZvaWQgcmVhZF9leGVjdXRhYmxlKElucHV0U3RyZWFtICogaW5wLCB2b2lkICogYXJnKQ0KK3sNCisgICAgQ2hhbm5lbCogYyA9IHN0YXRpY19jYXN0PENoYW5uZWwqPihhcmcpOw0KKyAgICBUQ0ZDaGFubmVsIGNoYW5uZWwoYyk7DQorICAgIHN0ZDo6c3RyaW5nIGV4ZWN1dGFibGUgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsNCisJbW9kdWxlc1RvRGVidWcuaW5zZXJ0KGV4ZWN1dGFibGUpOw0KK30NCisNCitzdGF0aWMgdm9pZCByZWFkX3NldHRpbmdfdmFsdWUoSW5wdXRTdHJlYW0gKiBpbnAsIHZvaWQgKiBhcmcpDQorew0KKyAgICBDaGFubmVsKiBjID0gc3RhdGljX2Nhc3Q8Q2hhbm5lbCo+KGFyZyk7DQorICAgIFRDRkNoYW5uZWwgY2hhbm5lbChjKTsNCisNCisgICAgLy8gdGhlIHNldHRpbmcgaWRzIGFyZSBzdG9yZWQgaW4gc2V0dGluZ0lkQXJyYXkgaW4gdGhlIHNhbWUNCisgICAgLy8gb3JkZXIgYXMgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZXMuICBzbyBqdXN0DQorICAgIC8vIHBvcCB0aGUgZmlyc3Qgb25lIG9mZiBlYWNoIHRpbWUgdG8gZ2V0IHRoZSBzZXR0aW5nIGlkIGZvciB0aGlzIHZhbHVlLg0KKyAgICBzdGQ6OnN0cmluZyBpZCA9IHNldHRpbmdJZEFycmF5LmZyb250KCk7DQorICAgIHNldHRpbmdJZEFycmF5LmVyYXNlKHNldHRpbmdJZEFycmF5LmJlZ2luKCkpOw0KKw0KKyAgICBpZiAoaWQuY29tcGFyZSgiYWRkTW9kdWxlcyIpID09IDApDQorICAgIAlqc29uX3JlYWRfYXJyYXkoaW5wLCByZWFkX2V4ZWN1dGFibGUsIGMpOw0KKyAgICBlbHNlIGlmIChpZC5jb21wYXJlKCJhbGxvd0ZpbGVuYW1lTWF0Y2giKSA9PSAwKQ0KKyAgICAJYWxsb3dGaWxlbmFtZU1hdGNoID0ganNvbl9yZWFkX2Jvb2xlYW4oaW5wKTsNCisgICAgZWxzZSBpZiAoaWQuY29tcGFyZSgiZW5hYmxlRGVidWdTdHJpbmdMb2dnaW5nIikgPT0gMCkNCisgICAgCWVuYWJsZURlYnVnU3RyaW5nTG9nZ2luZyA9IGpzb25fcmVhZF9ib29sZWFuKGlucCk7DQorICAgIGVsc2UgaWYgKGlkLmNvbXBhcmUoImV4Y2VwdGlvbnNCaXRtYXNrIikgPT0gMCkNCisgICAgCWV4Y2VwdGlvbnNCaXRtYXNrID0ganNvbl9yZWFkX3Vsb25nKGlucCk7DQorICAgIGVsc2Ugew0KKyAgICAJLy8gc2tpcCB1bmtub3duIHNldHRpbmcNCisgICAgCWpzb25fc2tpcF9vYmplY3QoJmMtPmlucCk7DQorICAgIH0NCit9DQorDQordm9pZCBTZXR0aW5nc1NlcnZpY2U6OmNvbW1hbmRfc2V0X3NldHRpbmdzKGNvbnN0IGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsNCisgICAgVENGQ2hhbm5lbCBjaGFubmVsKGMpOw0KKyAgICBzdGQ6OnN0cmluZyBzdHIgPSBjaGFubmVsLnJlYWRTdHJpbmcoKTsgLy8gaWdub3JlZA0KKyAgICBjaGFubmVsLnJlYWRaZXJvKCk7DQorDQorICAgIHNldHRpbmdJZEFycmF5LmNsZWFyKCk7DQorDQorICAgIC8vIHJlYWQgdGhlIGFycmF5IG9mIHNldHRpbmcgaWRzDQorICAgIGpzb25fcmVhZF9hcnJheSgmYy0+aW5wLCByZWFkX3NldHRpbmdfaWQsIGMpOw0KKyAgICBjaGFubmVsLnJlYWRaZXJvKCk7DQorDQorICAgIC8vIG5vdyByZWFkIHRoZSBhcnJheSBvZiBzZXR0aW5nIHZhbHVlcw0KKyAgICBqc29uX3JlYWRfYXJyYXkoJmMtPmlucCwgcmVhZF9zZXR0aW5nX3ZhbHVlLCBjKTsNCisgICAgY2hhbm5lbC5yZWFkWmVybygpOw0KKw0KKyAgICBjaGFubmVsLnJlYWRDb21wbGV0ZSgpOw0KKw0KKyAgICBjaGFubmVsLndyaXRlUmVwbHlIZWFkZXIodG9rZW4pOw0KKyAgICBjaGFubmVsLndyaXRlRXJyb3IoMCk7DQorICAgIGNoYW5uZWwud3JpdGVDb21wbGV0ZSgpOw0KK30NCisNCitzdGQ6OnN0cmluZyBnZXRGaWxlbmFtZUZyb21QYXRoKHN0ZDo6c3RyaW5nIHBhdGgpDQorew0KKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHBhdGguZmluZF9sYXN0X29mKCdcXCcpOw0KKwlpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJldHVybiBwYXRoLnN1YnN0cihwb3MgKyAxLCBwYXRoLnNpemUoKSAtIHBvcyAtIDEpOw0KK30NCisNCisvKg0KKyAqIENhbGxlZCB3aGVuIGRlYnVnIHNlc3Npb24gZW5kcy4gRG8gYW55IGNsZWFudXAgbmVlZGVkLg0KKyAqLw0KK3ZvaWQgU2V0dGluZ3NTZXJ2aWNlOjpkZWJ1Z1Nlc3Npb25FbmRzKCkNCit7DQorCW1vZHVsZXNUb0RlYnVnLmNsZWFyKCk7DQorfQ0KKw0KK2Jvb2wgU2V0dGluZ3NTZXJ2aWNlOjpyZXBvcnREZWJ1Z0V2ZW50Rm9yTW9kdWxlKHN0ZDo6c3RyaW5nIG1vZHVsZSkNCit7DQorCS8vIGlmIG1vZHVsZXNUb0RlYnVnIGlzIGVtcHR5IHRoZW4gbm8gZmlsdGVyIGhhcyBiZWVuIHNldCAtIHJlcG9ydCBhbGwgZXZlbnRzDQorCWlmIChtb2R1bGVzVG9EZWJ1Zy5lbXB0eSgpKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCS8vIGZpcnN0IGxvb2sgZm9yIGFuIGV4YWN0LCBmdWxsIHBhdGggbWF0Y2gNCisJaWYgKG1vZHVsZXNUb0RlYnVnLmNvdW50KG1vZHVsZSkgPiAwKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCWlmIChhbGxvd0ZpbGVuYW1lTWF0Y2gpDQorCXsNCisJCS8vIG5vdyBqdXN0IHNlZSBpZiB0aGUgZmlsZW5hbWVzIG9mIGFueSBvZiB0aGUgbW9kdWxlcyBpbiB0aGUgZmlsdGVyIG1hdGNoIHRoZSBnaXZlbiBtb2R1bGUNCisJCXN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRNb2R1bGVzOw0KKwkJZm9yIChpdE1vZHVsZXMgPSBtb2R1bGVzVG9EZWJ1Zy5iZWdpbigpOyBpdE1vZHVsZXMNCisJCQkJIT0gbW9kdWxlc1RvRGVidWcuZW5kKCk7IGl0TW9kdWxlcysrKQ0KKwkJew0KKwkJCXN0ZDo6c3RyaW5nIHBhdGggPSAqaXRNb2R1bGVzOw0KKw0KKwkJCS8vIGdldCB0aGUgZmlsZW5hbWUNCisJCQlzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGdldEZpbGVuYW1lRnJvbVBhdGgocGF0aCk7DQorDQorCQkJLy8gc2VhcmNoIHRoZSBtb2R1bGUgc3RyaW5nDQorCQkJaWYgKHN0ZDo6c3RyaW5nOjpucG9zICE9IG1vZHVsZS5yZmluZChmaWxlbmFtZSkpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8vIGZpbHRlciBpcyBzZXQgYnV0IHRoZSBnaXZlbiBtb2R1bGUgaXMgbm90IGluIHRoZSBsaXN0IC0gZG9uJ3QgcmVwb3J0DQorCXJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBTZXR0aW5nc1NlcnZpY2U6OnJlcG9ydERlYnVnU3RyaW5nRXZlbnRzKCkNCit7DQorCXJldHVybiBlbmFibGVEZWJ1Z1N0cmluZ0xvZ2dpbmc7DQorfQ0KKw0KK2Jvb2wgU2V0dGluZ3NTZXJ2aWNlOjpyZXBvcnRFeGNlcHRpb25FdmVudChjb25zdCBERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCXN3aXRjaCAoZGVidWdFdmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkgew0KKw0KKwkvLyBhcyBhIGRlYnVnZ2VyIHdlIGFsd2F5cyByZXBvcnQgdGhlc2UNCisJY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6DQorCWNhc2UgRVhDRVBUSU9OX0JSRUFLUE9JTlQ6DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJLy8gaG9ub3IgdGhlIGV4Y2VwdGlvbiBzZXR0aW5ncw0KKwljYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOw0KKwljYXNlIEVYQ0VQVElPTl9BUlJBWV9CT1VORFNfRVhDRUVERUQ6DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfRVhDRVBUSU9OX0FSUkFZX0JPVU5EU19FWENFRURFRDsNCisJY2FzZSBFWENFUFRJT05fREFUQVRZUEVfTUlTQUxJR05NRU5UOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQ7DQorCWNhc2UgRVhDRVBUSU9OX0ZMVF9ERU5PUk1BTF9PUEVSQU5EOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9GTFRfREVOT1JNQUxfT1BFUkFORDsNCisJY2FzZSBFWENFUFRJT05fRkxUX0RJVklERV9CWV9aRVJPOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk87DQorCWNhc2UgRVhDRVBUSU9OX0ZMVF9JTkVYQUNUX1JFU1VMVDoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9FWENFUFRJT05fRkxUX0lORVhBQ1RfUkVTVUxUOw0KKwljYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfRVhDRVBUSU9OX0ZMVF9JTlZBTElEX09QRVJBVElPTjsNCisJY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9GTFRfT1ZFUkZMT1c7DQorCWNhc2UgRVhDRVBUSU9OX0ZMVF9TVEFDS19DSEVDSzoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9FWENFUFRJT05fRkxUX1NUQUNLX0NIRUNLOw0KKwljYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOw0KKwljYXNlIEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OOw0KKwljYXNlIEVYQ0VQVElPTl9JTl9QQUdFX0VSUk9SOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9JTl9QQUdFX0VSUk9SOw0KKwljYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTzsNCisJY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9JTlRfT1ZFUkZMT1c7DQorCWNhc2UgRVhDRVBUSU9OX0lOVkFMSURfRElTUE9TSVRJT046DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfRVhDRVBUSU9OX0lOVkFMSURfRElTUE9TSVRJT047DQorCWNhc2UgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9FWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OOw0KKwljYXNlIEVYQ0VQVElPTl9QUklWX0lOU1RSVUNUSU9OOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9QUklWX0lOU1RSVUNUSU9OOw0KKwljYXNlIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVzoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9FWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c7DQorCWNhc2UgRVhDRVBUSU9OX0dVQVJEX1BBR0U6DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfRVhDRVBUSU9OX0dVQVJEX1BBR0U7DQorCWNhc2UgRVhDRVBUSU9OX0lOVkFMSURfSEFORExFOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0VYQ0VQVElPTl9JTlZBTElEX0hBTkRMRTsNCisJY2FzZSBEQkdfQ09OVFJPTF9DOg0KKwkJcmV0dXJuIGV4Y2VwdGlvbnNCaXRtYXNrICYgX0RCR19DT05UUk9MX0M7DQorCWNhc2UgREJHX0NPTlRST0xfQlJFQUs6DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfREJHX0NPTlRST0xfQlJFQUs7DQorCWNhc2UgU1RBVFVTX05PX01FTU9SWToNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9TVEFUVVNfTk9fTUVNT1JZOw0KKwljYXNlIFNUQVRVU19ETExfSU5JVF9GQUlMRUQ6DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfU1RBVFVTX0RMTF9JTklUX0ZBSUxFRDsNCisJY2FzZSBTVEFUVVNfRExMX05PVF9GT1VORDoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9TVEFUVVNfRExMX05PVF9GT1VORDsNCisJY2FzZSBTVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkQ6DQorCQlyZXR1cm4gZXhjZXB0aW9uc0JpdG1hc2sgJiBfU1RBVFVTX0VOVFJZUE9JTlRfTk9UX0ZPVU5EOw0KKwljYXNlIE1TX0NQTFVTX0VYQ0VQVElPTjoNCisJCXJldHVybiBleGNlcHRpb25zQml0bWFzayAmIF9NU19DUExVU19FWENFUFRJT047DQorDQorCWRlZmF1bHQ6DQorCQkvLyBpdCdzIG5vdCBvbmUgb2YgdGhlIHR5cGljYWwgZXhjZXB0aW9ucyBhbmQgd2UgaGF2ZSBubyBzZXR0aW5nIGZvciBpdC4NCisJCS8vIGlmIGl0J3MgZmlyc3QgY2hhbmNlLCBkb24ndCByZXBvcnQgaXQuICBnaXZlIGl0IGJhY2sgZm9yIHRoZSBwcm9jZXNzL29zDQorCQkvLyB0byBoYW5kbGUuICBvdGhlcndpc2Ugd2UnbGwgcmVwb3J0IGl0IHRvIHRoZSBkZWJ1Z2dlci4NCisJICAgIHRyYWNlKExPR19BTFdBWVMsICJcdCAtLSBmaXJzdCBjaGFuY2U6JWQsIGZsYWdzOiVkIiwgZGVidWdFdmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNlLCBkZWJ1Z0V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25GbGFncyk7DQorCQlpZiAoZGVidWdFdmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNlKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmggYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9TZXR0aW5nc1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFkY2NiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI3ByYWdtYSBvbmNlDQorDQorI2luY2x1ZGUgPHNldD4NCisNCisjaW5jbHVkZSAiVENGU2VydmljZS5oIg0KKw0KKy8vIFRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIGFueSBXaW5kb3dzIHN5c3RlbSBoZWFkZXJzIGJ1dCBjYW4gYmUgZm91bmQgaGVyZToNCisvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3MDQ1ODglMjh2PXByb3QuMTAlMjkuYXNweA0KKyNkZWZpbmUJU1RBVFVTX0RMTF9OT1RfRk9VTkQJCQkJKCh1bnNpZ25lZCBsb25nKSAweEMwMDAwMTM1TCkNCisjZGVmaW5lCVNUQVRVU19FTlRSWVBPSU5UX05PVF9GT1VORAkJCSgodW5zaWduZWQgbG9uZykgMHhDMDAwMDEzOUwpDQorI2RlZmluZQlNU19DUExVU19FWENFUFRJT04JCQkJCSgodW5zaWduZWQgbG9uZykgMHhFMDZENzM2M0wpDQorDQorDQorc3RydWN0IFByb3RvY29sOw0KK3N0cnVjdCBDaGFubmVsOw0KKw0KK2NsYXNzIFNldHRpbmdzU2VydmljZTogcHVibGljIFRDRlNlcnZpY2Ugew0KK3B1YmxpYzoNCisJU2V0dGluZ3NTZXJ2aWNlKFByb3RvY29sICogcHJvdG8pOw0KKwl+U2V0dGluZ3NTZXJ2aWNlKHZvaWQpOw0KKw0KKwljb25zdCBjaGFyKiBHZXROYW1lKCk7DQorDQorCXN0YXRpYyB2b2lkIGNvbW1hbmRfZ2V0X3NldHRpbmdzKGNvbnN0IGNoYXIgKiwgQ2hhbm5lbCAqKTsNCisJc3RhdGljIHZvaWQgY29tbWFuZF9zZXRfc2V0dGluZ3MoY29uc3QgY2hhciAqLCBDaGFubmVsICopOw0KKw0KKwlzdGF0aWMgYm9vbCByZXBvcnREZWJ1Z0V2ZW50Rm9yTW9kdWxlKHN0ZDo6c3RyaW5nIG1vZHVsZSk7DQorCXN0YXRpYyBib29sIHJlcG9ydERlYnVnU3RyaW5nRXZlbnRzKCk7DQorCXN0YXRpYyBib29sIHJlcG9ydEV4Y2VwdGlvbkV2ZW50KGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCisJc3RhdGljIHZvaWQgZGVidWdTZXNzaW9uRW5kcygpOw0KK307DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpbkRlYnVnTW9uaXRvci5jcHAKaW5kZXggZWRlYzc2NC4uMTM3OWIzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5EZWJ1Z01vbml0b3IuY3BwCkBAIC0xLDcxNiArMSw3NDUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAiVENGSGVhZGVycy5oIgotI2luY2x1ZGUgIldpbkRlYnVnTW9uaXRvci5oIgotI2luY2x1ZGUgIkxvZ2dlci5oIgotI2luY2x1ZGUgIldpblByb2Nlc3MuaCIKLSNpbmNsdWRlICJXaW5UaHJlYWQuaCIKLSNpbmNsdWRlICJFdmVudENsaWVudE5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiQWdlbnRVdGlscy5oIgotI2luY2x1ZGUgInBzYXBpLmgiCi0jaW5jbHVkZSAiQWdlbnRBY3Rpb24uaCIKLSNpbmNsdWRlICJDb250ZXh0TWFuYWdlci5oIgotI2luY2x1ZGUgIkxvZ2dpbmdTZXJ2aWNlLmgiCi0KLS8vIFRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIGFueSBXaW5kb3dzIHN5c3RlbSBoZWFkZXJzCi0jZGVmaW5lCUVYQ0VQVElPTl9ETExfTk9UX0ZPVU5ECQkJCSgodW5zaWduZWQgbG9uZykgMHhDMDAwMDEzNUwpCi0jZGVmaW5lCUVYQ0VQVElPTl9FTlRSWV9OT1RfRk9VTkQJCQkoKHVuc2lnbmVkIGxvbmcpIDB4QzAwMDAxMzlMKQotI2RlZmluZQlFWENFUFRJT05fRExMX0lOSVRfRkFJTAkJCQkoKHVuc2lnbmVkIGxvbmcpIDB4QzAwMDAxNDJMKQotI2RlZmluZQlFWENFUFRJT05fTVNfQ1BMVVMJCQkJCSgodW5zaWduZWQgbG9uZykgMHhFMDZENzM2M0wpCi0jZGVmaW5lCUVYQ0VQVElPTl9WRE1fRVZFTlQJCQkJCSgodW5zaWduZWQgbG9uZykgMHg0MDAwMDAwNUwpCi0KLSNkZWZpbmUgQlVGU0laRSA1MTIKLQotCi1zdGQ6OnN0cmluZyBHZXRFeGVjdXRhYmxlSW5mbyhIQU5ETEUgaEZpbGUsIHVuc2lnbmVkIGxvbmcmIGJhc2VPZkNvZGUsIHVuc2lnbmVkIGxvbmcmIGNvZGVTaXplKQotewotCWNvZGVTaXplID0gMDsKLQlCT09MIGJTdWNjZXNzID0gRkFMU0U7Ci0JVENIQVIgcHN6RmlsZW5hbWVbTUFYX1BBVEgrMV07Ci0JSEFORExFIGhGaWxlTWFwOwotCXN0ZDo6d3N0cmluZyBwYXRoOwotCi0JLy8gR2V0IHRoZSBmaWxlIHNpemUuCi0JRFdPUkQgZHdGaWxlU2l6ZUhpID0gMDsKLQlEV09SRCBkd0ZpbGVTaXplTG8gPSBHZXRGaWxlU2l6ZShoRmlsZSwgJmR3RmlsZVNpemVIaSk7Ci0KLQlpZiggZHdGaWxlU2l6ZUxvID09IDAgJiYgZHdGaWxlU2l6ZUhpID09IDAgKQotCXsKLQkJcHJpbnRmKCJDYW5ub3QgbWFwIGEgZmlsZSB3aXRoIGEgbGVuZ3RoIG9mIHplcm8uXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIENyZWF0ZSBhIGZpbGUgbWFwcGluZyBvYmplY3QuCi0JaEZpbGVNYXAgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwKLQkJTlVMTCwKLQkJUEFHRV9SRUFET05MWSwKLQkJMCwKLQkJMSwKLQkJTlVMTCk7Ci0KLQlpZiAoaEZpbGVNYXApCi0JewotCQkvLyBDcmVhdGUgYSBmaWxlIG1hcHBpbmcgdG8gZ2V0IHRoZSBmaWxlIG5hbWUuCi0JCXZvaWQqIHBNZW0gPSBNYXBWaWV3T2ZGaWxlKGhGaWxlTWFwLCBGSUxFX01BUF9SRUFELCAwLCAwLCAxKTsKLQotCQlpZiAocE1lbSkKLQkJewotCi0JCQlQSU1BR0VfRE9TX0hFQURFUiBkb3NIZWFkZXI9KFBJTUFHRV9ET1NfSEVBREVSIClwTWVtOwotCQkJUElNQUdFX05UX0hFQURFUlMgcE5USGVhZGVyOwotCi0JCQlwTlRIZWFkZXIgPSAoUElNQUdFX05UX0hFQURFUlMpICgoRFdPUkQpZG9zSGVhZGVyICsgZG9zSGVhZGVyLT5lX2xmYW5ldyk7Ci0KLQkJCWlmICggcE5USGVhZGVyLT5TaWduYXR1cmUgPT0gSU1BR0VfTlRfU0lHTkFUVVJFICkKLQkJCXsKLQotCQkJCVBJTUFHRV9PUFRJT05BTF9IRUFERVIgT3B0aW9uYWxIZWFkZXIgPSAoUElNQUdFX09QVElPTkFMX0hFQURFUikmcE5USGVhZGVyLT5PcHRpb25hbEhlYWRlcjsKLQkJCQljb2RlU2l6ZSA9IE9wdGlvbmFsSGVhZGVyLT5TaXplT2ZDb2RlOwotCQkJCWJhc2VPZkNvZGUgPSBPcHRpb25hbEhlYWRlci0+QmFzZU9mQ29kZTsKLQkJCX0KLQotCi0JCQlpZiAoR2V0TWFwcGVkRmlsZU5hbWUgKEdldEN1cnJlbnRQcm9jZXNzKCksCi0JCQkJcE1lbSwKLQkJCQlwc3pGaWxlbmFtZSwKLQkJCQlNQVhfUEFUSCkpCi0JCQl7Ci0KLQkJCQkvLyBUcmFuc2xhdGUgcGF0aCB3aXRoIGRldmljZSBuYW1lIHRvIGRyaXZlIGxldHRlcnMuCi0JCQkJVENIQVIgc3pUZW1wW0JVRlNJWkVdOwotCQkJCXN6VGVtcFswXSA9ICdcMCc7Ci0KLQkJCQlpZiAoR2V0TG9naWNhbERyaXZlU3RyaW5ncyhCVUZTSVpFLTEsIHN6VGVtcCkpCi0JCQkJewotCQkJCQlUQ0hBUiBzek5hbWVbTUFYX1BBVEhdOwotCQkJCQlUQ0hBUiBzekRyaXZlWzNdID0gVEVYVCgiIDoiKTsKLQkJCQkJQk9PTCBiRm91bmQgPSBGQUxTRTsKLQkJCQkJVENIQVIqIHAgPSBzelRlbXA7Ci0KLQkJCQkJZG8KLQkJCQkJewotCQkJCQkJLy8gQ29weSB0aGUgZHJpdmUgbGV0dGVyIHRvIHRoZSB0ZW1wbGF0ZSBzdHJpbmcKLQkJCQkJCSpzekRyaXZlID0gKnA7Ci0KLQkJCQkJCS8vIExvb2sgdXAgZWFjaCBkZXZpY2UgbmFtZQotCQkJCQkJaWYgKFF1ZXJ5RG9zRGV2aWNlKHN6RHJpdmUsIHN6TmFtZSwgTUFYX1BBVEgpKQotCQkJCQkJewotCQkJCQkJCVVJTlQgdU5hbWVMZW4gPSBfdGNzbGVuKHN6TmFtZSk7Ci0KLQkJCQkJCQlpZiAodU5hbWVMZW4gPCBNQVhfUEFUSCkKLQkJCQkJCQl7Ci0JCQkJCQkJCWJGb3VuZCA9IF90Y3NuaWNtcChwc3pGaWxlbmFtZSwgc3pOYW1lLAotCQkJCQkJCQkJdU5hbWVMZW4pID09IDA7Ci0KLQkJCQkJCQkJaWYgKGJGb3VuZCkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gUmVjb25zdHJ1Y3QgcHN6RmlsZW5hbWUgdXNpbmcgc3pUZW1wRmlsZQotCQkJCQkJCQkJLy8gUmVwbGFjZSBkZXZpY2UgcGF0aCB3aXRoIERPUyBwYXRoCi0JCQkJCQkJCQlUQ0hBUiBzelRlbXBGaWxlW01BWF9QQVRIXTsKLQotCQkJCQkJCQkJc25wcmludGYoc3pUZW1wRmlsZSwgc2l6ZW9mKHN6VGVtcEZpbGUpLAotCQkJCQkJCQkJCVRFWFQoIiVzJXMiKSwKLQkJCQkJCQkJCQlzekRyaXZlLAotCQkJCQkJCQkJCXBzekZpbGVuYW1lK3VOYW1lTGVuKTsKLQkJCQkJCQkJCXN0cm5jcHkocHN6RmlsZW5hbWUsIHN6VGVtcEZpbGUsIF90Y3NsZW4oc3pUZW1wRmlsZSkpOwotCQkJCQkJCQkJcHN6RmlsZW5hbWVbX3Rjc2xlbihzelRlbXBGaWxlKV0gPSAwOwotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIEdvIHRvIHRoZSBuZXh0IE5VTEwgY2hhcmFjdGVyLgotCQkJCQkJd2hpbGUgKCpwKyspOwotCQkJCQl9IHdoaWxlICghYkZvdW5kICYmICpwKTsgLy8gZW5kIG9mIHN0cmluZwotCQkJCX0KLQkJCX0KLQkJCWJTdWNjZXNzID0gVFJVRTsKLQkJCVVubWFwVmlld09mRmlsZShwTWVtKTsKLQkJfQotCi0JCUNsb3NlSGFuZGxlKGhGaWxlTWFwKTsKLQl9Ci0JcmV0dXJuIEFnZW50VXRpbHM6Om1ha2VTdHJpbmcocHN6RmlsZW5hbWUpOwotfQotCi1XaW5EZWJ1Z01vbml0b3I6OldpbkRlYnVnTW9uaXRvcihjb25zdCBMYXVuY2hQcm9jZXNzUGFyYW1zJiBwYXJhbXMpIDoKLQkJRGVidWdNb25pdG9yKHBhcmFtcykKLXsKLQltZW1zZXQoJnByb2Nlc3NJbmZvLCAwLCBzaXplb2YocHJvY2Vzc0luZm8pKTsKLQotCWhhbmRsZWRGaXJzdEV4Y2VwdGlvbl8gPSBmYWxzZTsKLQl3YWl0Rm9yRGVidWdFdmVudHMgPSB0cnVlOwotCXdmZGVXYWl0ID0gNTA7Ci0JbW9uaXRvclRocmVhZF8gPSBOVUxMOwotCWlzQXR0YWNoID0gZmFsc2U7Ci19Ci0KLVdpbkRlYnVnTW9uaXRvcjo6V2luRGVidWdNb25pdG9yKGNvbnN0IEF0dGFjaFRvUHJvY2Vzc1BhcmFtcyYgcGFyYW1zKSA6Ci0JRGVidWdNb25pdG9yKHBhcmFtcykKLXsKLQltZW1zZXQoJnByb2Nlc3NJbmZvLCAwLCBzaXplb2YocHJvY2Vzc0luZm8pKTsKLQotCWhhbmRsZWRGaXJzdEV4Y2VwdGlvbl8gPSBmYWxzZTsKLQl3YWl0Rm9yRGVidWdFdmVudHMgPSB0cnVlOwotCXdmZGVXYWl0ID0gNTA7Ci0JbW9uaXRvclRocmVhZF8gPSBOVUxMOwotCXRoaXMtPnByb2Nlc3NJRCA9IChEV09SRCkgcGFyYW1zLnByb2Nlc3NJRDsKLQlpc0F0dGFjaCA9IHRydWU7Ci19Ci0KLVdpbkRlYnVnTW9uaXRvcjo6fldpbkRlYnVnTW9uaXRvcih2b2lkKQotewotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6TGF1bmNoUHJvY2Vzcyhjb25zdCBMYXVuY2hQcm9jZXNzUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikKLXsKLQkobmV3IFdpbkRlYnVnTW9uaXRvcihwYXJhbXMpKS0+U3RhcnRNb25pdG9yKCk7Ci19Ci0KLS8qCi0gKiBTdGF0aWMgbWV0aG9kLiBFbnRyeSBmb3IgYXR0YWNoaW5nLgotICovCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6QXR0YWNoVG9Qcm9jZXNzKGNvbnN0IEF0dGFjaFRvUHJvY2Vzc1BhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pCi17Ci0JKG5ldyBXaW5EZWJ1Z01vbml0b3IocGFyYW1zKSktPlN0YXJ0TW9uaXRvcigpOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6U3RhcnREZWJ1ZygpIHsKLQlpZiAoISBpc0F0dGFjaCkKLQkJU3RhcnRQcm9jZXNzRm9yRGVidWcoKTsKLQllbHNlCi0JCUF0dGFjaFRvUHJvY2Vzc0ZvckRlYnVnKCk7Ci19Ci0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkF0dGFjaFRvUHJvY2Vzc0ZvckRlYnVnKCkKLXsKLQkvLyBOb3RlIHRoaXMgaXMgc3VwcG9zZWQgdG8gcmVwbHkgdG8gVENGIHJlcXVlc3QgUHJvY2Vzc1NlcnZpY2U6OkNvbW1hbmRfQXR0YWNoKCkuCi0KLQlpZiAoIURlYnVnQWN0aXZlUHJvY2Vzcyhwcm9jZXNzSUQpKQotCXsKLQkJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7Ci0KLQkJQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KGNoYW5uZWwsIHRva2VuLCBzZXRfd2luMzJfZXJybm8oZXJyKSk7Ci0JfSBlbHNlIHsKLQkJLy8gQWxsb3cgZGV0YWNoIHdpdGhvdXQga2lsbC4KLQkJRGVidWdTZXRQcm9jZXNzS2lsbE9uRXhpdChmYWxzZSk7Ci0KLQkJLy8gT0sKLQkJQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KGNoYW5uZWwsIHRva2VuLCAwKTsKLQl9Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpTdGFydFByb2Nlc3NGb3JEZWJ1ZygpCi17Ci0JU1RBUlRVUElORk8JCQlzaTsKLQltZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKLSAgICBzaS5jYgkgICAgICAgCQk9IHNpemVvZiAoc2kpOwotCXNpLmR3RmxhZ3MJICAgICAgIAk9IFNUQVJURl9GT1JDRU9ORkVFREJBQ0sgfCBTVEFSVEZfVVNFU0hPV1dJTkRPVzsKLQlzaS53U2hvd1dpbmRvdyAgICAgCT0gU1dfU0hPV05PUk1BTDsKLQotCVRDSEFSKiBhcmdzQnVmZmVyID0gbmV3IFRDSEFSW2FyZ3Muc2l6ZSgpICsgc2l6ZW9mKFRDSEFSKV07Ci0KLQlzdHJjcHkoYXJnc0J1ZmZlciwgYXJncy5jX3N0cigpKTsKLQlzdGQ6OnN0cmluZyBleGVOYW1lID0gZXhlY3V0YWJsZTsKLQotCUxQVFNUUiB3b3JraW5nRGlyZWN0b3J5ID0gTlVMTDsKLQlpZiAoZGlyZWN0b3J5Lmxlbmd0aCgpID4gMCkKLQl7Ci0JCXdvcmtpbmdEaXJlY3RvcnkgPSAoTFBUU1RSKWRpcmVjdG9yeS5jX3N0cigpOwotCX0KLQotCWNoYXIqIGVudkJ1ZmZlciA9IE5VTEw7Ci0Jc3RkOjpzdHJpbmcgZW52U3RyaW5nOwotCWlmIChlbnZpcm9ubWVudC5zaXplKCkgPiAwKQotCXsKLQkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdEVudkRhdGE7Ci0JCWZvciAoaXRFbnZEYXRhID0gZW52aXJvbm1lbnQuYmVnaW4oKTsgaXRFbnZEYXRhCi0JCQkJIT0gZW52aXJvbm1lbnQuZW5kKCk7IGl0RW52RGF0YSsrKQotCQl7Ci0JCQlzdGQ6OnN0cmluZyB2YWx1ZSA9ICppdEVudkRhdGE7Ci0JCQllbnZTdHJpbmcgKz0gdmFsdWU7Ci0JCQllbnZTdHJpbmcgKz0gY2hhcigwKTsKLQkJfQotCQllbnZTdHJpbmcgKz0gY2hhcigwKTsKLQkJZW52QnVmZmVyID0gbmV3IGNoYXJbZW52U3RyaW5nLmxlbmd0aCgpXTsKLQkJbWVtY3B5KGVudkJ1ZmZlciwgZW52U3RyaW5nLmNfc3RyKCksIGVudlN0cmluZy5sZW5ndGgoKSk7Ci0JfQotCi0JaWYgKCFDcmVhdGVQcm9jZXNzKGV4ZU5hbWUuY19zdHIoKSwgYXJnc0J1ZmZlciwKLQkJKExQU0VDVVJJVFlfQVRUUklCVVRFUylOVUxMLAotCQkoTFBTRUNVUklUWV9BVFRSSUJVVEVTKU5VTEwsCi0JCUZBTFNFLAotCQkoR2V0RGVidWdDaGlsZHJlbigpID8gREVCVUdfUFJPQ0VTUyA6IERFQlVHX09OTFlfVEhJU19QUk9DRVNTKSAgfCBDUkVBVEVfTkVXX0NPTlNPTEUsCi0JCWVudkJ1ZmZlciwKLQkJd29ya2luZ0RpcmVjdG9yeSwJCQkJLy9OVUxMLAotCQkoTFBTVEFSVFVQSU5GTykmc2ksCi0JCShMUFBST0NFU1NfSU5GT1JNQVRJT04pJnByb2Nlc3NJbmZvKSkKLQl7Ci0JCURXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOwotCQlzdGQ6OnN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgIjsKLQkJbXNnICs9ICdcIic7Ci0JCW1zZyArPSBBZ2VudFV0aWxzOjptYWtlVVRGOFN0cmluZyhleGVOYW1lKTsKLQkJbXNnICs9ICJcIiI7Ci0JCWVyciA9IHNldF93aW4zMl9lcnJubyhlcnIpOwotCi0JCUFnZW50QWN0aW9uUmVwbHk6OnBvc3RSZXBseShjaGFubmVsLCB0b2tlbiwgZXJyLCAxLCBuZXcgc3RkOjpzdHJpbmcobXNnKSk7Ci0JfSBlbHNlIHsKLQkJLy8gQU9LCQotCQlBZ2VudEFjdGlvblJlcGx5Ojpwb3N0UmVwbHkoY2hhbm5lbCwgdG9rZW4sIDAsIDEpOwotCX0KLQotCWRlbGV0ZVtdIGVudkJ1ZmZlcjsKLQlkZWxldGVbXSBhcmdzQnVmZmVyOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6Q2FwdHVyZU1vbml0b3JUaHJlYWQoKQotewotCUR1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLEdldEN1cnJlbnRUaHJlYWQoKSwKLQkJR2V0Q3VycmVudFByb2Nlc3MoKSwmbW9uaXRvclRocmVhZF8sCi0JCTAsRkFMU0UsRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKLX0KLQotRFdPUkQgV0lOQVBJIGRlYnVnZ2VyTW9uaXRvclRocmVhZChMUFZPSUQgcGFyYW0pCi17Ci0JV2luRGVidWdNb25pdG9yICogZHBtID0gKFdpbkRlYnVnTW9uaXRvciopcGFyYW07Ci0JCi0JdHJ5IAotCXsKLQkJZHBtLT5DYXB0dXJlTW9uaXRvclRocmVhZCgpOwotCQlkcG0tPlN0YXJ0RGVidWcoKTsKLQkJZHBtLT5FdmVudExvb3AoKTsKLQl9Ci0JY2F0Y2ggKGNvbnN0IEFnZW50RXhjZXB0aW9uJiBlKSAKLQl7Ci0JCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0JCXRyYWNlKExPR19BTFdBWVMsICJBZ2VudCBFeGNlcHRpb246IGNvZGU9JXg6ICVzIiwgZXJyb3IsIGUud2hhdCgpKTsKLQl9Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpTdXNwZW5kKCkKLXsKLQlTdXNwZW5kVGhyZWFkKG1vbml0b3JUaHJlYWRfKTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OlJlc3VtZSgpCi17Ci0JUmVzdW1lVGhyZWFkKG1vbml0b3JUaHJlYWRfKTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OlN0YXJ0TW9uaXRvcigpCi17Ci0JRFdPUkQgdGhyZWFkSUQgPSAwOwotCUhBTkRMRSBzdGFydFRocmVhZCA9IENyZWF0ZVRocmVhZCgKLQkJTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCi0JCTAsICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHN0YWNrIHNpemUKLQkJZGVidWdnZXJNb25pdG9yVGhyZWFkLCAgLy8gdGhyZWFkIGZ1bmN0aW9uIG5hbWUKLQkJdGhpcywgICAJCQkJLy8gYXJndW1lbnQgdG8gdGhyZWFkIGZ1bmN0aW9uCi0JCTAsICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IGNyZWF0aW9uIGZsYWdzCi0JCSZ0aHJlYWRJRCk7ICAgLy8gcmV0dXJucyB0aGUgdGhyZWFkIGlkZW50aWZpZXIKLQotCUNsb3NlSGFuZGxlKHN0YXJ0VGhyZWFkKTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkV2ZW50TG9vcCgpCi17Ci0JREVCVUdfRVZFTlQgZGVidWdFdmVudDsKLQotCXdoaWxlICh3YWl0Rm9yRGVidWdFdmVudHMpCi0JewotCQlpZiAoV2FpdEZvckRlYnVnRXZlbnQoJmRlYnVnRXZlbnQsIHdmZGVXYWl0KSkKLQkJCUhhbmRsZURlYnVnRXZlbnQoZGVidWdFdmVudCk7Ci0JCWVsc2UgewotCQkJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JCQlpZiAoZXJyID09IEVSUk9SX1NFTV9USU1FT1VUIHx8IGVyciA9PSAwKQotCQkJCUhhbmRsZU5vRGVidWdFdmVudCgpOwotCQkJZWxzZSB7Ci0JCQkJdHJhY2UoTE9HX0FMV0FZUywgIldpbkRlYnVnTW9uaXRvcjo6RXZlbnRMb29wOiBlcnJvciAlZCIsIGVycik7Ci0JCQkJd2FpdEZvckRlYnVnRXZlbnRzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpBdHRhY2godW5zaWduZWQgbG9uZyBwaWQsIENvbnRleHRBdHRhY2hDYWxsQmFjayAqIGRvbmUsIHZvaWQgKiBkYXRhLCBpbnQgc2VsZmF0dGFjaCkgewotCS8vIFRPRE86IGltcGxlbWVudAotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHdpbjMyX2RlYnVnX2V2ZW50X25hbWUoaW50IGV2ZW50KSB7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQ6Ci0JCXJldHVybiAiQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQiOwotCWNhc2UgQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVDoKLQkJcmV0dXJuICJDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UIjsKLQljYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoKLQkJcmV0dXJuICJFWENFUFRJT05fREVCVUdfRVZFTlQiOwotCWNhc2UgRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UOgotCQlyZXR1cm4gIkVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVCI7Ci0JY2FzZSBFWElUX1RIUkVBRF9ERUJVR19FVkVOVDoKLQkJcmV0dXJuICJFWElUX1RIUkVBRF9ERUJVR19FVkVOVCI7Ci0JY2FzZSBMT0FEX0RMTF9ERUJVR19FVkVOVDoKLQkJcmV0dXJuICJMT0FEX0RMTF9ERUJVR19FVkVOVCI7Ci0JY2FzZSBPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UOgotCQlyZXR1cm4gIk9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQiOwotCWNhc2UgVU5MT0FEX0RMTF9ERUJVR19FVkVOVDoKLQkJcmV0dXJuICJVTkxPQURfRExMX0RFQlVHX0VWRU5UIjsKLQl9Ci0JcmV0dXJuICJVbmtub3duIjsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZURlYnVnRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpCi17Ci0JTG9nVHJhY2UoIkRlYnVnUHJvY2Vzc01vbml0b3I6OkhhbmRsZURlYnVnRXZlbnQiLCAiZXZlbnQgY29kZTogJXMiLCB3aW4zMl9kZWJ1Z19ldmVudF9uYW1lKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkpOwotCXN3aXRjaCAoZGVidWdFdmVudC5kd0RlYnVnRXZlbnRDb2RlKQotCXsKLQljYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoKLQkJSGFuZGxlRXhjZXB0aW9uRXZlbnQoZGVidWdFdmVudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVDoKLQkJSGFuZGxlUHJvY2Vzc0NyZWF0ZWRFdmVudChkZWJ1Z0V2ZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIENSRUFURV9USFJFQURfREVCVUdfRVZFTlQ6Ci0JCUhhbmRsZVRocmVhZENyZWF0ZWRFdmVudChkZWJ1Z0V2ZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoKLQkJSGFuZGxlUHJvY2Vzc0V4aXRlZEV2ZW50KGRlYnVnRXZlbnQpOwotCQlyZXR1cm47Ci0KLQljYXNlIEVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UOgotCQlIYW5kbGVUaHJlYWRFeGl0ZWRFdmVudChkZWJ1Z0V2ZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIExPQURfRExMX0RFQlVHX0VWRU5UOgotCQlIYW5kbGVETExMb2FkZWRFdmVudChkZWJ1Z0V2ZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFVOTE9BRF9ETExfREVCVUdfRVZFTlQ6Ci0JCUhhbmRsZURMTFVubG9hZGVkRXZlbnQoZGVidWdFdmVudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UOgotCQlIYW5kbGVEZWJ1Z1N0cmluZ0V2ZW50KGRlYnVnRXZlbnQpOwotCQlicmVhazsKLQotCWNhc2UgUklQX0VWRU5UOgotCQlIYW5kbGVTeXN0ZW1EZWJ1Z0Vycm9yRXZlbnQoZGVidWdFdmVudCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJSGFuZGxlVW5rbndvbkRlYnVnRXZlbnQoZGVidWdFdmVudCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZU5vRGVidWdFdmVudCgpCi17Ci0Jd2hpbGUgKCFhY3Rpb25zXy5lbXB0eSgpKQotCXsKLQkJQWdlbnRBY3Rpb24qIGFjdGlvbiA9IGFjdGlvbnNfLmZyb250KCk7Ci0JCWFjdGlvbnNfLnBvcCgpOwotCQlhY3Rpb24tPlJ1bigpOwotCQlkZWxldGUgYWN0aW9uOwotCX0KLX0KLQotc3RkOjpzdHJpbmcgV2luRGVidWdNb25pdG9yOjpHZXREZWJ1Z0V4Y2VwdGlvbkRlc2NyaXB0aW9uKGNvbnN0IEVYQ0VQVElPTl9ERUJVR19JTkZPJiBleGNlcHRpb25JbmZvKSB7Ci0JRFdPUkQgY29kZSA9IGV4Y2VwdGlvbkluZm8uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGU7Ci0KLQljb25zdCBjaGFyKiBiYXNlID0gIkV4Y2VwdGlvbiI7Ci0Jc3RkOjpzdHJpbmcgZGV0YWlsOwotCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0JCWJhc2UgPSAiU3RlcCI7Ci0JCWJyZWFrOwotCWNhc2UgRVhDRVBUSU9OX0JSRUFLUE9JTlQ6Ci0JCWJhc2UgPSAiQnJlYWtwb2ludCI7Ci0JCWJyZWFrOwotCi0JY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKLQkJYmFzZSA9ICJBY2Nlc3MgdmlvbGF0aW9uIjsKLQkJZGV0YWlsID0gIiBhdCAweCIgKyBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZyhleGNlcHRpb25JbmZvLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCWJyZWFrOwotCWNhc2UgREJHX0NPTlRST0xfQzoKLQkJYmFzZSA9ICJDb250cm9sLUMiOwotCQlicmVhazsKLQljYXNlIERCR19DT05UUk9MX0JSRUFLOgotCQliYXNlID0gIkNvbnRyb2wtQnJlYWsiOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19EQVRBVFlQRV9NSVNBTElHTk1FTlQ6Ci0JCWJhc2UgPSAiRGF0YXR5cGUgbWlzYWxpZ25tZW50IjsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFUVVNfSU5fUEFHRV9FUlJPUjoKLQkJYmFzZSA9ICJWaXJ0dWFsIG1lbW9yeSBwYWdpbmcgZXJyb3IiOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19OT19NRU1PUlk6Ci0JCWJhc2UgPSAiT3V0IG9mIG1lbW9yeSI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT046Ci0JCWJhc2UgPSAiSWxsZWdhbCBpbnN0cnVjdGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoKLQkJYmFzZSA9ICAiTm9uY29udGludWFibGUgZXhjZXB0aW9uIjsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFUVVNfSU5WQUxJRF9ESVNQT1NJVElPTjoKLQkJYmFzZSA9ICAiSW52YWxpZCBkaXNwb3NpdGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX0FSUkFZX0JPVU5EU19FWENFRURFRDoKLQkJYmFzZSA9ICJBcnJheSBib3VuZHMgZXhjZWVkZWQiOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5EOgotCQliYXNlID0gIkZsb2F0aW5nIHBvaW50IGRlbm9ybWFsIG9wZXJhbmQiOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19GTE9BVF9ESVZJREVfQllfWkVSTzoKLQkJYmFzZSA9ICAiRmxvYXRpbmcgcG9pbnQgZGl2aWRlIGJ5IHplcm8iOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19GTE9BVF9JTkVYQUNUX1JFU1VMVDoKLQkJYmFzZSA9ICAiRmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQiOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTjoKLQkJYmFzZSA9ICAiRmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24iOwotCQlicmVhazsKLQljYXNlIFNUQVRVU19GTE9BVF9TVEFDS19DSEVDSzoKLQkJYmFzZSA9ICJGbG9hdGluZyBwb2ludCBzdGFjayBjaGVjayI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX0ZMT0FUX09WRVJGTE9XOgotCQliYXNlID0gIkZsb2F0aW5nIHBvaW50IG92ZXJmbG93IjsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFUVVNfRkxPQVRfVU5ERVJGTE9XOgotCQliYXNlID0gIkZsb2F0aW5nIHBvaW50IHVuZGVyZmxvdyI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk86Ci0JCWJhc2UgPSAiSW50ZWdlciBkaXZpZGUgYnkgemVybyI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX0lOVEVHRVJfT1ZFUkZMT1c6Ci0JCWJhc2UgPSAiSW50ZWdlciBvdmVyZmxvdyI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT046Ci0JCWJhc2UgPSAiUHJpdmlsZWdlZCBpbnN0cnVjdGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFVTX1NUQUNLX09WRVJGTE9XOgotCQliYXNlID0gIlN0YWNrIG92ZXJmbG93IjsKLQkJYnJlYWs7Ci0JY2FzZSBFWENFUFRJT05fRExMX05PVF9GT1VORDoKLQkJYmFzZSA9ICJETEwgbm90IGZvdW5kIjsKLQkJLy8gVE9ETzogZmluZCBvdXQgaG93IHRvIGRldGVybWluZSB3aGljaCBETEwgaXQgd2FzLi4uCi0JCWJyZWFrOwotCWNhc2UgRVhDRVBUSU9OX0RMTF9JTklUX0ZBSUw6Ci0JCWJhc2UgPSAiRExMIGluaXRpYWxpemF0aW9uIGZhaWxlZCI7Ci0JCWJyZWFrOwotCWNhc2UgRVhDRVBUSU9OX0VOVFJZX05PVF9GT1VORDoKLQkJYmFzZSA9ICJFbnRyeSBwb2ludCBub3QgZm91bmQiOwotCQlicmVhazsKLQljYXNlIEVYQ0VQVElPTl9NU19DUExVUzoKLQkJYmFzZSA9ICJDKysgZXhjZXB0aW9uIjsKLQkJYnJlYWs7Ci0KLQljYXNlIFJQQ19TX1VOS05PV05fSUY6Ci0JCWJhc2UgPSAiUlBDIHVua25vd24gaW50ZXJmYWNlIjsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEU6Ci0JCWJhc2UgPSAiUlBDIHNlcnZlciB1bmF2YWlsYWJsZSI7Ci0JCWJyZWFrOwotCWNhc2UgRVhDRVBUSU9OX1ZETV9FVkVOVDoKLQkJYmFzZSA9ICJWRE0gZXZlbnQiOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoZGV0YWlsLnNpemUoKSA+IDApIHsKLQkJcmV0dXJuIHN0ZDo6c3RyaW5nKGJhc2UpICsgZGV0YWlsOwotCX0KLQlyZXR1cm4gYmFzZTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZUV4Y2VwdGlvbkV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCUxvZ1RyYWNlKCJEZWJ1Z1Byb2Nlc3NNb25pdG9yOjpIYW5kbGVFeGNlcHRpb25FdmVudCIsICJldmVudCBjb2RlOiAlcyIsCi0JCQlHZXREZWJ1Z0V4Y2VwdGlvbkRlc2NyaXB0aW9uKGRlYnVnRXZlbnQudS5FeGNlcHRpb24pLmNfc3RyKCkpOwotCi0JSGFuZGxlRXhjZXB0aW9uKGRlYnVnRXZlbnQpOwotCi19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVQcm9jZXNzQ3JlYXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBuZXcgV2luUHJvY2Vzcyh0aGlzLCBkZWJ1Z0V2ZW50KTsKLQlXaW5UaHJlYWQqIHRocmVhZCA9IG5ldyBXaW5UaHJlYWQoKnByb2Nlc3MsIGRlYnVnRXZlbnQpOwotCi0JcHJvY2Vzcy0+U2V0RGVidWdnaW5nKHRydWUpOwotCXRocmVhZC0+U2V0RGVidWdnaW5nKHRydWUpOwotCi0JLy8gcmVjb3JkIGluIG91ciBjYWNoZQotCUNvbnRleHRNYW5hZ2VyOjphZGRDb250ZXh0KHByb2Nlc3MpOwotCUNvbnRleHRNYW5hZ2VyOjphZGRDb250ZXh0KHRocmVhZCk7Ci0KLQkvLyBOb3RpZnkgaG9zdAotCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0QWRkZWQocHJvY2Vzcyk7Ci0JRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRBZGRlZCh0aHJlYWQpOwotCi0JdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBiYXNlT2ZDb2RlID0gMDsKLQlzdGQ6OnN0cmluZyBpbWFnZU5hbWUgPSBHZXRFeGVjdXRhYmxlSW5mbyhkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaEZpbGUsIGJhc2VPZkNvZGUsIGNvZGVTaXplKTsKLQl0aHJlYWQtPkhhbmRsZUV4ZWN1dGFibGVFdmVudCh0cnVlLCBpbWFnZU5hbWUsICh1bnNpZ25lZCBsb25nKWRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5scEJhc2VPZkltYWdlLCBjb2RlU2l6ZSArIGJhc2VPZkNvZGUpOwotCUNsb3NlSGFuZGxlKGRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oRmlsZSk7Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVUaHJlYWRDcmVhdGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpCi17Ci0JV2luUHJvY2VzcyogcHJvY2VzcyA9IFdpblByb2Nlc3M6OkdldFByb2Nlc3NCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQpOwotCWlmIChwcm9jZXNzKSB7Ci0JCVdpblRocmVhZCogdGhyZWFkID0gbmV3IFdpblRocmVhZCgqcHJvY2VzcywgZGVidWdFdmVudCk7Ci0JCXRocmVhZC0+U2V0RGVidWdnaW5nKHRydWUpOwotCQlDb250ZXh0TWFuYWdlcjo6YWRkQ29udGV4dCh0aHJlYWQpOwotCQlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dEFkZGVkKHRocmVhZCk7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0KGZhbHNlKTsKLQl9Ci0KLQlDb250aW51ZURlYnVnRXZlbnQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkLCBEQkdfQ09OVElOVUUpOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlUHJvY2Vzc0V4aXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKTsKLQlpZiAocHJvY2VzcykgewotCQlDb250ZXh0TWFuYWdlcjo6cmVtb3ZlQ29udGV4dChwcm9jZXNzLT5HZXRJRCgpKTsKLQkJRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRSZW1vdmVkKHByb2Nlc3MsIHRydWUpOwotCX0gZWxzZSB7Ci0JCWFzc2VydChmYWxzZSk7Ci0JfQotCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVUaHJlYWRFeGl0ZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkKLXsKLQlXaW5UaHJlYWQqIHRocmVhZCA9IFdpblRocmVhZDo6R2V0VGhyZWFkQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQpOwotCWlmICh0aHJlYWQpIHsKLQkJQ29udGV4dE1hbmFnZXI6OnJlbW92ZUNvbnRleHQodGhyZWFkLT5HZXRJRCgpKTsKLQkJRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRSZW1vdmVkKHRocmVhZCwgdHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0KGZhbHNlKTsKLQl9Ci0JQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsKLX0KLQotYm9vbCBXaW5EZWJ1Z01vbml0b3I6OlNob3VsZERlYnVnRmlyc3RDaGFuY2UoY29uc3QgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpIHsKLQlpZiAoZGVidWdFdmVudC5kd0RlYnVnRXZlbnRDb2RlID09IEVYQ0VQVElPTl9ERUJVR19FVkVOVCkgewotCQljb25zdCBFWENFUFRJT05fREVCVUdfSU5GTyYgaW5mbyA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb247Ci0JCWlmICghaW5mby5kd0ZpcnN0Q2hhbmNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW5mby5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSA9PSBFWENFUFRJT05fRExMX05PVF9GT1VORDsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFdpbkRlYnVnTW9uaXRvcjo6U2hvdWxkUmVwb3J0RXhjZXB0aW9uKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCWlmIChkZWJ1Z0V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlID09IEVYQ0VQVElPTl9NU19DUExVUykKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRXhjZXB0aW9uKERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCVdpblRocmVhZCogdGhyZWFkID0gV2luVGhyZWFkOjpHZXRUaHJlYWRCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCk7Ci0JaWYgKCF0aHJlYWQpCi0JCWFzc2VydChmYWxzZSk7Ci0JaWYgKHRocmVhZCAmJiAoaGFuZGxlZEZpcnN0RXhjZXB0aW9uXyB8fCBpc0F0dGFjaCB8fCBTaG91bGREZWJ1Z0ZpcnN0Q2hhbmNlKGRlYnVnRXZlbnQpKSAmJgotCQkJU2hvdWxkUmVwb3J0RXhjZXB0aW9uKGRlYnVnRXZlbnQpKQotCQl0aHJlYWQtPkhhbmRsZUV4Y2VwdGlvbihkZWJ1Z0V2ZW50KTsKLQllbHNlCi0JCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQpOwotCWhhbmRsZWRGaXJzdEV4Y2VwdGlvbl8gPSB0cnVlOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRExMTG9hZGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBiYXNlT2ZDb2RlID0gMDsKLQlzdGQ6OnN0cmluZyBtb2R1bGVOYW1lID0gR2V0RXhlY3V0YWJsZUluZm8oZGVidWdFdmVudC51LkxvYWREbGwuaEZpbGUsIGJhc2VPZkNvZGUsIGNvZGVTaXplKTsKLQotCUxvZ1RyYWNlKCJEZWJ1Z1Byb2Nlc3NNb25pdG9yOjpIYW5kbGVETExMb2FkZWRFdmVudCIsICJCYXNlIGFkZHJlc3M6ICU4Ljh4ICVzIiwgZGVidWdFdmVudC51LkxvYWREbGwubHBCYXNlT2ZEbGwsIG1vZHVsZU5hbWUuY19zdHIoKSk7Ci0JV2luVGhyZWFkKiB0aHJlYWQgPSBXaW5UaHJlYWQ6OkdldFRocmVhZEJ5SUQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkKTsKLQlpZiAodGhyZWFkKSB7Ci0JCXRocmVhZC0+SGFuZGxlRXhlY3V0YWJsZUV2ZW50KHRydWUsIG1vZHVsZU5hbWUsICh1bnNpZ25lZCBsb25nKWRlYnVnRXZlbnQudS5Mb2FkRGxsLmxwQmFzZU9mRGxsLCBjb2RlU2l6ZSk7Ci0JfQotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRExMVW5sb2FkZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkKLXsKLQlXaW5UaHJlYWQqIHRocmVhZCA9IFdpblRocmVhZDo6R2V0VGhyZWFkQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQpOwotCWlmICh0aHJlYWQpIHsKLQkJdGhyZWFkLT5IYW5kbGVFeGVjdXRhYmxlRXZlbnQoZmFsc2UsICIiLCAodW5zaWduZWQgbG9uZylkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8ubHBCYXNlT2ZJbWFnZSwgMCk7Ci0JfQotCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVEZWJ1Z1N0cmluZ0V2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQotewotCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKTsKLQotCWlmIChkZWJ1Z0V2ZW50LnUuRGVidWdTdHJpbmcuZlVuaWNvZGUgPT0gMCkKLQl7Ci0JCWludCBkZWJ1Z1N0cmluZ0xlbmd0aCA9IGRlYnVnRXZlbnQudS5EZWJ1Z1N0cmluZy5uRGVidWdTdHJpbmdMZW5ndGg7Ci0JCWNoYXIqIGRlYnVnU3RyaW5nQnVmZmVyID0gbmV3IGNoYXJbZGVidWdTdHJpbmdMZW5ndGggKyAxXTsKLQkJUmVhZFByb2Nlc3NNZW1vcnkocHJvY2Vzcy0+R2V0UHJvY2Vzc0hhbmRsZSgpLCBkZWJ1Z0V2ZW50LnUuRGVidWdTdHJpbmcubHBEZWJ1Z1N0cmluZ0RhdGEsIGRlYnVnU3RyaW5nQnVmZmVyLAotCQkJCWRlYnVnU3RyaW5nTGVuZ3RoLE5VTEwpOwotCQlkZWJ1Z1N0cmluZ0J1ZmZlcltkZWJ1Z1N0cmluZ0xlbmd0aF0gPSAwOwotCi0JCS8vIGNvbnZlcnQgZnJvbSBhbnNpIHRvIHV0Zi04Ci0JCXdjaGFyX3QqIHdpZGVDaGFycyA9IG5ldyB3Y2hhcl90W2RlYnVnU3RyaW5nTGVuZ3RoXTsKLQotCQkvLyBDb3ZlcnQgdG8gVW5pY29kZS4KLQkJaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBkZWJ1Z1N0cmluZ0J1ZmZlciwgZGVidWdTdHJpbmdMZW5ndGgsCi0JCQkJd2lkZUNoYXJzLCBkZWJ1Z1N0cmluZ0xlbmd0aCkgIT0gMCkKLQkJewotCQkgICAgaW50IHNpemVfbmVlZGVkID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCB3aWRlQ2hhcnMsIGRlYnVnU3RyaW5nTGVuZ3RoLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQkJICAgIHN0ZDo6c3RyaW5nIHN0clRvKCBzaXplX25lZWRlZCwgMCApOwotCQkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCB3aWRlQ2hhcnMsIGRlYnVnU3RyaW5nTGVuZ3RoLCAmc3RyVG9bMF0sIHNpemVfbmVlZGVkLCBOVUxMLCBOVUxMKTsKLQkJCS8vIHdyaXRlIGNvbnNvbGUgZGF0YSwgaWYgY29uc29sZQotCQkJTG9nZ2luZ1NlcnZpY2U6OldyaXRlTG9nZ2luZ01lc3NhZ2UoY2hhbm5lbCwgc3RyVG8sIExvZ2dpbmdTZXJ2aWNlOjpHZXRXaW5kb3dzQ29uc29sZUlEKCkpOwotCQkJTG9nVHJhY2UoIkRlYnVnUHJvY2Vzc01vbml0b3I6OkhhbmRsZURlYnVnU3RyaW5nRXZlbnQiLCAiJXMiLCBzdHJUby5jX3N0cigpKTsKLQkJfQotCi0JCWRlbGV0ZVtdIHdpZGVDaGFyczsKLQkJZGVsZXRlW10gZGVidWdTdHJpbmdCdWZmZXI7Ci0JfQotCi0JQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZVN5c3RlbURlYnVnRXJyb3JFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkKLXsKLQlDb250aW51ZURlYnVnRXZlbnQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkLCBEQkdfQ09OVElOVUUpOwotfQotCi12b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlVW5rbndvbkRlYnVnRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpCi17Ci0JQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsKLX0KLQotdm9pZCBXaW5EZWJ1Z01vbml0b3I6OlNldFByb2Nlc3MoV2luUHJvY2VzcyogcHJvY2VzcykKLXsKLQlwcm9jZXNzXyA9IHByb2Nlc3M7Ci19Ci0KLXZvaWQgV2luRGVidWdNb25pdG9yOjpQb3N0QWN0aW9uKEFnZW50QWN0aW9uKiBhY3Rpb24pCi17Ci0JYWN0aW9uc18ucHVzaChhY3Rpb24pOwotfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorI2luY2x1ZGUgIlRDRkhlYWRlcnMuaCINCisjaW5jbHVkZSAiV2luRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIkxvZ2dlci5oIg0KKyNpbmNsdWRlICJXaW5Qcm9jZXNzLmgiDQorI2luY2x1ZGUgIldpblRocmVhZC5oIg0KKyNpbmNsdWRlICJFdmVudENsaWVudE5vdGlmaWVyLmgiDQorI2luY2x1ZGUgIkFnZW50VXRpbHMuaCINCisjaW5jbHVkZSAicHNhcGkuaCINCisjaW5jbHVkZSAiQWdlbnRBY3Rpb24uaCINCisjaW5jbHVkZSAiQ29udGV4dE1hbmFnZXIuaCINCisjaW5jbHVkZSAiTG9nZ2luZ1NlcnZpY2UuaCINCisjaW5jbHVkZSAiU2V0dGluZ3NTZXJ2aWNlLmgiDQorDQorDQorI2RlZmluZSBCVUZTSVpFIDUxMg0KKw0KKw0KK3N0ZDo6c3RyaW5nIEdldEV4ZWN1dGFibGVJbmZvKEhBTkRMRSBoRmlsZSwgdW5zaWduZWQgbG9uZyYgYmFzZU9mQ29kZSwgdW5zaWduZWQgbG9uZyYgY29kZVNpemUpDQorew0KKwljb2RlU2l6ZSA9IDA7DQorCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsNCisJVENIQVIgcHN6RmlsZW5hbWVbTUFYX1BBVEgrMV07DQorCUhBTkRMRSBoRmlsZU1hcDsNCisJc3RkOjp3c3RyaW5nIHBhdGg7DQorDQorCS8vIEdldCB0aGUgZmlsZSBzaXplLg0KKwlEV09SRCBkd0ZpbGVTaXplSGkgPSAwOw0KKwlEV09SRCBkd0ZpbGVTaXplTG8gPSBHZXRGaWxlU2l6ZShoRmlsZSwgJmR3RmlsZVNpemVIaSk7DQorDQorCWlmKCBkd0ZpbGVTaXplTG8gPT0gMCAmJiBkd0ZpbGVTaXplSGkgPT0gMCApDQorCXsNCisJCXByaW50ZigiQ2Fubm90IG1hcCBhIGZpbGUgd2l0aCBhIGxlbmd0aCBvZiB6ZXJvLlxuIik7DQorCQlyZXR1cm4gRkFMU0U7DQorCX0NCisNCisJLy8gQ3JlYXRlIGEgZmlsZSBtYXBwaW5nIG9iamVjdC4NCisJaEZpbGVNYXAgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwNCisJCU5VTEwsDQorCQlQQUdFX1JFQURPTkxZLA0KKwkJMCwNCisJCTEsDQorCQlOVUxMKTsNCisNCisJaWYgKGhGaWxlTWFwKQ0KKwl7DQorCQkvLyBDcmVhdGUgYSBmaWxlIG1hcHBpbmcgdG8gZ2V0IHRoZSBmaWxlIG5hbWUuDQorCQl2b2lkKiBwTWVtID0gTWFwVmlld09mRmlsZShoRmlsZU1hcCwgRklMRV9NQVBfUkVBRCwgMCwgMCwgMSk7DQorDQorCQlpZiAocE1lbSkNCisJCXsNCisNCisJCQlQSU1BR0VfRE9TX0hFQURFUiBkb3NIZWFkZXI9KFBJTUFHRV9ET1NfSEVBREVSIClwTWVtOw0KKwkJCVBJTUFHRV9OVF9IRUFERVJTIHBOVEhlYWRlcjsNCisNCisJCQlwTlRIZWFkZXIgPSAoUElNQUdFX05UX0hFQURFUlMpICgoRFdPUkQpZG9zSGVhZGVyICsgZG9zSGVhZGVyLT5lX2xmYW5ldyk7DQorDQorCQkJaWYgKCBwTlRIZWFkZXItPlNpZ25hdHVyZSA9PSBJTUFHRV9OVF9TSUdOQVRVUkUgKQ0KKwkJCXsNCisNCisJCQkJUElNQUdFX09QVElPTkFMX0hFQURFUiBPcHRpb25hbEhlYWRlciA9IChQSU1BR0VfT1BUSU9OQUxfSEVBREVSKSZwTlRIZWFkZXItPk9wdGlvbmFsSGVhZGVyOw0KKwkJCQljb2RlU2l6ZSA9IE9wdGlvbmFsSGVhZGVyLT5TaXplT2ZDb2RlOw0KKwkJCQliYXNlT2ZDb2RlID0gT3B0aW9uYWxIZWFkZXItPkJhc2VPZkNvZGU7DQorCQkJfQ0KKw0KKw0KKwkJCWlmIChHZXRNYXBwZWRGaWxlTmFtZSAoR2V0Q3VycmVudFByb2Nlc3MoKSwNCisJCQkJcE1lbSwNCisJCQkJcHN6RmlsZW5hbWUsDQorCQkJCU1BWF9QQVRIKSkNCisJCQl7DQorDQorCQkJCS8vIFRyYW5zbGF0ZSBwYXRoIHdpdGggZGV2aWNlIG5hbWUgdG8gZHJpdmUgbGV0dGVycy4NCisJCQkJVENIQVIgc3pUZW1wW0JVRlNJWkVdOw0KKwkJCQlzelRlbXBbMF0gPSAnXDAnOw0KKw0KKwkJCQlpZiAoR2V0TG9naWNhbERyaXZlU3RyaW5ncyhCVUZTSVpFLTEsIHN6VGVtcCkpDQorCQkJCXsNCisJCQkJCVRDSEFSIHN6TmFtZVtNQVhfUEFUSF07DQorCQkJCQlUQ0hBUiBzekRyaXZlWzNdID0gVEVYVCgiIDoiKTsNCisJCQkJCUJPT0wgYkZvdW5kID0gRkFMU0U7DQorCQkJCQlUQ0hBUiogcCA9IHN6VGVtcDsNCisNCisJCQkJCWRvDQorCQkJCQl7DQorCQkJCQkJLy8gQ29weSB0aGUgZHJpdmUgbGV0dGVyIHRvIHRoZSB0ZW1wbGF0ZSBzdHJpbmcNCisJCQkJCQkqc3pEcml2ZSA9ICpwOw0KKw0KKwkJCQkJCS8vIExvb2sgdXAgZWFjaCBkZXZpY2UgbmFtZQ0KKwkJCQkJCWlmIChRdWVyeURvc0RldmljZShzekRyaXZlLCBzek5hbWUsIE1BWF9QQVRIKSkNCisJCQkJCQl7DQorCQkJCQkJCVVJTlQgdU5hbWVMZW4gPSBfdGNzbGVuKHN6TmFtZSk7DQorDQorCQkJCQkJCWlmICh1TmFtZUxlbiA8IE1BWF9QQVRIKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQliRm91bmQgPSBfdGNzbmljbXAocHN6RmlsZW5hbWUsIHN6TmFtZSwNCisJCQkJCQkJCQl1TmFtZUxlbikgPT0gMDsNCisNCisJCQkJCQkJCWlmIChiRm91bmQpDQorCQkJCQkJCQl7DQorCQkJCQkJCQkJLy8gUmVjb25zdHJ1Y3QgcHN6RmlsZW5hbWUgdXNpbmcgc3pUZW1wRmlsZQ0KKwkJCQkJCQkJCS8vIFJlcGxhY2UgZGV2aWNlIHBhdGggd2l0aCBET1MgcGF0aA0KKwkJCQkJCQkJCVRDSEFSIHN6VGVtcEZpbGVbTUFYX1BBVEhdOw0KKw0KKwkJCQkJCQkJCXNucHJpbnRmKHN6VGVtcEZpbGUsIHNpemVvZihzelRlbXBGaWxlKSwNCisJCQkJCQkJCQkJVEVYVCgiJXMlcyIpLA0KKwkJCQkJCQkJCQlzekRyaXZlLA0KKwkJCQkJCQkJCQlwc3pGaWxlbmFtZSt1TmFtZUxlbik7DQorCQkJCQkJCQkJc3RybmNweShwc3pGaWxlbmFtZSwgc3pUZW1wRmlsZSwgX3Rjc2xlbihzelRlbXBGaWxlKSk7DQorCQkJCQkJCQkJcHN6RmlsZW5hbWVbX3Rjc2xlbihzelRlbXBGaWxlKV0gPSAwOw0KKw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKw0KKwkJCQkJCS8vIEdvIHRvIHRoZSBuZXh0IE5VTEwgY2hhcmFjdGVyLg0KKwkJCQkJCXdoaWxlICgqcCsrKTsNCisJCQkJCX0gd2hpbGUgKCFiRm91bmQgJiYgKnApOyAvLyBlbmQgb2Ygc3RyaW5nDQorCQkJCX0NCisJCQl9DQorCQkJYlN1Y2Nlc3MgPSBUUlVFOw0KKwkJCVVubWFwVmlld09mRmlsZShwTWVtKTsNCisJCX0NCisNCisJCUNsb3NlSGFuZGxlKGhGaWxlTWFwKTsNCisJfQ0KKwlyZXR1cm4gQWdlbnRVdGlsczo6bWFrZVN0cmluZyhwc3pGaWxlbmFtZSk7DQorfQ0KKw0KK1dpbkRlYnVnTW9uaXRvcjo6V2luRGVidWdNb25pdG9yKGNvbnN0IExhdW5jaFByb2Nlc3NQYXJhbXMmIHBhcmFtcykgOg0KKwkJRGVidWdNb25pdG9yKHBhcmFtcykNCit7DQorCW1lbXNldCgmcHJvY2Vzc0luZm8sIDAsIHNpemVvZihwcm9jZXNzSW5mbykpOw0KKw0KKwloYW5kbGVkSW5pdGlhbERlYnVnQnJlYWtwb2ludCA9IGZhbHNlOw0KKwl3YWl0Rm9yRGVidWdFdmVudHMgPSB0cnVlOw0KKwl3ZmRlV2FpdCA9IDUwOw0KKwltb25pdG9yVGhyZWFkXyA9IE5VTEw7DQorCWlzQXR0YWNoID0gZmFsc2U7DQorfQ0KKw0KK1dpbkRlYnVnTW9uaXRvcjo6V2luRGVidWdNb25pdG9yKGNvbnN0IEF0dGFjaFRvUHJvY2Vzc1BhcmFtcyYgcGFyYW1zKSA6DQorCURlYnVnTW9uaXRvcihwYXJhbXMpDQorew0KKwltZW1zZXQoJnByb2Nlc3NJbmZvLCAwLCBzaXplb2YocHJvY2Vzc0luZm8pKTsNCisNCisJLy8gVE9ETyBkb24ndCB0aGluayB0aGUgTlRETEwhRGJnQnJlYWtQb2ludCBhcHBsaWVzIHdoZW4gYXR0YWNoaW5nIGJ1dCBuZWVkIHRvIHRlc3QuICBpZiB5b3UgaGl0IHRoYXQgYnJlYWtwb2ludA0KKwkvLyByaWdodCBhZnRlciBhdHRhY2hpbmcgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZSB0byBmYWxzZQ0KKwloYW5kbGVkSW5pdGlhbERlYnVnQnJlYWtwb2ludCA9IHRydWU7DQorCXdhaXRGb3JEZWJ1Z0V2ZW50cyA9IHRydWU7DQorCXdmZGVXYWl0ID0gNTA7DQorCW1vbml0b3JUaHJlYWRfID0gTlVMTDsNCisJdGhpcy0+cHJvY2Vzc0lEID0gKERXT1JEKSBwYXJhbXMucHJvY2Vzc0lEOw0KKwlpc0F0dGFjaCA9IHRydWU7DQorfQ0KKw0KK1dpbkRlYnVnTW9uaXRvcjo6fldpbkRlYnVnTW9uaXRvcih2b2lkKQ0KK3sNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkxhdW5jaFByb2Nlc3MoY29uc3QgTGF1bmNoUHJvY2Vzc1BhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pDQorew0KKwkobmV3IFdpbkRlYnVnTW9uaXRvcihwYXJhbXMpKS0+U3RhcnRNb25pdG9yKCk7DQorfQ0KKw0KKy8qDQorICogU3RhdGljIG1ldGhvZC4gRW50cnkgZm9yIGF0dGFjaGluZy4NCisgKi8NCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6QXR0YWNoVG9Qcm9jZXNzKGNvbnN0IEF0dGFjaFRvUHJvY2Vzc1BhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pDQorew0KKwkobmV3IFdpbkRlYnVnTW9uaXRvcihwYXJhbXMpKS0+U3RhcnRNb25pdG9yKCk7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpTdGFydERlYnVnKCkgew0KKwlpZiAoISBpc0F0dGFjaCkNCisJCVN0YXJ0UHJvY2Vzc0ZvckRlYnVnKCk7DQorCWVsc2UNCisJCUF0dGFjaFRvUHJvY2Vzc0ZvckRlYnVnKCk7DQorfQ0KKw0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpBdHRhY2hUb1Byb2Nlc3NGb3JEZWJ1ZygpDQorew0KKwkvLyBOb3RlIHRoaXMgaXMgc3VwcG9zZWQgdG8gcmVwbHkgdG8gVENGIHJlcXVlc3QgUHJvY2Vzc1NlcnZpY2U6OkNvbW1hbmRfQXR0YWNoKCkuDQorDQorCWlmICghRGVidWdBY3RpdmVQcm9jZXNzKHByb2Nlc3NJRCkpDQorCXsNCisJCURXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOw0KKw0KKwkJQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KGNoYW5uZWwsIHRva2VuLCBzZXRfd2luMzJfZXJybm8oZXJyKSk7DQorCX0gZWxzZSB7DQorCQkvLyBBbGxvdyBkZXRhY2ggd2l0aG91dCBraWxsLg0KKwkJRGVidWdTZXRQcm9jZXNzS2lsbE9uRXhpdChmYWxzZSk7DQorDQorCQkvLyBPSw0KKwkJQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KGNoYW5uZWwsIHRva2VuLCAwKTsNCisJfQ0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6U3RhcnRQcm9jZXNzRm9yRGVidWcoKQ0KK3sNCisJU1RBUlRVUElORk8JCQlzaTsNCisJbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7DQorICAgIHNpLmNiCSAgICAgICAJCT0gc2l6ZW9mIChzaSk7DQorCXNpLmR3RmxhZ3MJICAgICAgIAk9IFNUQVJURl9GT1JDRU9ORkVFREJBQ0sgfCBTVEFSVEZfVVNFU0hPV1dJTkRPVzsNCisJc2kud1Nob3dXaW5kb3cgICAgIAk9IFNXX1NIT1dOT1JNQUw7DQorDQorCVRDSEFSKiBhcmdzQnVmZmVyID0gbmV3IFRDSEFSW2FyZ3Muc2l6ZSgpICsgc2l6ZW9mKFRDSEFSKV07DQorDQorCXN0cmNweShhcmdzQnVmZmVyLCBhcmdzLmNfc3RyKCkpOw0KKwlzdGQ6OnN0cmluZyBleGVOYW1lID0gZXhlY3V0YWJsZTsNCisNCisJTFBUU1RSIHdvcmtpbmdEaXJlY3RvcnkgPSBOVUxMOw0KKwlpZiAoZGlyZWN0b3J5Lmxlbmd0aCgpID4gMCkNCisJew0KKwkJd29ya2luZ0RpcmVjdG9yeSA9IChMUFRTVFIpZGlyZWN0b3J5LmNfc3RyKCk7DQorCX0NCisNCisJY2hhciogZW52QnVmZmVyID0gTlVMTDsNCisJc3RkOjpzdHJpbmcgZW52U3RyaW5nOw0KKwlpZiAoZW52aXJvbm1lbnQuc2l6ZSgpID4gMCkNCisJew0KKwkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdEVudkRhdGE7DQorCQlmb3IgKGl0RW52RGF0YSA9IGVudmlyb25tZW50LmJlZ2luKCk7IGl0RW52RGF0YQ0KKwkJCQkhPSBlbnZpcm9ubWVudC5lbmQoKTsgaXRFbnZEYXRhKyspDQorCQl7DQorCQkJc3RkOjpzdHJpbmcgdmFsdWUgPSAqaXRFbnZEYXRhOw0KKwkJCWVudlN0cmluZyArPSB2YWx1ZTsNCisJCQllbnZTdHJpbmcgKz0gY2hhcigwKTsNCisJCX0NCisJCWVudlN0cmluZyArPSBjaGFyKDApOw0KKwkJZW52QnVmZmVyID0gbmV3IGNoYXJbZW52U3RyaW5nLmxlbmd0aCgpXTsNCisJCW1lbWNweShlbnZCdWZmZXIsIGVudlN0cmluZy5jX3N0cigpLCBlbnZTdHJpbmcubGVuZ3RoKCkpOw0KKwl9DQorDQorCWlmICghQ3JlYXRlUHJvY2VzcyhleGVOYW1lLmNfc3RyKCksIGFyZ3NCdWZmZXIsDQorCQkoTFBTRUNVUklUWV9BVFRSSUJVVEVTKU5VTEwsDQorCQkoTFBTRUNVUklUWV9BVFRSSUJVVEVTKU5VTEwsDQorCQlGQUxTRSwNCisJCShHZXREZWJ1Z0NoaWxkcmVuKCkgPyBERUJVR19QUk9DRVNTIDogREVCVUdfT05MWV9USElTX1BST0NFU1MpICB8IENSRUFURV9ORVdfQ09OU09MRSwNCisJCWVudkJ1ZmZlciwNCisJCXdvcmtpbmdEaXJlY3RvcnksCQkJCS8vTlVMTCwNCisJCShMUFNUQVJUVVBJTkZPKSZzaSwNCisJCShMUFBST0NFU1NfSU5GT1JNQVRJT04pJnByb2Nlc3NJbmZvKSkNCisJew0KKwkJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7DQorCQlzdGQ6OnN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgIjsNCisJCW1zZyArPSAnXCInOw0KKwkJbXNnICs9IEFnZW50VXRpbHM6Om1ha2VVVEY4U3RyaW5nKGV4ZU5hbWUpOw0KKwkJbXNnICs9ICJcIiI7DQorCQllcnIgPSBzZXRfd2luMzJfZXJybm8oZXJyKTsNCisNCisJCUFnZW50QWN0aW9uUmVwbHk6OnBvc3RSZXBseShjaGFubmVsLCB0b2tlbiwgZXJyLCAxLCBuZXcgc3RkOjpzdHJpbmcobXNnKSk7DQorCX0gZWxzZSB7DQorCQkvLyBBT0sJDQorCQlBZ2VudEFjdGlvblJlcGx5Ojpwb3N0UmVwbHkoY2hhbm5lbCwgdG9rZW4sIDAsIDEpOw0KKw0KKwkJcHJvY2Vzc0lEID0gcHJvY2Vzc0luZm8uZHdQcm9jZXNzSWQ7DQorCX0NCisNCisJZGVsZXRlW10gZW52QnVmZmVyOw0KKwlkZWxldGVbXSBhcmdzQnVmZmVyOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6Q2FwdHVyZU1vbml0b3JUaHJlYWQoKQ0KK3sNCisJRHVwbGljYXRlSGFuZGxlKEdldEN1cnJlbnRQcm9jZXNzKCksR2V0Q3VycmVudFRocmVhZCgpLA0KKwkJR2V0Q3VycmVudFByb2Nlc3MoKSwmbW9uaXRvclRocmVhZF8sDQorCQkwLEZBTFNFLERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7DQorfQ0KKw0KK0RXT1JEIFdJTkFQSSBkZWJ1Z2dlck1vbml0b3JUaHJlYWQoTFBWT0lEIHBhcmFtKQ0KK3sNCisJV2luRGVidWdNb25pdG9yICogZHBtID0gKFdpbkRlYnVnTW9uaXRvciopcGFyYW07DQorCQ0KKwl0cnkgDQorCXsNCisJCWRwbS0+Q2FwdHVyZU1vbml0b3JUaHJlYWQoKTsNCisJCWRwbS0+U3RhcnREZWJ1ZygpOw0KKwkJZHBtLT5FdmVudExvb3AoKTsNCisJfQ0KKwljYXRjaCAoY29uc3QgQWdlbnRFeGNlcHRpb24mIGUpIA0KKwl7DQorCQlEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOw0KKwkJdHJhY2UoTE9HX0FMV0FZUywgIkFnZW50IEV4Y2VwdGlvbjogY29kZT0leDogJXMiLCBlcnJvciwgZS53aGF0KCkpOw0KKwl9DQorCQ0KKwlyZXR1cm4gMDsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OlN1c3BlbmQoKQ0KK3sNCisJU3VzcGVuZFRocmVhZChtb25pdG9yVGhyZWFkXyk7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpSZXN1bWUoKQ0KK3sNCisJUmVzdW1lVGhyZWFkKG1vbml0b3JUaHJlYWRfKTsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OlN0YXJ0TW9uaXRvcigpDQorew0KKwlEV09SRCB0aHJlYWRJRCA9IDA7DQorCUhBTkRMRSBzdGFydFRocmVhZCA9IENyZWF0ZVRocmVhZCgNCisJCU5VTEwsICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcw0KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZQ0KKwkJZGVidWdnZXJNb25pdG9yVGhyZWFkLCAgLy8gdGhyZWFkIGZ1bmN0aW9uIG5hbWUNCisJCXRoaXMsICAgCQkJCS8vIGFyZ3VtZW50IHRvIHRocmVhZCBmdW5jdGlvbg0KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgY3JlYXRpb24gZmxhZ3MNCisJCSZ0aHJlYWRJRCk7ICAgLy8gcmV0dXJucyB0aGUgdGhyZWFkIGlkZW50aWZpZXINCisNCisJQ2xvc2VIYW5kbGUoc3RhcnRUaHJlYWQpOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6RXZlbnRMb29wKCkNCit7DQorCURFQlVHX0VWRU5UIGRlYnVnRXZlbnQ7DQorDQorCXdoaWxlICh3YWl0Rm9yRGVidWdFdmVudHMpDQorCXsNCisJCWlmIChXYWl0Rm9yRGVidWdFdmVudCgmZGVidWdFdmVudCwgd2ZkZVdhaXQpKQ0KKwkJCUhhbmRsZURlYnVnRXZlbnQoZGVidWdFdmVudCk7DQorCQllbHNlIHsNCisJCQlEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsNCisJCQlpZiAoZXJyID09IEVSUk9SX1NFTV9USU1FT1VUIHx8IGVyciA9PSAwKQ0KKwkJCQlIYW5kbGVOb0RlYnVnRXZlbnQoKTsNCisJCQllbHNlIHsNCisJCQkJdHJhY2UoTE9HX0FMV0FZUywgIldpbkRlYnVnTW9uaXRvcjo6RXZlbnRMb29wOiBlcnJvciAlZCIsIGVycik7DQorCQkJCXdhaXRGb3JEZWJ1Z0V2ZW50cyA9IGZhbHNlOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwl0cmFjZShMT0dfQ09OVEVYVCwgIk1vbml0b3IgdGhyZWFkIGZvciBwcm9jZXNzICVkIGhhcyBleGl0ZWQuIFxuIiwgcHJvY2Vzc0lEKTsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkF0dGFjaCh1bnNpZ25lZCBsb25nIHBpZCwgQ29udGV4dEF0dGFjaENhbGxCYWNrICogZG9uZSwgdm9pZCAqIGRhdGEsIGludCBzZWxmYXR0YWNoKSB7DQorCS8vIFRPRE86IGltcGxlbWVudA0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqIHdpbjMyX2RlYnVnX2V2ZW50X25hbWUoaW50IGV2ZW50KSB7DQorCXN3aXRjaCAoZXZlbnQpIHsNCisJY2FzZSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVDoNCisJCXJldHVybiAiQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQiOw0KKwljYXNlIENSRUFURV9USFJFQURfREVCVUdfRVZFTlQ6DQorCQlyZXR1cm4gIkNSRUFURV9USFJFQURfREVCVUdfRVZFTlQiOw0KKwljYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoNCisJCXJldHVybiAiRVhDRVBUSU9OX0RFQlVHX0VWRU5UIjsNCisJY2FzZSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQ6DQorCQlyZXR1cm4gIkVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVCI7DQorCWNhc2UgRVhJVF9USFJFQURfREVCVUdfRVZFTlQ6DQorCQlyZXR1cm4gIkVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UIjsNCisJY2FzZSBMT0FEX0RMTF9ERUJVR19FVkVOVDoNCisJCXJldHVybiAiTE9BRF9ETExfREVCVUdfRVZFTlQiOw0KKwljYXNlIE9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQ6DQorCQlyZXR1cm4gIk9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQiOw0KKwljYXNlIFVOTE9BRF9ETExfREVCVUdfRVZFTlQ6DQorCQlyZXR1cm4gIlVOTE9BRF9ETExfREVCVUdfRVZFTlQiOw0KKwl9DQorCXJldHVybiAiVW5rbm93biI7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVEZWJ1Z0V2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQ0KK3sNCisJTG9nVHJhY2UoIkRlYnVnUHJvY2Vzc01vbml0b3I6OkhhbmRsZURlYnVnRXZlbnQiLCAiZXZlbnQgY29kZTogJXMiLCB3aW4zMl9kZWJ1Z19ldmVudF9uYW1lKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkpOw0KKwlzd2l0Y2ggKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkNCisJew0KKwljYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoNCisJCUhhbmRsZUV4Y2VwdGlvbkV2ZW50KGRlYnVnRXZlbnQpOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQ6DQorCQlIYW5kbGVQcm9jZXNzQ3JlYXRlZEV2ZW50KGRlYnVnRXZlbnQpOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVDoNCisJCUhhbmRsZVRocmVhZENyZWF0ZWRFdmVudChkZWJ1Z0V2ZW50KTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoNCisJCUhhbmRsZVByb2Nlc3NFeGl0ZWRFdmVudChkZWJ1Z0V2ZW50KTsNCisJCXJldHVybjsNCisNCisJY2FzZSBFWElUX1RIUkVBRF9ERUJVR19FVkVOVDoNCisJCUhhbmRsZVRocmVhZEV4aXRlZEV2ZW50KGRlYnVnRXZlbnQpOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgTE9BRF9ETExfREVCVUdfRVZFTlQ6DQorCQlIYW5kbGVETExMb2FkZWRFdmVudChkZWJ1Z0V2ZW50KTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIFVOTE9BRF9ETExfREVCVUdfRVZFTlQ6DQorCQlIYW5kbGVETExVbmxvYWRlZEV2ZW50KGRlYnVnRXZlbnQpOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDoNCisJCUhhbmRsZURlYnVnU3RyaW5nRXZlbnQoZGVidWdFdmVudCk7DQorCQlicmVhazsNCisNCisJY2FzZSBSSVBfRVZFTlQ6DQorCQlIYW5kbGVTeXN0ZW1EZWJ1Z0Vycm9yRXZlbnQoZGVidWdFdmVudCk7DQorCQlicmVhazsNCisNCisJZGVmYXVsdDoNCisJCUhhbmRsZVVua253b25EZWJ1Z0V2ZW50KGRlYnVnRXZlbnQpOw0KKwkJYnJlYWs7DQorCX0NCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZU5vRGVidWdFdmVudCgpDQorew0KKwl3aGlsZSAoIWFjdGlvbnNfLmVtcHR5KCkpDQorCXsNCisJCUFnZW50QWN0aW9uKiBhY3Rpb24gPSBhY3Rpb25zXy5mcm9udCgpOw0KKwkJYWN0aW9uc18ucG9wKCk7DQorCQlhY3Rpb24tPlJ1bigpOw0KKwkJZGVsZXRlIGFjdGlvbjsNCisJfQ0KK30NCisNCitzdGQ6OnN0cmluZyBXaW5EZWJ1Z01vbml0b3I6OkdldERlYnVnRXhjZXB0aW9uRGVzY3JpcHRpb24oY29uc3QgRVhDRVBUSU9OX0RFQlVHX0lORk8mIGV4Y2VwdGlvbkluZm8pIHsNCisJRFdPUkQgY29kZSA9IGV4Y2VwdGlvbkluZm8uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGU7DQorDQorCWNvbnN0IGNoYXIqIGJhc2UgPSAiVW5rbm93biBFeGNlcHRpb24iOw0KKwlzdGQ6OnN0cmluZyBkZXRhaWw7DQorDQorCXN3aXRjaCAoY29kZSkgew0KKwljYXNlIEVYQ0VQVElPTl9TSU5HTEVfU1RFUDoNCisJCWJhc2UgPSAiU3RlcCI7DQorCQlicmVhazsNCisJY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoNCisJCWJhc2UgPSAiQnJlYWtwb2ludCI7DQorCQlicmVhazsNCisNCisJY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoNCisJCWJhc2UgPSAiQWNjZXNzIHZpb2xhdGlvbiI7DQorCQlkZXRhaWwgPSAiIGF0IDB4IiArIEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKGV4Y2VwdGlvbkluZm8uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdKTsNCisJCWJyZWFrOw0KKwljYXNlIERCR19DT05UUk9MX0M6DQorCQliYXNlID0gIkNvbnRyb2wtQyI7DQorCQlicmVhazsNCisJY2FzZSBEQkdfQ09OVFJPTF9CUkVBSzoNCisJCWJhc2UgPSAiQ29udHJvbC1CcmVhayI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfREFUQVRZUEVfTUlTQUxJR05NRU5UOg0KKwkJYmFzZSA9ICJEYXRhdHlwZSBtaXNhbGlnbm1lbnQiOw0KKwkJYnJlYWs7DQorCWNhc2UgU1RBVFVTX0lOX1BBR0VfRVJST1I6DQorCQliYXNlID0gIlZpcnR1YWwgbWVtb3J5IHBhZ2luZyBlcnJvciI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfTk9fTUVNT1JZOg0KKwkJYmFzZSA9ICJPdXQgb2YgbWVtb3J5IjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19JTExFR0FMX0lOU1RSVUNUSU9OOg0KKwkJYmFzZSA9ICJJbGxlZ2FsIGluc3RydWN0aW9uIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19OT05DT05USU5VQUJMRV9FWENFUFRJT046DQorCQliYXNlID0gICJOb25jb250aW51YWJsZSBleGNlcHRpb24iOw0KKwkJYnJlYWs7DQorCWNhc2UgU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT046DQorCQliYXNlID0gICJJbnZhbGlkIGRpc3Bvc2l0aW9uIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19BUlJBWV9CT1VORFNfRVhDRUVERUQ6DQorCQliYXNlID0gIkFycmF5IGJvdW5kcyBleGNlZWRlZCI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORDoNCisJCWJhc2UgPSAiRmxvYXRpbmcgcG9pbnQgZGVub3JtYWwgb3BlcmFuZCI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRkxPQVRfRElWSURFX0JZX1pFUk86DQorCQliYXNlID0gICJGbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVybyI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQ6DQorCQliYXNlID0gICJGbG9hdGluZyBwb2ludCBpbmV4YWN0IHJlc3VsdCI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRkxPQVRfSU5WQUxJRF9PUEVSQVRJT046DQorCQliYXNlID0gICJGbG9hdGluZyBwb2ludCBpbnZhbGlkIG9wZXJhdGlvbiI7DQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0s6DQorCQliYXNlID0gIkZsb2F0aW5nIHBvaW50IHN0YWNrIGNoZWNrIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19GTE9BVF9PVkVSRkxPVzoNCisJCWJhc2UgPSAiRmxvYXRpbmcgcG9pbnQgb3ZlcmZsb3ciOw0KKwkJYnJlYWs7DQorCWNhc2UgU1RBVFVTX0ZMT0FUX1VOREVSRkxPVzoNCisJCWJhc2UgPSAiRmxvYXRpbmcgcG9pbnQgdW5kZXJmbG93IjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19JTlRFR0VSX0RJVklERV9CWV9aRVJPOg0KKwkJYmFzZSA9ICJJbnRlZ2VyIGRpdmlkZSBieSB6ZXJvIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19JTlRFR0VSX09WRVJGTE9XOg0KKwkJYmFzZSA9ICJJbnRlZ2VyIG92ZXJmbG93IjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OOg0KKwkJYmFzZSA9ICJQcml2aWxlZ2VkIGluc3RydWN0aW9uIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19TVEFDS19PVkVSRkxPVzoNCisJCWJhc2UgPSAiU3RhY2sgb3ZlcmZsb3ciOw0KKwkJYnJlYWs7DQorCWNhc2UgU1RBVFVTX0RMTF9OT1RfRk9VTkQ6DQorCQliYXNlID0gIkRMTCBub3QgZm91bmQiOw0KKwkJLy8gVE9ETzogZmluZCBvdXQgaG93IHRvIGRldGVybWluZSB3aGljaCBETEwgaXQgd2FzLi4uDQorCQlicmVhazsNCisJY2FzZSBTVEFUVVNfRExMX0lOSVRfRkFJTEVEOg0KKwkJYmFzZSA9ICJETEwgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsNCisJCWJyZWFrOw0KKwljYXNlIFNUQVRVU19FTlRSWVBPSU5UX05PVF9GT1VORDoNCisJCWJhc2UgPSAiRW50cnkgcG9pbnQgbm90IGZvdW5kIjsNCisJCWJyZWFrOw0KKwljYXNlIE1TX0NQTFVTX0VYQ0VQVElPTjoNCisJCWJhc2UgPSAiQysrIGV4Y2VwdGlvbiI7DQorCQlicmVhazsNCisNCisJY2FzZSBSUENfU19VTktOT1dOX0lGOg0KKwkJYmFzZSA9ICJSUEMgdW5rbm93biBpbnRlcmZhY2UiOw0KKwkJYnJlYWs7DQorCWNhc2UgUlBDX1NfU0VSVkVSX1VOQVZBSUxBQkxFOg0KKwkJYmFzZSA9ICJSUEMgc2VydmVyIHVuYXZhaWxhYmxlIjsNCisJCWJyZWFrOw0KKwl9DQorDQorCWlmIChkZXRhaWwuc2l6ZSgpID4gMCkgew0KKwkJcmV0dXJuIHN0ZDo6c3RyaW5nKGJhc2UpICsgZGV0YWlsOw0KKwl9DQorCXJldHVybiBiYXNlOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRXhjZXB0aW9uRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpDQorew0KKwlFWENFUFRJT05fUkVDT1JEICZlID0gZGVidWdFdmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQ7DQorCUxvZ1RyYWNlKCJEZWJ1Z1Byb2Nlc3NNb25pdG9yOjpIYW5kbGVFeGNlcHRpb25FdmVudCIsICJFeGNlcHRpb24gaW4gdGhyZWFkICVkIGF0IDB4JXg6IGNvZGUgMHgleCAoJXMpIiwNCisJCQlkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIGUuRXhjZXB0aW9uQWRkcmVzcywgZS5FeGNlcHRpb25Db2RlLA0KKwkJCUdldERlYnVnRXhjZXB0aW9uRGVzY3JpcHRpb24oZGVidWdFdmVudC51LkV4Y2VwdGlvbikuY19zdHIoKSk7DQorDQorICAgIFdpblRocmVhZCogdGhyZWFkID0gV2luVGhyZWFkOjpHZXRUaHJlYWRCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCk7DQorCWlmICghdGhyZWFkKQ0KKwkJYXNzZXJ0KGZhbHNlKTsNCisNCisJLy8gaWdub3JlIGluaXRpYWwgYnJlYWtwb2ludCBpbiBOVERMTCFEYmdCcmVha1BvaW50IGZvciBuZXdseSBsYXVuY2hlZCBwcm9jZXNzIGlmIG5lY2Vzc2FyeQ0KKwlpZiAoIWhhbmRsZWRJbml0aWFsRGVidWdCcmVha3BvaW50ICYmIGUuRXhjZXB0aW9uQ29kZSA9PSBFWENFUFRJT05fQlJFQUtQT0lOVCkNCisJew0KKwkgICAgdHJhY2UoTE9HX0FMV0FZUywgIlx0IC0tIGlnbm9yZWQ6IGluaXRpYWwgbnRkbGwgRGJnQnJlYWtQb2ludCBicmVha3BvaW50Iik7DQorCQloYW5kbGVkSW5pdGlhbERlYnVnQnJlYWtwb2ludCA9IHRydWU7DQorCQkvLyBUaGUgIkRCR19FWENFUFRJT05fTk9UX0hBTkRMRUQiIGZsYWcgd2lsbCBtYWtlIHNvbWUgb3RoZXIgdW5rbm93biBicmVha3BvaW50KHMpIGluIHN5c3RlbSBkbGxzDQorCQkvLyBzaG93IHVwIG9uIHNvbWUgbWFjaGluZXMuIEJ1dCAiREJHX0NPTlRJTlVFIiB3b24ndC4NCisJCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorCQlyZXR1cm47DQorCX0NCisNCisJaWYgKHRocmVhZCAmJiBTZXR0aW5nc1NlcnZpY2U6OnJlcG9ydEV4Y2VwdGlvbkV2ZW50KGRlYnVnRXZlbnQpKQ0KKwl7DQorCSAgICB0cmFjZShMT0dfQUxXQVlTLCAiXHQgLS0gcmVwb3J0ZWQgdG8gaG9zdCBkZWJ1Z2dlci4iKTsNCisJCXRocmVhZC0+SGFuZGxlRXhjZXB0aW9uKGRlYnVnRXZlbnQpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJdHJhY2UoTE9HX0FMV0FZUywgIlx0IC0tIGlnbm9yZWQuIik7DQorCQkvLyBOb3RlIERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQgaXMgdXNlZCBoZXJlLg0KKwkJQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRCk7DQorCX0NCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZVByb2Nlc3NDcmVhdGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpDQorew0KKwlXaW5Qcm9jZXNzKiBwcm9jZXNzID0gbmV3IFdpblByb2Nlc3ModGhpcywgZGVidWdFdmVudCk7DQorCVdpblRocmVhZCogdGhyZWFkID0gbmV3IFdpblRocmVhZCgqcHJvY2VzcywgZGVidWdFdmVudCk7DQorDQorCXByb2Nlc3MtPlNldERlYnVnZ2luZyh0cnVlKTsNCisJdGhyZWFkLT5TZXREZWJ1Z2dpbmcodHJ1ZSk7DQorDQorCS8vIHJlY29yZCBpbiBvdXIgY2FjaGUNCisJQ29udGV4dE1hbmFnZXI6OmFkZENvbnRleHQocHJvY2Vzcyk7DQorCUNvbnRleHRNYW5hZ2VyOjphZGRDb250ZXh0KHRocmVhZCk7DQorDQorCS8vIE5vdGlmeSBob3N0DQorCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0QWRkZWQocHJvY2Vzcyk7DQorCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0QWRkZWQodGhyZWFkKTsNCisNCisJdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSA9IDA7DQorCXVuc2lnbmVkIGxvbmcgYmFzZU9mQ29kZSA9IDA7DQorCXN0ZDo6c3RyaW5nIGltYWdlTmFtZSA9IEdldEV4ZWN1dGFibGVJbmZvKGRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oRmlsZSwgYmFzZU9mQ29kZSwgY29kZVNpemUpOw0KKw0KKwlpZiAoU2V0dGluZ3NTZXJ2aWNlOjpyZXBvcnREZWJ1Z0V2ZW50Rm9yTW9kdWxlKGltYWdlTmFtZSkpDQorCQl0aHJlYWQtPkhhbmRsZUV4ZWN1dGFibGVFdmVudCh0cnVlLCBpbWFnZU5hbWUsICh1bnNpZ25lZCBsb25nKWRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5scEJhc2VPZkltYWdlLCBjb2RlU2l6ZSArIGJhc2VPZkNvZGUpOw0KKwllbHNlDQorCQlDb250aW51ZURlYnVnRXZlbnQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkLCBEQkdfQ09OVElOVUUpOw0KKw0KKwlDbG9zZUhhbmRsZShkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaEZpbGUpOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlVGhyZWFkQ3JlYXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQ0KK3sNCisJV2luUHJvY2VzcyogcHJvY2VzcyA9IFdpblByb2Nlc3M6OkdldFByb2Nlc3NCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQpOw0KKwlpZiAocHJvY2Vzcykgew0KKwkJV2luVGhyZWFkKiB0aHJlYWQgPSBuZXcgV2luVGhyZWFkKCpwcm9jZXNzLCBkZWJ1Z0V2ZW50KTsNCisJCXRocmVhZC0+U2V0RGVidWdnaW5nKHRydWUpOw0KKwkJQ29udGV4dE1hbmFnZXI6OmFkZENvbnRleHQodGhyZWFkKTsNCisJCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0QWRkZWQodGhyZWFkKTsNCisJfSBlbHNlIHsNCisJCWFzc2VydChmYWxzZSk7DQorCX0NCisNCisJQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZVByb2Nlc3NFeGl0ZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKTsNCisJaWYgKHByb2Nlc3MpIHsNCisJCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0UmVtb3ZlZChwcm9jZXNzLCB0cnVlKTsNCisJfSBlbHNlIHsNCisJCWFzc2VydChmYWxzZSk7DQorCX0NCisJQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsNCit9DQorDQorLyoqDQorICogTWFrZSBzdXJlIG1vbml0b3IgdGhyZWFkIGlzIGtpbGxlZCBhZnRlciB0aGUgcHJvY2VzcyBiZWluZyBkZWJ1Z2dlZCBkaWVkIG9yDQorICogaXMgdGVybWluYXRlZC4NCisgKiBOb3RlIHRoZXJlIGlzIG9uZSBtb25pdG9yIHRocmVhZCBmb3IgZWFjaCBkZWJ1Z2dlZCBwcm9jZXNzLiBUaGUgInByb2Nlc3NfaWQiDQorICogcGFzc2VkIGluIHNob3VsZCBiZSB0aGUgcHJvY2VzcyBiZWluZyBtb25pdG9yZWQuDQorICovDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OlByb2Nlc3NEaWVkKERXT1JEIHByb2Nlc3NfaWQpDQorew0KKwkvLyBUZXJtaW5hdGUgbW9uaXRvciB0aHJlYWQgaWYgdGhlIHByb2Nlc3MgYmVpbmcgbW9uaXRvcmVkIGhhcyBkaWVkLg0KKwlpZiAocHJvY2Vzc0lEID09IHByb2Nlc3NfaWQpDQorCQl3YWl0Rm9yRGVidWdFdmVudHMgPSBmYWxzZTsNCisJZWxzZQ0KKwkJYXNzZXJ0KGZhbHNlKTsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZVRocmVhZEV4aXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQ0KK3sNCisJV2luVGhyZWFkKiB0aHJlYWQgPSBXaW5UaHJlYWQ6OkdldFRocmVhZEJ5SUQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkKTsNCisJaWYgKHRocmVhZCkgew0KKwkJRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRSZW1vdmVkKHRocmVhZCwgdHJ1ZSk7DQorCX0gZWxzZSB7DQorCQlhc3NlcnQoZmFsc2UpOw0KKwl9DQorCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVETExMb2FkZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCXVuc2lnbmVkIGxvbmcgY29kZVNpemUgPSAwOw0KKwl1bnNpZ25lZCBsb25nIGJhc2VPZkNvZGUgPSAwOw0KKwlzdGQ6OnN0cmluZyBtb2R1bGVOYW1lID0gR2V0RXhlY3V0YWJsZUluZm8oZGVidWdFdmVudC51LkxvYWREbGwuaEZpbGUsIGJhc2VPZkNvZGUsIGNvZGVTaXplKTsNCisNCisJaWYgKFNldHRpbmdzU2VydmljZTo6cmVwb3J0RGVidWdFdmVudEZvck1vZHVsZShtb2R1bGVOYW1lKSkNCisJew0KKwkJTG9nVHJhY2UoIkRlYnVnUHJvY2Vzc01vbml0b3I6OkhhbmRsZURMTExvYWRlZEV2ZW50IiwgIkJhc2UgYWRkcmVzczogJTguOHggJXMiLCBkZWJ1Z0V2ZW50LnUuTG9hZERsbC5scEJhc2VPZkRsbCwgbW9kdWxlTmFtZS5jX3N0cigpKTsNCisJCVdpblRocmVhZCogdGhyZWFkID0gV2luVGhyZWFkOjpHZXRUaHJlYWRCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCk7DQorCQlpZiAodGhyZWFkKSB7DQorCQkJdGhyZWFkLT5IYW5kbGVFeGVjdXRhYmxlRXZlbnQodHJ1ZSwgbW9kdWxlTmFtZSwgKHVuc2lnbmVkIGxvbmcpZGVidWdFdmVudC51LkxvYWREbGwubHBCYXNlT2ZEbGwsIGNvZGVTaXplKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorCX0NCisNCisJQ2xvc2VIYW5kbGUoZGVidWdFdmVudC51LkxvYWREbGwuaEZpbGUpOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRExMVW5sb2FkZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCS8vIGlmIG91ciBwcm9jZXNzIGtub3dzIGFib3V0IHRoaXMgZGxsIHRoZW4gaXQgbXVzdCBiZSBpbiB0aGUgbGlzdCBvZiBtb2R1bGVzIHRvIGRlYnVnDQorCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKTsNCisJaWYgKHByb2Nlc3MpDQorCXsNCisJCVByb3BlcnRpZXMgcHJvcHMgPSBwcm9jZXNzLT5HZXRFeGVjdXRhYmxlc0J5QWRkcmVzcygpWyh1bnNpZ25lZCBsb25nKWRlYnVnRXZlbnQudS5VbmxvYWREbGwubHBCYXNlT2ZEbGxdOw0KKwkJaWYgKCFwcm9wcy5lbXB0eSgpKQ0KKwkJew0KKwkJCVdpblRocmVhZCogdGhyZWFkID0gV2luVGhyZWFkOjpHZXRUaHJlYWRCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCk7DQorCQkJaWYgKHRocmVhZCkgew0KKwkJCQl0aHJlYWQtPkhhbmRsZUV4ZWN1dGFibGVFdmVudChmYWxzZSwgIiIsICh1bnNpZ25lZCBsb25nKWRlYnVnRXZlbnQudS5VbmxvYWREbGwubHBCYXNlT2ZEbGwsIDApOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlDb250aW51ZURlYnVnRXZlbnQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCwgZGVidWdFdmVudC5kd1RocmVhZElkLCBEQkdfQ09OVElOVUUpOw0KK30NCisNCit2b2lkIFdpbkRlYnVnTW9uaXRvcjo6SGFuZGxlRGVidWdTdHJpbmdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCWlmIChTZXR0aW5nc1NlcnZpY2U6OnJlcG9ydERlYnVnU3RyaW5nRXZlbnRzKCkpDQorCXsNCisJCVdpblByb2Nlc3MqIHByb2Nlc3MgPSBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKTsNCisNCisJCWlmIChkZWJ1Z0V2ZW50LnUuRGVidWdTdHJpbmcuZlVuaWNvZGUgPT0gMCkNCisJCXsNCisJCQlpbnQgZGVidWdTdHJpbmdMZW5ndGggPSBkZWJ1Z0V2ZW50LnUuRGVidWdTdHJpbmcubkRlYnVnU3RyaW5nTGVuZ3RoOw0KKwkJCWNoYXIqIGRlYnVnU3RyaW5nQnVmZmVyID0gbmV3IGNoYXJbZGVidWdTdHJpbmdMZW5ndGggKyAxXTsNCisJCQlSZWFkUHJvY2Vzc01lbW9yeShwcm9jZXNzLT5HZXRQcm9jZXNzSGFuZGxlKCksIGRlYnVnRXZlbnQudS5EZWJ1Z1N0cmluZy5scERlYnVnU3RyaW5nRGF0YSwgZGVidWdTdHJpbmdCdWZmZXIsDQorCQkJCQlkZWJ1Z1N0cmluZ0xlbmd0aCxOVUxMKTsNCisJCQlkZWJ1Z1N0cmluZ0J1ZmZlcltkZWJ1Z1N0cmluZ0xlbmd0aF0gPSAwOw0KKw0KKwkJCS8vIGNvbnZlcnQgZnJvbSBhbnNpIHRvIHV0Zi04DQorCQkJd2NoYXJfdCogd2lkZUNoYXJzID0gbmV3IHdjaGFyX3RbZGVidWdTdHJpbmdMZW5ndGhdOw0KKw0KKwkJCS8vIENvdmVydCB0byBVbmljb2RlLg0KKwkJCWlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZGVidWdTdHJpbmdCdWZmZXIsIGRlYnVnU3RyaW5nTGVuZ3RoLA0KKwkJCQkJd2lkZUNoYXJzLCBkZWJ1Z1N0cmluZ0xlbmd0aCkgIT0gMCkNCisJCQl7DQorCQkJICAgIGludCBzaXplX25lZWRlZCA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgd2lkZUNoYXJzLCBkZWJ1Z1N0cmluZ0xlbmd0aCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQorCQkJICAgIHN0ZDo6c3RyaW5nIHN0clRvKCBzaXplX25lZWRlZCwgMCApOw0KKwkJCSAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHdpZGVDaGFycywgZGVidWdTdHJpbmdMZW5ndGgsICZzdHJUb1swXSwgc2l6ZV9uZWVkZWQsIE5VTEwsIE5VTEwpOw0KKwkJCQkvLyB3cml0ZSBjb25zb2xlIGRhdGEsIGlmIGNvbnNvbGUNCisJCQkJTG9nZ2luZ1NlcnZpY2U6OldyaXRlTG9nZ2luZ01lc3NhZ2UoY2hhbm5lbCwgc3RyVG8sIExvZ2dpbmdTZXJ2aWNlOjpHZXRXaW5kb3dzQ29uc29sZUlEKCkpOw0KKwkJCQlMb2dUcmFjZSgiRGVidWdQcm9jZXNzTW9uaXRvcjo6SGFuZGxlRGVidWdTdHJpbmdFdmVudCIsICIlcyIsIHN0clRvLmNfc3RyKCkpOw0KKwkJCX0NCisNCisJCQlkZWxldGVbXSB3aWRlQ2hhcnM7DQorCQkJZGVsZXRlW10gZGVidWdTdHJpbmdCdWZmZXI7DQorCQl9DQorCX0NCisNCisJQ29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsNCit9DQorDQordm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZVN5c3RlbURlYnVnRXJyb3JFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpIYW5kbGVVbmtud29uRGVidWdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCit7DQorCUNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorfQ0KKw0KK3ZvaWQgV2luRGVidWdNb25pdG9yOjpQb3N0QWN0aW9uKEFnZW50QWN0aW9uKiBhY3Rpb24pDQorew0KKwlhY3Rpb25zXy5wdXNoKGFjdGlvbik7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpbkRlYnVnTW9uaXRvci5oIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmgKaW5kZXggYWVkNmQwYS4uODEzNDZiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmgKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmgKQEAgLTEsMTE0ICsxLDEwMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJzdGRhZnguaCIKLSNpbmNsdWRlICJEZWJ1Z01vbml0b3IuaCIKLSNpbmNsdWRlICJUQ0ZDaGFubmVsLmgiIAotI2luY2x1ZGUgPHF1ZXVlPgotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJjaGFubmVsLmgiCi0jaW5jbHVkZSAiZXZlbnRzLmgiCi19Ci0KLWNsYXNzIEFnZW50QWN0aW9uOwotY2xhc3MgQWdlbnRBY3Rpb25QYXJhbXM7Ci1jbGFzcyBXaW5Qcm9jZXNzOwotCi0vKgotICogV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiBEZWJ1Z01vbml0b3IuCi0gKi8KLWNsYXNzIFdpbkRlYnVnTW9uaXRvcjogcHVibGljIERlYnVnTW9uaXRvciB7Ci1wdWJsaWM6Ci0JV2luRGVidWdNb25pdG9yKGNvbnN0IExhdW5jaFByb2Nlc3NQYXJhbXMmIHBhcmFtcyk7Ci0KLQlXaW5EZWJ1Z01vbml0b3IoY29uc3QgQXR0YWNoVG9Qcm9jZXNzUGFyYW1zJiBwYXJhbXMpOwotCi0JdmlydHVhbCB+V2luRGVidWdNb25pdG9yKHZvaWQpOwotCi0Jdm9pZCBTdGFydFByb2Nlc3NGb3JEZWJ1ZygpOwotCXZvaWQgRXZlbnRMb29wKCk7Ci0Jdm9pZCBTdGFydE1vbml0b3IoKTsKLQotCXZvaWQgQ2FwdHVyZU1vbml0b3JUaHJlYWQoKTsKLQl2b2lkIFNldFByb2Nlc3MoV2luUHJvY2VzcyogcHJvY2Vzcyk7Ci0Jdm9pZCBTdXNwZW5kKCk7Ci0Jdm9pZCBSZXN1bWUoKTsKLQotCXZvaWQgUG9zdEFjdGlvbihBZ2VudEFjdGlvbiogYWN0aW9uKTsKLQotCXZpcnR1YWwgdm9pZCBBdHRhY2godW5zaWduZWQgbG9uZyBwaWQsIENvbnRleHRBdHRhY2hDYWxsQmFjayAqIGRvbmUsCi0JCQl2b2lkICogZGF0YSwgaW50IHNlbGZhdHRhY2gpOwotCi0Jdm9pZCBTdGFydERlYnVnKCk7Ci0KLQkvKgotCSAqIExhdW5jaCBhIHByb2Nlc3MgYW5kIG1vbml0b3IgaXQuCi0JICovCi0Jc3RhdGljIHZvaWQgTGF1bmNoUHJvY2Vzcyhjb25zdCBMYXVuY2hQcm9jZXNzUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0KLQkvKgotCSAqIEF0dGFjaCB0byBhIHByb2Nlc3MgYW5kIG1vbml0b3IgaXQuCi0JICogcHJvY2Vzc0lEOiB0aGUgV2luZG93cyBwcm9jZXNzIElELgotCSAqLwotCXN0YXRpYyB2b2lkIEF0dGFjaFRvUHJvY2Vzcyhjb25zdCBBdHRhY2hUb1Byb2Nlc3NQYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsKLQotCS8qKgotCSAqIFRlbGwgd2hldGhlciB0aGUgZXhjZXB0aW9uIGlzIGEgZmlyc3QtY2hhbmNlIGV4Y2VwdGlvbiB3aGVyZSB3ZSB3YW50Ci0JICogdG8gaW1tZWRpYXRlbHkgc3VzcGVuZCBhbmQgZGVidWcuICBVc3VhbGx5LCB3ZSBhbGxvdyBhIHVzZXItd3JpdHRlbgotCSAqIF9fdHJ5L19fZXhjZXB0IGhhbmRsZXIgdGFrZSB0aGVzZSwgYnV0IGluIHNvbWUgY2FzZXMgKGUuZy4gRExMIGxhb2QgZmFpbHVyZSkKLQkgKiB0aGUgcHJvY2VzcyB3aWxsIGp1c3QgY3Jhc2guCi0JICovCi0JYm9vbCBTaG91bGREZWJ1Z0ZpcnN0Q2hhbmNlKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQotCWJvb2wgU2hvdWxkUmVwb3J0RXhjZXB0aW9uKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQotCXN0YXRpYyBzdGQ6OnN0cmluZyBHZXREZWJ1Z0V4Y2VwdGlvbkRlc2NyaXB0aW9uKGNvbnN0IEVYQ0VQVElPTl9ERUJVR19JTkZPJiBleGNlcHRpb25JbmZvKTsKLQotCXZvaWQgSGFuZGxlRGVidWdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7Ci0KLXByaXZhdGU6Ci0Jdm9pZCBBdHRhY2hUb1Byb2Nlc3NGb3JEZWJ1ZygpOwotCi0Jdm9pZCBIYW5kbGVOb0RlYnVnRXZlbnQoKTsKLQotCXZvaWQgSGFuZGxlRXhjZXB0aW9uRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCXZvaWQgSGFuZGxlUHJvY2Vzc0NyZWF0ZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7Ci0Jdm9pZCBIYW5kbGVUaHJlYWRDcmVhdGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCXZvaWQgSGFuZGxlUHJvY2Vzc0V4aXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQl2b2lkIEhhbmRsZVRocmVhZEV4aXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQl2b2lkIEhhbmRsZURMTExvYWRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQl2b2lkIEhhbmRsZURMTFVubG9hZGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCXZvaWQgSGFuZGxlRGVidWdTdHJpbmdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7Ci0Jdm9pZCBIYW5kbGVTeXN0ZW1EZWJ1Z0Vycm9yRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCXZvaWQgSGFuZGxlVW5rbndvbkRlYnVnRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCi0Jdm9pZCBIYW5kbGVFeGNlcHRpb24oREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCi1wcml2YXRlOgotCi0JRFdPUkQgd2ZkZVdhaXQ7Ci0JYm9vbCB3YWl0Rm9yRGVidWdFdmVudHM7Ci0JYm9vbCBoYW5kbGVkRmlyc3RFeGNlcHRpb25fOwotCURXT1JEIHByb2Nlc3NJRDsKLQlib29sIGlzQXR0YWNoOwotCi0JUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzSW5mbzsKLQlIQU5ETEUgbW9uaXRvclRocmVhZF87Ci0JV2luUHJvY2VzcyogcHJvY2Vzc187Ci0Jc3RkOjpxdWV1ZTxBZ2VudEFjdGlvbio+IGFjdGlvbnNfOwotCi19OwotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjcHJhZ21hIG9uY2UNCisNCisjaW5jbHVkZSA8c3RyaW5nPg0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIlRDRkNoYW5uZWwuaCIgDQorI2luY2x1ZGUgPHF1ZXVlPg0KKw0KK2V4dGVybiAiQyIgew0KKyNpbmNsdWRlICJjaGFubmVsLmgiDQorI2luY2x1ZGUgImV2ZW50cy5oIg0KK30NCisNCitjbGFzcyBBZ2VudEFjdGlvbjsNCitjbGFzcyBBZ2VudEFjdGlvblBhcmFtczsNCitjbGFzcyBXaW5Qcm9jZXNzOw0KKw0KKy8qDQorICogV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiBEZWJ1Z01vbml0b3IuDQorICovDQorY2xhc3MgV2luRGVidWdNb25pdG9yOiBwdWJsaWMgRGVidWdNb25pdG9yIHsNCitwdWJsaWM6DQorCVdpbkRlYnVnTW9uaXRvcihjb25zdCBMYXVuY2hQcm9jZXNzUGFyYW1zJiBwYXJhbXMpOw0KKw0KKwlXaW5EZWJ1Z01vbml0b3IoY29uc3QgQXR0YWNoVG9Qcm9jZXNzUGFyYW1zJiBwYXJhbXMpOw0KKw0KKwl2aXJ0dWFsIH5XaW5EZWJ1Z01vbml0b3Iodm9pZCk7DQorDQorCXZvaWQgU3RhcnRQcm9jZXNzRm9yRGVidWcoKTsNCisJdm9pZCBFdmVudExvb3AoKTsNCisJdm9pZCBTdGFydE1vbml0b3IoKTsNCisNCisJdm9pZCBDYXB0dXJlTW9uaXRvclRocmVhZCgpOw0KKwl2b2lkIFN1c3BlbmQoKTsNCisJdm9pZCBSZXN1bWUoKTsNCisNCisJdm9pZCBQb3N0QWN0aW9uKEFnZW50QWN0aW9uKiBhY3Rpb24pOw0KKw0KKwl2aXJ0dWFsIHZvaWQgQXR0YWNoKHVuc2lnbmVkIGxvbmcgcGlkLCBDb250ZXh0QXR0YWNoQ2FsbEJhY2sgKiBkb25lLA0KKwkJCXZvaWQgKiBkYXRhLCBpbnQgc2VsZmF0dGFjaCk7DQorDQorCXZvaWQgU3RhcnREZWJ1ZygpOw0KKw0KKwkvKg0KKwkgKiBMYXVuY2ggYSBwcm9jZXNzIGFuZCBtb25pdG9yIGl0Lg0KKwkgKi8NCisJc3RhdGljIHZvaWQgTGF1bmNoUHJvY2Vzcyhjb25zdCBMYXVuY2hQcm9jZXNzUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7DQorDQorCS8qDQorCSAqIEF0dGFjaCB0byBhIHByb2Nlc3MgYW5kIG1vbml0b3IgaXQuDQorCSAqIHByb2Nlc3NJRDogdGhlIFdpbmRvd3MgcHJvY2VzcyBJRC4NCisJICovDQorCXN0YXRpYyB2b2lkIEF0dGFjaFRvUHJvY2Vzcyhjb25zdCBBdHRhY2hUb1Byb2Nlc3NQYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisNCisJc3RhdGljIHN0ZDo6c3RyaW5nIEdldERlYnVnRXhjZXB0aW9uRGVzY3JpcHRpb24oY29uc3QgRVhDRVBUSU9OX0RFQlVHX0lORk8mIGV4Y2VwdGlvbkluZm8pOw0KKw0KKwl2b2lkIEhhbmRsZURlYnVnRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOw0KKw0KKwl2b2lkIFByb2Nlc3NEaWVkKERXT1JEIHByb2Nlc3NfaWQpOw0KKw0KK3ByaXZhdGU6DQorCXZvaWQgQXR0YWNoVG9Qcm9jZXNzRm9yRGVidWcoKTsNCisNCisJdm9pZCBIYW5kbGVOb0RlYnVnRXZlbnQoKTsNCisNCisJdm9pZCBIYW5kbGVFeGNlcHRpb25FdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlUHJvY2Vzc0NyZWF0ZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlVGhyZWFkQ3JlYXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCisJdm9pZCBIYW5kbGVQcm9jZXNzRXhpdGVkRXZlbnQoREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOw0KKwl2b2lkIEhhbmRsZVRocmVhZEV4aXRlZEV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCisJdm9pZCBIYW5kbGVETExMb2FkZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlRExMVW5sb2FkZWRFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlRGVidWdTdHJpbmdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlU3lzdGVtRGVidWdFcnJvckV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCisJdm9pZCBIYW5kbGVVbmtud29uRGVidWdFdmVudChERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorDQorcHJpdmF0ZToNCisNCisJRFdPUkQgd2ZkZVdhaXQ7DQorCWJvb2wgd2FpdEZvckRlYnVnRXZlbnRzOw0KKwlib29sIGhhbmRsZWRJbml0aWFsRGVidWdCcmVha3BvaW50Ow0KKwlEV09SRCBwcm9jZXNzSUQ7DQorCWJvb2wgaXNBdHRhY2g7DQorDQorCVBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc0luZm87DQorCUhBTkRMRSBtb25pdG9yVGhyZWFkXzsNCisJc3RkOjpxdWV1ZTxBZ2VudEFjdGlvbio+IGFjdGlvbnNfOw0KKw0KK307DQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luUHJvY2Vzcy5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcAppbmRleCA5YWU2N2U5Li4yNzg0MmFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcApAQCAtMSwxNTIgKzEsMTQ4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJTdGRBZnguaCIKLSNpbmNsdWRlICJXaW5Qcm9jZXNzLmgiCi0jaW5jbHVkZSAiV2luVGhyZWFkLmgiCi0jaW5jbHVkZSAiRXZlbnRDbGllbnROb3RpZmllci5oIgotI2luY2x1ZGUgIkFnZW50VXRpbHMuaCIKLSNpbmNsdWRlICJQc2FwaS5oIgotI2luY2x1ZGUgImFzc2VydC5oIgotI2luY2x1ZGUgIldpbkRlYnVnTW9uaXRvci5oIgotI2luY2x1ZGUgIlRlcm1pbmF0ZVByb2Nlc3NBY3Rpb24uaCIKLSNpbmNsdWRlICJQcm90b2NvbENvbnN0YW50cy5oIgotI2luY2x1ZGUgIlJ1bkNvbnRyb2xTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiQ29udGV4dE1hbmFnZXIuaCIKLSNpbmNsdWRlICJCcmVha3BvaW50c1NlcnZpY2UuaCIKLQotc3RkOjptYXA8aW50LCBXaW5Qcm9jZXNzKj4gV2luUHJvY2Vzczo6cHJvY2Vzc0lETWFwOwotCi1XaW5Qcm9jZXNzOjpXaW5Qcm9jZXNzKFdpbkRlYnVnTW9uaXRvciogbW9uaXRvciwgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpIDoKLQlQcm9jZXNzQ29udGV4dChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBST09UX0NPTlRFWFRfSUQsIENyZWF0ZUludGVybmFsSUQoZGVidWdFdmVudC5kd1Byb2Nlc3NJZCkpLAotCXByb2Nlc3NIYW5kbGVfKGRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oUHJvY2VzcyksCi0JbW9uaXRvcl8obW9uaXRvcikKLXsKLQlpc1Jvb3RfID0gdHJ1ZTsKLQlwcm9jZXNzSURNYXBbZGVidWdFdmVudC5kd1Byb2Nlc3NJZF0gPSB0aGlzOwotCi0JLy8gR2V0IHRoZSBuYW1lIGZvciB0aGUgbmV3IHByb2Nlc3MKLQlzdGQ6OnN0cmluZyBtb2R1bGVGaWxlTmFtZSA9ICJ1bmtub3duIjsKLQlpbnQgYnVmZmVyU2l6ZSA9IDMyNzY4OwotCXsKLQkJTFBUU1RSIHByb2Nlc3NOYW1lQnVmZmVyID0gbmV3IFRDSEFSW2J1ZmZlclNpemVdOwotCQlpbnQgbmFtZUxlbmd0aCA9IEdldFByb2Nlc3NJbWFnZUZpbGVOYW1lKChITU9EVUxFKSBwcm9jZXNzSGFuZGxlXywKLQkJCQlwcm9jZXNzTmFtZUJ1ZmZlciwgYnVmZmVyU2l6ZSk7Ci0JCWlmIChuYW1lTGVuZ3RoID4gMCkgewotCQkJbW9kdWxlRmlsZU5hbWUgPSBBZ2VudFV0aWxzOjptYWtlU3RyaW5nKHByb2Nlc3NOYW1lQnVmZmVyKTsKLQkJfQotCQlkZWxldGVbXSBwcm9jZXNzTmFtZUJ1ZmZlcjsKLQl9Ci0JaW50IGxhc3RTbGFzaCA9IG1vZHVsZUZpbGVOYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsKLQlpZiAobGFzdFNsYXNoID4gMCkKLQkJbW9kdWxlRmlsZU5hbWUgPSBtb2R1bGVGaWxlTmFtZS5zdWJzdHIobGFzdFNsYXNoICsgMSk7Ci0JcHJvY2Vzc05hbWVfID0gbW9kdWxlRmlsZU5hbWU7Ci0KLQlpbml0aWFsaXplKCk7Ci19Ci0KLVdpblByb2Nlc3M6OldpblByb2Nlc3MoRFdPUkQgcHJvY0lELCBzdGQ6OnN0cmluZyBwcm9jTmFtZSkgOgotCVByb2Nlc3NDb250ZXh0KHByb2NJRCwgUk9PVF9DT05URVhUX0lELCBDcmVhdGVJbnRlcm5hbElEKHByb2NJRCkpLAotCXByb2Nlc3NIYW5kbGVfKE5VTEwpLAotCW1vbml0b3JfKE5VTEwpCi17Ci0JcHJvY2Vzc05hbWVfID0gcHJvY05hbWU7Ci0KLQlpbml0aWFsaXplKCk7Ci19Ci0KLS8vIEluaXRpYWxpemUgcHJvY2VzcyBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotdm9pZCBXaW5Qcm9jZXNzOjppbml0aWFsaXplKCkKLXsKLQlTZXRQcm9wZXJ0eShQUk9QX05BTUUsIG5ldyBQcm9wZXJ0eVZhbHVlKHByb2Nlc3NOYW1lXykpOwotCi0JLy8gZG8gbm90IHN1cHBvcnQgcHJvY2VzcyBzdGVwcGluZyB5ZXQKLQlpbnQgc3VwcG9ydGVkUmVzdW1lTW9kZXMgPSAoMSA8PCBSTV9SRVNVTUUpOwotCVNldFByb3BlcnR5KFBST1BfQ0FOX1JFU1VNRSwgbmV3IFByb3BlcnR5VmFsdWUoc3VwcG9ydGVkUmVzdW1lTW9kZXMpKTsKLQotCVNldFByb3BlcnR5KFBST1BfQ0FOX1RFUk1JTkFURSwgbmV3IFByb3BlcnR5VmFsdWUodHJ1ZSkpOwotCVNldFByb3BlcnR5KFBST1BfQ0FOX1NVU1BFTkQsIG5ldyBQcm9wZXJ0eVZhbHVlKHRydWUpKTsKLX0KLQotV2luUHJvY2Vzczo6fldpblByb2Nlc3Modm9pZCkgewotCS8vIFRoaXMgbWFrZXMgYSBjb3B5LgotCXN0ZDo6bGlzdDxDb250ZXh0ICo+IHJlbWFpbmluZ0tpZHMgPSBHZXRDaGlsZHJlbigpOwotCi0JLy8gZGVsZXRlIGNoaWxkcmVuCi0JZm9yIChzdGQ6Omxpc3Q8Q29udGV4dCAqPjo6aXRlcmF0b3IgaXRlciA9IHJlbWFpbmluZ0tpZHMuYmVnaW4oKTsKLQkJaXRlciAhPSByZW1haW5pbmdLaWRzLmVuZCgpOyBpdGVyKyspIHsKLQkJQ29udGV4dCoga2lkID0gKml0ZXI7Ci0JCWRlbGV0ZSBDb250ZXh0TWFuYWdlcjo6cmVtb3ZlQ29udGV4dChraWQtPkdldElEKCkpOwotCX0KLQotCXByb2Nlc3NJRE1hcC5lcmFzZShHZXRPU0lEKCkpOwotfQotCi1IQU5ETEUgV2luUHJvY2Vzczo6R2V0UHJvY2Vzc0hhbmRsZSgpIHsKLQlyZXR1cm4gcHJvY2Vzc0hhbmRsZV87Ci19Ci0KLVdpblByb2Nlc3MqIFdpblByb2Nlc3M6OkdldFByb2Nlc3NCeUlEKGludCBwcm9jZXNzSUQpIHsKLQlzdGQ6Om1hcDxpbnQsIFdpblByb2Nlc3MqPjo6aXRlcmF0b3IgaXRlciA9IHByb2Nlc3NJRE1hcC5maW5kKHByb2Nlc3NJRCk7Ci0JaWYgKGl0ZXIgPT0gcHJvY2Vzc0lETWFwLmVuZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBpdGVyLT5zZWNvbmQ7Ci19Ci0KLWludCBXaW5Qcm9jZXNzOjpSZWFkTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCWJvb2xlYW4gc3VjY2VzcyA9IFJlYWRQcm9jZXNzTWVtb3J5KHByb2Nlc3NIYW5kbGVfLCAoTFBDVk9JRCkgcGFyYW1zLmFkZHJlc3MsCi0JCQlwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSwgcGFyYW1zLnNpemVUcmFuc2ZlcnJlZCk7Ci0JaWYgKCFzdWNjZXNzKQotCQlyZXN1bHQgPSBHZXRMYXN0RXJyb3IoKTsKLQllbHNlCi0JCUJyZWFrcG9pbnRzU2VydmljZTo6UmVtb3ZlQnJlYWtwb2ludHNGcm9tTWVtb3J5UmVhZChwcm9jZXNzSGFuZGxlXywgcGFyYW1zLmFkZHJlc3MsIHBhcmFtcy5tZW1CdWZmZXIsIHBhcmFtcy5zaXplKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBXaW5Qcm9jZXNzOjpXcml0ZU1lbW9yeShjb25zdCBSZWFkV3JpdGVNZW1vcnlQYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7Ci0JLy8gdG8gZG86IGhhbmRsZSBicmVha3BvaW50cyBhbmQgd2F0Y2hwb2ludHMKLQlpbnQgcmVzdWx0ID0gMDsKLQotCWJvb2xlYW4gc3VjY2VzcyA9IFdyaXRlUHJvY2Vzc01lbW9yeShwcm9jZXNzSGFuZGxlXywgKExQVk9JRCkgcGFyYW1zLmFkZHJlc3MsCi0JCQlwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSwgcGFyYW1zLnNpemVUcmFuc2ZlcnJlZCk7Ci0JaWYgKCFzdWNjZXNzKQotCQlyZXN1bHQgPSBHZXRMYXN0RXJyb3IoKTsKLQllbHNlIHsKLQkJQnJlYWtwb2ludHNTZXJ2aWNlOjpSZUluc2VydEJyZWFrcG9pbnRzQWZ0ZXJNZW1vcnlXcml0ZShwcm9jZXNzSGFuZGxlXywgcGFyYW1zLmFkZHJlc3MsIHBhcmFtcy5tZW1CdWZmZXIsIHBhcmFtcy5zaXplKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBXaW5Qcm9jZXNzOjpUZXJtaW5hdGUoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7Ci0JaWYgKG1vbml0b3JfKQotCQltb25pdG9yXy0+UG9zdEFjdGlvbihuZXcgVGVybWluYXRlUHJvY2Vzc0FjdGlvbihwYXJhbXMsIEdldE9TSUQoKSkpOwotfQotCi0vLyBUT0RPOiBpZiB3ZSByZXBvcnQgYW4gZXJyb3IsIERTRiBnZXRzIGNvbmZ1c2VkLi4uCi0vLyBqdXN0IHJlcG9ydCBzdWNjZXNzIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IGltcGxlbWVudGVkCi12b2lkIFdpblByb2Nlc3M6OlNpbmdsZVN0ZXAoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7Ci0JQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KHBhcmFtcy5jaGFubmVsLCBwYXJhbXMudG9rZW4sIDApOwotCS8vQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KHBhcmFtcy5jaGFubmVsLCBwYXJhbXMudG9rZW4sIEVSUl9VTlNVUFBPUlRFRCk7Ci19OwotCi0KLVdpbkRlYnVnTW9uaXRvciogV2luUHJvY2Vzczo6R2V0TW9uaXRvcigpIHsKLQlyZXR1cm4gbW9uaXRvcl87Ci19Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9wZXJ0aWVzPiYgV2luUHJvY2Vzczo6R2V0RXhlY3V0YWJsZXMoKQotewotCXJldHVybiBleGVjdXRhYmxlc187Ci19Ci0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisjaW5jbHVkZSAiV2luUHJvY2Vzcy5oIg0KKyNpbmNsdWRlICJXaW5UaHJlYWQuaCINCisjaW5jbHVkZSAiRXZlbnRDbGllbnROb3RpZmllci5oIg0KKyNpbmNsdWRlICJBZ2VudFV0aWxzLmgiDQorI2luY2x1ZGUgIlBzYXBpLmgiDQorI2luY2x1ZGUgImFzc2VydC5oIg0KKyNpbmNsdWRlICJXaW5EZWJ1Z01vbml0b3IuaCINCisjaW5jbHVkZSAiVGVybWluYXRlUHJvY2Vzc0FjdGlvbi5oIg0KKyNpbmNsdWRlICJQcm90b2NvbENvbnN0YW50cy5oIg0KKyNpbmNsdWRlICJSdW5Db250cm9sU2VydmljZS5oIg0KKyNpbmNsdWRlICJDb250ZXh0TWFuYWdlci5oIg0KKyNpbmNsdWRlICJCcmVha3BvaW50c1NlcnZpY2UuaCINCisNCitzdGQ6Om1hcDxpbnQsIFdpblByb2Nlc3MqPiBXaW5Qcm9jZXNzOjpwcm9jZXNzSURNYXA7DQorDQorV2luUHJvY2Vzczo6V2luUHJvY2VzcyhXaW5EZWJ1Z01vbml0b3IqIG1vbml0b3IsIERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KSA6DQorCVByb2Nlc3NDb250ZXh0KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIFJPT1RfQ09OVEVYVF9JRCwgQ3JlYXRlSW50ZXJuYWxJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkKSksDQorCXByb2Nlc3NIYW5kbGVfKGRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oUHJvY2VzcyksDQorCW1vbml0b3JfKG1vbml0b3IpDQorew0KKwlpc1Jvb3RfID0gdHJ1ZTsNCisJcHJvY2Vzc0lETWFwW2RlYnVnRXZlbnQuZHdQcm9jZXNzSWRdID0gdGhpczsNCisNCisJLy8gR2V0IHRoZSBuYW1lIGZvciB0aGUgbmV3IHByb2Nlc3MNCisJc3RkOjpzdHJpbmcgbW9kdWxlRmlsZU5hbWUgPSAidW5rbm93biI7DQorCWludCBidWZmZXJTaXplID0gMzI3Njg7DQorCXsNCisJCUxQVFNUUiBwcm9jZXNzTmFtZUJ1ZmZlciA9IG5ldyBUQ0hBUltidWZmZXJTaXplXTsNCisJCWludCBuYW1lTGVuZ3RoID0gR2V0UHJvY2Vzc0ltYWdlRmlsZU5hbWUoKEhNT0RVTEUpIHByb2Nlc3NIYW5kbGVfLA0KKwkJCQlwcm9jZXNzTmFtZUJ1ZmZlciwgYnVmZmVyU2l6ZSk7DQorCQlpZiAobmFtZUxlbmd0aCA+IDApIHsNCisJCQltb2R1bGVGaWxlTmFtZSA9IEFnZW50VXRpbHM6Om1ha2VTdHJpbmcocHJvY2Vzc05hbWVCdWZmZXIpOw0KKwkJfQ0KKwkJZGVsZXRlW10gcHJvY2Vzc05hbWVCdWZmZXI7DQorCX0NCisJaW50IGxhc3RTbGFzaCA9IG1vZHVsZUZpbGVOYW1lLmZpbmRfbGFzdF9vZigiXFwiKTsNCisJaWYgKGxhc3RTbGFzaCA+IDApDQorCQltb2R1bGVGaWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLnN1YnN0cihsYXN0U2xhc2ggKyAxKTsNCisJcHJvY2Vzc05hbWVfID0gbW9kdWxlRmlsZU5hbWU7DQorDQorCWluaXRpYWxpemUoKTsNCit9DQorDQorV2luUHJvY2Vzczo6V2luUHJvY2VzcyhEV09SRCBwcm9jSUQsIHN0ZDo6c3RyaW5nIHByb2NOYW1lKSA6DQorCVByb2Nlc3NDb250ZXh0KHByb2NJRCwgUk9PVF9DT05URVhUX0lELCBDcmVhdGVJbnRlcm5hbElEKHByb2NJRCkpLA0KKwlwcm9jZXNzSGFuZGxlXyhOVUxMKSwNCisJbW9uaXRvcl8oTlVMTCkNCit7DQorCXByb2Nlc3NOYW1lXyA9IHByb2NOYW1lOw0KKw0KKwlpbml0aWFsaXplKCk7DQorfQ0KKw0KKy8vIEluaXRpYWxpemUgcHJvY2VzcyBzcGVjaWZpYyBwcm9wZXJ0aWVzLg0KK3ZvaWQgV2luUHJvY2Vzczo6aW5pdGlhbGl6ZSgpDQorew0KKwlTZXRQcm9wZXJ0eShQUk9QX05BTUUsIFByb3BlcnR5VmFsdWUocHJvY2Vzc05hbWVfKSk7DQorDQorCS8vIGRvIG5vdCBzdXBwb3J0IHByb2Nlc3Mgc3RlcHBpbmcgeWV0DQorCWludCBzdXBwb3J0ZWRSZXN1bWVNb2RlcyA9ICgxIDw8IFJNX1JFU1VNRSk7DQorCVNldFByb3BlcnR5KFBST1BfQ0FOX1JFU1VNRSwgUHJvcGVydHlWYWx1ZShzdXBwb3J0ZWRSZXN1bWVNb2RlcykpOw0KKw0KKwlTZXRQcm9wZXJ0eShQUk9QX0NBTl9URVJNSU5BVEUsIFByb3BlcnR5VmFsdWUodHJ1ZSkpOw0KKwlTZXRQcm9wZXJ0eShQUk9QX0NBTl9TVVNQRU5ELCBQcm9wZXJ0eVZhbHVlKHRydWUpKTsNCit9DQorDQorV2luUHJvY2Vzczo6fldpblByb2Nlc3Modm9pZCkgew0KKw0KKwlwcm9jZXNzSURNYXAuZXJhc2UoR2V0T1NJRCgpKTsNCisNCisJR2V0TW9uaXRvcigpLT5Qcm9jZXNzRGllZChHZXRPU0lEKCkpOw0KKw0KKwkvLyBEZXN0cnVjdG9yIG9mIHBhcmVudCBjbGFzc2VzIHdpbGwgYmUgY2FsbGVkIHdoaWNoIHdpbGwNCisJLy8gZGVsZXRlIGFsbCBjaGlsZHJlbiBjb250ZXh0cyAodGhyZWFkcywgcmVnaXN0ZXJzLCBldGMpLg0KK30NCisNCitIQU5ETEUgV2luUHJvY2Vzczo6R2V0UHJvY2Vzc0hhbmRsZSgpIHsNCisJcmV0dXJuIHByb2Nlc3NIYW5kbGVfOw0KK30NCisNCitXaW5Qcm9jZXNzKiBXaW5Qcm9jZXNzOjpHZXRQcm9jZXNzQnlJRChpbnQgcHJvY2Vzc0lEKSB7DQorCXN0ZDo6bWFwPGludCwgV2luUHJvY2Vzcyo+OjppdGVyYXRvciBpdGVyID0gcHJvY2Vzc0lETWFwLmZpbmQocHJvY2Vzc0lEKTsNCisJaWYgKGl0ZXIgPT0gcHJvY2Vzc0lETWFwLmVuZCgpKQ0KKwkJcmV0dXJuIE5VTEw7DQorCWVsc2UNCisJCXJldHVybiBpdGVyLT5zZWNvbmQ7DQorfQ0KKw0KK2ludCBXaW5Qcm9jZXNzOjpSZWFkTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCisJaW50IHJlc3VsdCA9IDA7DQorDQorCWJvb2xlYW4gc3VjY2VzcyA9IFJlYWRQcm9jZXNzTWVtb3J5KHByb2Nlc3NIYW5kbGVfLCAoTFBDVk9JRCkgcGFyYW1zLmFkZHJlc3MsDQorCQkJcGFyYW1zLm1lbUJ1ZmZlciwgcGFyYW1zLnNpemUsIHBhcmFtcy5zaXplVHJhbnNmZXJyZWQpOw0KKwlpZiAoIXN1Y2Nlc3MpDQorCQlyZXN1bHQgPSBHZXRMYXN0RXJyb3IoKTsNCisJZWxzZQ0KKwkJQnJlYWtwb2ludHNTZXJ2aWNlOjpSZW1vdmVCcmVha3BvaW50c0Zyb21NZW1vcnlSZWFkKHByb2Nlc3NIYW5kbGVfLCBwYXJhbXMuYWRkcmVzcywgcGFyYW1zLm1lbUJ1ZmZlciwgcGFyYW1zLnNpemUpOw0KKw0KKwlyZXR1cm4gcmVzdWx0Ow0KK30NCisNCitpbnQgV2luUHJvY2Vzczo6V3JpdGVNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwkvLyB0byBkbzogaGFuZGxlIGJyZWFrcG9pbnRzIGFuZCB3YXRjaHBvaW50cw0KKwlpbnQgcmVzdWx0ID0gMDsNCisNCisJYm9vbGVhbiBzdWNjZXNzID0gV3JpdGVQcm9jZXNzTWVtb3J5KHByb2Nlc3NIYW5kbGVfLCAoTFBWT0lEKSBwYXJhbXMuYWRkcmVzcywNCisJCQlwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSwgcGFyYW1zLnNpemVUcmFuc2ZlcnJlZCk7DQorCWlmICghc3VjY2VzcykNCisJCXJlc3VsdCA9IEdldExhc3RFcnJvcigpOw0KKwllbHNlIHsNCisJCUJyZWFrcG9pbnRzU2VydmljZTo6UmVJbnNlcnRCcmVha3BvaW50c0FmdGVyTWVtb3J5V3JpdGUocHJvY2Vzc0hhbmRsZV8sIHBhcmFtcy5hZGRyZXNzLCBwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSk7DQorCX0NCisJcmV0dXJuIHJlc3VsdDsNCit9DQorDQordm9pZCBXaW5Qcm9jZXNzOjpUZXJtaW5hdGUoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7DQorCWlmIChtb25pdG9yXykNCisJCW1vbml0b3JfLT5Qb3N0QWN0aW9uKG5ldyBUZXJtaW5hdGVQcm9jZXNzQWN0aW9uKHBhcmFtcywgR2V0T1NJRCgpKSk7DQorfQ0KKw0KKy8vIFRPRE86IGlmIHdlIHJlcG9ydCBhbiBlcnJvciwgRFNGIGdldHMgY29uZnVzZWQuLi4NCisvLyBqdXN0IHJlcG9ydCBzdWNjZXNzIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IGltcGxlbWVudGVkDQordm9pZCBXaW5Qcm9jZXNzOjpTaW5nbGVTdGVwKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlBZ2VudEFjdGlvblJlcGx5Ojpwb3N0UmVwbHkocGFyYW1zLmNoYW5uZWwsIHBhcmFtcy50b2tlbiwgMCk7DQorCS8vQWdlbnRBY3Rpb25SZXBseTo6cG9zdFJlcGx5KHBhcmFtcy5jaGFubmVsLCBwYXJhbXMudG9rZW4sIEVSUl9VTlNVUFBPUlRFRCk7DQorfTsNCisNCisNCitXaW5EZWJ1Z01vbml0b3IqIFdpblByb2Nlc3M6OkdldE1vbml0b3IoKSB7DQorCXJldHVybiBtb25pdG9yXzsNCit9DQorDQorc3RkOjptYXA8aW50LCBQcm9wZXJ0aWVzPiYgV2luUHJvY2Vzczo6R2V0RXhlY3V0YWJsZXNCeUFkZHJlc3MoKQ0KK3sNCisJcmV0dXJuIGV4ZWN1dGFibGVzQnlBZGRyZXNzXzsNCit9DQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luUHJvY2Vzcy5oIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luUHJvY2Vzcy5oCmluZGV4IGQ3OWQ0OWQuLjYzNTk3NmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblByb2Nlc3MuaAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmgKQEAgLTEsNTYgKzEsNTcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTm9raWEgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogTm9raWEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAic3RkYWZ4LmgiCi0jaW5jbHVkZSAiUHJvY2Vzc0NvbnRleHQuaCIKLSNpbmNsdWRlICJXaW5EZWJ1Z01vbml0b3IuaCIKLQotY2xhc3MgV2luVGhyZWFkOwotY2xhc3MgV2luRGVidWdNb25pdG9yOwotCi1jbGFzcyBXaW5Qcm9jZXNzIDogcHVibGljIFByb2Nlc3NDb250ZXh0IHsKLXB1YmxpYzoKLQlXaW5Qcm9jZXNzKFdpbkRlYnVnTW9uaXRvciogbW9uaXRvciwgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCVdpblByb2Nlc3MoRFdPUkQgcHJvY0lELCBzdGQ6OnN0cmluZyBwcm9jTmFtZSk7Ci0KLQl2aXJ0dWFsIH5XaW5Qcm9jZXNzKHZvaWQpOwotCi0JLy8KLQkvLyBPdmVycmlkZXMgb2YgUnVuQ29udHJvbENvbnRleHQKLQkvLwotCXZpcnR1YWwgaW50IFJlYWRNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0JdmlydHVhbCBpbnQgV3JpdGVNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0JdmlydHVhbCB2b2lkIFRlcm1pbmF0ZShjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOwotCXZpcnR1YWwgdm9pZCBTaW5nbGVTdGVwKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0JLy8KLQkvLwllbmQgb3ZlcnJpZGVzCi0KLQlIQU5ETEUgR2V0UHJvY2Vzc0hhbmRsZSgpOwotCi0JV2luRGVidWdNb25pdG9yKiBHZXRNb25pdG9yKCk7Ci0KLQlzdGF0aWMgV2luUHJvY2VzcyogR2V0UHJvY2Vzc0J5SUQoaW50IHByb2Nlc3NJRCk7Ci0KLQlzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvcGVydGllcz4mIEdldEV4ZWN1dGFibGVzKCk7Ci0KLXByaXZhdGU6Ci0Jdm9pZCBpbml0aWFsaXplKCk7Ci0KLQlib29sIGlzUm9vdF87Ci0JSEFORExFIHByb2Nlc3NIYW5kbGVfOwotCXN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lXzsKLQlXaW5EZWJ1Z01vbml0b3IqIG1vbml0b3JfOwotCXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9wZXJ0aWVzPiBleGVjdXRhYmxlc187Ci0KLQlzdGF0aWMgc3RkOjptYXA8aW50LCBXaW5Qcm9jZXNzKj4gcHJvY2Vzc0lETWFwOwotfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNwcmFnbWEgb25jZQ0KKw0KKyNpbmNsdWRlIDx2ZWN0b3I+DQorI2luY2x1ZGUgPHNldD4NCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgIlByb2Nlc3NDb250ZXh0LmgiDQorI2luY2x1ZGUgIldpbkRlYnVnTW9uaXRvci5oIg0KKw0KK2NsYXNzIFdpblRocmVhZDsNCitjbGFzcyBXaW5EZWJ1Z01vbml0b3I7DQorDQorY2xhc3MgV2luUHJvY2VzcyA6IHB1YmxpYyBQcm9jZXNzQ29udGV4dCB7DQorcHVibGljOg0KKwlXaW5Qcm9jZXNzKFdpbkRlYnVnTW9uaXRvciogbW9uaXRvciwgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOw0KKwlXaW5Qcm9jZXNzKERXT1JEIHByb2NJRCwgc3RkOjpzdHJpbmcgcHJvY05hbWUpOw0KKw0KKwl2aXJ0dWFsIH5XaW5Qcm9jZXNzKHZvaWQpOw0KKw0KKwkvLw0KKwkvLyBPdmVycmlkZXMgb2YgUnVuQ29udHJvbENvbnRleHQNCisJLy8NCisJdmlydHVhbCBpbnQgUmVhZE1lbW9yeShjb25zdCBSZWFkV3JpdGVNZW1vcnlQYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisJdmlydHVhbCBpbnQgV3JpdGVNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7DQorCXZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisJdmlydHVhbCB2b2lkIFNpbmdsZVN0ZXAoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisJLy8NCisJLy8JZW5kIG92ZXJyaWRlcw0KKw0KKwlIQU5ETEUgR2V0UHJvY2Vzc0hhbmRsZSgpOw0KKw0KKwlXaW5EZWJ1Z01vbml0b3IqIEdldE1vbml0b3IoKTsNCisNCisJc3RhdGljIFdpblByb2Nlc3MqIEdldFByb2Nlc3NCeUlEKGludCBwcm9jZXNzSUQpOw0KKw0KKwlzdGQ6Om1hcDxpbnQsIFByb3BlcnRpZXM+JiBHZXRFeGVjdXRhYmxlc0J5QWRkcmVzcygpOw0KKw0KK3ByaXZhdGU6DQorCXZvaWQgaW5pdGlhbGl6ZSgpOw0KKw0KKwlib29sIGlzUm9vdF87DQorCUhBTkRMRSBwcm9jZXNzSGFuZGxlXzsNCisJc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWVfOw0KKwlXaW5EZWJ1Z01vbml0b3IqIG1vbml0b3JfOw0KKwlzdGQ6Om1hcDxpbnQsIFByb3BlcnRpZXM+IGV4ZWN1dGFibGVzQnlBZGRyZXNzXzsNCisNCisJc3RhdGljIHN0ZDo6bWFwPGludCwgV2luUHJvY2Vzcyo+IHByb2Nlc3NJRE1hcDsNCit9Ow0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuY3BwCmluZGV4IDgxMWIyMzUuLmVjZmMyYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luVGhyZWFkLmNwcApAQCAtMSw0NzIgKzEsNDkzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0jaW5jbHVkZSAiV2luVGhyZWFkLmgiCi0jaW5jbHVkZSAiV2luUHJvY2Vzcy5oIgotI2luY2x1ZGUgIkFnZW50VXRpbHMuaCIKLSNpbmNsdWRlICJFdmVudENsaWVudE5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiTG9nZ2VyLmgiCi0jaW5jbHVkZSAiV2luRGVidWdNb25pdG9yLmgiCi0jaW5jbHVkZSAiUmVzdW1lQ29udGV4dEFjdGlvbi5oIgotI2luY2x1ZGUgIlByb3RvY29sQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiUnVuQ29udHJvbFNlcnZpY2UuaCIKLSNpbmNsdWRlICJCcmVha3BvaW50c1NlcnZpY2UuaCIKLQotc3RkOjptYXA8c3RkOjpwYWlyPGludCwgaW50PiwgV2luVGhyZWFkKj4gV2luVGhyZWFkOjp0aHJlYWRJRE1hcF87Ci0KLVdpblRocmVhZDo6V2luVGhyZWFkKFdpblByb2Nlc3MmIHByb2Nlc3MsIERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KSA6Ci0JVGhyZWFkQ29udGV4dChkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIHByb2Nlc3MuR2V0SUQoKSwgQ3JlYXRlSW50ZXJuYWxJRChkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIHByb2Nlc3MuR2V0SUQoKSkpLAotCXRocmVhZExvb2t1cFBhaXJfKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCksCi0JcGFyZW50UHJvY2Vzc18ocHJvY2VzcykKLXsKLQlwcm9jZXNzLkFkZENoaWxkKHRoaXMpOwotCi0JdGhyZWFkSURNYXBfW3RocmVhZExvb2t1cFBhaXJfXSA9IHRoaXM7Ci0KLQl0aHJlYWRDb250ZXh0VmFsaWRfID0gZmFsc2U7Ci0JaWYgKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVCkgewotCQloYW5kbGVfID0gZGVidWdFdmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhUaHJlYWQ7Ci0JCXN0YXJ0QWRkcmVzc18KLQkJCQk9ICh1bnNpZ25lZCBsb25nKSBkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8ubHBTdGFydEFkZHJlc3M7Ci0JCWxvY2FsQmFzZV8gPSBkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8ubHBUaHJlYWRMb2NhbEJhc2U7Ci0JfSBlbHNlIGlmIChkZWJ1Z0V2ZW50LmR3RGVidWdFdmVudENvZGUgPT0gQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVCkgewotCQloYW5kbGVfID0gZGVidWdFdmVudC51LkNyZWF0ZVRocmVhZC5oVGhyZWFkOwotCQlzdGFydEFkZHJlc3NfCi0JCQkJPSAodW5zaWduZWQgbG9uZykgZGVidWdFdmVudC51LkNyZWF0ZVRocmVhZC5scFN0YXJ0QWRkcmVzczsKLQkJbG9jYWxCYXNlXyA9IGRlYnVnRXZlbnQudS5DcmVhdGVUaHJlYWQubHBUaHJlYWRMb2NhbEJhc2U7Ci0JfQotCWlzU3VzcGVuZGVkXyA9IGZhbHNlOwotCWlzVGVybWluYXRpbmdfID0gZmFsc2U7Ci0JaXNVc2VyU3VzcGVuZGVkXyA9IGZhbHNlOwotCi0JaW5pdGlhbGl6ZSgpOwotfQotCi0vLyBJbml0aWFsaXplIHRocmVhZCBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotdm9pZCBXaW5UaHJlYWQ6OmluaXRpYWxpemUoKQotewotCWNoYXIgYnVmWzMyXTsKLQlfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JTA4eCIsIHN0YXJ0QWRkcmVzc18pOwotCVNldFByb3BlcnR5KFBST1BfTkFNRSwgbmV3IFByb3BlcnR5VmFsdWUoYnVmKSk7Ci0KLQlpbnQgc3VwcG9ydGVkUmVzdW1lTW9kZXMgPSAoMSA8PCBSTV9SRVNVTUUpIHwgKDEgPDwgUk1fU1RFUF9JTlRPKTsKLQlTZXRQcm9wZXJ0eShQUk9QX0NBTl9SRVNVTUUsIG5ldyBQcm9wZXJ0eVZhbHVlKHN1cHBvcnRlZFJlc3VtZU1vZGVzKSk7Ci0KLQlTZXRQcm9wZXJ0eShQUk9QX0NBTl9URVJNSU5BVEUsIG5ldyBQcm9wZXJ0eVZhbHVlKHRydWUpKTsKLQlTZXRQcm9wZXJ0eShQUk9QX0NBTl9TVVNQRU5ELCBuZXcgUHJvcGVydHlWYWx1ZSh0cnVlKSk7Ci19Ci0KLWludCBXaW5UaHJlYWQ6OkdldFRocmVhZElEKCkgewotCXJldHVybiBHZXRPU0lEKCk7Ci19Ci0KLVdpblRocmVhZDo6fldpblRocmVhZCh2b2lkKSB7Ci0JcGFyZW50UHJvY2Vzc18uUmVtb3ZlQ2hpbGQodGhpcyk7Ci0JdGhyZWFkSURNYXBfLmVyYXNlKHRocmVhZExvb2t1cFBhaXJfKTsKLX0KLQotQ29udGV4dEFkZHJlc3MgV2luVGhyZWFkOjpHZXRQQ0FkZHJlc3MoKSB7Ci0JLy8gVGhlIGZvbGxvd2luZyBpcyBhY3R1YWxseSB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZXMKLQkvLyB0aGUgZXhjZXB0aW9uLCBub3QgdGhlIGFjdHVhbCBQQyByZWdpc3RlciB2YWx1ZSB3aGljaCBpcyB1c3VhbGx5IAotCS8vIHBvaW50aW5nIHRvIHRoZSBieXRlIGFmdGVyIHRoZSBleGNlcHRpb24gaW5zdHJ1Y3Rpb24uCi0JLy8gQnV0IHdoYXQgd2UgbmVlZCBoZXJlIGlzIFBDIHZhbHVlLgotCS8vCi0JLy8gZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3M7Ci0KLQlhc3NlcnQodGhyZWFkQ29udGV4dFZhbGlkXyk7Ci0JcmV0dXJuIHRocmVhZENvbnRleHRJbmZvXy5FaXA7Ci19Ci0KLWNvbnN0IGNoYXIqIFdpblRocmVhZDo6R2V0U3VzcGVuZFJlYXNvbigpIHsKLQljb25zdCBjaGFyKiByZWFzb24gPSBSRUFTT05fRVhDRVBUSU9OOwotCi0Jc3dpdGNoIChleGNlcHRpb25JbmZvXy5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkgewotCWNhc2UgVVNFUl9TVVNQRU5EX1RIUkVBRDoKLQkJcmV0dXJuIFJFQVNPTl9VU0VSX1JFUVVFU1Q7Ci0JY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0JCXJldHVybiBSRUFTT05fU1RFUDsKLQljYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgotCQlyZXR1cm4gUkVBU09OX0JSRUFLUE9JTlQ7Ci0JfQotCi0JcmV0dXJuIHJlYXNvbjsKLX0KLQotCi1zdGQ6OnN0cmluZyBXaW5UaHJlYWQ6OkdldEV4Y2VwdGlvbk1lc3NhZ2UoKSB7Ci0JaWYgKGV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlID09IEVYQ0VQVElPTl9TSU5HTEVfU1RFUAotCQkJfHwgZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPT0gRVhDRVBUSU9OX0JSRUFLUE9JTlQKLQkJCXx8IGV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlID09IFVTRVJfU1VTUEVORF9USFJFQUQpCi0JCXJldHVybiAiIjsKLQotCXJldHVybiBXaW5EZWJ1Z01vbml0b3I6OkdldERlYnVnRXhjZXB0aW9uRGVzY3JpcHRpb24oZXhjZXB0aW9uSW5mb18pOwotfQotCi12b2lkIFdpblRocmVhZDo6TWFya1N1c3BlbmRlZCgpIHsKLQlpc1N1c3BlbmRlZF8gPSB0cnVlOwotCXRocmVhZENvbnRleHRWYWxpZF8gPSBmYWxzZTsKLX0KLQotdm9pZCBXaW5UaHJlYWQ6OkhhbmRsZUV4Y2VwdGlvbihERUJVR19FVkVOVCYgZGVidWdFdmVudCkgewotCU1hcmtTdXNwZW5kZWQoKTsKLQlleGNlcHRpb25JbmZvXyA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb247Ci0JRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOwotCUFkanVzdFBDKCk7Ci0JRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRTdXNwZW5kZWQodGhpcywKLQkJCUdldFBDQWRkcmVzcygpLCBHZXRTdXNwZW5kUmVhc29uKCksIEdldEV4Y2VwdGlvbk1lc3NhZ2UoKSk7Ci0KLX0KLQotLyoKLSAqIENoZWNrIGlmIHRoZSBwcm9ncmFtIGlzIHN0b3BwZWQgZHVlIHRvIGEgc29mdHdhcmUgYnJlYWtwb2ludAotICogaW5zdGFsbGVkIGJ5IHRoZSBhZ2VudCwgaWYgeWVzLCBtb3ZlIFBDIGJhY2sgYnkgb25lIGJ5dGUuCi0gKi8KLXZvaWQgV2luVGhyZWFkOjpBZGp1c3RQQygpIHsKLQkvLyBCYWlsIG91dCBpZiB0aGUgYWdlbnQgZG9lcyBub3QgaW5zdGFsbCAmIG1hbmFnZQotCS8vIGJyZWFrcG9pbnRzIChuYW1lbHkgdGhlIEVEQyBob3N0IHVzZXMgZ2VuZXJpYwotCS8vIHNvZnR3YXJlIGJyZWFrcG9pbnQgbWVjaGFuaXNtKS4KLQlpZiAoISBCcmVha3BvaW50c1NlcnZpY2U6OlNlcnZpY2VJbnN0YWxsZWQoKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGVjawotCSAqIDEuIERpZCB3ZSBzdG9wIGR1ZSB0byBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uID8KLQkgKiAgIC0tIFRoaXMgaXMgdG8gcHJldmVudCBhZGp1c3RpbmcgUEMgZm9yIG90aGVyIGV4Y2VwdGlvbnMgc3VjaCBhcwotCSAqICAgICAgZGl2aWRlLWJ5LXplcm8gJiBpbnZhbGlkIGNvZGUuCi0JICogMi4gaXMgdGhlcmUgYSBzb2Z0d2FyZSBicmVha3BvaW50IGF0IHRoZSBieXRlIHJpZ2h0IGJlZm9yZSB0aGUgUEM/Ci0JICogICAtLSB0aGlzIGlzIHRvIGV4Y2x1ZGUgdGhlIGNhc2Ugb2YgdXNlci1pbnNlcnRlZCAiaW50IDMiIGluc3RydWN0aW9uLgotCSAqLwotCWlmIChleGNlcHRpb25JbmZvXy5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSAhPSBFWENFUFRJT05fQlJFQUtQT0lOVCkKLQkJcmV0dXJuOwotCi0JQ29udGV4dEFkZHJlc3MgcGMgPSBHZXRQQ0FkZHJlc3MoKTsKLQlwYy0tOwotCWlmIChOVUxMICE9IEJyZWFrcG9pbnRzU2VydmljZTo6RmluZEJyZWFrcG9pbnRCeUFkZHJlc3MocGFyZW50UHJvY2Vzc18uR2V0UHJvY2Vzc0hhbmRsZSgpLCBwYykpIHsKLQkJU2V0UmVnaXN0ZXJWYWx1ZSgiRUlQIiwgNCwgKGNoYXIqKSZwYyk7Ci0JfQotfQotCi12b2lkIFdpblRocmVhZDo6SGFuZGxlRXhlY3V0YWJsZUV2ZW50KGJvb2wgaXNMb2FkZWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVQYXRoLAotCQl1bnNpZ25lZCBsb25nIGJhc2VBZGRyZXNzLCB1bnNpZ25lZCBsb25nIGNvZGVTaXplKSB7Ci0JTWFya1N1c3BlbmRlZCgpOwotCUVuc3VyZVZhbGlkQ29udGV4dEluZm8oKTsKLQotCWlmKHBhcmVudFByb2Nlc3NfLkdldEV4ZWN1dGFibGVzKCkuZmluZChleGVQYXRoKSAhPSBwYXJlbnRQcm9jZXNzXy5HZXRFeGVjdXRhYmxlcygpLmVuZCgpKQotCXsKLQkJUHJvcGVydGllcyBleGlzdGluZ1Byb3BzID0gcGFyZW50UHJvY2Vzc18uR2V0RXhlY3V0YWJsZXMoKVtleGVQYXRoXTsKLQkJaWYgKGV4aXN0aW5nUHJvcHNbUFJPUF9NT0RVTEVfTE9BREVEXS0+Z2V0Qm9vbFZhbHVlKCkpCi0JCXsKLQkJCWRlbGV0ZSBleGlzdGluZ1Byb3BzW1BST1BfTU9EVUxFX0xPQURFRF07Ci0JCQlleGlzdGluZ1Byb3BzW1BST1BfTU9EVUxFX0xPQURFRF0gPSBuZXcgUHJvcGVydHlWYWx1ZShmYWxzZSk7Ci0JCQlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kRXhlY3V0YWJsZUV2ZW50KHRoaXMsCi0JCQkJCXRocmVhZENvbnRleHRJbmZvXy5FaXAsIGV4aXN0aW5nUHJvcHMpOwotCQl9Ci0JfQotCi0JUHJvcGVydGllcyBwcm9wczsKLQlwcm9wc1tQUk9QX0ZJTEVdID0gbmV3IFByb3BlcnR5VmFsdWUoZXhlUGF0aCk7Ci0JcHJvcHNbUFJPUF9OQU1FXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKEFnZW50VXRpbHM6OkdldEZpbGVOYW1lRnJvbVBhdGgoZXhlUGF0aCkpOwotCXByb3BzW1BST1BfTU9EVUxFX0xPQURFRF0gPSBuZXcgUHJvcGVydHlWYWx1ZShpc0xvYWRlZCk7Ci0JcHJvcHNbUFJPUF9JTUFHRV9CQVNFX0FERFJFU1NdID0gbmV3IFByb3BlcnR5VmFsdWUoKGludCkgYmFzZUFkZHJlc3MpOwotCXByb3BzW1BST1BfQ09ERV9TSVpFXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKChpbnQpIGNvZGVTaXplKTsKLQotCXBhcmVudFByb2Nlc3NfLkdldEV4ZWN1dGFibGVzKClbZXhlUGF0aF0gPSBwcm9wczsKLQlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kRXhlY3V0YWJsZUV2ZW50KHRoaXMsIAotCQkJdGhyZWFkQ29udGV4dEluZm9fLkVpcCwgcHJvcHMpOwotfQotCi1ib29sIFdpblRocmVhZDo6aXNTdXNwZW5kZWQoKSB7Ci0JcmV0dXJuIGlzU3VzcGVuZGVkXzsKLX0KLQotI2lmbmRlZiBDT05URVhUX0FMTAotI2RlZmluZSBDT05URVhUX0FMTCAgICAgICAgICAgICAoQ09OVEVYVF9DT05UUk9MIHwgQ09OVEVYVF9JTlRFR0VSIHwgQ09OVEVYVF9TRUdNRU5UUyB8IFwKLQlDT05URVhUX0ZMT0FUSU5HX1BPSU5UIHwgQ09OVEVYVF9ERUJVR19SRUdJU1RFUlMgfCBcCi0JQ09OVEVYVF9FWFRFTkRFRF9SRUdJU1RFUlMpCi0jZW5kaWYKLQotdm9pZCBXaW5UaHJlYWQ6OkVuc3VyZVZhbGlkQ29udGV4dEluZm8oKSB7Ci0JaWYgKCF0aHJlYWRDb250ZXh0VmFsaWRfICYmIGlzU3VzcGVuZGVkKCkpIHsKLQkJdGhyZWFkQ29udGV4dEluZm9fLkNvbnRleHRGbGFncyA9IENPTlRFWFRfQUxMOwotCQlpZiAoR2V0VGhyZWFkQ29udGV4dChoYW5kbGVfLCAmdGhyZWFkQ29udGV4dEluZm9fKSAhPSAwKSB7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfLmNsZWFyKCk7Ci0JCQkvLyBDYWNoZSBnZW5lcmFsIHJlZ2lzdGVycwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUFYIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygKLQkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVheCk7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQ1giXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRWN4KTsKLQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVEWCJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoCi0JCQkJCXRocmVhZENvbnRleHRJbmZvXy5FZHgpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUJYIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygKLQkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVieCk7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFU1AiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRXNwKTsKLQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVCUCJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoCi0JCQkJCXRocmVhZENvbnRleHRJbmZvXy5FYnApOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRVNJIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygKLQkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVzaSk7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFREkiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRWRpKTsKLQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVJUCJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoCi0JCQkJCXRocmVhZENvbnRleHRJbmZvXy5FaXApOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siR1MiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnR3MpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRlMiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRnMpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRVMiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRXMpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRFMiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRHMpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siQ1MiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKAotCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnQ3MpOwotCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUZMIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygKLQkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVGbGFncyk7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJTUyJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoCi0JCQkJCXRocmVhZENvbnRleHRJbmZvXy5TZWdTcyk7Ci0KLQkJCXRocmVhZENvbnRleHRWYWxpZF8gPSB0cnVlOwotCQl9Ci0JfQotfQotCi12b2lkIFdpblRocmVhZDo6U2V0Q29udGV4dEluZm8oKSB7Ci0JaWYgKGlzU3VzcGVuZGVkKCkpIHsKLQkJdGhyZWFkQ29udGV4dEluZm9fLkNvbnRleHRGbGFncyA9IENPTlRFWFRfQUxMOwotCQkvLyBTZXQgZ2VuZXJhbCByZWdpc3RlcnMgdmFsdWVzCi0JCXRocmVhZENvbnRleHRJbmZvXy5FYXggPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQVgiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FY3ggPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQ1giXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FZHggPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFRFgiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FYnggPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQlgiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5Fc3AgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFU1AiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FYnAgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQlAiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5Fc2kgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFU0kiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FZGkgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFREkiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5FaXAgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFSVAiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5TZWdHcyA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KAotCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkdTIl0pOwotCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRnMgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJGUyJdKTsKLQkJdGhyZWFkQ29udGV4dEluZm9fLlNlZ0VzID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoCi0JCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRVMiXSk7Ci0JCXRocmVhZENvbnRleHRJbmZvXy5TZWdEcyA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KAotCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkRTIl0pOwotCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnQ3MgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgKLQkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJDUyJdKTsKLQkJdGhyZWFkQ29udGV4dEluZm9fLkVGbGFncyA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KAotCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVGTCJdKTsKLQkJdGhyZWFkQ29udGV4dEluZm9fLlNlZ1NzID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoCi0JCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siU1MiXSk7Ci0JCVNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7Ci0JfQotfQotCi1XaW5UaHJlYWQqIFdpblRocmVhZDo6R2V0VGhyZWFkQnlJRChpbnQgcHJvY2Vzc0lELCBpbnQgdGhyZWFkSUQpIHsKLQlzdGQ6OnBhaXI8aW50LCBpbnQ+IHB0UGFpcihwcm9jZXNzSUQsIHRocmVhZElEKTsKLQlzdGQ6Om1hcDxzdGQ6OnBhaXI8aW50LCBpbnQ+LCBXaW5UaHJlYWQqPjo6aXRlcmF0b3IgaXRlciA9IHRocmVhZElETWFwXy5maW5kKHB0UGFpcik7Ci0JaWYgKGl0ZXIgPT0gdGhyZWFkSURNYXBfLmVuZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBpdGVyLT5zZWNvbmQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBXaW5UaHJlYWQ6OkdldFJlZ2lzdGVyVmFsdWVzKAotCQljb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlZ2lzdGVySURzKSB7Ci0Jc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlZ2lzdGVyVmFsdWVzOwotCi0JaWYgKGlzU3VzcGVuZGVkKCkpIHsKLQkJRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOwotCi0JCXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRWZWN0b3JEYXRhOwotCQlmb3IgKGl0VmVjdG9yRGF0YSA9IHJlZ2lzdGVySURzLmJlZ2luKCk7IGl0VmVjdG9yRGF0YQotCQkJCSE9IHJlZ2lzdGVySURzLmVuZCgpOyBpdFZlY3RvckRhdGErKykgewotCQkJc3RkOjpzdHJpbmcgcmVnaXN0ZXJJRCA9ICppdFZlY3RvckRhdGE7Ci0JCQlzdGQ6OnN0cmluZyByZWdpc3RlclZhbHVlID0gcmVnaXN0ZXJWYWx1ZUNhY2hlX1tyZWdpc3RlcklEXTsKLQkJCXJlZ2lzdGVyVmFsdWVzLnB1c2hfYmFjayhyZWdpc3RlclZhbHVlKTsKLQkJfQotCX0KLQotCXJldHVybiByZWdpc3RlclZhbHVlczsKLX0KLQotLyoKLSAqIEdldCBwb2ludGVyIHRvIHJlZ2lzdGVyIHZhbHVlIGNhY2hlIGZvciBhIGdpdmVuIHJlZ2lzdGVyLgotICogUmV0dXJuIE5VTEwgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vdCBmb3VuZC4KLSAqLwotdm9pZCogV2luVGhyZWFkOjpnZXRSZWdpc3RlclZhbHVlQnVmZmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdOYW1lKSB7Ci0Jdm9pZCogdiA9IE5VTEw7Ci0KLQlpZiAocmVnTmFtZSA9PSAiRUFYIikKLQkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVheDsKLQllbHNlIGlmIChyZWdOYW1lID09ICJFQlgiKQotCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRWJ4OwotCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVDWCIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FY3g7Ci0JZWxzZSBpZiAocmVnTmFtZSA9PSAiRURYIikKLQkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVkeDsKLQllbHNlIGlmIChyZWdOYW1lID09ICJFU1AiKQotCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRXNwOwotCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVCUCIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FYnA7Ci0JZWxzZSBpZiAocmVnTmFtZSA9PSAiRVNJIikKLQkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVzaTsKLQllbHNlIGlmIChyZWdOYW1lID09ICJFREkiKQotCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRWRpOwotCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVJUCIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FaXA7Ci0JZWxzZSBpZiAocmVnTmFtZSA9PSAiRUZMIikKLQkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVGbGFnczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJHUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdHczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJGUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdGczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJFUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdFczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJEUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdEczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJDUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdDczsKLQllbHNlIGlmIChyZWdOYW1lID09ICJTUyIpCi0JCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdTczsKLQllbHNlIHsKLQkJYXNzZXJ0KGZhbHNlKTsKLQl9Ci0KLQlyZXR1cm4gdjsKLX0KLQotLyoKLSAqIFJlYWQgb25lIHJlZ2lzdGVyLgotICogUmV0dXJuIGJpbmFyeSBkYXRhIGJ1ZmZlciwgd2hpY2ggY2FsbGVyIHNob3VsZCBmcmVlIGJ5IGNhbGxpbmcgZGVsZXRlW10uCi0gKi8KLWNoYXIqIFdpblRocmVhZDo6R2V0UmVnaXN0ZXJWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnTmFtZSwgaW50IHJlZ1NpemUpIHsKLQotCWNoYXIqIHJldCA9IE5VTEw7Ci0KLQlpZiAoaXNTdXNwZW5kZWQoKSkgewotCQlFbnN1cmVWYWxpZENvbnRleHRJbmZvKCk7Ci0KLQkJcmV0ID0gbmV3IGNoYXJbcmVnU2l6ZV07Ci0KLQkJdm9pZCogdiA9IGdldFJlZ2lzdGVyVmFsdWVCdWZmZXIocmVnTmFtZSk7Ci0JCWFzc2VydCh2ICE9IE5VTEwpOwotCi0JCW1lbWNweSgodm9pZCopcmV0LCB2LCByZWdTaXplKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1ib29sIFdpblRocmVhZDo6U2V0UmVnaXN0ZXJWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnTmFtZSwgaW50IHJlZ1NpemUsIGNoYXIqIHZhbCkgewotCi0JaWYgKCEgaXNTdXNwZW5kZWQoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jdm9pZCogdiA9IGdldFJlZ2lzdGVyVmFsdWVCdWZmZXIocmVnTmFtZSk7Ci0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0KLQltZW1jcHkodiwgKHZvaWQqKXZhbCwgcmVnU2l6ZSk7Ci0JcmV0dXJuIFNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7Ci19Ci0KLXZvaWQgV2luVGhyZWFkOjpTZXRSZWdpc3RlclZhbHVlcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlZ2lzdGVySURzLAotCQljb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlZ2lzdGVyVmFsdWVzKSB7Ci0JaWYgKGlzU3VzcGVuZGVkKCkpIHsKLQkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0VmVjdG9yRGF0YTsKLQkJaW50IGlkeCA9IHJlZ2lzdGVyVmFsdWVzLnNpemUoKTsKLQkJZm9yIChpdFZlY3RvckRhdGEgPSByZWdpc3RlcklEcy5yYmVnaW4oKTsgaXRWZWN0b3JEYXRhCi0JCQkJIT0gcmVnaXN0ZXJJRHMucmVuZCgpOyBpdFZlY3RvckRhdGErKykgewotCQkJc3RkOjpzdHJpbmcgcmVnaXN0ZXJJRCA9ICppdFZlY3RvckRhdGE7Ci0JCQlyZWdpc3RlclZhbHVlQ2FjaGVfW3JlZ2lzdGVySURdID0gcmVnaXN0ZXJWYWx1ZXNbLS1pZHhdOwotCQl9Ci0KLQkJU2V0Q29udGV4dEluZm8oKTsKLQl9Ci19Ci0KLWludCBXaW5UaHJlYWQ6OlJlYWRNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgewotCXJldHVybiBwYXJlbnRQcm9jZXNzXy5SZWFkTWVtb3J5KHBhcmFtcyk7Ci19Ci0KLWludCBXaW5UaHJlYWQ6OldyaXRlTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsKLQlyZXR1cm4gcGFyZW50UHJvY2Vzc18uV3JpdGVNZW1vcnkocGFyYW1zKTsKLX0KLQotdm9pZCBXaW5UaHJlYWQ6OlRlcm1pbmF0ZShjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsKLQlwYXJlbnRQcm9jZXNzXy5UZXJtaW5hdGUocGFyYW1zKTsKLX0KLQotdm9pZCBXaW5UaHJlYWQ6OlN1c3BlbmQoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7Ci0JRFdPUkQgc3VzcGVuZENvdW50ID0gU3VzcGVuZFRocmVhZChoYW5kbGVfKTsKLQlNYXJrU3VzcGVuZGVkKCk7Ci0JRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOwotCWV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlID0gVVNFUl9TVVNQRU5EX1RIUkVBRDsgLy8gIlN1c3BlbmRlZCIKLQlpc1VzZXJTdXNwZW5kZWRfID0gdHJ1ZTsKLQlpZiAoISBpc1Rlcm1pbmF0aW5nXykJLy8gZG9uJ3Qgc2VuZCBTdXNwZW5kIGV2ZW50IGlmIHdlIGFyZSB0ZXJtaW5hdGluZy4KLQkJRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRTdXNwZW5kZWQodGhpcywKLQkJCQlHZXRQQ0FkZHJlc3MoKSwgR2V0U3VzcGVuZFJlYXNvbigpLCBHZXRFeGNlcHRpb25NZXNzYWdlKCkpOwotCUxvZ2dlcjo6Z2V0TG9nZ2VyKCkuTG9nKExvZ2dlcjo6TE9HX05PUk1BTCwgIldpblRocmVhZDo6U3VzcGVuZCIsCi0JCQkic3VzcGVuZENvdW50OiAlZCIsIHN1c3BlbmRDb3VudCk7Ci0KLQlwYXJhbXMucmVwb3J0U3VjY2Vzc0ZvckFjdGlvbigpOwotfQotCi12b2lkIFdpblRocmVhZDo6UmVzdW1lKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgewotCWlmICghIGlzU3VzcGVuZGVkKCkpIHsKLQkJcGFyYW1zLnJlcG9ydFN1Y2Nlc3NGb3JBY3Rpb24oKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpc1VzZXJTdXNwZW5kZWRfKXsKLQkJUmVzdW1lVGhyZWFkKGhhbmRsZV8pOwotCQlpc1VzZXJTdXNwZW5kZWRfID0gZmFsc2U7Ci0JCXBhcmFtcy5yZXBvcnRTdWNjZXNzRm9yQWN0aW9uKCk7Ci0JfQotCWVsc2UgewotCQlwYXJlbnRQcm9jZXNzXy5HZXRNb25pdG9yKCktPlBvc3RBY3Rpb24obmV3IFJlc3VtZUNvbnRleHRBY3Rpb24oCi0JCQlwYXJhbXMsIHBhcmVudFByb2Nlc3NfLCAqdGhpcywgUk1fUkVTVU1FKSk7Ci0JfQotfQotCi0vKgotICogRW5hYmxlIHNpbmdsZSBpbnN0cnVjdGlvbiBzdGVwIGJ5IHNldHRpbmcgVHJhcCBGbGFnIChURikgYml0LgotICovCi12b2lkIFdpblRocmVhZDo6RW5hYmxlU2luZ2xlU3RlcCgpIHsKLSNkZWZpbmUgRkxBR19UUkFDRV9CSVQgMHgxMDAKLQkvLyBUaGUgYml0IHdpbGwgYmUgYXV0by1jbGVhcmVkIGFmdGVyIG5leHQgcmVzdW1lLgotCXRocmVhZENvbnRleHRJbmZvXy5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7Ci0JU2V0VGhyZWFkQ29udGV4dChoYW5kbGVfLCAmdGhyZWFkQ29udGV4dEluZm9fKTsKLX0KLQotdm9pZCBXaW5UaHJlYWQ6OlNpbmdsZVN0ZXAoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7Ci0JcGFyZW50UHJvY2Vzc18uR2V0TW9uaXRvcigpLT5Qb3N0QWN0aW9uKG5ldyBSZXN1bWVDb250ZXh0QWN0aW9uKAotCQkJcGFyYW1zLCBwYXJlbnRQcm9jZXNzXywgKnRoaXMsIFJNX1NURVBfSU5UTykpOwotfQotCi12b2lkIFdpblRocmVhZDo6UHJlcGFyZUZvclRlcm1pbmF0aW9uKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgewotCWlzVGVybWluYXRpbmdfID0gdHJ1ZTsKLQotCWlmIChpc1N1c3BlbmRlZCgpKSB7Ci0JCVN1c3BlbmQocGFyYW1zKTsKLQkJQ29udGludWVEZWJ1Z0V2ZW50KHBhcmVudFByb2Nlc3NfLkdldE9TSUQoKSwgR2V0T1NJRCgpLCBEQkdfQ09OVElOVUUpOwotCX0KLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxhc3NlcnQuaD4NCisNCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorI2luY2x1ZGUgIldpblRocmVhZC5oIg0KKyNpbmNsdWRlICJXaW5Qcm9jZXNzLmgiDQorI2luY2x1ZGUgIkFnZW50VXRpbHMuaCINCisjaW5jbHVkZSAiRXZlbnRDbGllbnROb3RpZmllci5oIg0KKyNpbmNsdWRlICJMb2dnZXIuaCINCisjaW5jbHVkZSAiV2luRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIlJlc3VtZUNvbnRleHRBY3Rpb24uaCINCisjaW5jbHVkZSAiUHJvdG9jb2xDb25zdGFudHMuaCINCisjaW5jbHVkZSAiUnVuQ29udHJvbFNlcnZpY2UuaCINCisjaW5jbHVkZSAiQnJlYWtwb2ludHNTZXJ2aWNlLmgiDQorDQorc3RkOjptYXA8c3RkOjpwYWlyPGludCwgaW50PiwgV2luVGhyZWFkKj4gV2luVGhyZWFkOjp0aHJlYWRJRE1hcF87DQorDQorV2luVGhyZWFkOjpXaW5UaHJlYWQoV2luUHJvY2VzcyYgcHJvY2VzcywgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpIDoNCisJVGhyZWFkQ29udGV4dChkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIHByb2Nlc3MuR2V0SUQoKSwgQ3JlYXRlSW50ZXJuYWxJRChkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIHByb2Nlc3MuR2V0SUQoKSkpLA0KKwl0aHJlYWRMb29rdXBQYWlyXyhkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQpLA0KKwlwYXJlbnRQcm9jZXNzXyhwcm9jZXNzKQ0KK3sNCisJcHJvY2Vzcy5BZGRDaGlsZCh0aGlzKTsNCisNCisJdGhyZWFkSURNYXBfW3RocmVhZExvb2t1cFBhaXJfXSA9IHRoaXM7DQorDQorCXRocmVhZENvbnRleHRWYWxpZF8gPSBmYWxzZTsNCisJaWYgKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVCkgew0KKwkJaGFuZGxlXyA9IGRlYnVnRXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oVGhyZWFkOw0KKwkJc3RhcnRBZGRyZXNzXw0KKwkJCQk9ICh1bnNpZ25lZCBsb25nKSBkZWJ1Z0V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8ubHBTdGFydEFkZHJlc3M7DQorCQlsb2NhbEJhc2VfID0gZGVidWdFdmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmxwVGhyZWFkTG9jYWxCYXNlOw0KKwl9IGVsc2UgaWYgKGRlYnVnRXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UKSB7DQorCQloYW5kbGVfID0gZGVidWdFdmVudC51LkNyZWF0ZVRocmVhZC5oVGhyZWFkOw0KKwkJc3RhcnRBZGRyZXNzXw0KKwkJCQk9ICh1bnNpZ25lZCBsb25nKSBkZWJ1Z0V2ZW50LnUuQ3JlYXRlVGhyZWFkLmxwU3RhcnRBZGRyZXNzOw0KKwkJbG9jYWxCYXNlXyA9IGRlYnVnRXZlbnQudS5DcmVhdGVUaHJlYWQubHBUaHJlYWRMb2NhbEJhc2U7DQorCX0NCisJaXNTdXNwZW5kZWRfID0gZmFsc2U7DQorCWlzVGVybWluYXRpbmdfID0gZmFsc2U7DQorCWlzVXNlclN1c3BlbmRlZF8gPSBmYWxzZTsNCisNCisJLy8ganVzdCB0byBlbnN1cmUgdGhhdCBuZXcgdGhyZWFkcyBhcmUgcmVzdW1lZCB3aXRoIERCR19DT05USU5VRS4gIHRoaXMgaXMgbm9ybWFsbHkgc2V0L2NoYW5nZWQNCisJLy8gaW4gSGFuZGxlRXhjZXB0aW9uDQorCWV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlID0gVVNFUl9TVVNQRU5EX1RIUkVBRDsNCisNCisJaW5pdGlhbGl6ZSgpOw0KK30NCisNCisvLyBJbml0aWFsaXplIHRocmVhZCBzcGVjaWZpYyBwcm9wZXJ0aWVzLg0KK3ZvaWQgV2luVGhyZWFkOjppbml0aWFsaXplKCkNCit7DQorCWNoYXIgYnVmWzMyXTsNCisJX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOHgiLCBzdGFydEFkZHJlc3NfKTsNCisJU2V0UHJvcGVydHkoUFJPUF9OQU1FLCBQcm9wZXJ0eVZhbHVlKGJ1ZikpOw0KKw0KKwlpbnQgc3VwcG9ydGVkUmVzdW1lTW9kZXMgPSAoMSA8PCBSTV9SRVNVTUUpIHwgKDEgPDwgUk1fU1RFUF9JTlRPKTsNCisJU2V0UHJvcGVydHkoUFJPUF9DQU5fUkVTVU1FLCBQcm9wZXJ0eVZhbHVlKHN1cHBvcnRlZFJlc3VtZU1vZGVzKSk7DQorDQorCVNldFByb3BlcnR5KFBST1BfQ0FOX1RFUk1JTkFURSwgUHJvcGVydHlWYWx1ZSh0cnVlKSk7DQorCVNldFByb3BlcnR5KFBST1BfQ0FOX1NVU1BFTkQsIFByb3BlcnR5VmFsdWUodHJ1ZSkpOw0KK30NCisNCitpbnQgV2luVGhyZWFkOjpHZXRUaHJlYWRJRCgpIHsNCisJcmV0dXJuIEdldE9TSUQoKTsNCit9DQorDQorV2luVGhyZWFkOjp+V2luVGhyZWFkKHZvaWQpIHsNCisJcGFyZW50UHJvY2Vzc18uUmVtb3ZlQ2hpbGQodGhpcyk7DQorCXRocmVhZElETWFwXy5lcmFzZSh0aHJlYWRMb29rdXBQYWlyXyk7DQorDQorCS8vIERlc3RydWN0b3Igb2YgcGFyZW50IGNsYXNzZXMgd2lsbCBiZSBjYWxsZWQgd2hpY2ggd2lsbA0KKwkvLyBkZWxldGUgYWxsIGNoaWxkcmVuIGNvbnRleHRzIChyZWdpc3RlcnMsIGV0YykuDQorfQ0KKw0KK0NvbnRleHRBZGRyZXNzIFdpblRocmVhZDo6R2V0UENBZGRyZXNzKCkgew0KKwkvLyBUaGUgZm9sbG93aW5nIGlzIGFjdHVhbGx5IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlcw0KKwkvLyB0aGUgZXhjZXB0aW9uLCBub3QgdGhlIGFjdHVhbCBQQyByZWdpc3RlciB2YWx1ZSB3aGljaCBpcyB1c3VhbGx5IA0KKwkvLyBwb2ludGluZyB0byB0aGUgYnl0ZSBhZnRlciB0aGUgZXhjZXB0aW9uIGluc3RydWN0aW9uLg0KKwkvLyBCdXQgd2hhdCB3ZSBuZWVkIGhlcmUgaXMgUEMgdmFsdWUuDQorCS8vDQorCS8vIGV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzOw0KKw0KKwlhc3NlcnQodGhyZWFkQ29udGV4dFZhbGlkXyk7DQorCXJldHVybiB0aHJlYWRDb250ZXh0SW5mb18uRWlwOw0KK30NCisNCitjb25zdCBjaGFyKiBXaW5UaHJlYWQ6OkdldFN1c3BlbmRSZWFzb24oKSB7DQorCWNvbnN0IGNoYXIqIHJlYXNvbiA9IFJFQVNPTl9FWENFUFRJT047DQorDQorCXN3aXRjaCAoZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUpIHsNCisJY2FzZSBVU0VSX1NVU1BFTkRfVEhSRUFEOg0KKwkJcmV0dXJuIFJFQVNPTl9VU0VSX1JFUVVFU1Q7DQorCWNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOg0KKwkJcmV0dXJuIFJFQVNPTl9TVEVQOw0KKwljYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOg0KKwkJcmV0dXJuIFJFQVNPTl9CUkVBS1BPSU5UOw0KKwl9DQorDQorCXJldHVybiByZWFzb247DQorfQ0KKw0KK0RXT1JEIFdpblRocmVhZDo6R2V0Q29udGludWVTdGF0dXMoKSB7DQorCS8vIGZvciByZXN1bWluZyBmcm9tIGFueSBleGNlcHRpb24gb3RoZXIgdGhhbiBicmVha3BvaW50IG9yIHN0ZXAgKHdoaWNoIHRoZSBkZWJ1Z2dlciBoYW5kbGVzKSwgd2UgbXVzdCBwYXNzDQorCS8vIERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQgdG8gYWxsb3cgdGhlIHByb2Nlc3MgdW5kZXIgZGVidWcgdGhlIGNoYW5jZSB0byBoYW5kbGUgaXQNCisJc3dpdGNoIChleGNlcHRpb25JbmZvXy5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkgew0KKwljYXNlIFVTRVJfU1VTUEVORF9USFJFQUQ6DQorCWNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOg0KKwljYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOg0KKwkJcmV0dXJuIERCR19DT05USU5VRTsNCisJfQ0KKw0KKwlyZXR1cm4gREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRDsNCit9DQorDQorc3RkOjpzdHJpbmcgV2luVGhyZWFkOjpHZXRFeGNlcHRpb25NZXNzYWdlKCkgew0KKwlpZiAoZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPT0gRVhDRVBUSU9OX1NJTkdMRV9TVEVQDQorCQkJfHwgZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPT0gRVhDRVBUSU9OX0JSRUFLUE9JTlQNCisJCQl8fCBleGNlcHRpb25JbmZvXy5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSA9PSBVU0VSX1NVU1BFTkRfVEhSRUFEKQ0KKwkJcmV0dXJuICIiOw0KKw0KKwlyZXR1cm4gV2luRGVidWdNb25pdG9yOjpHZXREZWJ1Z0V4Y2VwdGlvbkRlc2NyaXB0aW9uKGV4Y2VwdGlvbkluZm9fKTsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6Ok1hcmtTdXNwZW5kZWQoKSB7DQorCWlzU3VzcGVuZGVkXyA9IHRydWU7DQorCXRocmVhZENvbnRleHRWYWxpZF8gPSBmYWxzZTsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6OkhhbmRsZUV4Y2VwdGlvbihERUJVR19FVkVOVCYgZGVidWdFdmVudCkgew0KKwlleGNlcHRpb25JbmZvXyA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb247DQorCU1hcmtTdXNwZW5kZWQoKTsNCisJRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOw0KKwlBZGp1c3RQQygpOw0KKwlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZCh0aGlzLA0KKwkJCUdldFBDQWRkcmVzcygpLCBHZXRTdXNwZW5kUmVhc29uKCksIEdldEV4Y2VwdGlvbk1lc3NhZ2UoKSk7DQorDQorfQ0KKw0KKy8qDQorICogQ2hlY2sgaWYgdGhlIHByb2dyYW0gaXMgc3RvcHBlZCBkdWUgdG8gYSBzb2Z0d2FyZSBicmVha3BvaW50DQorICogaW5zdGFsbGVkIGJ5IHRoZSBhZ2VudCwgaWYgeWVzLCBtb3ZlIFBDIGJhY2sgYnkgb25lIGJ5dGUuDQorICovDQordm9pZCBXaW5UaHJlYWQ6OkFkanVzdFBDKCkgew0KKwkvLyBCYWlsIG91dCBpZiB0aGUgYWdlbnQgZG9lcyBub3QgaW5zdGFsbCAmIG1hbmFnZQ0KKwkvLyBicmVha3BvaW50cyAobmFtZWx5IHRoZSBFREMgaG9zdCB1c2VzIGdlbmVyaWMNCisJLy8gc29mdHdhcmUgYnJlYWtwb2ludCBtZWNoYW5pc20pLg0KKwlpZiAoISBCcmVha3BvaW50c1NlcnZpY2U6OlNlcnZpY2VJbnN0YWxsZWQoKSkNCisJCXJldHVybjsNCisNCisJLyoNCisJICogQ2hlY2sNCisJICogMS4gRGlkIHdlIHN0b3AgZHVlIHRvIGEgYnJlYWtwb2ludCBleGNlcHRpb24gPw0KKwkgKiAgIC0tIFRoaXMgaXMgdG8gcHJldmVudCBhZGp1c3RpbmcgUEMgZm9yIG90aGVyIGV4Y2VwdGlvbnMgc3VjaCBhcw0KKwkgKiAgICAgIGRpdmlkZS1ieS16ZXJvICYgaW52YWxpZCBjb2RlLg0KKwkgKiAyLiBpcyB0aGVyZSBhIHNvZnR3YXJlIGJyZWFrcG9pbnQgYXQgdGhlIGJ5dGUgcmlnaHQgYmVmb3JlIHRoZSBQQz8NCisJICogICAtLSB0aGlzIGlzIHRvIGV4Y2x1ZGUgdGhlIGNhc2Ugb2YgdXNlci1pbnNlcnRlZCAiaW50IDMiIGluc3RydWN0aW9uLg0KKwkgKi8NCisJaWYgKGV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlICE9IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQ0KKwkJcmV0dXJuOw0KKw0KKwlDb250ZXh0QWRkcmVzcyBwYyA9IEdldFBDQWRkcmVzcygpOw0KKwlwYy0tOw0KKwlpZiAoTlVMTCAhPSBCcmVha3BvaW50c1NlcnZpY2U6OkZpbmRCcmVha3BvaW50QnlBZGRyZXNzKHBhcmVudFByb2Nlc3NfLkdldFByb2Nlc3NIYW5kbGUoKSwgcGMpKSB7DQorCQlTZXRSZWdpc3RlclZhbHVlKCJFSVAiLCA0LCAoY2hhciopJnBjKTsNCisJfQ0KK30NCisNCit2b2lkIFdpblRocmVhZDo6SGFuZGxlRXhlY3V0YWJsZUV2ZW50KGJvb2wgaXNMb2FkZWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVQYXRoLA0KKwkJdW5zaWduZWQgbG9uZyBiYXNlQWRkcmVzcywgdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSkgew0KKwlNYXJrU3VzcGVuZGVkKCk7DQorCUVuc3VyZVZhbGlkQ29udGV4dEluZm8oKTsNCisNCisJUHJvcGVydGllcyBwcm9wczsNCisJaWYgKGlzTG9hZGVkKQ0KKwl7DQorCQlwcm9wc1tQUk9QX0lEXSA9IFByb3BlcnR5VmFsdWUoKGludCkgYmFzZUFkZHJlc3MpOw0KKwkJcHJvcHNbUFJPUF9GSUxFXSA9IFByb3BlcnR5VmFsdWUoZXhlUGF0aCk7DQorCQlwcm9wc1tQUk9QX05BTUVdID0gUHJvcGVydHlWYWx1ZShBZ2VudFV0aWxzOjpHZXRGaWxlTmFtZUZyb21QYXRoKGV4ZVBhdGgpKTsNCisJCXByb3BzW1BST1BfTU9EVUxFX0xPQURFRF0gPSBQcm9wZXJ0eVZhbHVlKGlzTG9hZGVkKTsNCisJCXByb3BzW1BST1BfSU1BR0VfQkFTRV9BRERSRVNTXSA9IFByb3BlcnR5VmFsdWUoKGludCkgYmFzZUFkZHJlc3MpOw0KKwkJcHJvcHNbUFJPUF9DT0RFX1NJWkVdID0gUHJvcGVydHlWYWx1ZSgoaW50KSBjb2RlU2l6ZSk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlwcm9wcyA9IHBhcmVudFByb2Nlc3NfLkdldEV4ZWN1dGFibGVzQnlBZGRyZXNzKClbYmFzZUFkZHJlc3NdOw0KKwkJaWYgKHByb3BzLmVtcHR5KCkpDQorCQl7IC8vIFdlIGhhdmUgYW4gdW5sb2FkZWQgZXZlbnQgZm9yIGFuIGV4ZWN1dGFibGUgd2UgZGlkbid0IGtub3cgYWJvdXQuDQorCQkJcHJvcHNbUFJPUF9JRF0gPSBQcm9wZXJ0eVZhbHVlKChpbnQpIGJhc2VBZGRyZXNzKTsNCisJCQlwcm9wc1tQUk9QX0lNQUdFX0JBU0VfQUREUkVTU10gPSBQcm9wZXJ0eVZhbHVlKChpbnQpIGJhc2VBZGRyZXNzKTsNCisJCX0NCisJCXByb3BzW1BST1BfTU9EVUxFX0xPQURFRF0gPSBQcm9wZXJ0eVZhbHVlKGZhbHNlKTsNCisJfQ0KKw0KKwlwYXJlbnRQcm9jZXNzXy5HZXRFeGVjdXRhYmxlc0J5QWRkcmVzcygpW2Jhc2VBZGRyZXNzXSA9IHByb3BzOw0KKwlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kRXhlY3V0YWJsZUV2ZW50KHRoaXMsDQorCQkJdGhyZWFkQ29udGV4dEluZm9fLkVpcCwgcHJvcHMpOw0KK30NCisNCitib29sIFdpblRocmVhZDo6aXNTdXNwZW5kZWQoKSB7DQorCXJldHVybiBpc1N1c3BlbmRlZF87DQorfQ0KKw0KKyNpZm5kZWYgQ09OVEVYVF9BTEwNCisjZGVmaW5lIENPTlRFWFRfQUxMICAgICAgICAgICAgIChDT05URVhUX0NPTlRST0wgfCBDT05URVhUX0lOVEVHRVIgfCBDT05URVhUX1NFR01FTlRTIHwgXA0KKwlDT05URVhUX0ZMT0FUSU5HX1BPSU5UIHwgQ09OVEVYVF9ERUJVR19SRUdJU1RFUlMgfCBcDQorCUNPTlRFWFRfRVhURU5ERURfUkVHSVNURVJTKQ0KKyNlbmRpZg0KKw0KK3ZvaWQgV2luVGhyZWFkOjpFbnN1cmVWYWxpZENvbnRleHRJbmZvKCkgew0KKwlpZiAoIXRocmVhZENvbnRleHRWYWxpZF8gJiYgaXNTdXNwZW5kZWQoKSkgew0KKwkJdGhyZWFkQ29udGV4dEluZm9fLkNvbnRleHRGbGFncyA9IENPTlRFWFRfQUxMOw0KKwkJaWYgKEdldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXykgIT0gMCkgew0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV8uY2xlYXIoKTsNCisJCQkvLyBDYWNoZSBnZW5lcmFsIHJlZ2lzdGVycw0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVBWCJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoDQorCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRWF4KTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQ1giXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVjeCk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRURYIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygNCisJCQkJCXRocmVhZENvbnRleHRJbmZvXy5FZHgpOw0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVCWCJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoDQorCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRWJ4KTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFU1AiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVzcCk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUJQIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygNCisJCQkJCXRocmVhZENvbnRleHRJbmZvXy5FYnApOw0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVTSSJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoDQorCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uRXNpKTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFREkiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVkaSk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUlQIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygNCisJCQkJCXRocmVhZENvbnRleHRJbmZvXy5FaXApOw0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkdTIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygNCisJCQkJCXRocmVhZENvbnRleHRJbmZvXy5TZWdHcyk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRlMiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLlNlZ0ZzKTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFUyJdID0gQWdlbnRVdGlsczo6SW50VG9IZXhTdHJpbmcoDQorCQkJCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRXMpOw0KKwkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkRTIl0gPSBBZ2VudFV0aWxzOjpJbnRUb0hleFN0cmluZygNCisJCQkJCXRocmVhZENvbnRleHRJbmZvXy5TZWdEcyk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siQ1MiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLlNlZ0NzKTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFRkwiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLkVGbGFncyk7DQorCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siU1MiXSA9IEFnZW50VXRpbHM6OkludFRvSGV4U3RyaW5nKA0KKwkJCQkJdGhyZWFkQ29udGV4dEluZm9fLlNlZ1NzKTsNCisNCisJCQl0aHJlYWRDb250ZXh0VmFsaWRfID0gdHJ1ZTsNCisJCX0NCisJfQ0KK30NCisNCit2b2lkIFdpblRocmVhZDo6U2V0Q29udGV4dEluZm8oKSB7DQorCWlmIChpc1N1c3BlbmRlZCgpKSB7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uQ29udGV4dEZsYWdzID0gQ09OVEVYVF9BTEw7DQorCQkvLyBTZXQgZ2VuZXJhbCByZWdpc3RlcnMgdmFsdWVzDQorCQl0aHJlYWRDb250ZXh0SW5mb18uRWF4ID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoDQorCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVBWCJdKTsNCisJCXRocmVhZENvbnRleHRJbmZvXy5FY3ggPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRUNYIl0pOw0KKwkJdGhyZWFkQ29udGV4dEluZm9fLkVkeCA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KA0KKwkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFRFgiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uRWJ4ID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoDQorCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVCWCJdKTsNCisJCXRocmVhZENvbnRleHRJbmZvXy5Fc3AgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRVNQIl0pOw0KKwkJdGhyZWFkQ29udGV4dEluZm9fLkVicCA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KA0KKwkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFQlAiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uRXNpID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoDQorCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVTSSJdKTsNCisJCXRocmVhZENvbnRleHRJbmZvXy5FZGkgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRURJIl0pOw0KKwkJdGhyZWFkQ29udGV4dEluZm9fLkVpcCA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KA0KKwkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJFSVAiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnR3MgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siR1MiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRnMgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRlMiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRXMgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRVMiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnRHMgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siRFMiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uU2VnQ3MgPSBBZ2VudFV0aWxzOjpIZXhTdHJpbmdUb0ludCgNCisJCQkJcmVnaXN0ZXJWYWx1ZUNhY2hlX1siQ1MiXSk7DQorCQl0aHJlYWRDb250ZXh0SW5mb18uRUZsYWdzID0gQWdlbnRVdGlsczo6SGV4U3RyaW5nVG9JbnQoDQorCQkJCXJlZ2lzdGVyVmFsdWVDYWNoZV9bIkVGTCJdKTsNCisJCXRocmVhZENvbnRleHRJbmZvXy5TZWdTcyA9IEFnZW50VXRpbHM6OkhleFN0cmluZ1RvSW50KA0KKwkJCQlyZWdpc3RlclZhbHVlQ2FjaGVfWyJTUyJdKTsNCisJCVNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7DQorCX0NCit9DQorDQorV2luVGhyZWFkKiBXaW5UaHJlYWQ6OkdldFRocmVhZEJ5SUQoaW50IHByb2Nlc3NJRCwgaW50IHRocmVhZElEKSB7DQorCXN0ZDo6cGFpcjxpbnQsIGludD4gcHRQYWlyKHByb2Nlc3NJRCwgdGhyZWFkSUQpOw0KKwlzdGQ6Om1hcDxzdGQ6OnBhaXI8aW50LCBpbnQ+LCBXaW5UaHJlYWQqPjo6aXRlcmF0b3IgaXRlciA9IHRocmVhZElETWFwXy5maW5kKHB0UGFpcik7DQorCWlmIChpdGVyID09IHRocmVhZElETWFwXy5lbmQoKSkNCisJCXJldHVybiBOVUxMOw0KKwllbHNlDQorCQlyZXR1cm4gaXRlci0+c2Vjb25kOw0KK30NCisNCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gV2luVGhyZWFkOjpHZXRSZWdpc3RlclZhbHVlcygNCisJCWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVnaXN0ZXJJRHMpIHsNCisJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlZ2lzdGVyVmFsdWVzOw0KKw0KKwlpZiAoaXNTdXNwZW5kZWQoKSkgew0KKwkJRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOw0KKw0KKwkJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdFZlY3RvckRhdGE7DQorCQlmb3IgKGl0VmVjdG9yRGF0YSA9IHJlZ2lzdGVySURzLmJlZ2luKCk7IGl0VmVjdG9yRGF0YQ0KKwkJCQkhPSByZWdpc3RlcklEcy5lbmQoKTsgaXRWZWN0b3JEYXRhKyspIHsNCisJCQlzdGQ6OnN0cmluZyByZWdpc3RlcklEID0gKml0VmVjdG9yRGF0YTsNCisJCQlzdGQ6OnN0cmluZyByZWdpc3RlclZhbHVlID0gcmVnaXN0ZXJWYWx1ZUNhY2hlX1tyZWdpc3RlcklEXTsNCisJCQlyZWdpc3RlclZhbHVlcy5wdXNoX2JhY2socmVnaXN0ZXJWYWx1ZSk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIHJlZ2lzdGVyVmFsdWVzOw0KK30NCisNCisvKg0KKyAqIEdldCBwb2ludGVyIHRvIHJlZ2lzdGVyIHZhbHVlIGNhY2hlIGZvciBhIGdpdmVuIHJlZ2lzdGVyLg0KKyAqIFJldHVybiBOVUxMIGlmIHRoZSByZWdpc3RlciBpcyBub3QgZm91bmQuDQorICovDQordm9pZCogV2luVGhyZWFkOjpnZXRSZWdpc3RlclZhbHVlQnVmZmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdOYW1lKSB7DQorCXZvaWQqIHYgPSBOVUxMOw0KKw0KKwlpZiAocmVnTmFtZSA9PSAiRUFYIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FYXg7DQorCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVCWCIpDQorCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRWJ4Ow0KKwllbHNlIGlmIChyZWdOYW1lID09ICJFQ1giKQ0KKwkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVjeDsNCisJZWxzZSBpZiAocmVnTmFtZSA9PSAiRURYIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FZHg7DQorCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVTUCIpDQorCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRXNwOw0KKwllbHNlIGlmIChyZWdOYW1lID09ICJFQlAiKQ0KKwkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVicDsNCisJZWxzZSBpZiAocmVnTmFtZSA9PSAiRVNJIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5Fc2k7DQorCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkVESSIpDQorCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uRWRpOw0KKwllbHNlIGlmIChyZWdOYW1lID09ICJFSVAiKQ0KKwkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLkVpcDsNCisJZWxzZSBpZiAocmVnTmFtZSA9PSAiRUZMIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5FRmxhZ3M7DQorCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkdTIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdHczsNCisJZWxzZSBpZiAocmVnTmFtZSA9PSAiRlMiKQ0KKwkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLlNlZ0ZzOw0KKwllbHNlIGlmIChyZWdOYW1lID09ICJFUyIpDQorCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uU2VnRXM7DQorCWVsc2UgaWYgKHJlZ05hbWUgPT0gIkRTIikNCisJCXYgPSAodm9pZCopJnRocmVhZENvbnRleHRJbmZvXy5TZWdEczsNCisJZWxzZSBpZiAocmVnTmFtZSA9PSAiQ1MiKQ0KKwkJdiA9ICh2b2lkKikmdGhyZWFkQ29udGV4dEluZm9fLlNlZ0NzOw0KKwllbHNlIGlmIChyZWdOYW1lID09ICJTUyIpDQorCQl2ID0gKHZvaWQqKSZ0aHJlYWRDb250ZXh0SW5mb18uU2VnU3M7DQorCWVsc2Ugew0KKwkJYXNzZXJ0KGZhbHNlKTsNCisJfQ0KKw0KKwlyZXR1cm4gdjsNCit9DQorDQorLyoNCisgKiBSZWFkIG9uZSByZWdpc3Rlci4NCisgKiBSZXR1cm4gYmluYXJ5IGRhdGEgYnVmZmVyLCB3aGljaCBjYWxsZXIgc2hvdWxkIGZyZWUgYnkgY2FsbGluZyBkZWxldGVbXS4NCisgKi8NCitjaGFyKiBXaW5UaHJlYWQ6OkdldFJlZ2lzdGVyVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ05hbWUsIGludCByZWdTaXplKSB7DQorDQorCWNoYXIqIHJldCA9IE5VTEw7DQorDQorCWlmIChpc1N1c3BlbmRlZCgpKSB7DQorCQlFbnN1cmVWYWxpZENvbnRleHRJbmZvKCk7DQorDQorCQlyZXQgPSBuZXcgY2hhcltyZWdTaXplXTsNCisNCisJCXZvaWQqIHYgPSBnZXRSZWdpc3RlclZhbHVlQnVmZmVyKHJlZ05hbWUpOw0KKwkJYXNzZXJ0KHYgIT0gTlVMTCk7DQorDQorCQltZW1jcHkoKHZvaWQqKXJldCwgdiwgcmVnU2l6ZSk7DQorCX0NCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorYm9vbCBXaW5UaHJlYWQ6OlNldFJlZ2lzdGVyVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ05hbWUsIGludCByZWdTaXplLCBjaGFyKiB2YWwpIHsNCisNCisJaWYgKCEgaXNTdXNwZW5kZWQoKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJdm9pZCogdiA9IGdldFJlZ2lzdGVyVmFsdWVCdWZmZXIocmVnTmFtZSk7DQorCWFzc2VydCh2ICE9IE5VTEwpOw0KKw0KKwltZW1jcHkodiwgKHZvaWQqKXZhbCwgcmVnU2l6ZSk7DQorCXJldHVybiBTZXRUaHJlYWRDb250ZXh0KGhhbmRsZV8sICZ0aHJlYWRDb250ZXh0SW5mb18pOw0KK30NCisNCit2b2lkIFdpblRocmVhZDo6U2V0UmVnaXN0ZXJWYWx1ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcklEcywNCisJCWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVnaXN0ZXJWYWx1ZXMpIHsNCisJaWYgKGlzU3VzcGVuZGVkKCkpIHsNCisJCXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdFZlY3RvckRhdGE7DQorCQlpbnQgaWR4ID0gcmVnaXN0ZXJWYWx1ZXMuc2l6ZSgpOw0KKwkJZm9yIChpdFZlY3RvckRhdGEgPSByZWdpc3RlcklEcy5yYmVnaW4oKTsgaXRWZWN0b3JEYXRhDQorCQkJCSE9IHJlZ2lzdGVySURzLnJlbmQoKTsgaXRWZWN0b3JEYXRhKyspIHsNCisJCQlzdGQ6OnN0cmluZyByZWdpc3RlcklEID0gKml0VmVjdG9yRGF0YTsNCisJCQlyZWdpc3RlclZhbHVlQ2FjaGVfW3JlZ2lzdGVySURdID0gcmVnaXN0ZXJWYWx1ZXNbLS1pZHhdOw0KKwkJfQ0KKw0KKwkJU2V0Q29udGV4dEluZm8oKTsNCisJfQ0KK30NCisNCitpbnQgV2luVGhyZWFkOjpSZWFkTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCisJcmV0dXJuIHBhcmVudFByb2Nlc3NfLlJlYWRNZW1vcnkocGFyYW1zKTsNCit9DQorDQoraW50IFdpblRocmVhZDo6V3JpdGVNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlyZXR1cm4gcGFyZW50UHJvY2Vzc18uV3JpdGVNZW1vcnkocGFyYW1zKTsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6OlRlcm1pbmF0ZShjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCisJcGFyZW50UHJvY2Vzc18uVGVybWluYXRlKHBhcmFtcyk7DQorfQ0KKw0KK3ZvaWQgV2luVGhyZWFkOjpTdXNwZW5kKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlEV09SRCBzdXNwZW5kQ291bnQgPSBTdXNwZW5kVGhyZWFkKGhhbmRsZV8pOw0KKwlNYXJrU3VzcGVuZGVkKCk7DQorCUVuc3VyZVZhbGlkQ29udGV4dEluZm8oKTsNCisJZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUgPSBVU0VSX1NVU1BFTkRfVEhSRUFEOyAvLyAiU3VzcGVuZGVkIg0KKwlpc1VzZXJTdXNwZW5kZWRfID0gdHJ1ZTsNCisJaWYgKCEgaXNUZXJtaW5hdGluZ18pCS8vIGRvbid0IHNlbmQgU3VzcGVuZCBldmVudCBpZiB3ZSBhcmUgdGVybWluYXRpbmcuDQorCQlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZCh0aGlzLA0KKwkJCQlHZXRQQ0FkZHJlc3MoKSwgR2V0U3VzcGVuZFJlYXNvbigpLCBHZXRFeGNlcHRpb25NZXNzYWdlKCkpOw0KKwlMb2dnZXI6OmdldExvZ2dlcigpLkxvZyhMb2dnZXI6OkxPR19OT1JNQUwsICJXaW5UaHJlYWQ6OlN1c3BlbmQiLA0KKwkJCSJzdXNwZW5kQ291bnQ6ICVkIiwgc3VzcGVuZENvdW50KTsNCisNCisJcGFyYW1zLnJlcG9ydFN1Y2Nlc3NGb3JBY3Rpb24oKTsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6OlJlc3VtZShjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCisJaWYgKCEgaXNTdXNwZW5kZWQoKSkgew0KKwkJcGFyYW1zLnJlcG9ydFN1Y2Nlc3NGb3JBY3Rpb24oKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwlpZiAoaXNVc2VyU3VzcGVuZGVkXyl7DQorCQlSZXN1bWVUaHJlYWQoaGFuZGxlXyk7DQorCQlpc1VzZXJTdXNwZW5kZWRfID0gZmFsc2U7DQorCQlwYXJhbXMucmVwb3J0U3VjY2Vzc0ZvckFjdGlvbigpOw0KKwl9DQorCWVsc2Ugew0KKwkJcGFyZW50UHJvY2Vzc18uR2V0TW9uaXRvcigpLT5Qb3N0QWN0aW9uKG5ldyBSZXN1bWVDb250ZXh0QWN0aW9uKA0KKwkJCXBhcmFtcywgcGFyZW50UHJvY2Vzc18sICp0aGlzLCBSTV9SRVNVTUUpKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIEVuYWJsZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gc3RlcCBieSBzZXR0aW5nIFRyYXAgRmxhZyAoVEYpIGJpdC4NCisgKi8NCit2b2lkIFdpblRocmVhZDo6RW5hYmxlU2luZ2xlU3RlcCgpIHsNCisjZGVmaW5lIEZMQUdfVFJBQ0VfQklUIDB4MTAwDQorCS8vIFRoZSBiaXQgd2lsbCBiZSBhdXRvLWNsZWFyZWQgYWZ0ZXIgbmV4dCByZXN1bWUuDQorCXRocmVhZENvbnRleHRJbmZvXy5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7DQorCVNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7DQorfQ0KKw0KK3ZvaWQgV2luVGhyZWFkOjpTaW5nbGVTdGVwKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlwYXJlbnRQcm9jZXNzXy5HZXRNb25pdG9yKCktPlBvc3RBY3Rpb24obmV3IFJlc3VtZUNvbnRleHRBY3Rpb24oDQorCQkJcGFyYW1zLCBwYXJlbnRQcm9jZXNzXywgKnRoaXMsIFJNX1NURVBfSU5UTykpOw0KK30NCisNCit2b2lkIFdpblRocmVhZDo6UHJlcGFyZUZvclRlcm1pbmF0aW9uKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlpc1Rlcm1pbmF0aW5nXyA9IHRydWU7DQorDQorCWlmIChpc1N1c3BlbmRlZCgpKSB7DQorCQlTdXNwZW5kKHBhcmFtcyk7DQorCQlDb250aW51ZURlYnVnRXZlbnQocGFyZW50UHJvY2Vzc18uR2V0T1NJRCgpLCBHZXRPU0lEKCksIERCR19DT05USU5VRSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luVGhyZWFkLmggYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuaAppbmRleCA1N2EwMjcwLi5lNGQ5OWMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuaAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuaApAQCAtMSwxMDEgKzEsMTAzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIE5va2lhIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0jaW5jbHVkZSAiVGhyZWFkQ29udGV4dC5oIgotCi0jZGVmaW5lIFVTRVJfU1VTUEVORF9USFJFQUQgMAotCi1jbGFzcyBXaW5Qcm9jZXNzOwotCi1jbGFzcyBXaW5UaHJlYWQgOiBwdWJsaWMgVGhyZWFkQ29udGV4dCB7Ci1wdWJsaWM6Ci0JV2luVGhyZWFkKFdpblByb2Nlc3MmIHByb2Nlc3MsIERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsKLQl2aXJ0dWFsIH5XaW5UaHJlYWQodm9pZCk7Ci0KLQlpbnQgR2V0VGhyZWFkSUQoKTsKLQotCXN0YXRpYyBXaW5UaHJlYWQqIEdldFRocmVhZEJ5SUQoaW50IHByb2Nlc3NJRCwgaW50IHRocmVhZElEKTsKLQotCXZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFJlZ2lzdGVyVmFsdWVzKAotCQkJY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcklEcyk7Ci0KLQl2aXJ0dWFsIHZvaWQgU2V0UmVnaXN0ZXJWYWx1ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcklEcywKLQkJCWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVnaXN0ZXJWYWx1ZXMpOwotCi0JY2hhcioJR2V0UmVnaXN0ZXJWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnTmFtZSwgaW50IHJlZ1NpemUpOwotCWJvb2wgCVNldFJlZ2lzdGVyVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ05hbWUsIGludCByZWdTaXplLCBjaGFyKiB2YWwpOwotCi0JLy8KLQkvLyBvdmVycmlkZXMgb2YgUnVuQ29udHJvbENvbnRleHQKLQkvLwotCXZpcnR1YWwgaW50IFJlYWRNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0JdmlydHVhbCBpbnQgV3JpdGVNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0KLQl2aXJ0dWFsIHZvaWQgUmVzdW1lKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7Ci0KLQl2aXJ0dWFsIHZvaWQgU3VzcGVuZChjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOwotCi0JdmlydHVhbCB2b2lkIFRlcm1pbmF0ZShjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOwotCi0JdmlydHVhbCB2b2lkIFNpbmdsZVN0ZXAoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsKLQkvLwotCS8vCWVuZCBvdmVycmlkZXMKLQkKLQl2b2lkIFByZXBhcmVGb3JUZXJtaW5hdGlvbihjb25zdCBBZ2VudEFjdGlvblBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOwotCi0Jdm9pZCBIYW5kbGVFeGNlcHRpb24oREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOwotCXZvaWQgSGFuZGxlRXhlY3V0YWJsZUV2ZW50KGJvb2wgaXNMb2FkZWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVQYXRoLAotCQkJdW5zaWduZWQgbG9uZyBiYXNlQWRkcmVzcywgdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSk7Ci0KLQkvKiogQWRkcmVzcyB3aGVyZSBzdXNwZW5kIGlzIHJlcG9ydGVkICovCi0JQ29udGV4dEFkZHJlc3MgR2V0UENBZGRyZXNzKCk7Ci0KLQl2b2lkIEVuYWJsZVNpbmdsZVN0ZXAoKTsKLQotcHJpdmF0ZToKLQl2b2lkIGluaXRpYWxpemUoKTsKLQotCXZvaWQgRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOwotCXZvaWQgU2V0Q29udGV4dEluZm8oKTsKLQlib29sIGlzU3VzcGVuZGVkKCk7Ci0Jdm9pZCBNYXJrU3VzcGVuZGVkKCk7Ci0KLQl2b2lkIEFkanVzdFBDKCk7Ci0KLQkvKiogUkVBU09OX3h4IGNvZGUgZm9yIHN1c3BlbmQgKi8KLQljb25zdCBjaGFyKiBHZXRTdXNwZW5kUmVhc29uKCk7Ci0JLyoqIERlc2NyaXB0aW9uIGZvciBzdXNwZW5kICovCi0Jc3RkOjpzdHJpbmcgR2V0RXhjZXB0aW9uTWVzc2FnZSgpOwotCi1wcml2YXRlOgotCXZvaWQqIGdldFJlZ2lzdGVyVmFsdWVCdWZmZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ05hbWUpOwotCi0Jc3RkOjpwYWlyPGludCwgaW50PiB0aHJlYWRMb29rdXBQYWlyXzsKLQotCWJvb2wgdGhyZWFkQ29udGV4dFZhbGlkXzsKLQlib29sIGlzU3VzcGVuZGVkXzsKLQlib29sIGlzVGVybWluYXRpbmdfOwotCWJvb2wgaXNVc2VyU3VzcGVuZGVkXzsKLQlDT05URVhUIHRocmVhZENvbnRleHRJbmZvXzsKLQlFWENFUFRJT05fREVCVUdfSU5GTyBleGNlcHRpb25JbmZvXzsKLQlzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlZ2lzdGVyVmFsdWVDYWNoZV87Ci0KLQlXaW5Qcm9jZXNzJiBwYXJlbnRQcm9jZXNzXzsKLQotCXVuc2lnbmVkIGxvbmcgc3RhcnRBZGRyZXNzXzsKLQlIQU5ETEUgaGFuZGxlXzsKLQl2b2lkKiBsb2NhbEJhc2VfOwotCi0Jc3RhdGljIHN0ZDo6bWFwPHN0ZDo6cGFpcjxpbnQsIGludD4sIFdpblRocmVhZCo+IHRocmVhZElETWFwXzsKLQotfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiBOb2tpYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNwcmFnbWEgb25jZQ0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiVGhyZWFkQ29udGV4dC5oIg0KKw0KKyNkZWZpbmUgVVNFUl9TVVNQRU5EX1RIUkVBRCAwDQorDQorY2xhc3MgV2luUHJvY2VzczsNCisNCitjbGFzcyBXaW5UaHJlYWQgOiBwdWJsaWMgVGhyZWFkQ29udGV4dCB7DQorcHVibGljOg0KKwlXaW5UaHJlYWQoV2luUHJvY2VzcyYgcHJvY2VzcywgREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOw0KKwl2aXJ0dWFsIH5XaW5UaHJlYWQodm9pZCk7DQorDQorCWludCBHZXRUaHJlYWRJRCgpOw0KKw0KKwlzdGF0aWMgV2luVGhyZWFkKiBHZXRUaHJlYWRCeUlEKGludCBwcm9jZXNzSUQsIGludCB0aHJlYWRJRCk7DQorDQorCXZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFJlZ2lzdGVyVmFsdWVzKA0KKwkJCWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVnaXN0ZXJJRHMpOw0KKw0KKwl2aXJ0dWFsIHZvaWQgU2V0UmVnaXN0ZXJWYWx1ZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcklEcywNCisJCQljb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlZ2lzdGVyVmFsdWVzKTsNCisNCisJY2hhcioJR2V0UmVnaXN0ZXJWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgcmVnTmFtZSwgaW50IHJlZ1NpemUpOw0KKwlib29sIAlTZXRSZWdpc3RlclZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdOYW1lLCBpbnQgcmVnU2l6ZSwgY2hhciogdmFsKTsNCisNCisJLy8NCisJLy8gb3ZlcnJpZGVzIG9mIFJ1bkNvbnRyb2xDb250ZXh0DQorCS8vDQorCXZpcnR1YWwgaW50IFJlYWRNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7DQorCXZpcnR1YWwgaW50IFdyaXRlTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOw0KKw0KKwl2aXJ0dWFsIHZvaWQgUmVzdW1lKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7DQorDQorCXZpcnR1YWwgdm9pZCBTdXNwZW5kKGNvbnN0IEFnZW50QWN0aW9uUGFyYW1zJiBwYXJhbXMpIHRocm93IChBZ2VudEV4Y2VwdGlvbik7DQorDQorCXZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisNCisJdmlydHVhbCB2b2lkIFNpbmdsZVN0ZXAoY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisJLy8NCisJLy8JZW5kIG92ZXJyaWRlcw0KKwkNCisJdm9pZCBQcmVwYXJlRm9yVGVybWluYXRpb24oY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKTsNCisNCisJdm9pZCBIYW5kbGVFeGNlcHRpb24oREVCVUdfRVZFTlQmIGRlYnVnRXZlbnQpOw0KKwl2b2lkIEhhbmRsZUV4ZWN1dGFibGVFdmVudChib29sIGlzTG9hZGVkLCBjb25zdCBzdGQ6OnN0cmluZyYgZXhlUGF0aCwNCisJCQl1bnNpZ25lZCBsb25nIGJhc2VBZGRyZXNzLCB1bnNpZ25lZCBsb25nIGNvZGVTaXplKTsNCisNCisJLyogQWRkcmVzcyB3aGVyZSBzdXNwZW5kIGlzIHJlcG9ydGVkICovDQorCUNvbnRleHRBZGRyZXNzIEdldFBDQWRkcmVzcygpOw0KKw0KKwl2b2lkIEVuYWJsZVNpbmdsZVN0ZXAoKTsNCisNCisJRFdPUkQgR2V0Q29udGludWVTdGF0dXMoKTsNCisNCitwcml2YXRlOg0KKwl2b2lkIGluaXRpYWxpemUoKTsNCisNCisJdm9pZCBFbnN1cmVWYWxpZENvbnRleHRJbmZvKCk7DQorCXZvaWQgU2V0Q29udGV4dEluZm8oKTsNCisJYm9vbCBpc1N1c3BlbmRlZCgpOw0KKwl2b2lkIE1hcmtTdXNwZW5kZWQoKTsNCisNCisJdm9pZCBBZGp1c3RQQygpOw0KKw0KKwkvKiogUkVBU09OX3h4IGNvZGUgZm9yIHN1c3BlbmQgKi8NCisJY29uc3QgY2hhciogR2V0U3VzcGVuZFJlYXNvbigpOw0KKwkvKiogRGVzY3JpcHRpb24gZm9yIHN1c3BlbmQgKi8NCisJc3RkOjpzdHJpbmcgR2V0RXhjZXB0aW9uTWVzc2FnZSgpOw0KKw0KK3ByaXZhdGU6DQorCXZvaWQqIGdldFJlZ2lzdGVyVmFsdWVCdWZmZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZ05hbWUpOw0KKw0KKwlzdGQ6OnBhaXI8aW50LCBpbnQ+IHRocmVhZExvb2t1cFBhaXJfOw0KKw0KKwlib29sIHRocmVhZENvbnRleHRWYWxpZF87DQorCWJvb2wgaXNTdXNwZW5kZWRfOw0KKwlib29sIGlzVGVybWluYXRpbmdfOw0KKwlib29sIGlzVXNlclN1c3BlbmRlZF87DQorCUNPTlRFWFQgdGhyZWFkQ29udGV4dEluZm9fOw0KKwlFWENFUFRJT05fREVCVUdfSU5GTyBleGNlcHRpb25JbmZvXzsNCisJc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiByZWdpc3RlclZhbHVlQ2FjaGVfOw0KKw0KKwlXaW5Qcm9jZXNzJiBwYXJlbnRQcm9jZXNzXzsNCisNCisJdW5zaWduZWQgbG9uZyBzdGFydEFkZHJlc3NfOw0KKwlIQU5ETEUgaGFuZGxlXzsNCisJdm9pZCogbG9jYWxCYXNlXzsNCisNCisJc3RhdGljIHN0ZDo6bWFwPHN0ZDo6cGFpcjxpbnQsIGludD4sIFdpblRocmVhZCo+IHRocmVhZElETWFwXzsNCisNCit9Ow0K