LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKCiAgIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKICAgSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCiAgIGFsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQogICBGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCiAgIGludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCiAgIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKICAgTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCgogICBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAogICBsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAogICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCgogICBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCiAgIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAogICBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKICAgYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCiAgIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKICAgVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAogICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCiAgIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKICAgZGlzY2xhaW1lci4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KCiAgIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKICAgbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgoqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CiAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAogICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAogICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKICAgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCiAgIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCiAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAiY29uZmlnX21hcnZlbGwuaCIgICAgIC8qIFJlcXVpcmVkIHRvIGlkZW50aWZ5IFNPQyBhbmQgQm9hcmQgKi8KI2luY2x1ZGUgIm12SGlnaFNwZWVkRW52U3BlYy5oIgojaW5jbHVkZSAibXZIaWdoU3BlZWRUb3BvbG9neVNwZWMuaCIKI2luY2x1ZGUgIm12U3lzRW52TGliLmgiCiNpbmNsdWRlICJtdkN0cmxQZXguaCIKI2luY2x1ZGUgInByaW50Zi5oIgoKI2lmIGRlZmluZWQgKE1WODhGNjhYWCkKI2VsaWYgZGVmaW5lZCAoTVY4OEY2OVhYKQojZWxzZQojZXJyb3IgIk5vIGRldmljZSBpcyBkZWZpbmVkIgojZW5kaWYKCiNkZWZpbmUgU0xPV0RPV04gIG12T3NVRGVsYXkoNTApOwoKI2lmZGVmIFJFR0lTVEVSX1RSQUNFX0RFQlVHCnN0YXRpYyBNVl9VMzIgX01WX1JFR19SRUFEKE1WX1UzMiByZWdBZGRyKQp7CglwdXRzdHJpbmcoIlxuID4+PiAgICAgICBNVl9SRUdfUkVBRC4gIHJlZ0FkZHI9MHgiKTsKCXB1dGRhdGEoSU5URVJfUkVHU19CQVNFIHwgKHJlZ0FkZHIpLCA4KTsKCXB1dHN0cmluZygiIHJlZ0RhdGE9MHgiKTsKCU1WX1UzMiByZWdEYXRhID0gTVZfTUVNSU9fTEUzMl9SRUFEKChJTlRFUl9SRUdTX0JBU0UgfCAocmVnQWRkcikpKTsKCXB1dGRhdGEocmVnRGF0YSwgOCk7CgoJcmV0dXJuIHJlZ0RhdGE7Cn0KCnN0YXRpYyBNVl9WT0lEIF9NVl9SRUdfV1JJVEUoTVZfVTMyIHJlZ0FkZHIsIE1WX1UzMiByZWdEYXRhKQp7CglwdXRzdHJpbmcoIlxuID4+PiAgICAgICBNVl9SRUdfV1JJVEUuIHJlZ0FkZHI9MHgiKTsKCXB1dGRhdGEoSU5URVJfUkVHU19CQVNFIHwgKHJlZ0FkZHIpLCA4KTsKCXB1dHN0cmluZygiIHJlZ0RhdGE9MHgiKTsKCXB1dGRhdGEocmVnRGF0YSwgOCk7CglNVl9NRU1JT19MRTMyX1dSSVRFKChJTlRFUl9SRUdTX0JBU0UgfCAocmVnQWRkcikpLCAocmVnRGF0YSkpOwp9CgojdW5kZWYgTVZfUkVHX1dSSVRFCiN1bmRlZiBNVl9SRUdfUkVBRAoKI2RlZmluZSBNVl9SRUdfV1JJVEUgICAgX01WX1JFR19XUklURQojZGVmaW5lIE1WX1JFR19SRUFEICAgICBfTVZfUkVHX1JFQUQKI2VuZGlmIC8qUkVHSVNURVJfVFJBQ0VfREVCVUcqLwoKI2RlZmluZQlTRVJERVNfVkVSSU9OCSIyLjAiCiNkZWZpbmUgRU5ERURfT0sgIkhpZ2ggc3BlZWQgUEhZIC0gRW5kZWQgU3VjY2Vzc2Z1bGx5XG4iCgojZGVmaW5lIExJTktfV0FJVF9DTlRSICAxMDAKI2RlZmluZSBMSU5LX1dBSVRfU0xFRVAgMTAwCgojZGVmaW5lIE1BWF9VTklUX05VTUIgICAgIDQKI2RlZmluZSBUT1BPTE9HWV9URVNUX09LICAgICAgICAgICAwCiNkZWZpbmUgV1JPTkdfTlVNQkVSX09GX1VOSVRTICAgICAgMQojZGVmaW5lIFNFUkRFU19BTFJFQURZX0lOX1VTRSAgICAgIDIKI2RlZmluZSBVTklUX05VTUJFUl9WSU9MQVRJT04gICAgICAzCgovKiBTZXJkZXNMYW5lSW5Vc2VDb3VudCBjb250YWlucyB0aGUgZXhhY3QgYW1vdW50IG9mIHNlcmRlcyBsYW5lcyBuZWVkZWQgcGVyIHR5cGUgKi8KTVZfVTggU2VyZGVzTGFuZUluVXNlQ291bnRbTUFYX1VOSVRTX0lEXVtNQVhfVU5JVF9OVU1CXSA9CnsKCS8qIGlmIFBFWDAgaXMgZGVmaW5lcyBhcyBQRVh4NCBpdCBjYW4gdXNlIDQgbGFuZXM7IGluIFBFWHgxIG9ubHkgMQoJdGhlIHZhbHVlIGZvciBQRVggMCBpcyB1cGRhdGVkIGluIG12SHdzU2VyZGVzVG9wb2xvZ3lWZXJpZnkgZnVuY3Rpb24gKi8KCS8qIDAgIDEgIDIgIDMgICAgKi8KCXsgIDQsIDEsIDEsIDEgfSwgIC8qIFBFWCAgICAgKi8KCXsgIDEsIDEsIDEsIDEgfSwgIC8qIEVUSF9TR01JSSAqLwoJeyAgMSwgMSwgMCwgMCB9LCAgLyogVVNCM0ggICAqLwoJeyAgMSwgMSwgMSwgMCB9LCAgLyogVVNCM0QgICAqLwoJeyAgMSwgMSwgMSwgMSB9LCAgLyogU0FUQSAgICAqLwoJeyAgMSwgMCwgMCwgMCB9LCAgLyogUVNHTUlJICAqLwoJeyAgNCwgMCwgMCwgMCB9LCAgLyogWEFVSSAgICAqLwoJeyAgMiwgMCwgMCwgMCB9ICAgLyogUlhBVUkgICAqLwp9OwoKLyogc2VyZGVzVW5pdENvdW50IGNvdW50IHVuaXQgbnVtYmVyLiAoaS5lIGEgc2luZ2xlIFhBVUkgaXMgY291bnRlZCBhcyAxIHVuaXQpICovCk1WX1U4IHNlcmRlc1VuaXRDb3VudFtNQVhfVU5JVFNfSURdID0gezB9OwoKLyogU2VsZWN0b3IgbWFwcGluZyBmb3IgQTM4MC1BMCBhbmQgQTM5MC1aMSAqLwpNVl9VOCBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtMQVNUX1NFUkRFU19UWVBFXVtNQVhfU0VSREVTX0xBTkVTXSA9CnsKCS8qIDAgICAgICAxICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICovCgl7IDB4MSwgICAweDEsICAgIE5BLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJfSwgIC8qIFBFWDAgKi8KCXsgTkEsICAgIE5BLCAgICAgMHgxLAkgTkEsCSAweDEsCSBOQSwgICAgIDB4MQl9LCAgLyogUEVYMSAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg3LAkgMHgxLCAgICBOQQl9LCAgLyogUEVYMiAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4MSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogUEVYMyAqLwoJeyAweDIsICAgMHgzLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBTQVRBMCAqLwoJeyBOQSwgICAgTkEsICAgICAweDMsCSBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0FUQTEgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NiwJIDB4MiwgICAgTkEJfSwgIC8qIFNBVEEyICovCgl7IE5BLAkgTkEsICAgICBOQSwJIDB4MywJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0FUQTMgKi8KCXsgMHgzLCAgIDB4NCwgICAgTkEsICAgICBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0dNSUkwICovCgl7IE5BLCAgICAweDUsICAgIDB4NCwgICAgTkEsCSAweDMsCSBOQSwgICAgIE5BCX0sICAvKiBTR01JSTEgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDQsCSBOQSwJIDB4MywgICAgTkEJfSwgIC8qIFNHTUlJMiAqLwoJeyBOQSwgICAgMHg3LCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBRU0dNSUkgKi8KCXsgTkEsICAgIDB4NiwgICAgTkEsCSBOQSwJIDB4NCwJIE5BLCAgICAgTkEJfSwgIC8qIFVTQjNfSE9TVDAgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDUsCSBOQSwJIDB4NCwgICAgTkEJfSwgIC8qIFVTQjNfSE9TVDEgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDYsCSAweDUsCSAweDUsICAgIE5BCX0sICAvKiBVU0IzX0RFVklDRSAqLwojaWZkZWYgTVY4OEY2OVhYCgl7IDB4NCwJIDB4OCwgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQSAgIH0sICAvKiBTR01JSXYzLTAgKi8KCXsgTkEsICAgIDB4OSwgICAgMHg1LAkgTkEsCSBOQSwJIE5BLCAgICAgTkEgICB9LCAgLyogU0dNSUl2My0xICovCgl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg3LAkgTkEsCSAweDYsICAgIE5BICAgfSwgIC8qIFNHTUlJdjMtMiAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg4LAkgTkEsICAgICAweDIgIH0sICAvKiBTR01JSXYzLTMgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDgsCSAweDksCSAweDgsICAgIDB4NCAgfSwgIC8qIFhBVUkgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIE5BLAkgMHg4LCAgICAweDQgIH0sICAvKiBSWEFVSSAqLwojZW5kaWYKCXsgMHgwLCAgIDB4MCwgICAgMHgwLAkgMHgwLAkgMHgwLAkgMHgwLCAgICBOQSAgIH0gICAvKiBERUZBVUxUX1NFUkRFUyAqLwp9OwoKLyogU2VsZWN0b3IgbWFwcGluZyBmb3IgUEVYIGJ5IDQgY29uZml1cmF0aW9uICovCk1WX1U4IGNvbW1vblBoeXNTZWxlY3RvcnNQZXhCeTRMYW5lc1tdID0geyAweDEsIDB4MiwgMHgyLCAweDIgfTsKCnN0YXRpYyBjb25zdCBjaGFyICpzZXJkZXNUeXBlVG9TdHJpbmdbXSA9IHsKCSJQQ0llMCAgICAgICIsCgkiUENJZTEgICAgICAiLAoJIlBDSWUyICAgICAgIiwKCSJQQ0llMyAgICAgICIsCgkiU0FUQTAgICAgICAiLAoJIlNBVEExICAgICAgIiwKCSJTQVRBMiAgICAgICIsCgkiU0FUQTMgICAgICAiLAoJIlNHTUlJMCAgICAgIiwKCSJTR01JSTEgICAgICIsCgkiU0dNSUkyICAgICAiLAoJIlFTR01JSSAgICAgIiwKCSJVU0IzIEhPU1QwICIsCgkiVVNCMyBIT1NUMSAiLAoJIlVTQjMgREVWSUNFIiwKCSJTR01JSXYzLTAgICIsCgkiU0dNSUl2My0xICAiLAoJIlNHTUlJdjMtMiAgIiwKCSJTR01JSXYzLTMgICIsCgkiWEFVSSAgICAgICAiLAoJIlJYQVVJICAgICAgIiwKCSJERUZBVUxUIFNFUkRFUyIsCgkiTEFTVF9TRVJERVNfVFlQRSIKfTsKCnR5cGVkZWYgc3RydWN0IHNlcmRlc1VuaXREYXRhIHsKCU1WX1U4IHNlcmRlc1VuaXRJZDsKCU1WX1U4IHNlcmRlc1VuaXROdW07Cn0gTVZfU0VSREVTX1VOSVRfUDsKCnN0YXRpYyBNVl9TRVJERVNfVU5JVF9QIHNlcmRlc1R5cGVUb1VuaXRJbmZvW10gPSB7Cgl7CVBFWF9VTklUX0lEICwJMCwJfSwKCXsJUEVYX1VOSVRfSUQgLAkxLAl9LAoJewlQRVhfVU5JVF9JRCAsCTIsCX0sCgl7CVBFWF9VTklUX0lEICwJMywJfSwKCXsJU0FUQV9VTklUX0lELAkwLAl9LAoJewlTQVRBX1VOSVRfSUQsCTEsCX0sCgl7CVNBVEFfVU5JVF9JRCwJMiwJfSwKCXsJU0FUQV9VTklUX0lELAkzLAl9LAoJewlTR01JSV9VTklUX0lELDAsCX0sCgl7CVNHTUlJX1VOSVRfSUQsMSwJfSwKCXsJU0dNSUlfVU5JVF9JRCwyLAl9LAoJewlRU0dNSUlfVU5JVF9JRCwJMCwJfSwKCXsJVVNCM0hfVU5JVF9JRCwJMCwJfSwKCXsJVVNCM0hfVU5JVF9JRCwJMSwJfSwKCXsJVVNCM0RfVU5JVF9JRCwJMCwJfSwKCXsJU0dNSUlfVU5JVF9JRCwwLAl9LAoJewlTR01JSV9VTklUX0lELDEsCX0sCgl7CVNHTUlJX1VOSVRfSUQsMiwJfSwKCXsJU0dNSUlfVU5JVF9JRCwzLAl9LAoJewlYQVVJX1VOSVRfSUQsCTAsCX0sCgl7CVJYQVVJX1VOSVRfSUQsCTAsCX0sCn07CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlcyBEQiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKiovCi8qIFNBVEEgYW5kIFNHTUlJICovCi8qKioqKioqKioqKioqKioqKiovCgpNVl9PUF9QQVJBTVMgc2F0YVBvcnQwUG93ZXJVcFBhcmFtc1tdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgICAgbWFzayAgICAgICAgICAgICBTQVRBIGRhdGEgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFNBVEFfVkVORE9SX1BPUlRfMF9SRUdfQUREUiwgIDB4MzgwMDAsICAgICAgICAweEZGRkZGRkZGLCAgICAgeyAweDQ4LCAgICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQWNjZXNzIHRvIHJlZyAweDQ4KE9PQiBwYXJhbSAxKSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzBfUkVHX0RBVEEsICAweDM4MDAwLCAgICAgICAgMHhGMDNGLCAgICAgICAgIHsgMHg2MDE4LCAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIE9PQiBDb21XYWtlIGFuZCBDb21SZXNldCBzcGFjaW5nIHVwcGVyIGxpbWl0IGRhdGEgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8wX1JFR19BRERSLCAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGRkYsICAgICB7IDB4QSwgICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBBY2Nlc3MgdG8gcmVnIDB4QShQSFkgQ29udHJvbCkgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8wX1JFR19EQVRBLCAgMHgzODAwMCwgICAgICAgIDB4MzAwMCwgICAgICAgICB7IDB4MCwgICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBSeCBjbGsgYW5kIFR4IGNsayBzZWxlY3Qgbm9uLWludmVydGVkIG1vZGUgKi8KICAgIHsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAgICAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGRkYsICAgICB7IDB4MCwgICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBQb3dlciBEb3duIFNhdGEgYWRkciAqLwogICAgeyBTQVRBX0NUUkxfUkVHX0lORF9EQVRBLCAgICAgICAweDM4MDAwLCAgICAgICAgMHhGRkZGMDBGRiwgICAgIHsgMHhDNDAwNDAsfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFBvd2VyIERvd24gU2F0YSBQb3J0IDAgKi8KfTsKCk1WX09QX1BBUkFNUyBzYXRhUG9ydDFQb3dlclVwUGFyYW1zW10gPQp7CiAgICAvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAgICBtYXNrICAgICAgICAgICAgICBTQVRBIGRhdGEgICAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFNBVEFfVkVORE9SX1BPUlRfMV9SRUdfQUREUiwgIDB4MzgwMDAsICAgICAgICAweEZGRkZGRkZGLCAgICAgeyAweDQ4LCAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEFjY2VzcyB0byByZWcgMHg0OChPT0IgcGFyYW0gMSkgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8xX1JFR19EQVRBLCAgMHgzODAwMCwgICAgICAgIDB4RjAzRiwgICAgICAgICB7IDB4NjAxOCwgICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogT09CIENvbVdha2UgYW5kIENvbVJlc2V0IHNwYWNpbmcgdXBwZXIgbGltaXQgZGF0YSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzFfUkVHX0FERFIsICAweDM4MDAwLCAgICAgICAgMHhGRkZGRkZGRiwgICAgIHsgMHhBLCAgICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBBY2Nlc3MgdG8gcmVnIDB4QShQSFkgQ29udHJvbCkgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8xX1JFR19EQVRBLCAgMHgzODAwMCwgICAgICAgIDB4MzAwMCwgICAgICAgICB7IDB4MCwgICAgICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogUnggY2xrIGFuZCBUeCBjbGsgc2VsZWN0IG5vbi1pbnZlcnRlZCBtb2RlICovCiAgICB7IFNBVEFfQ1RSTF9SRUdfSU5EX0FERFIsICAgICAgIDB4MzgwMDAsICAgICAgICAweEZGRkZGRkZGLCAgICAgeyAweDAsICAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFBvd2VyIERvd24gU2F0YSBhZGRyICovCiAgICB7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgICAgIDB4MzgwMDAsICAgICAgICAweEZGRkZGRjAwLCAgICAgeyAweEM0NDAwMCwgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFBvd2VyIERvd24gU2F0YSBQb3J0IDEgKi8KfTsKCi8qIFNBVEEgYW5kIFNHTUlJIC0gcG93ZXIgdXAgc2VxICovCk1WX09QX1BBUkFNUyBzYXRhQW5kU2dtaWlQb3dlclVwUGFyYW1zW10gPQp7CgkvKiB1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgCW1hc2sgICAgICAgICBTQVRBIGRhdGEgICAgICBTR01JSSBkYXRhICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LCAgICAgICAgICAgMHg5MDAwNiwJeyAweDgwMDAyLAkJMHg4MDAwMiB9LCAJCTAsICAgICAgICAgIDAgICAgICAgfSwgIC8qIFBvd2VyIFVwICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJICAgIDB4NzgwMCwJCXsgMHg2MDAwLAkJMHg2MDAwICB9LCAJCTAsCQkgICAgMCAgICAgICB9LCAgLyogVW5yZXNldCAqLwoJeyBQT1dFUl9BTkRfUExMX0NUUkxfUkVHLAkgCSAgICAweDgwMCwJCSAgICAweDBFMCwJCXsgMHgwLAkJCTB4ODAgICAgfSwgCQkwLAkJICAgIDAgICAgICAgfSwgIC8qIFBoeSBTZWxlY3RvciAqLwogICAgeyBNSVNDX1JFRywJCQkgCQkgICAgICAgIDB4ODAwLAkJICAgIDB4NDQwLAkJeyAweDQ0MCwJICAgIDB4NDAwCX0sICAgICAgMCwJICAgICAgICAwCSAgICB9ICAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KfTsKCi8qIFNBVEEgYW5kIFNHTUlJIC0gc3BlZWQgY29uZmlnIHNlcSAqLwpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXNbXSA9CnsKCS8qIHVuaXRCYXNlUmVnICAJCQkJICAgIHVuaXRPZmZzZXQgIG1hc2sgICAgIAkgU0FUQSBkYXRhICAgICAgU0dNSUkgKDEuMjVHKSAgU0dNSUkgKDMuMTI1Rykgd2FpdFRpbWUgIG51bU9mTG9vcHMgKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsIAkweDI4LAkJMHgzRkMwMDAwMCwJeyAweDg4MDAwMDAsIAkweDE5ODAwMDAwLAkJMHgyMjAwMDAwMCB9LCAJMCwJCSAgIDAgfSwgLyogQmF1ZCBSYXRlICovCgl7IElOVEVSRkFDRV9SRUcsIAkJCQkJMHg4MDAsCSAgICAweEMwMCwJIAl7IDB4ODAwLAkgIAlOT19EQVRBLCAgICAgICAgTk9fREFUQSAgICB9LCAJMCwJICAgICAgIDAgfSwgLyogU2VsZWN0IEJhdWQgUmF0ZSBmb3IgU0FUQSBvbmx5Ki8KCXsgSVNPTEFURV9SRUcsCSAJCQkJCTB4ODAwLAkgICAgMHhGRiwJIAl7IE5PX0RBVEEsIAkJMHg2NiwgICAgICAgICAgIDB4NjYgICAgICAgfSwgCTAsCSAgICAgICAwIH0sIC8qIFBoeSBHZW4gUlggYW5kIFRYICovCgl7IExPT1BCQUNLX1JFRywJIAkJCQkJMHg4MDAsCSAgICAweEUsCSAgICB7IDB4NCwJICAJCTB4MiwgICAJCQkweDIgICAgICAgIH0sIAkwLAkgICAgICAgMCB9ICAvKiBCdXMgV2lkdGggKi8KfTsKCi8qIFNBVEEgYW5kIFNHTUlJIC0gVFggY29uZmlnIHNlcSAqLwpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpVHhDb25maWdQYXJhbXMxW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBTQVRBIGRhdGEgICAgICAgU0dNSUkgZGF0YSAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgR0xVRV9SRUcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLAkJMHgxODAwLCAgICAgeyBOT19EQVRBLCAgICAgIDB4ODAwICAgfSwgICAgICAwLCAgICAgICAgICAgICAgMAkJfSwKCXsgUkVTRVRfREZFX1JFRywJCSAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4NDAxLAkJeyAweDQwMSwgICAgICAgIDB4NDAxICAgfSwgICAgICAwLCAgICAgICAgICAgICAgMAkJfSwgIC8qIFNmdCBSZXNldCBwdWxzZSAqLwoJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgICAgMHg4MDAsCQkweDQwMSwJCXsgMHgwLCAgICAgICAgICAweDAgICAgIH0sICAgICAgMCwJICAgICAgICAgICAgMAkJfSwgIC8qIFNmdCBSZXNldCBwdWxzZSAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCTB4RjAwMDAsCXsgMHg3MDAwMCwgICAgICAweDcwMDAwCX0sICAgICAgMCwJICAgICAgICAgICAgMAkJfSAgIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YVBvcnQwVHhDb25maWdQYXJhbXNbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICAgICAgU0FUQSBkYXRhICAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAweDM4MDAwLAkweEZGRkZGRkZGLCAgICAgeyAweDAgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sICAvKiBQb3dlciBEb3duIFNhdGEgYWRkciovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgMHgzODAwMCwJMHhGRkZGMDBGRiwgICAgIHsgMHhDNDAwMDAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFBvd2VyIERvd24gU2F0YSAgUG9ydCAwICovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0FERFIsICAgMHgzODAwMCwJMHhGRkZGRkZGRiwgICAgIHsgMHg0ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFJlZ3JldCBiaXQgYWRkciovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgMHgzODAwMCwJMHhGRkZGRkZGRiwgICAgIHsgMHg4MCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSAgIC8qIFJlZ3JldCBiaXQgZGF0YSAqLwp9OwoKTVZfT1BfUEFSQU1TIHNhdGFQb3J0MVR4Q29uZmlnUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgdW5pdE9mZnNldCAgbWFzayAgICAgICAgICAgIFNBVEEgZGF0YSAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9BRERSLCAgIDB4MzgwMDAsCTB4RkZGRkZGRkYsICAgICB7IDB4MCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAgLyogUG93ZXIgRG93biBTYXRhIGFkZHIqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9EQVRBLCAgIDB4MzgwMDAsCTB4RkZGRkZGMDAsICAgICB7IDB4QzQwMDAwIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFBvd2VyIERvd24gU2F0YSBQb3J0IDEgKi8KCXsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAweDM4MDAwLAkweEZGRkZGRkZGLCAgICAgeyAweDQgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAJCX0sICAvKiBSZWdyZXQgYml0IGFkZHIqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9EQVRBLCAgIDB4MzgwMDAsCTB4RkZGRkZGRkYsICAgICB7IDB4ODAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSAgIC8qIFJlZ3JldCBiaXQgZGF0YSAqLwp9OwoKTVZfT1BfUEFSQU1TIHNhdGFBbmRTZ21paVR4Q29uZmlnU2VyZGVzUmV2MVBhcmFtczJbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZwkJCQl1bml0T2Zmc2V0CQkgbWFzayAgICAgICAgIFNBVEEgZGF0YSAgICBTR01JSSBkYXRhICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBDT01NT05fUEhZX1NUQVRVUzFfUkVHLAkJCTB4MjgsCSAgICAgMHhDLAkJCXsgMHhDLAkJCTB4QwkgICAgICAgfSwgICAxMCwJICAgICAgICAxMDAwCSAgICB9LCAgLyogV2FpdCBmb3IgUEhZIHBvd2VyIHVwIHNlcXVlbmNlIHRvIGZpbmlzaCAqLwoJeyBDT01NT05fUEhZX1NUQVRVUzFfUkVHLAkJCTB4MjgsCSAgICAgMHgxLAkJCXsgMHgxLAkJCTB4MQkgICAgICAgfSwgICAxLAkgICAgICAgIDEwMDAJICAgIH0gICAvKiBXYWl0IGZvciBQSFkgcG93ZXIgdXAgc2VxdWVuY2UgdG8gZmluaXNoICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYyUGFyYW1zMltdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgICAgIG1hc2sgICAgICAgICBTQVRBIGRhdGEgICAgU0dNSUkgZGF0YSAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywgICAgICAgICAgIDB4MjgsICAgICAgICAweEMsICAgICAgICAgICB7IDB4QywgICAgICAgICAgMHhDICAgICAgICB9LCAgMTAsICAgICAgICAgMTAwMCAgICAgICAgfSwgIC8qIFdhaXQgZm9yIFBIWSBwb3dlciB1cCBzZXF1ZW5jZSB0byBmaW5pc2ggKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsICAgICAgICAweDQwMDAwMDAwLCAgICB7IE5BLCAgICAgICAgICAgMHg0MDAwMDAwMCB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIEFzc2VydCBSeCBJbml0IGZvciBTR01JSSAqLwogICAgeyBJU09MQVRFX1JFRywgICAgICAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgIDB4NDAwLCAgICAgICAgIHsgMHg0MDAsICAgICAgICBOQSAgICAgICAgIH0sICAwLCAgICAgICAgICAwICAgICAgICAgICB9LCAgLyogQXNzZXJ0IFJ4IEluaXQgZm9yIFNBVEEgKi8KICAgIHsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywgICAgICAgICAgIDB4MjgsICAgICAgICAweDEsICAgICAgICAgICB7IDB4MSwgICAgICAgICAgMHgxICAgICAgICB9LCAgMSwgICAgICAgICAgMTAwMCAgICAgICAgfSwgIC8qIFdhaXQgZm9yIFBIWSBwb3dlciB1cCBzZXF1ZW5jZSB0byBmaW5pc2ggKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsICAgICAgICAweDQwMDAwMDAwLCAgICB7IE5BLCAgICAgICAgICAgMHgwICAgICAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIERlLWFzc2VydCBSeCBJbml0IGZvciBTR01JSSAqLwogICAgeyBJU09MQVRFX1JFRywgICAgICAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgIDB4NDAwLCAgICAgICAgIHsgMHgwLCAgICAgICAgICBOQSAgICAgICAgIH0sICAwLCAgICAgICAgICAwICAgICAgICAgICB9LCAgLyogRGUtYXNzZXJ0IFJ4IEluaXQgZm9yIFNBVEEgKi8KICAgIHsgUlhfUkVHMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgICAgICB7IDB4REUsICAgICAgICAgTk9fREFUQSAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIG9zX3BoX29mZnNldF9mb3JjZSAoYWxpZ24gOTApICovCiAgICB7IFJYX1JFRzMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICAgICAgeyAweDEwMCwgICAgICAgIE5PX0RBVEEgICAgfSwgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sICAvKiBTZXQgb3NfcGhfdmFsaWQgKi8KICAgIHsgUlhfUkVHMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4MTAwLCAgICAgICAgICB7IDB4MCwgICAgICAgICAgTk9fREFUQSAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIFVuc2V0IG9zX3BoX3ZhbGlkICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcJCQkJCXVuaXRPZmZzZXQJIG1hc2sJCVNBVEEgZGF0YQkJd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT040X1JFRywJMHgyOCwJICAgIDB4NDAwMDA4LAl7IDB4NDAwMDAwLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBlbmFibGUgU1NDIGFuZCBERkUgdXBkYXRlIGVuYWJsZSAqLwoJeyBWVEhJTVBDQUxfQ1RSTF9SRUcsCQkJCTB4ODAwLAkgICAgMHhGRjAwLAkJeyAweDQwMDAsCX0sICAgCTAsCQkJMAkJfSwgIC8qIHR4aW1wY2FsX3RoIGFuZCByeGltcGNhbF90aCAqLwoJeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywJCQkweDgwMCwJICAgIDB4RkZGLAkJeyAweDZDRiwJfSwgICAJMCwJCQkwCQl9LCAgLyogU1FfVEhSRVNIIGFuZCBGRkUgU2V0dGluZyAqLwoJeyBHMV9TRVRUSU5HU18wX1JFRywJCQkJMHg4MDAsCSAgICAweEZGRkYsCQl7IDB4OEEzMiwJfSwgICAJMCwJCQkwCQl9LCAgLyogRzFfVFggU0xFVywgRU1QSDEgYW5kIEFNUCAqLwoJeyBHMV9TRVRUSU5HU18xX1JFRywJCQkJMHg4MDAsCSAgICAweDNGRiwJCXsgMHgzQzksCX0sICAgCTAsCQkJMAkJfSwgIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KCXsgRzJfU0VUVElOR1NfMF9SRUcsCQkJCTB4ODAwLAkgICAgMHhGRkZGLAkJeyAweDhCNUMsCX0sICAgCTAsCQkJMAkJfSwgIC8qIEcyX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkJCTB4ODAwLAkgICAgMHgzRkYsCQl7IDB4M0QyLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IEczX1NFVFRJTkdTXzBfUkVHLAkJCQkweDgwMCwJICAgIDB4RkZGRiwJCXsgMHhFNkUsCX0sICAgCTAsCQkJMAkJfSwgIC8qIEczX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KCXsgRzNfU0VUVElOR1NfMV9SRUcsCQkJCTB4ODAwLAkgICAgMHgzRkYsCQl7IDB4M0QyLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBHM19SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IENBTF9SRUc2LAkJCQkJCQkweDgwMCwJICAgIDB4RkYwMCwJCXsgMHhERDAwLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBDYWwgcnhjbGthbGlnbjkwIGV4dCBlbmFibGUgYW5kIENhbCBvcyBwaCBleHQgKi8KCXsgUlhfUkVHMiwJCQkJCQkJMHg4MDAsCSAgICAweEYwLAkJeyAweDcwLAkJfSwgICAJMCwJCQkwCQl9LCAgLyogRHRsIENsYW1waW5nIGRpc2FibGUgYW5kIER0bCBjbGFtcGluZyBTZWwoNjAwMHBwbSkgKi8KfTsKCgpNVl9PUF9QQVJBTVMgc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7Ci8qIHVuaXR1bml0QmFzZVJlZwkJCSAgICB1bml0T2Zmc2V0CSAgbWFzawkJU0FUQSBkYXRhCSAgICB3YWl0VGltZSBudW1PZkxvb3BzICovCiAgICB7IFNRVUVMQ0hfRkZFX1NFVFRJTkdfUkVHLAkJCTB4ODAwLCAgICAweEYwMCwJeyAweDYwMAkJfSwgCTAsCSAgICAwCX0sICAvKiBTUV9USFJFU0ggYW5kIEZGRSBTZXR0aW5nICovCiAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjRfUkVHLAkJMHgyOCwJICAweDQwMDAwOCwJeyAweDQwMDAwMAl9LCAJMCwJICAgIDAJfSwgIC8qIGVuYWJsZSBTU0MgYW5kIERGRSB1cGRhdGUgZW5hYmxlICovCiAgICB7IEcxX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweDhBMzIJfSwJMCwJICAgIDAJfSwgIC8qIEcxX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzFfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHgzRkYsCXsgMHgzQzkJCX0sCTAsCSAgICAwCX0sICAvKiBHMV9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcyX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweDhCNUMJfSwJMCwJICAgIDAJfSwgIC8qIEcyX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzJfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHgzRkYsCXsgMHgzRDIJCX0sCTAsCSAgICAwCX0sICAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEczX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweEU2RQkJfSwJMCwJICAgIDAJfSwgIC8qIEczX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzNfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHg0N0ZGLAl7IDB4N0QyCQl9LAkwLAkgICAgMAl9LCAgLyogRzNfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAmIERGRV9FbiBHZW4zLCBEQyB3YW5kZXIgY2FsaWJyYXRpb24gZGlzICovCiAgICB7IFBDSUVfUkVHMCwgICAgICAgIAkJCTB4ODAwLCAgICAweDEwMDAsCXsgMHgwCQl9LAkwLAkgICAgMCAgIH0sICAvKiBCaXRbMTJdPTB4MCCWIGlkbGVfc3luY19lbiAqLwogICAgeyBSWF9SRUcyLCAgICAgICAgICAJCQkweDgwMCwgICAgMHhGMCwJCXsgMHg3MCwJCX0sCTAsCSAgICAwICAgfSwgIC8qIER0bCBDbGFtcGluZyBkaXNhYmxlIGFuZCBEdGwgY2xhbXBpbmcgU2VsKDYwMDBwcG0pICovCiAgICB7IFZUSElNUENBTF9DVFJMX1JFRywJCQkweDgwMCwJICAweEZGMDAsCXsgMHgzMDAwCX0sCTAsCSAgICAwCX0sIC8qIHR4aW1wY2FsX3RoIGFuZCByeGltcGNhbF90aCAqLwogICAgeyBERkVfUkVHMCwgICAgICAgICAJCQkweDgwMCwgICAgMHhBMDBGLAl7IDB4ODAwQQl9LAkwLAkgICAgMCAgIH0sIC8qIERGRV9TVEVQX0ZJTkVfRlhbMzowXSA9MHhBICovCiAgICB7IERGRV9SRUczLCAgICAgICAgICAJCQkweDgwMCwJICAweEMwMDAsCXsgMHgwCQl9LAkwLAkgICAgMCAgIH0sIC8qIERGRV9FTiBhbmQgRGlzIFVwZGF0ZSBjb250cm9sIGZyb20gcGluIGRpc2FibGUgKi8KICAgIHsgRzFfU0VUVElOR1NfM19SRUcsCQkJMHg4MDAsCSAgMHhGRiwJCXsgMHhDRgkJfSwJMCwJICAgIDAJfSwgLyogRkZFIEZvcmNlIEZGRV9SRXMgYW5kIGNhcCBzZXR0aW5ncyBmb3IgR2VuMSAqLwogICAgeyBHMl9TRVRUSU5HU18zX1JFRywJCQkweDgwMCwJICAweEZGLAkJeyAweEJGCQl9LAkwLAkgICAgMAl9LCAvKiBGRkUgRm9yY2UgRkZFX1JFcyBhbmQgY2FwIHNldHRpbmdzIGZvciBHZW4yICovCiAgICB7IEczX1NFVFRJTkdTXzNfUkVHLAkJCTB4ODAwLAkgIDB4RkYsCQl7IDB4Q0YJCX0sCTAsCSAgICAwCX0sIC8qIEZFIEZvcmNlIEZGRV9SRXM9NCBhbmQgY2FwIHNldHRpbmdzIGZvciBHZW4zbiAqLwogICAgeyBHM19TRVRUSU5HU180X1JFRywJCQkweDgwMCwJICAweDMwMCwJeyAweDMwMAkJfSwJMCwJICAgIDAJfSwgLyogU2V0IERGRSBHZW4gMyBSZXNvbHV0aW9uIHRvIDMgKi8KCn07CgpNVl9PUF9QQVJBTVMgc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtc1tdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFNHTUlJICgxLjI1RykgIFNHTUlJICgzLjEyNUcpICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzksICAgICAgICAweDNDOSAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzFfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAqLwogICAgeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywgIDB4ODAwLCAgICAgIDB4RkZGLCAgICAgIHsgMHg4RiwgICAgICAgICAweEJGICAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogU1FfVEhSRVNIIGFuZCBGRkUgU2V0dGluZyAqLwogICAgeyBWVEhJTVBDQUxfQ1RSTF9SRUcsICAgICAgIDB4ODAwLCAgICAgIDB4RkYwMCwgICAgIHsgMHg0MDAwLCAgICAgICAweDQwMDAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogdHhpbXBjYWxfdGggYW5kIHJ4aW1wY2FsX3RoICovCn07CgpNVl9PUF9QQVJBTVMgc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtc1tdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFNHTUlJICgxLjI1RykgIFNHTUlJICgzLjEyNUcpICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18wX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RkZGRiwgICAgIHsgMHg4RkEsICAgICAgICAweDhGQSAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogU2V0IFNsZXdSYXRlLCBFbXBoIGFuZCBBbXAgKi8KICAgIHsgRzFfU0VUVElOR1NfMV9SRUcsICAgICAgICAweDgwMCwgICAgICAweDNGRiwgICAgICB7IDB4M0M5LCAgICAgICAgMHgzQzkgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KICAgIHsgUlhfUkVHMiwgICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDQsICAgICAgICB7IDB4MCwgICAgICAgICAgMHgwICAgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIERUTF9GTE9PUF9FTiAqLwogICAgeyBHMV9TRVRUSU5HU18zX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHg4RiwgICAgICAgICAweEJGICAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzEgRkZFIFNldHRpbmcgRm9yY2UsIFJFUyBhbmQgQ0FQICovCiAgICB7IFZUSElNUENBTF9DVFJMX1JFRywgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweDMwMDAsICAgICAgIDB4MzAwMCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KfTsKCi8qKioqKioqKioqKioqKioqLwovKiBQRVggYW5kIFVTQjMgKi8KLyoqKioqKioqKioqKioqKiovCgovKiBQRVggYW5kIFVTQjMgLSBwb3dlciB1cCBzZXEgZm9yIFNlcmRlcyBSZXYgMS4yICovCk1WX09QX1BBUkFNUyBwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXNbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAgICBtYXNrICAgICAgICAgICAgUEVYIGRhdGEgICAgICAgIFVTQjMgZGF0YSAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJCTB4M0ZDN0Y4MDYsICAgICB7IDB4NDQ3MTgwNCwgICAgMHg0NDc5ODA0ICAgfSwgICAgICAwLCAgICAgICAgICAwCSAgICB9LAoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04yX1JFRywgICAgMHgyOCwJCQkweDVDLAkJICAgIHsgMHg1OCwJCSAgICAweDU4ICAgICAgICB9LAkgICAgMCwgICAgICAgICAgMAkgICAgfSwKCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCQkJMHgzLAkJCXsgMHgxLAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCQkweDc4MDAsCQkJeyAweDYwMDAsCSAgICAweEUwMDAgICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKCXsgR0xPQkFMX0NMS19DVFJMLAkJCQkgICAgMHg4MDAsCQkJMHhELAkJCXsgMHg1LAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsICAgICAgICAgIDB4NEMwLAkgICAgIAl7IDB4ODAsICAgICAgICAgMHg0QzAgCSAgICB9LCAJICAgIDAsCSAgICAgICAgMCAgICAgICB9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLwp9OwoKLyogUEVYIGFuZCBVU0IzIC0gcG93ZXIgdXAgc2VxIGZvciBTZXJkZXMgUmV2IDIuMSAqLwpNVl9PUF9QQVJBTVMgcGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYyUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgICAgbWFzayAgICAgICAgICAgIFBFWCBkYXRhICAgICAgICBVU0IzIGRhdGEgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJMHgzRkM3RjgwNiwgICAgIHsgMHg0NDcxODA0LCAgICAweDQ0Nzk4MDQgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMl9SRUcsICAgIDB4MjgsCTB4NUMsCQl7IDB4NTgsCQkgICAgMHg1OCAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCTB4MywJCXsgMHgxLAkJICAgIDB4MSAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkweDc4MDAsCQl7IDB4NjAwMCwJICAgIDB4RTAwMCAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCgl7IEdMT0JBTF9DTEtfQ1RSTCwJCSAgICAweDgwMCwJMHgzRCwJCXsgMHgzNSwJCSAgICAweDIxICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBHTE9CQUxfTUlTQ19DVFJMLAkJICAgIDB4ODAwLAkweEMwLAkJeyAweDAsCQkgICAgTk9fREFUQSB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKCXsgTUlTQ19SRUcsCSAgIAkJICAgIDB4ODAwLCAgIAkweDRDMCwJCXsgMHg4MCwJCSAgICAweDRDMCAgIH0sCQkwLAkgICAgMAkgICAgfSAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KfTsKCi8qIFBFWCBhbmQgVVNCMyAtIHNwZWVkIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNTcGVlZENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgdW5pdE9mZnNldCAgIG1hc2sgICAgICAgICAgICBQRVggZGF0YSAgICAgICAgICAgICAgICAgICAgVVNCMyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNSAgICAgICAgIDUgICAgICAgICAgICAgICBIT1NUICAgICAgICAgICAgREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJeyBJTlRFUkZBQ0VfUkVHLCAweDgwMCwJICAgMHhDMDAsCSAgeyAweDQwMCwgMHg0MDAsICAgMHg0MDAsICAgMHg0MDAsICAgMHg0MDAgICB9LCAwLAkJICAwCQkgIH0sIC8qIE1heGltYWwgUEhZIEdlbmVyYXRpb24gU2V0dGluZyAqLwp9OwoKTVZfT1BfUEFSQU1TIHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtc1tdID0KewoJeyBMQU5FX0NGRzRfUkVHLAkJCTB4ODAwLAkJMHg4MCwJCXsgMHg4MCAgICAgIH0sCQkwLAkJCTAJIAl9LCAvKiBTcHJlYWQgU3BlY3RydW0gQ2xvY2sgRW5hYmxlICovCgl7IEcyX1NFVFRJTkdTXzJfUkVHLAkJMHg4MDAsCQkweEZFNDAsCQl7IDB4NDQ0MCAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEcyX1RYX1NTQ19BTVBbNjowXT00LjVrUFBNIGFuZCBUWCBlbXBoYXNpcyBtb2RlPW1WICovCgl7IFZUSElNUENBTF9DVFJMX1JFRywJCTB4ODAwLAkJMHhGRjAwLAkJeyAweDQwMDAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkweDgwMCwJCTB4M0ZGLAkJeyAweDNEMiAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IFNRVUVMQ0hfRkZFX1NFVFRJTkdfUkVHLAkweDgwMCwJCTB4RkYsCQl7IDB4RUYgICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwoJeyBSWF9SRUcyLAkJCQkgCTB4ODAwLAkJMHhGMCwJCXsgMHg3MCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogRHRsIENsYW1waW5nIGRpc2FibGUgYW5kIER0bC1jbGFtcGluZy1TZWwoNjAwMHBwbSkgKi8KCXsgQ0FMX1JFRzYsCQkgCQkJMHg4MDAsCQkweEZGMDAsCQl7IDB4RDUwMCAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIGNhbF9yeGNsa2FsaWduOTBfZXh0X2VuIGFuZCBjYWxfb3NfcGhfZXh0ICovCgl7IFJFRl9SRUcwLAkJIAkJCTB4ODAwLAkJMHgzOCwJCXsgMHgyMCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogdmNvX2NhbF92dGhfc2VsICovCn07CgpNVl9PUF9QQVJBTVMgdXNiM0VsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7Cgl7IExBTkVfQ0ZHNF9SRUcsCQkweDgwMCwJCTB4QzIsCQl7IDB4QzAJCX0sCTAsCTAgCX0sIC8qIEJpdFs3XT0weDEgLSBTcHJlYWQgU3BlY3RydW0gQ2xvY2sgRW5hYmxlLEJpdFs2XS0weDEtIENGR19ERkVfT1ZFUlJJREUsQml0WzFdLTB4MC1QSU5fREZFX1BBVF9ESVMsICovCgl7IExBTkVfQ0ZHNV9SRUcsCQkweDgwMCwJCTB4MywJCXsgMHgzCQl9LAkJMCwJMCAJfSwgLyogQml0WzFdPTB4MSAtIENGR19TUV9ERVRfU0VMLEJpdFswXT0weDEtQ0ZHX1JYX0lOSVRfU0VMLCAqLwoJeyBHMl9TRVRUSU5HU18yX1JFRywJCTB4ODAwLAkJMHhGRTQwLAkJeyAweDQ0NDAJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1sxNTo5XT0gMHgyMiAtRzJfVFhfU1NDX0FNUFs2OjBdPTQuNWtQUE0sQml0c1s2XSA9IDB4MSAtIFRYIGVtcGhhc2lzIG1vZGU9bVYgKi8KCXsgRzJfU0VUVElOR1NfM19SRUcsCQkweDgwMCwJCTB4RkYsCQl7IDB4RUYJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdFs3XSA9MHgxIJYgRkZFIFNldHRpbmcgRm9yY2U7Qml0c1s2OjRdPTB4NiCWIEZGRV9SRVM7Qml0c1szOjBdID0gMHhGIJYgRkZFX0NBUDsgKi8KCXsgRzJfU0VUVElOR1NfNF9SRUcsCQkweDgwMCwJCTB4MzAwLAkJeyAweDMwMAkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s5OjhdPTB4MCAtICBHMl9ERkVfUkVTWzE6MF0qLwoJeyBQTExJTlRQX1JFRzEsCSAgICAgICAgCTB4ODAwLAkJMHgzMDAsCQl7IDB4MzAwCQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzk6OF09MHgzIJYgSFBGX0J3WzE6MF0gKi8KCXsgVlRISU1QQ0FMX0NUUkxfUkVHLAkJMHg4MDAsCQkweEZGMDAsCQl7IDB4MzAwMAl9LAkJMCwJMCAJfSwgLyogQml0c1sxNToxMl09IDB4MyAtIHR4aW1wY2FsX3RoO0JpdHNbMTE6OF0gPSAweDAgLSBSWElNUENBTF9USCAqLwoJeyBMQU5FX0NGRzVfUkVHLAkJMHg4MDAsCQkweDMsCQl7IDB4MwkJfSwJCTAsCTAgCX0sIC8qIEJpdFsxXT0weDEgLSBDRkdfU1FfREVUX1NFTCxCaXRbMF09MHgxLUNGR19SWF9JTklUX1NFTCwgKi8KCXsgTUlTQ19SRUcsCSAgICAgICAgICAgIAkweDgwMCwJCTB4NDJGLAkJeyAweDQyQQkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0WzEwXT0weDEgLSBSRUZDTEtfU0VMKD0yNU1oeik7Qml0WzVdPTB4MSCWIElDUF9GT1JDRV9FbjtCaXRzWzM6MF09MHhBIJYgSUNQPTB4QSgyMTB1QSk7ICovCgl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCTB4ODAwLAkJMHgxRiwJCXsgMHgwMgkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s0OjBdID0weDIgLSBSRUZfRlJFRl9TRUwoPTI1TWh6KSAqLwoJeyBHMl9TRVRUSU5HU18xX1JFRywJCTB4ODAwLAkJMHgzRkYsCQl7IDB4M0QyCQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzk6OF09MHgzLSBHMl9SWF9TRUxNVUZGO0JpdHNbNzo2XT0weDMtIEcyX1JYX1NFTE1VRkk7Qml0c1s1OjNdPTB4MiCWIEcyX1JYX1NFTE1VUEY7Qml0c1syOjBdPTB4MiAtICBHMl9SWF9TRUxNVVBJKi8KCXsgUlhfUkVHMiwJCQkweDgwMCwJCTB4RjAsCQl7IDB4NzAJCX0sCQkwLCAgICAgIDAgCX0sIC8qIER0bCBDbGFtcGluZyBkaXNhYmxlIGFuZCBEdGwtY2xhbXBpbmctU2VsKDYwMDBwcG0pICovCgl7IFBDSUVfUkVHMSwJCQkweDgwMCwJCTB4RjgwLAkJeyAweEQwMAkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1sxMTo3XT0weDFhIC0gIHR4X2FtcF9waXBlX3YwWzQ6MF0gKi8KCXsgUkVGX1JFRzAsCQkgCTB4ODAwLAkJMHgzOCwJCXsgMHgyMAkJfSwJCTAsICAgICAgMCAJfSwgLyogdmNvX2NhbF92dGhfc2VsICovCgl7IExBTkVfQ0ZHMF9SRUcsCQkweDgwMCwJCTB4MSwJCXsgMHgxCQl9LAkJMCwJMCAJfSwgLyogQml0WzBdPTB4MS0gUFJEX1RYREVFTVBIMCAqLwoJeyBHTE9CQUxfVEVTVF9DVFJMLAkJMHg4MDAsCQkweDQsCQl7IDB4NAkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0WzRdPTB4MS1NT0RFX01BUkdJTl9PVkVSUklERSAqLwoKfTsKLyogUEVYIGFuZCBVU0IzIC0gVFggY29uZmlnIHNlcSAqLwoKLyogRm9yIFBFWHgxOiB0aGUgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMS8yLzMgY29uZmlndXJhdGlvbnMgc2hvdWxkIHJ1bgoJCQkgIG9uZSBieSBvbmUgb24gdGhlIGxhbmUuCiAgIEZvciBQRVh4NDogdGhlIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczEvMi8zIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBydW4KCQkJICBieSBzZXR0aW5nIGVhY2ggc2VxdWVuY2UgZm9yIGFsbCA0IGxhbmVzLiAqLwpNVl9PUF9QQVJBTVMgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMVtdID0KewogICAgLyogdW5pdEJhc2VSZWcgICAgdW5pdE9mZnNldCAgICBtYXNrICAgICAgICBQRVggZGF0YSAgICBVU0IzIGRhdGEgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IEdMT0JBTF9DTEtfQ1RSTCwgIDB4ODAwLCAgICAgIDB4MSwgICAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sCiAgICB7IDB4MCwgICAgICAgICAgICAgIDB4MCwgICAgICAgIDB4MCwgICAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgICAgICAxMCwgICAgICAgICAwICAgICAgIH0sIC8qIDEwbXMgZGVsYXkgKi8KfTsKCk1WX09QX1BBUkFNUyBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMyW10gPQp7CgkvKiB1bml0QmFzZVJlZyAgICB1bml0T2Zmc2V0ICAgCW1hc2sgICAgICAgIFBFWCBkYXRhICAgIFVTQjMgZGF0YSAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgUkVTRVRfREZFX1JFRywgICAJMHg4MDAsCSAgICAweDQwMSwgICAgICB7IDB4NDAxLCAgICAweDQwMSAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBTZnQgUmVzZXQgcHVsc2UgKi8KfTsKCk1WX09QX1BBUkFNUyBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMzW10gPQp7CgkvKiB1bml0QmFzZVJlZyAgICB1bml0T2Zmc2V0ICAgCW1hc2sgICAgICAgIFBFWCBkYXRhICAgIFVTQjMgZGF0YSAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgUkVTRVRfREZFX1JFRywgICAgMHg4MDAsCTB4NDAxLCAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwJMCwgICAgICAgICAgMAkJfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCgl7IDB4MCwJCSAgICAweDAsCTB4MCwJICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgCTEwLAkgICAgMAkJfSwgLyogMTBtcyBkZWxheSAqLwoJeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweEZGLCAgICAgICB7IDB4REMsICAgICAweEQ4ICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgLyogb3NfcGhfb2Zmc2V0X2ZvcmNlIChhbGlnbiA5MCkgKi8KCXsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHgxMDAsICAgICAgeyAweDEwMCwgICAgMHgxMDAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sIC8qIFNldCBvc19waF92YWxpZCAqLwoJeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgLyogVW5zZXQgb3NfcGhfdmFsaWQgKi8KfTsKCi8qIFBFWCBieSA0IGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHBleEJ5NENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnICAgICAgdW5pdE9mZnNldCAgIG1hc2sgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgCQkJd2FpdFRpbWUgICBudW1PZkxvb3BzICovCgl7IEdMT0JBTF9DTEtfU1JDX0hJLAkweDgwMCwgICAgICAgMHg3LCAgICAgIHsgMHg1LCAweDAsIDB4MCwgMHgyIAkJCX0sICAgICAJMCwJCTAgICAgICAgfSwKCXsgTEFORV9BTElHTl9SRUcwLCAgICAgIDB4ODAwLCAgICAgICAweDEwMDAsICAgeyAweDAsIDB4MCwgMHgwLCAweDAgCQkJfSwgICAgIAkwLAkJMCAgICAgICB9LCAvKiBMYW5lIEFsaWduZW1lbnQgZW5hYmxlICovCgl7IENBTElCUkFUSU9OX0NUUkxfUkVHLAkweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwCQl9LAkwLAkgICAgICAgIDAgICAgICAgfSwgLyogTWF4IFBMTCBwaHkgY29uZmlnICovCgl7IExBTkVfQ0ZHMV9SRUcsCTB4ODAwLCAgICAgICAweDYwMCwgICAgeyAweDYwMCwgMHg2MDAsIDB4NjAwLCAweDYwMCAJCX0sCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBpcGUgY29uZmlnICovCn07CgovKiBVU0IzIGRldmljZSBkb25maWcgc2VxICovCk1WX09QX1BBUkFNUyB1c2IzRGV2aWNlQ29uZmlnUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgIHVuaXRPZmZzZXQgIG1hc2sgICAgZGF0YSAgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBMQU5FX0NGRzRfUkVHLCAgICAweDgwMCwgICAgICAweDIwMCwgIHsgMHgyMDAgfSwgIAkwLCAgICAgICAgICAwICAgICAgIH0KfTsKCi8qIFBFWCAtIGVsZWN0cmljYWwgY29uZmlndXJhdGlvbiBzZXEgUmV2IDEuMiAqLwpNVl9PUF9QQVJBTVMgcGV4RWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXNbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IEcxX1NFVFRJTkdTXzBfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGMDAwLCAgICAgeyAweEIwMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1RYX1NMRVdfQ1RSTF9FTiBhbmQgRzFfVFhfU0xFV19SQVRFICovCiAgICB7IEcxX1NFVFRJTkdTXzFfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHgzRkYsICAgICAgeyAweDNDOSAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KICAgIHsgRzJfU0VUVElOR1NfMV9SRUcsICAgICAgICAweDgwMCwgICAgICAweDNGRiwgICAgICB7IDB4M0M5ICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzJfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAqLwogICAgeyBMQU5FX0NGRzRfUkVHLCAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4OCwgICAgICAgIHsgMHg4ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBDRkdfREZFX0VOX1NFTCAqLwogICAgeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHhBRiAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBGRkUgU2V0dGluZyBGb3JjZSwgUkVTIGFuZCBDQVAgKi8KICAgIHsgVlRISU1QQ0FMX0NUUkxfUkVHLCAgICAgICAweDgwMCwgICAgICAweEZGMDAsICAgICB7IDB4MzAwMCAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogdHhpbXBjYWxfdGggYW5kIHJ4aW1wY2FsX3RoICovCiAgICB7IENBTF9SRUc2LCAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweERDMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIGNhbF9yeGNsa2FsaWduOTBfZXh0X2VuIGFuZCBjYWxfb3NfcGhfZXh0ICovCn07CgovKiBQRVggLSBlbGVjdHJpY2FsIGNvbmZpZ3VyYXRpb24gc2VxIFJldiAyLjEgKi8KTVZfT1BfUEFSQU1TIHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7CiAgICAvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgdW5pdE9mZnNldCAgbWFzayAgICAgICAgUEVYIGRhdGEgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18wX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RjAwMCwgICAgIHsgMHhCMDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMV9UWF9TTEVXX0NUUkxfRU4gYW5kIEcxX1RYX1NMRVdfUkFURSAqLwogICAgeyBHMV9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzkgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMV9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcxX1NFVFRJTkdTXzNfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweENGICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwogICAgeyBHMl9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzkgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcyX1NFVFRJTkdTXzNfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweEFGICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcyIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwogICAgeyBHMl9TRVRUSU5HU180X1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4MzAwLCAgICAgIHsgMHgzMDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMiBERkUgcmVzb2x1dGlvbiB2YWx1ZSAqLwogICAgeyBERkVfUkVHMCwgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4ODAwMCwgICAgIHsgMHg4MDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBERkUgcmVzb2x1dGlvbiBmb3JjZSAqLwogICAgeyBQQ0lFX1JFRzEsICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4RjgwLCAgICAgIHsgMHhEMDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBUeCBhbXBsaXR1ZGUgZm9yIFR4IE1hcmdpbiAwICovCiAgICB7IFBDSUVfUkVHMywgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweEFGMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFR4X0VtcGggdmFsdWUgZm9yIC0zLjVkQiBhbmQgLTZkQiAqLwogICAgeyBMQU5FX0NGRzRfUkVHLCAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4OCwgICAgICAgIHsgMHg4ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBDRkdfREZFX0VOX1NFTCAqLwogICAgeyBWVEhJTVBDQUxfQ1RSTF9SRUcsICAgICAgIDB4ODAwLCAgICAgIDB4RkYwMCwgICAgIHsgMHgzMDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KfTsKCi8qIFBFWCAtIGNvbmZpZ3VyYXRpb24gc2VxIGZvciBSRUZfQ0xPQ0tfMjVNSHogKi8KTVZfT1BfUEFSQU1TIHBleENvbmZpZ1JlZkNsb2NrMjVNSHpbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsICAgMHg4MDAsICAgICAgMHgxRiwgICAgICAgeyAweDIgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s0OjBdPTB4MiAtIFJFRl9GUkVGX1NFTCAqLwogICAgeyBNSVNDX1JFRywgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4NDAwLCAgICAgIHsgMHg0MDAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEJpdFsxMF09MHgxICAgLSBSRUZDTEtfU0VMICovCiAgICB7IEdMT0JBTF9QTV9DVFJMLCAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweDcgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s3OjBdPTB4NyAtIENGR19QTV9SWERMT1pfV0FJVCAqLwp9OwoKLyogUEVYIC0gY29uZmlndXJhdGlvbiBzZXEgZm9yIFJFRl9DTE9DS180ME1IeiAqLwpNVl9PUF9QQVJBTVMgcGV4Q29uZmlnUmVmQ2xvY2s0ME1IeltdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgIG1hc2sgICAgICAgIFBFWCBkYXRhICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgUE9XRVJfQU5EX1BMTF9DVFJMX1JFRywgICAweDgwMCwgICAgICAweDFGLCAgICAgICB7IDB4MyAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzQ6MF09MHgzIC0gUkVGX0ZSRUZfU0VMICovCiAgICB7IE1JU0NfUkVHLCAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHg0MDAsICAgICAgeyAweDQwMCB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1sxMF09MHgxICAtIFJFRkNMS19TRUwgKi8KICAgIHsgR0xPQkFMX1BNX0NUUkwsICAgICAgICAgICAweDgwMCwgICAgICAweEZGLCAgICAgICB7IDB4QyAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzc6MF09MHhDIC0gQ0ZHX1BNX1JYRExPWl9XQUlUICovCn07CgovKiBQRVggLSBjb25maWd1cmF0aW9uIHNlcSBmb3IgUkVGX0NMT0NLXzEwME1IeiAqLwpNVl9PUF9QQVJBTVMgcGV4Q29uZmlnUmVmQ2xvY2sxMDBNSHpbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsICAgMHg4MDAsICAgICAgMHgxRiwgICAgICAgeyAweDAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s0OjBdPTB4MCAgLSBSRUZfRlJFRl9TRUwgKi8KICAgIHsgTUlTQ19SRUcsICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDQwMCwgICAgICB7IDB4MCAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRbMTBdPTB4MCAgICAtIFJFRkNMS19TRUwgKi8KICAgIHsgR0xPQkFMX1BNX0NUUkwsICAgICAgICAgICAweDgwMCwgICAgICAweEZGLCAgICAgICB7IDB4MUUgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzc6MF09MHgxRSAtIENGR19QTV9SWERMT1pfV0FJVCAqLwp9OwoKLyoqKioqKioqKioqKioqKioqLwovKiAgICBVU0IyICAgICAgICovCi8qKioqKioqKioqKioqKioqKi8KCk1WX09QX1BBUkFNUyB1c2IyUG93ZXJVcFBhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFVTQjIgZGF0YSAgd2FpdFRpbWUgIG51bU9mTG9vcHMgKi8KCXsgMHgxODQ0MCAsICAgICAgICAweDAgLypOQSovLAkweGZmZmZmZmZmLCB7MHg2Mn0sICAgICAgIDAsICAgICAgICAwfSwgLyogSW5pdCBwaHkgMCAqLwoJeyAweDE4NDQ0ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZmZmZmZmZmYsIHsweDYyfSwgICAgICAgMCwgICAgICAgIDB9LCAvKiBJbml0IHBoeSAxICovCgl7IDB4MTg0NDggLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4NjJ9LCAgICAgICAwLCAgICAgICAgMH0sIC8qIEluaXQgcGh5IDIgKi8KCXsgMHhDMDAwMCAsICAgICAgICAweDAgLypOQSovLAkweGZmZmZmZmZmLCB7MHg0MDYwNTIwNX0sIDAsICAgICAgICAwfSwgLyogUGh5IG9mZnNldCAweDAgLSBQTExfQ09OVFJPTDAgICovCgl7IDB4QzAwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzIwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzQwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzAwMDQgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxLCAgICAgICAgezB4MX0sICAgICAgICAwLCAgICAgICAgMH0sIC8qIFBoeSBvZmZzZXQgMHgxIC0gUExMX0NPTlRST0wxICovCgl7IDB4QzAwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxMDAwMDAwLCAgezB4MTAwMDAwMH0sICAwLCAgICAgICAgMH0sIC8qIFBoeTAgcmVnaXN0ZXIgMyAgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAqLwoJeyAweEMyMDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4MTAwMDAwMCwgIHsweDEwMDAwMDB9LCAgMCwgICAgICAgIDB9LCAvKiBQaHkwIHJlZ2lzdGVyIDMgIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgKi8KCXsgMHhDNDAwQyAsICAgICAgICAweDAgLypOQSovLAkweDEwMDAwMDAsICB7MHgxMDAwMDAwfSwgIDAsICAgICAgICAwfSwgLyogUGh5MCByZWdpc3RlciAzICAtIFRYIENoYW5uZWwgY29udHJvbCAwICovCgl7IDB4QzAwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDgwMDAwMCwgezB4ODA4MDAwMDB9LCAxLCAgICAgMTAwMH0sIC8qIGNoZWNrIFBMTENBTF9ET05FIGlzIHNldCBhbmQgSU1QQ0FMX0RPTkUgaXMgc2V0Ki8KCXsgMHhDMDAxOCAsICAgICAgICAweDAgLypOQSovLAkweDgwMDAwMDAwLCB7MHg4MDAwMDAwMH0sIDEsICAgICAxMDAwfSwgLyogY2hlY2sgUkVHX1NRQ0FMX0RPTkUgIGlzIHNldCovCgl7IDB4QzAwMDAgLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDAwMDAwMCwgezB4ODAwMDAwMDB9LCAxLCAgICAgMTAwMH0gIC8qIGNoZWNrIFBMTF9SRUFEWSAgaXMgc2V0Ki8KfTsKCi8qKioqKioqKioqKioqKioqKi8KLyogICAgUVNHTUlJICAgICAqLwovKioqKioqKioqKioqKioqKiovCgovKiBRU0dNSUkgLSBwb3dlciB1cCBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRQb3dlclVwUGFyYW1zW10gPQp7CgkvKiB1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgICAgdW5pdE9mZnNldCAgIAltYXNrICAgICAgICAgUVNHTUlJIGRhdGEJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwoJeyBRU0dNSUlfQ09OVFJPTF9SRUcxLAkJCQkweDAsICAJCTB4NDAwMDAwMDAsCXsgMHg0MDAwMDAwMAl9LCAJICAgMCwJCSAgMCB9LAkgIC8qIENvbm5lY3QgdGhlIFFTR01JSSB0byBHaWdhYml0IEV0aGVybmV0IHVuaXRzICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LCAgCQkweEYwMDA2LAl7IDB4ODAwMDIJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogUG93ZXIgVXAgKi8KCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsCTB4MjgsCQkweDc4MDAsCSAgICB7IDB4NjAwMAkJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBVbnJlc2V0ICovCgl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCQkJMHg4MDAsCQkweEZGLAkgICAgeyAweEZDODEJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogUGh5IFNlbGVjdG9yICovCgl7IE1JU0NfUkVHLAkJCQkJCQkweDgwMCwJICAgIDB4NEMwLAkgICAgeyAweDQ4MAkJCX0sICAgICAwLAkgICAgICAwIH0gCSAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KfTsKCi8qIFFTR01JSSAtIHNwZWVkIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRTcGVlZENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdEJhc2VSZWcgIAkJCQkgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgICBRU0dNSUkJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwogICAgeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAweDI4LAkJMHgzRkMwMDAwMCwJeyAweENDMDAwMDAJfSwgCQkwLAkJICAgMCB9LCAvKiBCYXVkIFJhdGUgKi8KCXsgSVNPTEFURV9SRUcsCSAJCQkJICAgMHg4MDAsCSAgICAweEZGLAkgICAgeyAweDMzCQl9LCAJCTAsCSAgICAgICAwIH0sIC8qIFBoeSBHZW4gUlggYW5kIFRYICovCgl7IExPT1BCQUNLX1JFRywJIAkJCQkgICAweDgwMCwJICAgIDB4RSwJICAgIHsgMHgyCQl9LCAJCTAsCSAgICAgICAwIH0gIC8qIEJ1cyBXaWR0aCAqLwp9OwoKLyogUVNHTUlJIC0gU2VsZWN0IGVsZWN0cmljYWwgcGFyYW0gc2VxICovCk1WX09QX1BBUkFNUyBxc2dtaWlQb3J0RWxlY3RyaWNhbENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnCQl1bml0T2Zmc2V0ICAgbWFzawkJCVFTR01JSSBkYXRhCQl3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IEcxX1NFVFRJTkdTXzBfUkVHLAkweDgwMCwJCSAweDgwMDAsCSAgeyAweDAJfSwJCQkwLAkJCQkwCQl9IC8qIFNsZXcgcmF0ZSBhbmQgZW1waGFzaXMgKi8KfTsKCi8qIFFTR01JSSAtIFRYIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczFbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgICAgIFFTR01JSSBkYXRhCQl3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IEdMVUVfUkVHLAkJCSAgICAgICAgICAgICAgMHg4MDAsCSAgMHgxODAwLCAgICAgeyAweDgwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LAoJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgIDB4ODAwLAkgIDB4NDAxLAkgIHsgMHg0MDEJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCgl7IFJFU0VUX0RGRV9SRUcsCQkgICAgICAgICAgMHg4MDAsCSAgMHg0MDEsCSAgeyAweDAJCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFNmdCBSZXNldCBwdWxzZSAqLwoJeyBMQU5FX0FMSUdOX1JFRzAsICAgICAgICAgICAgICAgIDB4ODAwLAkgIDB4MTAwMCwJICB7IDB4MTAwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LCAvKiBMYW5lIGFsaWduICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg3MDAwMCwgICAgeyAweDcwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg4MDAwMCwgICAgeyAweDgwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0gIC8qIFR4IGRyaXZlciBvdXRwdXQgaWRsZSAqLwp9OwoKTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczJbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZwkJCQl1bml0T2Zmc2V0CQltYXNrCQkJUVNHTUlJIGRhdGEJCXdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywJCQkweDI4LAkJMHhDLAkJCXsgMHhDCQkJfSwJMTAsCQkJMTAwMAkJfSwJLyogV2FpdCBmb3IgUEhZIHBvd2VyIHVwIHNlcXVlbmNlIHRvIGZpbmlzaCAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywJMHgyOCwJCTB4NDAwODAwMDAsCQl7IDB4NDAwMDAwMDAJfSwJMCwJCQkwCQkJfSwgIC8qIEFzc2VydCBSeCBJbml0IGFuZCBUeCBkcml2ZXIgb3V0cHV0IHZhbGlkICovCgl7IENPTU1PTl9QSFlfU1RBVFVTMV9SRUcsCQkJMHgyOCwJICAgIDB4MSwJCQl7IDB4MQkJCX0sICAxLAkJCTEwMDAJICAgIH0sICAvKiBXYWl0IGZvciBQSFkgcG93ZXIgdXAgc2VxdWVuY2UgdG8gZmluaXNoICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LAkJMHg0MDAwMDAwMCwJCXsgMHgwCQkJfSwJMCwJCQkwCQkgICAgfSAgIC8qIERlLWFzc2VydCBSeCBJbml0ICovCn07CgoKLyogU0VSREVTX1BPV0VSX0RPV04gKi8KTVZfT1BfUEFSQU1TIHNlcmRlc1Bvd2VyRG93blBhcmFtc1tdID0KewoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgMHgyOCwgKDB4RiA8PCAxMSksIHsgKDB4MyA8PCAxMSkgfSwgMCwJICAgICAwCX0sCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAweDI4LCAoMHg3IDw8IDE2KSwgeyAwCQkgIH0sIDAsCSAgICAgMAl9Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NhbCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12Q3RybFNlcmRlc1JldkdldAoqCiogREVTQ1JJUFRJT046IEdldCB0aGUgU2VyZGVzIHJldmlzaW9uIG51bWJlcgoqCiogSU5QVVQ6IGNvbmZpZ0ZpZWxkIC0gRmllbGQgZGVzY3JpcHRpb24gZW51bQoqCiogT1VUUFVUOiBOb25lCioKKiBSRVRVUk46CiogCQk4Yml0IFNlcmRlcyByZXZpc2lvbiBudW1iZXIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9VOCBtdkh3c0N0cmxTZXJkZXNSZXZHZXQoTVZfVk9JRCkKewojaWZkZWYgTVY4OEY2OFhYCiAgICAvKiBmb3IgQTM4eC1aMSAqLwogICAgaWYgKG12U3lzRW52RGV2aWNlUmV2R2V0KCkgPT0gTVZfODhGNjhYWF9aMV9JRCkgewogICAgICAgIHJldHVybiBNVl9TRVJERVNfUkVWXzFfMjsKICAgIH0KI2VuZGlmCiAgICAvKiBmb3IgQTM5eC1aMSwgQTM4eC1BMCAqLwogICAgcmV0dXJuIE1WX1NFUkRFU19SRVZfMl8xOwp9CgpNVl9VMzIgbXZId3NTZXJkZXNUb3BvbG9neVZlcmlmeShTRVJERVNfVFlQRSBzZXJkZXNUeXBlLCBNVl9VMzIgc2VyZGVzSWQsIFNFUkRFU19NT0RFIHNlcmRlc01vZGUpCnsKCU1WX1UzMiB0ZXN0UmVzdWx0ID0gVE9QT0xPR1lfVEVTVF9PSzsKCU1WX1U4IHNlcmRNYXhOdW1iLHVuaXROdW1iOwoJTVZfVU5JVF9JRCB1bml0SWQ7CgoJaWYgKHNlcmRlc1R5cGUgPiBSWEFVSSl7CgkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiBXcm9uZyBzZXJkZXMgdHlwZSAlcyBzZXJkZXMjJWQgXG4iLCBfX2Z1bmNfXywgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdLCBzZXJkZXNJZCk7CgkJcmV0dXJuIE1WX0ZBSUw7Cgl9Cgl1bml0SWQgPSBzZXJkZXNUeXBlVG9Vbml0SW5mb1tzZXJkZXNUeXBlXS5zZXJkZXNVbml0SWQ7Cgl1bml0TnVtYiA9c2VyZGVzVHlwZVRvVW5pdEluZm9bc2VyZGVzVHlwZV0uc2VyZGVzVW5pdE51bTsKCXNlcmRNYXhOdW1iID0gbXZTeXNFbnZVbml0TWF4TnVtR2V0KHVuaXRJZCk7CgoJaWYgKFNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdID09IDApIHsKCQl0ZXN0UmVzdWx0ID0gU0VSREVTX0FMUkVBRFlfSU5fVVNFOwoJfSBlbHNlIHsKCS8qIGlmIGRpZG4ndCBleGNlZWQgYW1vdW50IG9mIHJlcXVpcmVkIFNlcmRlcyBsYW5lcyBmb3IgY3VycmVudCB0eXBlICovCgkJaWYgKHNlcmRlc1R5cGUgPT0gUEVYMCl7CgkJICAgaWYoc2VyZGVzTW9kZSAhPSBQRVhfRU5EX1BPSU5UX3g0KXsKCQkJICAgaWYoc2VyZGVzTW9kZSAhPSBQRVhfUk9PVF9DT01QTEVYX3g0KXsKCQkgICAgLyogU2VyZGVzTGFuZUluVXNlQ291bnQgZm9yIFBFWDAgPSA0ICwgYnV0IGlmIGl0IGlzIFBDSWV4MSBvbmx5IDEgbGFuZSBtYXkgYmUgdXNlZCAgKi8KCQkJU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPSAxOwoJCQl9CgkJICAgfQoJCX0KCQlTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXS0tOwkJCS8qIHVwZGF0ZSBhbW91bnQgb2YgcmVxdWlyZWQgU2VyZGVzIGxhbmVzIGZvciBjdXJyZW50IHR5cGUgKi8KCQlpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPT0gMCl7CS8qIGlmIHJlYWNoZWQgdGhlIGV4YWN0IGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwoJCWlmICgoKHNlcmRlc1R5cGUgPD0gUEVYMykpICYmICgoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSkpCgkJCXNlcmRlc1VuaXRDb3VudFtQRVhfVU5JVF9JRF0gKz0yOwkJCQkvKiBQQ2lleDQgdXNlcyAyIFNlckRlcyAqLwoJCWVsc2UKCQkJc2VyZGVzVW5pdENvdW50W3VuaXRJZF0rKzsKCgkJaWYgKHNlcmRlc1VuaXRDb3VudFt1bml0SWRdID4gc2VyZE1heE51bWIpCQkJLyogdGVzdCBTb0MgdW5pdCBjb3VudCBsaW1pdGF0aW9uICovCgkJCXRlc3RSZXN1bHQgPSBXUk9OR19OVU1CRVJfT0ZfVU5JVFM7CgkJZWxzZSBpZiAodW5pdE51bWIgPj0gc2VyZE1heE51bWIpCQkJCQkvKiB0ZXN0IFNvQyB1bml0IG51bWJlciBsaW1pdGF0aW9uICovCgkJCXRlc3RSZXN1bHQgPSBVTklUX05VTUJFUl9WSU9MQVRJT047CgkJfQoJfQoKCWlmICh0ZXN0UmVzdWx0ID09IFNFUkRFU19BTFJFQURZX0lOX1VTRSkgewoJCW12UHJpbnRmKCIlczogRXJyb3I6IHNlcmRlcyBsYW5lICVkIGlzIGNvbmZpZ3VyZWQgIiwgX19mdW5jX18sIHNlcmRlc0lkKTsKCQltdlByaW50ZigidG8gdHlwZSAlczogdHlwZSBhbHJlYWR5IGluIHVzZVxuIiwgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKCQlyZXR1cm4gTVZfRkFJTDsKCX0gZWxzZSBpZiAodGVzdFJlc3VsdCA9PSBXUk9OR19OVU1CRVJfT0ZfVU5JVFMpIHsKCQltdlByaW50ZigiJXM6IFdhcm5pbmc6IHNlcmRlcyBsYW5lICVkIGlzICIsIF9fZnVuY19fLCBzZXJkZXNJZCk7CgkJbXZQcmludGYoInNldCB0byB0eXBlICVzLlxuIiwgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKCQltdlByaW50ZigiJXM6IE1heGltdW0gc3VwcG9ydGVkIGxhbmVzIGFyZSAiLCBfX2Z1bmNfXyk7CgkJbXZQcmludGYoImFscmVhZHkgc2V0IHRvIHRoaXMgdHlwZSAobGltaXQgPSAlZClcbiIsIHNlcmRNYXhOdW1iKTsKCQlyZXR1cm4gTVZfRkFJTDsKCX0KCgllbHNlIGlmICh0ZXN0UmVzdWx0ID09IFVOSVRfTlVNQkVSX1ZJT0xBVElPTikgewoJCW12UHJpbnRmKCIlczogV2FybmluZzogc2VyZGVzIGxhbmUgJWQgdHlwZSBpcyAlczogIiwKCQkJCV9fZnVuY19fLCBzZXJkZXNJZCwgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKCQltdlByaW50ZigiY3VycmVudCBkZXZpY2Ugc3VwcG9ydCBvbmx5ICVkIHVuaXRzIG9mIHRoaXMgdHlwZS5cbiIsIHNlcmRNYXhOdW1iKTsKCQlyZXR1cm4gTVZfRkFJTDsKCX0KCXJldHVybiBNVl9PSzsKfQoKTVZfVk9JRCBtdkh3c1NlcmRlc1hBVUlUb3BvbG9neVZlcmlmeShNVl9WT0lEKQp7CiBpZiAoKFNlcmRlc0xhbmVJblVzZUNvdW50W1hBVUlfVU5JVF9JRF1bMF0gIT0gMCkgJiYgICAoU2VyZGVzTGFuZUluVXNlQ291bnRbWEFVSV9VTklUX0lEXVswXSAhPSA0KSl7IC8qIGlmICBYQVVJIGlzIGluIHVzZSAtIFNlcmRlc0xhbmVJblVzZUNvdW50IGhhcyB0byBiZSA9IDA7CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgIGlmIGl0IGlzIG5vdCBpbiB1c2UgIGhhc3QgYmUgPSA0ICovCiAJbXZQcmludGYoIiVzOiBXYXJuaW5nOiB3cm9uZyBudW1iZXIgb2YgbGFuZXMgaXMgc2V0IHRvIFhBVUkgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1hBVUlfVU5JVF9JRF1bMF0pOwoJbXZQcmludGYoIiVzOiBYQVVJIGhhcyB0byBiZSBkZWZpbmVkIG9uIDQgbGFuZXNcbiIsIF9fZnVuY19fKTsKIH0KCiBpZiAoKFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdICE9IDApICYmICAgKFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdICE9IDIpKXsvKiBpZiAgUlhBVUkgaXMgaW4gdXNlIC0gU2VyZGVzTGFuZUluVXNlQ291bnQgaGFzIHRvIGJlID0gMDsKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIGlmIGl0IGlzIG5vdCBpbiB1c2UgIGhhc3QgYmUgPSAyICovCgltdlByaW50ZigiJXM6IFdhcm5pbmc6IHdyb25nIG51bWJlciBvZiBsYW5lcyBpcyBzZXQgdG8gUlhBVUkgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdKTsKCW12UHJpbnRmKCIlczogUlhBVUkgaGFzIHRvIGJlIGRlZmluZWQgb24gMiBsYW5lc1xuIiwgX19mdW5jX18pOwogfQoKfQpNVl9WT0lEIG12SHdzU2VyZGVzUENJWDRUb3BvbG9neVZlcmlmeShNVl9WT0lEICkKewoJaWYgKFNlcmRlc0xhbmVJblVzZUNvdW50W1BFWF9VTklUX0lEXVswXSAhPSAwKSB7CgkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiB3cm9uZyBudW1iZXIgb2YgbGFuZXMgaXMgc2V0IHRvIFBFWDAgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1BFWF9VTklUX0lEXVswXSk7CgkJbXZQcmludGYoIiVzOiBQQ0lleDQgaGFzIHRvIGJlIGRlZmluZWQgb24gNCBsYW5lc1xuIiwgX19mdW5jX18pOwoJfQp9Ck1WX1NUQVRVUyBtdkh3c1NlcmRlc1NlcURiSW5pdChNVl9WT0lEKQp7CglERUJVR19JTklUX0ZVTExfUygiXG4jIyMgc2VyZGVzU2VxMzh4SW5pdCAjIyNcbiIpOwoJTVZfVTggc2VyZGVzUmV2ID0gbXZId3NDdHJsU2VyZGVzUmV2R2V0KCk7CgoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfTkEpIHsKCQltdlByaW50ZigibXZId3NTZXJkZXNTZXFEYkluaXQ6IHNlcmRlcyByZXZpc2lvbiBudW1iZXIgaXMgbm90IHN1cHBvcnRlZFxuIik7CgkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7Cgl9CgoJLyogU0FUQV9QT1JUXzBfT05MWV9QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzBfT05MWV9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gc2F0YVBvcnQwUG93ZXJVcFBhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8wX09OTFlfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhUG9ydDBQb3dlclVwUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzBfT05MWV9QT1dFUl9VUF9TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCgkvKiBTQVRBX1BPUlRfMV9PTkxZX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMV9PTkxZX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhUG9ydDFQb3dlclVwUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzFfT05MWV9QT1dFUl9VUF9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFQb3J0MVBvd2VyVXBQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMV9PTkxZX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKCS8qIFNBVEFfUE9XRVJfVVBfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NBVEFfUE9XRVJfVVBfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFBbmRTZ21paVBvd2VyVXBQYXJhbXM7CglzZXJkZXNTZXFEYltTQVRBX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpUG93ZXJVcFBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IFNBVEE7CgoJLyogU0FUQV9fMV81X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9fMV81X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltTQVRBX18xXzVfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX18xXzVfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKCS8qIFNBVEFfXzNfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTQVRBX18zX1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltTQVRBX18zX1NQRUVEX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVNwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0FUQV9fM19TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFNBVEE7CgoJLyogU0FUQV9fNl9TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NBVEFfXzZfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfXzZfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX182X1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCiAgICAvKiBTQVRBX0VMRUNUUklDQUxfQ09ORklHX1NFUSBzZXEgc2VxdWVuY2UgaW5pdCAqLwogICAgaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbU0FUQV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zOwoJCXNlcmRlc1NlcURiW1NBVEFfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CiAgICB9IGVsc2UgewoJCXNlcmRlc1NlcURiW1NBVEFfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtczsKCQlzZXJkZXNTZXFEYltTQVRBX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbU0FUQV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCiAgICAvKiBTQVRBX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwogICAgc2VyZGVzU2VxRGJbU0FUQV9UWF9DT05GSUdfU0VRMV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1BhcmFtczE7CiAgICBzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVExXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlUeENvbmZpZ1BhcmFtczEpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CiAgICBzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVExXS5kYXRhQXJySWR4ICA9IFNBVEE7CgogICAgLyogU0FUQV9QT1JUXzBfT05MWV9UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8wX09OTFlfVFhfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhUG9ydDBUeENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8wX09OTFlfVFhfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YVBvcnQwVHhDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMF9PTkxZX1RYX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCgkvKiBTQVRBX1BPUlRfMV9PTkxZX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzFfT05MWV9UWF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFQb3J0MVR4Q29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzFfT05MWV9UWF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhUG9ydDFUeENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8xX09OTFlfVFhfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKICAgIC8qIFNBVEFfVFhfQ09ORklHX1NFUTIgc2VxdWVuY2UgaW5pdCAqLwogICAgaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbU0FUQV9UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjFQYXJhbXMyOwoJCXNlcmRlc1NlcURiW1NBVEFfVFhfQ09ORklHX1NFUTJdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVR4Q29uZmlnU2VyZGVzUmV2MVBhcmFtczIpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9IGVsc2UgewoJCXNlcmRlc1NlcURiW1NBVEFfVFhfQ09ORklHX1NFUTJdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYyUGFyYW1zMjsKCQlzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVEyXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjJQYXJhbXMyKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbU0FUQV9UWF9DT05GSUdfU0VRMl0uZGF0YUFycklkeCAgPSBTQVRBOwoKCS8qIFNHTUlJX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTR01JSV9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpUG93ZXJVcFBhcmFtczsKCXNlcmRlc1NlcURiW1NHTUlJX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpUG93ZXJVcFBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NHTUlJX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCAgPSBTR01JSTsKCgkvKiBTR01JSV9fMV8yNV9TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltTR01JSV9fMV8yNV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0dNSUk7CgoJLyogU0dNSUlfXzNfMTI1X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0dNSUlfXzNfMTI1X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltTR01JSV9fM18xMjVfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTR01JSV9fM18xMjVfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTR01JSV8zXzEyNTsKCiAgICAvKiBTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVEgc2VxIHNlcXVlbmNlIGluaXQgKi8KCWlmKHNlcmRlc1JldiA9PSBNVl9TRVJERVNfUkVWXzFfMikgewoJCXNlcmRlc1NlcURiW1NHTUlJX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzZ21paUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zOwoJCXNlcmRlc1NlcURiW1NHTUlJX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNnbWlpRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXM7CgkJc2VyZGVzU2VxRGJbU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzZ21paUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFNHTUlJOwoKCS8qIFNHTUlJX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpVHhDb25maWdQYXJhbXMxOwoJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVR4Q29uZmlnUGFyYW1zMSkgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NHTUlJX1RYX0NPTkZJR19TRVExXS5kYXRhQXJySWR4ICA9IFNHTUlJOwoKCS8qIFNHTUlJX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTJdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYxUGFyYW1zMjsKCQlzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYxUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTJdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYyUGFyYW1zMjsKCQlzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYyUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0KCXNlcmRlc1NlcURiW1NHTUlJX1RYX0NPTkZJR19TRVEyXS5kYXRhQXJySWR4ICA9IFNHTUlJOwoKCS8qIFBFWF9QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbUEVYX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXM7CgkJc2VyZGVzU2VxRGJbUEVYX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYxUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfSBlbHNlIHsKCQlzZXJkZXNTZXFEYltQRVhfUE9XRVJfVVBfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MlBhcmFtczsKCQlzZXJkZXNTZXFEYltQRVhfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltQRVhfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IFBFWDsKCgkvKiBQRVhfXzJfNV9TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1BFWF9fMl81X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbUEVYX18yXzVfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSA9ICBzaXplb2YocGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX18yXzVfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCA9ICBQRVhfXzJfNUdicHM7CgoJLyogUEVYX181X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX181X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbUEVYX181X1NQRUVEX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9fNV9TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFBFWF9fNUdicHM7CgogICAgLyogUEVYX0VMRUNUUklDQUxfQ09ORklHX1NFUSBzZXEgc2VxdWVuY2UgaW5pdCAqLwoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbUEVYX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtczsKCQlzZXJkZXNTZXFEYltQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbUEVYX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtczsKCQlzZXJkZXNTZXFEYltQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0KCXNlcmRlc1NlcURiW1BFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggPSBQRVg7CgoJLyogUEVYX1RYX0NPTkZJR19TRVExIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRMV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxOwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVExXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVExXS5kYXRhQXJySWR4ICA9IFBFWDsKCiAgICAvKiBQRVhfVFhfQ09ORklHX1NFUTIgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVEyXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczI7CglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTJdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczIpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTJdLmRhdGFBcnJJZHggID0gUEVYOwoKCS8qIFBFWF9UWF9DT05GSUdfU0VRMyBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTNdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMzsKCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRM10uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRM10uZGF0YUFycklkeCAgPSBQRVg7CgoJLyogUEVYX0JZXzRfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfQllfNF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEJ5NENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1BFWF9CWV80X0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEJ5NENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9CWV80X0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gUEVYOwoKCS8qIFBFWF9DT05GSUdfUkVGX0NMT0NLXzI1TUh6X1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS18yNU1Iel9TRVFdLm9wUGFyYW1zUHRyID0gcGV4Q29uZmlnUmVmQ2xvY2syNU1IejsKCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzI1TUh6X1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4Q29uZmlnUmVmQ2xvY2syNU1IeikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzI1TUh6X1NFUV0uZGF0YUFycklkeCAgPSBQRVg7CgoJLyogUEVYX0VMRUNUUklDQUxfQ09ORklHX1JFRl9DTE9DS180ME1Iel9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfNDBNSHpfU0VRXS5vcFBhcmFtc1B0ciA9IHBleENvbmZpZ1JlZkNsb2NrNDBNSHo7CglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS180ME1Iel9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleENvbmZpZ1JlZkNsb2NrNDBNSHopIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS180ME1Iel9TRVFdLmRhdGFBcnJJZHggID0gUEVYOwoKICAgIC8qIFBFWF9DT05GSUdfUkVGX0NMT0NLXzEwME1Iel9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMTAwTUh6X1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhDb25maWdSZWZDbG9jazEwME1IejsKCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzEwME1Iel9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleENvbmZpZ1JlZkNsb2NrMTAwTUh6KSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMTAwTUh6X1NFUV0uZGF0YUFycklkeCAgPSBQRVg7CgoJLyogVVNCM19QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbVVNCM19QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYxUGFyYW1zOwoJCXNlcmRlc1NlcURiW1VTQjNfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9IGVsc2UgewoJCXNlcmRlc1NlcURiW1VTQjNfUE9XRVJfVVBfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MlBhcmFtczsKCQlzZXJkZXNTZXFEYltVU0IzX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYyUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbVVNCM19QT1dFUl9VUF9TRVFdLmRhdGFBcnJJZHggPSBVU0IzOwoKCS8qIFVTQjNfX0hPU1RfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltVU0IzX19IT1NUX1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbVVNCM19fSE9TVF9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IzX19IT1NUX1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gVVNCM19fNUdicHNfSE9TVDsKCgkvKiBVU0IzX19ERVZJQ0VfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltVU0IzX19ERVZJQ0VfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltVU0IzX19ERVZJQ0VfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbVVNCM19fREVWSUNFX1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gVVNCM19fNUdicHNfREVWSUNFOwoKICAgIC8qIFVTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRIHNlcSBzZXF1ZW5jZSBpbml0ICovCiAgICBpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSB1c2IzRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXM7CgkJc2VyZGVzU2VxRGJbVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gdXNiM0VsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zOwoJCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZih1c2IzRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uZGF0YUFycklkeCA9IEZJUlNUX0NFTEw7CgoJLyogVVNCM19UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMTsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczEpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IzX1RYX0NPTkZJR19TRVExXS5kYXRhQXJySWR4ICA9IFVTQjM7CgogICAgLyogVVNCM19UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTJdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMjsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTJdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczIpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IzX1RYX0NPTkZJR19TRVEyXS5kYXRhQXJySWR4ICA9IFVTQjM7CgoJLyogVVNCM19UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTNdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMzsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTNdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IzX1RYX0NPTkZJR19TRVEzXS5kYXRhQXJySWR4ICA9IFVTQjM7CgoJLyogVVNCMl9QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbVVNCMl9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gdXNiMlBvd2VyVXBQYXJhbXM7CglzZXJkZXNTZXFEYltVU0IyX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YodXNiMlBvd2VyVXBQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IyX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCAgPSAwOwoKCS8qIFVTQjNfREVWSUNFX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbVVNCM19ERVZJQ0VfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSB1c2IzRGV2aWNlQ29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbVVNCM19ERVZJQ0VfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YodXNiM0RldmljZUNvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjNfREVWSUNFX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gMDsgLyogTm90IHJlbGV2YW50ICovCgoJLyogU0VSREVTX1BPV0VSX0RPV05fU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NFUkRFU19QT1dFUl9ET1dOX1NFUV0ub3BQYXJhbXNQdHIgPSBzZXJkZXNQb3dlckRvd25QYXJhbXM7CglzZXJkZXNTZXFEYltTRVJERVNfUE9XRVJfRE9XTl9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNlcmRlc1Bvd2VyRG93blBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NFUkRFU19QT1dFUl9ET1dOX1NFUV0uZGF0YUFycklkeCAgPSBGSVJTVF9DRUxMOwoKCWlmKHNlcmRlc1JldiA9PSBNVl9TRVJERVNfUkVWXzJfMSkgewoJCS8qIFFTR01JSV9QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJCXNlcmRlc1NlcURiW1FTR01JSV9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gcXNnbWlpUG9ydFBvd2VyVXBQYXJhbXM7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocXNnbWlpUG9ydFBvd2VyVXBQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCAgPSBRU0dNSUlfU0VRX0lEWDsKCgkJLyogUVNHTUlJX181X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJCXNlcmRlc1NlcURiW1FTR01JSV9fNV9TUEVFRF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHFzZ21paVBvcnRTcGVlZENvbmZpZ1BhcmFtczsKCQlzZXJkZXNTZXFEYltRU0dNSUlfXzVfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocXNnbWlpUG9ydFNwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJCXNlcmRlc1NlcURiW1FTR01JSV9fNV9TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFFTR01JSV9TRVFfSURYOwoKCQkvKiBRU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRIHNlcSBzZXF1ZW5jZSBpbml0ICovCgkJc2VyZGVzU2VxRGJbUVNHTUlJX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBxc2dtaWlQb3J0RWxlY3RyaWNhbENvbmZpZ1BhcmFtczsKCQlzZXJkZXNTZXFEYltRU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihxc2dtaWlQb3J0RWxlY3RyaWNhbENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCQlzZXJkZXNTZXFEYltRU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFFTR01JSV9TRVFfSURYOwoKCQkvKiBRU0dNSUlfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCgkJc2VyZGVzU2VxRGJbUVNHTUlJX1RYX0NPTkZJR19TRVExXS5vcFBhcmFtc1B0ciA9IHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczE7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX1RYX0NPTkZJR19TRVExXS5jZmdTZXFTaXplICA9IHNpemVvZihxc2dtaWlQb3J0VHhDb25maWdQYXJhbXMxKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJCXNlcmRlc1NlcURiW1FTR01JSV9UWF9DT05GSUdfU0VRMV0uZGF0YUFycklkeCAgPSBRU0dNSUlfU0VRX0lEWDsKCgkJLyogUVNHTUlJX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJCXNlcmRlc1NlcURiW1FTR01JSV9UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBxc2dtaWlQb3J0VHhDb25maWdQYXJhbXMyOwoJCXNlcmRlc1NlcURiW1FTR01JSV9UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocXNnbWlpUG9ydFR4Q29uZmlnUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCQlzZXJkZXNTZXFEYltRU0dNSUlfVFhfQ09ORklHX1NFUTJdLmRhdGFBcnJJZHggID0gUVNHTUlJX1NFUV9JRFg7Cgl9CgogICAgcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpTRVJERVNfU0VRIHNlcmRlc1R5cGVBbmRTcGVlZFRvU3BlZWRTZXEKKAoJU0VSREVTX1RZUEUgc2VyZGVzVHlwZSwKCVNFUkRFU19TUEVFRCBiYXVkUmF0ZQopCnsKCVNFUkRFU19TRVEgc2VxSWQgPSBTRVJERVNfTEFTVF9TRVE7CgoJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIHNlcmRlc1R5cGVBbmRTcGVlZFRvU3BlZWRTZXEgIyMjXG4iKTsKCXN3aXRjaCAoc2VyZGVzVHlwZSkgewoJY2FzZSBQRVgwOgoJY2FzZSBQRVgxOgoJY2FzZSBQRVgyOgoJY2FzZSBQRVgzOgoJCWlmIChiYXVkUmF0ZSA9PSBfXzJfNUdicHMpCgkJCXNlcUlkID0gUEVYX18yXzVfU1BFRURfQ09ORklHX1NFUTsKCQllbHNlIGlmIChiYXVkUmF0ZSA9PSBfXzVHYnBzKQoJCQlzZXFJZCA9IFBFWF9fNV9TUEVFRF9DT05GSUdfU0VROwoJCWJyZWFrOwoJY2FzZSBVU0IzX0hPU1QwOgoJY2FzZSBVU0IzX0hPU1QxOgoJCWlmIChiYXVkUmF0ZSA9PSBfXzVHYnBzKQoJCQlzZXFJZCA9IFVTQjNfX0hPU1RfU1BFRURfQ09ORklHX1NFUTsKCQlicmVhazsKCWNhc2UgVVNCM19ERVZJQ0U6CgkJaWYgKGJhdWRSYXRlID09IF9fNUdicHMpCgkJCXNlcUlkID0gVVNCM19fREVWSUNFX1NQRUVEX0NPTkZJR19TRVE7CgkJYnJlYWs7CgljYXNlIFNBVEEwOgoJY2FzZSBTQVRBMToKCWNhc2UgU0FUQTI6CgljYXNlIFNBVEEzOgoJCWlmIChiYXVkUmF0ZSA9PSBfXzFfNUdicHMpCgkJCXNlcUlkID0gU0FUQV9fMV81X1NQRUVEX0NPTkZJR19TRVE7CgkJZWxzZSBpZiAoYmF1ZFJhdGUgPT0gX18zR2JwcykKCQkJc2VxSWQgPSBTQVRBX18zX1NQRUVEX0NPTkZJR19TRVE7CgkJZWxzZSBpZiAoYmF1ZFJhdGUgPT0gX182R2JwcykKCQkJc2VxSWQgPSBTQVRBX182X1NQRUVEX0NPTkZJR19TRVE7CgkJYnJlYWs7CgljYXNlIFNHTUlJMDoKCWNhc2UgU0dNSUkxOgoJY2FzZSBTR01JSTI6CiNpZmRlZiBNVjg4RjY5WFgKICAgIGNhc2UgU0dNSUl2M18wOgogICAgY2FzZSBTR01JSXYzXzE6CiAgICBjYXNlIFNHTUlJdjNfMjoKICAgIGNhc2UgU0dNSUl2M18zOgojZW5kaWYKICAgICAgICBpZiAoYmF1ZFJhdGUgPT0gX18xXzI1R2JwcykKCQkJc2VxSWQgPSBTR01JSV9fMV8yNV9TUEVFRF9DT05GSUdfU0VROwoJCWVsc2UgaWYgKGJhdWRSYXRlID09IF9fM18xMjVHYnBzKQoJCQlzZXFJZCA9IFNHTUlJX18zXzEyNV9TUEVFRF9DT05GSUdfU0VROwoJCWJyZWFrOwogICAgY2FzZSBRU0dNSUk6CiAgICAgICAgc2VxSWQgPSBRU0dNSUlfXzVfU1BFRURfQ09ORklHX1NFUTsKICAgICAgICBicmVhazsKI2lmZGVmIE1WODhGNjlYWAogICAgY2FzZSBYQVVJOgogICAgICAgIHNlcUlkID0gWEFVSV9fM18xMjVfU1BFRURfQ09ORklHX1NFUTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUlhBVUk6CiAgICAgICAgc2VxSWQgPSBSWEFVSV9fNl8yNV9TUEVFRF9DT05GSUdfU0VROwogICAgICAgIGJyZWFrOwojZW5kaWYKCWRlZmF1bHQ6CgkJcmV0dXJuIFNFUkRFU19MQVNUX1NFUTsKCX0KCglyZXR1cm4gc2VxSWQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c0JvYXJkVG9wb2xvZ3lMb2FkKFNFUkRFU19NQVAgICpzZXJkZXNNYXBBcnJheSkKewoJTVZfVTMyIGJvYXJkSWQgPSBtdkJvYXJkSWRHZXQoKTsKCU1WX1UzMiBib2FyZElkSW5kZXggPSBtdkJvYXJkSWRJbmRleEdldChib2FyZElkKTsKCglERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NCb2FyZFRvcG9sb2d5TG9hZCAjIyNcbiIpOwoJLyogZ2V0dGluZyBib2FyZCB0b3BvbG9neSBhY2NvcmRpbmcgdG8gdGhlIGJvYXJkIGlkICovCglERUJVR19JTklUX0ZVTExfUygiR2V0dGluZyBib2FyZCB0b3BvbG9neSBhY2NvcmRpbmcgdG8gdGhlIGJvYXJkIGlkXG4iKTsKCglDSEVDS19TVEFUVVMobG9hZFRvcG9sb2d5RnVuY0Fycltib2FyZElkSW5kZXhdKHNlcmRlc01hcEFycmF5KSk7CgoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKTVZfVk9JRCBwcmludFRvcG9sb2d5RGV0YWlscyhTRVJERVNfTUFQICAqc2VyZGVzTWFwQXJyYXkpCnsKCU1WX1UzMiBsYW5lTnVtLCBwZXhCeTRMYW5lPTA7CgoJbXZQcmludGYoImJvYXJkIFNlckRlcyBsYW5lcyB0b3BvbG9neSBkZXRhaWxzOlxuIik7CgoJbXZQcmludGYoIiB8IExhbmUgIyB8IFNwZWVkfCAgICBUeXBlICAgICB8XG4iKTsKCW12UHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7Cglmb3IgKGxhbmVOdW0gPSAwOyBsYW5lTnVtIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IGxhbmVOdW0rKykgewoJCWlmIChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKQoJCXsKCQkJY29udGludWU7CgkJfQoJCW12UHJpbnRmICgiIHwgICAlZCAgICB8ICAlZCAgIHwgICIsbXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShsYW5lTnVtKSxzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNTcGVlZCk7CgkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKXsKCQkJbXZQcmludGYgKCJQQ0llMHg0LSUwMWQgICIscGV4Qnk0TGFuZSsrICk7CgkJfQoJCWVsc2V7CgkJCW12UHJpbnRmICgiJXMiLHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlXSk7CgkJfQoJCW12UHJpbnRmKCJ8XG4iKTsKCX0KCW12UHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZId3NQcmVTZXJkZXNJbml0Q29uZmlnKE1WX1ZPSUQpCnsKICAgIE1WX1UzMiBkYXRhOwoKICAgIC8qIGNvbmZpZ3VyZSBDb3JlIFBMTCAqLwogICAgLyoKICAgIHNldCBQTEwgcGFyYW1ldGVycwogICAgYml0c1syOjBdICA9MHgzIChDb3JlLVBMTCBLZGl2KQogICAgYml0c1syMDoxMl09MHg5RiAoQ29yZS1QTEwgTmRpdikKICAgIGJpdHNbMjQ6MjFdPTB4NyhDb3JlLVBMTCBWQ08gQmFuZCkKICAgIGJpdHNbMjg6MjVdPTB4MShDb3JlLVBMTCBSbGYpCiAgICBiaXRzWzMxOjI5XT0weDIoQ29yZS1QTEwgY2hhcmdlLXB1bXAgYWRqdXN0KQogICAgKi8KICAgIE1WX1JFR19XUklURShDT1JFX1BMTF9QQVJBTUVURVJTX1JFRywgMHg0MkU5RjAwMyk7CgogICAgLyogRW5hYmxlIFBMTCBDb25maWd1cmF0aW9uICovCiAgICBkYXRhID0gTVZfUkVHX1JFQUQoQ09SRV9QTExfQ09ORklHX1JFRyk7CiAgICBkYXRhID0gU0VUX0JJVChkYXRhLCA5KTsKICAgIE1WX1JFR19XUklURShDT1JFX1BMTF9DT05GSUdfUkVHLCBkYXRhKTsKCiAgICByZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c0N0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWcoTVZfVk9JRCkKewoJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12Q3RybEhpZ2hTcGVlZFNlcmRlc1BoeUNvbmZpZyAjIyNcbiIpOwoKCURFQlVHX0lOSVRfUygiSGlnaCBzcGVlZCBQSFkgLSBWZXJzaW9uOiAiKTsKCURFQlVHX0lOSVRfUyhTRVJERVNfVkVSSU9OKTsKCURFQlVHX0lOSVRfUygiXG4iKTsKCgkvKiBJbml0IHNlcmRlcyBzZXF1ZW5jZXMgREIgKi8KCWlmIChtdkh3c1NlcmRlc1NlcUluaXQoKSAhPSBNVl9PSyl7CgkJbXZQcmludGYoIm12SHdzQ3RybEhpZ2hTcGVlZFNlcmRlc1BoeUNvbmZpZzogRXJyb3I6IFNlcmRlcyBpbml0aWFsaXphdGlvbiBmYWlsXG4iKTsKCQlyZXR1cm4gTVZfRkFJTDsKCX0KCgkvKiBUV1NJIGluaXQgKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJtdkh3c1R3c2lJbml0V3JhcHBlcjogSW5pdCBUV1NJIGludGVyZmFjZS5cbiIpOwoJQ0hFQ0tfU1RBVFVTKG12SHdzVHdzaUluaXRXcmFwcGVyKCkpOwoKCS8qIEJvYXJkIHRvcG9sb2d5IGxvYWQgKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJtdkN0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWc6IExvYWRpbmcgYm9hcmQgdG9wb2xvZ3kuLlxuIik7CiAgICBDSEVDS19TVEFUVVMobXZId3NCb2FyZFRvcG9sb2d5TG9hZChzZXJkZXNDb25maWd1cmF0aW9uTWFwKSk7CgoJLyogcHJpbnQgdG9wb2xvZ3kgKi8KCXByaW50VG9wb2xvZ3lEZXRhaWxzKHNlcmRlc0NvbmZpZ3VyYXRpb25NYXApOwoKCUNIRUNLX1NUQVRVUyhtdkh3c1ByZVNlcmRlc0luaXRDb25maWcoKSk7CgoJLyogUG93ZXItVXAgc2VxdWVuY2UgKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJtdkN0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWc6IFN0YXJ0aW5nIHNlcmRlcyBwb3dlciB1cCBzZXF1ZW5jZVxuIik7CgoJQ0hFQ0tfU1RBVFVTKG12SHdzUG93ZXJVcFNlcmRlc0xhbmVzKHNlcmRlc0NvbmZpZ3VyYXRpb25NYXApKTsKCglERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnIGVuZGVkIHN1Y2Nlc3NmdWxseSAjIyNcbiIpOwoKCURFQlVHX0lOSVRfUyhFTkRFRF9PSyk7CgoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZTZXJkZXNQb2xhcml0eUNvbmZpZyhNVl9VMzIgc2VyZGVzTnVtLCBNVl9CT09MIGlzUngpCnsKCU1WX1UzMiBkYXRhOwoJTVZfVTMyIHJlZ0FkZHI7CglNVl9VOCBiaXRPZmYgPSAoaXNSeCkgPyAxMSA6IDEwOwoKCXJlZ0FkZHIgPSBTRVJERVNfUkVHU19MQU5FX0JBU0VfT0ZGU0VUKHNlcmRlc051bSkgKyBTWU5DX1BBVFRFUk5fUkVHOwoKCWRhdGEgPSBNVl9SRUdfUkVBRChyZWdBZGRyKTsKCglkYXRhID0gU0VUX0JJVChkYXRhLCBiaXRPZmYpOwoKCU1WX1JFR19XUklURShyZWdBZGRyLCBkYXRhKTsKCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lcyhTRVJERVNfTUFQICAqc2VyZGVzQ29uZmlnTWFwKQp7CglNVl9VMzIgc2VyZGVzSWQsIHNlcmRlc0xhbmVOdW07CglSRUZfQ0xPQ0sgcmVmQ2xvY2s7CglTRVJERVNfVFlQRSBzZXJkZXNUeXBlOwoJU0VSREVTX1NQRUVEIHNlcmRlc1NwZWVkOwoJU0VSREVTX01PREUgIHNlcmRlc01vZGU7CglNVl9CT09MICAgICAgc2VyZGVzUnhQb2xhcml0eVN3YXA7CglNVl9CT09MICAgICAgc2VyZGVzVHhQb2xhcml0eVN3YXA7CglNVl9CT09MICAgICAgaXNQZXhFbmFibGVkID0gTVZfRkFMU0U7IC8qIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgb25lIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJkZXMgaXMgb2YgUEVYLiBpbiB0aGlzIGNhc2UsIFBFWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgU2VyZGVzIHBvd2VyLXVwICovCgoJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzUG93ZXJVcFNlcmRlc0xhbmVzICMjI1xuIik7CgoJLyogQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lczogVXBkYXRpbmcgQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ1xuIik7CglDSEVDS19TVEFUVVMobXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnMoc2VyZGVzQ29uZmlndXJhdGlvbk1hcCkpOwoKCS8qIHBlciBTZXJkZXMgUG93ZXIgVXAgKi8KCWZvciAoc2VyZGVzSWQgPSAwOyBzZXJkZXNJZCA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBzZXJkZXNJZCsrKSB7CgkJREVCVUdfSU5JVF9GVUxMX1MoImNhbGxpbmcgc2VyZGVzUG93ZXJVcEN0cmw6IHNlcmRlcyBsYW5lIG51bWJlciAiKTsKCQlERUJVR19JTklUX0ZVTExfRF8xMChzZXJkZXNMYW5lTnVtLCAxKTsKCQlERUJVR19JTklUX0ZVTExfUygiXG4iKTsKCgkJc2VyZGVzTGFuZU51bSA9IG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0oc2VyZGVzSWQpOwoKCQlzZXJkZXNUeXBlID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkXS5zZXJkZXNUeXBlOwoJCXNlcmRlc1NwZWVkID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkXS5zZXJkZXNTcGVlZDsKCQlzZXJkZXNNb2RlID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkXS5zZXJkZXNNb2RlOwoJCXNlcmRlc1J4UG9sYXJpdHlTd2FwID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkXS5zd2FwUng7CgkJc2VyZGVzVHhQb2xhcml0eVN3YXAgPSBzZXJkZXNDb25maWdNYXBbc2VyZGVzSWRdLnN3YXBUeDsKCgkJLyogc2VyZGVzIGxhbmUgaXMgbm90IGluIHVzZSAqLwoJCWlmIChzZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKQoJCQljb250aW51ZTsKCQllbHNlIGlmKHNlcmRlc1R5cGUgPD0gUEVYMykgLyogUEVYIHR5cGUgKi8KCQkJaXNQZXhFbmFibGVkID0gTVZfVFJVRTsKCgkJcmVmQ2xvY2sgPSBtdkh3c1NlcmRlc0dldFJlZkNsb2NrVmFsKHNlcmRlc1R5cGUpOwoJCWlmIChyZWZDbG9jayA9PSBSRUZfQ0xPQ0tfVU5TVVBQT1JURUQpIHsKCQkJREVCVUdfSU5JVF9TKCJtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lczogdW5zdXBwb3J0ZWQgcmVmIGNsb2NrXG4iKTsKCQkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7CgkJfQoJCUNIRUNLX1NUQVRVUyhtdlNlcmRlc1Bvd2VyVXBDdHJsKHNlcmRlc0xhbmVOdW0sCgkJCQkJCSBNVl9UUlVFLAoJCQkJCQkgc2VyZGVzVHlwZSwKCQkJCQkJIHNlcmRlc1NwZWVkLAoJCQkJCQkgc2VyZGVzTW9kZSwKCQkJCQkJIHJlZkNsb2NrKSk7CgoJCS8qIFJYIFBvbGFyaXR5IGNvbmZpZyAqLwoJCWlmKHNlcmRlc1J4UG9sYXJpdHlTd2FwKQoJCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQb2xhcml0eUNvbmZpZyhzZXJkZXNMYW5lTnVtLCBNVl9UUlVFKSk7CgoJCS8qIFRYIFBvbGFyaXR5IGNvbmZpZyAqLwoJCWlmKHNlcmRlc1R4UG9sYXJpdHlTd2FwKQoJCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQb2xhcml0eUNvbmZpZyhzZXJkZXNMYW5lTnVtLCBNVl9GQUxTRSkpOwoJfQoKCWlmKGlzUGV4RW5hYmxlZCkKCXsKCQkvKiBTZXQgUEVYX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgZm9yIFBFWHg0IG1vZGUuCgkJICAgQWZ0ZXIgZmluaXNoIHRoZSBQb3dlclVwIHNlcXVlbmNlIGZvciBhbGwgbGFuZXMsCgkJICAgdGhlIGxhbmVzIHNob3VsZCBiZSByZWxlYXNlZCBmcm9tIHJlc2V0IHN0YXRlLgkqLwoJCUNIRUNLX1NUQVRVUyhtdkh3c1BleFR4Q29uZmlnU2VxKHNlcmRlc0NvbmZpZ01hcCkpOwoKCQkvKiBQRVggY29uZmlndXJhdGlvbiovCgkJQ0hFQ0tfU1RBVFVTKG12SHdzUGV4Q29uZmlnKHNlcmRlc0NvbmZpZ01hcCkpOwoJfQoKCS8qIFVTQjIgY29uZmlndXJhdGlvbiAqLwoJREVCVUdfSU5JVF9GVUxMX1MoIm12SHdzUG93ZXJVcFNlcmRlc0xhbmVzOiBpbml0IFVTQjIgUGh5c1xuIik7CglDSEVDS19TVEFUVVMobXZTZXFFeGVjKDAgLyogbm90IHJlbGV2YW50ICovLCBVU0IyX1BPV0VSX1VQX1NFUSkpOwoKCURFQlVHX0lOSVRfRlVMTF9TKCIjIyMgbXZId3NQb3dlclVwU2VyZGVzTGFuZXMgZW5kZWQgc3VjY2Vzc2Z1bGx5ICMjI1xuIik7CglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpNVl9TVEFUVVMgbXZDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnKE1WX1ZPSUQpCnsKCXJldHVybiBtdkh3c0N0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWcoKTsgLy8gc3R1Ygp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiB1cGRhdGVVc2IzRGV2aWNlQ29uZmlnCiogREVTQ1JJUFRJT046IFVwZGF0ZSBVU0IzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaWYgVVNCMyBkZXZpY2UgaXMgZW5hYmxlZAoqIElOUFVUOgoqCXRvcG9sb2d5Q29uZmlnUHRyIC0gcG9pbnRlciB0byB0aGUgU2VyZGVzIG1hcHBpbmcKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgdXBkYXRlVXNiM0RldmljZUNvbmZpZyhTRVJERVNfTUFQICpzZXJkZXNNYXBBcnJheSkKewoJTVZfVTMyIGxhbmVOdW07Cglmb3IgKGxhbmVOdW0gPSAwOyBsYW5lTnVtIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IGxhbmVOdW0rKykgewoJCWlmIChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfREVWSUNFKSB7CgkJCS8qIHdyaXRlIDB4MSB0byBVU0IzX0NPTkZJR19SRUdbMDoxXQoJCQkgKiBCSVQwIChVU0IzIERldmljZSBVVE1JIEVuKQkwIDogVVNCMyBEZXZpY2UgZGlzYWJsZWQuCgkJCSAqCQkJCSAgICAoVVNCMiBvbiBVVE1JMCwgYW5kIFVTQjMgSG9zdDEgb24gVVRNSTIpCgkJCSAqCQkJICAgICAtPiAxIDogVVNCMyBEZXZpY2UgZW5hYmxlZAoJCQkgKgoJCQkgKiBCSVQxIChVU0IzIERldmljZSBVVE1JIE11eCkJLT4gMCA6IFVUTUkyOiBVU0IzIERldmljZSBpcyBvbiBVVE1JMgoJCQkgKgkJCQkgICAxIDogVVRNSTA6IFVTQjMgRGV2aWNlIGlzIG9uIFVUTUkwICovCgkJCU1WX1JFR19CSVRfUkVTRVQoVVNCM19DT05GSUdfUkVHLCBCSVQxKTsKCQkJTVZfUkVHX0JJVF9TRVQoVVNCM19DT05GSUdfUkVHLCBCSVQwKTsKCQkJcmV0dXJuOwoJCX0KCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIE1WX1NUQVRVUyBtdlNlcmRlc1BleFVzYjNQaXBlRGVsYXlXQShNVl9VMzIgc2VyZGVzTnVtLCBNVl9VOCBzZXJkZXNUeXBlKQp7CglNVl9VMzIgcmVnRGF0YTsKCgkvKiBXQSBmb3IgQTM4MCBaMSByZWxldmFudCBmb3IgbGFuZXMgMyw0LDUgb25seSovCglpZiAoc2VyZGVzTnVtID49IDMpCgl7CgkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDBfUkVHKTsKCQkvKiBzZXQgZGVsYXkgb24gcGlwZSAtCgkJICogV2hlbiBsYW5lIDMgaXMgY29ubmVjdGVkIHRvIGEgTUFDIG9mIFBleCAtPiBzZXQgYml0IDcgdG8gMS4KCQkgKiBXaGVuIGxhbmUgMyBpcyBjb25uZWN0ZWQgdG8gYSBNQUMgb2YgVVNCMyAtPiBzZXQgYml0IDcgdG8gMC4KCQkgKiBXaGVuIGxhbmUgNCBpcyBjb25uZWN0ZWQgdG8gYSBNQUMgb2YgUGV4IC0+IHNldCBiaXQgOCB0byAxLgoJCSAqIFdoZW4gbGFuZSA0IGlzIGNvbm5lY3RlZCB0byBhIE1BQyBvZiBVU0IzIC0+IHNldCBiaXQgOCB0byAwLgoJCSAqIFdoZW4gbGFuZSA1IGlzIGNvbm5lY3RlZCB0byBhIE1BQyBvZiBQZXggLT4gc2V0IGJpdCA4IHRvIDEuCgkJICogV2hlbiBsYW5lIDUgaXMgY29ubmVjdGVkIHRvIGEgTUFDIG9mIFVTQjMgLT4gc2V0IGJpdCA4IHRvIDAuCgkJICovCgkJaWYgKHNlcmRlc1R5cGUgPT0gUEVYKQoJCXsKCQkJcmVnRGF0YSB8PSAxIDw8ICg3ICsgKHNlcmRlc051bSAtIDMpKTsKCQl9CgkJaWYgKHNlcmRlc1R5cGUgPT0gVVNCMykKCQl7CgkJCS8qIFVTQjMgKi8KCQkJcmVnRGF0YSAmPSB+KDEgPDwgKDcgKyAoc2VyZGVzTnVtIC0gMykpKTsKCQl9CgkJTVZfUkVHX1dSSVRFKEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDBfUkVHLCByZWdEYXRhKTsKCX0KCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12SHdzU2VyZGVzUGV4UmVmQ2xvY2tTYXRSR2V0IC0KKgoqIERFU0NSSVBUSU9OOiBHZXQgdGhlIHJlZmVyZW5jZSBjbG9jayB2YWx1ZSBmcm9tIERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyBhbmQgY2hlY2s6CiogICAgICAgICAgICAgIGJpdFsyXSBmb3IgUEVYIzAsIGJpdFszXSBmb3IgUEVYIzEsIGJpdFszMF0gZm9yIFBFWCMyLCBiaXRbMzFdIGZvciBQRVgjMy4KKiAgICAgICAgICAgICAgSWYgYml0PTAgLS0+IFJFRl9DTE9DS18xMDBNSHoKKiAgICAgICAgICAgICAgSWYgYml0PTEgJiYgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHIGJpdFswXT0wIC0tPiBSRUZfQ0xPQ0tfMjVNSHoKKiAgICAgICAgICAgICAgSWYgYml0PTEgJiYgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHIGJpdFswXT0xIC0tPiBSRUZfQ0xPQ0tfNDBNSHoKKgoqIElOUFVUOiAgICAgICAgc2VyZGVzVHlwZSAtIFR5cGUgb2YgU2VyZGVzCioKKiBPVVRQVVQ6ICAgICAgIHBleFNhdFIgICAtICBSZXR1cm4gdGhlIFJFRl9DTE9DSyB2YWx1ZToKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfQ0xPQ0tfMjVNSHosIFJFRl9DTE9DS180ME1IeiBvciBSRUZfQ0xPQ0tfMTAwTUh6CioKKiBSRVRVUk5TOiAgICAgIE1WX09LICAgICAgICAtIGZvciBzdWNjZXNzCiogICAgICAgICAgICAgICBNVl9CQURfUEFSQU0gLSBmb3IgZmFpbAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1NlcmRlc1BleFJlZkNsb2NrU2F0UkdldChTRVJERVNfVFlQRSBzZXJkZXNUeXBlLCBNVl9VMzIgKnBleFNhdFIpCnsKICAgIE1WX1UzMiBkYXRhLCByZWdTYXRSMTsKCiAgICByZWdTYXRSMSA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyk7CgogICAgc3dpdGNoIChzZXJkZXNUeXBlKSB7CiAgICBjYXNlIFBFWDA6CiAgICAgICAgZGF0YSA9IFJFRl9DTEtfU0VMRUNUT1JfVkFMX1BFWDAocmVnU2F0UjEpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBQRVgxOgogICAgICAgIGRhdGEgPSBSRUZfQ0xLX1NFTEVDVE9SX1ZBTF9QRVgxKHJlZ1NhdFIxKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUEVYMjoKICAgICAgICBkYXRhID0gUkVGX0NMS19TRUxFQ1RPUl9WQUxfUEVYMihyZWdTYXRSMSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFBFWDM6CiAgICAgICAgZGF0YSA9IFJFRl9DTEtfU0VMRUNUT1JfVkFMX1BFWDMocmVnU2F0UjEpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBtdlByaW50ZigiJXM6IEVycm9yOiBTZXJEZXMgdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgc2VyZGVzVHlwZSk7CiAgICAgICAgcmV0dXJuIE1WX0JBRF9QQVJBTTsKICAgIH0KCiAgICAqcGV4U2F0UiA9IGRhdGE7CgogICAgcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9VMzIgbXZId3NTZXJkZXNHZXRSZWZDbG9ja1ZhbChTRVJERVNfVFlQRSBzZXJkZXNUeXBlKQp7CiAgICBNVl9VMzIgcGV4U2F0UjsKICAgIFJFRl9DTE9DSyByZWZDbG9jazsKCiAgICBERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NTZXJkZXNHZXRSZWZDbG9ja1ZhbCAjIyNcbiIpOwoKICAgIGlmIChzZXJkZXNUeXBlID49IExBU1RfU0VSREVTX1RZUEUpIHsKICAgICAgICByZXR1cm4gUkVGX0NMT0NLX1VOU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHJlYWQgcmVmIGNsb2NrIGZyb20gU0BSICovCiAgICByZWZDbG9jayA9IG12SHdzU2VyZGVzU2lsaWNvblJlZkNsb2NrR2V0KCk7CgogICAgaWYoc2VyZGVzVHlwZSA+IFBFWDMpIHsKICAgICAgICAvKiBmb3IgYWxsIFNlcmRlcyB0eXBlcyBidXQgUENJZSAqLwogICAgICAgIHJldHVybiByZWZDbG9jazsKICAgIH0KCiAgICAvKiBmb3IgUENJZSwgbmVlZCBhbHNvIHRvIGNoZWNrIFBDSWUgU0BSICovCiAgICBDSEVDS19TVEFUVVMobXZId3NTZXJkZXNQZXhSZWZDbG9ja1NhdFJHZXQoc2VyZGVzVHlwZSwgJnBleFNhdFIpKTsKCiAgICBpZiAocGV4U2F0UiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIFJFRl9DTE9DS19fMTAwTUh6OwogICAgfQogICAgZWxzZSBpZihwZXhTYXRSID09IDEpIHsKICAgICAgICAvKiB2YWx1ZSBvZiAxIG1lYW5zIHdlIGNhbiB1c2UgcmVmIGNsb2NrIGZyb20gU29DIChhcyBvdGhlciBTZXJkZXMgdHlwZXMpICovCiAgICAgICAgcmV0dXJuIHJlZkNsb2NrOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXZQcmludGYoIiVzOiBFcnJvcjogUkVGX0NMS19TRUxFQ1RPUl9WQUwgZm9yIFNlckRlcyB0eXBlICVkIGlzIHdyb25nXG4iLCBfX2Z1bmNfXywgc2VyZGVzVHlwZSk7CiAgICAgICAgcmV0dXJuIFJFRl9DTE9DS19VTlNVUFBPUlRFRDsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12U2VyZGVzUG93ZXJVcEN0cmwKKAoJTVZfVTMyIHNlcmRlc051bSwKCU1WX0JPT0wgc2VyZGVzUG93ZXJVcCwKCVNFUkRFU19UWVBFIHNlcmRlc1R5cGUsCglTRVJERVNfU1BFRUQgYmF1ZFJhdGUsCglTRVJERVNfTU9ERSAgc2VyZGVzTW9kZSwKCVJFRl9DTE9DSyByZWZDbG9jawopCnsKI2lmZGVmIERCX0xJTktfQ0hFQ0sKCWludCBpOwojZW5kaWYKCU1WX1UzMiBzYXRhSWR4LCBwZXhJZHgsc2F0YVBvcnQ7CglTRVJERVNfU0VRIHNwZWVkU2VxSWQ7CglNVl9VMzIgcmVnRGF0YTsKCU1WX0JPT0wgaXNQZXhCeTE7CglNVl9VMzIJYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOwoKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdlNlcmRlc1Bvd2VyVXBDdHJsICMjI1xuIik7CgoJaWYgKHNlcmRlc1Bvd2VyVXAgPT0gTVZfVFJVRSkgeyAvKiBTZXJkZXMgcG93ZXIgdXAgKi8KCQlERUJVR19JTklUX0ZVTExfUygibXZTZXJkZXNQb3dlclVwQ3RybDogZXhlY3V0aW5nIHBvd2VyIHVwLi4gIik7CgkJREVCVUdfSU5JVF9GVUxMX0MoInNlcmRlcyBudW0gPSAiLCBzZXJkZXNOdW0sIDIpOwoJCURFQlVHX0lOSVRfRlVMTF9DKCJzZXJkZXMgdHlwZSA9ICIsIHNlcmRlc1R5cGUsIDIpOwoKCQlERUJVR19JTklUX0ZVTExfUygiR29pbmcgYWNjZXNzIDEiKTsKCgkJLyogR2V0dGluZyB0aGUgU3BlZWQgU2VsZWN0IHNlcXVlbmNlIGlkICovCgkJc3BlZWRTZXFJZCA9IHNlcmRlc1R5cGVBbmRTcGVlZFRvU3BlZWRTZXEoc2VyZGVzVHlwZSwgYmF1ZFJhdGUpOwoJCWlmIChzcGVlZFNlcUlkID09IFNFUkRFU19MQVNUX1NFUSkgewoJCQltdlByaW50ZigibXZTZXJkZXNQb3dlclVwQ3RybDogc2VyZGVzIHR5cGUgJWQgYW5kIHNwZWVkICVkIGFyZSBub3Qgc3VwcG9ydGVkIHRvZ2V0aGVyXG4iLAoJCQkJCSBzZXJkZXNUeXBlLCBiYXVkUmF0ZSk7CgoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwoJCX0KCgkJLyogRXhlY3V0aW5nIHBvd2VyIHVwLCByZWYgY2xvY2sgc2V0LCBzcGVlZCBjb25maWcgYW5kIFRYIGNvbmZpZyAqLwoJCXN3aXRjaCAoc2VyZGVzVHlwZSkgewoJCWNhc2UgUEVYMDoKCQljYXNlIFBFWDE6CgkJY2FzZSBQRVgyOgoJCWNhc2UgUEVYMzoKCQkJaWYgKG12SHdzQ3RybFNlcmRlc1JldkdldCgpID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQZXhVc2IzUGlwZURlbGF5V0Eoc2VyZGVzTnVtLCBQRVgpKTsKCQkJfQoKCQkJaXNQZXhCeTEgPSAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3gxKSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3gxKTsKCQkJcGV4SWR4ID0gc2VyZGVzVHlwZSAtIFBFWDA7CgoJCQlpZiAoKGlzUGV4QnkxID09IE1WX1RSVUUpIHx8ICgoc2VyZGVzVHlwZSA9PSBQRVgwKSAmJiAoc2VyZGVzTnVtID09IDApKSkKCQkJewoJCQkJLyogdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBmb3IgUEVYeDEgYW5kIGZvciBQRVggYnkgNC1mb3IgdGhlIGZpcnN0IGxhbmUgb25seSAqLwoJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFNPQ19DT05UUk9MX1JFRzEpOwoJCQkJaWYgKGlzUGV4QnkxID09IE1WX1RSVUUpCgkJCQkJcmVnRGF0YSB8PSAweDQwMDA7CgkJCQllbHNlCgkJCQkJcmVnRGF0YSAmPSB+MHg0MDAwOwoJCQkJTVZfUkVHX1dSSVRFKFNPQ19DT05UUk9MX1JFRzEsIHJlZ0RhdGEpOwoKCQkJCS8qIFNldHVwIGxpbmsgd2lkdGggYml0Wzk6NF0gKi8KCQkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChQRVhfTElOS19DQVBBQklMSVRJRVNfUkVHKHBleElkeCkpOwoJCQkJcmVnRGF0YSAmPSB+MHgzRjA7CgkJCQlpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkKCQkJCQlyZWdEYXRhIHw9IDB4MTA7CgkJCQllbHNlCgkJCQkJcmVnRGF0YSB8PSAweDQwOwoJCQkJTVZfUkVHX1dSSVRFKFBFWF9MSU5LX0NBUEFCSUxJVElFU19SRUcocGV4SWR4KSwgcmVnRGF0YSk7CgoJCQkJLyogU2V0dXAgbWF4aW11bSBsaW5rIHNwZWVkIGJpdFszOjBdICovCgkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoUEVYX0xJTktfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZHgpKTsKCQkJCXJlZ0RhdGEgJj0gfjB4RjsKCQkJCWlmICgoYm9hcmRJZCA9PSBEQl9BTUNfNjgyMF9JRCkgJiYgKHBleElkeCA9PSAwKSAmJgoJCQkJCW12Qm9hcmRGb3JjZVBjaWVHZW4xR2V0KCkpIHsKCQkJCQkvKiBUaGUgV0EgaXMgcmVxdWlyZWQgZm9yIEJDMiBBMCwgc28gU2F0UiBpcyBjb2RlZCBhY2NvcmRpbmdseSAqLwoJCQkJCW12UHJpbnRmKCJGb3JjaW5nIExpbmsgdG8gR0VOMSBvbiBQQ0llLSVkXG4iLCBwZXhJZHgpOwoJCQkJCXJlZ0RhdGEgfD0gMHgxOyAvKiBHRU4xLCAyLjVHICovCgkJCQl9IGVsc2UKCQkJCQlyZWdEYXRhIHw9IDB4MjsgLyogR0VOMiwgNUcgKi8KCQkJCU1WX1JFR19XUklURShQRVhfTElOS19DQVBBQklMSVRJRVNfUkVHKHBleElkeCksIHJlZ0RhdGEpOwoKCQkJCS8qIFNldHVwIGNvbW1vbiBjbG9jayBjb25maWd1cmF0aW9uIGJpdFs2XSAqLwoJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFBFWF9MSU5LX0NUUkxfU1RBVFVTX1JFRyhwZXhJZHgpKTsKCQkJCXJlZ0RhdGEgJj0gfjB4NDA7CgkJCQlyZWdEYXRhIHw9IDB4NDA7CgkJCQlNVl9SRUdfV1JJVEUoUEVYX0xJTktfQ1RSTF9TVEFUVVNfUkVHKHBleElkeCksIHJlZ0RhdGEpOwoJCQl9CgogICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1BPV0VSX1VQX1NFUSkpOwogICAgICAgICAgICAgaWYgKGlzUGV4QnkxID09IE1WX0ZBTFNFKSB7CiAgICAgICAgICAgICAgICAvKiBmb3IgUEVYIGJ5IDQgLSB1c2UgdGhlIHNlcmRlc051bSBhcyB0aGUgc2VxIGFycmF5IGluZGV4ICovCiAgICAgICAgICAgICAgICBzZXJkZXNTZXFEYltQRVhfQllfNF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gc2VyZGVzTnVtOwogICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9CWV80X0NPTkZJR19TRVEpKTsKICAgICAgICAgICAgfQoJICAgIENIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIHNwZWVkU2VxSWQpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKCgkgICBpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkgewoJCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9UWF9DT05GSUdfU0VRMikpOwoJCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9UWF9DT05GSUdfU0VRMykpOwoJCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9UWF9DT05GSUdfU0VRMSkpOwoJCQl9CgoJCQltdk9zVURlbGF5KDIwKTsKCiNpZmRlZiBEQl9MSU5LX0NIRUNLCgkJCWlmIChzZXJkZXNOdW0gPT0gMSkgewoJCQkJTVZfUkVHX1dSSVRFKFNPQ19DT05UUk9MX1JFRzEsIDB4MDcwN0MwRjEpOwoJCQkJZm9yIChpID0gMDsgaSA8IExJTktfV0FJVF9DTlRSOyBpKyspIHsKCQkJCQlpZiAoKE1WX1JFR19SRUFEKDB4ODFhNjQpICYgMHhGRikgPT0gMHg3RSkgewoJCQkJCQlERUJVR19JTklUX1MoIlBDSWUwIExJTksgVVAgOy0pXG4iKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCW12T3NVRGVsYXkoTElOS19XQUlUX1NMRUVQKTsKCQkJCX0KCgkJCQlpZiAoaSA9PSBMSU5LX1dBSVRfQ05UUikKCQkJCQlERUJVR19JTklUX1MoIlBDSWUwIE5PIExJTksgOy18XG4iKTsKCQkJfWVsc2V7CgkJCQlNVl9SRUdfV1JJVEUoU09DX0NPTlRST0xfUkVHMSwgMHgwNzA3QzBGMyk7CgkJCQlmb3IgKGkgPSAwOyBpIDwgTElOS19XQUlUX0NOVFI7IGkrKykgewoJCQkJCWlmICgoTVZfUkVHX1JFQUQoMHg0MWE2NCkgJiAweEZGKSA9PSAweDdFKSB7CgkJCQkJCURFQlVHX0lOSVRfUygiUENJZTEgTElOSyBVUCA7LSlcbiIpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbXZPc1VEZWxheShMSU5LX1dBSVRfU0xFRVApOwoJCQkJfQoKCQkJCWlmIChpID09IExJTktfV0FJVF9DTlRSKQoJCQkJCURFQlVHX0lOSVRfUygiUENJZTEgTk8gTElOSyA7LXxcbiIpOwoJCQl9CiNlbmRpZiAgICAgICAgICAgICAgICAgIC8qIERCX0xJTktfQ0hFQ0sgKi8KCgkJCWJyZWFrOwoJCWNhc2UgVVNCM19IT1NUMDoKCQljYXNlIFVTQjNfSE9TVDE6CiAgICAgICAgY2FzZSBVU0IzX0RFVklDRToKCQkJaWYgKG12SHdzQ3RybFNlcmRlc1JldkdldCgpID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQZXhVc2IzUGlwZURlbGF5V0Eoc2VyZGVzTnVtLCBVU0IzKSk7CgkJCX0KCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfUE9XRVJfVVBfU0VRKSk7CgkJCUNIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIHNwZWVkU2VxSWQpKTsKICAgICAgICAgICAgaWYgKHNlcmRlc1R5cGUgPT0gVVNCM19ERVZJQ0UpIHsKICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBVU0IzX0RFVklDRV9DT05GSUdfU0VRKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBVU0IzX1RYX0NPTkZJR19TRVExKSk7CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBVU0IzX1RYX0NPTkZJR19TRVEyKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBVU0IzX1RYX0NPTkZJR19TRVEzKSk7CgoJCQltdk9zVURlbGF5KDEwMDAwKTsKCiNpZmRlZiBEQl9MSU5LX0NIRUNLCgkJCWlmICggc2VyZGVzTnVtID09IDQpIHsKCQkJCWlmICggMCAhPSAoTVZfUkVHX1JFQUQoMHhBMjAwNCkgJiAweDEwMCkpCgkJCQkJREVCVUdfSU5JVF9TKCJVU0IgUExMMCBMT0NLRUQgOy18XG4iKTsKCQkJCWVsc2UKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwwIFVOTE9DSyA7LSlcbiIpOwoKCQkJCWlmICggMHhEID09IChNVl9SRUdfUkVBRCgweDE4M0I4KSAmIDB4RCkpCgkJCQkJREVCVUdfSU5JVF9TKCJVU0IgUExMMCBSRUFEWSA7LSlcbiIpOwoJCQkJZWxzZQoJCQkJCURFQlVHX0lOSVRfUygiVVNCIFBMTDAgTk9UIFJFQURZIDstfFxuIik7CgkJCX1lbHNlewoJCQkJaWYgKCAwICE9IChNVl9SRUdfUkVBRCgweEEyODA0KSAmIDB4MTAwKSkKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwxIExPQ0tFRCA7LXxcbiIpOwoJCQkJZWxzZQoJCQkJCURFQlVHX0lOSVRfUygiVVNCIFBMTDEgVU5MT0NLIDstKVxuIik7CgoJCQkJaWYgKCAweEQgPT0gKE1WX1JFR19SRUFEKDB4MTgzRTApICYgMHhEKSkKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwxIFJFQURZIDstKVxuIik7CgkJCQllbHNlCgkJCQkJREVCVUdfSU5JVF9TKCJVU0IgUExMMSBOT1QgUkVBRFkgOy18XG4iKTsKCQkJfQojZW5kaWYgLyogREJfTElOS19DSEVDSyAqLwoKCQkJYnJlYWs7CgkJY2FzZSBTQVRBMDoKCQljYXNlIFNBVEExOgoJCWNhc2UgU0FUQTI6CgkJY2FzZSBTQVRBMzoKCQkJc2F0YUlkeCA9ICgoc2VyZGVzVHlwZSA9PSBTQVRBMCkgfHwgKHNlcmRlc1R5cGUgPT0gU0FUQTEpKSA/IDAgOiAxOwoJCQlzYXRhUG9ydCA9ICgoc2VyZGVzVHlwZSA9PSBTQVRBMCkgfHwgKHNlcmRlc1R5cGUgPT0gU0FUQTIpKSA/IDAgOiAxOwoKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzYXRhSWR4LCAoc2F0YVBvcnQgPT0gMCkgPyBTQVRBX1BPUlRfMF9PTkxZX1BPV0VSX1VQX1NFUSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FUQV9QT1JUXzFfT05MWV9QT1dFUl9VUF9TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNBVEFfUE9XRVJfVVBfU0VRKSk7CgkJCUNIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIHNwZWVkU2VxSWQpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNBVEFfRUxFQ1RSSUNBTF9DT05GSUdfU0VRKSk7CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTQVRBX1RYX0NPTkZJR19TRVExKSk7CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2F0YUlkeCwgKHNhdGFQb3J0ID09IDApID8gU0FUQV9QT1JUXzBfT05MWV9UWF9DT05GSUdfU0VRIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQVRBX1BPUlRfMV9PTkxZX1RYX0NPTkZJR19TRVEpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNBVEFfVFhfQ09ORklHX1NFUTIpKTsKCgkJCW12T3NVRGVsYXkoMTAwMDApOwojaWZkZWYgREJfTElOS19DSEVDSwoJCQlpZiAoIHNlcmRlc051bSA9PSAwKSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgTElOS19XQUlUX0NOVFI7IGkrKykgewoJCQkJCWlmICgoTVZfUkVHX1JFQUQoMHgxODMxOCkgJiAweEQpID09IDB4RCkgewoJCQkJCQlERUJVR19JTklUX1MoIlNBVEEwIFBMTCBSRUFEWSA7LSlcbiIpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbXZPc1VEZWxheShMSU5LX1dBSVRfU0xFRVApOwoJCQkJfQoKCQkJCWlmIChpID09IExJTktfV0FJVF9DTlRSKQoJCQkJCURFQlVHX0lOSVRfUygiU0FUQTAgUExMIE5PVCBSRUFEWVxuIik7CgkJCX1lbHNlewoJCQkJZm9yIChpID0gMDsgaSA8IExJTktfV0FJVF9DTlRSOyBpKyspIHsKCQkJCQlpZiAoKE1WX1JFR19SRUFEKDB4MTgzOTApICYgMHhEKSA9PSAweEQpIHsKCQkJCQkJREVCVUdfSU5JVF9TKCJTQVRBMSBQTEwgUkVBRFkgOy0pXG4iKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCW12T3NVRGVsYXkoTElOS19XQUlUX1NMRUVQKTsKCQkJCX0KCgkJCQlpZiAoaSA9PSBMSU5LX1dBSVRfQ05UUikKCQkJCQlERUJVR19JTklUX1MoIlNBVEExIFBMTCBOT1QgUkVBRFlcbiIpOwoJCQl9CiNlbmRpZiAgICAgICAgICAgICAgICAgIC8qIERCX0xJTktfQ0hFQ0sgKi8KCQkJYnJlYWs7CgkJY2FzZSBTR01JSTA6CgkJY2FzZSBTR01JSTE6CgkJY2FzZSBTR01JSTI6CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTR01JSV9QT1dFUl9VUF9TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwogICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTR01JSV9UWF9DT05GSUdfU0VRMSkpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0dNSUlfVFhfQ09ORklHX1NFUTIpKTsKCgkJCS8qIEdCRSBjb25maWd1cmF0aW9uICovCgkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChHQkVfQ09ORklHVVJBVElPTl9SRUcpOwoJCQlyZWdEYXRhIHw9IDB4MSA8PCAoc2VyZGVzVHlwZSAtIFNHTUlJMCk7IC8qIHdyaXRlIHRoZSBTR01JSSBpbmRleCAqLwoJCQlNVl9SRUdfV1JJVEUoR0JFX0NPTkZJR1VSQVRJT05fUkVHLCByZWdEYXRhKTsKCgkJCWJyZWFrOwoJCWNhc2UgUVNHTUlJOgoJCQlpZiAobXZId3NDdHJsU2VyZGVzUmV2R2V0KCkgPCBNVl9TRVJERVNfUkVWXzJfMSkgewoJCQkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7CgkJCX0KCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFFTR01JSV9QT1dFUl9VUF9TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUVNHTUlJX0VMRUNUUklDQUxfQ09ORklHX1NFUSkpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUVNHTUlJX1RYX0NPTkZJR19TRVExKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBRU0dNSUlfVFhfQ09ORklHX1NFUTIpKTsKICAgICAgICAgICAgYnJlYWs7CgkJY2FzZSBTR01JSXYzXzA6CgkJY2FzZSBTR01JSXYzXzE6CgkJY2FzZSBTR01JSXYzXzI6CgkJY2FzZSBTR01JSXYzXzM6CgkJY2FzZSBYQVVJOgogICAgICAgIGNhc2UgUlhBVUk6CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcmRlc1Bvd2VyVXBDdHJsRXh0KHNlcmRlc051bSwgc2VyZGVzUG93ZXJVcCwgc2VyZGVzVHlwZSwgYmF1ZFJhdGUsIHNlcmRlc01vZGUsIHJlZkNsb2NrKSk7CiAgICAgICAgICAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJCURFQlVHX0lOSVRfUygibXZTZXJkZXNQb3dlclVwQ3RybDogYmFkIHNlcmRlc1R5cGUgcGFyYW1ldGVyXG4iKTsKCQkJcmV0dXJuIE1WX0JBRF9QQVJBTTsKCQl9Cgl9ZWxzZSB7IC8qIFNlcmRlcyBwb3dlciBkb3duICovCgkJREVCVUdfSU5JVF9GVUxMX1MoIm12U2VyZGVzUG93ZXJVcDogZXhlY3V0aW5nIHBvd2VyIGRvd24uLiAiKTsKCQlERUJVR19JTklUX0ZVTExfQygic2VyZGVzIG51bSA9ICIsIHNlcmRlc051bSwgMSk7CgoJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTRVJERVNfUE9XRVJfRE9XTl9TRVEpKTsKCX0KCglERUJVR19JTklUX0ZVTExfQygibXZTZXJkZXNQb3dlclVwQ3RybCBlbmRlZCBzdWNjZXNzZnVsbHkgZm9yIHNlcmRlcyAiLCBzZXJkZXNOdW0sIDIpOwoKCXJldHVybiBNVl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12SHdzVXBkYXRlU2VyZGVzUGh5U2VsZWN0b3JzKFNFUkRFU19NQVAqIHNlcmRlc0NvbmZpZ01hcCkKewoJTVZfVTMyIGxhbmVEYXRhLCBzZXJkZXNJZHgsc2VyZGVzTGFuZUh3TnVtLCByZWdEYXRhID0gMDsKCVNFUkRFU19UWVBFIHNlcmRlc1R5cGU7CglTRVJERVNfTU9ERSBzZXJkZXNNb2RlOwoJTVZfVTggICAgICAgc2VsZWN0Qml0T2ZmOwoJTVZfQk9PTCBpc1BFWHg0ID0gTVZfRkFMU0U7CglNVl9CT09MIHVwZGF0ZWRUb3BvbG9neVByaW50ID0gTVZfRkFMU0U7CgoJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzVXBkYXRlU2VyZGVzUGh5U2VsZWN0b3JzICMjI1xuIik7CglERUJVR19JTklUX0ZVTExfUygiVXBkYXRpbmcgdGhlIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdpc3RlciB3aXRoIHRoZSBzZXJkZXMgdHlwZXNcbiIpOwoKCWlmKG12SHdzQ3RybFNlcmRlc1JldkdldCgpID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VsZWN0Qml0T2ZmID0gMzsKCX0gZWxzZSB7CgkJc2VsZWN0Qml0T2ZmID0gNDsKCX0KCgkvKiBVcGRhdGluZyBiaXRzIDAtMTcgaW4gdGhlIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIHNlcmRlcyB0eXBlcyAqLwoJZm9yIChzZXJkZXNJZHggPSAwOyBzZXJkZXNJZHggPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgc2VyZGVzSWR4KyspIHsKCQlzZXJkZXNUeXBlID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkeF0uc2VyZGVzVHlwZTsKCQlzZXJkZXNNb2RlID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZTsKCQlzZXJkZXNMYW5lSHdOdW0gPSBtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKHNlcmRlc0lkeCk7CgoJCWxhbmVEYXRhID0gbXZId3NTZXJkZXNHZXRQaHlTZWxlY3RvclZhbChzZXJkZXNMYW5lSHdOdW0sIHNlcmRlc1R5cGUpOwoKCQlpZihzZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAobXZId3NTZXJkZXNUb3BvbG9neVZlcmlmeShzZXJkZXNUeXBlLHNlcmRlc0lkeCxzZXJkZXNNb2RlKSAhPSBNVl9PSyl7CgkJCXNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZHhdLnNlcmRlc1R5cGUgPSBERUZBVUxUX1NFUkRFUzsKCQkJbXZQcmludGYoIiVzOiBTZXJEZXMgbGFuZSAjJWQgaXMgIGRpc2FibGVkXG4iLF9fZnVuY19fLCBzZXJkZXNMYW5lSHdOdW0pOwoJCQl1cGRhdGVkVG9wb2xvZ3lQcmludCA9IE1WX1RSVUU7CgkJCWNvbnRpbnVlOwoJCX0KCQkvKiBDaGVja2luZyBpZiB0aGUgYm9hcmQgdG9wb2xvZ3kgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBQRVh4NCAtIGZvciB0aGUgbmV4dCBzdGVwICovCgkJaWYgKChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKSB7CgkJCSAvKiB1cGRhdGUgbGFuZSBkYXRhIHRvIHRoZSAzIG5leHQgU0VSREVTIGxhbmVzICovCgkJCWxhbmVEYXRhID0gY29tbW9uUGh5c1NlbGVjdG9yc1BleEJ5NExhbmVzW3NlcmRlc0xhbmVId051bV07CgkJCWlmIChzZXJkZXNUeXBlID09IFBFWDApIHsKCQkJCWlzUEVYeDQgPSBNVl9UUlVFOwoJCQl9CgkJfQoKCQlpZiAobGFuZURhdGEgPT0gTkEpIHsKCQkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiBTZXJEZXMgbGFuZSAjJWQgYW5kIHR5cGUgJWQgYXJlIG5vdCBzdXBwb3J0ZWQgdG9nZXRoZXJcbiIsCgkJCQkJX19mdW5jX18sIHNlcmRlc0xhbmVId051bSwgc2VyZGVzTW9kZSk7CgkJCXNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZHhdLnNlcmRlc1R5cGUgPSBERUZBVUxUX1NFUkRFUzsKCQkJbXZQcmludGYoIiVzOiBTZXJEZXMgbGFuZSAjJWQgaXMgIGRpc2FibGVkXG4iLF9fZnVuY19fLCBzZXJkZXNMYW5lSHdOdW0pOwoJCQljb250aW51ZTsKCQl9CgkJLyogVXBkYXRpbmcgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gQ09NTU9OX1BIWVNfU0VMRUNUT1JTX1JFRyAqLwoJCXJlZ0RhdGEgfD0gKGxhbmVEYXRhIDw8IChzZWxlY3RCaXRPZmYgKiBzZXJkZXNMYW5lSHdOdW0pKTsKCX0KCS8qIGNoZWNrIHRoYXQgbnVtYmVyIG9mIHVzZWQgbGFuZXMgZm9yIFBFWHg0IGlmIHVzZWQgaXMgcmlnaHQgKi8KCWlmIChpc1BFWHg0KQoJCW12SHdzU2VyZGVzUENJWDRUb3BvbG9neVZlcmlmeSgpOwoJLyogY2hlY2sgdGhhdCBudW1iZXIgb2YgdXNlZCBsYW5lcyBmb3IgWEFVSSBhbmQgUlhBVUkgKGlmIHVzZWQpIGlzIHJpZ2h0ICovCgltdkh3c1NlcmRlc1hBVUlUb3BvbG9neVZlcmlmeSgpOwoKCS8qIHByaW50IHRvcG9sb2d5ICovCglpZiAodXBkYXRlZFRvcG9sb2d5UHJpbnQpCgkJcHJpbnRUb3BvbG9neURldGFpbHMoc2VyZGVzQ29uZmlnTWFwKTsKCgkvKiBVcGRhdGluZyB0aGUgUEVYeDQgRW5hYmxlIGJpdCBpbiB0aGUgQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIGZvciBQRVh4NCBtb2RlICovCglyZWdEYXRhIHw9IChpc1BFWHg0ID09IE1WX1RSVUUpID8gKDB4MSA8PCBQRVh4NF9FTkFCTEVfT0ZGUykgOiAwOwoKCS8qIFVwZGF0aW5nIHRoZSBDT01NT04gUEhZUyBTRUxFQ1RPUlMgcmVnaXN0ZXIgKi8KCU1WX1JFR19XUklURShDT01NT05fUEhZU19TRUxFQ1RPUlNfUkVHLCByZWdEYXRhKTsKCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1JlZkNsb2NrU2V0CigKICAgIE1WX1UzMiBzZXJkZXNOdW0sCiAgICBTRVJERVNfVFlQRSBzZXJkZXNUeXBlLAogICAgUkVGX0NMT0NLIHJlZkNsb2NrCikKewogICAgTVZfVTMyIGRhdGExPTAsIGRhdGEyPTAsIGRhdGEzPTAsIHJlZ0RhdGE7CgogICAgREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzUmVmQ2xvY2tTZXQgIyMjXG4iKTsKCiAgICBpZiAobXZId3NJc1NlcmRlc0FjdGl2ZShzZXJkZXNOdW0pICE9IE1WX1RSVUUpIHsKICAgICAgICBtdlByaW50ZigiJXM6IFNlckRlcyBsYW5lICMlZCBpcyBub3QgQWN0aXZlXG4iLCBfX2Z1bmNfXywgc2VyZGVzTnVtKTsKICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOwogICAgfQoKICAgIHN3aXRjaCAoc2VyZGVzVHlwZSkgewogICAgY2FzZSBQRVgwOgogICAgY2FzZSBQRVgxOgogICAgY2FzZSBQRVgyOgogICAgY2FzZSBQRVgzOgogICAgICAgIHN3aXRjaCAocmVmQ2xvY2spIHsKICAgICAgICBjYXNlIFJFRl9DTE9DS19fMjVNSHo6CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQ09ORklHX1JFRl9DTE9DS18yNU1Iel9TRVEpKTsKICAgICAgICAgICAgcmV0dXJuIE1WX09LOwogICAgICAgIGNhc2UgUkVGX0NMT0NLX18xMDBNSHo6CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQ09ORklHX1JFRl9DTE9DS18xMDBNSHpfU0VRKSk7CiAgICAgICAgICAgIHJldHVybiBNVl9PSzsKI2lmZGVmIE1WODhGNjlYWAogICAgICAgIGNhc2UgUkVGX0NMT0NLX180ME1IejoKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9DT05GSUdfUkVGX0NMT0NLXzQwTUh6X1NFUSkpOwogICAgICAgICAgICByZXR1cm4gTVZfT0s7CiNlbmRpZgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG12UHJpbnRmKCIlczogRXJyb3I6IHJlZkNsb2NrICVkIGZvciBTZXJEZXMgbGFuZSAjJWQsIHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVmQ2xvY2ssIHNlcmRlc051bSwgc2VyZGVzVHlwZSk7CiAgICAgICAgICAgIHJldHVybiBNVl9CQURfUEFSQU07CiAgICAgICAgfQogICAgY2FzZSBVU0IzX0hPU1QwOgogICAgY2FzZSBVU0IzX0hPU1QxOgogICAgY2FzZSBVU0IzX0RFVklDRToKICAgICAgICBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX18yNU1IeikgewogICAgICAgICAgICBkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfMjVNSFpfVkFMXzI7CiAgICAgICAgICAgIGRhdGEyID0gR0xPQkFMX1BNX0NUUkxfUkVHXzI1TUhaX1ZBTDsKICAgICAgICAgICAgZGF0YTMgPSBMQU5FX0NGRzRfUkVHXzI1TUhaX1ZBTDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX180ME1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfNDBNSFpfVkFMOwogICAgICAgICAgICBkYXRhMiA9IEdMT0JBTF9QTV9DVFJMX1JFR180ME1IWl9WQUw7CiAgICAgICAgICAgIGRhdGEzID0gTEFORV9DRkc0X1JFR180ME1IWl9WQUw7CgkJfQoJCWVsc2V7CgkJCW12UHJpbnRmKCJtdkh3c1JlZkNsb2NrU2V0OiByZWYgY2xvY2sgaXMgbm90IHZhbGlkIGZvciBzZXJkZXMgdHlwZSAlZFxuIiwgc2VyZGVzVHlwZSk7CgkJCXJldHVybiBNVl9CQURfUEFSQU07CgkJfQoJCWJyZWFrOwoJY2FzZSBTQVRBMDoKCWNhc2UgU0FUQTE6CgljYXNlIFNBVEEyOgogICAgY2FzZSBTQVRBMzoKICAgIGNhc2UgU0dNSUkwOgoJY2FzZSBTR01JSTE6CgljYXNlIFNHTUlJMjoKCWNhc2UgUVNHTUlJOgoJCWlmIChyZWZDbG9jayA9PSBSRUZfQ0xPQ0tfXzI1TUh6KSB7CgkJCWRhdGExID0gUE9XRVJfQU5EX1BMTF9DVFJMX1JFR18yNU1IWl9WQUxfMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX180ME1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfNDBNSFpfVkFMOwogICAgICAgIH0KICAgICAgICBlbHNlewoJCQltdlByaW50ZigibXZId3NSZWZDbG9ja1NldDogcmVmIGNsb2NrIGlzIG5vdCB2YWxpZCBmb3Igc2VyZGVzIHR5cGUgJWRcbiIsIHNlcmRlc1R5cGUpOwoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwogICAgICAgIH0KICAgICAgICBicmVhazsKI2lmZGVmIE1WODhGNjlYWAoJY2FzZSBTR01JSXYzXzA6CgljYXNlIFNHTUlJdjNfMToKICAgICAgICBjYXNlIFNHTUlJdjNfMjoKCWNhc2UgU0dNSUl2M18zOgoJY2FzZSBYQVVJOgoJY2FzZSBSWEFVSToKICAgICAgICBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX18yNU1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfMjVNSFpfVkFMXzE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJlZkNsb2NrID09IFJFRl9DTE9DS19fNDBNSHopIHsKCQkJZGF0YTEgPSBQT1dFUl9BTkRfUExMX0NUUkxfUkVHXzQwTUhaX1ZBTDsKICAgICAgICB9CiAgICAgICAgZWxzZXsKCQkJbXZQcmludGYoIm12SHdzUmVmQ2xvY2tTZXQ6IHJlZiBjbG9jayBpcyBub3QgdmFsaWQgZm9yIHNlcmRlcyB0eXBlICVkXG4iLCBzZXJkZXNUeXBlKTsKCQkJcmV0dXJuIE1WX0JBRF9QQVJBTTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKCQlERUJVR19JTklUX1MoIm12SHdzUmVmQ2xvY2tTZXQ6IG5vdCBzdXBwb3J0ZWQgc2VyZGVzIHR5cGVcbiIpOwoJCXJldHVybiBNVl9CQURfUEFSQU07Cgl9CgoJLyogV3JpdGUgdGhlIHJlZkNsb2NrIHRvIHJlbGV2YW50IFNFTEVDVF9SRUZfQ0xPQ0tfUkVHIGJpdHMgYW5kIG9mZnNldCAqLwoJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFBPV0VSX0FORF9QTExfQ1RSTF9SRUcgKyBTRVJERVNfUkVHU19MQU5FX0JBU0VfT0ZGU0VUKHNlcmRlc051bSkpOwoJcmVnRGF0YSAmPSBQT1dFUl9BTkRfUExMX0NUUkxfUkVHX01BU0s7CglyZWdEYXRhIHw9IGRhdGExOwoJTVZfUkVHX1dSSVRFKFBPV0VSX0FORF9QTExfQ1RSTF9SRUcgKyBTRVJERVNfUkVHU19MQU5FX0JBU0VfT0ZGU0VUKHNlcmRlc051bSksIHJlZ0RhdGEpOwoKICAgIGlmICgoc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QwKSB8fCAoc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QxKSB8fCAoc2VyZGVzVHlwZSA9PSBVU0IzX0RFVklDRSkpIHsKICAgICAgICByZWdEYXRhID0gTVZfUkVHX1JFQUQoR0xPQkFMX1BNX0NUUkwgKyBTRVJERVNfUkVHU19MQU5FX0JBU0VfT0ZGU0VUKHNlcmRlc051bSkpOwogICAgICAgIHJlZ0RhdGEgJj0gR0xPQkFMX1BNX0NUUkxfUkVHX01BU0s7CiAgICAgICAgcmVnRGF0YSB8PSBkYXRhMjsKICAgICAgICBNVl9SRUdfV1JJVEUoR0xPQkFMX1BNX0NUUkwgKyBTRVJERVNfUkVHU19MQU5FX0JBU0VfT0ZGU0VUKHNlcmRlc051bSksIHJlZ0RhdGEpOwoKICAgICAgICByZWdEYXRhID0gTVZfUkVHX1JFQUQoTEFORV9DRkc0X1JFRyArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSk7CiAgICAgICAgcmVnRGF0YSAmPSBMQU5FX0NGRzRfUkVHX01BU0s7CiAgICAgICAgcmVnRGF0YSB8PSBkYXRhMzsKICAgICAgICBNVl9SRUdfV1JJVEUoTEFORV9DRkc0X1JFRyArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSwgcmVnRGF0YSk7CiAgICB9CgoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkh3c1BleFR4Q29uZmlnU2VxIC0KKgoqIERFU0NSSVBUSU9OOiAgICAgICAgICBTZXQgUEVYX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCBmb3IgUEVYeDQgbW9kZQoqIElOUFVUOiAgICAgICAgICAgICAgICBzZXJkZXNNYXAgICAgICAgLSBUaGUgYm9hcmQgdG9wb2xvZ3kgbWFwCiogT1VUUFVUOiAgICAgICAgICAgICAgIE5vbmUKKiBSRVRVUk5TOiAgICAgICAgICAgICAgTVZfT0sgICAgICAgICAgIC0gZm9yIHN1Y2Nlc3MKKiAgICAgICAgICAgICAgICAgICAgICAgTVZfQkFEX1BBUkFNICAgIC0gZm9yIGZhaWwKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZId3NQZXhUeENvbmZpZ1NlcShTRVJERVNfTUFQICpzZXJkZXNNYXApCnsKICAgIFNFUkRFU19NT0RFIHNlcmRlc01vZGU7CiAgICBNVl9VMzIgc2VyZGVzTGFuZUlkLCBzZXJkZXNMYW5lSHdOdW07CgogICAgREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzUGV4VHhDb25maWdTZXEgIyMjXG4iKTsKCgkvKiAgRm9yIFBFWHg0OiB0aGUgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMS8yLzMgY29uZmlndXJhdGlvbnMgc2hvdWxkIHJ1bgoJCQkgIGJ5IHNldHRpbmcgZWFjaCBzZXF1ZW5jZSBmb3IgYWxsIDQgbGFuZXMuICovCgoJLyogcmVsZXNlIHBpcGUgc29mdCByZXNldCBmb3IgYWxsIGxhbmVzICovCglmb3IgKHNlcmRlc0xhbmVJZCA9IDA7IHNlcmRlc0xhbmVJZCA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBzZXJkZXNMYW5lSWQrKykgewoJCXNlcmRlc01vZGUgPSBzZXJkZXNNYXBbc2VyZGVzTGFuZUlkXS5zZXJkZXNNb2RlOwoJCXNlcmRlc0xhbmVId051bSA9IG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0oc2VyZGVzTGFuZUlkKTsKCgkJaWYgKChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpKSB7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTGFuZUh3TnVtLCBQRVhfVFhfQ09ORklHX1NFUTEpKTsKCQl9Cgl9CgoJLyogc2V0IHBoeSBzb2Z0IHJlc2V0IGZvciBhbGwgbGFuZXMgKi8KCWZvciAoc2VyZGVzTGFuZUlkID0gMDsgc2VyZGVzTGFuZUlkIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IHNlcmRlc0xhbmVJZCsrKSB7CgkJc2VyZGVzTW9kZSA9IHNlcmRlc01hcFtzZXJkZXNMYW5lSWRdLnNlcmRlc01vZGU7CgkJc2VyZGVzTGFuZUh3TnVtID0gbXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShzZXJkZXNMYW5lSWQpOwoJCWlmICgoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSkgewoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc0xhbmVId051bSwgUEVYX1RYX0NPTkZJR19TRVEyKSk7CgkJfQoJfQoKCS8qIHNldCBwaHkgc29mdCByZXNldCBmb3IgYWxsIGxhbmVzICovCglmb3IgKHNlcmRlc0xhbmVJZCA9IDA7IHNlcmRlc0xhbmVJZCA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBzZXJkZXNMYW5lSWQrKykgewoJCXNlcmRlc01vZGUgPSBzZXJkZXNNYXBbc2VyZGVzTGFuZUlkXS5zZXJkZXNNb2RlOwoJCXNlcmRlc0xhbmVId051bSA9IG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0oc2VyZGVzTGFuZUlkKTsKCQlpZiAoKHNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkgfHwgKHNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkpIHsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNMYW5lSHdOdW0sIFBFWF9UWF9DT05GSUdfU0VRMykpOwoJCX0KCX0KCglyZXR1cm4gTVZfT0s7Cn0KCgoK