LyoKICogdHZlZXByb20gLSBlZXByb20gZGVjb2RlciBmb3IgdHZjYXJkIGNvbmZpZ3VyYXRpb24gZWVwcm9tcwogKgogKiBEYXRhIGFuZCBkZWNvZGluZyByb3V0aW5lcyBzaGFtZWxlc3NseSBib3Jyb3dlZCBmcm9tIGJ0dHYtY2FyZHMuYwogKiBlZXByb20gYWNjZXNzIHJvdXRpbmUgc2hhbWVsZXNzbHkgYm9ycm93ZWQgZnJvbSBidHR2LWlmLmMKICogd2hpY2ggYXJlOgoKICAgIENvcHlyaWdodCAoQykgMTk5Niw5Nyw5OCBSYWxwaCAgTWV0emxlciAocmprbUB0aHAudW5pLWtvZWxuLmRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIChtb2NtQHRocC51bmkta29lbG4uZGUpCiAgICAoYykgMTk5OS0yMDAxIEdlcmQgS25vcnIgPGtyYXhlbEBnb2xkYmFjaC5pbi1iZXJsaW4uZGU+CgogKiBBZGp1c3RtZW50cyB0byBmaXQgYSBtb3JlIGdlbmVyYWwgbW9kZWwgYW5kIGFsbCBidWdzOgoKIAlDb3B5cmlnaHQgKEMpIDIwMDMgSm9obiBLbGFyIDxsaW5wdnIgYXQgcHJvamVjdHBsYXNtYS5jb20+CgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CgojaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+CgpNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBIYXVwcGF1Z2UgZWVwcm9tIGRlY29kZXIgZHJpdmVyIik7Ck1PRFVMRV9BVVRIT1IoIkpvaG4gS2xhciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpzdGF0aWMgaW50IGRlYnVnID0gMDsKbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMikiKTsKCiNkZWZpbmUgU1RSTShhcnJheSxpKSAoaSA8IHNpemVvZihhcnJheSkvc2l6ZW9mKGNoYXIqKSA/IGFycmF5W2ldIDogInVua25vd24iKQoKI2RlZmluZSBkcHJpbnRrKG51bSwgYXJncy4uLikgXAoJZG8geyBcCgkJaWYgKGRlYnVnID49IG51bSkgXAoJCQlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbTogIiBhcmdzKTsgXAoJfSB3aGlsZSAoMCkKCiNkZWZpbmUgVFZFRVBST01fS0VSTl9FUlIoYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICJ0dmVlcHJvbTogIiBhcmdzKTsKI2RlZmluZSBUVkVFUFJPTV9LRVJOX0lORk8oYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb206ICIgYXJncyk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIGhhdXBwYXVnZSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCBIQVVQUEFVR0VfVFVORVJfRk1UCnsKCWludAlpZDsKCWNoYXIgKm5hbWU7Cn0KaGF1cHBhdWdlX3R1bmVyX2ZtdFtdID0KewoJeyAweDAwMDAwMDAwLCAidW5rbm93bjEiIH0sCgl7IDB4MDAwMDAwMDAsICJ1bmtub3duMiIgfSwKCXsgMHgwMDAwMDAwNywgIlBBTChCL0cpIiB9LAoJeyAweDAwMDAxMDAwLCAiTlRTQyhNKSIgfSwKCXsgMHgwMDAwMDAxMCwgIlBBTChJKSIgfSwKCXsgMHgwMDQwMDAwMCwgIlNFQ0FNKEwvTLQpIiB9LAoJeyAweDAwMDAwZTAwLCAiUEFMKEQvSykiIH0sCgl7IDB4MDMwMDAwMDAsICJBVFNDIERpZ2l0YWwiIH0sCn07CgovKiBUaGlzIGlzIHRoZSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdHVuZXJzLiBNYW55IHRoYW5rcyB0byBIYXVwcGF1Z2UgZm9yCiAgIHN1cHBseWluZyB0aGlzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgbWFueSB0dW5lcnMgd2hlcmUgb25seSB1c2VkIGZvcgogICB0ZXN0aW5nIGFuZCBuZXZlciBtYWRlIGl0IHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBTbyB5b3Ugd2lsbCBvbmx5IHNlZQogICBhIHN1YnNldCBpbiBhY3R1YWwgcHJvZHVjZWQgY2FyZHMuICovCnN0YXRpYyBzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSCnsKCWludCAgaWQ7CgljaGFyICpuYW1lOwp9CmhhdXBwYXVnZV90dW5lcltdID0KewoJLyogMC05ICovCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJOb25lIiB9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiRXh0ZXJuYWwiIH0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJVbnNwZWNpZmllZCIgfSwKCXsgVFVORVJfUEhJTElQU19QQUwsICAgIlBoaWxpcHMgRkkxMjE2IiB9LAoJeyBUVU5FUl9QSElMSVBTX1NFQ0FNLCAiUGhpbGlwcyBGSTEyMTZNRiIgfSwKCXsgVFVORVJfUEhJTElQU19OVFNDLCAgIlBoaWxpcHMgRkkxMjM2IiB9LAoJeyBUVU5FUl9QSElMSVBTX1BBTF9JLCAiUGhpbGlwcyBGSTEyNDYiIH0sCgl7IFRVTkVSX1BISUxJUFNfUEFMX0RLLCJQaGlsaXBzIEZJMTI1NiIgfSwKCXsgVFVORVJfUEhJTElQU19QQUwsICAgIlBoaWxpcHMgRkkxMjE2IE1LMiIgfSwKCXsgVFVORVJfUEhJTElQU19TRUNBTSwgIlBoaWxpcHMgRkkxMjE2TUYgTUsyIiB9LAoJLyogMTAtMTkgKi8KCXsgVFVORVJfUEhJTElQU19OVFNDLCAgIlBoaWxpcHMgRkkxMjM2IE1LMiIgfSwKCXsgVFVORVJfUEhJTElQU19QQUxfSSwgIlBoaWxpcHMgRkkxMjQ2IE1LMiIgfSwKCXsgVFVORVJfUEhJTElQU19QQUxfREssIlBoaWxpcHMgRkkxMjU2IE1LMiIgfSwKCXsgVFVORVJfVEVNSUNfTlRTQywgICAgIlRlbWljIDQwMzJGWTUiIH0sCgl7IFRVTkVSX1RFTUlDX1BBTCwgICAgICJUZW1pYyA0MDAyRkg1IiB9LAoJeyBUVU5FUl9URU1JQ19QQUxfSSwgICAiVGVtaWMgNDA2MkZZNSIgfSwKCXsgVFVORVJfUEhJTElQU19QQUwsICAgIlBoaWxpcHMgRlIxMjE2IE1LMiIgfSwKCXsgVFVORVJfUEhJTElQU19TRUNBTSwgIlBoaWxpcHMgRlIxMjE2TUYgTUsyIiB9LAoJeyBUVU5FUl9QSElMSVBTX05UU0MsICAiUGhpbGlwcyBGUjEyMzYgTUsyIiB9LAoJeyBUVU5FUl9QSElMSVBTX1BBTF9JLCAiUGhpbGlwcyBGUjEyNDYgTUsyIiB9LAoJLyogMjAtMjkgKi8KCXsgVFVORVJfUEhJTElQU19QQUxfREssIlBoaWxpcHMgRlIxMjU2IE1LMiIgfSwKCXsgVFVORVJfUEhJTElQU19QQUwsICAgIlBoaWxpcHMgRk0xMjE2IiB9LAoJeyBUVU5FUl9QSElMSVBTX1NFQ0FNLCAiUGhpbGlwcyBGTTEyMTZNRiIgfSwKCXsgVFVORVJfUEhJTElQU19OVFNDLCAgIlBoaWxpcHMgRk0xMjM2IiB9LAoJeyBUVU5FUl9QSElMSVBTX1BBTF9JLCAiUGhpbGlwcyBGTTEyNDYiIH0sCgl7IFRVTkVSX1BISUxJUFNfUEFMX0RLLCJQaGlsaXBzIEZNMTI1NiIgfSwKCXsgVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLCAiVGVtaWMgNDAzNkZZNSIgfSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQTjkwODJEIiB9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BNOTA5MlAiIH0sCgl7IFRVTkVSX1RFTUlDXzQwMDZGSDVfUEFMLCAiVGVtaWMgNDAwNkZINSIgfSwKCS8qIDMwLTM5ICovCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJTYW1zdW5nIFRDUE45MDg1RCIgfSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQQjkwODVQIiB9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BMOTA5MVAiIH0sCgl7IFRVTkVSX1RFTUlDXzQwMzlGUjVfTlRTQywgIlRlbWljIDQwMzlGUjUiIH0sCgl7IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsICAgIlBoaWxpcHMgRlExMjE2IE1FIiB9LAoJeyBUVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JLCAiVGVtaWMgNDA2NkZZNSIgfSwKICAgICAgICB7IFRVTkVSX1BISUxJUFNfTlRTQywgICAgICAgICJQaGlsaXBzIFREMTUzNiIgfSwKICAgICAgICB7IFRVTkVSX1BISUxJUFNfTlRTQywgICAgICAgICJQaGlsaXBzIFREMTUzNkQiIH0sCgl7IFRVTkVSX1BISUxJUFNfTlRTQywgICJQaGlsaXBzIEZNUjEyMzYiIH0sIC8qIG1vbm8gcmFkaW8gKi8KCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRkkxMjU2TVAiIH0sCgkvKiA0MC00OSAqLwoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BROTA5MVAiIH0sCgl7IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLCAiVGVtaWMgNDAwNkZONSIgfSwKCXsgVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsICJUZW1pYyA0MDA5RlI1IiB9LAoJeyBUVU5FUl9URU1JQ180MDQ2Rk01LCAgICAgIlRlbWljIDQwNDZGTTUiIH0sCgl7IFRVTkVSX1RFTUlDXzQwMDlGTjVfTVVMVElfUEFMX0ZNLCAiVGVtaWMgNDAwOUZONSIgfSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgVEQxNTM2RCBGSCA0NCJ9LAoJeyBUVU5FUl9MR19OVFNDX0ZNLCAgICAiTEcgVFAxOE5TUjAxRiJ9LAoJeyBUVU5FUl9MR19QQUxfRk0sICAgICAiTEcgVFAxOFBTQjAxRCJ9LAoJeyBUVU5FUl9MR19QQUwsICAgICAgICAiTEcgVFAxOFBTQjExRCJ9LAoJeyBUVU5FUl9MR19QQUxfSV9GTSwgICAiTEcgVEFQQy1JMDAxRCJ9LAoJLyogNTAtNTkgKi8KCXsgVFVORVJfTEdfUEFMX0ksICAgICAgIkxHIFRBUEMtSTcwMUQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRlbWljIDQwNDJGSTUifSwKCXsgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUsICJNaWNyb3R1bmUgNDA0OSBGTTUifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRQSThOU1IxMUYifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIk1pY3JvdHVuZSA0MDQ5IEZNNSBBbHQgSTJDIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIxNk1FIE1LMyJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGSTEyMzYgTUszIn0sCgl7IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAiUGhpbGlwcyBGTTEyMTYgTUUgTUszIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZNMTIzNiBNSzMifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRk0xMjE2TVAgTUszIn0sCgkvKiA2MC02OSAqLwoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgUzAwMUQgTUszIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBNMDAxRCBNSzMifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFM3MDFEIE1LMyJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgTTcwMUQgTUszIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MTQ2Rk01In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MTM2Rlk1In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MTA2Rkg1In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIxNkxNUCBNSzMifSwKCXsgVFVORVJfTEdfTlRTQ19UQVBFLCAgIkxHIFRBUEUgSDAwMUYgTUszIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQVBFIEg3MDFGIE1LMyJ9LAoJLyogNzAtNzkgKi8KCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gSDIwMFQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gSDI1MFQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gTTIwMFQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gWjIwMFQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gUzIwMFQifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRob21wc29uIERUVDc1OTUifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRob21wc29uIERUVDc1OTIifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNpbGljb24gVERBODI3NUMxIDgyOTAifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNpbGljb24gVERBODI3NUMxIDgyOTAgRk0ifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRob21wc29uIERUVDc1NyJ9LAoJLyogODAtODkgKi8KCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TE1FIE1LMyJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFQQyBHNzAxRCJ9LAoJeyBUVU5FUl9MR19OVFNDX05FV19UQVBDLCAiTEcgVEFQQyBINzkxRiJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNQiAzIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgMjAwMk1JIDMifSwKCXsgVFVORVJfVENMXzIwMDJOLCAgICAgIlRDTCAyMDAyTiA2QSJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUszIn0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJTYW1zdW5nIFRDUE4gMjEyMVAzMEEifSwKCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQRSA0MTIxUDMwQSJ9LAoJeyBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywgIlRDTCBNRlBFMDUgMiJ9LAoJLyogOTAtOTkgKi8KCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gSDIwMlQifSwKCXsgVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0LCAiUGhpbGlwcyBGUTEyMTZBTUUgTUs0In0sCgl7IFRVTkVSX1BISUxJUFNfRlExMjM2QV9NSzQsICJQaGlsaXBzIEZRMTIzNkEgTUs0In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTI4NkEgTUs0In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIxNk1FIE1LNSJ9LAoJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUs1In0sCgl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJVbnNwZWNpZmllZCJ9LAoJeyBUVU5FUl9MR19QQUxfVEFQRSwgICAiTEcgUEFMIChUQVBFIFNlcmllcykifSwKfTsKCnN0YXRpYyBjaGFyICpzbmR0eXBlW10gPSB7CgkiTm9uZSIsICJURUE2MzAwIiwgIlRFQTYzMjAiLCAiVERBOTg1MCIsICJNU1AzNDAwQyIsICJNU1AzNDEwRCIsCgkiTVNQMzQxNSIsICJNU1AzNDMwIiwgIk1TUDM0MzgiLCAiQ1M1MzMxIiwgIk1TUDM0MzUiLCAiTVNQMzQ0MCIsCgkiTVNQMzQ0NSIsICJNU1AzNDExIiwgIk1TUDM0MTYiLCAiTVNQMzQyNSIsCgoJIlR5cGUgMHgxMCIsIlR5cGUgMHgxMSIsIlR5cGUgMHgxMiIsIlR5cGUgMHgxMyIsCgkiVHlwZSAweDE0IiwiVHlwZSAweDE1IiwiVHlwZSAweDE2IiwiVHlwZSAweDE3IiwKCSJUeXBlIDB4MTgiLCJNU1A0NDE4IiwiVHlwZSAweDFhIiwiTVNQNDQ0OCIsCgkiVHlwZSAweDFjIiwiVHlwZSAweDFkIiwiVHlwZSAweDFlIiwiVHlwZSAweDFmIiwKfTsKCnN0YXRpYyBpbnQgaGFzUmFkaW9UdW5lcihpbnQgdHVuZXJUeXBlKQp7CiAgICAgICAgc3dpdGNoICh0dW5lclR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTg6IC8vUE5QRW52X1RVTkVSX0ZSMTIzNl9NSzI6CiAgICAgICAgICAgICAgICBjYXNlIDIzOiAvL1BOUEVudl9UVU5FUl9GTTEyMzY6CiAgICAgICAgICAgICAgICBjYXNlIDM4OiAvL1BOUEVudl9UVU5FUl9GTVIxMjM2OgogICAgICAgICAgICAgICAgY2FzZSAxNjogLy9QTlBFbnZfVFVORVJfRlIxMjE2X01LMjoKICAgICAgICAgICAgICAgIGNhc2UgMTk6IC8vUE5QRW52X1RVTkVSX0ZSMTI0Nl9NSzI6CiAgICAgICAgICAgICAgICBjYXNlIDIxOiAvL1BOUEVudl9UVU5FUl9GTTEyMTY6CiAgICAgICAgICAgICAgICBjYXNlIDI0OiAvL1BOUEVudl9UVU5FUl9GTTEyNDY6CiAgICAgICAgICAgICAgICBjYXNlIDE3OiAvL1BOUEVudl9UVU5FUl9GUjEyMTZNRl9NSzI6CiAgICAgICAgICAgICAgICBjYXNlIDIyOiAvL1BOUEVudl9UVU5FUl9GTTEyMTZNRjoKICAgICAgICAgICAgICAgIGNhc2UgMjA6IC8vUE5QRW52X1RVTkVSX0ZSMTI1Nl9NSzI6CiAgICAgICAgICAgICAgICBjYXNlIDI1OiAvL1BOUEVudl9UVU5FUl9GTTEyNTY6CiAgICAgICAgICAgICAgICBjYXNlIDMzOiAvL1BOUEVudl9UVU5FUl80MDM5RlI1OgogICAgICAgICAgICAgICAgY2FzZSA0MjogLy9QTlBFbnZfVFVORVJfNDAwOUZSNToKICAgICAgICAgICAgICAgIGNhc2UgNTI6IC8vUE5QRW52X1RVTkVSXzQwNDlGTTU6CiAgICAgICAgICAgICAgICBjYXNlIDU0OiAvL1BOUEVudl9UVU5FUl80MDQ5Rk01X0FsdEkyQzoKICAgICAgICAgICAgICAgIGNhc2UgNDQ6IC8vUE5QRW52X1RVTkVSXzQwMDlGTjU6CiAgICAgICAgICAgICAgICBjYXNlIDMxOiAvL1BOUEVudl9UVU5FUl9UQ1BCOTA4NVA6CiAgICAgICAgICAgICAgICBjYXNlIDMwOiAvL1BOUEVudl9UVU5FUl9UQ1BOOTA4NUQ6CiAgICAgICAgICAgICAgICBjYXNlIDQ2OiAvL1BOUEVudl9UVU5FUl9UUDE4TlNSMDFGOgogICAgICAgICAgICAgICAgY2FzZSA0NzogLy9QTlBFbnZfVFVORVJfVFAxOFBTQjAxRDoKICAgICAgICAgICAgICAgIGNhc2UgNDk6IC8vUE5QRW52X1RVTkVSX1RBUENfSTAwMUQ6CiAgICAgICAgICAgICAgICBjYXNlIDYwOiAvL1BOUEVudl9UVU5FUl9UQVBFX1MwMDFEX01LMzoKICAgICAgICAgICAgICAgIGNhc2UgNTc6IC8vUE5QRW52X1RVTkVSX0ZNMTIxNk1FX01LMzoKICAgICAgICAgICAgICAgIGNhc2UgNTk6IC8vUE5QRW52X1RVTkVSX0ZNMTIxNk1QX01LMzoKICAgICAgICAgICAgICAgIGNhc2UgNTg6IC8vUE5QRW52X1RVTkVSX0ZNMTIzNl9NSzM6CiAgICAgICAgICAgICAgICBjYXNlIDY4OiAvL1BOUEVudl9UVU5FUl9UQVBFX0gwMDFGX01LMzoKICAgICAgICAgICAgICAgIGNhc2UgNjE6IC8vUE5QRW52X1RVTkVSX1RBUEVfTTAwMURfTUszOgogICAgICAgICAgICAgICAgY2FzZSA3ODogLy9QTlBFbnZfVFVORVJfVERBODI3NUMxXzgyOTBfRk06CiAgICAgICAgICAgICAgICBjYXNlIDg5OiAvL1BOUEVudl9UVU5FUl9UQ0xfTUZQRTA1XzI6CiAgICAgICAgICAgICAgICBjYXNlIDkyOiAvL1BOUEVudl9UVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKfQoKdm9pZCB0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKHN0cnVjdCB0dmVlcHJvbSAqdHZlZSwgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGEpCnsKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSoqIFRoZSBoYXVwcGF1Z2UgZWVwcm9tIGZvcm1hdCBpcyB0YWdnZWQKCSoqCgkqKiBpZiBwYWNrZXRbMF0gPT0gMHg4NCwgdGhlbiBwYWNrZXRbMC4uMV0gPT0gbGVuZ3RoCgkqKiBlbHNlIGxlbmd0aCA9IHBhY2tldFswXSAmIDNmOwoJKiogaWYgcGFja2V0WzBdICYgZjggPT0gZjgsIHRoZW4gRU9EIGFuZCBwYWNrZXRbMV0gPT0gY2hlY2tzdW0KCSoqCgkqKiBJbiBvdXIgKGl2dHYpIGNhc2Ugd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgZm9sbG93aW5nOgoJKiogdHVuZXIgdHlwZTogdGFnIFswMF0uMDUgb3IgWzBhXS4wMSAoaW5kZXggaW50byBoYXVwcGF1Z2VfdHVuZXIpCgkqKiB0dW5lciBmbXRzOiB0YWcgWzAwXS4wNCBvciBbMGFdLjAwIChiaXRtYXNrIGluZGV4IGludG8gaGF1cHBhdWdlX3R1bmVyX2ZtdCkKCSoqIHJhZGlvOiAgICAgIHRhZyBbMDBdLntsYXN0fSBvciBbMGVdLjAwICAoYml0bWFzay4gIGJpdDI9Rk0pCgkqKiBhdWRpbyBwcm9jOiB0YWcgWzAyXS4wMSBvciBbMDVdLjAwIChsb3dlciBuaWJibGUgaW5kZXhlcyBsdXQ/KQoKCSoqIEZ1biBpbmZvOgoJKiogbW9kZWw6ICAgICAgdGFnIFswMF0uMDctMDggb3IgWzA2XS4wMC0wMQoJKiogcmV2aXNpb246ICAgdGFnIFswMF0uMDktMGIgb3IgWzA2XS4wNC0wNgoJKiogc2VyaWFsIzogICAgdGFnIFswMV0uMDUtMDcgb3IgWzA0XS4wNC0wNgoKCSoqICMgb2YgaW5wdXRzL291dHB1dHMgPz8/CgkqLwoKCWludCBpLCBqLCBsZW4sIGRvbmUsIGJlZW5oZXJlLCB0YWcsIHR1bmVyID0gMCwgdF9mb3JtYXQgPSAwOwoJY2hhciAqdF9uYW1lID0gTlVMTCwgKnRfZm10X25hbWUgPSBOVUxMOwoKCWRwcmludGsoMSwgIiVzXG4iLF9fRlVOQ1RJT05fXyk7Cgl0dmVlLT5yZXZpc2lvbiA9IGRvbmUgPSBsZW4gPSBiZWVuaGVyZSA9IDA7Cglmb3IgKGkgPSAwOyAhZG9uZSAmJiBpIDwgMjU2OyBpICs9IGxlbikgewoJCWRwcmludGsoMiwgInByb2Nlc3NpbmcgcG9zID0gJTAyeCAoJTAyeCwgJTAyeClcbiIsCgkJCWksIGVlcHJvbV9kYXRhW2ldLCBlZXByb21fZGF0YVtpICsgMV0pOwoKCQlpZiAoZWVwcm9tX2RhdGFbaV0gPT0gMHg4NCkgewoJCQlsZW4gPSBlZXByb21fZGF0YVtpICsgMV0gKyAoZWVwcm9tX2RhdGFbaSArIDJdIDw8IDgpOwoJCQlpKz0zOwoJCX0gZWxzZSBpZiAoKGVlcHJvbV9kYXRhW2ldICYgMHhmMCkgPT0gMHg3MCkgewoJCQlpZiAoKGVlcHJvbV9kYXRhW2ldICYgMHgwOCkpIHsKCQkJCS8qIHZlcmlmeSBjaGVja3N1bSEgKi8KCQkJCWRvbmUgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQkJbGVuID0gZWVwcm9tX2RhdGFbaV0gJiAweDA3OwoJCQkrK2k7CgkJfSBlbHNlIHsKCQkJVFZFRVBST01fS0VSTl9FUlIoIkVuY291bnRlcmVkIGJhZCBwYWNrZXQgaGVhZGVyIFslMDJ4XS4gIgoJCQkJICAgIkNvcnJ1cHQgb3Igbm90IGEgSGF1cHBhdWdlIGVlcHJvbS5cbiIsIGVlcHJvbV9kYXRhW2ldKTsKCQkJcmV0dXJuOwoJCX0KCgkJZHByaW50aygxLCAiJTNkIFslMDJ4XSAiLCBsZW4sIGVlcHJvbV9kYXRhW2ldKTsKCQlmb3IoaiA9IDE7IGogPCBsZW47IGorKykgewoJCQlkcHJpbnRrKDEsICIlMDJ4ICIsIGVlcHJvbV9kYXRhW2kgKyBqXSk7CgkJfQoJCWRwcmludGsoMSwgIlxuIik7CgoJCS8qIHByb2Nlc3MgYnkgdGFnICovCgkJdGFnID0gZWVwcm9tX2RhdGFbaV07CgkJc3dpdGNoICh0YWcpIHsKCQljYXNlIDB4MDA6CgkJCXR1bmVyID0gZWVwcm9tX2RhdGFbaSs2XTsKCQkJdF9mb3JtYXQgPSBlZXByb21fZGF0YVtpKzVdOwoJCQl0dmVlLT5oYXNfcmFkaW8gPSBlZXByb21fZGF0YVtpK2xlbi0xXTsKCQkJdHZlZS0+bW9kZWwgPQoJCQkJZWVwcm9tX2RhdGFbaSs4XSArCgkJCQkoZWVwcm9tX2RhdGFbaSs5XSA8PCA4KTsKCQkJdHZlZS0+cmV2aXNpb24gPSBlZXByb21fZGF0YVtpKzEwXSArCgkJCQkoZWVwcm9tX2RhdGFbaSsxMV0gPDwgOCkgKwoJCQkJKGVlcHJvbV9kYXRhW2krMTJdIDw8IDE2KTsKCQkJYnJlYWs7CgkJY2FzZSAweDAxOgoJCQl0dmVlLT5zZXJpYWxfbnVtYmVyID0KCQkJCWVlcHJvbV9kYXRhW2krNl0gKwoJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgOCkgKwoJCQkJKGVlcHJvbV9kYXRhW2krOF0gPDwgMTYpOwoJCQlicmVhazsKCQljYXNlIDB4MDI6CgkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMl0gJiAweDBmOwoJCQlicmVhazsKCQljYXNlIDB4MDQ6CgkJCXR2ZWUtPnNlcmlhbF9udW1iZXIgPQoJCQkJZWVwcm9tX2RhdGFbaSs1XSArCgkJCQkoZWVwcm9tX2RhdGFbaSs2XSA8PCA4KSArCgkJCQkoZWVwcm9tX2RhdGFbaSs3XSA8PCAxNik7CgkJCWJyZWFrOwoJCWNhc2UgMHgwNToKCQkJdHZlZS0+YXVkaW9fcHJvY2Vzc29yID0gZWVwcm9tX2RhdGFbaSsxXSAmIDB4MGY7CgkJCWJyZWFrOwoJCWNhc2UgMHgwNjoKCQkJdHZlZS0+bW9kZWwgPQoJCQkJZWVwcm9tX2RhdGFbaSsxXSArCgkJCQkoZWVwcm9tX2RhdGFbaSsyXSA8PCA4KTsKCQkJdHZlZS0+cmV2aXNpb24gPSBlZXByb21fZGF0YVtpKzVdICsKCQkJCShlZXByb21fZGF0YVtpKzZdIDw8IDgpICsKCQkJCShlZXByb21fZGF0YVtpKzddIDw8IDE2KTsKCQkJYnJlYWs7CgkJY2FzZSAweDBhOgoJCQlpZihiZWVuaGVyZSA9PSAwKSB7CgkJCQl0dW5lciA9IGVlcHJvbV9kYXRhW2krMl07CgkJCQl0X2Zvcm1hdCA9IGVlcHJvbV9kYXRhW2krMV07CgkJCQliZWVuaGVyZSA9IDE7CgkJCQlicmVhazsKCQkJfSBlbHNlIHsKCQkJCWJyZWFrOwoJCQl9CgkJY2FzZSAweDBlOgoJCQl0dmVlLT5oYXNfcmFkaW8gPSBlZXByb21fZGF0YVtpKzFdOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlkcHJpbnRrKDEsICJOb3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGFnIFslMDJ4XVxuIiwgdGFnKTsKCQkJLyogZHVtcCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0PyAqLwoJCX0KCgl9CgoJaWYgKCFkb25lKSB7CgkJVFZFRVBST01fS0VSTl9FUlIoIlJhbiBvdXQgb2YgZGF0YSFcbiIpOwoJCXJldHVybjsKCX0KCglpZiAodHZlZS0+cmV2aXNpb24gIT0gMCkgewoJCXR2ZWUtPnJldl9zdHJbMF0gPSAzMiArICgodHZlZS0+cmV2aXNpb24gPj4gMTgpICYgMHgzZik7CgkJdHZlZS0+cmV2X3N0clsxXSA9IDMyICsgKCh0dmVlLT5yZXZpc2lvbiA+PiAxMikgJiAweDNmKTsKCQl0dmVlLT5yZXZfc3RyWzJdID0gMzIgKyAoKHR2ZWUtPnJldmlzaW9uID4+ICA2KSAmIDB4M2YpOwoJCXR2ZWUtPnJldl9zdHJbM10gPSAzMiArICggdHZlZS0+cmV2aXNpb24gICAgICAgICYgMHgzZik7CgkJdHZlZS0+cmV2X3N0cls0XSA9IDA7Cgl9CgogICAgICAgIGlmIChoYXNSYWRpb1R1bmVyKHR1bmVyKSAmJiAhdHZlZS0+aGFzX3JhZGlvKSB7CgkgICAgVFZFRVBST01fS0VSTl9JTkZPKCJUaGUgZWVwcm9tIHNheXMgbm8gcmFkaW8gaXMgcHJlc2VudCwgYnV0IHRoZSB0dW5lciB0eXBlXG4iKTsKCSAgICBUVkVFUFJPTV9LRVJOX0lORk8oImluZGljYXRlcyBvdGhlcndpc2UuIEkgd2lsbCBhc3N1bWUgdGhhdCByYWRpbyBpcyBwcmVzZW50LlxuIik7CiAgICAgICAgICAgIHR2ZWUtPmhhc19yYWRpbyA9IDE7CiAgICAgICAgfQoKCWlmICh0dW5lciA8IHNpemVvZihoYXVwcGF1Z2VfdHVuZXIpL3NpemVvZihzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSKSkgewoJCXR2ZWUtPnR1bmVyX3R5cGUgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXJdLmlkOwoJCXRfbmFtZSA9IGhhdXBwYXVnZV90dW5lclt0dW5lcl0ubmFtZTsKCX0gZWxzZSB7CgkJdF9uYW1lID0gIjx1bmtub3duPiI7Cgl9CgoJdHZlZS0+dHVuZXJfZm9ybWF0cyA9IDA7Cgl0X2ZtdF9uYW1lID0gIjxub25lPiI7Cglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJaWYgKHRfZm9ybWF0ICYgKDE8PGkpKSB7CgkJCXR2ZWUtPnR1bmVyX2Zvcm1hdHMgfD0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5pZDsKCQkJLyogeXVjayAqLwoJCQl0X2ZtdF9uYW1lID0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5uYW1lOwoJCX0KCX0KCgoJVFZFRVBST01fS0VSTl9JTkZPKCJIYXVwcGF1Z2U6IG1vZGVsID0gJWQsIHJldiA9ICVzLCBzZXJpYWwjID0gJWRcbiIsCgkJICAgdHZlZS0+bW9kZWwsCgkJICAgdHZlZS0+cmV2X3N0ciwKCQkgICB0dmVlLT5zZXJpYWxfbnVtYmVyKTsKCVRWRUVQUk9NX0tFUk5fSU5GTygidHVuZXIgPSAlcyAoaWR4ID0gJWQsIHR5cGUgPSAlZClcbiIsCgkJICAgdF9uYW1lLAoJCSAgIHR1bmVyLAoJCSAgIHR2ZWUtPnR1bmVyX3R5cGUpOwoJVFZFRVBST01fS0VSTl9JTkZPKCJ0dW5lciBmbXQgPSAlcyAoZWVwcm9tID0gMHglMDJ4LCB2NGwyID0gMHglMDh4KVxuIiwKCQkgICB0X2ZtdF9uYW1lLAoJCSAgIHRfZm9ybWF0LAoJCSAgIHR2ZWUtPnR1bmVyX2Zvcm1hdHMpOwoKCVRWRUVQUk9NX0tFUk5fSU5GTygiYXVkaW9fcHJvY2Vzc29yID0gJXMgKHR5cGUgPSAlZClcbiIsCgkJICAgU1RSTShzbmR0eXBlLHR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciksCgkJICAgdHZlZS0+YXVkaW9fcHJvY2Vzc29yKTsKCn0KRVhQT1JUX1NZTUJPTCh0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgppbnQgdHZlZXByb21fcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgbGVuKQp7Cgl1bnNpZ25lZCBjaGFyIGJ1ZjsKCWludCBlcnI7CgoJZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKCWJ1ZiA9IDA7CglpZiAoMSAhPSAoZXJyID0gaTJjX21hc3Rlcl9zZW5kKGMsJmJ1ZiwxKSkpIHsKCQlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbSglcyk6IEh1aCwgbm8gZWVwcm9tIHByZXNlbnQgKGVycj0lZCk/XG4iLAoJCSAgICAgICBjLT5uYW1lLGVycik7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKGxlbiAhPSAoZXJyID0gaTJjX21hc3Rlcl9yZWN2KGMsZWVkYXRhLGxlbikpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidHZlZXByb20oJXMpOiBpMmMgZWVwcm9tIHJlYWQgZXJyb3IgKGVycj0lZClcbiIsCgkJICAgICAgIGMtPm5hbWUsZXJyKTsKCQlyZXR1cm4gLTE7Cgl9CglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX3JlYWQpOwoKI2lmIDAKaW50IHR2ZWVwcm9tX2R1bXAodW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgbGVuKQp7CglpbnQgaTsKCglkcHJpbnRrKDEsICIlc1xuIixfX0ZVTkNUSU9OX18pOwoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJaWYgKDAgPT0gKGkgJSAxNikpCgkJCXByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tOiAlMDJ4OiIsaSk7CgkJcHJpbnRrKCIgJTAyeCIsZWVkYXRhW2ldKTsKCQlpZiAoMTUgPT0gKGkgJSAxNikpCgkJCXByaW50aygiXG4iKTsKCX0KCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0wodHZlZXByb21fZHVtcCk7CiNlbmRpZiAgLyogIDAgICovCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBuZWVkZWQgZm9yIGl2dHYuc2YubmV0IGF0IHRoZSBtb21lbnQuICBTaG91bGQgZ28gYXdheSBpbiB0aGUgbG9uZyAgICAgICAqLwovKiBydW4sIGp1c3QgY2FsbCB0aGUgZXhwb3J0ZWQgdHZlZXByb21fKiBkaXJlY3RseSwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gICAqLwovKiB1c2luZyB0aGUgaW5kaXJlY3Qgd2F5IHZpYSBpMmNfZHJpdmVyLT5jb21tYW5kKCkgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2lmbmRlZiBJMkNfRFJJVkVSSURfVFZFRVBST00KIyBkZWZpbmUgSTJDX0RSSVZFUklEX1RWRUVQUk9NIEkyQ19EUklWRVJJRF9FWFAyCiNlbmRpZgoKc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKCTB4YTAgPj4gMSwKCUkyQ19DTElFTlRfRU5ELAp9OwoKSTJDX0NMSUVOVF9JTlNNT0Q7CgpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl90dmVlcHJvbTsKCnN0YXRpYyBpbnQKdHZlZXByb21fY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAoJCSB1bnNpZ25lZCBpbnQgICAgICAgY21kLAoJCSB2b2lkICAgICAgICAgICAgICAqYXJnKQp7CglzdHJ1Y3QgdHZlZXByb20gZWVwcm9tOwoJdTMyICplZXByb21fcHJvcHMgPSBhcmc7Cgl1OCAqYnVmOwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIDA6CgkJYnVmID0ga21hbGxvYygyNTYsR0ZQX0tFUk5FTCk7CgkJbWVtc2V0KGJ1ZiwwLDI1Nik7CgkJdHZlZXByb21fcmVhZChjbGllbnQsYnVmLDI1Nik7CgkJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmZWVwcm9tLGJ1Zik7CgkJa2ZyZWUoYnVmKTsKCQllZXByb21fcHJvcHNbMF0gPSBlZXByb20udHVuZXJfdHlwZTsKCQllZXByb21fcHJvcHNbMV0gPSBlZXByb20udHVuZXJfZm9ybWF0czsKCQllZXByb21fcHJvcHNbMl0gPSBlZXByb20ubW9kZWw7CgkJZWVwcm9tX3Byb3BzWzNdID0gZWVwcm9tLnJldmlzaW9uOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnR2ZWVwcm9tX2RldGVjdF9jbGllbnQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAoJCSAgICAgICBpbnQgICAgICAgICAgICAgICAgIGFkZHJlc3MsCgkJICAgICAgIGludCAgICAgICAgICAgICAgICAga2luZCkKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKCglkcHJpbnRrKDEsIiVzOiBpZCAweCV4IEAgMHgleFxuIixfX0ZVTkNUSU9OX18sCgkgICAgICAgYWRhcHRlci0+aWQsIGFkZHJlc3MgPDwgMSk7CgljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwoJaWYgKE5VTEwgPT0gY2xpZW50KQoJCXJldHVybiAtRU5PTUVNOwoJbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CgljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfdHZlZXByb207CgljbGllbnQtPmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0U7CglzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpLCAidHZlZXByb20iKTsKICAgICAgICBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKdHZlZXByb21fYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJZHByaW50aygxLCIlczogaWQgMHgleFxuIixfX0ZVTkNUSU9OX18sYWRhcHRlci0+aWQpOwoJaWYgKGFkYXB0ZXItPmlkICE9IChJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0OCkpCgkJcmV0dXJuIDA7CglyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHR2ZWVwcm9tX2RldGVjdF9jbGllbnQpOwp9CgpzdGF0aWMgaW50CnR2ZWVwcm9tX2RldGFjaF9jbGllbnQgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCWludCBlcnI7CgoJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKCWlmIChlcnIgPCAwKQoJCXJldHVybiBlcnI7CglrZnJlZShjbGllbnQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3R2ZWVwcm9tID0gewoJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCgkubmFtZSAgICAgICAgICAgPSAidHZlZXByb20iLAoJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWRUVQUk9NLAoJLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlciA9IHR2ZWVwcm9tX2F0dGFjaF9hZGFwdGVyLAoJLmRldGFjaF9jbGllbnQgID0gdHZlZXByb21fZGV0YWNoX2NsaWVudCwKCS5jb21tYW5kICAgICAgICA9IHR2ZWVwcm9tX2NvbW1hbmQsCn07CgpzdGF0aWMgaW50IF9faW5pdCB0dmVlcHJvbV9pbml0KHZvaWQpCnsKCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl90dmVlcHJvbSk7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCB0dmVlcHJvbV9leGl0KHZvaWQpCnsKCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX3R2ZWVwcm9tKTsKfQoKbW9kdWxlX2luaXQodHZlZXByb21faW5pdCk7Cm1vZHVsZV9leGl0KHR2ZWVwcm9tX2V4aXQpOwoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=