LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW52ZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwod2luMzIpOwoKc3RydWN0IE5MU19sYW5nbG9jYWxlIHsKCWNvbnN0IGludCBsYW5nOwoJc3RydWN0IE5MU19sb2NhbGV2YXIgewoJCWNvbnN0IGludAl0eXBlOwoJCWNvbnN0IGNoYXIJKnZhbDsKCX0gbG9jdmFyc1sxMjBdOwp9OwoKI2RlZmluZSBMQU5HX0JFR0lOKGwscykJewlNQUtFTEFOR0lEKGwscyksIHsKCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpCQkJCQl7dHlwZSx2YWx1ZX0sCgojZGVmaW5lIExBTkdfRU5ECQkJCQkgfX0sCgpzdGF0aWMgY29uc3Qgc3RydWN0IE5MU19sYW5nbG9jYWxlIGxhbmdsb2NhbGVzW10gPSB7Ci8qIGFkZCBsYW5ndWFnZXMgaW4gbnVtZXJpY2FsIG9yZGVyIG9mIG1haW4gbGFuZ3VhZ2UgKGxhc3QgdHdvIGRpZ2l0cykKICogaXQgaXMgbXVjaCBlYXNpZXIgdG8gZmluZCB0aGUgbWlzc2luZyBob2xlcyB0aGF0IHdheSAqLwoKTEFOR19CRUdJTiAoTEFOR19DQVRBTEFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDAzKi8KI2luY2x1ZGUgIm5scy9jYXQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DWkVDSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNSovCiNpbmNsdWRlICJubHMvY3plLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDA2Ki8KI2luY2x1ZGUgIm5scy9kYW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOKQkJLyoweDA0MDcqLwojaW5jbHVkZSAibmxzL2RldS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9TV0lTUykJCS8qMHgwODA3Ki8KI2luY2x1ZGUgIm5scy9kZXMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU4pCS8qMHgwQzA3Ki8KI2luY2x1ZGUgIm5scy9kZWEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRykJLyoweDEwMDcqLwojaW5jbHVkZSAibmxzL2RlbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOKQkvKjB4MTQwNyovCiNpbmNsdWRlICJubHMvZGVjLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKQkJLyoweDA0MDkqLwojaW5jbHVkZSAibmxzL2VudS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VLKQkJLyoweDA4MDkqLwojaW5jbHVkZSAibmxzL2VuZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0FVUykJCS8qMHgwQzA5Ki8KI2luY2x1ZGUgIm5scy9lbmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQU4pCQkvKjB4MTAwOSovCiNpbmNsdWRlICJubHMvZW5jLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfTlopCQkvKjB4MTQwOSovCiNpbmNsdWRlICJubHMvZW56Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfRUlSRSkJCS8qMHgxODA5Ki8KI2luY2x1ZGUgIm5scy9lbmkubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9TQUZSSUNBKQkvKjB4MUMwOSovCiNpbmNsdWRlICJubHMvZW5zLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSkJLyoweDIwMDkqLwojaW5jbHVkZSAibmxzL2Vuai5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0NBUlJJQkVBTikJLyoweDI0MDkqLwojaW5jbHVkZSAibmxzL2VuYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0JFTElaRSkJLyoweDI4MDkqLwojaW5jbHVkZSAibmxzL2VubC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEKSAgICAJLyoweDJDMDkqLwojaW5jbHVkZSAibmxzL2VudC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSCkJCS8qMHgwNDBhKi8KI2luY2x1ZGUgIm5scy9lc3AubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOKQkvKjB4MDgwYSovCiNpbmNsdWRlICJubHMvZXNtLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOKQkvKjB4MEMwYSovCiNpbmNsdWRlICJubHMvZXNuLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBKQkvKjB4MTAwYSovCiNpbmNsdWRlICJubHMvZXNnLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBKQkvKjB4MTQwYSovCiNpbmNsdWRlICJubHMvZXNjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BKQkvKjB4MTgwYSovCiNpbmNsdWRlICJubHMvZXNhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOKQkvKjB4MUMwQSovCiNpbmNsdWRlICJubHMvZXNkLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBKQkvKjB4MjAwYSovCiNpbmNsdWRlICJubHMvZXN2Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEpCS8qMHgyNDBhKi8KI2luY2x1ZGUgIm5scy9lc28ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QRVJVKQkJLyoweDI4MGEqLwojaW5jbHVkZSAibmxzL2Vzci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSkJLyoweDJjMGEqLwojaW5jbHVkZSAibmxzL2Vzcy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IpCS8qMHgzMDBhKi8KI2luY2x1ZGUgIm5scy9lc2YubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DSElMRSkJLyoweDM0MGEqLwojaW5jbHVkZSAibmxzL2VzbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkpCS8qMHgzODBhKi8KI2luY2x1ZGUgIm5scy9lc3kubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSkJLyoweDNjMGEqLwojaW5jbHVkZSAibmxzL2Vzei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEpCS8qMHg0MDBhKi8KI2luY2x1ZGUgIm5scy9lc2IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUikJLyoweDQ0MGEqLwojaW5jbHVkZSAibmxzL2VzZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTKQkvKjB4NDgwYSovCiNpbmNsdWRlICJubHMvZXNoLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBKQkvKjB4NGMwYSovCiNpbmNsdWRlICJubHMvZXNpLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08pCS8qMHg1MDBhKi8KI2luY2x1ZGUgIm5scy9lc3UubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBCKi8KI2luY2x1ZGUgIm5scy9maW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIKQkJLyoweDA0MEMqLwojaW5jbHVkZSAibmxzL2ZyYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOKQkvKjB4MDgwQyovCiNpbmNsdWRlICJubHMvZnJiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOKQkvKjB4MEMwQyovCiNpbmNsdWRlICJubHMvZnJjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX1NXSVNTKQkJLyoweDEwMEMqLwojaW5jbHVkZSAibmxzL2Zycy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHKQkvKjB4MTQwQyovCiNpbmNsdWRlICJubHMvZnJsLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSFVOR0FSSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBlKi8KI2luY2x1ZGUgIm5scy9odW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU4pCQkvKjB4MDQxMCovCiNpbmNsdWRlICJubHMvaXRhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU5fU1dJU1MpCS8qMHgwODEwKi8KI2luY2x1ZGUgIm5scy9pdHMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19KQVBBTkVTRSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxMSovCiNpbmNsdWRlICJubHMvanBuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0NST0FUSUFOLCBTVUJMQU5HX0NST0FUSUFOKQkvKjB4NDFhKi8KI2luY2x1ZGUgIm5scy9ocnYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TTE9WQUssIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MWIqLwojaW5jbHVkZSAibmxzL3NreS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSCkJCS8qMHgwNDFkKi8KI2luY2x1ZGUgIm5scy9zdmUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EKQkvKjB4MDgxZCovCiNpbmNsdWRlICJubHMvc3ZmLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfVEhBSSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4NDFlKi8KI2luY2x1ZGUgIm5scy90aGEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0M2MgKi8KI2luY2x1ZGUgIm5scy9nYWUubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HQUVMSUMsIFNVQkxBTkdfR0FFTElDX1NDT1RUSVNIKQojaW5jbHVkZSAibmxzL2dkaC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19HQUVMSUNfTUFOWCkKI2luY2x1ZGUgIm5scy9nZHYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19FU1BFUkFOVE8sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OGYqLwojaW5jbHVkZSAibmxzL2VzcGVyYW50by5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1dBTE9OLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDkwKi8KI2luY2x1ZGUgIm5scy93YWwubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DT1JOSVNILCBTVUJMQU5HX0RFRkFVTFQpIC8qIDB4MDQ5MSAgKi8KI2luY2x1ZGUgIm5scy9jb3IubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19XRUxTSCwgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0OTIgKi8KI2luY2x1ZGUgIm5scy9jeW0ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19CUkVUT04sIFNVQkxBTkdfREVGQVVMVCkgLyogMHgweDkzICAqLwojaW5jbHVkZSAibmxzL2JyZi5ubHMiCkxBTkdfRU5ECgoJICAgIH07CgoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbGVJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIGNvbnN0IHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CiAgICBjb25zdCBjaGFyCSpuYW1lOwoJRFdPUkQJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaWMgKFNhdWRpIEFyYWJpYSkifSwKCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKCXsweDBjMDEsIkFyYWJpYyAoRWd5cHQpIn0sCgl7MHgxMDAxLCJBcmFiaWMgKExpYnlhKSJ9LAoJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAoJezB4MTgwMSwiQXJhYmljIChNb3JvY2NvKSJ9LAoJezB4MWMwMSwiQXJhYmljIChUdW5pc2lhKSJ9LAoJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAoJezB4MjQwMSwiQXJhYmljIChZZW1lbikifSwKCXsweDI4MDEsIkFyYWJpYyAoU3lyaWEpIn0sCgl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKCXsweDMwMDEsIkFyYWJpYyAoTGViYW5vbikifSwKCXsweDM0MDEsIkFyYWJpYyAoS3V3YWl0KSJ9LAoJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKCXsweDNjMDEsIkFyYWJpYyAoQmFocmFpbikifSwKCXsweDQwMDEsIkFyYWJpYyAoUWF0YXIpIn0sCgl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKCXsweDA0MDMsIkNhdGFsYW4ifSwKCXsweDA0MDQsIkNoaW5lc2UgKFRhaXdhbikifSwKCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAoJezB4MGMwNCwiQ2hpbmVzZSAoSG9uZyBLb25nKSJ9LAoJezB4MTAwNCwiQ2hpbmVzZSAoU2luZ2Fwb3JlKSJ9LAoJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCgl7MHgwNDA1LCJDemVjaCJ9LAoJezB4MDQwNiwiRGFuaXNoIn0sCgl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCgl7MHgwODA3LCJHZXJtYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MGMwNywiR2VybWFuIChBdXN0cmlhKSJ9LAoJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAoJezB4MTQwNywiR2VybWFuIChMaWVjaHRlbnN0ZWluKSJ9LAoJezB4MDQwOCwiR3JlZWsifSwKCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCgl7MHgwODA5LCJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkifSwKCXsweDBjMDksIkVuZ2xpc2ggKEF1c3RyYWxpYW4pIn0sCgl7MHgxMDA5LCJFbmdsaXNoIChDYW5hZGlhbikifSwKCXsweDE0MDksIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKSJ9LAoJezB4MTgwOSwiRW5nbGlzaCAoSXJlbGFuZCkifSwKCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKCXsweDIwMDksIkVuZ2xpc2ggKEphbWFpY2EpIn0sCgl7MHgyNDA5LCJFbmdsaXNoIChDYXJpYmJlYW4pIn0sCgl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCgl7MHgyYzA5LCJFbmdsaXNoIChUcmluaWRhZCAmIFRvYmFnbykifSwKCXsweDMwMDksIkVuZ2xpc2ggKFppbWJhYndlKSJ9LAoJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCgl7MHgwNDBhLCJTcGFuaXNoIChTcGFpbiwgdHJhZGl0aW9uYWwgc29ydGluZykifSwKCXsweDA4MGEsIlNwYW5pc2ggKE1leGljbykifSwKCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgxMDBhLCJTcGFuaXNoIChHdWF0ZW1hbGEpIn0sCgl7MHgxNDBhLCJTcGFuaXNoIChDb3N0YSBSaWNhKSJ9LAoJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAoJezB4MWMwYSwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSJ9LAoJezB4MjAwYSwiU3BhbmlzaCAoVmVuZXp1ZWxhKSJ9LAoJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCgl7MHgyODBhLCJTcGFuaXNoIChQZXJ1KSJ9LAoJezB4MmMwYSwiU3BhbmlzaCAoQXJnZW50aW5hKSJ9LAoJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKCXsweDM0MGEsIlNwYW5pc2ggKENoaWxlKSJ9LAoJezB4MzgwYSwiU3BhbmlzaCAoVXJ1Z3VheSkifSwKCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAoJezB4NDAwYSwiU3BhbmlzaCAoQm9saXZpYSkifSwKCXsweDQ0MGEsIlNwYW5pc2ggKEVsIFNhbHZhZG9yKSJ9LAoJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCgl7MHg0YzBhLCJTcGFuaXNoIChOaWNhcmFndWEpIn0sCgl7MHg1MDBhLCJTcGFuaXNoIChQdWVydG8gUmljbykifSwKCXsweDA0MGIsIkZpbm5pc2gifSwKCXsweDA0MGMsIkZyZW5jaCAoRnJhbmNlKSJ9LAoJezB4MDgwYywiRnJlbmNoIChCZWxnaXVtKSJ9LAoJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCgl7MHgxMDBjLCJGcmVuY2ggKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MTQwYywiRnJlbmNoIChMdXhlbWJvdXJnKSJ9LAoJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCgl7MHgwNDBkLCJIZWJyZXcifSwKCXsweDA0MGUsIkh1bmdhcmlhbiJ9LAoJezB4MDQwZiwiSWNlbGFuZGljIn0sCgl7MHgwNDEwLCJJdGFsaWFuIChJdGFseSkifSwKCXsweDA4MTAsIkl0YWxpYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MDQxMSwiSmFwYW5lc2UifSwKCXsweDA0MTIsIktvcmVhbiAoV2Fuc3VuZykifSwKCXsweDA4MTIsIktvcmVhbiAoSm9oYWIpIn0sCgl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCgl7MHgwODEzLCJEdXRjaCAoQmVsZ2l1bSkifSwKCXsweDA0MTQsIk5vcndlZ2lhbiAoQm9rbWFsKSJ9LAoJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAoJezB4MDQxNSwiUG9saXNoIn0sCgl7MHgwNDE2LCJQb3J0dWd1ZXNlIChCcmF6aWwpIn0sCgl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKCXsweDA0MTcsIlJoYWV0byBSb21hbmljIn0sCgl7MHgwNDE4LCJSb21hbmlhbiJ9LAoJezB4MDgxOCwiTW9sZGF2aWFuIn0sCgl7MHgwNDE5LCJSdXNzaWFuIChSdXNzaWEpIn0sCgl7MHgwODE5LCJSdXNzaWFuIChNb2xkYXZpYSkifSwKCXsweDA0MWEsIkNyb2F0aWFuIn0sCgl7MHgwODFhLCJTZXJiaWFuIChsYXRpbikifSwKCXsweDBjMWEsIlNlcmJpYW4gKGN5cmlsbGljKSJ9LAoJezB4MDQxYiwiU2xvdmFrIn0sCgl7MHgwNDFjLCJBbGJhbmlhbiJ9LAoJezB4MDQxZCwiU3dlZGlzaCAoU3dlZGVuKSJ9LAoJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKCXsweDA0MWUsIlRoYWkifSwKCXsweDA0MWYsIlR1cmtpc2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkluZG9uZXNpYW4ifSwKCXsweDA0MjIsIlVrcmFpbmlhbiJ9LAoJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAoJezB4MDQyNCwiU2xvdmVuZSJ9LAoJezB4MDQyNSwiRXN0b25pYW4ifSwKCXsweDA0MjYsIkxhdHZpYW4ifSwKCXsweDA0MjcsIkxpdGh1YW5pYW4gKG1vZGVybikifSwKCXsweDA4MjcsIkxpdGh1YW5pYW4gKGNsYXNzaWMpIn0sCgl7MHgwNDI4LCJNYW9yaSJ9LAoJezB4MDQyOSwiRmFyc2kifSwKCXsweDA0MmEsIlZpZXRuYW1lc2UifSwKCXsweDA0MmIsIkFybWVuaWFuIn0sCgl7MHgwNDJjLCJBemVyaSAobGF0aW4pIn0sCgl7MHgwODJjLCJBemVyaSAoY3lyaWxsaWMpIn0sCgl7MHgwNDJkLCJCYXNxdWUifSwKCXsweDA0MmUsIlNvcmJpYW4ifSwKCXsweDA0MmYsIk1hY2Vkb25pYW4ifSwKCXsweDA0MzAsIlN1dHUifSwKCXsweDA0MzEsIlRzb25nYSJ9LAoJezB4MDQzMiwiVHN3YW5hIn0sCgl7MHgwNDMzLCJWZW5kYSJ9LAoJezB4MDQzNCwiWGhvc2EifSwKCXsweDA0MzUsIlp1bHUifSwKCXsweDA0MzYsIkFmcmlrYWFucyJ9LAoJezB4MDQzNywiR2VvcmdpYW4ifSwKCXsweDA0MzgsIkZhZXJvZXNlIn0sCgl7MHgwNDM5LCJIaW5kaSJ9LAoJezB4MDQzYSwiTWFsdGVzZSJ9LAoJezB4MDQzYiwiU2FhbWkifSwKCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAoJezB4MDgzYywiU2NvdHRpc2ggZ2FlbGljIn0sCgl7MHgwYzNjLCJNYW54IEdhZWxpYyJ9LAoJezB4MDQzZSwiTWFsYXkgKE1hbGF5c2lhKSJ9LAoJezB4MDgzZSwiTWFsYXkgKEJydW5laSBEYXJ1c3NhbGFtKSJ9LAoJezB4MDQzZiwiS2F6YWsifSwKCXsweDA0NDEsIlN3YWhpbGkifSwKCXsweDA0NDMsIlV6YmVrIChsYXRpbikifSwKCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKCXsweDA0NDQsIlRhdGFyIn0sCgl7MHgwNDQ1LCJCZW5nYWxpIn0sCgl7MHgwNDQ2LCJQdW5qYWJpIn0sCgl7MHgwNDQ3LCJHdWphcmF0aSJ9LAoJezB4MDQ0OCwiT3JpeWEifSwKCXsweDA0NDksIlRhbWlsIn0sCgl7MHgwNDRhLCJUZWx1Z3UifSwKCXsweDA0NGIsIkthbm5hZGEifSwKCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAoJezB4MDQ0ZCwiQXNzYW1lc2UifSwKCXsweDA0NGUsIk1hcmF0aGkifSwKCXsweDA0NGYsIlNhbnNrcml0In0sCgl7MHgwNDU3LCJLb25rYW5pIn0sCgl7MHgwNDhmLCJFc3BlcmFudG8ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwNDkwLCJXYWxvbiJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDA0OTEsIkNvcm5pc2gifSwJLyogTm90IG9mZmljaWFsICovCgl7MHgwNDkyLCJXZWxzaCJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDA0OTMsIkJyZXRvbiJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgpzdGF0aWMgY2hhciAqR2V0TG9jYWxlU3Via2V5TmFtZSggRFdPUkQgbGN0eXBlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDI1XSBbT0xFMk5MUy4xXQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIFtLRVJORUwzMi40MDBdIFtPTEUyTkxTLjJdCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgW0tFUk5FTDMyLjQyNl0gW09MRTJOTFMuM10KICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CgkvKiBjYWNoaW5nIHJlc3VsdCwgaWYgZGVmaW5lZCBmcm9tIGVudmlyb25tZW50LCB3aGljaCBzaG91bGQgKD8pIG5vdCBjaGFuZ2UgZHVyaW5nIGEgV0lORSBzZXNzaW9uICovCglzdGF0aWMJTEFOR0lECXVzZXJMQ0lEID0gMDsKCWlmIChPcHRpb25zLmxhbmd1YWdlKSB7CgkJcmV0dXJuIExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5sYW5naWQ7Cgl9CgoJaWYgKHVzZXJMQ0lEID09IDApIHsKCQljaGFyICpidWY9TlVMTDsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoJCWludCAJcmV0PTA7CgkJCgkJYnVmPWdldGVudigiTEFOR1VBR0UiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTEFORyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19BTEwiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfTUVTU0FHRVMiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQ1RZUEUiKTsKCQlpZiAoIWJ1ZikgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlpZiAoIXN0cmNtcChidWYsIlBPU0lYIikgfHwgIXN0cmNtcChidWYsIkMiKSkgewoJCQlyZXR1cm4gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQl9CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQlyZXQ9TUFJTl9HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCQkKCQl9IHdoaWxlIChsYW5nICYmICFyZXQpOwoJCQoJCS8qIEZJWE1FIDogYXJlIHN0cmluZ3MgcmV0dXJuZWQgYnkgZ2V0ZW52KCkgdG8gYmUgZnJlZSgpJ2VkID8gKi8KCQl1c2VyTENJRCA9IChMQU5HSUQpcmV0OwoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICBbS0VSTkVMMzIuNDAxXSBbT0xFMk5MUy40XQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29udmVydERlZmF1bHRMb2NhbGUzMiBbS0VSTkVMMzIuMTQ3XQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUzMiAoTENJRCBsY2lkKQp7CXN3aXRjaCAobGNpZCkKCXsgIGNhc2UgTE9DQUxFX1NZU1RFTV9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX1VTRVJfREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJICAgY2FzZSAwOgoJICAgICByZXR1cm4gTUFLRUxDSUQgKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ORVVUUkFMKTsKCX0gIAoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRMb2NhbGVJbmZvQSBbS0VSTkVMMzIuMzQyXQogKgogKiBOT1RFUyAKICogIExBTkdfTkVVVFJBTCBpcyBlcXVhbCB0byBMT0NBTEVfU1lTVEVNX0RFRkFVTFQKICoKICogIE1TIG9ubGluZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoZSBzdHJpbmcgcmV0dXJuZWQgaXMgTlVMTCB0ZXJtaW5hdGVkCiAqICBleGNlcHQgZm9yIExPQ0FMRV9GT05UU0lHTkFUVVJFICB3aGljaCAid2lsbCByZXR1cm4gYSBub24tTlVMTAogKiAgdGVybWluYXRlZCBzdHJpbmciLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UIGxlbikKewogIExQQ1NUUiAgcmV0U3RyaW5nOwoJaW50CWZvdW5kLGk7CglpbnQJbGFuZz0wOwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY0J1ZmZlclsxMjhdOwogICAgRFdPUkQgICBkd0J1ZmZlclNpemU9MTI4OwoKICBUUkFDRSgiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09MCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQgfHwgKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgKQkvKiAweDAwLCAweDQwMCAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsY2lkID09IExBTkdfVVNFUl9ERUZBVUxUKSAvKjB4ODAwKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewogICAgICBGSVhNRSgiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgogICAgZm91bmQ9MDsKCiAgICAvKiBGaXJzdCwgY2hlY2sgaWYgaXQncyBpbiB0aGUgcmVnaXN0cnkuICovCgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShMQ1R5cGUpKSApCiAgICB7CiAgICAgICAgY2hhciAgICBhY1JlYWxLZXlbMTI4XTsKICAgICAgICBIS0VZICAgIGhLZXk7CgogICAgICAgIHNwcmludGYoIGFjUmVhbEtleSwgIkNvbnRyb2wgUGFuZWxcXEludGVybmF0aW9uYWxcXCVzIiwgcGFjS2V5ICk7CgogICAgICAgIGlmICggUmVnT3BlbktleUV4QSggSEtFWV9DVVJSRU5UX1VTRVIsIGFjUmVhbEtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBLRVlfUkVBRCwgJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBSZWdRdWVyeVZhbHVlRXhBKCBoS2V5LCBOVUxMLCBOVUxMLCBOVUxMLCAoTFBCWVRFKWFjQnVmZmVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdCdWZmZXJTaXplICkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IGFjQnVmZmVyOwogICAgICAgICAgICAgICAgZm91bmQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJZiBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBnZXQgaXQgZnJvbSB0aGUgTkxTIGVudHJpZXMuICovCgogICAgbGFuZz1sY2lkOwogICAgZm9yIChpPTA7KGk8MyAmJiAhZm91bmQpO2krKykgewogICAgICBpbnQgajsKCiAgICAgIGZvciAoaj0wO2o8c2l6ZW9mKGxhbmdsb2NhbGVzKS9zaXplb2YobGFuZ2xvY2FsZXNbMF0pO2orKykgewoJaWYgKGxhbmdsb2NhbGVzW2pdLmxhbmcgPT0gbGFuZykgewoJICBpbnQgazsKCgkgIGZvciAoaz0wO2s8c2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnMpL3NpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzWzBdKSAmJiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlKTtrKyspIHsKCSAgICBpZiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlID09IExDVHlwZSkgewoJICAgICAgZm91bmQgPSAxOwoJICAgICAgcmV0U3RyaW5nID0gbGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS52YWw7CgkgIGJyZWFrOwoJICAgIH0KCSAgfQogICAgICAgICAgaWYgKGZvdW5kKQoJICAgIGJyZWFrOwoJfQogICAgICB9CgkgIC8qIGxhbmd1YWdlIG5vdCBmb3VuZCwgdHJ5IHdpdGhvdXQgYSBzdWJsYW5ndWFnZSovCgkgIGlmIChpPT0xKSBsYW5nPU1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGFuZyksIFNVQkxBTkdfREVGQVVMVCk7CgkgIC8qIG1hc2sgdGhlIExDIFZhbHVlICovCgkgIGlmIChpPT0yKSBMQ1R5cGUgJj0gMHhmZmY7CiAgICB9CgogICAgaWYoIWZvdW5kKSB7CiAgICAgIEVSUigiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIsCgkJCXJldFN0cmluZywoV09SRClsY2lkKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiAwOwkJCQoJfQogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKQogICAgICAgICAgICBtZW1jcHkoYnVmLCByZXRTdHJpbmcsIChsZW48PXNpemVvZihGT05UU0lHTkFUVVJFKSk/bGVuOnNpemVvZihGT05UU0lHTkFUVVJFKSk7CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKICAgIHJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvVwlbS0VSTkVMMzIuMzQzXQogKgogKiBOT1RFUwogKiAgTVMgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBsZW4gInNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMgKEFOU0kgdmVyc2lvbikKICogIG9yIGNoYXJhY3RlcnMgKFVuaWNvZGUgdmVyc2lvbiksIG9mIiB3YnVmLiBUaHVzIHRoZSBudW1iZXIgcmV0dXJuZWQgaXMKICogIHRoZSBzYW1lIGJldHdlZW4gR2V0TG9jYWxlSW5mb1cgYW5kIEdldExvY2FsZUluZm9BLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwoJICBsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJCUdldExvY2FsZVN1YmtleU5hbWUgW2hlbHBlciBmdW5jdGlvbl0KICoKICogICAgICAgICAgLSBGb3IgdXNlIHdpdGggdGhlIHJlZ2lzdHJ5LgogKiAgICAgICAgICAtIEdldHMgdGhlIHJlZ2lzdHJ5IHN1YmtleSBuYW1lIGZvciBhIGdpdmVuIGxjdHlwZS4KICovCnN0YXRpYyBjaGFyICpHZXRMb2NhbGVTdWJrZXlOYW1lKCBEV09SRCBsY3R5cGUgKQp7CiAgICBjaGFyICAgICpwYWNLZXk9TlVMTDsKCiAgICBzd2l0Y2ggKCBsY3R5cGUgKQogICAgewogICAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IFNldExvY2FsZUluZm8gYW5kIEdldExvY2FsZUluZm8sIGFuZAogICAgICogdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSByZWdpc3RyeSwgY29uZmlybWVkIHVuZGVyIFdpbmRvd3MsCiAgICAgKiBmb3IgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBhc3NpZ24gcGFjS2V5LiBDYXNlcyB0aGF0IGFyZW4ndCBmaW5pc2hlZAogICAgICogaGF2ZSBub3QgYmVlbiBjb25maXJtZWQsIHNvIHRoYXQgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGV5IGNhbiBiZQogICAgICogYWRkZWQuCiAgICAgKi8KICAgIGNhc2UgTE9DQUxFX1NEQVRFIDogICAgICAgIC8qIFRoZSBkYXRlIHNlcGFyYXRvci4gKi8KICAgICAgICBwYWNLZXkgPSAic0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyRGlnaXRzIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NERUNJTUFMIDoKICAgICAgICBwYWNLZXkgPSAic0RlY2ltYWwiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJpQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0dST1VQSU5HIDoKICAgICAgICBwYWNLZXkgPSAic0dyb3VwaW5nIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xJU1QgOgogICAgICAgIHBhY0tleSA9ICJzTGlzdCI7CiAgICAgICAgYnJlYWs7CiAgICAvKiBjYXNlIExPQ0FMRV9JQ0FMRU5EQVJUWVBFOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUREFZT0ZXRUVLOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUV0VFS09GWUVBUjogKi8KICAgIC8qIGNhc2UgTE9DQUxFX1NZRUFSTU9OVEggOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1BPU0lUSVZFU0lHTiA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JUEFQRVJTSVpFOiAqLwogICAgLyogICAgIGJyZWFrOyAqLwogICAgY2FzZSBMT0NBTEVfU0xPTkdEQVRFIDoKICAgICAgICBwYWNLZXkgPSAic0xvbmdEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05ERUNJTUFMU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vbkRlY2ltYWxTZXAiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkdST1VQSU5HOgogICAgICAgIHBhY0tleSA9ICJzTW9uR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU1FQVNVUkU6CiAgICAgICAgcGFjS2V5ID0gImlNZWFzdXJlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05USE9VU0FORFNFUCA6CiAgICAgICAgcGFjS2V5ID0gInNNb25UaG91c2FuZFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHQ1VSUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ0N1cnIiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU05FR0FUSVZFU0lHTiA6CiAgICAgICAgcGFjS2V5ID0gInNOZWdhdGl2ZVNpZ24iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU5FR05VTUJFUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ051bWJlciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TU0hPUlREQVRFIDoKICAgICAgICBwYWNLZXkgPSAic1Nob3J0RGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTERBVEU6ICAgICAgICAvKiBMb25nIERhdGUgZm9ybWF0IG9yZGVyaW5nIHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaUxEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaUxaZXJvIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lUTFpFUk86CiAgICAgICAgcGFjS2V5ID0gImlUTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRJTUU6ICAgICAgICAvKiBUaW1lIGZvcm1hdCBzcGVjaWZpZXIuICovCiAgICAgICAgcGFjS2V5ID0gImlUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSE9VU0FORCA6CiAgICAgICAgcGFjS2V5ID0gInNUaG91c2FuZCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMTE1OTogICAgICAgIC8qIEFNICovCiAgICAgICAgcGFjS2V5ID0gInMxMTU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FOgogICAgICAgIHBhY0tleSA9ICJzVGltZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMjM1OTogICAgICAgIC8qIFBNICovCiAgICAgICAgcGFjS2V5ID0gInMyMzU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FRk9STUFUIDoKICAgICAgICBwYWNLZXkgPSAic1RpbWVGb3JtYXQiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJzQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwoKICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBsaXN0ZWQgdW5kZXIgTVNETiBhcyBzdXBwb3J0ZWQsIAogICAgICogYnV0IHNlZW0gdG8gYmUgdXNlZCBhbmQgYWxzbyBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgY2FzZSBMT0NBTEVfSURBVEU6CiAgICAgICAgcGFjS2V5ID0gImlEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJzQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ09VTlRSWToKICAgICAgICBwYWNLZXkgPSAiaUNvdW50cnkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xBTkdVQUdFOgogICAgICAgIHBhY0tleSA9ICJzTGFuZ3VhZ2UiOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKCBwYWNLZXkgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TG9jYWxlSW5mb0EJW0tFUk5FTDMyLjY1Nl0KICovCkJPT0wxNiBXSU5BUEkgU2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCwgRFdPUkQgbGN0eXBlLCBMUENTVFIgZGF0YSkKewogICAgSEtFWSAgICBoS2V5OwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY1JlYWxLZXlbMTI4XTsKCiAgICBpZiAoIChwYWNLZXkgPSBHZXRMb2NhbGVTdWJrZXlOYW1lKGxjdHlwZSkpICkKICAgIHsKICAgICAgICBzcHJpbnRmKCBhY1JlYWxLZXksICJDb250cm9sIFBhbmVsXFxJbnRlcm5hdGlvbmFsXFwlcyIsIHBhY0tleSApOwogICAgICAgIGlmICggUmVnQ3JlYXRlS2V5QSggSEtFWV9DVVJSRU5UX1VTRVIsIGFjUmVhbEtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEtleSApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBSZWdTZXRWYWx1ZUV4QSggaEtleSwgTlVMTCwgMCwgUkVHX1NaLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc3RybGVuKGRhdGEpKzEgKSAhPSBFUlJPUl9TVUNDRVNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJTZXRMb2NhbGVJbmZvQTogJXMgZGlkIG5vdCB3b3JrXG4iLCBwYWNLZXkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleSggaEtleSApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgIEZJWE1FKCIoJWxkLCVsZCwlcyk6IHN0dWJcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSXNWYWxpZExvY2FsZQlbS0VSTkVMMzIuNDg5XQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewoJaW50CWk7CglCT09MCXJldDsKCVdDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRV8od2luMzIpKCIoJXAsJTA4bHgpXG4iLGxwZm5Mb2NhbGVFbnVtLGZsYWdzICk7CgkvKiBzZWUgaWYgd2UgY2FuIHJldXNlIHRoZSBXaW45NSByZWdpc3RyeSBlbnRyaWVzLi4uLiAqLwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleVcoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoKCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKQogICAgICAgIHsKICAgICAgICAgICAgTFBXU1RSIGNwOwoJICAgIGNoYXIgICB4YnVmZmVyWzEwXTsKICAJCgkgICAgc3ByaW50Zih4YnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoKCSAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeGJ1ZmZlciApOwogICAgICAgICAgICByZXQgPSBscGZuTG9jYWxlRW51bShjcCk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcCApOwogICAgICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgICAgICAgIGkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc0EJW0tFUk5FTDMyLjIwOF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CglpbnQJaTsKCUNIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsCgkJbHBmbkxvY2FsZUVudW0sZmxhZ3MKCSk7CgoJaWYgKCBFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICAgICAgICAgIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLAogICAgICAgICAgICAgICAgICAgICZ4aGtleSkpIHsKICAgICAgICAgICAgaT0wOwogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgRFdPUkQgc2l6ZT1zaXplb2YoYnVmZmVyKTsKICAgICAgICAgICAgICAgIGlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtVmFsdWVBKHhoa2V5LGksYnVmZmVyLCZzaXplLE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLE5VTEwpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKHNpemUgJiYgIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoeGhrZXkpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKSB7CgkJc3ByaW50ZihidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQlicmVhazsKCQlpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQ1RfQ1R5cGUyX0xVVFtdID0gewogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgOCAqLwogIEMyX1NFR01FTlRTRVBBUkFUT1IsIC8qICAgLSAgIDkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMxICovCiAgQzJfV0hJVEVTUEFDRSwgLyogICAtICAzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogISAtICAzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogIyAtICAzNSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICQgLSAgMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAlIC0gIDM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qICYgLSAgMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICcgLSAgMzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICggLSAgNDAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICkgLSAgNDEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICogLSAgNDIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiArIC0gIDQzICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiAsIC0gIDQ0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogLSAtICA0NSAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLiAtICA0NiAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLyAtICA0NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMCAtICA0OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMSAtICA0OSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMiAtICA1MCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMyAtICA1MSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNCAtICA1MiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNSAtICA1MyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNiAtICA1NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNyAtICA1NSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOCAtICA1NiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOSAtICA1NyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogOiAtICA1OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogOyAtICA1OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPCAtICA2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPSAtICA2MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPiAtICA2MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPyAtICA2MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBAIC0gIDY0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEEgLSAgNjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQiAtICA2NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBDIC0gIDY3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEQgLSAgNjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRSAtICA2OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBGIC0gIDcwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEcgLSAgNzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSCAtICA3MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBJIC0gIDczICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEogLSAgNzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSyAtICA3NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBMIC0gIDc2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE0gLSAgNzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTiAtICA3OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBPIC0gIDc5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFAgLSAgODAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUSAtICA4MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBSIC0gIDgyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFMgLSAgODMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVCAtICA4NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBVIC0gIDg1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFYgLSAgODYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVyAtICA4NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBYIC0gIDg4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFkgLSAgODkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWiAtICA5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogWyAtICA5MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXCAtICA5MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXSAtICA5MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXiAtICA5NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXyAtICA5NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogYCAtICA5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBhIC0gIDk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGIgLSAgOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYyAtICA5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBkIC0gMTAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGUgLSAxMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZiAtIDEwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBnIC0gMTAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGggLSAxMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaSAtIDEwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBqIC0gMTA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGsgLSAxMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbCAtIDEwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBtIC0gMTA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG4gLSAxMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbyAtIDExMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBwIC0gMTEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHEgLSAxMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogciAtIDExNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBzIC0gMTE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHQgLSAxMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdSAtIDExNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB2IC0gMTE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHcgLSAxMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeCAtIDEyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB5IC0gMTIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHogLSAxMjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHsgLSAxMjMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHwgLSAxMjQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH0gLSAxMjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH4gLSAxMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiB/IC0gMTI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggCAtIDEyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIEgLSAxMjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIIgLSAxMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyoggyAtIDEzMSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghCAtIDEzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghSAtIDEzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghiAtIDEzNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghyAtIDEzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCIIC0gMTM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogiSAtIDEzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCKIC0gMTM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCLIC0gMTM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIwgLSAxNDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCNIC0gMTQxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjiAtIDE0MiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII8gLSAxNDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCQIC0gMTQ0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCRIC0gMTQ1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCSIC0gMTQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCTIC0gMTQ3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCUIC0gMTQ4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCVIC0gMTQ5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCWIC0gMTUwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCXIC0gMTUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJggLSAxNTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJkgLSAxNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmiAtIDE1NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmyAtIDE1NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCcIC0gMTU2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyognSAtIDE1NyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ4gLSAxNTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognyAtIDE1OSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qIKAgLSAxNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKEgLSAxNjEgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCiIC0gMTYyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoyAtIDE2MyAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKQgLSAxNjQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiClIC0gMTY1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCmIC0gMTY2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCnIC0gMTY3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCoIC0gMTY4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCpIC0gMTY5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCqIC0gMTcwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCrIC0gMTcxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCsIC0gMTcyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCtIC0gMTczICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCuIC0gMTc0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCvIC0gMTc1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsCAtIDE3NiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILEgLSAxNzcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILIgLSAxNzggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILMgLSAxNzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILQgLSAxODAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILUgLSAxODEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILYgLSAxODIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILcgLSAxODMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILggLSAxODQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILkgLSAxODUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILogLSAxODYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILsgLSAxODcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILwgLSAxODggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL0gLSAxODkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL4gLSAxOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL8gLSAxOTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwCAtIDE5MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDBIC0gMTkzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMIgLSAxOTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwyAtIDE5NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDEIC0gMTk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMUgLSAxOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxiAtIDE5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDHIC0gMTk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMggLSAyMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogySAtIDIwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDKIC0gMjAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMsgLSAyMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzCAtIDIwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDNIC0gMjA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM4gLSAyMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzyAtIDIwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDQIC0gMjA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINEgLSAyMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0iAtIDIxMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDTIC0gMjExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINQgLSAyMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1SAtIDIxMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDWIC0gMjE0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiDXIC0gMjE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINggLSAyMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2SAtIDIxNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDaIC0gMjE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINsgLSAyMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3CAtIDIyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDdIC0gMjIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN4gLSAyMjIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3yAtIDIyMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDgIC0gMjI0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOEgLSAyMjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4iAtIDIyNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDjIC0gMjI3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOQgLSAyMjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5SAtIDIyOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDmIC0gMjMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOcgLSAyMzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6CAtIDIzMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDpIC0gMjMzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOogLSAyMzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6yAtIDIzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDsIC0gMjM2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO0gLSAyMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7iAtIDIzOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDvIC0gMjM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPAgLSAyNDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8SAtIDI0MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDyIC0gMjQyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPMgLSAyNDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9CAtIDI0NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD1IC0gMjQ1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPYgLSAyNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIPcgLSAyNDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+CAtIDI0OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD5IC0gMjQ5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPogLSAyNTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+yAtIDI1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD8IC0gMjUyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP0gLSAyNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/iAtIDI1NCAqLwogIEMyX0xFRlRUT1JJR0hUIC8qIP8gLSAyNTUgKi8KfTsKCmNvbnN0IFdPUkQgT0xFMk5MU19DVF9DVHlwZTNfTFVUW10gPSB7IAogIDB4MDAwMCwgLyogICAtICAgMCAqLwogIDB4MDAwMCwgLyogICAtICAgMSAqLwogIDB4MDAwMCwgLyogICAtICAgMiAqLwogIDB4MDAwMCwgLyogICAtICAgMyAqLwogIDB4MDAwMCwgLyogICAtICAgNCAqLwogIDB4MDAwMCwgLyogICAtICAgNSAqLwogIDB4MDAwMCwgLyogICAtICAgNiAqLwogIDB4MDAwMCwgLyogICAtICAgNyAqLwogIDB4MDAwMCwgLyogICAtICAgOCAqLwogIDB4MDAwOCwgLyogICAtICAgOSAqLwogIDB4MDAwOCwgLyogICAtICAxMCAqLwogIDB4MDAwOCwgLyogICAtICAxMSAqLwogIDB4MDAwOCwgLyogICAtICAxMiAqLwogIDB4MDAwOCwgLyogICAtICAxMyAqLwogIDB4MDAwMCwgLyogICAtICAxNCAqLwogIDB4MDAwMCwgLyogICAtICAxNSAqLwogIDB4MDAwMCwgLyogICAtICAxNiAqLwogIDB4MDAwMCwgLyogICAtICAxNyAqLwogIDB4MDAwMCwgLyogICAtICAxOCAqLwogIDB4MDAwMCwgLyogICAtICAxOSAqLwogIDB4MDAwMCwgLyogICAtICAyMCAqLwogIDB4MDAwMCwgLyogICAtICAyMSAqLwogIDB4MDAwMCwgLyogICAtICAyMiAqLwogIDB4MDAwMCwgLyogICAtICAyMyAqLwogIDB4MDAwMCwgLyogICAtICAyNCAqLwogIDB4MDAwMCwgLyogICAtICAyNSAqLwogIDB4MDAwMCwgLyogICAtICAyNiAqLwogIDB4MDAwMCwgLyogICAtICAyNyAqLwogIDB4MDAwMCwgLyogICAtICAyOCAqLwogIDB4MDAwMCwgLyogICAtICAyOSAqLwogIDB4MDAwMCwgLyogICAtICAzMCAqLwogIDB4MDAwMCwgLyogICAtICAzMSAqLwogIDB4MDA0OCwgLyogICAtICAzMiAqLwogIDB4MDA0OCwgLyogISAtICAzMyAqLwogIDB4MDQ0OCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgMHgwMDQ4LCAvKiAjIC0gIDM1ICovCiAgMHgwNDQ4LCAvKiAkIC0gIDM2ICovCiAgMHgwMDQ4LCAvKiAlIC0gIDM3ICovCiAgMHgwMDQ4LCAvKiAmIC0gIDM4ICovCiAgMHgwNDQwLCAvKiAnIC0gIDM5ICovCiAgMHgwMDQ4LCAvKiAoIC0gIDQwICovCiAgMHgwMDQ4LCAvKiApIC0gIDQxICovCiAgMHgwMDQ4LCAvKiAqIC0gIDQyICovCiAgMHgwMDQ4LCAvKiArIC0gIDQzICovCiAgMHgwMDQ4LCAvKiAsIC0gIDQ0ICovCiAgMHgwNDQwLCAvKiAtIC0gIDQ1ICovCiAgMHgwMDQ4LCAvKiAuIC0gIDQ2ICovCiAgMHgwNDQ4LCAvKiAvIC0gIDQ3ICovCiAgMHgwMDQwLCAvKiAwIC0gIDQ4ICovCiAgMHgwMDQwLCAvKiAxIC0gIDQ5ICovCiAgMHgwMDQwLCAvKiAyIC0gIDUwICovCiAgMHgwMDQwLCAvKiAzIC0gIDUxICovCiAgMHgwMDQwLCAvKiA0IC0gIDUyICovCiAgMHgwMDQwLCAvKiA1IC0gIDUzICovCiAgMHgwMDQwLCAvKiA2IC0gIDU0ICovCiAgMHgwMDQwLCAvKiA3IC0gIDU1ICovCiAgMHgwMDQwLCAvKiA4IC0gIDU2ICovCiAgMHgwMDQwLCAvKiA5IC0gIDU3ICovCiAgMHgwMDQ4LCAvKiA6IC0gIDU4ICovCiAgMHgwMDQ4LCAvKiA7IC0gIDU5ICovCiAgMHgwMDQ4LCAvKiA8IC0gIDYwICovCiAgMHgwNDQ4LCAvKiA9IC0gIDYxICovCiAgMHgwMDQ4LCAvKiA+IC0gIDYyICovCiAgMHgwMDQ4LCAvKiA/IC0gIDYzICovCiAgMHgwNDQ4LCAvKiBAIC0gIDY0ICovCiAgMHg4MDQwLCAvKiBBIC0gIDY1ICovCiAgMHg4MDQwLCAvKiBCIC0gIDY2ICovCiAgMHg4MDQwLCAvKiBDIC0gIDY3ICovCiAgMHg4MDQwLCAvKiBEIC0gIDY4ICovCiAgMHg4MDQwLCAvKiBFIC0gIDY5ICovCiAgMHg4MDQwLCAvKiBGIC0gIDcwICovCiAgMHg4MDQwLCAvKiBHIC0gIDcxICovCiAgMHg4MDQwLCAvKiBIIC0gIDcyICovCiAgMHg4MDQwLCAvKiBJIC0gIDczICovCiAgMHg4MDQwLCAvKiBKIC0gIDc0ICovCiAgMHg4MDQwLCAvKiBLIC0gIDc1ICovCiAgMHg4MDQwLCAvKiBMIC0gIDc2ICovCiAgMHg4MDQwLCAvKiBNIC0gIDc3ICovCiAgMHg4MDQwLCAvKiBOIC0gIDc4ICovCiAgMHg4MDQwLCAvKiBPIC0gIDc5ICovCiAgMHg4MDQwLCAvKiBQIC0gIDgwICovCiAgMHg4MDQwLCAvKiBRIC0gIDgxICovCiAgMHg4MDQwLCAvKiBSIC0gIDgyICovCiAgMHg4MDQwLCAvKiBTIC0gIDgzICovCiAgMHg4MDQwLCAvKiBUIC0gIDg0ICovCiAgMHg4MDQwLCAvKiBVIC0gIDg1ICovCiAgMHg4MDQwLCAvKiBWIC0gIDg2ICovCiAgMHg4MDQwLCAvKiBXIC0gIDg3ICovCiAgMHg4MDQwLCAvKiBYIC0gIDg4ICovCiAgMHg4MDQwLCAvKiBZIC0gIDg5ICovCiAgMHg4MDQwLCAvKiBaIC0gIDkwICovCiAgMHgwMDQ4LCAvKiBbIC0gIDkxICovCiAgMHgwNDQ4LCAvKiBcIC0gIDkyICovCiAgMHgwMDQ4LCAvKiBdIC0gIDkzICovCiAgMHgwNDQ4LCAvKiBeIC0gIDk0ICovCiAgMHgwNDQ4LCAvKiBfIC0gIDk1ICovCiAgMHgwNDQ4LCAvKiBgIC0gIDk2ICovCiAgMHg4MDQwLCAvKiBhIC0gIDk3ICovCiAgMHg4MDQwLCAvKiBiIC0gIDk4ICovCiAgMHg4MDQwLCAvKiBjIC0gIDk5ICovCiAgMHg4MDQwLCAvKiBkIC0gMTAwICovCiAgMHg4MDQwLCAvKiBlIC0gMTAxICovCiAgMHg4MDQwLCAvKiBmIC0gMTAyICovCiAgMHg4MDQwLCAvKiBnIC0gMTAzICovCiAgMHg4MDQwLCAvKiBoIC0gMTA0ICovCiAgMHg4MDQwLCAvKiBpIC0gMTA1ICovCiAgMHg4MDQwLCAvKiBqIC0gMTA2ICovCiAgMHg4MDQwLCAvKiBrIC0gMTA3ICovCiAgMHg4MDQwLCAvKiBsIC0gMTA4ICovCiAgMHg4MDQwLCAvKiBtIC0gMTA5ICovCiAgMHg4MDQwLCAvKiBuIC0gMTEwICovCiAgMHg4MDQwLCAvKiBvIC0gMTExICovCiAgMHg4MDQwLCAvKiBwIC0gMTEyICovCiAgMHg4MDQwLCAvKiBxIC0gMTEzICovCiAgMHg4MDQwLCAvKiByIC0gMTE0ICovCiAgMHg4MDQwLCAvKiBzIC0gMTE1ICovCiAgMHg4MDQwLCAvKiB0IC0gMTE2ICovCiAgMHg4MDQwLCAvKiB1IC0gMTE3ICovCiAgMHg4MDQwLCAvKiB2IC0gMTE4ICovCiAgMHg4MDQwLCAvKiB3IC0gMTE5ICovCiAgMHg4MDQwLCAvKiB4IC0gMTIwICovCiAgMHg4MDQwLCAvKiB5IC0gMTIxICovCiAgMHg4MDQwLCAvKiB6IC0gMTIyICovCiAgMHgwMDQ4LCAvKiB7IC0gMTIzICovCiAgMHgwMDQ4LCAvKiB8IC0gMTI0ICovCiAgMHgwMDQ4LCAvKiB9IC0gMTI1ICovCiAgMHgwNDQ4LCAvKiB+IC0gMTI2ICovCiAgMHgwMDAwLCAvKiB/IC0gMTI3ICovCiAgMHgwMDAwLCAvKiCAIC0gMTI4ICovCiAgMHgwMDAwLCAvKiCBIC0gMTI5ICovCiAgMHgwMDA4LCAvKiCCIC0gMTMwICovCiAgMHg4MDAwLCAvKiCDIC0gMTMxICovCiAgMHgwMDA4LCAvKiCEIC0gMTMyICovCiAgMHgwMDA4LCAvKiCFIC0gMTMzICovCiAgMHgwMDA4LCAvKiCGIC0gMTM0ICovCiAgMHgwMDA4LCAvKiCHIC0gMTM1ICovCiAgMHgwMDAxLCAvKiCIIC0gMTM2ICovCiAgMHgwMDA4LCAvKiCJIC0gMTM3ICovCiAgMHg4MDAzLCAvKiCKIC0gMTM4ICovCiAgMHgwMDA4LCAvKiCLIC0gMTM5ICovCiAgMHg4MDAwLCAvKiCMIC0gMTQwICovCiAgMHgwMDAwLCAvKiCNIC0gMTQxICovCiAgMHgwMDAwLCAvKiCOIC0gMTQyICovCiAgMHgwMDAwLCAvKiCPIC0gMTQzICovCiAgMHgwMDAwLCAvKiCQIC0gMTQ0ICovCiAgMHgwMDg4LCAvKiCRIC0gMTQ1ICovCiAgMHgwMDg4LCAvKiCSIC0gMTQ2ICovCiAgMHgwMDg4LCAvKiCTIC0gMTQ3ICovCiAgMHgwMDg4LCAvKiCUIC0gMTQ4ICovCiAgMHgwMDA4LCAvKiCVIC0gMTQ5ICovCiAgMHgwNDAwLCAvKiCWIC0gMTUwICovCiAgMHgwNDAwLCAvKiCXIC0gMTUxICovCiAgMHgwNDA4LCAvKiCYIC0gMTUyICovCiAgMHgwMDAwLCAvKiCZIC0gMTUzICovCiAgMHg4MDAzLCAvKiCaIC0gMTU0ICovCiAgMHgwMDA4LCAvKiCbIC0gMTU1ICovCiAgMHg4MDAwLCAvKiCcIC0gMTU2ICovCiAgMHgwMDAwLCAvKiCdIC0gMTU3ICovCiAgMHgwMDAwLCAvKiCeIC0gMTU4ICovCiAgMHg4MDAzLCAvKiCfIC0gMTU5ICovCiAgMHgwMDA4LCAvKiCgIC0gMTYwICovCiAgMHgwMDA4LCAvKiChIC0gMTYxICovCiAgMHgwMDQ4LCAvKiCiIC0gMTYyICovCiAgMHgwMDQ4LCAvKiCjIC0gMTYzICovCiAgMHgwMDA4LCAvKiCkIC0gMTY0ICovCiAgMHgwMDQ4LCAvKiClIC0gMTY1ICovCiAgMHgwMDQ4LCAvKiCmIC0gMTY2ICovCiAgMHgwMDA4LCAvKiCnIC0gMTY3ICovCiAgMHgwNDA4LCAvKiCoIC0gMTY4ICovCiAgMHgwMDA4LCAvKiCpIC0gMTY5ICovCiAgMHgwNDAwLCAvKiCqIC0gMTcwICovCiAgMHgwMDA4LCAvKiCrIC0gMTcxICovCiAgMHgwMDQ4LCAvKiCsIC0gMTcyICovCiAgMHgwNDA4LCAvKiCtIC0gMTczICovCiAgMHgwMDA4LCAvKiCuIC0gMTc0ICovCiAgMHgwNDQ4LCAvKiCvIC0gMTc1ICovCiAgMHgwMDA4LCAvKiCwIC0gMTc2ICovCiAgMHgwMDA4LCAvKiCxIC0gMTc3ICovCiAgMHgwMDAwLCAvKiCyIC0gMTc4ICovCiAgMHgwMDAwLCAvKiCzIC0gMTc5ICovCiAgMHgwNDA4LCAvKiC0IC0gMTgwICovCiAgMHgwMDA4LCAvKiC1IC0gMTgxICovCiAgMHgwMDA4LCAvKiC2IC0gMTgyICovCiAgMHgwMDA4LCAvKiC3IC0gMTgzICovCiAgMHgwNDA4LCAvKiC4IC0gMTg0ICovCiAgMHgwMDAwLCAvKiC5IC0gMTg1ICovCiAgMHgwNDAwLCAvKiC6IC0gMTg2ICovCiAgMHgwMDA4LCAvKiC7IC0gMTg3ICovCiAgMHgwMDAwLCAvKiC8IC0gMTg4ICovCiAgMHgwMDAwLCAvKiC9IC0gMTg5ICovCiAgMHgwMDAwLCAvKiC+IC0gMTkwICovCiAgMHgwMDA4LCAvKiC/IC0gMTkxICovCiAgMHg4MDAzLCAvKiDAIC0gMTkyICovCiAgMHg4MDAzLCAvKiDBIC0gMTkzICovCiAgMHg4MDAzLCAvKiDCIC0gMTk0ICovCiAgMHg4MDAzLCAvKiDDIC0gMTk1ICovCiAgMHg4MDAzLCAvKiDEIC0gMTk2ICovCiAgMHg4MDAzLCAvKiDFIC0gMTk3ICovCiAgMHg4MDAwLCAvKiDGIC0gMTk4ICovCiAgMHg4MDAzLCAvKiDHIC0gMTk5ICovCiAgMHg4MDAzLCAvKiDIIC0gMjAwICovCiAgMHg4MDAzLCAvKiDJIC0gMjAxICovCiAgMHg4MDAzLCAvKiDKIC0gMjAyICovCiAgMHg4MDAzLCAvKiDLIC0gMjAzICovCiAgMHg4MDAzLCAvKiDMIC0gMjA0ICovCiAgMHg4MDAzLCAvKiDNIC0gMjA1ICovCiAgMHg4MDAzLCAvKiDOIC0gMjA2ICovCiAgMHg4MDAzLCAvKiDPIC0gMjA3ICovCiAgMHg4MDAwLCAvKiDQIC0gMjA4ICovCiAgMHg4MDAzLCAvKiDRIC0gMjA5ICovCiAgMHg4MDAzLCAvKiDSIC0gMjEwICovCiAgMHg4MDAzLCAvKiDTIC0gMjExICovCiAgMHg4MDAzLCAvKiDUIC0gMjEyICovCiAgMHg4MDAzLCAvKiDVIC0gMjEzICovCiAgMHg4MDAzLCAvKiDWIC0gMjE0ICovCiAgMHgwMDA4LCAvKiDXIC0gMjE1ICovCiAgMHg4MDAzLCAvKiDYIC0gMjE2ICovCiAgMHg4MDAzLCAvKiDZIC0gMjE3ICovCiAgMHg4MDAzLCAvKiDaIC0gMjE4ICovCiAgMHg4MDAzLCAvKiDbIC0gMjE5ICovCiAgMHg4MDAzLCAvKiDcIC0gMjIwICovCiAgMHg4MDAzLCAvKiDdIC0gMjIxICovCiAgMHg4MDAwLCAvKiDeIC0gMjIyICovCiAgMHg4MDAwLCAvKiDfIC0gMjIzICovCiAgMHg4MDAzLCAvKiDgIC0gMjI0ICovCiAgMHg4MDAzLCAvKiDhIC0gMjI1ICovCiAgMHg4MDAzLCAvKiDiIC0gMjI2ICovCiAgMHg4MDAzLCAvKiDjIC0gMjI3ICovCiAgMHg4MDAzLCAvKiDkIC0gMjI4ICovCiAgMHg4MDAzLCAvKiDlIC0gMjI5ICovCiAgMHg4MDAwLCAvKiDmIC0gMjMwICovCiAgMHg4MDAzLCAvKiDnIC0gMjMxICovCiAgMHg4MDAzLCAvKiDoIC0gMjMyICovCiAgMHg4MDAzLCAvKiDpIC0gMjMzICovCiAgMHg4MDAzLCAvKiDqIC0gMjM0ICovCiAgMHg4MDAzLCAvKiDrIC0gMjM1ICovCiAgMHg4MDAzLCAvKiDsIC0gMjM2ICovCiAgMHg4MDAzLCAvKiDtIC0gMjM3ICovCiAgMHg4MDAzLCAvKiDuIC0gMjM4ICovCiAgMHg4MDAzLCAvKiDvIC0gMjM5ICovCiAgMHg4MDAwLCAvKiDwIC0gMjQwICovCiAgMHg4MDAzLCAvKiDxIC0gMjQxICovCiAgMHg4MDAzLCAvKiDyIC0gMjQyICovCiAgMHg4MDAzLCAvKiDzIC0gMjQzICovCiAgMHg4MDAzLCAvKiD0IC0gMjQ0ICovCiAgMHg4MDAzLCAvKiD1IC0gMjQ1ICovCiAgMHg4MDAzLCAvKiD2IC0gMjQ2ICovCiAgMHgwMDA4LCAvKiD3IC0gMjQ3ICovCiAgMHg4MDAzLCAvKiD4IC0gMjQ4ICovCiAgMHg4MDAzLCAvKiD5IC0gMjQ5ICovCiAgMHg4MDAzLCAvKiD6IC0gMjUwICovCiAgMHg4MDAzLCAvKiD7IC0gMjUxICovCiAgMHg4MDAzLCAvKiD8IC0gMjUyICovCiAgMHg4MDAzLCAvKiD9IC0gMjUzICovCiAgMHg4MDAwLCAvKiD+IC0gMjU0ICovCiAgMHg4MDAzICAvKiD/IC0gMjU1ICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlQQlbS0VSTkVMMzIuMzk2XQogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlRXhBCVtLRVJORUwzMi4zOTddCiAqCiAqIEZJWE1FOiBJZ25vcmVzIHRoZSBsb2NhbGUuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoJCglpZiAoKHNyYz09TlVMTCkgfHwgKGNoYXJ0eXBlPT1OVUxMKSB8fCAoc3JjPT0oTFBTVFIpY2hhcnR5cGUpKQoJewoJICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVXCVtLRVJORUwzMi4zOTldCiAqCiAqIE5PVEVTCiAqIFllcywgdGhpcyBpcyBtaXNzaW5nIExDSUQgbG9jYWxlLiBNUyBmYXVsdC4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVXKERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsSU5UIGNjaFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeFcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeFcJW0tFUk5FTDMyLjM5OF0KICoKICogRklYTUU6IHVuaWNvZGUgY2hhcnMgYXJlIGFzc3VtZWQgY2hhcnMKICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeFcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5XKHNyYykrMTsKCQoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMjoKCQlGSVhNRSgiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRSgiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CgkJY2hhcnR5cGVbaV0gPSAwOwoJCWlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJCWlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJCWlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KICAgICAgICAgICAgICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJCS8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXSU5FX0dldExhbmd1YWdlTmFtZSAgIFtpbnRlcm5hbF0gCiAqLwpzdGF0aWMgTFBDU1RSIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCBVSU5UIGxhbmdpZCApCnsKICAgIGludCBpOwogICAgZm9yICggaSA9IDA7IGxhbmd1YWdlc1tpXS5sYW5naWQgIT0gMDsgaSsrICkKICAgICAgICBpZiAoIGxhbmdpZCA9PSBsYW5ndWFnZXNbaV0ubGFuZ2lkICkKICAgICAgICAgICAgYnJlYWs7CgogICAgcmV0dXJuIGxhbmd1YWdlc1tpXS5sYW5nbmFtZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuNzA5XVtWRVJTSU9OLjldCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lQSggVUlOVCB3TGFuZywgTFBTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgY2hhciAgICBidWZmZXJbODBdOwogICAgTFBDU1RSICBuYW1lOwogICAgRFdPUkQgICByZXN1bHQ7CgogICAgLyoKICAgICAqIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogICAgICogZnJvbSB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBzcHJpbnRmKCBidWZmZXIsCiAgICAgICAgICAgICAiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCiAgICAgICAgICAgICB3TGFuZyApOwoKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVBKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGJ1ZmZlciwgc3pMYW5nLCAoTFBEV09SRCkmblNpemUgKTsKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkEoIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi43MTBdW1ZFUlNJT04uMTBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGNoYXIgICAgYnVmZmVyWzgwXTsKICAgIExQV1NUUiAga2V5bmFtZTsKICAgIExQQ1NUUiAgbmFtZTsKICAgIERXT1JEICAgcmVzdWx0OwoKICAgIC8qCiAgICAgKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KICAgICAqIGZyb20gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgc3ByaW50ZiggYnVmZmVyLAogICAgICAgICAgICAgIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAogICAgICAgICAgICAgd0xhbmcgKTsKCiAgICBrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVXKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIHN6TGFuZywgKExQRFdPUkQpJm5TaXplICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkF0b1coIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICFJc0NoYXJBbHBoYU51bWVyaWNBKGMpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVCBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW4gPT0gLTEpIAogICAgc3JjbGVuID0gbHN0cmxlbkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKI2RlZmluZSBMQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTIChMQ01BUF9VUFBFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfTE9XRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX1NPUlRLRVkgICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVOT05TUEFDRSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPUlRfU1RSSU5HU09SVCAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRVdJRFRIICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVLQU5BVFlQRSkKICAvKiBGSVhNRTogYXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEthbmFrYW5hIG5vciBIaXJpZ2FuYSAKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gY29tcGxldGVseSBpZ25vcmVzIHRoZSAibGNpZCIgcGFyYW1ldGVyLiAqLwogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQojaWYgMAogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlJfKHN0cmluZykoImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmdXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmdBIGZvciBkb2N1bWVudGF0aW9uCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQgZHN0bGVuKQp7CiAgaW50IGk7CiAKICBUUkFDRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCiAgICAgICAgICAgICAgICAgbGNpZCwgbWFwZmxhZ3MsIHNyY3N0ciwgc3JjbGVuLCBkc3RzdHIsIGRzdGxlbik7CiAgCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIoIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgTENfQ09MTEFURS4gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9kZWZhdWx0ID0gMDsgLyogdmFsdWUgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2VudiA9IDA7ICAgICAvKiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KCiAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBpbmRleCBpbnRvIHN0cmluZ3Mgb2YgYW55IHR5cGUuICovCiAgICAgIGludCBzdHJfaWR4ID0gMDsKCiAgICAgIC8qIExlbmd0aHMgb2YgdmFyaW91cyBzdHJpbmdzIHdoZXJlIHRoZSBsZW5ndGggaXMgbWVhc3VyZWQgaW4KICAgICAgICogd2lkZSBjaGFyYWN0ZXJzIGZvciB3aWRlIGNoYXJhY3RlciBzdHJpbmdzIGFuZCBpbiBieXRlcyBmb3IKICAgICAgICogbmF0aXZlIHN0cmluZ3MuICBUaGUgbGVuZ3RocyBpbmNsdWRlIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwogICAgICBzaXplX3QgcmV0dXJuZWRfbGVuICAgID0gMDsKICAgICAgc2l6ZV90IHNyY19uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0c3RyX2xpYmNfbGVuID0gMDsKCiAgICAgIC8qIE5hdGl2ZSAoY2hhcmFjdGVyIHNldCBkZXRlcm1pbmVkIGJ5IGxvY2FsZSkgdmVyc2lvbnMgb2YgdGhlCiAgICAgICAqIHN0cmluZ3Mgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzLiAgKi8KICAgICAgTFBTVFIgc3JjX25hdGl2ZSA9IDA7CiAgICAgIExQU1RSIGRzdF9uYXRpdmUgPSAwOwoKICAgICAgLyogVmVyc2lvbiBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzIHVzaW5nIHRoZQogICAgICAgKiAid2NoYXJfdCIgVW5pY29kZSBkYXRhIHR5cGUgbmVlZGVkIGJ5IHZhcmlvdXMgbGliYyBmdW5jdGlvbnMuICAqLwogICAgICB3Y2hhcl90ICpzcmNzdHJfbGliYyA9IDA7CiAgICAgIHdjaGFyX3QgKmRzdHN0cl9saWJjID0gMDsKCiAgICAgIGlmKCEoc3Jjc3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY3N0cl9saWJjXG4iLAogICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgc291cmNlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IHNyY2xlbjsgc3RyX2lkeCsrKQogICAgICB7CiAgICAgICAgICBzcmNzdHJfbGliY1tzdHJfaWR4XSA9IHNyY3N0cltzdHJfaWR4XTsKICAgICAgfQoKICAgICAgLyogc3JjX25hdGl2ZSBzaG91bGQgY29udGFpbiBhdCBtb3N0IDMgYnl0ZXMgZm9yIGVhY2gKICAgICAgICogbXVsdGlieXRlIGNoYXJhY3RlcnMgaW4gdGhlIG9yaWdpbmFsIHNyY3N0ciBzdHJpbmcuICAqLwogICAgICBzcmNfbmF0aXZlX2xlbiA9IDMgKiBzcmNsZW47CiAgICAgIGlmKCEoc3JjX25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY19uYXRpdmVcbiIsIHNyY19uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIEZJWE1FOiBQcmlvciB0byB0byBzZXR0aW5nIHRoZSBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSB0aGUKICAgICAgICogY3VycmVudCB2YWx1ZSBpcyBiYWNrZWQgdXAgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGFmdGVyIHRoZQogICAgICAgKiBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9uIHJldHVybnMuCiAgICAgICAqIAogICAgICAgKiBFdmVuIHRob3VnaCB0aGUgbG9jYWxlIGlzIGFkanVzdGVkIGZvciBhIG1pbmltdW0gYW1vdW50IG9mCiAgICAgICAqIHRpbWUgYSByYWNlIGNvbmRpdGlvbiBleGlzdHMgd2hlcmUgb3RoZXIgdGhyZWFkcyBtYXkgYmUKICAgICAgICogYWZmZWN0ZWQgaWYgdGhleSBpbnZva2UgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb25zLiAgT25lCiAgICAgICAqIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHdyYXAgYWxsIExDX0NPTExBVEUgc2Vuc2l0aXZlIFdpbmUKICAgICAgICogZnVuY3Rpb25zLCBsaWtlIExDTWFwU3RyaW5nVygpLCBpbiBhIG11dGV4LgogICAgICAgKgogICAgICAgKiBBbm90aGVyIGVuaGFuY2VtZW50IHRvIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdG8gc2V0IHRoZQogICAgICAgKiBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAibGNpZCIKICAgICAgICogcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlICJMQ19DT0xMQVRFIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KICAgICAgaWYoIShsY19jb2xsYXRlX2RlZmF1bHQgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBxdWVyeSB0aGUgTENfQ09MTEFURSBjYXRhZ29yeVxuIik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmKCEobGNfY29sbGF0ZV9lbnYgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgIiIpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gaW5oZXJpdCB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgZnJvbSB0aGUgIgogICAgICAgICAgICAgICJlbnZpcm9ubWVudC4gIFRoZSBcIkxDX0NPTExBVEVcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyAiCiAgICAgICAgICAgICAgIlwiJXNcIi5cbiIsIGdldGVudigiTENfQ09MTEFURSIpID8KICAgICAgICAgICAgICBnZXRlbnYoIkxDX0NPTExBVEUiKSA6ICI8dW5zZXQ+Iik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIFRSQUNFXyhzdHJpbmcpKCJsY19jb2xsYXRlX2RlZmF1bHQgPSAlc1xuIiwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgVFJBQ0VfKHN0cmluZykoImxjX2NvbGxhdGVfZW52ID0gJXNcbiIsIGxjX2NvbGxhdGVfZW52KTsKCiAgICAgIC8qIENvbnZlcnQgdGhlIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gYSBuYXRpdmUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgKiBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHdjc3RvbWJzKHNyY19uYXRpdmUsIHNyY3N0cl9saWJjLCBzcmNfbmF0aXZlX2xlbikgKyAxOwogICAgICBpZihyZXR1cm5lZF9sZW4gPT0gMCkKICAgICAgewogICAgICAgICAgTFBTVFIgc3Jjc3RyX2FzY2lpID0gKExQU1RSKUhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLAoJCQkJCSAgIDAsIHNyY3N0cik7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIGZhaWxlZC4gIFRoZSBzdHJpbmcgc3BlY2lmaWVkICglcykgbWF5IGNvbnRhaW5zIGFuICIKICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBzcmNzdHJfYXNjaWkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9hc2NpaSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2FzY2lpKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZWxzZSBpZihyZXR1cm5lZF9sZW4gPiBzcmNfbmF0aXZlX2xlbikKICAgICAgewogICAgICAgICAgc3JjX25hdGl2ZVtzcmNfbmF0aXZlX2xlbiAtIDFdID0gMDsKICAgICAgICAgIEVSUigid2NzdG9tYnMgcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0VfKHN0cmluZykoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwogICAgICAKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBkc3RfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZHN0X25hdGl2ZV9sZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIAogICAgICBUUkFDRV8oc3RyaW5nKSgiZHN0X25hdGl2ZSA9ICVzICBkc3RfbmF0aXZlX2xlbiA9ICVkXG4iLAogICAgICAgICAgICAgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgZHN0c3RyX2xpYmNfbGVuID0gZHN0X25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0c3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdHN0cl9saWJjXG4iLAogICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHRoZSBuYXRpdmUgbXVsdGlieXRlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IG1ic3Rvd2NzKGRzdHN0cl9saWJjLCBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgLyogUmVzdG9yZSBMQ19DT0xMQVRFIG5vdyB0aGF0IHRoZSBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlCiAgICAgICAqIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4gKi8KICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7IAoKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigibWJzdG93Y3MgZmFpbGVkLiAgVGhlIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSB0cmFuc2xhdGVkIHN0cmluZyAiCiAgICAgICAgICAgICAgIiglcykgbWF5IGNvbnRhaW4gYW4gaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZihkc3RsZW4pCiAgICAgIHsKICAgICAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdGxlbikKICAgICAgICAgIHsKICAgICAgICAgICAgICBFUlIoIm1ic3Rvd2NzIHJldHVybmVkIGEgc3RyaW5nIHRoYXQgd2FzIGxvbmdlciAoJWQgY2hhcnMpICIgCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgICAgICAvKiBDb252ZXJ0IGEgbGliYyBVbmljb2RlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nLiAqLwogICAgICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgZHN0bGVuOyBzdHJfaWR4KyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgZHN0c3RyW3N0cl9pZHhdID0gZHN0c3RyX2xpYmNbc3RyX2lkeF07CiAgICAgICAgICB9CiAgICAgICAgICBUUkFDRV8oc3RyaW5nKSgiMXN0IDQgaW50IHNpemVkIGNodW5rcyBvZiBkc3RzdHIgPSAleCAleCAleCAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMykpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwogICAgICB9CiAgICAgIFRSQUNFXyhzdHJpbmcpKCJkc3RsZW4gKHJldHVybikgPSAlZFxuIiwgZHN0bGVuKTsKICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICByZXR1cm4gZHN0bGVuOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgICByZXR1cm4gc3JjbGVuOyAgCiAgICBpZiAoZHN0bGVuPHNyY2xlbikgCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aAogKgogKiBFc3RpbWF0ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZwogKiBjb21wdXRlZCBieSBMQ01hcFN0cmluZ0EuCiAqCiAqIFRoZSBzaXplIGlzIGFsd2F5cyBvdmVyLWVzdGltYXRlZCwgd2l0aCBhIGZpeGVkIGxpbWl0IG9uIHRoZQogKiBhbW91bnQgb2YgZXN0aW1hdGlvbiBlcnJvci4KICoKICogTm90ZSB0aGF0IGxlbiA9PSAtMSBpcyBub3QgcGVybWl0dGVkLgogKi8Kc3RhdGljIGlubGluZSBpbnQgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgoTENJRCBsY2lkLCBEV09SRCBkd01hcEZsYWdzLAoJCQkJCQlMUENTVFIgc3RyLCBEV09SRCBsZW4pCnsKICAgIC8qIEVzdGltYXRlIG9ubHkgZm9yIHNtYWxsIHN0cmluZ3MgdG8ga2VlcCB0aGUgZXN0aW1hdGlvbiBlcnJvciBmcm9tCiAgICAgKiBiZWNvbWluZyB0b28gbGFyZ2UuICovCiAgICBpZiAobGVuIDwgMTI4KSByZXR1cm4gbGVuICogOCArIDU7CiAgICBlbHNlIHJldHVybiBMQ01hcFN0cmluZ0EobGNpZCwgZHdNYXBGbGFncywgc3RyLCBsZW4sIE5VTEwsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nQQlbS0VSTkVMMzIuMTQzXQogKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1c2luZyBsb2NhbGUKICoKICogUkVUVVJOUwogKgogKiBzdWNjZXNzOiBDU1RSX0xFU1NfVEhBTiwgQ1NUUl9FUVVBTCwgQ1NUUl9HUkVBVEVSX1RIQU4KICogZmFpbHVyZTogMAogKgogKiBOT1RFUwogKgogKiBEZWZhdWx0cyB0byBhIHdvcmQgc29ydCwgYnV0IHVzZXMgYSBzdHJpbmcgc29ydCBpZgogKiBTT1JUX1NUUklOR1NPUlQgaXMgc2V0LgogKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgogKiAKICogQlVHUwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKgogKiBGSVhNRQogKiAKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nQSgKICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBmaXJzdCBzdHJpbmcgKi8KICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nICovCnsKICBpbnQgbWFwc3RyaW5nX2ZsYWdzOwogIGludCBsZW4xLGxlbjI7CiAgaW50IHJlc3VsdDsKICBMUFNUUiBzazEsc2syOwogIFRSQUNFKCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IGxzdHJsZW5BKHMxKTsKICBpZiAobDIgPT0gLTEpIGwyID0gbHN0cmxlbkEoczIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aChsY2lkLCBtYXBzdHJpbmdfZmxhZ3MsIHMxLCBsMSk7CiAgbGVuMiA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczIsIGwyKTsKCiAgaWYgKChsZW4xPT0wKXx8KGxlbjI9PTApKQogICAgcmV0dXJuIDA7ICAgICAvKiBzb21ldGhpbmcgd3JvbmcgaGFwcGVuZWQgKi8KCiAgc2sxID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4xICsgbGVuMik7CiAgc2syID0gc2sxICsgbGVuMTsKICBpZiAoICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKCSB8fCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKICB7CiAgICBFUlIoIkJ1ZyBpbiBMQ21hcFN0cmluZ0EuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBzdHJjbXAgZG9lc24ndCBuZWNlc3NhcmlseSByZXR1cm4gLTEsIDAsIG9yIDEgKi8KICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMSk7CgogIGlmIChyZXN1bHQgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHJlc3VsdCA9PSAwKQogICAgcmV0dXJuIDI7CgogIC8qIG11c3QgYmUgZ3JlYXRlciwgaWYgd2UgcmVhY2ggdGhpcyBwb2ludCAqLwogIHJldHVybiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nVwlbS0VSTkVMMzIuMTQ0XQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUoIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKCQlGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9sc3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/IHN0cm5jbXBpVyhzMSxzMixsZW4pIDogc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENTVFIgX2Zvcm1hdCwgCS8qaW4qLwoJCQkgICAgTFBTVFIgZGF0ZSwJCS8qb3V0Ki8KCQkJICAgIElOVCBkYXRlbGVuKQp7CiAgIElOVCBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSAgICAgIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0RheSk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gMykgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOwoJCSAgc3RyY3B5KGJ1ZiwgIkFEIik7CgkgICAgfSBlbHNlIHsKCQkgIHN0cmNweShidWYsICJnIik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4oImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CiAgIAogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CiAgIAogICBUUkFDRSgiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbM107CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIGFyZ2FyclswXSA9IGFyZzA7CiAgIGFyZ2FyclsxXSA9IGFyZzE7CiAgIGFyZ2FyclsyXSA9IGFyZzI7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIFRSQUNFKCJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6JXMgKGF0ICVwKSwgIgogICAJICAgICAgIiVwIHdpdGggbWF4IGxlbiAlZFxuIiwKCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGRlYnVnc3RyX3coZm9ybWF0KSwgZm9ybWF0LCBvdXRwdXQsIG91dGxlbik7CiAgIAogICBpZihvdXRsZW4gPT0gMCkgewogICAgIEZJWE1FKCJvdXRsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArIHh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbMV0gLyogIiVkIiAqLywKCQkJIHh0aW1lLT53WWVhcik7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgInl5eSIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDYsIGFyZ2Fycltjb3VudF0sCgkJCSAgICB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgbHN0cmNweVcoIG91dHB1dCArIG91dHBvcywgYnVmICk7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewogICAgICAgICAgICBsc3RyY3B5blcoIG91dHB1dCArIG91dHBvcywgYnVmLCBvdXRsZW4gLSBvdXRwb3MgKTsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTigiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIFRSQUNFKCIgcmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdEEJW0tFUk5FTDMyLjMxMF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVCBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwogIElOVCByZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKICAKICBpZiAoIWxvY2FsZSkgewogICAgIGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgICB9OwogIAogIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgewogICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CiAgIH07CgogIGlmICh4dGltZSA9PSBOVUxMKSB7CiAgICAgR2V0U3lzdGVtVGltZSgmdCk7CiAgICAgdGhpc3RpbWUgPSAmdDsKICB9IGVsc2UgewogICAgIHRoaXN0aW1lID0geHRpbWU7CiAgfTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdEEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRXCVtLRVJORUwzMi4zMTFdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0QSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVCBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUoIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuMTk4KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzQSgKICBEQVRFRk1UX0VOVU1QUk9DQSBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsICBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKCiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eSBNTSBkZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTAwOTogIC8qIChMb2MsImVuX0NBIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2RkL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQtTU1NLXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjAwOTogIC8qIChMb2MsImVuX0pNIikgKi8gIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIEVuZ2xpc2ggImVuX1VTIiAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi4xOTkpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuMjEwKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzQSgKICBUSU1FRk1UX0VOVU1QUk9DQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsgCiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tJ1VociciKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgnaCdtbSIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8KICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsgCiAgICByZXR1cm4gVFJVRTsgIAogICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBzdHlsZSAiZW5fVVMiICovICAgCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi4yMTEpCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKAogIFRJTUVGTVRfRU5VTVBST0NXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsJWxkLCVsZCk6IHN0dWJcbiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEludmVydHMgYSBzdHJpbmcuCiAqLyAKc3RhdGljIHZvaWQgT0xFX0ludmVydFN0cmluZyhjaGFyKiBzdHJpbmcpCnsgICAgCiAgICBjaGFyICAgIHNUbXBBcnJheVsxMjhdOwogICAgSU5UICAgICBjb3VudGVyLCBpID0gMDsKCiAgICBmb3IgKGNvdW50ZXIgPSBzdHJsZW4oc3RyaW5nKTsgY291bnRlciA+IDA7IGNvdW50ZXItLSkKICAgIHsKICAgICAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgc3RyaW5nICsgY291bnRlci0xLCAxKTsKICAgICAgICBpKys7CiAgICB9CiAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgIlwwIiwgMSk7CiAgICBzdHJjcHkoc3RyaW5nLCBzVG1wQXJyYXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBUZXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgKHBzTnVtYmVyKSBpcyB2YWxpZCBvciBub3QuCiAqICAgICAgICAgICAgICAgVGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgLSBDaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5Jy4gCiAqICAgICAgICAgICAgICAgLSBPbmUgZGVjaW1hbCBwb2ludCAoZG90KSBpZiB0aGUgbnVtYmVyIGlzIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUuIAogKiAgICAgICAgICAgICAgIC0gQSBtaW51cyBzaWduIGluIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaWYgdGhlIG51bWJlciBpcyAKICogICAgICAgICAgICAgICAgIGEgbmVnYXRpdmUgdmFsdWUuCiAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHBzQmVmb3JlL3BzQWZ0ZXIgd2lsbCBwb2ludCB0byB0aGUgc3RyaW5nCiAqICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQvbGVmdCBvZiB0aGUgZGVjaW1hbCBzeW1ib2wuIHBiTmVnYXRpdmUgaW5kaWNhdGVzIGlmIHRoZSAKICogICAgICAgICAgICAgIG51bWJlciBpcyBuZWdhdGl2ZS4KICovCnN0YXRpYyBJTlQgT0xFX0dldE51bWJlckNvbXBvbmVudHMoY2hhciogcElucHV0LCBjaGFyKiBwc0JlZm9yZSwgY2hhciogcHNBZnRlciwgQk9PTCogcGJOZWdhdGl2ZSkKewpjaGFyCXNOdW1iZXJTZXRbXSA9ICIwMTIzNDU2Nzg5IjsKQk9PTAliSW5EZWNpbWFsID0gRkFMU0U7CgoJLyogVGVzdCBpZiB3ZSBkbyBoYXZlIGEgbWludXMgc2lnbiAqLwoJaWYgKCAqcElucHV0ID09ICctJyApCgl7CgkJKnBiTmVnYXRpdmUgPSBUUlVFOwoJCXBJbnB1dCsrOyAvKiBKdW1wIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KCX0KCQoJd2hpbGUoKnBJbnB1dCAhPSAnXDAnKQoJewoJCS8qIERvIHdlIGhhdmUgYSB2YWxpZCBudW1lcmljIGNoYXJhY3RlciAqLwoJCWlmICggc3RyY2hyKHNOdW1iZXJTZXQsICpwSW5wdXQpICE9IE5VTEwgKQoJCXsKCQkJaWYgKGJJbkRlY2ltYWwgPT0gVFJVRSkKICAgICAgICAgICAgICAgICpwc0FmdGVyKysgPSAqcElucHV0OwoJCQllbHNlCiAgICAgICAgICAgICAgICAqcHNCZWZvcmUrKyA9ICpwSW5wdXQ7CgkJfQoJCWVsc2UKCQl7CgkJCS8qIElzIHRoaXMgYSBkZWNpbWFsIHBvaW50IChkb3QpICovCgkJCWlmICggKnBJbnB1dCA9PSAnLicgKQoJCQl7CgkJCQkvKiBJcyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGl0ICovCgkJCQlpZiAoKGJJbkRlY2ltYWwgPT0gRkFMU0UpKQoJCQkJCWJJbkRlY2ltYWwgPSBUUlVFOwoJCQkJZWxzZQoJCQkJCXJldHVybiAtMTsgLyogRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBJdCdzIG5laXRoZXIgYSBudW1lcmljIGNoYXJhY3Rlciwgbm9yIGEgZGVjaW1hbCBwb2ludC4KCQkJCSAqIFRodXMsIHJldHVybiBhbiBlcnJvci4KICAgICAgICAgICAgICAgICAqLwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQogICAgICAgIHBJbnB1dCsrOwoJfQoJCgkvKiBBZGQgYW4gRW5kIG9mIExpbmUgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVycyAqLwoJKnBzQmVmb3JlID0gJ1wwJzsKCSpwc0FmdGVyID0gJ1wwJzsKCglyZXR1cm4gMDsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogQSBudW1iZXIgY291bGQgYmUgZm9ybWF0dGVkIHVzaW5nIGRpZmZlcmVudCBudW1iZXJzIAogKiAgICAgICAgICAgICAgIG9mICJkaWdpdHMgaW4gZ3JvdXAiIChleGFtcGxlOiA0OzM7MjswKS4KICogICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgYW4gYXJyYXkKICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBydWxlIHRvIGJlIHVzZWQuIEl0J3MgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgfE5ER3xERzF8REcyfC4uLnwwfAogKiAgICAgICAgICAgICAgIHdoZXJlIE5ERyBpcyB0aGUgbnVtYmVyIG9mIHVzZWQgImRpZ2l0cyBpbiBncm91cCIgYW5kIERHMSwgREcyLAogKiAgICAgICAgICAgICAgIGFyZSB0aGUgY29ycmVzcG9uZGluZyAiZGlnaXRzIGluIGdyb3VwIi4KICogICAgICAgICAgICAgICBUaHVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGluIHRoZSBhcnJheQogKiAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRHcm91cGluZyhjaGFyKiBzUnVsZSwgSU5UIGluZGV4KQp7CiAgICBjaGFyICAgIHNEYXRhWzJdLCBzUnVsZVNpemVbMl07CiAgICBJTlQgICAgIG5EYXRhLCBuUnVsZVNpemU7CgogICAgbWVtY3B5KHNSdWxlU2l6ZSwgc1J1bGUsIDEpOwogICAgbWVtY3B5KHNSdWxlU2l6ZSsxLCAiXDAiLCAxKTsKICAgIG5SdWxlU2l6ZSA9IGF0b2koc1J1bGVTaXplKTsKCiAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgblJ1bGVTaXplKQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUraW5kZXgsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgICAgIAogICAgZWxzZQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUrblJ1bGVTaXplLTEsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4gbkRhdGE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuMzU1KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgTlVNQkVSRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKICAgIGNoYXIgICBzTnVtYmVyRGlnaXRzWzNdLCBzRGVjaW1hbFN5bWJvbFs1XSwgc0RpZ2l0c0luR3JvdXBbMTFdLCBzRGlnaXRHcm91cFN5bWJvbFs1XSwgc0lMWmVyb1syXTsKICAgIElOVCAgICBuTnVtYmVyRGlnaXRzLCBuTnVtYmVyRGVjaW1hbCwgaSwgaiwgbkNvdW50ZXIsIG5TdGVwLCBuUnVsZUluZGV4LCBuR3JvdXBpbmcsIG5EaWdpdHMsIHJldFZhbCwgbkxaOwogICAgY2hhciAgIHNOdW1iZXJbMTI4XSwgc0Rlc3RpbmF0aW9uWzEyOF0sIHNEaWdpdHNBZnRlckRlY2ltYWxbMTBdLCBzRGlnaXRzQmVmb3JlRGVjaW1hbFsxMjhdOwogICAgY2hhciAgIHNSdWxlWzEwXSwgc1NlbWlDb2x1bW5bXT0iOyIsIHNCdWZmZXJbNV0sIHNOZWdOdW1iZXJbMl07ICAgIAogICAgY2hhciAgICpwU3RyID0gTlVMTCwgKnBUbXBTdHIgPSBOVUxMOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMgCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgc3RybmNweShzTnVtYmVyLCBscHZhbHVlLCAxMjgpOwogICAgc051bWJlclsxMjddID0gJ1wwJzsKCiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGlucHV0IHN0cmluZywgZ2V0IHRoZSBudW1iZXIKICAgICAqIG9mIGRpZ2l0cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbCwgYW5kIGNoZWNrCiAgICAgKiBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICovCiAgICBpZiAoIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKHNOdW1iZXIsIHNEaWdpdHNCZWZvcmVEZWNpbWFsLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsLCAmYk5lZ2F0aXZlKSAhPSAtMSkKICAgIHsKICAgICAgICBuTnVtYmVyRGVjaW1hbCA9IHN0cmxlbihzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CiAgICAgICAgbkRpZ2l0cyA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzoKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgc3ByaW50ZihzTnVtYmVyRGlnaXRzLCAiJWQiLGxwRm9ybWF0LT5OdW1EaWdpdHMpOwogICAgICAgIHN0cmNweShzRGVjaW1hbFN5bWJvbCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCk7CiAgICAgICAgc3ByaW50ZihzRGlnaXRzSW5Hcm91cCwgIiVkOzAiLGxwRm9ybWF0LT5Hcm91cGluZyk7CiAgICAgICAgc3RyY3B5KHNEaWdpdEdyb3VwU3ltYm9sLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCk7CiAgICAgICAgc3ByaW50ZihzSUxaZXJvLCAiJWQiLGxwRm9ybWF0LT5MZWFkaW5nWmVybyk7CiAgICAgICAgc3ByaW50ZihzTmVnTnVtYmVyLCAiJWQiLGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBuTnVtYmVyRGlnaXRzID0gYXRvaShzTnVtYmVyRGlnaXRzKTsKICAgIAogICAgLyogUmVtb3ZlIHRoZSAiOyIgKi8KICAgIGk9MDsKICAgIGogPSAxOwogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxzdHJsZW4oc0RpZ2l0c0luR3JvdXApOyBuQ291bnRlcisrKQogICAgewogICAgICAgIGlmICggbWVtY21wKHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIHNTZW1pQ29sdW1uLCAxKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShzUnVsZSArIGosIHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHNCdWZmZXIsICIlZCIsIGkpOwogICAgbWVtY3B5KHNSdWxlLCBzQnVmZmVyLCAxKTsgLyogTnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZ3JvdXBzICggdXNlZCBieSBPTEVfR2V0R3JvdXBpbmcoKSApICovCiAgICBtZW1jcHkoc1J1bGUgKyBqLCAiXDAiLCAxKTsKICAgIAogICAgLyogRmlyc3QsIGZvcm1hdCB0aGUgZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbC4gKi8KICAgIGlmICgobk51bWJlckRlY2ltYWw+MCkgJiYgKGF0b2koc0RpZ2l0c0JlZm9yZURlY2ltYWwpICE9IDApKSAKICAgIHsKICAgICAgICAvKiBXb3JraW5nIG9uIGFuIGludmVydGVkIHN0cmluZyBpcyBlYXNpZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwoKICAgICAgICBuU3RlcCA9IG5Db3VudGVyID0gaSA9IGogPSAwOwogICAgICAgIG5SdWxlSW5kZXggPSAxOwogICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgCiAgICAgICAgLyogSGVyZSwgd2Ugd2lsbCBsb29wIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAgICAgKiBBbiBpbnRlcm5hbCBjb3VudGVyIChqKSBpcyB1c2VkIGluIG9yZGVyIHRvIGtub3cgd2hlbiB0byAKICAgICAgICAgKiBpbnNlcnQgdGhlICJkaWdpdCBncm91cCBzeW1ib2wiLgogICAgICAgICAqLwogICAgICAgIHdoaWxlIChuTnVtYmVyRGVjaW1hbCA+IDApCiAgICAgICAgewogICAgICAgICAgICBpID0gbkNvdW50ZXIgKyBuU3RlcDsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGksIHNEaWdpdHNCZWZvcmVEZWNpbWFsICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBuQ291bnRlcisrOwogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGlmIChqID49IG5Hcm91cGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoblJ1bGVJbmRleCA8IHNSdWxlWzBdKQogICAgICAgICAgICAgICAgICAgIG5SdWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCBzRGlnaXRHcm91cFN5bWJvbCwgc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgICAgICAgICBuU3RlcCs9IHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5OdW1iZXJEZWNpbWFsLS07CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCAiXDAiLCAxKTsKICAgICAgICAvKiBHZXQgdGhlIHN0cmluZyBpbiB0aGUgcmlnaHQgb3JkZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0Rlc3RpbmF0aW9uKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICBuTFogPSBhdG9pKHNJTFplcm8pOwogICAgICAgIGlmIChuTFogIT0gMCkKICAgICAgICB7ICAgICAgICAKICAgICAgICAgICAgLyogVXNlIDAueHh4IGluc3RlYWQgb2YgLnh4eCAqLwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiMCIsIDEpOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uKzEsICJcMCIsIDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICJcMCIsIDEpOwoKICAgICB9CgogICAgLyogU2Vjb25kLCBmb3JtYXQgdGhlIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gKi8KICAgIGogPSAwOwogICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzOwogICAgaWYgKCAobkRpZ2l0cz4wKSAmJiAocFN0ciA9IHN0cnN0ciAoc051bWJlciwgIi4iKSkgKQogICAgewogICAgICAgIGkgPSBzdHJsZW4oc051bWJlcikgLSBzdHJsZW4ocFN0cikgKyAxOyAgICAgICAgCiAgICAgICAgc3RybmNweSAoIHNEaWdpdHNBZnRlckRlY2ltYWwsIHNOdW1iZXIgKyBpLCBuTnVtYmVyRGlnaXRzKTsKICAgICAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgICAgIGlmIChqIDwgbk51bWJlckRpZ2l0cykKICAgICAgICAgICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzLWo7ICAgICAgICAgICAgCiAgICB9CiAgICBmb3IgKGk9MDtpPG5Db3VudGVyO2krKykKICAgICAgICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwraStqLCAiMCIsIDEpOyAgICAKICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgbk51bWJlckRpZ2l0cywgIlwwIiwgMSk7ICAgIAoKICAgIGkgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKTsKICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAvKiBGaW5hbGx5LCBjb25zdHJ1Y3QgdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nLiAqLwogICAgICAgIAogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxpOyBuQ291bnRlcisrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZXN0aW5hdGlvbiArIG5Db3VudGVyLCAxKTsKICAgICAgIAogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0RlY2ltYWxTeW1ib2wsIHN0cmxlbihzRGVjaW1hbFN5bWJvbCkpOwoKICAgIGZvciAoaT0wOyBpPGo7IGkrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgc0RpZ2l0c0FmdGVyRGVjaW1hbCArIGksIDEpOwogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksICJcMCIsIDEpOwogICAgICAgIAogICAgLyogSXMgaXQgYSBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIGlmIChiTmVnYXRpdmUgPT0gVFJVRSkKICAgIHsKICAgICAgICBpID0gYXRvaShzTmVnTnVtYmVyKTsKICAgICAgICBwU3RyID0gc0Rlc3RpbmF0aW9uOwogICAgICAgIHBUbXBTdHIgPSBzTnVtYmVyOwogICAgICAgIHN3aXRjaCAoaSkKICAgICAgICB7ICAgICAgICAgIAogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgKnBTdHIrKyA9ICcoJzsKICAgICAgICAgICAgd2hpbGUgKCpzTnVtYmVyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnKSc7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICBicmVhazsgIAogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KHNEZXN0aW5hdGlvbiwgc051bWJlcik7CgogICAgLyogSWYgY2NoTnVtYmVyIGlzIHplcm8sIHRoZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMgCiAgICAgKiByZXF1aXJlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHN0cmluZwogICAgICovCiAgICBpZiAoY2NoTnVtYmVyPT0wKQogICAgICAgIHJldFZhbCA9IHN0cmxlbihzRGVzdGluYXRpb24pICsgMTsKICAgIGVsc2UgICAgICAgICAgIAogICAgewogICAgICAgIHN0cm5jcHkgKGxwTnVtYmVyU3RyLCBzRGVzdGluYXRpb24sIGNjaE51bWJlci0xKTsKICAgICAgICAqKGxwTnVtYmVyU3RyK2NjaE51bWJlci0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldFZhbCA9IHN0cmxlbihscE51bWJlclN0cik7CiAgICB9CiAgICAgICAgICAKICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0VwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRBCShLRVJORUwzMi4zMDIpCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBVSU5UICAgblBvc09yZGVyLCBuTmVnT3JkZXI7CiAgICBJTlQgICAgcmV0VmFsOwogICAgY2hhciAgIHNEZXN0aW5hdGlvblsxMjhdLCBzTmVnT3JkZXJbOF0sIHNQb3NPcmRlcls4XSwgc0N1cnJlbmN5U3ltYm9sWzhdOwogICAgY2hhciAgICpwRGVzdGluYXRpb24gPSBzRGVzdGluYXRpb247CiAgICBjaGFyICAgc051bWJlckZvcm1hdGVkWzEyOF07CiAgICBjaGFyICAgKnBOdW1iZXJGb3JtYXRlZCA9IHNOdW1iZXJGb3JtYXRlZDsKICAgIExDSUQgICBzeXN0ZW1EZWZhdWx0TENJRDsKICAgIEJPT0wgICBiSXNQb3NpdGl2ZSA9IEZBTFNFLCBiVmFsaWRGb3JtYXQgPSBGQUxTRTsKICAgIGVudW0gICBPcGVyYXRpb25zIAogICAgewogICAgICAgIFVTRV9QQVJBTUVURVIsCiAgICAgICAgVVNFX0xPQ0FMRUlORk8sCiAgICAgICAgVVNFX1NZU1RFTURFRkFVTFQsCiAgICAgICAgUkVUVVJOX0VSUk9SCiAgICB9IHVzZWRfb3BlcmF0aW9uOwoKICAgIE5VTUJFUkZNVEEgIG51bWJlckZtdDsKCiAgICAvKiBXaGljaCBzb3VyY2Ugd2lsbCB3ZSB1c2UgdG8gZm9ybWF0IHRoZSBzdHJpbmcgKi8KICAgIHVzZWRfb3BlcmF0aW9uID0gUkVUVVJOX0VSUk9SOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgPT0gMCkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfUEFSQU1FVEVSOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfTE9DQUxFSU5GTzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1NZU1RFTURFRkFVTFQ7CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CiAgICAgICAgCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjogICAgICAgIAogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUNVUlJFTkNZLCBzUG9zT3JkZXIsIHNpemVvZihzUG9zT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CiAgICAgICAgCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIAogICAgLyogQ29uc3RydWN0IGEgdGVtcG9yYXJ5IG51bWJlciBmb3JtYXQgc3RydWN0dXJlICovCiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBudW1iZXJGbXQuTnVtRGlnaXRzICAgICA9IGxwRm9ybWF0LT5OdW1EaWdpdHM7CiAgICAgICAgbnVtYmVyRm10LkxlYWRpbmdaZXJvICAgPSBscEZvcm1hdC0+TGVhZGluZ1plcm87CiAgICAgICAgbnVtYmVyRm10Lkdyb3VwaW5nICAgICAgPSBscEZvcm1hdC0+R3JvdXBpbmc7CiAgICAgICAgbnVtYmVyRm10Lk5lZ2F0aXZlT3JkZXIgPSAwOwogICAgICAgIG51bWJlckZtdC5scERlY2ltYWxTZXAgPSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwOwogICAgICAgIG51bWJlckZtdC5scFRob3VzYW5kU2VwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXA7CiAgICAgICAgYlZhbGlkRm9ybWF0ID0gVFJVRTsKICAgIH0KCiAgICAvKiBNYWtlIGEgY2FsbCB0byBHZXROdW1iZXJGb3JtYXRBKCkgKi8KICAgIGlmICgqbHB2YWx1ZSA9PSAnLScpCiAgICB7CiAgICAgICAgYklzUG9zaXRpdmUgPSBGQUxTRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUrMSwoYlZhbGlkRm9ybWF0KT8mbnVtYmVyRm10Ok5VTEwscE51bWJlckZvcm1hdGVkLDEyOCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYklzUG9zaXRpdmUgPSBUUlVFOwogICAgICAgIHJldFZhbCA9IEdldE51bWJlckZvcm1hdEEobG9jYWxlLDAsbHB2YWx1ZSwoYlZhbGlkRm9ybWF0KT8mbnVtYmVyRm10Ok5VTEwscE51bWJlckZvcm1hdGVkLDEyOCk7CiAgICB9CiAgICAgICAgCiAgICBpZiAocmV0VmFsID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogY29uc3RydWN0IHRoZSBmb3JtYXR0ZWQgc3RyaW5nICovCiAgICBpZiAoYklzUG9zaXRpdmUpCiAgICB7CiAgICAgICAgc3dpdGNoIChuUG9zT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBQcmVmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogU3VmZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIFByZWZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIFN1ZmZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAgLyogbmVnYXRpdmUgbnVtYmVyICovCiAgICB7CiAgICAgICAgc3dpdGNoIChuTmVnT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBmb3JtYXQ6ICgkMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIGZvcm1hdDogLSQxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIGZvcm1hdDogJC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIGZvcm1hdDogJDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OiAgIC8qIGZvcm1hdDogKDEuMSQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6ICAgLyogZm9ybWF0OiAtMS4xJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6ICAgLyogZm9ybWF0OiAxLjEtJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDc6ICAgLyogZm9ybWF0OiAxLjEkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6ICAgLyogZm9ybWF0OiAtMS4xICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogICAvKiBmb3JtYXQ6IC0kIDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogICAvKiBmb3JtYXQ6IDEuMSAkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMTogICAvKiBmb3JtYXQ6ICQgMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMjogICAvKiBmb3JtYXQ6ICQgLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMzogICAvKiBmb3JtYXQ6IDEuMS0gJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDogICAvKiBmb3JtYXQ6ICgkIDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7IAogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNTogICAvKiBmb3JtYXQ6ICgxLjEgJCkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7IAogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChjY2hDdXJyZW5jeSA9PSAwKQogICAgICAgIHJldHVybiBzdHJsZW4ocERlc3RpbmF0aW9uKSArIDE7CgogICAgZWxzZQogICAgewogICAgICAgIHN0cm5jcHkgKGxwQ3VycmVuY3lTdHIsIHBEZXN0aW5hdGlvbiwgY2NoQ3VycmVuY3ktMSk7CiAgICAgICAgKihscEN1cnJlbmN5U3RyK2NjaEN1cnJlbmN5LTEpID0gJ1wwJzsgICAvKiBlbnN1cmUgd2UgZ290IGEgTlVMTCBhdCB0aGUgZW5kICovCiAgICAgICAgcmV0dXJuICBzdHJsZW4obHBDdXJyZW5jeVN0cik7CiAgICB9ICAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0VwkoS0VSTkVMMzIuMzAzKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBGSVhNRSgiVGhpcyBBUEkgZnVuY3Rpb24gaXMgTk9UIGltcGxlbWVudGVkICFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRTJOTFNfQ2hlY2tMb2NhbGUJW2ludGVybl0KICovIApzdGF0aWMgTENJRCBPTEUyTkxTX0NoZWNrTG9jYWxlIChMQ0lEIGxvY2FsZSkKewoJaWYgKCFsb2NhbGUpIAoJeyBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7Cgl9CiAgCglpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgCiAgCXsgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIAoJeyByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgllbHNlCgl7IHJldHVybiBsb2NhbGU7Cgl9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdEEJW0tFUk5FTDMyLjQyMl0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKeyBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlPTA7CiAgRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwogIElOVCByZXQ7CiAgICAKICBUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCiAgaWYgKCBmbGFncyAmIChUSU1FX05PVElNRU1BUktFUiB8IFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgKSkKICB7IEZJWE1FKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgfQogIAogIGZsYWdzICY9IChUSU1FX05PU0VDT05EUyB8IFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKTsgLyogbWFzayBmb3IgT0xFX0dldEZvcm1hdEEqLwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIAogIHsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwogICAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0KICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0KICBlbHNlIAogIHsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9CiAgCiAgaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwogIHsgR2V0TG9jYWxUaW1lKCZ0KTsKICAgIHRoaXN0aW1lID0gJnQ7CiAgfSAKICBlbHNlCiAgeyB0aGlzdGltZSA9IHh0aW1lOwogIH0KICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKICAJCQkgdGltZXN0ciwgdGltZWxlbik7CiAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRXCVtLRVJORUwzMi40MjNdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENXU1RSIGZvcm1hdCwgICAgIC8qIGluICAqLwoJCSBMUFdTVFIgdGltZXN0ciwgICAgIC8qIG91dCAqLwoJCSBJTlQgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJTFBTWVNURU1USU1FIHRoaXN0aW1lOwoJTENJRCB0aGlzbG9jYWxlPTA7CglEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCglJTlQgcmV0OwoJICAgIAoJVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCgl7IEZJWE1FKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7Cgl9CiAgCglmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCglpZiAoZm9ybWF0ID09IE5VTEwpIAoJeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwoJeyBHZXRTeXN0ZW1UaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLjE5Nl0KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9BKAoJQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlCikgewoJRklYTUUoIiglcCwweCUwNGx4LDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsY2FsaW5mb3Byb2MsbG9jYWxlLGNhbGVuZGFyLGNhbHR5cGUpOwoJcmV0dXJuIEZBTFNFOwp9Cg==