LyoKICogZW50aXRpZXMuYyA6IGltcGxlbWVudGF0aW9uIGZvciB0aGUgWE1MIGVudGl0aWVzIGhhbmRsaW5nCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNkZWZpbmUgSU5fTElCWE1MCiNpbmNsdWRlICJsaWJ4bWwuaCIKCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KI2luY2x1ZGUgPGxpYnhtbC9oYXNoLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW50aXRpZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXJJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC9kaWN0Lmg+CgovKgogKiBUaGUgWE1MIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwoKc3RhdGljIHhtbEVudGl0eSB4bWxFbnRpdHlMdCA9IHsKICAgIE5VTEwsIFhNTF9FTlRJVFlfREVDTCwgQkFEX0NBU1QgImx0IiwKICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAogICAgQkFEX0NBU1QgIjwiLCBCQURfQ0FTVCAiPCIsIDEsCiAgICBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFksCiAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCAxCn07CnN0YXRpYyB4bWxFbnRpdHkgeG1sRW50aXR5R3QgPSB7CiAgICBOVUxMLCBYTUxfRU5USVRZX0RFQ0wsIEJBRF9DQVNUICJndCIsCiAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKICAgIEJBRF9DQVNUICI+IiwgQkFEX0NBU1QgIj4iLCAxLAogICAgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZLAogICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMQp9OwpzdGF0aWMgeG1sRW50aXR5IHhtbEVudGl0eUFtcCA9IHsKICAgIE5VTEwsIFhNTF9FTlRJVFlfREVDTCwgQkFEX0NBU1QgImFtcCIsCiAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKICAgIEJBRF9DQVNUICImIiwgQkFEX0NBU1QgIiYiLCAxLAogICAgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZLAogICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMQp9OwpzdGF0aWMgeG1sRW50aXR5IHhtbEVudGl0eVF1b3QgPSB7CiAgICBOVUxMLCBYTUxfRU5USVRZX0RFQ0wsIEJBRF9DQVNUICJxdW90IiwKICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAogICAgQkFEX0NBU1QgIlwiIiwgQkFEX0NBU1QgIlwiIiwgMSwKICAgIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSwKICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIDEKfTsKc3RhdGljIHhtbEVudGl0eSB4bWxFbnRpdHlBcG9zID0gewogICAgTlVMTCwgWE1MX0VOVElUWV9ERUNMLCBCQURfQ0FTVCAiYXBvcyIsCiAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKICAgIEJBRF9DQVNUICInIiwgQkFEX0NBU1QgIiciLCAxLAogICAgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZLAogICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMQp9OwoKLyoqCiAqIHhtbEVudGl0aWVzRXJyTWVtb3J5OgogKiBAZXh0cmE6ICBleHRyYSBpbmZvcm1hdGlvbnMKICoKICogSGFuZGxlIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uCiAqLwpzdGF0aWMgdm9pZAp4bWxFbnRpdGllc0Vyck1lbW9yeShjb25zdCBjaGFyICpleHRyYSkKewogICAgX194bWxTaW1wbGVFcnJvcihYTUxfRlJPTV9UUkVFLCBYTUxfRVJSX05PX01FTU9SWSwgTlVMTCwgTlVMTCwgZXh0cmEpOwp9CgovKioKICogeG1sRW50aXRpZXNFcnI6CiAqIEBjb2RlOiAgdGhlIGVycm9yIGNvZGUKICogQG1zZzogIHRoZSBtZXNzYWdlCiAqCiAqIEhhbmRsZSBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbgogKi8Kc3RhdGljIHZvaWQKeG1sRW50aXRpZXNFcnIoeG1sUGFyc2VyRXJyb3JzIGNvZGUsIGNvbnN0IGNoYXIgKm1zZykKewogICAgX194bWxTaW1wbGVFcnJvcihYTUxfRlJPTV9UUkVFLCBjb2RlLCBOVUxMLCBtc2csIE5VTEwpOwp9CgovKgogKiB4bWxGcmVlRW50aXR5IDogY2xlYW4tdXAgYW4gZW50aXR5IHJlY29yZC4KICovCnN0YXRpYyB2b2lkCnhtbEZyZWVFbnRpdHkoeG1sRW50aXR5UHRyIGVudGl0eSkKewogICAgeG1sRGljdFB0ciBkaWN0ID0gTlVMTDsKCiAgICBpZiAoZW50aXR5ID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChlbnRpdHktPmRvYyAhPSBOVUxMKQogICAgICAgIGRpY3QgPSBlbnRpdHktPmRvYy0+ZGljdDsKCgogICAgaWYgKChlbnRpdHktPmNoaWxkcmVuKSAmJiAoZW50aXR5LT5vd25lciA9PSAxKSAmJgogICAgICAgIChlbnRpdHkgPT0gKHhtbEVudGl0eVB0cikgZW50aXR5LT5jaGlsZHJlbi0+cGFyZW50KSkKICAgICAgICB4bWxGcmVlTm9kZUxpc3QoZW50aXR5LT5jaGlsZHJlbik7CiAgICBpZiAoZGljdCAhPSBOVUxMKSB7CiAgICAgICAgaWYgKChlbnRpdHktPm5hbWUgIT0gTlVMTCkgJiYgKCF4bWxEaWN0T3ducyhkaWN0LCBlbnRpdHktPm5hbWUpKSkKICAgICAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPm5hbWUpOwogICAgICAgIGlmICgoZW50aXR5LT5FeHRlcm5hbElEICE9IE5VTEwpICYmCgkgICAgKCF4bWxEaWN0T3ducyhkaWN0LCBlbnRpdHktPkV4dGVybmFsSUQpKSkKICAgICAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPkV4dGVybmFsSUQpOwogICAgICAgIGlmICgoZW50aXR5LT5TeXN0ZW1JRCAhPSBOVUxMKSAmJgoJICAgICgheG1sRGljdE93bnMoZGljdCwgZW50aXR5LT5TeXN0ZW1JRCkpKQogICAgICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+U3lzdGVtSUQpOwogICAgICAgIGlmICgoZW50aXR5LT5VUkkgIT0gTlVMTCkgJiYgKCF4bWxEaWN0T3ducyhkaWN0LCBlbnRpdHktPlVSSSkpKQogICAgICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+VVJJKTsKICAgICAgICBpZiAoKGVudGl0eS0+Y29udGVudCAhPSBOVUxMKQogICAgICAgICAgICAmJiAoIXhtbERpY3RPd25zKGRpY3QsIGVudGl0eS0+Y29udGVudCkpKQogICAgICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+Y29udGVudCk7CiAgICAgICAgaWYgKChlbnRpdHktPm9yaWcgIT0gTlVMTCkgJiYgKCF4bWxEaWN0T3ducyhkaWN0LCBlbnRpdHktPm9yaWcpKSkKICAgICAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPm9yaWcpOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoZW50aXR5LT5uYW1lICE9IE5VTEwpCiAgICAgICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5uYW1lKTsKICAgICAgICBpZiAoZW50aXR5LT5FeHRlcm5hbElEICE9IE5VTEwpCiAgICAgICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5FeHRlcm5hbElEKTsKICAgICAgICBpZiAoZW50aXR5LT5TeXN0ZW1JRCAhPSBOVUxMKQogICAgICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+U3lzdGVtSUQpOwogICAgICAgIGlmIChlbnRpdHktPlVSSSAhPSBOVUxMKQogICAgICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+VVJJKTsKICAgICAgICBpZiAoZW50aXR5LT5jb250ZW50ICE9IE5VTEwpCiAgICAgICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5jb250ZW50KTsKICAgICAgICBpZiAoZW50aXR5LT5vcmlnICE9IE5VTEwpCiAgICAgICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5vcmlnKTsKICAgIH0KICAgIHhtbEZyZWUoZW50aXR5KTsKfQoKLyoKICogeG1sQWRkRW50aXR5IDogcmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciBhbiBlbnRpdGllcyB0YWJsZS4KICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKeG1sQWRkRW50aXR5KHhtbER0ZFB0ciBkdGQsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCB0eXBlLAoJICBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELCBjb25zdCB4bWxDaGFyICpTeXN0ZW1JRCwKCSAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgewogICAgeG1sRGljdFB0ciBkaWN0ID0gTlVMTDsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUgPSBOVUxMOwogICAgeG1sRW50aXR5UHRyIHJldDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgaWYgKGR0ZCA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgaWYgKGR0ZC0+ZG9jICE9IE5VTEwpCiAgICAgICAgZGljdCA9IGR0ZC0+ZG9jLT5kaWN0OwoKICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZOgogICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWToKICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKCSAgICBpZiAoZHRkLT5lbnRpdGllcyA9PSBOVUxMKQoJCWR0ZC0+ZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlRGljdCgwLCBkaWN0KTsKCSAgICB0YWJsZSA9IGR0ZC0+ZW50aXRpZXM7CgkgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJICAgIGlmIChkdGQtPnBlbnRpdGllcyA9PSBOVUxMKQoJCWR0ZC0+cGVudGl0aWVzID0geG1sSGFzaENyZWF0ZURpY3QoMCwgZGljdCk7CgkgICAgdGFibGUgPSBkdGQtPnBlbnRpdGllczsKCSAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKCSAgICByZXR1cm4oTlVMTCk7CiAgICB9CiAgICBpZiAodGFibGUgPT0gTlVMTCkKCXJldHVybihOVUxMKTsKICAgIHJldCA9ICh4bWxFbnRpdHlQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRW50aXR5KSk7CiAgICBpZiAocmV0ID09IE5VTEwpIHsKICAgICAgICB4bWxFbnRpdGllc0Vyck1lbW9yeSgieG1sQWRkRW50aXR5OjogbWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKHhtbEVudGl0eSkpOwogICAgcmV0LT50eXBlID0gWE1MX0VOVElUWV9ERUNMOwogICAgcmV0LT5jaGVja2VkID0gMDsKCiAgICAvKgogICAgICogZmlsbCB0aGUgc3RydWN0dXJlLgogICAgICovCiAgICByZXQtPmV0eXBlID0gKHhtbEVudGl0eVR5cGUpIHR5cGU7CiAgICBpZiAoZGljdCA9PSBOVUxMKSB7CglyZXQtPm5hbWUgPSB4bWxTdHJkdXAobmFtZSk7CglpZiAoRXh0ZXJuYWxJRCAhPSBOVUxMKQoJICAgIHJldC0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsKCWlmIChTeXN0ZW1JRCAhPSBOVUxMKQoJICAgIHJldC0+U3lzdGVtSUQgPSB4bWxTdHJkdXAoU3lzdGVtSUQpOwogICAgfSBlbHNlIHsKICAgICAgICByZXQtPm5hbWUgPSB4bWxEaWN0TG9va3VwKGRpY3QsIG5hbWUsIC0xKTsKCWlmIChFeHRlcm5hbElEICE9IE5VTEwpCgkgICAgcmV0LT5FeHRlcm5hbElEID0geG1sRGljdExvb2t1cChkaWN0LCBFeHRlcm5hbElELCAtMSk7CglpZiAoU3lzdGVtSUQgIT0gTlVMTCkKCSAgICByZXQtPlN5c3RlbUlEID0geG1sRGljdExvb2t1cChkaWN0LCBTeXN0ZW1JRCwgLTEpOwogICAgfQogICAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgewogICAgICAgIHJldC0+bGVuZ3RoID0geG1sU3RybGVuKGNvbnRlbnQpOwoJaWYgKChkaWN0ICE9IE5VTEwpICYmIChyZXQtPmxlbmd0aCA8IDUpKQoJICAgIHJldC0+Y29udGVudCA9ICh4bWxDaGFyICopCgkgICAgICAgICAgICAgICAgICAgeG1sRGljdExvb2t1cChkaWN0LCBjb250ZW50LCByZXQtPmxlbmd0aCk7CgllbHNlCgkgICAgcmV0LT5jb250ZW50ID0geG1sU3RybmR1cChjb250ZW50LCByZXQtPmxlbmd0aCk7CiAgICAgfSBlbHNlIHsKICAgICAgICByZXQtPmxlbmd0aCA9IDA7CiAgICAgICAgcmV0LT5jb250ZW50ID0gTlVMTDsKICAgIH0KICAgIHJldC0+VVJJID0gTlVMTDsgLyogdG8gYmUgY29tcHV0ZWQgYnkgdGhlIGxheWVyIGtub3dpbmcKCQkJdGhlIGRlZmluaW5nIGVudGl0eSAqLwogICAgcmV0LT5vcmlnID0gTlVMTDsKICAgIHJldC0+b3duZXIgPSAwOwogICAgcmV0LT5kb2MgPSBkdGQtPmRvYzsKCiAgICBpZiAoeG1sSGFzaEFkZEVudHJ5KHRhYmxlLCBuYW1lLCByZXQpKSB7CgkvKgoJICogZW50aXR5IHdhcyBhbHJlYWR5IGRlZmluZWQgYXQgYW5vdGhlciBsZXZlbC4KCSAqLwogICAgICAgIHhtbEZyZWVFbnRpdHkocmV0KTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeG1sR2V0UHJlZGVmaW5lZEVudGl0eToKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogQ2hlY2sgd2hldGhlciB0aGlzIG5hbWUgaXMgYW4gcHJlZGVmaW5lZCBlbnRpdHkuCiAqCiAqIFJldHVybnMgTlVMTCBpZiBub3QsIG90aGVyd2lzZSB0aGUgZW50aXR5CiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0UHJlZGVmaW5lZEVudGl0eShjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKICAgICAgICBjYXNlICdsJzoKCSAgICBpZiAoeG1sU3RyRXF1YWwobmFtZSwgQkFEX0NBU1QgImx0IikpCgkgICAgICAgIHJldHVybigmeG1sRW50aXR5THQpOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2cnOgoJICAgIGlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAiZ3QiKSkKCSAgICAgICAgcmV0dXJuKCZ4bWxFbnRpdHlHdCk7CgkgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYSc6CgkgICAgaWYgKHhtbFN0ckVxdWFsKG5hbWUsIEJBRF9DQVNUICJhbXAiKSkKCSAgICAgICAgcmV0dXJuKCZ4bWxFbnRpdHlBbXApOwoJICAgIGlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAiYXBvcyIpKQoJICAgICAgICByZXR1cm4oJnhtbEVudGl0eUFwb3MpOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3EnOgoJICAgIGlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAicXVvdCIpKQoJICAgICAgICByZXR1cm4oJnhtbEVudGl0eVF1b3QpOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIHhtbEFkZER0ZEVudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50IERURCBleHRlcm5hbCBzdWJzZXQuCiAqCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yCiAqLwp4bWxFbnRpdHlQdHIKeG1sQWRkRHRkRW50aXR5KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCB0eXBlLAoJICAgICAgICBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELCBjb25zdCB4bWxDaGFyICpTeXN0ZW1JRCwKCQljb25zdCB4bWxDaGFyICpjb250ZW50KSB7CiAgICB4bWxFbnRpdHlQdHIgcmV0OwogICAgeG1sRHRkUHRyIGR0ZDsKCiAgICBpZiAoZG9jID09IE5VTEwpIHsKCXhtbEVudGl0aWVzRXJyKFhNTF9EVERfTk9fRE9DLAoJICAgICAgICAieG1sQWRkRHRkRW50aXR5OiBkb2N1bWVudCBpcyBOVUxMIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBpZiAoZG9jLT5leHRTdWJzZXQgPT0gTlVMTCkgewoJeG1sRW50aXRpZXNFcnIoWE1MX0RURF9OT19EVEQsCgkgICAgICAgICJ4bWxBZGREdGRFbnRpdHk6IGRvY3VtZW50IHdpdGhvdXQgZXh0ZXJuYWwgc3Vic2V0Iik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBkdGQgPSBkb2MtPmV4dFN1YnNldDsKICAgIHJldCA9IHhtbEFkZEVudGl0eShkdGQsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEVEQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CiAgICAgICAgZHRkLT5sYXN0LT5uZXh0ID0gKHhtbE5vZGVQdHIpIHJldDsKCXJldC0+cHJldiA9IGR0ZC0+bGFzdDsKCWR0ZC0+bGFzdCA9ICh4bWxOb2RlUHRyKSByZXQ7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHhtbEFkZERvY0VudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZERvY0VudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgICAgICAgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0eVB0ciByZXQ7CiAgICB4bWxEdGRQdHIgZHRkOwoKICAgIGlmIChkb2MgPT0gTlVMTCkgewoJeG1sRW50aXRpZXNFcnIoWE1MX0RURF9OT19ET0MsCgkgICAgICAgICJ4bWxBZGREb2NFbnRpdHk6IGRvY3VtZW50IGlzIE5VTEwiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGlmIChkb2MtPmludFN1YnNldCA9PSBOVUxMKSB7Cgl4bWxFbnRpdGllc0VycihYTUxfRFREX05PX0RURCwKCSAgICAgICAgInhtbEFkZERvY0VudGl0eTogZG9jdW1lbnQgd2l0aG91dCBpbnRlcm5hbCBzdWJzZXQiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIGR0ZCA9IGRvYy0+aW50U3Vic2V0OwogICAgcmV0ID0geG1sQWRkRW50aXR5KGR0ZCwgbmFtZSwgdHlwZSwgRXh0ZXJuYWxJRCwgU3lzdGVtSUQsIGNvbnRlbnQpOwogICAgaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CgogICAgLyoKICAgICAqIExpbmsgaXQgdG8gdGhlIERURAogICAgICovCiAgICByZXQtPnBhcmVudCA9IGR0ZDsKICAgIHJldC0+ZG9jID0gZHRkLT5kb2M7CiAgICBpZiAoZHRkLT5sYXN0ID09IE5VTEwpIHsKCWR0ZC0+Y2hpbGRyZW4gPSBkdGQtPmxhc3QgPSAoeG1sTm9kZVB0cikgcmV0OwogICAgfSBlbHNlIHsKCWR0ZC0+bGFzdC0+bmV4dCA9ICh4bWxOb2RlUHRyKSByZXQ7CglyZXQtPnByZXYgPSBkdGQtPmxhc3Q7CglkdGQtPmxhc3QgPSAoeG1sTm9kZVB0cikgcmV0OwogICAgfQogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxHZXRFbnRpdHlGcm9tVGFibGU6CiAqIEB0YWJsZTogIGFuIGVudGl0eSB0YWJsZQogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAcGFyYW1ldGVyOiAgbG9vayBmb3IgcGFyYW1ldGVyIGVudGl0aWVzCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIHRhYmxlLgogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBlbnRpdHksIGlmIGZvdW5kLgogKiAKICogUmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIGVudGl0eSBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZm91bmQuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCnhtbEdldEVudGl0eUZyb21UYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICByZXR1cm4oKHhtbEVudGl0eVB0cikgeG1sSGFzaExvb2t1cCh0YWJsZSwgbmFtZSkpOwp9CgovKioKICogeG1sR2V0UGFyYW1ldGVyRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHN1YnNldHMgYW5kCiAqIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGVudGl0eSwgaWYgZm91bmQuCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXRQYXJhbWV0ZXJFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZTsKICAgIHhtbEVudGl0eVB0ciByZXQ7CgogICAgaWYgKGRvYyA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgaWYgKChkb2MtPmludFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllczsKCXJldCA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSk7CglpZiAocmV0ICE9IE5VTEwpCgkgICAgcmV0dXJuKHJldCk7CiAgICB9CiAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzICE9IE5VTEwpKSB7Cgl0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzOwoJcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sR2V0RHRkRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgRFREIGVudGl0eSBoYXNoIHRhYmxlIGFuZAogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eSwgaWYgZm91bmQuCiAqIE5vdGU6IHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgbm90IHRoZSBEVEQgbm9kZS4KICogCiAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8KeG1sRW50aXR5UHRyCnhtbEdldER0ZEVudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwoKICAgIGlmIChkb2MgPT0gTlVMTCkKCXJldHVybihOVUxMKTsKICAgIGlmICgoZG9jLT5leHRTdWJzZXQgIT0gTlVMTCkgJiYgKGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzOwoJcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sR2V0RG9jRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgZG9jdW1lbnQgZW50aXR5IGhhc2ggdGFibGUgYW5kCiAqIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5LCBvdGhlcndpc2UgYSBsb29rdXAgaXMgZG9uZQogKiBpbiB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcyB0b28uCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXREb2NFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXR5UHRyIGN1cjsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CgogICAgaWYgKGRvYyAhPSBOVUxMKSB7CglpZiAoKGRvYy0+aW50U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmludFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCSAgICB0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmludFN1YnNldC0+ZW50aXRpZXM7CgkgICAgY3VyID0geG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKTsKCSAgICBpZiAoY3VyICE9IE5VTEwpCgkJcmV0dXJuKGN1cik7Cgl9CglpZiAoZG9jLT5zdGFuZGFsb25lICE9IDEpIHsKCSAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmCgkJKGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllcyAhPSBOVUxMKSkgewoJCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllczsKCQljdXIgPSB4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpOwoJCWlmIChjdXIgIT0gTlVMTCkKCQkgICAgcmV0dXJuKGN1cik7CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuKHhtbEdldFByZWRlZmluZWRFbnRpdHkobmFtZSkpOwp9CgovKgogKiBNYWNybyB1c2VkIHRvIGdyb3cgdGhlIGN1cnJlbnQgYnVmZmVyLgogKi8KI2RlZmluZSBncm93QnVmZmVyUmVlbnRyYW50KCkgewkJCQkJCVwKICAgIGJ1ZmZlcl9zaXplICo9IDI7CQkJCQkJCVwKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopCQkJCQkJXAogICAgCQl4bWxSZWFsbG9jKGJ1ZmZlciwgYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwlcCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsJCQkJCQlcCiAgICAgICAgeG1sRW50aXRpZXNFcnJNZW1vcnkoInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50OiByZWFsbG9jIGZhaWxlZCIpO1wKCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgfQkJCQkJCQkJCVwKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudDoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqIENvbnRyYXJ5IHRvIHhtbEVuY29kZUVudGl0aWVzLCB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0CiAqIG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBodG1sID0gMDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICB4bWxFbnRpdGllc0Vyck1lbW9yeSgieG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQ6IG1hbGxvYyBmYWlsZWQiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG91dCA9IGJ1ZmZlcjsKCiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTAwKSB7CgkgICAgaW50IGluZHggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZHhdOwoJfQoKCS8qCgkgKiBCeSBkZWZhdWx0IG9uZSBoYXZlIHRvIGVuY29kZSBhdCBsZWFzdCAnPCcsICc+JywgJyInIGFuZCAnJicgIQoJICovCglpZiAoKmN1ciA9PSAnPCcpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2wnOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJz4nKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdnJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICcmJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnYSc7CgkgICAgKm91dCsrID0gJ20nOwoJICAgICpvdXQrKyA9ICdwJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCgoKmN1ciA+PSAweDIwKSAmJiAoKmN1ciA8IDB4ODApKSB8fAoJICAgICgqY3VyID09ICdcbicpIHx8ICgqY3VyID09ICdcdCcpIHx8ICgoaHRtbCkgJiYgKCpjdXIgPT0gJ1xyJykpKSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIGp1c3QgY29weSAhCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKCX0gZWxzZSBpZiAoKmN1ciA+PSAweDgwKSB7CgkgICAgaWYgKCgoZG9jICE9IE5VTEwpICYmIChkb2MtPmVuY29kaW5nICE9IE5VTEwpKSB8fCAoaHRtbCkpIHsKCQkvKgoJCSAqIEJq+HJuIFJlZXNlIDxickBzc2V1c2EuY29tPiBwcm92aWRlZCB0aGUgcGF0Y2gKCSAgICAgICAgeG1sQ2hhciB4YzsKCSAgICAgICAgeGMgPSAoKmN1ciAmIDB4M0YpIDw8IDY7CgkgICAgICAgIGlmIChjdXJbMV0gIT0gMCkgewoJCSAgICB4YyArPSAqKCsrY3VyKSAmIDB4M0Y7CgkJICAgICpvdXQrKyA9IHhjOwoJICAgICAgICB9IGVsc2UKCQkgKi8KCQkqb3V0KysgPSAqY3VyOwoJICAgIH0gZWxzZSB7CgkJLyoKCQkgKiBXZSBhc3N1bWUgd2UgaGF2ZSBVVEYtOCBpbnB1dC4KCQkgKi8KCQljaGFyIGJ1ZlsxMV0sICpwdHI7CgkJaW50IHZhbCA9IDAsIGwgPSAxOwoKCQlpZiAoKmN1ciA8IDB4QzApIHsKCQkgICAgeG1sRW50aXRpZXNFcnIoWE1MX0NIRUNLX05PVF9VVEY4LAoJCQkgICAgInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IDogaW5wdXQgbm90IFVURi04Iik7CgkJICAgIGlmIChkb2MgIT0gTlVMTCkKCQkJZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY3VyKys7CgkJICAgIGNvbnRpbnVlOwoJCX0gZWxzZSBpZiAoKmN1ciA8IDB4RTApIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAoY3VyWzBdKSAmIDB4MUY7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMV0pICYgMHgzRjsKCQkgICAgbCA9IDI7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhGMCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgwRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzJdKSAmIDB4M0Y7CgkJICAgIGwgPSAzOwoJCX0gZWxzZSBpZiAoKmN1ciA8IDB4RjgpIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAoY3VyWzBdKSAmIDB4MDc7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMV0pICYgMHgzRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsyXSkgJiAweDNGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzNdKSAmIDB4M0Y7CgkJICAgIGwgPSA0OwoJCX0KCQlpZiAoKGwgPT0gMSkgfHwgKCFJU19DSEFSKHZhbCkpKSB7CgkJICAgIHhtbEVudGl0aWVzRXJyKFhNTF9FUlJfSU5WQUxJRF9DSEFSLAoJCQkieG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQgOiBjaGFyIG91dCBvZiByYW5nZVxuIik7CgkJICAgIGlmIChkb2MgIT0gTlVMTCkKCQkJZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY3VyKys7CgkJICAgIGNvbnRpbnVlOwoJCX0KCQkvKgoJCSAqIFdlIGNvdWxkIGRvIG11bHRpcGxlIHRoaW5ncyBoZXJlLiBKdXN0IHNhdmUgYXMgYSBjaGFyIHJlZgoJCSAqLwoJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImI3glWDsiLCB2YWwpOwoJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKCQlwdHIgPSBidWY7CgkJd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJCWN1ciArPSBsOwoJCWNvbnRpbnVlOwoJICAgIH0KCX0gZWxzZSBpZiAoSVNfQllURV9DSEFSKCpjdXIpKSB7CgkgICAgY2hhciBidWZbMTFdLCAqcHRyOwoKCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKCSAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CiAgICAgICAgICAgIHB0ciA9IGJ1ZjsKCSAgICB3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7Cgl9CgljdXIrKzsKICAgIH0KICAgICpvdXQrKyA9IDA7CiAgICByZXR1cm4oYnVmZmVyKTsKfQoKLyoqCiAqIHhtbEVuY29kZVNwZWNpYWxDaGFyczoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogdGhpcyByb3V0aW5lIGlzIHJlZW50cmFudCwgYW5kIHJlc3VsdCBtdXN0IGJlIGRlYWxsb2NhdGVkLgogKgogKiBSZXR1cm5zIEEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyB3aXRoIHRoZSBzdWJzdGl0dXRpb24gZG9uZS4KICovCnhtbENoYXIgKgp4bWxFbmNvZGVTcGVjaWFsQ2hhcnMoeG1sRG9jUHRyIGRvYyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICppbnB1dCkgewogICAgY29uc3QgeG1sQ2hhciAqY3VyID0gaW5wdXQ7CiAgICB4bWxDaGFyICpidWZmZXIgPSBOVUxMOwogICAgeG1sQ2hhciAqb3V0ID0gTlVMTDsKICAgIGludCBidWZmZXJfc2l6ZSA9IDA7CiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICB4bWxFbnRpdGllc0Vyck1lbW9yeSgieG1sRW5jb2RlU3BlY2lhbENoYXJzOiBtYWxsb2MgZmFpbGVkIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBvdXQgPSBidWZmZXI7CgogICAgd2hpbGUgKCpjdXIgIT0gJ1wwJykgewogICAgICAgIGlmIChvdXQgLSBidWZmZXIgPiBidWZmZXJfc2l6ZSAtIDEwKSB7CgkgICAgaW50IGluZHggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZHhdOwoJfQoKCS8qCgkgKiBCeSBkZWZhdWx0IG9uZSBoYXZlIHRvIGVuY29kZSBhdCBsZWFzdCAnPCcsICc+JywgJyInIGFuZCAnJicgIQoJICovCglpZiAoKmN1ciA9PSAnPCcpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2wnOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJz4nKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdnJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICcmJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnYSc7CgkgICAgKm91dCsrID0gJ20nOwoJICAgICpvdXQrKyA9ICdwJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJyInKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdxJzsKCSAgICAqb3V0KysgPSAndSc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICd0JzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCpjdXIgPT0gJ1xyJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnIyc7CgkgICAgKm91dCsrID0gJzEnOwoJICAgICpvdXQrKyA9ICczJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgewoJICAgIC8qCgkgICAgICogV29ya3MgYmVjYXVzZSBvbiBVVEYtOCwgYWxsIGV4dGVuZGVkIHNlcXVlbmNlcyBjYW5ub3QKCSAgICAgKiByZXN1bHQgaW4gYnl0ZXMgaW4gdGhlIEFTQ0lJIHJhbmdlLgoJICAgICAqLwoJICAgICpvdXQrKyA9ICpjdXI7Cgl9CgljdXIrKzsKICAgIH0KICAgICpvdXQrKyA9IDA7CiAgICByZXR1cm4oYnVmZmVyKTsKfQoKLyoqCiAqIHhtbENyZWF0ZUVudGl0aWVzVGFibGU6CiAqCiAqIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbXB0eSBlbnRpdGllcyBoYXNoIHRhYmxlLgogKiBUaGlzIHJlYWxseSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW5kIHNob3VsZCBiZSBkZXByZWNhdGVkCiAqCiAqIFJldHVybnMgdGhlIHhtbEVudGl0aWVzVGFibGVQdHIganVzdCBjcmVhdGVkIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnhtbEVudGl0aWVzVGFibGVQdHIKeG1sQ3JlYXRlRW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICByZXR1cm4oKHhtbEVudGl0aWVzVGFibGVQdHIpIHhtbEhhc2hDcmVhdGUoMCkpOwp9CgovKioKICogeG1sRnJlZUVudGl0eVdyYXBwZXI6CiAqIEBlbnRpdHk6ICBBbiBlbnRpdHkKICogQG5hbWU6ICBpdHMgbmFtZQogKgogKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSBhbiBlbnRpdGllcyBpbiB0aGUgaGFzaCB0YWJsZS4KICovCnN0YXRpYyB2b2lkCnhtbEZyZWVFbnRpdHlXcmFwcGVyKHhtbEVudGl0eVB0ciBlbnRpdHksCgkgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChlbnRpdHkgIT0gTlVMTCkKCXhtbEZyZWVFbnRpdHkoZW50aXR5KTsKfQoKLyoqCiAqIHhtbEZyZWVFbnRpdGllc1RhYmxlOgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IHVzZWQgYnkgYW4gZW50aXRpZXMgaGFzaCB0YWJsZS4KICovCnZvaWQKeG1sRnJlZUVudGl0aWVzVGFibGUoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgeG1sSGFzaEZyZWUodGFibGUsICh4bWxIYXNoRGVhbGxvY2F0b3IpIHhtbEZyZWVFbnRpdHlXcmFwcGVyKTsKfQoKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKLyoqCiAqIHhtbENvcHlFbnRpdHk6CiAqIEBlbnQ6ICBBbiBlbnRpdHkKICoKICogQnVpbGQgYSBjb3B5IG9mIGFuIGVudGl0eQogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKeG1sQ29weUVudGl0eSh4bWxFbnRpdHlQdHIgZW50KSB7CiAgICB4bWxFbnRpdHlQdHIgY3VyOwoKICAgIGN1ciA9ICh4bWxFbnRpdHlQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRW50aXR5KSk7CiAgICBpZiAoY3VyID09IE5VTEwpIHsKICAgICAgICB4bWxFbnRpdGllc0Vyck1lbW9yeSgieG1sQ29weUVudGl0eTo6IG1hbGxvYyBmYWlsZWQiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG1lbXNldChjdXIsIDAsIHNpemVvZih4bWxFbnRpdHkpKTsKICAgIGN1ci0+dHlwZSA9IFhNTF9FTlRJVFlfREVDTDsKCiAgICBjdXItPmV0eXBlID0gZW50LT5ldHlwZTsKICAgIGlmIChlbnQtPm5hbWUgIT0gTlVMTCkKCWN1ci0+bmFtZSA9IHhtbFN0cmR1cChlbnQtPm5hbWUpOwogICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKQoJY3VyLT5FeHRlcm5hbElEID0geG1sU3RyZHVwKGVudC0+RXh0ZXJuYWxJRCk7CiAgICBpZiAoZW50LT5TeXN0ZW1JRCAhPSBOVUxMKQoJY3VyLT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChlbnQtPlN5c3RlbUlEKTsKICAgIGlmIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkKCWN1ci0+Y29udGVudCA9IHhtbFN0cmR1cChlbnQtPmNvbnRlbnQpOwogICAgaWYgKGVudC0+b3JpZyAhPSBOVUxMKQoJY3VyLT5vcmlnID0geG1sU3RyZHVwKGVudC0+b3JpZyk7CiAgICBpZiAoZW50LT5VUkkgIT0gTlVMTCkKCWN1ci0+VVJJID0geG1sU3RyZHVwKGVudC0+VVJJKTsKICAgIHJldHVybihjdXIpOwp9CgovKioKICogeG1sQ29weUVudGl0aWVzVGFibGU6CiAqIEB0YWJsZTogIEFuIGVudGl0eSB0YWJsZQogKgogKiBCdWlsZCBhIGNvcHkgb2YgYW4gZW50aXR5IHRhYmxlLgogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzVGFibGVQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDb3B5RW50aXRpZXNUYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlKSB7CiAgICByZXR1cm4oeG1sSGFzaENvcHkodGFibGUsICh4bWxIYXNoQ29waWVyKSB4bWxDb3B5RW50aXR5KSk7Cn0KI2VuZGlmIC8qIExJQlhNTF9UUkVFX0VOQUJMRUQgKi8KCiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKCi8qKgogKiB4bWxEdW1wRW50aXR5Q29udGVudDoKICogQGJ1ZjogIEFuIFhNTCBidWZmZXIuCiAqIEBjb250ZW50OiAgVGhlIGVudGl0eSBjb250ZW50LgogKgogKiBUaGlzIHdpbGwgZHVtcCB0aGUgcXVvdGVkIHN0cmluZyB2YWx1ZSwgdGFraW5nIGNhcmUgb2YgdGhlIHNwZWNpYWwKICogdHJlYXRtZW50IHJlcXVpcmVkIGJ5ICUKICovCnN0YXRpYyB2b2lkCnhtbER1bXBFbnRpdHlDb250ZW50KHhtbEJ1ZmZlclB0ciBidWYsIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIGlmIChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFKSByZXR1cm47CiAgICBpZiAoeG1sU3RyY2hyKGNvbnRlbnQsICclJykpIHsKICAgICAgICBjb25zdCB4bWxDaGFyICogYmFzZSwgKmN1cjsKCgl4bWxCdWZmZXJDQ2F0KGJ1ZiwgIlwiIik7CgliYXNlID0gY3VyID0gY29udGVudDsKCXdoaWxlICgqY3VyICE9IDApIHsKCSAgICBpZiAoKmN1ciA9PSAnIicpIHsKCQlpZiAoYmFzZSAhPSBjdXIpCgkJICAgIHhtbEJ1ZmZlckFkZChidWYsIGJhc2UsIGN1ciAtIGJhc2UpOwoJCXhtbEJ1ZmZlckFkZChidWYsIEJBRF9DQVNUICImcXVvdDsiLCA2KTsKCQljdXIrKzsKCQliYXNlID0gY3VyOwoJICAgIH0gZWxzZSBpZiAoKmN1ciA9PSAnJScpIHsKCQlpZiAoYmFzZSAhPSBjdXIpCgkJICAgIHhtbEJ1ZmZlckFkZChidWYsIGJhc2UsIGN1ciAtIGJhc2UpOwoJCXhtbEJ1ZmZlckFkZChidWYsIEJBRF9DQVNUICImI3gyNTsiLCA2KTsKCQljdXIrKzsKCQliYXNlID0gY3VyOwoJICAgIH0gZWxzZSB7CgkJY3VyKys7CgkgICAgfQoJfQoJaWYgKGJhc2UgIT0gY3VyKQoJICAgIHhtbEJ1ZmZlckFkZChidWYsIGJhc2UsIGN1ciAtIGJhc2UpOwoJeG1sQnVmZmVyQ0NhdChidWYsICJcIiIpOwogICAgfSBlbHNlIHsKICAgICAgICB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGNvbnRlbnQpOwogICAgfQp9CgovKioKICogeG1sRHVtcEVudGl0eURlY2w6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAZW50OiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIFRoaXMgd2lsbCBkdW1wIHRoZSBjb250ZW50IG9mIHRoZSBlbnRpdHkgdGFibGUgYXMgYW4gWE1MIERURCBkZWZpbml0aW9uCiAqLwp2b2lkCnhtbER1bXBFbnRpdHlEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0eVB0ciBlbnQpIHsKICAgIGlmICgoYnVmID09IE5VTEwpIHx8IChlbnQgPT0gTlVMTCkpIHJldHVybjsKICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewoJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCSAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPm9yaWcpOwoJICAgIGVsc2UKCQl4bWxEdW1wRW50aXR5Q29udGVudChidWYsIGVudC0+Y29udGVudCk7CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIGlmIChlbnQtPkV4dGVybmFsSUQgIT0gTlVMTCkgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFBVQkxJQyAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPkV4dGVybmFsSUQpOwoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0gZWxzZSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgU1lTVEVNICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0KCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBQVUJMSUMgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5FeHRlcm5hbElEKTsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9IGVsc2UgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFNZU1RFTSAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9CgkgICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKSB7IC8qIFNob3VsZCBiZSB0cnVlICEgKi8KCQl4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIE5EQVRBICIpOwoJCWlmIChlbnQtPm9yaWcgIT0gTlVMTCkKCQkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5vcmlnKTsKCQllbHNlCgkJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+Y29udGVudCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICUgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJICAgIGlmIChlbnQtPm9yaWcgPT0gTlVMTCkKCQl4bWxEdW1wRW50aXR5Q29udGVudChidWYsIGVudC0+Y29udGVudCk7CgkgICAgZWxzZQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5vcmlnKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAlICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgUFVCTElDICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+RXh0ZXJuYWxJRCk7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfSBlbHNlIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBTWVNURU0gIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgeG1sRW50aXRpZXNFcnIoWE1MX0RURF9VTktOT1dOX0VOVElUWSwKCQkieG1sRHVtcEVudGl0aWVzRGVjbDogaW50ZXJuYWw6IHVua25vd24gdHlwZSBlbnRpdHkgdHlwZSIpOwogICAgfQp9CgovKioKICogeG1sRHVtcEVudGl0eURlY2xTY2FuOgogKiBAZW50OiAgQW4gZW50aXR5IHRhYmxlCiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKgogKiBXaGVuIHVzaW5nIHRoZSBoYXNoIHRhYmxlIHNjYW4gZnVuY3Rpb24sIGFyZ3VtZW50cyBuZWVkIHRvIGJlIHJldmVyc2VkCiAqLwpzdGF0aWMgdm9pZAp4bWxEdW1wRW50aXR5RGVjbFNjYW4oeG1sRW50aXR5UHRyIGVudCwgeG1sQnVmZmVyUHRyIGJ1ZikgewogICAgeG1sRHVtcEVudGl0eURlY2woYnVmLCBlbnQpOwp9CiAgICAgIAovKioKICogeG1sRHVtcEVudGl0aWVzVGFibGU6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogVGhpcyB3aWxsIGR1bXAgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGl0eSB0YWJsZSBhcyBhbiBYTUwgRFREIGRlZmluaXRpb24KICovCnZvaWQKeG1sRHVtcEVudGl0aWVzVGFibGUoeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgeG1sSGFzaFNjYW4odGFibGUsICh4bWxIYXNoU2Nhbm5lcil4bWxEdW1wRW50aXR5RGVjbFNjYW4sIGJ1Zik7Cn0KI2VuZGlmIC8qIExJQlhNTF9PVVRQVVRfRU5BQkxFRCAqLwojZGVmaW5lIGJvdHRvbV9lbnRpdGllcwojaW5jbHVkZSAiZWxmZ2NjaGFjay5oIgo=