LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJtYWluLmgiCgpERUNMQVJFX0RFQlVHX0NIQU5ORUwoZmlsZSkKREVDTEFSRV9ERUJVR19DSEFOTkVMKG9sZSkKREVDTEFSRV9ERUJVR19DSEFOTkVMKHN0cmluZykKREVDTEFSRV9ERUJVR19DSEFOTkVMKHdpbjMyKQoKc3RydWN0IE5MU19sYW5nbG9jYWxlIHsKCWNvbnN0IGludCBsYW5nOwoJc3RydWN0IE5MU19sb2NhbGV2YXIgewoJCWNvbnN0IGludAl0eXBlOwoJCWNvbnN0IGNoYXIJKnZhbDsKCX0gbG9jdmFyc1sxNTBdOwp9OwoKI2RlZmluZSBMQU5HX0JFR0lOKGwscykJewlNQUtFTEFOR0lEKGwscyksIHsKCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpCQkJCQl7dHlwZSx2YWx1ZX0sCgojZGVmaW5lIExBTkdfRU5ECQkJCQkgfX0sCgpzdGF0aWMgY29uc3Qgc3RydWN0IE5MU19sYW5nbG9jYWxlIGxhbmdsb2NhbGVzW10gPSB7Ci8qIGFkZCBsYW5ndWFnZXMgaW4gbnVtZXJpY2FsIG9yZGVyIG9mIG1haW4gbGFuZ3VhZ2UgKGxhc3QgdHdvIGRpZ2l0cykKICogaXQgaXMgbXVjaCBlYXNpZXIgdG8gZmluZCB0aGUgbWlzc2luZyBob2xlcyB0aGF0IHdheSAqLwoKTEFOR19CRUdJTiAoTEFOR19DQVRBTEFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDAzKi8KI2luY2x1ZGUgIm5scy9jYXQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DWkVDSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNSovCiNpbmNsdWRlICJubHMvY3plLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDA2Ki8KI2luY2x1ZGUgIm5scy9kYW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOKQkJLyoweDA0MDcqLwojaW5jbHVkZSAibmxzL2RldS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9TV0lTUykJCS8qMHgwODA3Ki8KI2luY2x1ZGUgIm5scy9kZXMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU4pCS8qMHgwQzA3Ki8KI2luY2x1ZGUgIm5scy9kZWEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRykJLyoweDEwMDcqLwojaW5jbHVkZSAibmxzL2RlbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOKQkvKjB4MTQwNyovCiNpbmNsdWRlICJubHMvZGVjLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKQkJLyoweDA0MDkqLwojaW5jbHVkZSAibmxzL2VudS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VLKQkJLyoweDA4MDkqLwojaW5jbHVkZSAibmxzL2VuZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0FVUykJCS8qMHgwQzA5Ki8KI2luY2x1ZGUgIm5scy9lbmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQU4pCQkvKjB4MTAwOSovCiNpbmNsdWRlICJubHMvZW5jLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfTlopCQkvKjB4MTQwOSovCiNpbmNsdWRlICJubHMvZW56Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfRUlSRSkJCS8qMHgxODA5Ki8KI2luY2x1ZGUgIm5scy9pcmwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9TQUZSSUNBKQkvKjB4MUMwOSovCiNpbmNsdWRlICJubHMvZW5zLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSkJLyoweDIwMDkqLwojaW5jbHVkZSAibmxzL2Vuai5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0NBUlJJQkVBTikJLyoweDI0MDkqLwojaW5jbHVkZSAibmxzL2VuYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0JFTElaRSkJLyoweDI4MDkqLwojaW5jbHVkZSAibmxzL2VubC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEKSAgICAJLyoweDJDMDkqLwojaW5jbHVkZSAibmxzL2VudC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSCkJCS8qMHgwNDBhKi8KI2luY2x1ZGUgIm5scy9lc3AubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOKQkvKjB4MDgwYSovCiNpbmNsdWRlICJubHMvZXNtLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOKQkvKjB4MEMwYSovCiNpbmNsdWRlICJubHMvZXNuLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBKQkvKjB4MTAwYSovCiNpbmNsdWRlICJubHMvZXNnLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBKQkvKjB4MTQwYSovCiNpbmNsdWRlICJubHMvZXNjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BKQkvKjB4MTgwYSovCiNpbmNsdWRlICJubHMvZXNhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOKQkvKjB4MUMwQSovCiNpbmNsdWRlICJubHMvZXNkLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBKQkvKjB4MjAwYSovCiNpbmNsdWRlICJubHMvZXN2Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEpCS8qMHgyNDBhKi8KI2luY2x1ZGUgIm5scy9lc28ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QRVJVKQkJLyoweDI4MGEqLwojaW5jbHVkZSAibmxzL2Vzci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSkJLyoweDJjMGEqLwojaW5jbHVkZSAibmxzL2Vzcy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IpCS8qMHgzMDBhKi8KI2luY2x1ZGUgIm5scy9lc2YubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DSElMRSkJLyoweDM0MGEqLwojaW5jbHVkZSAibmxzL2VzbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkpCS8qMHgzODBhKi8KI2luY2x1ZGUgIm5scy9lc3kubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSkJLyoweDNjMGEqLwojaW5jbHVkZSAibmxzL2Vzei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEpCS8qMHg0MDBhKi8KI2luY2x1ZGUgIm5scy9lc2IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUikJLyoweDQ0MGEqLwojaW5jbHVkZSAibmxzL2VzZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTKQkvKjB4NDgwYSovCiNpbmNsdWRlICJubHMvZXNoLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBKQkvKjB4NGMwYSovCiNpbmNsdWRlICJubHMvZXNpLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08pCS8qMHg1MDBhKi8KI2luY2x1ZGUgIm5scy9lc3UubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBCKi8KI2luY2x1ZGUgIm5scy9maW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIKQkJLyoweDA0MEMqLwojaW5jbHVkZSAibmxzL2ZyYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOKQkvKjB4MDgwQyovCiNpbmNsdWRlICJubHMvZnJiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOKQkvKjB4MEMwQyovCiNpbmNsdWRlICJubHMvZnJjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX1NXSVNTKQkJLyoweDEwMEMqLwojaW5jbHVkZSAibmxzL2Zycy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHKQkvKjB4MTQwQyovCiNpbmNsdWRlICJubHMvZnJsLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSFVOR0FSSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBlKi8KI2luY2x1ZGUgIm5scy9odW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU4pCQkvKjB4MDQxMCovCiNpbmNsdWRlICJubHMvaXRhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU5fU1dJU1MpCS8qMHgwODEwKi8KI2luY2x1ZGUgIm5scy9pdHMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19LT1JFQU4sIFNVQkxBTkdfS09SRUFOKQkvKjB4MDQxMiovCiNpbmNsdWRlICJubHMva29yLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0gpCQkvKjB4MDQxMyovCiNpbmNsdWRlICJubHMvbmxkLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19EVVRDSCwgU1VCTEFOR19EVVRDSF9CRUxHSUFOKQkvKjB4MDgxMyovCiNpbmNsdWRlICJubHMvbmxiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19EVVRDSCwgU1VCTEFOR19EVVRDSF9TVVJJTkFNKQkvKjB4MEMxMyovCiNpbmNsdWRlICJubHMvbmxzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUwpCS8qMHgwNDE0Ki8KI2luY2x1ZGUgIm5scy9ub3IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fTllOT1JTSykJLyoweDA4MTQqLwojaW5jbHVkZSAibmxzL25vbi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPTElTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxNSovCiNpbmNsdWRlICJubHMvcGxrLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfUE9SVFVHVUVTRSAsU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTikJLyoweDA0MTYqLwojaW5jbHVkZSAibmxzL3B0Yi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfUE9SVFVHVUVTRSAsU1VCTEFOR19QT1JUVUdVRVNFKQkJLyoweDA4MTYqLwojaW5jbHVkZSAibmxzL3B0Zy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVCkJLyoweDQxOSovCiNpbmNsdWRlICJubHMvcnVzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU0xPVkFLLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDFiKi8KI2luY2x1ZGUgIm5scy9za3kubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TV0VESVNILCBTVUJMQU5HX1NXRURJU0gpCQkvKjB4MDQxZCovCiNpbmNsdWRlICJubHMvc3ZlLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TV0VESVNILCBTVUJMQU5HX1NXRURJU0hfRklOTEFORCkJLyoweDA4MWQqLwojaW5jbHVkZSAibmxzL3N2Zi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1RIQUksIFNVQkxBTkdfREVGQVVMVCkJLyoweDQxZSovCiNpbmNsdWRlICJubHMvdGhhLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRVNQRVJBTlRPLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDhmKi8KI2luY2x1ZGUgIm5scy9lc3BlcmFudG8ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19XQUxPTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQ5MCovCiNpbmNsdWRlICJubHMvd2FsLm5scyIKTEFOR19FTkQKCSAgICB9OwoKCi8qIExvY2FsZSBuYW1lIHRvIGlkIG1hcC4gdXNlZCBieSBFbnVtU3lzdGVtTG9jYWxlcywgR2V0TG9jYWxJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CgljaGFyCSpuYW1lOwoJRFdPUkQJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaWMgKFNhdWRpIEFyYWJpYSkifSwKCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKCXsweDBjMDEsIkFyYWJpYyAoRWd5cHQpIn0sCgl7MHgxMDAxLCJBcmFiaWMgKExpYnlhKSJ9LAoJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAoJezB4MTgwMSwiQXJhYmljIChNb3JvY2NvKSJ9LAoJezB4MWMwMSwiQXJhYmljIChUdW5pc2lhKSJ9LAoJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAoJezB4MjQwMSwiQXJhYmljIChZZW1lbikifSwKCXsweDI4MDEsIkFyYWJpYyAoU3lyaWEpIn0sCgl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKCXsweDMwMDEsIkFyYWJpYyAoTGViYW5vbikifSwKCXsweDM0MDEsIkFyYWJpYyAoS3V3YWl0KSJ9LAoJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKCXsweDNjMDEsIkFyYWJpYyAoQmFocmFpbikifSwKCXsweDQwMDEsIkFyYWJpYyAoUWF0YXIpIn0sCgl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKCXsweDA0MDMsIkNhdGFsYW4ifSwKCXsweDA0MDQsIkNoaW5lc2UgKFRhaXdhbikifSwKCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAoJezB4MGMwNCwiQ2hpbmVzZSAoSG9uZyBLb25nKSJ9LAoJezB4MTAwNCwiQ2hpbmVzZSAoU2luZ2Fwb3JlKSJ9LAoJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCgl7MHgwNDA1LCJDemVjaCJ9LAoJezB4MDQwNiwiRGFuaXNoIn0sCgl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCgl7MHgwODA3LCJHZXJtYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MGMwNywiR2VybWFuIChBdXN0cmlhKSJ9LAoJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAoJezB4MTQwNywiR2VybWFuIChMaWVjaHRlbnN0ZWluKSJ9LAoJezB4MDQwOCwiR3JlZWsifSwKCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCgl7MHgwODA5LCJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkifSwKCXsweDBjMDksIkVuZ2xpc2ggKEF1c3RyYWxpYSkifSwKCXsweDEwMDksIkVuZ2xpc2ggKENhbmFkYSkifSwKCXsweDE0MDksIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKSJ9LAoJezB4MTgwOSwiRW5nbGlzaCAoSXJlbGFuZCkifSwKCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKCXsweDIwMDksIkVuZ2xpc2ggKEphbWFpY2EpIn0sCgl7MHgyNDA5LCJFbmdsaXNoIChDYXJpYmJlYW4pIn0sCgl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCgl7MHgyYzA5LCJFbmdsaXNoIChUcmluaWRhZCkifSwKCXsweDMwMDksIkVuZ2xpc2ggKFppbWJhYndlKSJ9LAoJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCgl7MHgwNDBhLCJTcGFuaXNoIChTcGFpbiwgdHJhZGl0aW9uYWwgc29ydGluZykifSwKCXsweDA4MGEsIlNwYW5pc2ggKE1leGljbykifSwKCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgxMDBhLCJTcGFuaXNoIChHdWF0ZW1hbGEpIn0sCgl7MHgxNDBhLCJTcGFuaXNoIChDb3N0YSBSaWNhKSJ9LAoJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAoJezB4MWMwYSwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSJ9LAoJezB4MjAwYSwiU3BhbmlzaCAoVmVuZXp1ZWxhKSJ9LAoJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCgl7MHgyODBhLCJTcGFuaXNoIChQZXJ1KSJ9LAoJezB4MmMwYSwiU3BhbmlzaCAoQXJnZW50aW5hKSJ9LAoJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKCXsweDM0MGEsIlNwYW5pc2ggKENoaWxlKSJ9LAoJezB4MzgwYSwiU3BhbmlzaCAoVXJ1Z3VheSkifSwKCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAoJezB4NDAwYSwiU3BhbmlzaCAoQm9saXZpYSkifSwKCXsweDQ0MGEsIlNwYW5pc2ggKEVsIFNhbHZhZG9yKSJ9LAoJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCgl7MHg0YzBhLCJTcGFuaXNoIChOaWNhcmFndWEpIn0sCgl7MHg1MDBhLCJTcGFuaXNoIChQdWVydG8gUmljbykifSwKCXsweDA0MGIsIkZpbm5pc2gifSwKCXsweDA0MGMsIkZyZW5jaCAoRnJhbmNlKSJ9LAoJezB4MDgwYywiRnJlbmNoIChCZWxnaXVtKSJ9LAoJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCgl7MHgxMDBjLCJGcmVuY2ggKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MTQwYywiRnJlbmNoIChMdXhlbWJvdXJnKSJ9LAoJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCgl7MHgwNDBkLCJIZWJyZXcifSwKCXsweDA0MGUsIkh1bmdhcmlhbiJ9LAoJezB4MDQwZiwiSWNlbGFuZGljIn0sCgl7MHgwNDEwLCJJdGFsaWFuIChJdGFseSkifSwKCXsweDA4MTAsIkl0YWxpYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MDQxMSwiSmFwYW5lc2UifSwKCXsweDA0MTIsIktvcmVhbiAoV2Fuc3VuZykifSwKCXsweDA4MTIsIktvcmVhbiAoSm9oYWIpIn0sCgl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCgl7MHgwODEzLCJEdXRjaCAoQmVsZ2l1bSkifSwKCXsweDA0MTQsIk5vcndlZ2lhbiAoQm9rbWFsKSJ9LAoJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAoJezB4MDQxNSwiUG9saXNoIn0sCgl7MHgwNDE2LCJQb3J0dWd1ZXNlIChCcmF6aWwpIn0sCgl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKCXsweDA0MTcsIlJoYWV0byBSb21hbmljIn0sCgl7MHgwNDE4LCJSb21hbmlhbiJ9LAoJezB4MDgxOCwiTW9sZGF2aWFuIn0sCgl7MHgwNDE5LCJSdXNzaWFuIChSdXNzaWEpIn0sCgl7MHgwODE5LCJSdXNzaWFuIChNb2xkYXZpYSkifSwKCXsweDA0MWEsIkNyb2F0aWFuIn0sCgl7MHgwODFhLCJTZXJiaWFuIChsYXRpbikifSwKCXsweDBjMWEsIlNlcmJpYW4gKGN5cmlsbGljKSJ9LAoJezB4MDQxYiwiU2xvdmFrIn0sCgl7MHgwNDFjLCJBbGJhbmlhbiJ9LAoJezB4MDQxZCwiU3dlZGlzaCAoU3dlZGVuKSJ9LAoJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKCXsweDA0MWUsIlRoYWkifSwKCXsweDA0MWYsIlR1cmtpc2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkluZG9uZXNpYW4ifSwKCXsweDA0MjIsIlVrcmFpbmlhbiJ9LAoJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAoJezB4MDQyNCwiU2xvdmVuZSJ9LAoJezB4MDQyNSwiRXN0b25pYW4ifSwKCXsweDA0MjYsIkxhdHZpYW4ifSwKCXsweDA0MjcsIkxpdGh1YW5pYW4gKG1vZGVybikifSwKCXsweDA4MjcsIkxpdGh1YW5pYW4gKGNsYXNzaWMpIn0sCgl7MHgwNDI4LCJNYW9yaSJ9LAoJezB4MDQyOSwiRmFyc2kifSwKCXsweDA0MmEsIlZpZXRuYW1lc2UifSwKCXsweDA0MmIsIkFybWVuaWFuIn0sCgl7MHgwNDJjLCJBemVyaSAobGF0aW4pIn0sCgl7MHgwODJjLCJBemVyaSAoY3lyaWxsaWMpIn0sCgl7MHgwNDJkLCJCYXNxdWUifSwKCXsweDA0MmUsIlNvcmJpYW4ifSwKCXsweDA0MmYsIk1hY2Vkb25pYW4ifSwKCXsweDA0MzAsIlN1dHUifSwKCXsweDA0MzEsIlRzb25nYSJ9LAoJezB4MDQzMiwiVHN3YW5hIn0sCgl7MHgwNDMzLCJWZW5kYSJ9LAoJezB4MDQzNCwiWGhvc2EifSwKCXsweDA0MzUsIlp1bHUifSwKCXsweDA0MzYsIkFmcmlrYWFucyJ9LAoJezB4MDQzNywiR2VvcmdpYW4ifSwKCXsweDA0MzgsIkZhZXJvZXNlIn0sCgl7MHgwNDM5LCJIaW5kaSJ9LAoJezB4MDQzYSwiTWFsdGVzZSJ9LAoJezB4MDQzYiwiU2FhbWkifSwKCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAoJezB4MDgzYywiU2NvdHRpc2ggZ2FlbGljIn0sCgl7MHgwNDNlLCJNYWxheSAoTWFsYXlzaWEpIn0sCgl7MHgwODNlLCJNYWxheSAoQnJ1bmVpIERhcnVzc2FsYW0pIn0sCgl7MHgwNDNmLCJLYXphayJ9LAoJezB4MDQ0MSwiU3dhaGlsaSJ9LAoJezB4MDQ0MywiVXpiZWsgKGxhdGluKSJ9LAoJezB4MDg0MywiVXpiZWsgKGN5cmlsbGljKSJ9LAoJezB4MDQ0NCwiVGF0YXIifSwKCXsweDA0NDUsIkJlbmdhbGkifSwKCXsweDA0NDYsIlB1bmphYmkifSwKCXsweDA0NDcsIkd1amFyYXRpIn0sCgl7MHgwNDQ4LCJPcml5YSJ9LAoJezB4MDQ0OSwiVGFtaWwifSwKCXsweDA0NGEsIlRlbHVndSJ9LAoJezB4MDQ0YiwiS2FubmFkYSJ9LAoJezB4MDQ0YywiTWFsYXlhbGFtIn0sCgl7MHgwNDRkLCJBc3NhbWVzZSJ9LAoJezB4MDQ0ZSwiTWFyYXRoaSJ9LAoJezB4MDQ0ZiwiU2Fuc2tyaXQifSwKCXsweDA0NTcsIktvbmthbmkifSwKCXsweDA0OGYsIkVzcGVyYW50byJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDA0OTAsIldhbG9uIn0sIC8qIE5vbiBvZmZpY2lhbCAqLwoJezB4MDAwMCwiVW5rbm93biJ9CiAgICB9LCBsYW5ndWFnZXNfZGVbXT17Cgl7MHgwNDAxLCJBcmFiaWMifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkTkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuenZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicmRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbGRuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJSZHRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW1kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVPxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybGRuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0VXNlckRlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjEpCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gTUFLRUxDSUQoIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkgLCBTT1JUX0RFRkFVTFQgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkxDSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICAoT0xFMk5MUy4zKQogKi8KTEFOR0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCS8qIGNhY2hpbmcgcmVzdWx0LCBpZiBkZWZpbmVkIGZyb20gZW52aXJvbm1lbnQsIHdoaWNoIHNob3VsZCAoPykgbm90IGNoYW5nZSBkdXJpbmcgYSBXSU5FIHNlc3Npb24gKi8KCXN0YXRpYwlMQU5HSUQJdXNlckxDSUQgPSAwOwoJaWYgKE9wdGlvbnMubGFuZ3VhZ2UpIHsKCQlyZXR1cm4gTGFuZ3VhZ2VzW09wdGlvbnMubGFuZ3VhZ2VdLmxhbmdpZDsKCX0KCglpZiAodXNlckxDSUQgPT0gMCkgewoJCWNoYXIgKmJ1Zj1OVUxMOwoJCWNoYXIgKmxhbmcsKmNvdW50cnksKmNoYXJzZXQsKmRpYWxlY3QsKm5leHQ7CgkJaW50IAlyZXQ9MDsKCQkKCQlidWY9Z2V0ZW52KCJMQU5HVUFHRSIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQU5HIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxDX0FMTCIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19NRVNTQUdFUyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19DVFlQRSIpOwoJCWlmICghYnVmKSByZXR1cm4gdXNlckxDSUQgPSBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCQoJCWlmICghc3RyY21wKGJ1ZiwiUE9TSVgiKSB8fCAhc3RyY21wKGJ1ZiwiQyIpKSB7CgkJCXJldHVybiBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCX0KCQkKCQlsYW5nPWJ1ZjsKCQkKCQlkbyB7CgkJCW5leHQ9c3RyY2hyKGxhbmcsJzonKTsgaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKCQkJZGlhbGVjdD1zdHJjaHIobGFuZywnQCcpOyBpZiAoZGlhbGVjdCkgKmRpYWxlY3QrKz0nXDAnOwoJCQljaGFyc2V0PXN0cmNocihsYW5nLCcuJyk7IGlmIChjaGFyc2V0KSAqY2hhcnNldCsrPSdcMCc7CgkJCWNvdW50cnk9c3RyY2hyKGxhbmcsJ18nKTsgaWYgKGNvdW50cnkpICpjb3VudHJ5Kys9J1wwJzsKCQkJCgkJCXJldD1NQUlOX0dldExhbmd1YWdlSUQobGFuZywgY291bnRyeSwgY2hhcnNldCwgZGlhbGVjdCk7CgkJCQoJCQlsYW5nPW5leHQ7CgkJCQoJCX0gd2hpbGUgKGxhbmcgJiYgIXJldCk7CgkJCgkJLyogRklYTUUgOiBhcmUgc3RyaW5ncyByZXR1cm5lZCBieSBnZXRlbnYoKSB0byBiZSBmcmVlKCknZWQgPyAqLwoJCXVzZXJMQ0lEID0gKExBTkdJRClyZXQ7Cgl9CglyZXR1cm4gdXNlckxDSUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMYW5nSUQgICAgIChPTEUyTkxTLjQpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mbzE2CVtPTEUyTkxTLjVdCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQxNiBXSU5BUEkgR2V0TG9jYWxlSW5mbzE2KExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQxNiBsZW4pCnsKCXJldHVybiBHZXRMb2NhbGVJbmZvQShsY2lkLExDVHlwZSxidWYsbGVuKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnZlcnREZWZhdWx0TG9jYWxlMzIgW0tFUk5FTDMyLjE0N10KICovCkxDSUQgV0lOQVBJIENvbnZlcnREZWZhdWx0TG9jYWxlMzIgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgMDoKCSAgICAgcmV0dXJuIE1BS0VMQ0lEIChMQU5HX05FVVRSQUwsIFNVQkxBTkdfTkVVVFJBTCk7Cgl9ICAKCXJldHVybiBNQUtFTEFOR0lEKCBQUklNQVJZTEFOR0lEKGxjaWQpLCBTVUJMQU5HX05FVVRSQUwpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0TG9jYWxlSW5mbzMyQSBbS0VSTkVMMzIuMzQyXQogKgogKiBOT1RFUyAKICogIExBTkdfTkVVVFJBTCBpcyBlcXVhbCB0byBMT0NBTEVfU1lTVEVNX0RFRkFVTFQKICoKICogIE1TIG9ubGluZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoZSBzdHJpbmcgcmV0dXJuZWQgaXMgTlVMTCB0ZXJtaW5hdGVkCiAqICBleGNlcHQgZm9yIExPQ0FMRV9GT05UU0lHTkFUVVJFICB3aGljaCAid2lsbCByZXR1cm4gYSBub24tTlVMTAogKiAgdGVybWluYXRlZCBzdHJpbmciLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UIGxlbikKewogIExQQ1NUUiAgcmV0U3RyaW5nOwoJaW50CWZvdW5kLGk7CglpbnQJbGFuZz0wOwoKICBUUkFDRV8ob2xlKSgiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09MCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQgfHwgKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgKQkvKiAweDAwLCAweDQwMCAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsY2lkID09IExBTkdfVVNFUl9ERUZBVUxUKSAvKjB4ODAwKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewogICAgICBGSVhNRV8ob2xlKSgiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgogICAgZm91bmQ9MDtsYW5nPWxjaWQ7CiAgICBmb3IgKGk9MDsoaTwzICYmICFmb3VuZCk7aSsrKSB7CiAgICAgIGludCBqOwoKICAgICAgZm9yIChqPTA7ajxzaXplb2YobGFuZ2xvY2FsZXMpL3NpemVvZihsYW5nbG9jYWxlc1swXSk7aisrKSB7CglpZiAobGFuZ2xvY2FsZXNbal0ubGFuZyA9PSBsYW5nKSB7CgkgIGludCBrOwoKCSAgZm9yIChrPTA7azxzaXplb2YobGFuZ2xvY2FsZXNbal0ubG9jdmFycykvc2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNbMF0pICYmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUpO2srKykgewoJICAgIGlmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUgPT0gTENUeXBlKSB7CgkgICAgICBmb3VuZCA9IDE7CgkgICAgICByZXRTdHJpbmcgPSBsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnZhbDsKCSAgYnJlYWs7CgkgICAgfQoJICB9CiAgICAgICAgICBpZiAoZm91bmQpCgkgICAgYnJlYWs7Cgl9CiAgICAgIH0KCSAgLyogbGFuZ3VhZ2Ugbm90IGZvdW5kLCB0cnkgd2l0aG91dCBhIHN1Ymxhbmd1YWdlKi8KCSAgaWYgKGk9PTEpIGxhbmc9TUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsYW5nKSwgU1VCTEFOR19ERUZBVUxUKTsKCSAgLyogbWFzayB0aGUgTEMgVmFsdWUgKi8KCSAgaWYgKGk9PTIpIExDVHlwZSAmPSAweGZmZjsKICAgIH0KCiAgICBpZighZm91bmQpIHsKICAgICAgRVJSXyhvbGUpKCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UgKCUwNFgpLlxuIiwKCQkJcmV0U3RyaW5nLChXT1JEKWxjaWQpOwoJCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkJcmV0dXJuIDA7CQkJCgl9CiAgICAvKiBhIEZPTlRTSUdOQVRVUkUgaXMgbm90IGEgc3RyaW5nLCBqdXN0IDYgRFdPUkRzICAqLwogICAgaWYgKExDVHlwZSA9PSBMT0NBTEVfRk9OVFNJR05BVFVSRSkgewogICAgICAgIGlmIChsZW4pCiAgICAgICAgICAgIG1lbWNweShidWYsIHJldFN0cmluZywgKGxlbjw9c2l6ZW9mKEZPTlRTSUdOQVRVUkUpKT9sZW46c2l6ZW9mKEZPTlRTSUdOQVRVUkUpKTsKICAgICAgICByZXR1cm4gc2l6ZW9mKEZPTlRTSUdOQVRVUkUpOwogICAgfQogICAgLyogaWYgbGVuPTAgcmV0dXJuIG9ubHkgdGhlIGxlbmd0aCwgZG9uJ3QgdG91Y2ggdGhlIGJ1ZmZlciovCiAgICBpZiAobGVuKSBsc3RyY3B5bkEoYnVmLHJldFN0cmluZyxsZW4pOwogICAgcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm8zMlcJW0tFUk5FTDMyLjM0M10KICoKICogTk9URVMKICogIE1TIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgbGVuICJzcGVjaWZpZXMgdGhlIHNpemUsIGluIGJ5dGVzIChBTlNJIHZlcnNpb24pCiAqICBvciBjaGFyYWN0ZXJzIChVbmljb2RlIHZlcnNpb24pLCBvZiIgd2J1Zi4gVGh1cyB0aGUgbnVtYmVyIHJldHVybmVkIGlzCiAqICB0aGUgc2FtZSBiZXR3ZWVuIEdldExvY2FsZUluZm8zMlcgYW5kIEdldExvY2FsZUluZm8zMkEuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9XKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQV1NUUiB3YnVmLElOVCBsZW4pCnsJV09SRCB3bGVuOwoJTFBTVFIgYWJ1ZjsKCQoJaWYgKGxlbiAmJiAoISB3YnVmKSApCgl7IFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgcmV0dXJuIDA7Cgl9CgoJYWJ1ZiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7Cgl3bGVuID0gR2V0TG9jYWxlSW5mb0EobGNpZCwgTENUeXBlLCBhYnVmLCBsZW4pOwoKCWlmICh3bGVuICYmIGxlbikJLyogaWYgbGVuPTAgcmV0dXJuIG9ubHkgdGhlIGxlbmd0aCovCgkgIGxzdHJjcHluQXRvVyh3YnVmLGFidWYsbGVuKTsKCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYWJ1Zik7CglyZXR1cm4gd2xlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TG9jYWxlSW5mb0EJW0tFUk5FTDMyLjY1Nl0KICovCkJPT0wxNiBXSU5BUEkgU2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCwgRFdPUkQgbGN0eXBlLCBMUENTVFIgZGF0YSkKewogICAgRklYTUVfKG9sZSkoIiglbGQsJWxkLCVzKTogc3R1YlxuIixsY2lkLGxjdHlwZSxkYXRhKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJc1ZhbGlkTG9jYWxlCVtLRVJORUwzMi40ODldCiAqLwpCT09MIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewoJLyogd2Ugc3VwcG9ydCBBTlkgbGFuZ3VhZ2UuIFdlbGwsIGF0IGxlYXN0IHNheSB0aGF0Li4uKi8KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlczMyVwlbS0VSTkVMMzIuMjA5XQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNXKCBMT0NBTEVfRU5VTVBST0NXIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncyApCnsKCWludAlpOwoJQk9PTAlyZXQ7CglXQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0VfKHdpbjMyKSgiKCVwLCUwOGx4KVxuIixscGZuTG9jYWxlRW51bSxmbGFncyApOwoJLyogc2VlIGlmIHdlIGNhbiByZXVzZSB0aGUgV2luOTUgcmVnaXN0cnkgZW50cmllcy4uLi4gKi8KCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXlXKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MCkKICAgICAgICB7CiAgICAgICAgICAgIExQV1NUUiBjcDsKCSAgICBjaGFyICAgeGJ1ZmZlclsxMF07CiAgCQoJICAgIHNwcmludGYoeGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCgkgICAgY3AgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIHhidWZmZXIgKTsKICAgICAgICAgICAgcmV0ID0gbHBmbkxvY2FsZUVudW0oY3ApOwogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3AgKTsKICAgICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgICAgICAgICBpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXMzMkEJW0tFUk5FTDMyLjIwOF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CglpbnQJaTsKCUNIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsCgkJbHBmbkxvY2FsZUVudW0sZmxhZ3MKCSk7CglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5QSh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MCkgewoJCXNwcmludGYoYnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJYnJlYWs7CgkJaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIENUX0NUeXBlMl9MVVRbXSA9IHsKICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDggKi8KICBDMl9TRUdNRU5UU0VQQVJBVE9SLCAvKiAgIC0gICA5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qICAgLSAgMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICEgLSAgMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICMgLSAgMzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAkIC0gIDM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJSAtICAzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiAmIC0gIDM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAnIC0gIDM5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAoIC0gIDQwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiApIC0gIDQxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAqIC0gIDQyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogKyAtICA0MyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogLCAtICA0NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIC0gLSAgNDUgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC4gLSAgNDYgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC8gLSAgNDcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDAgLSAgNDggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDEgLSAgNDkgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDIgLSAgNTAgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDMgLSAgNTEgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDQgLSAgNTIgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDUgLSAgNTMgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDYgLSAgNTQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDcgLSAgNTUgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDggLSAgNTYgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDkgLSAgNTcgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qIDogLSAgNTggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDsgLSAgNTkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDwgLSAgNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID0gLSAgNjEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID4gLSAgNjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID8gLSAgNjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQCAtICA2NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBBIC0gIDY1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEIgLSAgNjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQyAtICA2NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBEIC0gIDY4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEUgLSAgNjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRiAtICA3MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBHIC0gIDcxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEggLSAgNzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSSAtICA3MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBKIC0gIDc0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEsgLSAgNzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTCAtICA3NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBNIC0gIDc3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE4gLSAgNzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTyAtICA3OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBQIC0gIDgwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFEgLSAgODEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUiAtICA4MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBTIC0gIDgzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFQgLSAgODQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVSAtICA4NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBWIC0gIDg2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFcgLSAgODcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWCAtICA4OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBZIC0gIDg5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFogLSAgOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFsgLSAgOTEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFwgLSAgOTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF0gLSAgOTMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF4gLSAgOTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF8gLSAgOTUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIGAgLSAgOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYSAtICA5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBiIC0gIDk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGMgLSAgOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZCAtIDEwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBlIC0gMTAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGYgLSAxMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZyAtIDEwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBoIC0gMTA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGkgLSAxMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaiAtIDEwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBrIC0gMTA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGwgLSAxMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbSAtIDEwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBuIC0gMTEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG8gLSAxMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcCAtIDExMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBxIC0gMTEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHIgLSAxMTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcyAtIDExNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB0IC0gMTE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHUgLSAxMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdiAtIDExOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB3IC0gMTE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHggLSAxMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeSAtIDEyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB6IC0gMTIyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB7IC0gMTIzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB8IC0gMTI0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB9IC0gMTI1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB+IC0gMTI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogfyAtIDEyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIAgLSAxMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCBIC0gMTI5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCCIC0gMTMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIMgLSAxMzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIQgLSAxMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIUgLSAxMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIYgLSAxMzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIcgLSAxMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiCAtIDEzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIIkgLSAxMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiiAtIDEzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogiyAtIDEzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCMIC0gMTQwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjSAtIDE0MSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII4gLSAxNDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCPIC0gMTQzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogkCAtIDE0NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkSAtIDE0NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkiAtIDE0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkyAtIDE0NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglCAtIDE0OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglSAtIDE0OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogliAtIDE1MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglyAtIDE1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCYIC0gMTUyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCZIC0gMTUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJogLSAxNTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJsgLSAxNTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognCAtIDE1NiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ0gLSAxNTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCeIC0gMTU4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJ8gLSAxNTkgKi8KICBDMl9XSElURVNQQUNFLCAvKiCgIC0gMTYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiChIC0gMTYxICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoiAtIDE2MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKMgLSAxNjMgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCkIC0gMTY0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpSAtIDE2NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpiAtIDE2NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpyAtIDE2NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqCAtIDE2OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqSAtIDE2OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqiAtIDE3MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqyAtIDE3MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrCAtIDE3MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrSAtIDE3MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogriAtIDE3NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogryAtIDE3NSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILAgLSAxNzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCxIC0gMTc3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCyIC0gMTc4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCzIC0gMTc5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC0IC0gMTgwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC1IC0gMTgxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC2IC0gMTgyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC3IC0gMTgzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC4IC0gMTg0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiC5IC0gMTg1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC6IC0gMTg2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC7IC0gMTg3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC8IC0gMTg4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC9IC0gMTg5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC+IC0gMTkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC/IC0gMTkxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMAgLSAxOTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwSAtIDE5MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDCIC0gMTk0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMMgLSAxOTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxCAtIDE5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDFIC0gMTk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMYgLSAxOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxyAtIDE5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDIIC0gMjAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMkgLSAyMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyiAtIDIwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDLIC0gMjAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMwgLSAyMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzSAtIDIwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDOIC0gMjA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM8gLSAyMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0CAtIDIwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDRIC0gMjA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINIgLSAyMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0yAtIDIxMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDUIC0gMjEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINUgLSAyMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1iAtIDIxNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog1yAtIDIxNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDYIC0gMjE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINkgLSAyMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2iAtIDIxOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDbIC0gMjE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINwgLSAyMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3SAtIDIyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDeIC0gMjIyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN8gLSAyMjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4CAtIDIyNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDhIC0gMjI1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOIgLSAyMjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4yAtIDIyNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDkIC0gMjI4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOUgLSAyMjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5iAtIDIzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDnIC0gMjMxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOggLSAyMzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6SAtIDIzMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDqIC0gMjM0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOsgLSAyMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7CAtIDIzNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDtIC0gMjM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO4gLSAyMzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7yAtIDIzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDwIC0gMjQwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPEgLSAyNDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8iAtIDI0MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDzIC0gMjQzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPQgLSAyNDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9SAtIDI0NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD2IC0gMjQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiD3IC0gMjQ3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPggLSAyNDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+SAtIDI0OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD6IC0gMjUwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPsgLSAyNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/CAtIDI1MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD9IC0gMjUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP4gLSAyNTQgKi8KICBDMl9MRUZUVE9SSUdIVCAvKiD/IC0gMjU1ICovCn07Cgpjb25zdCBXT1JEIE9MRTJOTFNfQ1RfQ1R5cGUzX0xVVFtdID0geyAKICAweDAwMDAsIC8qICAgLSAgIDAgKi8KICAweDAwMDAsIC8qICAgLSAgIDEgKi8KICAweDAwMDAsIC8qICAgLSAgIDIgKi8KICAweDAwMDAsIC8qICAgLSAgIDMgKi8KICAweDAwMDAsIC8qICAgLSAgIDQgKi8KICAweDAwMDAsIC8qICAgLSAgIDUgKi8KICAweDAwMDAsIC8qICAgLSAgIDYgKi8KICAweDAwMDAsIC8qICAgLSAgIDcgKi8KICAweDAwMDAsIC8qICAgLSAgIDggKi8KICAweDAwMDgsIC8qICAgLSAgIDkgKi8KICAweDAwMDgsIC8qICAgLSAgMTAgKi8KICAweDAwMDgsIC8qICAgLSAgMTEgKi8KICAweDAwMDgsIC8qICAgLSAgMTIgKi8KICAweDAwMDgsIC8qICAgLSAgMTMgKi8KICAweDAwMDAsIC8qICAgLSAgMTQgKi8KICAweDAwMDAsIC8qICAgLSAgMTUgKi8KICAweDAwMDAsIC8qICAgLSAgMTYgKi8KICAweDAwMDAsIC8qICAgLSAgMTcgKi8KICAweDAwMDAsIC8qICAgLSAgMTggKi8KICAweDAwMDAsIC8qICAgLSAgMTkgKi8KICAweDAwMDAsIC8qICAgLSAgMjAgKi8KICAweDAwMDAsIC8qICAgLSAgMjEgKi8KICAweDAwMDAsIC8qICAgLSAgMjIgKi8KICAweDAwMDAsIC8qICAgLSAgMjMgKi8KICAweDAwMDAsIC8qICAgLSAgMjQgKi8KICAweDAwMDAsIC8qICAgLSAgMjUgKi8KICAweDAwMDAsIC8qICAgLSAgMjYgKi8KICAweDAwMDAsIC8qICAgLSAgMjcgKi8KICAweDAwMDAsIC8qICAgLSAgMjggKi8KICAweDAwMDAsIC8qICAgLSAgMjkgKi8KICAweDAwMDAsIC8qICAgLSAgMzAgKi8KICAweDAwMDAsIC8qICAgLSAgMzEgKi8KICAweDAwNDgsIC8qICAgLSAgMzIgKi8KICAweDAwNDgsIC8qICEgLSAgMzMgKi8KICAweDA0NDgsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDB4MDA0OCwgLyogIyAtICAzNSAqLwogIDB4MDQ0OCwgLyogJCAtICAzNiAqLwogIDB4MDA0OCwgLyogJSAtICAzNyAqLwogIDB4MDA0OCwgLyogJiAtICAzOCAqLwogIDB4MDQ0MCwgLyogJyAtICAzOSAqLwogIDB4MDA0OCwgLyogKCAtICA0MCAqLwogIDB4MDA0OCwgLyogKSAtICA0MSAqLwogIDB4MDA0OCwgLyogKiAtICA0MiAqLwogIDB4MDA0OCwgLyogKyAtICA0MyAqLwogIDB4MDA0OCwgLyogLCAtICA0NCAqLwogIDB4MDQ0MCwgLyogLSAtICA0NSAqLwogIDB4MDA0OCwgLyogLiAtICA0NiAqLwogIDB4MDQ0OCwgLyogLyAtICA0NyAqLwogIDB4MDA0MCwgLyogMCAtICA0OCAqLwogIDB4MDA0MCwgLyogMSAtICA0OSAqLwogIDB4MDA0MCwgLyogMiAtICA1MCAqLwogIDB4MDA0MCwgLyogMyAtICA1MSAqLwogIDB4MDA0MCwgLyogNCAtICA1MiAqLwogIDB4MDA0MCwgLyogNSAtICA1MyAqLwogIDB4MDA0MCwgLyogNiAtICA1NCAqLwogIDB4MDA0MCwgLyogNyAtICA1NSAqLwogIDB4MDA0MCwgLyogOCAtICA1NiAqLwogIDB4MDA0MCwgLyogOSAtICA1NyAqLwogIDB4MDA0OCwgLyogOiAtICA1OCAqLwogIDB4MDA0OCwgLyogOyAtICA1OSAqLwogIDB4MDA0OCwgLyogPCAtICA2MCAqLwogIDB4MDQ0OCwgLyogPSAtICA2MSAqLwogIDB4MDA0OCwgLyogPiAtICA2MiAqLwogIDB4MDA0OCwgLyogPyAtICA2MyAqLwogIDB4MDQ0OCwgLyogQCAtICA2NCAqLwogIDB4ODA0MCwgLyogQSAtICA2NSAqLwogIDB4ODA0MCwgLyogQiAtICA2NiAqLwogIDB4ODA0MCwgLyogQyAtICA2NyAqLwogIDB4ODA0MCwgLyogRCAtICA2OCAqLwogIDB4ODA0MCwgLyogRSAtICA2OSAqLwogIDB4ODA0MCwgLyogRiAtICA3MCAqLwogIDB4ODA0MCwgLyogRyAtICA3MSAqLwogIDB4ODA0MCwgLyogSCAtICA3MiAqLwogIDB4ODA0MCwgLyogSSAtICA3MyAqLwogIDB4ODA0MCwgLyogSiAtICA3NCAqLwogIDB4ODA0MCwgLyogSyAtICA3NSAqLwogIDB4ODA0MCwgLyogTCAtICA3NiAqLwogIDB4ODA0MCwgLyogTSAtICA3NyAqLwogIDB4ODA0MCwgLyogTiAtICA3OCAqLwogIDB4ODA0MCwgLyogTyAtICA3OSAqLwogIDB4ODA0MCwgLyogUCAtICA4MCAqLwogIDB4ODA0MCwgLyogUSAtICA4MSAqLwogIDB4ODA0MCwgLyogUiAtICA4MiAqLwogIDB4ODA0MCwgLyogUyAtICA4MyAqLwogIDB4ODA0MCwgLyogVCAtICA4NCAqLwogIDB4ODA0MCwgLyogVSAtICA4NSAqLwogIDB4ODA0MCwgLyogViAtICA4NiAqLwogIDB4ODA0MCwgLyogVyAtICA4NyAqLwogIDB4ODA0MCwgLyogWCAtICA4OCAqLwogIDB4ODA0MCwgLyogWSAtICA4OSAqLwogIDB4ODA0MCwgLyogWiAtICA5MCAqLwogIDB4MDA0OCwgLyogWyAtICA5MSAqLwogIDB4MDQ0OCwgLyogXCAtICA5MiAqLwogIDB4MDA0OCwgLyogXSAtICA5MyAqLwogIDB4MDQ0OCwgLyogXiAtICA5NCAqLwogIDB4MDQ0OCwgLyogXyAtICA5NSAqLwogIDB4MDQ0OCwgLyogYCAtICA5NiAqLwogIDB4ODA0MCwgLyogYSAtICA5NyAqLwogIDB4ODA0MCwgLyogYiAtICA5OCAqLwogIDB4ODA0MCwgLyogYyAtICA5OSAqLwogIDB4ODA0MCwgLyogZCAtIDEwMCAqLwogIDB4ODA0MCwgLyogZSAtIDEwMSAqLwogIDB4ODA0MCwgLyogZiAtIDEwMiAqLwogIDB4ODA0MCwgLyogZyAtIDEwMyAqLwogIDB4ODA0MCwgLyogaCAtIDEwNCAqLwogIDB4ODA0MCwgLyogaSAtIDEwNSAqLwogIDB4ODA0MCwgLyogaiAtIDEwNiAqLwogIDB4ODA0MCwgLyogayAtIDEwNyAqLwogIDB4ODA0MCwgLyogbCAtIDEwOCAqLwogIDB4ODA0MCwgLyogbSAtIDEwOSAqLwogIDB4ODA0MCwgLyogbiAtIDExMCAqLwogIDB4ODA0MCwgLyogbyAtIDExMSAqLwogIDB4ODA0MCwgLyogcCAtIDExMiAqLwogIDB4ODA0MCwgLyogcSAtIDExMyAqLwogIDB4ODA0MCwgLyogciAtIDExNCAqLwogIDB4ODA0MCwgLyogcyAtIDExNSAqLwogIDB4ODA0MCwgLyogdCAtIDExNiAqLwogIDB4ODA0MCwgLyogdSAtIDExNyAqLwogIDB4ODA0MCwgLyogdiAtIDExOCAqLwogIDB4ODA0MCwgLyogdyAtIDExOSAqLwogIDB4ODA0MCwgLyogeCAtIDEyMCAqLwogIDB4ODA0MCwgLyogeSAtIDEyMSAqLwogIDB4ODA0MCwgLyogeiAtIDEyMiAqLwogIDB4MDA0OCwgLyogeyAtIDEyMyAqLwogIDB4MDA0OCwgLyogfCAtIDEyNCAqLwogIDB4MDA0OCwgLyogfSAtIDEyNSAqLwogIDB4MDQ0OCwgLyogfiAtIDEyNiAqLwogIDB4MDAwMCwgLyogfyAtIDEyNyAqLwogIDB4MDAwMCwgLyoggCAtIDEyOCAqLwogIDB4MDAwMCwgLyoggSAtIDEyOSAqLwogIDB4MDAwOCwgLyoggiAtIDEzMCAqLwogIDB4ODAwMCwgLyoggyAtIDEzMSAqLwogIDB4MDAwOCwgLyoghCAtIDEzMiAqLwogIDB4MDAwOCwgLyoghSAtIDEzMyAqLwogIDB4MDAwOCwgLyoghiAtIDEzNCAqLwogIDB4MDAwOCwgLyoghyAtIDEzNSAqLwogIDB4MDAwMSwgLyogiCAtIDEzNiAqLwogIDB4MDAwOCwgLyogiSAtIDEzNyAqLwogIDB4ODAwMywgLyogiiAtIDEzOCAqLwogIDB4MDAwOCwgLyogiyAtIDEzOSAqLwogIDB4ODAwMCwgLyogjCAtIDE0MCAqLwogIDB4MDAwMCwgLyogjSAtIDE0MSAqLwogIDB4MDAwMCwgLyogjiAtIDE0MiAqLwogIDB4MDAwMCwgLyogjyAtIDE0MyAqLwogIDB4MDAwMCwgLyogkCAtIDE0NCAqLwogIDB4MDA4OCwgLyogkSAtIDE0NSAqLwogIDB4MDA4OCwgLyogkiAtIDE0NiAqLwogIDB4MDA4OCwgLyogkyAtIDE0NyAqLwogIDB4MDA4OCwgLyoglCAtIDE0OCAqLwogIDB4MDAwOCwgLyoglSAtIDE0OSAqLwogIDB4MDQwMCwgLyogliAtIDE1MCAqLwogIDB4MDQwMCwgLyoglyAtIDE1MSAqLwogIDB4MDQwOCwgLyogmCAtIDE1MiAqLwogIDB4MDAwMCwgLyogmSAtIDE1MyAqLwogIDB4ODAwMywgLyogmiAtIDE1NCAqLwogIDB4MDAwOCwgLyogmyAtIDE1NSAqLwogIDB4ODAwMCwgLyognCAtIDE1NiAqLwogIDB4MDAwMCwgLyognSAtIDE1NyAqLwogIDB4MDAwMCwgLyogniAtIDE1OCAqLwogIDB4ODAwMywgLyognyAtIDE1OSAqLwogIDB4MDAwOCwgLyogoCAtIDE2MCAqLwogIDB4MDAwOCwgLyogoSAtIDE2MSAqLwogIDB4MDA0OCwgLyogoiAtIDE2MiAqLwogIDB4MDA0OCwgLyogoyAtIDE2MyAqLwogIDB4MDAwOCwgLyogpCAtIDE2NCAqLwogIDB4MDA0OCwgLyogpSAtIDE2NSAqLwogIDB4MDA0OCwgLyogpiAtIDE2NiAqLwogIDB4MDAwOCwgLyogpyAtIDE2NyAqLwogIDB4MDQwOCwgLyogqCAtIDE2OCAqLwogIDB4MDAwOCwgLyogqSAtIDE2OSAqLwogIDB4MDQwMCwgLyogqiAtIDE3MCAqLwogIDB4MDAwOCwgLyogqyAtIDE3MSAqLwogIDB4MDA0OCwgLyogrCAtIDE3MiAqLwogIDB4MDQwOCwgLyogrSAtIDE3MyAqLwogIDB4MDAwOCwgLyogriAtIDE3NCAqLwogIDB4MDQ0OCwgLyogryAtIDE3NSAqLwogIDB4MDAwOCwgLyogsCAtIDE3NiAqLwogIDB4MDAwOCwgLyogsSAtIDE3NyAqLwogIDB4MDAwMCwgLyogsiAtIDE3OCAqLwogIDB4MDAwMCwgLyogsyAtIDE3OSAqLwogIDB4MDQwOCwgLyogtCAtIDE4MCAqLwogIDB4MDAwOCwgLyogtSAtIDE4MSAqLwogIDB4MDAwOCwgLyogtiAtIDE4MiAqLwogIDB4MDAwOCwgLyogtyAtIDE4MyAqLwogIDB4MDQwOCwgLyoguCAtIDE4NCAqLwogIDB4MDAwMCwgLyoguSAtIDE4NSAqLwogIDB4MDQwMCwgLyoguiAtIDE4NiAqLwogIDB4MDAwOCwgLyoguyAtIDE4NyAqLwogIDB4MDAwMCwgLyogvCAtIDE4OCAqLwogIDB4MDAwMCwgLyogvSAtIDE4OSAqLwogIDB4MDAwMCwgLyogviAtIDE5MCAqLwogIDB4MDAwOCwgLyogvyAtIDE5MSAqLwogIDB4ODAwMywgLyogwCAtIDE5MiAqLwogIDB4ODAwMywgLyogwSAtIDE5MyAqLwogIDB4ODAwMywgLyogwiAtIDE5NCAqLwogIDB4ODAwMywgLyogwyAtIDE5NSAqLwogIDB4ODAwMywgLyogxCAtIDE5NiAqLwogIDB4ODAwMywgLyogxSAtIDE5NyAqLwogIDB4ODAwMCwgLyogxiAtIDE5OCAqLwogIDB4ODAwMywgLyogxyAtIDE5OSAqLwogIDB4ODAwMywgLyogyCAtIDIwMCAqLwogIDB4ODAwMywgLyogySAtIDIwMSAqLwogIDB4ODAwMywgLyogyiAtIDIwMiAqLwogIDB4ODAwMywgLyogyyAtIDIwMyAqLwogIDB4ODAwMywgLyogzCAtIDIwNCAqLwogIDB4ODAwMywgLyogzSAtIDIwNSAqLwogIDB4ODAwMywgLyogziAtIDIwNiAqLwogIDB4ODAwMywgLyogzyAtIDIwNyAqLwogIDB4ODAwMCwgLyog0CAtIDIwOCAqLwogIDB4ODAwMywgLyog0SAtIDIwOSAqLwogIDB4ODAwMywgLyog0iAtIDIxMCAqLwogIDB4ODAwMywgLyog0yAtIDIxMSAqLwogIDB4ODAwMywgLyog1CAtIDIxMiAqLwogIDB4ODAwMywgLyog1SAtIDIxMyAqLwogIDB4ODAwMywgLyog1iAtIDIxNCAqLwogIDB4MDAwOCwgLyog1yAtIDIxNSAqLwogIDB4ODAwMywgLyog2CAtIDIxNiAqLwogIDB4ODAwMywgLyog2SAtIDIxNyAqLwogIDB4ODAwMywgLyog2iAtIDIxOCAqLwogIDB4ODAwMywgLyog2yAtIDIxOSAqLwogIDB4ODAwMywgLyog3CAtIDIyMCAqLwogIDB4ODAwMywgLyog3SAtIDIyMSAqLwogIDB4ODAwMCwgLyog3iAtIDIyMiAqLwogIDB4ODAwMCwgLyog3yAtIDIyMyAqLwogIDB4ODAwMywgLyog4CAtIDIyNCAqLwogIDB4ODAwMywgLyog4SAtIDIyNSAqLwogIDB4ODAwMywgLyog4iAtIDIyNiAqLwogIDB4ODAwMywgLyog4yAtIDIyNyAqLwogIDB4ODAwMywgLyog5CAtIDIyOCAqLwogIDB4ODAwMywgLyog5SAtIDIyOSAqLwogIDB4ODAwMCwgLyog5iAtIDIzMCAqLwogIDB4ODAwMywgLyog5yAtIDIzMSAqLwogIDB4ODAwMywgLyog6CAtIDIzMiAqLwogIDB4ODAwMywgLyog6SAtIDIzMyAqLwogIDB4ODAwMywgLyog6iAtIDIzNCAqLwogIDB4ODAwMywgLyog6yAtIDIzNSAqLwogIDB4ODAwMywgLyog7CAtIDIzNiAqLwogIDB4ODAwMywgLyog7SAtIDIzNyAqLwogIDB4ODAwMywgLyog7iAtIDIzOCAqLwogIDB4ODAwMywgLyog7yAtIDIzOSAqLwogIDB4ODAwMCwgLyog8CAtIDI0MCAqLwogIDB4ODAwMywgLyog8SAtIDI0MSAqLwogIDB4ODAwMywgLyog8iAtIDI0MiAqLwogIDB4ODAwMywgLyog8yAtIDI0MyAqLwogIDB4ODAwMywgLyog9CAtIDI0NCAqLwogIDB4ODAwMywgLyog9SAtIDI0NSAqLwogIDB4ODAwMywgLyog9iAtIDI0NiAqLwogIDB4MDAwOCwgLyog9yAtIDI0NyAqLwogIDB4ODAwMywgLyog+CAtIDI0OCAqLwogIDB4ODAwMywgLyog+SAtIDI0OSAqLwogIDB4ODAwMywgLyog+iAtIDI1MCAqLwogIDB4ODAwMywgLyog+yAtIDI1MSAqLwogIDB4ODAwMywgLyog/CAtIDI1MiAqLwogIDB4ODAwMywgLyog/SAtIDI1MyAqLwogIDB4ODAwMCwgLyog/iAtIDI1NCAqLwogIDB4ODAwMyAgLyog/yAtIDI1NSAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTE2CVtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUzMkEJW0tFUk5FTDMyLjM5Nl0KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4QShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4MzJBCVtLRVJORUwzMi4zOTddCiAqCiAqIEZJWE1FOiBJZ25vcmVzIHRoZSBsb2NhbGUuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoJCglpZiAoKHNyYz09TlVMTCkgfHwgKGNoYXJ0eXBlPT1OVUxMKSB8fCAoc3JjPT0oTFBTVFIpY2hhcnR5cGUpKQoJewoJICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSXyhvbGUpKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUzMlcJW0tFUk5FTDMyLjM5OV0KICoKICogTk9URVMKICogWWVzLCB0aGlzIGlzIG1pc3NpbmcgTENJRCBsb2NhbGUuIE1TIGZhdWx0LgogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZVcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQgY2NoU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4VygwLypkZWZhdWx0bG9jYWxlKi8sZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4MzJXCVtLRVJORUwzMi4zOThdCiAqCiAqIEZJWE1FOiB1bmljb2RlIGNoYXJzIGFyZSBhc3N1bWVkIGNoYXJzCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhXKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuVyhzcmMpKzE7CgkKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUVfKG9sZSkoIkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJY2FzZSBDVF9DVFlQRTM6CgkJRklYTUVfKG9sZSkoIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJZGVmYXVsdDpicmVhazsKCX0KCWZvciAoaT0wO2k8Y2NoU3JjO2krKykgewoJCWNoYXJ0eXBlW2ldID0gMDsKCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkJaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkJaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCiAgICAgICAgICAgICAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCQkvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogV0lORV9HZXRMYW5ndWFnZU5hbWUgICBbaW50ZXJuYWxdIAogKgogKiBGSVhNRTogIFdpbmRvd3Mga2VlcHMgbGFuZ3VhZ2UgbmFtZXMgaW4gYSBzdHJpbmcgdGFibGUKICogICAgICAgICByZXNvdXJjZSBpbiBWRVIuRExMIC4uLgogKi8KTFBDU1RSIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCBVSU5UIGxhbmdpZCApCnsKICAgIGludCBpOwogICAgZm9yICggaSA9IDA7IGxhbmd1YWdlc1tpXS5sYW5naWQgIT0gMDsgaSsrICkKICAgICAgICBpZiAoIGxhbmdpZCA9PSBsYW5ndWFnZXNbaV0ubGFuZ2lkICkKICAgICAgICAgICAgYnJlYWs7CgogICAgcmV0dXJuIGxhbmd1YWdlc1tpXS5sYW5nbmFtZTsKfQogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmczMkEuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNTeW1ib2wodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZzMyQS4gIENoYXJhY3RlcnMgCiAgICAgZm9yIHdoaWNoIGl0IHJldHVybnMgdHJ1ZSBhcmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgYQogICAgIHN0cmluZyB3aXRoIE5PUk1fSUdOT1JFU1lNQk9MUyAqLwogIHJldHVybiAoIChjIT0wKSAmJiAhSXNDaGFyQWxwaGFOdW1lcmljQShjKSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlpZGVudGl0eQlbSW50ZXJuYWxdCiAqLwpzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQp7CiAgcmV0dXJuIGM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBMQ01hcFN0cmluZzMyQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmczMkEsCiAqICAgIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgdGhpcyBmbGFnLgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ0EoCglMQ0lEIGxjaWQgLyogbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgCiAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgdmFsdWVzLiAqLywKCURXT1JEIG1hcGZsYWdzIC8qIGZsYWdzICovLAoJTFBDU1RSIHNyY3N0ciAgLyogc291cmNlIGJ1ZmZlciAqLywKCUlOVCBzcmNsZW4gICAvKiBzb3VyY2UgbGVuZ3RoICovLAoJTFBTVFIgZHN0c3RyICAgLyogZGVzdGluYXRpb24gYnVmZmVyICovLAoJSU5UIGRzdGxlbiAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8pIAp7CiAgaW50IGk7CgogIFRSQUNFXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlJfKG9sZSkoIihzcmM9JXMsZGVzdD0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbiA9PSAtMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuQShzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgojZGVmaW5lIExDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MgKExDTUFQX1VQUEVSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9MT1dFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfU09SVEtFWSAgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09SVF9TVFJJTkdTT1JUICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFV0lEVEgpCgogIGlmIChtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTKQogIHsKICAgIEZJWE1FXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCSAgbGNpZCwKCSAgbWFwZmxhZ3MsCgkgIHNyY3N0ciwKCSAgc3JjbGVuLAoJICBkc3RzdHIsCgkgIGRzdGxlbiwKCSAgbWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUwogICAgICk7CiAgfQoKICBpZiAoICEobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSApCiAgewogICAgaW50IGksajsKICAgIGludCAoKmYpKGludCkgPSBpZGVudGl0eTsgCiAgICBpbnQgZmxhZ19pZ25vcmVub25zcGFjZSA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRTsKICAgIGludCBmbGFnX2lnbm9yZXN5bWJvbHMgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFU1lNQk9MUzsKCiAgICBpZiAoZmxhZ19pZ25vcmVub25zcGFjZSB8fCBmbGFnX2lnbm9yZXN5bWJvbHMpCiAgICB7CiAgICAgIC8qIEZvciBzb21lIHZhbHVlcyBvZiBtYXBmbGFncywgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIAoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOyAgCiAgICAgIGlmIChkc3RsZW48c3JjbGVuKSAKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSXyhzdHJpbmcpKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBjYXNlX2NvbXBvbmVudCA9IGRpYWNyaXRpY19jb21wb25lbnQgKyBkaWFjcml0aWNfbGVuIDsKICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCA9IGNhc2VfY29tcG9uZW50ICsgY2FzZV9sZW4gOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWludCB0eXBlLGxvbmdjb2RlOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIE9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpIAoJewoJICBVSU5UMTYgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmczMkEgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKIAogIFRSQUNFXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlJfKG9sZSkoIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuVyhzcmNzdHIpKzE7CiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgICByZXR1cm4gMDsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAKICAgIGlmIChkc3RsZW48c3JjbGVuKSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMTYgICAgICAgKE9MRTJOTFMuOCkKICovClVJTlQxNiBXSU5BUEkgQ29tcGFyZVN0cmluZzE2KERXT1JEIGxjaWQsRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzMSxEV09SRCBsMSxMUENTVFIgczIsRFdPUkQgbDIpCnsKCXJldHVybiAoVUlOVDE2KUNvbXBhcmVTdHJpbmdBKGxjaWQsZmR3U3R5bGUsczEsbDEsczIsbDIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nMzJBCVtLRVJORUwzMi4xNDNdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqIAogKiBCVUdTCiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqCiAqIEZJWE1FCiAqIAogKiBRdWl0ZSBpbmVmZmljaWVudC4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgRFdPUkQgbGNpZCwgICAgIC8qIGxvY2FsZSBJRCAqLwogICAgRFdPUkQgZmR3U3R5bGUsIC8qIGNvbXBhcmlzb24tc3R5bGUgb3B0aW9ucyAqLwogICAgTFBDU1RSIHMxLCAgICAgIC8qIGZpcnN0IHN0cmluZyAqLwogICAgRFdPUkQgbDEsICAgICAgIC8qIGxlbmd0aCBvZiBmaXJzdCBzdHJpbmcgKi8KICAgIExQQ1NUUiBzMiwgICAgICAvKiBzZWNvbmQgc3RyaW5nICovCiAgICBEV09SRCBsMikgICAgICAgLyogbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0VfKG9sZSkoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKCiAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogIHsgICAgCiAgICBFUlJfKG9sZSkoIihzMT0lcyxzMj0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHMxLCBzMik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKICAgIEZJWE1FXyhvbGUpKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsTlVMTCwwKTsKICBsZW4yID0gTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLE5VTEwsMCk7CgogIGlmICgobGVuMT09MCl8fChsZW4yPT0wKSkKICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCgogIHNrMSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjEpOwogIHNrMiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjIpOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUl8ob2xlKSgiQnVnIGluIExDbWFwU3RyaW5nMzJBLlxuIik7CiAgICByZXN1bHQgPSAwOwogIH0KICBlbHNlCiAgewogICAgLyogc3RyY21wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmV0dXJuIC0xLCAwLCBvciAxICovCiAgICByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMik7CiAgfQogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazEpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazIpOwoKICBpZiAocmVzdWx0IDwgMCkKICAgIHJldHVybiAxOwogIGlmIChyZXN1bHQgPT0gMCkKICAgIHJldHVybiAyOwoKICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KICByZXR1cm4gMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZzMyVwlbS0VSTkVMMzIuMTQ0XQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZzMyQS4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgczEsIERXT1JEIGwxLCBMUENXU1RSIHMyLERXT1JEIGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCQlGSVhNRV8ob2xlKSgiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FXyhvbGUpKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9sc3RybGVuVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW5XKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KCQlsc3RybmNtcGlXKHMxLHMyLGxlbikJOiBsc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENTVFIgX2Zvcm1hdCwgCS8qaW4qLwoJCQkgICAgTFBTVFIgZGF0ZSwJCS8qb3V0Ki8KCQkJICAgIElOVCBkYXRlbGVuKQp7CiAgIElOVCBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRV8ob2xlKSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FXyhvbGUpKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSAgICAgIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0RheSk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gMykgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOXyhvbGUpKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FXyhvbGUpKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOwoJCSAgc3RyY3B5KGJ1ZiwgIkFEIik7CgkgICAgfSBlbHNlIHsKCQkgIHN0cmNweShidWYsICJnIik7CgkJICBXQVJOXyhvbGUpKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk5fKG9sZSkoImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CiAgIAogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CiAgIAogICBUUkFDRV8ob2xlKSgiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbM107CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIGFyZ2FyclswXSA9IGFyZzA7CiAgIGFyZ2FyclsxXSA9IGFyZzE7CiAgIGFyZ2FyclsyXSA9IGFyZzI7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIFRSQUNFXyhvbGUpKCJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6JXMgKGF0ICVwKSwgIgogICAJICAgICAgIiVwIHdpdGggbWF4IGxlbiAlZFxuIiwKCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGRlYnVnc3RyX3coZm9ybWF0KSwgZm9ybWF0LCBvdXRwdXQsIG91dGxlbik7CiAgIAogICBpZihvdXRsZW4gPT0gMCkgewogICAgIEZJWE1FXyhvbGUpKCJvdXRsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArIHh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbMV0gLyogIiVkIiAqLywKCQkJIHh0aW1lLT53WWVhcik7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgInl5eSIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDYsIGFyZ2Fycltjb3VudF0sCgkJCSAgICB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUVfKG9sZSkoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7ICAvKiBhICJob29rIiBmb3Igc3RyY2F0ICovCgkgICAgbHN0cmNhdFcob3V0cHV0LCBidWYpOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgICAgbHN0cmNhdG5XKG91dHB1dCwgYnVmLCBvdXRsZW4gLSBvdXRwb3MpOwoJICAgIG91dHB1dFtvdXRsZW4gLSAxXSA9IDA7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk5fKG9sZSkoIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICB9OwoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBvdXRwb3MrKzsKICAgaWYgKG91dHBvcyA+IG91dGxlbi0xKSBvdXRwb3MgPSBvdXRsZW4tMTsKICAgb3V0cHV0W291dHBvc10gPSAnMCc7CgogICBUUkFDRV8ob2xlKSgiIHJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhvdXRwdXQpKTsKCQogICByZXR1cm4gKCFPdmVyZmxvdykgPyBvdXRsZW4gOiAwOwogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXQzMkEJW0tFUk5FTDMyLjMxMF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVCBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwogIElOVCByZXQ7CgogIFRSQUNFXyhvbGUpKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKICAKICBpZiAoIWxvY2FsZSkgewogICAgIGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgICB9OwogIAogIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgewogICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CiAgIH07CgogIGlmICh4dGltZSA9PSBOVUxMKSB7CiAgICAgR2V0U3lzdGVtVGltZSgmdCk7CiAgICAgdGhpc3RpbWUgPSAmdDsKICB9IGVsc2UgewogICAgIHRoaXN0aW1lID0geHRpbWU7CiAgfTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRV8ob2xlKSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdDMyVwlbS0VSTkVMMzIuMzExXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdDMyQSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVCBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUVfKG9sZSkoIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJBCShLRVJORUwzMi4xOTgpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiT25seSBVUyBFbmdsaXNoIHN1cHBvcnRlZFxuIik7CgogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUVfKG9sZSkoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJXCShLRVJORUwzMi4xOTkpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FXyhvbGUpKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJBCShLRVJORUwzMi4yMTApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FXyhvbGUpKCJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIGlmKGR3RmxhZ3MpCiAgICB7CiAgICAgIEZJWE1FXyhvbGUpKCJVbmtub3duIHRpbWUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCiAgICB9CiAgCiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CgogIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0czMyVwkoS0VSTkVMMzIuMjExKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVygKICBUSU1FRk1UX0VOVU1QUk9DVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRV8oZmlsZSkoIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIGxzdHJjcHluQSggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gbHN0cmxlbkEoIGxwTnVtYmVyU3RyICkgOiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJXCShLRVJORUwzMi54eHgpCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICBjb25zdCBOVU1CRVJGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FXyhmaWxlKSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1NUUiBmb3JtYXQsICAgICAgLyogaW4gICovCgkJIExQU1RSIHRpbWVzdHIsICAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQgcmV0OwogICAgCiAgVFJBQ0VfKG9sZSkoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRV8ob2xlKSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwogIH0KICAKICBmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KICAgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICB9CiAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldFN5c3RlbVRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgfQogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdDMyVwlbS0VSTkVMMzIuNDIzXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0VyhMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBpbiAgKi8KCQkgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCUxQU1lTVEVNVElNRSB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwoJSU5UIHJldDsKCSAgICAKCVRSQUNFXyhvbGUpKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQoJeyBGSVhNRV8ob2xlKSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJfQogIAoJZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FXyhvbGUpKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=