LyoKICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBXaW5lRDNEIExpYnJhcnkKICoKICogQ29weXJpZ2h0IDIwMDItMjAwNCBKYXNvbiBFZG1lYWRlcwogKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJhcGhhZWwgSnVucXVlaXJhCiAqIENvcHlyaWdodCAyMDA0IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEhlbnJpIFZlcmJlZXQKICogQ29weXJpZ2h0IDIwMDctMjAwOCBTdGVmYW4gRPZzaW5nZXIgZm9yIENvZGVXZWF2ZXJzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmVkM2RfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaXhlbCBmb3JtYXQgYXJyYXkKICoKICogRm9yIHRoZSBmb3JtYXRzIFdJTkVEM0RGTVRfQTMyQjMyRzMyUjMyRiwgV0lORUQzREZNVF9BMTZCMTZHMTZSMTZGLAogKiBhbmQgV0lORUQzREZNVF9BMTZCMTZHMTZSMTYgZG8gbm90IGhhdmUgY29ycmVjdCBhbHBoYSBtYXNrcywgYmVjYXVzZSB0aGUKICogaGlnaCBtYXNrcyBkbyBub3QgZml0IGludG8gdGhlIDMyIGJpdCB2YWx1ZXMgbmVlZGVkIGZvciBkZHJhdy4gSXQgaXMgb25seQogKiB1c2VkIGZvciBkZHJhdyBtb3N0bHksIGFuZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBmb3JtYXQgaGFzIGFscGhhIGF0IGFsbCwgc28KICogc2V0dGluZyBhIG1hc2sgbGlrZSAweDEgZm9yIHRob3NlIHN1cmZhY2VzIGlzIGNvcnJlY3QuIFRoZSA2NCBhbmQgMTI4IGJpdAogKiBmb3JtYXRzIGFyZSBub3QgdXNhYmxlIGluIDJEIHJlbmRlcmluZyBiZWNhdXNlIGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLgogKi8Kc3RhdGljIGNvbnN0IFN0YXRpY1BpeGVsRm9ybWF0RGVzYyBmb3JtYXRzW10gPSB7CiAgLyp7V0lORUQzREZPUk1BVCAgICAgICAgICAsYWxwaGFtYXNrICAscmVkbWFzayAgICAsZ3JlZW5tYXNrICAsYmx1ZW1hc2sgICAsYnBwICAgICxkZXB0aCAgLHN0ZW5jaWwsICAgIGlzRm91cmNjKi8KICAgIHtXSU5FRDNERk1UX1VOS05PV04gICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwxICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIC8qIEZvdXJDQyBmb3JtYXRzLCBrZXB0IGhlcmUgdG8gaGF2ZSBXSU5FRDNERk1UX1I4RzhCOCg9MjApIGF0IHBvc2l0aW9uIDIwICovCiAgICB7V0lORUQzREZNVF9VWVZZICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9ZVVkyICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9ZVjEyICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9EWFQxICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9EWFQyICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9EWFQzICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9EWFQ0ICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9EWFQ1ICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9NVUxUSTJfQVJHQjgsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9HOFI4X0c4QjggICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICB7V0lORUQzREZNVF9SOEc4X0I4RzggICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMS8qPyovICwwICAgICAgLDAgICAgICAgICAgLFRSVUUgIH0sCiAgICAvKiBJRUVFIGZvcm1hdHMgKi8KICAgIHtXSU5FRDNERk1UX1IzMkYgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICw0ICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIHtXSU5FRDNERk1UX0czMlIzMkYgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICw4ICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIHtXSU5FRDNERk1UX0EzMkIzMkczMlIzMkYsMHgxICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwxNiAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIC8qIEhtbT8gKi8KICAgIHtXSU5FRDNERk1UX0N4VjhVOCAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwyICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIC8qIEZsb2F0ICovCiAgICB7V0lORUQzREZNVF9SMTZGICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9HMTZSMTZGICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BMTZCMTZHMTZSMTZGLDB4MSAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsOCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICAvKiBQYWxldHRpemVkIGZvcm1hdHMgKi8KICAgIHtXSU5FRDNERk1UX0E4UDggICAgICAgICwweDAwMDBmZjAwICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwyICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIHtXSU5FRDNERk1UX1A4ICAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwxICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIC8qIFN0YW5kYXJkIEFSR0IgZm9ybWF0cy4gS2VlcCBXSU5FRDNERk1UX1I4RzhCOCg9MjApIGF0IHBvc2l0aW9uIDIwICovCiAgICB7V0lORUQzREZNVF9SOEc4QjggICAgICAsMHgwICAgICAgICAsMHgwMGZmMDAwMCAsMHgwMDAwZmYwMCAsMHgwMDAwMDBmZiAsMyAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BOFI4RzhCOCAgICAsMHhmZjAwMDAwMCAsMHgwMGZmMDAwMCAsMHgwMDAwZmYwMCAsMHgwMDAwMDBmZiAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9YOFI4RzhCOCAgICAsMHgwICAgICAgICAsMHgwMGZmMDAwMCAsMHgwMDAwZmYwMCAsMHgwMDAwMDBmZiAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9SNUc2QjUgICAgICAsMHgwICAgICAgICAsMHgwMDAwRjgwMCAsMHgwMDAwMDdlMCAsMHgwMDAwMDAxZiAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9YMVI1RzVCNSAgICAsMHgwICAgICAgICAsMHgwMDAwN2MwMCAsMHgwMDAwMDNlMCAsMHgwMDAwMDAxZiAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BMVI1RzVCNSAgICAsMHgwMDAwODAwMCAsMHgwMDAwN2MwMCAsMHgwMDAwMDNlMCAsMHgwMDAwMDAxZiAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BNFI0RzRCNCAgICAsMHgwMDAwZjAwMCAsMHgwMDAwMGYwMCAsMHgwMDAwMDBmMCAsMHgwMDAwMDAwZiAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9SM0czQjIgICAgICAsMHgwICAgICAgICAsMHgwMDAwMDBlMCAsMHgwMDAwMDAxYyAsMHgwMDAwMDAwMyAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BOCAgICAgICAgICAsMHgwMDAwMDBmZiAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMSAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BOFIzRzNCMiAgICAsMHgwMDAwZmYwMCAsMHgwMDAwMDBlMCAsMHgwMDAwMDAxYyAsMHgwMDAwMDAwMyAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9YNFI0RzRCNCAgICAsMHgwICAgICAgICAsMHgwMDAwMGYwMCAsMHgwMDAwMDBmMCAsMHgwMDAwMDAwZiAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BMkIxMEcxMFIxMCAsMHhiMDAwMDAwMCAsMHgwMDAwMDNmZiAsMHgwMDBmZmMwMCAsMHgzZmYwMDAwMCAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BOEI4RzhSOCAgICAsMHhmZjAwMDAwMCAsMHgwMDAwMDBmZiAsMHgwMDAwZmYwMCAsMHgwMGZmMDAwMCAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9YOEI4RzhSOCAgICAsMHgwICAgICAgICAsMHgwMDAwMDBmZiAsMHgwMDAwZmYwMCAsMHgwMGZmMDAwMCAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9HMTZSMTYgICAgICAsMHgwICAgICAgICAsMHgwMDAwZmZmZiAsMHhmZmZmMDAwMCAsMHgwICAgICAgICAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BMlIxMEcxMEIxMCAsMHhiMDAwMDAwMCAsMHgzZmYwMDAwMCAsMHgwMDBmZmMwMCAsMHgwMDAwMDNmZiAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9BMTZCMTZHMTZSMTYsMHgxICAgICAgICAsMHgwMDAwZmZmZiAsMHhmZmZmMDAwMCAsMHgwICAgICAgICAsOCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICAvKiBMdW1pbmFuY2UgKi8KICAgIHtXSU5FRDNERk1UX0w4ICAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwxICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIHtXSU5FRDNERk1UX0E4TDggICAgICAgICwweDAwMDBmZjAwICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwyICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIHtXSU5FRDNERk1UX0E0TDQgICAgICAgICwweDAwMDAwMGYwICwweDAgICAgICAgICwweDAgICAgICAgICwweDAgICAgICAgICwxICAgICAgLDAgICAgICAsMCAgICAgICAgICAsRkFMU0UgfSwKICAgIC8qIEJ1bXAgbWFwcGluZyBzdHVmZiAqLwogICAge1dJTkVEM0RGTVRfVjhVOCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDIgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfTDZWNVU1ICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDIgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfWDhMOFY4VTggICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfUThXOFY4VTggICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfVjE2VTE2ICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfVzExVjExVTEwICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfQTJXMTBWMTBVMTAgLDB4YjAwMDAwMDAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMCAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAgLyogRGVwdGggc3RlbmNpbCBmb3JtYXRzICovCiAgICB7V0lORUQzREZNVF9EMTZfTE9DS0FCTEUsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwxNiAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMzIgICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwzMiAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMTVTMSAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwxNSAgICAgLDEgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMjRTOCAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwyNCAgICAgLDggICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMjRYOCAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwyNCAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMjRYNFM0ICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwyNCAgICAgLDQgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9EMTYgICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwxNiAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9MMTYgICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwxNiAgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfRDMyRl9MT0NLQUJMRSwweDAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMzIgICAgICwwICAgICAgICAgICxGQUxTRSB9LAogICAge1dJTkVEM0RGTVRfRDI0RlM4ICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDB4MCAgICAgICAgLDQgICAgICAsMjQgICAgICw4ICAgICAgICAgICxGQUxTRSB9LAogICAgLyogSXMgdGhpcyBhIHZlcnRleCBidWZmZXI/ICovCiAgICB7V0lORUQzREZNVF9WRVJURVhEQVRBICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9JTkRFWDE2ICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMiAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9JTkRFWDMyICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsNCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCiAgICB7V0lORUQzREZNVF9RMTZXMTZWMTZVMTYsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsMHgwICAgICAgICAsOCAgICAgICwwICAgICAgLDAgICAgICAgICAgLEZBTFNFIH0sCn07Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBXSU5FRDNERk9STUFUICAgICAgICAgICBmbXQ7CiAgICBHTGludCAgICAgICAgICAgICAgICAgICBnbEludGVybmFsLCBnbEdhbW1hSW50ZXJuYWwsIHJ0SW50ZXJuYWwsIGdsRm9ybWF0LCBnbFR5cGU7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBGbGFnczsKfSBHbFBpeGVsRm9ybWF0RGVzY1RlbXBsYXRlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9wZW5HTCBmb3JtYXQgdGVtcGxhdGUuIENvbnRhaW5zIHVuZXhjaXRpbmcgZm9ybWF0cyB3aGljaCBkbyBub3QgbmVlZAogKiBleHRlbnNpb24gY2hlY2tzLiBUaGUgb3JkZXIgaW4gdGhpcyB0YWJsZSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgb3JkZXIgaW4KICogdGhlIHRhYmxlIFN0YXRpY1BpeGVsRm9ybWF0RGVzYyBhYm92ZS4gTm90IGFsbCBmb3JtYXRzIGhhdmUgdG8gYmUgaW4gdGhpcwogKiB0YWJsZS4KICovCnN0YXRpYyBjb25zdCBHbFBpeGVsRm9ybWF0RGVzY1RlbXBsYXRlIGdsX2Zvcm1hdHNfdGVtcGxhdGVbXSA9IHsKICAvKnsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAsc3JnYkludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBydEludGVybmFsLCAgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAsdHlwZSBcCiAgICAgICAgLEZsYWdzIH0qLwogICAge1dJTkVEM0RGTVRfVU5LTk9XTiAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLDAgfSwKICAgIC8qIEZvdXJDQyBmb3JtYXRzICovCiAgICB7V0lORUQzREZNVF9VWVZZICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgLDAKICAgICAgICAsMCB9LAogICAge1dJTkVEM0RGTVRfWVVZMiAgICAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLDAgfSwKICAgIHtXSU5FRDNERk1UX0RYVDEgICAgICAgICAgICxHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAsR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQgLCAwLCAgICAgICAgICAgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfQllURQogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIH0sCiAgICB7V0lORUQzREZNVF9EWFQyICAgICAgICAgICAsR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgLEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0JZVEUKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfRFhUMyAgICAgICAgICAgLEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUICxHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVCAsIDAsICAgICAgICAgICBHTF9SR0JBICAgICAgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9CWVRFCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX0RYVDQgICAgICAgICAgICxHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCAsR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFQgLCAwLCAgICAgICAgICAgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfQllURQogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIH0sCiAgICB7V0lORUQzREZNVF9EWFQ1ICAgICAgICAgICAsR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQgLEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0JZVEUKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfTVVMVEkyX0FSR0I4ICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLDAgfSwKICAgIHtXSU5FRDNERk1UX0c4UjhfRzhCOCAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICwwIH0sCiAgICB7V0lORUQzREZNVF9SOEc4X0I4RzggICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgLDAKICAgICAgICAsMCB9LAogICAgLyogSUVFRSBmb3JtYXRzICovCiAgICB7V0lORUQzREZNVF9SMzJGICAgICAgICAgICAsR0xfUkdCMzJGX0FSQiAgICAgICAgICAgICAgICAgICAgLEdMX1JHQjMyRl9BUkIgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JFRCAgICAgICAgICAgICAgICAgICAgLEdMX0ZMT0FUCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQgfSwKICAgIHtXSU5FRDNERk1UX0czMlIzMkYgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUkVOREVSVEFSR0VUIH0sCiAgICB7V0lORUQzREZNVF9BMzJCMzJHMzJSMzJGICAsR0xfUkdCQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgLEdMX1JHQkEzMkZfQVJCICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX0ZMT0FUCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQgfSwKICAgIC8qIEhtbT8gKi8KICAgIHtXSU5FRDNERk1UX0N4VjhVOCAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICwwIH0sCiAgICAvKiBGbG9hdCAqLwogICAge1dJTkVEM0RGTVRfUjE2RiAgICAgICAgICAgLEdMX1JHQjE2Rl9BUkIgICAgICAgICAgICAgICAgICAgICxHTF9SR0IxNkZfQVJCICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9SRUQgICAgICAgICAgICAgICAgICAgICxHTF9IQUxGX0ZMT0FUX0FSQgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIHwgV0lORUQzREZNVF9GTEFHX1JFTkRFUlRBUkdFVCB9LAogICAge1dJTkVEM0RGTVRfRzE2UjE2RiAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfCBXSU5FRDNERk1UX0ZMQUdfUkVOREVSVEFSR0VUIH0sCiAgICB7V0lORUQzREZNVF9BMTZCMTZHMTZSMTZGICAsR0xfUkdCQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgLEdMX1JHQkExNkZfQVJCICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX0hBTEZfRkxPQVRfQVJCCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfCBXSU5FRDNERk1UX0ZMQUdfUkVOREVSVEFSR0VUIH0sCiAgICAvKiBQYWxldHRpemVkIGZvcm1hdHMgKi8KICAgIHtXSU5FRDNERk1UX0E4UDgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICwwIH0sCiAgICB7V0lORUQzREZNVF9QOCwgICAgICAgICAgICAgR0xfQ09MT1JfSU5ERVg4X0VYVCAgICAgICAgICAgICAgLEdMX0NPTE9SX0lOREVYOF9FWFQgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0NPTE9SX0lOREVYICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0JZVEUKICAgICAgICAsMCB9LAogICAgLyogU3RhbmRhcmQgQVJHQiBmb3JtYXRzICovCiAgICB7V0lORUQzREZNVF9SOEc4QjggICAgICAgICAsR0xfUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0JHUiAgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0JZVEUKICAgICAgICAsV0lORUQzREZNVF9GTEFHX1BPU1RQSVhFTFNIQURFUl9CTEVORElORyB8IFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfCBXSU5FRDNERk1UX0ZMQUdfUkVOREVSVEFSR0VUIH0sCiAgICB7V0lORUQzREZNVF9BOFI4RzhCOCAgICAgICAsR0xfUkdCQTggICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1NSR0I4X0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0JHUkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB8IFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQgfSwKICAgIHtXSU5FRDNERk1UX1g4UjhHOEI4ICAgICAgICxHTF9SR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAsR0xfU1JHQjhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfQkdSQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgfCBXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIHwgV0lORUQzREZNVF9GTEFHX1JFTkRFUlRBUkdFVCB9LAogICAge1dJTkVEM0RGTVRfUjVHNkI1ICAgICAgICAgLEdMX1JHQjUgICAgICAgICAgICAgICAgICAgICAgICAgICxHTF9SR0I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEdMX1JHQjgsICAgICBHTF9SR0IgICAgICAgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9TSE9SVF81XzZfNQogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB8IFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQgfSwKICAgIHtXSU5FRDNERk1UX1gxUjVHNUI1ICAgICAgICxHTF9SR0I1ICAgICAgICAgICAgICAgICAgICAgICAgICAsR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfQkdSQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYKICAgICAgICAsV0lORUQzREZNVF9GTEFHX1BPU1RQSVhFTFNIQURFUl9CTEVORElORyB8IFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX0ExUjVHNUI1ICAgICAgICxHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAsR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfQkdSQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYKICAgICAgICAsV0lORUQzREZNVF9GTEFHX1BPU1RQSVhFTFNIQURFUl9CTEVORElORyB8IFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX0E0UjRHNEI0ICAgICAgICxHTF9SR0JBNCAgICAgICAgICAgICAgICAgICAgICAgICAsR0xfU1JHQjhfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfQkdSQSAgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYKICAgICAgICAsV0lORUQzREZNVF9GTEFHX1BPU1RQSVhFTFNIQURFUl9CTEVORElORyB9LAogICAge1dJTkVEM0RGTVRfUjNHM0IyICAgICAgICAgLEdMX1IzX0czX0IyICAgICAgICAgICAgICAgICAgICAgICxHTF9SM19HM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9SR0IgICAgICAgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9CWVRFXzNfM18yCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgfSwKICAgIHtXSU5FRDNERk1UX0E4ICAgICAgICAgICAgICxHTF9BTFBIQTggICAgICAgICAgICAgICAgICAgICAgICAsR0xfQUxQSEE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAsR0xfVU5TSUdORURfQllURQogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIH0sCiAgICB7V0lORUQzREZNVF9BOFIzRzNCMiAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgLDAKICAgICAgICAsMCB9LAogICAge1dJTkVEM0RGTVRfWDRSNEc0QjQgICAgICAgLEdMX1JHQjQgICAgICAgICAgICAgICAgICAgICAgICAgICxHTF9SR0I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9CR1JBICAgICAgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklOR30sCiAgICB7V0lORUQzREZNVF9BMkIxMEcxMFIxMCAgICAsR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklOR30sCiAgICB7V0lORUQzREZNVF9BOEI4RzhSOCAgICAgICAsR0xfUkdCQTggICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQkE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklOR30sCiAgICB7V0lORUQzREZNVF9YOEI4RzhSOCAgICAgICAsR0xfUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklOR30sCiAgICB7V0lORUQzREZNVF9HMTZSMTYgICAgICAgICAsR0xfUkdCMTZfRVhUICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQjE2X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX1NIT1JUCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgfCBXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIH0sCiAgICB7V0lORUQzREZNVF9BMlIxMEcxMEIxMCAgICAsR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgLEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0JHUkEgICAgICAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVgogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfQTE2QjE2RzE2UjE2ICAgLEdMX1JHQkExNl9FWFQgICAgICAgICAgICAgICAgICAgICxHTF9SR0JBMTZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9SR0JBICAgICAgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9TSE9SVAogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHwgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB8IFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQgfSwKICAgIC8qIEx1bWluYW5jZSAqLwogICAge1dJTkVEM0RGTVRfTDggICAgICAgICAgICAgLEdMX0xVTUlOQU5DRTggICAgICAgICAgICAgICAgICAgICxHTF9TTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICxHTF9VTlNJR05FRF9CWVRFCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX0E4TDggICAgICAgICAgICxHTF9MVU1JTkFOQ0U4X0FMUEhBOCAgICAgICAgICAgICAsR0xfU0xVTUlOQU5DRThfQUxQSEE4X0VYVCAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAsR0xfVU5TSUdORURfQllURQogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIH0sCiAgICB7V0lORUQzREZNVF9BNEw0ICAgICAgICAgICAsR0xfTFVNSU5BTkNFNF9BTFBIQTQgICAgICAgICAgICAgLEdMX0xVTUlOQU5DRTRfQUxQSEE0ICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgLEdMX1VOU0lHTkVEX0JZVEUKICAgICAgICAsMCB9LAogICAgLyogQnVtcCBtYXBwaW5nIHN0dWZmICovCiAgICB7V0lORUQzREZNVF9WOFU4ICAgICAgICAgICAsR0xfRFNEVDhfTlYgICAgICAgICAgICAgICAgICAgICAgLEdMX0RTRFQ4X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0RTRFRfTlYgICAgICAgICAgICAgICAgLEdMX0JZVEUKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfTDZWNVU1ICAgICAgICAgLEdMX0RTRFQ4X01BRzhfTlYgICAgICAgICAgICAgICAgICxHTF9EU0RUOF9NQUc4X05WICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9EU0RUX01BR19OViAgICAgICAgICAgICxHTF9CWVRFCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX1g4TDhWOFU4ICAgICAgICxHTF9EU0RUOF9NQUc4X0lOVEVOU0lUWThfTlYgICAgICAsR0xfRFNEVDhfTUFHOF9JTlRFTlNJVFk4X05WICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfRFNEVF9NQUdfVklCX05WICAgICAgICAsR0xfVU5TSUdORURfSU5UXzhfOF9TOF9TOF9SRVZfTlYKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfUThXOFY4VTggICAgICAgLEdMX1NJR05FRF9SR0JBOF9OViAgICAgICAgICAgICAgICxHTF9TSUdORURfUkdCQThfTlYgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9SR0JBICAgICAgICAgICAgICAgICAgICxHTF9CWVRFCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX1YxNlUxNiAgICAgICAgICxHTF9TSUdORURfSElMTzE2X05WICAgICAgICAgICAgICAsR0xfU0lHTkVEX0hJTE8xNl9OViAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfSElMT19OViAgICAgICAgICAgICAgICAsR0xfU0hPUlQKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORyB9LAogICAge1dJTkVEM0RGTVRfVzExVjExVTEwICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLDAgfSwKICAgIHtXSU5FRDNERk1UX0EyVzEwVjEwVTEwICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICwwIH0sCiAgICAvKiBEZXB0aCBzdGVuY2lsIGZvcm1hdHMgKi8KICAgIHtXSU5FRDNERk1UX0QxNl9MT0NLQUJMRSAgICxHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAsR0xfVU5TSUdORURfU0hPUlQKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0RFUFRIIH0sCiAgICB7V0lORUQzREZNVF9EMzIgICAgICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMzJfQVJCICAgICAgICAgLEdMX0RFUFRIX0NPTVBPTkVOVDMyX0FSQiAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgLEdMX1VOU0lHTkVEX0lOVAogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfREVQVEggfSwKICAgIHtXSU5FRDNERk1UX0QxNVMxICAgICAgICAgICxHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAsR0xfVU5TSUdORURfU0hPUlQKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0RFUFRIIHwgV0lORUQzREZNVF9GTEFHX1NURU5DSUwgfSwKICAgIHtXSU5FRDNERk1UX0QyNFM4ICAgICAgICAgICxHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAsR0xfVU5TSUdORURfSU5UCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfCBXSU5FRDNERk1UX0ZMQUdfREVQVEggfCBXSU5FRDNERk1UX0ZMQUdfU1RFTkNJTCB9LAogICAge1dJTkVEM0RGTVRfRDI0WDggICAgICAgICAgLEdMX0RFUFRIX0NPTVBPTkVOVDI0X0FSQiAgICAgICAgICxHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9ERVBUSF9DT01QT05FTlQgICAgICAgICxHTF9VTlNJR05FRF9JTlQKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0RFUFRIIH0sCiAgICB7V0lORUQzREZNVF9EMjRYNFM0ICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgLEdMX0RFUFRIX0NPTVBPTkVOVDI0X0FSQiAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgLEdMX1VOU0lHTkVEX0lOVAogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfREVQVEggfCBXSU5FRDNERk1UX0ZMQUdfU1RFTkNJTCB9LAogICAge1dJTkVEM0RGTVRfRDE2ICAgICAgICAgICAgLEdMX0RFUFRIX0NPTVBPTkVOVDI0X0FSQiAgICAgICAgICxHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9ERVBUSF9DT01QT05FTlQgICAgICAgICxHTF9VTlNJR05FRF9TSE9SVAogICAgICAgICxXSU5FRDNERk1UX0ZMQUdfRklMVEVSSU5HIHwgV0lORUQzREZNVF9GTEFHX0RFUFRIIH0sCiAgICB7V0lORUQzREZNVF9MMTYgICAgICAgICAgICAsR0xfTFVNSU5BTkNFMTZfRVhUICAgICAgICAgICAgICAgLEdMX0xVTUlOQU5DRTE2X0VYVCAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgLEdMX1VOU0lHTkVEX1NIT1JUCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19GSUxURVJJTkcgfSwKICAgIHtXSU5FRDNERk1UX0QzMkZfTE9DS0FCTEUgICxHTF9ERVBUSF9DT01QT05FTlQzMl9BUkIgICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMzJfQVJCICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAsR0xfRkxPQVQKICAgICAgICAsV0lORUQzREZNVF9GTEFHX0RFUFRIIH0sCiAgICB7V0lORUQzREZNVF9EMjRGUzggICAgICAgICAsR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgLEdMX0RFUFRIX0NPTVBPTkVOVDI0X0FSQiAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgLEdMX0ZMT0FUCiAgICAgICAgLFdJTkVEM0RGTVRfRkxBR19ERVBUSCB8IFdJTkVEM0RGTVRfRkxBR19TVEVOQ0lMfSwKICAgIC8qIElzIHRoaXMgYSB2ZXJ0ZXggYnVmZmVyPyAqLwogICAge1dJTkVEM0RGTVRfVkVSVEVYREFUQSAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICwwCiAgICAgICAgLDAgfSwKICAgIHtXSU5FRDNERk1UX0lOREVYMTYgICAgICAgICwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAsMAogICAgICAgICwwIH0sCiAgICB7V0lORUQzREZNVF9JTkRFWDMyICAgICAgICAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgLDAKICAgICAgICAsMCB9LAogICAge1dJTkVEM0RGTVRfUTE2VzE2VjE2VTE2ICAgLEdMX0NPTE9SX0lOREVYICAgICAgICAgICAgICAgICAgICxHTF9DT0xPUl9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAsIDAsICAgICAgICAgICBHTF9DT0xPUl9JTkRFWCAgICAgICAgICAgICxHTF9VTlNJR05FRF9TSE9SVAogICAgICAgICwwIH0KfTsKCnN0YXRpYyBpbmxpbmUgaW50IGdldEZtdElkeChXSU5FRDNERk9STUFUIGZtdCkgewogICAgLyogRmlyc3QgY2hlY2sgaWYgdGhlIGZvcm1hdCBpcyBhdCB0aGUgcG9zaXRpb24gb2YgaXRzIHZhbHVlLgogICAgICogVGhpcyB3aWxsIGNhdGNoIHRoZSBhcmdiIGZvcm1hdHMgYmVmb3JlIHRoZSBsb29wIGlzIGVudGVyZWQKICAgICAqLwogICAgaWYoZm10IDwgKHNpemVvZihmb3JtYXRzKSAvIHNpemVvZihmb3JtYXRzWzBdKSkgJiYgZm9ybWF0c1tmbXRdLmZvcm1hdCA9PSBmbXQpIHsKICAgICAgICByZXR1cm4gZm10OwogICAgfSBlbHNlIHsKICAgICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mKGZvcm1hdHMpIC8gc2l6ZW9mKGZvcm1hdHNbMF0pKTsgaSsrKSB7CiAgICAgICAgICAgIGlmKGZvcm1hdHNbaV0uZm9ybWF0ID09IGZtdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OICgqZ2xfaW5mbykKQk9PTCBpbml0UGl4ZWxGb3JtYXRzKFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykKewogICAgdW5zaWduZWQgaW50IHNyYzsKICAgIGludCBkc3Q7CgogICAgZ2xfaW5mby0+Z2xfZm9ybWF0cyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZm9ybWF0cykgLyBzaXplb2YoZm9ybWF0c1swXSkgKiBzaXplb2YoZ2xfaW5mby0+Z2xfZm9ybWF0c1swXSkpOwogICAgaWYoIWdsX2luZm8tPmdsX2Zvcm1hdHMpIHJldHVybiBGQUxTRTsKCiAgICAvKiBJZiBhIGZvcm1hdCBkZXBlbmRzIG9uIHNvbWUgZXh0ZW5zaW9ucywgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgdGFibGUgYWJvdmUgYW5kIGluaXRpYWxpemUgdGhlbQogICAgICogYWZ0ZXIgdGhpcyBsb29wCiAgICAgKi8KICAgIGZvcihzcmMgPSAwOyBzcmMgPCBzaXplb2YoZ2xfZm9ybWF0c190ZW1wbGF0ZSkgLyBzaXplb2YoZ2xfZm9ybWF0c190ZW1wbGF0ZVswXSk7IHNyYysrKSB7CiAgICAgICAgZHN0ID0gZ2V0Rm10SWR4KGdsX2Zvcm1hdHNfdGVtcGxhdGVbc3JjXS5mbXQpOwogICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5nbEludGVybmFsICAgICAgPSBnbF9mb3JtYXRzX3RlbXBsYXRlW3NyY10uZ2xJbnRlcm5hbDsKICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0uZ2xHYW1tYUludGVybmFsID0gZ2xfZm9ybWF0c190ZW1wbGF0ZVtzcmNdLmdsR2FtbWFJbnRlcm5hbDsKICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0uZ2xGb3JtYXQgICAgICAgID0gZ2xfZm9ybWF0c190ZW1wbGF0ZVtzcmNdLmdsRm9ybWF0OwogICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5nbFR5cGUgICAgICAgICAgPSBnbF9mb3JtYXRzX3RlbXBsYXRlW3NyY10uZ2xUeXBlOwogICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5jb252ZXJzaW9uX2dyb3VwPSBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgZ2xfaW5mby0+Z2xfZm9ybWF0c1tkc3RdLkZsYWdzICAgICAgICAgICA9IGdsX2Zvcm1hdHNfdGVtcGxhdGVbc3JjXS5GbGFnczsKCiAgICAgICAgaWYod2luZWQzZF9zZXR0aW5ncy5vZmZzY3JlZW5fcmVuZGVyaW5nX21vZGUgPT0gT1JNX0ZCTyAmJgogICAgICAgICAgIGdsX2Zvcm1hdHNfdGVtcGxhdGVbc3JjXS5ydEludGVybmFsICE9IDApIHsKICAgICAgICAgICAgR0x1aW50IHRleCwgZmI7CiAgICAgICAgICAgIEdMZW51bSBzdGF0dXM7CgogICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgZGVmYXVsdCBpbnRlcm5hbCBmb3JtYXQgaXMgc3VwcG9ydGVkIGFzIGEgZnJhbWUgYnVmZmVyIHRhcmdldCwgb3RoZXJ3aXNlCiAgICAgICAgICAgICAqIGZhbGwgYmFjayB0byB0aGUgcmVuZGVyIHRhcmdldCBpbnRlcm5hbC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVHJ5IHRvIHN0aWNrIHRvIHRoZSBzdGFuZGFyZCBmb3JtYXQgaWYgcG9zc2libGUsIHRoaXMgbGltaXRzIHByZWNpc2lvbiBkaWZmZXJlbmNlcwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgd2hpbGUoZ2xHZXRFcnJvcigpKTsKICAgICAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4KTsKICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgpOwogICAgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgZ2xfZm9ybWF0c190ZW1wbGF0ZVtzcmNdLmdsSW50ZXJuYWwsIDE2LCAxNiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOwoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmZmIpKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIGZiKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsIHRleCwgMCkpOwoKICAgICAgICAgICAgc3RhdHVzID0gR0xfRVhUQ0FMTChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJmZiKSk7CiAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleCk7CgogICAgICAgICAgICBjaGVja0dMY2FsbCgiRnJhbWVidWZmZXIgZm9ybWF0IGNoZWNrIik7CgogICAgICAgICAgICBpZihzdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7CiAgICAgICAgICAgICAgICBUUkFDRSgiSW50ZXJuYWwgZm9ybWF0IG9mICVzIG5vdCBzdXBwb3J0ZWQgYXMgZnJhbWUgYnVmZmVyIHRhcmdldCwgdXNpbmcgcmVuZGVyIHRhcmdldCBpbnRlcm5hbCBpbnN0ZWFkXG4iLAogICAgICAgICAgICAgICAgICAgIGRlYnVnX2QzZGZvcm1hdChnbF9mb3JtYXRzX3RlbXBsYXRlW3NyY10uZm10KSk7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0ucnRJbnRlcm5hbCA9IGdsX2Zvcm1hdHNfdGVtcGxhdGVbc3JjXS5ydEludGVybmFsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVFJBQ0UoIkZvcm1hdCAlcyBpcyBzdXBwb3J0ZWQgYXMgZmJvIHRhcmdldFxuIiwgZGVidWdfZDNkZm9ybWF0KGdsX2Zvcm1hdHNfdGVtcGxhdGVbc3JjXS5mbXQpKTsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5ydEludGVybmFsID0gZ2xfZm9ybWF0c190ZW1wbGF0ZVtzcmNdLmdsSW50ZXJuYWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xfaW5mby0+Z2xfZm9ybWF0c1tkc3RdLnJ0SW50ZXJuYWwgPSBnbF9mb3JtYXRzX3RlbXBsYXRlW3NyY10uZ2xJbnRlcm5hbDsKICAgICAgICB9CiAgICB9CgogICAgLyogVjhVOCBpcyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgR0xfQVRJX2Vudm1hcF9idW1wbWFwIGFuZCBHTF9OVl90ZXh0dXJlX3NoYWRlci4KICAgICAqIFYxNlUxNiBpcyBvbmx5IHN1cHBvcnRlZCBieSBHTF9OVl90ZXh0dXJlX3NoYWRlci4gVGhlIGZvcm1hdHMgbmVlZCBmaXh1cCBpZgogICAgICogdGhlaXIgZXh0ZW5zaW9ucyBhcmUgbm90IGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBJbiB0aGVvcnksIFY4VTggYW5kIFYxNlUxNiBuZWVkIGEgZml4dXAgb2YgdGhlIHVuZGVmaW5lZCBibHVlIGNoYW5uZWwuIE9wZW5HTAogICAgICogcmV0dXJucyAwLjAgd2hlbiBzYW1wbGluZyBmcm9tIGl0LCBEaXJlY3RYIDEuMC4gVGhpcyBpcyBkaXNhYmxlZCB1bnRpbCB3ZSBmaW5kCiAgICAgKiBhbiBhcHBsaWNhdGlvbiB0aGF0IG5lZWRzIHRoaXMgYmVjYXVzZSBpdCBjYXVzZXMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZHVlIHRvCiAgICAgKiBzaGFkZXIgcmVjb21waWxpbmcgaW4gc29tZSBnYW1lcy4KICAgICAqLwogICAgaWYoIUdMX1NVUFBPUlQoQVRJX0VOVk1BUF9CVU1QTUFQKSAmJiAhR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgLyogc2lnbmVkIC0+IHVuc2lnbmVkIGZpeHVwICovCiAgICAgICAgZHN0ID0gZ2V0Rm10SWR4KFdJTkVEM0RGTVRfVjhVOCk7CiAgICAgICAgZ2xfaW5mby0+Z2xfZm9ybWF0c1tkc3RdLmNvbnZlcnNpb25fZ3JvdXAgPSBXSU5FRDNERk1UX1Y4VTg7CiAgICAgICAgZHN0ID0gZ2V0Rm10SWR4KFdJTkVEM0RGTVRfVjE2VTE2KTsKICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0uY29udmVyc2lvbl9ncm91cCA9IFdJTkVEM0RGTVRfVjhVODsKICAgIH0gZWxzZSBpZihHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkpIHsKICAgICAgICAvKiBzaWduZWQgLT4gdW5zaWduZWQgZml4dXAgKi8KICAgICAgICBkc3QgPSBnZXRGbXRJZHgoV0lORUQzREZNVF9WMTZVMTYpOwogICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5jb252ZXJzaW9uX2dyb3VwID0gV0lORUQzREZNVF9WMTZVMTY7CiAgICB9IGVsc2UgewogICAgICAgIC8qIEJsdWUgPSAxLjAgZml4dXAsIGRpc2FibGVkIGZvciBub3cgKi8KI2lmIDAKICAgICAgICBkc3QgPSBnZXRGbXRJZHgoV0lORUQzREZNVF9WOFU4KTsKICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0uY29udmVyc2lvbl9ncm91cCA9IFdJTkVEM0RGTVRfVjhVODsKICAgICAgICBkc3QgPSBnZXRGbXRJZHgoV0lORUQzREZNVF9WMTZVMTYpOwogICAgICAgIGdsX2luZm8tPmdsX2Zvcm1hdHNbZHN0XS5jb252ZXJzaW9uX2dyb3VwID0gV0lORUQzREZNVF9WOFU4OwojZW5kaWYKICAgIH0KCiAgICBpZighR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUikpIHsKICAgICAgICAvKiBJZiBHTF9OVl90ZXh0dXJlX3NoYWRlciBpcyBub3Qgc3VwcG9ydGVkLCB0aG9zZSBmb3JtYXRzIGFyZSBjb252ZXJ0ZWQsIGluY29tcGF0aWJseQogICAgICAgICAqIHdpdGggZWFjaCBvdGhlcgogICAgICAgICAqLwogICAgICAgIGRzdCA9IGdldEZtdElkeChXSU5FRDNERk1UX0w2VjVVNSk7CiAgICAgICAgZ2xfaW5mby0+Z2xfZm9ybWF0c1tkc3RdLmNvbnZlcnNpb25fZ3JvdXAgPSBXSU5FRDNERk1UX0w2VjVVNTsKICAgICAgICBkc3QgPSBnZXRGbXRJZHgoV0lORUQzREZNVF9YOEw4VjhVOCk7CiAgICAgICAgZ2xfaW5mby0+Z2xfZm9ybWF0c1tkc3RdLmNvbnZlcnNpb25fZ3JvdXAgPSBXSU5FRDNERk1UX1g4TDhWOFU4OwogICAgICAgIGRzdCA9IGdldEZtdElkeChXSU5FRDNERk1UX1E4VzhWOFU4KTsKICAgICAgICBnbF9pbmZvLT5nbF9mb3JtYXRzW2RzdF0uY29udmVyc2lvbl9ncm91cCA9IFdJTkVEM0RGTVRfUThXOFY4VTg7CiAgICB9IGVsc2UgewogICAgICAgIC8qIElmIEdMX05WX3RleHR1cmVfc2hhZGVyIGlzIHN1cHBvcnRlZCwgV0lORUQzREZNVF9MNlY1VTUgYW5kIFdJTkVEM0RGTVRfWDhMOFY4VTgKICAgICAgICAgKiBhcmUgY29udmVydGVkIGF0IHN1cmZhY2UgbG9hZGluZyB0aW1lLCBidXQgdGhleSBkbyBub3QgbmVlZCBhbnkgbW9kaWZpY2F0aW9uIGluCiAgICAgICAgICogdGhlIHNoYWRlciwgdGh1cyB0aGV5IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIFdJTkVEM0RGTVRfVU5LTk9XTiBncm91cCBmb3JtYXRzLgogICAgICAgICAqIFdJTkVEM0RGTVRfUThXOFY4VTggZG9lc24ndCBldmVuIG5lZWQgbG9hZC10aW1lIGNvbnZlcnNpb24KICAgICAgICAgKi8KICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfQoKLyogTk9URTogTWFrZSBzdXJlIHRoZXNlIGFyZSBpbiB0aGUgY29ycmVjdCBudW1lcmljYWwgb3JkZXIuIChzZWUgL2luY2x1ZGUvd2luZWQzZF90eXBlcy5oKSAqLwpzdGF0aWMgV0lORUQzREdMVFlQRSBjb25zdCBnbFR5cGVMb29rdXBUZW1wbGF0ZVtXSU5FRDNEREVDTFRZUEVfVU5VU0VEXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfRkxPQVQxLCAgICAxLCBHTF9GTE9BVCAgICAgICAgICAgLCBHTF9GQUxTRSAsc2l6ZW9mKGZsb2F0KX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX0ZMT0FUMiwgICAgMiwgR0xfRkxPQVQgICAgICAgICAgICwgR0xfRkFMU0UgLHNpemVvZihmbG9hdCl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1dJTkVEM0RERUNMVFlQRV9GTE9BVDMsICAgIDMsIEdMX0ZMT0FUICAgICAgICAgICAsIEdMX0ZBTFNFICxzaXplb2YoZmxvYXQpfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfRkxPQVQ0LCAgICA0LCBHTF9GTE9BVCAgICAgICAgICAgLCBHTF9GQUxTRSAsc2l6ZW9mKGZsb2F0KX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX0QzRENPTE9SLCAgNCwgR0xfVU5TSUdORURfQllURSAgICwgR0xfVFJVRSAgLHNpemVvZihCWVRFKX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX1VCWVRFNCwgICAgNCwgR0xfVU5TSUdORURfQllURSAgICwgR0xfRkFMU0UgLHNpemVvZihCWVRFKX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX1NIT1JUMiwgICAgMiwgR0xfU0hPUlQgICAgICAgICAgICwgR0xfRkFMU0UgLHNpemVvZihzaG9ydCBpbnQpfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfU0hPUlQ0LCAgICA0LCBHTF9TSE9SVCAgICAgICAgICAgLCBHTF9GQUxTRSAsc2l6ZW9mKHNob3J0IGludCl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1dJTkVEM0RERUNMVFlQRV9VQllURTROLCAgIDQsIEdMX1VOU0lHTkVEX0JZVEUgICAsIEdMX1RSVUUgICxzaXplb2YoQllURSl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1dJTkVEM0RERUNMVFlQRV9TSE9SVDJOLCAgIDIsIEdMX1NIT1JUICAgICAgICAgICAsIEdMX1RSVUUgICxzaXplb2Yoc2hvcnQgaW50KX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX1NIT1JUNE4sICAgNCwgR0xfU0hPUlQgICAgICAgICAgICwgR0xfVFJVRSAgLHNpemVvZihzaG9ydCBpbnQpfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfVVNIT1JUMk4sICAyLCBHTF9VTlNJR05FRF9TSE9SVCAgLCBHTF9UUlVFICAsc2l6ZW9mKHNob3J0IGludCl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1dJTkVEM0RERUNMVFlQRV9VU0hPUlQ0TiwgIDQsIEdMX1VOU0lHTkVEX1NIT1JUICAsIEdMX1RSVUUgICxzaXplb2Yoc2hvcnQgaW50KX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7V0lORUQzRERFQ0xUWVBFX1VERUMzLCAgICAgMywgR0xfVU5TSUdORURfU0hPUlQgICwgR0xfRkFMU0UgLHNpemVvZihzaG9ydCBpbnQpfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfREVDM04sICAgICAzLCBHTF9TSE9SVCAgICAgICAgICAgLCBHTF9UUlVFICAsc2l6ZW9mKHNob3J0IGludCl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzIsIDIsIEdMX0hBTEZfRkxPQVRfTlYgICAsIEdMX0ZBTFNFICxzaXplb2YoR0xoYWxmTlYpfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl80LCA0LCBHTF9IQUxGX0ZMT0FUX05WICAgLCBHTF9GQUxTRSAsc2l6ZW9mKEdMaGFsZk5WKX19OwoKdm9pZCBpbml0X3R5cGVfbG9va3VwKFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykgewogICAgbWVtY3B5KGdsX2luZm8tPmdsVHlwZUxvb2t1cCwgZ2xUeXBlTG9va3VwVGVtcGxhdGUsIHNpemVvZihnbFR5cGVMb29rdXBUZW1wbGF0ZSkpOwogICAgaWYoIUdMX1NVUFBPUlQoTlZfSEFMRl9GTE9BVCkpIHsKICAgICAgICAvKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSB0eXBlLCBpdCBpcyBDUFUgc2lkZS4gV2UgaGF2ZSB0byBjaGFuZ2UgdGhlIEdQVS1zaWRlIGluZm9ybWF0aW9uIHRob3VnaC4KICAgICAgICAgKiBJdCBpcyB0aGUgam9iIG9mIHRoZSB2ZXJ0ZXggYnVmZmVyIGNvZGUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZib3MgaGF2ZSB0aGUgcmlnaHQgZm9ybWF0CiAgICAgICAgICovCiAgICAgICAgZ2xfaW5mby0+Z2xUeXBlTG9va3VwW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzJdLmdsVHlwZSA9IEdMX0ZMT0FUOwogICAgICAgIGdsX2luZm8tPmdsVHlwZUxvb2t1cFtXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl80XS5nbFR5cGUgPSBHTF9GTE9BVDsKICAgIH0KfQoKI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKI2RlZmluZSBHTElORk9fTE9DQVRJT04gVGhpcy0+YWRhcHRlci0+Z2xfaW5mbwoKY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpnZXRGb3JtYXREZXNjRW50cnkoV0lORUQzREZPUk1BVCBmbXQsIFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbywgY29uc3QgR2xQaXhlbEZvcm1hdERlc2MgKipnbERlc2MpCnsKICAgIGludCBpZHggPSBnZXRGbXRJZHgoZm10KTsKCiAgICBpZihpZHggPT0gLTEpIHsKICAgICAgICBGSVhNRSgiQ2FuJ3QgZmluZCBmb3JtYXQgJXMoJWQpIGluIHRoZSBmb3JtYXQgbG9va3VwIHRhYmxlXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoZm10KSwgZm10KTsKICAgICAgICAvKiBHZXQgdGhlIGNhbGxlciBhIHZhbGlkIHBvaW50ZXIgKi8KICAgICAgICBpZHggPSBnZXRGbXRJZHgoV0lORUQzREZNVF9VTktOT1dOKTsKICAgIH0KICAgIGlmKGdsRGVzYykgewogICAgICAgIGlmKCFnbF9pbmZvLT5nbF9mb3JtYXRzKSB7CiAgICAgICAgICAgIC8qIElmIHdlIGRvIG5vdCBoYXZlIGdsIGZvcm1hdCBpbmZvcm1hdGlvbiwgcHJvdmlkZSBhIGR1bW15IE5VTEwgZm9ybWF0LiBUaGlzIGlzIGFuIGVhc3kgd2F5IHRvIG1ha2UKICAgICAgICAgICAgICogYWxsIGdsIGNhcHMgY2hlY2sgcmV0dXJuICJ1bnN1cHBvcnRlZCIgdGhhbiBjYXRjaGluZyB0aGUgbGFjayBvZiBnbCBhbGwgb3ZlciB0aGUgY29kZS4gQU5TSSBDIHJlcXVpcmVzCiAgICAgICAgICAgICAqIHN0YXRpYyB2YXJpYWJsZXMgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gMC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBHbFBpeGVsRm9ybWF0RGVzYyBkdW1teUZtdDsKICAgICAgICAgICAgKmdsRGVzYyA9ICZkdW1teUZtdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAqZ2xEZXNjID0gJmdsX2luZm8tPmdsX2Zvcm1hdHNbaWR4XTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJmZvcm1hdHNbaWR4XTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFRyYWNlIGZvcm1hdHRpbmcgb2YgdXNlZnVsIHZhbHVlcwogKi8KY29uc3QgY2hhciogZGVidWdfZDNkZm9ybWF0KFdJTkVEM0RGT1JNQVQgZm10KSB7CiAgc3dpdGNoIChmbXQpIHsKI2RlZmluZSBGTVRfVE9fU1RSKGZtdCkgY2FzZSBmbXQ6IHJldHVybiAjZm10CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfVU5LTk9XTik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfUjhHOEI4KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BOFI4RzhCOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfWDhSOEc4QjgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1I1RzZCNSk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfWDFSNUc1QjUpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0ExUjVHNUI1KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BNFI0RzRCNCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfUjNHM0IyKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQThSM0czQjIpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1g0UjRHNEI0KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BMkIxMEcxMFIxMCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQThCOEc4UjgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1g4QjhHOFI4KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9HMTZSMTYpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0EyUjEwRzEwQjEwKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BMTZCMTZHMTZSMTYpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0E4UDgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1A4KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9MOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQThMOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQTRMNCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfVjhVOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfTDZWNVU1KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9YOEw4VjhVOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfUThXOFY4VTgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1YxNlUxNik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfVzExVjExVTEwKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9BMlcxMFYxMFUxMCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfVVlWWSk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfWVVZMik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRFhUMSk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRFhUMik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRFhUMyk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRFhUNCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRFhUNSk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfTVVMVEkyX0FSR0I4KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9HOFI4X0c4QjgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1I4RzhfQjhHOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRDE2X0xPQ0tBQkxFKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9EMzIpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0QxNVMxKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9EMjRTOCk7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRDI0WDgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0QyNFg0UzQpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0QxNik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfTDE2KTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9EMzJGX0xPQ0tBQkxFKTsKICAgIEZNVF9UT19TVFIoV0lORUQzREZNVF9EMjRGUzgpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1ZFUlRFWERBVEEpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0lOREVYMTYpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX0lOREVYMzIpOwogICAgRk1UX1RPX1NUUihXSU5FRDNERk1UX1ExNlcxNlYxNlUxNik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfUjE2Rik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRzE2UjE2Rik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQTE2QjE2RzE2UjE2Rik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfUjMyRik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfRzMyUjMyRik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQTMyQjMyRzMyUjMyRik7CiAgICBGTVRfVE9fU1RSKFdJTkVEM0RGTVRfQ3hWOFU4KTsKI3VuZGVmIEZNVF9UT19TVFIKICBkZWZhdWx0OgogICAgewogICAgICBjaGFyIGZvdXJjY1s1XTsKICAgICAgZm91cmNjWzBdID0gKGNoYXIpKGZtdCk7CiAgICAgIGZvdXJjY1sxXSA9IChjaGFyKShmbXQgPj4gOCk7CiAgICAgIGZvdXJjY1syXSA9IChjaGFyKShmbXQgPj4gMTYpOwogICAgICBmb3VyY2NbM10gPSAoY2hhcikoZm10ID4+IDI0KTsKICAgICAgZm91cmNjWzRdID0gMDsKICAgICAgaWYoIGlzcHJpbnQoZm91cmNjWzBdKSAmJiBpc3ByaW50KGZvdXJjY1sxXSkgJiYgaXNwcmludChmb3VyY2NbMl0pICYmIGlzcHJpbnQoZm91cmNjWzNdKSApCiAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCAldSAoYXMgZm91cmNjOiAlcykgV0lORUQzREZPUk1BVCFcbiIsIGZtdCwgZm91cmNjKTsKICAgICAgZWxzZQogICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgJXUgV0lORUQzREZPUk1BVCFcbiIsIGZtdCk7CiAgICB9CiAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RkZXZpY2V0eXBlKFdJTkVEM0RERVZUWVBFIGRldnR5cGUpIHsKICBzd2l0Y2ggKGRldnR5cGUpIHsKI2RlZmluZSBERVZUWVBFX1RPX1NUUihkZXYpIGNhc2UgZGV2OiByZXR1cm4gI2RldgogICAgREVWVFlQRV9UT19TVFIoV0lORUQzRERFVlRZUEVfSEFMKTsKICAgIERFVlRZUEVfVE9fU1RSKFdJTkVEM0RERVZUWVBFX1JFRik7CiAgICBERVZUWVBFX1RPX1NUUihXSU5FRDNEREVWVFlQRV9TVyk7CiN1bmRlZiBERVZUWVBFX1RPX1NUUgogIGRlZmF1bHQ6CiAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IFdJTkVEM0RERVZUWVBFIVxuIiwgZGV2dHlwZSk7CiAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2R1c2FnZShEV09SRCB1c2FnZSkgewogIHN3aXRjaCAodXNhZ2UgJiBXSU5FRDNEVVNBR0VfTUFTSykgewojZGVmaW5lIFdJTkVEM0RVU0FHRV9UT19TVFIodSkgY2FzZSB1OiByZXR1cm4gI3UKICAgIFdJTkVEM0RVU0FHRV9UT19TVFIoV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCk7CiAgICBXSU5FRDNEVVNBR0VfVE9fU1RSKFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUwpOwogICAgV0lORUQzRFVTQUdFX1RPX1NUUihXSU5FRDNEVVNBR0VfV1JJVEVPTkxZKTsKICAgIFdJTkVEM0RVU0FHRV9UT19TVFIoV0lORUQzRFVTQUdFX1NPRlRXQVJFUFJPQ0VTU0lORyk7CiAgICBXSU5FRDNEVVNBR0VfVE9fU1RSKFdJTkVEM0RVU0FHRV9ET05PVENMSVApOwogICAgV0lORUQzRFVTQUdFX1RPX1NUUihXSU5FRDNEVVNBR0VfUE9JTlRTKTsKICAgIFdJTkVEM0RVU0FHRV9UT19TVFIoV0lORUQzRFVTQUdFX1JUUEFUQ0hFUyk7CiAgICBXSU5FRDNEVVNBR0VfVE9fU1RSKFdJTkVEM0RVU0FHRV9OUEFUQ0hFUyk7CiAgICBXSU5FRDNEVVNBR0VfVE9fU1RSKFdJTkVEM0RVU0FHRV9EWU5BTUlDKTsKICAgIFdJTkVEM0RVU0FHRV9UT19TVFIoV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApOwogICAgV0lORUQzRFVTQUdFX1RPX1NUUihXSU5FRDNEVVNBR0VfRE1BUCk7CiN1bmRlZiBXSU5FRDNEVVNBR0VfVE9fU1RSCiAgY2FzZSAwOiByZXR1cm4gIm5vbmUiOwogIGRlZmF1bHQ6CiAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IFVzYWdlIVxuIiwgdXNhZ2UpOwogICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogIH0KfQoKY29uc3QgY2hhciogZGVidWdfZDNkdXNhZ2VxdWVyeShEV09SRCB1c2FnZXF1ZXJ5KSB7CiAgc3dpdGNoICh1c2FnZXF1ZXJ5ICYgV0lORUQzRFVTQUdFX1FVRVJZX01BU0spIHsKI2RlZmluZSBXSU5FRDNEVVNBR0VRVUVSWV9UT19TVFIodSkgY2FzZSB1OiByZXR1cm4gI3UKICAgIFdJTkVEM0RVU0FHRVFVRVJZX1RPX1NUUihXSU5FRDNEVVNBR0VfUVVFUllfRklMVEVSKTsKICAgIFdJTkVEM0RVU0FHRVFVRVJZX1RPX1NUUihXSU5FRDNEVVNBR0VfUVVFUllfTEVHQUNZQlVNUE1BUCk7CiAgICBXSU5FRDNEVVNBR0VRVUVSWV9UT19TVFIoV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORyk7CiAgICBXSU5FRDNEVVNBR0VRVUVSWV9UT19TVFIoV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JSRUFEKTsKICAgIFdJTkVEM0RVU0FHRVFVRVJZX1RPX1NUUihXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFKTsKICAgIFdJTkVEM0RVU0FHRVFVRVJZX1RPX1NUUihXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRSk7CiAgICBXSU5FRDNEVVNBR0VRVUVSWV9UT19TVFIoV0lORUQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVApOwojdW5kZWYgV0lORUQzRFVTQUdFUVVFUllfVE9fU1RSCiAgY2FzZSAwOiByZXR1cm4gIm5vbmUiOwogIGRlZmF1bHQ6CiAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IFVzYWdlIFF1ZXJ5IVxuIiwgdXNhZ2VxdWVyeSk7CiAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RkZWNsbWV0aG9kKFdJTkVEM0RERUNMTUVUSE9EIG1ldGhvZCkgewogICAgc3dpdGNoIChtZXRob2QpIHsKI2RlZmluZSBXSU5FRDNEREVDTE1FVEhPRF9UT19TVFIodSkgY2FzZSB1OiByZXR1cm4gI3UKICAgICAgICBXSU5FRDNEREVDTE1FVEhPRF9UT19TVFIoV0lORUQzRERFQ0xNRVRIT0RfREVGQVVMVCk7CiAgICAgICAgV0lORUQzRERFQ0xNRVRIT0RfVE9fU1RSKFdJTkVEM0RERUNMTUVUSE9EX1BBUlRJQUxVKTsKICAgICAgICBXSU5FRDNEREVDTE1FVEhPRF9UT19TVFIoV0lORUQzRERFQ0xNRVRIT0RfUEFSVElBTFYpOwogICAgICAgIFdJTkVEM0RERUNMTUVUSE9EX1RPX1NUUihXSU5FRDNEREVDTE1FVEhPRF9DUk9TU1VWKTsKICAgICAgICBXSU5FRDNEREVDTE1FVEhPRF9UT19TVFIoV0lORUQzRERFQ0xNRVRIT0RfVVYpOwogICAgICAgIFdJTkVEM0RERUNMTUVUSE9EX1RPX1NUUihXSU5FRDNEREVDTE1FVEhPRF9MT09LVVApOwogICAgICAgIFdJTkVEM0RERUNMTUVUSE9EX1RPX1NUUihXSU5FRDNEREVDTE1FVEhPRF9MT09LVVBQUkVTQU1QTEVEKTsKI3VuZGVmIFdJTkVEM0RERUNMTUVUSE9EX1RPX1NUUgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgJXUgZGVjbGFyYXRpb24gbWV0aG9kIVxuIiwgbWV0aG9kKTsKICAgICAgICAgICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogICAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RkZWNsdHlwZShXSU5FRDNEREVDTFRZUEUgdHlwZSkgewogICAgc3dpdGNoICh0eXBlKSB7CiNkZWZpbmUgV0lORUQzRERFQ0xUWVBFX1RPX1NUUih1KSBjYXNlIHU6IHJldHVybiAjdQogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX0ZMT0FUMSk7CiAgICAgICAgV0lORUQzRERFQ0xUWVBFX1RPX1NUUihXSU5FRDNEREVDTFRZUEVfRkxPQVQyKTsKICAgICAgICBXSU5FRDNEREVDTFRZUEVfVE9fU1RSKFdJTkVEM0RERUNMVFlQRV9GTE9BVDMpOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX0ZMT0FUNCk7CiAgICAgICAgV0lORUQzRERFQ0xUWVBFX1RPX1NUUihXSU5FRDNEREVDTFRZUEVfRDNEQ09MT1IpOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX1VCWVRFNCk7CiAgICAgICAgV0lORUQzRERFQ0xUWVBFX1RPX1NUUihXSU5FRDNEREVDTFRZUEVfU0hPUlQyKTsKICAgICAgICBXSU5FRDNEREVDTFRZUEVfVE9fU1RSKFdJTkVEM0RERUNMVFlQRV9TSE9SVDQpOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX1VCWVRFNE4pOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX1NIT1JUMk4pOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX1NIT1JUNE4pOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX1VTSE9SVDJOKTsKICAgICAgICBXSU5FRDNEREVDTFRZUEVfVE9fU1RSKFdJTkVEM0RERUNMVFlQRV9VU0hPUlQ0Tik7CiAgICAgICAgV0lORUQzRERFQ0xUWVBFX1RPX1NUUihXSU5FRDNEREVDTFRZUEVfVURFQzMpOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX0RFQzNOKTsKICAgICAgICBXSU5FRDNEREVDTFRZUEVfVE9fU1RSKFdJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzIpOwogICAgICAgIFdJTkVEM0RERUNMVFlQRV9UT19TVFIoV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNCk7CiAgICAgICAgV0lORUQzRERFQ0xUWVBFX1RPX1NUUihXSU5FRDNEREVDTFRZUEVfVU5VU0VEKTsKI3VuZGVmIFdJTkVEM0RERUNMVFlQRV9UT19TVFIKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IGRlY2xhcmF0aW9uIHR5cGUhXG4iLCB0eXBlKTsKICAgICAgICAgICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogICAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RkZWNsdXNhZ2UoQllURSB1c2FnZSkgewogICAgc3dpdGNoICh1c2FnZSkgewojZGVmaW5lIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKHUpIGNhc2UgdTogcmV0dXJuICN1CiAgICAgICAgV0lORUQzRERFQ0xVU0FHRV9UT19TVFIoV0lORUQzRERFQ0xVU0FHRV9QT1NJVElPTik7CiAgICAgICAgV0lORUQzRERFQ0xVU0FHRV9UT19TVFIoV0lORUQzRERFQ0xVU0FHRV9CTEVORFdFSUdIVCk7CiAgICAgICAgV0lORUQzRERFQ0xVU0FHRV9UT19TVFIoV0lORUQzRERFQ0xVU0FHRV9CTEVORElORElDRVMpOwogICAgICAgIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKFdJTkVEM0RERUNMVVNBR0VfTk9STUFMKTsKICAgICAgICBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUihXSU5FRDNEREVDTFVTQUdFX1BTSVpFKTsKICAgICAgICBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUihXSU5FRDNEREVDTFVTQUdFX1RFWENPT1JEKTsKICAgICAgICBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUihXSU5FRDNEREVDTFVTQUdFX1RBTkdFTlQpOwogICAgICAgIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKFdJTkVEM0RERUNMVVNBR0VfQklOT1JNQUwpOwogICAgICAgIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKFdJTkVEM0RERUNMVVNBR0VfVEVTU0ZBQ1RPUik7CiAgICAgICAgV0lORUQzRERFQ0xVU0FHRV9UT19TVFIoV0lORUQzRERFQ0xVU0FHRV9QT1NJVElPTlQpOwogICAgICAgIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKFdJTkVEM0RERUNMVVNBR0VfQ09MT1IpOwogICAgICAgIFdJTkVEM0RERUNMVVNBR0VfVE9fU1RSKFdJTkVEM0RERUNMVVNBR0VfRk9HKTsKICAgICAgICBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUihXSU5FRDNEREVDTFVTQUdFX0RFUFRIKTsKICAgICAgICBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUihXSU5FRDNEREVDTFVTQUdFX1NBTVBMRSk7CiN1bmRlZiBXSU5FRDNEREVDTFVTQUdFX1RPX1NUUgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgJXUgZGVjbGFyYXRpb24gdXNhZ2UhXG4iLCB1c2FnZSk7CiAgICAgICAgICAgIHJldHVybiAidW5yZWNvZ25pemVkIjsKICAgIH0KfQoKY29uc3QgY2hhciogZGVidWdfZDNkcmVzb3VyY2V0eXBlKFdJTkVEM0RSRVNPVVJDRVRZUEUgcmVzKSB7CiAgc3dpdGNoIChyZXMpIHsKI2RlZmluZSBSRVNfVE9fU1RSKHJlcykgY2FzZSByZXM6IHJldHVybiAjcmVzOwogICAgUkVTX1RPX1NUUihXSU5FRDNEUlRZUEVfU1VSRkFDRSk7CiAgICBSRVNfVE9fU1RSKFdJTkVEM0RSVFlQRV9WT0xVTUUpOwogICAgUkVTX1RPX1NUUihXSU5FRDNEUlRZUEVfVEVYVFVSRSk7CiAgICBSRVNfVE9fU1RSKFdJTkVEM0RSVFlQRV9WT0xVTUVURVhUVVJFKTsKICAgIFJFU19UT19TVFIoV0lORUQzRFJUWVBFX0NVQkVURVhUVVJFKTsKICAgIFJFU19UT19TVFIoV0lORUQzRFJUWVBFX1ZFUlRFWEJVRkZFUik7CiAgICBSRVNfVE9fU1RSKFdJTkVEM0RSVFlQRV9JTkRFWEJVRkZFUik7CiN1bmRlZiAgUkVTX1RPX1NUUgogIGRlZmF1bHQ6CiAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IFdJTkVEM0RSRVNPVVJDRVRZUEUhXG4iLCByZXMpOwogICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogIH0KfQoKY29uc3QgY2hhciogZGVidWdfZDNkcHJpbWl0aXZldHlwZShXSU5FRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlKSB7CiAgc3dpdGNoIChQcmltaXRpdmVUeXBlKSB7CiNkZWZpbmUgUFJJTV9UT19TVFIocHJpbSkgY2FzZSBwcmltOiByZXR1cm4gI3ByaW07CiAgICBQUklNX1RPX1NUUihXSU5FRDNEUFRfUE9JTlRMSVNUKTsKICAgIFBSSU1fVE9fU1RSKFdJTkVEM0RQVF9MSU5FTElTVCk7CiAgICBQUklNX1RPX1NUUihXSU5FRDNEUFRfTElORVNUUklQKTsKICAgIFBSSU1fVE9fU1RSKFdJTkVEM0RQVF9UUklBTkdMRUxJU1QpOwogICAgUFJJTV9UT19TVFIoV0lORUQzRFBUX1RSSUFOR0xFU1RSSVApOwogICAgUFJJTV9UT19TVFIoV0lORUQzRFBUX1RSSUFOR0xFRkFOKTsKI3VuZGVmICBQUklNX1RPX1NUUgogIGRlZmF1bHQ6CiAgICBGSVhNRSgiVW5yZWNvZ25pemVkICV1IFdJTkVEM0RQUklNSVRJVkVUWVBFIVxuIiwgUHJpbWl0aXZlVHlwZSk7CiAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RyZW5kZXJzdGF0ZShEV09SRCBzdGF0ZSkgewogIHN3aXRjaCAoc3RhdGUpIHsKI2RlZmluZSBEM0RTVEFURV9UT19TVFIodSkgY2FzZSB1OiByZXR1cm4gI3UKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfVEVYVFVSRUhBTkRMRSAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19BTlRJQUxJQVMgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1RFWFRVUkVBRERSRVNTICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfVEVYVFVSRVBFUlNQRUNUSVZFICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQVSAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVBWICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfWkVOQUJMRSAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19GSUxMTU9ERSAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NIQURFTU9ERSAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfTElORVBBVFRFUk4gICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19NT05PRU5BQkxFICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1JPUDIgICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfUExBTkVNQVNLICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19aV1JJVEVFTkFCTEUgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfTEFTVFBJWEVMICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19URVhUVVJFTUFHICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1RFWFRVUkVNSU4gICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1JDQkxFTkQgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19ERVNUQkxFTkQgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1RFWFRVUkVNQVBCTEVORCAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQ1VMTE1PREUgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19aRlVOQyAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FMUEhBUkVGICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQUxQSEFGVU5DICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19ESVRIRVJFTkFCTEUgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRk9HRU5BQkxFICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TUEVDVUxBUkVOQUJMRSAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1pWSVNJQkxFICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1VCUElYRUwgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVUJQSVhFTFggICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVEQUxQSEEgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRk9HQ09MT1IgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19GT0dUQUJMRU1PREUgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0ZPR1NUQVJUICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRk9HRU5EICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19GT0dERU5TSVRZICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVFTkFCTEUgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRURHRUFOVElBTElBUyAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfVEVYVFVSRUFERFJFU1NVICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19URVhUVVJFQUREUkVTU1YgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfWkJJQVMgICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19SQU5HRUZPR0VOQUJMRSAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FOSVNPVFJPUFkgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRkxVU0hCQVRDSCAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19UUkFOU0xVQ0VOVFNPUlRJTkRFUEVOREVOVCk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RFTkNJTEZBSUwgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVEVOQ0lMWkZBSUwgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NURU5DSUxQQVNTICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RFTkNJTEZVTkMgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVEVOQ0lMUkVGICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NURU5DSUxNQVNLICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19URVhUVVJFRkFDVE9SICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wMSAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjAyICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDMgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNCAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjA1ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDYgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4wNyAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjA4ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDkgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMCAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjExICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTIgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xMyAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjE0ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTUgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xNiAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjE3ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTggICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4xOSAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjIwICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjEgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yMiAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjIzICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjQgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yNSAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjI2ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjcgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4yOCAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TVElQUExFUEFUVEVSTjI5ICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMzAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1RJUFBMRVBBVFRFUk4zMSAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQMCAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVAxICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfV1JBUDIgICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQMyAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVA0ICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfV1JBUDUgICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQNiAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVA3ICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQ0xJUFBJTkcgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19MSUdIVElORyAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0VYVEVOVFMgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQU1CSUVOVCAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19GT0dWRVJURVhNT0RFICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0NPTE9SVkVSVEVYICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfTE9DQUxWSUVXRVIgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19OT1JNQUxJWkVOT1JNQUxTICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0NPTE9SS0VZQkxFTkRFTkFCTEUgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRSAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19WRVJURVhCTEVORCAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRSAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU09GVFdBUkVWRVJURVhQUk9DRVNTSU5HICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19QT0lOVFNJWkUgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1BPSU5UU0laRV9NSU4gICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19QT0lOVFNDQUxFRU5BQkxFICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1BPSU5UU0NBTEVfQSAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfUE9JTlRTQ0FMRV9CICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19QT0lOVFNDQUxFX0MgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19QQVRDSEVER0VTVFlMRSAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1BBVENIU0VHTUVOVFMgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfREVCVUdNT05JVE9SVE9LRU4gICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19QT0lOVFNJWkVfTUFYICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRSAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19UV0VFTkZBQ1RPUiAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0JMRU5ET1AgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfUE9TSVRJT05ERUdSRUUgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19OT1JNQUxERUdSRUUgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NDSVNTT1JURVNURU5BQkxFICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU0xPUEVTQ0FMRURFUFRIQklBUyAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19BTlRJQUxJQVNFRExJTkVFTkFCTEUgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX01JTlRFU1NFTExBVElPTkxFVkVMICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfTUFYVEVTU0VMTEFUSU9OTEVWRUwgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19BREFQVElWRVRFU1NfWCAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0FEQVBUSVZFVEVTU19ZICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQURBUFRJVkVURVNTX1ogICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19BREFQVElWRVRFU1NfVyAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfVFdPU0lERURTVEVOQ0lMTU9ERSAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19DQ1dfU1RFTkNJTEZBSUwgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0NDV19TVEVOQ0lMWkZBSUwgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQ0NXX1NURU5DSUxQQVNTICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19DQ1dfU1RFTkNJTEZVTkMgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUxICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTIgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMyAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX0JMRU5ERkFDVE9SICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfU1JHQldSSVRFRU5BQkxFICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19ERVBUSEJJQVMgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVA4ICAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfV1JBUDkgICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQMTAgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVAxMSAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfV1JBUDEyICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19XUkFQMTMgICAgICAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1dSQVAxNCAgICAgICAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfV1JBUDE1ICAgICAgICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFJTX1NSQ0JMRU5EQUxQSEEgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEUlNfREVTVEJMRU5EQUxQSEEgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RSU19CTEVORE9QQUxQSEEgICAgICAgICAgICAgICk7CiN1bmRlZiBEM0RTVEFURV9UT19TVFIKICBkZWZhdWx0OgogICAgRklYTUUoIlVucmVjb2duaXplZCAldSByZW5kZXIgc3RhdGUhXG4iLCBzdGF0ZSk7CiAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgfQp9Cgpjb25zdCBjaGFyKiBkZWJ1Z19kM2RzYW1wbGVyc3RhdGUoRFdPUkQgc3RhdGUpIHsKICBzd2l0Y2ggKHN0YXRlKSB7CiNkZWZpbmUgRDNEU1RBVEVfVE9fU1RSKHUpIGNhc2UgdTogcmV0dXJuICN1CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfQk9SREVSQ09MT1IgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfQUREUkVTU1UgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfQUREUkVTU1YgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfQUREUkVTU1cgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUFHRklMVEVSICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUlORklMVEVSICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUlQRklMVEVSICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUlQTUFQTE9EQklBUyk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUFYTUlQTEVWRUwgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfTUFYQU5JU09UUk9QWSk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfU1JHQlRFWFRVUkUgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfRUxFTUVOVElOREVYICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFNBTVBfRE1BUE9GRlNFVCAgICk7CiN1bmRlZiBEM0RTVEFURV9UT19TVFIKICBkZWZhdWx0OgogICAgRklYTUUoIlVucmVjb2duaXplZCAldSBzYW1wbGVyIHN0YXRlIVxuIiwgc3RhdGUpOwogICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogIH0KfQoKY29uc3QgY2hhciAqZGVidWdfZDNkdGV4dHVyZWZpbHRlcnR5cGUoV0lORUQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlcl90eXBlKSB7CiAgICBzd2l0Y2ggKGZpbHRlcl90eXBlKSB7CiNkZWZpbmUgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSKHUpIGNhc2UgdTogcmV0dXJuICN1CiAgICAgICAgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSKFdJTkVEM0RURVhGX05PTkUpOwogICAgICAgIEQzRFRFWFRVUkVGSUxURVJUWVBFX1RPX1NUUihXSU5FRDNEVEVYRl9QT0lOVCk7CiAgICAgICAgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSKFdJTkVEM0RURVhGX0xJTkVBUik7CiAgICAgICAgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSKFdJTkVEM0RURVhGX0FOSVNPVFJPUElDKTsKICAgICAgICBEM0RURVhUVVJFRklMVEVSVFlQRV9UT19TVFIoV0lORUQzRFRFWEZfRkxBVENVQklDKTsKICAgICAgICBEM0RURVhUVVJFRklMVEVSVFlQRV9UT19TVFIoV0lORUQzRFRFWEZfR0FVU1NJQU5DVUJJQyk7CiAgICAgICAgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSKFdJTkVEM0RURVhGX1BZUkFNSURBTFFVQUQpOwogICAgICAgIEQzRFRFWFRVUkVGSUxURVJUWVBFX1RPX1NUUihXSU5FRDNEVEVYRl9HQVVTU0lBTlFVQUQpOwojdW5kZWYgRDNEVEVYVFVSRUZJTFRFUlRZUEVfVE9fU1RSCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaWVkIHRleHR1cmUgZmlsdGVyIHR5cGUgMHglMDh4XG4iLCBmaWx0ZXJfdHlwZSk7CiAgICAgICAgICAgIHJldHVybiAidW5yZWNvZ25pemVkIjsKICAgIH0KfQoKY29uc3QgY2hhciogZGVidWdfZDNkdGV4dHVyZXN0YXRlKERXT1JEIHN0YXRlKSB7CiAgc3dpdGNoIChzdGF0ZSkgewojZGVmaW5lIEQzRFNUQVRFX1RPX1NUUih1KSBjYXNlIHU6IHJldHVybiAjdQogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICk7CiAgICBEM0RTVEFURV9UT19TVFIoV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgKTsKICAgIEQzRFNUQVRFX1RPX1NUUihXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICApOwogICAgRDNEU1RBVEVfVE9fU1RSKFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICk7CiN1bmRlZiBEM0RTVEFURV9UT19TVFIKICBjYXNlIDEyOgogICAgLyogTm90ZSBXSU5FRDNEVFNTIGFyZSBub3QgY29uc2VjdXRpdmUsIHNvIHNraXAgdGhlc2UgKi8KICAgIHJldHVybiAidW51c2VkIjsKICBkZWZhdWx0OgogICAgRklYTUUoIlVucmVjb2duaXplZCAldSB0ZXh0dXJlIHN0YXRlIVxuIiwgc3RhdGUpOwogICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogIH0KfQoKc3RhdGljIGNvbnN0IGNoYXIqIGRlYnVnX2QzZHRvcChXSU5FRDNEVEVYVFVSRU9QIGQzZHRvcCkgewogICAgc3dpdGNoIChkM2R0b3ApIHsKI2RlZmluZSBEM0RUT1BfVE9fU1RSKHUpIGNhc2UgdTogcmV0dXJuICN1CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX0RJU0FCTEUpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9TRUxFQ1RBUkcxKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfU0VMRUNUQVJHMik7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX01PRFVMQVRFKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfTU9EVUxBVEUyWCk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX01PRFVMQVRFNFgpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9BREQpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9BRERTSUdORUQpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9TVUJUUkFDVCk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX0FERFNNT09USCk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEEpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfUFJFTU9EVUxBVEUpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1IpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfQlVNUEVOVk1BUCk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UpOwogICAgICAgIEQzRFRPUF9UT19TVFIoV0lORUQzRFRPUF9ET1RQUk9EVUNUMyk7CiAgICAgICAgRDNEVE9QX1RPX1NUUihXSU5FRDNEVE9QX01VTFRJUExZQUREKTsKICAgICAgICBEM0RUT1BfVE9fU1RSKFdJTkVEM0RUT1BfTEVSUCk7CiN1bmRlZiBEM0RUT1BfVE9fU1RSCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCAldSBXSU5FRDNEVE9QXG4iLCBkM2R0b3ApOwogICAgICAgICAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgICB9Cn0KCmNvbnN0IGNoYXIqIGRlYnVnX2QzZHRzdHlwZShXSU5FRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHRzdHlwZSkgewogICAgc3dpdGNoICh0c3R5cGUpIHsKI2RlZmluZSBUU1RZUEVfVE9fU1RSKHRzdHlwZSkgY2FzZSB0c3R5cGU6IHJldHVybiAjdHN0eXBlCiAgICBUU1RZUEVfVE9fU1RSKFdJTkVEM0RUU19WSUVXKTsKICAgIFRTVFlQRV9UT19TVFIoV0lORUQzRFRTX1BST0pFQ1RJT04pOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTApOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTEpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTIpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTMpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTQpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTUpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTYpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfVEVYVFVSRTcpOwogICAgVFNUWVBFX1RPX1NUUihXSU5FRDNEVFNfV09STERNQVRSSVgoMCkpOwojdW5kZWYgVFNUWVBFX1RPX1NUUgogICAgZGVmYXVsdDoKICAgICAgICBpZiAodHN0eXBlID4gMjU2ICYmIHRzdHlwZSA8IDUxMikgewogICAgICAgICAgICBGSVhNRSgiV0lORUQzRFRTX1dPUkxETUFUUklYKCV1KS4gMS4uMjU1IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkXG4iLCB0c3R5cGUpOwogICAgICAgICAgICByZXR1cm4gKCJXSU5FRDNEVFNfV09STERNQVRSSVggPiAwIik7CiAgICAgICAgfQogICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgJXUgV0lORUQzRFRTXG4iLCB0c3R5cGUpOwogICAgICAgIHJldHVybiAidW5yZWNvZ25pemVkIjsKICAgIH0KfQoKY29uc3QgY2hhciogZGVidWdfZDNkcG9vbChXSU5FRDNEUE9PTCBQb29sKSB7CiAgc3dpdGNoIChQb29sKSB7CiNkZWZpbmUgUE9PTF9UT19TVFIocCkgY2FzZSBwOiByZXR1cm4gI3A7CiAgICBQT09MX1RPX1NUUihXSU5FRDNEUE9PTF9ERUZBVUxUKTsKICAgIFBPT0xfVE9fU1RSKFdJTkVEM0RQT09MX01BTkFHRUQpOwogICAgUE9PTF9UT19TVFIoV0lORUQzRFBPT0xfU1lTVEVNTUVNKTsKICAgIFBPT0xfVE9fU1RSKFdJTkVEM0RQT09MX1NDUkFUQ0gpOwojdW5kZWYgIFBPT0xfVE9fU1RSCiAgZGVmYXVsdDoKICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgJXUgV0lORUQzRFBPT0whXG4iLCBQb29sKTsKICAgIHJldHVybiAidW5yZWNvZ25pemVkIjsKICB9Cn0KCmNvbnN0IGNoYXIgKmRlYnVnX2Zib3N0YXR1cyhHTGVudW0gc3RhdHVzKSB7CiAgICBzd2l0Y2goc3RhdHVzKSB7CiNkZWZpbmUgRkJPU1RBVFVTX1RPX1NUUih1KSBjYXNlIHU6IHJldHVybiAjdQogICAgICAgIEZCT1NUQVRVU19UT19TVFIoR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKTsKICAgICAgICBGQk9TVEFUVVNfVE9fU1RSKEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9FWFQpOwogICAgICAgIEZCT1NUQVRVU19UT19TVFIoR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUKTsKICAgICAgICBGQk9TVEFUVVNfVE9fU1RSKEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19FWFQpOwogICAgICAgIEZCT1NUQVRVU19UT19TVFIoR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX0VYVCk7CiAgICAgICAgRkJPU1RBVFVTX1RPX1NUUihHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSX0VYVCk7CiAgICAgICAgRkJPU1RBVFVTX1RPX1NUUihHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX0VYVCk7CiAgICAgICAgRkJPU1RBVFVTX1RPX1NUUihHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9FWFQpOwojdW5kZWYgRkJPU1RBVFVTX1RPX1NUUgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbmllZCBGQk8gc3RhdHVzIDB4JTA4eFxuIiwgc3RhdHVzKTsKICAgICAgICAgICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogICAgfQp9Cgpjb25zdCBjaGFyICpkZWJ1Z19nbGVycm9yKEdMZW51bSBlcnJvcikgewogICAgc3dpdGNoKGVycm9yKSB7CiNkZWZpbmUgR0xFUlJPUl9UT19TVFIodSkgY2FzZSB1OiByZXR1cm4gI3UKICAgICAgICBHTEVSUk9SX1RPX1NUUihHTF9OT19FUlJPUik7CiAgICAgICAgR0xFUlJPUl9UT19TVFIoR0xfSU5WQUxJRF9FTlVNKTsKICAgICAgICBHTEVSUk9SX1RPX1NUUihHTF9JTlZBTElEX1ZBTFVFKTsKICAgICAgICBHTEVSUk9SX1RPX1NUUihHTF9JTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgR0xFUlJPUl9UT19TVFIoR0xfU1RBQ0tfT1ZFUkZMT1cpOwogICAgICAgIEdMRVJST1JfVE9fU1RSKEdMX1NUQUNLX1VOREVSRkxPVyk7CiAgICAgICAgR0xFUlJPUl9UT19TVFIoR0xfT1VUX09GX01FTU9SWSk7CiAgICAgICAgR0xFUlJPUl9UT19TVFIoR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fRVhUKTsKI3VuZGVmIEdMRVJST1JfVE9fU1RSCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaWVkIEdMIGVycm9yIDB4JTA4eFxuIiwgZXJyb3IpOwogICAgICAgICAgICByZXR1cm4gInVucmVjb2duaXplZCI7CiAgICB9Cn0KCmNvbnN0IGNoYXIgKmRlYnVnX2QzZGJhc2lzKFdJTkVEM0RCQVNJU1RZUEUgYmFzaXMpIHsKICAgIHN3aXRjaChiYXNpcykgewogICAgICAgIGNhc2UgV0lORUQzREJBU0lTX0JFWklFUjogICAgICAgcmV0dXJuICJXSU5FRDNEQkFTSVNfQkVaSUVSIjsKICAgICAgICBjYXNlIFdJTkVEM0RCQVNJU19CU1BMSU5FOiAgICAgIHJldHVybiAiV0lORUQzREJBU0lTX0JTUExJTkUiOwogICAgICAgIGNhc2UgV0lORUQzREJBU0lTX0lOVEVSUE9MQVRFOiAgcmV0dXJuICJXSU5FRDNEQkFTSVNfSU5URVJQT0xBVEUiOwogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bnJlY29nbml6ZWQiOwogICAgfQp9Cgpjb25zdCBjaGFyICpkZWJ1Z19kM2RkZWdyZWUoV0lORUQzRERFR1JFRVRZUEUgZGVncmVlKSB7CiAgICBzd2l0Y2goZGVncmVlKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEREVHUkVFX0xJTkVBUjogICAgICByZXR1cm4gIldJTkVEM0RERUdSRUVfTElORUFSIjsKICAgICAgICBjYXNlIFdJTkVEM0RERUdSRUVfUVVBRFJBVElDOiAgIHJldHVybiAiV0lORUQzRERFR1JFRV9RVUFEUkFUSUMiOwogICAgICAgIGNhc2UgV0lORUQzRERFR1JFRV9DVUJJQzogICAgICAgcmV0dXJuICJXSU5FRDNEREVHUkVFX0NVQklDIjsKICAgICAgICBjYXNlIFdJTkVEM0RERUdSRUVfUVVJTlRJQzogICAgIHJldHVybiAiV0lORUQzRERFR1JFRV9RVUlOVElDIjsKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5yZWNvZ25pemVkIjsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFVzZWZ1bCBmdW5jdGlvbnMgbWFwcGluZyBHTCA8LT4gRDNEIHZhbHVlcwogKi8KR0xlbnVtIFN0ZW5jaWxPcChEV09SRCBvcCkgewogICAgc3dpdGNoKG9wKSB7CiAgICBjYXNlIFdJTkVEM0RTVEVOQ0lMT1BfS0VFUCAgICA6IHJldHVybiBHTF9LRUVQOwogICAgY2FzZSBXSU5FRDNEU1RFTkNJTE9QX1pFUk8gICAgOiByZXR1cm4gR0xfWkVSTzsKICAgIGNhc2UgV0lORUQzRFNURU5DSUxPUF9SRVBMQUNFIDogcmV0dXJuIEdMX1JFUExBQ0U7CiAgICBjYXNlIFdJTkVEM0RTVEVOQ0lMT1BfSU5DUlNBVCA6IHJldHVybiBHTF9JTkNSOwogICAgY2FzZSBXSU5FRDNEU1RFTkNJTE9QX0RFQ1JTQVQgOiByZXR1cm4gR0xfREVDUjsKICAgIGNhc2UgV0lORUQzRFNURU5DSUxPUF9JTlZFUlQgIDogcmV0dXJuIEdMX0lOVkVSVDsKICAgIGNhc2UgV0lORUQzRFNURU5DSUxPUF9JTkNSICAgIDogcmV0dXJuIEdMX0lOQ1JfV1JBUF9FWFQ7CiAgICBjYXNlIFdJTkVEM0RTVEVOQ0lMT1BfREVDUiAgICA6IHJldHVybiBHTF9ERUNSX1dSQVBfRVhUOwogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIHN0ZW5jaWwgb3AgJWRcbiIsIG9wKTsKICAgICAgICByZXR1cm4gR0xfS0VFUDsKICAgIH0KfQoKR0xlbnVtIENvbXBhcmVGdW5jKERXT1JEIGZ1bmMpIHsKICAgIHN3aXRjaCAoKFdJTkVEM0RDTVBGVU5DKWZ1bmMpIHsKICAgIGNhc2UgV0lORUQzRENNUF9ORVZFUiAgICAgICAgOiByZXR1cm4gR0xfTkVWRVI7CiAgICBjYXNlIFdJTkVEM0RDTVBfTEVTUyAgICAgICAgIDogcmV0dXJuIEdMX0xFU1M7CiAgICBjYXNlIFdJTkVEM0RDTVBfRVFVQUwgICAgICAgIDogcmV0dXJuIEdMX0VRVUFMOwogICAgY2FzZSBXSU5FRDNEQ01QX0xFU1NFUVVBTCAgICA6IHJldHVybiBHTF9MRVFVQUw7CiAgICBjYXNlIFdJTkVEM0RDTVBfR1JFQVRFUiAgICAgIDogcmV0dXJuIEdMX0dSRUFURVI7CiAgICBjYXNlIFdJTkVEM0RDTVBfTk9URVFVQUwgICAgIDogcmV0dXJuIEdMX05PVEVRVUFMOwogICAgY2FzZSBXSU5FRDNEQ01QX0dSRUFURVJFUVVBTCA6IHJldHVybiBHTF9HRVFVQUw7CiAgICBjYXNlIFdJTkVEM0RDTVBfQUxXQVlTICAgICAgIDogcmV0dXJuIEdMX0FMV0FZUzsKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCBXSU5FRDNEQ01QRlVOQyB2YWx1ZSAlZFxuIiwgZnVuYyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCnN0YXRpYyBHTGVudW0gZDNkdGFfdG9fY29tYmluZXJfaW5wdXQoRFdPUkQgZDNkdGEsIERXT1JEIHN0YWdlLCBJTlQgdGV4dHVyZV9pZHgpIHsKICAgIHN3aXRjaCAoZDNkdGEpIHsKICAgICAgICBjYXNlIFdJTkVEM0RUQV9ESUZGVVNFOgogICAgICAgICAgICByZXR1cm4gR0xfUFJJTUFSWV9DT0xPUl9OVjsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfQ1VSUkVOVDoKICAgICAgICAgICAgaWYgKHN0YWdlKSByZXR1cm4gR0xfU1BBUkUwX05WOwogICAgICAgICAgICBlbHNlIHJldHVybiBHTF9QUklNQVJZX0NPTE9SX05WOwoKICAgICAgICBjYXNlIFdJTkVEM0RUQV9URVhUVVJFOgogICAgICAgICAgICBpZiAodGV4dHVyZV9pZHggPiAtMSkgcmV0dXJuIEdMX1RFWFRVUkUwX0FSQiArIHRleHR1cmVfaWR4OwogICAgICAgICAgICBlbHNlIHJldHVybiBHTF9QUklNQVJZX0NPTE9SX05WOwoKICAgICAgICBjYXNlIFdJTkVEM0RUQV9URkFDVE9SOgogICAgICAgICAgICByZXR1cm4gR0xfQ09OU1RBTlRfQ09MT1IwX05WOwoKICAgICAgICBjYXNlIFdJTkVEM0RUQV9TUEVDVUxBUjoKICAgICAgICAgICAgcmV0dXJuIEdMX1NFQ09OREFSWV9DT0xPUl9OVjsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfVEVNUDoKICAgICAgICAgICAgcmV0dXJuIEdMX1NQQVJFMV9OVjsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfQ09OU1RBTlQ6CiAgICAgICAgICAgIC8qIFRPRE86IFN1cHBvcnQgcGVyIHN0YWdlIGNvbnN0YW50cyAoV0lORUQzRFRTU19DT05TVEFOVCwgTlZfcmVnaXN0ZXJfY29tYmluZXJzMikgKi8KICAgICAgICAgICAgRklYTUUoIldJTkVEM0RUQV9DT05TVEFOVCwgbm90IHByb3Blcmx5IHN1cHBvcnRlZC5cbiIpOwogICAgICAgICAgICByZXR1cm4gR0xfQ09OU1RBTlRfQ09MT1IxX05WOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIHRleHR1cmUgYXJnICUjeFxuIiwgZDNkdGEpOwogICAgICAgICAgICByZXR1cm4gR0xfVEVYVFVSRTsKICAgIH0KfQoKc3RhdGljIEdMZW51bSBpbnZlcnRfbWFwcGluZyhHTGVudW0gbWFwcGluZykgewogICAgaWYgKG1hcHBpbmcgPT0gR0xfVU5TSUdORURfSU5WRVJUX05WKSByZXR1cm4gR0xfU0lHTkVEX0lERU5USVRZX05WOwogICAgZWxzZSBpZiAobWFwcGluZyA9PSBHTF9TSUdORURfSURFTlRJVFlfTlYpIHJldHVybiBHTF9VTlNJR05FRF9JTlZFUlRfTlY7CgogICAgRklYTUUoIlVuaGFuZGxlZCBtYXBwaW5nICUjeFxuIiwgbWFwcGluZyk7CiAgICByZXR1cm4gbWFwcGluZzsKfQoKc3RhdGljIHZvaWQgZ2V0X3NyY19hbmRfb3ByX252cmMoRFdPUkQgc3RhZ2UsIERXT1JEIGFyZywgQk9PTCBpc19hbHBoYSwgR0xlbnVtKiBpbnB1dCwgR0xlbnVtKiBtYXBwaW5nLCBHTGVudW0gKmNvbXBvbmVudF91c2FnZSwgSU5UIHRleHR1cmVfaWR4KSB7CiAgICAvKiBUaGUgV0lORUQzRFRBX0NPTVBMRU1FTlQgZmxhZyBzcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIGlucHV0IHNob3VsZAogICAgICogYmUgdXNlZC4gKi8KICAgIGlmIChhcmcgJiBXSU5FRDNEVEFfQ09NUExFTUVOVCkgKm1hcHBpbmcgPSBHTF9VTlNJR05FRF9JTlZFUlRfTlY7CiAgICBlbHNlICptYXBwaW5nID0gR0xfU0lHTkVEX0lERU5USVRZX05WOwoKICAgIC8qIFRoZSBXSU5FRDNEVEFfQUxQSEFSRVBMSUNBVEUgZmxhZyBzcGVjaWZpZXMgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgaW5wdXQKICAgICAqIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgaW5wdXQgY29tcG9uZW50cy4gKi8KICAgIGlmIChpc19hbHBoYSB8fCBhcmcgJiBXSU5FRDNEVEFfQUxQSEFSRVBMSUNBVEUpICpjb21wb25lbnRfdXNhZ2UgPSBHTF9BTFBIQTsKICAgIGVsc2UgKmNvbXBvbmVudF91c2FnZSA9IEdMX1JHQjsKCiAgICAqaW5wdXQgPSBkM2R0YV90b19jb21iaW5lcl9pbnB1dChhcmcgJiBXSU5FRDNEVEFfU0VMRUNUTUFTSywgc3RhZ2UsIHRleHR1cmVfaWR4KTsKfQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgR0xlbnVtIGlucHV0WzNdOwogICAgR0xlbnVtIG1hcHBpbmdbM107CiAgICBHTGVudW0gY29tcG9uZW50X3VzYWdlWzNdOwp9IHRleF9vcF9hcmdzOwoKc3RhdGljIEJPT0wgaXNfaW52YWxpZF9vcChJV2luZUQzRERldmljZUltcGwgKlRoaXMsIGludCBzdGFnZSwgV0lORUQzRFRFWFRVUkVPUCBvcCwgRFdPUkQgYXJnMSwgRFdPUkQgYXJnMiwgRFdPUkQgYXJnMykgewogICAgaWYgKG9wID09IFdJTkVEM0RUT1BfRElTQUJMRSkgcmV0dXJuIEZBTFNFOwogICAgaWYgKFRoaXMtPnN0YXRlQmxvY2stPnRleHR1cmVzW3N0YWdlXSkgcmV0dXJuIEZBTFNFOwoKICAgIGlmICgoYXJnMSAmIFdJTkVEM0RUQV9TRUxFQ1RNQVNLKSA9PSBXSU5FRDNEVEFfVEVYVFVSRQogICAgICAgICAgICAmJiBvcCAhPSBXSU5FRDNEVE9QX1NFTEVDVEFSRzIpIHJldHVybiBUUlVFOwogICAgaWYgKChhcmcyICYgV0lORUQzRFRBX1NFTEVDVE1BU0spID09IFdJTkVEM0RUQV9URVhUVVJFCiAgICAgICAgICAgICYmIG9wICE9IFdJTkVEM0RUT1BfU0VMRUNUQVJHMSkgcmV0dXJuIFRSVUU7CiAgICBpZiAoKGFyZzMgJiBXSU5FRDNEVEFfU0VMRUNUTUFTSykgPT0gV0lORUQzRFRBX1RFWFRVUkUKICAgICAgICAgICAgJiYgKG9wID09IFdJTkVEM0RUT1BfTVVMVElQTFlBREQgfHwgb3AgPT0gV0lORUQzRFRPUF9MRVJQKSkgcmV0dXJuIFRSVUU7CgogICAgcmV0dXJuIEZBTFNFOwp9Cgp2b2lkIHNldF90ZXhfb3BfbnZyYyhJV2luZUQzRERldmljZSAqaWZhY2UsIEJPT0wgaXNfYWxwaGEsIGludCBzdGFnZSwgV0lORUQzRFRFWFRVUkVPUCBvcCwgRFdPUkQgYXJnMSwgRFdPUkQgYXJnMiwgRFdPUkQgYXJnMywgSU5UIHRleHR1cmVfaWR4LCBEV09SRCBkc3QpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqVGhpcyA9IChJV2luZUQzRERldmljZUltcGwqKWlmYWNlOwogICAgdGV4X29wX2FyZ3MgdGV4X29wX2FyZ3MgPSB7ezB9LCB7MH0sIHswfX07CiAgICBHTGVudW0gcG9ydGlvbiA9IGlzX2FscGhhID8gR0xfQUxQSEEgOiBHTF9SR0I7CiAgICBHTGVudW0gdGFyZ2V0ID0gR0xfQ09NQklORVIwX05WICsgc3RhZ2U7CiAgICBHTGVudW0gb3V0cHV0OwoKICAgIFRSQUNFKCJzdGFnZSAlZCwgaXNfYWxwaGEgJWQsIG9wICVzLCBhcmcxICUjeCwgYXJnMiAlI3gsIGFyZzMgJSN4LCB0ZXh0dXJlX2lkeCAlZFxuIiwKICAgICAgICAgICAgc3RhZ2UsIGlzX2FscGhhLCBkZWJ1Z19kM2R0b3Aob3ApLCBhcmcxLCBhcmcyLCBhcmczLCB0ZXh0dXJlX2lkeCk7CgogICAgLyogSWYgYSB0ZXh0dXJlIHN0YWdlIHJlZmVyZW5jZXMgYW4gaW52YWxpZCB0ZXh0dXJlIHVuaXQgdGhlIHN0YWdlIGp1c3QKICAgICAqIHBhc3NlcyB0aHJvdWdoIHRoZSByZXN1bHQgZnJvbSB0aGUgcHJldmlvdXMgc3RhZ2UgKi8KICAgIGlmIChpc19pbnZhbGlkX29wKFRoaXMsIHN0YWdlLCBvcCwgYXJnMSwgYXJnMiwgYXJnMykpIHsKICAgICAgICBhcmcxID0gV0lORUQzRFRBX0NVUlJFTlQ7CiAgICAgICAgb3AgPSBXSU5FRDNEVE9QX1NFTEVDVEFSRzE7CiAgICB9CgogICAgZ2V0X3NyY19hbmRfb3ByX252cmMoc3RhZ2UsIGFyZzEsIGlzX2FscGhhLCAmdGV4X29wX2FyZ3MuaW5wdXRbMF0sCiAgICAgICAgICAgICZ0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCAmdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdLCB0ZXh0dXJlX2lkeCk7CiAgICBnZXRfc3JjX2FuZF9vcHJfbnZyYyhzdGFnZSwgYXJnMiwgaXNfYWxwaGEsICZ0ZXhfb3BfYXJncy5pbnB1dFsxXSwKICAgICAgICAgICAgJnRleF9vcF9hcmdzLm1hcHBpbmdbMV0sICZ0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMV0sIHRleHR1cmVfaWR4KTsKICAgIGdldF9zcmNfYW5kX29wcl9udnJjKHN0YWdlLCBhcmczLCBpc19hbHBoYSwgJnRleF9vcF9hcmdzLmlucHV0WzJdLAogICAgICAgICAgICAmdGV4X29wX2FyZ3MubWFwcGluZ1syXSwgJnRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVsyXSwgdGV4dHVyZV9pZHgpOwoKCiAgICBpZihkc3QgPT0gV0lORUQzRFRBX1RFTVApIHsKICAgICAgICBvdXRwdXQgPSBHTF9TUEFSRTFfTlY7CiAgICB9IGVsc2UgewogICAgICAgIG91dHB1dCA9IEdMX1NQQVJFMF9OVjsKICAgIH0KCiAgICAvKiBUaGlzIGlzIGNhbGxlZCBieSBhIHN0YXRlIGhhbmRsZXIgd2hpY2ggaGFzIHRoZSBnbCBsb2NrIGhlbGQgYW5kIGEgY29udGV4dCBmb3IgdGhlIHRocmVhZCAqLwogICAgc3dpdGNoKG9wKQogICAgewogICAgICAgIGNhc2UgV0lORUQzRFRPUF9ESVNBQkxFOgogICAgICAgICAgICAvKiBPbmx5IGZvciBhbHBoYSAqLwogICAgICAgICAgICBpZiAoIWlzX2FscGhhKSBFUlIoIlNob3VsZG4ndCBiZSBjYWxsZWQgZm9yIFdJTkVEM0RUU1NfQ09MT1JPUCAoV0lORUQzRFRPUF9ESVNBQkxFKVxuIik7CiAgICAgICAgICAgIC8qIElucHV0LCBwcmV2X2FscGhhKjEgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfU1BBUkUwX05WLCBHTF9VTlNJR05FRF9JREVOVElUWV9OViwgR0xfQUxQSEEpKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0JfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBHTF9BTFBIQSkpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfU1BBUkUwX05WLCBHTF9ESVNDQVJEX05WLAogICAgICAgICAgICAgICAgICAgIEdMX0RJU0NBUkRfTlYsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9TRUxFQ1RBUkcxOgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9TRUxFQ1RBUkcyOgogICAgICAgICAgICAvKiBJbnB1dCwgYXJnKjEgKi8KICAgICAgICAgICAgaWYgKG9wID09IFdJTkVEM0RUT1BfU0VMRUNUQVJHMSkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMF0pKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0JfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBwb3J0aW9uKSk7CgogICAgICAgICAgICAvKiBPdXRwdXQgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBvdXRwdXQsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfRElTQ0FSRF9OViwgR0xfTk9ORSwgR0xfTk9ORSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFOgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURTJYOgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURTRYOgogICAgICAgICAgICAvKiBJbnB1dCwgYXJnMSphcmcyICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMF0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0JfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMV0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMV0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVsxXSkpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIGlmIChvcCA9PSBXSU5FRDNEVE9QX01PRFVMQVRFKSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJPdXRwdXROVih0YXJnZXQsIHBvcnRpb24sIG91dHB1dCwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICAgR0xfRElTQ0FSRF9OViwgR0xfTk9ORSwgR0xfTk9ORSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IFdJTkVEM0RUT1BfTU9EVUxBVEUyWCkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBvdXRwdXQsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RJU0NBUkRfTlYsIEdMX1NDQUxFX0JZX1RXT19OViwgR0xfTk9ORSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IFdJTkVEM0RUT1BfTU9EVUxBVEU0WCkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBvdXRwdXQsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RJU0NBUkRfTlYsIEdMX1NDQUxFX0JZX0ZPVVJfTlYsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERDoKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQUREU0lHTkVEOgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTSUdORUQyWDoKICAgICAgICAgICAgLyogSW5wdXQsIGFyZzEqMSthcmcyKjEgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMF0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVswXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICBHTF9aRVJPLCBHTF9VTlNJR05FRF9JTlZFUlRfTlYsIHBvcnRpb24pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0NfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMV0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMV0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVsxXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfRF9OViwKICAgICAgICAgICAgICAgICAgICBHTF9aRVJPLCBHTF9VTlNJR05FRF9JTlZFUlRfTlYsIHBvcnRpb24pKTsKCiAgICAgICAgICAgIC8qIE91dHB1dCAqLwogICAgICAgICAgICBpZiAob3AgPT0gV0lORUQzRFRPUF9BREQpIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBHTF9OT05FLCBHTF9OT05FLCBHTF9GQUxTRSwgR0xfRkFMU0UsIEdMX0ZBTFNFKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gV0lORUQzRFRPUF9BRERTSUdORUQpIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBHTF9OT05FLCBHTF9CSUFTX0JZX05FR0FUSVZFX09ORV9IQUxGX05WLCBHTF9GQUxTRSwgR0xfRkFMU0UsIEdMX0ZBTFNFKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gV0lORUQzRFRPUF9BRERTSUdORUQyWCkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9ESVNDQVJEX05WLCBHTF9ESVNDQVJEX05WLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX1NDQUxFX0JZX1RXT19OViwgR0xfQklBU19CWV9ORUdBVElWRV9PTkVfSEFMRl9OViwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU1VCVFJBQ1Q6CiAgICAgICAgICAgIC8qIElucHV0LCBhcmcxKjErLWFyZzIqMSAqLwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQV9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFswXSwgdGV4X29wX2FyZ3MubWFwcGluZ1swXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9CX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQ19OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgR0xfU0lHTkVEX05FR0FURV9OViwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTTU9PVEg6CiAgICAgICAgICAgIC8qIElucHV0LCBhcmcxKjErKDEtYXJnMSkqYXJnMiAqLwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQV9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFswXSwgdGV4X29wX2FyZ3MubWFwcGluZ1swXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9CX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQ19OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFswXSwgaW52ZXJ0X21hcHBpbmcodGV4X29wX2FyZ3MubWFwcGluZ1swXSksIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVswXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfRF9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CgogICAgICAgICAgICAvKiBPdXRwdXQgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9ESVNDQVJEX05WLCBHTF9ESVNDQVJEX05WLAogICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgR0xfTk9ORSwgR0xfTk9ORSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQToKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6CiAgICAgICAgewogICAgICAgICAgICBHTGVudW0gYWxwaGFfc3JjID0gR0xfUFJJTUFSWV9DT0xPUl9OVjsKICAgICAgICAgICAgaWYgKG9wID09IFdJTkVEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEEpIGFscGhhX3NyYyA9IGQzZHRhX3RvX2NvbWJpbmVyX2lucHV0KFdJTkVEM0RUQV9ESUZGVVNFLCBzdGFnZSwgdGV4dHVyZV9pZHgpOwogICAgICAgICAgICBlbHNlIGlmIChvcCA9PSBXSU5FRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBKSBhbHBoYV9zcmMgPSBkM2R0YV90b19jb21iaW5lcl9pbnB1dChXSU5FRDNEVEFfVEVYVFVSRSwgc3RhZ2UsIHRleHR1cmVfaWR4KTsKICAgICAgICAgICAgZWxzZSBpZiAob3AgPT0gV0lORUQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBKSBhbHBoYV9zcmMgPSBkM2R0YV90b19jb21iaW5lcl9pbnB1dChXSU5FRDNEVEFfVEZBQ1RPUiwgc3RhZ2UsIHRleHR1cmVfaWR4KTsKICAgICAgICAgICAgZWxzZSBpZiAob3AgPT0gV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNKSBhbHBoYV9zcmMgPSBkM2R0YV90b19jb21iaW5lcl9pbnB1dChXSU5FRDNEVEFfVEVYVFVSRSwgc3RhZ2UsIHRleHR1cmVfaWR4KTsKICAgICAgICAgICAgZWxzZSBpZiAob3AgPT0gV0lORUQzRFRPUF9CTEVORENVUlJFTlRBTFBIQSkgYWxwaGFfc3JjID0gZDNkdGFfdG9fY29tYmluZXJfaW5wdXQoV0lORUQzRFRBX0NVUlJFTlQsIHN0YWdlLCB0ZXh0dXJlX2lkeCk7CiAgICAgICAgICAgIGVsc2UgRklYTUUoIlVuaGFuZGxlZCBXSU5FRDNEVE9QICVzLCBzaG91bGRuJ3QgaGFwcGVuXG4iLCBkZWJ1Z19kM2R0b3Aob3ApKTsKCiAgICAgICAgICAgIC8qIElucHV0LCBhcmcxKmFscGhhX3NyYythcmcyKigxLWFscGhhX3NyYykgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMF0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVswXSkpOwogICAgICAgICAgICBpZiAob3AgPT0gV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBwb3J0aW9uKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfc3JjLCBHTF9VTlNJR05FRF9JREVOVElUWV9OViwgR0xfQUxQSEEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQ19OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIGFscGhhX3NyYywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBHTF9BTFBIQSkpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKICAgICAgICAgICAgLyogSW5wdXQsIGFyZzFfYWxwaGEqYXJnMl9yZ2IrYXJnMV9yZ2IqMSAqLwogICAgICAgICAgICBpZiAoaXNfYWxwaGEpIEVSUigiT25seSBzdXBwb3J0ZWQgZm9yIFdJTkVEM0RUU1NfQ09MT1JPUCAoV0lORUQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SKVxuIik7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCBHTF9BTFBIQSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9DX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMF0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0RfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBwb3J0aW9uKSk7CgogICAgICAgICAgICAvKiBPdXRwdXQgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9ESVNDQVJEX05WLCBHTF9ESVNDQVJEX05WLAogICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgR0xfTk9ORSwgR0xfTk9ORSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CiAgICAgICAgICAgIC8qIElucHV0LCBhcmcxX3JnYiphcmcyX3JnYithcmcxX2FscGhhKjEgKi8KICAgICAgICAgICAgaWYgKGlzX2FscGhhKSBFUlIoIk9ubHkgc3VwcG9ydGVkIGZvciBXSU5FRDNEVFNTX0NPTE9ST1AgKFdJTkVEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSlcbiIpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQV9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFswXSwgdGV4X29wX2FyZ3MubWFwcGluZ1swXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9CX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzFdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzFdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMV0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0NfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMF0sIEdMX0FMUEhBKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgogICAgICAgICAgICAvKiBJbnB1dCwgKDEtYXJnMV9hbHBoYSkqYXJnMl9yZ2IrYXJnMV9yZ2IqMSAqLwogICAgICAgICAgICBpZiAoaXNfYWxwaGEpIEVSUigiT25seSBzdXBwb3J0ZWQgZm9yIFdJTkVEM0RUU1NfQ09MT1JPUCAoV0lORUQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SKVxuIik7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCBpbnZlcnRfbWFwcGluZyh0ZXhfb3BfYXJncy5tYXBwaW5nWzBdKSwgR0xfQUxQSEEpKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0JfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMV0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMV0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVsxXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQ19OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFswXSwgdGV4X29wX2FyZ3MubWFwcGluZ1swXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICAvKiBJbnB1dCwgKDEtYXJnMV9yZ2IpKmFyZzJfcmdiK2FyZzFfYWxwaGEqMSAqLwogICAgICAgICAgICBpZiAoaXNfYWxwaGEpIEVSUigiT25seSBzdXBwb3J0ZWQgZm9yIFdJTkVEM0RUU1NfQ09MT1JPUCAoV0lORUQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKVxuIik7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCBpbnZlcnRfbWFwcGluZyh0ZXhfb3BfYXJncy5tYXBwaW5nWzBdKSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9CX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzFdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzFdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMV0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0NfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMF0sIEdMX0FMUEhBKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIEdMX1pFUk8sIEdMX1VOU0lHTkVEX0lOVkVSVF9OViwgcG9ydGlvbikpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9ET1RQUk9EVUNUMzoKICAgICAgICAgICAgLyogSW5wdXQsIGFyZzEgLiBhcmcyICovCiAgICAgICAgICAgIC8qIEZJWE1FOiBEWDcgdXNlcyBhIGRpZmZlcmVudCBjYWxjdWxhdGlvbj8gKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIEdMX0VYUEFORF9OT1JNQUxfTlYsIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVswXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgR0xfRVhQQU5EX05PUk1BTF9OViwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CgogICAgICAgICAgICAvKiBPdXRwdXQgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBvdXRwdXQsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfRElTQ0FSRF9OViwgR0xfTk9ORSwgR0xfTk9ORSwgR0xfVFJVRSwgR0xfRkFMU0UsIEdMX0ZBTFNFKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTVVMVElQTFlBREQ6CiAgICAgICAgICAgIC8qIElucHV0LCBhcmcxKjErYXJnMiphcmczICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzBdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMF0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0JfTlYsCiAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBwb3J0aW9uKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9DX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzFdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzFdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMV0pKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0RfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMl0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMl0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVsyXSkpOwoKICAgICAgICAgICAgLyogT3V0cHV0ICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lck91dHB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfRElTQ0FSRF9OViwgR0xfRElTQ0FSRF9OViwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRPUF9MRVJQOgogICAgICAgICAgICAvKiBJbnB1dCwgYXJnMSphcmcyKygxLWFyZzEpKmFyZzMgKi8KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVySW5wdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX1ZBUklBQkxFX0FfTlYsCiAgICAgICAgICAgICAgICAgICAgdGV4X29wX2FyZ3MuaW5wdXRbMF0sIHRleF9vcF9hcmdzLm1hcHBpbmdbMF0sIHRleF9vcF9hcmdzLmNvbXBvbmVudF91c2FnZVswXSkpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9DX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzBdLCBpbnZlcnRfbWFwcGluZyh0ZXhfb3BfYXJncy5tYXBwaW5nWzBdKSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzBdKSk7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9EX05WLAogICAgICAgICAgICAgICAgICAgIHRleF9vcF9hcmdzLmlucHV0WzJdLCB0ZXhfb3BfYXJncy5tYXBwaW5nWzJdLCB0ZXhfb3BfYXJncy5jb21wb25lbnRfdXNhZ2VbMl0pKTsKCiAgICAgICAgICAgIC8qIE91dHB1dCAqLwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJPdXRwdXROVih0YXJnZXQsIHBvcnRpb24sIEdMX0RJU0NBUkRfTlYsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBHTF9OT05FLCBHTF9OT05FLCBHTF9GQUxTRSwgR0xfRkFMU0UsIEdMX0ZBTFNFKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRToKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQlVNUEVOVk1BUDoKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUikpIHsKICAgICAgICAgICAgICAgIC8qIFRoZSBidW1wIG1hcCBzdGFnZSBpdHNlbGYgaXNuJ3QgZXhjaXRpbmcsIGp1c3QgcmVhZCB0aGUgdGV4dHVyZS4gQnV0IHRlbGwgdGhlIG5leHQgc3RhZ2UgdG8KICAgICAgICAgICAgICAgICAqIHBlcmZvcm0gYnVtcCBtYXBwaW5nIGFuZCBzb3VyY2UgZnJvbSB0aGUgY3VycmVudCBzdGFnZS4gUHJldHR5IG11Y2ggYSBTRUxFQ1RBUkcyLgogICAgICAgICAgICAgICAgICogQVJHMiBpcyBwYXNzZWQgdGhyb3VnaCB1bm1vZGlmaWVkKGFwcHMgd2lsbCBtb3N0IGxpa2VseSB1c2UgRDNEVEFfQ1VSUkVOVCBmb3IgYXJnMiwgYXJnMQogICAgICAgICAgICAgICAgICogKHdoaWNoIHdpbGwgbW9zdCBsaWtlbHkgYmUgRDNEVEFfVEVYVFVSRSkgaXMgYXZhaWxhYmxlIGFzIGEgdGV4dHVyZSBzaGFkZXIgaW5wdXQgZm9yIHRoZSBuZXh0IHN0YWdlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb21iaW5lcklucHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9WQVJJQUJMRV9BX05WLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXhfb3BfYXJncy5pbnB1dFsxXSwgdGV4X29wX2FyZ3MubWFwcGluZ1sxXSwgdGV4X29wX2FyZ3MuY29tcG9uZW50X3VzYWdlWzFdKSk7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29tYmluZXJJbnB1dE5WKHRhcmdldCwgcG9ydGlvbiwgR0xfVkFSSUFCTEVfQl9OViwKICAgICAgICAgICAgICAgICAgICAgICAgR0xfWkVSTywgR0xfVU5TSUdORURfSU5WRVJUX05WLCBwb3J0aW9uKSk7CiAgICAgICAgICAgICAgICAvKiBBbHdheXMgcGFzcyB0aHJvdWdoIHRvIENVUlJFTlQsIGlnbm9yZSB0ZW1wIGFyZyAqLwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyT3V0cHV0TlYodGFyZ2V0LCBwb3J0aW9uLCBHTF9TUEFSRTBfTlYsIEdMX0RJU0NBUkRfTlYsCiAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RJU0NBUkRfTlYsIEdMX05PTkUsIEdMX05PTkUsIEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbmhhbmRsZWQgV0lORUQzRFRPUDogc3RhZ2UgJWQsIGlzX2FscGhhICVkLCBvcCAlcyAoJSN4KSwgYXJnMSAlI3gsIGFyZzIgJSN4LCBhcmczICUjeCwgdGV4dHVyZV9pZHggJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RhZ2UsIGlzX2FscGhhLCBkZWJ1Z19kM2R0b3Aob3ApLCBvcCwgYXJnMSwgYXJnMiwgYXJnMywgdGV4dHVyZV9pZHgpOwogICAgfQoKICAgIGNoZWNrR0xjYWxsKCJzZXRfdGV4X29wX252cmMoKVxuIik7Cgp9CgpzdGF0aWMgdm9pZCBnZXRfc3JjX2FuZF9vcHIoRFdPUkQgYXJnLCBCT09MIGlzX2FscGhhLCBHTGVudW0qIHNvdXJjZSwgR0xlbnVtKiBvcGVyYW5kKSB7CiAgICAvKiBUaGUgV0lORUQzRFRBX0FMUEhBUkVQTElDQVRFIGZsYWcgc3BlY2lmaWVzIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlCiAgICAgKiBpbnB1dCBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGlucHV0IGNvbXBvbmVudHMuIFRoZSBXSU5FRDNEVEFfQ09NUExFTUVOVAogICAgICogZmxhZyBzcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIGlucHV0IHNob3VsZCBiZSB1c2VkLiAqLwogICAgQk9PTCBmcm9tX2FscGhhID0gaXNfYWxwaGEgfHwgYXJnICYgV0lORUQzRFRBX0FMUEhBUkVQTElDQVRFOwogICAgQk9PTCBjb21wbGVtZW50ID0gYXJnICYgV0lORUQzRFRBX0NPTVBMRU1FTlQ7CgogICAgLyogQ2FsY3VsYXRlIHRoZSBvcGVyYW5kICovCiAgICBpZiAoY29tcGxlbWVudCkgewogICAgICAgIGlmIChmcm9tX2FscGhhKSAqb3BlcmFuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgZWxzZSAqb3BlcmFuZCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChmcm9tX2FscGhhKSAqb3BlcmFuZCA9IEdMX1NSQ19BTFBIQTsKICAgICAgICBlbHNlICpvcGVyYW5kID0gR0xfU1JDX0NPTE9SOwogICAgfQoKICAgIC8qIENhbGN1bGF0ZSB0aGUgc291cmNlICovCiAgICBzd2l0Y2ggKGFyZyAmIFdJTkVEM0RUQV9TRUxFQ1RNQVNLKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEVEFfQ1VSUkVOVDogKnNvdXJjZSA9IEdMX1BSRVZJT1VTX0VYVDsgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVEFfRElGRlVTRTogKnNvdXJjZSA9IEdMX1BSSU1BUllfQ09MT1JfRVhUOyBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUQV9URVhUVVJFOiAqc291cmNlID0gR0xfVEVYVFVSRTsgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVEFfVEZBQ1RPUjogKnNvdXJjZSA9IEdMX0NPTlNUQU5UX0VYVDsgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVEFfU1BFQ1VMQVI6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEFjY29yZGluZyB0byB0aGUgR0xfQVJCX3RleHR1cmVfZW52X2NvbWJpbmUgc3BlY3MsIFNQRUNVTEFSIGlzCiAgICAgICAgICAgICAqICdTZWNvbmRhcnkgY29sb3InIGFuZCBpc24ndCBzdXBwb3J0ZWQgdW50aWwgYmFzZSBHTCBzdXBwb3J0cyBpdAogICAgICAgICAgICAgKiBUaGVyZSBpcyBubyBjb25jZXB0IG9mIHRlbXAgcmVnaXN0ZXJzIGFzIGZhciBhcyBJIGNhbiB0ZWxsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBGSVhNRSgiVW5oYW5kbGVkIHRleHR1cmUgYXJnIFdJTkVEM0RUQV9TUEVDVUxBUlxuIik7CiAgICAgICAgICAgICpzb3VyY2UgPSBHTF9URVhUVVJFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIHRleHR1cmUgYXJnICUjeFxuIiwgYXJnKTsKICAgICAgICAgICAgKnNvdXJjZSA9IEdMX1RFWFRVUkU7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgovKiBTZXQgdGV4dHVyZSBvcGVyYXRpb25zIHVwIC0gVGhlIGZvbGxvd2luZyBhdm9pZHMgbG90cyBvZiBpZmRlZnMgaW4gdGhpcyByb3V0aW5lISovCiNpZiBkZWZpbmVkIChHTF9WRVJTSU9OXzFfMykKIyBkZWZpbmUgdXNlZXh0KEEpIEEKIyBkZWZpbmUgY29tYmluZV9leHQgMQojZWxpZiBkZWZpbmVkIChHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSkKIyBkZWZpbmUgdXNlZXh0KEEpIEEjI19FWFQKIyBkZWZpbmUgY29tYmluZV9leHQgMQojZWxpZiBkZWZpbmVkIChHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZSkKIyBkZWZpbmUgdXNlZXh0KEEpIEEjI19BUkIKIyBkZWZpbmUgY29tYmluZV9leHQgMQojZWxzZQojIHVuZGVmIGNvbWJpbmVfZXh0CiNlbmRpZgoKI2lmICFkZWZpbmVkKGNvbWJpbmVfZXh0KQp2b2lkIHNldF90ZXhfb3AoSVdpbmVEM0REZXZpY2UgKmlmYWNlLCBCT09MIGlzQWxwaGEsIGludCBTdGFnZSwgV0lORUQzRFRFWFRVUkVPUCBvcCwgRFdPUkQgYXJnMSwgRFdPUkQgYXJnMiwgRFdPUkQgYXJnMykKewogICAgICAgIEZJWE1FKCJSZXF1aXJlcyBvcGVuZ2wgY29tYmluZSBleHRlbnNpb25zIHRvIHdvcmtcbiIpOwogICAgICAgIHJldHVybjsKfQojZWxzZQovKiBTZXR1cCB0aGUgdGV4dHVyZSBvcGVyYXRpb25zIHRleHR1cmUgc3RhZ2Ugc3RhdGVzICovCnZvaWQgc2V0X3RleF9vcChJV2luZUQzRERldmljZSAqaWZhY2UsIEJPT0wgaXNBbHBoYSwgaW50IFN0YWdlLCBXSU5FRDNEVEVYVFVSRU9QIG9wLCBEV09SRCBhcmcxLCBEV09SRCBhcmcyLCBEV09SRCBhcmczKQp7CiAgICAgICAgR0xlbnVtIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgICAgR0xlbnVtIG9wcjEsIG9wcjIsIG9wcjM7CiAgICAgICAgR0xlbnVtIGNvbWJfdGFyZ2V0OwogICAgICAgIEdMZW51bSBzcmMwX3RhcmdldCwgc3JjMV90YXJnZXQsIHNyYzJfdGFyZ2V0OwogICAgICAgIEdMZW51bSBvcHIwX3RhcmdldCwgb3ByMV90YXJnZXQsIG9wcjJfdGFyZ2V0OwogICAgICAgIEdMZW51bSBzY2FsX3RhcmdldDsKICAgICAgICBHTGVudW0gb3ByPTAsIGludm9wciwgc3JjM190YXJnZXQsIG9wcjNfdGFyZ2V0OwogICAgICAgIEJPT0wgSGFuZGxlZCA9IEZBTFNFOwogICAgICAgIElXaW5lRDNERGV2aWNlSW1wbCAqVGhpcyA9IChJV2luZUQzRERldmljZUltcGwgKilpZmFjZTsKCiAgICAgICAgVFJBQ0UoIkFscGhhPyglZCksIFN0YWdlOiVkIE9wKCVzKSwgYTEoJWQpLCBhMiglZCksIGEzKCVkKVxuIiwgaXNBbHBoYSwgU3RhZ2UsIGRlYnVnX2QzZHRvcChvcCksIGFyZzEsIGFyZzIsIGFyZzMpOwoKICAgICAgICAvKiBUaGlzIGlzIGNhbGxlZCBieSBhIHN0YXRlIGhhbmRsZXIgd2hpY2ggaGFzIHRoZSBnbCBsb2NrIGhlbGQgYW5kIGEgY29udGV4dCBmb3IgdGhlIHRocmVhZCAqLwoKICAgICAgICAvKiBOb3RlOiBPcGVyYXRpb25zIHVzdWFsbHkgaW52b2x2ZSB0d28gYXJzLCBzcmMwIGFuZCBzcmMxIGFuZCBhcmUgb3BlcmF0aW9ucyBvZgogICAgICAgICAgIHRoZSBmb3JtIChhMSA8b3BlcmF0aW9uPiBhMikuIEhvd2V2ZXIsIHNvbWUgb2YgdGhlIG1vcmUgY29tcGxleCBvcGVyYXRpb25zCiAgICAgICAgICAgdGFrZSAzIHBhcmFtZXRlcnMuIEluc3RlYWQgb2YgdGhlIChzZW5zaWJsZSkgYWRkaXRpb24gb2YgYTMsIE1pY3Jvc29mdCBhZGRlZAogICAgICAgICAgIGluIGEgdGhpcmQgcGFyYW1ldGVyIGNhbGxlZCBhMC4gVGhlcmVmb3JlIHRoZXNlIGFyZSBvcGVyYXRpb25zIG9mIHRoZSBmb3JtCiAgICAgICAgICAgYTAgPG9wZXJhdGlvbj4gYTEgPG9wZXJhdGlvbj4gYTIsIGkuZS4sIHRoZSBuZXcgcGFyYW1ldGVyIGdvZXMgdG8gdGhlIGZyb250LgoKICAgICAgICAgICBIb3dldmVyLCBiZWxvdyB3ZSB0cmVhdCB0aGUgbmV3IChhMCkgcGFyYW1ldGVyIGFzIHNyYzIvb3ByMiwgc28gaW4gdGhlIGFjdHVhbAogICAgICAgICAgIGZ1bmN0aW9ucyBiZWxvdywgZXhwZWN0IHRoZWlyIHN5bnRheCB0byBkaWZmZXIgc2xpZ2h0bHkgdG8gdGhvc2UgbGlzdGVkIGluIHRoZQogICAgICAgICAgIG1hbnVhbHMsIGkuZS4sIHJlcGxhY2UgYXJnMSB3aXRoIGFyZzMsIGFyZzIgd2l0aCBhcmcxIGFuZCBhcmczIHdpdGggYXJnMgogICAgICAgICAgIFRoaXMgYWZmZWN0cyBXSU5FRDNEVE9QX01VTFRJUExZQUREIGFuZCBXSU5FRDNEVE9QX0xFUlAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICBpZiAoaXNBbHBoYSkgewogICAgICAgICAgICAgICAgY29tYl90YXJnZXQgPSB1c2VleHQoR0xfQ09NQklORV9BTFBIQSk7CiAgICAgICAgICAgICAgICBzcmMwX3RhcmdldCA9IHVzZWV4dChHTF9TT1VSQ0UwX0FMUEhBKTsKICAgICAgICAgICAgICAgIHNyYzFfdGFyZ2V0ID0gdXNlZXh0KEdMX1NPVVJDRTFfQUxQSEEpOwogICAgICAgICAgICAgICAgc3JjMl90YXJnZXQgPSB1c2VleHQoR0xfU09VUkNFMl9BTFBIQSk7CiAgICAgICAgICAgICAgICBvcHIwX3RhcmdldCA9IHVzZWV4dChHTF9PUEVSQU5EMF9BTFBIQSk7CiAgICAgICAgICAgICAgICBvcHIxX3RhcmdldCA9IHVzZWV4dChHTF9PUEVSQU5EMV9BTFBIQSk7CiAgICAgICAgICAgICAgICBvcHIyX3RhcmdldCA9IHVzZWV4dChHTF9PUEVSQU5EMl9BTFBIQSk7CiAgICAgICAgICAgICAgICBzY2FsX3RhcmdldCA9IEdMX0FMUEhBX1NDQUxFOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbWJfdGFyZ2V0ID0gdXNlZXh0KEdMX0NPTUJJTkVfUkdCKTsKICAgICAgICAgICAgICAgIHNyYzBfdGFyZ2V0ID0gdXNlZXh0KEdMX1NPVVJDRTBfUkdCKTsKICAgICAgICAgICAgICAgIHNyYzFfdGFyZ2V0ID0gdXNlZXh0KEdMX1NPVVJDRTFfUkdCKTsKICAgICAgICAgICAgICAgIHNyYzJfdGFyZ2V0ID0gdXNlZXh0KEdMX1NPVVJDRTJfUkdCKTsKICAgICAgICAgICAgICAgIG9wcjBfdGFyZ2V0ID0gdXNlZXh0KEdMX09QRVJBTkQwX1JHQik7CiAgICAgICAgICAgICAgICBvcHIxX3RhcmdldCA9IHVzZWV4dChHTF9PUEVSQU5EMV9SR0IpOwogICAgICAgICAgICAgICAgb3ByMl90YXJnZXQgPSB1c2VleHQoR0xfT1BFUkFORDJfUkdCKTsKICAgICAgICAgICAgICAgIHNjYWxfdGFyZ2V0ID0gdXNlZXh0KEdMX1JHQl9TQ0FMRSk7CiAgICAgICAgfQoKICAgICAgICAvKiBJZiBhIHRleHR1cmUgc3RhZ2UgcmVmZXJlbmNlcyBhbiBpbnZhbGlkIHRleHR1cmUgdW5pdCB0aGUgc3RhZ2UganVzdAogICAgICAgICAqIHBhc3NlcyB0aHJvdWdoIHRoZSByZXN1bHQgZnJvbSB0aGUgcHJldmlvdXMgc3RhZ2UgKi8KICAgICAgICBpZiAoaXNfaW52YWxpZF9vcChUaGlzLCBTdGFnZSwgb3AsIGFyZzEsIGFyZzIsIGFyZzMpKSB7CiAgICAgICAgICAgIGFyZzEgPSBXSU5FRDNEVEFfQ1VSUkVOVDsKICAgICAgICAgICAgb3AgPSBXSU5FRDNEVE9QX1NFTEVDVEFSRzE7CiAgICAgICAgfQoKICAgICAgICAvKiBGcm9tIE1TRE4gKFdJTkVEM0RUU1NfQUxQSEFBUkcxKSA6CiAgICAgICAgICAgVGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgV0lORUQzRFRBX1RFWFRVUkUuIElmIG5vIHRleHR1cmUgaXMgc2V0IGZvciB0aGlzIHN0YWdlLAogICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBXSU5FRDNEVEFfRElGRlVTRS4KICAgICAgICAgICAgICAgICAgIEZJWE1FPyBJZiB0ZXh0dXJlIGFkZGVkL3JlbW92ZWQsIG1heSBuZWVkIHRvIHJlc2V0IGJhY2sgYXMgd2VsbD8gICAgKi8KICAgICAgICBpZiAoaXNBbHBoYSAmJiBUaGlzLT5zdGF0ZUJsb2NrLT50ZXh0dXJlc1tTdGFnZV0gPT0gTlVMTCAmJiBhcmcxID09IFdJTkVEM0RUQV9URVhUVVJFKSB7CiAgICAgICAgICAgIGdldF9zcmNfYW5kX29wcihXSU5FRDNEVEFfRElGRlVTRSwgaXNBbHBoYSwgJnNyYzEsICZvcHIxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRfc3JjX2FuZF9vcHIoYXJnMSwgaXNBbHBoYSwgJnNyYzEsICZvcHIxKTsKICAgICAgICB9CiAgICAgICAgZ2V0X3NyY19hbmRfb3ByKGFyZzIsIGlzQWxwaGEsICZzcmMyLCAmb3ByMik7CiAgICAgICAgZ2V0X3NyY19hbmRfb3ByKGFyZzMsIGlzQWxwaGEsICZzcmMzLCAmb3ByMyk7CgogICAgICAgIFRSQUNFKCJjdCgleCksIDE6KCV4LCV4KSwgMjooJXgsJXgpLCAzOigleCwleClcbiIsIGNvbWJfdGFyZ2V0LCBzcmMxLCBvcHIxLCBzcmMyLCBvcHIyLCBzcmMzLCBvcHIzKTsKCiAgICAgICAgSGFuZGxlZCA9IFRSVUU7IC8qIEFzc3VtZSB3aWxsIGJlIGhhbmRsZWQgKi8KCiAgICAgICAgLyogT3RoZXIgdGV4dHVyZSBvcGVyYXRpb25zIHJlcXVpcmUgc3BlY2lhbCBleHRlbnNpb25zOiAqLwogICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX1RFWFRVUkVfRU5WX0NPTUJJTkU0KSkgewogICAgICAgICAgaWYgKGlzQWxwaGEpIHsKICAgICAgICAgICAgb3ByID0gR0xfU1JDX0FMUEhBOwogICAgICAgICAgICBpbnZvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOwogICAgICAgICAgICBzcmMzX3RhcmdldCA9IEdMX1NPVVJDRTNfQUxQSEFfTlY7CiAgICAgICAgICAgIG9wcjNfdGFyZ2V0ID0gR0xfT1BFUkFORDNfQUxQSEFfTlY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcHIgPSBHTF9TUkNfQ09MT1I7CiAgICAgICAgICAgIGludm9wciA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CiAgICAgICAgICAgIHNyYzNfdGFyZ2V0ID0gR0xfU09VUkNFM19SR0JfTlY7CiAgICAgICAgICAgIG9wcjNfdGFyZ2V0ID0gR0xfT1BFUkFORDNfUkdCX05WOwogICAgICAgICAgfQogICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0RJU0FCTEU6IC8qIE9ubHkgZm9yIGFscGhhICovCiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX1JFUExBQ0UiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgR0xfUFJFVklPVVNfRVhUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBHTF9TUkNfQUxQSEEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX1NFTEVDVEFSRzE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPSBhMSAqIDEgKyAwICogMCAqLwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX1NFTEVDVEFSRzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPSBhMiAqIDEgKyAwICogMCAqLwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQiKTsKICAgICAgICAgICAgaWYgKG9wID09IFdJTkVEM0RUT1BfU0VMRUNUQVJHMSkgewogICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIG9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIG9wciIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEU6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOyAvKiBBZGQgPSBhMCphMSArIGEyKmEzICovCiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFMlg6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOyAvKiBBZGQgPSBhMCphMSArIGEyKmEzICovCiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAyIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFNFg6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOyAvKiBBZGQgPSBhMCphMSArIGEyKmEzICovCiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCA0Iik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9BREQ6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTSUdORUQ6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9BRERfU0lHTkVEKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9BRERfU0lHTkVEKSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTSUdORUQyWDoKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgdXNlZXh0KEdMX0FERF9TSUdORUQpKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgdXNlZXh0KEdMX0FERF9TSUdORUQpIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBpbnZvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDIiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNNT09USDoKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7IGJyZWFrOwogICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19DT0xPUjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIG9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIG9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEE6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCB1c2VleHQoR0xfUFJJTUFSWV9DT0xPUikpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCB1c2VleHQoR0xfUFJJTUFSWV9DT0xPUikiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIHVzZWV4dChHTF9QUklNQVJZX0NPTE9SKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIHVzZWV4dChHTF9QUklNQVJZX0NPTE9SKSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQToKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1RFWFRVUkUpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9URVhUVVJFIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9URVhUVVJFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfVEVYVFVSRSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBOgogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgdXNlZXh0KEdMX0NPTlNUQU5UKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHVzZWV4dChHTF9DT05TVEFOVCkiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIHVzZWV4dChHTF9DT05TVEFOVCkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCB1c2VleHQoR0xfQ09OU1RBTlQpIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBUE06CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBpbnZvcHIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgR0xfVEVYVFVSRSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1RFWFRVUkUiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREIik7ICAvKiBBZGQgPSBhMCphMSArIGEyKmEzICovCiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOyAgICAgICAgLyogICBhMCA9IHNyYzEvb3ByMSAgICAqLwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7ICAgIC8qICAgYTEgPSAxIChzZWUgZG9jcykgKi8KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIpOyAgICAgICAgLyogICBhMiA9IGFyZzIgICAgICAgICAqLwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyIik7ICAgICAvKiAgYTMgPSBzcmMxIGFscGhhICAgKi8KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgc3dpdGNoIChvcHIpIHsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9BREQiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgR0xfWkVSTyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8iKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgaW52b3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIHNyYzEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIHN3aXRjaCAob3ByMSkgewogICAgICAgICAgICBjYXNlIEdMX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQUxQSEE6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7IGJyZWFrOwogICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19DT0xPUjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjM190YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByM190YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NVUxUSVBMWUFERDoKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzMpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjMpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIEdMX1pFUk8pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBHTF9aRVJPIik7CiAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wcik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIGludm9wciIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzNfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMzX3RhcmdldCwgc3JjMyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjNfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIzX3RhcmdldCwgb3ByMyIpOwogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQlVNUEVOVk1BUDoKICAgICAgICAgICAgewogICAgICAgICAgICB9CgogICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0U6CiAgICAgICAgICAgICAgICBGSVhNRSgiSW1wbGVtZW50IGJ1bXAgZW52aXJvbm1lbnQgbWFwcGluZyBpbiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCBwYXRoXG4iKTsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBIYW5kbGVkID0gRkFMU0U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoSGFuZGxlZCkgewogICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkU0X05WKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9DT01CSU5FNF9OViIpOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0gLyogR0xfTlZfdGV4dHVyZV9lbnZfY29tYmluZTQgKi8KCiAgICAgICAgSGFuZGxlZCA9IFRSVUU7IC8qIEFnYWluLCBhc3N1bWUgaGFuZGxlZCAqLwogICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfRElTQUJMRTogLyogT25seSBmb3IgYWxwaGEgKi8KICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX1JFUExBQ0UpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfUkVQTEFDRSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgR0xfUFJFVklPVVNfRVhUKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIEdMX1BSRVZJT1VTX0VYVCIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgR0xfU1JDX0FMUEhBKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIEdMX1NSQ19BTFBIQSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU0VMRUNUQVJHMToKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX1JFUExBQ0UpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfUkVQTEFDRSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX1NFTEVDVEFSRzI6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9SRVBMQUNFKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX1JFUExBQ0UiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURToKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX01PRFVMQVRFKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX01PRFVMQVRFIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFMlg6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURTRYOgogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEUpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEUiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgNCk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCA0Iik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQUREOgogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQUREKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0FERCIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTSUdORUQ6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfQUREX1NJR05FRCkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgdXNlZXh0KChHTF9BRERfU0lHTkVEKSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9BRERTSUdORUQyWDoKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9BRERfU0lHTkVEKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfQUREX1NJR05FRCkiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAyIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU1VCVFJBQ1Q6CiAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9FTlZfQ09NQklORSkpIHsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX1NVQlRSQUNUKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9TVUJUUkFDVCkiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgRklYTUUoIlRoaXMgdmVyc2lvbiBvZiBvcGVuZ2wgZG9lcyBub3Qgc3VwcG9ydCBHTF9TVUJUUkFDVFxuIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgdXNlZXh0KEdMX0lOVEVSUE9MQVRFKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfSU5URVJQT0xBVEUpIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHVzZWV4dChHTF9QUklNQVJZX0NPTE9SKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBHTF9QUklNQVJZX0NPTE9SIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBHTF9TUkNfQUxQSEEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgR0xfU1JDX0FMUEhBIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQToKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9JTlRFUlBPTEFURSkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgdXNlZXh0KEdMX0lOVEVSUE9MQVRFKSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBHTF9URVhUVVJFKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIEdMX1RFWFRVUkUiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIEdMX1NSQ19BTFBIQSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBHTF9TUkNfQUxQSEEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEE6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfSU5URVJQT0xBVEUpKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9JTlRFUlBPTEFURSkiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgdXNlZXh0KEdMX0NPTlNUQU5UKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBHTF9DT05TVEFOVCIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgR0xfU1JDX0FMUEhBKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIEdMX1NSQ19BTFBIQSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfSU5URVJQT0xBVEUpKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9JTlRFUlBPTEFURSkiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgdXNlZXh0KEdMX1BSRVZJT1VTKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBHTF9QUkVWSU9VUyIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgR0xfU1JDX0FMUEhBKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIEdMX1NSQ19BTFBIQSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfRE9UUFJPRFVDVDM6CiAgICAgICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9FTlZfRE9UMykpIHsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfRE9UM19SR0JBX0FSQik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0RPVDNfUkdCQV9BUkIiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9FTlZfRE9UMykpIHsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfRE9UM19SR0JBX0VYVCk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX0RPVDNfUkdCQV9FWFQiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIEZJWE1FKCJUaGlzIHZlcnNpb24gb2Ygb3BlbmdsIGRvZXMgbm90IHN1cHBvcnQgR0xfRE9UM1xuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0xFUlA6CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCB1c2VleHQoR0xfSU5URVJQT0xBVEUpKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIHVzZWV4dChHTF9JTlRFUlBPTEFURSkiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMyk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMzIik7CiAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIzKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjMiKTsKICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNNT09USDoKICAgICAgICAgICAgICAgIGlmIChHTF9TVVBQT1JUKEFUSV9URVhUVVJFX0VOVl9DT01CSU5FMykpIHsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX01PRFVMQVRFX0FERF9BVEkiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHIxKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0NPTE9SOiBvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOyBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOiBvcHIgPSBHTF9TUkNfQ09MT1I7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX1NSQ19BTFBIQTogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQTogb3ByID0gR0xfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIpOwogICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICBIYW5kbGVkID0gRkFMU0U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKICAgICAgICAgICAgICAgIGlmIChHTF9TVVBQT1JUKEFUSV9URVhUVVJFX0VOVl9DT01CSU5FMykpIHsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX01PRFVMQVRFX0FERF9BVEkiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgR0xfVEVYVFVSRSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIEdMX1RFWFRVUkUiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIEdMX09ORV9NSU5VU19TUkNfQVBIQSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIEhhbmRsZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SOgogICAgICAgICAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVRJX1RFWFRVUkVfRU5WX0NPTUJJTkUzKSkgewogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURV9BRERfQVRJKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wciIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIEhhbmRsZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVRJX1RFWFRVUkVfRU5WX0NPTUJJTkUzKSkgewogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURV9BRERfQVRJKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wciIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIEhhbmRsZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgogICAgICAgICAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVRJX1RFWFRVUkVfRU5WX0NPTUJJTkUzKSkgewogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURV9BRERfQVRJKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wciIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjFfdGFyZ2V0LCBvcHIxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIEhhbmRsZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVRJX1RFWFRVUkVfRU5WX0NPTUJJTkUzKSkgewogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIGNvbWJfdGFyZ2V0LCBHTF9NT0RVTEFURV9BRERfQVRJKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19DT0xPUjsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wciIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzFfdGFyZ2V0LCBzcmMxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wcjEpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6IG9wciA9IEdMX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjogb3ByID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBOiBvcHIgPSBHTF9TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6IG9wciA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7IGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wciIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjJfdGFyZ2V0LCBvcHIyKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwogICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNjYWxfdGFyZ2V0LCAxKTsKICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIEhhbmRsZWQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRPUF9NVUxUSVBMWUFERDoKICAgICAgICAgICAgICAgIGlmIChHTF9TVVBQT1JUKEFUSV9URVhUVVJFX0VOVl9DT01CSU5FMykpIHsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfTU9EVUxBVEVfQUREX0FUSSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgY29tYl90YXJnZXQsIEdMX01PRFVMQVRFX0FERF9BVEkiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMyk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzMiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIwX3RhcmdldCwgb3ByMyk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMF90YXJnZXQsIG9wcjMiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMV90YXJnZXQsIHNyYzEiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIxX3RhcmdldCwgb3ByMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMyX3RhcmdldCwgc3JjMik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMl90YXJnZXQsIHNyYzIiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMl90YXJnZXQsIG9wcjIiKTsKICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzY2FsX3RhcmdldCwgMSk7CiAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc2NhbF90YXJnZXQsIDEiKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICBIYW5kbGVkID0gRkFMU0U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRToKICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVRJX0VOVk1BUF9CVU1QTUFQKSkgewogICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgYXBwcyB1c2UgQlVNUEVOVk1BUExVTUlOQU5DRSBpbnN0ZWFkIG9mIEQzRFRPUF9CVU1QRU5WTUFQLCBhbHRob3VnaAogICAgICAgICAgICAgICAgICAgICAqIHRoZXkgY2hlY2sgZm9yIHRoZSBub24tbHVtaW5hbmNlIGNhcCBmbGFnLiBXZWxsLCBnaXZlIHRoZW0gd2hhdCB0aGV5IGFza2VkCiAgICAgICAgICAgICAgICAgICAgICogZm9yIDotKQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIFdBUk4oIkFwcGxpY2F0aW9uIHVzZXMgV0lORUQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFXG4iKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgSGFuZGxlZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCiAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JVTVBFTlZNQVA6CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkpIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiVXNpbmcgYXRpIGJ1bXBtYXAgb24gc3RhZ2UgJWQsIHRhcmdldCAlZFxuIiwgU3RhZ2UsIFN0YWdlICsgMSk7CiAgICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQlVNUF9FTlZNQVBfQVRJKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBjb21iX3RhcmdldCwgR0xfQlVNUF9FTlZNQVBfQVRJKSIpOwogICAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfQlVNUF9UQVJHRVRfQVRJLCBHTF9URVhUVVJFMF9BUkIgKyBTdGFnZSArIDEpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0JVTVBfVEFSR0VUX0FUSSwgR0xfVEVYVFVSRTBfQVJCICsgU3RhZ2UgKyAxKSIpOwogICAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzMpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgc3JjMF90YXJnZXQsIHNyYzMiKTsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIzKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIG9wcjBfdGFyZ2V0LCBvcHIzIik7CiAgICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBzcmMxX3RhcmdldCwgc3JjMSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBzcmMwX3RhcmdldCwgc3JjMSIpOwogICAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjEpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJHTF9URVhUVVJFX0VOViwgb3ByMV90YXJnZXQsIG9wcjEiKTsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHNyYzJfdGFyZ2V0LCBzcmMyKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIHNyYzBfdGFyZ2V0LCBzcmMxIik7CiAgICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMik7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX1RFWFRVUkVfRU5WLCBvcHIyX3RhcmdldCwgb3ByMiIpOwoKICAgICAgICAgICAgICAgICAgICBIYW5kbGVkID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgICAgICAgICAvKiBUZWNobmljYWxseSB0ZXh0dXJlIHNoYWRlciBzdXBwb3J0IHdpdGhvdXQgcmVnaXN0ZXIgY29tYmluZXJzIGlzIHBvc3NpYmxlLCBidXQgbm90IGV4cGVjdGVkIHRvIG9jY3VyCiAgICAgICAgICAgICAgICAgICAgICogb24gcmVhbCB3b3JsZCBjYXJkcywgc28gZm9yIG5vdyBhIGZpeG1lIHNob3VsZCBiZSBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBGSVhNRSgiSW1wbGVtZW50IGJ1bXAgbWFwcGluZyB3aXRoIEdMX05WX3RleHR1cmVfc2hhZGVyIGluIG5vbiByZWdpc3RlciBjb21iaW5lciBwYXRoXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgSGFuZGxlZCA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgICAgaWYgKEhhbmRsZWQpIHsKICAgICAgICAgIEJPT0wgIGNvbWJpbmVPSyA9IFRSVUU7CiAgICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9URVhUVVJFX0VOVl9DT01CSU5FNCkpIHsKICAgICAgICAgICAgRFdPUkQgb3AyOwoKICAgICAgICAgICAgaWYgKGlzQWxwaGEpIHsKICAgICAgICAgICAgICBvcDIgPSBUaGlzLT5zdGF0ZUJsb2NrLT50ZXh0dXJlU3RhdGVbU3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JPUF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb3AyID0gVGhpcy0+c3RhdGVCbG9jay0+dGV4dHVyZVN0YXRlW1N0YWdlXVtXSU5FRDNEVFNTX0FMUEhBT1BdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBOb3RlOiBJZiBDT01CSU5FNCBpbiBlZmZlY3QgY2FuJ3QgZ28gYmFjayB0byBjb21iaW5lISAqLwogICAgICAgICAgICBzd2l0Y2ggKG9wMikgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQUREU01PT1RIOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUjoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NVUxUSVBMWUFERDoKICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhvc2UgaW1wbGVtZW50ZWQgaW4gYm90aCBjYXNlcyAqLwogICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU0VMRUNUQVJHMToKICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU0VMRUNUQVJHMjoKICAgICAgICAgICAgICAgIGNvbWJpbmVPSyA9IEZBTFNFOwogICAgICAgICAgICAgICAgSGFuZGxlZCAgID0gRkFMU0U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgRklYTUUoIkNhbid0IHVzZSBDT01CSU5FNCBhbmQgQ09NQklORSB0b2dldGhlciwgdGhpc29wPSVzLCBvdGhlcm9wPSVzLCBpc0FscGhhKCVkKVxuIiwgZGVidWdfZDNkdG9wKG9wKSwgZGVidWdfZDNkdG9wKG9wMiksIGlzQWxwaGEpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChjb21iaW5lT0spIHsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCB1c2VleHQoR0xfQ09NQklORSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIHVzZWV4dChHTF9DT01CSU5FKSIpOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWZ0ZXIgYWxsIHRoZSBleHRlbnNpb25zLCBpZiBzdGlsbCB1bmhhbmRsZWQsIHJlcG9ydCBmaXhtZSAqLwogICAgICAgIEZJWE1FKCJVbmhhbmRsZWQgdGV4dHVyZSBvcGVyYXRpb24gJXNcbiIsIGRlYnVnX2QzZHRvcChvcCkpOwojdW5kZWYgR0xJTkZPX0xPQ0FUSU9OCn0KI2VuZGlmCgovKiBTZXR1cCB0aGlzIHRleHR1cmVzIG1hdHJpeCBhY2NvcmRpbmcgdG8gdGhlIHRleHR1cmUgZmxhZ3MqLwp2b2lkIHNldF90ZXh0dXJlX21hdHJpeChjb25zdCBmbG9hdCAqc21hdCwgRFdPUkQgZmxhZ3MsIEJPT0wgY2FsY3VsYXRlZENvb3JkcywgQk9PTCB0cmFuc2Zvcm1lZCwgRFdPUkQgY29vcmR0eXBlKQp7CiAgICBmbG9hdCBtYXRbMTZdOwoKICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKICAgIGNoZWNrR0xjYWxsKCJnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSkiKTsKCiAgICBpZiAoZmxhZ3MgPT0gV0lORUQzRFRURkZfRElTQUJMRSB8fCBmbGFncyA9PSBXSU5FRDNEVFRGRl9DT1VOVDEgfHwgdHJhbnNmb3JtZWQpIHsKICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSgpIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChmbGFncyA9PSAoV0lORUQzRFRURkZfQ09VTlQxfFdJTkVEM0RUVEZGX1BST0pFQ1RFRCkpIHsKICAgICAgICBFUlIoIkludmFsaWQgdGV4dHVyZSB0cmFuc2Zvcm0gZmxhZ3M6IFdJTkVEM0RUVEZGX0NPVU5UMXxXSU5FRDNEVFRGRl9QUk9KRUNURURcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBtZW1jcHkobWF0LCBzbWF0LCAxNiAqIHNpemVvZihmbG9hdCkpOwoKICAgIGlmIChmbGFncyAmIFdJTkVEM0RUVEZGX1BST0pFQ1RFRCkgewogICAgICAgIHN3aXRjaCAoZmxhZ3MgJiB+V0lORUQzRFRURkZfUFJPSkVDVEVEKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEVFRGRl9DT1VOVDI6CiAgICAgICAgICAgIG1hdFszXSA9IG1hdFsxXSwgbWF0WzddID0gbWF0WzVdLCBtYXRbMTFdID0gbWF0WzldLCBtYXRbMTVdID0gbWF0WzEzXTsKICAgICAgICAgICAgbWF0WzFdID0gbWF0WzVdID0gbWF0WzldID0gbWF0WzEzXSA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFRURkZfQ09VTlQzOgogICAgICAgICAgICBtYXRbM10gPSBtYXRbMl0sIG1hdFs3XSA9IG1hdFs2XSwgbWF0WzExXSA9IG1hdFsxMF0sIG1hdFsxNV0gPSBtYXRbMTRdOwogICAgICAgICAgICBtYXRbMl0gPSBtYXRbNl0gPSBtYXRbMTBdID0gbWF0WzE0XSA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0gZWxzZSB7IC8qIHVuZGVyIGRpcmVjdHggdGhlIFIvWiBjb29yZCBjYW4gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb24sIHVuZGVyIG9wZW5nbCB3ZSB1c2UgdGhlIFEgY29vcmQgaW5zdGVhZCAqLwogICAgICAgIGlmKCFjYWxjdWxhdGVkQ29vcmRzKSB7CiAgICAgICAgICAgIHN3aXRjaChjb29yZHR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMToKICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3QzRCBwYXNzZXMgdGhlIGRlZmF1bHQgMS4wIGluIHRoZSAybmQgY29vcmQsIHdoaWxlIGdsIHBhc3NlcyBpdCBpbiB0aGUgNHRoLgogICAgICAgICAgICAgICAgICAgICAqIHN3YXAgMm5kIGFuZCA0dGggY29vcmQuIE5vIG5lZWQgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIG1hdFsxMl0gaW4gbWF0WzRdIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgICAgKiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIHRyYW5zZm9ybWF0aW9uIHdpbGwgYmUgMCwgc28gdGhlIG1hdHJpeCB2YWx1ZSBpcyBpcnJlbGV2YW50CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgbWF0WzEyXSA9IG1hdFs0XTsKICAgICAgICAgICAgICAgICAgICBtYXRbMTNdID0gbWF0WzVdOwogICAgICAgICAgICAgICAgICAgIG1hdFsxNF0gPSBtYXRbNl07CiAgICAgICAgICAgICAgICAgICAgbWF0WzE1XSA9IG1hdFs3XTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMjoKICAgICAgICAgICAgICAgICAgICAvKiBTZWUgYWJvdmUsIGp1c3QgM3JkIGFuZCA0dGggY29vcmQKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIG1hdFsxMl0gPSBtYXRbOF07CiAgICAgICAgICAgICAgICAgICAgbWF0WzEzXSA9IG1hdFs5XTsKICAgICAgICAgICAgICAgICAgICBtYXRbMTRdID0gbWF0WzEwXTsKICAgICAgICAgICAgICAgICAgICBtYXRbMTVdID0gbWF0WzExXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMzogLyogT3BlbmdsIGRlZmF1bHRzIG1hdGNoIGR4IGRlZmF1bHRzICovCiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDQ6IC8qIE5vIGRlZmF1bHRzIGFwcGx5LCBhbGwgYXBwIGRlZmluZWQgKi8KCiAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRvIHByZXZlbnQgc3dhcHBpbmcgdGhlIG1hdHJpeCBsaW5lcyBhbmQgcHV0IHRoZSBkZWZhdWx0IDR0aCBjb29yZCA9IDEuMAogICAgICAgICAgICAgICAgICogaW50byBhIGJhZCBwbGFjZS4gVGhlIGRpdmlzaW9uIGVsaW1pbmF0aW9uIGJlbG93IHdpbGwgYXBwbHkgdG8gbWFrZSBzdXJlIHRoZQogICAgICAgICAgICAgICAgICogMS4wIGRvZXNuJ3QgZG8gYW55dGhpbmcgYmFkLiBUaGUgY2FsbGVyIHdpbGwgc2V0IHRoaXMgdmFsdWUgaWYgdGhlIHN0cmlkZSBpcyAwCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1VOVVNFRDogLyogTm8gdGV4dHVyZSBjb29yZHMsIDAvMC8wLzEgZGVmYXVsdHMgYXJlIHBhc3NlZCAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiVW5leHBlY3RlZCBmaXhlZCBmdW5jdGlvbiB0ZXh0dXJlIGNvb3JkIGlucHV0XG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGZsYWdzICYgfldJTkVEM0RUVEZGX1BST0pFQ1RFRCkgewogICAgICAgICAgICAvKiBjYXNlIFdJTkVEM0RUVEZGX0NPVU5UMTogV29uJ3QgZXZlciBnZXQgaGVyZSAqLwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUVEZGX0NPVU5UMjogbWF0WzJdID0gbWF0WzZdID0gbWF0WzEwXSA9IG1hdFsxNF0gPSAwOwogICAgICAgICAgICAvKiBPcGVuR0wgZGl2aWRlcyB0aGUgZmlyc3QgMyB2ZXJ0ZXggY29vcmQgYnkgdGhlIDR0aCBieSBkZWZhdWx0LAogICAgICAgICAgICAgKiB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBEM0RUVEZGX1BST0pFQ1RFRC4gTWFrZSBzdXJlIHRoYXQKICAgICAgICAgICAgICogdGhlIDR0aCBjb29yZCBldmFsdWF0ZXMgdG8gMS4wIHRvIGVsaW1pbmF0ZSB0aGF0LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB0aGUgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgaXMgdXNlZCwgdGhlIDR0aCB2YWx1ZSByZW1haW5zIHVudXNlZCwKICAgICAgICAgICAgICogc28gdGhlcmUgaXMgbm8gZGFuZ2VyIGluIGRvaW5nIHRoaXMuIFdpdGggdmVydGV4IHNoYWRlcnMgd2UgaGF2ZSBhCiAgICAgICAgICAgICAqIHByb2JsZW0uIFNob3VsZCBhbiBhcHAgaGl0IHRoYXQgcHJvYmxlbSwgdGhlIGNvZGUgaGVyZSB3b3VsZCBoYXZlIHRvCiAgICAgICAgICAgICAqIGNoZWNrIGZvciBwaXhlbCBzaGFkZXJzLCBhbmQgdGhlIHNoYWRlciBoYXMgdG8gdW5kbyB0aGUgZGVmYXVsdCBnbCBkaXZpZGUuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEEgbW9yZSBzZXJpb3VzIHByb2JsZW0gb2NjdXJzIGlmIHRoZSBhcHAgcGFzc2VzIDQgY29vcmRpbmF0ZXMgaW4sIGFuZCB0aGUKICAgICAgICAgICAgICogNHRoIGlzICE9IDEuMChvcGVuZ2wgZGVmYXVsdCkuIFRoaXMgd291bGQgaGF2ZSB0byBiZSBmaXhlZCBpbiBkcmF3U3RyaWRlZFNsb3cKICAgICAgICAgICAgICogb3IgYSByZXBsYWNlbWVudCBzaGFkZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlZmF1bHQ6IG1hdFszXSA9IG1hdFs3XSA9IG1hdFsxMV0gPSAwOyBtYXRbMTVdID0gMTsKICAgICAgICB9CiAgICB9CgogICAgZ2xMb2FkTWF0cml4ZihtYXQpOwogICAgY2hlY2tHTGNhbGwoImdsTG9hZE1hdHJpeGYobWF0KSIpOwp9CgojZGVmaW5lIEdMSU5GT19MT0NBVElPTiAoKElXaW5lRDNESW1wbCAqKShUaGlzLT53aW5lRDNEKSktPmdsX2luZm8KCi8qIFRoaXMgc21hbGwgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBhIGJpdG1hc2sgaW50byB0aGUgbnVtYmVyIG9mIG1hc2tlZCBiaXRzICovCnVuc2lnbmVkIGludCBjb3VudF9iaXRzKHVuc2lnbmVkIGludCBtYXNrKQp7CiAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAgICBmb3IgKGNvdW50ID0gMDsgbWFzazsgKytjb3VudCkKICAgIHsKICAgICAgICBtYXNrICY9IG1hc2sgLSAxOwogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgovKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgY29sb3IgaW5mbyBmb3IgQ2hvb3NlUGl4ZWxGb3JtYXQgYW5kIHdnbENob29zZVBpeGVsRm9ybWF0QVJCLgogKiBUaGUgbGF0ZXIgZnVuY3Rpb24gcmVxdWlyZXMgaW5kaXZpZHVhbCBjb2xvciBjb21wb25lbnRzLiAqLwpCT09MIGdldENvbG9yQml0cyhXSU5FRDNERk9STUFUIGZtdCwgc2hvcnQgKnJlZFNpemUsIHNob3J0ICpncmVlblNpemUsIHNob3J0ICpibHVlU2l6ZSwgc2hvcnQgKmFscGhhU2l6ZSwgc2hvcnQgKnRvdGFsU2l6ZSkKewogICAgY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpkZXNjOwoKICAgIFRSQUNFKCJmbXQ6ICVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoZm10KSk7CiAgICBzd2l0Y2goZm10KQogICAgewogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOEI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTJSMTBHMTBCMTA6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1gxUjVHNUI1OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BMVI1RzVCNToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjVHNkI1OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YNFI0RzRCNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRSNEc0QjQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1IzRzNCMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThQODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEVSUigiVW5zdXBwb3J0ZWQgZm9ybWF0OiAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KGZtdCkpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgZGVzYyA9IGdldEZvcm1hdERlc2NFbnRyeShmbXQsIE5VTEwsIE5VTEwpOwogICAgaWYoIWRlc2MpCiAgICB7CiAgICAgICAgRVJSKCJVbmFibGUgdG8gbG9vayB1cCBmb3JtYXQ6IDB4JXhcbiIsIGZtdCk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgKnJlZFNpemUgPSBjb3VudF9iaXRzKGRlc2MtPnJlZE1hc2spOwogICAgKmdyZWVuU2l6ZSA9IGNvdW50X2JpdHMoZGVzYy0+Z3JlZW5NYXNrKTsKICAgICpibHVlU2l6ZSA9IGNvdW50X2JpdHMoZGVzYy0+Ymx1ZU1hc2spOwogICAgKmFscGhhU2l6ZSA9IGNvdW50X2JpdHMoZGVzYy0+YWxwaGFNYXNrKTsKICAgICp0b3RhbFNpemUgPSAqcmVkU2l6ZSArICpncmVlblNpemUgKyAqYmx1ZVNpemUgKyAqYWxwaGFTaXplOwoKICAgIFRSQUNFKCJSZXR1cm5pbmcgcmVkOiAgJWQsIGdyZWVuOiAlZCwgYmx1ZTogJWQsIGFscGhhOiAlZCwgdG90YWw6ICVkIGZvciBmbXQ9JXNcbiIsICpyZWRTaXplLCAqZ3JlZW5TaXplLCAqYmx1ZVNpemUsICphbHBoYVNpemUsICp0b3RhbFNpemUsIGRlYnVnX2QzZGZvcm1hdChmbXQpKTsKICAgIHJldHVybiBUUlVFOwp9CgovKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgZGVwdGgvc3RlbmNpbCBpbmZvIGZvciBDaG9vc2VQaXhlbEZvcm1hdCBhbmQgd2dsQ2hvb3NlUGl4ZWxGb3JtYXRBUkIgKi8KQk9PTCBnZXREZXB0aFN0ZW5jaWxCaXRzKFdJTkVEM0RGT1JNQVQgZm10LCBzaG9ydCAqZGVwdGhTaXplLCBzaG9ydCAqc3RlbmNpbFNpemUpCnsKICAgIGNvbnN0IFN0YXRpY1BpeGVsRm9ybWF0RGVzYyAqZGVzYzsKCiAgICBUUkFDRSgiZm10OiAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KGZtdCkpOwogICAgc3dpdGNoKGZtdCkKICAgIHsKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE2X0xPQ0tBQkxFOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMTY6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNVMxOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0WDRTNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0Uzg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNEZTODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDMyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMzJGX0xPQ0tBQkxFOgogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgc3RlbmNpbCBmb3JtYXQ6ICVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoZm10KSk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBkZXNjID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KGZtdCwgTlVMTCwgTlVMTCk7CiAgICBpZighZGVzYykKICAgIHsKICAgICAgICBFUlIoIlVuYWJsZSB0byBsb29rIHVwIGZvcm1hdDogMHgleFxuIiwgZm10KTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICAqZGVwdGhTaXplID0gZGVzYy0+ZGVwdGhTaXplOwogICAgKnN0ZW5jaWxTaXplID0gZGVzYy0+c3RlbmNpbFNpemU7CgogICAgVFJBQ0UoIlJldHVybmluZyBkZXB0aFNpemU6ICVkIGFuZCBzdGVuY2lsU2l6ZTogJWQgZm9yIGZtdD0lc1xuIiwgKmRlcHRoU2l6ZSwgKnN0ZW5jaWxTaXplLCBkZWJ1Z19kM2Rmb3JtYXQoZm10KSk7CiAgICByZXR1cm4gVFJVRTsKfQoKI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKLyogRGlyZWN0RHJhdyBzdHVmZiAqLwpXSU5FRDNERk9STUFUIHBpeGVsZm9ybWF0X2Zvcl9kZXB0aChEV09SRCBkZXB0aCkgewogICAgc3dpdGNoKGRlcHRoKSB7CiAgICAgICAgY2FzZSA4OiAgcmV0dXJuIFdJTkVEM0RGTVRfUDg7CiAgICAgICAgY2FzZSAxNTogcmV0dXJuIFdJTkVEM0RGTVRfWDFSNUc1QjU7CiAgICAgICAgY2FzZSAxNjogcmV0dXJuIFdJTkVEM0RGTVRfUjVHNkI1OwogICAgICAgIGNhc2UgMjQ6IHJldHVybiBXSU5FRDNERk1UX1g4UjhHOEI4OyAvKiBSb2JvdHMgbmVlZHMgMjRiaXQgdG8gYmUgWDhSOEc4QjggKi8KICAgICAgICBjYXNlIDMyOiByZXR1cm4gV0lORUQzREZNVF9YOFI4RzhCODsgLyogRVZFIG9ubGluZSBhbmQgdGhlIEZ1ciBkZW1vIG5lZWQgMzJiaXQgQWRhcHRlckRpc3BsYXlNb2RlIHRvIHJldHVybiBYOFI4RzhCOCAqLwogICAgICAgIGRlZmF1bHQ6IHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICB9Cn0KCnZvaWQgbXVsdGlwbHlfbWF0cml4KFdJTkVEM0RNQVRSSVggKmRlc3QsIGNvbnN0IFdJTkVEM0RNQVRSSVggKnNyYzEsIGNvbnN0IFdJTkVEM0RNQVRSSVggKnNyYzIpIHsKICAgIFdJTkVEM0RNQVRSSVggdGVtcDsKCiAgICAvKiBOb3cgZG8gdGhlIG11bHRpcGxpY2F0aW9uICdieSBoYW5kJy4KICAgICAgIEkga25vdyB0aGF0IGFsbCB0aGlzIGNvdWxkIGJlIG9wdGltaXNlZCwgYnV0IHRoaXMgd2lsbCBiZSBkb25lIGxhdGVyIDotKSAqLwogICAgdGVtcC51LnMuXzExID0gKHNyYzEtPnUucy5fMTEgKiBzcmMyLT51LnMuXzExKSArIChzcmMxLT51LnMuXzIxICogc3JjMi0+dS5zLl8xMikgKyAoc3JjMS0+dS5zLl8zMSAqIHNyYzItPnUucy5fMTMpICsgKHNyYzEtPnUucy5fNDEgKiBzcmMyLT51LnMuXzE0KTsKICAgIHRlbXAudS5zLl8yMSA9IChzcmMxLT51LnMuXzExICogc3JjMi0+dS5zLl8yMSkgKyAoc3JjMS0+dS5zLl8yMSAqIHNyYzItPnUucy5fMjIpICsgKHNyYzEtPnUucy5fMzEgKiBzcmMyLT51LnMuXzIzKSArIChzcmMxLT51LnMuXzQxICogc3JjMi0+dS5zLl8yNCk7CiAgICB0ZW1wLnUucy5fMzEgPSAoc3JjMS0+dS5zLl8xMSAqIHNyYzItPnUucy5fMzEpICsgKHNyYzEtPnUucy5fMjEgKiBzcmMyLT51LnMuXzMyKSArIChzcmMxLT51LnMuXzMxICogc3JjMi0+dS5zLl8zMykgKyAoc3JjMS0+dS5zLl80MSAqIHNyYzItPnUucy5fMzQpOwogICAgdGVtcC51LnMuXzQxID0gKHNyYzEtPnUucy5fMTEgKiBzcmMyLT51LnMuXzQxKSArIChzcmMxLT51LnMuXzIxICogc3JjMi0+dS5zLl80MikgKyAoc3JjMS0+dS5zLl8zMSAqIHNyYzItPnUucy5fNDMpICsgKHNyYzEtPnUucy5fNDEgKiBzcmMyLT51LnMuXzQ0KTsKCiAgICB0ZW1wLnUucy5fMTIgPSAoc3JjMS0+dS5zLl8xMiAqIHNyYzItPnUucy5fMTEpICsgKHNyYzEtPnUucy5fMjIgKiBzcmMyLT51LnMuXzEyKSArIChzcmMxLT51LnMuXzMyICogc3JjMi0+dS5zLl8xMykgKyAoc3JjMS0+dS5zLl80MiAqIHNyYzItPnUucy5fMTQpOwogICAgdGVtcC51LnMuXzIyID0gKHNyYzEtPnUucy5fMTIgKiBzcmMyLT51LnMuXzIxKSArIChzcmMxLT51LnMuXzIyICogc3JjMi0+dS5zLl8yMikgKyAoc3JjMS0+dS5zLl8zMiAqIHNyYzItPnUucy5fMjMpICsgKHNyYzEtPnUucy5fNDIgKiBzcmMyLT51LnMuXzI0KTsKICAgIHRlbXAudS5zLl8zMiA9IChzcmMxLT51LnMuXzEyICogc3JjMi0+dS5zLl8zMSkgKyAoc3JjMS0+dS5zLl8yMiAqIHNyYzItPnUucy5fMzIpICsgKHNyYzEtPnUucy5fMzIgKiBzcmMyLT51LnMuXzMzKSArIChzcmMxLT51LnMuXzQyICogc3JjMi0+dS5zLl8zNCk7CiAgICB0ZW1wLnUucy5fNDIgPSAoc3JjMS0+dS5zLl8xMiAqIHNyYzItPnUucy5fNDEpICsgKHNyYzEtPnUucy5fMjIgKiBzcmMyLT51LnMuXzQyKSArIChzcmMxLT51LnMuXzMyICogc3JjMi0+dS5zLl80MykgKyAoc3JjMS0+dS5zLl80MiAqIHNyYzItPnUucy5fNDQpOwoKICAgIHRlbXAudS5zLl8xMyA9IChzcmMxLT51LnMuXzEzICogc3JjMi0+dS5zLl8xMSkgKyAoc3JjMS0+dS5zLl8yMyAqIHNyYzItPnUucy5fMTIpICsgKHNyYzEtPnUucy5fMzMgKiBzcmMyLT51LnMuXzEzKSArIChzcmMxLT51LnMuXzQzICogc3JjMi0+dS5zLl8xNCk7CiAgICB0ZW1wLnUucy5fMjMgPSAoc3JjMS0+dS5zLl8xMyAqIHNyYzItPnUucy5fMjEpICsgKHNyYzEtPnUucy5fMjMgKiBzcmMyLT51LnMuXzIyKSArIChzcmMxLT51LnMuXzMzICogc3JjMi0+dS5zLl8yMykgKyAoc3JjMS0+dS5zLl80MyAqIHNyYzItPnUucy5fMjQpOwogICAgdGVtcC51LnMuXzMzID0gKHNyYzEtPnUucy5fMTMgKiBzcmMyLT51LnMuXzMxKSArIChzcmMxLT51LnMuXzIzICogc3JjMi0+dS5zLl8zMikgKyAoc3JjMS0+dS5zLl8zMyAqIHNyYzItPnUucy5fMzMpICsgKHNyYzEtPnUucy5fNDMgKiBzcmMyLT51LnMuXzM0KTsKICAgIHRlbXAudS5zLl80MyA9IChzcmMxLT51LnMuXzEzICogc3JjMi0+dS5zLl80MSkgKyAoc3JjMS0+dS5zLl8yMyAqIHNyYzItPnUucy5fNDIpICsgKHNyYzEtPnUucy5fMzMgKiBzcmMyLT51LnMuXzQzKSArIChzcmMxLT51LnMuXzQzICogc3JjMi0+dS5zLl80NCk7CgogICAgdGVtcC51LnMuXzE0ID0gKHNyYzEtPnUucy5fMTQgKiBzcmMyLT51LnMuXzExKSArIChzcmMxLT51LnMuXzI0ICogc3JjMi0+dS5zLl8xMikgKyAoc3JjMS0+dS5zLl8zNCAqIHNyYzItPnUucy5fMTMpICsgKHNyYzEtPnUucy5fNDQgKiBzcmMyLT51LnMuXzE0KTsKICAgIHRlbXAudS5zLl8yNCA9IChzcmMxLT51LnMuXzE0ICogc3JjMi0+dS5zLl8yMSkgKyAoc3JjMS0+dS5zLl8yNCAqIHNyYzItPnUucy5fMjIpICsgKHNyYzEtPnUucy5fMzQgKiBzcmMyLT51LnMuXzIzKSArIChzcmMxLT51LnMuXzQ0ICogc3JjMi0+dS5zLl8yNCk7CiAgICB0ZW1wLnUucy5fMzQgPSAoc3JjMS0+dS5zLl8xNCAqIHNyYzItPnUucy5fMzEpICsgKHNyYzEtPnUucy5fMjQgKiBzcmMyLT51LnMuXzMyKSArIChzcmMxLT51LnMuXzM0ICogc3JjMi0+dS5zLl8zMykgKyAoc3JjMS0+dS5zLl80NCAqIHNyYzItPnUucy5fMzQpOwogICAgdGVtcC51LnMuXzQ0ID0gKHNyYzEtPnUucy5fMTQgKiBzcmMyLT51LnMuXzQxKSArIChzcmMxLT51LnMuXzI0ICogc3JjMi0+dS5zLl80MikgKyAoc3JjMS0+dS5zLl8zNCAqIHNyYzItPnUucy5fNDMpICsgKHNyYzEtPnUucy5fNDQgKiBzcmMyLT51LnMuXzQ0KTsKCiAgICAvKiBBbmQgY29weSB0aGUgbmV3IG1hdHJpeCBpbiB0aGUgZ29vZCBzdG9yYWdlLi4gKi8KICAgIG1lbWNweShkZXN0LCAmdGVtcCwgMTYgKiBzaXplb2YoZmxvYXQpKTsKfQoKRFdPUkQgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSkgewogICAgRFdPUkQgc2l6ZSA9IDA7CiAgICBpbnQgaTsKICAgIGludCBudW1UZXh0dXJlcyA9IChkM2R2dFZlcnRleFR5cGUgJiBXSU5FRDNERlZGX1RFWENPVU5UX01BU0spID4+IFdJTkVEM0RGVkZfVEVYQ09VTlRfU0hJRlQ7CgogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIFdJTkVEM0RGVkZfTk9STUFMKSBzaXplICs9IDMgKiBzaXplb2YoZmxvYXQpOwogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIFdJTkVEM0RGVkZfRElGRlVTRSkgc2l6ZSArPSBzaXplb2YoRFdPUkQpOwogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIFdJTkVEM0RGVkZfU1BFQ1VMQVIpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBXSU5FRDNERlZGX1BTSVpFKSBzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBzd2l0Y2ggKGQzZHZ0VmVydGV4VHlwZSAmIFdJTkVEM0RGVkZfUE9TSVRJT05fTUFTSykgewogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVo6ICAgIHNpemUgKz0gMyAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpSSFc6IHNpemUgKz0gNCAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpCMTogIHNpemUgKz0gNCAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpCMjogIHNpemUgKz0gNSAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpCMzogIHNpemUgKz0gNiAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpCNDogIHNpemUgKz0gNyAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZWRl9YWVpCNTogIHNpemUgKz0gOCAqIHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBwb3NpdGlvbiBtYXNrXG4iKTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBudW1UZXh0dXJlczsgaSsrKSB7CiAgICAgICAgc2l6ZSArPSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIGkpICogc2l6ZW9mKGZsb2F0KTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENhbGN1bGF0ZVRleFJlY3QKICoKICogQ2FsY3VsYXRlcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb3BlbmdsIHRleHR1cmUgdXNlZCBmb3IgYmxpdHMuCiAqIEhhbmRsZWQgb3ZlcnNpemVkIG9wZW5nbCB0ZXh0dXJlcyBhbmQgdXBkYXRlcyB0aGUgc291cmNlIHJlY3RhbmdsZQogKiBhY2NvcmRpbmdseQogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBTdXJmYWNlIHRvIG9wZXJhdGUgb24KICogIFJlY3Q6IFJlcXVlc3RlZCByZWN0YW5nbGUKICoKICogUmV0dXJuczoKICogIFRSVUUgaWYgdGhlIHRleHR1cmUgcGFydCBjYW4gYmUgbG9hZGVkLAogKiAgRkFMU0Ugb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIFRoaXMtPnJlc291cmNlLndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8KCkJPT0wgQ2FsY3VsYXRlVGV4UmVjdChJV2luZUQzRFN1cmZhY2VJbXBsICpUaGlzLCBSRUNUICpSZWN0LCBmbG9hdCBnbFRleENvb3JkWzRdKSB7CiAgICBpbnQgeDEgPSBSZWN0LT5sZWZ0LCB4MiA9IFJlY3QtPnJpZ2h0OwogICAgaW50IHkxID0gUmVjdC0+dG9wLCB5MiA9IFJlY3QtPmJvdHRvbTsKICAgIEdMaW50IG1heFNpemUgPSBHTF9MSU1JVFModGV4dHVyZV9zaXplKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVkLCVkKS0oJWQsJWQpXG4iLCBUaGlzLAogICAgICAgICAgUmVjdC0+bGVmdCwgUmVjdC0+dG9wLCBSZWN0LT5yaWdodCwgUmVjdC0+Ym90dG9tKTsKCiAgICAvKiBUaGUgc2l6ZXMgbWlnaHQgYmUgcmV2ZXJzZWQgKi8KICAgIGlmKFJlY3QtPmxlZnQgPiBSZWN0LT5yaWdodCkgewogICAgICAgIHgxID0gUmVjdC0+cmlnaHQ7CiAgICAgICAgeDIgPSBSZWN0LT5sZWZ0OwogICAgfQogICAgaWYoUmVjdC0+dG9wID4gUmVjdC0+Ym90dG9tKSB7CiAgICAgICAgeTEgPSBSZWN0LT5ib3R0b207CiAgICAgICAgeTIgPSBSZWN0LT50b3A7CiAgICB9CgogICAgLyogTm8gb3ZlcnNpemVkIHRleHR1cmU/IFRoaXMgaXMgZWFzeSAqLwogICAgaWYoIShUaGlzLT5GbGFncyAmIFNGTEFHX09WRVJTSVpFKSkgewogICAgICAgIC8qIFdoaWNoIHJlY3QgZnJvbSB0aGUgdGV4dHVyZSBkbyBJIG5lZWQ/ICovCiAgICAgICAgaWYoVGhpcy0+Z2xEZXNjcmlwdGlvbi50YXJnZXQgPT0gR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSB7CiAgICAgICAgICAgIGdsVGV4Q29vcmRbMF0gPSAoZmxvYXQpIFJlY3QtPmxlZnQ7CiAgICAgICAgICAgIGdsVGV4Q29vcmRbMl0gPSAoZmxvYXQpIFJlY3QtPnRvcDsKICAgICAgICAgICAgZ2xUZXhDb29yZFsxXSA9IChmbG9hdCkgUmVjdC0+cmlnaHQ7CiAgICAgICAgICAgIGdsVGV4Q29vcmRbM10gPSAoZmxvYXQpIFJlY3QtPmJvdHRvbTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbFRleENvb3JkWzBdID0gKGZsb2F0KSBSZWN0LT5sZWZ0IC8gKGZsb2F0KSBUaGlzLT5wb3cyV2lkdGg7CiAgICAgICAgICAgIGdsVGV4Q29vcmRbMl0gPSAoZmxvYXQpIFJlY3QtPnRvcCAvIChmbG9hdCkgVGhpcy0+cG93MkhlaWdodDsKICAgICAgICAgICAgZ2xUZXhDb29yZFsxXSA9IChmbG9hdCkgUmVjdC0+cmlnaHQgLyAoZmxvYXQpIFRoaXMtPnBvdzJXaWR0aDsKICAgICAgICAgICAgZ2xUZXhDb29yZFszXSA9IChmbG9hdCkgUmVjdC0+Ym90dG9tIC8gKGZsb2F0KSBUaGlzLT5wb3cySGVpZ2h0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9IGVsc2UgewogICAgICAgIC8qIENoZWNrIGlmIHdlIGNhbiBzdWNjZWVkIGF0IGFsbCAqLwogICAgICAgIGlmKCAoeDIgLSB4MSkgPiBtYXhTaXplIHx8CiAgICAgICAgICAgICh5MiAtIHkxKSA+IG1heFNpemUgKSB7CiAgICAgICAgICAgIFRSQUNFKCJSZXF1ZXN0ZWQgcmVjdGFuZ2xlIGlzIHRvbyBsYXJnZSBmb3IgZ2xcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICAvKiBBIHBhcnQgb2YgdGhlIHRleHR1cmUgaGFzIHRvIGJlIHBpY2tlZC4gRmlyc3QsIGNoZWNrIGlmCiAgICAgICAgICogc29tZSB0ZXh0dXJlIHBhcnQgaXMgbG9hZGVkIGFscmVhZHksIGlmIHllcyB0cnkgdG8gcmUtdXNlIGl0LgogICAgICAgICAqIElmIHRoZSB0ZXh0dXJlIGlzIGRpcnR5LCBvciB0aGUgcGFydCBjYW4ndCBiZSB1c2VkLAogICAgICAgICAqIHJlLXBvc2l0aW9uIHRoZSBwYXJ0IHRvIGxvYWQKICAgICAgICAgKi8KICAgICAgICBpZihUaGlzLT5GbGFncyAmIFNGTEFHX0lOVEVYVFVSRSkgewogICAgICAgICAgICBpZihUaGlzLT5nbFJlY3QubGVmdCA8PSB4MSAmJiBUaGlzLT5nbFJlY3QucmlnaHQgPj0geDIgJiYKICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LnRvcCA8PSB5MSAmJiBUaGlzLT5nbFJlY3QuYm90dG9tID49IHgyICkgewogICAgICAgICAgICAgICAgLyogT2ssIHRoZSByZWN0YW5nbGUgaXMgb2ssIHJlLXVzZSBpdCAqLwogICAgICAgICAgICAgICAgVFJBQ0UoIlVzaW5nIGV4aXN0aW5nIGdsIFRleHR1cmVcbiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogUmVjdGFuZ2xlIGlzIG5vdCBvaywgZGlydGlmeSB0aGUgdGV4dHVyZSB0byByZWxvYWQgaXQgKi8KICAgICAgICAgICAgICAgIFRSQUNFKCJEaXJ0aWZ5aW5nIHRleHR1cmUgdG8gZm9yY2UgcmVsb2FkXG4iKTsKICAgICAgICAgICAgICAgIFRoaXMtPkZsYWdzICY9IH5TRkxBR19JTlRFWFRVUkU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIE5vdyBpZiB3ZSBhcmUgZGlydHkobm8gZWxzZSBpZiEpICovCiAgICAgICAgaWYoIShUaGlzLT5GbGFncyAmIFNGTEFHX0lOVEVYVFVSRSkpIHsKICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgcmVjdGFuZ2xlLiBVc2UgdGhlIGZvbGxvd2luZyBzdHJhdGVneToKICAgICAgICAgICAgICogMSkgVXNlIGFzIGJpZyB0ZXh0dXJlcyBhcyBwb3NzaWJsZS4KICAgICAgICAgICAgICogMikgUGxhY2UgdGhlIHRleHR1cmUgcGFydCBpbiB0aGUgd2F5IHRoYXQgdGhlIHJlcXVlc3RlZAogICAgICAgICAgICAgKiAgICBwYXJ0IGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRleHR1cmUod2VsbCwgYWxtb3N0KQogICAgICAgICAgICAgKiAzKSBJZiB0aGUgdGV4dHVyZSBpcyBtb3ZlZCBvdmVyIHRoZSBlZGdlcyBvZiB0aGUKICAgICAgICAgICAgICogICAgc3VyZmFjZSwgcmVwbGFjZSBpdCBuaWNlbHkKICAgICAgICAgICAgICogNCkgSWYgdGhlIGNvb3JkIGlzIG5vdCBsaW1pdGluZyB0aGUgdGV4dHVyZSBzaXplLAogICAgICAgICAgICAgKiAgICB1c2UgdGhlIHdob2xlIHNpemUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKChUaGlzLT5wb3cyV2lkdGgpID4gbWF4U2l6ZSkgewogICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LmxlZnQgPSB4MSAtIG1heFNpemUgLyAyOwogICAgICAgICAgICAgICAgaWYoVGhpcy0+Z2xSZWN0LmxlZnQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LmxlZnQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LnJpZ2h0ID0gVGhpcy0+Z2xSZWN0LmxlZnQgKyBtYXhTaXplOwogICAgICAgICAgICAgICAgaWYoVGhpcy0+Z2xSZWN0LnJpZ2h0ID4gVGhpcy0+Y3VycmVudERlc2MuV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QucmlnaHQgPSBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aDsKICAgICAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QubGVmdCA9IFRoaXMtPmdsUmVjdC5yaWdodCAtIG1heFNpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QubGVmdCA9IDA7CiAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QucmlnaHQgPSBUaGlzLT5wb3cyV2lkdGg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKFRoaXMtPnBvdzJIZWlnaHQgPiBtYXhTaXplKSB7CiAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QudG9wID0geDEgLSBHTF9MSU1JVFModGV4dHVyZV9zaXplKSAvIDI7CiAgICAgICAgICAgICAgICBpZihUaGlzLT5nbFJlY3QudG9wIDwgMCkgVGhpcy0+Z2xSZWN0LnRvcCA9IDA7CiAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QuYm90dG9tID0gVGhpcy0+Z2xSZWN0LmxlZnQgKyBtYXhTaXplOwogICAgICAgICAgICAgICAgaWYoVGhpcy0+Z2xSZWN0LmJvdHRvbSA+IFRoaXMtPmN1cnJlbnREZXNjLkhlaWdodCkgewogICAgICAgICAgICAgICAgICAgIFRoaXMtPmdsUmVjdC5ib3R0b20gPSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LnRvcCA9IFRoaXMtPmdsUmVjdC5ib3R0b20gLSBtYXhTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVGhpcy0+Z2xSZWN0LnRvcCA9IDA7CiAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QuYm90dG9tID0gVGhpcy0+cG93MkhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiKCVwKTogVXNpbmcgcmVjdCAoJWQsJWQpLSglZCwlZClcbiIsIFRoaXMsCiAgICAgICAgICAgICAgICAgICBUaGlzLT5nbFJlY3QubGVmdCwgVGhpcy0+Z2xSZWN0LnRvcCwgVGhpcy0+Z2xSZWN0LnJpZ2h0LCBUaGlzLT5nbFJlY3QuYm90dG9tKTsKICAgICAgICB9CgogICAgICAgIC8qIFJlLWNhbGN1bGF0ZSB0aGUgcmVjdCB0byBkcmF3ICovCiAgICAgICAgUmVjdC0+bGVmdCAtPSBUaGlzLT5nbFJlY3QubGVmdDsKICAgICAgICBSZWN0LT5yaWdodCAtPSBUaGlzLT5nbFJlY3QubGVmdDsKICAgICAgICBSZWN0LT50b3AgLT0gVGhpcy0+Z2xSZWN0LnRvcDsKICAgICAgICBSZWN0LT5ib3R0b20gLT0gVGhpcy0+Z2xSZWN0LnRvcDsKCiAgICAgICAgLyogR2V0IHRoZSBnbCBjb29yZGluYXRlcy4gVGhlIGdsIHJlY3RhbmdsZSBpcyBhIHBvd2VyIG9mIDIsIGVpZ2hlciB0aGUgbWF4IHNpemUsCiAgICAgICAgICogb3IgdGhlIHBvdzJXaWR0aCAvIHBvdzJIZWlnaHQgb2YgdGhlIHN1cmZhY2UuCiAgICAgICAgICoKICAgICAgICAgKiBDYW4gbmV2ZXIgYmUgR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCIGJlY2F1c2Ugb3ZlcnNpemVkIHN1cmZhY2VzIGFyZSBhbHdheXMgc2V0IHVwCiAgICAgICAgICogYXMgcmVndWxhciBHTF9URVhUVVJFXzJELgogICAgICAgICAqLwogICAgICAgIGdsVGV4Q29vcmRbMF0gPSAoZmxvYXQpIFJlY3QtPmxlZnQgLyAoZmxvYXQpIChUaGlzLT5nbFJlY3QucmlnaHQgLSBUaGlzLT5nbFJlY3QubGVmdCk7CiAgICAgICAgZ2xUZXhDb29yZFsyXSA9IChmbG9hdCkgUmVjdC0+dG9wIC8gKGZsb2F0KSAoVGhpcy0+Z2xSZWN0LmJvdHRvbSAtIFRoaXMtPmdsUmVjdC50b3ApOwogICAgICAgIGdsVGV4Q29vcmRbMV0gPSAoZmxvYXQpIFJlY3QtPnJpZ2h0IC8gKGZsb2F0KSAoVGhpcy0+Z2xSZWN0LnJpZ2h0IC0gVGhpcy0+Z2xSZWN0LmxlZnQpOwogICAgICAgIGdsVGV4Q29vcmRbM10gPSAoZmxvYXQpIFJlY3QtPmJvdHRvbSAvIChmbG9hdCkgKFRoaXMtPmdsUmVjdC5ib3R0b20gLSBUaGlzLT5nbFJlY3QudG9wKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CiN1bmRlZiBHTElORk9fTE9DQVRJT04KCi8qIEhhc2ggdGFibGUgZnVuY3Rpb25zICovCgpoYXNoX3RhYmxlX3QgKmhhc2hfdGFibGVfY3JlYXRlKGhhc2hfZnVuY3Rpb25fdCAqaGFzaF9mdW5jdGlvbiwgY29tcGFyZV9mdW5jdGlvbl90ICpjb21wYXJlX2Z1bmN0aW9uKQp7CiAgICBoYXNoX3RhYmxlX3QgKnRhYmxlOwogICAgdW5zaWduZWQgaW50IGluaXRpYWxfc2l6ZSA9IDg7CgogICAgdGFibGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKGhhc2hfdGFibGVfdCkgKyAoaW5pdGlhbF9zaXplICogc2l6ZW9mKHN0cnVjdCBsaXN0KSkpOwogICAgaWYgKCF0YWJsZSkKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSB0YWJsZSwgcmV0dXJuaW5nIE5VTEwuXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICB0YWJsZS0+aGFzaF9mdW5jdGlvbiA9IGhhc2hfZnVuY3Rpb247CiAgICB0YWJsZS0+Y29tcGFyZV9mdW5jdGlvbiA9IGNvbXBhcmVfZnVuY3Rpb247CgogICAgdGFibGUtPmdyb3dfc2l6ZSA9IGluaXRpYWxfc2l6ZSAtIChpbml0aWFsX3NpemUgPj4gMik7CiAgICB0YWJsZS0+c2hyaW5rX3NpemUgPSAwOwoKICAgIHRhYmxlLT5idWNrZXRzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIGluaXRpYWxfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdCkpOwogICAgaWYgKCF0YWJsZS0+YnVja2V0cykKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSB0YWJsZSBidWNrZXRzLCByZXR1cm5pbmcgTlVMTC5cbiIpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHRhYmxlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHRhYmxlLT5idWNrZXRfY291bnQgPSBpbml0aWFsX3NpemU7CgogICAgdGFibGUtPmVudHJpZXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgdGFibGUtPmdyb3dfc2l6ZSAqIHNpemVvZihoYXNoX3RhYmxlX2VudHJ5X3QpKTsKICAgIGlmICghdGFibGUtPmVudHJpZXMpCiAgICB7CiAgICAgICAgRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGFibGUgZW50cmllcywgcmV0dXJuaW5nIE5VTEwuXG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0YWJsZS0+YnVja2V0cyk7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGFibGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgdGFibGUtPmVudHJ5X2NvdW50ID0gMDsKCiAgICBsaXN0X2luaXQoJnRhYmxlLT5mcmVlX2VudHJpZXMpOwogICAgdGFibGUtPmNvdW50ID0gMDsKCiAgICByZXR1cm4gdGFibGU7Cn0KCnZvaWQgaGFzaF90YWJsZV9kZXN0cm95KGhhc2hfdGFibGVfdCAqdGFibGUpCnsKICAgIHVuc2lnbmVkIGludCBpID0gMDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmVudHJ5X2NvdW50OyArK2kpCiAgICB7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGFibGUtPmVudHJpZXNbaV0ua2V5KTsKICAgIH0KCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0YWJsZS0+ZW50cmllcyk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0YWJsZS0+YnVja2V0cyk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0YWJsZSk7Cn0KCnN0YXRpYyBpbmxpbmUgaGFzaF90YWJsZV9lbnRyeV90ICpoYXNoX3RhYmxlX2dldF9ieV9pZHgoaGFzaF90YWJsZV90ICp0YWJsZSwgdm9pZCAqa2V5LCB1bnNpZ25lZCBpbnQgaWR4KQp7CiAgICBoYXNoX3RhYmxlX2VudHJ5X3QgKmVudHJ5OwoKICAgIGlmICh0YWJsZS0+YnVja2V0c1tpZHhdLm5leHQpCiAgICAgICAgTElTVF9GT1JfRUFDSF9FTlRSWShlbnRyeSwgJih0YWJsZS0+YnVja2V0c1tpZHhdKSwgaGFzaF90YWJsZV9lbnRyeV90LCBlbnRyeSkKICAgICAgICAgICAgaWYgKHRhYmxlLT5jb21wYXJlX2Z1bmN0aW9uKGVudHJ5LT5rZXksIGtleSkpIHJldHVybiBlbnRyeTsKCiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIEJPT0wgaGFzaF90YWJsZV9yZXNpemUoaGFzaF90YWJsZV90ICp0YWJsZSwgdW5zaWduZWQgaW50IG5ld19idWNrZXRfY291bnQpCnsKICAgIHVuc2lnbmVkIGludCBuZXdfZW50cnlfY291bnQgPSAwOwogICAgaGFzaF90YWJsZV9lbnRyeV90ICpuZXdfZW50cmllczsKICAgIHN0cnVjdCBsaXN0ICpuZXdfYnVja2V0czsKICAgIHVuc2lnbmVkIGludCBncm93X3NpemUgPSBuZXdfYnVja2V0X2NvdW50IC0gKG5ld19idWNrZXRfY291bnQgPj4gMik7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBuZXdfYnVja2V0cyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBuZXdfYnVja2V0X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBsaXN0KSk7CiAgICBpZiAoIW5ld19idWNrZXRzKQogICAgewogICAgICAgIEVSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBidWNrZXRzLCByZXR1cm5pbmcgRkFMU0UuXG4iKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgbmV3X2VudHJpZXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgZ3Jvd19zaXplICogc2l6ZW9mKGhhc2hfdGFibGVfZW50cnlfdCkpOwogICAgaWYgKCFuZXdfZW50cmllcykKICAgIHsKICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgZW50cmllcywgcmV0dXJuaW5nIEZBTFNFLlxuIik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X2J1Y2tldHMpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmJ1Y2tldF9jb3VudDsgKytpKQogICAgewogICAgICAgIGlmICh0YWJsZS0+YnVja2V0c1tpXS5uZXh0KQogICAgICAgIHsKICAgICAgICAgICAgaGFzaF90YWJsZV9lbnRyeV90ICplbnRyeSwgKmVudHJ5MjsKCiAgICAgICAgICAgIExJU1RfRk9SX0VBQ0hfRU5UUllfU0FGRShlbnRyeSwgZW50cnkyLCAmdGFibGUtPmJ1Y2tldHNbaV0sIGhhc2hfdGFibGVfZW50cnlfdCwgZW50cnkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBqOwogICAgICAgICAgICAgICAgaGFzaF90YWJsZV9lbnRyeV90ICpuZXdfZW50cnkgPSBuZXdfZW50cmllcyArIChuZXdfZW50cnlfY291bnQrKyk7CiAgICAgICAgICAgICAgICAqbmV3X2VudHJ5ID0gKmVudHJ5OwoKICAgICAgICAgICAgICAgIGogPSBuZXdfZW50cnktPmhhc2ggJiAobmV3X2J1Y2tldF9jb3VudCAtIDEpOwoKICAgICAgICAgICAgICAgIGlmICghbmV3X2J1Y2tldHNbal0ubmV4dCkgbGlzdF9pbml0KCZuZXdfYnVja2V0c1tqXSk7CiAgICAgICAgICAgICAgICBsaXN0X2FkZF9oZWFkKCZuZXdfYnVja2V0c1tqXSwgJm5ld19lbnRyeS0+ZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHRhYmxlLT5idWNrZXRzKTsKICAgIHRhYmxlLT5idWNrZXRzID0gbmV3X2J1Y2tldHM7CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGFibGUtPmVudHJpZXMpOwogICAgdGFibGUtPmVudHJpZXMgPSBuZXdfZW50cmllczsKCiAgICB0YWJsZS0+ZW50cnlfY291bnQgPSBuZXdfZW50cnlfY291bnQ7CiAgICBsaXN0X2luaXQoJnRhYmxlLT5mcmVlX2VudHJpZXMpOwoKICAgIHRhYmxlLT5idWNrZXRfY291bnQgPSBuZXdfYnVja2V0X2NvdW50OwogICAgdGFibGUtPmdyb3dfc2l6ZSA9IGdyb3dfc2l6ZTsKICAgIHRhYmxlLT5zaHJpbmtfc2l6ZSA9IG5ld19idWNrZXRfY291bnQgPiA4ID8gbmV3X2J1Y2tldF9jb3VudCA+PiAyIDogMDsKCiAgICByZXR1cm4gVFJVRTsKfQoKdm9pZCBoYXNoX3RhYmxlX3B1dChoYXNoX3RhYmxlX3QgKnRhYmxlLCB2b2lkICprZXksIHZvaWQgKnZhbHVlKQp7CiAgICB1bnNpZ25lZCBpbnQgaWR4OwogICAgdW5zaWduZWQgaW50IGhhc2g7CiAgICBoYXNoX3RhYmxlX2VudHJ5X3QgKmVudHJ5OwoKICAgIGhhc2ggPSB0YWJsZS0+aGFzaF9mdW5jdGlvbihrZXkpOwogICAgaWR4ID0gaGFzaCAmICh0YWJsZS0+YnVja2V0X2NvdW50IC0gMSk7CiAgICBlbnRyeSA9IGhhc2hfdGFibGVfZ2V0X2J5X2lkeCh0YWJsZSwga2V5LCBpZHgpOwoKICAgIGlmIChlbnRyeSkKICAgIHsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXkpOwogICAgICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOwoKICAgICAgICBpZiAoIXZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZW50cnktPmtleSk7CiAgICAgICAgICAgIGVudHJ5LT5rZXkgPSBOVUxMOwoKICAgICAgICAgICAgLyogUmVtb3ZlIHRoZSBlbnRyeSAqLwogICAgICAgICAgICBsaXN0X3JlbW92ZSgmZW50cnktPmVudHJ5KTsKICAgICAgICAgICAgbGlzdF9hZGRfaGVhZCgmdGFibGUtPmZyZWVfZW50cmllcywgJmVudHJ5LT5lbnRyeSk7CgogICAgICAgICAgICAtLXRhYmxlLT5jb3VudDsKCiAgICAgICAgICAgIC8qIFNocmluayBpZiBuZWNlc3NhcnkgKi8KICAgICAgICAgICAgaWYgKHRhYmxlLT5jb3VudCA8IHRhYmxlLT5zaHJpbmtfc2l6ZSkgewogICAgICAgICAgICAgICAgaWYgKCFoYXNoX3RhYmxlX3Jlc2l6ZSh0YWJsZSwgdGFibGUtPmJ1Y2tldF9jb3VudCA+PiAxKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBzaHJpbmsgdGhlIHRhYmxlLi4uXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghdmFsdWUpIHJldHVybjsKCiAgICAvKiBHcm93IGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKHRhYmxlLT5jb3VudCA+PSB0YWJsZS0+Z3Jvd19zaXplKQogICAgewogICAgICAgIGlmICghaGFzaF90YWJsZV9yZXNpemUodGFibGUsIHRhYmxlLT5idWNrZXRfY291bnQgPDwgMSkpCiAgICAgICAgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBncm93IHRoZSB0YWJsZSwgcmV0dXJuaW5nLlxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlkeCA9IGhhc2ggJiAodGFibGUtPmJ1Y2tldF9jb3VudCAtIDEpOwogICAgfQoKICAgIC8qIEZpbmQgYW4gZW50cnkgdG8gaW5zZXJ0ICovCiAgICBpZiAoIWxpc3RfZW1wdHkoJnRhYmxlLT5mcmVlX2VudHJpZXMpKQogICAgewogICAgICAgIHN0cnVjdCBsaXN0ICplbGVtID0gbGlzdF9oZWFkKCZ0YWJsZS0+ZnJlZV9lbnRyaWVzKTsKCiAgICAgICAgbGlzdF9yZW1vdmUoZWxlbSk7CiAgICAgICAgZW50cnkgPSBMSVNUX0VOVFJZKGVsZW0sIGhhc2hfdGFibGVfZW50cnlfdCwgZW50cnkpOwogICAgfSBlbHNlIHsKICAgICAgICBlbnRyeSA9IHRhYmxlLT5lbnRyaWVzICsgKHRhYmxlLT5lbnRyeV9jb3VudCsrKTsKICAgIH0KCiAgICAvKiBJbnNlcnQgdGhlIGVudHJ5ICovCiAgICBlbnRyeS0+a2V5ID0ga2V5OwogICAgZW50cnktPnZhbHVlID0gdmFsdWU7CiAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CiAgICBpZiAoIXRhYmxlLT5idWNrZXRzW2lkeF0ubmV4dCkgbGlzdF9pbml0KCZ0YWJsZS0+YnVja2V0c1tpZHhdKTsKICAgIGxpc3RfYWRkX2hlYWQoJnRhYmxlLT5idWNrZXRzW2lkeF0sICZlbnRyeS0+ZW50cnkpOwoKICAgICsrdGFibGUtPmNvdW50Owp9Cgp2b2lkIGhhc2hfdGFibGVfcmVtb3ZlKGhhc2hfdGFibGVfdCAqdGFibGUsIHZvaWQgKmtleSkKewogICAgaGFzaF90YWJsZV9wdXQodGFibGUsIGtleSwgTlVMTCk7Cn0KCnZvaWQgKmhhc2hfdGFibGVfZ2V0KGhhc2hfdGFibGVfdCAqdGFibGUsIHZvaWQgKmtleSkKewogICAgdW5zaWduZWQgaW50IGlkeDsKICAgIGhhc2hfdGFibGVfZW50cnlfdCAqZW50cnk7CgogICAgaWR4ID0gdGFibGUtPmhhc2hfZnVuY3Rpb24oa2V5KSAmICh0YWJsZS0+YnVja2V0X2NvdW50IC0gMSk7CiAgICBlbnRyeSA9IGhhc2hfdGFibGVfZ2V0X2J5X2lkeCh0YWJsZSwga2V5LCBpZHgpOwoKICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LT52YWx1ZSA6IE5VTEw7Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8Kdm9pZCBnZW5fZmZwX29wKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIHN0cnVjdCB0ZXh0dXJlX3N0YWdlX29wIG9wW01BWF9URVhUVVJFU10pIHsKI2RlZmluZSBBUkcxIDB4MDEKI2RlZmluZSBBUkcyIDB4MDIKI2RlZmluZSBBUkcwIDB4MDQKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFyZ3NbV0lORUQzRFRPUF9MRVJQICsgMV0gPSB7CiAgICAgICAgLyogdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8gIDAsCiAgICAgICAgLyogRDNEVE9QX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgKi8gIDAsCiAgICAgICAgLyogRDNEVE9QX1NFTEVDVEFSRzEgICAgICAgICAgICAgICAgKi8gIEFSRzEsCiAgICAgICAgLyogRDNEVE9QX1NFTEVDVEFSRzIgICAgICAgICAgICAgICAgKi8gIEFSRzIsCiAgICAgICAgLyogRDNEVE9QX01PRFVMQVRFICAgICAgICAgICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9NT0RVTEFURTJYICAgICAgICAgICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfTU9EVUxBVEU0WCAgICAgICAgICAgICAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX0FERCAgICAgICAgICAgICAgICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9BRERTSUdORUQgICAgICAgICAgICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfQUREU0lHTkVEMlggICAgICAgICAgICAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9BRERTTU9PVEggICAgICAgICAgICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEEgICAgICAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBICAgICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSAgICAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9QUkVNT0RVTEFURSAgICAgICAgICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX0JVTVBFTlZNQVAgICAgICAgICAgICAgICAgKi8gIEFSRzEgfCBBUkcyLAogICAgICAgIC8qIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFICAgICAgICovICBBUkcxIHwgQVJHMiwKICAgICAgICAvKiBEM0RUT1BfRE9UUFJPRFVDVDMgICAgICAgICAgICAgICAqLyAgQVJHMSB8IEFSRzIsCiAgICAgICAgLyogRDNEVE9QX01VTFRJUExZQUREICAgICAgICAgICAgICAgKi8gIEFSRzEgfCBBUkcyIHwgQVJHMCwKICAgICAgICAvKiBEM0RUT1BfTEVSUCAgICAgICAgICAgICAgICAgICAgICAqLyAgQVJHMSB8IEFSRzIgfCBBUkcwCiAgICB9OwogICAgdW5zaWduZWQgaW50IGk7CiAgICBEV09SRCB0dGZmOwoKICAgIGZvcihpID0gMDsgaSA8IEdMX0xJTUlUUyh0ZXh0dXJlX3N0YWdlcyk7IGkrKykgewogICAgICAgIElXaW5lRDNEQmFzZVRleHR1cmVJbXBsICp0ZXh0dXJlOwogICAgICAgIGlmKHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0NPTE9ST1BdID09IFdJTkVEM0RUT1BfRElTQUJMRSkgewogICAgICAgICAgICBvcFtpXS5jb3AgPSBXSU5FRDNEVE9QX0RJU0FCTEU7CiAgICAgICAgICAgIG9wW2ldLmFvcCA9IFdJTkVEM0RUT1BfRElTQUJMRTsKICAgICAgICAgICAgb3BbaV0uY2FyZzAgPSBvcFtpXS5jYXJnMSA9IG9wW2ldLmNhcmcyID0gMHhmZmZmZmZmZjsKICAgICAgICAgICAgb3BbaV0uYWFyZzAgPSBvcFtpXS5hYXJnMSA9IG9wW2ldLmFhcmcyID0gMHhmZmZmZmZmZjsKICAgICAgICAgICAgb3BbaV0uY29sb3JfY29ycmVjdGlvbiA9IFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICAgICAgb3BbaV0uZHN0ID0gMHhmZmZmZmZmZjsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHRleHR1cmUgPSAoSVdpbmVEM0RCYXNlVGV4dHVyZUltcGwgKikgc3RhdGVibG9jay0+dGV4dHVyZXNbaV07CiAgICAgICAgb3BbaV0uY29sb3JfY29ycmVjdGlvbiA9IHRleHR1cmUgPyB0ZXh0dXJlLT5iYXNlVGV4dHVyZS5zaGFkZXJfY29udmVyc2lvbl9ncm91cCA6IFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgb3BbaV0uY29wID0gc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQ09MT1JPUF07CiAgICAgICAgb3BbaV0uYW9wID0gc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQUxQSEFPUF07CgogICAgICAgIG9wW2ldLmNhcmcxID0gKGFyZ3Nbb3BbaV0uY29wXSAmIEFSRzEpID8gc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQ09MT1JBUkcxXSA6IDB4ZmZmZmZmZmY7CiAgICAgICAgb3BbaV0uY2FyZzIgPSAoYXJnc1tvcFtpXS5jb3BdICYgQVJHMikgPyBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19DT0xPUkFSRzJdIDogMHhmZmZmZmZmZjsKICAgICAgICBvcFtpXS5jYXJnMCA9IChhcmdzW29wW2ldLmNvcF0gJiBBUkcwKSA/IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0NPTE9SQVJHMF0gOiAweGZmZmZmZmZmOwoKICAgICAgICBpZihpc19pbnZhbGlkX29wKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIGksIG9wW2ldLmNvcCwgb3BbaV0uY2FyZzEsIG9wW2ldLmNhcmcyLCBvcFtpXS5jYXJnMCkpIHsKICAgICAgICAgICAgb3BbaV0uY2FyZzAgPSAweGZmZmZmZmZmOwogICAgICAgICAgICBvcFtpXS5jYXJnMiA9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG9wW2ldLmNhcmcxID0gV0lORUQzRFRBX0NVUlJFTlQ7CiAgICAgICAgICAgIG9wW2ldLmNvcCA9IFdJTkVEM0RUT1BfU0VMRUNUQVJHMTsKICAgICAgICB9CgogICAgICAgIG9wW2ldLmFhcmcxID0gKGFyZ3Nbb3BbaV0uYW9wXSAmIEFSRzEpID8gc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQUxQSEFBUkcxXSA6IDB4ZmZmZmZmZmY7CiAgICAgICAgb3BbaV0uYWFyZzIgPSAoYXJnc1tvcFtpXS5hb3BdICYgQVJHMikgPyBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19BTFBIQUFSRzJdIDogMHhmZmZmZmZmZjsKICAgICAgICBvcFtpXS5hYXJnMCA9IChhcmdzW29wW2ldLmFvcF0gJiBBUkcwKSA/IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0FMUEhBQVJHMF0gOiAweGZmZmZmZmZmOwoKICAgICAgICBpZihpc19pbnZhbGlkX29wKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIGksIG9wW2ldLmFvcCwgb3BbaV0uYWFyZzEsIG9wW2ldLmFhcmcyLCBvcFtpXS5hYXJnMCkpIHsKICAgICAgICAgICAgb3BbaV0uYWFyZzAgPSAweGZmZmZmZmZmOwogICAgICAgICAgICBvcFtpXS5hYXJnMiA9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG9wW2ldLmFhcmcxID0gV0lORUQzRFRBX0NVUlJFTlQ7CiAgICAgICAgICAgIG9wW2ldLmFvcCA9IFdJTkVEM0RUT1BfU0VMRUNUQVJHMTsKICAgICAgICB9IGVsc2UgaWYoaSA9PSAwICYmIHN0YXRlYmxvY2stPnRleHR1cmVzWzBdICYmCiAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUktFWUVOQUJMRV0gJiYKICAgICAgICAgICAgICAgICAoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbMF0gPT0gR0xfVEVYVFVSRV8yRCB8fAogICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1swXSA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpKSB7CiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnN1cmYgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSAoKElXaW5lRDNEVGV4dHVyZUltcGwgKikgc3RhdGVibG9jay0+dGV4dHVyZXNbMF0pLT5zdXJmYWNlc1swXTsKCiAgICAgICAgICAgIGlmKHN1cmYtPkNLZXlGbGFncyAmIFdJTkVERFNEX0NLU1JDQkxUICYmCiAgICAgICAgICAgICAgIGdldEZvcm1hdERlc2NFbnRyeShzdXJmLT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpLT5hbHBoYU1hc2sgPT0gMHgwMDAwMDAwMCkgewoKICAgICAgICAgICAgICAgIGlmKG9wWzBdLmFvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIHsKICAgICAgICAgICAgICAgICAgICBvcFswXS5hYXJnMSA9IFdJTkVEM0RUQV9URVhUVVJFOwogICAgICAgICAgICAgICAgICAgIG9wWzBdLmFvcCA9IFdJTkVEM0RUT1BfU0VMRUNUQVJHMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYob3BbMF0uYW9wID09IFdJTkVEM0RUT1BfU0VMRUNUQVJHMSAmJiBvcFswXS5hYXJnMSAhPSBXSU5FRDNEVEFfVEVYVFVSRSkgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0uYWFyZzIgPSBXSU5FRDNEVEFfVEVYVFVSRTsKICAgICAgICAgICAgICAgICAgICAgICAgb3BbMF0uYW9wID0gV0lORUQzRFRPUF9NT0RVTEFURTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBvcFswXS5hYXJnMSA9IFdJTkVEM0RUQV9URVhUVVJFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihvcFswXS5hb3AgPT0gV0lORUQzRFRPUF9TRUxFQ1RBUkcyICYmIG9wWzBdLmFhcmcyICE9IFdJTkVEM0RUQV9URVhUVVJFKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFXSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcFswXS5hYXJnMSA9IFdJTkVEM0RUQV9URVhUVVJFOwogICAgICAgICAgICAgICAgICAgICAgICBvcFswXS5hb3AgPSBXSU5FRDNEVE9QX01PRFVMQVRFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIG9wWzBdLmFhcmcyID0gV0lORUQzRFRBX1RFWFRVUkU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKG9wW2ldLmNhcmcxID09IFdJTkVEM0RUQV9URVhUVVJFIHx8IG9wW2ldLmNhcmcyID09IFdJTkVEM0RUQV9URVhUVVJFIHx8IG9wW2ldLmNhcmcwID09IFdJTkVEM0RUQV9URVhUVVJFIHx8CiAgICAgICAgICAgb3BbaV0uYWFyZzEgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwgb3BbaV0uYWFyZzIgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwgb3BbaV0uYWFyZzAgPT0gV0lORUQzRFRBX1RFWFRVUkUpIHsKICAgICAgICAgICAgdHRmZiA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHU107CiAgICAgICAgICAgIGlmKHR0ZmYgPT0gKFdJTkVEM0RUVEZGX1BST0pFQ1RFRCB8IFdJTkVEM0RUVEZGX0NPVU5UMykpIHsKICAgICAgICAgICAgICAgIG9wW2ldLnByb2plY3RlZCA9IHByb2pfY291bnQzOwogICAgICAgICAgICB9IGVsc2UgaWYodHRmZiA9PSAoV0lORUQzRFRURkZfUFJPSkVDVEVEIHwgV0lORUQzRFRURkZfQ09VTlQ0KSkgewogICAgICAgICAgICAgICAgb3BbaV0ucHJvamVjdGVkID0gcHJval9jb3VudDQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvcFtpXS5wcm9qZWN0ZWQgPSBwcm9qX25vbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcFtpXS5wcm9qZWN0ZWQgPSBwcm9qX25vbmU7CiAgICAgICAgfQoKICAgICAgICBvcFtpXS5kc3QgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19SRVNVTFRBUkddOwogICAgfQoKICAgIC8qIENsZWFyIHVuc3VwcG9ydGVkIHN0YWdlcyAqLwogICAgZm9yKDsgaSA8IE1BWF9URVhUVVJFUzsgaSsrKSB7CiAgICAgICAgbWVtc2V0KCZvcFtpXSwgMHhmZiwgc2l6ZW9mKG9wW2ldKSk7CiAgICB9Cn0KI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKc3RydWN0IGZmcF9kZXNjICpmaW5kX2ZmcF9zaGFkZXIoc3RydWN0IGxpc3QgKnNoYWRlcnMsIHN0cnVjdCB0ZXh0dXJlX3N0YWdlX29wIG9wW01BWF9URVhUVVJFU10pCnsKICAgIHN0cnVjdCBmZnBfZGVzYyAqZW50cnk7CgogICAgLyogVE9ETzogT3B0aW1pemUgdGhpcy4gRmluZGluZyB0aGUgc2hhZGVyIGNhbiBiZSBvcHRpbWl6ZWQgYnkgZS5nLiBzb3J0aW5nIHRoZSBsaXN0LAogICAgICogb3IgbWF5YmUgY29uc2lkZXIgdXNpbmcgaGFzaHRhYmxlcwogICAgICovCiAgICBMSVNUX0ZPUl9FQUNIX0VOVFJZKGVudHJ5LCBzaGFkZXJzLCBzdHJ1Y3QgZmZwX2Rlc2MsIGVudHJ5KSB7CiAgICAgICAgaWYobWVtY21wKG9wLCBlbnRyeS0+b3AsIHNpemVvZihzdHJ1Y3QgdGV4dHVyZV9zdGFnZV9vcCkgKiBNQVhfVEVYVFVSRVMpID09IDApIHsKICAgICAgICAgICAgVFJBQ0UoIkZvdW5kIHNoYWRlciBlbnRyeSAlcFxuIiwgZW50cnkpOwogICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgfQogICAgfQoKICAgIFRSQUNFKCJTaGFkZXIgbm90IGZvdW5kXG4iKTsKICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkIGFkZF9mZnBfc2hhZGVyKHN0cnVjdCBsaXN0ICpzaGFkZXJzLCBzdHJ1Y3QgZmZwX2Rlc2MgKmRlc2MpIHsKICAgIGxpc3RfYWRkX2hlYWQoc2hhZGVycywgJmRlc2MtPmVudHJ5KTsKfQoKLyogQWN0aXZhdGVzIHRoZSB0ZXh0dXJlIGRpbWVuc2lvbiBhY2NvcmRpbmcgdG8gdGhlIGJvdW5kIEQzRCB0ZXh0dXJlLgogKiBEb2VzIG5vdCBjYXJlIGZvciB0aGUgY29sb3JvcCBvciBjb3JyZWN0IGdsIHRleHR1cmUgdW5pdCh3aGVuIHVzaW5nIG52cmMpCiAqIFJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYWN0aXZhdGUgdGhlIGNvcnJlY3QgdW5pdCBiZWZvcmUKICovCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8Kdm9pZCB0ZXh0dXJlX2FjdGl2YXRlX2RpbWVuc2lvbnMoRFdPUkQgc3RhZ2UsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBCT09MIGJ1bXBtYXAgPSBGQUxTRTsKCiAgICBpZihzdGFnZSA+IDAgJiYgKHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZSAtIDFdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHx8CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZSAtIDFdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQKSkgewogICAgICAgIGJ1bXBtYXAgPSBUUlVFOwogICAgICAgIGNvbnRleHQtPnRleFNoYWRlckJ1bXBNYXAgfD0gKDEgPDwgc3RhZ2UpOwogICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0LT50ZXhTaGFkZXJCdW1wTWFwICY9IH4oMSA8PCBzdGFnZSk7CiAgICB9CgogICAgaWYoc3RhdGVibG9jay0+dGV4dHVyZXNbc3RhZ2VdKSB7CiAgICAgICAgc3dpdGNoKHN0YXRlYmxvY2stPnRleHR1cmVEaW1lbnNpb25zW3N0YWdlXSkgewogICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIGJ1bXBtYXAgPyBHTF9PRkZTRVRfVEVYVFVSRV8yRF9OViA6IEdMX1RFWFRVUkVfMkQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIC4uLikiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX1JFQ1RBTkdMRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCkiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQjoKICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIyKSkgewogICAgICAgICAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX1NIQURFUl9OViwgR0xfU0hBREVSX09QRVJBVElPTl9OViwgYnVtcG1hcCA/IEdMX09GRlNFVF9URVhUVVJFXzJEX05WIDogR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCAuLi4pIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpIik7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFXzNEOgogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFXzNEKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX1JFQ1RBTkdMRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzJEKSIpOwogICAgICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfM0QpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9BUkI6CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1NIQURFUl9PUEVSQVRJT05fTlYsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQikiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8yRCkiKTsKICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfUkVDVEFOR0xFKSkgewogICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9OT05FKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4RW52aShHTF9URVhUVVJFX1NIQURFUl9OViwgR0xfU0hBREVSX09QRVJBVElPTl9OViwgR0xfTk9ORSkiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpIik7CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzNEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzNEKSIpOwogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9SRUNUQU5HTEUpKSB7CiAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV9SRUNUQU5HTEVfQVJCKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEJpbmRpbmcgdGV4dHVyZXMgaXMgZG9uZSBieSBzYW1wbGVycy4gQSBkdW1teSB0ZXh0dXJlIHdpbGwgYmUgYm91bmQgKi8KICAgICAgICB9CiAgICB9Cn0KI3VuZGVmIEdMSU5GT19MT0NBVElPTgo=